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
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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;
|
||||
|
@@ -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)
|
||||
{
|
||||
|
@@ -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 */
|
||||
|
@@ -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,
|
||||
|
Viittaa uudesa ongelmassa
Block a user