From bf4231b6d8315c2028057c9e17635fa6c9d8227f Mon Sep 17 00:00:00 2001 From: "Poddar, Siddarth" Date: Mon, 10 Jul 2017 16:27:01 +0530 Subject: [PATCH] qcacmn: Add support to log ICMPv6 packets in DP Trace Add support to log ICMPv6 packets such as NS/NA, RS/RA and ICMPv6 Req/Res in dp trace. Change-Id: I11aab230b03254ea46c019cdb4488d1439a9504d CRs-Fixed: 2075963 --- qdf/inc/qdf_nbuf.h | 3 ++ qdf/inc/qdf_trace.h | 17 +++++++- qdf/linux/src/i_qdf_nbuf.h | 1 + qdf/linux/src/qdf_trace.c | 87 +++++++++++++++++++++++++++++++++++++- 4 files changed, 105 insertions(+), 3 deletions(-) diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h index 46b983f051..eb01255c5a 100644 --- a/qdf/inc/qdf_nbuf.h +++ b/qdf/inc/qdf_nbuf.h @@ -46,6 +46,7 @@ #define QDF_NBUF_PKT_TRAC_TYPE_MGMT_ACTION 0x08 #define QDF_NBUF_PKT_TRAC_TYPE_ARP 0x10 #define QDF_NBUF_PKT_TRAC_TYPE_ICMP 0x20 +#define QDF_NBUF_PKT_TRAC_TYPE_ICMPv6 0x40 #define QDF_NBUF_PKT_TRAC_MAX_STRING 12 #define QDF_NBUF_PKT_TRAC_PROTO_STRING 4 @@ -278,6 +279,7 @@ struct mon_rx_status { * @QDF_PROTO_TYPE_ARP - ARP * @QDF_PROTO_TYPE_MGMT - MGMT * @QDF_PROTO_TYPE_ICMP - ICMP + * @QDF_PROTO_TYPE_ICMPv6 - ICMPv6 * QDF_PROTO_TYPE_EVENT - EVENT */ enum qdf_proto_type { @@ -286,6 +288,7 @@ enum qdf_proto_type { QDF_PROTO_TYPE_ARP, QDF_PROTO_TYPE_MGMT, QDF_PROTO_TYPE_ICMP, + QDF_PROTO_TYPE_ICMPv6, QDF_PROTO_TYPE_EVENT, QDF_PROTO_TYPE_MAX }; diff --git a/qdf/inc/qdf_trace.h b/qdf/inc/qdf_trace.h index 530e7abfa8..2fdf307c3f 100644 --- a/qdf/inc/qdf_trace.h +++ b/qdf/inc/qdf_trace.h @@ -179,6 +179,8 @@ typedef struct s_qdf_trace_data { * @QDF_DP_TRACE_DHCP_PACKET_RECORD - record DHCP packet * @QDF_DP_TRACE_ARP_PACKET_RECORD - record ARP packet * @QDF_DP_TRACE_MGMT_PACKET_RECORD - record MGMT pacekt + * @QDF_DP_TRACE_ICMP_PACKET_RECORD - record ICMP packet + * @QDF_DP_TRACE_ICMPv6_PACKET_RECORD - record ICMPv6 packet * QDF_DP_TRACE_EVENT_RECORD - record events * @QDF_DP_TRACE_BASE_VERBOSITY - below this are part of base verbosity * @QDF_DP_TRACE_ICMP_PACKET_RECORD - record ICMP packets @@ -220,6 +222,7 @@ enum QDF_DP_TRACE_ID { QDF_DP_TRACE_EVENT_RECORD, QDF_DP_TRACE_BASE_VERBOSITY, QDF_DP_TRACE_ICMP_PACKET_RECORD, + QDF_DP_TRACE_ICMPv6_PACKET_RECORD, QDF_DP_TRACE_HDD_TX_PACKET_RECORD, QDF_DP_TRACE_HDD_RX_PACKET_RECORD, QDF_DP_TRACE_HDD_TX_TIMEOUT, @@ -351,7 +354,13 @@ struct qdf_dp_trace_record_s { *.@arp_req: stats for arp reqs *.@arp_resp: stats for arp resps *.@icmp_req: stats for icmp reqs - *.@icmp_req: stats for icmp resps + *.@icmp_resp: stats for icmp resps + *.@icmpv6_req: stats for icmpv6 reqs + *.@icmpv6_resp: stats for icmpv6 resps + *.@icmpv6_ns: stats for icmpv6 nss + *.@icmpv6_na: stats for icmpv6 nas + *.@icmpv6_rs: stats for icmpv6 rss + *.@icmpv6_ra: stats for icmpv6 ras */ struct s_qdf_dp_trace_data { @@ -374,6 +383,12 @@ struct s_qdf_dp_trace_data { uint32_t arp_resp; uint32_t icmp_req; uint32_t icmp_resp; + uint32_t icmpv6_req; + uint32_t icmpv6_resp; + uint32_t icmpv6_ns; + uint32_t icmpv6_na; + uint32_t icmpv6_rs; + uint32_t icmpv6_ra; }; diff --git a/qdf/linux/src/i_qdf_nbuf.h b/qdf/linux/src/i_qdf_nbuf.h index fd21a7440d..606b659866 100644 --- a/qdf/linux/src/i_qdf_nbuf.h +++ b/qdf/linux/src/i_qdf_nbuf.h @@ -66,6 +66,7 @@ typedef struct sk_buff *__qdf_nbuf_t; #define QDF_NBUF_CB_PACKET_TYPE_WAPI 3 #define QDF_NBUF_CB_PACKET_TYPE_DHCP 4 #define QDF_NBUF_CB_PACKET_TYPE_ICMP 5 +#define QDF_NBUF_CB_PACKET_TYPE_ICMPv6 6 /* mark the first packet after wow wakeup */ diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index 6d0d595803..e18417a584 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -781,6 +781,7 @@ void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh, qdf_dp_trace_cb_table[QDF_DP_TRACE_DHCP_PACKET_RECORD] = qdf_dp_trace_cb_table[QDF_DP_TRACE_ARP_PACKET_RECORD] = qdf_dp_trace_cb_table[QDF_DP_TRACE_ICMP_PACKET_RECORD] = + qdf_dp_trace_cb_table[QDF_DP_TRACE_ICMPv6_PACKET_RECORD] = qdf_dp_display_proto_pkt; qdf_dp_trace_cb_table[QDF_DP_TRACE_MGMT_PACKET_RECORD] = qdf_dp_display_mgmt_pkt; @@ -997,6 +998,8 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code) return "ARP:"; case QDF_DP_TRACE_ICMP_PACKET_RECORD: return "ICMP:"; + case QDF_DP_TRACE_ICMPv6_PACKET_RECORD: + return "ICMPv6:"; case QDF_DP_TRACE_MGMT_PACKET_RECORD: return "MGMT:"; case QDF_DP_TRACE_EVENT_RECORD: @@ -1087,6 +1090,8 @@ static const char *qdf_dp_type_to_str(enum qdf_proto_type type) return "ARP"; case QDF_PROTO_TYPE_ICMP: return "ICMP"; + case QDF_PROTO_TYPE_ICMPv6: + return "ICMPv6"; case QDF_PROTO_TYPE_MGMT: return "MGMT"; case QDF_PROTO_TYPE_EVENT: @@ -1131,10 +1136,20 @@ static const char *qdf_dp_subtype_to_str(enum qdf_proto_subtype subtype) return "DECL"; case QDF_PROTO_ARP_REQ: case QDF_PROTO_ICMP_REQ: + case QDF_PROTO_ICMPV6_REQ: return "REQ"; case QDF_PROTO_ARP_RES: case QDF_PROTO_ICMP_RES: + case QDF_PROTO_ICMPV6_RES: return "RSP"; + case QDF_PROTO_ICMPV6_RS: + return "RS"; + case QDF_PROTO_ICMPV6_RA: + return "RA"; + case QDF_PROTO_ICMPV6_NS: + return "NS"; + case QDF_PROTO_ICMPV6_NA: + return "NA"; case QDF_PROTO_MGMT_ASSOC: return "ASSOC"; case QDF_PROTO_MGMT_DISASSOC: @@ -1271,6 +1286,65 @@ static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code, uint8_t *data, } +/** + * qdf_log_icmpv6_pkt() - log ICMPv6 packet + * @session_id: vdev_id + * @skb: skb pointer + * @dir: direction + * + * Return: true/false + */ +static bool qdf_log_icmpv6_pkt(uint8_t session_id, struct sk_buff *skb, + enum qdf_proto_dir dir, uint8_t pdev_id) +{ + enum qdf_proto_subtype subtype; + + if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMPv6) && + ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_ICMPv6 == + QDF_NBUF_CB_GET_PACKET_TYPE(skb)) || + (dir == QDF_RX && qdf_nbuf_is_icmpv6_pkt(skb) == true))) { + + subtype = qdf_nbuf_get_icmpv6_subtype(skb); + DPTRACE(qdf_dp_trace_proto_pkt( + QDF_DP_TRACE_ICMPv6_PACKET_RECORD, + session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET), + (skb->data + QDF_NBUF_DEST_MAC_OFFSET), + QDF_PROTO_TYPE_ICMPv6, subtype, dir, pdev_id, false)); + if (dir == QDF_TX) + QDF_NBUF_CB_TX_DP_TRACE(skb) = 1; + else if (dir == QDF_RX) + QDF_NBUF_CB_RX_DP_TRACE(skb) = 1; + + QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false; + + switch (subtype) { + case QDF_PROTO_ICMPV6_REQ: + g_qdf_dp_trace_data.icmpv6_req++; + break; + case QDF_PROTO_ICMPV6_RES: + g_qdf_dp_trace_data.icmpv6_resp++; + break; + case QDF_PROTO_ICMPV6_RS: + g_qdf_dp_trace_data.icmpv6_rs++; + break; + case QDF_PROTO_ICMPV6_RA: + g_qdf_dp_trace_data.icmpv6_ra++; + break; + case QDF_PROTO_ICMPV6_NS: + g_qdf_dp_trace_data.icmpv6_ns++; + break; + case QDF_PROTO_ICMPV6_NA: + g_qdf_dp_trace_data.icmpv6_na++; + break; + default: + break; + } + return true; + } + + return false; +} + /** * qdf_log_icmp_pkt() - log ICMP packet * @session_id: vdev_id @@ -1444,6 +1518,8 @@ bool qdf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb, return true; if (qdf_log_icmp_pkt(session_id, skb, dir, pdev_id)) return true; + if (qdf_log_icmpv6_pkt(session_id, skb, dir, pdev_id)) + return true; return false; } EXPORT_SYMBOL(qdf_dp_trace_log_pkt); @@ -1831,13 +1907,20 @@ void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id) g_qdf_dp_trace_data.high_tput_thresh, g_qdf_dp_trace_data.thresh_time_limit); - DPTRACE_PRINT("DPT: stats - tx %u rx %u icmp(%u %u) arp(%u %u)", + DPTRACE_PRINT("DPT: stats - tx %u rx %u icmp(%u %u) arp(%u %u)" + "icmpv6 (%u %u) icmpv6_ns_na (%u %u) icmpv6_rs_ra (%u %u)", g_qdf_dp_trace_data.tx_count, g_qdf_dp_trace_data.rx_count, g_qdf_dp_trace_data.icmp_req, g_qdf_dp_trace_data.icmp_resp, g_qdf_dp_trace_data.arp_req, - g_qdf_dp_trace_data.arp_resp); + g_qdf_dp_trace_data.arp_resp, + g_qdf_dp_trace_data.icmpv6_req, + g_qdf_dp_trace_data.icmpv6_resp, + g_qdf_dp_trace_data.icmpv6_ns, + g_qdf_dp_trace_data.icmpv6_na, + g_qdf_dp_trace_data.icmpv6_rs, + g_qdf_dp_trace_data.icmpv6_ra); DPTRACE_PRINT("DPT: Total Records: %d, Head: %d, Tail: %d", g_qdf_dp_trace_data.num, g_qdf_dp_trace_data.head,