Prechádzať zdrojové kódy

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
Himanshu Agarwal 8 rokov pred
rodič
commit
11a08c08db
1 zmenil súbory, kde vykonal 13 pridanie a 9 odobranie
  1. 13 9
      core/wma/src/wma_features.c

+ 13 - 9
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++;
 		}