diff options
| author | Himanshu Agarwal <himanaga@qti.qualcomm.com> | 2016-08-04 00:09:08 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-08-04 15:36:52 +0530 |
| commit | 32814c83a95f7dc599b4476421b081b0fb5d9c1c (patch) | |
| tree | fc3aec0adc8145a4b0ce240639cc84e387b0ba20 | |
| parent | d426d9af21d20a8775e62b6f334be83cc88a8171 (diff) | |
qcacld-2.0: Add API to find IPV6 mcast packet
Add API to find IPV6 mcast packet to use it in wma_wow_wake_up_stats
func. This is required to know if there is a IPV6 mcast packet embedded
in a link layer unicast packet.
Change-Id: Ic2af69032262237b8751019817ae181913346818
CRs-Fixed: 1049254
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.c | 52 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.h | 18 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h | 1 | ||||
| -rw-r--r-- | CORE/SERVICES/WMA/wma.c | 22 |
4 files changed, 73 insertions, 20 deletions
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c index e549f1a49d6b..cccf4e743fff 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c @@ -906,19 +906,51 @@ bool __adf_nbuf_data_is_ipv4_pkt(uint8_t *data) */ bool __adf_nbuf_data_is_ipv4_mcast_pkt(uint8_t *data) { - uint8_t *dst_addr = - (uint8_t *)(data + ADF_NBUF_TRAC_IPV4_DEST_ADDR_OFFSET); - - /* - * Check first byte of the IP address and if it - * from 224 to 239, then it can represent multicast IP. - */ - if (dst_addr[0] >= 224 && dst_addr[0] <= 239) - return true; - else + if (__adf_nbuf_data_is_ipv4_pkt(data)) { + uint8_t *dst_addr = + (uint8_t *)(data + ADF_NBUF_TRAC_IPV4_DEST_ADDR_OFFSET); + + /* + * Check first byte of the IP address and if it + * from 224 to 239, then it can represent multicast IP. + */ + if (dst_addr[0] >= 224 && dst_addr[0] <= 239) + return true; + else + return false; + } else return false; } +/** + * __adf_nbuf_data_is_ipv6_mcast_pkt() - check if it is IPV6 multicast packet. + * @data: Pointer to IPV6 packet data buffer + * + * This func. checks whether it is a IPV6 muticast packet or not. + * + * Return: TRUE if it is a IPV6 multicast packet + * FALSE if not + */ +bool __adf_nbuf_data_is_ipv6_mcast_pkt(uint8_t *data) +{ + if (__adf_nbuf_data_is_ipv6_pkt(data)) { + uint16_t *dst_addr; + + dst_addr = (uint16_t *) + (data + ADF_NBUF_TRAC_IPV6_DEST_ADDR_OFFSET); + + /* + * Check first byte of the IP address and if it + * 0xFF00 then it is a IPV6 mcast packet. + */ + if (*dst_addr == + adf_os_cpu_to_be16(ADF_NBUF_TRAC_IPV6_DEST_ADDR)) + return true; + else + return false; + } else + return false; +} /** * __adf_nbuf_data_is_ipv6_pkt() - check if it is IPV6 packet. diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h index 7e5cb39c13c7..b1d46d8acc90 100644 --- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h +++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h @@ -69,8 +69,10 @@ #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_IPV4_DEST_ADDR_OFFSET 30 +#define ADF_NBUF_TRAC_IPV4_DEST_ADDR_OFFSET 30 #define ADF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET 20 +#define ADF_NBUF_TRAC_IPV6_DEST_ADDR_OFFSET 38 +#define ADF_NBUF_TRAC_IPV6_DEST_ADDR 0xFF00 #define ADF_NBUF_TRAC_ICMP_TYPE 1 #define ADF_NBUF_TRAC_TCP_TYPE 6 #define ADF_NBUF_TRAC_UDP_TYPE 17 @@ -1645,6 +1647,20 @@ bool adf_nbuf_data_is_ipv4_mcast_pkt(uint8_t *data) return __adf_nbuf_data_is_ipv4_mcast_pkt(data); } +/** + * adf_nbuf_data_is_ipv6_mcast_pkt() - check if it is IPV6 multicast packet. + * @data: Pointer to IPV6 packet data buffer + * + * This func. checks whether it is a IPV6 multicast packet or not. + * + * Return: TRUE if it is a IPV6 multicast packet + * FALSE if not + */ +static inline +bool adf_nbuf_data_is_ipv6_mcast_pkt(uint8_t *data) +{ + return __adf_nbuf_data_is_ipv6_mcast_pkt(data); +} /** * adf_nbuf_is_ipv6_pkt() - check if it is IPV6 packet. diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h index 5dc78bf74519..dbedb1050ef6 100644 --- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h +++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h @@ -390,6 +390,7 @@ void __adf_nbuf_dmamap_set_cb(__adf_os_dma_map_t dmap, void *cb, void void __adf_nbuf_reg_trace_cb(adf_nbuf_trace_update_t cb_func_ptr); bool __adf_nbuf_data_is_ipv4_pkt(uint8_t *data); bool __adf_nbuf_data_is_ipv4_mcast_pkt(uint8_t *data); +bool __adf_nbuf_data_is_ipv6_mcast_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); diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c index 5c4fd2b7e52f..90cdcb55375e 100644 --- a/CORE/SERVICES/WMA/wma.c +++ b/CORE/SERVICES/WMA/wma.c @@ -20931,14 +20931,16 @@ static void wma_wow_wake_up_stats(tp_wma_handle wma, uint8_t *data, case WOW_REASON_PATTERN_MATCH_FOUND: if (WMA_BCAST_MAC_ADDR == *data) { wma->wow_bcast_wake_up_count++; - if (adf_nbuf_data_is_icmp_pkt(data)) + if (len >= WMA_IPV4_PROTO_GET_MIN_LEN && + adf_nbuf_data_is_icmp_pkt(data)) wma->wow_icmpv4_count++; else if ((len > WMA_ICMP_V6_TYPE_OFFSET) && adf_nbuf_data_is_icmpv6_pkt(data)) wma->wow_icmpv6_count++; } else if (WMA_MCAST_IPV4_MAC_ADDR == *data) { wma->wow_ipv4_mcast_wake_up_count++; - if (WMA_ICMP_PROTOCOL == *(data + WMA_IPV4_PROTOCOL)) + if (len >= WMA_IPV4_PROTO_GET_MIN_LEN && + WMA_ICMP_PROTOCOL == *(data + WMA_IPV4_PROTOCOL)) wma->wow_icmpv4_count++; } else if (WMA_MCAST_IPV6_MAC_ADDR == *data) { wma->wow_ipv6_mcast_wake_up_count++; @@ -20948,13 +20950,15 @@ static void wma_wow_wake_up_stats(tp_wma_handle wma, uint8_t *data, WMA_LOGA("ICMP_V6 data len %d", len); } else { wma->wow_ucast_wake_up_count++; - if (adf_nbuf_data_is_ipv4_pkt(data)) { - if (adf_nbuf_data_is_ipv4_mcast_pkt(data)) - wma->wow_ipv4_mcast_wake_up_count++; - if (WMA_ICMP_PROTOCOL == - *(data + WMA_IPV4_PROTOCOL)) - wma->wow_icmpv4_count++; - } else if ((len > WMA_ICMP_V6_TYPE_OFFSET) && + if (adf_nbuf_data_is_ipv4_mcast_pkt(data)) + wma->wow_ipv4_mcast_wake_up_count++; + else if (adf_nbuf_data_is_ipv6_mcast_pkt(data)) + wma->wow_ipv6_mcast_wake_up_count++; + + if (len >= WMA_IPV4_PROTO_GET_MIN_LEN && + adf_nbuf_data_is_icmp_pkt(data)) + wma->wow_icmpv4_count++; + else if (len > WMA_ICMP_V6_TYPE_OFFSET && adf_nbuf_data_is_icmpv6_pkt(data)) wma->wow_icmpv6_count++; } |
