qcacmn: Rx and Tx peer statistics update

* Update the pkt_type counters correctly within the array bound
 * Add support for NSS counters on Tx side
 * Update ampdu flag in PPDU struct
 * Add support for ampdu flag in hal_ppdu struct

Change-Id: I79ea52727124ea4be4d82912cb2513ea58e2af10
This commit is contained in:
Pranita Solanke
2018-01-12 19:14:31 +05:30
committed by snandini
parent 5819e29cbb
commit ed0aba69a9
7 changed files with 68 additions and 27 deletions

View File

@@ -836,6 +836,9 @@ struct cdp_tx_stats {
/* SGI count */
uint32_t sgi_count[MAX_GI];
/* Packet count for different num_spatial_stream values */
uint32_t nss[SS_COUNT];
/* Packet Count for different bandwidths */
uint32_t bw[MAX_BW];
@@ -935,6 +938,8 @@ struct cdp_tx_ingress_stats {
struct cdp_pkt_info inspect_pkts;
/*NAWDS Multicast Packet Count */
struct cdp_pkt_info nawds_mcast;
/* Number of broadcast packets */
struct cdp_pkt_info bcast;
struct {
/* Total Raw packets */

View File

@@ -80,6 +80,7 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
DP_STATS_UPD(peer, tx.tx_rate, ppdu->tx_rate);
DP_STATS_INC(peer, tx.sgi_count[ppdu->gi], num_msdu);
DP_STATS_INC(peer, tx.bw[ppdu->bw], num_msdu);
DP_STATS_INC(peer, tx.nss[ppdu->nss], num_msdu);
DP_STATS_UPD(peer, tx.last_ack_rssi, ack_rssi);
DP_STATS_INC(peer, tx.wme_ac_type[TID_TO_WME_AC(ppdu->tid)], num_msdu);
DP_STATS_INCC(peer, tx.stbc, num_msdu, ppdu->stbc);
@@ -101,31 +102,31 @@ static void dp_tx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
DP_STATS_INC(peer, tx.retries,
(ppdu->long_retries + ppdu->short_retries));
DP_STATS_INCC(peer,
tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu,
((mcs >= MAX_MCS_11A) && (preamble == DOT11_A)));
DP_STATS_INCC(peer,
tx.pkt_type[preamble].mcs_count[mcs], num_msdu,
((mcs < MAX_MCS_11A) && (preamble == DOT11_A)));
DP_STATS_INCC(peer,
tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu,
((mcs >= MAX_MCS_11B) && (preamble == DOT11_B)));
DP_STATS_INCC(peer,
tx.pkt_type[preamble].mcs_count[mcs], num_msdu,
((mcs < (MAX_MCS_11B)) && (preamble == DOT11_B)));
DP_STATS_INCC(peer,
tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu,
((mcs >= MAX_MCS_11A) && (preamble == DOT11_N)));
DP_STATS_INCC(peer,
tx.pkt_type[preamble].mcs_count[mcs], num_msdu,
((mcs < MAX_MCS_11A) && (preamble == DOT11_N)));
DP_STATS_INCC(peer,
tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu,
((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC)));
DP_STATS_INCC(peer,
tx.pkt_type[preamble].mcs_count[mcs], num_msdu,
((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC)));
DP_STATS_INCC(peer,
tx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
tx.pkt_type[preamble].mcs_count[MAX_MCS-1], num_msdu,
((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX)));
DP_STATS_INCC(peer,
tx.pkt_type[preamble].mcs_count[mcs], num_msdu,

View File

@@ -4828,6 +4828,14 @@ static inline void dp_print_peer_stats(struct dp_peer *peer)
peer->stats.tx.bw[2], peer->stats.tx.bw[3],
peer->stats.tx.bw[4], peer->stats.tx.bw[5]);
index = 0;
for (i = 0; i < SS_COUNT; i++) {
index += qdf_snprint(&nss[index], DP_NSS_LENGTH - index,
" %d", peer->stats.tx.nss[i]);
}
DP_PRINT_STATS("NSS(1-8) = %s",
nss);
DP_PRINT_STATS("Aggregation:");
DP_PRINT_STATS(" Number of Msdu's Part of Amsdu = %d",
peer->stats.tx.amsdu_cnt);

View File

@@ -1193,14 +1193,16 @@ dp_rx_process(struct dp_intr *int_ctx, void *hal_ring, uint32_t quota)
DP_STATS_INC_PKT(peer, rx.rcvd_reo[ring_id], 1,
qdf_nbuf_len(rx_desc->nbuf));
ampdu_flag = (mpdu_desc_info.mpdu_flags &
HAL_MPDU_F_AMPDU_FLAG);
if (soc->process_rx_status) {
ampdu_flag = (mpdu_desc_info.mpdu_flags &
HAL_MPDU_F_AMPDU_FLAG);
DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag);
DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ampdu_flag));
DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag);
DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ampdu_flag));
}
amsdu_flag = ((msdu_desc_info.msdu_flags &
HAL_MSDU_F_FIRST_MSDU_IN_MPDU) &&
HAL_MSDU_F_FIRST_MSDU_IN_MPDU) &&
(msdu_desc_info.msdu_flags &
HAL_MSDU_F_LAST_MSDU_IN_MPDU));
@@ -1410,7 +1412,7 @@ done:
DP_STATS_INC(peer, rx.bw[bw], 1);
DP_STATS_INC(peer, rx.sgi_count[sgi], 1);
DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
mcs_count[MAX_MCS], 1,
mcs_count[MAX_MCS - 1], 1,
((mcs >= MAX_MCS_11A) &&
(pkt_type == DOT11_A)));
DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
@@ -1418,7 +1420,7 @@ done:
((mcs < MAX_MCS_11A) &&
(pkt_type == DOT11_A)));
DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
mcs_count[MAX_MCS], 1,
mcs_count[MAX_MCS - 1], 1,
((mcs >= MAX_MCS_11B) &&
(pkt_type == DOT11_B)));
DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
@@ -1426,7 +1428,7 @@ done:
((mcs < MAX_MCS_11B) &&
(pkt_type == DOT11_B)));
DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
mcs_count[MAX_MCS], 1,
mcs_count[MAX_MCS - 1], 1,
((mcs >= MAX_MCS_11A) &&
(pkt_type == DOT11_N)));
DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
@@ -1434,7 +1436,7 @@ done:
((mcs < MAX_MCS_11A) &&
(pkt_type == DOT11_N)));
DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
mcs_count[MAX_MCS], 1,
mcs_count[MAX_MCS - 1], 1,
((mcs >= MAX_MCS_11AC) &&
(pkt_type == DOT11_AC)));
DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
@@ -1442,7 +1444,7 @@ done:
((mcs < MAX_MCS_11AC) &&
(pkt_type == DOT11_AC)));
DP_STATS_INCC(peer, rx.pkt_type[pkt_type].
mcs_count[MAX_MCS], 1,
mcs_count[MAX_MCS - 1], 1,
((mcs >= (MAX_MCS - 1)) &&
(pkt_type == DOT11_AX)));
DP_STATS_INCC(peer, rx.pkt_type[pkt_type].

View File

@@ -1,5 +1,5 @@
/*
* Copyright (c) 2017 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@@ -86,6 +86,11 @@ dp_rx_populate_cdp_indication_ppdu(struct dp_soc *soc,
cdp_rx_ppdu->num_msdu = (cdp_rx_ppdu->tcp_msdu_count +
cdp_rx_ppdu->udp_msdu_count +
cdp_rx_ppdu->other_msdu_count);
if (ppdu_info->com_info.mpdu_cnt_fcs_ok > 1)
cdp_rx_ppdu->is_ampdu = 1;
else
cdp_rx_ppdu->is_ampdu = 0;
}
#else
static inline void
@@ -124,37 +129,44 @@ static void dp_rx_stats_update(struct dp_soc *soc, struct dp_peer *peer,
return;
DP_STATS_UPD(peer, rx.rssi, ppdu->rssi);
if ((preamble == DOT11_A) || (preamble == DOT11_B))
ppdu->u.nss = 1;
if (ppdu->u.nss)
DP_STATS_INC(peer, rx.nss[ppdu->u.nss - 1], num_msdu);
DP_STATS_INC(peer, rx.sgi_count[ppdu->u.gi], num_msdu);
DP_STATS_INC(peer, rx.bw[ppdu->u.bw], num_msdu);
DP_STATS_INCC(peer, rx.ampdu_cnt, num_msdu, ppdu->is_ampdu);
DP_STATS_INCC(peer, rx.non_ampdu_cnt, num_msdu, !(ppdu->is_ampdu));
DP_STATS_UPD(peer, rx.rx_rate, mcs);
DP_STATS_INCC(peer,
rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu,
((mcs >= MAX_MCS_11A) && (preamble == DOT11_A)));
DP_STATS_INCC(peer,
rx.pkt_type[preamble].mcs_count[mcs], num_msdu,
((mcs < MAX_MCS_11A) && (preamble == DOT11_A)));
DP_STATS_INCC(peer,
rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu,
((mcs >= MAX_MCS_11B) && (preamble == DOT11_B)));
DP_STATS_INCC(peer,
rx.pkt_type[preamble].mcs_count[mcs], num_msdu,
((mcs < MAX_MCS_11B) && (preamble == DOT11_B)));
DP_STATS_INCC(peer,
rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu,
((mcs >= MAX_MCS_11A) && (preamble == DOT11_N)));
DP_STATS_INCC(peer,
rx.pkt_type[preamble].mcs_count[mcs], num_msdu,
((mcs < MAX_MCS_11A) && (preamble == DOT11_N)));
DP_STATS_INCC(peer,
rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu,
((mcs >= MAX_MCS_11AC) && (preamble == DOT11_AC)));
DP_STATS_INCC(peer,
rx.pkt_type[preamble].mcs_count[mcs], num_msdu,
((mcs < MAX_MCS_11AC) && (preamble == DOT11_AC)));
DP_STATS_INCC(peer,
rx.pkt_type[preamble].mcs_count[MAX_MCS], num_msdu,
rx.pkt_type[preamble].mcs_count[MAX_MCS - 1], num_msdu,
((mcs >= (MAX_MCS - 1)) && (preamble == DOT11_AX)));
DP_STATS_INCC(peer,
rx.pkt_type[preamble].mcs_count[mcs], num_msdu,

View File

@@ -2353,23 +2353,23 @@ static void dp_tx_update_peer_stats(struct dp_peer *peer,
if (!(soc->process_tx_status))
return;
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1,
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1,
((mcs >= MAX_MCS_11A) && (pkt_type == DOT11_A)));
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1,
((mcs < (MAX_MCS_11A)) && (pkt_type == DOT11_A)));
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1,
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1,
((mcs >= MAX_MCS_11B) && (pkt_type == DOT11_B)));
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1,
((mcs < MAX_MCS_11B) && (pkt_type == DOT11_B)));
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1,
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1,
((mcs >= MAX_MCS_11A) && (pkt_type == DOT11_N)));
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1,
((mcs < MAX_MCS_11A) && (pkt_type == DOT11_N)));
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1,
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1,
((mcs >= MAX_MCS_11AC) && (pkt_type == DOT11_AC)));
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1,
((mcs < MAX_MCS_11AC) && (pkt_type == DOT11_AC)));
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS], 1,
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[MAX_MCS - 1], 1,
((mcs >= (MAX_MCS - 1)) && (pkt_type == DOT11_AX)));
DP_STATS_INCC(peer, tx.pkt_type[pkt_type].mcs_count[mcs], 1,
((mcs < (MAX_MCS - 1)) && (pkt_type == DOT11_AX)));

View File

@@ -428,6 +428,8 @@ struct hal_rx_ppdu_common_info {
uint32_t ppdu_id;
uint32_t last_ppdu_id;
uint32_t ppdu_timestamp;
uint32_t mpdu_cnt_fcs_ok;
uint32_t mpdu_cnt_fcs_err;
};
struct hal_rx_ppdu_info {
@@ -523,6 +525,9 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info)
ppdu_info->rx_status.ast_index =
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4,
AST_INDEX);
ppdu_info->rx_status.mcs =
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, MCS);
tid = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_12,
RECEIVED_QOS_DATA_TID_BITMAP);
ppdu_info->rx_status.tid = qdf_find_first_bit(&tid, sizeof(tid)*8);
@@ -536,13 +541,21 @@ hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info)
UDP_MSDU_COUNT);
ppdu_info->rx_status.other_msdu_count =
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10,
OTHER_MSDU_COUNT);
OTHER_MSDU_COUNT);
ppdu_info->rx_status.nss =
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1, NSS);
ppdu_info->rx_status.first_data_seq_ctrl =
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
DATA_SEQUENCE_CONTROL_INFO_VALID);
ppdu_info->rx_status.preamble_type =
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
HT_CONTROL_FIELD_PKT_TYPE);
ppdu_info->com_info.mpdu_cnt_fcs_ok =
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
MPDU_CNT_FCS_OK);
ppdu_info->com_info.mpdu_cnt_fcs_err =
HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2,
MPDU_CNT_FCS_ERR);
break;
}