summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo Chang <schang@qca.qualcomm.com>2014-02-21 15:22:49 -0800
committerAkash Patel <c_akashp@qca.qualcomm.com>2014-03-03 21:02:46 -0800
commit5651136e012bf132f2a6050bcadef4bde99c1eb5 (patch)
treed110e4e0db459af282d02a0458f1f778944a9b2a
parent72a9e187336a7354c234f4ca33b566ce64879506 (diff)
wlan: cld, add protocol specific packet tracking
For debugging purpose, outstanding protocol tracking capability is needed. Current requirement is EAPOL and DHCP protocol. WLAN kernel driver will track EAPOL and DHCP packet and display at kernel log. For performance reason, as default feature will be disabled, and may enabled with configuration file. Change-Id: I1a22444cd38a41a9c6181676889c2b436ee00d8b CRs-fixed: 607504
-rw-r--r--CORE/CLD_TXRX/HTT/htt_tx.c2
-rw-r--r--CORE/CLD_TXRX/TLSHIM/tl_shim.c10
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_send.c3
-rw-r--r--CORE/HDD/inc/qc_sap_ioctl.h3
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c16
-rw-r--r--CORE/HDD/src/wlan_hdd_hostapd.c39
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c7
-rw-r--r--CORE/HDD/src/wlan_hdd_softap_tx_rx.c47
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c48
-rw-r--r--CORE/HDD/src/wlan_hdd_wext.c13
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.c51
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.h52
-rw-r--r--CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h22
-rw-r--r--CORE/TL/inc/wlan_qct_tl.h6
-rw-r--r--CORE/VOSS/inc/vos_packet.h71
-rw-r--r--CORE/VOSS/src/vos_packet.c201
-rw-r--r--[-rwxr-xr-x]Kbuild3
17 files changed, 588 insertions, 6 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_tx.c b/CORE/CLD_TXRX/HTT/htt_tx.c
index 0b77b0c09197..c0b545bec185 100644
--- a/CORE/CLD_TXRX/HTT/htt_tx.c
+++ b/CORE/CLD_TXRX/HTT/htt_tx.c
@@ -318,6 +318,8 @@ htt_tx_send_std(
htt_tx_sched(pdev);
return 0;
}
+
+ adf_nbuf_trace_update(msdu, "HT:T:");
if (HTCSendDataPkt(pdev->htc_pdev, msdu, pdev->htc_endpoint, download_len)){
HTT_TX_NBUF_QUEUE_ADD(pdev, msdu);
}
diff --git a/CORE/CLD_TXRX/TLSHIM/tl_shim.c b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
index 5b1975f06980..db270f9de0f3 100644
--- a/CORE/CLD_TXRX/TLSHIM/tl_shim.c
+++ b/CORE/CLD_TXRX/TLSHIM/tl_shim.c
@@ -904,7 +904,11 @@ void WLANTL_RegisterVdev(void *vos_ctx, void *vdev)
* in case of success, skb pointer in case of failure.
*/
adf_nbuf_t WLANTL_SendSTA_DataFrame(void *vos_ctx, u_int8_t sta_id,
- adf_nbuf_t skb)
+ adf_nbuf_t skb
+#ifdef QCA_PKT_PROTO_TRACE
+ , v_U8_t proto_type
+#endif /* QCA_PKT_PROTO_TRACE */
+ )
{
struct txrx_tl_shim_ctx *tl_shim = vos_get_context(VOS_MODULE_ID_TL,
vos_ctx);
@@ -952,6 +956,10 @@ adf_nbuf_t WLANTL_SendSTA_DataFrame(void *vos_ctx, u_int8_t sta_id,
adf_os_mem_set(skb->cb, 0, sizeof(skb->cb));
adf_nbuf_map_single(adf_ctx, skb, ADF_OS_DMA_TO_DEVICE);
+#ifdef QCA_PKT_PROTO_TRACE
+ adf_nbuf_trace_set_proto_type(skb, proto_type);
+#endif /* QCA_PKT_PROTO_TRACE */
+
if ((tl_shim->ip_checksum_offload) && (skb->protocol == htons(ETH_P_IP))
&& (skb->ip_summed == CHECKSUM_PARTIAL))
skb->ip_summed = CHECKSUM_COMPLETE;
diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/CORE/CLD_TXRX/TXRX/ol_tx_send.c
index 0c8e6f66cabd..8a879a9373b6 100644
--- a/CORE/CLD_TXRX/TXRX/ol_tx_send.c
+++ b/CORE/CLD_TXRX/TXRX/ol_tx_send.c
@@ -455,6 +455,7 @@ ol_tx_completion_handler(
u_int16_t *desc_ids = (u_int16_t *)tx_desc_id_iterator;
u_int16_t tx_desc_id;
struct ol_tx_desc_t *tx_desc;
+ char *trace_str;
uint32_t byte_cnt = 0;
union ol_tx_desc_list_elem_t *td_array = pdev->tx_desc.array;
@@ -467,12 +468,14 @@ ol_tx_completion_handler(
OL_TX_DELAY_COMPUTE(pdev, status, desc_ids, num_msdus);
+ trace_str = (status) ? "OT:C:F:" : "OT:C:S:";
for (i = 0; i < num_msdus; i++) {
tx_desc_id = desc_ids[i];
tx_desc = &td_array[tx_desc_id].tx_desc;
tx_desc->status = status;
netbuf = tx_desc->netbuf;
+ adf_nbuf_trace_update(netbuf, trace_str);
/* Per SDU update of byte count */
byte_cnt += adf_nbuf_len(netbuf);
if (OL_TX_DESC_NO_REFS(tx_desc)) {
diff --git a/CORE/HDD/inc/qc_sap_ioctl.h b/CORE/HDD/inc/qc_sap_ioctl.h
index 7c900dda74dd..7c470ea1a8d4 100644
--- a/CORE/HDD/inc/qc_sap_ioctl.h
+++ b/CORE/HDD/inc/qc_sap_ioctl.h
@@ -296,6 +296,9 @@ typedef struct
#define QCSAP_GET_GTX_STEP 65
#define QCSAP_GET_GTX_MINTPC 66
#define QCSAP_GET_GTX_BWMASK 67
+#ifdef QCA_PKT_PROTO_TRACE
+#define QCASAP_SET_DEBUG_LOG 68
+#endif /* QCA_PKT_PROTO_TRACE */
#endif /* QCA_WIFI_2_0 */
enum {
diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c
index 6a641f07d70a..23d019c35d1c 100644
--- a/CORE/HDD/src/wlan_hdd_assoc.c
+++ b/CORE/HDD/src/wlan_hdd_assoc.c
@@ -817,6 +817,14 @@ static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo *
WLAN_STA_DISCONNECT, pHddStaCtx->conn_info.bssId);
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ /* STA disconnected, update into trace buffer */
+ if (pHddCtx->cfg_ini->gEnableDebugLog)
+ {
+ vos_pkt_trace_buf_update("ST:DISASC");
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
+
if(pHddStaCtx->conn_info.connState != eConnectionState_Disconnecting)
{
INIT_COMPLETION(pAdapter->disconnect_comp_var);
@@ -1312,6 +1320,14 @@ static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCs
#ifdef FEATURE_WLAN_TDLS
wlan_hdd_tdls_connection_callback(pAdapter);
#endif
+
+#ifdef QCA_PKT_PROTO_TRACE
+ /* STA Associated, update into trace buffer */
+ if (pHddCtx->cfg_ini->gEnableDebugLog)
+ {
+ vos_pkt_trace_buf_update("ST:ASSOC");
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
//For reassoc, the station is already registered, all we need is to change the state
//of the STA in TL.
//If authentication is required (WPA/WPA2/DWEP), change TL to CONNECTED instead of AUTHENTICATED
diff --git a/CORE/HDD/src/wlan_hdd_hostapd.c b/CORE/HDD/src/wlan_hdd_hostapd.c
index 5c42dac519bd..2fd11b5d3f70 100644
--- a/CORE/HDD/src/wlan_hdd_hostapd.c
+++ b/CORE/HDD/src/wlan_hdd_hostapd.c
@@ -702,7 +702,13 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
WLAN_CLIENT_CONNECT_EX,
pSapEvent->sapevt.sapStationAssocReassocCompleteEvent.staMac.bytes);
#endif
-
+#ifdef QCA_PKT_PROTO_TRACE
+ /* Peer associated, update into trace buffer */
+ if (pHddCtx->cfg_ini->gEnableDebugLog)
+ {
+ vos_pkt_trace_buf_update("HA:ASSOC");
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
// Stop AP inactivity timer
if (pHddApCtx->hdd_ap_inactivity_timer.state == VOS_TIMER_STATE_RUNNING)
{
@@ -774,6 +780,13 @@ VOS_STATUS hdd_hostapd_SAPEventCB( tpSap_Event pSapEvent, v_PVOID_t usrDataForCa
hdd_ipa_wlan_evt(pHostapdAdapter, staId, WLAN_CLIENT_DISCONNECT,
pSapEvent->sapevt.sapStationDisassocCompleteEvent.staMac.bytes);
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ /* Peer dis-associated, update into trace buffer */
+ if (pHddCtx->cfg_ini->gEnableDebugLog)
+ {
+ vos_pkt_trace_buf_update("HA:DISASC");
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
hdd_softap_DeregisterSTA(pHostapdAdapter, staId);
if (0 != (WLAN_HDD_GET_CTX(pHostapdAdapter))->cfg_ini->nAPAutoShutOff)
@@ -1703,6 +1716,23 @@ static iw_softap_setparam(struct net_device *dev,
+#ifdef QCA_PKT_PROTO_TRACE
+ case QCASAP_SET_DEBUG_LOG:
+ {
+ hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pHostapdAdapter);
+
+ hddLog(LOG1, "QCASAP_SET_DEBUG_LOG val %d", set_value);
+ /* Trace buffer dump only */
+ if (VOS_PKT_TRAC_DUMP_CMD == set_value)
+ {
+ vos_pkt_trace_buf_dump();
+ break;
+ }
+ pHddCtx->cfg_ini->gEnableDebugLog = set_value;
+ break;
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
+
#endif /* QCA_WIFI_2_0 */
default:
hddLog(LOGE, FL("Invalid setparam command %d value %d"),
@@ -3911,6 +3941,13 @@ static const struct iw_priv_args hostapd_private_args[] = {
IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
"get_gtxBWMask" },
+#ifdef QCA_PKT_PROTO_TRACE
+ { QCASAP_SET_DEBUG_LOG,
+ IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,
+ 0,
+ "setDbgLvl" },
+#endif /* QCA_PKT_PROTO_TRACE */
+
#endif /* QCA_WIFI_2_0 */
{ QCSAP_IOCTL_GETPARAM,
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index 47b0999bd012..fdc6e97e4481 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -9505,6 +9505,10 @@ int hdd_wlan_startup(struct device *dev, v_VOID_t *hif_sc)
}
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ vos_pkt_proto_trace_init();
+#endif /* QCA_PKT_PROTO_TRACE */
+
ftm_processing:
if (VOS_FTM_MODE == hdd_get_conparam())
{
@@ -10221,6 +10225,9 @@ static void hdd_driver_exit(void)
}
else
{
+#ifdef QCA_PKT_PROTO_TRACE
+ vos_pkt_proto_trace_close();
+#endif /* QCA_PKT_PROTO_TRACE */
while(pHddCtx->isLogpInProgress ||
vos_is_logp_in_progress(VOS_MODULE_ID_VOSS, NULL)) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_FATAL,
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index aef32724a97a..880ddb17152c 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -475,6 +475,10 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
v_MACADDR_t *pDestMacAddress;
v_U8_t STAId;
+#ifdef QCA_PKT_PROTO_TRACE
+ hdd_context_t *hddCtxt = (hdd_context_t *)pAdapter->pHddCtx;
+ v_U8_t proto_type = 0;
+#endif /* QCA_PKT_PROTO_TRACE */
/* Prevent this funtion to be called during SSR since TL context may
not be reinitialized at this time which will lead crash. */
@@ -556,8 +560,30 @@ int hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
}
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ if ((hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) ||
+ (hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
+ {
+ /* Proto Trace enabled */
+ proto_type = vos_pkt_get_proto_type(skb,
+ hddCtxt->cfg_ini->gEnableDebugLog);
+ if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
+ {
+ vos_pkt_trace_buf_update("HA:T:EPL");
+ }
+ else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
+ {
+ vos_pkt_trace_buf_update("HA:T:DHC");
+ }
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
+
if (WLANTL_SendSTA_DataFrame((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
- STAId, skb) != NULL) {
+ STAId, skb
+#ifdef QCA_PKT_PROTO_TRACE
+ , proto_type
+#endif /* QCA_PKT_PROTO_TRACE */
+ ) != NULL) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
"%s: Failed to send packet to txrx for staid:%d",
__func__, STAId);
@@ -1595,6 +1621,9 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
int rxstat;
struct sk_buff *skb = NULL;
hdd_context_t *pHddCtx = NULL;
+#ifdef QCA_PKT_PROTO_TRACE
+ v_U8_t proto_type;
+#endif /* QCA_PKT_PROTO_TRACE */
//Sanity check on inputs
if ((NULL == vosContext) || (NULL == rxBuf))
@@ -1635,6 +1664,22 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
++pAdapter->stats.rx_packets;
pAdapter->stats.rx_bytes += skb->len;
+#ifdef QCA_PKT_PROTO_TRACE
+ if ((pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) ||
+ (pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
+ {
+ proto_type = vos_pkt_get_proto_type(skb,
+ pHddCtx->cfg_ini->gEnableDebugLog);
+ if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
+ {
+ vos_pkt_trace_buf_update("HA:R:EPL");
+ }
+ else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
+ {
+ vos_pkt_trace_buf_update("HA:R:DHC");
+ }
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
VOS_TRACE( VOS_MODULE_ID_HDD_SOFTAP, VOS_TRACE_LEVEL_INFO_LOW,
"%s: send one packet to kernel \n", __func__);
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index ec66d29e7e83..cf6b2e84521f 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -830,6 +830,11 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
v_U8_t STAId = WLAN_MAX_STA_COUNT;
hdd_station_ctx_t *pHddStaCtx = &pAdapter->sessionCtx.station;
+#ifdef QCA_PKT_PROTO_TRACE
+ hdd_context_t *hddCtxt = (hdd_context_t *)pAdapter->pHddCtx;
+ v_U8_t proto_type = 0;
+#endif /* QCA_PKT_PROTO_TRACE */
+
#ifdef QCA_WIFI_FTM
if (hdd_get_conparam() == VOS_FTM_MODE) {
kfree_skb(skb);
@@ -951,11 +956,32 @@ int hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
skb->queue_mapping = hddLinuxUpToAcMap[up];
}
+#ifdef QCA_PKT_PROTO_TRACE
+ if ((hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) ||
+ (hddCtxt->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
+ {
+ proto_type = vos_pkt_get_proto_type(skb,
+ hddCtxt->cfg_ini->gEnableDebugLog);
+ if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
+ {
+ vos_pkt_trace_buf_update("ST:T:EPL");
+ }
+ else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
+ {
+ vos_pkt_trace_buf_update("ST:T:DHC");
+ }
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
+
/*
* TODO: Should we stop net queues when txrx returns non-NULL?.
*/
if (WLANTL_SendSTA_DataFrame((WLAN_HDD_GET_CTX(pAdapter))->pvosContext,
- STAId, (adf_nbuf_t) skb) != NULL) {
+ STAId, (adf_nbuf_t) skb
+#ifdef QCA_PKT_PROTO_TRACE
+ , proto_type
+#endif /* QCA_PKT_PROTO_TRACE */
+ ) != NULL) {
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_WARN,
"%s: Failed to send packet to txrx for staid:%d",
__func__, STAId);
@@ -1955,6 +1981,9 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext,
hdd_context_t *pHddCtx = NULL;
int rxstat;
struct sk_buff *skb = NULL;
+#ifdef QCA_PKT_PROTO_TRACE
+ v_U8_t proto_type;
+#endif /* QCA_PKT_PROTO_TRACE */
//Sanity check on inputs
if ((NULL == vosContext) || (NULL == rxBuf))
@@ -2021,6 +2050,23 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext,
#endif /* QCA_WIFI_2_0 */
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ if ((pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_EAPOL) ||
+ (pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP))
+ {
+ proto_type = vos_pkt_get_proto_type(skb,
+ pHddCtx->cfg_ini->gEnableDebugLog);
+ if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
+ {
+ vos_pkt_trace_buf_update("ST:R:EPL");
+ }
+ else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
+ {
+ vos_pkt_trace_buf_update("ST:R:DHC");
+ }
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
+
skb->dev = pAdapter->dev;
skb->protocol = eth_type_trans(skb, skb->dev);
++pAdapter->hdd_stats.hddTxRxStats.rxPackets;
diff --git a/CORE/HDD/src/wlan_hdd_wext.c b/CORE/HDD/src/wlan_hdd_wext.c
index a99d27643cab..df75900cd77d 100644
--- a/CORE/HDD/src/wlan_hdd_wext.c
+++ b/CORE/HDD/src/wlan_hdd_wext.c
@@ -105,6 +105,11 @@
#include "qc_sap_ioctl.h"
#include "sme_Api.h"
#include "wlan_qct_wda.h"
+
+#ifdef QCA_PKT_PROTO_TRACE
+#include "vos_packet.h"
+#endif /* QCA_PKT_PROTO_TRACE */
+
#ifdef CONFIG_HAS_EARLYSUSPEND
extern void hdd_suspend_wlan(struct early_suspend *wlan_suspend);
extern void hdd_resume_wlan(struct early_suspend *wlan_suspend);
@@ -5699,6 +5704,14 @@ static int iw_setint_getnone(struct net_device *dev, struct iw_request_info *inf
case WE_SET_DEBUG_LOG:
{
hdd_context_t *pHddCtx = WLAN_HDD_GET_CTX(pAdapter);
+#ifdef QCA_PKT_PROTO_TRACE
+ /* Trace buffer dump only */
+ if (VOS_PKT_TRAC_DUMP_CMD == set_value)
+ {
+ vos_pkt_trace_buf_dump();
+ break;
+ }
+#endif /* QCA_PKT_PROTO_TRACE */
pHddCtx->cfg_ini->gEnableDebugLog = set_value;
sme_UpdateConnectDebug(pHddCtx->hHal, set_value);
break;
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
index a59e14ecb347..3a38d3c03f94 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
@@ -33,6 +33,7 @@
#include <adf_os_types.h>
#include <adf_nbuf.h>
+adf_nbuf_trace_update_t trace_update_cb = NULL;
/*
* @brief This allocates an nbuf aligns if needed and reserves
@@ -378,6 +379,56 @@ __adf_nbuf_dmamap_set_cb(__adf_os_dma_map_t dmap, void *cb, void *arg)
return;
}
+void
+__adf_nbuf_reg_trace_cb(adf_nbuf_trace_update_t cb_func_ptr)
+{
+ trace_update_cb = cb_func_ptr;
+ return;
+}
+
+#ifdef QCA_PKT_PROTO_TRACE
+void
+__adf_nbuf_trace_update(adf_nbuf_t buf, char *event_string)
+{
+
+ char string_buf[NBUF_PKT_TRAC_MAX_STRING];
+
+ if ((!trace_update_cb) || (!event_string)) {
+ return;
+ }
+
+ if (!adf_nbuf_trace_get_proto_type(buf)) {
+ return;
+ }
+
+ /* Buffer over flow */
+ if (NBUF_PKT_TRAC_MAX_STRING <
+ (adf_os_str_len(event_string) + NBUF_PKT_TRAC_PROTO_STRING)) {
+ return;
+ }
+
+ adf_os_mem_zero(string_buf,
+ NBUF_PKT_TRAC_MAX_STRING);
+ adf_os_mem_copy(string_buf,
+ event_string, adf_os_str_len(event_string));
+ if (NBUF_PKT_TRAC_TYPE_EAPOL &
+ adf_nbuf_trace_get_proto_type(buf)) {
+ adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
+ "EPL",
+ NBUF_PKT_TRAC_PROTO_STRING);
+ }
+ else if (NBUF_PKT_TRAC_TYPE_DHCP &
+ adf_nbuf_trace_get_proto_type(buf)) {
+ adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
+ "DHC",
+ NBUF_PKT_TRAC_PROTO_STRING);
+ }
+
+ trace_update_cb(string_buf);
+ return;
+}
+#endif /* QCA_PKT_PROTO_TRACE */
+
EXPORT_SYMBOL(__adf_nbuf_alloc);
EXPORT_SYMBOL(__adf_nbuf_free);
EXPORT_SYMBOL(__adf_nbuf_ref);
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
index 3b6979fd9d14..c4203fec85c2 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
@@ -47,6 +47,12 @@
#ifdef IPA_OFFLOAD
#define IPA_NBUF_OWNER_ID 0xaa55aa55
#endif
+
+#define NBUF_PKT_TRAC_TYPE_EAPOL 0x02
+#define NBUF_PKT_TRAC_TYPE_DHCP 0x04
+#define NBUF_PKT_TRAC_MAX_STRING 11
+#define NBUF_PKT_TRAC_PROTO_STRING 3
+
/**
* @brief Platform indepedent packet abstraction
*/
@@ -1052,4 +1058,50 @@ adf_nbuf_set_protocol(adf_nbuf_t buf, uint16_t proto)
{
__adf_nbuf_set_protocol(buf, proto);
}
+
+/**
+ * @brief This function return packet proto type
+ *
+ * @param[in] buf buffer
+ */
+static inline uint8_t
+adf_nbuf_trace_get_proto_type(adf_nbuf_t buf)
+{
+ return __adf_nbuf_trace_get_proto_type(buf);
+}
+
+/**
+ * @brief This function updates packet proto type
+ *
+ * @param[in] buf buffer
+ * @param[in] proto_type protocol type
+*/
+static inline void
+adf_nbuf_trace_set_proto_type(adf_nbuf_t buf, uint8_t proto_type)
+{
+ __adf_nbuf_trace_set_proto_type(buf, proto_type);
+}
+
+/**
+ * @brief This function registers protocol trace callback
+ *
+ * @param[in] adf_nbuf_trace_update_t callback pointer
+ */
+static inline void
+adf_nbuf_reg_trace_cb(adf_nbuf_trace_update_t cb_func_ptr)
+{
+ __adf_nbuf_reg_trace_cb(cb_func_ptr);
+}
+
+/**
+ * @brief This function updates protocol event
+ *
+ * @param[in] buf buffer
+ * @param[in] char * event string
+ */
+static inline void
+adf_nbuf_trace_update(adf_nbuf_t buf, char *event_string)
+{
+ __adf_nbuf_trace_update(buf, event_string);
+}
#endif
diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
index d7e18d5db2bb..5d684e4fd2f0 100644
--- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
+++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
@@ -63,6 +63,8 @@ typedef void (*__adf_nbuf_callback_fn) (struct sk_buff *skb);
*/
#define CVG_NBUF_MAX_EXTRA_FRAGS 2
+typedef void (*adf_nbuf_trace_update_t)(char *);
+
struct cvg_nbuf_cb {
/*
* Store a pointer to a parent network buffer.
@@ -107,6 +109,10 @@ struct cvg_nbuf_cb {
#ifdef IPA_OFFLOAD
unsigned long priv_data;
#endif
+#ifdef QCA_PKT_PROTO_TRACE
+ unsigned char proto_type;
+ unsigned char vdev_id;
+#endif /* QCA_PKT_PROTO_TRACE */
};
#define NBUF_OWNER_ID(skb) \
(((struct cvg_nbuf_cb *)((skb)->cb))->owner_id)
@@ -131,6 +137,16 @@ struct cvg_nbuf_cb {
#define NBUF_EXTRA_FRAG_WORDSTREAM_FLAGS(skb) \
(((struct cvg_nbuf_cb *)((skb)->cb))->extra_frags.wordstream_flags)
+#ifdef QCA_PKT_PROTO_TRACE
+#define NBUF_SET_PROTO_TYPE(skb, proto_type) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->proto_type = proto_type)
+#define NBUF_GET_PROTO_TYPE(skb) \
+ (((struct cvg_nbuf_cb *)((skb)->cb))->proto_type)
+#else
+#define NBUF_SET_PROTO_TYPE(skb, proto_type);
+#define NBUF_GET_PROTO_TYPE(skb) 0;
+#endif /* QCA_PKT_PROTO_TRACE */
+
#define __adf_nbuf_get_num_frags(skb) \
/* assume the OS provides a single fragment */ \
(NBUF_NUM_EXTRA_FRAGS(skb) + 1)
@@ -178,6 +194,10 @@ struct cvg_nbuf_cb {
((is_wordstream) << frag_num); \
} while (0)
+#define __adf_nbuf_trace_set_proto_type(skb, proto_type) \
+ NBUF_SET_PROTO_TYPE(skb, proto_type)
+#define __adf_nbuf_trace_get_proto_type(skb) \
+ NBUF_GET_PROTO_TYPE(skb);
typedef struct __adf_nbuf_qhead {
struct sk_buff *head;
@@ -229,6 +249,8 @@ void __adf_nbuf_unmap_single(__adf_os_device_t osdev,
void __adf_nbuf_dmamap_info(__adf_os_dma_map_t bmap, adf_os_dmamap_info_t *sg);
void __adf_nbuf_frag_info(struct sk_buff *skb, adf_os_sglist_t *sg);
void __adf_nbuf_dmamap_set_cb(__adf_os_dma_map_t dmap, void *cb, void *arg);
+void __adf_nbuf_reg_trace_cb(adf_nbuf_trace_update_t cb_func_ptr);
+void __adf_nbuf_trace_update(struct sk_buff *skb, char *event_string);
static inline a_status_t
diff --git a/CORE/TL/inc/wlan_qct_tl.h b/CORE/TL/inc/wlan_qct_tl.h
index 8af13d78ee53..a2944c554c2d 100644
--- a/CORE/TL/inc/wlan_qct_tl.h
+++ b/CORE/TL/inc/wlan_qct_tl.h
@@ -1299,7 +1299,11 @@ WLANTL_STAPktPending
============================================================================*/
adf_nbuf_t WLANTL_SendSTA_DataFrame(v_PVOID_t pvosGCtx, v_U8_t ucSTAId,
- adf_nbuf_t buf);
+ adf_nbuf_t buf
+#ifdef QCA_PKT_PROTO_TRACE
+ , v_U8_t proto_type
+#endif /* QCA_PKT_PROTO_TRACE */
+ );
#endif
#ifdef IPA_OFFLOAD
diff --git a/CORE/VOSS/inc/vos_packet.h b/CORE/VOSS/inc/vos_packet.h
index 48e01c75ad73..586479d43338 100644
--- a/CORE/VOSS/inc/vos_packet.h
+++ b/CORE/VOSS/inc/vos_packet.h
@@ -57,6 +57,77 @@ struct vos_pkt_t;
typedef struct vos_pkt_t vos_pkt_t;
#ifdef QCA_WIFI_2_0
+
+#ifdef QCA_PKT_PROTO_TRACE
+#include "adf_nbuf.h"
+
+#define VOS_PKT_TRAC_TYPE_EAPOL NBUF_PKT_TRAC_TYPE_EAPOL
+#define VOS_PKT_TRAC_TYPE_DHCP NBUF_PKT_TRAC_TYPE_DHCP
+
+#define VOS_PKT_TRAC_DUMP_CMD 9999
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_get_proto_type() -
+ Find protoco type from packet contents
+
+ * skb Packet Pointer
+ * tracking_map packet type want to track
+
+---------------------------------------------------------------------------*/
+v_U8_t vos_pkt_get_proto_type
+(
+ struct sk_buff *skb,
+ v_U8_t tracking_map
+);
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_trace_buf_update() -
+ Update storage buffer with interest event string
+
+ * event_string Event String may packet type or outstanding event
+
+---------------------------------------------------------------------------*/
+void vos_pkt_trace_buf_update
+(
+ char *event_string
+);
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_trace_buf_dump() -
+ Dump stored information into kernel log
+
+---------------------------------------------------------------------------*/
+void vos_pkt_trace_buf_dump
+(
+ void
+);
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_proto_trace_init() -
+ Initialize protocol trace functionality, allocate required resource
+
+---------------------------------------------------------------------------*/
+void vos_pkt_proto_trace_init
+(
+ void
+);
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_proto_trace_close() -
+ Free required resource
+
+---------------------------------------------------------------------------*/
+void vos_pkt_proto_trace_close
+(
+ void
+);
+#endif /* QCA_PKT_PROTO_TRACE */
+
/**
* vos_pkt_return_packet Free the voss Packet
* @ vos Packet
diff --git a/CORE/VOSS/src/vos_packet.c b/CORE/VOSS/src/vos_packet.c
index 78c556469739..8bb6bfae99b6 100644
--- a/CORE/VOSS/src/vos_packet.c
+++ b/CORE/VOSS/src/vos_packet.c
@@ -50,6 +50,31 @@
#include "vos_memory.h"
#include "adf_os_mem.h"
+#ifdef QCA_PKT_PROTO_TRACE
+/* Protocol specific packet tracking feature */
+#define VOS_PKT_TRAC_ETH_TYPE_OFFSET 12
+#define VOS_PKT_TRAC_IP_OFFSET 14
+#define VOS_PKT_TRAC_IP_HEADER_SIZE 20
+#define VOS_PKT_TRAC_DHCP_SRV_PORT 67
+#define VOS_PKT_TRAC_DHCP_CLI_PORT 68
+#define VOS_PKT_TRAC_EAPOL_ETH_TYPE 0x888E
+#define VOS_PKT_TRAC_MAX_STRING_LEN 12
+#define VOS_PKT_TRAC_MAX_TRACE_BUF 50
+#define VOS_PKT_TRAC_MAX_STRING_BUF 64
+
+/* protocol Storage Structure */
+typedef struct
+{
+ v_U32_t order;
+ v_TIME_t event_time;
+ char event_string[VOS_PKT_TRAC_MAX_STRING_LEN];
+} vos_pkt_proto_trace_t;
+
+vos_pkt_proto_trace_t *trace_buffer = NULL;
+unsigned int trace_buffer_order = 0;
+vos_spin_lock_t trace_buffer_lock;
+#endif /* QCA_PKT_PROTO_TRACE */
+
/**
* vos_pkt_return_packet Free the voss Packet
* @ vos Packet
@@ -212,6 +237,182 @@ VOS_STATUS vos_pkt_extract_data( vos_pkt_t *pPacket,
return VOS_STATUS_SUCCESS;
}
+#ifdef QCA_PKT_PROTO_TRACE
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_get_proto_type() -
+ Find protoco type from packet contents
+
+ * skb Packet Pointer
+ * tracking_map packet type want to track
+
+---------------------------------------------------------------------------*/
+v_U8_t vos_pkt_get_proto_type
+(
+ struct sk_buff *skb,
+ v_U8_t tracking_map
+)
+{
+ v_U8_t pkt_proto_type = 0;
+ v_U16_t ether_type;
+ v_U16_t SPort;
+ v_U16_t DPort;
+
+ /* EAPOL Tracking enabled */
+ if (VOS_PKT_TRAC_TYPE_EAPOL & tracking_map)
+ {
+ ether_type = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_ETH_TYPE_OFFSET));
+ if (VOS_PKT_TRAC_EAPOL_ETH_TYPE == VOS_SWAP_U16(ether_type))
+ {
+ pkt_proto_type |= VOS_PKT_TRAC_TYPE_EAPOL;
+ }
+ }
+
+ /* DHCP Tracking enabled */
+ if (VOS_PKT_TRAC_TYPE_DHCP & tracking_map)
+ {
+ SPort = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_IP_OFFSET +
+ VOS_PKT_TRAC_IP_HEADER_SIZE));
+ DPort = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_IP_OFFSET +
+ VOS_PKT_TRAC_IP_HEADER_SIZE + sizeof(v_U16_t)));
+ if (((VOS_PKT_TRAC_DHCP_SRV_PORT == VOS_SWAP_U16(SPort)) &&
+ (VOS_PKT_TRAC_DHCP_CLI_PORT == VOS_SWAP_U16(DPort))) ||
+ ((VOS_PKT_TRAC_DHCP_CLI_PORT == VOS_SWAP_U16(SPort)) &&
+ (VOS_PKT_TRAC_DHCP_SRV_PORT == VOS_SWAP_U16(DPort))))
+ {
+ pkt_proto_type |= VOS_PKT_TRAC_TYPE_DHCP;
+ }
+ }
+
+ /* Protocol type map */
+ return pkt_proto_type;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_trace_buf_update() -
+ Update storage buffer with interest event string
+
+ * event_string Event String may packet type or outstanding event
+
+---------------------------------------------------------------------------*/
+void vos_pkt_trace_buf_update
+(
+ char *event_string
+)
+{
+ v_U32_t slot;
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_INFO,
+ "%s %d, %s", __func__, __LINE__, event_string);
+ vos_spin_lock_acquire(&trace_buffer_lock);
+ slot = trace_buffer_order % VOS_PKT_TRAC_MAX_TRACE_BUF;
+ trace_buffer[slot].order = trace_buffer_order;
+ trace_buffer[slot].event_time = vos_timer_get_system_time();
+ vos_mem_copy(trace_buffer[slot].event_string,
+ event_string,
+ (VOS_PKT_TRAC_MAX_STRING_LEN < strlen(event_string))?
+ VOS_PKT_TRAC_MAX_STRING_LEN:strlen(event_string));
+ trace_buffer_order++;
+ vos_spin_lock_release(&trace_buffer_lock);
+
+ return;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_trace_buf_dump() -
+ Dump stored information into kernel log
+
+---------------------------------------------------------------------------*/
+void vos_pkt_trace_buf_dump
+(
+ void
+)
+{
+ v_U32_t slot, idx;
+
+ vos_spin_lock_acquire(&trace_buffer_lock);
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "PACKET TRACE DUMP START Current Timestamp %u",
+ (unsigned int)vos_timer_get_system_time());
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "ORDER : TIME : EVT");
+ if (VOS_PKT_TRAC_MAX_TRACE_BUF > trace_buffer_order)
+ {
+ for (slot = 0 ; slot < trace_buffer_order; slot++)
+ {
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%5d :%12u : %s",
+ trace_buffer[slot].order,
+ (unsigned int)trace_buffer[slot].event_time,
+ trace_buffer[slot].event_string);
+ }
+ }
+ else
+ {
+ for (idx = 0 ; idx < VOS_PKT_TRAC_MAX_TRACE_BUF; idx++)
+ {
+ slot = (trace_buffer_order + idx) % VOS_PKT_TRAC_MAX_TRACE_BUF;
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%5d :%12u : %s",
+ trace_buffer[slot].order,
+ (unsigned int)trace_buffer[slot].event_time,
+ trace_buffer[slot].event_string);
+ }
+ }
+
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "PACKET TRACE DUMP END");
+ vos_spin_lock_release(&trace_buffer_lock);
+
+ return;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_proto_trace_init() -
+ Initialize protocol trace functionality, allocate required resource
+
+---------------------------------------------------------------------------*/
+void vos_pkt_proto_trace_init
+(
+ void
+)
+{
+ /* Init spin lock to protect global memory */
+ vos_spin_lock_init(&trace_buffer_lock);
+ trace_buffer_order = 0;
+ trace_buffer = vos_mem_malloc(
+ VOS_PKT_TRAC_MAX_TRACE_BUF * sizeof(vos_pkt_proto_trace_t));
+ vos_mem_zero((void *)trace_buffer,
+ VOS_PKT_TRAC_MAX_TRACE_BUF * sizeof(vos_pkt_proto_trace_t));
+
+ /* Register callback function to NBUF
+ * Lower layer event also will be reported to here */
+ adf_nbuf_reg_trace_cb(vos_pkt_trace_buf_update);
+ return;
+}
+
+/*---------------------------------------------------------------------------
+
+ * brief vos_pkt_proto_trace_close() -
+ Free required resource
+
+---------------------------------------------------------------------------*/
+void vos_pkt_proto_trace_close
+(
+ void
+)
+{
+ VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
+ "%s %d", __func__, __LINE__);
+ vos_mem_free(trace_buffer);
+ vos_spin_lock_destroy(&trace_buffer_lock);
+
+ return;
+}
+#endif /* QCA_PKT_PROTO_TRACE */
#else
/*--------------------------------------------------------------------------
diff --git a/Kbuild b/Kbuild
index 0aecfdf5d771..fa5b33c0de73 100755..100644
--- a/Kbuild
+++ b/Kbuild
@@ -879,7 +879,8 @@ ifeq ($(CONFIG_QCA_WIFI_2_0), 0)
CDEFINES += -DWLANTL_DEBUG
else
CDEFINES += -DOSIF_NEED_RX_PEER_ID \
- -DQCA_SUPPORT_TXRX_LOCAL_PEER_ID
+ -DQCA_SUPPORT_TXRX_LOCAL_PEER_ID \
+ -DQCA_PKT_PROTO_TRACE
endif
ifneq ($(CONFIG_QCA_CLD_WLAN),)