summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohit Khanna <mkhannaqca@codeaurora.org>2017-09-12 21:54:21 -0700
committersnandini <snandini@codeaurora.org>2017-10-16 17:43:44 -0700
commit12af0314fdeda293c9f3371b295dbe7f5fe67617 (patch)
tree536abbf7e08e10be1c54dbe2b04a0a2880d0bf94
parent9e2593229078f60b4ceecd04d9a1c28da816bfd6 (diff)
qcacmn: add periodic data traffic stats
Add support for periodic stats for data packets to be displayed in wlan driver logs. Change-Id: Ifb8fc5cabb8ecd31da83b5d307721c1d41a30f9d CRs-Fixed: 2118581
-rw-r--r--dp/inc/cdp_txrx_stats.h11
-rw-r--r--dp/inc/cdp_txrx_stats_struct.h1
-rw-r--r--qdf/inc/qdf_trace.h68
-rw-r--r--qdf/inc/qdf_types.h10
-rw-r--r--qdf/linux/src/qdf_trace.c79
5 files changed, 136 insertions, 33 deletions
diff --git a/dp/inc/cdp_txrx_stats.h b/dp/inc/cdp_txrx_stats.h
index d559e11ec63c..20643d92a6e4 100644
--- a/dp/inc/cdp_txrx_stats.h
+++ b/dp/inc/cdp_txrx_stats.h
@@ -32,8 +32,17 @@
#ifndef _CDP_TXRX_STATS_H_
#define _CDP_TXRX_STATS_H_
#include <qdf_status.h>
+#include <qdf_types.h>
-QDF_STATUS ol_txrx_display_stats(uint16_t bitmap);
+/**
+ * ol_txrx_display_stats() - Display OL TXRX stats
+ * @value: Module id for which stats needs to be displayed
+ * @verb_level: verbosity level for tx rx stats
+ *
+ * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E code on failure
+ */
+QDF_STATUS ol_txrx_display_stats(uint16_t value,
+ enum qdf_stats_verb_lvl verb_level);
QDF_STATUS ol_txrx_clear_stats(uint16_t bitmap);
int ol_txrx_stats(uint8_t vdev_id, char *buffer, unsigned int buf_len);
diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h
index ec26960105ed..aa70e6aadc9c 100644
--- a/dp/inc/cdp_txrx_stats_struct.h
+++ b/dp/inc/cdp_txrx_stats_struct.h
@@ -78,6 +78,7 @@ struct ol_txrx_stats {
* an ack for
*/
ol_txrx_stats_elem no_ack;
+
/* MSDUs dropped in NSS-FW */
ol_txrx_stats_elem nss_ol_dropped;
} dropped;
diff --git a/qdf/inc/qdf_trace.h b/qdf/inc/qdf_trace.h
index a163574bd294..9ed433c9a172 100644
--- a/qdf/inc/qdf_trace.h
+++ b/qdf/inc/qdf_trace.h
@@ -322,18 +322,28 @@ struct qdf_dp_trace_record_s {
* @print_pkt_cnt: count of number of packets printed in live mode
*.@high_tput_thresh: thresh beyond which live mode is turned off
*.@thresh_time_limit: max time, in terms of BW timer intervals to wait,
- * for determining if high_tput_thresh has been crossed. ~1s
- *.@arp_req: stats for arp reqs
- *.@arp_resp: stats for arp resps
- *.@icmp_req: stats for icmp reqs
- *.@icmp_resp: stats for icmp resps
- *.@icmpv6_req: stats for icmpv6 reqs
- *.@icmpv6_resp: stats for icmpv6 resps
+ * for determining if high_tput_thresh has been crossed. ~1s
+ * @arp_req: stats for arp reqs
+ * @arp_resp: stats for arp resps
+ * @icmp_req: stats for icmp reqs
+ * @icmp_resp: stats for icmp resps
+ * @dhcp_disc: stats for dhcp discover msgs
+ * @dhcp_req: stats for dhcp req msgs
+ * @dhcp_off: stats for dhcp offer msgs
+ * @dhcp_ack: stats for dhcp ack msgs
+ * @dhcp_nack: stats for dhcp nack msgs
+ * @dhcp_others: stats for other dhcp pkts types
+ * @eapol_m1: stats for eapol m1
+ * @eapol_m2: stats for eapol m2
+ * @eapol_m3: stats for eapol m3
+ * @eapol_m4: stats for eapol m4
+ * @eapol_others: stats for other eapol pkt types
+ * @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 {
uint32_t head;
@@ -351,16 +361,27 @@ struct s_qdf_dp_trace_data {
/* Stats */
uint32_t tx_count;
uint32_t rx_count;
- uint32_t arp_req;
- 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;
+ uint16_t arp_req;
+ uint16_t arp_resp;
+ uint16_t dhcp_disc;
+ uint16_t dhcp_req;
+ uint16_t dhcp_off;
+ uint16_t dhcp_ack;
+ uint16_t dhcp_nack;
+ uint16_t dhcp_others;
+ uint16_t eapol_m1;
+ uint16_t eapol_m2;
+ uint16_t eapol_m3;
+ uint16_t eapol_m4;
+ uint16_t eapol_others;
+ uint16_t icmp_req;
+ uint16_t icmp_resp;
+ uint16_t icmpv6_req;
+ uint16_t icmpv6_resp;
+ uint16_t icmpv6_ns;
+ uint16_t icmpv6_na;
+ uint16_t icmpv6_rs;
+ uint16_t icmpv6_ra;
};
@@ -427,6 +448,13 @@ void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir);
void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
uint8_t *data, uint8_t size, enum qdf_proto_dir dir);
void qdf_dp_trace_dump_all(uint32_t count);
+
+/**
+ * qdf_dp_trace_dump_stats() - dump DP Trace stats
+ *
+ * Return: none
+ */
+void qdf_dp_trace_dump_stats(void);
void qdf_dp_trace_throttle_live_mode(bool high_bw_request);
typedef void (*tp_qdf_dp_trace_cb)(struct qdf_dp_trace_record_s*,
uint16_t index, bool live);
@@ -485,6 +513,10 @@ void qdf_dp_trace_dump_all(uint32_t count)
{
}
+static inline void qdf_dp_trace_dump_stats(void)
+{
+}
+
static inline
void qdf_dp_trace_disable_live_mode(void)
{
diff --git a/qdf/inc/qdf_types.h b/qdf/inc/qdf_types.h
index 07e8bf99231d..93af31796337 100644
--- a/qdf/inc/qdf_types.h
+++ b/qdf/inc/qdf_types.h
@@ -735,4 +735,14 @@ enum qdf_suspend_type {
QDF_RUNTIME_SUSPEND
};
+/*
+ * Verbosity levels for stats for which want to have differet levels
+ * @QDF_STATS_VERB_LVL_LOW: Stats verbosity level low
+ * @QDF_STATS_VERB_LVL_HIGH: Stats verbosity level high
+ */
+enum qdf_stats_verb_lvl {
+ QDF_STATS_VERB_LVL_LOW,
+ QDF_STATS_VERB_LVL_HIGH
+};
+
#endif /* __QDF_TYPES_H */
diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c
index db49afdf205d..5ae218998de3 100644
--- a/qdf/linux/src/qdf_trace.c
+++ b/qdf/linux/src/qdf_trace.c
@@ -1424,6 +1424,23 @@ static bool qdf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb,
else if (QDF_RX == dir)
QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
+ switch (subtype) {
+ case QDF_PROTO_EAPOL_M1:
+ g_qdf_dp_trace_data.eapol_m1++;
+ break;
+ case QDF_PROTO_EAPOL_M2:
+ g_qdf_dp_trace_data.eapol_m2++;
+ break;
+ case QDF_PROTO_EAPOL_M3:
+ g_qdf_dp_trace_data.eapol_m3++;
+ break;
+ case QDF_PROTO_EAPOL_M4:
+ g_qdf_dp_trace_data.eapol_m4++;
+ break;
+ default:
+ g_qdf_dp_trace_data.eapol_others++;
+ break;
+ }
QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
return true;
}
@@ -1459,6 +1476,27 @@ static bool qdf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb,
QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
+ switch (subtype) {
+ case QDF_PROTO_DHCP_DISCOVER:
+ g_qdf_dp_trace_data.dhcp_disc++;
+ break;
+ case QDF_PROTO_DHCP_OFFER:
+ g_qdf_dp_trace_data.dhcp_off++;
+ break;
+ case QDF_PROTO_DHCP_REQUEST:
+ g_qdf_dp_trace_data.dhcp_req++;
+ break;
+ case QDF_PROTO_DHCP_ACK:
+ g_qdf_dp_trace_data.dhcp_ack++;
+ break;
+ case QDF_PROTO_DHCP_NACK:
+ g_qdf_dp_trace_data.dhcp_nack++;
+ break;
+ default:
+ g_qdf_dp_trace_data.eapol_others++;
+ break;
+ }
+
return true;
}
return false;
@@ -1872,6 +1910,32 @@ void qdf_dp_trace_clear_buffer(void)
}
qdf_export_symbol(qdf_dp_trace_clear_buffer);
+void qdf_dp_trace_dump_stats(void)
+{
+ DPTRACE_PRINT("STATS |DPT: icmp(%u %u) arp(%u %u) icmpv6(%u %u %u %u %u %u) dhcp(%u %u %u %u %u %u) eapol(%u %u %u %u %u)",
+ 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.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,
+ g_qdf_dp_trace_data.dhcp_disc,
+ g_qdf_dp_trace_data.dhcp_off,
+ g_qdf_dp_trace_data.dhcp_req,
+ g_qdf_dp_trace_data.dhcp_ack,
+ g_qdf_dp_trace_data.dhcp_nack,
+ g_qdf_dp_trace_data.dhcp_others,
+ g_qdf_dp_trace_data.eapol_m1,
+ g_qdf_dp_trace_data.eapol_m2,
+ g_qdf_dp_trace_data.eapol_m3,
+ g_qdf_dp_trace_data.eapol_m4,
+ g_qdf_dp_trace_data.eapol_others);
+}
+
/**
* qdf_dp_trace_dump_all() - Dump data from ring buffer via call back functions
* registered with QDF
@@ -1899,20 +1963,7 @@ 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)"
- "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.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);
+ qdf_dp_trace_dump_stats();
DPTRACE_PRINT("DPT: Total Records: %d, Head: %d, Tail: %d",
g_qdf_dp_trace_data.num, g_qdf_dp_trace_data.head,