]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
nl80211: Add per peer statistics to compute FCS error rate
authorAnkita Bajaj <bankita@codeaurora.org>
Thu, 27 Sep 2018 15:01:57 +0000 (18:01 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 12 Oct 2018 10:56:34 +0000 (12:56 +0200)
Add support for drivers to report the total number of MPDUs received
and the number of MPDUs received with an FCS error from a specific
peer. These counters will be incremented only when the TA of the
frame matches the MAC address of the peer irrespective of FCS
error.

It should be noted that the TA field in the frame might be corrupted
when there is an FCS error and TA matching logic would fail in such
cases. Hence, FCS error counter might not be fully accurate, but it can
provide help in detecting bad RX links in significant number of cases.
This FCS error counter without full accuracy can be used, e.g., to
trigger a kick-out of a connected client with a bad link in AP mode to
force such a client to roam to another AP.

Signed-off-by: Ankita Bajaj <bankita@codeaurora.org>
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/cfg80211.h
include/uapi/linux/nl80211.h
net/wireless/nl80211.c

index 0e16e723dcef6104a3ac7bb81c651f89316c9342..1fa41b7a1be3fc54046f8ecff5de019e22e218c0 100644 (file)
@@ -1303,6 +1303,10 @@ struct cfg80211_tid_stats {
  * @ack_signal: signal strength (in dBm) of the last ACK frame.
  * @avg_ack_signal: average rssi value of ack packet for the no of msdu's has
  *     been sent.
+ * @rx_mpdu_count: number of MPDUs received from this station
+ * @fcs_err_count: number of packets (MPDUs) received from this station with
+ *     an FCS error. This counter should be incremented only when TA of the
+ *     received packet with an FCS error matches the peer MAC address.
  */
 struct station_info {
        u64 filled;
@@ -1349,6 +1353,9 @@ struct station_info {
        struct cfg80211_tid_stats *pertid;
        s8 ack_signal;
        s8 avg_ack_signal;
+
+       u32 rx_mpdu_count;
+       u32 fcs_err_count;
 };
 
 #if IS_ENABLED(CONFIG_CFG80211)
index dc6d5a1ef470c11065d77e45d9200a1f7c44ee6a..6d610bae30a97e81f9f3389b9a1b545880330a91 100644 (file)
@@ -3068,6 +3068,12 @@ enum nl80211_sta_bss_param {
  * @NL80211_STA_INFO_PAD: attribute used for padding for 64-bit alignment
  * @NL80211_STA_INFO_ACK_SIGNAL: signal strength of the last ACK frame(u8, dBm)
  * @NL80211_STA_INFO_ACK_SIGNAL_AVG: avg signal strength of ACK frames (s8, dBm)
+ * @NL80211_STA_INFO_RX_MPDUS: total number of received packets (MPDUs)
+ *     (u32, from this station)
+ * @NL80211_STA_INFO_FCS_ERROR_COUNT: total number of packets (MPDUs) received
+ *     with an FCS error (u32, from this station). This count may not include
+ *     some packets with an FCS error due to TA corruption. Hence this counter
+ *     might not be fully accurate.
  * @__NL80211_STA_INFO_AFTER_LAST: internal
  * @NL80211_STA_INFO_MAX: highest possible station info attribute
  */
@@ -3108,6 +3114,8 @@ enum nl80211_sta_info {
        NL80211_STA_INFO_PAD,
        NL80211_STA_INFO_ACK_SIGNAL,
        NL80211_STA_INFO_ACK_SIGNAL_AVG,
+       NL80211_STA_INFO_RX_MPDUS,
+       NL80211_STA_INFO_FCS_ERROR_COUNT,
 
        /* keep last */
        __NL80211_STA_INFO_AFTER_LAST,
index 758bb069d000d207b8904506479ae717fdeae9d8..744b5851bbf9010ea2c2cac867fcbda487c4184b 100644 (file)
@@ -4761,6 +4761,8 @@ static int nl80211_send_station(struct sk_buff *msg, u32 cmd, u32 portid,
        PUT_SINFO_U64(RX_DROP_MISC, rx_dropped_misc);
        PUT_SINFO_U64(BEACON_RX, rx_beacon);
        PUT_SINFO(BEACON_SIGNAL_AVG, rx_beacon_signal_avg, u8);
+       PUT_SINFO(RX_MPDUS, rx_mpdu_count, u32);
+       PUT_SINFO(FCS_ERROR_COUNT, fcs_err_count, u32);
        if (wiphy_ext_feature_isset(&rdev->wiphy,
                                    NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT)) {
                PUT_SINFO(ACK_SIGNAL, ack_signal, u8);