summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--qdf/inc/qdf_nbuf.h3
-rw-r--r--qdf/inc/qdf_trace.h16
-rw-r--r--qdf/linux/src/i_qdf_nbuf.h1
-rw-r--r--qdf/linux/src/qdf_trace.c87
4 files changed, 104 insertions, 3 deletions
diff --git a/qdf/inc/qdf_nbuf.h b/qdf/inc/qdf_nbuf.h
index de659be2a99d..fffe5cccf799 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
@@ -230,6 +231,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 {
@@ -238,6 +240,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 97bb9c2274fe..99223de7ed1c 100644
--- a/qdf/inc/qdf_trace.h
+++ b/qdf/inc/qdf_trace.h
@@ -164,6 +164,7 @@ typedef struct s_qdf_trace_data {
* @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
@@ -199,6 +200,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,
@@ -324,7 +326,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 {
@@ -347,6 +355,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 69b72b80d2e1..5fe43361d4d6 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 c0e35f56adc7..cd05f9e98b3f 100644
--- a/qdf/linux/src/qdf_trace.c
+++ b/qdf/linux/src/qdf_trace.c
@@ -848,6 +848,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;
@@ -1002,6 +1003,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:
@@ -1082,6 +1085,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:
@@ -1126,10 +1131,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:
@@ -1259,6 +1274,65 @@ static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code,
}
/**
+ * 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)
+{
+ 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, true));
+ 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
* @skb: skb pointer
@@ -1428,6 +1502,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))
return true;
+ if (qdf_log_icmpv6_pkt(session_id, skb, dir))
+ return true;
return false;
}
@@ -1799,13 +1875,20 @@ void qdf_dp_trace_dump_all(uint32_t count)
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,