From dc0c05524acf83db6116f1ec724f0ba59f8aa4c3 Mon Sep 17 00:00:00 2001 From: Yeshwanth Sriram Guntuka Date: Wed, 26 Feb 2020 14:43:31 +0530 Subject: [PATCH] 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 --- core/hdd/inc/wlan_hdd_main.h | 48 +++++++++++++++++++++++++ core/hdd/src/wlan_hdd_tx_rx.c | 68 +++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 47c3a1fa4e7e..e9c9972e1cb5 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -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; }; /** diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index cac63c7ca532..674316b4f22b 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -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(