summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimanshu Agarwal <himanaga@qti.qualcomm.com>2016-07-20 12:43:15 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-07-21 16:44:17 +0530
commit13e59ae0340360641eaad555452a77c48d6f8e2c (patch)
treeb35ee15b5eff974398e7e7e773f1c7cdceec7379
parent28fcd69ee7995184a9584dc182f498c90742c6bf (diff)
qcacld-2.0: Dump more WoW wakeup packet info
Dump more info for WOW wakeup packet: 1) ether_type 2) proto_type in case of IPV4 and IPV6 packets 3) src port and dst port in case of TCP/UDP Change-Id: I1578aa5322af50f0ae43248c48a2f754ea081970 CRs-Fixed: 1043939
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.c40
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.h35
-rw-r--r--CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h2
-rw-r--r--CORE/SERVICES/WMA/wma.c145
-rw-r--r--CORE/SERVICES/WMA/wma.h2
5 files changed, 168 insertions, 56 deletions
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
index 81494f127492..3c26c0fc008d 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
@@ -755,6 +755,44 @@ __adf_nbuf_data_get_icmpv6_subtype(uint8_t *data)
}
/**
+ * __adf_nbuf_data_get_ipv4_proto() - get the proto type
+ * of IPV4 packet.
+ * @data: Pointer to IPV4 packet data buffer
+ *
+ * This func. returns the proto type of IPV4 packet.
+ *
+ * Return: proto type of IPV4 packet.
+ */
+uint8_t
+__adf_nbuf_data_get_ipv4_proto(uint8_t *data)
+{
+ uint8_t proto_type;
+
+ proto_type = (uint8_t)(*(uint8_t *)(data +
+ ADF_NBUF_TRAC_IPV4_PROTO_TYPE_OFFSET));
+ return proto_type;
+}
+
+/**
+ * __adf_nbuf_data_get_ipv6_proto() - get the proto type
+ * of IPV6 packet.
+ * @data: Pointer to IPV6 packet data buffer
+ *
+ * This func. returns the proto type of IPV6 packet.
+ *
+ * Return: proto type of IPV6 packet.
+ */
+uint8_t
+__adf_nbuf_data_get_ipv6_proto(uint8_t *data)
+{
+ uint8_t proto_type;
+
+ proto_type = (uint8_t)(*(uint8_t *)(data +
+ ADF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET));
+ return proto_type;
+}
+
+/**
* __adf_nbuf_data_is_dhcp_pkt() - check if it is DHCP packet.
* @data: Pointer to DHCP packet data buffer
*
@@ -921,7 +959,7 @@ bool __adf_nbuf_data_is_icmpv6_pkt(uint8_t *data)
pkt_type = (uint8_t)(*(uint8_t *)(data +
ADF_NBUF_TRAC_IPV6_PROTO_TYPE_OFFSET));
- if (pkt_type == ADF_NBUF_TRAC_ICMPv6_TYPE)
+ if (pkt_type == ADF_NBUF_TRAC_ICMPV6_TYPE)
return true;
else
return false;
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
index d827ac23393c..43923d582613 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
@@ -73,7 +73,7 @@
#define ADF_NBUF_TRAC_ICMP_TYPE 1
#define ADF_NBUF_TRAC_TCP_TYPE 6
#define ADF_NBUF_TRAC_UDP_TYPE 17
-#define ADF_NBUF_TRAC_ICMPv6_TYPE 0x3a
+#define ADF_NBUF_TRAC_ICMPV6_TYPE 0x3a
#define ADF_NBUF_TRAC_WAI_ETH_TYPE 0x88b4
/* EAPOL Related MASK */
@@ -152,6 +152,8 @@ struct mon_rx_status {
/* IPV4 Related Mask */
#define IPV4_PKT_LEN_OFFSET 16
#define IPV4_TCP_SEQ_NUM_OFFSET 38
+#define IPV4_SRC_PORT_OFFSET 34
+#define IPV4_DST_PORT_OFFSET 36
/* IPV4 ICMP Related Mask */
#define ICMP_SEQ_NUM_OFFSET 40
@@ -162,6 +164,8 @@ struct mon_rx_status {
/* IPV6 Related Mask */
#define IPV6_PKT_LEN_OFFSET 18
#define IPV6_TCP_SEQ_NUM_OFFSET 58
+#define IPV6_SRC_PORT_OFFSET 54
+#define IPV6_DST_PORT_OFFSET 56
/* IPV6 ICMPV6 Related Mask */
#define ICMPV6_SEQ_NUM_OFFSET 60
@@ -1475,6 +1479,35 @@ adf_nbuf_data_get_icmpv6_subtype(uint8_t *data)
return __adf_nbuf_data_get_icmpv6_subtype(data);
}
+/**
+ * adf_nbuf_data_get_ipv4_proto() - get the proto type
+ * of IPV4 packet.
+ * @data: Pointer to IPV4 packet data buffer
+ *
+ * This func. returns the proto type of IPV4 packet.
+ *
+ * Return: proto type of IPV4 packet.
+ */
+static inline uint8_t
+adf_nbuf_data_get_ipv4_proto(uint8_t *data)
+{
+ return __adf_nbuf_data_get_ipv4_proto(data);
+}
+
+/**
+ * adf_nbuf_data_get_ipv6_proto() - get the proto type
+ * of IPV6 packet.
+ * @data: Pointer to IPV6 packet data buffer
+ *
+ * This func. returns the proto type of IPV6 packet.
+ *
+ * Return: proto type of IPV6 packet.
+ */
+static inline uint8_t
+adf_nbuf_data_get_ipv6_proto(uint8_t *data)
+{
+ return __adf_nbuf_data_get_ipv6_proto(data);
+}
/**
* adf_nbuf_is_dhcp_pkt() - check if it is DHCP packet.
diff --git a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
index 7230e5f14444..d19bec300b67 100644
--- a/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
+++ b/CORE/SERVICES/COMMON/adf/linux/adf_nbuf_pvt.h
@@ -404,6 +404,8 @@ enum adf_proto_subtype __adf_nbuf_data_get_eapol_subtype(uint8_t *data);
enum adf_proto_subtype __adf_nbuf_data_get_arp_subtype(uint8_t *data);
enum adf_proto_subtype __adf_nbuf_data_get_icmp_subtype(uint8_t *data);
enum adf_proto_subtype __adf_nbuf_data_get_icmpv6_subtype(uint8_t *data);
+uint8_t __adf_nbuf_data_get_ipv4_proto(uint8_t *data);
+uint8_t __adf_nbuf_data_get_ipv6_proto(uint8_t *data);
bool __adf_nbuf_is_bcast_pkt(uint8_t *data);
bool __adf_nbuf_is_multicast_pkt(uint8_t *data);
bool __adf_nbuf_is_wai_pkt(uint8_t *data);
diff --git a/CORE/SERVICES/WMA/wma.c b/CORE/SERVICES/WMA/wma.c
index 56509bc5d48b..8b3f4b1b7ad9 100644
--- a/CORE/SERVICES/WMA/wma.c
+++ b/CORE/SERVICES/WMA/wma.c
@@ -21119,58 +21119,84 @@ static enum adf_proto_subtype
wma_wow_get_pkt_proto_subtype(uint8_t *data,
uint32_t len)
{
- if (len >= WMA_IS_DHCP_GET_MIN_LEN) {
- if (adf_nbuf_data_is_dhcp_pkt(data) == A_STATUS_OK) {
- if (len >= WMA_DHCP_SUBTYPE_GET_MIN_LEN)
- return adf_nbuf_data_get_dhcp_subtype(data);
- VOS_TRACE(VOS_MODULE_ID_WDA,
- VOS_TRACE_LEVEL_ERROR, "DHCP Packet");
- return ADF_PROTO_INVALID;
- }
- }
- if (len >= WMA_IS_EAPOL_GET_MIN_LEN) {
- if (adf_nbuf_data_is_eapol_pkt(data) == A_STATUS_OK) {
- if (len >= WMA_EAPOL_SUBTYPE_GET_MIN_LEN)
- return adf_nbuf_data_get_eapol_subtype(data);
- VOS_TRACE(VOS_MODULE_ID_WDA,
- VOS_TRACE_LEVEL_ERROR, "EAPOL Packet");
- return ADF_PROTO_INVALID;
- }
- }
- if (len >= WMA_IS_ARP_GET_MIN_LEN) {
- if (adf_nbuf_data_is_ipv4_arp_pkt(data)) {
- if (len >= WMA_ARP_SUBTYPE_GET_MIN_LEN)
- return adf_nbuf_data_get_arp_subtype(data);
- VOS_TRACE(VOS_MODULE_ID_WDA,
- VOS_TRACE_LEVEL_ERROR, "ARP Packet");
- return ADF_PROTO_INVALID;
- }
- }
- if (len >= WMA_IPV4_PROTO_GET_MIN_LEN) {
- if (adf_nbuf_data_is_icmp_pkt(data)) {
- if (len >= WMA_ICMP_SUBTYPE_GET_MIN_LEN)
- return adf_nbuf_data_get_icmp_subtype(data);
- VOS_TRACE(VOS_MODULE_ID_WDA,
- VOS_TRACE_LEVEL_ERROR, "ICMP Packet");
- return ADF_PROTO_INVALID;
- } else if (adf_nbuf_data_is_ipv4_udp_pkt(data)) {
- return ADF_PROTO_IPV4_UDP;
- } else if (adf_nbuf_data_is_ipv4_tcp_pkt(data)) {
- return ADF_PROTO_IPV4_TCP;
- }
- }
- if (len >= WMA_IPV6_PROTO_GET_MIN_LEN) {
- if (adf_nbuf_data_is_icmpv6_pkt(data)) {
- if (len >= WMA_ICMPV6_SUBTYPE_GET_MIN_LEN)
- return adf_nbuf_data_get_icmpv6_subtype(data);
- VOS_TRACE(VOS_MODULE_ID_WDA,
- VOS_TRACE_LEVEL_ERROR, "ICMPV6 Packet");
- return ADF_PROTO_INVALID;
- } else if (adf_nbuf_data_is_ipv6_udp_pkt(data)) {
- return ADF_PROTO_IPV6_UDP;
- } else if (adf_nbuf_data_is_ipv6_tcp_pkt(data)) {
- return ADF_PROTO_IPV6_TCP;
+ uint16_t ether_type = (uint16_t)(*(uint16_t *)(data +
+ ADF_NBUF_TRAC_ETH_TYPE_OFFSET));
+
+ WMA_LOGE("Ether Type: 0x%04x",
+ adf_os_cpu_to_be16(ether_type));
+
+ if (ADF_NBUF_TRAC_EAPOL_ETH_TYPE ==
+ adf_os_cpu_to_be16(ether_type)) {
+ if (len >= WMA_EAPOL_SUBTYPE_GET_MIN_LEN)
+ return adf_nbuf_data_get_eapol_subtype(data);
+ VOS_TRACE(VOS_MODULE_ID_WDA,
+ VOS_TRACE_LEVEL_ERROR, "EAPOL Packet");
+ return ADF_PROTO_INVALID;
+ } else if (ADF_NBUF_TRAC_ARP_ETH_TYPE ==
+ adf_os_cpu_to_be16(ether_type)) {
+ if (len >= WMA_ARP_SUBTYPE_GET_MIN_LEN)
+ return adf_nbuf_data_get_arp_subtype(data);
+ VOS_TRACE(VOS_MODULE_ID_WDA,
+ VOS_TRACE_LEVEL_ERROR, "ARP Packet");
+ return ADF_PROTO_INVALID;
+ } else if (ADF_NBUF_TRAC_IPV4_ETH_TYPE ==
+ adf_os_cpu_to_be16(ether_type)) {
+ if (len >= WMA_IPV4_PROTO_GET_MIN_LEN) {
+ uint8_t proto_type;
+
+ proto_type = adf_nbuf_data_get_ipv4_proto(data);
+ WMA_LOGE("IPV4_proto_type: %u", proto_type);
+ if (proto_type == ADF_NBUF_TRAC_ICMP_TYPE) {
+ if (len >= WMA_ICMP_SUBTYPE_GET_MIN_LEN)
+ return adf_nbuf_data_get_icmp_subtype(
+ data);
+ VOS_TRACE(VOS_MODULE_ID_WDA,
+ VOS_TRACE_LEVEL_ERROR, "ICMP Packet");
+ return ADF_PROTO_INVALID;
+ } else if (proto_type == ADF_NBUF_TRAC_UDP_TYPE) {
+ if (len >= WMA_IS_DHCP_GET_MIN_LEN) {
+ if (adf_nbuf_data_is_dhcp_pkt(data) ==
+ A_STATUS_OK) {
+ if (len >=
+ WMA_DHCP_SUBTYPE_GET_MIN_LEN)
+ return adf_nbuf_data_get_dhcp_subtype(data);
+ VOS_TRACE(VOS_MODULE_ID_WDA,
+ VOS_TRACE_LEVEL_ERROR,
+ "DHCP Packet");
+ return ADF_PROTO_INVALID;
+ }
+ }
+ return ADF_PROTO_IPV4_UDP;
+ } else if (proto_type == ADF_NBUF_TRAC_TCP_TYPE) {
+ return ADF_PROTO_IPV4_TCP;
+ }
+ }
+ VOS_TRACE(VOS_MODULE_ID_WDA,
+ VOS_TRACE_LEVEL_ERROR, "IPV4 Packet");
+ return ADF_PROTO_INVALID;
+ } else if (ADF_NBUF_TRAC_IPV6_ETH_TYPE ==
+ adf_os_cpu_to_be16(ether_type)) {
+ if (len >= WMA_IPV6_PROTO_GET_MIN_LEN) {
+ uint8_t proto_type;
+
+ proto_type = adf_nbuf_data_get_ipv6_proto(data);
+ WMA_LOGE("IPV6_proto_type: %u", proto_type);
+ if (proto_type == ADF_NBUF_TRAC_ICMPV6_TYPE) {
+ if (len >= WMA_ICMPV6_SUBTYPE_GET_MIN_LEN)
+ return adf_nbuf_data_get_icmpv6_subtype(
+ data);
+ VOS_TRACE(VOS_MODULE_ID_WDA,
+ VOS_TRACE_LEVEL_ERROR, "ICMPV6 Packet");
+ return ADF_PROTO_INVALID;
+ } else if (proto_type == ADF_NBUF_TRAC_UDP_TYPE) {
+ return ADF_PROTO_IPV6_UDP;
+ } else if (proto_type == ADF_NBUF_TRAC_TCP_TYPE) {
+ return ADF_PROTO_IPV6_TCP;
+ }
}
+ VOS_TRACE(VOS_MODULE_ID_WDA,
+ VOS_TRACE_LEVEL_ERROR, "IPV6 Packet");
+ return ADF_PROTO_INVALID;
}
return ADF_PROTO_INVALID;
@@ -21193,10 +21219,11 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data,
{
enum adf_proto_subtype proto_subtype;
uint16_t pkt_len, key_len, seq_num;
+ uint16_t src_port, dst_port;
uint32_t transaction_id, tcp_seq_num;
WMA_LOGD("wow_buf_pkt_len: %u", buf_len);
- if (buf_len >= ADF_NBUF_TRAC_ETH_TYPE_OFFSET)
+ if (buf_len >= ADF_NBUF_TRAC_IPV4_OFFSET)
WMA_LOGE("Src_mac: " MAC_ADDRESS_STR " Dst_mac: " MAC_ADDRESS_STR,
MAC_ADDR_ARRAY(data + ADF_NBUF_SRC_MAC_OFFSET),
MAC_ADDR_ARRAY(data));
@@ -21286,8 +21313,15 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data,
if (buf_len >= WMA_IPV4_PKT_INFO_GET_MIN_LEN) {
pkt_len = (uint16_t)(*(uint16_t *)(data +
IPV4_PKT_LEN_OFFSET));
+ src_port = (uint16_t)(*(uint16_t *)(data +
+ IPV4_SRC_PORT_OFFSET));
+ dst_port = (uint16_t)(*(uint16_t *)(data +
+ IPV4_DST_PORT_OFFSET));
WMA_LOGE("Pkt_len: %u",
adf_os_cpu_to_be16(pkt_len));
+ WMA_LOGE("src_port: %u, dst_port: %u",
+ adf_os_cpu_to_be16(src_port),
+ adf_os_cpu_to_be16(dst_port));
if (proto_subtype == ADF_PROTO_IPV4_TCP) {
tcp_seq_num = (uint32_t)(*(uint32_t *)(data +
IPV4_TCP_SEQ_NUM_OFFSET));
@@ -21304,8 +21338,15 @@ static void wma_wow_parse_data_pkt_buffer(uint8_t *data,
if (buf_len >= WMA_IPV6_PKT_INFO_GET_MIN_LEN) {
pkt_len = (uint16_t)(*(uint16_t *)(data +
IPV6_PKT_LEN_OFFSET));
+ src_port = (uint16_t)(*(uint16_t *)(data +
+ IPV6_SRC_PORT_OFFSET));
+ dst_port = (uint16_t)(*(uint16_t *)(data +
+ IPV6_DST_PORT_OFFSET));
WMA_LOGE("Pkt_len: %u",
adf_os_cpu_to_be16(pkt_len));
+ WMA_LOGE("src_port: %u, dst_port: %u",
+ adf_os_cpu_to_be16(src_port),
+ adf_os_cpu_to_be16(dst_port));
if (proto_subtype == ADF_PROTO_IPV6_TCP) {
tcp_seq_num = (uint32_t)(*(uint32_t *)(data +
IPV6_TCP_SEQ_NUM_OFFSET));
diff --git a/CORE/SERVICES/WMA/wma.h b/CORE/SERVICES/WMA/wma.h
index 5baee7588daf..d9587bc8f85f 100644
--- a/CORE/SERVICES/WMA/wma.h
+++ b/CORE/SERVICES/WMA/wma.h
@@ -182,13 +182,11 @@
#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
#define WMA_EAPOL_INFO_GET_MIN_LEN 23
#define WMA_IS_DHCP_GET_MIN_LEN 38
#define WMA_DHCP_SUBTYPE_GET_MIN_LEN 0x11D
#define WMA_DHCP_INFO_GET_MIN_LEN 50
-#define WMA_IS_ARP_GET_MIN_LEN 14
#define WMA_ARP_SUBTYPE_GET_MIN_LEN 22
#define WMA_IPV4_PROTO_GET_MIN_LEN 24
#define WMA_IPV4_PKT_INFO_GET_MIN_LEN 42