diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index 500c810ac4..0b15332d41 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -961,7 +961,8 @@ static inline void cdp_txrx_intr_detach(ol_txrx_soc_handle soc) * @value: statistics option */ static inline QDF_STATUS -cdp_display_stats(ol_txrx_soc_handle soc, uint16_t value) +cdp_display_stats(ol_txrx_soc_handle soc, uint16_t value, + enum qdf_stats_verbosity_level level) { if (!soc || !soc->ops) { QDF_TRACE(QDF_MODULE_ID_CDP, QDF_TRACE_LEVEL_DEBUG, @@ -974,7 +975,7 @@ cdp_display_stats(ol_txrx_soc_handle soc, uint16_t value) !soc->ops->cmn_drv_ops->display_stats) return 0; - return soc->ops->cmn_drv_ops->display_stats(soc, value); + return soc->ops->cmn_drv_ops->display_stats(soc, value, level); } diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index de089878d5..01932f5752 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -213,8 +213,8 @@ struct cdp_cmn_ops { int (*txrx_stats_request)(struct cdp_vdev *vdev, struct cdp_txrx_stats_req *req); - QDF_STATUS (*display_stats)(void *psoc, uint16_t value); - + QDF_STATUS (*display_stats)(void *psoc, uint16_t value, + enum qdf_stats_verbosity_level level); void (*txrx_soc_set_nss_cfg)(ol_txrx_soc_handle soc, int config); int(*txrx_soc_get_nss_cfg)(ol_txrx_soc_handle soc); diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 5414da3611..59c98beb85 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -5154,7 +5154,8 @@ static void dp_txrx_path_stats(struct dp_soc *soc) * dp_txrx_dump_stats() - Dump statistics * @value - Statistics option */ -static QDF_STATUS dp_txrx_dump_stats(void *psoc, uint16_t value) +static QDF_STATUS dp_txrx_dump_stats(void *psoc, uint16_t value, + enum qdf_stats_verbosity_level level) { struct dp_soc *soc = (struct dp_soc *)psoc; diff --git a/qdf/inc/qdf_trace.h b/qdf/inc/qdf_trace.h index 2fdf307c3f..f4f2b9e9bd 100644 --- a/qdf/inc/qdf_trace.h +++ b/qdf/inc/qdf_trace.h @@ -348,20 +348,30 @@ struct qdf_dp_trace_record_s { * @live_mode_config: configuration as received during initialization * @live_mode: current live mode, enabled or disabled. * @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 - *.@icmpv6_ns: stats for icmpv6 nss - *.@icmpv6_na: stats for icmpv6 nas - *.@icmpv6_rs: stats for icmpv6 rss - *.@icmpv6_ra: stats for icmpv6 ras - + * @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 + * @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; @@ -379,16 +389,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; + u16 arp_req; + u16 arp_resp; + u16 dhcp_disc; + u16 dhcp_req; + u16 dhcp_off; + u16 dhcp_ack; + u16 dhcp_nack; + u16 dhcp_others; + u16 eapol_m1; + u16 eapol_m2; + u16 eapol_m3; + u16 eapol_m4; + u16 eapol_others; + u16 icmp_req; + u16 icmp_resp; + u16 icmpv6_req; + u16 icmpv6_resp; + u16 icmpv6_ns; + u16 icmpv6_na; + u16 icmpv6_rs; + u16 icmpv6_ra; }; @@ -457,6 +478,12 @@ 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 pdev_id, uint8_t *data, uint8_t size, enum qdf_proto_dir dir); void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id); +/** + * qdf_dp_trace_dump_stats() - dump DP Trace stats + * + * Return: none + */ +void qdf_dp_trace_dump_stats(void); typedef void (*tp_qdf_dp_trace_cb)(struct qdf_dp_trace_record_s*, uint16_t, uint8_t, bool live); void qdf_dp_display_record(struct qdf_dp_trace_record_s *record, @@ -517,6 +544,10 @@ void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id) { } +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 89334bfa07..89853c1855 100644 --- a/qdf/inc/qdf_types.h +++ b/qdf/inc/qdf_types.h @@ -897,4 +897,14 @@ enum qdf_hang_reason { QDF_RESUME_TIMEOUT = 9, }; +/* + * Verbosity levels for stats for which want to have different levels + * @QDF_STATS_VERBOSITY_LEVEL_LOW: Stats verbosity level low + * @QDF_STATS_VERBOSITY_LEVEL_HIGH: Stats verbosity level high + */ +enum qdf_stats_verbosity_level { + QDF_STATS_VERBOSITY_LEVEL_LOW, + QDF_STATS_VERBOSITY_LEVEL_HIGH +}; + #endif /* __QDF_TYPES_H */ diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index 231cfa03e7..1dfc38d72c 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -1419,6 +1419,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; } @@ -1456,6 +1473,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; @@ -1887,6 +1925,32 @@ void qdf_dp_trace_clear_buffer(void) } 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 @@ -1914,20 +1978,7 @@ 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.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,