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
This commit is contained in:
Subrat Mishra
2022-10-14 16:37:57 +05:30
committed by Madan Koyyalamudi
parent abbf1c968a
commit 92fc6fa7c1
12 changed files with 210 additions and 0 deletions

View File

@@ -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;
};
/**

View File

@@ -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

View File

@@ -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] += \

View File

@@ -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;
};
/**

View File

@@ -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.

View File

@@ -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)

View File

@@ -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

View File

@@ -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 */

View File

@@ -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

View File

@@ -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 =

View File

@@ -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

View File

@@ -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 =