diff mbox

[RFC,1/2] nl80211: support MSDU statistics

Message ID 1416576505-15023-1-git-send-email-johannes@sipsolutions.net (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Johannes Berg Nov. 21, 2014, 1:28 p.m. UTC
From: Johannes Berg <johannes.berg@intel.com>

The base for the current statistics is pretty mixed up, support
exporting RX/TX statistics for MSDUs.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
 include/net/cfg80211.h       | 10 +++++++++-
 include/uapi/linux/nl80211.h | 12 ++++++++++++
 net/wireless/nl80211.c       | 12 ++++++++++++
 3 files changed, 33 insertions(+), 1 deletion(-)

Comments

Johannes Berg Nov. 21, 2014, 1:53 p.m. UTC | #1
On Fri, 2014-11-21 at 14:28 +0100, Johannes Berg wrote:
> From: Johannes Berg <johannes.berg@intel.com>
> 
> The base for the current statistics is pretty mixed up, support
> exporting RX/TX statistics for MSDUs.

Umm. Getting ahead of myself here - I actually wanted to make them
per-rate as well, but it's a bit awkward.

And it actually raises another question.

For RX, it is easy to do per-rate per-TID in mac80211. For TX, per-rate
is considerably more difficult and should probably have rate scaling
algorithm involvement, at least as far as iwlwifi is concerned.

Now, however, having separate counters for TX for per-rate and per-TID
seems a bit strange, if for RX they're per-rate/TID?

johannes

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 4db4f47c9745..6e4ee9ceb482 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -964,6 +964,10 @@  struct sta_bss_parameters {
  * @txrate: current unicast bitrate from this station
  * @rxrate: current unicast bitrate to this station
  * @rx_packets: packets (MSDUs & MMPDUs) received from this station
+ * @rx_qos_msdu: QoS-MSDUs received from this station (per TID)
+ * @rx_nonqos_msdu: non-QoS-MSDUs received from this station
+ * @tx_qos_msdu: QoS-MSDUs sent to this station (per TID)
+ * @tx_nonqos_msdu: non-QoS-MSDUs sent to this station
  * @tx_packets: packets (MSDUs & MMPDUs) transmitted to this station
  * @tx_retries: cumulative retry counts (MPDUs)
  * @tx_failed: number of failed transmissions (MPDUs) (retries exceeded, no ACK)
@@ -991,7 +995,7 @@  struct sta_bss_parameters {
  *	from this peer
  */
 struct station_info {
-	u32 filled;
+	u64 filled;
 	u32 connected_time;
 	u32 inactive_time;
 	u64 rx_bytes;
@@ -1013,6 +1017,10 @@  struct station_info {
 	u32 tx_retries;
 	u32 tx_failed;
 	u32 rx_dropped_misc;
+	u64 rx_qos_msdu[IEEE80211_NUM_TIDS];
+	u64 rx_nonqos_msdu;
+	u64 tx_qos_msdu[IEEE80211_NUM_TIDS];
+	u64 tx_nonqos_msdu;
 	struct sta_bss_parameters bss_param;
 	struct nl80211_sta_flag_update sta_flags;
 
diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h
index 945a17e019b2..21a0cc79b221 100644
--- a/include/uapi/linux/nl80211.h
+++ b/include/uapi/linux/nl80211.h
@@ -2342,6 +2342,14 @@  enum nl80211_sta_bss_param {
  * @NL80211_STA_INFO_BEACON_RX: number of beacons received from this peer (u64)
  * @NL80211_STA_INFO_BEACON_SIGNAL_AVG: signal strength average
  *	for beacons only (u8, dBm)
+ * @NL80211_STA_INFO_RX_QOS_MSDU: number of QoS-MSDUs received from this
+ *	station, per TID (array of 16 u64 values)
+ * @NL80211_STA_INFO_RX_NONQOS_MSDU: number of non-QoS-MSDUs received from this
+ *	station (u64)
+ * @NL80211_STA_INFO_TX_QOS_MSDU: number of QoS-MSDUs sent to this station,
+ *	per TID (array of 16 u64 values)
+ * @NL80211_STA_INFO_TX_NONQOS_MSDU: number of non-QoS-MSDUs sent to this
+ *	station (u64)
  * @__NL80211_STA_INFO_AFTER_LAST: internal
  * @NL80211_STA_INFO_MAX: highest possible station info attribute
  */
@@ -2377,6 +2385,10 @@  enum nl80211_sta_info {
 	NL80211_STA_INFO_RX_DROP_MISC,
 	NL80211_STA_INFO_BEACON_RX,
 	NL80211_STA_INFO_BEACON_SIGNAL_AVG,
+	NL80211_STA_INFO_RX_QOS_MSDU,
+	NL80211_STA_INFO_RX_NONQOS_MSDU,
+	NL80211_STA_INFO_TX_QOS_MSDU,
+	NL80211_STA_INFO_TX_NONQOS_MSDU,
 
 	/* keep last */
 	__NL80211_STA_INFO_AFTER_LAST,
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 0e3ffaf2ce94..4891c5240acd 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -3660,6 +3660,14 @@  static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
 		goto nla_put_failure;					\
 	} while (0)
 
+#define PUT_SINFO_TIDS(attr, memb) do {					\
+	BUILD_BUG_ON(sizeof(sinfo->memb) != sizeof(u64) * IEEE80211_NUM_TIDS);\
+	if (sinfo->filled & BIT(NL80211_STA_INFO_ ## attr) &&		\
+	    nla_put(msg, NL80211_STA_INFO_ ## attr,			\
+		    sizeof(sinfo->memb), sinfo->memb))			\
+		goto nla_put_failure;					\
+	} while (0)
+
 	PUT_SINFO(CONNECTED_TIME, connected_time, u32);
 	PUT_SINFO(INACTIVE_TIME, inactive_time, u32);
 
@@ -3751,6 +3759,10 @@  static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
 	PUT_SINFO(RX_DROP_MISC, rx_dropped_misc, u64);
 	PUT_SINFO(BEACON_RX, rx_beacon, u64);
 	PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
+	PUT_SINFO_TIDS(RX_QOS_MSDU, rx_qos_msdu);
+	PUT_SINFO(RX_NONQOS_MSDU, rx_nonqos_msdu, u64);
+	PUT_SINFO_TIDS(TX_QOS_MSDU, tx_qos_msdu);
+	PUT_SINFO(TX_NONQOS_MSDU, tx_nonqos_msdu, u64);
 
 #undef PUT_SINFO
 	nla_nest_end(msg, sinfoattr);