Browse Source

qcacmn: Add APIs to get packet type and subtype

Propagation from qcacld-2.0 to qcacmn.

Add APIs to get DHCP, EAPOL, ARP, ICMP, ICMPV6, TCP
and UDP packets type and subtype from the netbuf.

Change-Id: I8837ad1b976744eeb0e7f0a836eded3a5d34124b
CRs-Fixed: 1019037
Himanshu Agarwal 8 years ago
parent
commit
fcd64e9e64
5 changed files with 938 additions and 153 deletions
  1. 535 4
      qdf/inc/qdf_nbuf.h
  2. 0 59
      qdf/inc/qdf_trace.h
  3. 18 4
      qdf/linux/src/i_qdf_nbuf.h
  4. 382 17
      qdf/linux/src/qdf_nbuf.c
  5. 3 69
      qdf/linux/src/qdf_trace.c

+ 535 - 4
qdf/inc/qdf_nbuf.h

@@ -57,12 +57,22 @@
 #define QDF_NBUF_TRAC_EAPOL_ETH_TYPE		0x888E
 #define QDF_NBUF_TRAC_WAPI_ETH_TYPE		0x88b4
 #define QDF_NBUF_TRAC_ARP_ETH_TYPE		0x0806
+#define QDF_NBUF_TRAC_IPV4_ETH_TYPE     0x0800
+#define QDF_NBUF_TRAC_IPV6_ETH_TYPE     0x86dd
 #define QDF_NBUF_DEST_MAC_OFFSET		0
 #define QDF_NBUF_SRC_MAC_OFFSET			6
+#define QDF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET  23
+#define QDF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET  20
+#define QDF_NBUF_TRAC_ICMP_TYPE         1
+#define QDF_NBUF_TRAC_TCP_TYPE          6
+#define QDF_NBUF_TRAC_UDP_TYPE          17
+#define QDF_NBUF_TRAC_ICMPV6_TYPE       0x3a
 
 /* EAPOL Related MASK */
 #define EAPOL_PACKET_TYPE_OFFSET		15
 #define EAPOL_KEY_INFO_OFFSET			19
+#define EAPOL_PKT_LEN_OFFSET            16
+#define EAPOL_KEY_LEN_OFFSET            21
 #define EAPOL_MASK				0x8013
 #define EAPOL_M1_BIT_MASK			0x8000
 #define EAPOL_M2_BIT_MASK			0x0001
@@ -135,6 +145,8 @@ struct mon_rx_status {
 #define QDF_DHCP_OPTION53_OFFSET		(0x11A)
 #define QDF_DHCP_OPTION53_LENGTH_OFFSET	(0x11B)
 #define QDF_DHCP_OPTION53_STATUS_OFFSET	(0x11C)
+#define DHCP_PKT_LEN_OFFSET           16
+#define DHCP_TRANSACTION_ID_OFFSET    46
 #define QDF_DHCP_DISCOVER			(1)
 #define QDF_DHCP_OFFER				(2)
 #define QDF_DHCP_REQUEST			(3)
@@ -144,12 +156,112 @@ struct mon_rx_status {
 #define QDF_DHCP_RELEASE			(7)
 #define QDF_DHCP_INFORM				(8)
 
+/* ARP Related Mask */
 #define ARP_SUB_TYPE_OFFSET  20
 #define ARP_REQUEST			(1)
 #define ARP_RESPONSE		(2)
 
+/* IPV4 Related Mask */
+#define IPV4_PKT_LEN_OFFSET           16
+#define IPV4_TCP_SEQ_NUM_OFFSET       38
+#define IPV4_SRC_PORT_OFFSET          34
+#define IPV4_DST_PORT_OFFSET          36
+
+/* IPV4 ICMP Related Mask */
+#define ICMP_SEQ_NUM_OFFSET           40
+#define ICMP_SUBTYPE_OFFSET           34
+#define ICMP_REQUEST                  0x08
+#define ICMP_RESPONSE                 0x00
+
+/* IPV6 Related Mask */
+#define IPV6_PKT_LEN_OFFSET           18
+#define IPV6_TCP_SEQ_NUM_OFFSET       58
+#define IPV6_SRC_PORT_OFFSET          54
+#define IPV6_DST_PORT_OFFSET          56
+
+/* IPV6 ICMPV6 Related Mask */
+#define ICMPV6_SEQ_NUM_OFFSET         60
+#define ICMPV6_SUBTYPE_OFFSET         54
+#define ICMPV6_REQUEST                0x80
+#define ICMPV6_RESPONSE               0x81
+
 #define QDF_NBUF_IPA_CHECK_MASK		0x80000000
 
+/**
+ * qdf_proto_type - protocol type
+ * @QDF_PROTO_TYPE_DHCP - DHCP
+ * @QDF_PROTO_TYPE_EAPOL - EAPOL
+ * @QDF_PROTO_TYPE_ARP - ARP
+ * @QDF_PROTO_TYPE_MGMT - MGMT
+ */
+enum qdf_proto_type {
+	QDF_PROTO_TYPE_DHCP,
+	QDF_PROTO_TYPE_EAPOL,
+	QDF_PROTO_TYPE_ARP,
+	QDF_PROTO_TYPE_MGMT,
+	QDF_PROTO_TYPE_MAX
+};
+
+/**
+ * qdf_proto_subtype - subtype of packet
+ * @QDF_PROTO_EAPOL_M1 - EAPOL 1/4
+ * @QDF_PROTO_EAPOL_M2 - EAPOL 2/4
+ * @QDF_PROTO_EAPOL_M3 - EAPOL 3/4
+ * @QDF_PROTO_EAPOL_M4 - EAPOL 4/4
+ * @QDF_PROTO_DHCP_DISCOVER - discover
+ * @QDF_PROTO_DHCP_REQUEST - request
+ * @QDF_PROTO_DHCP_OFFER - offer
+ * @QDF_PROTO_DHCP_ACK - ACK
+ * @QDF_PROTO_DHCP_NACK - NACK
+ * @QDF_PROTO_DHCP_RELEASE - release
+ * @QDF_PROTO_DHCP_INFORM - inform
+ * @QDF_PROTO_DHCP_DECLINE - decline
+ * @QDF_PROTO_ARP_REQ - arp request
+ * @QDF_PROTO_ARP_RES - arp response
+ * @QDF_PROTO_ICMP_REQ - icmp request
+ * @QDF_PROTO_ICMP_RES - icmp response
+ * @QDF_PROTO_ICMPV6_REQ - icmpv6 request
+ * @QDF_PROTO_ICMPV6_RES - icmpv6 response
+ * @QDF_PROTO_IPV4_UDP - ipv4 udp
+ * @QDF_PROTO_IPV4_TCP - ipv4 tcp
+ * @QDF_PROTO_IPV6_UDP - ipv6 udp
+ * @QDF_PROTO_IPV6_TCP - ipv6 tcp
+ * @QDF_PROTO_MGMT_ASSOC -assoc
+ * @QDF_PROTO_MGMT_DISASSOC - disassoc
+ * @QDF_PROTO_MGMT_AUTH - auth
+ * @QDF_PROTO_MGMT_DEAUTH - deauth
+ */
+enum qdf_proto_subtype {
+	QDF_PROTO_INVALID,
+	QDF_PROTO_EAPOL_M1,
+	QDF_PROTO_EAPOL_M2,
+	QDF_PROTO_EAPOL_M3,
+	QDF_PROTO_EAPOL_M4,
+	QDF_PROTO_DHCP_DISCOVER,
+	QDF_PROTO_DHCP_REQUEST,
+	QDF_PROTO_DHCP_OFFER,
+	QDF_PROTO_DHCP_ACK,
+	QDF_PROTO_DHCP_NACK,
+	QDF_PROTO_DHCP_RELEASE,
+	QDF_PROTO_DHCP_INFORM,
+	QDF_PROTO_DHCP_DECLINE,
+	QDF_PROTO_ARP_REQ,
+	QDF_PROTO_ARP_RES,
+	QDF_PROTO_ICMP_REQ,
+	QDF_PROTO_ICMP_RES,
+	QDF_PROTO_ICMPV6_REQ,
+	QDF_PROTO_ICMPV6_RES,
+	QDF_PROTO_IPV4_UDP,
+	QDF_PROTO_IPV4_TCP,
+	QDF_PROTO_IPV6_UDP,
+	QDF_PROTO_IPV6_TCP,
+	QDF_PROTO_MGMT_ASSOC,
+	QDF_PROTO_MGMT_DISASSOC,
+	QDF_PROTO_MGMT_AUTH,
+	QDF_PROTO_MGMT_DEAUTH,
+	QDF_PROTO_SUBTYPE_MAX
+};
+
 /**
  * @qdf_nbuf_t - Platform indepedent packet abstraction
  */
@@ -1085,6 +1197,156 @@ static inline uint8_t qdf_nbuf_get_tx_parallel_dnload_frm(qdf_nbuf_t buf)
 	return __qdf_nbuf_get_tx_htt2_frm(buf);
 }
 
+/**
+ * qdf_nbuf_get_dhcp_subtype() - get the subtype
+ *              of DHCP packet.
+ * @buf: Pointer to DHCP packet buffer
+ *
+ * This func. returns the subtype of DHCP packet.
+ *
+ * Return: subtype of the DHCP packet.
+ */
+static inline enum qdf_proto_subtype
+qdf_nbuf_get_dhcp_subtype(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_get_dhcp_subtype(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_get_dhcp_subtype() - get the subtype
+ *              of DHCP packet.
+ * @buf: Pointer to DHCP packet data buffer
+ *
+ * This func. returns the subtype of DHCP packet.
+ *
+ * Return: subtype of the DHCP packet.
+ */
+static inline enum qdf_proto_subtype
+qdf_nbuf_data_get_dhcp_subtype(uint8_t *data)
+{
+	return __qdf_nbuf_data_get_dhcp_subtype(data);
+}
+
+/**
+ * qdf_nbuf_get_eapol_subtype() - get the subtype
+ *            of EAPOL packet.
+ * @buf: Pointer to EAPOL packet buffer
+ *
+ * This func. returns the subtype of EAPOL packet.
+ *
+ * Return: subtype of the EAPOL packet.
+ */
+static inline enum qdf_proto_subtype
+qdf_nbuf_get_eapol_subtype(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_get_eapol_subtype(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_get_eapol_subtype() - get the subtype
+ *            of EAPOL packet.
+ * @data: Pointer to EAPOL packet data buffer
+ *
+ * This func. returns the subtype of EAPOL packet.
+ *
+ * Return: subtype of the EAPOL packet.
+ */
+static inline enum qdf_proto_subtype
+qdf_nbuf_data_get_eapol_subtype(uint8_t *data)
+{
+	return __qdf_nbuf_data_get_eapol_subtype(data);
+}
+
+/**
+ * qdf_nbuf_get_arp_subtype() - get the subtype
+ *            of ARP packet.
+ * @buf: Pointer to ARP packet buffer
+ *
+ * This func. returns the subtype of ARP packet.
+ *
+ * Return: subtype of the ARP packet.
+ */
+static inline enum qdf_proto_subtype
+qdf_nbuf_get_arp_subtype(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_get_arp_subtype(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_get_arp_subtype() - get the subtype
+ *            of ARP packet.
+ * @data: Pointer to ARP packet data buffer
+ *
+ * This func. returns the subtype of ARP packet.
+ *
+ * Return: subtype of the ARP packet.
+ */
+static inline enum qdf_proto_subtype
+qdf_nbuf_data_get_arp_subtype(uint8_t *data)
+{
+	return __qdf_nbuf_data_get_arp_subtype(data);
+}
+
+/**
+ * qdf_nbuf_get_icmp_subtype() - get the subtype
+ *            of IPV4 ICMP packet.
+ * @buf: Pointer to IPV4 ICMP packet buffer
+ *
+ * This func. returns the subtype of ICMP packet.
+ *
+ * Return: subtype of the ICMP packet.
+ */
+static inline enum qdf_proto_subtype
+qdf_nbuf_get_icmp_subtype(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_get_icmp_subtype(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_get_icmp_subtype() - get the subtype
+ *            of IPV4 ICMP packet.
+ * @data: Pointer to IPV4 ICMP packet data buffer
+ *
+ * This func. returns the subtype of ICMP packet.
+ *
+ * Return: subtype of the ICMP packet.
+ */
+static inline enum qdf_proto_subtype
+qdf_nbuf_data_get_icmp_subtype(uint8_t *data)
+{
+	return __qdf_nbuf_data_get_icmp_subtype(data);
+}
+
+/**
+ * qdf_nbuf_get_icmpv6_subtype() - get the subtype
+ *            of IPV6 ICMPV6 packet.
+ * @buf: Pointer to IPV6 ICMPV6 packet buffer
+ *
+ * This func. returns the subtype of ICMPV6 packet.
+ *
+ * Return: subtype of the ICMPV6 packet.
+ */
+static inline enum qdf_proto_subtype
+qdf_nbuf_get_icmpv6_subtype(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_get_icmpv6_subtype(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_get_icmpv6_subtype() - get the subtype
+ *            of IPV6 ICMPV6 packet.
+ * @data: Pointer to IPV6 ICMPV6 packet data buffer
+ *
+ * This func. returns the subtype of ICMPV6 packet.
+ *
+ * Return: subtype of the ICMPV6 packet.
+ */
+static inline enum qdf_proto_subtype
+qdf_nbuf_data_get_icmpv6_subtype(uint8_t *data)
+{
+	return __qdf_nbuf_data_get_icmpv6_subtype(data);
+}
+
 /**
  * qdf_nbuf_is_ipv4_pkt() - check if packet is a ipv4 packet or not
  * @buf:  buffer
@@ -1096,7 +1358,21 @@ static inline uint8_t qdf_nbuf_get_tx_parallel_dnload_frm(qdf_nbuf_t buf)
 static inline
 bool qdf_nbuf_is_ipv4_pkt(qdf_nbuf_t buf)
 {
-	return __qdf_nbuf_is_ipv4_pkt(buf);
+	return __qdf_nbuf_data_is_ipv4_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_ipv4_pkt() - check if packet is a ipv4 packet or not
+ * @data:  data
+ *
+ * This api is for Tx packets.
+ *
+ * Return: true if packet is ipv4 packet
+ */
+static inline
+bool qdf_nbuf_data_is_ipv4_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_ipv4_pkt(data);
 }
 
 /**
@@ -1110,7 +1386,22 @@ bool qdf_nbuf_is_ipv4_pkt(qdf_nbuf_t buf)
 static inline
 bool qdf_nbuf_is_ipv4_dhcp_pkt(qdf_nbuf_t buf)
 {
-	return __qdf_nbuf_is_ipv4_dhcp_pkt(buf);
+	return __qdf_nbuf_data_is_ipv4_dhcp_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_ipv4_dhcp_pkt() - check if it is DHCP packet.
+ * @data: Pointer to DHCP packet data buffer
+ *
+ * This func. checks whether it is a DHCP packet or not.
+ *
+ * Return: true if it is a DHCP packet
+ *         false if not
+ */
+static inline
+bool qdf_nbuf_data_is_ipv4_dhcp_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_ipv4_dhcp_pkt(data);
 }
 
 /**
@@ -1124,7 +1415,22 @@ bool qdf_nbuf_is_ipv4_dhcp_pkt(qdf_nbuf_t buf)
 static inline
 bool qdf_nbuf_is_ipv4_eapol_pkt(qdf_nbuf_t buf)
 {
-	return __qdf_nbuf_is_ipv4_eapol_pkt(buf);
+	return __qdf_nbuf_data_is_ipv4_eapol_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_ipv4_eapol_pkt() - check if it is EAPOL packet.
+ * @data: Pointer to EAPOL packet data buffer
+ *
+ * This func. checks whether it is a EAPOL packet or not.
+ *
+ * Return: true if it is a EAPOL packet
+ *         false if not
+ */
+static inline
+bool qdf_nbuf_data_is_ipv4_eapol_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_ipv4_eapol_pkt(data);
 }
 
 /**
@@ -1152,7 +1458,232 @@ bool qdf_nbuf_is_ipv4_wapi_pkt(qdf_nbuf_t buf)
 static inline
 bool qdf_nbuf_is_ipv4_arp_pkt(qdf_nbuf_t buf)
 {
-	return __qdf_nbuf_is_ipv4_arp_pkt(buf);
+	return __qdf_nbuf_data_is_ipv4_arp_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_ipv4_arp_pkt() - check if it is ARP packet.
+ * @data: Pointer to ARP packet data buffer
+ *
+ * This func. checks whether it is a ARP packet or not.
+ *
+ * Return: TRUE if it is a ARP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_data_is_ipv4_arp_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_ipv4_arp_pkt(data);
+}
+
+/**
+ * qdf_nbuf_is_ipv6_pkt() - check if it is IPV6 packet.
+ * @buf: Pointer to IPV6 packet buffer
+ *
+ * This func. checks whether it is a IPV6 packet or not.
+ *
+ * Return: TRUE if it is a IPV6 packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_is_ipv6_pkt(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_ipv6_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_ipv6_pkt() - check if it is IPV6 packet.
+ * @data: Pointer to IPV6 packet data buffer
+ *
+ * This func. checks whether it is a IPV6 packet or not.
+ *
+ * Return: TRUE if it is a IPV6 packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_data_is_ipv6_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_ipv6_pkt(data);
+}
+
+/**
+ * qdf_nbuf_is_icmp_pkt() - check if it is IPV4 ICMP packet.
+ * @buf: Pointer to IPV4 ICMP packet buffer
+ *
+ * This func. checks whether it is a ICMP packet or not.
+ *
+ * Return: TRUE if it is a ICMP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_is_icmp_pkt(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_icmp_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_icmp_pkt() - check if it is IPV4 ICMP packet.
+ * @data: Pointer to IPV4 ICMP packet data buffer
+ *
+ * This func. checks whether it is a ICMP packet or not.
+ *
+ * Return: TRUE if it is a ICMP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_data_is_icmp_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_icmp_pkt(data);
+}
+
+/**
+ * qdf_nbuf_is_icmpv6_pkt() - check if it is IPV6 ICMPV6 packet.
+ * @buf: Pointer to IPV6 ICMPV6 packet buffer
+ *
+ * This func. checks whether it is a ICMPV6 packet or not.
+ *
+ * Return: TRUE if it is a ICMPV6 packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_is_icmpv6_pkt(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_icmpv6_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_icmpv6_pkt() - check if it is IPV6 ICMPV6 packet.
+ * @data: Pointer to IPV6 ICMPV6 packet data buffer
+ *
+ * This func. checks whether it is a ICMPV6 packet or not.
+ *
+ * Return: TRUE if it is a ICMPV6 packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_data_is_icmpv6_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_icmpv6_pkt(data);
+}
+
+/**
+ * qdf_nbuf_is_ipv4_udp_pkt() - check if it is IPV4 UDP packet.
+ * @buf: Pointer to IPV4 UDP packet buffer
+ *
+ * This func. checks whether it is a IPV4 UDP packet or not.
+ *
+ * Return: TRUE if it is a IPV4 UDP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_is_ipv4_udp_pkt(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_ipv4_udp_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_ipv4_udp_pkt() - check if it is IPV4 UDP packet.
+ * @data: Pointer to IPV4 UDP packet data buffer
+ *
+ * This func. checks whether it is a IPV4 UDP packet or not.
+ *
+ * Return: TRUE if it is a IPV4 UDP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_data_is_ipv4_udp_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_ipv4_udp_pkt(data);
+}
+
+/**
+ * qdf_nbuf_is_ipv4_tcp_pkt() - check if it is IPV4 TCP packet.
+ * @buf: Pointer to IPV4 TCP packet buffer
+ *
+ * This func. checks whether it is a IPV4 TCP packet or not.
+ *
+ * Return: TRUE if it is a IPV4 TCP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_is_ipv4_tcp_pkt(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_ipv4_tcp_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_ipv4_tcp_pkt() - check if it is IPV4 TCP packet.
+ * @data: Pointer to IPV4 TCP packet data buffer
+ *
+ * This func. checks whether it is a IPV4 TCP packet or not.
+ *
+ * Return: TRUE if it is a IPV4 TCP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_data_is_ipv4_tcp_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_ipv4_tcp_pkt(data);
+}
+
+/**
+ * qdf_nbuf_is_ipv6_udp_pkt() - check if it is IPV6 UDP packet.
+ * @buf: Pointer to IPV6 UDP packet buffer
+ *
+ * This func. checks whether it is a IPV6 UDP packet or not.
+ *
+ * Return: TRUE if it is a IPV6 UDP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_is_ipv6_udp_pkt(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_ipv6_udp_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_ipv6_udp_pkt() - check if it is IPV6 UDP packet.
+ * @data: Pointer to IPV6 UDP packet data buffer
+ *
+ * This func. checks whether it is a IPV6 UDP packet or not.
+ *
+ * Return: TRUE if it is a IPV6 UDP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_data_is_ipv6_udp_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_ipv6_udp_pkt(data);
+}
+
+/**
+ * qdf_nbuf_is_ipv6_tcp_pkt() - check if it is IPV6 TCP packet.
+ * @buf: Pointer to IPV6 TCP packet buffer
+ *
+ * This func. checks whether it is a IPV6 TCP packet or not.
+ *
+ * Return: TRUE if it is a IPV6 TCP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_is_ipv6_tcp_pkt(qdf_nbuf_t buf)
+{
+	return __qdf_nbuf_data_is_ipv6_tcp_pkt(qdf_nbuf_data(buf));
+}
+
+/**
+ * qdf_nbuf_data_is_ipv6_tcp_pkt() - check if it is IPV6 TCP packet.
+ * @data: Pointer to IPV6 TCP packet data buffer
+ *
+ * This func. checks whether it is a IPV6 TCP packet or not.
+ *
+ * Return: TRUE if it is a IPV6 TCP packet
+ *         FALSE if not
+ */
+static inline
+bool qdf_nbuf_data_is_ipv6_tcp_pkt(uint8_t *data)
+{
+	return __qdf_nbuf_data_is_ipv6_tcp_pkt(data);
 }
 
 /**

+ 0 - 59
qdf/inc/qdf_trace.h

@@ -233,65 +233,6 @@ enum  QDF_DP_TRACE_ID {
 	QDF_DP_TRACE_MAX
 };
 
-/**
- * qdf_proto_type - protocol type
- * @QDF_PROTO_TYPE_DHCP - DHCP
- * @QDF_PROTO_TYPE_EAPOL - EAPOL
- * @QDF_PROTO_TYPE_ARP - ARP
- * @QDF_PROTO_TYPE_MGMT - MGMT
- */
-enum qdf_proto_type {
-	QDF_PROTO_TYPE_DHCP,
-	QDF_PROTO_TYPE_EAPOL,
-	QDF_PROTO_TYPE_ARP,
-	QDF_PROTO_TYPE_MGMT,
-	QDF_PROTO_TYPE_MAX
-};
-
-/**
- * qdf_proto_subtype - subtype of packet
- * @QDF_PROTO_EAPOL_M1 - EAPOL 1/4
- * @QDF_PROTO_EAPOL_M2 - EAPOL 2/4
- * @QDF_PROTO_EAPOL_M3 - EAPOL 3/4
- * @QDF_PROTO_EAPOL_M4 - EAPOL 4/4
- * @QDF_PROTO_DHCP_DISCOVER - discover
- * @QDF_PROTO_DHCP_REQUEST - request
- * @QDF_PROTO_DHCP_OFFER - offer
- * @QDF_PROTO_DHCP_ACK - ACK
- * @QDF_PROTO_DHCP_NACK - NACK
- * @QDF_PROTO_DHCP_RELEASE - release
- * @QDF_PROTO_DHCP_INFORM - inform
- * @QDF_PROTO_DHCP_DECLINE - decline
- * @QDF_PROTO_ARP_REQ - arp request
- * @QDF_PROTO_ARP_RES - arp response
- * @QDF_PROTO_MGMT_ASSOC -assoc
- * @QDF_PROTO_MGMT_DISASSOC - disassoc
- * @QDF_PROTO_MGMT_AUTH - auth
- * @QDF_PROTO_MGMT_DEAUTH - deauth
- */
-enum qdf_proto_subtype {
-	QDF_PROTO_INVALID,
-	QDF_PROTO_EAPOL_M1,
-	QDF_PROTO_EAPOL_M2,
-	QDF_PROTO_EAPOL_M3,
-	QDF_PROTO_EAPOL_M4,
-	QDF_PROTO_DHCP_DISCOVER,
-	QDF_PROTO_DHCP_REQUEST,
-	QDF_PROTO_DHCP_OFFER,
-	QDF_PROTO_DHCP_ACK,
-	QDF_PROTO_DHCP_NACK,
-	QDF_PROTO_DHCP_RELEASE,
-	QDF_PROTO_DHCP_INFORM,
-	QDF_PROTO_DHCP_DECLINE,
-	QDF_PROTO_ARP_REQ,
-	QDF_PROTO_ARP_RES,
-	QDF_PROTO_MGMT_ASSOC,
-	QDF_PROTO_MGMT_DISASSOC,
-	QDF_PROTO_MGMT_AUTH,
-	QDF_PROTO_MGMT_DEAUTH,
-	QDF_PROTO_SUBTYPE_MAX
-};
-
 /**
  * qdf_proto_dir - direction
  * @QDF_TX: TX direction

+ 18 - 4
qdf/linux/src/i_qdf_nbuf.h

@@ -45,6 +45,7 @@
 #include <qdf_mem.h>
 #include <linux/tcp.h>
 #include <qdf_util.h>
+#include <qdf_nbuf.h>
 
 /*
  * Use socket buffer as the underlying implentation as skbuf .
@@ -490,11 +491,24 @@ QDF_STATUS __qdf_nbuf_frag_map(
 	qdf_device_t osdev, __qdf_nbuf_t nbuf,
 	int offset, qdf_dma_dir_t dir, int cur_frag);
 
-bool __qdf_nbuf_is_ipv4_pkt(struct sk_buff *skb);
-bool __qdf_nbuf_is_ipv4_dhcp_pkt(struct sk_buff *skb);
-bool __qdf_nbuf_is_ipv4_eapol_pkt(struct sk_buff *skb);
-bool __qdf_nbuf_is_ipv4_arp_pkt(struct sk_buff *skb);
 bool __qdf_nbuf_is_ipv4_wapi_pkt(struct sk_buff *skb);
+bool __qdf_nbuf_data_is_ipv4_pkt(uint8_t *data);
+bool __qdf_nbuf_data_is_ipv6_pkt(uint8_t *data);
+bool __qdf_nbuf_data_is_icmp_pkt(uint8_t *data);
+bool __qdf_nbuf_data_is_icmpv6_pkt(uint8_t *data);
+bool __qdf_nbuf_data_is_ipv4_udp_pkt(uint8_t *data);
+bool __qdf_nbuf_data_is_ipv4_tcp_pkt(uint8_t *data);
+bool __qdf_nbuf_data_is_ipv6_udp_pkt(uint8_t *data);
+bool __qdf_nbuf_data_is_ipv6_tcp_pkt(uint8_t *data);
+bool __qdf_nbuf_data_is_ipv4_dhcp_pkt(uint8_t *data);
+bool __qdf_nbuf_data_is_ipv4_eapol_pkt(uint8_t *data);
+bool __qdf_nbuf_data_is_ipv4_arp_pkt(uint8_t *data);
+enum qdf_proto_subtype  __qdf_nbuf_data_get_dhcp_subtype(uint8_t *data);
+enum qdf_proto_subtype  __qdf_nbuf_data_get_eapol_subtype(uint8_t *data);
+enum qdf_proto_subtype  __qdf_nbuf_data_get_arp_subtype(uint8_t *data);
+enum qdf_proto_subtype  __qdf_nbuf_data_get_icmp_subtype(uint8_t *data);
+enum qdf_proto_subtype  __qdf_nbuf_data_get_icmpv6_subtype(uint8_t *data);
+
 
 /**
  * __qdf_to_status() - OS to QDF status conversion

+ 382 - 17
qdf/linux/src/qdf_nbuf.c

@@ -466,39 +466,232 @@ void __qdf_nbuf_reg_trace_cb(qdf_nbuf_trace_update_t cb_func_ptr)
 EXPORT_SYMBOL(__qdf_nbuf_reg_trace_cb);
 
 /**
- * __qdf_nbuf_is_ipv4_pkt() - check if packet is a ipv4 packet
- * @skb: Pointer to network buffer
+ * __qdf_nbuf_data_get_dhcp_subtype() - get the subtype
+ *              of DHCP packet.
+ * @data: Pointer to DHCP packet data buffer
+ *
+ * This func. returns the subtype of DHCP packet.
+ *
+ * Return: subtype of the DHCP packet.
+ */
+enum qdf_proto_subtype
+__qdf_nbuf_data_get_dhcp_subtype(uint8_t *data)
+{
+	enum qdf_proto_subtype subtype = QDF_PROTO_INVALID;
+
+	if ((data[QDF_DHCP_OPTION53_OFFSET] == QDF_DHCP_OPTION53) &&
+		(data[QDF_DHCP_OPTION53_LENGTH_OFFSET] ==
+					QDF_DHCP_OPTION53_LENGTH)) {
+
+		switch (data[QDF_DHCP_OPTION53_STATUS_OFFSET]) {
+		case QDF_DHCP_DISCOVER:
+			subtype = QDF_PROTO_DHCP_DISCOVER;
+			break;
+		case QDF_DHCP_REQUEST:
+			subtype = QDF_PROTO_DHCP_REQUEST;
+			break;
+		case QDF_DHCP_OFFER:
+			subtype = QDF_PROTO_DHCP_OFFER;
+			break;
+		case QDF_DHCP_ACK:
+			subtype = QDF_PROTO_DHCP_ACK;
+			break;
+		case QDF_DHCP_NAK:
+			subtype = QDF_PROTO_DHCP_NACK;
+			break;
+		case QDF_DHCP_RELEASE:
+			subtype = QDF_PROTO_DHCP_RELEASE;
+			break;
+		case QDF_DHCP_INFORM:
+			subtype = QDF_PROTO_DHCP_INFORM;
+			break;
+		case QDF_DHCP_DECLINE:
+			subtype = QDF_PROTO_DHCP_DECLINE;
+			break;
+		default:
+			break;
+		}
+	}
+
+	return subtype;
+}
+
+/**
+ * __qdf_nbuf_data_get_eapol_subtype() - get the subtype
+ *            of EAPOL packet.
+ * @data: Pointer to EAPOL packet data buffer
+ *
+ * This func. returns the subtype of EAPOL packet.
+ *
+ * Return: subtype of the EAPOL packet.
+ */
+enum qdf_proto_subtype
+__qdf_nbuf_data_get_eapol_subtype(uint8_t *data)
+{
+	uint16_t eapol_key_info;
+	enum qdf_proto_subtype subtype = QDF_PROTO_INVALID;
+	uint16_t mask;
+
+	eapol_key_info = (uint16_t)(*(uint16_t *)
+			(data + EAPOL_KEY_INFO_OFFSET));
+
+	mask = eapol_key_info & EAPOL_MASK;
+	switch (mask) {
+	case EAPOL_M1_BIT_MASK:
+		subtype = QDF_PROTO_EAPOL_M1;
+		break;
+	case EAPOL_M2_BIT_MASK:
+		subtype = QDF_PROTO_EAPOL_M2;
+		break;
+	case EAPOL_M3_BIT_MASK:
+		subtype = QDF_PROTO_EAPOL_M3;
+		break;
+	case EAPOL_M4_BIT_MASK:
+		subtype = QDF_PROTO_EAPOL_M4;
+		break;
+	default:
+		break;
+	}
+
+	return subtype;
+}
+
+/**
+ * __qdf_nbuf_data_get_arp_subtype() - get the subtype
+ *            of ARP packet.
+ * @data: Pointer to ARP packet data buffer
+ *
+ * This func. returns the subtype of ARP packet.
+ *
+ * Return: subtype of the ARP packet.
+ */
+enum qdf_proto_subtype
+__qdf_nbuf_data_get_arp_subtype(uint8_t *data)
+{
+	uint16_t subtype;
+	enum qdf_proto_subtype proto_subtype = QDF_PROTO_INVALID;
+
+	subtype = (uint16_t)(*(uint16_t *)
+			(data + ARP_SUB_TYPE_OFFSET));
+
+	switch (QDF_SWAP_U16(subtype)) {
+	case ARP_REQUEST:
+		proto_subtype = QDF_PROTO_ARP_REQ;
+		break;
+	case ARP_RESPONSE:
+		proto_subtype = QDF_PROTO_ARP_RES;
+		break;
+	default:
+		break;
+	}
+
+	return proto_subtype;
+}
+
+/**
+ * __qdf_nbuf_data_get_icmp_subtype() - get the subtype
+ *            of IPV4 ICMP packet.
+ * @data: Pointer to IPV4 ICMP packet data buffer
+ *
+ * This func. returns the subtype of ICMP packet.
+ *
+ * Return: subtype of the ICMP packet.
+ */
+enum qdf_proto_subtype
+__qdf_nbuf_data_get_icmp_subtype(uint8_t *data)
+{
+	uint8_t subtype;
+	enum qdf_proto_subtype proto_subtype = QDF_PROTO_INVALID;
+
+	subtype = (uint8_t)(*(uint8_t *)
+			(data + ICMP_SUBTYPE_OFFSET));
+
+	switch (subtype) {
+	case ICMP_REQUEST:
+		proto_subtype = QDF_PROTO_ICMP_REQ;
+		break;
+	case ICMP_RESPONSE:
+		proto_subtype = QDF_PROTO_ICMP_RES;
+		break;
+	default:
+		break;
+	}
+
+	return proto_subtype;
+}
+
+/**
+ * __qdf_nbuf_data_get_icmpv6_subtype() - get the subtype
+ *            of IPV6 ICMPV6 packet.
+ * @data: Pointer to IPV6 ICMPV6 packet data buffer
+ *
+ * This func. returns the subtype of ICMPV6 packet.
+ *
+ * Return: subtype of the ICMPV6 packet.
+ */
+enum qdf_proto_subtype
+__qdf_nbuf_data_get_icmpv6_subtype(uint8_t *data)
+{
+	uint8_t subtype;
+	enum qdf_proto_subtype proto_subtype = QDF_PROTO_INVALID;
+
+	subtype = (uint8_t)(*(uint8_t *)
+			(data + ICMPV6_SUBTYPE_OFFSET));
+
+	switch (subtype) {
+	case ICMPV6_REQUEST:
+		proto_subtype = QDF_PROTO_ICMPV6_REQ;
+		break;
+	case ICMPV6_RESPONSE:
+		proto_subtype = QDF_PROTO_ICMPV6_RES;
+		break;
+	default:
+		break;
+	}
+
+	return proto_subtype;
+}
+
+
+/**
+ * __qdf_nbuf_data_is_ipv4_pkt() - check if packet is a ipv4 packet
+ * @data: Pointer to network data
  *
  * This api is for Tx packets.
  *
  * Return: true if packet is ipv4 packet
  *	   false otherwise
  */
-bool __qdf_nbuf_is_ipv4_pkt(struct sk_buff *skb)
+bool __qdf_nbuf_data_is_ipv4_pkt(uint8_t *data)
 {
-	if (qdf_nbuf_get_protocol(skb) == htons(ETH_P_IP))
+	uint16_t ether_type;
+
+	ether_type = (uint16_t)(*(uint16_t *)(data +
+				QDF_NBUF_TRAC_ETH_TYPE_OFFSET));
+
+	if (ether_type == QDF_SWAP_U16(QDF_NBUF_TRAC_IPV4_ETH_TYPE))
 		return true;
 	else
 		return false;
 }
 
 /**
- * __qdf_nbuf_is_ipv4_dhcp_pkt() - check if skb data is a dhcp packet
- * @skb: Pointer to network buffer
+ * __qdf_nbuf_data_is_ipv4_dhcp_pkt() - check if skb data is a dhcp packet
+ * @data: Pointer to network data buffer
  *
  * This api is for ipv4 packet.
  *
  * Return: true if packet is DHCP packet
  *	   false otherwise
  */
-bool __qdf_nbuf_is_ipv4_dhcp_pkt(struct sk_buff *skb)
+bool __qdf_nbuf_data_is_ipv4_dhcp_pkt(uint8_t *data)
 {
 	uint16_t sport;
 	uint16_t dport;
 
-	sport = (uint16_t)(*(uint16_t *)(skb->data + QDF_NBUF_TRAC_IPV4_OFFSET +
+	sport = (uint16_t)(*(uint16_t *)(data + QDF_NBUF_TRAC_IPV4_OFFSET +
 					 QDF_NBUF_TRAC_IPV4_HEADER_SIZE));
-	dport = (uint16_t)(*(uint16_t *)(skb->data + QDF_NBUF_TRAC_IPV4_OFFSET +
+	dport = (uint16_t)(*(uint16_t *)(data + QDF_NBUF_TRAC_IPV4_OFFSET +
 					 QDF_NBUF_TRAC_IPV4_HEADER_SIZE +
 					 sizeof(uint16_t)));
 
@@ -512,19 +705,19 @@ bool __qdf_nbuf_is_ipv4_dhcp_pkt(struct sk_buff *skb)
 }
 
 /**
- * __qdf_nbuf_is_ipv4_eapol_pkt() - check if skb data is a eapol packet
- * @skb: Pointer to network buffer
+ * __qdf_nbuf_data_is_ipv4_eapol_pkt() - check if skb data is a eapol packet
+ * @data: Pointer to network data buffer
  *
  * This api is for ipv4 packet.
  *
  * Return: true if packet is EAPOL packet
  *	   false otherwise.
  */
-bool __qdf_nbuf_is_ipv4_eapol_pkt(struct sk_buff *skb)
+bool __qdf_nbuf_data_is_ipv4_eapol_pkt(uint8_t *data)
 {
 	uint16_t ether_type;
 
-	ether_type = (uint16_t)(*(uint16_t *)(skb->data +
+	ether_type = (uint16_t)(*(uint16_t *)(data +
 				QDF_NBUF_TRAC_ETH_TYPE_OFFSET));
 
 	if (ether_type == QDF_SWAP_U16(QDF_NBUF_TRAC_EAPOL_ETH_TYPE))
@@ -556,19 +749,19 @@ bool __qdf_nbuf_is_ipv4_wapi_pkt(struct sk_buff *skb)
 }
 
 /**
- * __qdf_nbuf_is_ipv4_arp_pkt() - check if skb data is a eapol packet
- * @skb: Pointer to network buffer
+ * __qdf_nbuf_data_is_ipv4_arp_pkt() - check if skb data is a arp packet
+ * @data: Pointer to network data buffer
  *
  * This api is for ipv4 packet.
  *
  * Return: true if packet is ARP packet
  *	   false otherwise.
  */
-bool __qdf_nbuf_is_ipv4_arp_pkt(struct sk_buff *skb)
+bool __qdf_nbuf_data_is_ipv4_arp_pkt(uint8_t *data)
 {
 	uint16_t ether_type;
 
-	ether_type = (uint16_t)(*(uint16_t *)(skb->data +
+	ether_type = (uint16_t)(*(uint16_t *)(data +
 				QDF_NBUF_TRAC_ETH_TYPE_OFFSET));
 
 	if (ether_type == QDF_SWAP_U16(QDF_NBUF_TRAC_ARP_ETH_TYPE))
@@ -577,6 +770,178 @@ bool __qdf_nbuf_is_ipv4_arp_pkt(struct sk_buff *skb)
 		return false;
 }
 
+/**
+ * __qdf_nbuf_data_is_ipv6_pkt() - check if it is IPV6 packet.
+ * @data: Pointer to IPV6 packet data buffer
+ *
+ * This func. checks whether it is a IPV6 packet or not.
+ *
+ * Return: TRUE if it is a IPV6 packet
+ *         FALSE if not
+ */
+bool __qdf_nbuf_data_is_ipv6_pkt(uint8_t *data)
+{
+	uint16_t ether_type;
+
+	ether_type = (uint16_t)(*(uint16_t *)(data +
+				QDF_NBUF_TRAC_ETH_TYPE_OFFSET));
+
+	if (ether_type == QDF_SWAP_U16(QDF_NBUF_TRAC_IPV6_ETH_TYPE))
+		return true;
+	else
+		return false;
+}
+
+/**
+ * __qdf_nbuf_data_is_icmp_pkt() - check if it is IPV4 ICMP packet.
+ * @data: Pointer to IPV4 ICMP packet data buffer
+ *
+ * This func. checks whether it is a ICMP packet or not.
+ *
+ * Return: TRUE if it is a ICMP packet
+ *         FALSE if not
+ */
+bool __qdf_nbuf_data_is_icmp_pkt(uint8_t *data)
+{
+	if (__qdf_nbuf_data_is_ipv4_pkt(data)) {
+		uint8_t pkt_type;
+
+		pkt_type = (uint8_t)(*(uint8_t *)(data +
+				QDF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET));
+
+		if (pkt_type == QDF_NBUF_TRAC_ICMP_TYPE)
+			return true;
+		else
+			return false;
+	} else
+		return false;
+}
+
+/**
+ * __qdf_nbuf_data_is_icmpv6_pkt() - check if it is IPV6 ICMPV6 packet.
+ * @data: Pointer to IPV6 ICMPV6 packet data buffer
+ *
+ * This func. checks whether it is a ICMPV6 packet or not.
+ *
+ * Return: TRUE if it is a ICMPV6 packet
+ *         FALSE if not
+ */
+bool __qdf_nbuf_data_is_icmpv6_pkt(uint8_t *data)
+{
+	if (__qdf_nbuf_data_is_ipv6_pkt(data)) {
+		uint8_t pkt_type;
+
+		pkt_type = (uint8_t)(*(uint8_t *)(data +
+				QDF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET));
+
+		if (pkt_type == QDF_NBUF_TRAC_ICMPV6_TYPE)
+			return true;
+		else
+			return false;
+	} else
+		return false;
+}
+
+/**
+ * __qdf_nbuf_data_is_ipv4_udp_pkt() - check if it is IPV4 UDP packet.
+ * @data: Pointer to IPV4 UDP packet data buffer
+ *
+ * This func. checks whether it is a IPV4 UDP packet or not.
+ *
+ * Return: TRUE if it is a IPV4 UDP packet
+ *         FALSE if not
+ */
+bool __qdf_nbuf_data_is_ipv4_udp_pkt(uint8_t *data)
+{
+	if (__qdf_nbuf_data_is_ipv4_pkt(data)) {
+		uint8_t pkt_type;
+
+		pkt_type = (uint8_t)(*(uint8_t *)(data +
+				QDF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET));
+
+		if (pkt_type == QDF_NBUF_TRAC_UDP_TYPE)
+			return true;
+		else
+			return false;
+	} else
+		return false;
+}
+
+/**
+ * __qdf_nbuf_data_is_ipv4_tcp_pkt() - check if it is IPV4 TCP packet.
+ * @data: Pointer to IPV4 TCP packet data buffer
+ *
+ * This func. checks whether it is a IPV4 TCP packet or not.
+ *
+ * Return: TRUE if it is a IPV4 TCP packet
+ *         FALSE if not
+ */
+bool __qdf_nbuf_data_is_ipv4_tcp_pkt(uint8_t *data)
+{
+	if (__qdf_nbuf_data_is_ipv4_pkt(data)) {
+		uint8_t pkt_type;
+
+		pkt_type = (uint8_t)(*(uint8_t *)(data +
+				QDF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET));
+
+		if (pkt_type == QDF_NBUF_TRAC_TCP_TYPE)
+			return true;
+		else
+			return false;
+	} else
+		return false;
+}
+
+/**
+ * __qdf_nbuf_data_is_ipv6_udp_pkt() - check if it is IPV6 UDP packet.
+ * @data: Pointer to IPV6 UDP packet data buffer
+ *
+ * This func. checks whether it is a IPV6 UDP packet or not.
+ *
+ * Return: TRUE if it is a IPV6 UDP packet
+ *         FALSE if not
+ */
+bool __qdf_nbuf_data_is_ipv6_udp_pkt(uint8_t *data)
+{
+	if (__qdf_nbuf_data_is_ipv6_pkt(data)) {
+		uint8_t pkt_type;
+
+		pkt_type = (uint8_t)(*(uint8_t *)(data +
+				QDF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET));
+
+		if (pkt_type == QDF_NBUF_TRAC_UDP_TYPE)
+			return true;
+		else
+			return false;
+	} else
+		return false;
+}
+
+/**
+ * __qdf_nbuf_data_is_ipv6_tcp_pkt() - check if it is IPV6 TCP packet.
+ * @data: Pointer to IPV6 TCP packet data buffer
+ *
+ * This func. checks whether it is a IPV6 TCP packet or not.
+ *
+ * Return: TRUE if it is a IPV6 TCP packet
+ *         FALSE if not
+ */
+bool __qdf_nbuf_data_is_ipv6_tcp_pkt(uint8_t *data)
+{
+	if (__qdf_nbuf_data_is_ipv6_pkt(data)) {
+		uint8_t pkt_type;
+
+		pkt_type = (uint8_t)(*(uint8_t *)(data +
+				QDF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET));
+
+		if (pkt_type == QDF_NBUF_TRAC_TCP_TYPE)
+			return true;
+		else
+			return false;
+	} else
+		return false;
+}
+
 #ifdef MEMORY_DEBUG
 #define QDF_NET_BUF_TRACK_MAX_SIZE    (1024)
 

+ 3 - 69
qdf/linux/src/qdf_trace.c

@@ -1126,8 +1126,6 @@ EXPORT_SYMBOL(qdf_dp_add_record);
 bool qdf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb,
 		       enum qdf_proto_dir dir)
 {
-	uint16_t mask;
-	uint16_t eapol_key_info;
 	enum qdf_proto_subtype subtype;
 
 	if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_EAPOL) &&
@@ -1135,26 +1133,7 @@ bool qdf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb,
 			QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
 		 (dir == QDF_RX && qdf_nbuf_is_ipv4_eapol_pkt(skb) == true))) {
 
-		eapol_key_info = (uint16_t)(*(uint16_t *)
-					(skb->data + EAPOL_KEY_INFO_OFFSET));
-
-		mask = eapol_key_info & EAPOL_MASK;
-		switch (mask) {
-		case EAPOL_M1_BIT_MASK:
-			subtype = QDF_PROTO_EAPOL_M1;
-			break;
-		case EAPOL_M2_BIT_MASK:
-			subtype = QDF_PROTO_EAPOL_M2;
-			break;
-		case EAPOL_M3_BIT_MASK:
-			subtype = QDF_PROTO_EAPOL_M3;
-			break;
-		case EAPOL_M4_BIT_MASK:
-			subtype = QDF_PROTO_EAPOL_M4;
-			break;
-		default:
-			subtype = QDF_PROTO_INVALID;
-		}
+		subtype = qdf_nbuf_get_eapol_subtype(skb);
 		DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_EAPOL_PACKET_RECORD,
 			session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
 			(skb->data + QDF_NBUF_DEST_MAC_OFFSET),
@@ -1187,39 +1166,7 @@ bool qdf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb,
 				QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
 		 (dir == QDF_RX && qdf_nbuf_is_ipv4_dhcp_pkt(skb) == true))) {
 
-		if ((skb->data[QDF_DHCP_OPTION53_OFFSET] == QDF_DHCP_OPTION53) &&
-		    (skb->data[QDF_DHCP_OPTION53_LENGTH_OFFSET] ==
-						 QDF_DHCP_OPTION53_LENGTH)) {
-
-			switch (skb->data[QDF_DHCP_OPTION53_STATUS_OFFSET]) {
-			case QDF_DHCP_DISCOVER:
-				subtype = QDF_PROTO_DHCP_DISCOVER;
-				break;
-			case QDF_DHCP_REQUEST:
-				subtype = QDF_PROTO_DHCP_REQUEST;
-				break;
-			case QDF_DHCP_OFFER:
-				subtype = QDF_PROTO_DHCP_OFFER;
-				break;
-			case QDF_DHCP_ACK:
-				subtype = QDF_PROTO_DHCP_ACK;
-				break;
-			case QDF_DHCP_NAK:
-				subtype = QDF_PROTO_DHCP_NACK;
-				break;
-			case QDF_DHCP_RELEASE:
-				subtype = QDF_PROTO_DHCP_RELEASE;
-				break;
-			case QDF_DHCP_INFORM:
-				subtype = QDF_PROTO_DHCP_INFORM;
-				break;
-			case QDF_DHCP_DECLINE:
-				subtype = QDF_PROTO_DHCP_DECLINE;
-				break;
-			default:
-				subtype = QDF_PROTO_INVALID;
-			}
-		}
+		subtype = qdf_nbuf_get_dhcp_subtype(skb);
 		DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_DHCP_PACKET_RECORD,
 			session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
 			(skb->data + QDF_NBUF_DEST_MAC_OFFSET),
@@ -1245,7 +1192,6 @@ EXPORT_SYMBOL(qdf_log_dhcp_pkt);
 bool qdf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb,
 		     enum qdf_proto_dir dir)
 {
-	uint16_t subtype;
 	enum qdf_proto_subtype proto_subtype;
 
 	if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ARP) &&
@@ -1253,19 +1199,7 @@ bool qdf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb,
 			QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
 		 (dir == QDF_RX && qdf_nbuf_is_ipv4_arp_pkt(skb) == true))) {
 
-		subtype = (uint16_t)(*(uint16_t *)
-			(skb->data + ARP_SUB_TYPE_OFFSET));
-		switch (QDF_SWAP_U16(subtype)) {
-		case ARP_REQUEST:
-			proto_subtype = QDF_PROTO_ARP_REQ;
-			break;
-		case ARP_RESPONSE:
-			proto_subtype = QDF_PROTO_ARP_RES;
-			break;
-		default:
-			proto_subtype = QDF_PROTO_INVALID;
-		}
-
+		proto_subtype = qdf_nbuf_get_arp_subtype(skb);
 		DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ARP_PACKET_RECORD,
 			session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
 			(skb->data + QDF_NBUF_DEST_MAC_OFFSET),