Commit 991fec09 authored by Felix Fietkau's avatar Felix Fietkau Committed by Johannes Berg

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: default avatarFelix Fietkau <nbd@openwrt.org>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 2ffbe6d3
...@@ -655,7 +655,9 @@ struct ieee80211_tx_info { ...@@ -655,7 +655,9 @@ struct ieee80211_tx_info {
struct ieee80211_tx_rate rates[ struct ieee80211_tx_rate rates[
IEEE80211_TX_MAX_RATES]; IEEE80211_TX_MAX_RATES];
s8 rts_cts_rate_idx; s8 rts_cts_rate_idx;
/* 3 bytes free */ u8 use_rts:1;
u8 use_cts_prot:1;
/* 2 bytes free */
}; };
/* only needed before rate control */ /* only needed before rate control */
unsigned long jiffies; unsigned long jiffies;
......
...@@ -209,9 +209,9 @@ minstrel_get_retry_count(struct minstrel_rate *mr, ...@@ -209,9 +209,9 @@ minstrel_get_retry_count(struct minstrel_rate *mr,
{ {
unsigned int retry = mr->adjusted_retry_count; unsigned int retry = mr->adjusted_retry_count;
if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) if (info->control.use_rts)
retry = max(2U, min(mr->retry_count_rtscts, retry)); retry = max(2U, min(mr->retry_count_rtscts, retry));
else if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT) else if (info->control.use_cts_prot)
retry = max(2U, min(mr->retry_count_cts, retry)); retry = max(2U, min(mr->retry_count_cts, retry));
return retry; return retry;
} }
...@@ -460,6 +460,8 @@ minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband, ...@@ -460,6 +460,8 @@ minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband,
} while ((tx_time < mp->segment_size) && } while ((tx_time < mp->segment_size) &&
(++mr->retry_count < mp->max_retry)); (++mr->retry_count < mp->max_retry));
mr->adjusted_retry_count = mr->retry_count; mr->adjusted_retry_count = mr->retry_count;
if (!(sband->bitrates[i].flags & IEEE80211_RATE_ERP_G))
mr->retry_count_cts = mr->retry_count;
} }
for (i = n; i < sband->n_bitrates; i++) { for (i = n; i < sband->n_bitrates; i++) {
......
...@@ -656,6 +656,9 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) ...@@ -656,6 +656,9 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
txrc.rts = rts = true; txrc.rts = rts = true;
} }
info->control.use_rts = rts;
info->control.use_cts_prot = tx->sdata->vif.bss_conf.use_cts_prot;
/* /*
* Use short preamble if the BSS can handle it, but not for * Use short preamble if the BSS can handle it, but not for
* management frames unless we know the receiver can handle * management frames unless we know the receiver can handle
...@@ -766,6 +769,11 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx) ...@@ -766,6 +769,11 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
*/ */
if (rc_rate->flags & IEEE80211_TX_RC_MCS) { if (rc_rate->flags & IEEE80211_TX_RC_MCS) {
WARN_ON(rc_rate->idx > 76); WARN_ON(rc_rate->idx > 76);
if (!(rc_rate->flags & IEEE80211_TX_RC_USE_RTS_CTS) &&
tx->sdata->vif.bss_conf.use_cts_prot)
rc_rate->flags |=
IEEE80211_TX_RC_USE_CTS_PROTECT;
continue; continue;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment