qcacld-3.0: Add support to collect EAPOL and DHCP stats

Add support to collect stats for EAPOL and DHCP packets.

Change-Id: Ibdf27a0ed2f23edca4952c63570d3f56af62b1ab
CRs-Fixed: 2650218
This commit is contained in:
Yeshwanth Sriram Guntuka 2020-02-26 14:43:31 +05:30 • committed by nshrivas
commit dc0c05524a
2 changed files with 116 additions and 0 deletions

View file

@ -611,6 +611,52 @@ struct hdd_peer_stats {
uint32_t fcs_count;
};
#define MAX_SUBTYPES_TRACKED 4
/**
* struct hdd_eapol_stats_s - eapol debug stats count
* @eapol_m1_count: eapol m1 count
* @eapol_m2_count: eapol m2 count
* @eapol_m3_count: eapol m3 count
* @eapol_m4_count: eapol m4 count
* @tx_dropped: no of tx frames dropped by host
* @tx_noack_cnt: no of frames for which there is no ack
* @rx_delivered: no. of frames delivered to network stack
* @rx_refused: no of frames not delivered to network stack
*/
struct hdd_eapol_stats_s {
uint16_t eapol_m1_count;
uint16_t eapol_m2_count;
uint16_t eapol_m3_count;
uint16_t eapol_m4_count;
uint16_t tx_dropped[MAX_SUBTYPES_TRACKED];
uint16_t tx_noack_cnt[MAX_SUBTYPES_TRACKED];
uint16_t rx_delivered[MAX_SUBTYPES_TRACKED];
uint16_t rx_refused[MAX_SUBTYPES_TRACKED];
};
/**
* struct hdd_dhcp_stats_s - dhcp debug stats count
* @dhcp_dis_count: dhcp discovery count
* @dhcp_off_count: dhcp offer count
* @dhcp_req_count: dhcp request count
* @dhcp_ack_count: dhcp ack count
* @tx_dropped: no of tx frames dropped by host
* @tx_noack_cnt: no of frames for which there is no ack
* @rx_delivered: no. of frames delivered to network stack
* @rx_refused: no of frames not delivered to network stack
*/
struct hdd_dhcp_stats_s {
uint16_t dhcp_dis_count;
uint16_t dhcp_off_count;
uint16_t dhcp_req_count;
uint16_t dhcp_ack_count;
uint16_t tx_dropped[MAX_SUBTYPES_TRACKED];
uint16_t tx_noack_cnt[MAX_SUBTYPES_TRACKED];
uint16_t rx_delivered[MAX_SUBTYPES_TRACKED];
uint16_t rx_refused[MAX_SUBTYPES_TRACKED];
};
struct hdd_stats {
tCsrSummaryStatsInfo summary_stat;
tCsrGlobalClassAStatsInfo class_a_stat;
@ -625,6 +671,8 @@ struct hdd_stats {
#ifdef WLAN_FEATURE_11W
struct hdd_pmf_stats hdd_pmf_stats;
#endif
struct hdd_eapol_stats_s hdd_eapol_stats;
struct hdd_dhcp_stats_s hdd_dhcp_stats;
};
/**

View file

@ -933,6 +933,9 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb,
struct wlan_objmgr_vdev *vdev;
struct hdd_context *hdd_ctx;
void *soc = cds_get_context(QDF_MODULE_ID_SOC);
enum qdf_proto_subtype subtype = QDF_PROTO_INVALID;
bool is_eapol = false;
bool is_dhcp = false;
#ifdef QCA_WIFI_FTM
if (hdd_get_conparam() == QDF_GLOBAL_FTM_MODE) {
@ -969,6 +972,26 @@ static void __hdd_hard_start_xmit(struct sk_buff *skb,
QDF_TRACE_LEVEL_INFO_HIGH,
"%s : ARP packet", __func__);
}
} else if (QDF_NBUF_CB_GET_PACKET_TYPE(skb) ==
QDF_NBUF_CB_PACKET_TYPE_EAPOL) {
subtype = qdf_nbuf_get_eapol_subtype(skb);
if (subtype == QDF_PROTO_EAPOL_M2) {
++adapter->hdd_stats.hdd_eapol_stats.eapol_m2_count;
is_eapol = true;
} else if (subtype == QDF_PROTO_EAPOL_M4) {
++adapter->hdd_stats.hdd_eapol_stats.eapol_m4_count;
is_eapol = true;
}
} else if (QDF_NBUF_CB_GET_PACKET_TYPE(skb) ==
QDF_NBUF_CB_PACKET_TYPE_DHCP) {
subtype = qdf_nbuf_get_dhcp_subtype(skb);
if (subtype == QDF_PROTO_DHCP_DISCOVER) {
++adapter->hdd_stats.hdd_dhcp_stats.dhcp_dis_count;
is_dhcp = true;
} else if (subtype == QDF_PROTO_DHCP_REQUEST) {
++adapter->hdd_stats.hdd_dhcp_stats.dhcp_req_count;
is_dhcp = true;
}
}
/* track connectivity stats */
if (adapter->pkt_type_bitmap)
@ -1171,6 +1194,12 @@ drop_pkt_accounting:
++adapter->hdd_stats.hdd_arp_stats.tx_dropped;
QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_INFO_HIGH,
"%s : ARP packet dropped", __func__);
} else if (is_eapol) {
++adapter->hdd_stats.hdd_eapol_stats.
tx_dropped[subtype - QDF_PROTO_EAPOL_M1];
} else if (is_dhcp) {
++adapter->hdd_stats.hdd_dhcp_stats.
tx_dropped[subtype - QDF_PROTO_DHCP_DISCOVER];
}
}
@ -2073,6 +2102,9 @@ QDF_STATUS hdd_rx_packet_cbk(void *adapter_context,
uint8_t pkt_type = 0;
bool track_arp = false;
struct wlan_objmgr_vdev *vdev;
enum qdf_proto_subtype subtype = QDF_PROTO_INVALID;
bool is_eapol = false;
bool is_dhcp = false;
/* Sanity check on inputs */
if (unlikely((!adapter_context) || (!rxBuf))) {
@ -2118,6 +2150,28 @@ QDF_STATUS hdd_rx_packet_cbk(void *adapter_context,
__func__);
track_arp = true;
}
} else if (qdf_nbuf_is_ipv4_eapol_pkt(skb)) {
subtype = qdf_nbuf_get_eapol_subtype(skb);
if (subtype == QDF_PROTO_EAPOL_M1) {
++adapter->hdd_stats.hdd_eapol_stats.
eapol_m1_count;
is_eapol = true;
} else if (subtype == QDF_PROTO_EAPOL_M3) {
++adapter->hdd_stats.hdd_eapol_stats.
eapol_m3_count;
is_eapol = true;
}
} else if (qdf_nbuf_is_ipv4_dhcp_pkt(skb)) {
subtype = qdf_nbuf_get_dhcp_subtype(skb);
if (subtype == QDF_PROTO_DHCP_OFFER) {
++adapter->hdd_stats.hdd_dhcp_stats.
dhcp_off_count;
is_dhcp = true;
} else if (subtype == QDF_PROTO_DHCP_ACK) {
++adapter->hdd_stats.hdd_dhcp_stats.
dhcp_ack_count;
is_dhcp = true;
}
}
/* track connectivity stats */
if (adapter->pkt_type_bitmap)
@ -2210,6 +2264,13 @@ QDF_STATUS hdd_rx_packet_cbk(void *adapter_context,
if (track_arp)
++adapter->hdd_stats.hdd_arp_stats.
rx_delivered;
if (is_eapol)
++adapter->hdd_stats.hdd_eapol_stats.
rx_delivered[subtype - QDF_PROTO_EAPOL_M1];
else if (is_dhcp)
++adapter->hdd_stats.hdd_dhcp_stats.
rx_delivered[subtype - QDF_PROTO_DHCP_DISCOVER];
/* track connectivity stats */
if (adapter->pkt_type_bitmap)
hdd_tx_rx_collect_connectivity_stats_info(
@ -2220,6 +2281,13 @@ QDF_STATUS hdd_rx_packet_cbk(void *adapter_context,
if (track_arp)
++adapter->hdd_stats.hdd_arp_stats.rx_refused;
if (is_eapol)
++adapter->hdd_stats.hdd_eapol_stats.
rx_refused[subtype - QDF_PROTO_EAPOL_M1];
else if (is_dhcp)
++adapter->hdd_stats.hdd_dhcp_stats.
rx_refused[subtype - QDF_PROTO_DHCP_DISCOVER];
/* track connectivity stats */
if (adapter->pkt_type_bitmap)
hdd_tx_rx_collect_connectivity_stats_info(