Skip to content

Commit

Permalink
mac80211: set HT channel before association
Browse files Browse the repository at this point in the history
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: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Apr 10, 2012
1 parent 1d98fb1 commit 24398e3
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 138 deletions.
10 changes: 3 additions & 7 deletions Documentation/networking/mac80211-auth-assoc-deauth.txt
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ BA session stop & deauth/disassoc frames
end note
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: sta_state(AP, exists)

Expand Down Expand Up @@ -51,7 +51,7 @@ note over mac80211,driver: cleanup like for authenticate
end

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: sta_state(AP, exists)
mac80211->driver: sta_state(AP, authenticated)
Expand All @@ -67,10 +67,6 @@ end

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->userspace: associated

Expand All @@ -95,5 +91,5 @@ mac80211->driver: sta_state(AP,exists)
mac80211->driver: sta_state(AP,not-exists)
mac80211->driver: turn off powersave
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
9 changes: 0 additions & 9 deletions net/mac80211/ht.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,6 @@
#include "ieee80211_i.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,
struct ieee80211_sta_ht_cap *ht_cap,
u16 flag)
Expand Down
10 changes: 3 additions & 7 deletions net/mac80211/ieee80211_i.h
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,7 @@ enum ieee80211_sta_flags {
IEEE80211_STA_UAPSD_ENABLED = BIT(7),
IEEE80211_STA_NULLFUNC_ACKED = BIT(8),
IEEE80211_STA_RESET_SIGNAL_AVE = BIT(9),
IEEE80211_STA_DISABLE_40MHZ = BIT(10),
};

struct ieee80211_mgd_auth_data {
Expand Down Expand Up @@ -511,6 +512,8 @@ struct ieee80211_if_managed {
int rssi_min_thold, rssi_max_thold;
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_mask; /* Valid parts of ht_capa */
};
Expand Down Expand Up @@ -667,12 +670,6 @@ struct ieee80211_sub_if_data {

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 */
bool old_idle;

Expand Down Expand Up @@ -1300,7 +1297,6 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb,
struct net_device *dev);

/* HT */
bool ieee80111_cfg_override_disables_ht40(struct ieee80211_sub_if_data *sdata);
void ieee80211_apply_htcap_overrides(struct ieee80211_sub_if_data *sdata,
struct ieee80211_sta_ht_cap *ht_cap);
void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_sub_if_data *sdata,
Expand Down
Loading

0 comments on commit 24398e3

Please sign in to comment.