From: Felix Fietkau <nbd@nbd.name>
To: linux-wireless@vger.kernel.org
Cc: johannes@sipsolutions.net
Subject: [PATCH wireless-next v3 2/4] wifi: mac80211: estimate expected throughput if not provided by driver/rc
Date: Fri, 5 Jun 2026 12:30:47 +0000 [thread overview]
Message-ID: <20260605123049.1128869-2-nbd@nbd.name> (raw)
In-Reply-To: <20260605123049.1128869-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>
---
v3: avoid band=0 default, return 0 if no chanctx
net/mac80211/sta_info.c | 49 ++++++++++++++++++++++++++++++++++++++---
1 file changed, 46 insertions(+), 3 deletions(-)
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index 4c86a3793804..b0a87d5a66ca 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -2769,6 +2769,28 @@ 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;
+
+ conf = rcu_dereference(bss_conf->chanctx_conf);
+ if (!conf)
+ return 0;
+ 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 +3005,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 +3262,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 +3290,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 +3302,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.53.0
next prev parent reply other threads:[~2026-06-05 12:31 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-05 12:30 [PATCH wireless-next v3 1/4] wifi: mac80211: factor out part of ieee80211_calc_expected_tx_airtime Felix Fietkau
2026-06-05 12:30 ` Felix Fietkau [this message]
2026-06-05 12:30 ` [PATCH wireless-next v3 3/4] wifi: mac80211: add AQL support for multicast packets Felix Fietkau
2026-06-05 12:30 ` [PATCH wireless-next v3 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=20260605123049.1128869-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