Patchwork mac80211: fix channel selection bug

login
register
mail settings
Submitter Johannes Berg
Date Feb. 11, 2013, 10:14 a.m.
Message ID <1360577653-20260-1-git-send-email-johannes@sipsolutions.net>
Download mbox | patch
Permalink /patch/2123681/
State Not Applicable, archived
Headers show

Comments

Johannes Berg - Feb. 11, 2013, 10:14 a.m.
From: Johannes Berg <johannes.berg@intel.com>

When trying to connect to an AP that advertises HT but not
VHT, the mac80211 code erroneously uses the configuration
from the AP as is instead of checking it against regulatory
and local capabilities. This can lead to using an invalid
or even inexistent channel (like 11/HT40+).

Additionally, the return flags from downgrading must be
ORed together, to collect them from all of the downgrades.
Also clarify the message.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 net/mac80211/mlme.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)
Johannes Berg - Feb. 11, 2013, 10:59 a.m.
On Mon, 2013-02-11 at 11:14 +0100, Johannes Berg wrote:
> From: Johannes Berg <johannes.berg@intel.com>
> 
> When trying to connect to an AP that advertises HT but not
> VHT, the mac80211 code erroneously uses the configuration
> from the AP as is instead of checking it against regulatory
> and local capabilities. This can lead to using an invalid
> or even inexistent channel (like 11/HT40+).
> 
> Additionally, the return flags from downgrading must be
> ORed together, to collect them from all of the downgrades.
> Also clarify the message.

Applied.

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 3b9cb51..5107248 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -3400,6 +3400,7 @@  ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
 
 	ret = 0;
 
+out:
 	while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef,
 					IEEE80211_CHAN_DISABLED)) {
 		if (WARN_ON(chandef->width == NL80211_CHAN_WIDTH_20_NOHT)) {
@@ -3408,14 +3409,13 @@  ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
 			goto out;
 		}
 
-		ret = chandef_downgrade(chandef);
+		ret |= chandef_downgrade(chandef);
 	}
 
 	if (chandef->width != vht_chandef.width)
 		sdata_info(sdata,
-			   "local regulatory prevented using AP HT/VHT configuration, downgraded\n");
+			   "capabilities/regulatory prevented using AP HT/VHT configuration, downgraded\n");
 
-out:
 	WARN_ON_ONCE(!cfg80211_chandef_valid(chandef));
 	return ret;
 }