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:
Mohit Khanna
2017-09-12 21:54:21 -07:00
committed by snandini
vanhempi 303c1f655e
commit 90d7ebd385
6 muutettua tiedostoa jossa 137 lisäystä ja 43 poistoa

Näytä tiedosto

@@ -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);
}

Näytä tiedosto

@@ -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);

Näytä tiedosto

@@ -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;

Näytä tiedosto

@@ -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)
{

Näytä tiedosto

@@ -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 */

Näytä tiedosto

@@ -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,