qcacmn: Add cdp function to get rate/link stats

Add cdp function to get the peer extended rate and link stats.
This change is to support user level command to flush mld/link
peer extended link and rate stats.

cfg80211tool wifiX get_peer_extd_rate_link_stats <mac_addr>

Change-Id: I20cd2b38b242008b95aedc5f9914088a149093dd
CRs-Fixed: 3278042
This commit is contained in:
KARTHIK KUMAR T
2022-08-11 12:02:18 +05:30
committed by Madan Koyyalamudi
parent 3e3726cc7a
commit 8267333021
3 changed files with 127 additions and 0 deletions

View File

@@ -12744,6 +12744,102 @@ dp_flush_rate_stats_req(struct cdp_soc_t *soc_hdl,
}
#endif
#if defined(FEATURE_PERPKT_INFO) && WDI_EVENT_ENABLE
#ifdef WLAN_FEATURE_11BE_MLO
/**
* dp_get_peer_extd_rate_link_stats(): function to get peer
* extended rate and link stats
* @soc_hdl: dp soc handler
* @mac_addr: mac address of peer
*
* Return: QDF_STATUS
*/
static QDF_STATUS
dp_get_peer_extd_rate_link_stats(struct cdp_soc_t *soc_hdl, uint8_t *mac_addr)
{
uint8_t i;
struct dp_peer *link_peer;
struct dp_soc *link_peer_soc;
struct dp_mld_link_peers link_peers_info;
struct dp_peer *peer = NULL;
struct dp_soc *soc = (struct dp_soc *)soc_hdl;
if (!mac_addr) {
dp_err("NULL peer mac addr\n");
return QDF_STATUS_E_FAILURE;
}
peer = dp_peer_find_hash_find(soc, mac_addr, 0,
DP_VDEV_ALL, DP_MOD_ID_CDP);
if (!peer) {
dp_err("Invalid peer\n");
return QDF_STATUS_E_FAILURE;
}
if (IS_MLO_DP_MLD_PEER(peer)) {
dp_get_link_peers_ref_from_mld_peer(soc, peer,
&link_peers_info,
DP_MOD_ID_CDP);
for (i = 0; i < link_peers_info.num_links; i++) {
link_peer = link_peers_info.link_peers[i];
link_peer_soc = link_peer->vdev->pdev->soc;
dp_wdi_event_handler(WDI_EVENT_FLUSH_RATE_STATS_REQ,
link_peer_soc,
dp_monitor_peer_get_peerstats_ctx
(link_peer_soc, link_peer),
link_peer->peer_id,
WDI_NO_VAL,
link_peer->vdev->pdev->pdev_id);
}
dp_release_link_peers_ref(&link_peers_info, DP_MOD_ID_CDP);
} else {
dp_wdi_event_handler(
WDI_EVENT_FLUSH_RATE_STATS_REQ, soc,
dp_monitor_peer_get_peerstats_ctx(soc, peer),
peer->peer_id,
WDI_NO_VAL, peer->vdev->pdev->pdev_id);
}
dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
return QDF_STATUS_SUCCESS;
}
#else
static QDF_STATUS
dp_get_peer_extd_rate_link_stats(struct cdp_soc_t *soc_hdl, uint8_t *mac_addr)
{
struct dp_peer *peer = NULL;
struct dp_soc *soc = (struct dp_soc *)soc_hdl;
if (!mac_addr) {
dp_err("NULL peer mac addr\n");
return QDF_STATUS_E_FAILURE;
}
peer = dp_peer_find_hash_find(soc, mac_addr, 0,
DP_VDEV_ALL, DP_MOD_ID_CDP);
if (!peer) {
dp_err("Invalid peer\n");
return QDF_STATUS_E_FAILURE;
}
dp_wdi_event_handler(
WDI_EVENT_FLUSH_RATE_STATS_REQ, soc,
dp_monitor_peer_get_peerstats_ctx(soc, peer),
peer->peer_id,
WDI_NO_VAL, peer->vdev->pdev->pdev_id);
dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
return QDF_STATUS_SUCCESS;
}
#endif
#else
static inline QDF_STATUS
dp_get_peer_extd_rate_link_stats(struct cdp_soc_t *soc_hdl, uint8_t *mac_addr)
{
return QDF_STATUS_SUCCESS;
}
#endif
static void *dp_peer_get_peerstats_ctx(struct cdp_soc_t *soc_hdl,
uint8_t vdev_id,
uint8_t *mac_addr)
@@ -13684,6 +13780,8 @@ static struct cdp_host_stats_ops dp_ops_host_stats = {
.txrx_pdev_telemetry_stats = dp_get_pdev_telemetry_stats,
.txrx_peer_telemetry_stats = dp_get_peer_telemetry_stats,
#endif
.txrx_get_peer_extd_rate_link_stats =
dp_get_peer_extd_rate_link_stats,
/* TODO */
};