hostapd: make OpenWrt statistics per-BSS

WNM and RRM statistics were incorrectly per-PHY, leading to shared
statistic counters per BSS.

Signed-off-by: David Bauer <mail@david-bauer.net>
This commit is contained in:
David Bauer 2021-12-18 17:24:09 +01:00
parent 6d1e380666
commit 54cfe0774c
2 changed files with 20 additions and 20 deletions

View file

@ -1,6 +1,6 @@
--- a/src/ap/hostapd.h --- a/src/ap/hostapd.h
+++ b/src/ap/hostapd.h +++ b/src/ap/hostapd.h
@@ -441,6 +441,21 @@ struct hostapd_sta_info { @@ -148,6 +148,21 @@ struct hostapd_sae_commit_queue {
}; };
/** /**
@ -19,26 +19,26 @@
+}; +};
+ +
+/** +/**
* struct hostapd_iface - hostapd per-interface data structure * struct hostapd_data - hostapd per-BSS data structure
*/ */
struct hostapd_iface { struct hostapd_data {
@@ -562,6 +577,9 @@ struct hostapd_iface { @@ -161,6 +176,9 @@ struct hostapd_data {
u64 last_channel_time_busy;
u8 channel_utilization; u8 own_addr[ETH_ALEN];
+ /* OpenWrt specific statistics */ + /* OpenWrt specific statistics */
+ struct hostapd_openwrt_stats openwrt_stats; + struct hostapd_openwrt_stats openwrt_stats;
+ +
unsigned int chan_util_samples_sum; int num_sta; /* number of entries in sta_list */
unsigned int chan_util_num_sample_periods; struct sta_info *sta_list; /* STA info list head */
unsigned int chan_util_average; #define STA_HASH_SIZE 256
--- a/src/ap/wnm_ap.c --- a/src/ap/wnm_ap.c
+++ b/src/ap/wnm_ap.c +++ b/src/ap/wnm_ap.c
@@ -386,6 +386,7 @@ static int ieee802_11_send_bss_trans_mgm @@ -386,6 +386,7 @@ static int ieee802_11_send_bss_trans_mgm
mgmt->u.action.u.bss_tm_req.validity_interval = 1; mgmt->u.action.u.bss_tm_req.validity_interval = 1;
pos = mgmt->u.action.u.bss_tm_req.variable; pos = mgmt->u.action.u.bss_tm_req.variable;
+ hapd->iface->openwrt_stats.wnm.bss_transition_request_tx++; + hapd->openwrt_stats.wnm.bss_transition_request_tx++;
wpa_printf(MSG_DEBUG, "WNM: Send BSS Transition Management Request to " wpa_printf(MSG_DEBUG, "WNM: Send BSS Transition Management Request to "
MACSTR " dialog_token=%u req_mode=0x%x disassoc_timer=%u " MACSTR " dialog_token=%u req_mode=0x%x disassoc_timer=%u "
"validity_interval=%u", "validity_interval=%u",
@ -46,12 +46,12 @@
switch (action) { switch (action) {
case WNM_BSS_TRANS_MGMT_QUERY: case WNM_BSS_TRANS_MGMT_QUERY:
+ hapd->iface->openwrt_stats.wnm.bss_transition_query_rx++; + hapd->openwrt_stats.wnm.bss_transition_query_rx++;
ieee802_11_rx_bss_trans_mgmt_query(hapd, mgmt->sa, payload, ieee802_11_rx_bss_trans_mgmt_query(hapd, mgmt->sa, payload,
plen); plen);
return 0; return 0;
case WNM_BSS_TRANS_MGMT_RESP: case WNM_BSS_TRANS_MGMT_RESP:
+ hapd->iface->openwrt_stats.wnm.bss_transition_response_rx++; + hapd->openwrt_stats.wnm.bss_transition_response_rx++;
ieee802_11_rx_bss_trans_mgmt_resp(hapd, mgmt->sa, payload, ieee802_11_rx_bss_trans_mgmt_resp(hapd, mgmt->sa, payload,
plen); plen);
return 0; return 0;
@ -59,7 +59,7 @@
pos = mgmt->u.action.u.bss_tm_req.variable; pos = mgmt->u.action.u.bss_tm_req.variable;
+ hapd->iface->openwrt_stats.wnm.bss_transition_request_tx++; + 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 " 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)); MACSTR, disassoc_timer, MAC2STR(sta->addr));
if (hostapd_drv_send_mlme(hapd, buf, pos - buf, 0, NULL, 0, 0) < 0) { if (hostapd_drv_send_mlme(hapd, buf, pos - buf, 0, NULL, 0, 0) < 0) {
@ -67,7 +67,7 @@
return -1; return -1;
} }
+ hapd->iface->openwrt_stats.wnm.bss_transition_request_tx++; + hapd->openwrt_stats.wnm.bss_transition_request_tx++;
if (disassoc_timer) { if (disassoc_timer) {
/* send disassociation frame after time-out */ /* send disassociation frame after time-out */
set_disassoc_timer(hapd, sta, disassoc_timer); set_disassoc_timer(hapd, sta, disassoc_timer);
@ -75,7 +75,7 @@
} }
os_free(buf); os_free(buf);
+ hapd->iface->openwrt_stats.wnm.bss_transition_request_tx++; + hapd->openwrt_stats.wnm.bss_transition_request_tx++;
if (disassoc_timer) { if (disassoc_timer) {
/* send disassociation frame after time-out */ /* send disassociation frame after time-out */
set_disassoc_timer(hapd, sta, disassoc_timer); set_disassoc_timer(hapd, sta, disassoc_timer);
@ -85,7 +85,7 @@
} }
} }
+ hapd->iface->openwrt_stats.rrm.neighbor_report_tx++; + hapd->openwrt_stats.rrm.neighbor_report_tx++;
+ +
hostapd_drv_send_action(hapd, hapd->iface->freq, 0, addr, hostapd_drv_send_action(hapd, hapd->iface->freq, 0, addr,
wpabuf_head(buf), wpabuf_len(buf)); wpabuf_head(buf), wpabuf_len(buf));

View file

@ -432,14 +432,14 @@ hostapd_bss_get_status(struct ubus_context *ctx, struct ubus_object *obj,
/* RRM */ /* RRM */
rrm_table = blobmsg_open_table(&b, "rrm"); rrm_table = blobmsg_open_table(&b, "rrm");
blobmsg_add_u64(&b, "neighbor_report_tx", hapd->iface->openwrt_stats.rrm.neighbor_report_tx); blobmsg_add_u64(&b, "neighbor_report_tx", hapd->openwrt_stats.rrm.neighbor_report_tx);
blobmsg_close_table(&b, rrm_table); blobmsg_close_table(&b, rrm_table);
/* WNM */ /* WNM */
wnm_table = blobmsg_open_table(&b, "wnm"); wnm_table = blobmsg_open_table(&b, "wnm");
blobmsg_add_u64(&b, "bss_transition_query_rx", hapd->iface->openwrt_stats.wnm.bss_transition_query_rx); blobmsg_add_u64(&b, "bss_transition_query_rx", hapd->openwrt_stats.wnm.bss_transition_query_rx);
blobmsg_add_u64(&b, "bss_transition_request_tx", hapd->iface->openwrt_stats.wnm.bss_transition_request_tx); blobmsg_add_u64(&b, "bss_transition_request_tx", hapd->openwrt_stats.wnm.bss_transition_request_tx);
blobmsg_add_u64(&b, "bss_transition_response_rx", hapd->iface->openwrt_stats.wnm.bss_transition_response_rx); blobmsg_add_u64(&b, "bss_transition_response_rx", hapd->openwrt_stats.wnm.bss_transition_response_rx);
blobmsg_close_table(&b, wnm_table); blobmsg_close_table(&b, wnm_table);
/* Airtime */ /* Airtime */