qcacld-3.0: track connectivity stats for rx packets
Track connectivity stats for data rx packets through a
callback function hdd_tx_rx_collect_connectivity_stats_info().
Change-Id: I045ba694495876273691373a9d0a8995d4aa9c34
CRs-Fixed: 2161889
diff --git a/core/cds/inc/cds_api.h b/core/cds/inc/cds_api.h
index 1920c82..120715e 100644
--- a/core/cds/inc/cds_api.h
+++ b/core/cds/inc/cds_api.h
@@ -597,6 +597,13 @@
* 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
+ *
+ * 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);
diff --git a/core/cds/src/cds_api.c b/core/cds/src/cds_api.c
index 855b1e4..2f67aa7 100644
--- a/core/cds/src/cds_api.c
+++ b/core/cds/src/cds_api.c
@@ -2776,6 +2776,25 @@
}
#endif
+uint32_t cds_get_connectivity_stats_pkt_bitmap(void *context)
+{
+ struct hdd_adapter *adapter = NULL;
+
+ adapter = (struct hdd_adapter *)context;
+ if (unlikely(adapter->magic != WLAN_HDD_ADAPTER_MAGIC)) {
+ QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_ERROR,
+ "Magic cookie(%x) for adapter sanity verification is invalid",
+ adapter->magic);
+ return QDF_STATUS_E_FAILURE;
+ }
+ 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 = (struct hdd_adapter *)context;
diff --git a/core/dp/txrx/ol_tx_send.c b/core/dp/txrx/ol_tx_send.c
index a707a52..06134c1 100644
--- a/core/dp/txrx/ol_tx_send.c
+++ b/core/dp/txrx/ol_tx_send.c
@@ -630,6 +630,37 @@
#endif
/**
+ * ol_tx_update_connectivity_stats() - update connectivity stats
+ * @tx_desc: tx desc
+ * @netbuf: buffer
+ * @status: htt status
+ *
+ *
+ * Return: none
+ */
+static void ol_tx_update_connectivity_stats(struct ol_tx_desc_t *tx_desc,
+ qdf_nbuf_t netbuf,
+ enum htt_tx_status status)
+{
+ void *osif_dev;
+ ol_txrx_stats_rx_fp stats_rx = NULL;
+ uint8_t pkt_type = 0;
+
+ qdf_assert(tx_desc);
+ osif_dev = tx_desc->vdev->osif_dev;
+ stats_rx = tx_desc->vdev->stats_rx;
+
+ if (stats_rx) {
+ if (status != htt_tx_status_download_fail)
+ stats_rx(netbuf, osif_dev,
+ PKT_TYPE_TX_HOST_FW_SENT, &pkt_type);
+ if (status == htt_tx_status_ok)
+ stats_rx(netbuf, osif_dev,
+ PKT_TYPE_TX_ACK_CNT, &pkt_type);
+ }
+}
+
+/**
* ol_tx_update_arp_stats() - update ARP packet TX stats
* @tx_desc: tx desc
* @netbuf: buffer
@@ -671,6 +702,7 @@
struct ol_tx_desc_t *tx_desc;
uint32_t byte_cnt = 0;
qdf_nbuf_t netbuf;
+ uint32_t pkt_type_bitmap;
tp_ol_packetdump_cb packetdump_cb;
uint32_t is_tx_desc_freed = 0;
struct htt_tx_compl_ind_append_tx_tstamp *txtstamp_list = NULL;
@@ -712,6 +744,13 @@
ol_tx_update_arp_stats(tx_desc, netbuf, status);
}
+ /* track connectivity stats */
+ pkt_type_bitmap = cds_get_connectivity_stats_pkt_bitmap(
+ tx_desc->vdev->osif_dev);
+ if (pkt_type_bitmap)
+ ol_tx_update_connectivity_stats(tx_desc, netbuf,
+ status);
+
if (tx_desc->pkt_type != OL_TX_FRM_TSO) {
packetdump_cb = pdev->ol_tx_packetdump_cb;
if (packetdump_cb)
diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c
index 9b38a50..4bc567d 100644
--- a/core/dp/txrx/ol_txrx.c
+++ b/core/dp/txrx/ol_txrx.c
@@ -2301,6 +2301,7 @@
vdev->osif_dev = osif_vdev;
vdev->rx = txrx_ops->rx.rx;
+ vdev->stats_rx = txrx_ops->rx.stats_rx;
txrx_ops->tx.tx = ol_tx_data;
}
diff --git a/core/dp/txrx/ol_txrx_types.h b/core/dp/txrx/ol_txrx_types.h
index b07a5ea..ffb9301 100644
--- a/core/dp/txrx/ol_txrx_types.h
+++ b/core/dp/txrx/ol_txrx_types.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2013-2018 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -1037,6 +1037,7 @@
* pseudo-peer)
*/
ol_txrx_rx_fp rx; /* receive function used by this vdev */
+ ol_txrx_stats_rx_fp stats_rx; /* receive function used by this vdev */
struct {
/*