diff options
| -rw-r--r-- | qdf/inc/qdf_nbuf.h | 3 | ||||
| -rw-r--r-- | qdf/inc/qdf_trace.h | 16 | ||||
| -rw-r--r-- | qdf/linux/src/i_qdf_nbuf.h | 1 | ||||
| -rw-r--r-- | qdf/linux/src/qdf_trace.c | 87 |
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, |
