From: Felix Fietkau <nbd@nbd.name>
To: linux-wireless@vger.kernel.org
Cc: johannes@sipsolutions.net
Subject: [PATCH wireless v2 2/4] wifi: mac80211: estimate expected throughput if not provided by driver/rc
Date: Thu, 28 May 2026 11:17:54 +0000 [thread overview]
Message-ID: <20260528111756.848243-2-nbd@nbd.name> (raw)
In-Reply-To: <20260528111756.848243-1-nbd@nbd.name>
Estimate the tx throughput based on the expected per-packet tx time.
This is useful for mesh implementations that rely on expected throughput,
e.g. 802.11s or batman-adv.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
net/mac80211/sta_info.c | 48 ++++++++++++++++++++++++++++++++++++++---
1 file changed, 45 insertions(+), 3 deletions(-)
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index 4c86a3793804..2bc5cab76261 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -2769,6 +2769,27 @@ void sta_set_accumulated_removed_links_sinfo(struct sta_info *sta,
}
}
+static u32 sta_estimate_expected_throughput(struct sta_info *sta,
+ struct rate_info *ri,
+ struct ieee80211_bss_conf *bss_conf)
+{
+ struct ieee80211_hw *hw = &sta->sdata->local->hw;
+ struct ieee80211_chanctx_conf *conf;
+ u32 duration;
+ u8 band = 0;
+
+ conf = rcu_dereference(bss_conf->chanctx_conf);
+ if (conf)
+ band = conf->def.chan->band;
+
+ duration = ieee80211_rate_expected_tx_airtime(hw, NULL, ri, band, true, 1024);
+ duration += duration >> 4; /* add assumed packet error rate of ~6% */
+ if (!duration)
+ return 0;
+
+ return ((1024 * USEC_PER_SEC) / duration) * 8;
+}
+
static void sta_set_link_sinfo(struct sta_info *sta,
struct link_station_info *link_sinfo,
struct ieee80211_link_data *link,
@@ -2983,6 +3004,10 @@ static void sta_set_link_sinfo(struct sta_info *sta,
link_sinfo->bss_param.beacon_interval = link->conf->beacon_int;
thr = sta_get_expected_throughput(sta);
+ if (!thr && (link_sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE)))
+ thr = sta_estimate_expected_throughput(sta,
+ &link_sinfo->txrate,
+ link->conf);
if (thr != 0) {
link_sinfo->filled |=
@@ -3236,6 +3261,14 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
if (thr != 0) {
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT);
sinfo->expected_throughput = thr;
+ } else if (!sta->sta.valid_links &&
+ (sinfo->filled & BIT_ULL(NL80211_STA_INFO_TX_BITRATE))) {
+ thr = sta_estimate_expected_throughput(sta, &sinfo->txrate,
+ &sdata->vif.bss_conf);
+ if (thr) {
+ sinfo->filled |= BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT);
+ sinfo->expected_throughput = thr;
+ }
}
if (!(sinfo->filled & BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL)) &&
@@ -3256,6 +3289,7 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
if (sta->sta.valid_links) {
struct ieee80211_link_data *link;
struct link_sta_info *link_sta;
+ u32 est_thr = 0;
int link_id;
sinfo->mlo_params_valid = true;
@@ -3267,17 +3301,25 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo,
sinfo->valid_links = sta->sta.valid_links;
for_each_valid_link(sinfo, link_id) {
+ struct link_station_info *lsi = sinfo->links[link_id];
+
link_sta = wiphy_dereference(sta->local->hw.wiphy,
sta->link[link_id]);
link = wiphy_dereference(sdata->local->hw.wiphy,
sdata->link[link_id]);
- if (!link_sta || !sinfo->links[link_id] || !link) {
+ if (!link_sta || !lsi || !link) {
sinfo->valid_links &= ~BIT(link_id);
continue;
}
- sta_set_link_sinfo(sta, sinfo->links[link_id],
- link, tidstats);
+ sta_set_link_sinfo(sta, lsi, link, tidstats);
+ if (!thr &&
+ (lsi->filled & BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT)))
+ est_thr += lsi->expected_throughput;
+ }
+ if (est_thr) {
+ sinfo->filled |= BIT_ULL(NL80211_STA_INFO_EXPECTED_THROUGHPUT);
+ sinfo->expected_throughput = est_thr;
}
}
}
--
2.51.0
next prev parent reply other threads:[~2026-05-28 11:18 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-28 11:17 [PATCH wireless v2 1/4] wifi: mac80211: factor out part of ieee80211_calc_expected_tx_airtime Felix Fietkau
2026-05-28 11:17 ` Felix Fietkau [this message]
2026-06-03 11:51 ` [PATCH wireless v2 2/4] wifi: mac80211: estimate expected throughput if not provided by driver/rc Johannes Berg
2026-05-28 11:17 ` [PATCH wireless v2 3/4] wifi: mac80211: add AQL support for multicast packets Felix Fietkau
2026-05-28 11:17 ` [PATCH wireless v2 4/4] wifi: mac80211: add ieee80211_txq_aql_pending() Felix Fietkau
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260528111756.848243-2-nbd@nbd.name \
--to=nbd@nbd.name \
--cc=johannes@sipsolutions.net \
--cc=linux-wireless@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox