Переглянути джерело

qcacmn: Add control frame stats accounting support

Add control frame stats accounting support.
Accumulate both per peer BAR and NDPA counts in Tx and Rx per PPDU stats
path. Accumulate per peer RTS success and failure count only in per PPDU
Tx stats path.

Change-Id: I78fb3546cd831559e208a7330feb2eb67b9a28de
CRs-Fixed: 3313435
Subrat Mishra 2 роки тому
батько
коміт
92fc6fa7c1

+ 6 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -1876,6 +1876,9 @@ struct cdp_delayed_tx_completion_ppdu_user {
  * @mpdu_bytes: accumulated bytes per mpdu for mem limit feature
  * @punc_mode: puncutured mode to indicate punctured bw
  * @punc_pattern_bitmap: bitmap indicating punctured pattern
+ * @mprot_type: medium protection type
+ * @rts_success: rts success
+ * @rts failure: rts failure
  */
 struct cdp_tx_completion_ppdu_user {
 	uint32_t completion_status:8,
@@ -1981,6 +1984,9 @@ struct cdp_tx_completion_ppdu_user {
 	uint32_t mpdu_bytes;
 	uint8_t punc_mode;
 	uint16_t punc_pattern_bitmap;
+	uint8_t mprot_type:3,
+		rts_success:1,
+		rts_failure:1;
 };
 
 /**

+ 12 - 0
dp/inc/cdp_txrx_stats_struct.h

@@ -1426,6 +1426,10 @@ struct protocol_trace_count {
  * @release_src_not_tqm: Counter to keep track of release source is not TQM
  *			 in TX completion status processing
  * @per: Packet error ratio
+ * @rts_success: RTS success count
+ * @rts_failure: RTS failure count
+ * @bar_cnt: Block ACK Request frame count
+ * @ndpa_cnt: NDP announcement frame count
  */
 struct cdp_tx_stats {
 	struct cdp_pkt_info comp_pkt;
@@ -1545,6 +1549,10 @@ struct cdp_tx_stats {
 #endif
 	uint32_t release_src_not_tqm;
 	uint32_t per;
+	uint32_t rts_success;
+	uint32_t rts_failure;
+	uint32_t bar_cnt;
+	uint32_t ndpa_cnt;
 };
 
 /* struct cdp_rx_stats - rx Level Stats
@@ -1634,6 +1642,8 @@ struct cdp_tx_stats {
  * @su_be_ppdu_cnt: SU Rx packet count for BE
  * @mu_be_ppdu_cnt: MU rx packet count for BE
  * @punc_bw[MAX_PUNCTURED_MODE]: MSDU count for punctured BW
+ * @bar_cnt: Block ACK Request frame count
+ * @ndpa_cnt: NDP announcement frame count
  */
 struct cdp_rx_stats {
 	struct cdp_pkt_info to_stack;
@@ -1723,6 +1733,8 @@ struct cdp_rx_stats {
 	uint32_t punc_bw[MAX_PUNCTURED_MODE];
 #endif
 	uint32_t mcast_3addr_drop;
+	uint32_t bar_cnt;
+	uint32_t ndpa_cnt;
 };
 
 /* struct cdp_tx_ingress_stats - Tx ingress Stats

+ 6 - 0
dp/wifi3.0/dp_internal.h

@@ -1924,6 +1924,10 @@ void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
 		_tgtobj->tx.retries_mpdu += _srcobj->tx.retries_mpdu; \
 		_tgtobj->tx.mpdu_success_with_retries += \
 					_srcobj->tx.mpdu_success_with_retries; \
+		_tgtobj->tx.rts_success = _srcobj->tx.rts_success; \
+		_tgtobj->tx.rts_failure = _srcobj->tx.rts_failure; \
+		_tgtobj->tx.bar_cnt = _srcobj->tx.bar_cnt; \
+		_tgtobj->tx.ndpa_cnt = _srcobj->tx.ndpa_cnt; \
 		for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { \
 			for (i = 0; i < MAX_MCS; i++) \
 				_tgtobj->tx.pkt_type[pream_type].mcs_count[i] += \
@@ -1985,6 +1989,8 @@ void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
 		_tgtobj->rx.gi_info = _srcobj->rx.gi_info; \
 		_tgtobj->rx.preamble_info = _srcobj->rx.preamble_info; \
 		_tgtobj->rx.mpdu_retry_cnt += _srcobj->rx.mpdu_retry_cnt; \
+		_tgtobj->rx.bar_cnt = _srcobj->rx.bar_cnt; \
+		_tgtobj->rx.ndpa_cnt = _srcobj->rx.ndpa_cnt; \
 		for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { \
 			for (i = 0; i < MAX_MCS; i++) { \
 				_tgtobj->rx.pkt_type[pream_type].mcs_count[i] += \

+ 12 - 0
dp/wifi3.0/dp_types.h

@@ -3825,6 +3825,10 @@ struct dp_peer_per_pkt_tx_stats {
  * @su_be_ppdu_cnt: SU Tx packet count for 11BE
  * @mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX]: MU Tx packet count for 11BE
  * @punc_bw[MAX_PUNCTURED_MODE]: MSDU count for punctured bw
+ * @rts_success: RTS success count
+ * @rts_failure: RTS failure count
+ * @bar_cnt: Block ACK Request frame count
+ * @ndpa_cnt: NDP announcement frame count
  */
 struct dp_peer_extd_tx_stats {
 	uint32_t stbc;
@@ -3877,6 +3881,10 @@ struct dp_peer_extd_tx_stats {
 	struct cdp_pkt_type mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX];
 	uint32_t punc_bw[MAX_PUNCTURED_MODE];
 #endif
+	uint32_t rts_success;
+	uint32_t rts_failure;
+	uint32_t bar_cnt;
+	uint32_t ndpa_cnt;
 };
 
 /**
@@ -3992,6 +4000,8 @@ struct dp_peer_per_pkt_rx_stats {
  * @su_be_ppdu_cnt: SU Rx packet count for BE
  * @mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX]: MU rx packet count for BE
  * @punc_bw[MAX_PUNCTURED_MODE]: MSDU count for punctured bw
+ * @bar_cnt: Block ACK Request frame count
+ * @ndpa_cnt: NDP announcement frame count
  */
 struct dp_peer_extd_rx_stats {
 	struct cdp_pkt_type pkt_type[DOT11_MAX];
@@ -4037,6 +4047,8 @@ struct dp_peer_extd_rx_stats {
 	struct cdp_pkt_type mu_be_ppdu_cnt[TXRX_TYPE_MU_MAX];
 	uint32_t punc_bw[MAX_PUNCTURED_MODE];
 #endif
+	uint32_t bar_cnt;
+	uint32_t ndpa_cnt;
 };
 
 /**

+ 2 - 0
dp/wifi3.0/monitor/1.0/dp_rx_mon_status_1.0.c

@@ -566,6 +566,8 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx,
 				dp_rx_mon_update_scan_spcl_vap_stats(pdev,
 								     ppdu_info);
 
+			dp_rx_mon_update_user_ctrl_frame_stats(pdev, ppdu_info);
+
 			/*
 			* if chan_num is not fetched correctly from ppdu RX TLV,
 			 * get it from pdev saved.

+ 2 - 0
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -1644,6 +1644,8 @@ dp_rx_mon_srng_process_2_0(struct dp_soc *soc, struct dp_intr *int_ctx,
 		else if (dp_cfr_rcc_mode_status(pdev) && ppdu_info)
 			dp_rx_handle_cfr(soc, pdev, ppdu_info);
 
+		dp_rx_mon_update_user_ctrl_frame_stats(pdev, ppdu_info);
+
 		status = dp_rx_mon_add_ppdu_info_to_wq(pdev, ppdu_info);
 		if (status != QDF_STATUS_SUCCESS) {
 			if (ppdu_info)

+ 49 - 0
dp/wifi3.0/monitor/dp_mon.c

@@ -3471,6 +3471,11 @@ static void dp_process_ppdu_stats_user_cmpltn_common_tlv(
 		HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_SUCCESS_GET(*tag_buf);
 	ppdu_desc->rts_failure =
 		HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_RTS_FAILURE_GET(*tag_buf);
+
+	ppdu_user_desc->mprot_type = ppdu_desc->mprot_type;
+	ppdu_user_desc->rts_success = ppdu_desc->rts_success;
+	ppdu_user_desc->rts_failure = ppdu_desc->rts_failure;
+
 	ppdu_user_desc->pream_punct =
 		HTT_PPDU_STATS_USER_CMPLTN_COMMON_TLV_PREAM_PUNC_TX_GET(*tag_buf);
 
@@ -4112,6 +4117,7 @@ void dp_ppdu_desc_user_airtime_consumption_update(
 			struct cdp_tx_completion_ppdu_user *user)
 { }
 #endif
+
 #if defined(WLAN_ATF_ENABLE) || defined(WLAN_TELEMETRY_STATS_SUPPORT)
 static void
 dp_ppdu_desc_user_phy_tx_time_update(struct dp_pdev *pdev,
@@ -4164,6 +4170,46 @@ dp_ppdu_desc_user_phy_tx_time_update(struct dp_pdev *pdev,
 }
 #endif
 
+#ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
+static void
+dp_tx_ctrl_stats_update(struct dp_pdev *pdev, struct dp_peer *peer,
+			struct cdp_tx_completion_ppdu_user *user)
+{
+	struct dp_mon_peer *mon_peer = NULL;
+	uint16_t fc = 0;
+
+	if (!pdev || !peer || !user)
+		return;
+
+	mon_peer = peer->monitor_peer;
+	if (qdf_unlikely(!mon_peer))
+		return;
+
+	if (user->mprot_type) {
+		DP_STATS_INCC(mon_peer,
+			      tx.rts_success, 1, user->rts_success);
+		DP_STATS_INCC(mon_peer,
+			      tx.rts_failure, 1, user->rts_failure);
+	}
+	fc = user->frame_ctrl;
+	if ((qdf_cpu_to_le16(fc) & QDF_IEEE80211_FC0_TYPE_MASK) ==
+	    QDF_IEEE80211_FC0_TYPE_CTL) {
+		if ((qdf_cpu_to_le16(fc) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
+		    QDF_IEEE80211_FC0_SUBTYPE_VHT_NDP_AN)
+			DP_STATS_INC(mon_peer, tx.ndpa_cnt, 1);
+		if ((qdf_cpu_to_le16(fc) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
+		    QDF_IEEE80211_FC0_SUBTYPE_BAR)
+			DP_STATS_INC(mon_peer, tx.bar_cnt, 1);
+	}
+}
+#else
+static void
+dp_tx_ctrl_stats_update(struct dp_pdev *pdev, struct dp_peer *peer,
+			struct cdp_tx_completion_ppdu_user *user)
+{
+}
+#endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */
+
 /**
  * dp_ppdu_desc_user_stats_update(): Function to update TX user stats
  * @pdev: DP pdev handle
@@ -4226,6 +4272,9 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev,
 
 		dp_ppdu_desc_user_phy_tx_time_update(pdev, peer, ppdu_desc,
 						     &ppdu_desc->user[i]);
+
+		dp_tx_ctrl_stats_update(pdev, peer, &ppdu_desc->user[i]);
+
 		/*
 		 * different frame like DATA, BAR or CTRL has different
 		 * tlv bitmap expected. Apart from ACK_BA_STATUS TLV, we

+ 39 - 0
dp/wifi3.0/monitor/dp_rx_mon.c

@@ -2036,3 +2036,42 @@ dp_mon_rx_stats_update_rssi_dbm_params(struct dp_mon_pdev *mon_pdev,
 	ppdu_info->rx_status.rssi_dbm_conv_support =
 				mon_pdev->rssi_dbm_conv_support;
 }
+
+#ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
+void dp_rx_mon_update_user_ctrl_frame_stats(struct dp_pdev *pdev,
+					    struct hal_rx_ppdu_info *ppdu_info)
+{
+	struct dp_peer *peer;
+	struct dp_mon_peer *mon_peer;
+	struct dp_soc *soc = pdev->soc;
+	uint16_t fc, sw_peer_id;
+	uint8_t i;
+
+	if (qdf_unlikely(!ppdu_info))
+		return;
+
+	fc = ppdu_info->nac_info.frame_control;
+	if (qdf_likely((qdf_cpu_to_le16(fc) & QDF_IEEE80211_FC0_TYPE_MASK) !=
+	    QDF_IEEE80211_FC0_TYPE_CTL))
+		return;
+
+	for (i = 0; i < ppdu_info->com_info.num_users; i++) {
+		sw_peer_id = ppdu_info->rx_user_status[i].sw_peer_id;
+		peer = dp_peer_get_ref_by_id(soc, sw_peer_id,
+					     DP_MOD_ID_RX_PPDU_STATS);
+		if (qdf_unlikely(!peer))
+			continue;
+		mon_peer = peer->monitor_peer;
+		if (qdf_unlikely(!mon_peer)) {
+			dp_peer_unref_delete(peer, DP_MOD_ID_RX_PPDU_STATS);
+			continue;
+		}
+		DP_STATS_INCC(mon_peer, rx.ndpa_cnt, 1,
+			      ppdu_info->ctrl_frm_info[i].ndpa);
+		DP_STATS_INCC(mon_peer, rx.bar_cnt, 1,
+			      ppdu_info->ctrl_frm_info[i].bar);
+
+		dp_peer_unref_delete(peer, DP_MOD_ID_RX_PPDU_STATS);
+	}
+}
+#endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */

+ 19 - 0
dp/wifi3.0/monitor/dp_rx_mon.h

@@ -366,6 +366,25 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev,
 }
 #endif /* QCA_ENHANCED_STATS_SUPPORT */
 
+#ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
+/**
+ * dp_rx_mon_update_user_ctrl_frame_stats() - Function to update Rx control
+ * frame stats per user.
+ * @pdev: DP Pdev Pointer
+ * @ppdu_info: HAL Rx PPDU info Pointer
+ *
+ * Return: None
+ */
+void dp_rx_mon_update_user_ctrl_frame_stats(struct dp_pdev *pdev,
+					    struct hal_rx_ppdu_info *ppdu_info);
+#else
+static inline void
+dp_rx_mon_update_user_ctrl_frame_stats(struct dp_pdev *pdev,
+				       struct hal_rx_ppdu_info *ppdu_info)
+{
+}
+#endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */
+
 #ifdef QCA_UNDECODED_METADATA_SUPPORT
 /**
  * dp_rx_handle_ppdu_undecoded_metadata() - Allocate and deliver ppdu info

+ 26 - 0
hal/wifi3.0/be/hal_be_api_mon.h

@@ -1875,6 +1875,30 @@ hal_rx_status_get_mon_buf_addr(uint8_t *rx_tlv,
 }
 #endif
 
+#ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
+static inline void
+hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info *ppdu_info,
+			       uint32_t user_id)
+{
+	uint16_t fc = ppdu_info->nac_info.frame_control;
+
+	if (HAL_RX_GET_FRAME_CTRL_TYPE(fc) == HAL_RX_FRAME_CTRL_TYPE_CTRL) {
+		if ((fc & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
+		    QDF_IEEE80211_FC0_SUBTYPE_VHT_NDP_AN)
+			ppdu_info->ctrl_frm_info[user_id].ndpa = 1;
+		if ((fc & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
+		    QDF_IEEE80211_FC0_SUBTYPE_BAR)
+			ppdu_info->ctrl_frm_info[user_id].bar = 1;
+	}
+}
+#else
+static inline void
+hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info *ppdu_info,
+			       uint32_t user_id)
+{
+}
+#endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */
+
 /**
  * hal_rx_status_get_tlv_info() - process receive info TLV
  * @rx_tlv_hdr: pointer to TLV header
@@ -2924,6 +2948,8 @@ hal_rx_status_get_tlv_info_generic_be(void *rx_tlv_hdr, void *ppduinfo,
 		ppdu_info->rx_user_status[user_id].sw_peer_id =
 			rx_mpdu_start->rx_mpdu_info_details.sw_peer_id;
 
+		hal_update_rx_ctrl_frame_stats(ppdu_info, user_id);
+
 		if (ppdu_info->sw_frame_group_id ==
 		    HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) {
 			ppdu_info->rx_status.frame_control_info_valid =

+ 11 - 0
hal/wifi3.0/hal_api_mon.h

@@ -1199,6 +1199,15 @@ struct hal_rx_u_sig_info {
 		 num_eht_sig_sym : 5;
 };
 
+#ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
+struct hal_rx_user_ctrl_frm_info {
+	uint8_t bar : 1,
+		ndpa : 1;
+};
+#else
+struct hal_rx_user_ctrl_frm_info {};
+#endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */
+
 struct hal_rx_ppdu_info {
 	struct hal_rx_ppdu_common_info com_info;
 	struct hal_rx_u_sig_info u_sig_info;
@@ -1263,6 +1272,8 @@ struct hal_rx_ppdu_info {
 	TAILQ_ENTRY(hal_rx_ppdu_info) ppdu_free_list_elem;
 	/* placeholder to track if RX_HDR is received */
 	uint8_t rx_hdr_rcvd[HAL_MAX_UL_MU_USERS];
+	/* Per user BAR and NDPA bit flag */
+	struct hal_rx_user_ctrl_frm_info ctrl_frm_info[HAL_MAX_UL_MU_USERS];
 };
 
 static inline uint32_t

+ 26 - 0
hal/wifi3.0/li/hal_li_generic_api.h

@@ -630,6 +630,30 @@ hal_update_frame_type_cnt(uint8_t *rx_mpdu_start,
 }
 #endif
 
+#ifdef WLAN_SUPPORT_CTRL_FRAME_STATS
+static inline void
+hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info *ppdu_info,
+			       uint32_t user_id)
+{
+	uint16_t fc = ppdu_info->nac_info.frame_control;
+
+	if (HAL_RX_GET_FRAME_CTRL_TYPE(fc) == HAL_RX_FRAME_CTRL_TYPE_CTRL) {
+		if ((fc & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
+		    QDF_IEEE80211_FC0_SUBTYPE_VHT_NDP_AN)
+			ppdu_info->ctrl_frm_info[user_id].ndpa = 1;
+		if ((fc & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
+		    QDF_IEEE80211_FC0_SUBTYPE_BAR)
+			ppdu_info->ctrl_frm_info[user_id].bar = 1;
+	}
+}
+#else
+static inline void
+hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info *ppdu_info,
+			       uint32_t user_id)
+{
+}
+#endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */
+
 /**
  * hal_rx_status_get_tlv_info() - process receive info TLV
  * @rx_tlv_hdr: pointer to TLV header
@@ -1662,6 +1686,8 @@ hal_rx_status_get_tlv_info_generic_li(void *rx_tlv_hdr, void *ppduinfo,
 		ppdu_info->rx_user_status[user_id].sw_peer_id =
 			HAL_RX_GET_SW_PEER_ID(rx_mpdu_start);
 
+		hal_update_rx_ctrl_frame_stats(ppdu_info, user_id);
+
 		if (ppdu_info->sw_frame_group_id ==
 		    HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) {
 			ppdu_info->rx_status.frame_control_info_valid =