Wlan: In Per packet stats fill full management/DHCP/EAPOL frames.
With current implementation, only 802.11 header is filled for
management packets and 802.11 + LLC header for data packets.
This change will fill full management/DHCP/EAPOL packets
and 802.11 + LLC header + 40 bytes for remaining frames
in per packet stats.
Also log the probe request, beacon and probe response frames
as well.
CRs-Fixed: 921855
Change-Id: Ib62bc4bc6b9ee6eec872bcadb08be75e3e7888fb
diff --git a/CORE/SVC/src/logging/wlan_logging_sock_svc.c b/CORE/SVC/src/logging/wlan_logging_sock_svc.c
index 1ed22f1..ab3fced 100644
--- a/CORE/SVC/src/logging/wlan_logging_sock_svc.c
+++ b/CORE/SVC/src/logging/wlan_logging_sock_svc.c
@@ -478,7 +478,8 @@
rx_tx_stats.ps_hdr.timestamp = vos_timer_get_system_ticks();
rx_tx_stats.ps_hdr.missed_cnt = 0;
rx_tx_stats.ps_hdr.size = sizeof(tx_rx_pkt_stats) -
- sizeof(pkt_stats_hdr) + pktstats->data_len - IP_PLUS_80211_HDR_LEN;
+ sizeof(pkt_stats_hdr) + pktstats->data_len-
+ MAX_PKT_STAT_DATA_LEN;
rx_tx_stats.stats.flags |= PER_PACKET_ENTRY_FLAGS_TX_SUCCESS;
rx_tx_stats.stats.flags |= PER_PACKET_ENTRY_FLAGS_80211_HEADER;
@@ -486,8 +487,11 @@
rx_tx_stats.stats.flags |= PER_PACKET_ENTRY_FLAGS_DIRECTION_TX;
hdr = (tpSirMacMgmtHdr)pktstats->data;
- if (hdr->fc.wep)
- rx_tx_stats.stats.flags |= PER_PACKET_ENTRY_FLAGS_PROTECTED;
+ if (hdr->fc.wep) {
+ rx_tx_stats.stats.flags |= PER_PACKET_ENTRY_FLAGS_PROTECTED;
+ /* Reset wep bit to parse frame properly */
+ hdr->fc.wep = 0;
+ }
rx_tx_stats.stats.tid = pktstats->tid;
rx_tx_stats.stats.dxe_timestamp = pktstats->dxe_timestamp;
@@ -517,7 +521,8 @@
vos_mem_copy(rx_tx_stats.stats.data,pktstats->data, pktstats->data_len);
/* 1+1 indicate '\n'+'\0' */
- total_log_len = sizeof(tx_rx_pkt_stats) + pktstats->data_len - IP_PLUS_80211_HDR_LEN;
+ total_log_len = sizeof(tx_rx_pkt_stats) + pktstats->data_len -
+ MAX_PKT_STAT_DATA_LEN;
spin_lock_irqsave(&gwlan_logging.pkt_stats_lock, flags);
// wlan logging svc resources are not yet initialized
if (!gwlan_logging.pkt_stats_pcur_node) {
diff --git a/CORE/VOSS/inc/vos_diag_core_log.h b/CORE/VOSS/inc/vos_diag_core_log.h
index f400dd5..adf6b2f 100644
--- a/CORE/VOSS/inc/vos_diag_core_log.h
+++ b/CORE/VOSS/inc/vos_diag_core_log.h
@@ -65,8 +65,6 @@
#define VOS_LOG_MAX_NUM_HO_CANDIDATE_APS 20
#define VOS_LOG_MAX_WOW_PTRN_SIZE 128
#define VOS_LOG_MAX_WOW_PTRN_MASK_SIZE 16
-/*802.11 Header for management packets and 802.11 plus IP header for Data packets*/
-# define IP_PLUS_80211_HDR_LEN 52
/* Version to be updated whenever format of vos_log_pktlog_info changes */
#define VERSION_LOG_WLAN_PKT_LOG_INFO_C 1
@@ -136,7 +134,11 @@
v_U64_t dxe_timestamp; // DXE timestamp
v_U64_t start_contention_timestamp; // 0 Not supported
v_U64_t transmit_success_timestamp; // 0 Not Supported
- v_U8_t data[IP_PLUS_80211_HDR_LEN]; // 802.11 Header for management packets and 802.11 plus IP header for Data packets
+ /* Whole frame for management/EAPOl/DHCP frames and 802.11 + LLC
+ * header + 40 bytes or full frame whichever is smaller for
+ * remaining Data packets
+ */
+ v_U8_t data[MAX_PKT_STAT_DATA_LEN];
} __attribute__((packed)) per_packet_stats;
typedef struct
diff --git a/CORE/VOSS/inc/vos_types.h b/CORE/VOSS/inc/vos_types.h
index 20002e9..7038749 100755
--- a/CORE/VOSS/inc/vos_types.h
+++ b/CORE/VOSS/inc/vos_types.h
@@ -66,6 +66,9 @@
(( ( ( (_x) << 24 ) & 0xFF000000 ) | ( ( (_x) >> 24 ) & 0x000000FF ) ) | \
( ( ( (_x) << 8 ) & 0x00FF0000 ) | ( ( (_x) >> 8 ) & 0x0000FF00 ) ))
+/* Length enough to include full DHCP/EAPOL/Management frame */
+#define MAX_PKT_STAT_DATA_LEN 800
+
// Endian operations for Big Endian and Small Endian modes
#ifdef ANI_LITTLE_BYTE_ENDIAN
diff --git a/CORE/VOSS/inc/vos_utils.h b/CORE/VOSS/inc/vos_utils.h
index ad8ab6a..ad7bcce 100644
--- a/CORE/VOSS/inc/vos_utils.h
+++ b/CORE/VOSS/inc/vos_utils.h
@@ -66,6 +66,7 @@
#define PKTLOG_TYPE_PKT_STAT 9
+
/*--------------------------------------------------------------------------
Type declarations
------------------------------------------------------------------------*/
@@ -182,7 +183,11 @@
v_U16_t seq_num; // receive sequence for that MPDU packet
v_U64_t dxe_timestamp; // DXE timestamp
v_U32_t data_len;
- v_U8_t data[52]; // 802.11 Header for management packets and 802.11 plus IP header for Data packets
+ /* Whole frame for management/EAPOl/DHCP frames and 802.11 + LLC
+ * header + 40 bytes or full frame whichever is smaller for
+ * remaining Data packets
+ */
+ v_U8_t data[MAX_PKT_STAT_DATA_LEN];
} tPerPacketStats;
typedef struct {
@@ -319,8 +324,7 @@
void vos_reset_roam_timer_log(void);
void vos_dump_roam_time_log_service(void);
void vos_record_roam_event(enum e_roaming_event, void *pBuff, v_ULONG_t buff_len);
-v_U32_t vos_copy_80211_header(void *pBuff, v_U8_t *dst, v_U8_t frametype,
- v_U8_t Qos);
+v_U32_t vos_copy_80211_data(void *pBuff, v_U8_t *dst, v_U8_t frametype);
extern v_U8_t vos_get_ring_log_level(v_U32_t ring_id);
bool vos_isPktStatsEnabled(void);
#endif // #if !defined __VOSS_UTILS_H
diff --git a/CORE/VOSS/src/vos_utils.c b/CORE/VOSS/src/vos_utils.c
index e137fc3..b2998f6 100644
--- a/CORE/VOSS/src/vos_utils.c
+++ b/CORE/VOSS/src/vos_utils.c
@@ -764,6 +764,16 @@
#define VOS_802_11_HEADER_SIZE ( 24 )
#define VOS_QOS_SIZE ( 2 )
#define VOS_LLC_HEADER_SIZE (8)
+#define VOS_IP_HEADER_SIZE (20)
+#define VOS_TCP_MIN_HEADER_SIZE (20)
+#define VOS_DEF_PKT_STATS_LEN_TO_COPY \
+ (VOS_802_11_HEADER_SIZE + VOS_LLC_HEADER_SIZE \
+ + VOS_IP_HEADER_SIZE + VOS_TCP_MIN_HEADER_SIZE)
+// DHCP Port number
+#define VOS_DHCP_SOURCE_PORT 0x4400
+#define VOS_DHCP_DESTINATION_PORT 0x4300
+
+
// Frame Type definitions
#define VOS_MAC_MGMT_FRAME 0x0
@@ -781,15 +791,13 @@
{
void *pBuffer = NULL;
v_BOOL_t fEAPOL = VOS_FALSE;
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "enter vos_skb_is_eapol");
- //vos_trace_hex_dump( VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR, &skb->data[0], skb->len);
+
// Validate the skb
if (unlikely(NULL == skb))
{
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"vos_skb_is_eapol [%d]: NULL skb", __LINE__);
- return VOS_STATUS_E_INVAL;
- VOS_ASSERT(0);
+ return VOS_FALSE;
}
// check for overflow
if (unlikely((pktOffset + numBytes) > skb->len))
@@ -797,7 +805,7 @@
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
"vos_skb_is_eapol [%d]: Packet overflow, offset %d size %d len %d",
__LINE__, pktOffset, numBytes, skb->len);
- return VOS_STATUS_E_INVAL;
+ return VOS_FALSE;
}
//check for the Qos Data, if Offset length is more 12.
//it means it will 802.11 header skb
@@ -812,7 +820,6 @@
{
fEAPOL = VOS_TRUE;
}
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO, "exit vos_skb_is_eapol fEAPOL = %d", fEAPOL);
return fEAPOL;
}
@@ -1473,11 +1480,11 @@
"===============================||\n");
}
-v_U32_t vos_copy_80211_header(void *pBuff, v_U8_t *dst, v_U8_t frametype, v_U8_t qos)
+v_U32_t vos_copy_80211_data(void *pBuff, v_U8_t *dst, v_U8_t frametype)
{
vos_pkt_t *vos_pkt = NULL;
struct sk_buff *skb = NULL;
- v_U8_t length_to_copy;
+ v_U32_t length_to_copy;
vos_pkt = (vos_pkt_t *)pBuff;
@@ -1494,23 +1501,42 @@
" skb is null");
return 0;
}
- length_to_copy = VOS_802_11_HEADER_SIZE;
-
- if(VOS_MAC_DATA_FRAME == frametype)
+ if (VOS_MAC_MGMT_FRAME == frametype)
{
- if(qos)
- length_to_copy += VOS_QOS_SIZE;
- length_to_copy += VOS_LLC_HEADER_SIZE;
+ length_to_copy = skb->len;
+ }
+ else
+ {
+ length_to_copy = VOS_DEF_PKT_STATS_LEN_TO_COPY;
+ if(skb->data[0] == VOS_QOS_DATA_VALUE)
+ length_to_copy += VOS_QOS_SIZE;
+
+ /* Copy whole skb data if DHCP or EAPOL pkt.Here length_to_copy
+ * will give the pointer to IP header and adding VOS_IP_HEADER_SIZE
+ * to it will give the DHCP port number.
+ */
+ if (((skb->len > (length_to_copy + VOS_IP_HEADER_SIZE)) &&
+ ((*((u16*)((u8*)skb->data + length_to_copy + VOS_IP_HEADER_SIZE))
+ == VOS_DHCP_SOURCE_PORT) ||
+ (*((u16*)((u8*)skb->data + length_to_copy + VOS_IP_HEADER_SIZE))
+ == VOS_DHCP_DESTINATION_PORT))) ||
+ vos_skb_is_eapol(skb,
+ VOS_ETHERTYPE_802_1_X_FRAME_OFFSET_IN_802_11_PKT,
+ VOS_ETHERTYPE_802_1_X_SIZE))
+ {
+ length_to_copy = skb->len;
+ }
}
- if (unlikely(length_to_copy > skb->len))
+ if (length_to_copy > skb->len)
{
- VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_ERROR,
- "%s Packet overflow, length_to_copy %d len %d",
- __func__, length_to_copy, skb->len);
- return 0;
+ length_to_copy = skb->len;
+ }
+ if (length_to_copy > MAX_PKT_STAT_DATA_LEN)
+ {
+ length_to_copy = MAX_PKT_STAT_DATA_LEN;
}
- vos_mem_copy(dst,skb->data,length_to_copy);
+ vos_mem_copy(dst, skb->data, length_to_copy);
return length_to_copy;
}
diff --git a/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c b/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c
index ccc0eff..b88af2c 100644
--- a/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c
+++ b/CORE/WDI/TRP/DTS/src/wlan_qct_wdi_dts.c
@@ -785,11 +785,7 @@
}
if ((WLAN_LOG_LEVEL_ACTIVE ==
vos_get_ring_log_level(RING_ID_PER_PACKET_STATS)) &&
- !(WDI_MAC_CTRL_FRAME == pRxMetadata->type) &&
- !((WDI_MAC_MGMT_FRAME== pRxMetadata->type) &&
- ((WDI_MAC_MGMT_BEACON == (pRxMetadata->subtype)) ||
- (WDI_MAC_MGMT_PROBE_REQ == (pRxMetadata->subtype)) ||
- (WDI_MAC_MGMT_PROBE_RSP == (pRxMetadata->subtype)))))
+ !(WDI_MAC_CTRL_FRAME == pRxMetadata->type))
{
vos_mem_zero(&rxStats,sizeof(tPerPacketStats));
/* Peer tx packet and it is an Rx packet for us */
@@ -800,11 +796,8 @@
rxStats.rate_idx = pRxMetadata->rateIndex;
rxStats.seq_num = pRxMetadata->currentPktSeqNo;
rxStats.dxe_timestamp = vos_timer_get_system_ticks();
- rxStats.data_len = ucMPDUHLen;
- if(WDI_MAC_DATA_FRAME== pRxMetadata->type)
- rxStats.data_len += WDI_MAC_LLC_HEADER_SIZE;
- vos_mem_copy(rxStats.data,pRxMetadata->mpduHeaderPtr,rxStats.data_len);
-
+ rxStats.data_len =
+ vos_copy_80211_data(pFrame, rxStats.data, pRxMetadata->type);
wpalPerPktSerialize(&rxStats);
}
// Invoke Rx complete callback
@@ -1111,11 +1104,7 @@
status = gTransportDriver.xmit(pDTDriverContext, pFrame, channel);
if ((WLAN_LOG_LEVEL_ACTIVE ==
vos_get_ring_log_level(RING_ID_PER_PACKET_STATS)) &&
- !(pTxMetadata->frmType & WDI_MAC_CTRL_FRAME) &&
- !((WDI_MAC_MGMT_FRAME== pTxMetadata->frmType) &&
- ((WDI_MAC_MGMT_BEACON == (pTxMetadata->typeSubtype & 0x0F)) ||
- (WDI_MAC_MGMT_PROBE_REQ == (pTxMetadata->typeSubtype & 0x0F)) ||
- (WDI_MAC_MGMT_PROBE_RSP == (pTxMetadata->typeSubtype & 0x0F))))){
+ !(pTxMetadata->frmType & WDI_MAC_CTRL_FRAME)){
vos_mem_zero(&txPktStat,sizeof(tPerPacketStats));
txPktStat.tid = pTxMetadata->fUP;
@@ -1123,8 +1112,8 @@
/*HW limitation cant get the seq number*/
txPktStat.seq_num = 0;
txPktStat.data_len =
- vos_copy_80211_header((void *)pFrame, txPktStat.data,
- pTxMetadata->frmType, pTxMetadata->qosEnabled);
+ vos_copy_80211_data((void *)pFrame, txPktStat.data,
+ pTxMetadata->frmType);
wpalPerPktSerialize(&txPktStat);
}
if (((WDI_ControlBlockType *)pContext)->roamDelayStatsEnabled)