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>
This commit is contained in:
parent
2ffbe6d333
commit
991fec0910
@ -655,7 +655,9 @@ struct ieee80211_tx_info {
|
||||
struct ieee80211_tx_rate rates[
|
||||
IEEE80211_TX_MAX_RATES];
|
||||
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 */
|
||||
unsigned long jiffies;
|
||||
|
@ -209,9 +209,9 @@ minstrel_get_retry_count(struct minstrel_rate *mr,
|
||||
{
|
||||
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));
|
||||
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));
|
||||
return retry;
|
||||
}
|
||||
@ -460,6 +460,8 @@ minstrel_rate_init(void *priv, struct ieee80211_supported_band *sband,
|
||||
} while ((tx_time < mp->segment_size) &&
|
||||
(++mr->retry_count < mp->max_retry));
|
||||
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++) {
|
||||
|
@ -656,6 +656,9 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
|
||||
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
|
||||
* management frames unless we know the receiver can handle
|
||||
@ -766,6 +769,11 @@ ieee80211_tx_h_rate_ctrl(struct ieee80211_tx_data *tx)
|
||||
*/
|
||||
if (rc_rate->flags & IEEE80211_TX_RC_MCS) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user