diff options
| author | Linux Build Service Account <lnxbuild@localhost> | 2014-03-05 08:40:28 -0800 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2014-03-05 08:40:28 -0800 |
| commit | ff4aa818123672129da4dbef1c53dbdba10d8ac8 (patch) | |
| tree | 696d0cd19772e4f184115b27e68082d87941e799 | |
| parent | e064dfbccfa91ea8551f69fbfb82bb719f19d651 (diff) | |
| parent | 69659212ba5fb116ff223f8beb21922e28f8db9e (diff) | |
Merge "Merge remote-tracking branch 'origin/caf/caf-wlan/master'"
| -rw-r--r-- | CORE/CLD_TXRX/HTT/htt_tx.c | 2 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TLSHIM/tl_shim.c | 10 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_tx_send.c | 3 | ||||
| -rw-r--r-- | CORE/HDD/inc/qc_sap_ioctl.h | 3 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_assoc.c | 24 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_hostapd.c | 39 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_main.c | 7 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_softap_tx_rx.c | 47 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_tx_rx.c | 48 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_wext.c | 13 | ||||
| -rw-r--r-- | CORE/MAC/inc/qwlan_version.h | 4 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c | 3 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limSendSmeRspMessages.c | 16 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.c | 51 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.h | 52 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h | 22 | ||||
| -rw-r--r-- | CORE/TL/inc/wlan_qct_tl.h | 6 | ||||
| -rw-r--r-- | CORE/VOSS/inc/vos_packet.h | 71 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_packet.c | 201 | ||||
| -rw-r--r--[-rwxr-xr-x] | Kbuild | 3 |
20 files changed, 608 insertions, 17 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..212fe6a8f01b 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 @@ -2814,8 +2830,12 @@ eHalStatus hdd_smeRoamCallback( void *pContext, tCsrRoamInfo *pRoamInfo, tANI_U3 } else { - // Clear saved connection information in HDD - hdd_connRemoveConnectInfo( WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) ); + // To Do - address probable memory leak with WEP encryption upon successful association + if (eCSR_ROAM_RESULT_ASSOCIATED != roamResult) + { + //Clear saved connection information in HDD + hdd_connRemoveConnectInfo( WLAN_HDD_GET_STATION_CTX_PTR(pAdapter) ); + } halStatus = hdd_AssociationCompletionHandler( pAdapter, pRoamInfo, roamId, roamStatus, roamResult ); } 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/MAC/inc/qwlan_version.h b/CORE/MAC/inc/qwlan_version.h index 4d08df36c6c2..d69a53991da0 100644 --- a/CORE/MAC/inc/qwlan_version.h +++ b/CORE/MAC/inc/qwlan_version.h @@ -42,9 +42,9 @@ BRIEF DESCRIPTION: #define QWLAN_VERSION_MINOR 0 #define QWLAN_VERSION_PATCH 0 #define QWLAN_VERSION_EXTRA "" -#define QWLAN_VERSION_BUILD 51 +#define QWLAN_VERSION_BUILD 52 -#define QWLAN_VERSIONSTR "1.0.0.51" +#define QWLAN_VERSIONSTR "1.0.0.52" #ifdef QCA_WIFI_2_0 diff --git a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c index 615f6a6b8e4e..7785af38b521 100644 --- a/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c +++ b/CORE/MAC/src/pe/lim/limProcessSmeReqMessages.c @@ -6014,6 +6014,9 @@ limProcessSmeDfsCsaIeRequest(tpAniSirGlobal pMac, tANI_U32 *pMsg) * the template update */ limSendBeaconInd(pMac, psessionEntry); + PELOG1(limLog(pMac, LOG1, + FL(" Updated CSA IE, IE COUNT = %d"), + psessionEntry->gLimChannelSwitch.switchCount );) psessionEntry->gLimChannelSwitch.switchCount--; } return; diff --git a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c index 0f2bac0c5a45..1232ff631e4b 100644 --- a/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c +++ b/CORE/MAC/src/pe/lim/limSendSmeRspMessages.c @@ -2998,7 +2998,6 @@ limSendSmeDfsEventNotify(tpAniSirGlobal pMac, tANI_U16 msgType, void *event) static void limSendDfsChanSwIEUpdate(tpAniSirGlobal pMac, tpPESession psessionEntry) { - limLog(pMac, LOG1, FL("DFS Channel Switch update timer expired")); /* Update the beacon template and send to FW */ if (schSetFixedBeaconFields(pMac, psessionEntry) != eSIR_SUCCESS) @@ -3009,6 +3008,9 @@ limSendDfsChanSwIEUpdate(tpAniSirGlobal pMac, tpPESession psessionEntry) /* Send update beacon template message */ limSendBeaconInd(pMac, psessionEntry); + PELOG1(limLog(pMac, LOG1, + FL(" Updated CSA IE, IE COUNT = %d"), + psessionEntry->gLimChannelSwitch.switchCount );) return; } @@ -3116,13 +3118,15 @@ limProcessBeaconTxSuccessInd(tpAniSirGlobal pMac, tANI_U16 msgType, void *event) if (eLIM_AP_ROLE == psessionEntry->limSystemRole && VOS_TRUE == psessionEntry->dfsIncludeChanSwIe) { - /* Start a timer to send next CSA IE update */ - if (--psessionEntry->gLimChannelSwitch.switchCount >= 0) + /* Send only 5 beacons with CSA IE Set in when a radar is detected */ + if (psessionEntry->gLimChannelSwitch.switchCount > 0) { - /* Start a timer of timeout less than 100ms, to give enough - * time for template update and transmission + /* + * Send the next beacon with updated CSA IE count */ limSendDfsChanSwIEUpdate(pMac, psessionEntry); + /* Decrement the IE count */ + psessionEntry->gLimChannelSwitch.switchCount--; } else { @@ -3130,8 +3134,6 @@ limProcessBeaconTxSuccessInd(tpAniSirGlobal pMac, tANI_U16 msgType, void *event) psessionEntry->gLimChannelSwitch.switchCount = 0; psessionEntry->dfsIncludeChanSwIe = VOS_FALSE; - /* Reset CSA IE parameters in beacon/probe responses */ - limSendDfsChanSwIEUpdate(pMac, psessionEntry); pChanSwTxResponse = (tSirSmeCSAIeTxCompleteRsp *) vos_mem_malloc(length); 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 /*-------------------------------------------------------------------------- @@ -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),) |
