Browse Source

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
Mohit Khanna 7 years ago
parent
commit
90d7ebd385
6 changed files with 137 additions and 43 deletions
  1. 3 2
      dp/inc/cdp_txrx_cmn.h
  2. 2 2
      dp/inc/cdp_txrx_ops.h
  3. 2 1
      dp/wifi3.0/dp_main.c
  4. 55 24
      qdf/inc/qdf_trace.h
  5. 10 0
      qdf/inc/qdf_types.h
  6. 65 14
      qdf/linux/src/qdf_trace.c

+ 3 - 2
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);
 }
 
 

+ 2 - 2
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);

+ 2 - 1
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;

+ 55 - 24
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)
 {

+ 10 - 0
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 */

+ 65 - 14
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,