diff options
| author | Himanshu Agarwal <himanaga@codeaurora.org> | 2016-08-25 18:55:28 +0530 |
|---|---|---|
| committer | Anjaneedevi Kapparapu <akappa@codeaurora.org> | 2016-08-29 17:32:57 +0530 |
| commit | 09462a35c897b994262e70053430287c30a5e28f (patch) | |
| tree | a94e73072bfcf078cb5f7374664ca56c445c054a | |
| parent | f60821b16967d1b4490ea03397f94bb2aa5ccb55 (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.h | 6 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_cfg80211.c | 1 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_softap_tx_rx.c | 44 | ||||
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_tx_rx.c | 44 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.c | 43 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_nbuf.h | 7 | ||||
| -rw-r--r-- | CORE/VOSS/inc/vos_packet.h | 4 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_packet.c | 61 |
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; } |
