diff mbox

[2/2] cfg80211: Use 5MHz bandwidth by default when checking usable channels

Message ID 1397565476-4348-3-git-send-email-rostislav.lisovy@fel.cvut.cz (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Rostislav Lisovy April 15, 2014, 12:37 p.m. UTC
Current code checks if the 20MHz bandwidth is allowed for
particular channel -- if it is not, the channel is disabled.
Since we need to use 5/10 MHz channels, this code is modified in
the way that the default bandwidth to check is 5MHz. If the
maximum bandwidth allowed by the channel is smaller than 5MHz,
the channel is disabled. Otherwise the channel is used and the
flags are set according to the bandwidth allowed by the channel.

Signed-off-by: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz>
---
 net/wireless/reg.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

Comments

Felix Fietkau June 22, 2014, 11:41 a.m. UTC | #1
On 2014-04-15 14:37, Rostislav Lisovy wrote:
> Current code checks if the 20MHz bandwidth is allowed for
> particular channel -- if it is not, the channel is disabled.
> Since we need to use 5/10 MHz channels, this code is modified in
> the way that the default bandwidth to check is 5MHz. If the
> maximum bandwidth allowed by the channel is smaller than 5MHz,
> the channel is disabled. Otherwise the channel is used and the
> flags are set according to the bandwidth allowed by the channel.
> 
> Signed-off-by: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz>
This change causes a regression and needs to be reverted or fixed.
It leaves Channel 12 enabled for US regdomain and does not prevent
bringing up AP mode on it (IEEE80211_CHAN_NO_20MHZ does not get set).

I think the main problem with this change is that max_bandwidth_khz
(which is used to derive the no-10mhz and no-20mhz flags) does not
consider the frequency when calculating the max bandwidth.

- Felix
--
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
Johannes Berg June 23, 2014, 9:08 a.m. UTC | #2
On Sun, 2014-06-22 at 13:41 +0200, Felix Fietkau wrote:
> On 2014-04-15 14:37, Rostislav Lisovy wrote:
> > Current code checks if the 20MHz bandwidth is allowed for
> > particular channel -- if it is not, the channel is disabled.
> > Since we need to use 5/10 MHz channels, this code is modified in
> > the way that the default bandwidth to check is 5MHz. If the
> > maximum bandwidth allowed by the channel is smaller than 5MHz,
> > the channel is disabled. Otherwise the channel is used and the
> > flags are set according to the bandwidth allowed by the channel.
> > 
> > Signed-off-by: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz>

> This change causes a regression and needs to be reverted or fixed.

Noted, I've reverted it in mac80211.git.

> It leaves Channel 12 enabled for US regdomain and does not prevent
> bringing up AP mode on it (IEEE80211_CHAN_NO_20MHZ does not get set).

I'm not sure this makes sense - CHAN_NO_20MHZ shouldn't get set on that
channel? It should be disabled for other reasons for AP mode - e.g.
NO_IR.

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
Felix Fietkau June 23, 2014, 10:04 a.m. UTC | #3
On 2014-06-23 11:08, Johannes Berg wrote:
> On Sun, 2014-06-22 at 13:41 +0200, Felix Fietkau wrote:
>> On 2014-04-15 14:37, Rostislav Lisovy wrote:
>> > Current code checks if the 20MHz bandwidth is allowed for
>> > particular channel -- if it is not, the channel is disabled.
>> > Since we need to use 5/10 MHz channels, this code is modified in
>> > the way that the default bandwidth to check is 5MHz. If the
>> > maximum bandwidth allowed by the channel is smaller than 5MHz,
>> > the channel is disabled. Otherwise the channel is used and the
>> > flags are set according to the bandwidth allowed by the channel.
>> > 
>> > Signed-off-by: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz>
> 
>> This change causes a regression and needs to be reverted or fixed.
> 
> Noted, I've reverted it in mac80211.git.
> 
>> It leaves Channel 12 enabled for US regdomain and does not prevent
>> bringing up AP mode on it (IEEE80211_CHAN_NO_20MHZ does not get set).
> 
> I'm not sure this makes sense - CHAN_NO_20MHZ shouldn't get set on that
> channel? It should be disabled for other reasons for AP mode - e.g.
> NO_IR.
I was thinking it could be valid in AP mode for 5 MHz operation.

- Felix
--
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
Johannes Berg June 23, 2014, 10:05 a.m. UTC | #4
On Mon, 2014-06-23 at 12:04 +0200, Felix Fietkau wrote:
> On 2014-06-23 11:08, Johannes Berg wrote:
> > On Sun, 2014-06-22 at 13:41 +0200, Felix Fietkau wrote:
> >> On 2014-04-15 14:37, Rostislav Lisovy wrote:
> >> > Current code checks if the 20MHz bandwidth is allowed for
> >> > particular channel -- if it is not, the channel is disabled.
> >> > Since we need to use 5/10 MHz channels, this code is modified in
> >> > the way that the default bandwidth to check is 5MHz. If the
> >> > maximum bandwidth allowed by the channel is smaller than 5MHz,
> >> > the channel is disabled. Otherwise the channel is used and the
> >> > flags are set according to the bandwidth allowed by the channel.
> >> > 
> >> > Signed-off-by: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz>
> > 
> >> This change causes a regression and needs to be reverted or fixed.
> > 
> > Noted, I've reverted it in mac80211.git.
> > 
> >> It leaves Channel 12 enabled for US regdomain and does not prevent
> >> bringing up AP mode on it (IEEE80211_CHAN_NO_20MHZ does not get set).
> > 
> > I'm not sure this makes sense - CHAN_NO_20MHZ shouldn't get set on that
> > channel? It should be disabled for other reasons for AP mode - e.g.
> > NO_IR.
> I was thinking it could be valid in AP mode for 5 MHz operation.

Huh, ok, maybe. I guess Rostislav can look into the details :)

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
Rostislav Lisovy June 23, 2014, 2:38 p.m. UTC | #5
On Mon, 2014-06-23 at 12:05 +0200, Johannes Berg wrote:
> On Mon, 2014-06-23 at 12:04 +0200, Felix Fietkau wrote:
> > On 2014-06-23 11:08, Johannes Berg wrote:
> > > On Sun, 2014-06-22 at 13:41 +0200, Felix Fietkau wrote:
> > >> On 2014-04-15 14:37, Rostislav Lisovy wrote:
> > >> > Current code checks if the 20MHz bandwidth is allowed for
> > >> > particular channel -- if it is not, the channel is disabled.
> > >> > Since we need to use 5/10 MHz channels, this code is modified in
> > >> > the way that the default bandwidth to check is 5MHz. If the
> > >> > maximum bandwidth allowed by the channel is smaller than 5MHz,
> > >> > the channel is disabled. Otherwise the channel is used and the
> > >> > flags are set according to the bandwidth allowed by the channel.
> > >> > 
> > >> > Signed-off-by: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz>
> > > 
> > >> This change causes a regression and needs to be reverted or fixed.
> > > 
> > > Noted, I've reverted it in mac80211.git.
> > > 
> > >> It leaves Channel 12 enabled for US regdomain and does not prevent
> > >> bringing up AP mode on it (IEEE80211_CHAN_NO_20MHZ does not get set).
> > > 
> > > I'm not sure this makes sense - CHAN_NO_20MHZ shouldn't get set on that
> > > channel? It should be disabled for other reasons for AP mode - e.g.
> > > NO_IR.
> > I was thinking it could be valid in AP mode for 5 MHz operation.
> 
> Huh, ok, maybe. I guess Rostislav can look into the details :)
> 

I am a bit confused right now. The regression is that the channel used
to be completely disabled and now it is not? The regulatory restrictions
prohibit the 20MHz BW for this channel but 5MHz BW is alright?

(I am out of office for the next few days, thus I am unfortunately
unable to write/test any code.)

Rostislav;

--
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
Felix Fietkau June 23, 2014, 2:46 p.m. UTC | #6
On 2014-06-23 16:38, Rostislav Lisovy wrote:
> On Mon, 2014-06-23 at 12:05 +0200, Johannes Berg wrote:
>> On Mon, 2014-06-23 at 12:04 +0200, Felix Fietkau wrote:
>> > On 2014-06-23 11:08, Johannes Berg wrote:
>> > > On Sun, 2014-06-22 at 13:41 +0200, Felix Fietkau wrote:
>> > >> On 2014-04-15 14:37, Rostislav Lisovy wrote:
>> > >> > Current code checks if the 20MHz bandwidth is allowed for
>> > >> > particular channel -- if it is not, the channel is disabled.
>> > >> > Since we need to use 5/10 MHz channels, this code is modified in
>> > >> > the way that the default bandwidth to check is 5MHz. If the
>> > >> > maximum bandwidth allowed by the channel is smaller than 5MHz,
>> > >> > the channel is disabled. Otherwise the channel is used and the
>> > >> > flags are set according to the bandwidth allowed by the channel.
>> > >> > 
>> > >> > Signed-off-by: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz>
>> > > 
>> > >> This change causes a regression and needs to be reverted or fixed.
>> > > 
>> > > Noted, I've reverted it in mac80211.git.
>> > > 
>> > >> It leaves Channel 12 enabled for US regdomain and does not prevent
>> > >> bringing up AP mode on it (IEEE80211_CHAN_NO_20MHZ does not get set).
>> > > 
>> > > I'm not sure this makes sense - CHAN_NO_20MHZ shouldn't get set on that
>> > > channel? It should be disabled for other reasons for AP mode - e.g.
>> > > NO_IR.
>> > I was thinking it could be valid in AP mode for 5 MHz operation.
>> 
>> Huh, ok, maybe. I guess Rostislav can look into the details :)
>> 
> 
> I am a bit confused right now. The regression is that the channel used
> to be completely disabled and now it is not? The regulatory restrictions
> prohibit the 20MHz BW for this channel but 5MHz BW is alright?
Correct. The matching rule is this:
        (2402 - 2472 @ 40), (N/A, 30), (N/A)

Channel 11 (2462 MHz) is allowed, because 2472 MHz is below the limit.
Channel 12 (2467 MHz) is not allowed, because 2477 MHz is too high.

With your change, Channel 12 was enabled and usable for AP mode.

- Felix
--
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
Rostislav Lisovy June 23, 2014, 2:58 p.m. UTC | #7
On Mon, 2014-06-23 at 16:46 +0200, Felix Fietkau wrote:
> On 2014-06-23 16:38, Rostislav Lisovy wrote:
> > On Mon, 2014-06-23 at 12:05 +0200, Johannes Berg wrote:
> >> On Mon, 2014-06-23 at 12:04 +0200, Felix Fietkau wrote:
> >> > On 2014-06-23 11:08, Johannes Berg wrote:
> >> > > On Sun, 2014-06-22 at 13:41 +0200, Felix Fietkau wrote:
> >> > >> On 2014-04-15 14:37, Rostislav Lisovy wrote:
> >> > >> > Current code checks if the 20MHz bandwidth is allowed for
> >> > >> > particular channel -- if it is not, the channel is disabled.
> >> > >> > Since we need to use 5/10 MHz channels, this code is modified in
> >> > >> > the way that the default bandwidth to check is 5MHz. If the
> >> > >> > maximum bandwidth allowed by the channel is smaller than 5MHz,
> >> > >> > the channel is disabled. Otherwise the channel is used and the
> >> > >> > flags are set according to the bandwidth allowed by the channel.
> >> > >> > 
> >> > >> > Signed-off-by: Rostislav Lisovy <rostislav.lisovy@fel.cvut.cz>
> >> > > 
> >> > >> This change causes a regression and needs to be reverted or fixed.
> >> > > 
> >> > > Noted, I've reverted it in mac80211.git.
> >> > > 
> >> > >> It leaves Channel 12 enabled for US regdomain and does not prevent
> >> > >> bringing up AP mode on it (IEEE80211_CHAN_NO_20MHZ does not get set).
> >> > > 
> >> > > I'm not sure this makes sense - CHAN_NO_20MHZ shouldn't get set on that
> >> > > channel? It should be disabled for other reasons for AP mode - e.g.
> >> > > NO_IR.
> >> > I was thinking it could be valid in AP mode for 5 MHz operation.
> >> 
> >> Huh, ok, maybe. I guess Rostislav can look into the details :)
> >> 
> > 
> > I am a bit confused right now. The regression is that the channel used
> > to be completely disabled and now it is not? The regulatory restrictions
> > prohibit the 20MHz BW for this channel but 5MHz BW is alright?
> Correct. The matching rule is this:
>         (2402 - 2472 @ 40), (N/A, 30), (N/A)
> 
> Channel 11 (2462 MHz) is allowed, because 2472 MHz is below the limit.
> Channel 12 (2467 MHz) is not allowed, because 2477 MHz is too high.
> 
> With your change, Channel 12 was enabled and usable for AP mode.

Thank you Felix, this makes sense.

I think the issue is the call
  bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(5));
which checks if "2467 + 5" is equal or less than 2472 (which indeed is),
when the result is true, the maximum allowed BW (max_bandwidth_khz) is
wrongly used on that particular channel.

I hope I will send a fix on Friday.

Rostislav;


--
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
diff mbox

Patch

diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 9d32633..3f3bc2e 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -927,7 +927,7 @@  freq_reg_info_regd(struct wiphy *wiphy, u32 center_freq,
 		if (!band_rule_found)
 			band_rule_found = freq_in_rule_band(fr, center_freq);
 
-		bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(20));
+		bw_fits = reg_does_bw_fit(fr, center_freq, MHZ_TO_KHZ(5));
 
 		if (band_rule_found && bw_fits)
 			return rr;
@@ -1011,10 +1011,10 @@  static void chan_reg_rule_print_dbg(const struct ieee80211_regdomain *regd,
 }
 #endif
 
-/*
- * Note that right now we assume the desired channel bandwidth
- * is always 20 MHz for each individual channel (HT40 uses 20 MHz
- * per channel, the primary and the extension channel).
+/* Find an ieee80211_reg_rule such that a 5MHz channel with frequency
+ * @chan->center_freq fits there.
+ * If there is no such reg_rule, disable the channel, otherwise set the
+ * flags corresponding to the bandwidths allowed in the particular reg_rule
  */
 static void handle_channel(struct wiphy *wiphy,
 			   enum nl80211_reg_initiator initiator,
@@ -1075,8 +1075,12 @@  static void handle_channel(struct wiphy *wiphy,
 	if (reg_rule->flags & NL80211_RRF_AUTO_BW)
 		max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule);
 
+	if (max_bandwidth_khz < MHZ_TO_KHZ(10))
+		bw_flags = IEEE80211_CHAN_NO_10MHZ;
+	if (max_bandwidth_khz < MHZ_TO_KHZ(20))
+		bw_flags |= IEEE80211_CHAN_NO_20MHZ;
 	if (max_bandwidth_khz < MHZ_TO_KHZ(40))
-		bw_flags = IEEE80211_CHAN_NO_HT40;
+		bw_flags |= IEEE80211_CHAN_NO_HT40;
 	if (max_bandwidth_khz < MHZ_TO_KHZ(80))
 		bw_flags |= IEEE80211_CHAN_NO_80MHZ;
 	if (max_bandwidth_khz < MHZ_TO_KHZ(160))
@@ -1510,8 +1514,12 @@  static void handle_channel_custom(struct wiphy *wiphy,
 	if (reg_rule->flags & NL80211_RRF_AUTO_BW)
 		max_bandwidth_khz = reg_get_max_bandwidth(regd, reg_rule);
 
+	if (max_bandwidth_khz < MHZ_TO_KHZ(10))
+		bw_flags = IEEE80211_CHAN_NO_10MHZ;
+	if (max_bandwidth_khz < MHZ_TO_KHZ(20))
+		bw_flags |= IEEE80211_CHAN_NO_20MHZ;
 	if (max_bandwidth_khz < MHZ_TO_KHZ(40))
-		bw_flags = IEEE80211_CHAN_NO_HT40;
+		bw_flags |= IEEE80211_CHAN_NO_HT40;
 	if (max_bandwidth_khz < MHZ_TO_KHZ(80))
 		bw_flags |= IEEE80211_CHAN_NO_80MHZ;
 	if (max_bandwidth_khz < MHZ_TO_KHZ(160))