summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPadma, Santhosh Kumar <skpadma@qti.qualcomm.com>2016-01-08 17:18:14 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-02-12 17:15:54 +0530
commitd2a8c59cd298d42b629e1493c8f36b4c635aa85e (patch)
treeeed4bf5d719bf5e77d5a1f2946fe1e390ca7fcb2
parentb02f81796a30a6922f256b3276fb3d709b0dc47b (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.c44
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_desc.c4
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_tx_send.c40
-rw-r--r--CORE/CLD_TXRX/TXRX/ol_txrx_types.h4
-rw-r--r--CORE/HDD/src/wlan_hdd_assoc.c9
-rw-r--r--CORE/HDD/src/wlan_hdd_early_suspend.c4
-rw-r--r--CORE/MAC/src/pe/include/limApi.h6
-rw-r--r--CORE/MAC/src/pe/lim/limApi.c35
-rw-r--r--CORE/SERVICES/COMMON/ol_txrx_api.h12
-rw-r--r--CORE/SERVICES/COMMON/pktlog_ac_fmt.h104
-rw-r--r--CORE/SME/inc/csrApi.h1
-rw-r--r--CORE/SME/inc/csrInternal.h1
-rw-r--r--CORE/SME/src/csr/csrApiRoam.c78
-rw-r--r--CORE/SVC/inc/wlan_logging_sock_svc.h2
-rw-r--r--CORE/SVC/src/logging/wlan_logging_sock_svc.c289
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 */