qcacmn: Add icmp dptrace for latency issue debug

Ping latency is a key performance KPI for some customers,
need log in debug mode

Change-Id: I96eebf3f249668dd220aa1062fb339f940d36975
CRs-Fixed: 2039646
This commit is contained in:
Zhu Jianmin
2017-06-12 17:55:43 +08:00
committed by snandini
parent d52b36da63
commit af3420af93
4 changed files with 63 additions and 26 deletions

View File

@@ -45,6 +45,8 @@
#define QDF_NBUF_PKT_TRAC_TYPE_DHCP 0x04 #define QDF_NBUF_PKT_TRAC_TYPE_DHCP 0x04
#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_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
#define QDF_NBUF_PKT_ERROR 1 #define QDF_NBUF_PKT_ERROR 1
@@ -255,6 +257,7 @@ struct mon_rx_status {
* @QDF_PROTO_TYPE_EAPOL - EAPOL * @QDF_PROTO_TYPE_EAPOL - EAPOL
* @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_EVENT - EVENT * QDF_PROTO_TYPE_EVENT - EVENT
*/ */
enum qdf_proto_type { enum qdf_proto_type {
@@ -262,6 +265,7 @@ enum qdf_proto_type {
QDF_PROTO_TYPE_EAPOL, QDF_PROTO_TYPE_EAPOL,
QDF_PROTO_TYPE_ARP, QDF_PROTO_TYPE_ARP,
QDF_PROTO_TYPE_MGMT, QDF_PROTO_TYPE_MGMT,
QDF_PROTO_TYPE_ICMP,
QDF_PROTO_TYPE_EVENT, QDF_PROTO_TYPE_EVENT,
QDF_PROTO_TYPE_MAX QDF_PROTO_TYPE_MAX
}; };

View File

@@ -170,6 +170,7 @@ 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_EVENT_RECORD - record events * QDF_DP_TRACE_EVENT_RECORD - record events
* @QDF_DP_TRACE_DEFAULT_VERBOSITY - below this are part of default verbosity * @QDF_DP_TRACE_DEFAULT_VERBOSITY - below this are part of default verbosity
* @QDF_DP_TRACE_HDD_TX_TIMEOUT - HDD tx timeout * @QDF_DP_TRACE_HDD_TX_TIMEOUT - HDD tx timeout
@@ -207,6 +208,7 @@ enum QDF_DP_TRACE_ID {
QDF_DP_TRACE_DHCP_PACKET_RECORD, QDF_DP_TRACE_DHCP_PACKET_RECORD,
QDF_DP_TRACE_ARP_PACKET_RECORD, QDF_DP_TRACE_ARP_PACKET_RECORD,
QDF_DP_TRACE_MGMT_PACKET_RECORD, QDF_DP_TRACE_MGMT_PACKET_RECORD,
QDF_DP_TRACE_ICMP_PACKET_RECORD,
QDF_DP_TRACE_EVENT_RECORD, QDF_DP_TRACE_EVENT_RECORD,
QDF_DP_TRACE_DEFAULT_VERBOSITY, QDF_DP_TRACE_DEFAULT_VERBOSITY,
QDF_DP_TRACE_HDD_TX_TIMEOUT, QDF_DP_TRACE_HDD_TX_TIMEOUT,

View File

@@ -65,6 +65,8 @@ typedef struct sk_buff *__qdf_nbuf_t;
#define QDF_NBUF_CB_PACKET_TYPE_ARP 2 #define QDF_NBUF_CB_PACKET_TYPE_ARP 2
#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
/* mark the first packet after wow wakeup */ /* mark the first packet after wow wakeup */
#define QDF_MARK_FIRST_WAKEUP_PACKET 0x80000000 #define QDF_MARK_FIRST_WAKEUP_PACKET 0x80000000

View File

@@ -736,19 +736,7 @@ void qdf_dp_trace_init(void)
uint8_t i; uint8_t i;
qdf_dp_trace_spin_lock_init(); qdf_dp_trace_spin_lock_init();
g_qdf_dp_trace_data.head = INVALID_QDF_DP_TRACE_ADDR; qdf_dp_trace_clear_buffer();
g_qdf_dp_trace_data.tail = INVALID_QDF_DP_TRACE_ADDR;
g_qdf_dp_trace_data.num = 0;
g_qdf_dp_trace_data.proto_bitmap = QDF_NBUF_PKT_TRAC_TYPE_EAPOL |
QDF_NBUF_PKT_TRAC_TYPE_DHCP |
QDF_NBUF_PKT_TRAC_TYPE_MGMT_ACTION |
QDF_NBUF_PKT_TRAC_TYPE_ARP;
g_qdf_dp_trace_data.no_of_record = 0;
g_qdf_dp_trace_data.verbosity = QDF_DP_TRACE_VERBOSITY_HIGH;
g_qdf_dp_trace_data.enable = true;
g_qdf_dp_trace_data.tx_count = 0;
g_qdf_dp_trace_data.rx_count = 0;
g_qdf_dp_trace_data.live_mode = 0;
for (i = 0; i < ARRAY_SIZE(qdf_dp_trace_cb_table); i++) for (i = 0; i < ARRAY_SIZE(qdf_dp_trace_cb_table); i++)
qdf_dp_trace_cb_table[i] = qdf_dp_display_record; qdf_dp_trace_cb_table[i] = qdf_dp_display_record;
@@ -760,6 +748,7 @@ void qdf_dp_trace_init(void)
qdf_dp_trace_cb_table[QDF_DP_TRACE_EAPOL_PACKET_RECORD] = qdf_dp_trace_cb_table[QDF_DP_TRACE_EAPOL_PACKET_RECORD] =
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_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;
@@ -977,6 +966,8 @@ const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code)
return "DHCP:"; return "DHCP:";
case QDF_DP_TRACE_ARP_PACKET_RECORD: case QDF_DP_TRACE_ARP_PACKET_RECORD:
return "ARP:"; return "ARP:";
case QDF_DP_TRACE_ICMP_PACKET_RECORD:
return "ICMP:";
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:
@@ -1065,6 +1056,8 @@ static const char *qdf_dp_type_to_str(enum qdf_proto_type type)
return "EAPOL"; return "EAPOL";
case QDF_PROTO_TYPE_ARP: case QDF_PROTO_TYPE_ARP:
return "ARP"; return "ARP";
case QDF_PROTO_TYPE_ICMP:
return "ICMP";
case QDF_PROTO_TYPE_MGMT: case QDF_PROTO_TYPE_MGMT:
return "MGMT"; return "MGMT";
case QDF_PROTO_TYPE_EVENT: case QDF_PROTO_TYPE_EVENT:
@@ -1108,8 +1101,10 @@ static const char *qdf_dp_subtype_to_str(enum qdf_proto_subtype subtype)
case QDF_PROTO_DHCP_DECLINE: case QDF_PROTO_DHCP_DECLINE:
return "DECLINE"; return "DECLINE";
case QDF_PROTO_ARP_REQ: case QDF_PROTO_ARP_REQ:
case QDF_PROTO_ICMP_REQ:
return "REQUEST"; return "REQUEST";
case QDF_PROTO_ARP_RES: case QDF_PROTO_ARP_RES:
case QDF_PROTO_ICMP_RES:
return "RESPONSE"; return "RESPONSE";
case QDF_PROTO_MGMT_ASSOC: case QDF_PROTO_MGMT_ASSOC:
return "ASSOC"; return "ASSOC";
@@ -1326,6 +1321,40 @@ static bool qdf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb,
return false; return false;
} }
/**
* qdf_log_icmp_pkt() - log ICMP packet
* @session_id: vdev_id
* @skb: skb pointer
* @dir: direction
*
* Return: true/false
*/
static bool qdf_log_icmp_pkt(uint8_t session_id, struct sk_buff *skb,
enum qdf_proto_dir dir, uint8_t pdev_id)
{
enum qdf_proto_subtype proto_subtype;
if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMP) &&
(qdf_nbuf_is_icmp_pkt(skb) == true)) {
proto_subtype = qdf_nbuf_get_icmp_subtype(skb);
DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ICMP_PACKET_RECORD,
session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
(skb->data + QDF_NBUF_DEST_MAC_OFFSET),
QDF_PROTO_TYPE_ICMP, proto_subtype, dir, pdev_id));
if (QDF_TX == dir)
QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
else if (QDF_RX == dir)
QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
return true;
}
return false;
}
/** /**
* qdf_dp_trace_log_pkt() - log packet type enabled through iwpriv * qdf_dp_trace_log_pkt() - log packet type enabled through iwpriv
* @session_id: vdev_id * @session_id: vdev_id
@@ -1338,18 +1367,17 @@ static bool qdf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb,
void qdf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb, void qdf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb,
enum qdf_proto_dir dir, uint8_t pdev_id) enum qdf_proto_dir dir, uint8_t pdev_id)
{ {
if (qdf_dp_get_proto_bitmap()) { if (!qdf_dp_get_proto_bitmap())
if (qdf_log_arp_pkt(session_id, return;
skb, dir, pdev_id) == false) { if (qdf_log_arp_pkt(session_id, skb, dir, pdev_id))
if (qdf_log_dhcp_pkt(session_id, return;
skb, dir, pdev_id) == false) { if (qdf_log_dhcp_pkt(session_id, skb, dir, pdev_id))
if (qdf_log_eapol_pkt(session_id, return;
skb, dir, pdev_id) == false) { if (qdf_log_eapol_pkt(session_id, skb, dir, pdev_id))
return; return;
} if (qdf_log_icmp_pkt(session_id, skb, dir, pdev_id))
} return;
}
}
} }
EXPORT_SYMBOL(qdf_dp_trace_log_pkt); EXPORT_SYMBOL(qdf_dp_trace_log_pkt);
@@ -1675,7 +1703,8 @@ void qdf_dp_trace_clear_buffer(void)
g_qdf_dp_trace_data.proto_bitmap = QDF_NBUF_PKT_TRAC_TYPE_EAPOL | g_qdf_dp_trace_data.proto_bitmap = QDF_NBUF_PKT_TRAC_TYPE_EAPOL |
QDF_NBUF_PKT_TRAC_TYPE_DHCP | QDF_NBUF_PKT_TRAC_TYPE_DHCP |
QDF_NBUF_PKT_TRAC_TYPE_MGMT_ACTION | QDF_NBUF_PKT_TRAC_TYPE_MGMT_ACTION |
QDF_NBUF_PKT_TRAC_TYPE_ARP; QDF_NBUF_PKT_TRAC_TYPE_ARP |
QDF_NBUF_PKT_TRAC_TYPE_ICMP;
g_qdf_dp_trace_data.no_of_record = 0; g_qdf_dp_trace_data.no_of_record = 0;
g_qdf_dp_trace_data.verbosity = QDF_DP_TRACE_VERBOSITY_HIGH; g_qdf_dp_trace_data.verbosity = QDF_DP_TRACE_VERBOSITY_HIGH;
g_qdf_dp_trace_data.enable = true; g_qdf_dp_trace_data.enable = true;