linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/6] mac80211 MLME cleanups & a fix
@ 2012-03-08 14:02 Johannes Berg
  2012-03-08 14:02 ` [PATCH 1/6] mac80211: move misplaced comment Johannes Berg
                   ` (5 more replies)
  0 siblings, 6 replies; 9+ messages in thread
From: Johannes Berg @ 2012-03-08 14:02 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless

Here are a few cleanups, and a fix, for the mac80211
MLME code. The fix helps getting the control bitrates
correct during association, but otherwise shouldn't
really do much so I decided to not send it to stable.

johannes


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/6] mac80211: move misplaced comment
  2012-03-08 14:02 [PATCH 0/6] mac80211 MLME cleanups & a fix Johannes Berg
@ 2012-03-08 14:02 ` Johannes Berg
  2012-03-08 14:02 ` [PATCH 2/6] mac80211: simplify HT checks Johannes Berg
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Johannes Berg @ 2012-03-08 14:02 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless

From: Johannes Berg <johannes.berg@intel.com>

Looks like some changes in this area moved
the code but not the comment that belongs
to the code, move it to the right place.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 net/mac80211/mlme.c |   14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

--- a/net/mac80211/mlme.c	2012-03-08 12:35:20.000000000 +0100
+++ b/net/mac80211/mlme.c	2012-03-08 13:19:50.000000000 +0100
@@ -3316,6 +3316,13 @@ int ieee80211_mgd_assoc(struct ieee80211
 
 	ifmgd->beacon_crc_valid = false;
 
+	/*
+	 * IEEE802.11n does not allow TKIP/WEP as pairwise ciphers in HT mode.
+	 * We still associate in non-HT mode (11a/b/g) if any one of these
+	 * ciphers is configured as pairwise.
+	 * We can set this to true for non-11n hardware, that'll be checked
+	 * separately along with the peer capabilities.
+	 */
 	for (i = 0; i < req->crypto.n_ciphers_pairwise; i++)
 		if (req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP40 ||
 		    req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_TKIP ||
@@ -3344,13 +3351,6 @@ int ieee80211_mgd_assoc(struct ieee80211
 	} else
 		ifmgd->ap_smps = ifmgd->req_smps;
 
-	/*
-	 * IEEE802.11n does not allow TKIP/WEP as pairwise ciphers in HT mode.
-	 * We still associate in non-HT mode (11a/b/g) if any one of these
-	 * ciphers is configured as pairwise.
-	 * We can set this to true for non-11n hardware, that'll be checked
-	 * separately along with the peer capabilities.
-	 */
 	assoc_data->capability = req->bss->capability;
 	assoc_data->wmm_used = bss->wmm_used;
 	assoc_data->supp_rates = bss->supp_rates;



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 2/6] mac80211: simplify HT checks
  2012-03-08 14:02 [PATCH 0/6] mac80211 MLME cleanups & a fix Johannes Berg
  2012-03-08 14:02 ` [PATCH 1/6] mac80211: move misplaced comment Johannes Berg
@ 2012-03-08 14:02 ` Johannes Berg
  2012-03-08 14:02 ` [PATCH 3/6] mac80211: simplify wmm check during association Johannes Berg
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Johannes Berg @ 2012-03-08 14:02 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless

From: Johannes Berg <johannes.berg@intel.com>

Always set/use IEEE80211_STA_DISABLE_11N instead
of duplicating the queue, WMM and HT checks in
all places.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 net/mac80211/mlme.c |   57 +++++++++++++++++++++++-----------------------------
 1 file changed, 26 insertions(+), 31 deletions(-)

--- a/net/mac80211/mlme.c	2012-03-08 13:19:50.000000000 +0100
+++ b/net/mac80211/mlme.c	2012-03-08 13:19:55.000000000 +0100
@@ -192,33 +192,27 @@ static u32 ieee80211_enable_ht(struct ie
 	enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
 
 	sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
-
 	prev_chantype = sdata->vif.bss_conf.channel_type;
 
-	/* HT is not supported */
-	if (!sband->ht_cap.ht_supported)
-		enable_ht = false;
 
-	if (enable_ht) {
-		hti_cfreq = ieee80211_channel_to_frequency(hti->control_chan,
-							   sband->band);
-		/* check that channel matches the right operating channel */
-		if (local->hw.conf.channel->center_freq != hti_cfreq) {
-			/* Some APs mess this up, evidently.
-			 * Netgear WNDR3700 sometimes reports 4 higher than
-			 * the actual channel, for instance.
-			 */
-			printk(KERN_DEBUG
-			       "%s: Wrong control channel in association"
-			       " response: configured center-freq: %d"
-			       " hti-cfreq: %d  hti->control_chan: %d"
-			       " band: %d.  Disabling HT.\n",
-			       sdata->name,
-			       local->hw.conf.channel->center_freq,
-			       hti_cfreq, hti->control_chan,
-			       sband->band);
-			enable_ht = false;
-		}
+	hti_cfreq = ieee80211_channel_to_frequency(hti->control_chan,
+						   sband->band);
+	/* check that channel matches the right operating channel */
+	if (local->hw.conf.channel->center_freq != hti_cfreq) {
+		/* Some APs mess this up, evidently.
+		 * Netgear WNDR3700 sometimes reports 4 higher than
+		 * the actual channel, for instance.
+		 */
+		printk(KERN_DEBUG
+		       "%s: Wrong control channel in association"
+		       " response: configured center-freq: %d"
+		       " hti-cfreq: %d  hti->control_chan: %d"
+		       " band: %d.  Disabling HT.\n",
+		       sdata->name,
+		       local->hw.conf.channel->center_freq,
+		       hti_cfreq, hti->control_chan,
+		       sband->band);
+		enable_ht = false;
 	}
 
 	if (enable_ht) {
@@ -335,9 +329,6 @@ static void ieee80211_add_ht_ie(struct i
 
 	BUILD_BUG_ON(sizeof(ht_cap) != sizeof(sband->ht_cap));
 
-	if (!sband->ht_cap.ht_supported)
-		return;
-
 	if (!ht_info_ie)
 		return;
 
@@ -405,7 +396,6 @@ static void ieee80211_send_assoc(struct
 	u16 capab;
 	struct ieee80211_supported_band *sband;
 	u32 rates = 0;
-	struct ieee80211_bss *bss = (void *)assoc_data->bss->priv;
 
 	lockdep_assert_held(&ifmgd->mtx);
 
@@ -566,8 +556,7 @@ static void ieee80211_send_assoc(struct
 		offset = noffset;
 	}
 
-	if (!(ifmgd->flags & IEEE80211_STA_DISABLE_11N) &&
-	    bss->wmm_used && local->hw.queues >= 4)
+	if (!(ifmgd->flags & IEEE80211_STA_DISABLE_11N))
 		ieee80211_add_ht_ie(sdata, skb, assoc_data->ht_information_ie,
 				    sband, local->oper_channel, ifmgd->ap_smps);
 
@@ -2162,7 +2151,6 @@ static bool ieee80211_assoc_success(stru
 	changed |= BSS_CHANGED_QOS;
 
 	if (elems.ht_info_elem && elems.wmm_param &&
-	    (sdata->local->hw.queues >= 4) &&
 	    !(ifmgd->flags & IEEE80211_STA_DISABLE_11N))
 		changed |= ieee80211_enable_ht(sdata, elems.ht_info_elem,
 					       cbss->bssid, ap_ht_cap_flags,
@@ -3274,6 +3262,7 @@ int ieee80211_mgd_assoc(struct ieee80211
 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
 	struct ieee80211_bss *bss = (void *)req->bss->priv;
 	struct ieee80211_mgd_assoc_data *assoc_data;
+	struct ieee80211_supported_band *sband;
 	struct sta_info *sta;
 	const u8 *ssidie;
 	int i, err;
@@ -3332,6 +3321,12 @@ int ieee80211_mgd_assoc(struct ieee80211
 	if (req->flags & ASSOC_REQ_DISABLE_HT)
 		ifmgd->flags |= IEEE80211_STA_DISABLE_11N;
 
+	/* Also disable HT if we don't support it or the AP doesn't use WMM */
+	sband = local->hw.wiphy->bands[req->bss->channel->band];
+	if (!sband->ht_cap.ht_supported ||
+	    local->hw.queues < 4 || !bss->wmm_used)
+		ifmgd->flags |= IEEE80211_STA_DISABLE_11N;
+
 	memcpy(&ifmgd->ht_capa, &req->ht_capa, sizeof(ifmgd->ht_capa));
 	memcpy(&ifmgd->ht_capa_mask, &req->ht_capa_mask,
 	       sizeof(ifmgd->ht_capa_mask));



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 3/6] mac80211: simplify wmm check during association
  2012-03-08 14:02 [PATCH 0/6] mac80211 MLME cleanups & a fix Johannes Berg
  2012-03-08 14:02 ` [PATCH 1/6] mac80211: move misplaced comment Johannes Berg
  2012-03-08 14:02 ` [PATCH 2/6] mac80211: simplify HT checks Johannes Berg
@ 2012-03-08 14:02 ` Johannes Berg
  2012-03-08 14:02 ` [PATCH 4/6] mac80211: remove spurious BSSID change flag Johannes Berg
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 9+ messages in thread
From: Johannes Berg @ 2012-03-08 14:02 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless

From: Johannes Berg <johannes.berg@intel.com>

Instead of setting assoc_data->wmm_used solely
based on the BSS also take into account our own
capabilities and later check those.

Also rename "wmm_used" and "uapsd_used" to just
"wmm" and "uapsd".

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 net/mac80211/ieee80211_i.h |    2 +-
 net/mac80211/mlme.c        |   10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

--- a/net/mac80211/ieee80211_i.h	2012-03-08 13:20:33.000000000 +0100
+++ b/net/mac80211/ieee80211_i.h	2012-03-08 13:55:13.000000000 +0100
@@ -408,7 +408,7 @@ struct ieee80211_mgd_assoc_data {
 	u8 ssid[IEEE80211_MAX_SSID_LEN];
 	u8 ssid_len;
 	u8 supp_rates_len;
-	bool wmm_used, uapsd_used;
+	bool wmm, uapsd;
 	bool have_beacon;
 	bool sent_assoc;
 	bool synced;
--- a/net/mac80211/mlme.c	2012-03-08 13:55:13.000000000 +0100
+++ b/net/mac80211/mlme.c	2012-03-08 13:55:16.000000000 +0100
@@ -570,8 +570,8 @@ static void ieee80211_send_assoc(struct
 		offset = noffset;
 	}
 
-	if (assoc_data->wmm_used && local->hw.queues >= 4) {
-		if (assoc_data->uapsd_used) {
+	if (assoc_data->wmm) {
+		if (assoc_data->uapsd) {
 			qos_info = local->uapsd_queues;
 			qos_info |= (local->uapsd_max_sp_len <<
 				     IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT);
@@ -3347,7 +3347,7 @@ int ieee80211_mgd_assoc(struct ieee80211
 		ifmgd->ap_smps = ifmgd->req_smps;
 
 	assoc_data->capability = req->bss->capability;
-	assoc_data->wmm_used = bss->wmm_used;
+	assoc_data->wmm = bss->wmm_used && (local->hw.queues >= 4);
 	assoc_data->supp_rates = bss->supp_rates;
 	assoc_data->supp_rates_len = bss->supp_rates_len;
 	assoc_data->ht_information_ie =
@@ -3355,10 +3355,10 @@ int ieee80211_mgd_assoc(struct ieee80211
 
 	if (bss->wmm_used && bss->uapsd_supported &&
 	    (sdata->local->hw.flags & IEEE80211_HW_SUPPORTS_UAPSD)) {
-		assoc_data->uapsd_used = true;
+		assoc_data->uapsd = true;
 		ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED;
 	} else {
-		assoc_data->uapsd_used = false;
+		assoc_data->uapsd = false;
 		ifmgd->flags &= ~IEEE80211_STA_UAPSD_ENABLED;
 	}
 



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 4/6] mac80211: remove spurious BSSID change flag
  2012-03-08 14:02 [PATCH 0/6] mac80211 MLME cleanups & a fix Johannes Berg
                   ` (2 preceding siblings ...)
  2012-03-08 14:02 ` [PATCH 3/6] mac80211: simplify wmm check during association Johannes Berg
@ 2012-03-08 14:02 ` Johannes Berg
  2012-03-08 16:13   ` Johannes Berg
  2012-03-08 14:02 ` [PATCH 5/6] mac80211: refactor common auth/assoc setup code Johannes Berg
  2012-03-08 14:02 ` [PATCH 6/6] mac80211: set basic rates earlier Johannes Berg
  5 siblings, 1 reply; 9+ messages in thread
From: Johannes Berg @ 2012-03-08 14:02 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless

From: Johannes Berg <johannes.berg@intel.com>

The BSSID has been set a lot earlier already and
didn't change again in ieee80211_set_associated().

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 net/mac80211/mlme.c |    3 ---
 1 file changed, 3 deletions(-)

--- a/net/mac80211/mlme.c	2012-03-08 13:55:16.000000000 +0100
+++ b/net/mac80211/mlme.c	2012-03-08 13:55:22.000000000 +0100
@@ -1351,9 +1351,6 @@ static void ieee80211_set_associated(str
 	 */
 	bss_info_changed |= BSS_CHANGED_BASIC_RATES;
 
-	/* And the BSSID changed - we're associated now */
-	bss_info_changed |= BSS_CHANGED_BSSID;
-
 	/* Tell the driver to monitor connection quality (if supported) */
 	if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI &&
 	    bss_conf->cqm_rssi_thold)



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 5/6] mac80211: refactor common auth/assoc setup code
  2012-03-08 14:02 [PATCH 0/6] mac80211 MLME cleanups & a fix Johannes Berg
                   ` (3 preceding siblings ...)
  2012-03-08 14:02 ` [PATCH 4/6] mac80211: remove spurious BSSID change flag Johannes Berg
@ 2012-03-08 14:02 ` Johannes Berg
  2012-03-08 14:02 ` [PATCH 6/6] mac80211: set basic rates earlier Johannes Berg
  5 siblings, 0 replies; 9+ messages in thread
From: Johannes Berg @ 2012-03-08 14:02 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless

From: Johannes Berg <johannes.berg@intel.com>

As associating is possible without first authenticating
(for FT over DS) association also has to be able to
switch to the right channel, insert the station entry
etc. Factor out this common code into a new function
called ieee80211_prep_connection().

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 net/mac80211/mlme.c |  121 +++++++++++++++++++++++++---------------------------
 1 file changed, 59 insertions(+), 62 deletions(-)

--- a/net/mac80211/mlme.c	2012-03-08 13:55:22.000000000 +0100
+++ b/net/mac80211/mlme.c	2012-03-08 13:57:09.000000000 +0100
@@ -3128,6 +3128,60 @@ int ieee80211_max_network_latency(struct
 	return 0;
 }
 
+static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
+				     struct cfg80211_bss *bss, bool assoc)
+{
+	struct ieee80211_local *local = sdata->local;
+	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+	struct sta_info *sta;
+	bool have_sta = false;
+	int err;
+
+	if (WARN_ON(!ifmgd->auth_data && !ifmgd->assoc_data))
+		return -EINVAL;
+
+	if (assoc) {
+		rcu_read_lock();
+		have_sta = sta_info_get(sdata, bss->bssid);
+		rcu_read_unlock();
+	}
+
+	if (!have_sta) {
+		sta = sta_info_alloc(sdata, bss->bssid, GFP_KERNEL);
+		if (!sta)
+			return -ENOMEM;
+	}
+
+	mutex_lock(&local->mtx);
+	ieee80211_recalc_idle(sdata->local);
+	mutex_unlock(&local->mtx);
+
+	/* switch to the right channel */
+	local->oper_channel = bss->channel;
+	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
+
+	if (!have_sta) {
+		/* set BSSID - if STA already there this will be set too */
+		memcpy(ifmgd->bssid, bss->bssid, ETH_ALEN);
+		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
+
+		if (assoc)
+			sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
+
+		err = sta_info_insert(sta);
+		sta = NULL;
+		if (err) {
+			printk(KERN_DEBUG
+			       "%s: failed to insert STA entry for the AP (error %d)\n",
+			       sdata->name, err);
+			return err;
+		}
+	} else
+		WARN_ON_ONCE(compare_ether_addr(ifmgd->bssid, bss->bssid));
+
+	return 0;
+}
+
 /* config hooks */
 int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
 		       struct cfg80211_auth_request *req)
@@ -3135,7 +3189,6 @@ int ieee80211_mgd_auth(struct ieee80211_
 	struct ieee80211_local *local = sdata->local;
 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
 	struct ieee80211_mgd_auth_data *auth_data;
-	struct sta_info *sta;
 	u16 auth_alg;
 	int err;
 
@@ -3201,32 +3254,9 @@ int ieee80211_mgd_auth(struct ieee80211_
 	printk(KERN_DEBUG "%s: authenticate with %pM\n",
 	       sdata->name, req->bss->bssid);
 
-	mutex_lock(&local->mtx);
-	ieee80211_recalc_idle(sdata->local);
-	mutex_unlock(&local->mtx);
-
-	/* switch to the right channel */
-	local->oper_channel = req->bss->channel;
-	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
-
-	/* set BSSID */
-	memcpy(ifmgd->bssid, req->bss->bssid, ETH_ALEN);
-	ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
-
-	/* add station entry */
-	sta = sta_info_alloc(sdata, req->bss->bssid, GFP_KERNEL);
-	if (!sta) {
-		err = -ENOMEM;
+	err = ieee80211_prep_connection(sdata, req->bss, false);
+	if (err)
 		goto err_clear;
-	}
-
-	err = sta_info_insert(sta);
-	if (err) {
-		printk(KERN_DEBUG
-		       "%s: failed to insert STA entry for the AP %pM (error %d)\n",
-		       sdata->name, req->bss->bssid, err);
-		goto err_clear;
-	}
 
 	err = ieee80211_probe_auth(sdata);
 	if (err) {
@@ -3260,7 +3290,6 @@ int ieee80211_mgd_assoc(struct ieee80211
 	struct ieee80211_bss *bss = (void *)req->bss->priv;
 	struct ieee80211_mgd_assoc_data *assoc_data;
 	struct ieee80211_supported_band *sband;
-	struct sta_info *sta;
 	const u8 *ssidie;
 	int i, err;
 
@@ -3385,41 +3414,9 @@ int ieee80211_mgd_assoc(struct ieee80211
 
 	ifmgd->assoc_data = assoc_data;
 
-	mutex_lock(&local->mtx);
-	ieee80211_recalc_idle(sdata->local);
-	mutex_unlock(&local->mtx);
-
-	/* switch to the right channel */
-	local->oper_channel = req->bss->channel;
-	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
-
-	rcu_read_lock();
-	sta = sta_info_get(sdata, req->bss->bssid);
-	rcu_read_unlock();
-
-	if (!sta) {
-		/* set BSSID */
-		memcpy(ifmgd->bssid, req->bss->bssid, ETH_ALEN);
-		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
-
-		sta = sta_info_alloc(sdata, req->bss->bssid, GFP_KERNEL);
-		if (!sta) {
-			err = -ENOMEM;
-			goto err_clear;
-		}
-
-		sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
-
-		err = sta_info_insert(sta);
-		sta = NULL;
-		if (err) {
-			printk(KERN_DEBUG
-			       "%s: failed to insert STA entry for the AP (error %d)\n",
-			       sdata->name, err);
-			goto err_clear;
-		}
-	} else
-		WARN_ON_ONCE(compare_ether_addr(ifmgd->bssid, req->bss->bssid));
+	err = ieee80211_prep_connection(sdata, req->bss, true);
+	if (err)
+		goto err_clear;
 
 	if (!bss->dtim_period &&
 	    sdata->local->hw.flags & IEEE80211_HW_NEED_DTIM_PERIOD) {



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 6/6] mac80211: set basic rates earlier
  2012-03-08 14:02 [PATCH 0/6] mac80211 MLME cleanups & a fix Johannes Berg
                   ` (4 preceding siblings ...)
  2012-03-08 14:02 ` [PATCH 5/6] mac80211: refactor common auth/assoc setup code Johannes Berg
@ 2012-03-08 14:02 ` Johannes Berg
  5 siblings, 0 replies; 9+ messages in thread
From: Johannes Berg @ 2012-03-08 14:02 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless

From: Johannes Berg <johannes.berg@intel.com>

The authentication and association handshake
already happens in the context of the new BSS,
and the basic rates are needed at least for
the ACK response frame to the authentication
or association response frames. Therefore the
basic rates should already be configured into
the driver when those frames are sent.

Change the logic to set up the basic rates in
the connection preparation that happens for
authentication and association (if needed).

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 net/mac80211/mlme.c |   97 ++++++++++++++++++++++++++--------------------------
 1 file changed, 49 insertions(+), 48 deletions(-)

--- a/net/mac80211/mlme.c	2012-03-08 14:26:34.000000000 +0100
+++ b/net/mac80211/mlme.c	2012-03-08 14:34:31.000000000 +0100
@@ -1344,12 +1344,6 @@ static void ieee80211_set_associated(str
 		bss_conf->dtim_period = 0;
 
 	bss_conf->assoc = 1;
-	/*
-	 * For now just always ask the driver to update the basic rateset
-	 * when we have associated, we aren't checking whether it actually
-	 * changed or not.
-	 */
-	bss_info_changed |= BSS_CHANGED_BASIC_RATES;
 
 	/* Tell the driver to monitor connection quality (if supported) */
 	if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI &&
@@ -2016,15 +2010,12 @@ static bool ieee80211_assoc_success(stru
 	struct ieee80211_supported_band *sband;
 	struct sta_info *sta;
 	u8 *pos;
-	u32 rates, basic_rates;
 	u16 capab_info, aid;
 	struct ieee802_11_elems elems;
 	struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
 	u32 changed = 0;
 	int err;
-	bool have_higher_than_11mbit = false;
 	u16 ap_ht_cap_flags;
-	int min_rate = INT_MAX, min_rate_index = -1;
 
 	/* AssocResp and ReassocResp have identical structure */
 
@@ -2069,39 +2060,8 @@ static bool ieee80211_assoc_success(stru
 		return false;
 	}
 
-	rates = 0;
-	basic_rates = 0;
 	sband = local->hw.wiphy->bands[local->oper_channel->band];
 
-	ieee80211_get_rates(sband, elems.supp_rates, elems.supp_rates_len,
-			    &rates, &basic_rates, &have_higher_than_11mbit,
-			    &min_rate, &min_rate_index);
-
-	ieee80211_get_rates(sband, elems.ext_supp_rates,
-			    elems.ext_supp_rates_len, &rates, &basic_rates,
-			    &have_higher_than_11mbit,
-			    &min_rate, &min_rate_index);
-
-	/*
-	 * some buggy APs don't advertise basic_rates. use the lowest
-	 * supported rate instead.
-	 */
-	if (unlikely(!basic_rates) && min_rate_index >= 0) {
-		printk(KERN_DEBUG "%s: No basic rates in AssocResp. "
-		       "Using min supported rate instead.\n", sdata->name);
-		basic_rates = BIT(min_rate_index);
-	}
-
-	sta->sta.supp_rates[local->oper_channel->band] = rates;
-	sdata->vif.bss_conf.basic_rates = basic_rates;
-
-	/* cf. IEEE 802.11 9.2.12 */
-	if (local->oper_channel->band == IEEE80211_BAND_2GHZ &&
-	    have_higher_than_11mbit)
-		sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
-	else
-		sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
-
 	if (elems.ht_cap_elem && !(ifmgd->flags & IEEE80211_STA_DISABLE_11N))
 		ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
 				elems.ht_cap_elem, &sta->sta.ht_cap);
@@ -3129,10 +3089,11 @@ int ieee80211_max_network_latency(struct
 }
 
 static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
-				     struct cfg80211_bss *bss, bool assoc)
+				     struct cfg80211_bss *cbss, bool assoc)
 {
 	struct ieee80211_local *local = sdata->local;
 	struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
+	struct ieee80211_bss *bss = (void *)cbss->priv;
 	struct sta_info *sta;
 	bool have_sta = false;
 	int err;
@@ -3142,12 +3103,12 @@ static int ieee80211_prep_connection(str
 
 	if (assoc) {
 		rcu_read_lock();
-		have_sta = sta_info_get(sdata, bss->bssid);
+		have_sta = sta_info_get(sdata, cbss->bssid);
 		rcu_read_unlock();
 	}
 
 	if (!have_sta) {
-		sta = sta_info_alloc(sdata, bss->bssid, GFP_KERNEL);
+		sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL);
 		if (!sta)
 			return -ENOMEM;
 	}
@@ -3157,13 +3118,53 @@ static int ieee80211_prep_connection(str
 	mutex_unlock(&local->mtx);
 
 	/* switch to the right channel */
-	local->oper_channel = bss->channel;
+	local->oper_channel = cbss->channel;
 	ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
 
 	if (!have_sta) {
-		/* set BSSID - if STA already there this will be set too */
-		memcpy(ifmgd->bssid, bss->bssid, ETH_ALEN);
-		ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
+		struct ieee80211_supported_band *sband;
+		u32 rates = 0, basic_rates = 0;
+		bool have_higher_than_11mbit;
+		int min_rate = INT_MAX, min_rate_index = -1;
+
+		sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
+
+		ieee80211_get_rates(sband, bss->supp_rates,
+				    bss->supp_rates_len,
+				    &rates, &basic_rates,
+				    &have_higher_than_11mbit,
+				    &min_rate, &min_rate_index);
+
+		/*
+		 * This used to be a workaround for basic rates missing
+		 * in the association response frame. Now that we no
+		 * longer use the basic rates from there, it probably
+		 * doesn't happen any more, but keep the workaround so
+		 * in case some *other* APs are buggy in different ways
+		 * we can connect -- with a warning.
+		 */
+		if (!basic_rates && min_rate_index >= 0) {
+			printk(KERN_DEBUG
+			       "%s: No basic rates, using min rate instead.\n",
+			       sdata->name);
+			basic_rates = BIT(min_rate_index);
+		}
+
+		sta->sta.supp_rates[cbss->channel->band] = rates;
+		sdata->vif.bss_conf.basic_rates = basic_rates;
+
+		/* cf. IEEE 802.11 9.2.12 */
+		if (local->oper_channel->band == IEEE80211_BAND_2GHZ &&
+		    have_higher_than_11mbit)
+			sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
+		else
+			sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
+
+		memcpy(ifmgd->bssid, cbss->bssid, ETH_ALEN);
+
+		/* tell driver about BSSID and basic rates */
+		ieee80211_bss_info_change_notify(sdata,
+			BSS_CHANGED_BSSID | BSS_CHANGED_BASIC_RATES);
 
 		if (assoc)
 			sta_info_pre_move_state(sta, IEEE80211_STA_AUTH);
@@ -3177,7 +3178,7 @@ static int ieee80211_prep_connection(str
 			return err;
 		}
 	} else
-		WARN_ON_ONCE(compare_ether_addr(ifmgd->bssid, bss->bssid));
+		WARN_ON_ONCE(compare_ether_addr(ifmgd->bssid, cbss->bssid));
 
 	return 0;
 }



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 4/6] mac80211: remove spurious BSSID change flag
  2012-03-08 14:02 ` [PATCH 4/6] mac80211: remove spurious BSSID change flag Johannes Berg
@ 2012-03-08 16:13   ` Johannes Berg
  2012-03-09 23:40     ` Manoharan, Rajkumar
  0 siblings, 1 reply; 9+ messages in thread
From: Johannes Berg @ 2012-03-08 16:13 UTC (permalink / raw)
  To: John Linville; +Cc: linux-wireless, Sujith, Rajkumar Manoharan


> The BSSID has been set a lot earlier already and
> didn't change again in ieee80211_set_associated().
> 
> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
> ---
>  net/mac80211/mlme.c |    3 ---
>  1 file changed, 3 deletions(-)
> 
> --- a/net/mac80211/mlme.c	2012-03-08 13:55:16.000000000 +0100
> +++ b/net/mac80211/mlme.c	2012-03-08 13:55:22.000000000 +0100
> @@ -1351,9 +1351,6 @@ static void ieee80211_set_associated(str
>  	 */
>  	bss_info_changed |= BSS_CHANGED_BASIC_RATES;
>  
> -	/* And the BSSID changed - we're associated now */
> -	bss_info_changed |= BSS_CHANGED_BSSID;

Sujith tells me that this will break ath9k -- Rajkumar, can you take a
look at this? Before your commit 99e4d43ad5ff5778f92ee3bc40a29a ath9k
did listen to BSS_CHANGED_ASSOC -- it seems like it should again?

johannes


^ permalink raw reply	[flat|nested] 9+ messages in thread

* RE: [PATCH 4/6] mac80211: remove spurious BSSID change flag
  2012-03-08 16:13   ` Johannes Berg
@ 2012-03-09 23:40     ` Manoharan, Rajkumar
  0 siblings, 0 replies; 9+ messages in thread
From: Manoharan, Rajkumar @ 2012-03-09 23:40 UTC (permalink / raw)
  To: Johannes Berg, John Linville; +Cc: linux-wireless@vger.kernel.org, Sujith

>> The BSSID has been set a lot earlier already and
>> didn't change again in ieee80211_set_associated().
>>
>> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
>> ---
>>  net/mac80211/mlme.c |    3 ---
>>  1 file changed, 3 deletions(-)
>>
>> --- a/net/mac80211/mlme.c     2012-03-08 13:55:16.000000000 +0100
>> +++ b/net/mac80211/mlme.c     2012-03-08 13:55:22.000000000 +0100
>> @@ -1351,9 +1351,6 @@ static void ieee80211_set_associated(str
>>        */
>>       bss_info_changed |= BSS_CHANGED_BASIC_RATES;
>>
>> -     /* And the BSSID changed - we're associated now */
>> -     bss_info_changed |= BSS_CHANGED_BSSID;
>
> Sujith tells me that this will break ath9k -- Rajkumar, can you take a
> look at this? Before your commit 99e4d43ad5ff5778f92ee3bc40a29a ath9k
> did listen to BSS_CHANGED_ASSOC -- it seems like it should again?

Sorry for the late reply. I changed back to ASSOC to configure bss info and verified w/ your changes.

-Rajkumar


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2012-03-09 23:41 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-03-08 14:02 [PATCH 0/6] mac80211 MLME cleanups & a fix Johannes Berg
2012-03-08 14:02 ` [PATCH 1/6] mac80211: move misplaced comment Johannes Berg
2012-03-08 14:02 ` [PATCH 2/6] mac80211: simplify HT checks Johannes Berg
2012-03-08 14:02 ` [PATCH 3/6] mac80211: simplify wmm check during association Johannes Berg
2012-03-08 14:02 ` [PATCH 4/6] mac80211: remove spurious BSSID change flag Johannes Berg
2012-03-08 16:13   ` Johannes Berg
2012-03-09 23:40     ` Manoharan, Rajkumar
2012-03-08 14:02 ` [PATCH 5/6] mac80211: refactor common auth/assoc setup code Johannes Berg
2012-03-08 14:02 ` [PATCH 6/6] mac80211: set basic rates earlier Johannes Berg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).