aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2013-04-16 07:38:43 -0400
committerJohannes Berg <johannes.berg@intel.com>2013-04-16 17:42:30 -0400
commit991fec091061b901e4fdcc8af4fd25d24a5a7bab (patch)
treee85082dc9b42276fb9695ff02ca1461f406e4042
parent2ffbe6d333664a089f17b13aa79eefe38f794bb7 (diff)
mac80211: fix CTS protection handling
The rates[0] CTS and RTS flags are only set after rate control has been called, so minstrel cannot use them to for setting the number of retries. This patch adds two new flags to explicitly indicate RTS/CTS use. Signed-off-by: Felix Fietkau <nbd@openwrt.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-rw-r--r--include/net/mac80211.h4
-rw-r--r--net/mac80211/rc80211_minstrel.c6
-rw-r--r--net/mac80211/tx.c8
3 files changed, 15 insertions, 3 deletions
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index 05dbb9788504..4f693a5c54de 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -655,7 +655,9 @@ struct ieee80211_tx_info {
655 struct ieee80211_tx_rate rates[ 655 struct ieee80211_tx_rate rates[
656 IEEE80211_TX_MAX_RATES]; 656 IEEE80211_TX_MAX_RATES];
657 s8 rts_cts_rate_idx; 657 s8 rts_cts_rate_idx;
658 /* 3 bytes free */ 658 u8 use_rts:1;
659 u8 use_cts_prot:1;
660 /* 2 bytes free */
659 }; 661 };
660 /* only needed before rate control */ 662 /* only needed before rate control */
661 unsigned long jiffies; 663 unsigned long jiffies;
diff --git a/net/mac80211/rc80211_minstrel.c b/net/mac80211/rc80211_minstrel.c
index 1c36c9b4fa4a..eda290fb8bd2 100644
--- a/net/mac80211/rc80211_minstrel.c
+++ b/net/mac80211/rc80211_minstrel.c
@@ -209,9 +209,9 @@ minstrel_get_retry_count(struct minstrel_rate *mr,
209{ 209{
210 unsigned int retry = mr->adjusted_retry_count; 210 unsigned int retry = mr->adjusted_retry_count;
211 211
212 if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) 212 if (info->control.use_rts)
213 retry = max(2U, min(mr->retry_count_rtscts, retry)); 213 retry = max(2U, min(mr->retry_count_rtscts, retry));
214 else if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) 214 else if (info->control.use_cts_prot)
215 retry = max(2U, min(mr->retry_count_cts, retry)); 215 retry = max(2U, min(mr->retry_count_cts, retry));
216 return retry; 216 return retry;
217} 217}
@@ -460,6 +460,8 @@ minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband,
460 } while ((tx_time < mp->segment_size) && 460 } while ((tx_time < mp->segment_size) &&
461 (++mr->retry_count < mp->max_retry)); 461 (++mr->retry_count < mp->max_retry));
462 mr->adjusted_retry_count = mr->retry_count; 462 mr->adjusted_retry_count = mr->retry_count;
463 if (!(sband->bitrates[i].flags & IEEE80211_RATE_ERP_G))
464 mr->retry_count_cts = mr->retry_count;
463 } 465 }
464 466
465 for (i = n; i < sband->n_bitrates; i++) { 467 for (i = n; i < sband->n_bitrates; i++) {
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 15c1b286e280..6ca857f8f424 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -656,6 +656,9 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
656 txrc.rts = rts = true; 656 txrc.rts = rts = true;
657 } 657 }
658 658
659 info->control.use_rts = rts;
660 info->control.use_cts_prot = tx->sdata->vif.bss_conf.use_cts_prot;
661
659 /* 662 /*
660 * Use short preamble if the BSS can handle it, but not for 663 * Use short preamble if the BSS can handle it, but not for
661 * management frames unless we know the receiver can handle 664 * management frames unless we know the receiver can handle
@@ -766,6 +769,11 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
766 */ 769 */
767 if (rc_rate->flags & IEEE80211_TX_RC_MCS) { 770 if (rc_rate->flags & IEEE80211_TX_RC_MCS) {
768 WARN_ON(rc_rate->idx > 76); 771 WARN_ON(rc_rate->idx > 76);
772
773 if (!(rc_rate->flags & IEEE80211_TX_RC_USE_RTS_CTS) &&
774 tx->sdata->vif.bss_conf.use_cts_prot)
775 rc_rate->flags |=
776 IEEE80211_TX_RC_USE_CTS_PROTECT;
769 continue; 777 continue;
770 } 778 }
771 779