From: David Bauer Date: Sat, 27 Nov 2021 22:08:28 +0100 Subject: [PATCH] hostapd: add OpenWrt specific statistic counters This adds a new struct for storing statistics not (yet) tracked by hostapd regarding RRM and WNM activity. These statistics can be read using the get_status hostapd interface ubus method. --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -185,6 +185,21 @@ struct mld_link_info { }; /** + * struct hostapd_openwrt_stats - OpenWrt custom STA/AP statistics + */ +struct hostapd_openwrt_stats { + struct { + u64 neighbor_report_tx; + } rrm; + + struct { + u64 bss_transition_query_rx; + u64 bss_transition_request_tx; + u64 bss_transition_response_rx; + } wnm; +}; + +/** * struct hostapd_data - hostapd per-BSS data structure */ struct hostapd_data { @@ -198,6 +213,9 @@ struct hostapd_data { u8 own_addr[ETH_ALEN]; + /* OpenWrt specific statistics */ + struct hostapd_openwrt_stats openwrt_stats; + int num_sta; /* number of entries in sta_list */ struct sta_info *sta_list; /* STA info list head */ #define STA_HASH_SIZE 256 --- a/src/ap/rrm.c +++ b/src/ap/rrm.c @@ -269,6 +269,8 @@ static void hostapd_send_nei_report_resp } } + hapd->openwrt_stats.rrm.neighbor_report_tx++; + hostapd_drv_send_action(hapd, hapd->iface->freq, 0, addr, wpabuf_head(buf), wpabuf_len(buf)); wpabuf_free(buf); --- a/src/ap/wnm_ap.c +++ b/src/ap/wnm_ap.c @@ -410,6 +410,7 @@ static int ieee802_11_send_bss_trans_mgm mgmt->u.action.u.bss_tm_req.validity_interval = 1; pos = mgmt->u.action.u.bss_tm_req.variable; + hapd->openwrt_stats.wnm.bss_transition_request_tx++; wpa_printf(MSG_DEBUG, "WNM: Send BSS Transition Management Request to " MACSTR " dialog_token=%u req_mode=0x%x disassoc_timer=%u " "validity_interval=%u", @@ -814,10 +815,12 @@ int ieee802_11_rx_wnm_action_ap(struct h plen); return 0; case WNM_BSS_TRANS_MGMT_QUERY: + hapd->openwrt_stats.wnm.bss_transition_query_rx++; ieee802_11_rx_bss_trans_mgmt_query(hapd, mgmt->sa, payload, plen); return 0; case WNM_BSS_TRANS_MGMT_RESP: + hapd->openwrt_stats.wnm.bss_transition_response_rx++; ieee802_11_rx_bss_trans_mgmt_resp(hapd, mgmt->sa, payload, plen); return 0; @@ -865,6 +868,7 @@ int wnm_send_disassoc_imminent(struct ho pos = mgmt->u.action.u.bss_tm_req.variable; + hapd->openwrt_stats.wnm.bss_transition_request_tx++; wpa_printf(MSG_DEBUG, "WNM: Send BSS Transition Management Request frame to indicate imminent disassociation (disassoc_timer=%d) to " MACSTR, disassoc_timer, MAC2STR(sta->addr)); if (hostapd_drv_send_mlme(hapd, buf, pos - buf, 0, NULL, 0, 0) < 0) { @@ -947,6 +951,7 @@ int wnm_send_ess_disassoc_imminent(struc return -1; } + hapd->openwrt_stats.wnm.bss_transition_request_tx++; if (disassoc_timer) { /* send disassociation frame after time-out */ set_disassoc_timer(hapd, sta, disassoc_timer); @@ -1028,6 +1033,7 @@ int wnm_send_bss_tm_req(struct hostapd_d } os_free(buf); + hapd->openwrt_stats.wnm.bss_transition_request_tx++; if (disassoc_timer) { #ifdef CONFIG_IEEE80211BE if (ap_sta_is_mld(hapd, sta)) {