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)