diff options
author | Andrei Otcheretianski <andrei.otcheretianski@intel.com> | 2013-10-14 11:04:28 +0200 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2013-10-15 15:16:29 +0200 |
commit | 1d2d350bbf4a1ba6cef5e3dbb63c66da11814d9a (patch) | |
tree | 5c28b2b9449d4845d147ce025736c58a0f025d04 | |
parent | 1431fcb74eb5c67d3c38db5e5fe60b726c204273 (diff) | |
download | linux-stable-1d2d350bbf4a1ba6cef5e3dbb63c66da11814d9a.tar.gz linux-stable-1d2d350bbf4a1ba6cef5e3dbb63c66da11814d9a.tar.bz2 linux-stable-1d2d350bbf4a1ba6cef5e3dbb63c66da11814d9a.zip |
mac80211: respect rate mask in TX
Bitrate mask were not respected in transmissions, causing (for
example) P2P GO/client to use CCK rates for auth and assoc frames.
Fix it by considering the rate mask in __rate_control_send_low().
Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com>
Reviewed-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r-- | net/mac80211/rate.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/net/mac80211/rate.c b/net/mac80211/rate.c index 7f7ce1173bf6..22b223f13c9f 100644 --- a/net/mac80211/rate.c +++ b/net/mac80211/rate.c @@ -235,7 +235,8 @@ static void rc_send_low_basicrate(s8 *idx, u32 basic_rates, static void __rate_control_send_low(struct ieee80211_hw *hw, struct ieee80211_supported_band *sband, struct ieee80211_sta *sta, - struct ieee80211_tx_info *info) + struct ieee80211_tx_info *info, + u32 rate_mask) { int i; u32 rate_flags = @@ -247,6 +248,9 @@ static void __rate_control_send_low(struct ieee80211_hw *hw, info->control.rates[0].idx = 0; for (i = 0; i < sband->n_bitrates; i++) { + if (!(rate_mask & BIT(i))) + continue; + if ((rate_flags & sband->bitrates[i].flags) != rate_flags) continue; @@ -277,7 +281,8 @@ bool rate_control_send_low(struct ieee80211_sta *pubsta, bool use_basicrate = false; if (!pubsta || !priv_sta || rc_no_data_or_no_ack_use_min(txrc)) { - __rate_control_send_low(txrc->hw, sband, pubsta, info); + __rate_control_send_low(txrc->hw, sband, pubsta, info, + txrc->rate_idx_mask); if (!pubsta && txrc->bss) { mcast_rate = txrc->bss_conf->mcast_rate[sband->band]; @@ -659,7 +664,8 @@ void ieee80211_get_tx_rates(struct ieee80211_vif *vif, rate_control_apply_mask(sdata, sta, sband, info, dest, max_rates); if (dest[0].idx < 0) - __rate_control_send_low(&sdata->local->hw, sband, sta, info); + __rate_control_send_low(&sdata->local->hw, sband, sta, info, + sdata->rc_rateidx_mask[info->band]); if (sta) rate_fixup_ratelist(vif, sband, info, dest, max_rates); |