diff options
| author | Himanshu Agarwal <himanaga@qti.qualcomm.com> | 2016-07-20 12:43:15 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-07-21 16:44:17 +0530 |
| commit | 13e59ae0340360641eaad555452a77c48d6f8e2c (patch) | |
| tree | b35ee15b5eff974398e7e7e773f1c7cdceec7379 | |
| parent | 28fcd69ee7995184a9584dc182f498c90742c6bf (diff) | |
qcacld-2.0: Dump more WoW wakeup packet info
Dump more info for WOW wakeup packet:
1) ether_type
2) proto_type in case of IPV4 and IPV6 packets
3) src port and dst port in case of TCP/UDP
Change-Id: I1578aa5322af50f0ae43248c48a2f754ea081970
CRs-Fixed: 1043939
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.c | 40 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.h | 35 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h | 2 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 145 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.h | 2 |
5 files changed, 168 insertions, 56 deletions
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c index 81494f127492..3c26c0fc008d 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c @@ -755,6 +755,44 @@ __adf_nbuf_data_get_icmpv6_subtype(uint8_t *data) } /** + * __adf_nbuf_data_get_ipv4_proto() - get the proto type + * of IPV4 packet. + * @data: Pointer to IPV4 packet data buffer + * + * This func. returns the proto type of IPV4 packet. + * + * Return: proto type of IPV4 packet. + */ +uint8_t +__adf_nbuf_data_get_ipv4_proto(uint8_t *data) +{ + uint8_t proto_type; + + proto_type = (uint8_t)(*(uint8_t *)(data + + ADF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET)); + return proto_type; +} + +/** + * __adf_nbuf_data_get_ipv6_proto() - get the proto type + * of IPV6 packet. + * @data: Pointer to IPV6 packet data buffer + * + * This func. returns the proto type of IPV6 packet. + * + * Return: proto type of IPV6 packet. + */ +uint8_t +__adf_nbuf_data_get_ipv6_proto(uint8_t *data) +{ + uint8_t proto_type; + + proto_type = (uint8_t)(*(uint8_t *)(data + + ADF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET)); + return proto_type; +} + +/** * __adf_nbuf_data_is_dhcp_pkt() - check if it is DHCP packet. * @data: Pointer to DHCP packet data buffer * @@ -921,7 +959,7 @@ bool __adf_nbuf_data_is_icmpv6_pkt(uint8_t *data) pkt_type = (uint8_t)(*(uint8_t *)(data + ADF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET)); - if (pkt_type == ADF_NBUF_TRAC_ICMPv6_TYPE) + if (pkt_type == ADF_NBUF_TRAC_ICMPV6_TYPE) return true; else return false; diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h index d827ac23393c..43923d582613 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h @@ -73,7 +73,7 @@ #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 +#define ADF_NBUF_TRAC_ICMPV6_TYPE 0x3a #define ADF_NBUF_TRAC_WAI_ETH_TYPE 0x88b4 /* EAPOL Related MASK */ @@ -152,6 +152,8 @@ struct mon_rx_status { /* 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 @@ -162,6 +164,8 @@ struct mon_rx_status { /* 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 @@ -1475,6 +1479,35 @@ adf_nbuf_data_get_icmpv6_subtype(uint8_t *data) return __adf_nbuf_data_get_icmpv6_subtype(data); } +/** + * adf_nbuf_data_get_ipv4_proto() - get the proto type + * of IPV4 packet. + * @data: Pointer to IPV4 packet data buffer + * + * This func. returns the proto type of IPV4 packet. + * + * Return: proto type of IPV4 packet. + */ +static inline uint8_t +adf_nbuf_data_get_ipv4_proto(uint8_t *data) +{ + return __adf_nbuf_data_get_ipv4_proto(data); +} + +/** + * adf_nbuf_data_get_ipv6_proto() - get the proto type + * of IPV6 packet. + * @data: Pointer to IPV6 packet data buffer + * + * This func. returns the proto type of IPV6 packet. + * + * Return: proto type of IPV6 packet. + */ +static inline uint8_t +adf_nbuf_data_get_ipv6_proto(uint8_t *data) +{ + return __adf_nbuf_data_get_ipv6_proto(data); +} /** * adf_nbuf_is_dhcp_pkt() - check if it is DHCP packet. diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h index 7230e5f14444..d19bec300b67 100644 --- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h +++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h @@ -404,6 +404,8 @@ 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); +uint8_t __adf_nbuf_data_get_ipv4_proto(uint8_t *data); +uint8_t __adf_nbuf_data_get_ipv6_proto(uint8_t *data); bool __adf_nbuf_is_bcast_pkt(uint8_t *data); bool __adf_nbuf_is_multicast_pkt(uint8_t *data); bool __adf_nbuf_is_wai_pkt(uint8_t *data); diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 56509bc5d48b..8b3f4b1b7ad9 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -21119,58 +21119,84 @@ static enum adf_proto_subtype wma_wow_get_pkt_proto_subtype(uint8_t *data, uint32_t len) { - if (len >= WMA_IS_DHCP_GET_MIN_LEN) { - if (adf_nbuf_data_is_dhcp_pkt(data) == A_STATUS_OK) { - if (len >= WMA_DHCP_SUBTYPE_GET_MIN_LEN) - return adf_nbuf_data_get_dhcp_subtype(data); - VOS_TRACE(VOS_MODULE_ID_WDA, - VOS_TRACE_LEVEL_ERROR, "DHCP Packet"); - return ADF_PROTO_INVALID; - } - } - if (len >= WMA_IS_EAPOL_GET_MIN_LEN) { - if (adf_nbuf_data_is_eapol_pkt(data) == A_STATUS_OK) { - if (len >= WMA_EAPOL_SUBTYPE_GET_MIN_LEN) - return adf_nbuf_data_get_eapol_subtype(data); - VOS_TRACE(VOS_MODULE_ID_WDA, - VOS_TRACE_LEVEL_ERROR, "EAPOL Packet"); - return ADF_PROTO_INVALID; - } - } - if (len >= WMA_IS_ARP_GET_MIN_LEN) { - if (adf_nbuf_data_is_ipv4_arp_pkt(data)) { - if (len >= WMA_ARP_SUBTYPE_GET_MIN_LEN) - return adf_nbuf_data_get_arp_subtype(data); - VOS_TRACE(VOS_MODULE_ID_WDA, - VOS_TRACE_LEVEL_ERROR, "ARP Packet"); - return ADF_PROTO_INVALID; - } - } - if (len >= WMA_IPV4_PROTO_GET_MIN_LEN) { - if (adf_nbuf_data_is_icmp_pkt(data)) { - if (len >= WMA_ICMP_SUBTYPE_GET_MIN_LEN) - return adf_nbuf_data_get_icmp_subtype(data); - VOS_TRACE(VOS_MODULE_ID_WDA, - VOS_TRACE_LEVEL_ERROR, "ICMP Packet"); - return ADF_PROTO_INVALID; - } else if (adf_nbuf_data_is_ipv4_udp_pkt(data)) { - return ADF_PROTO_IPV4_UDP; - } else if (adf_nbuf_data_is_ipv4_tcp_pkt(data)) { - return ADF_PROTO_IPV4_TCP; - } - } - if (len >= WMA_IPV6_PROTO_GET_MIN_LEN) { - if (adf_nbuf_data_is_icmpv6_pkt(data)) { - if (len >= WMA_ICMPV6_SUBTYPE_GET_MIN_LEN) - return adf_nbuf_data_get_icmpv6_subtype(data); - VOS_TRACE(VOS_MODULE_ID_WDA, - VOS_TRACE_LEVEL_ERROR, "ICMPV6 Packet"); - return ADF_PROTO_INVALID; - } else if (adf_nbuf_data_is_ipv6_udp_pkt(data)) { - return ADF_PROTO_IPV6_UDP; - } else if (adf_nbuf_data_is_ipv6_tcp_pkt(data)) { - return ADF_PROTO_IPV6_TCP; + uint16_t ether_type = (uint16_t)(*(uint16_t *)(data + + ADF_NBUF_TRAC_ETH_TYPE_OFFSET)); + + WMA_LOGE("Ether Type: 0x%04x", + adf_os_cpu_to_be16(ether_type)); + + if (ADF_NBUF_TRAC_EAPOL_ETH_TYPE == + adf_os_cpu_to_be16(ether_type)) { + if (len >= WMA_EAPOL_SUBTYPE_GET_MIN_LEN) + return adf_nbuf_data_get_eapol_subtype(data); + VOS_TRACE(VOS_MODULE_ID_WDA, + VOS_TRACE_LEVEL_ERROR, "EAPOL Packet"); + return ADF_PROTO_INVALID; + } else if (ADF_NBUF_TRAC_ARP_ETH_TYPE == + adf_os_cpu_to_be16(ether_type)) { + if (len >= WMA_ARP_SUBTYPE_GET_MIN_LEN) + return adf_nbuf_data_get_arp_subtype(data); + VOS_TRACE(VOS_MODULE_ID_WDA, + VOS_TRACE_LEVEL_ERROR, "ARP Packet"); + return ADF_PROTO_INVALID; + } else if (ADF_NBUF_TRAC_IPV4_ETH_TYPE == + adf_os_cpu_to_be16(ether_type)) { + if (len >= WMA_IPV4_PROTO_GET_MIN_LEN) { + uint8_t proto_type; + + proto_type = adf_nbuf_data_get_ipv4_proto(data); + WMA_LOGE("IPV4_proto_type: %u", proto_type); + if (proto_type == ADF_NBUF_TRAC_ICMP_TYPE) { + if (len >= WMA_ICMP_SUBTYPE_GET_MIN_LEN) + return adf_nbuf_data_get_icmp_subtype( + data); + VOS_TRACE(VOS_MODULE_ID_WDA, + VOS_TRACE_LEVEL_ERROR, "ICMP Packet"); + return ADF_PROTO_INVALID; + } else if (proto_type == ADF_NBUF_TRAC_UDP_TYPE) { + if (len >= WMA_IS_DHCP_GET_MIN_LEN) { + if (adf_nbuf_data_is_dhcp_pkt(data) == + A_STATUS_OK) { + if (len >= + WMA_DHCP_SUBTYPE_GET_MIN_LEN) + return adf_nbuf_data_get_dhcp_subtype(data); + VOS_TRACE(VOS_MODULE_ID_WDA, + VOS_TRACE_LEVEL_ERROR, + "DHCP Packet"); + return ADF_PROTO_INVALID; + } + } + return ADF_PROTO_IPV4_UDP; + } else if (proto_type == ADF_NBUF_TRAC_TCP_TYPE) { + return ADF_PROTO_IPV4_TCP; + } + } + VOS_TRACE(VOS_MODULE_ID_WDA, + VOS_TRACE_LEVEL_ERROR, "IPV4 Packet"); + return ADF_PROTO_INVALID; + } else if (ADF_NBUF_TRAC_IPV6_ETH_TYPE == + adf_os_cpu_to_be16(ether_type)) { + if (len >= WMA_IPV6_PROTO_GET_MIN_LEN) { + uint8_t proto_type; + + proto_type = adf_nbuf_data_get_ipv6_proto(data); + WMA_LOGE("IPV6_proto_type: %u", proto_type); + if (proto_type == ADF_NBUF_TRAC_ICMPV6_TYPE) { + if (len >= WMA_ICMPV6_SUBTYPE_GET_MIN_LEN) + return adf_nbuf_data_get_icmpv6_subtype( + data); + VOS_TRACE(VOS_MODULE_ID_WDA, + VOS_TRACE_LEVEL_ERROR, "ICMPV6 Packet"); + return ADF_PROTO_INVALID; + } else if (proto_type == ADF_NBUF_TRAC_UDP_TYPE) { + return ADF_PROTO_IPV6_UDP; + } else if (proto_type == ADF_NBUF_TRAC_TCP_TYPE) { + return ADF_PROTO_IPV6_TCP; + } } + VOS_TRACE(VOS_MODULE_ID_WDA, + VOS_TRACE_LEVEL_ERROR, "IPV6 Packet"); + return ADF_PROTO_INVALID; } return ADF_PROTO_INVALID; @@ -21193,10 +21219,11 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, { enum adf_proto_subtype proto_subtype; uint16_t pkt_len, key_len, seq_num; + uint16_t src_port, dst_port; uint32_t transaction_id, tcp_seq_num; WMA_LOGD("wow_buf_pkt_len: %u", buf_len); - if (buf_len >= ADF_NBUF_TRAC_ETH_TYPE_OFFSET) + if (buf_len >= ADF_NBUF_TRAC_IPV4_OFFSET) WMA_LOGE("Src_mac: " MAC_ADDRESS_STR " Dst_mac: " MAC_ADDRESS_STR, MAC_ADDR_ARRAY(data + ADF_NBUF_SRC_MAC_OFFSET), MAC_ADDR_ARRAY(data)); @@ -21286,8 +21313,15 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, if (buf_len >= WMA_IPV4_PKT_INFO_GET_MIN_LEN) { pkt_len = (uint16_t)(*(uint16_t *)(data + IPV4_PKT_LEN_OFFSET)); + src_port = (uint16_t)(*(uint16_t *)(data + + IPV4_SRC_PORT_OFFSET)); + dst_port = (uint16_t)(*(uint16_t *)(data + + IPV4_DST_PORT_OFFSET)); WMA_LOGE("Pkt_len: %u", adf_os_cpu_to_be16(pkt_len)); + WMA_LOGE("src_port: %u, dst_port: %u", + adf_os_cpu_to_be16(src_port), + adf_os_cpu_to_be16(dst_port)); if (proto_subtype == ADF_PROTO_IPV4_TCP) { tcp_seq_num = (uint32_t)(*(uint32_t *)(data + IPV4_TCP_SEQ_NUM_OFFSET)); @@ -21304,8 +21338,15 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data, if (buf_len >= WMA_IPV6_PKT_INFO_GET_MIN_LEN) { pkt_len = (uint16_t)(*(uint16_t *)(data + IPV6_PKT_LEN_OFFSET)); + src_port = (uint16_t)(*(uint16_t *)(data + + IPV6_SRC_PORT_OFFSET)); + dst_port = (uint16_t)(*(uint16_t *)(data + + IPV6_DST_PORT_OFFSET)); WMA_LOGE("Pkt_len: %u", adf_os_cpu_to_be16(pkt_len)); + WMA_LOGE("src_port: %u, dst_port: %u", + adf_os_cpu_to_be16(src_port), + adf_os_cpu_to_be16(dst_port)); if (proto_subtype == ADF_PROTO_IPV6_TCP) { tcp_seq_num = (uint32_t)(*(uint32_t *)(data + IPV6_TCP_SEQ_NUM_OFFSET)); diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h index 5baee7588daf..d9587bc8f85f 100644 --- a/CORE/SERVICES/WMA/wma.h +++ b/CORE/SERVICES/WMA/wma.h @@ -182,13 +182,11 @@ #define WMA_MCAST_IPV6_MAC_ADDR (0x33) #define WMA_ICMP_PROTOCOL (0x01) -#define WMA_IS_EAPOL_GET_MIN_LEN 14 #define WMA_EAPOL_SUBTYPE_GET_MIN_LEN 21 #define WMA_EAPOL_INFO_GET_MIN_LEN 23 #define WMA_IS_DHCP_GET_MIN_LEN 38 #define WMA_DHCP_SUBTYPE_GET_MIN_LEN 0x11D #define WMA_DHCP_INFO_GET_MIN_LEN 50 -#define WMA_IS_ARP_GET_MIN_LEN 14 #define WMA_ARP_SUBTYPE_GET_MIN_LEN 22 #define WMA_IPV4_PROTO_GET_MIN_LEN 24 #define WMA_IPV4_PKT_INFO_GET_MIN_LEN 42 |
