All of lore.kernel.org
 help / color / mirror / Atom feed
From: Johannes Berg <johannes@sipsolutions.net>
To: Paul Stewart <pstew@chromium.org>
Cc: linux-wireless@vger.kernel.org
Subject: Re: [RFCv2] mac80211: Don't let regulatory make us deaf
Date: Thu, 23 Feb 2012 14:39:24 +0100	[thread overview]
Message-ID: <1330004364.3448.8.camel@jlt3.sipsolutions.net> (raw)
In-Reply-To: <20120221131946.AC1AD20578@glenhelen.mtv.corp.google.com> (sfid-20120221_142005_568435_B65411B9)

On Mon, 2012-02-20 at 21:25 -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.

Quite the stupid APs, obviously ...

> +/*
> + * 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) {

code style, please put the brace on the next line

> +	switch (channel_type) {
> +	case NL80211_CHAN_HT40PLUS:
> +		if ((local->hw.conf.channel->flags &
> +		    IEEE80211_CHAN_NO_HT40PLUS))

those extra parentheses seem useless, and maybe indent the IEEE80211_...
another two tabs or so to make it stand out as the continuation of the
statement rather than the if

(see the recent thread about code style here on this list ...)

> @@ -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;

Maybe you should rename "channel_type" to "rx_channel_type" then, or
"config_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();


Otherwise looks fine to me.

johannes


  parent reply	other threads:[~2012-02-23 13:39 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
2012-02-23 13:39   ` Johannes Berg [this message]
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=1330004364.3448.8.camel@jlt3.sipsolutions.net \
    --to=johannes@sipsolutions.net \
    --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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.