From: Mahesh <maheshp@posedge.com>
To: Paul Stewart <pstew@chromium.org>
Cc: <linux-wireless@vger.kernel.org>
Subject: Re: [RFCv2] mac80211: Don't let regulatory make us deaf
Date: Tue, 21 Feb 2012 23:31:10 +0530 [thread overview]
Message-ID: <7082904a9e30daef12e45d4d08a83d40@posedge.com> (raw)
In-Reply-To: <20120221131946.AC1AD20578@glenhelen.mtv.corp.google.com>
On Mon, 20 Feb 2012 21:25:54 -0800, Paul Stewart wrote:
> When regulatory information changes our HT behavior (e.g,
> when we get a country code from the AP we have just associated
> with), we should use this information to change the power with
> which we transmit, and what channels we transmit. Sometimes
> the channel parameters we derive from regulatory information
> contradicts the parameters we used in association. For example,
> we could have associated specifying HT40, but the regulatory
> rules we apply may forbid HT40 operation.
>
> In the situation above, we should reconfigure ourselves to
> transmit in HT20 only, however it makes no sense for us to
> disable receive in HT40, since if we associated with these
> parameters, the AP has every reason to expect we can and
> will receive packets this way. The code in mac80211 does
> not have the capability of sending the appropriate action
> frames to signal a change in HT behaviour so the AP has
> no clue we can no longer receive frames encoded this way.
> In some broken AP implementations, this can leave us
> effectively deaf if the AP never retries in lower HT rates.
>
> This change breaks up the channel_type parameter in the
> ieee80211_enable_ht function into a separate receive and
> transmit part. It honors the channel flags set by regulatory
> in order to configure the rate control algorithm, but uses
> the capability flags to configure the channel on the radio,
> since these were used in association to set the AP's transmit
> rate.
>
> Signed-off-by: Paul Stewart <pstew@chromium.org>
> ---
> net/mac80211/chan.c | 24 ++++++++++++++++++++++++
> net/mac80211/ieee80211_i.h | 3 +++
> net/mac80211/mlme.c | 16 ++++++++--------
> 3 files changed, 35 insertions(+), 8 deletions(-)
>
> diff --git a/net/mac80211/chan.c b/net/mac80211/chan.c
> index d1f7abd..494580a 100644
> --- a/net/mac80211/chan.c
> +++ b/net/mac80211/chan.c
> @@ -3,6 +3,7 @@
> */
>
> #include <linux/nl80211.h>
> +#include <net/cfg80211.h>
> #include "ieee80211_i.h"
>
> static enum ieee80211_chan_mode
> @@ -134,3 +135,26 @@ bool ieee80211_set_channel_type(struct
> ieee80211_local *local,
>
> return result;
> }
> +
> +/*
> + * ieee80211_get_xmit_channel_type returns the channel type we
> should
> + * use for packet transmission, given the channel capability and
> + * whatever regulatory flags we have been given.
> + */
> +enum nl80211_channel_type ieee80211_get_xmit_channel_type(
> + struct ieee80211_local *local,
> + enum nl80211_channel_type channel_type) {
> + switch (channel_type) {
> + case NL80211_CHAN_HT40PLUS:
> + if ((local->hw.conf.channel->flags &
> + IEEE80211_CHAN_NO_HT40PLUS))
> + return NL80211_CHAN_HT20;
> + break;
> + case NL80211_CHAN_HT40MINUS:
> + if ((local->hw.conf.channel->flags &
> + IEEE80211_CHAN_NO_HT40MINUS))
> + return NL80211_CHAN_HT20;
> + break;
> + }
> + return channel_type;
> +}
> diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
> index 74594f0..0a3c7df 100644
> --- a/net/mac80211/ieee80211_i.h
> +++ b/net/mac80211/ieee80211_i.h
> @@ -1468,6 +1468,9 @@ bool ieee80211_set_channel_type(struct
> ieee80211_local *local,
> enum nl80211_channel_type chantype);
> enum nl80211_channel_type
> ieee80211_ht_info_to_channel_type(struct ieee80211_ht_info
> *ht_info);
> +enum nl80211_channel_type ieee80211_get_xmit_channel_type(
> + struct ieee80211_local *local,
> + enum nl80211_channel_type channel_type);
>
> #ifdef CONFIG_MAC80211_NOINLINE
> #define debug_noinline noinline
> diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
> index 52133da..3bcf4e3 100644
> --- a/net/mac80211/mlme.c
> +++ b/net/mac80211/mlme.c
> @@ -188,6 +188,7 @@ static u32 ieee80211_enable_ht(struct
> ieee80211_sub_if_data *sdata,
> bool enable_ht = true;
> enum nl80211_channel_type prev_chantype;
> enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
> + enum nl80211_channel_type xmit_channel_type;
>
> sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
>
> @@ -228,19 +229,18 @@ static u32 ieee80211_enable_ht(struct
> ieee80211_sub_if_data *sdata,
> (hti->ht_param & IEEE80211_HT_PARAM_CHAN_WIDTH_ANY)) {
> switch(hti->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
> case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
> - if (!(local->hw.conf.channel->flags &
> - IEEE80211_CHAN_NO_HT40PLUS))
> - channel_type = NL80211_CHAN_HT40PLUS;
> + channel_type = NL80211_CHAN_HT40PLUS;
> break;
> case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
> - if (!(local->hw.conf.channel->flags &
> - IEEE80211_CHAN_NO_HT40MINUS))
> - channel_type = NL80211_CHAN_HT40MINUS;
> + channel_type = NL80211_CHAN_HT40MINUS;
> break;
> }
> }
> }
>
> + xmit_channel_type =
> + ieee80211_get_xmit_channel_type(local, channel_type);
> +
> if (local->tmp_channel)
> local->tmp_channel_type = channel_type;
>
> @@ -268,13 +268,13 @@ static u32 ieee80211_enable_ht(struct
> ieee80211_sub_if_data *sdata,
> /* channel_type change automatically detected */
> ieee80211_hw_config(local, 0);
>
> - if (prev_chantype != channel_type) {
> + if (prev_chantype != xmit_channel_type) {
> rcu_read_lock();
> sta = sta_info_get(sdata, bssid);
> if (sta)
> rate_control_rate_update(local, sband, sta,
> IEEE80211_RC_HT_CHANGED,
> - channel_type);
> + xmit_channel_type);
> rcu_read_unlock();
>
> if (beacon_htcap_ie)
Peter,
When AP sends country code info, it should also obey the same
regulatory of that country and stick to HT20 in your example? Am I
missing something here?
---
Thanks,
Mahesh
next prev parent reply other threads:[~2012-02-21 18:01 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-21 5:25 [RFC] mac80211: Don't let regulatory make us deaf Paul Stewart
2012-02-21 5:25 ` [RFCv2] " Paul Stewart
2012-02-21 18:01 ` Mahesh [this message]
2012-02-23 13:39 ` Johannes Berg
2012-02-23 14:53 ` Sam Leffler
2012-02-23 14:59 ` Johannes Berg
2012-02-23 15:14 ` Paul Stewart
2012-02-24 1:53 ` Luis R. Rodriguez
2012-02-24 4:15 ` Paul Stewart
2012-02-21 5:25 ` [PATCH] " Paul Stewart
2012-02-24 4:25 ` [RFCv2] " Sam Leffler
2012-02-26 11:15 ` Johannes Berg
2012-02-26 11:25 ` Johannes Berg
2012-02-27 10:34 ` Johannes Berg
2012-02-27 11:32 ` Jouni Malinen
2012-02-27 11:38 ` Johannes Berg
2012-02-27 13:46 ` Jouni Malinen
2012-03-07 5:46 ` Paul Stewart
2012-03-07 7:36 ` Johannes Berg
2012-03-07 18:40 ` John W. Linville
2012-03-07 18:52 ` Johannes Berg
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7082904a9e30daef12e45d4d08a83d40@posedge.com \
--to=maheshp@posedge.com \
--cc=linux-wireless@vger.kernel.org \
--cc=pstew@chromium.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).