summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSreelakshmi Konamki <c_skonam@qti.qualcomm.com>2016-05-24 12:41:54 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-05-24 19:10:18 +0530
commitebedbbb516f4cd702499ee16202ab008fbe16682 (patch)
tree57ce1923c0f8f72ad65fe52102e3dc64cf5c83f4
parentaafc3b94ac8bf65a490b86fd85b7546fe58752bf (diff)
qcacld-2.0: Update ICMP and ICMPV6 WOW wake up stats
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
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c14
-rw-r--r--CORE/MAC/inc/sirApi.h4
-rw-r--r--CORE/SERVICES/WMA/wma.c27
-rw-r--r--CORE/SERVICES/WMA/wma.h5
4 files changed, 42 insertions, 8 deletions
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index d003774ef817..802308df7b1d 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -10392,6 +10392,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();
@@ -10421,6 +10422,8 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
data->wow_ipv6_mcast_ns_stats);
hddLog(LOG1, "wow_ipv6_mcast_na_stats %d",
data->wow_ipv6_mcast_na_stats);
+ hddLog(LOG1, "wow_icmpv4_count %d", data->wow_icmpv4_count);
+ hddLog(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 +
@@ -10428,6 +10431,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;
@@ -10437,7 +10446,6 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
data->wow_bcast_wake_up_count +
rx_multicast_cnt;
-
if (nla_put_u32(skb, PARAM_TOTAL_CMD_EVENT_WAKE, 0) ||
nla_put_u32(skb, PARAM_CMD_EVENT_WAKE_CNT_PTR, 0) ||
nla_put_u32(skb, PARAM_CMD_EVENT_WAKE_CNT_SZ, 0) ||
@@ -10453,9 +10461,9 @@ static uint32_t hdd_send_wakelock_stats(hdd_context_t *hdd_ctx,
nla_put_u32(skb, PARAM_RX_BROADCAST_CNT,
data->wow_bcast_wake_up_count) ||
nla_put_u32(skb, PARAM_ICMP_PKT,
- data->wow_ipv4_mcast_wake_up_count) ||
+ data->wow_icmpv4_count) ||
nla_put_u32(skb, PARAM_ICMP6_PKT,
- ipv6_rx_multicast_addr_cnt) ||
+ icmpv6_cnt) ||
nla_put_u32(skb, PARAM_ICMP6_RA,
data->wow_ipv6_mcast_ra_stats) ||
nla_put_u32(skb, PARAM_ICMP6_NA,
diff --git a/CORE/MAC/inc/sirApi.h b/CORE/MAC/inc/sirApi.h
index 3b4ce2b04ac9..8ceace5b5883 100644
--- a/CORE/MAC/inc/sirApi.h
+++ b/CORE/MAC/inc/sirApi.h
@@ -6842,6 +6842,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;
@@ -6851,6 +6853,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;
};
/**
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 37bd65fba676..2d9c68739b17 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -20599,7 +20599,7 @@ static void wma_extscan_wow_event_callback(void *handle, void *event,
*/
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",
+ 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",
wma->wow_ucast_wake_up_count,
wma->wow_bcast_wake_up_count,
wma->wow_ipv4_mcast_wake_up_count,
@@ -20611,7 +20611,9 @@ static void wma_wow_wake_up_stats_display(tp_wma_handle wma)
wma->wow_pno_complete_wake_up_count,
wma->wow_gscan_wake_up_count,
wma->wow_low_rssi_wake_up_count,
- wma->wow_rssi_breach_wake_up_count);
+ wma->wow_rssi_breach_wake_up_count,
+ wma->wow_icmpv4_count,
+ wma->wow_icmpv6_uc_bc_count);
return;
}
@@ -20675,12 +20677,18 @@ static void wma_wow_wake_up_stats(tp_wma_handle wma, uint8_t *data,
switch(event) {
case WOW_REASON_PATTERN_MATCH_FOUND:
- if (WMA_ICMP_V6_RA_TYPE == *data) {
- wma->wow_ipv6_mcast_ra_stats++;
- } else if (WMA_BCAST_MAC_ADDR == *data) {
+ 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)
@@ -20689,6 +20697,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;
@@ -29356,6 +29370,9 @@ VOS_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 VOS_STATUS_SUCCESS;
}
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index e6c2ff4a96b7..9bd3dee0e2ab 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -170,6 +170,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)
@@ -178,6 +180,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)
typedef struct probeTime_dwellTime {
u_int8_t dwell_time;
@@ -855,6 +858,8 @@ typedef struct wma_handle {
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_wakeup_enable_mask;
uint32_t wow_wakeup_disable_mask;
uint16_t max_mgmt_tx_fail_count;