qcacld-3.0: Register STA tx completion cb to update stats

Register STA tx completion callback with dp as part of
vdev registration to update successful ack stats.

Change-Id: I27f36336f0e37d43cc2cdff204c0217667a48b13
CRs-Fixed: 2682020
This commit is contained in:
Yeshwanth Sriram Guntuka 2020-07-03 12:41:24 +05:30 committed by snandini
parent 621395dfc7
commit e0fe1711e5
9 changed files with 53 additions and 125 deletions

View File

@ -525,13 +525,6 @@ bool cds_is_group_addr(uint8_t *mac_addr)
return false;
}
/**
* cds_get_arp_stats_gw_ip() - get arp stats track IP
* @context: osif dev
*
* Return: ARP stats IP to track.
*/
uint32_t cds_get_arp_stats_gw_ip(void *context);
/**
* cds_get_connectivity_stats_pkt_bitmap() - get pkt-type bitmap
* @context: osif dev context
@ -539,8 +532,6 @@ uint32_t cds_get_arp_stats_gw_ip(void *context);
* Return: pkt bitmap to track
*/
uint32_t cds_get_connectivity_stats_pkt_bitmap(void *context);
void cds_incr_arp_stats_tx_tgt_delivered(void);
void cds_incr_arp_stats_tx_tgt_acked(void);
#ifdef FEATURE_ALIGN_STATS_FROM_DP
/**

View File

@ -2796,79 +2796,6 @@ uint32_t cds_get_connectivity_stats_pkt_bitmap(void *context)
return adapter->pkt_type_bitmap;
}
/**
* cds_get_arp_stats_gw_ip() - get arp stats track IP
*
* Return: ARP stats IP to track
*/
uint32_t cds_get_arp_stats_gw_ip(void *context)
{
struct hdd_adapter *adapter = NULL;
if (!context)
return 0;
adapter = (struct hdd_adapter *)context;
if (unlikely(adapter->magic != WLAN_HDD_ADAPTER_MAGIC)) {
cds_err("Magic cookie(%x) for adapter sanity verification is invalid",
adapter->magic);
return 0;
}
return adapter->track_arp_ip;
}
/**
* cds_incr_arp_stats_tx_tgt_delivered() - increment ARP stats
*
* Return: none
*/
void cds_incr_arp_stats_tx_tgt_delivered(void)
{
struct hdd_context *hdd_ctx;
struct hdd_adapter *adapter = NULL;
hdd_ctx = gp_cds_context->hdd_context;
if (!hdd_ctx) {
cds_err("Hdd Context is Null");
return;
}
hdd_for_each_adapter(hdd_ctx, adapter) {
if (QDF_STA_MODE == adapter->device_mode)
break;
}
if (adapter)
adapter->hdd_stats.hdd_arp_stats.tx_host_fw_sent++;
}
/**
* cds_incr_arp_stats_tx_tgt_acked() - increment ARP stats
*
* Return: none
*/
void cds_incr_arp_stats_tx_tgt_acked(void)
{
struct hdd_context *hdd_ctx;
struct hdd_adapter *adapter = NULL;
hdd_ctx = gp_cds_context->hdd_context;
if (!hdd_ctx) {
cds_err("Hdd Context is Null");
return;
}
hdd_for_each_adapter(hdd_ctx, adapter) {
if (QDF_STA_MODE == adapter->device_mode)
break;
}
if (adapter)
adapter->hdd_stats.hdd_arp_stats.tx_ack_cnt++;
}
#ifdef FEATURE_ALIGN_STATS_FROM_DP
/**
* cds_get_cdp_vdev_stats() - Function which retrieves cdp vdev stats

View File

@ -552,4 +552,13 @@ wlan_hdd_dump_queue_history_state(struct hdd_netif_queue_history *q_hist,
bool wlan_hdd_rx_rpm_mark_last_busy(struct hdd_context *hdd_ctx,
void *hif_ctx);
/**
* hdd_sta_notify_tx_comp_cb() - notify tx comp callback registered with dp
* @skb: pointer to skb
* @ctx: osif context
* @flag: tx status flag
*
* Return: None
*/
void hdd_sta_notify_tx_comp_cb(qdf_nbuf_t skb, void *ctx, uint16_t flag);
#endif /* end #if !defined(WLAN_HDD_TX_RX_H) */

View File

@ -2239,6 +2239,7 @@ QDF_STATUS hdd_roam_register_sta(struct hdd_adapter *adapter,
txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;
txrx_ops.tx.tx_comp = hdd_sta_notify_tx_comp_cb;
txrx_ops.tx.tx = NULL;
cdp_vdev_register(soc, adapter->vdev_id, (ol_osif_vdev_handle)adapter,
&txrx_ops);

View File

@ -14176,8 +14176,6 @@ static int __wlan_hdd_cfg80211_get_nud_stats(struct wiphy *wiphy,
goto exit;
}
hdd_update_sta_arp_stats(adapter);
if (nla_put_u16(skb, COUNT_FROM_NETDEV,
adapter->hdd_stats.hdd_arp_stats.tx_arp_req_count) ||
nla_put_u16(skb, COUNT_TO_LOWER_MAC,

View File

@ -1014,11 +1014,12 @@ static inline void hdd_softap_tsf_timestamp_rx(struct hdd_context *hdd_ctx,
* hdd_softap_notify_tx_compl_cbk() - callback to notify tx completion
* @skb: pointer to skb data
* @adapter: pointer to vdev apdapter
* @flags: tx status flag
*
* Return: None
*/
static void hdd_softap_notify_tx_compl_cbk(struct sk_buff *skb,
void *context)
void *context, uint16_t flag)
{
int errno;
struct hdd_adapter *adapter = context;

View File

@ -6358,35 +6358,3 @@ void wlan_hdd_register_cp_stats_cb(struct hdd_context *hdd_ctx)
hdd_lost_link_cp_stats_info_cb);
}
#endif
QDF_STATUS hdd_update_sta_arp_stats(struct hdd_adapter *adapter)
{
struct cdp_peer_stats *peer_stats;
struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
struct hdd_arp_stats_s *arp_stats;
QDF_STATUS status;
peer_stats = qdf_mem_malloc(sizeof(*peer_stats));
if (!peer_stats)
return QDF_STATUS_E_NOMEM;
status = cdp_host_get_peer_stats(cds_get_context(QDF_MODULE_ID_SOC),
adapter->vdev_id,
sta_ctx->conn_info.bssid.bytes,
peer_stats);
if (QDF_IS_STATUS_ERROR(status)) {
qdf_mem_free(peer_stats);
return status;
}
arp_stats = &adapter->hdd_stats.hdd_arp_stats;
arp_stats->tx_host_fw_sent =
arp_stats->tx_arp_req_count - arp_stats->tx_dropped;
arp_stats->tx_ack_cnt = arp_stats->tx_host_fw_sent -
peer_stats->tx.no_ack_count[QDF_PROTO_ARP_REQ];
qdf_mem_free(peer_stats);
return QDF_STATUS_SUCCESS;
}

View File

@ -537,12 +537,4 @@ void wlan_hdd_register_cp_stats_cb(struct hdd_context *hdd_ctx);
#else
static inline void wlan_hdd_register_cp_stats_cb(struct hdd_context *hdd_ctx) {}
#endif
/**
* hdd_update_sta_arp_stats() - update arp stats
* @adapter: adapter context
*
* Return: An error code or 0 on success.
*/
QDF_STATUS hdd_update_sta_arp_stats(struct hdd_adapter *adapter);
#endif /* end #if !defined(WLAN_HDD_STATS_H) */

View File

@ -986,6 +986,7 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb,
if (qdf_nbuf_data_is_arp_req(skb) &&
(adapter->track_arp_ip == qdf_nbuf_get_arp_tgt_ip(skb))) {
is_arp = true;
QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) = 1;
++adapter->hdd_stats.hdd_arp_stats.tx_arp_req_count;
QDF_TRACE(QDF_MODULE_ID_HDD_DATA,
QDF_TRACE_LEVEL_INFO_HIGH,
@ -996,9 +997,11 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb,
subtype = qdf_nbuf_get_eapol_subtype(skb);
if (subtype == QDF_PROTO_EAPOL_M2) {
++adapter->hdd_stats.hdd_eapol_stats.eapol_m2_count;
QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) = 1;
is_eapol = true;
} else if (subtype == QDF_PROTO_EAPOL_M4) {
++adapter->hdd_stats.hdd_eapol_stats.eapol_m4_count;
QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) = 1;
is_eapol = true;
}
} else if (QDF_NBUF_CB_GET_PACKET_TYPE(skb) ==
@ -1006,9 +1009,11 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb,
subtype = qdf_nbuf_get_dhcp_subtype(skb);
if (subtype == QDF_PROTO_DHCP_DISCOVER) {
++adapter->hdd_stats.hdd_dhcp_stats.dhcp_dis_count;
QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) = 1;
is_dhcp = true;
} else if (subtype == QDF_PROTO_DHCP_REQUEST) {
++adapter->hdd_stats.hdd_dhcp_stats.dhcp_req_count;
QDF_NBUF_CB_TX_EXTRA_FRAG_FLAGS_NOTIFY_COMP(skb) = 1;
is_dhcp = true;
}
}
@ -3369,3 +3374,39 @@ bool wlan_hdd_rx_rpm_mark_last_busy(struct hdd_context *hdd_ctx,
else
return false;
}
void hdd_sta_notify_tx_comp_cb(qdf_nbuf_t skb, void *ctx, uint16_t flag)
{
struct hdd_adapter *adapter = ctx;
enum qdf_proto_subtype subtype;
if (hdd_validate_adapter(adapter))
return;
switch (QDF_NBUF_CB_GET_PACKET_TYPE(skb)) {
case QDF_NBUF_CB_PACKET_TYPE_ARP:
if (flag & BIT(QDF_TX_RX_STATUS_DOWNLOAD_SUCC))
++adapter->hdd_stats.hdd_arp_stats.
tx_host_fw_sent;
if (flag & BIT(QDF_TX_RX_STATUS_OK))
++adapter->hdd_stats.hdd_arp_stats.tx_ack_cnt;
break;
case QDF_NBUF_CB_PACKET_TYPE_EAPOL:
subtype = qdf_nbuf_get_eapol_subtype(skb);
if (!(flag & BIT(QDF_TX_RX_STATUS_OK)) &&
subtype != QDF_PROTO_INVALID)
++adapter->hdd_stats.hdd_eapol_stats.
tx_noack_cnt[subtype - QDF_PROTO_EAPOL_M1];
break;
case QDF_NBUF_CB_PACKET_TYPE_DHCP:
subtype = qdf_nbuf_get_dhcp_subtype(skb);
if (!(flag & BIT(QDF_TX_RX_STATUS_OK)) &&
subtype != QDF_PROTO_INVALID &&
subtype <= QDF_PROTO_DHCP_ACK)
++adapter->hdd_stats.hdd_dhcp_stats.
tx_noack_cnt[subtype - QDF_PROTO_DHCP_DISCOVER];
break;
default:
break;
}
}