summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimanshu Agarwal <himanaga@codeaurora.org>2016-08-25 18:55:28 +0530
committerAnjaneedevi Kapparapu <akappa@codeaurora.org>2016-08-29 17:32:57 +0530
commit09462a35c897b994262e70053430287c30a5e28f (patch)
treea94e73072bfcf078cb5f7374664ca56c445c054a
parentf60821b16967d1b4490ea03397f94bb2aa5ccb55 (diff)
qcacld-2.0: Add proto tracing for ARP, NS and NA packets
Add proto tracing for ARP, ICMPv6 NS and ICMPv6 NA packets. Change-Id: I7735d6d6be1e5c7e0249ee99b30316cfbc69a3f9 CRs-Fixed: 1056328
-rw-r--r--CORE/HDD/inc/wlan_hdd_cfg.h6
-rw-r--r--CORE/HDD/src/wlan_hdd_cfg80211.c1
-rw-r--r--CORE/HDD/src/wlan_hdd_softap_tx_rx.c44
-rw-r--r--CORE/HDD/src/wlan_hdd_tx_rx.c44
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.c43
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_nbuf.h7
-rw-r--r--CORE/VOSS/inc/vos_packet.h4
-rw-r--r--CORE/VOSS/src/vos_packet.c61
8 files changed, 155 insertions, 55 deletions
diff --git a/CORE/HDD/inc/wlan_hdd_cfg.h b/CORE/HDD/inc/wlan_hdd_cfg.h
index 750b9897f827..a9671d2cfddc 100644
--- a/CORE/HDD/inc/wlan_hdd_cfg.h
+++ b/CORE/HDD/inc/wlan_hdd_cfg.h
@@ -2685,12 +2685,16 @@ This feature requires the dependent cfg.ini "gRoamPrefer5GHz" set to 1 */
* 0x1 - Enable mgmt pkt logs (no probe req/rsp).
* 0x2 - Enable EAPOL pkt logs.
* 0x4 - Enable DHCP pkt logs.
+ * 0x8 - Enable mgmt. action pkt logs.
+ * 0x10 - Enable ARP packet logs.
+ * 0x20 - Enable ICMPv6 NS packet logs.
+ * 0x40 - Enable ICMPv6 NA packet logs.
* 0x0 - Disable all the above connection related logs.
*/
#define CFG_ENABLE_DEBUG_CONNECT_ISSUE "gEnableDebugLog"
#define CFG_ENABLE_DEBUG_CONNECT_ISSUE_MIN (0)
#define CFG_ENABLE_DEBUG_CONNECT_ISSUE_MAX (0xFF)
-#define CFG_ENABLE_DEBUG_CONNECT_ISSUE_DEFAULT (6)
+#define CFG_ENABLE_DEBUG_CONNECT_ISSUE_DEFAULT (0x76)
/*
* RX packet handling options
diff --git a/CORE/HDD/src/wlan_hdd_cfg80211.c b/CORE/HDD/src/wlan_hdd_cfg80211.c
index 1ccf95085233..2e4015d63c08 100644
--- a/CORE/HDD/src/wlan_hdd_cfg80211.c
+++ b/CORE/HDD/src/wlan_hdd_cfg80211.c
@@ -19671,6 +19671,7 @@ static int __wlan_hdd_cfg80211_disconnect( struct wiphy *wiphy,
VOS_TRACE(VOS_MODULE_ID_HDD, VOS_TRACE_LEVEL_INFO,
FL("convert to internal reason %d to reasonCode %d"),
reason, reasonCode);
+ vos_pkt_trace_buf_dump();
pScanInfo = &pAdapter->scan_info;
if (pScanInfo->mScanPending) {
hddLog(VOS_TRACE_LEVEL_INFO, "Disconnect is in progress, "
diff --git a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
index e277a127232d..53c4bfdd544b 100644
--- a/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_softap_tx_rx.c
@@ -365,13 +365,24 @@ int __hdd_softap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
/* Proto Trace enabled */
proto_type = vos_pkt_get_proto_type(skb,
hddCtxt->cfg_ini->gEnableDebugLog, 0);
- if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
- {
+ switch (proto_type) {
+ case VOS_PKT_TRAC_TYPE_EAPOL:
vos_pkt_trace_buf_update("HA:T:EPL");
- }
- else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
- {
+ break;
+ case VOS_PKT_TRAC_TYPE_DHCP:
hdd_dhcp_pkt_trace_buf_update(skb, TX_PATH, AP);
+ break;
+ case VOS_PKT_TRAC_TYPE_ARP:
+ vos_pkt_trace_buf_update("HA:T:ARP");
+ break;
+ case VOS_PKT_TRAC_TYPE_NS:
+ vos_pkt_trace_buf_update("HA:T:NS");
+ break;
+ case VOS_PKT_TRAC_TYPE_NA:
+ vos_pkt_trace_buf_update("HA:T:NA");
+ break;
+ default:
+ break;
}
}
#endif /* QCA_PKT_PROTO_TRACE */
@@ -845,10 +856,25 @@ VOS_STATUS hdd_softap_rx_packet_cbk(v_VOID_t *vosContext,
(pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP)) {
proto_type = vos_pkt_get_proto_type(skb,
pHddCtx->cfg_ini->gEnableDebugLog, 0);
- if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
- vos_pkt_trace_buf_update("HA:R:EPL");
- else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
- hdd_dhcp_pkt_trace_buf_update(skb, RX_PATH, AP);
+ switch (proto_type) {
+ case VOS_PKT_TRAC_TYPE_EAPOL:
+ vos_pkt_trace_buf_update("HA:R:EPL");
+ break;
+ case VOS_PKT_TRAC_TYPE_DHCP:
+ hdd_dhcp_pkt_trace_buf_update(skb, RX_PATH, AP);
+ break;
+ case VOS_PKT_TRAC_TYPE_ARP:
+ vos_pkt_trace_buf_update("HA:R:ARP");
+ break;
+ case VOS_PKT_TRAC_TYPE_NS:
+ vos_pkt_trace_buf_update("HA:R:NS");
+ break;
+ case VOS_PKT_TRAC_TYPE_NA:
+ vos_pkt_trace_buf_update("HA:R:NA");
+ break;
+ default:
+ break;
+ }
}
#endif /* QCA_PKT_PROTO_TRACE */
diff --git a/CORE/HDD/src/wlan_hdd_tx_rx.c b/CORE/HDD/src/wlan_hdd_tx_rx.c
index 8998c3de68bc..b7d3ea96e3cb 100644
--- a/CORE/HDD/src/wlan_hdd_tx_rx.c
+++ b/CORE/HDD/src/wlan_hdd_tx_rx.c
@@ -621,13 +621,24 @@ int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
proto_type = vos_pkt_get_proto_type(skb,
hddCtxt->cfg_ini->gEnableDebugLog, 0);
- if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
- {
+ switch (proto_type) {
+ case VOS_PKT_TRAC_TYPE_EAPOL:
vos_pkt_trace_buf_update("ST:T:EPL");
- }
- else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
- {
+ break;
+ case VOS_PKT_TRAC_TYPE_DHCP:
hdd_dhcp_pkt_trace_buf_update(skb, TX_PATH, STA);
+ break;
+ case VOS_PKT_TRAC_TYPE_ARP:
+ vos_pkt_trace_buf_update("ST:T:ARP");
+ break;
+ case VOS_PKT_TRAC_TYPE_NS:
+ vos_pkt_trace_buf_update("ST:T:NS");
+ break;
+ case VOS_PKT_TRAC_TYPE_NA:
+ vos_pkt_trace_buf_update("ST:T:NA");
+ break;
+ default:
+ break;
}
}
#endif /* QCA_PKT_PROTO_TRACE */
@@ -1248,10 +1259,25 @@ VOS_STATUS hdd_rx_packet_cbk(v_VOID_t *vosContext,
(pHddCtx->cfg_ini->gEnableDebugLog & VOS_PKT_TRAC_TYPE_DHCP)) {
proto_type = vos_pkt_get_proto_type(skb,
pHddCtx->cfg_ini->gEnableDebugLog, 0);
- if (VOS_PKT_TRAC_TYPE_EAPOL & proto_type)
- vos_pkt_trace_buf_update("ST:R:EPL");
- else if (VOS_PKT_TRAC_TYPE_DHCP & proto_type)
- hdd_dhcp_pkt_trace_buf_update(skb, RX_PATH, STA);
+ switch (proto_type) {
+ case VOS_PKT_TRAC_TYPE_EAPOL:
+ vos_pkt_trace_buf_update("ST:R:EPL");
+ break;
+ case VOS_PKT_TRAC_TYPE_DHCP:
+ hdd_dhcp_pkt_trace_buf_update(skb, RX_PATH, STA);
+ break;
+ case VOS_PKT_TRAC_TYPE_ARP:
+ vos_pkt_trace_buf_update("ST:R:ARP");
+ break;
+ case VOS_PKT_TRAC_TYPE_NS:
+ vos_pkt_trace_buf_update("ST:R:NS");
+ break;
+ case VOS_PKT_TRAC_TYPE_NA:
+ vos_pkt_trace_buf_update("ST:R:NA");
+ break;
+ default:
+ break;
+ }
}
#endif /* QCA_PKT_PROTO_TRACE */
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.c b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
index cccf4e743fff..fb4dcfa176ce 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.c
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.c
@@ -747,6 +747,12 @@ __adf_nbuf_data_get_icmpv6_subtype(uint8_t *data)
case ICMPV6_RESPONSE:
proto_subtype = ADF_PROTO_ICMPV6_RES;
break;
+ case ICMPV6_NS:
+ proto_subtype = ADF_PROTO_ICMPV6_NS;
+ break;
+ case ICMPV6_NA:
+ proto_subtype = ADF_PROTO_ICMPV6_NA;
+ break;
default:
break;
}
@@ -1148,22 +1154,33 @@ __adf_nbuf_trace_update(struct sk_buff *buf, char *event_string)
NBUF_PKT_TRAC_MAX_STRING);
adf_os_mem_copy(string_buf,
event_string, adf_os_str_len(event_string));
- if (NBUF_PKT_TRAC_TYPE_EAPOL &
- adf_nbuf_trace_get_proto_type(buf)) {
+ switch (adf_nbuf_trace_get_proto_type(buf)) {
+ case NBUF_PKT_TRAC_TYPE_EAPOL:
adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
- "EPL",
- NBUF_PKT_TRAC_PROTO_STRING);
- }
- else if (NBUF_PKT_TRAC_TYPE_DHCP &
- adf_nbuf_trace_get_proto_type(buf)) {
+ "EPL", NBUF_PKT_TRAC_PROTO_STRING);
+ break;
+ case NBUF_PKT_TRAC_TYPE_DHCP:
+ adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
+ "DHC", NBUF_PKT_TRAC_PROTO_STRING);
+ break;
+ case NBUF_PKT_TRAC_TYPE_MGMT_ACTION:
+ adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
+ "MACT", NBUF_PKT_TRAC_PROTO_STRING);
+ break;
+ case NBUF_PKT_TRAC_TYPE_ARP:
+ adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
+ "ARP", NBUF_PKT_TRAC_PROTO_STRING);
+ break;
+ case NBUF_PKT_TRAC_TYPE_NS:
adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
- "DHC",
- NBUF_PKT_TRAC_PROTO_STRING);
- } else if (NBUF_PKT_TRAC_TYPE_MGMT_ACTION &
- adf_nbuf_trace_get_proto_type(buf)) {
+ "NS", NBUF_PKT_TRAC_PROTO_STRING);
+ break;
+ case NBUF_PKT_TRAC_TYPE_NA:
adf_os_mem_copy(string_buf + adf_os_str_len(event_string),
- "MACT",
- NBUF_PKT_TRAC_PROTO_STRING);
+ "NA", NBUF_PKT_TRAC_PROTO_STRING);
+ break;
+ default:
+ break;
}
trace_update_cb(string_buf);
diff --git a/CORE/SERVICES/COMMON/adf/adf_nbuf.h b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
index 3540a66035a3..0be7147ba571 100644
--- a/CORE/SERVICES/COMMON/adf/adf_nbuf.h
+++ b/CORE/SERVICES/COMMON/adf/adf_nbuf.h
@@ -53,6 +53,8 @@
#define NBUF_PKT_TRAC_TYPE_DHCP 0x04
#define NBUF_PKT_TRAC_TYPE_MGMT_ACTION 0x08
#define NBUF_PKT_TRAC_TYPE_ARP 0x10
+#define NBUF_PKT_TRAC_TYPE_NS 0x20
+#define NBUF_PKT_TRAC_TYPE_NA 0x40
#define NBUF_PKT_TRAC_MAX_STRING 12
#define NBUF_PKT_TRAC_PROTO_STRING 4
#define ADF_NBUF_PKT_ERROR 1
@@ -176,7 +178,8 @@ struct mon_rx_status {
#define ICMPV6_SUBTYPE_OFFSET 54
#define ICMPV6_REQUEST 0x80
#define ICMPV6_RESPONSE 0x81
-
+#define ICMPV6_NS 0x87
+#define ICMPV6_NA 0x88
#define ADF_NBUF_IPA_CHECK_MASK 0x80000000
enum adf_proto_type {
@@ -207,6 +210,8 @@ enum adf_proto_subtype {
ADF_PROTO_ICMP_RES,
ADF_PROTO_ICMPV6_REQ,
ADF_PROTO_ICMPV6_RES,
+ ADF_PROTO_ICMPV6_NS,
+ ADF_PROTO_ICMPV6_NA,
ADF_PROTO_IPV4_UDP,
ADF_PROTO_IPV4_TCP,
ADF_PROTO_IPV6_UDP,
diff --git a/CORE/VOSS/inc/vos_packet.h b/CORE/VOSS/inc/vos_packet.h
index 469da0a1a923..6d86b3a2f16d 100644
--- a/CORE/VOSS/inc/vos_packet.h
+++ b/CORE/VOSS/inc/vos_packet.h
@@ -62,7 +62,9 @@ typedef struct vos_pkt_t vos_pkt_t;
#define VOS_PKT_TRAC_TYPE_EAPOL NBUF_PKT_TRAC_TYPE_EAPOL
#define VOS_PKT_TRAC_TYPE_DHCP NBUF_PKT_TRAC_TYPE_DHCP
#define VOS_PKT_TRAC_TYPE_MGMT_ACTION NBUF_PKT_TRAC_TYPE_MGMT_ACTION /* Managment action frame */
-
+#define VOS_PKT_TRAC_TYPE_ARP NBUF_PKT_TRAC_TYPE_ARP
+#define VOS_PKT_TRAC_TYPE_NS NBUF_PKT_TRAC_TYPE_NS
+#define VOS_PKT_TRAC_TYPE_NA NBUF_PKT_TRAC_TYPE_NA
#define VOS_PKT_TRAC_DUMP_CMD 9999
/*---------------------------------------------------------------------------
diff --git a/CORE/VOSS/src/vos_packet.c b/CORE/VOSS/src/vos_packet.c
index 9cdcc44dc55e..16228efb25ad 100644
--- a/CORE/VOSS/src/vos_packet.c
+++ b/CORE/VOSS/src/vos_packet.c
@@ -57,6 +57,7 @@
#define VOS_PKT_TRAC_DHCP_SRV_PORT 67
#define VOS_PKT_TRAC_DHCP_CLI_PORT 68
#define VOS_PKT_TRAC_EAPOL_ETH_TYPE 0x888E
+#define VOS_PKT_TRAC_ARP_ETH_TYPE 0x0806
#ifdef QCA_PKT_PROTO_TRACE
#define VOS_PKT_TRAC_MAX_STRING_LEN 40
#define VOS_PKT_TRAC_MAX_TRACE_BUF 50
@@ -257,14 +258,11 @@ v_U8_t vos_pkt_get_proto_type
)
{
v_U8_t pkt_proto_type = 0;
- v_U16_t ether_type;
- v_U16_t SPort;
- v_U16_t DPort;
if (dot11_type)
{
if (dot11_type == (VOS_PKT_TRAC_TYPE_MGMT_ACTION & tracking_map))
- pkt_proto_type |= VOS_PKT_TRAC_TYPE_MGMT_ACTION;
+ pkt_proto_type = VOS_PKT_TRAC_TYPE_MGMT_ACTION;
/* Protocol type map */
return pkt_proto_type;
@@ -273,26 +271,48 @@ v_U8_t vos_pkt_get_proto_type
/* EAPOL Tracking enabled */
if (VOS_PKT_TRAC_TYPE_EAPOL & tracking_map)
{
- ether_type = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_ETH_TYPE_OFFSET));
- if (VOS_PKT_TRAC_EAPOL_ETH_TYPE == VOS_SWAP_U16(ether_type))
- {
- pkt_proto_type |= VOS_PKT_TRAC_TYPE_EAPOL;
+ if (adf_nbuf_is_eapol_pkt(skb) == A_STATUS_OK) {
+ pkt_proto_type = VOS_PKT_TRAC_TYPE_EAPOL;
+ return pkt_proto_type;
}
}
/* DHCP Tracking enabled */
if (VOS_PKT_TRAC_TYPE_DHCP & tracking_map)
{
- SPort = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_IP_OFFSET +
- VOS_PKT_TRAC_IP_HEADER_SIZE));
- DPort = (v_U16_t)(*(v_U16_t *)(skb->data + VOS_PKT_TRAC_IP_OFFSET +
- VOS_PKT_TRAC_IP_HEADER_SIZE + sizeof(v_U16_t)));
- if (((VOS_PKT_TRAC_DHCP_SRV_PORT == VOS_SWAP_U16(SPort)) &&
- (VOS_PKT_TRAC_DHCP_CLI_PORT == VOS_SWAP_U16(DPort))) ||
- ((VOS_PKT_TRAC_DHCP_CLI_PORT == VOS_SWAP_U16(SPort)) &&
- (VOS_PKT_TRAC_DHCP_SRV_PORT == VOS_SWAP_U16(DPort))))
- {
- pkt_proto_type |= VOS_PKT_TRAC_TYPE_DHCP;
+ if (adf_nbuf_is_dhcp_pkt(skb) == A_STATUS_OK) {
+ pkt_proto_type = VOS_PKT_TRAC_TYPE_DHCP;
+ return pkt_proto_type;
+ }
+ }
+
+ /* ARP Tracking enabled */
+ if (VOS_PKT_TRAC_TYPE_ARP & tracking_map) {
+ if (adf_nbuf_is_ipv4_arp_pkt(skb)) {
+ pkt_proto_type = VOS_PKT_TRAC_TYPE_ARP;
+ return pkt_proto_type;
+ }
+ }
+
+ /* IPV6 NS Tracking enabled */
+ if (VOS_PKT_TRAC_TYPE_NS & tracking_map) {
+ if (adf_nbuf_is_icmpv6_pkt(skb)) {
+ if (adf_nbuf_get_icmpv6_subtype(skb) ==
+ ADF_PROTO_ICMPV6_NS) {
+ pkt_proto_type = VOS_PKT_TRAC_TYPE_NS;
+ return pkt_proto_type;
+ }
+ }
+ }
+
+ /* IPV6 NA Tracking enabled */
+ if (VOS_PKT_TRAC_TYPE_NA & tracking_map) {
+ if (adf_nbuf_is_icmpv6_pkt(skb)) {
+ if (adf_nbuf_get_icmpv6_subtype(skb) ==
+ ADF_PROTO_ICMPV6_NA) {
+ pkt_proto_type = VOS_PKT_TRAC_TYPE_NA;
+ return pkt_proto_type;
+ }
}
}
@@ -330,9 +350,8 @@ void vos_pkt_trace_buf_update
do_gettimeofday(&tv);
trace_buffer[slot].event_sec_time = tv.tv_sec;
trace_buffer[slot].event_msec_time = tv.tv_usec;
- strncpy(trace_buffer[slot].event_string, event_string,
- (sizeof(trace_buffer[slot].event_string) < strlen(event_string)?
- sizeof(trace_buffer[slot].event_string) : strlen(event_string)));
+ strlcpy(trace_buffer[slot].event_string, event_string,
+ sizeof(trace_buffer[slot].event_string));
return;
}