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
This commit is contained in:
Himanshu Agarwal
2016-07-20 17:45:58 +05:30
committed by Vishwajith Upendra
parent 9c3b3fe251
commit fcd64e9e64
5 changed files with 938 additions and 153 deletions

View File

@@ -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);
}
/**

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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),