From 11a08c08db6b40ee0cc905b4ea01b1c6d0fc22e7 Mon Sep 17 00:00:00 2001 From: Himanshu Agarwal Date: Wed, 10 Aug 2016 15:39:54 +0530 Subject: [PATCH] qcacld-3.0: Add check to find IPV6 mcast packet Propagation from qcacld-2.0 to qcacld-3.0. 1) Add check to find IPV6 mcast packet embedded in a link layer unicast packet in wma_wow_wake_up_stats. 2) Add extra length check for IPV4 packets. Change-Id: Ic2af69032262237b8751019817ae181913346818 CRs-Fixed: 1049254 --- core/wma/src/wma_features.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index ace8d4727eff..fbddc7dcffa2 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -2449,14 +2449,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 (qdf_nbuf_data_is_icmp_pkt(data)) + if (len >= WMA_IPV4_PROTO_GET_MIN_LEN && + qdf_nbuf_data_is_icmp_pkt(data)) wma->wow_icmpv4_count++; else if ((len > WMA_ICMP_V6_TYPE_OFFSET) && qdf_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++; @@ -2466,13 +2468,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 (qdf_nbuf_data_is_ipv4_pkt(data)) { - if (qdf_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 (qdf_nbuf_data_is_ipv4_mcast_pkt(data)) + wma->wow_ipv4_mcast_wake_up_count++; + else if (qdf_nbuf_data_is_ipv6_mcast_pkt(data)) + wma->wow_ipv6_mcast_wake_up_count++; + + if (len >= WMA_IPV4_PROTO_GET_MIN_LEN && + qdf_nbuf_data_is_icmp_pkt(data)) + wma->wow_icmpv4_count++; + else if (len > WMA_ICMP_V6_TYPE_OFFSET && qdf_nbuf_data_is_icmpv6_pkt(data)) wma->wow_icmpv6_count++; }