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
This commit is contained in:

committed by
snandini

parent
86a17f6ab4
commit
bf4231b6d8
@@ -46,6 +46,7 @@
|
|||||||
#define QDF_NBUF_PKT_TRAC_TYPE_MGMT_ACTION 0x08
|
#define QDF_NBUF_PKT_TRAC_TYPE_MGMT_ACTION 0x08
|
||||||
#define QDF_NBUF_PKT_TRAC_TYPE_ARP 0x10
|
#define QDF_NBUF_PKT_TRAC_TYPE_ARP 0x10
|
||||||
#define QDF_NBUF_PKT_TRAC_TYPE_ICMP 0x20
|
#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_MAX_STRING 12
|
||||||
#define QDF_NBUF_PKT_TRAC_PROTO_STRING 4
|
#define QDF_NBUF_PKT_TRAC_PROTO_STRING 4
|
||||||
@@ -278,6 +279,7 @@ struct mon_rx_status {
|
|||||||
* @QDF_PROTO_TYPE_ARP - ARP
|
* @QDF_PROTO_TYPE_ARP - ARP
|
||||||
* @QDF_PROTO_TYPE_MGMT - MGMT
|
* @QDF_PROTO_TYPE_MGMT - MGMT
|
||||||
* @QDF_PROTO_TYPE_ICMP - ICMP
|
* @QDF_PROTO_TYPE_ICMP - ICMP
|
||||||
|
* @QDF_PROTO_TYPE_ICMPv6 - ICMPv6
|
||||||
* QDF_PROTO_TYPE_EVENT - EVENT
|
* QDF_PROTO_TYPE_EVENT - EVENT
|
||||||
*/
|
*/
|
||||||
enum qdf_proto_type {
|
enum qdf_proto_type {
|
||||||
@@ -286,6 +288,7 @@ enum qdf_proto_type {
|
|||||||
QDF_PROTO_TYPE_ARP,
|
QDF_PROTO_TYPE_ARP,
|
||||||
QDF_PROTO_TYPE_MGMT,
|
QDF_PROTO_TYPE_MGMT,
|
||||||
QDF_PROTO_TYPE_ICMP,
|
QDF_PROTO_TYPE_ICMP,
|
||||||
|
QDF_PROTO_TYPE_ICMPv6,
|
||||||
QDF_PROTO_TYPE_EVENT,
|
QDF_PROTO_TYPE_EVENT,
|
||||||
QDF_PROTO_TYPE_MAX
|
QDF_PROTO_TYPE_MAX
|
||||||
};
|
};
|
||||||
|
@@ -179,6 +179,8 @@ typedef struct s_qdf_trace_data {
|
|||||||
* @QDF_DP_TRACE_DHCP_PACKET_RECORD - record DHCP packet
|
* @QDF_DP_TRACE_DHCP_PACKET_RECORD - record DHCP packet
|
||||||
* @QDF_DP_TRACE_ARP_PACKET_RECORD - record ARP packet
|
* @QDF_DP_TRACE_ARP_PACKET_RECORD - record ARP packet
|
||||||
* @QDF_DP_TRACE_MGMT_PACKET_RECORD - record MGMT pacekt
|
* @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_EVENT_RECORD - record events
|
||||||
* @QDF_DP_TRACE_BASE_VERBOSITY - below this are part of base verbosity
|
* @QDF_DP_TRACE_BASE_VERBOSITY - below this are part of base verbosity
|
||||||
* @QDF_DP_TRACE_ICMP_PACKET_RECORD - record ICMP packets
|
* @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_EVENT_RECORD,
|
||||||
QDF_DP_TRACE_BASE_VERBOSITY,
|
QDF_DP_TRACE_BASE_VERBOSITY,
|
||||||
QDF_DP_TRACE_ICMP_PACKET_RECORD,
|
QDF_DP_TRACE_ICMP_PACKET_RECORD,
|
||||||
|
QDF_DP_TRACE_ICMPv6_PACKET_RECORD,
|
||||||
QDF_DP_TRACE_HDD_TX_PACKET_RECORD,
|
QDF_DP_TRACE_HDD_TX_PACKET_RECORD,
|
||||||
QDF_DP_TRACE_HDD_RX_PACKET_RECORD,
|
QDF_DP_TRACE_HDD_RX_PACKET_RECORD,
|
||||||
QDF_DP_TRACE_HDD_TX_TIMEOUT,
|
QDF_DP_TRACE_HDD_TX_TIMEOUT,
|
||||||
@@ -351,7 +354,13 @@ struct qdf_dp_trace_record_s {
|
|||||||
*.@arp_req: stats for arp reqs
|
*.@arp_req: stats for arp reqs
|
||||||
*.@arp_resp: stats for arp resps
|
*.@arp_resp: stats for arp resps
|
||||||
*.@icmp_req: stats for icmp reqs
|
*.@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 {
|
struct s_qdf_dp_trace_data {
|
||||||
@@ -374,6 +383,12 @@ struct s_qdf_dp_trace_data {
|
|||||||
uint32_t arp_resp;
|
uint32_t arp_resp;
|
||||||
uint32_t icmp_req;
|
uint32_t icmp_req;
|
||||||
uint32_t icmp_resp;
|
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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -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_WAPI 3
|
||||||
#define QDF_NBUF_CB_PACKET_TYPE_DHCP 4
|
#define QDF_NBUF_CB_PACKET_TYPE_DHCP 4
|
||||||
#define QDF_NBUF_CB_PACKET_TYPE_ICMP 5
|
#define QDF_NBUF_CB_PACKET_TYPE_ICMP 5
|
||||||
|
#define QDF_NBUF_CB_PACKET_TYPE_ICMPv6 6
|
||||||
|
|
||||||
|
|
||||||
/* mark the first packet after wow wakeup */
|
/* mark the first packet after wow wakeup */
|
||||||
|
@@ -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_DHCP_PACKET_RECORD] =
|
||||||
qdf_dp_trace_cb_table[QDF_DP_TRACE_ARP_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_ICMP_PACKET_RECORD] =
|
||||||
|
qdf_dp_trace_cb_table[QDF_DP_TRACE_ICMPv6_PACKET_RECORD] =
|
||||||
qdf_dp_display_proto_pkt;
|
qdf_dp_display_proto_pkt;
|
||||||
qdf_dp_trace_cb_table[QDF_DP_TRACE_MGMT_PACKET_RECORD] =
|
qdf_dp_trace_cb_table[QDF_DP_TRACE_MGMT_PACKET_RECORD] =
|
||||||
qdf_dp_display_mgmt_pkt;
|
qdf_dp_display_mgmt_pkt;
|
||||||
@@ -997,6 +998,8 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code)
|
|||||||
return "ARP:";
|
return "ARP:";
|
||||||
case QDF_DP_TRACE_ICMP_PACKET_RECORD:
|
case QDF_DP_TRACE_ICMP_PACKET_RECORD:
|
||||||
return "ICMP:";
|
return "ICMP:";
|
||||||
|
case QDF_DP_TRACE_ICMPv6_PACKET_RECORD:
|
||||||
|
return "ICMPv6:";
|
||||||
case QDF_DP_TRACE_MGMT_PACKET_RECORD:
|
case QDF_DP_TRACE_MGMT_PACKET_RECORD:
|
||||||
return "MGMT:";
|
return "MGMT:";
|
||||||
case QDF_DP_TRACE_EVENT_RECORD:
|
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";
|
return "ARP";
|
||||||
case QDF_PROTO_TYPE_ICMP:
|
case QDF_PROTO_TYPE_ICMP:
|
||||||
return "ICMP";
|
return "ICMP";
|
||||||
|
case QDF_PROTO_TYPE_ICMPv6:
|
||||||
|
return "ICMPv6";
|
||||||
case QDF_PROTO_TYPE_MGMT:
|
case QDF_PROTO_TYPE_MGMT:
|
||||||
return "MGMT";
|
return "MGMT";
|
||||||
case QDF_PROTO_TYPE_EVENT:
|
case QDF_PROTO_TYPE_EVENT:
|
||||||
@@ -1131,10 +1136,20 @@ static const char *qdf_dp_subtype_to_str(enum qdf_proto_subtype subtype)
|
|||||||
return "DECL";
|
return "DECL";
|
||||||
case QDF_PROTO_ARP_REQ:
|
case QDF_PROTO_ARP_REQ:
|
||||||
case QDF_PROTO_ICMP_REQ:
|
case QDF_PROTO_ICMP_REQ:
|
||||||
|
case QDF_PROTO_ICMPV6_REQ:
|
||||||
return "REQ";
|
return "REQ";
|
||||||
case QDF_PROTO_ARP_RES:
|
case QDF_PROTO_ARP_RES:
|
||||||
case QDF_PROTO_ICMP_RES:
|
case QDF_PROTO_ICMP_RES:
|
||||||
|
case QDF_PROTO_ICMPV6_RES:
|
||||||
return "RSP";
|
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:
|
case QDF_PROTO_MGMT_ASSOC:
|
||||||
return "ASSOC";
|
return "ASSOC";
|
||||||
case QDF_PROTO_MGMT_DISASSOC:
|
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
|
* qdf_log_icmp_pkt() - log ICMP packet
|
||||||
* @session_id: vdev_id
|
* @session_id: vdev_id
|
||||||
@@ -1444,6 +1518,8 @@ bool qdf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb,
|
|||||||
return true;
|
return true;
|
||||||
if (qdf_log_icmp_pkt(session_id, skb, dir, pdev_id))
|
if (qdf_log_icmp_pkt(session_id, skb, dir, pdev_id))
|
||||||
return true;
|
return true;
|
||||||
|
if (qdf_log_icmpv6_pkt(session_id, skb, dir, pdev_id))
|
||||||
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(qdf_dp_trace_log_pkt);
|
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.high_tput_thresh,
|
||||||
g_qdf_dp_trace_data.thresh_time_limit);
|
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.tx_count,
|
||||||
g_qdf_dp_trace_data.rx_count,
|
g_qdf_dp_trace_data.rx_count,
|
||||||
g_qdf_dp_trace_data.icmp_req,
|
g_qdf_dp_trace_data.icmp_req,
|
||||||
g_qdf_dp_trace_data.icmp_resp,
|
g_qdf_dp_trace_data.icmp_resp,
|
||||||
g_qdf_dp_trace_data.arp_req,
|
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",
|
DPTRACE_PRINT("DPT: Total Records: %d, Head: %d, Tail: %d",
|
||||||
g_qdf_dp_trace_data.num, g_qdf_dp_trace_data.head,
|
g_qdf_dp_trace_data.num, g_qdf_dp_trace_data.head,
|
||||||
|
Reference in New Issue
Block a user