Commit 24398e39 authored by Johannes Berg's avatar Johannes Berg Committed by John W. Linville

mac80211: set HT channel before association

Changing the channel type during operation is
confusing to some drivers and will be hard to
handle in multi-channel scenarios. Instead of
changing the channel, set it to the right HT
channel before authenticating/associating and
don't change it -- just update the 20/40 MHz
restrictions in rate control as needed when
changed by the AP.

This also fixes a problem that Paul missed in
his fix for the "regulatory makes us deaf"
issue -- when we couldn't use 40 MHz we still
associated saying we were using 40 MHz, which
could in similarly broken APs make us never
even connect successfully.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 1d98fb12
...@@ -23,7 +23,7 @@ BA session stop & deauth/disassoc frames ...@@ -23,7 +23,7 @@ BA session stop & deauth/disassoc frames
end note end note
end end
mac80211->driver: config(channel, non-HT) mac80211->driver: config(channel, channel type)
mac80211->driver: bss_info_changed(set BSSID, basic rate bitmap) mac80211->driver: bss_info_changed(set BSSID, basic rate bitmap)
mac80211->driver: sta_state(AP, exists) mac80211->driver: sta_state(AP, exists)
...@@ -51,7 +51,7 @@ note over mac80211,driver: cleanup like for authenticate ...@@ -51,7 +51,7 @@ note over mac80211,driver: cleanup like for authenticate
end end
alt not previously authenticated (FT) alt not previously authenticated (FT)
mac80211->driver: config(channel, non-HT) mac80211->driver: config(channel, channel type)
mac80211->driver: bss_info_changed(set BSSID, basic rate bitmap) mac80211->driver: bss_info_changed(set BSSID, basic rate bitmap)
mac80211->driver: sta_state(AP, exists) mac80211->driver: sta_state(AP, exists)
mac80211->driver: sta_state(AP, authenticated) mac80211->driver: sta_state(AP, authenticated)
...@@ -67,10 +67,6 @@ end ...@@ -67,10 +67,6 @@ end
mac80211->driver: set up QoS parameters mac80211->driver: set up QoS parameters
alt is HT channel
mac80211->driver: config(channel, HT params)
end
mac80211->driver: bss_info_changed(QoS, HT, associated with AID) mac80211->driver: bss_info_changed(QoS, HT, associated with AID)
mac80211->userspace: associated mac80211->userspace: associated
...@@ -95,5 +91,5 @@ mac80211->driver: sta_state(AP,exists) ...@@ -95,5 +91,5 @@ mac80211->driver: sta_state(AP,exists)
mac80211->driver: sta_state(AP,not-exists) mac80211->driver: sta_state(AP,not-exists)
mac80211->driver: turn off powersave mac80211->driver: turn off powersave
mac80211->driver: bss_info_changed(clear BSSID, not associated, no QoS, ...) mac80211->driver: bss_info_changed(clear BSSID, not associated, no QoS, ...)
mac80211->driver: config(non-HT channel type) mac80211->driver: config(channel type to non-HT)
mac80211->userspace: disconnected mac80211->userspace: disconnected
...@@ -19,15 +19,6 @@ ...@@ -19,15 +19,6 @@
#include "ieee80211_i.h" #include "ieee80211_i.h"
#include "rate.h" #include "rate.h"
bool ieee80111_cfg_override_disables_ht40(struct ieee80211_sub_if_data *sdata)
{
const __le16 flg = cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH_20_40);
if ((sdata->u.mgd.ht_capa_mask.cap_info & flg) &&
!(sdata->u.mgd.ht_capa.cap_info & flg))
return true;
return false;
}
static void __check_htcap_disable(struct ieee80211_sub_if_data *sdata, static void __check_htcap_disable(struct ieee80211_sub_if_data *sdata,
struct ieee80211_sta_ht_cap *ht_cap, struct ieee80211_sta_ht_cap *ht_cap,
u16 flag) u16 flag)
......
...@@ -379,6 +379,7 @@ enum ieee80211_sta_flags { ...@@ -379,6 +379,7 @@ enum ieee80211_sta_flags {
IEEE80211_STA_UAPSD_ENABLED = BIT(7), IEEE80211_STA_UAPSD_ENABLED = BIT(7),
IEEE80211_STA_NULLFUNC_ACKED = BIT(8), IEEE80211_STA_NULLFUNC_ACKED = BIT(8),
IEEE80211_STA_RESET_SIGNAL_AVE = BIT(9), IEEE80211_STA_RESET_SIGNAL_AVE = BIT(9),
IEEE80211_STA_DISABLE_40MHZ = BIT(10),
}; };
struct ieee80211_mgd_auth_data { struct ieee80211_mgd_auth_data {
...@@ -511,6 +512,8 @@ struct ieee80211_if_managed { ...@@ -511,6 +512,8 @@ struct ieee80211_if_managed {
int rssi_min_thold, rssi_max_thold; int rssi_min_thold, rssi_max_thold;
int last_ave_beacon_signal; int last_ave_beacon_signal;
enum nl80211_channel_type tx_chantype;
struct ieee80211_ht_cap ht_capa; /* configured ht-cap over-rides */ struct ieee80211_ht_cap ht_capa; /* configured ht-cap over-rides */
struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */ struct ieee80211_ht_cap ht_capa_mask; /* Valid parts of ht_capa */
}; };
...@@ -667,12 +670,6 @@ struct ieee80211_sub_if_data { ...@@ -667,12 +670,6 @@ struct ieee80211_sub_if_data {
char name[IFNAMSIZ]; char name[IFNAMSIZ];
/*
* keep track of whether the HT opmode (stored in
* vif.bss_info.ht_operation_mode) is valid.
*/
bool ht_opmode_valid;
/* to detect idle changes */ /* to detect idle changes */
bool old_idle; bool old_idle;
...@@ -1300,7 +1297,6 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, ...@@ -1300,7 +1297,6 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
struct net_device *dev); struct net_device *dev);
/* HT */ /* HT */
bool ieee80111_cfg_override_disables_ht40(struct ieee80211_sub_if_data *sdata);
void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata, void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
struct ieee80211_sta_ht_cap *ht_cap); struct ieee80211_sta_ht_cap *ht_cap);
void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata, void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment