Browse Source

qcacld-3.0: Update ICMP and ICMPV6 WOW wake up stats

qcacld-2.0 to qcacld-3.0 propagation

Currently ICMP counter is incremented only for IPV4 multicast packets.
But ICMP count includes total unicast/multicast/broadcast ICMP packets.

Add changes to update ICMP counter for unicast/multicast/broadcast
ICMP packets.

Change-Id: I00f9fb0c8231fd69f6c108ced8028eb19315006e
CRs-Fixed: 1020079
Sreelakshmi Konamki 8 years ago
parent
commit
e1cd51f194
4 changed files with 45 additions and 1 deletions
  1. 14 0
      core/hdd/src/wlan_hdd_cfg80211.c
  2. 4 0
      core/mac/inc/sir_api.h
  3. 7 0
      core/wma/inc/wma.h
  4. 20 1
      core/wma/src/wma_features.c

+ 14 - 0
core/hdd/src/wlan_hdd_cfg80211.c

@@ -6878,6 +6878,7 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
 	uint32_t nl_buf_len;
 	uint32_t total_rx_data_wake, rx_multicast_cnt;
 	uint32_t ipv6_rx_multicast_addr_cnt;
+	uint32_t icmpv6_cnt;
 
 	ENTER();
 
@@ -6907,6 +6908,9 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
 			data->wow_ipv6_mcast_ns_stats);
 	hdd_log(LOG1, "wow_ipv6_mcast_na_stats %d",
 			data->wow_ipv6_mcast_na_stats);
+	hdd_log(LOG1, "wow_icmpv4_count %d", data->wow_icmpv4_count);
+	hdd_log(LOG1, "wow_icmpv6_uc_bc_count %d",
+			data->wow_icmpv6_uc_bc_count);
 
 	ipv6_rx_multicast_addr_cnt =
 		data->wow_ipv6_mcast_wake_up_count +
@@ -6914,6 +6918,12 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
 		data->wow_ipv6_mcast_ns_stats +
 		data->wow_ipv6_mcast_na_stats;
 
+	icmpv6_cnt =
+		data->wow_icmpv6_uc_bc_count +
+		data->wow_ipv6_mcast_ra_stats +
+		data->wow_ipv6_mcast_ns_stats +
+		data->wow_ipv6_mcast_na_stats;
+
 	rx_multicast_cnt =
 		data->wow_ipv4_mcast_wake_up_count +
 		ipv6_rx_multicast_addr_cnt;
@@ -6937,6 +6947,10 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
 				rx_multicast_cnt) ||
 	    nla_put_u32(skb, PARAM_RX_BROADCAST_CNT,
 				data->wow_bcast_wake_up_count) ||
+	    nla_put_u32(skb, PARAM_ICMP_PKT,
+				data->wow_icmpv4_count) ||
+	    nla_put_u32(skb, PARAM_ICMP6_PKT,
+				icmpv6_cnt) ||
 	    nla_put_u32(skb, PARAM_ICMP6_RA,
 				data->wow_ipv6_mcast_ra_stats) ||
 	    nla_put_u32(skb, PARAM_ICMP6_NA,

+ 4 - 0
core/mac/inc/sir_api.h

@@ -5944,6 +5944,8 @@ struct sir_bpf_get_offload {
  * @wow_ipv6_mcast_ra_stats: ipv6 multicast ra stats
  * @wow_ipv6_mcast_ns_stats: ipv6 multicast ns stats
  * @wow_ipv6_mcast_na_stats: ipv6 multicast na stats
+ * @wow_icmpv4_count: ipv4 icmp packet count
+ * @wow_icmpv6_uc_bc_count: ipv6 icmp packet count for unicast and broadcast
  */
 struct sir_wake_lock_stats {
 	uint32_t wow_ucast_wake_up_count;
@@ -5953,6 +5955,8 @@ struct sir_wake_lock_stats {
 	uint32_t wow_ipv6_mcast_ra_stats;
 	uint32_t wow_ipv6_mcast_ns_stats;
 	uint32_t wow_ipv6_mcast_na_stats;
+	uint32_t wow_icmpv4_count;
+	uint32_t wow_icmpv6_uc_bc_count;
 };
 
 /**

+ 7 - 0
core/wma/inc/wma.h

@@ -158,6 +158,8 @@
 #define WMA_ICMP_V6_HEADER_OFFSET (6 + 6 + 2 + 6)
 /* WMA_ICMP_V6_TYPE_OFFSET = sa(6) + da(6) + eth_type(2) + 40 */
 #define WMA_ICMP_V6_TYPE_OFFSET (6 + 6 + 2 + 40)
+/* WMA_IPV4_PROTOCOL = sa(6) + da(6) + eth_type(2) + 9 */
+#define WMA_IPV4_PROTOCOL (6 + 6 + 2 + 9)
 #define WMA_ICMP_V6_HEADER_TYPE (0x3A)
 #define WMA_ICMP_V6_RA_TYPE (0x86)
 #define WMA_ICMP_V6_NS_TYPE (0x87)
@@ -165,6 +167,7 @@
 #define WMA_BCAST_MAC_ADDR (0xFF)
 #define WMA_MCAST_IPV4_MAC_ADDR (0x01)
 #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
@@ -1263,6 +1266,8 @@ struct extended_caps {
  * @wow_ipv6_mcast_ra_stats: WoW IPV6 mcast RA packet wake up count
  * @wow_ipv6_mcast_ns_stats: WoW IPV6 mcast NS packet wake up count
  * @wow_ipv6_mcast_na_stats: WoW IPV6 mcast NA packet wake up count
+ * @wow_icmpv4_count: WoW ipv4 icmp packet wake up count
+ * @wow_icmpv6_uc_bc_count: WoW ipv6 icmp packet count for unicast and broadcast
  * @dual_mac_cfg: Dual mac configuration params for scan and fw mode
  *
  * @max_scan:  maximum scan requests than can be queued
@@ -1423,6 +1428,8 @@ typedef struct {
 	uint32_t wow_ipv6_mcast_ra_stats;
 	uint32_t wow_ipv6_mcast_ns_stats;
 	uint32_t wow_ipv6_mcast_na_stats;
+	uint32_t wow_icmpv4_count;
+	uint32_t wow_icmpv6_uc_bc_count;
 	uint32_t wow_oem_response_wake_up_count;
 
 	/* OCB request contexts */

+ 20 - 1
core/wma/src/wma_features.c

@@ -2369,7 +2369,7 @@ static const u8 *wma_wow_wake_reason_str(A_INT32 wake_reason)
  */
 static void wma_wow_wake_up_stats_display(tp_wma_handle wma)
 {
-	WMA_LOGA("uc %d bc %d v4_mc %d v6_mc %d ra %d ns %d na %d pno_match %d pno_complete %d gscan %d low_rssi %d rssi_breach %d oem %d",
+	WMA_LOGA("uc %d bc %d v4_mc %d v6_mc %d ra %d ns %d na %d pno_match %d pno_complete %d gscan %d low_rssi %d rssi_breach %d icmp %d icmpv6 %d oem %d",
 		wma->wow_ucast_wake_up_count,
 		wma->wow_bcast_wake_up_count,
 		wma->wow_ipv4_mcast_wake_up_count,
@@ -2382,6 +2382,8 @@ static void wma_wow_wake_up_stats_display(tp_wma_handle wma)
 		wma->wow_gscan_wake_up_count,
 		wma->wow_low_rssi_wake_up_count,
 		wma->wow_rssi_breach_wake_up_count,
+		wma->wow_icmpv4_count,
+		wma->wow_icmpv6_uc_bc_count,
 		wma->wow_oem_response_wake_up_count);
 
 	return;
@@ -2444,8 +2446,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 (WMA_ICMP_PROTOCOL == *(data + WMA_IPV4_PROTOCOL))
+				wma->wow_icmpv4_count++;
+			if ((len > WMA_ICMP_V6_TYPE_OFFSET) &&
+			    (WMA_ICMP_V6_HEADER_TYPE ==
+			     *(data + WMA_ICMP_V6_HEADER_OFFSET)))
+				wma->wow_icmpv6_uc_bc_count++;
 		} else if (WMA_MCAST_IPV4_MAC_ADDR == *data) {
 			wma->wow_ipv4_mcast_wake_up_count++;
+			if (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++;
 			if (len > WMA_ICMP_V6_TYPE_OFFSET)
@@ -2454,6 +2464,12 @@ 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 (WMA_ICMP_PROTOCOL == *(data + WMA_IPV4_PROTOCOL))
+				wma->wow_icmpv4_count++;
+			if ((len > WMA_ICMP_V6_TYPE_OFFSET) &&
+			    (WMA_ICMP_V6_HEADER_TYPE ==
+			     *(data + WMA_ICMP_V6_HEADER_OFFSET)))
+				wma->wow_icmpv6_uc_bc_count++;
 		}
 		break;
 
@@ -7944,6 +7960,9 @@ QDF_STATUS wma_get_wakelock_stats(struct sir_wake_lock_stats *wake_lock_stats)
 			wma_handle->wow_ipv6_mcast_ns_stats;
 	wake_lock_stats->wow_ipv6_mcast_na_stats =
 			wma_handle->wow_ipv6_mcast_na_stats;
+	wake_lock_stats->wow_icmpv4_count = wma_handle->wow_icmpv4_count;
+	wake_lock_stats->wow_icmpv6_uc_bc_count =
+			wma_handle->wow_icmpv6_uc_bc_count;
 
 	return QDF_STATUS_SUCCESS;
 }