aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211
diff options
context:
space:
mode:
authorKarl Beldan <karl.beldan@rivierawaves.com>2013-04-05 06:06:24 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-04-11 06:08:20 -0400
commit5253ffb8c9e1f2bf25c2e85dc0be8f74f55cf1ce (patch)
treef5393fc2f054e68109748eea134b78424ddeb201 /net/mac80211
parent2419ea14bb0dfabe740f1e005c0782db9bc56441 (diff)
mac80211: always pick a basic rate to tx RTS/CTS for pre-HT rates
When the 1st rate control entry is a pre-HT rate we want to set rts_cts_rate_idx "as the fastest basic rate that is not faster than the data rate"(code comments). But in case some bss allowed rate indexes are lower than the lowest bss basic rate, if the rate control selects a rate among the formers for its 1st rate control entry, rts_cts_rate_idx remains 0 and is not a basic rate index. This commit sets rts_cts_rate_idx to the lowest bss basic rate index in this situation. Note that the code assumes that lowest indexes == lowest bitrates. Signed-off-by: Karl Beldan <karl.beldan@rivierawaves.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211')
-rw-r--r--net/mac80211/tx.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index aad0bf5d8812..c93483fd477e 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -712,19 +712,22 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
712 } 712 }
713 713
714 /* 714 /*
715 * set up the RTS/CTS rate as the fastest basic rate 715 * Set up the RTS/CTS rate as the fastest basic rate
716 * that is not faster than the data rate 716 * that is not faster than the data rate unless there
717 * is no basic rate slower than the data rate, in which
718 * case we pick the slowest basic rate
717 * 719 *
718 * XXX: Should this check all retry rates? 720 * XXX: Should this check all retry rates?
719 */ 721 */
720 if (!(info->control.rates[0].flags & IEEE80211_TX_RC_MCS)) { 722 if (!(info->control.rates[0].flags & IEEE80211_TX_RC_MCS)) {
721 s8 baserate = 0; 723 u32 basic_rates = tx->sdata->vif.bss_conf.basic_rates;
724 s8 baserate = basic_rates ? ffs(basic_rates - 1) : 0;
722 725
723 rate = &sband->bitrates[info->control.rates[0].idx]; 726 rate = &sband->bitrates[info->control.rates[0].idx];
724 727
725 for (i = 0; i < sband->n_bitrates; i++) { 728 for (i = 0; i < sband->n_bitrates; i++) {
726 /* must be a basic rate */ 729 /* must be a basic rate */
727 if (!(tx->sdata->vif.bss_conf.basic_rates & BIT(i))) 730 if (!(basic_rates & BIT(i)))
728 continue; 731 continue;
729 /* must not be faster than the data rate */ 732 /* must not be faster than the data rate */
730 if (sband->bitrates[i].bitrate > rate->bitrate) 733 if (sband->bitrates[i].bitrate > rate->bitrate)