Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12b4947f authored by Ankita Bajaj's avatar Ankita Bajaj
Browse files

nl80211: Add per peer statistics to compute FCS error rate



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: default avatarJouni Malinen <jouni@codeaurora.org>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>

Git-commit: 0d4e14a32dcab9c4bd559d02874120fbb86b1322
Git-repo: git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next.git


CRs-Fixed: 2336798
Change-Id: I081304f25d50cd875b9d9867819ae3464627de79
Signed-off-by: default avatarAnkita Bajaj <bankita@codeaurora.org>
parent 982dcbe0
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -1164,6 +1164,10 @@ struct cfg80211_tid_stats {
 * @rx_duration: aggregate PPDU duration(usecs) for all the frames from a peer
 * @pertid: per-TID statistics, see &struct cfg80211_tid_stats, using the last
 *	(IEEE80211_NUM_TIDS) index for MSDUs not encapsulated in QoS-MPDUs.
 * @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;
@@ -1208,6 +1212,9 @@ struct station_info {
	u64 rx_duration;
	u8 rx_beacon_signal_avg;
	struct cfg80211_tid_stats pertid[IEEE80211_NUM_TIDS + 1];

	u32 rx_mpdu_count;
	u32 fcs_err_count;
};

#if IS_ENABLED(CONFIG_CFG80211)
+8 −0
Original line number Diff line number Diff line
@@ -2940,6 +2940,12 @@ enum nl80211_sta_bss_param {
 * @NL80211_STA_INFO_RX_DURATION: aggregate PPDU duration for all frames
 *	received from the station (u64, usec)
 * @NL80211_STA_INFO_PAD: attribute used for padding for 64-bit alignment
 * @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
 */
@@ -2978,6 +2984,8 @@ enum nl80211_sta_info {
	NL80211_STA_INFO_TID_STATS,
	NL80211_STA_INFO_RX_DURATION,
	NL80211_STA_INFO_PAD,
	NL80211_STA_INFO_RX_MPDUS,
	NL80211_STA_INFO_FCS_ERROR_COUNT,

	/* keep last */
	__NL80211_STA_INFO_AFTER_LAST,
+2 −0
Original line number Diff line number Diff line
@@ -4431,6 +4431,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);

#undef PUT_SINFO
#undef PUT_SINFO_U64