Skip to content

Commit

Permalink
mac80211: minstrel: fix sampling/reporting of CCK rates in HT mode
Browse files Browse the repository at this point in the history
Long/short preamble selection cannot be sampled separately, since it
depends on the BSS state. Because of that, sampling attempts to
currently not used preamble modes are not counted in the statistics,
which leads to CCK rates being sampled too often.

Fix statistics accounting for long/short preamble by increasing the
index where necessary.
Fix excessive CCK rate sampling by dropping unsupported sample attempts.

This improves throughput on 2.4 GHz channels

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information
Felix Fietkau authored and Johannes Berg committed Oct 11, 2018
1 parent 80df9be commit 972b66b
Showing 1 changed file with 10 additions and 4 deletions.
14 changes: 10 additions & 4 deletions net/mac80211/rc80211_minstrel_ht.c
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,8 @@ minstrel_ht_get_stats(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
break;

/* short preamble */
if (!(mi->supported[group] & BIT(idx)))
if ((mi->supported[group] & BIT(idx + 4)) &&
(rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE))
idx += 4;
}
return &mi->groups[group].rates[idx];
Expand Down Expand Up @@ -1080,18 +1081,23 @@ minstrel_ht_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta,
return;

sample_group = &minstrel_mcs_groups[sample_idx / MCS_GROUP_RATES];
sample_idx %= MCS_GROUP_RATES;

if (sample_group == &minstrel_mcs_groups[MINSTREL_CCK_GROUP] &&
(sample_idx >= 4) != txrc->short_preamble)
return;

info->flags |= IEEE80211_TX_CTL_RATE_CTRL_PROBE;
rate->count = 1;

if (sample_idx / MCS_GROUP_RATES == MINSTREL_CCK_GROUP) {
if (sample_group == &minstrel_mcs_groups[MINSTREL_CCK_GROUP]) {
int idx = sample_idx % ARRAY_SIZE(mp->cck_rates);
rate->idx = mp->cck_rates[idx];
} else if (sample_group->flags & IEEE80211_TX_RC_VHT_MCS) {
ieee80211_rate_set_vht(rate, sample_idx % MCS_GROUP_RATES,
sample_group->streams);
} else {
rate->idx = sample_idx % MCS_GROUP_RATES +
(sample_group->streams - 1) * 8;
rate->idx = sample_idx + (sample_group->streams - 1) * 8;
}

rate->flags = sample_group->flags;
Expand Down

0 comments on commit 972b66b

Please sign in to comment.