qcacmn: Add chipset stats for EAPOL/DHCP packets

Add chipset stats for EAPOL/DHCP packets.

Change-Id: Icaabd64a84f57b7a556cb7c463fc19cfe0780a2b
CRs-Fixed: 3783005
このコミットが含まれているのは:
Nirav Shah
2024-04-07 09:31:54 +05:30
committed by Ravindra Konda
コミット 6d412727f1
3個のファイルの変更158行の追加1行の削除

ファイルの表示

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

ファイルの表示

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

ファイルの表示

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