diff options
| author | Himanshu Agarwal <himanaga@qti.qualcomm.com> | 2016-05-23 16:08:10 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-05-26 15:34:37 +0530 |
| commit | 4235b981b6548deef493e728f323d22c0402085e (patch) | |
| tree | 007f11d03919a4d8a2e83bfdf3265b7b535e6b01 | |
| parent | e0751be2eebbdb681336cfa5fc7b715ad0039960 (diff) | |
qcacld-2.0: Add APIs to get packet type and subtype
Add APIs to get the DHCP, EAPOL, ARP, ICMP, ICMPV6, TCP
and UDP packets type and subtype from the netbuf.
Change-Id: I8837ad1b976744eeb0e7f0a836eded3a5d34124b
CRs-Fixed: 1019037
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.c | 425 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.h | 535 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_trace.c | 71 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_trace.h | 27 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h | 20 |
5 files changed, 956 insertions, 122 deletions
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c index 11f308234d3e..aed95aaa5184 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c @@ -35,6 +35,8 @@ #include <adf_os_io.h> #include <adf_os_lock.h> #include <net/ieee80211_radiotap.h> +#include "adf_trace.h" +#include "vos_trace.h" #ifdef CONFIG_WCNSS_MEM_PRE_ALLOC #include <net/cnss_prealloc.h> @@ -565,15 +567,211 @@ __adf_nbuf_reg_trace_cb(adf_nbuf_trace_update_t cb_func_ptr) return; } +/** + * __adf_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 adf_proto_subtype +__adf_nbuf_data_get_dhcp_subtype(uint8_t *data) +{ + enum adf_proto_subtype subtype = ADF_PROTO_INVALID; + + if ((data[DHCP_OPTION53_OFFSET] == DHCP_OPTION53) && + (data[DHCP_OPTION53_LENGTH_OFFSET] == + DHCP_OPTION53_LENGTH)) { + + switch (data[DHCP_OPTION53_STATUS_OFFSET]) { + case DHCPDISCOVER: + subtype = ADF_PROTO_DHCP_DISCOVER; + break; + case DHCPREQUEST: + subtype = ADF_PROTO_DHCP_REQUEST; + break; + case DHCPOFFER: + subtype = ADF_PROTO_DHCP_OFFER; + break; + case DHCPACK: + subtype = ADF_PROTO_DHCP_ACK; + break; + case DHCPNAK: + subtype = ADF_PROTO_DHCP_NACK; + break; + case DHCPRELEASE: + subtype = ADF_PROTO_DHCP_RELEASE; + break; + case DHCPINFORM: + subtype = ADF_PROTO_DHCP_INFORM; + break; + case DHCPDECLINE: + subtype = ADF_PROTO_DHCP_DECLINE; + break; + default: + break; + } + } + + return subtype; +} + +/** + * __adf_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 adf_proto_subtype +__adf_nbuf_data_get_eapol_subtype(uint8_t *data) +{ + uint16_t eapol_key_info; + enum adf_proto_subtype subtype = ADF_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 = ADF_PROTO_EAPOL_M1; + break; + case EAPOL_M2_BIT_MASK: + subtype = ADF_PROTO_EAPOL_M2; + break; + case EAPOL_M3_BIT_MASK: + subtype = ADF_PROTO_EAPOL_M3; + break; + case EAPOL_M4_BIT_MASK: + subtype = ADF_PROTO_EAPOL_M4; + break; + default: + break; + } + + return subtype; +} + +/** + * __adf_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 adf_proto_subtype +__adf_nbuf_data_get_arp_subtype(uint8_t *data) +{ + uint16_t subtype; + enum adf_proto_subtype proto_subtype = ADF_PROTO_INVALID; + + subtype = (uint16_t)(*(uint16_t *) + (data + ARP_SUB_TYPE_OFFSET)); + + switch (adf_os_cpu_to_be16(subtype)) { + case ARP_REQUEST: + proto_subtype = ADF_PROTO_ARP_REQ; + break; + case ARP_RESPONSE: + proto_subtype = ADF_PROTO_ARP_RES; + break; + default: + break; + } + + return proto_subtype; +} + +/** + * __adf_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 adf_proto_subtype +__adf_nbuf_data_get_icmp_subtype(uint8_t *data) +{ + uint8_t subtype; + enum adf_proto_subtype proto_subtype = ADF_PROTO_INVALID; + + subtype = (uint8_t)(*(uint8_t *) + (data + ICMP_SUBTYPE_OFFSET)); + + switch (subtype) { + case ICMP_REQUEST: + proto_subtype = ADF_PROTO_ICMP_REQ; + break; + case ICMP_RESPONSE: + proto_subtype = ADF_PROTO_ICMP_RES; + break; + default: + break; + } + + return proto_subtype; +} + +/** + * __adf_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 adf_proto_subtype +__adf_nbuf_data_get_icmpv6_subtype(uint8_t *data) +{ + uint8_t subtype; + enum adf_proto_subtype proto_subtype = ADF_PROTO_INVALID; + + subtype = (uint8_t)(*(uint8_t *) + (data + ICMPV6_SUBTYPE_OFFSET)); + + switch (subtype) { + case ICMPV6_REQUEST: + proto_subtype = ADF_PROTO_ICMPV6_REQ; + break; + case ICMPV6_RESPONSE: + proto_subtype = ADF_PROTO_ICMPV6_RES; + break; + default: + break; + } + + return proto_subtype; +} + +/** + * __adf_nbuf_data_is_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: A_STATUS_OK if it is a DHCP packet + * A_STATUS_FAILED if not + */ a_status_t -__adf_nbuf_is_dhcp_pkt(struct sk_buff *skb) +__adf_nbuf_data_is_dhcp_pkt(uint8_t *data) { a_uint16_t SPort; a_uint16_t DPort; - SPort = (a_uint16_t)(*(a_uint16_t *)(skb->data + ADF_NBUF_TRAC_IPV4_OFFSET + + SPort = (a_uint16_t)(*(a_uint16_t *)(data + ADF_NBUF_TRAC_IPV4_OFFSET + ADF_NBUF_TRAC_IPV4_HEADER_SIZE)); - DPort = (a_uint16_t)(*(a_uint16_t *)(skb->data + ADF_NBUF_TRAC_IPV4_OFFSET + + DPort = (a_uint16_t)(*(a_uint16_t *)(data + ADF_NBUF_TRAC_IPV4_OFFSET + ADF_NBUF_TRAC_IPV4_HEADER_SIZE + sizeof(a_uint16_t))); if (((ADF_NBUF_TRAC_DHCP_SRV_PORT == adf_os_cpu_to_be16(SPort)) && @@ -589,12 +787,22 @@ __adf_nbuf_is_dhcp_pkt(struct sk_buff *skb) } } +/** + * __adf_nbuf_data_is_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: A_STATUS_OK if it is a EAPOL packet + * A_STATUS_FAILED if not + */ a_status_t -__adf_nbuf_is_eapol_pkt(struct sk_buff *skb) +__adf_nbuf_data_is_eapol_pkt(uint8_t *data) { a_uint16_t ether_type; - ether_type = (a_uint16_t)(*(a_uint16_t *)(skb->data + ADF_NBUF_TRAC_ETH_TYPE_OFFSET)); + ether_type = (a_uint16_t)(*(a_uint16_t *)(data + + ADF_NBUF_TRAC_ETH_TYPE_OFFSET)); if (ADF_NBUF_TRAC_EAPOL_ETH_TYPE == adf_os_cpu_to_be16(ether_type)) { return A_STATUS_OK; @@ -606,18 +814,19 @@ __adf_nbuf_is_eapol_pkt(struct sk_buff *skb) } /** - * __adf_nbuf_is_ipv4_arp_pkt() - check if skb data is a arp packet. - * @skb: Pointer to network buffer + * __adf_nbuf_data_is_ipv4_arp_pkt() - check if it is ARP packet. + * @data: Pointer to ARP packet data buffer * - * This api is for ipv4 packet. + * This func. checks whether it is a ARP packet or not. * - * Return: true if packet is ARP packet + * Return: TRUE if it is a ARP packet + * FALSE if not */ -bool __adf_nbuf_is_ipv4_arp_pkt(struct sk_buff *skb) +bool __adf_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 + ADF_NBUF_TRAC_ETH_TYPE_OFFSET)); if (ether_type == adf_os_cpu_to_be16(ADF_NBUF_TRAC_ARP_ETH_TYPE)) @@ -626,6 +835,200 @@ bool __adf_nbuf_is_ipv4_arp_pkt(struct sk_buff *skb) return false; } +/** + * __adf_nbuf_data_is_ipv4_pkt() - check if it is IPV4 packet. + * @data: Pointer to IPV4 packet data buffer + * + * This func. checks whether it is a IPV4 packet or not. + * + * Return: TRUE if it is a IPV4 packet + * FALSE if not + */ +bool __adf_nbuf_data_is_ipv4_pkt(uint8_t *data) +{ + uint16_t ether_type; + + ether_type = (uint16_t)(*(uint16_t *)(data + + ADF_NBUF_TRAC_ETH_TYPE_OFFSET)); + + if (ether_type == adf_os_cpu_to_be16(ADF_NBUF_TRAC_IPV4_ETH_TYPE)) + return true; + else + return false; +} + +/** + * __adf_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 __adf_nbuf_data_is_ipv6_pkt(uint8_t *data) +{ + uint16_t ether_type; + + ether_type = (uint16_t)(*(uint16_t *)(data + + ADF_NBUF_TRAC_ETH_TYPE_OFFSET)); + + if (ether_type == adf_os_cpu_to_be16(ADF_NBUF_TRAC_IPV6_ETH_TYPE)) + return true; + else + return false; +} + +/** + * __adf_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 __adf_nbuf_data_is_icmp_pkt(uint8_t *data) +{ + if (__adf_nbuf_data_is_ipv4_pkt(data)) { + uint8_t pkt_type; + + pkt_type = (uint8_t)(*(uint8_t *)(data + + ADF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET)); + + if (pkt_type == ADF_NBUF_TRAC_ICMP_TYPE) + return true; + else + return false; + } else + return false; +} + +/** + * __adf_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 __adf_nbuf_data_is_icmpv6_pkt(uint8_t *data) +{ + if (__adf_nbuf_data_is_ipv6_pkt(data)) { + uint8_t pkt_type; + + pkt_type = (uint8_t)(*(uint8_t *)(data + + ADF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET)); + + if (pkt_type == ADF_NBUF_TRAC_ICMPv6_TYPE) + return true; + else + return false; + } else + return false; +} + +/** + * __adf_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 __adf_nbuf_data_is_ipv4_udp_pkt(uint8_t *data) +{ + if (__adf_nbuf_data_is_ipv4_pkt(data)) { + uint8_t pkt_type; + + pkt_type = (uint8_t)(*(uint8_t *)(data + + ADF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET)); + + if (pkt_type == ADF_NBUF_TRAC_UDP_TYPE) + return true; + else + return false; + } else + return false; +} + +/** + * __adf_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 __adf_nbuf_data_is_ipv4_tcp_pkt(uint8_t *data) +{ + if (__adf_nbuf_data_is_ipv4_pkt(data)) { + uint8_t pkt_type; + + pkt_type = (uint8_t)(*(uint8_t *)(data + + ADF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET)); + + if (pkt_type == ADF_NBUF_TRAC_TCP_TYPE) + return true; + else + return false; + } else + return false; +} + +/** + * __adf_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 __adf_nbuf_data_is_ipv6_udp_pkt(uint8_t *data) +{ + if (__adf_nbuf_data_is_ipv6_pkt(data)) { + uint8_t pkt_type; + + pkt_type = (uint8_t)(*(uint8_t *)(data + + ADF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET)); + + if (pkt_type == ADF_NBUF_TRAC_UDP_TYPE) + return true; + else + return false; + } else + return false; +} + +/** + * __adf_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 __adf_nbuf_data_is_ipv6_tcp_pkt(uint8_t *data) +{ + if (__adf_nbuf_data_is_ipv6_pkt(data)) { + uint8_t pkt_type; + + pkt_type = (uint8_t)(*(uint8_t *)(data + + ADF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET)); + + if (pkt_type == ADF_NBUF_TRAC_TCP_TYPE) + return true; + else + return false; + } else + return false; +} + #ifdef QCA_PKT_PROTO_TRACE void __adf_nbuf_trace_update(struct sk_buff *buf, char *event_string) diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h index b4584831802a..860aa7f77d28 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h @@ -64,12 +64,22 @@ #define ADF_NBUF_TRAC_ETH_TYPE_OFFSET 12 #define ADF_NBUF_TRAC_EAPOL_ETH_TYPE 0x888E #define ADF_NBUF_TRAC_ARP_ETH_TYPE 0x0806 +#define ADF_NBUF_TRAC_IPV4_ETH_TYPE 0x0800 +#define ADF_NBUF_TRAC_IPV6_ETH_TYPE 0x86dd #define ADF_NBUF_DEST_MAC_OFFSET 0 #define ADF_NBUF_SRC_MAC_OFFSET 6 +#define ADF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET 23 +#define ADF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET 20 +#define ADF_NBUF_TRAC_ICMP_TYPE 1 +#define ADF_NBUF_TRAC_TCP_TYPE 6 +#define ADF_NBUF_TRAC_UDP_TYPE 17 +#define ADF_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 @@ -122,6 +132,8 @@ struct mon_rx_status { #define DHCP_OPTION53_OFFSET (0x11A) #define DHCP_OPTION53_LENGTH_OFFSET (0x11B) #define DHCP_OPTION53_STATUS_OFFSET (0x11C) +#define DHCP_PKT_LEN_OFFSET 16 +#define DHCP_TRANSACTION_ID_OFFSET 46 #define DHCPDISCOVER (1) #define DHCPOFFER (2) #define DHCPREQUEST (3) @@ -131,12 +143,68 @@ struct mon_rx_status { #define DHCPRELEASE (7) #define DHCPINFORM (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 + +/* 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 + +/* IPV6 ICMPV6 Related Mask */ +#define ICMPV6_SEQ_NUM_OFFSET 60 +#define ICMPV6_SUBTYPE_OFFSET 54 +#define ICMPV6_REQUEST 0x80 +#define ICMPV6_RESPONSE 0x81 + #define ADF_NBUF_IPA_CHECK_MASK 0x80000000 +enum adf_proto_type { + ADF_PROTO_TYPE_DHCP = 0, + ADF_PROTO_TYPE_EAPOL, + ADF_PROTO_TYPE_ARP, + ADF_PROTO_TYPE_MAX +}; + +enum adf_proto_subtype { + ADF_PROTO_INVALID = 0, + ADF_PROTO_EAPOL_M1, + ADF_PROTO_EAPOL_M2, + ADF_PROTO_EAPOL_M3, + ADF_PROTO_EAPOL_M4, + ADF_PROTO_DHCP_DISCOVER, + ADF_PROTO_DHCP_REQUEST, + ADF_PROTO_DHCP_OFFER, + ADF_PROTO_DHCP_ACK, + ADF_PROTO_DHCP_NACK, + ADF_PROTO_DHCP_RELEASE, + ADF_PROTO_DHCP_INFORM, + ADF_PROTO_DHCP_DECLINE, + ADF_PROTO_ARP_REQ, + ADF_PROTO_ARP_RES, + ADF_PROTO_ARP_SUBTYPE, + ADF_PROTO_ICMP_REQ, + ADF_PROTO_ICMP_RES, + ADF_PROTO_ICMPV6_REQ, + ADF_PROTO_ICMPV6_RES, + ADF_PROTO_IPV4_UDP, + ADF_PROTO_IPV4_TCP, + ADF_PROTO_IPV6_UDP, + ADF_PROTO_IPV6_TCP, + ADF_PROTO_SUBTYPE_MAX +}; + /** * @brief Platform indepedent packet abstraction @@ -1257,43 +1325,484 @@ adf_nbuf_get_tx_parallel_dnload_frm(adf_nbuf_t buf) } /** - * @brief this will return if the skb data is a dhcp packet or not + * adf_nbuf_get_dhcp_subtype() - get the subtype + * of DHCP packet. + * @buf: Pointer to DHCP packet buffer * - * @param[in] buf buffer + * This func. returns the subtype of DHCP packet. + * + * Return: subtype of the DHCP packet. + */ +static inline enum adf_proto_subtype +adf_nbuf_get_dhcp_subtype(adf_nbuf_t buf) +{ + return __adf_nbuf_data_get_dhcp_subtype(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_proto_subtype +adf_nbuf_data_get_dhcp_subtype(uint8_t *data) +{ + return __adf_nbuf_data_get_dhcp_subtype(data); +} + +/** + * adf_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 adf_proto_subtype +adf_nbuf_get_eapol_subtype(adf_nbuf_t buf) +{ + return __adf_nbuf_data_get_eapol_subtype(adf_nbuf_data(buf)); +} + +/** + * adf_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 A_STATUS_OK if packet is DHCP packet + * Return: subtype of the EAPOL packet. + */ +static inline enum adf_proto_subtype +adf_nbuf_data_get_eapol_subtype(uint8_t *data) +{ + return __adf_nbuf_data_get_eapol_subtype(data); +} + +/** + * adf_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 adf_proto_subtype +adf_nbuf_get_arp_subtype(adf_nbuf_t buf) +{ + return __adf_nbuf_data_get_arp_subtype(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_proto_subtype +adf_nbuf_data_get_arp_subtype(uint8_t *data) +{ + return __adf_nbuf_data_get_arp_subtype(data); +} + +/** + * adf_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 adf_proto_subtype +adf_nbuf_get_icmp_subtype(adf_nbuf_t buf) +{ + return __adf_nbuf_data_get_icmp_subtype(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_proto_subtype +adf_nbuf_data_get_icmp_subtype(uint8_t *data) +{ + return __adf_nbuf_data_get_icmp_subtype(data); +} + +/** + * adf_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 adf_proto_subtype +adf_nbuf_get_icmpv6_subtype(adf_nbuf_t buf) +{ + return __adf_nbuf_data_get_icmpv6_subtype(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_proto_subtype +adf_nbuf_data_get_icmpv6_subtype(uint8_t *data) +{ + return __adf_nbuf_data_get_icmpv6_subtype(data); +} + + +/** + * adf_nbuf_is_dhcp_pkt() - check if it is DHCP packet. + * @buf: Pointer to DHCP packet buffer + * + * This func. checks whether it is a DHCP packet or not. + * + * Return: A_STATUS_OK if it is a DHCP packet + * A_STATUS_FAILED if not */ static inline a_status_t adf_nbuf_is_dhcp_pkt(adf_nbuf_t buf) { - return (__adf_nbuf_is_dhcp_pkt(buf)); + return __adf_nbuf_data_is_dhcp_pkt(adf_nbuf_data(buf)); } /** - * @brief this will return if the skb data is a eapol packet or not + * adf_nbuf_data_is_dhcp_pkt() - check if it is DHCP packet. + * @data: Pointer to DHCP packet data buffer * - * @param[in] buf buffer + * This func. checks whether it is a DHCP packet or not. + * + * Return: A_STATUS_OK if it is a DHCP packet + * A_STATUS_FAILED if not + */ +static inline a_status_t +adf_nbuf_data_is_dhcp_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_dhcp_pkt(data); +} + +/** + * adf_nbuf_is_eapol_pkt() - check if it is EAPOL packet. + * @buf: Pointer to EAPOL packet buffer * - * @return A_STATUS_OK if packet is EAPOL packet + * This func. checks whether it is a EAPOL packet or not. + * + * Return: A_STATUS_OK if it is a EAPOL packet + * A_STATUS_FAILED if not */ static inline a_status_t adf_nbuf_is_eapol_pkt(adf_nbuf_t buf) { - return (__adf_nbuf_is_eapol_pkt(buf)); + return __adf_nbuf_data_is_eapol_pkt(adf_nbuf_data(buf)); } /** - * adf_nbuf_is_ipv4_arp_pkt() - check if packet is a arp packet or not - * @buf: buffer + * adf_nbuf_data_is_eapol_pkt() - check if it is EAPOL packet. + * @data: Pointer to EAPOL packet data buffer * - * This api is for ipv4 packet. + * This func. checks whether it is a EAPOL packet or not. * - * Return: true if packet is ARP packet + * Return: A_STATUS_OK if it is a EAPOL packet + * A_STATUS_FAILED if not + */ +static inline a_status_t +adf_nbuf_data_is_eapol_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_eapol_pkt(data); +} + +/** + * adf_nbuf_is_ipv4_arp_pkt() - check if it is ARP packet. + * @buf: Pointer to ARP packet 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 adf_nbuf_is_ipv4_arp_pkt(adf_nbuf_t buf) { - return __adf_nbuf_is_ipv4_arp_pkt(buf); + return __adf_nbuf_data_is_ipv4_arp_pkt(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_nbuf_data_is_ipv4_arp_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_ipv4_arp_pkt(data); +} + +/** + * adf_nbuf_is_ipv4_pkt() - check if it is IPV4 packet. + * @buf: Pointer to IPV4 packet buffer + * + * This func. checks whether it is a IPV4 packet or not. + * + * Return: TRUE if it is a IPV4 packet + * FALSE if not + */ +static inline +bool adf_nbuf_is_ipv4_pkt(adf_nbuf_t buf) +{ + return __adf_nbuf_data_is_ipv4_pkt(adf_nbuf_data(buf)); +} + +/** + * adf_nbuf_data_is_ipv4_pkt() - check if it is IPV4 packet. + * @data: Pointer to IPV4 packet data buffer + * + * This func. checks whether it is a IPV4 packet or not. + * + * Return: TRUE if it is a IPV4 packet + * FALSE if not + */ +static inline +bool adf_nbuf_data_is_ipv4_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_ipv4_pkt(data); +} + +/** + * adf_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 adf_nbuf_is_ipv6_pkt(adf_nbuf_t buf) +{ + return __adf_nbuf_data_is_ipv6_pkt(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_nbuf_data_is_ipv6_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_ipv6_pkt(data); +} + +/** + * adf_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 adf_nbuf_is_icmp_pkt(adf_nbuf_t buf) +{ + return __adf_nbuf_data_is_icmp_pkt(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_nbuf_data_is_icmp_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_icmp_pkt(data); +} + +/** + * adf_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 adf_nbuf_is_icmpv6_pkt(adf_nbuf_t buf) +{ + return __adf_nbuf_data_is_icmpv6_pkt(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_nbuf_data_is_icmpv6_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_icmpv6_pkt(data); +} + +/** + * adf_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 adf_nbuf_is_ipv4_udp_pkt(adf_nbuf_t buf) +{ + return __adf_nbuf_data_is_ipv4_udp_pkt(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_nbuf_data_is_ipv4_udp_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_ipv4_udp_pkt(data); +} + +/** + * adf_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 adf_nbuf_is_ipv4_tcp_pkt(adf_nbuf_t buf) +{ + return __adf_nbuf_data_is_ipv4_tcp_pkt(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_nbuf_data_is_ipv4_tcp_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_ipv4_tcp_pkt(data); +} + +/** + * adf_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 adf_nbuf_is_ipv6_udp_pkt(adf_nbuf_t buf) +{ + return __adf_nbuf_data_is_ipv6_udp_pkt(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_nbuf_data_is_ipv6_udp_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_ipv6_udp_pkt(data); +} + +/** + * adf_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 adf_nbuf_is_ipv6_tcp_pkt(adf_nbuf_t buf) +{ + return __adf_nbuf_data_is_ipv6_tcp_pkt(adf_nbuf_data(buf)); +} + +/** + * adf_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 adf_nbuf_data_is_ipv6_tcp_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_ipv6_tcp_pkt(data); } /** diff --git a/CORE/SERVICES/COMMON/adf/adf_trace.c b/CORE/SERVICES/COMMON/adf/adf_trace.c index e52793650fd6..8311147a7aec 100644 --- a/CORE/SERVICES/COMMON/adf/adf_trace.c +++ b/CORE/SERVICES/COMMON/adf/adf_trace.c @@ -407,33 +407,12 @@ void adf_dp_add_record(enum ADF_DP_TRACE_ID code, bool adf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb, uint8_t event_type) { - uint16_t mask; - uint16_t eapol_key_info; enum adf_proto_subtype subtype; if ((adf_dp_get_proto_bitmap() & NBUF_PKT_TRAC_TYPE_EAPOL) && adf_nbuf_is_eapol_pkt(skb) == A_STATUS_OK) { - 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 = ADF_PROTO_EAPOL_M1; - break; - case EAPOL_M2_BIT_MASK: - subtype = ADF_PROTO_EAPOL_M2; - break; - case EAPOL_M3_BIT_MASK: - subtype = ADF_PROTO_EAPOL_M3; - break; - case EAPOL_M4_BIT_MASK: - subtype = ADF_PROTO_EAPOL_M4; - break; - default: - subtype = ADF_PROTO_INVALID; - } + subtype = adf_nbuf_get_eapol_subtype(skb); DPTRACE(adf_dp_trace_proto_pkt(ADF_DP_TRACE_EAPOL_PACKET_RECORD, session_id, (skb->data + ADF_NBUF_SRC_MAC_OFFSET), (skb->data + ADF_NBUF_DEST_MAC_OFFSET), @@ -462,39 +441,7 @@ bool adf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb, if ((adf_dp_get_proto_bitmap() & NBUF_PKT_TRAC_TYPE_DHCP) && adf_nbuf_is_dhcp_pkt(skb) == A_STATUS_OK) { - if ((skb->data[DHCP_OPTION53_OFFSET] == DHCP_OPTION53) && - (skb->data[DHCP_OPTION53_LENGTH_OFFSET] == - DHCP_OPTION53_LENGTH)) { - - switch (skb->data[DHCP_OPTION53_STATUS_OFFSET]) { - case DHCPDISCOVER: - subtype = ADF_PROTO_DHCP_DISCOVER; - break; - case DHCPREQUEST: - subtype = ADF_PROTO_DHCP_REQUEST; - break; - case DHCPOFFER: - subtype = ADF_PROTO_DHCP_OFFER; - break; - case DHCPACK: - subtype = ADF_PROTO_DHCP_ACK; - break; - case DHCPNAK: - subtype = ADF_PROTO_DHCP_NACK; - break; - case DHCPRELEASE: - subtype = ADF_PROTO_DHCP_RELEASE; - break; - case DHCPINFORM: - subtype = ADF_PROTO_DHCP_INFORM; - break; - case DHCPDECLINE: - subtype = ADF_PROTO_DHCP_DECLINE; - break; - default: - subtype = ADF_PROTO_INVALID; - } - } + subtype = adf_nbuf_get_dhcp_subtype(skb); DPTRACE(adf_dp_trace_proto_pkt(ADF_DP_TRACE_DHCP_PACKET_RECORD, session_id, (skb->data + ADF_NBUF_SRC_MAC_OFFSET), (skb->data + ADF_NBUF_DEST_MAC_OFFSET), @@ -518,24 +465,12 @@ bool adf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb, bool adf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb, uint8_t event_type) { - uint16_t subtype; enum adf_proto_subtype proto_subtype; if ((adf_dp_get_proto_bitmap() & NBUF_PKT_TRAC_TYPE_ARP) && adf_nbuf_is_ipv4_arp_pkt(skb) == true) { - subtype = (uint16_t)(*(uint16_t *) - (skb->data + ARP_SUB_TYPE_OFFSET)); - switch (adf_os_cpu_to_be16(subtype)) { - case ARP_REQUEST: - proto_subtype = ADF_PROTO_ARP_REQ; - break; - case ARP_RESPONSE: - proto_subtype = ADF_PROTO_ARP_RES; - break; - default: - proto_subtype = ADF_PROTO_INVALID; - } + proto_subtype = adf_nbuf_get_arp_subtype(skb); DPTRACE(adf_dp_trace_proto_pkt(ADF_DP_TRACE_ARP_PACKET_RECORD, session_id, (skb->data + ADF_NBUF_SRC_MAC_OFFSET), diff --git a/CORE/SERVICES/COMMON/adf/adf_trace.h b/CORE/SERVICES/COMMON/adf/adf_trace.h index 9648b79f8c2d..bf5f96ed26d6 100644 --- a/CORE/SERVICES/COMMON/adf/adf_trace.h +++ b/CORE/SERVICES/COMMON/adf/adf_trace.h @@ -108,33 +108,6 @@ enum ADF_DP_TRACE_ID { ADF_DP_TRACE_MAX }; -enum adf_proto_type { - ADF_PROTO_TYPE_DHCP = 0, - ADF_PROTO_TYPE_EAPOL, - ADF_PROTO_TYPE_ARP, - ADF_PROTO_TYPE_MAX -}; - -enum adf_proto_subtype { - ADF_PROTO_INVALID = 0, - ADF_PROTO_EAPOL_M1, - ADF_PROTO_EAPOL_M2, - ADF_PROTO_EAPOL_M3, - ADF_PROTO_EAPOL_M4, - ADF_PROTO_DHCP_DISCOVER, - ADF_PROTO_DHCP_REQUEST, - ADF_PROTO_DHCP_OFFER, - ADF_PROTO_DHCP_ACK, - ADF_PROTO_DHCP_NACK, - ADF_PROTO_DHCP_RELEASE, - ADF_PROTO_DHCP_INFORM, - ADF_PROTO_DHCP_DECLINE, - ADF_PROTO_ARP_REQ, - ADF_PROTO_ARP_RES, - ADF_PROTO_ARP_SUBTYPE, - ADF_PROTO_SUBTYPE_MAX -}; - enum adf_proto_dir { ADF_TX, ADF_RX diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h index cc91cf5ae888..1a48042bd43e 100644 --- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h +++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h @@ -38,6 +38,7 @@ #include <asm/types.h> #include <asm/scatterlist.h> #include <adf_os_types.h> +#include <adf_nbuf.h> #define __ADF_NBUF_NULL NULL @@ -330,9 +331,22 @@ void __adf_nbuf_dmamap_info(__adf_os_dma_map_t bmap, adf_os_dmamap_in void __adf_nbuf_frag_info(struct sk_buff *skb, adf_os_sglist_t *sg); void __adf_nbuf_dmamap_set_cb(__adf_os_dma_map_t dmap, void *cb, void *arg); void __adf_nbuf_reg_trace_cb(adf_nbuf_trace_update_t cb_func_ptr); -a_status_t __adf_nbuf_is_dhcp_pkt(struct sk_buff *skb); -a_status_t __adf_nbuf_is_eapol_pkt(struct sk_buff *skb); -bool __adf_nbuf_is_ipv4_arp_pkt(struct sk_buff *skb); +bool __adf_nbuf_data_is_ipv4_pkt(uint8_t *data); +bool __adf_nbuf_data_is_ipv6_pkt(uint8_t *data); +bool __adf_nbuf_data_is_icmp_pkt(uint8_t *data); +bool __adf_nbuf_data_is_icmpv6_pkt(uint8_t *data); +bool __adf_nbuf_data_is_ipv4_udp_pkt(uint8_t *data); +bool __adf_nbuf_data_is_ipv4_tcp_pkt(uint8_t *data); +bool __adf_nbuf_data_is_ipv6_udp_pkt(uint8_t *data); +bool __adf_nbuf_data_is_ipv6_tcp_pkt(uint8_t *data); +a_status_t __adf_nbuf_data_is_dhcp_pkt(uint8_t *data); +a_status_t __adf_nbuf_data_is_eapol_pkt(uint8_t *data); +bool __adf_nbuf_data_is_ipv4_arp_pkt(uint8_t *data); +enum adf_proto_subtype __adf_nbuf_data_get_dhcp_subtype(uint8_t *data); +enum adf_proto_subtype __adf_nbuf_data_get_eapol_subtype(uint8_t *data); +enum adf_proto_subtype __adf_nbuf_data_get_arp_subtype(uint8_t *data); +enum adf_proto_subtype __adf_nbuf_data_get_icmp_subtype(uint8_t *data); +enum adf_proto_subtype __adf_nbuf_data_get_icmpv6_subtype(uint8_t *data); #ifdef QCA_PKT_PROTO_TRACE |
