diff options
| author | Mohit Khanna <mkhannaqca@codeaurora.org> | 2017-09-12 21:54:21 -0700 |
|---|---|---|
| committer | snandini <snandini@codeaurora.org> | 2017-10-16 17:43:44 -0700 |
| commit | 12af0314fdeda293c9f3371b295dbe7f5fe67617 (patch) | |
| tree | 536abbf7e08e10be1c54dbe2b04a0a2880d0bf94 | |
| parent | 9e2593229078f60b4ceecd04d9a1c28da816bfd6 (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.h | 11 | ||||
| -rw-r--r-- | dp/inc/cdp_txrx_stats_struct.h | 1 | ||||
| -rw-r--r-- | qdf/inc/qdf_trace.h | 68 | ||||
| -rw-r--r-- | qdf/inc/qdf_types.h | 10 | ||||
| -rw-r--r-- | qdf/linux/src/qdf_trace.c | 79 |
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, |
