From: greearb@candelatech.com
To: linux-wireless@vger.kernel.org
Cc: Ben Greear <greearb@candelatech.com>
Subject: [PATCH 1/3] mac80211: Fix station rx-packets counters.
Date: Fri, 19 Mar 2021 16:38:48 -0700 [thread overview]
Message-ID: <20210319233850.2238-1-greearb@candelatech.com> (raw)
From: Ben Greear <greearb@candelatech.com>
I noticed 'iw dev wlan6 station dump' showed almost no rx-packets
one one of my radios. The rx-amsdu path did not appear to gather
any stats, and after code inspection, neither did the rx-data
handler.
Add common method to deal with these stats. Verified in AX
and /a mode, stats look at least generally correct now.
Signed-off-by: Ben Greear <greearb@candelatech.com>
---
net/mac80211/rx.c | 54 ++++++++++++++++++++++++++++++++---------------
1 file changed, 37 insertions(+), 17 deletions(-)
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index eb8225209005..4a64c2183a27 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -1713,6 +1713,27 @@ ieee80211_rx_h_uapsd_and_pspoll(struct ieee80211_rx_data *rx)
return RX_CONTINUE;
}
+static void ieee80211_update_data_rx_stats(struct ieee80211_rx_data *rx,
+ struct ieee80211_sta_rx_stats *stats,
+ struct ieee80211_rx_status *status,
+ int skb_len)
+{
+ stats->fragments++;
+ stats->packets++;
+ stats->last_rx = jiffies;
+ stats->last_rate = sta_stats_encode_rate(status);
+
+ /* The seqno index has the same property as needed
+ * for the rx_msdu field, i.e. it is IEEE80211_NUM_TIDS
+ * for non-QoS-data frames. Here we know it's a data
+ * frame, so count MSDUs.
+ */
+ u64_stats_update_begin(&stats->syncp);
+ stats->msdu[rx->seqno_idx]++;
+ stats->bytes += skb_len;
+ u64_stats_update_end(&stats->syncp);
+}
+
static ieee80211_rx_result debug_noinline
ieee80211_rx_h_sta_process(struct ieee80211_rx_data *rx)
{
@@ -2706,6 +2727,8 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
__le16 fc = hdr->frame_control;
+ ieee80211_rx_result rv;
+ int orig_len = skb->len;
if (!(status->rx_flags & IEEE80211_RX_AMSDU))
return RX_CONTINUE;
@@ -2734,7 +2757,12 @@ ieee80211_rx_h_amsdu(struct ieee80211_rx_data *rx)
if (is_multicast_ether_addr(hdr->addr1))
return RX_DROP_UNUSABLE;
- return __ieee80211_rx_h_amsdu(rx, 0);
+ rv = __ieee80211_rx_h_amsdu(rx, 0);
+ if ((rv == RX_QUEUED) && (rx->sta)) {
+ struct ieee80211_sta_rx_stats *stats = &rx->sta->rx_stats;
+ ieee80211_update_data_rx_stats(rx, stats, status, orig_len);
+ }
+ return rv;
}
#ifdef CONFIG_MAC80211_MESH
@@ -2958,6 +2986,13 @@ ieee80211_rx_h_data(struct ieee80211_rx_data *rx)
mod_timer(&local->dynamic_ps_timer, jiffies +
msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout));
+
+ if (rx->sta) {
+ struct ieee80211_sta_rx_stats *stats = &rx->sta->rx_stats;
+ struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(rx->skb);
+ ieee80211_update_data_rx_stats(rx, stats, status, rx->skb->len);
+ }
+
ieee80211_deliver_skb(rx);
return RX_QUEUED;
@@ -4400,12 +4435,6 @@ static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
return true;
}
- stats->last_rx = jiffies;
- stats->last_rate = sta_stats_encode_rate(status);
-
- stats->fragments++;
- stats->packets++;
-
/* do the header conversion - first grab the addresses */
ether_addr_copy(addrs.da, skb->data + fast_rx->da_offs);
ether_addr_copy(addrs.sa, skb->data + fast_rx->sa_offs);
@@ -4416,18 +4445,9 @@ static bool ieee80211_invoke_fast_rx(struct ieee80211_rx_data *rx,
skb->dev = fast_rx->dev;
+ ieee80211_update_data_rx_stats(rx, stats, status, orig_len);
dev_sw_netstats_rx_add(fast_rx->dev, skb->len);
- /* The seqno index has the same property as needed
- * for the rx_msdu field, i.e. it is IEEE80211_NUM_TIDS
- * for non-QoS-data frames. Here we know it's a data
- * frame, so count MSDUs.
- */
- u64_stats_update_begin(&stats->syncp);
- stats->msdu[rx->seqno_idx]++;
- stats->bytes += orig_len;
- u64_stats_update_end(&stats->syncp);
-
if (fast_rx->internal_forward) {
struct sk_buff *xmit_skb = NULL;
if (is_multicast_ether_addr(addrs.da)) {
--
2.20.1
next reply other threads:[~2021-03-19 23:39 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-19 23:38 greearb [this message]
2021-03-19 23:38 ` [PATCH 2/3] mac80211: Provide per-station stats in debugfs greearb
2021-03-19 23:38 ` [PATCH 3/3] mac80211: Provide detailed station rx stats greearb
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=20210319233850.2238-1-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).