Browse Source

qcacmn: Add chipset stats for EAPOL/DHCP packets

Add chipset stats for EAPOL/DHCP packets.

Change-Id: Icaabd64a84f57b7a556cb7c463fc19cfe0780a2b
CRs-Fixed: 3783005
Nirav Shah 1 năm trước cách đây
mục cha
commit
6d412727f1

+ 37 - 1
qdf/linux/src/qdf_trace.c

@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
- * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
+ * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for
  * any purpose with or without fee is hereby granted, provided that the
@@ -54,6 +54,9 @@ qdf_declare_param(qdf_log_flush_timer_period, uint);
 #include "i_host_diag_core_event.h"
 #endif
 
+#ifdef WLAN_CHIPSET_STATS
+#include "wlan_cp_stats_chipset_stats.h"
+#endif
 /* Global qdf print id */
 
 /* Preprocessor definitions and constants */
@@ -1615,6 +1618,26 @@ static bool qdf_log_icmp_pkt(uint8_t vdev_id, struct sk_buff *skb,
 	return false;
 }
 
+#ifdef WLAN_CHIPSET_STATS
+static void
+qdf_log_pkt_cstats(uint8_t *sa, uint8_t *da, enum qdf_proto_type pkt_type,
+		   enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
+		   enum qdf_dp_tx_rx_status status, uint8_t vdev_id,
+		   enum QDF_OPMODE op_mode)
+{
+	wlan_cp_stats_cstats_pkt_log(sa, da, pkt_type, subtype, dir,
+				     status, vdev_id, op_mode);
+}
+#else
+static void
+qdf_log_pkt_cstats(uint8_t *sa, uint8_t *da, enum qdf_proto_type pkt_type,
+		   enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
+		   enum qdf_dp_tx_rx_status status, uint8_t vdev_id,
+		   enum QDF_OPMODE op_mode)
+{
+}
+#endif
+
 #ifdef CONNECTIVITY_DIAG_EVENT
 enum diag_tx_status wlan_get_diag_tx_status(enum qdf_dp_tx_rx_status tx_status)
 {
@@ -1881,6 +1904,10 @@ static bool qdf_log_eapol_pkt(uint8_t vdev_id, struct sk_buff *skb,
 					       QDF_RX, 0, op_mode,
 					       vdev_id, skb->data,
 					       qdf_nbuf_rx_get_band(skb));
+		qdf_log_pkt_cstats(skb->data + QDF_NBUF_SRC_MAC_OFFSET,
+				   skb->data + QDF_NBUF_DEST_MAC_OFFSET,
+				   QDF_PROTO_TYPE_EAPOL, subtype, dir,
+				   QDF_TX_RX_STATUS_INVALID, vdev_id, op_mode);
 	}
 
 	if (dp_eap_trace) {
@@ -1966,6 +1993,10 @@ static bool qdf_log_dhcp_pkt(uint8_t vdev_id, struct sk_buff *skb,
 		qdf_fill_wlan_connectivity_log(QDF_PROTO_TYPE_DHCP, subtype,
 					       QDF_RX, 0, op_mode, vdev_id, 0,
 					       qdf_nbuf_rx_get_band(skb));
+		qdf_log_pkt_cstats(skb->data + QDF_NBUF_SRC_MAC_OFFSET,
+				   skb->data + QDF_NBUF_DEST_MAC_OFFSET,
+				   QDF_PROTO_TYPE_DHCP, subtype, dir,
+				   QDF_TX_RX_STATUS_INVALID, vdev_id, op_mode);
 	}
 
 	if (dp_dhcp_trace) {
@@ -2494,6 +2525,11 @@ void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
 					       QDF_NBUF_CB_TX_VDEV_CTX(nbuf),
 					       nbuf->data,
 					       qdf_nbuf_tx_get_band(nbuf));
+		qdf_log_pkt_cstats(nbuf->data + QDF_NBUF_SRC_MAC_OFFSET,
+				   nbuf->data + QDF_NBUF_DEST_MAC_OFFSET,
+				   pkt_type, subtype, QDF_TX,
+				   qdf_tx_status, QDF_NBUF_CB_TX_VDEV_CTX(nbuf),
+				   op_mode);
 	}
 
 	if (qdf_dp_enable_check(nbuf, code, QDF_TX) == false)

+ 99 - 0
umac/cp_stats/core/src/wlan_cp_stats_chipset_stats.c

@@ -284,4 +284,103 @@ int wlan_cp_stats_cstats_send_buffer_to_user(enum cstats_types type)
 
 	return ret;
 }
+
+static inline enum cstats_pkt_type
+get_cstat_type(enum qdf_proto_type type,
+	       enum qdf_proto_subtype subtype)
+{
+	if (type == QDF_PROTO_TYPE_EAPOL) {
+		if (subtype == QDF_PROTO_EAPOL_M1)
+			return CSTATS_EAPOL_M1;
+		else if (subtype == QDF_PROTO_EAPOL_M2)
+			return CSTATS_EAPOL_M2;
+		else if (subtype == QDF_PROTO_EAPOL_M3)
+			return CSTATS_EAPOL_M3;
+		else if (subtype == QDF_PROTO_EAPOL_M4)
+			return CSTATS_EAPOL_M4;
+	} else if (type == QDF_PROTO_TYPE_DHCP) {
+		if (subtype == QDF_PROTO_DHCP_DISCOVER)
+			return CSTATS_DHCP_DISCOVER;
+		else if (subtype == QDF_PROTO_DHCP_REQUEST)
+			return CSTATS_DHCP_REQ;
+		else if (subtype == QDF_PROTO_DHCP_OFFER)
+			return CSTATS_DHCP_OFFER;
+		else if (subtype == QDF_PROTO_DHCP_ACK)
+			return CSTATS_DHCP_ACK;
+		else if (subtype == QDF_PROTO_DHCP_NACK)
+			return CSTATS_DHCP_NACK;
+		else if (subtype == QDF_PROTO_DHCP_RELEASE)
+			return CSTATS_DHCP_RELEASE;
+		else if (subtype == QDF_PROTO_DHCP_DECLINE)
+			return CSTATS_DHCP_DECLINE;
+		else if (subtype == QDF_PROTO_DHCP_INFORM)
+			return CSTATS_DHCP_INFORM;
+	}
+
+	return CSTATS_PKT_TYPE_INVALID;
+}
+
+static inline enum cstats_dir
+get_cstat_dir(enum qdf_proto_dir dir)
+{
+	switch (dir) {
+	case QDF_TX:
+		return CSTATS_DIR_TX;
+	case QDF_RX:
+		return CSTATS_DIR_RX;
+	default:
+		return CSTATS_DIR_INVAL;
+	}
+}
+
+static inline enum cstats_pkt_status
+get_cstat_pkt_status(enum qdf_dp_tx_rx_status status)
+{
+	switch (status) {
+	case QDF_TX_RX_STATUS_INVALID:
+		return CSTATS_STATUS_INVALID;
+	case QDF_TX_RX_STATUS_OK:
+		return CSTATS_TX_STATUS_OK;
+	case QDF_TX_RX_STATUS_FW_DISCARD:
+		return CSTATS_TX_STATUS_FW_DISCARD;
+	case QDF_TX_RX_STATUS_NO_ACK:
+		return CSTATS_TX_STATUS_NO_ACK;
+	case QDF_TX_RX_STATUS_DROP:
+		return CSTATS_TX_STATUS_DROP;
+	case QDF_TX_RX_STATUS_DOWNLOAD_SUCC:
+		return CSTATS_TX_STATUS_DOWNLOAD_SUCC;
+	case QDF_TX_RX_STATUS_DEFAULT:
+		return CSTATS_TX_STATUS_DEFAULT;
+	default:
+		return CSTATS_STATUS_INVALID;
+	}
+}
+
+void wlan_cp_stats_cstats_pkt_log(uint8_t *sa, uint8_t *da,
+				  enum qdf_proto_type pkt_type,
+				  enum qdf_proto_subtype subtype,
+				  enum qdf_proto_dir dir,
+				  enum qdf_dp_tx_rx_status status,
+				  uint8_t vdev_id,
+				  enum QDF_OPMODE op_mode)
+{
+	struct cstats_pkt_info stat = {0};
+
+	stat.cmn.hdr.evt_id = WLAN_CHIPSET_STATS_DATA_PKT_EVENT_ID;
+	stat.cmn.hdr.length = sizeof(struct cstats_pkt_info) -
+				sizeof(struct cstats_hdr);
+	stat.cmn.opmode = op_mode;
+	stat.cmn.vdev_id = vdev_id;
+	stat.cmn.timestamp_us = qdf_get_time_of_the_day_us();
+	stat.cmn.time_tick = qdf_get_log_timestamp();
+
+	CSTATS_MAC_COPY(stat.src_mac, sa);
+	CSTATS_MAC_COPY(stat.dst_mac, da);
+
+	stat.type = get_cstat_type(pkt_type, subtype);
+	stat.dir = get_cstat_dir(dir);
+	stat.status = get_cstat_pkt_status(status);
+
+	wlan_cstats_host_stats(sizeof(struct cstats_pkt_info), &stat);
+}
 #endif /* WLAN_CHIPSET_STATS */

+ 22 - 0
umac/cp_stats/dispatcher/inc/wlan_cp_stats_chipset_stats.h

@@ -19,6 +19,8 @@
 #define MAX_CSTATS_NODE_COUNT 256
 #define MAX_CSTATS_VERSION_BUFF_LENGTH 100
 
+#define CSTATS_QMI_EVENT_TYPE 1
+
 #define ANI_NL_MSG_CSTATS_HOST_LOG_TYPE 110
 #define ANI_NL_MSG_CSTATS_FW_LOG_TYPE 111
 
@@ -133,6 +135,26 @@ void wlan_cp_stats_cstats_write_to_buff(enum cstats_types type,
  * Return : 0 on success and errno on failure
  */
 int wlan_cp_stats_cstats_send_buffer_to_user(enum cstats_types type);
+
+/*
+ * wlan_cp_stats_cstats_pkt_log() - Data packets stats
+ * @sa - Source addr
+ * @da - Destination addr
+ * @pkt_type - Packet type
+ * @subtype - Subtype
+ * @dir - Direction
+ * @status - Status
+ * @vdev_id - Vdev iD
+ * @op_mode - opmode
+ *
+ * Return : void
+ */
+void wlan_cp_stats_cstats_pkt_log(uint8_t *sa, uint8_t *da,
+				  enum qdf_proto_type pkt_type,
+				  enum qdf_proto_subtype subtype,
+				  enum qdf_proto_dir dir,
+				  enum qdf_dp_tx_rx_status status,
+				  uint8_t vdev_id, enum QDF_OPMODE op_mode);
 #else
 static inline QDF_STATUS wlan_cp_stats_cstats_init(void)
 {