ソースを参照

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
Poddar, Siddarth 7 年 前
コミット
bf4231b6d8
4 ファイル変更105 行追加3 行削除
  1. 3 0
      qdf/inc/qdf_nbuf.h
  2. 16 1
      qdf/inc/qdf_trace.h
  3. 1 0
      qdf/linux/src/i_qdf_nbuf.h
  4. 85 2
      qdf/linux/src/qdf_trace.c

+ 3 - 0
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
 };

+ 16 - 1
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;
 };
 
 

+ 1 - 0
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 */

+ 85 - 2
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,