From: greearb@candelatech.com
To: linux-wireless@vger.kernel.org
Cc: Ben Greear <greearb@candelatech.com>
Subject: [PATCH v3 2/2] wifi: mac80211: Assign tx-stats to the proper link.
Date: Wed, 9 Oct 2024 09:49:04 -0700 [thread overview]
Message-ID: <20241009164904.3906438-2-greearb@candelatech.com> (raw)
In-Reply-To: <20241009164904.3906438-1-greearb@candelatech.com>
From: Ben Greear <greearb@candelatech.com>
For drivers that can report the tx link-id, account tx
stats against that link. If we cannot determine tx link,
then use deflink.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
v3: Rename link_sta_info variable to link_sta to match other code.
net/mac80211/status.c | 74 +++++++++++++++++++++++++++++++------------
1 file changed, 53 insertions(+), 21 deletions(-)
diff --git a/net/mac80211/status.c b/net/mac80211/status.c
index b41b867f43b2..28bf3f8a2fb4 100644
--- a/net/mac80211/status.c
+++ b/net/mac80211/status.c
@@ -41,6 +41,26 @@ void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw,
}
EXPORT_SYMBOL(ieee80211_tx_status_irqsafe);
+static struct link_sta_info*
+ieee80211_get_tx_link_sta(struct sta_info *sta, struct ieee80211_tx_info *info)
+{
+ u8 link_id = IEEE80211_LINK_UNSPECIFIED;
+ struct link_sta_info *link_sta;
+
+ if (!sta)
+ return NULL;
+
+ if (info)
+ link_id = u32_get_bits(info->control.flags, IEEE80211_TX_CTRL_MLO_LINK);
+
+ if (link_id != IEEE80211_LINK_UNSPECIFIED) {
+ link_sta = rcu_access_pointer(sta->link[link_id]);
+ if (link_sta)
+ return link_sta;
+ }
+ return &sta->deflink;
+}
+
static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
struct sta_info *sta,
struct sk_buff *skb)
@@ -48,6 +68,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_hdr *hdr = (void *)skb->data;
int ac;
+ struct link_sta_info *link_sta = ieee80211_get_tx_link_sta(sta, info);
if (info->flags & (IEEE80211_TX_CTL_NO_PS_BUFFER |
IEEE80211_TX_CTL_AMPDU |
@@ -72,7 +93,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local,
info->flags |= IEEE80211_TX_INTFL_RETRANSMISSION;
info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
- sta->deflink.status_stats.filtered++;
+ link_sta->status_stats.filtered++;
/*
* Clear more-data bit on filtered frames, it might be set
@@ -826,6 +847,7 @@ static void ieee80211_lost_packet(struct sta_info *sta,
{
unsigned long pkt_time = STA_LOST_PKT_TIME;
unsigned int pkt_thr = STA_LOST_PKT_THRESHOLD;
+ struct link_sta_info *link_sta;
/* If driver relies on its own algorithm for station kickout, skip
* mac80211 packet loss mechanism.
@@ -838,7 +860,8 @@ static void ieee80211_lost_packet(struct sta_info *sta,
!(info->flags & IEEE80211_TX_STAT_AMPDU))
return;
- sta->deflink.status_stats.lost_packets++;
+ link_sta = ieee80211_get_tx_link_sta(sta, info);
+ link_sta->status_stats.lost_packets++;
if (sta->sta.tdls) {
pkt_time = STA_LOST_TDLS_PKT_TIME;
pkt_thr = STA_LOST_PKT_THRESHOLD;
@@ -851,14 +874,14 @@ static void ieee80211_lost_packet(struct sta_info *sta,
* mechanism.
* For non-TDLS, use STA_LOST_PKT_THRESHOLD and STA_LOST_PKT_TIME
*/
- if (sta->deflink.status_stats.lost_packets < pkt_thr ||
- !time_after(jiffies, sta->deflink.status_stats.last_pkt_time + pkt_time))
+ if (link_sta->status_stats.lost_packets < pkt_thr ||
+ !time_after(jiffies, link_sta->status_stats.last_pkt_time + pkt_time))
return;
cfg80211_cqm_pktloss_notify(sta->sdata->dev, sta->sta.addr,
- sta->deflink.status_stats.lost_packets,
+ link_sta->status_stats.lost_packets,
GFP_ATOMIC);
- sta->deflink.status_stats.lost_packets = 0;
+ link_sta->status_stats.lost_packets = 0;
}
static int ieee80211_tx_get_rates(struct ieee80211_hw *hw,
@@ -970,8 +993,12 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
fc = hdr->frame_control;
if (status->sta) {
+ struct link_sta_info *link_sta;
+
sta = container_of(status->sta, struct sta_info, sta);
+ link_sta = ieee80211_get_tx_link_sta(sta, info);
+
if (info->flags & IEEE80211_TX_STATUS_EOSP)
clear_sta_flag(sta, WLAN_STA_SP);
@@ -988,7 +1015,7 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL) &&
(ieee80211_is_data(hdr->frame_control)) &&
(rates_idx != -1))
- sta->deflink.tx_stats.last_rate =
+ link_sta->tx_stats.last_rate =
info->status.rates[rates_idx];
if ((info->flags & IEEE80211_TX_STAT_AMPDU_NO_BACK) &&
@@ -1034,9 +1061,9 @@ static void __ieee80211_tx_status(struct ieee80211_hw *hw,
return;
} else if (ieee80211_is_data_present(fc)) {
if (!acked && !noack_success)
- sta->deflink.status_stats.msdu_failed[tid]++;
+ link_sta->status_stats.msdu_failed[tid]++;
- sta->deflink.status_stats.msdu_retries[tid] +=
+ link_sta->status_stats.msdu_retries[tid] +=
retry_count;
}
@@ -1144,12 +1171,15 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
int rates_idx, retry_count;
bool acked, noack_success, ack_signal_valid;
u16 tx_time_est;
+ struct link_sta_info *link_sta;
if (pubsta) {
sta = container_of(pubsta, struct sta_info, sta);
+ link_sta = ieee80211_get_tx_link_sta(sta, info);
+
if (status->n_rates)
- sta->deflink.tx_stats.last_rate_info =
+ link_sta->tx_stats.last_rate_info =
status->rates[status->n_rates - 1].rate_idx;
}
@@ -1179,8 +1209,8 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
struct ieee80211_sub_if_data *sdata = sta->sdata;
if (!acked && !noack_success)
- sta->deflink.status_stats.retry_failed++;
- sta->deflink.status_stats.retry_count += retry_count;
+ link_sta->status_stats.retry_failed++;
+ link_sta->status_stats.retry_count += retry_count;
if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
if (sdata->vif.type == NL80211_IFTYPE_STATION &&
@@ -1189,13 +1219,12 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
acked, info->status.tx_time);
if (acked) {
- sta->deflink.status_stats.last_ack = jiffies;
+ link_sta->status_stats.last_ack = jiffies;
- if (sta->deflink.status_stats.lost_packets)
- sta->deflink.status_stats.lost_packets = 0;
+ link_sta->status_stats.lost_packets = 0;
/* Track when last packet was ACKed */
- sta->deflink.status_stats.last_pkt_time = jiffies;
+ link_sta->status_stats.last_pkt_time = jiffies;
/* Reset connection monitor */
if (sdata->vif.type == NL80211_IFTYPE_STATION &&
@@ -1203,10 +1232,10 @@ void ieee80211_tx_status_ext(struct ieee80211_hw *hw,
sdata->u.mgd.probe_send_count = 0;
if (ack_signal_valid) {
- sta->deflink.status_stats.last_ack_signal =
+ link_sta->status_stats.last_ack_signal =
(s8)info->status.ack_signal;
- sta->deflink.status_stats.ack_signal_filled = true;
- ewma_avg_signal_add(&sta->deflink.status_stats.avg_ack_signal,
+ link_sta->status_stats.ack_signal_filled = true;
+ ewma_avg_signal_add(&link_sta->status_stats.avg_ack_signal,
-info->status.ack_signal);
}
} else if (test_sta_flag(sta, WLAN_STA_PS_STA)) {
@@ -1270,8 +1299,11 @@ void ieee80211_tx_rate_update(struct ieee80211_hw *hw,
rate_control_tx_status(local, &status);
- if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL))
- sta->deflink.tx_stats.last_rate = info->status.rates[0];
+ if (ieee80211_hw_check(&local->hw, HAS_RATE_CONTROL)) {
+ struct link_sta_info *link_sta = ieee80211_get_tx_link_sta(sta, info);
+
+ link_sta->tx_stats.last_rate = info->status.rates[0];
+ }
}
EXPORT_SYMBOL(ieee80211_tx_rate_update);
--
2.42.0
next prev parent reply other threads:[~2024-10-09 16:49 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-09 16:49 [PATCH v3 1/2] wifi: iwlwifi: Report link-id for transmitted frames greearb
2024-10-09 16:49 ` greearb [this message]
2024-11-07 14:43 ` [PATCH v3 2/2] wifi: mac80211: Assign tx-stats to the proper link Johannes Berg
2024-11-07 15:51 ` Ben Greear
2024-11-07 16:03 ` Johannes Berg
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=20241009164904.3906438-2-greearb@candelatech.com \
--to=greearb@candelatech.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.