2020-08-21 16:32:48

by Felix Fietkau

[permalink] [raw]
Subject: [PATCH 5.9 v2 2/3] mac80211: factor out code to look up the average packet length duration for a rate

This will be used to enhance AQL estimated aggregation length

Signed-off-by: Felix Fietkau <[email protected]>
---
v2: add missing return code check
net/mac80211/airtime.c | 121 +++++++++++++++++++++++++----------------
1 file changed, 74 insertions(+), 47 deletions(-)

diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
index 656c9a033714..ba95f4ee1f71 100644
--- a/net/mac80211/airtime.c
+++ b/net/mac80211/airtime.c
@@ -405,18 +405,14 @@ ieee80211_calc_legacy_rate_duration(u16 bitrate, bool short_pre,
return duration;
}

-u32 ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
- struct ieee80211_rx_status *status,
- int len)
+static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
+ struct ieee80211_rx_status *status,
+ u32 *overhead)
{
- struct ieee80211_supported_band *sband;
- const struct ieee80211_rate *rate;
bool sgi = status->enc_flags & RX_ENC_FLAG_SHORT_GI;
- bool sp = status->enc_flags & RX_ENC_FLAG_SHORTPRE;
int bw, streams;
int group, idx;
u32 duration;
- bool cck;

switch (status->bw) {
case RATE_INFO_BW_20:
@@ -437,20 +433,6 @@ u32 ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
}

switch (status->encoding) {
- case RX_ENC_LEGACY:
- if (WARN_ON_ONCE(status->band > NL80211_BAND_5GHZ))
- return 0;
-
- sband = hw->wiphy->bands[status->band];
- if (!sband || status->rate_idx >= sband->n_bitrates)
- return 0;
-
- rate = &sband->bitrates[status->rate_idx];
- cck = rate->flags & IEEE80211_RATE_MANDATORY_B;
-
- return ieee80211_calc_legacy_rate_duration(rate->bitrate, sp,
- cck, len);
-
case RX_ENC_VHT:
streams = status->nss;
idx = status->rate_idx;
@@ -477,13 +459,47 @@ u32 ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,

duration = airtime_mcs_groups[group].duration[idx];
duration <<= airtime_mcs_groups[group].shift;
+ *overhead = 36 + (streams << 2);
+
+ return duration;
+}
+
+
+u32 ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
+ struct ieee80211_rx_status *status,
+ int len)
+{
+ struct ieee80211_supported_band *sband;
+ u32 duration, overhead = 0;
+
+ if (status->encoding == RX_ENC_LEGACY) {
+ const struct ieee80211_rate *rate;
+ bool sp = status->enc_flags & RX_ENC_FLAG_SHORTPRE;
+ bool cck;
+
+ if (WARN_ON_ONCE(status->band > NL80211_BAND_5GHZ))
+ return 0;
+
+ sband = hw->wiphy->bands[status->band];
+ if (!sband || status->rate_idx >= sband->n_bitrates)
+ return 0;
+
+ rate = &sband->bitrates[status->rate_idx];
+ cck = rate->flags & IEEE80211_RATE_MANDATORY_B;
+
+ return ieee80211_calc_legacy_rate_duration(rate->bitrate, sp,
+ cck, len);
+ }
+
+ duration = ieee80211_get_rate_duration(hw, status, &overhead);
+ if (!duration)
+ return 0;
+
duration *= len;
duration /= AVG_PKT_SIZE;
duration /= 1024;

- duration += 36 + (streams << 2);
-
- return duration;
+ return duration + overhead;
}
EXPORT_SYMBOL_GPL(ieee80211_calc_rx_airtime);

@@ -530,46 +546,57 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
return false;
}

-static u32 ieee80211_calc_tx_airtime_rate(struct ieee80211_hw *hw,
- struct ieee80211_tx_rate *rate,
- struct rate_info *ri,
- u8 band, int len)
+static int ieee80211_fill_rx_status(struct ieee80211_rx_status *stat,
+ struct ieee80211_hw *hw,
+ struct ieee80211_tx_rate *rate,
+ struct rate_info *ri, u8 band, int len)
{
- struct ieee80211_rx_status stat = {
- .band = band,
- };
+ memset(stat, 0, sizeof(*stat));
+ stat->band = band;

- if (ieee80211_fill_rate_info(hw, &stat, band, ri))
- goto out;
+ if (ieee80211_fill_rate_info(hw, stat, band, ri))
+ return 0;

if (rate->idx < 0 || !rate->count)
- return 0;
+ return -1;

if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
- stat.bw = RATE_INFO_BW_80;
+ stat->bw = RATE_INFO_BW_80;
else if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
- stat.bw = RATE_INFO_BW_40;
+ stat->bw = RATE_INFO_BW_40;
else
- stat.bw = RATE_INFO_BW_20;
+ stat->bw = RATE_INFO_BW_20;

- stat.enc_flags = 0;
+ stat->enc_flags = 0;
if (rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
- stat.enc_flags |= RX_ENC_FLAG_SHORTPRE;
+ stat->enc_flags |= RX_ENC_FLAG_SHORTPRE;
if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
- stat.enc_flags |= RX_ENC_FLAG_SHORT_GI;
+ stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;

- stat.rate_idx = rate->idx;
+ stat->rate_idx = rate->idx;
if (rate->flags & IEEE80211_TX_RC_VHT_MCS) {
- stat.encoding = RX_ENC_VHT;
- stat.rate_idx = ieee80211_rate_get_vht_mcs(rate);
- stat.nss = ieee80211_rate_get_vht_nss(rate);
+ stat->encoding = RX_ENC_VHT;
+ stat->rate_idx = ieee80211_rate_get_vht_mcs(rate);
+ stat->nss = ieee80211_rate_get_vht_nss(rate);
} else if (rate->flags & IEEE80211_TX_RC_MCS) {
- stat.encoding = RX_ENC_HT;
+ stat->encoding = RX_ENC_HT;
} else {
- stat.encoding = RX_ENC_LEGACY;
+ stat->encoding = RX_ENC_LEGACY;
}

-out:
+ return 0;
+}
+
+static u32 ieee80211_calc_tx_airtime_rate(struct ieee80211_hw *hw,
+ struct ieee80211_tx_rate *rate,
+ struct rate_info *ri,
+ u8 band, int len)
+{
+ struct ieee80211_rx_status stat;
+
+ if (ieee80211_fill_rx_status(&stat, hw, rate, ri, band, len))
+ return 0;
+
return ieee80211_calc_rx_airtime(hw, &stat, len);
}

--
2.28.0


2020-08-21 17:06:53

by Toke Høiland-Jørgensen

[permalink] [raw]
Subject: Re: [PATCH 5.9 v2 2/3] mac80211: factor out code to look up the average packet length duration for a rate

Felix Fietkau <[email protected]> writes:

> This will be used to enhance AQL estimated aggregation length
>
> Signed-off-by: Felix Fietkau <[email protected]>

Acked-by: Toke Høiland-Jørgensen <[email protected]>

2020-08-21 20:47:35

by Sebastian Gottschall

[permalink] [raw]
Subject: Re: [PATCH 5.9 v2 2/3] mac80211: factor out code to look up the average packet length duration for a rate

Am 21.08.2020 um 18:30 schrieb Felix Fietkau:
> This will be used to enhance AQL estimated aggregation length
>
> Signed-off-by: Felix Fietkau <[email protected]>
> ---
> v2: add missing return code check
> net/mac80211/airtime.c | 121 +++++++++++++++++++++++++----------------
> 1 file changed, 74 insertions(+), 47 deletions(-)
>
> diff --git a/net/mac80211/airtime.c b/net/mac80211/airtime.c
> index 656c9a033714..ba95f4ee1f71 100644
> --- a/net/mac80211/airtime.c
> +++ b/net/mac80211/airtime.c
> @@ -405,18 +405,14 @@ ieee80211_calc_legacy_rate_duration(u16 bitrate, bool short_pre,
> return duration;
> }
>
> -u32 ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
> - struct ieee80211_rx_status *status,
> - int len)
> +static u32 ieee80211_get_rate_duration(struct ieee80211_hw *hw,
> + struct ieee80211_rx_status *status,
> + u32 *overhead)
> {
> - struct ieee80211_supported_band *sband;
> - const struct ieee80211_rate *rate;
> bool sgi = status->enc_flags & RX_ENC_FLAG_SHORT_GI;
> - bool sp = status->enc_flags & RX_ENC_FLAG_SHORTPRE;
> int bw, streams;
> int group, idx;
> u32 duration;
> - bool cck;
>
> switch (status->bw) {
> case RATE_INFO_BW_20:
> @@ -437,20 +433,6 @@ u32 ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
> }
>
> switch (status->encoding) {
> - case RX_ENC_LEGACY:
> - if (WARN_ON_ONCE(status->band > NL80211_BAND_5GHZ))
> - return 0;
> -
> - sband = hw->wiphy->bands[status->band];
> - if (!sband || status->rate_idx >= sband->n_bitrates)
> - return 0;
> -
> - rate = &sband->bitrates[status->rate_idx];
> - cck = rate->flags & IEEE80211_RATE_MANDATORY_B;
> -
> - return ieee80211_calc_legacy_rate_duration(rate->bitrate, sp,
> - cck, len);
> -
> case RX_ENC_VHT:
> streams = status->nss;
> idx = status->rate_idx;
> @@ -477,13 +459,47 @@ u32 ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
>
> duration = airtime_mcs_groups[group].duration[idx];
> duration <<= airtime_mcs_groups[group].shift;
> + *overhead = 36 + (streams << 2);
> +
> + return duration;
> +}
> +
> +
> +u32 ieee80211_calc_rx_airtime(struct ieee80211_hw *hw,
> + struct ieee80211_rx_status *status,
> + int len)
> +{
> + struct ieee80211_supported_band *sband;
> + u32 duration, overhead = 0;
> +
> + if (status->encoding == RX_ENC_LEGACY) {
> + const struct ieee80211_rate *rate;
> + bool sp = status->enc_flags & RX_ENC_FLAG_SHORTPRE;
> + bool cck;
> +
> + if (WARN_ON_ONCE(status->band > NL80211_BAND_5GHZ))
> + return 0;
> +
> + sband = hw->wiphy->bands[status->band];
> + if (!sband || status->rate_idx >= sband->n_bitrates)
> + return 0;
> +
> + rate = &sband->bitrates[status->rate_idx];
> + cck = rate->flags & IEEE80211_RATE_MANDATORY_B;
> +
> + return ieee80211_calc_legacy_rate_duration(rate->bitrate, sp,
> + cck, len);
> + }
> +
> + duration = ieee80211_get_rate_duration(hw, status, &overhead);
> + if (!duration)
> + return 0;
> +
> duration *= len;
> duration /= AVG_PKT_SIZE;
> duration /= 1024;
>
> - duration += 36 + (streams << 2);
> -
> - return duration;
> + return duration + overhead;
> }
> EXPORT_SYMBOL_GPL(ieee80211_calc_rx_airtime);
>
> @@ -530,46 +546,57 @@ static bool ieee80211_fill_rate_info(struct ieee80211_hw *hw,
> return false;
> }
>
> -static u32 ieee80211_calc_tx_airtime_rate(struct ieee80211_hw *hw,
> - struct ieee80211_tx_rate *rate,
> - struct rate_info *ri,
> - u8 band, int len)
> +static int ieee80211_fill_rx_status(struct ieee80211_rx_status *stat,
> + struct ieee80211_hw *hw,
> + struct ieee80211_tx_rate *rate,
> + struct rate_info *ri, u8 band, int len)
> {
> - struct ieee80211_rx_status stat = {
> - .band = band,
> - };
> + memset(stat, 0, sizeof(*stat));
> + stat->band = band;
>
> - if (ieee80211_fill_rate_info(hw, &stat, band, ri))
> - goto out;
> + if (ieee80211_fill_rate_info(hw, stat, band, ri))
> + return 0;
>
> if (rate->idx < 0 || !rate->count)
> - return 0;
> + return -1;
>
> if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
> - stat.bw = RATE_INFO_BW_80;
> + stat->bw = RATE_INFO_BW_80;
> else if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
> - stat.bw = RATE_INFO_BW_40;
> + stat->bw = RATE_INFO_BW_40;
> else
> - stat.bw = RATE_INFO_BW_20;
> + stat->bw = RATE_INFO_BW_20;

hint:

--- airtime.c
+++ airtime.c
@@ -560,7 +560,9 @@
        if (rate->idx < 0 || !rate->count)
                return -1;

-       if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
+       if (rate->flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
+               stat->bw = RATE_INFO_BW_160;
+       else if (rate->flags & IEEE80211_TX_RC_80_MHZ_WIDTH)
                stat->bw = RATE_INFO_BW_80;
        else if (rate->flags & IEEE80211_TX_RC_40_MHZ_WIDTH)
                stat->bw = RATE_INFO_BW_40;

>
> - stat.enc_flags = 0;
> + stat->enc_flags = 0;
> if (rate->flags & IEEE80211_TX_RC_USE_SHORT_PREAMBLE)
> - stat.enc_flags |= RX_ENC_FLAG_SHORTPRE;
> + stat->enc_flags |= RX_ENC_FLAG_SHORTPRE;
> if (rate->flags & IEEE80211_TX_RC_SHORT_GI)
> - stat.enc_flags |= RX_ENC_FLAG_SHORT_GI;
> + stat->enc_flags |= RX_ENC_FLAG_SHORT_GI;
>
> - stat.rate_idx = rate->idx;
> + stat->rate_idx = rate->idx;
> if (rate->flags & IEEE80211_TX_RC_VHT_MCS) {
> - stat.encoding = RX_ENC_VHT;
> - stat.rate_idx = ieee80211_rate_get_vht_mcs(rate);
> - stat.nss = ieee80211_rate_get_vht_nss(rate);
> + stat->encoding = RX_ENC_VHT;
> + stat->rate_idx = ieee80211_rate_get_vht_mcs(rate);
> + stat->nss = ieee80211_rate_get_vht_nss(rate);
> } else if (rate->flags & IEEE80211_TX_RC_MCS) {
> - stat.encoding = RX_ENC_HT;
> + stat->encoding = RX_ENC_HT;
> } else {
> - stat.encoding = RX_ENC_LEGACY;
> + stat->encoding = RX_ENC_LEGACY;
> }
>
> -out:
> + return 0;
> +}
> +
> +static u32 ieee80211_calc_tx_airtime_rate(struct ieee80211_hw *hw,
> + struct ieee80211_tx_rate *rate,
> + struct rate_info *ri,
> + u8 band, int len)
> +{
> + struct ieee80211_rx_status stat;
> +
> + if (ieee80211_fill_rx_status(&stat, hw, rate, ri, band, len))
> + return 0;
> +
> return ieee80211_calc_rx_airtime(hw, &stat, len);
> }
>