qcacmn: provide an API to fetch individual peer stats

Provide an API to fetch required individual peer stats
from the data path peer stats instead of copying the
whole peer stats structure.

Change-Id: I1c9619bc7d9bb0e3e3df6d38cc5f4570869e31fe
This commit is contained in:
Pavankumar Nandeshwar
2019-12-01 01:05:18 +05:30
committed by nshrivas
parent 06f280e5b5
commit 2771d985bc
4 changed files with 182 additions and 2 deletions

View File

@@ -476,6 +476,40 @@ cdp_update_vdev_host_stats(ol_txrx_soc_handle soc,
stats_id); stats_id);
} }
/**
* @brief Call to get specified peer stats
*
* @param soc - soc handle
* @param vdev_id - vdev_id of vdev object
* @param peer_mac - mac address of the peer
* @param type - enum of required stats
* @param buf - buffer to hold the value
* @return - QDF_STATUS
*/
static inline QDF_STATUS
cdp_txrx_get_peer_stats_param(ol_txrx_soc_handle soc, uint8_t vdev_id,
uint8_t *peer_mac,
enum cdp_peer_stats_type type,
cdp_peer_stats_param_t *buf)
{
if (!soc || !soc->ops) {
QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG,
"%s: Invalid Instance", __func__);
QDF_BUG(0);
return QDF_STATUS_E_FAILURE;
}
if (!soc->ops->host_stats_ops ||
!soc->ops->host_stats_ops->txrx_get_peer_stats_param)
return QDF_STATUS_E_FAILURE;
return soc->ops->host_stats_ops->txrx_get_peer_stats_param(soc,
vdev_id,
peer_mac,
type,
buf);
}
/** /**
* @brief Call to get peer stats * @brief Call to get peer stats
* *

View File

@@ -820,6 +820,12 @@ struct cdp_host_stats_ops {
(*txrx_update_pdev_stats)(struct cdp_soc_t *soc, (*txrx_update_pdev_stats)(struct cdp_soc_t *soc,
uint8_t pdev_id, void *data, uint8_t pdev_id, void *data,
uint16_t stats_id); uint16_t stats_id);
QDF_STATUS
(*txrx_get_peer_stats_param)(struct cdp_soc_t *soc,
uint8_t vdev_id,
uint8_t *peer_mac,
enum cdp_peer_stats_type type,
cdp_peer_stats_param_t *buf);
QDF_STATUS QDF_STATUS
(*txrx_get_peer_stats)(struct cdp_soc_t *soc, uint8_t vdev_id, (*txrx_get_peer_stats)(struct cdp_soc_t *soc, uint8_t vdev_id,
uint8_t *peer_mac, uint8_t *peer_mac,

View File

@@ -617,6 +617,56 @@ struct cdp_tso_stats {
#endif /* FEATURE_TSO_STATS */ #endif /* FEATURE_TSO_STATS */
}; };
#define CDP_PEER_STATS_START 0
enum cdp_peer_stats_type {
cdp_peer_stats_min = CDP_PEER_STATS_START,
/* Tx types */
cdp_peer_tx_ucast = cdp_peer_stats_min,
cdp_peer_tx_mcast,
cdp_peer_tx_rate,
cdp_peer_tx_last_tx_rate,
cdp_peer_tx_inactive_time,
cdp_peer_tx_ratecode,
cdp_peer_tx_flags,
cdp_peer_tx_power,
/* Rx types */
cdp_peer_rx_rate,
cdp_peer_rx_last_rx_rate,
cdp_peer_rx_ratecode,
cdp_peer_rx_ucast,
cdp_peer_rx_flags,
cdp_peer_rx_avg_rssi,
cdp_peer_stats_max,
};
/*
* The max size of cdp_peer_stats_param_t is limited to 16 bytes.
* If the buffer size is exceeding this size limit,
* dp_txrx_get_peer_stats is to be used instead.
*/
typedef union cdp_peer_stats_buf {
/* Tx types */
struct cdp_pkt_info tx_ucast;
struct cdp_pkt_info tx_mcast;
uint32_t tx_rate;
uint32_t last_tx_rate;
uint32_t tx_inactive_time;
uint32_t tx_flags;
uint32_t tx_power;
uint16_t tx_ratecode;
/* Rx types */
struct cdp_pkt_info rx_ucast;
uint32_t rx_rate;
uint32_t last_rx_rate;
uint32_t rx_ratecode;
uint32_t rx_flags;
uint32_t rx_avg_rssi;
} cdp_peer_stats_param_t; /* Max union size 16 bytes */
/* struct cdp_tx_stats - tx stats /* struct cdp_tx_stats - tx stats
* @cdp_pkt_info comp_pkt: Pkt Info for which completions were received * @cdp_pkt_info comp_pkt: Pkt Info for which completions were received
* @cdp_pkt_info ucast: Unicast Packet Count * @cdp_pkt_info ucast: Unicast Packet Count

View File

@@ -73,6 +73,14 @@ cdp_dump_flow_pool_info(struct cdp_soc_t *soc)
#endif #endif
#endif #endif
/*
* The max size of cdp_peer_stats_param_t is limited to 16 bytes.
* If the buffer size is exceeding this size limit,
* dp_txrx_get_peer_stats is to be used instead.
*/
QDF_COMPILE_TIME_ASSERT(cdp_peer_stats_param_t_max_size,
(sizeof(cdp_peer_stats_param_t) <= 16));
#ifdef WLAN_FEATURE_DP_EVENT_HISTORY #ifdef WLAN_FEATURE_DP_EVENT_HISTORY
/* /*
* If WLAN_CFG_INT_NUM_CONTEXTS is changed, HIF_NUM_INT_CONTEXTS * If WLAN_CFG_INT_NUM_CONTEXTS is changed, HIF_NUM_INT_CONTEXTS
@@ -8696,18 +8704,99 @@ dp_txrx_get_peer_stats(struct cdp_soc_t *soc, uint8_t vdev_id,
if (!peer || peer->delete_in_progress) { if (!peer || peer->delete_in_progress) {
status = QDF_STATUS_E_FAILURE; status = QDF_STATUS_E_FAILURE;
goto fail;
} else } else
qdf_mem_copy(peer_stats, &peer->stats, qdf_mem_copy(peer_stats, &peer->stats,
sizeof(struct cdp_peer_stats)); sizeof(struct cdp_peer_stats));
fail:
if (peer) if (peer)
dp_peer_unref_delete(peer); dp_peer_unref_delete(peer);
return status; return status;
} }
/* dp_txrx_get_peer_stats_param - will return specified cdp_peer_stats
* @param soc - soc handle
* @param vdev_id - vdev_id of vdev object
* @param peer_mac - mac address of the peer
* @param type - enum of required stats
* @param buf - buffer to hold the value
* return : status success/failure
*/
static QDF_STATUS
dp_txrx_get_peer_stats_param(struct cdp_soc_t *soc, uint8_t vdev_id,
uint8_t *peer_mac, enum cdp_peer_stats_type type,
cdp_peer_stats_param_t *buf)
{
QDF_STATUS ret = QDF_STATUS_SUCCESS;
struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)soc,
peer_mac, 0, vdev_id);
if (!peer || peer->delete_in_progress) {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"Invalid Peer for Mac %pM", peer_mac);
ret = QDF_STATUS_E_FAILURE;
} else if (type < cdp_peer_stats_max) {
switch (type) {
case cdp_peer_tx_ucast:
buf->tx_ucast = peer->stats.tx.ucast;
break;
case cdp_peer_tx_mcast:
buf->tx_mcast = peer->stats.tx.mcast;
break;
case cdp_peer_tx_rate:
buf->tx_rate = peer->stats.tx.tx_rate;
break;
case cdp_peer_tx_last_tx_rate:
buf->last_tx_rate = peer->stats.tx.last_tx_rate;
break;
case cdp_peer_tx_inactive_time:
buf->tx_inactive_time = peer->stats.tx.inactive_time;
break;
case cdp_peer_tx_ratecode:
buf->tx_ratecode = peer->stats.tx.tx_ratecode;
break;
case cdp_peer_tx_flags:
buf->tx_flags = peer->stats.tx.tx_flags;
break;
case cdp_peer_tx_power:
buf->tx_power = peer->stats.tx.tx_power;
break;
case cdp_peer_rx_rate:
buf->rx_rate = peer->stats.rx.rx_rate;
break;
case cdp_peer_rx_last_rx_rate:
buf->last_rx_rate = peer->stats.rx.last_rx_rate;
break;
case cdp_peer_rx_ratecode:
buf->rx_ratecode = peer->stats.rx.rx_ratecode;
break;
case cdp_peer_rx_ucast:
buf->rx_ucast = peer->stats.rx.unicast;
break;
case cdp_peer_rx_flags:
buf->rx_flags = peer->stats.rx.rx_flags;
break;
case cdp_peer_rx_avg_rssi:
buf->rx_avg_rssi = peer->stats.rx.avg_rssi;
break;
default:
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"Invalid value");
ret = QDF_STATUS_E_FAILURE;
break;
}
} else {
QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
"Invalid value");
ret = QDF_STATUS_E_FAILURE;
}
if (peer)
dp_peer_unref_delete(peer);
return ret;
}
/* dp_txrx_reset_peer_stats - reset cdp_peer_stats for particular peer /* dp_txrx_reset_peer_stats - reset cdp_peer_stats for particular peer
* @soc: soc handle * @soc: soc handle
* @vdev_id: id of vdev handle * @vdev_id: id of vdev handle
@@ -10090,6 +10179,7 @@ static struct cdp_host_stats_ops dp_ops_host_stats = {
.txrx_stats_publish = dp_txrx_stats_publish, .txrx_stats_publish = dp_txrx_stats_publish,
.txrx_get_vdev_stats = dp_txrx_get_vdev_stats, .txrx_get_vdev_stats = dp_txrx_get_vdev_stats,
.txrx_get_peer_stats = dp_txrx_get_peer_stats, .txrx_get_peer_stats = dp_txrx_get_peer_stats,
.txrx_get_peer_stats_param = dp_txrx_get_peer_stats_param,
.txrx_reset_peer_stats = dp_txrx_reset_peer_stats, .txrx_reset_peer_stats = dp_txrx_reset_peer_stats,
.txrx_get_pdev_stats = dp_txrx_get_pdev_stats, .txrx_get_pdev_stats = dp_txrx_get_pdev_stats,
.txrx_get_ratekbps = dp_txrx_get_ratekbps, .txrx_get_ratekbps = dp_txrx_get_ratekbps,