diff options
| author | Padma, Santhosh Kumar <skpadma@qti.qualcomm.com> | 2016-01-08 17:18:14 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-02-12 17:15:54 +0530 |
| commit | d2a8c59cd298d42b629e1493c8f36b4c635aa85e (patch) | |
| tree | eed4bf5d719bf5e77d5a1f2946fe1e390ca7fcb2 | |
| parent | b02f81796a30a6922f256b3276fb3d709b0dc47b (diff) | |
qcacld-2.0: Dump Tx/Rx packets during connection
Add changes to send 32 tx/rx packets to HAL layer during connection.
This can help in debugging connection related issues.
Change-Id: Icd08475c3f81aa182c902b8e8defbdb904c5509d
CRs-Fixed: 959645
| -rw-r--r-- | CORE/CLD_TXRX/HTT/htt_rx.c | 44 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_tx_desc.c | 4 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_tx_send.c | 40 | ||||
| -rw-r--r-- | CORE/CLD_TXRX/TXRX/ol_txrx_types.h | 4 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_assoc.c | 9 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_early_suspend.c | 4 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/include/limApi.h | 6 | ||||
| -rw-r--r-- | CORE/MAC/src/pe/lim/limApi.c | 35 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/ol_txrx_api.h | 12 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/pktlog_ac_fmt.h | 104 | ||||
| -rw-r--r-- | CORE/SME/inc/csrApi.h | 1 | ||||
| -rw-r--r-- | CORE/SME/inc/csrInternal.h | 1 | ||||
| -rw-r--r-- | CORE/SME/src/csr/csrApiRoam.c | 78 | ||||
| -rw-r--r-- | CORE/SVC/inc/wlan_logging_sock_svc.h | 2 | ||||
| -rw-r--r-- | CORE/SVC/src/logging/wlan_logging_sock_svc.c | 289 |
15 files changed, 610 insertions, 23 deletions
diff --git a/CORE/CLD_TXRX/HTT/htt_rx.c b/CORE/CLD_TXRX/HTT/htt_rx.c index 469a11c61364..d42ad328d4ce 100644 --- a/CORE/CLD_TXRX/HTT/htt_rx.c +++ b/CORE/CLD_TXRX/HTT/htt_rx.c @@ -48,6 +48,7 @@ #include <ol_cfg.h> #include <ol_rx.h> #include <ol_htt_rx_api.h> +#include <ol_txrx_peer_find.h> #include <htt_internal.h> /* HTT_ASSERT, htt_pdev_t, HTT_RX_BUF_SIZE */ #include "regtable.h" @@ -62,6 +63,9 @@ #include <asm/system.h> #endif #endif +#include <pktlog_ac_fmt.h> + +static tp_htt_packetdump_cb ghtt_packetdump_cb; #ifdef DEBUG_DMA_DONE extern int process_wma_set_command(int sessid, int paramid, @@ -1905,6 +1909,18 @@ htt_rx_amsdu_rx_in_order_pop_ll( msdu_count--; + if (ghtt_packetdump_cb) { + uint8_t status = RX_PKT_FATE_SUCCESS; + uint16_t peer_id = + HTT_RX_IN_ORD_PADDR_IND_PEER_ID_GET(*(u_int32_t *)rx_ind_data); + struct ol_txrx_peer_t *peer = + ol_txrx_peer_find_by_id(pdev->txrx_pdev, peer_id); + if (adf_os_unlikely((*((u_int8_t *) &rx_desc->fw_desc.u.val)) & + FW_RX_DESC_MIC_ERR_M)) + status = RX_PKT_FATE_FW_DROP_INVALID; + ghtt_packetdump_cb(msdu, status, peer->vdev->vdev_id, RX_DATA_PKT); + } + if (adf_os_unlikely((*((u_int8_t *) &rx_desc->fw_desc.u.val)) & FW_RX_DESC_MIC_ERR_M)) { u_int8_t tid = @@ -3361,3 +3377,31 @@ int htt_rx_ipa_uc_detach(struct htt_pdev_t *pdev) } #endif /* IPA_UC_OFFLOAD */ +/** + * htt_register_packetdump_callback() - stores rx packet dump + * callback handler + * @htt_packetdump_cb: packetdump cb + * + * This function is used to store rx packet dump callback + * + * Return: None + * + */ +void htt_register_packetdump_callback(tp_htt_packetdump_cb htt_packetdump_cb) +{ + ghtt_packetdump_cb = htt_packetdump_cb; +} + +/** + * htt_deregister_packetdump_callback() - removes rx packet dump + * callback handler + * + * This function is used to remove rx packet dump callback + * + * Return: None + * + */ +void htt_deregister_packetdump_callback(void) +{ + ghtt_packetdump_cb = NULL; +} diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_desc.c b/CORE/CLD_TXRX/TXRX/ol_tx_desc.c index 60dc045b05aa..3ac64c413886 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_desc.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_desc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014 The Linux Foundation. All rights reserved. + * Copyright (c) 2011, 2014, 2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -96,9 +96,7 @@ ol_tx_desc_alloc(struct ol_txrx_pdev_t *pdev, struct ol_txrx_vdev_t *vdev) if (!tx_desc) { return NULL; } -#if defined(CONFIG_HL_SUPPORT) tx_desc->vdev = vdev; -#endif #if defined(CONFIG_PER_VDEV_TX_DESC_POOL) adf_os_atomic_inc(&vdev->tx_desc_count); #endif diff --git a/CORE/CLD_TXRX/TXRX/ol_tx_send.c b/CORE/CLD_TXRX/TXRX/ol_tx_send.c index ce70cb302cd9..2a87be36097d 100644 --- a/CORE/CLD_TXRX/TXRX/ol_tx_send.c +++ b/CORE/CLD_TXRX/TXRX/ol_tx_send.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -59,6 +59,9 @@ #endif #include <ol_tx_queue.h> #include <ol_txrx.h> +#include <pktlog_ac_fmt.h> + +static tp_ol_packetdump_cb gol_packetdump_cb; #ifdef TX_CREDIT_RECLAIM_SUPPORT @@ -552,6 +555,9 @@ ol_tx_completion_handler( OL_TX_DESC_UPDATE_GROUP_CREDIT(pdev, tx_desc_id, 1, 0, status); } + if (gol_packetdump_cb) + gol_packetdump_cb(netbuf, status, tx_desc->vdev->vdev_id, TX_DATA_PKT); + htc_pm_runtime_put(pdev->htt_pdev->htc_pdev); adf_nbuf_trace_update(netbuf, trace_str); /* Per SDU update of byte count */ @@ -745,6 +751,9 @@ ol_tx_single_completion_handler( /* Do one shot statistics */ TXRX_STATS_UPDATE_TX_STATS(pdev, status, 1, adf_nbuf_len(netbuf)); + if (gol_packetdump_cb) + gol_packetdump_cb(netbuf, status, tx_desc->vdev->vdev_id, TX_MGMT_PKT); + if (OL_TX_DESC_NO_REFS(tx_desc)) { ol_tx_desc_frame_free_nonstd(pdev, tx_desc, status != htt_tx_status_ok); } @@ -1131,3 +1140,32 @@ ol_tx_delay_compute( } #endif /* QCA_COMPUTE_TX_DELAY */ + +/** + * ol_register_packetdump_callback() - stores tx packet dump + * callback handler + * @ol_packetdump_cb: packetdump cb + * + * This function is used to store tx packet dump callback + * + * Return: None + * + */ +void ol_register_packetdump_callback(tp_ol_packetdump_cb ol_packetdump_cb) +{ + gol_packetdump_cb = ol_packetdump_cb; +} + +/** + * ol_deregister_packetdump_callback() - removes tx packet dump + * callback handler + * + * This function is used to remove tx packet dump callback + * + * Return: None + * + */ +void ol_deregister_packetdump_callback(void) +{ + gol_packetdump_cb = NULL; +} diff --git a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h index 0e51647e9d72..bd662377f6d0 100644 --- a/CORE/CLD_TXRX/TXRX/ol_txrx_types.h +++ b/CORE/CLD_TXRX/TXRX/ol_txrx_types.h @@ -191,9 +191,9 @@ struct ol_tx_desc_t { /* used by tx encap, to restore the os buf start offset after tx complete*/ u_int8_t orig_l2_hdr_bytes; #endif -#if defined(CONFIG_HL_SUPPORT) + struct ol_txrx_vdev_t* vdev; -#endif + void *txq; void *p_link; uint16_t id; diff --git a/CORE/HDD/src/wlan_hdd_assoc.c b/CORE/HDD/src/wlan_hdd_assoc.c index b12257403abd..c1a5e3579fe4 100644 --- a/CORE/HDD/src/wlan_hdd_assoc.c +++ b/CORE/HDD/src/wlan_hdd_assoc.c @@ -69,6 +69,7 @@ #include <wlan_hdd_ipa.h> #endif #include <vos_sched.h> +#include <wlan_logging_sock_svc.h> struct ether_addr { @@ -943,7 +944,9 @@ static eHalStatus hdd_DisConnectHandler( hdd_adapter_t *pAdapter, tCsrRoamInfo * } hdd_clearRoamProfileIe( pAdapter ); hdd_wmm_init( pAdapter ); - + hddLog(VOS_TRACE_LEVEL_INFO, + FL("Invoking packetdump deregistration API")); + wlan_deregister_txrx_packetdump(); // indicate 'disconnect' status to wpa_supplicant... hdd_SendAssociationEvent(dev,pRoamInfo); /* indicate disconnected event to nl80211 */ @@ -2050,6 +2053,10 @@ static eHalStatus hdd_AssociationCompletionHandler( hdd_adapter_t *pAdapter, tCs __func__, MAC_ADDR_ARRAY(pWextState->req_bssId), roamResult, roamStatus); + hddLog(VOS_TRACE_LEVEL_ERROR, + FL("Invoking packetdump deregistration API")); + wlan_deregister_txrx_packetdump(); + /* inform association failure event to nl80211 */ if ( eCSR_ROAM_RESULT_ASSOC_FAIL_CON_CHANNEL == roamResult ) { diff --git a/CORE/HDD/src/wlan_hdd_early_suspend.c b/CORE/HDD/src/wlan_hdd_early_suspend.c index f161afd8af21..2940461b52c1 100644 --- a/CORE/HDD/src/wlan_hdd_early_suspend.c +++ b/CORE/HDD/src/wlan_hdd_early_suspend.c @@ -73,6 +73,7 @@ #ifdef IPA_OFFLOAD #include <wlan_hdd_ipa.h> #endif +#include <wlan_logging_sock_svc.h> /**----------------------------------------------------------------------------- * Preprocessor definitions and constants @@ -1942,6 +1943,9 @@ VOS_STATUS hdd_wlan_shutdown(void) vos_clear_concurrent_session_count(); + hddLog(VOS_TRACE_LEVEL_INFO, + FL("Invoking packetdump deregistration API")); + wlan_deregister_txrx_packetdump(); #ifdef FEATURE_BUS_BANDWIDTH if (VOS_TIMER_STATE_RUNNING == vos_timer_getCurrentState(&pHddCtx->bus_bw_timer)) diff --git a/CORE/MAC/src/pe/include/limApi.h b/CORE/MAC/src/pe/include/limApi.h index 3728b732fae5..611c8557244a 100644 --- a/CORE/MAC/src/pe/include/limApi.h +++ b/CORE/MAC/src/pe/include/limApi.h @@ -270,5 +270,11 @@ void limProcessAbortScanInd(tpAniSirGlobal pMac, tANI_U8 sessionId); void lim_smps_force_mode_ind(tpAniSirGlobal mac_ctx, tpSirMsgQ msg); +typedef void (*tp_pe_packetdump_cb)(adf_nbuf_t netbuf, + uint8_t status, uint8_t vdev_id, uint8_t type); + +void pe_register_packetdump_callback(tp_pe_packetdump_cb pe_packetdump_cb); +void pe_deregister_packetdump_callback(void); + /************************************************************/ #endif /* __LIM_API_H */ diff --git a/CORE/MAC/src/pe/lim/limApi.c b/CORE/MAC/src/pe/lim/limApi.c index 0f860395b310..99f3c727c082 100644 --- a/CORE/MAC/src/pe/lim/limApi.c +++ b/CORE/MAC/src/pe/lim/limApi.c @@ -76,7 +76,9 @@ #include "vos_utils.h" #include "wlan_qct_tl.h" #include "sysStartup.h" +#include "pktlog_ac_fmt.h" +static tp_pe_packetdump_cb gpe_packetdump_cb; static void __limInitScanVars(tpAniSirGlobal pMac) { @@ -1436,6 +1438,10 @@ VOS_STATUS peHandleMgmtFrame( v_PVOID_t pvosGCtx, v_PVOID_t vosBuff) limLog(pMac, LOG1, FL("offloadScanLearn %d"), WDA_GET_OFFLOADSCANLEARN(pRxPacketInfo)); #endif + + if ((mHdr->fc.subType != SIR_MAC_MGMT_BEACON) && gpe_packetdump_cb) + gpe_packetdump_cb(pVosPkt->pkt_buf, VOS_STATUS_SUCCESS, + pVosPkt->pkt_meta.sessionId, RX_MGMT_PKT); } @@ -2768,3 +2774,32 @@ eHalStatus pe_ReleaseGlobalLock( tAniSirLim *psPe) } return (status); } + +/** + * pe_register_packetdump_callback() - stores rx packet dump + * callback handler + * @pe_packetdump_cb: packetdump cb + * + * This function is used to store rx packet dump callback + * + * Return: None + * + */ +void pe_register_packetdump_callback(tp_pe_packetdump_cb pe_packetdump_cb) +{ + gpe_packetdump_cb = pe_packetdump_cb; +} + +/** + * pe_deregister_packetdump_callback() - removes tx packet dump + * callback handler + * + * This function is used to remove rx packet dump callback + * + * Return: None + * + */ +void pe_deregister_packetdump_callback(void) +{ + gpe_packetdump_cb = NULL; +} diff --git a/CORE/SERVICES/COMMON/ol_txrx_api.h b/CORE/SERVICES/COMMON/ol_txrx_api.h index 59434116c97c..d46d1b263bcb 100644 --- a/CORE/SERVICES/COMMON/ol_txrx_api.h +++ b/CORE/SERVICES/COMMON/ol_txrx_api.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2013 The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2013, 2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -110,4 +110,14 @@ enum ol_tx_spec { ol_tx_spec_no_free = 0x20, /* give to cb rather than free */ }; +typedef void (*tp_ol_packetdump_cb)(adf_nbuf_t netbuf, + uint8_t status, uint8_t vdev_id, uint8_t type); +void ol_register_packetdump_callback(tp_ol_packetdump_cb ol_packetdump_cb); +void ol_deregister_packetdump_callback(void); + +typedef void (*tp_htt_packetdump_cb)(adf_nbuf_t netbuf, + uint8_t status, uint8_t vdev_id, uint8_t type); + +void htt_register_packetdump_callback(tp_htt_packetdump_cb htt_packetdump_cb); +void htt_deregister_packetdump_callback(void); #endif /* _OL_TXRX_API__H_ */ diff --git a/CORE/SERVICES/COMMON/pktlog_ac_fmt.h b/CORE/SERVICES/COMMON/pktlog_ac_fmt.h index 7d144c35a9f9..42c07c82f56d 100644 --- a/CORE/SERVICES/COMMON/pktlog_ac_fmt.h +++ b/CORE/SERVICES/COMMON/pktlog_ac_fmt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2013, 2015 The Linux Foundation. All rights reserved. + * Copyright (c) 2012-2013, 2015-2016 The Linux Foundation. All rights reserved. * * Previously licensed under the ISC license by Qualcomm Atheros, Inc. * @@ -71,6 +71,27 @@ struct ath_pktlog_hdr { u_int32_t timestamp; }__ATTRIB_PACK; + +/** + * enum pkt_type - packet type + * @START_MONITOR: indicates parser to start packetdump parsing + * @STOP_MONITOR: indicates parser to stop packetdump parsing + * @TX_MGMT_PKT: TX management Packet + * @TX_DATA_PKT: TX data Packet + * @RX_MGMT_PKT: RX management Packet + * @RX_DATA_PKT: RX data Packet + * + * This enum has packet types + */ +enum pkt_type { + START_MONITOR = 1, + STOP_MONITOR, + TX_MGMT_PKT, + TX_DATA_PKT, + RX_MGMT_PKT, + RX_DATA_PKT, +}; + #define ATH_PKTLOG_HDR_FLAGS_MASK 0xffff #define ATH_PKTLOG_HDR_FLAGS_SHIFT 0 #define ATH_PKTLOG_HDR_FLAGS_OFFSET 0 @@ -153,7 +174,8 @@ enum { #define PKTLOG_TYPE_RC_FIND 6 #define PKTLOG_TYPE_RC_UPDATE 7 #define PKTLOG_TYPE_TX_VIRT_ADDR 8 -#define PKTLOG_TYPE_MAX 9 +#define PKTLOG_TYPE_PKT_DUMP 10 +#define PKTLOG_TYPE_MAX 11 /*#define PKTLOG_TYPE_TXCTL 0 #define PKTLOG_TYPE_TXSTATUS 1 @@ -366,5 +388,83 @@ struct ath_pktlog_buf { sizeof(struct ath_pktlog_hdr)) ? _rd_offset:0;\ } while(0) + +/** + * enum tx_pkt_fate - tx packet fate + * @TX_PKT_FATE_ACKED: Sent over air and ACKed + * @TX_PKT_FATE_SENT: Sent over air but not ACKed. + * @TX_PKT_FATE_FW_QUEUED: Queued within firmware, + * but not yet sent over air + * @TX_PKT_FATE_FW_DROP_INVALID: Dropped by firmware as invalid. + * E.g. bad source address, bad checksum, or invalid for current state. + * @TX_PKT_FATE_FW_DROP_NOBUFS: Dropped by firmware due + * to lack of buffer space + * @TX_PKT_FATE_FW_DROP_OTHER: Dropped by firmware for any other + * reason. Includes frames that were sent by driver to firmware, but + * unaccounted for by firmware. + * @TX_PKT_FATE_DRV_QUEUED: Queued within driver, not yet sent to firmware. + * @TX_PKT_FATE_DRV_DROP_INVALID: Dropped by driver as invalid. + * E.g. bad source address, or invalid for current state. + * @TX_PKT_FATE_DRV_DROP_NOBUFS: Dropped by driver due to lack of buffer space + * @TX_PKT_FATE_DRV_DROP_OTHER: Dropped by driver for any other reason. + * E.g. out of buffers. + * + * This enum has packet fate types + */ + +enum tx_pkt_fate { + TX_PKT_FATE_ACKED, + TX_PKT_FATE_SENT, + TX_PKT_FATE_FW_QUEUED, + TX_PKT_FATE_FW_DROP_INVALID, + TX_PKT_FATE_FW_DROP_NOBUFS, + TX_PKT_FATE_FW_DROP_OTHER, + TX_PKT_FATE_DRV_QUEUED, + TX_PKT_FATE_DRV_DROP_INVALID, + TX_PKT_FATE_DRV_DROP_NOBUFS, + TX_PKT_FATE_DRV_DROP_OTHER, +}; + +/** + * enum rx_pkt_fate - tx packet fate + * @RX_PKT_FATE_SUCCESS: Valid and delivered to + * network stack (e.g., netif_rx()). + * @RX_PKT_FATE_FW_QUEUED: Queued within firmware, + * but not yet sent to driver. + * @RX_PKT_FATE_FW_DROP_FILTER: Dropped by firmware + * due to host-programmable filters. + * @RX_PKT_FATE_FW_DROP_INVALID: Dropped by firmware + * as invalid. E.g. bad checksum, decrypt failed, or invalid for current state. + * @RX_PKT_FATE_FW_DROP_NOBUFS: Dropped by firmware + * due to lack of buffer space. + * @RX_PKT_FATE_FW_DROP_OTHER: Dropped by firmware + * for any other reason. + * @RX_PKT_FATE_DRV_QUEUED: Queued within driver, + * not yet delivered to network stack. + * @RX_PKT_FATE_DRV_DROP_FILTER: Dropped by drive + * r due to filter rules. + * @RX_PKT_FATE_DRV_DROP_INVALID: Dropped by driver as invalid. + * E.g. not permitted in current state. + * @RX_PKT_FATE_DRV_DROP_NOBUFS: Dropped by driver + * due to lack of buffer space. + * @RX_PKT_FATE_DRV_DROP_OTHER: Dropped by driver for any other reason. + * + * This enum has packet fate types + */ + +enum rx_pkt_fate { + RX_PKT_FATE_SUCCESS, + RX_PKT_FATE_FW_QUEUED, + RX_PKT_FATE_FW_DROP_FILTER, + RX_PKT_FATE_FW_DROP_INVALID, + RX_PKT_FATE_FW_DROP_NOBUFS, + RX_PKT_FATE_FW_DROP_OTHER, + RX_PKT_FATE_DRV_QUEUED, + RX_PKT_FATE_DRV_DROP_FILTER, + RX_PKT_FATE_DRV_DROP_INVALID, + RX_PKT_FATE_DRV_DROP_NOBUFS, + RX_PKT_FATE_DRV_DROP_OTHER, +}; + #endif /* _PKTLOG_FMT_H_ */ #endif /* REMOVE_PKT_LOG */ diff --git a/CORE/SME/inc/csrApi.h b/CORE/SME/inc/csrApi.h index 475404d80794..8681d0bbfc7b 100644 --- a/CORE/SME/inc/csrApi.h +++ b/CORE/SME/inc/csrApi.h @@ -1867,4 +1867,5 @@ typedef void (*csr_mib_stats_callback) * Return: void */ typedef void (*tcsr_fw_state_callback)(void *context); +void csr_packetdump_timer_stop(void); #endif diff --git a/CORE/SME/inc/csrInternal.h b/CORE/SME/inc/csrInternal.h index 7609af5c9104..eb3395727e75 100644 --- a/CORE/SME/inc/csrInternal.h +++ b/CORE/SME/inc/csrInternal.h @@ -1098,6 +1098,7 @@ typedef struct tagCsrRoamStruct tANI_U8 *pReassocResp; /* reassociation response from new AP */ tANI_U16 reassocRespLen; /* length of reassociation response */ #endif + vos_timer_t packetdump_timer; }tCsrRoamStruct; diff --git a/CORE/SME/src/csr/csrApiRoam.c b/CORE/SME/src/csr/csrApiRoam.c index 6f77adaf0478..8c24bdb9fd7c 100644 --- a/CORE/SME/src/csr/csrApiRoam.c +++ b/CORE/SME/src/csr/csrApiRoam.c @@ -70,6 +70,7 @@ #endif /* FEATURE_WLAN_ESE && !FEATURE_WLAN_ESE_UPLOAD */ #include "regdomain_common.h" #include "vos_utils.h" +#include <wlan_logging_sock_svc.h> #define MAX_PWR_FCC_CHAN_12 8 #define MAX_PWR_FCC_CHAN_13 2 @@ -100,6 +101,9 @@ #define MAX_SOCIAL_CHANNELS 3 +/* packet dump timer duration of 60 secs */ +#define PKT_DUMP_TIMER_DURATION 60 + #ifdef WLAN_FEATURE_ROAM_SCAN_OFFLOAD static tANI_BOOLEAN bRoamScanOffloadStarted = VOS_FALSE; #endif @@ -746,6 +750,58 @@ void csrSetGlobalCfgs( tpAniSirGlobal pMac ) csrSetDefaultDot11Mode( pMac ); } +/** + * csr_packetdump_timer_handler() - packet dump timer + * handler + * @pv: user data + * + * This function is used to handle packet dump timer + * + * Return: None + * + */ +static void csr_packetdump_timer_handler(void *pv) +{ + VOS_TRACE(VOS_MODULE_ID_SME, VOS_TRACE_LEVEL_INFO, + "%s Invoking packetdump deregistration API", __func__); + wlan_deregister_txrx_packetdump(); +} + +/** + * csr_packetdump_timer_stop() - stops packet dump timer + * + * This function is used to stop packet dump timer + * + * Return: None + * + */ +void csr_packetdump_timer_stop(void) +{ + eHalStatus status; + tHalHandle hal; + tpAniSirGlobal mac; + v_CONTEXT_t vos_ctx_ptr; + + /* get the global voss context */ + vos_ctx_ptr = vos_get_global_context(VOS_MODULE_ID_VOSS, NULL); + if (NULL == vos_ctx_ptr) { + VOS_ASSERT(0); + return; + } + + hal = vos_get_context(VOS_MODULE_ID_SME, vos_ctx_ptr); + if (NULL == hal) { + VOS_ASSERT(0); + return; + } + + mac = PMAC_STRUCT(hal); + status = vos_timer_stop(&mac->roam.packetdump_timer); + if (!HAL_STATUS_SUCCESS(status)) { + smsLog(mac, LOGE, FL("cannot stop packetdump timer")); + } +} + eHalStatus csrRoamOpen(tpAniSirGlobal pMac) { eHalStatus status = eHAL_STATUS_SUCCESS; @@ -769,6 +825,12 @@ eHalStatus csrRoamOpen(tpAniSirGlobal pMac) smsLog(pMac, LOGE, FL("cannot allocate memory for WaitForKey time out timer")); break; } + status = vos_timer_init(&pMac->roam.packetdump_timer, VOS_TIMER_TYPE_SW, + csr_packetdump_timer_handler, pMac); + if (!HAL_STATUS_SUCCESS(status)) { + smsLog(pMac, LOGE, FL("cannot allocate memory for packetdump timer")); + break; + } status = vos_timer_init(&pMac->roam.tlStatsReqInfo.hTlStatsTimer, VOS_TIMER_TYPE_SW, csrRoamTlStatsTimerHandler, pMac); if (!HAL_STATUS_SUCCESS(status)) @@ -791,6 +853,8 @@ eHalStatus csrRoamClose(tpAniSirGlobal pMac) vos_timer_destroy(&pMac->roam.hTimerWaitForKey); vos_timer_stop(&pMac->roam.tlStatsReqInfo.hTlStatsTimer); vos_timer_destroy(&pMac->roam.tlStatsReqInfo.hTlStatsTimer); + vos_timer_stop(&pMac->roam.packetdump_timer); + vos_timer_destroy(&pMac->roam.packetdump_timer); return (eHAL_STATUS_SUCCESS); } @@ -13465,6 +13529,7 @@ eHalStatus csrSendJoinReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDe tANI_U32 ucDot11Mode = 0; tANI_U8 txBFCsnValue = 0; tpCsrNeighborRoamControlInfo neigh_roam_info; + eHalStatus packetdump_timer_status; if(!pSession) { @@ -14183,6 +14248,19 @@ eHalStatus csrSendJoinReqMsg( tpAniSirGlobal pMac, tANI_U32 sessionId, tSirBssDe } else { + if (pProfile->csrPersona == VOS_STA_MODE) { + smsLog(pMac, LOG1, FL(" Invoking packetdump register API")); + wlan_register_txrx_packetdump(); + packetdump_timer_status = + vos_timer_start(&pMac->roam.packetdump_timer, + (PKT_DUMP_TIMER_DURATION*VOS_TIMER_TO_SEC_UNIT)/ + VOS_TIMER_TO_MS_UNIT); + if (!HAL_STATUS_SUCCESS(packetdump_timer_status)) { + smsLog(pMac, LOGE, FL("cannot start packetdump timer")); + smsLog(pMac, LOGE, FL("packetdump_timer_status: %d"), + packetdump_timer_status); + } + } #ifndef WLAN_MDM_CODE_REDUCTION_OPT if (eWNI_SME_JOIN_REQ == messageType) { diff --git a/CORE/SVC/inc/wlan_logging_sock_svc.h b/CORE/SVC/inc/wlan_logging_sock_svc.h index a76041394c62..aee9974289d9 100644 --- a/CORE/SVC/inc/wlan_logging_sock_svc.h +++ b/CORE/SVC/inc/wlan_logging_sock_svc.h @@ -77,4 +77,6 @@ static inline void wlan_report_log_completion(uint32_t is_fatal, void wlan_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data); +void wlan_deregister_txrx_packetdump(void); +void wlan_register_txrx_packetdump(void); #endif /* WLAN_LOGGING_SOCK_SVC_H */ diff --git a/CORE/SVC/src/logging/wlan_logging_sock_svc.c b/CORE/SVC/src/logging/wlan_logging_sock_svc.c index 729ddfd65ca9..add8ed5d0821 100644 --- a/CORE/SVC/src/logging/wlan_logging_sock_svc.c +++ b/CORE/SVC/src/logging/wlan_logging_sock_svc.c @@ -44,6 +44,35 @@ #include "pktlog_ac.h" #include <linux/rtc.h> #include <vos_diag_core_log.h> +#include "limApi.h" +#include "ol_txrx_api.h" +#include "csrApi.h" + +#define MAX_NUM_PKT_LOG 32 + +/** + * struct tx_status - tx status + * @tx_status_ok: successfully sent + acked + * @tx_status_discard: discard - not sent (congestion control) + * @tx_status_no_ack: no_ack - sent, but no ack + * @tx_status_download_fail: download_fail - + * the host could not deliver the tx frame to the target + * @tx_status_peer_del: peer_del - tx completion for + * alreay deleted peer used for HL case + * + * This enum has tx status types + */ +enum tx_status { + tx_status_ok, + tx_status_discard, + tx_status_no_ack, + tx_status_download_fail, + tx_status_peer_del, +}; + +static uint8_t gtx_count; +static uint8_t grx_count; + #define LOGGING_TRACE(level, args...) \ VOS_TRACE(VOS_MODULE_ID_HDD, level, ## args) @@ -79,13 +108,15 @@ struct log_msg { * Tx/Rx packet stats * @status: Status * @type: Type - * @reserved: Reserved + * @driver_ts: driver timestamp + * @fw_ts: fw timestamp */ struct packet_dump { unsigned char status; unsigned char type; - unsigned char reserved[6]; + uint32_t driver_ts; + uint16_t fw_ts; }; /** @@ -450,7 +481,8 @@ static int pkt_stats_fill_headers(struct sk_buff *skb) diag_type = DIAG_TYPE_LOGS; vos_mem_copy(skb_push(skb, sizeof(int)), &diag_type, sizeof(int)); - extra_header_len = sizeof(msg_header.radio) + sizeof(tAniHdr); + extra_header_len = sizeof(msg_header.radio) + sizeof(tAniHdr) + + sizeof(struct nlmsghdr); nl_payload_len = NLMSG_ALIGN(extra_header_len + skb->len); msg_header.nlh.nlmsg_type = ANI_NL_MSG_PUMAC; @@ -1119,12 +1151,7 @@ void wlan_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data) } pkt_stats_dump = (struct packet_dump *)pkt_dump; - if (pkt_stats_dump) - total_stats_len = sizeof(struct ath_pktlog_hdr) + - pktlog_hdr->size + - sizeof(struct packet_dump); - else - total_stats_len = sizeof(struct ath_pktlog_hdr) + + total_stats_len = sizeof(struct ath_pktlog_hdr) + pktlog_hdr->size; spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, flags); @@ -1149,15 +1176,18 @@ void wlan_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data) pktlog_hdr, sizeof(struct ath_pktlog_hdr)); - if (pkt_stats_dump) + if (pkt_stats_dump) { vos_mem_copy(skb_put(ptr, sizeof(struct packet_dump)), pkt_stats_dump, sizeof(struct packet_dump)); + pktlog_hdr->size -= sizeof(struct packet_dump); + } - vos_mem_copy(skb_put(ptr, - pktlog_hdr->size), - data, pktlog_hdr->size); + if (data) + vos_mem_copy(skb_put(ptr, + pktlog_hdr->size), + data, pktlog_hdr->size); spin_unlock_irqrestore(&gwlan_logging.pkt_stats_lock, flags); @@ -1168,4 +1198,237 @@ void wlan_pkt_stats_to_logger_thread(void *pl_hdr, void *pkt_dump, void *data) } } +/** + * driver_hal_status_map() - maps driver to hal + * status + * @status: status to be mapped + * + * This function is used to map driver to hal status + * + * Return: None + * + */ +static void driver_hal_status_map(uint8_t *status) +{ + switch (*status) { + case tx_status_ok: + *status = TX_PKT_FATE_ACKED; + break; + case tx_status_discard: + *status = TX_PKT_FATE_DRV_DROP_OTHER; + break; + case tx_status_no_ack: + *status = TX_PKT_FATE_SENT; + break; + case tx_status_download_fail: + *status = TX_PKT_FATE_FW_QUEUED; + break; + default: + *status = TX_PKT_FATE_DRV_DROP_OTHER; + break; + } +} + + +/* + * send_packetdump() - send packet dump + * @netbuf: netbuf + * @status: status of tx packet + * @vdev_id: virtual device id + * @type: type of packet + * + * This function is used to send packet dump to HAL layer + * using wlan_pkt_stats_to_logger_thread + * + * Return: None + * + */ +static void send_packetdump(adf_nbuf_t netbuf, uint8_t status, + uint8_t vdev_id, uint8_t type) +{ + struct ath_pktlog_hdr pktlog_hdr = {0}; + struct packet_dump pd_hdr = {0}; + hdd_context_t *hdd_ctx; + hdd_adapter_t *adapter; + v_CONTEXT_t vos_ctx; + + vos_ctx = vos_get_global_context(VOS_MODULE_ID_HDD, NULL); + if (!vos_ctx) + return; + + hdd_ctx = (hdd_context_t *)vos_get_context(VOS_MODULE_ID_HDD, vos_ctx); + if (!hdd_ctx) + return; + + adapter = hdd_get_adapter_by_vdev(hdd_ctx, vdev_id); + + /* Send packet dump only for STA interface */ + if (adapter->device_mode != WLAN_HDD_INFRA_STATION) + return; + + pktlog_hdr.log_type = PKTLOG_TYPE_PKT_DUMP; + pktlog_hdr.size = sizeof(pd_hdr) + adf_nbuf_len(netbuf); + + pd_hdr.status = status; + pd_hdr.type = type; + pd_hdr.driver_ts = vos_timer_get_system_time(); + + if ((type == TX_MGMT_PKT) || (type == TX_DATA_PKT)) + gtx_count++; + else if ((type == RX_MGMT_PKT) || (type == RX_DATA_PKT)) + grx_count++; + + wlan_pkt_stats_to_logger_thread(&pktlog_hdr, &pd_hdr, netbuf->data); +} + + +/* + * send_packetdump_monitor() - sends start/stop packet dump indication + * @type: type of packet + * + * This function is used to indicate HAL layer to start/stop monitoring + * of packets + * + * Return: None + * + */ +static void send_packetdump_monitor(uint8_t type) +{ + struct ath_pktlog_hdr pktlog_hdr = {0}; + struct packet_dump pd_hdr = {0}; + + pktlog_hdr.log_type = PKTLOG_TYPE_PKT_DUMP; + pktlog_hdr.size = sizeof(pd_hdr); + + pd_hdr.type = type; + + LOGGING_TRACE(VOS_TRACE_LEVEL_INFO, + "fate Tx-Rx %s: type: %d", __func__, type); + + wlan_pkt_stats_to_logger_thread(&pktlog_hdr, &pd_hdr, NULL); +} + +/** + * wlan_deregister_txrx_packetdump() - tx/rx packet dump + * deregistration + * + * This function is used to deregister tx/rx packet dump callbacks + * with ol, pe and htt layers + * + * Return: None + * + */ +void wlan_deregister_txrx_packetdump(void) +{ + if (gtx_count || grx_count) { + ol_deregister_packetdump_callback(); + pe_deregister_packetdump_callback(); + htt_deregister_packetdump_callback(); + send_packetdump_monitor(STOP_MONITOR); + csr_packetdump_timer_stop(); + + gtx_count = 0; + grx_count = 0; + } else + LOGGING_TRACE(VOS_TRACE_LEVEL_INFO, + "%s: deregistered packetdump already", __func__); +} + +/* + * check_txrx_packetdump_count() - function to check + * tx/rx packet dump global counts + * + * This function is used to check global counts of tx/rx + * packet dump functionality. + * + * Return: 1 if either gtx_count or grx_count reached 32 + * 0 otherwise + * + */ +static bool check_txrx_packetdump_count(void) +{ + if (gtx_count == MAX_NUM_PKT_LOG || + grx_count == MAX_NUM_PKT_LOG) { + LOGGING_TRACE(VOS_TRACE_LEVEL_INFO, + "%s gtx_count: %d grx_count: %d deregister packetdump", + __func__, gtx_count, grx_count); + wlan_deregister_txrx_packetdump(); + return 1; + } + return 0; +} + +/* + * tx_packetdump_cb() - tx packet dump callback + * @netbuf: netbuf + * @status: status of tx packet + * @vdev_id: virtual device id + * @type: packet type + * + * This function is used to send tx packet dump to HAL layer + * and deregister packet dump callbacks + * + * Return: None + * + */ +static void tx_packetdump_cb(adf_nbuf_t netbuf, uint8_t status, + uint8_t vdev_id, uint8_t type) +{ + bool temp; + + temp = check_txrx_packetdump_count(); + if (temp) + return; + + driver_hal_status_map(&status); + send_packetdump(netbuf, status, vdev_id, type); +} + + +/* + * rx_packetdump_cb() - rx packet dump callback + * @netbuf: netbuf + * @status: status of rx packet + * @vdev_id: virtual device id + * @type: packet type + * + * This function is used to send rx packet dump to HAL layer + * and deregister packet dump callbacks + * + * Return: None + * + */ +static void rx_packetdump_cb(adf_nbuf_t netbuf, uint8_t status, + uint8_t vdev_id, uint8_t type) +{ + bool temp; + + temp = check_txrx_packetdump_count(); + if (temp) + return; + + send_packetdump(netbuf, status, vdev_id, type); +} + + +/** + * wlan_register_txrx_packetdump() - tx/rx packet dump + * registration + * + * This function is used to register tx/rx packet dump callbacks + * with ol, pe and htt layers + * + * Return: None + * + */ +void wlan_register_txrx_packetdump(void) +{ + ol_register_packetdump_callback(tx_packetdump_cb); + pe_register_packetdump_callback(rx_packetdump_cb); + htt_register_packetdump_callback(rx_packetdump_cb); + send_packetdump_monitor(START_MONITOR); + + gtx_count = 0; + grx_count = 0; +} #endif /* WLAN_LOGGING_SOCK_SVC_ENABLE */ |
