summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimanshu Agarwal <himanaga@qti.qualcomm.com>2016-08-04 00:09:08 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-08-04 15:36:52 +0530
commit32814c83a95f7dc599b4476421b081b0fb5d9c1c (patch)
treefc3aec0adc8145a4b0ce240639cc84e387b0ba20
parentd426d9af21d20a8775e62b6f334be83cc88a8171 (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.c52
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.h18
-rw-r--r--CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h1
-rw-r--r--CORE/SERVICES/WMA/wma.c22
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++;
}