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. Signed-off-by: David Bauer <mail@david-bauer.net>
This commit is contained in:
parent
a5cc9e033c
commit
16bcaa71fa
2 changed files with 105 additions and 1 deletions
|
@ -0,0 +1,92 @@
|
||||||
|
--- a/src/ap/hostapd.h
|
||||||
|
+++ b/src/ap/hostapd.h
|
||||||
|
@@ -441,6 +441,21 @@ struct hostapd_sta_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_iface - hostapd per-interface data structure
|
||||||
|
*/
|
||||||
|
struct hostapd_iface {
|
||||||
|
@@ -562,6 +577,9 @@ struct hostapd_iface {
|
||||||
|
u64 last_channel_time_busy;
|
||||||
|
u8 channel_utilization;
|
||||||
|
|
||||||
|
+ /* OpenWrt specific statistics */
|
||||||
|
+ struct hostapd_openwrt_stats openwrt_stats;
|
||||||
|
+
|
||||||
|
unsigned int chan_util_samples_sum;
|
||||||
|
unsigned int chan_util_num_sample_periods;
|
||||||
|
unsigned int chan_util_average;
|
||||||
|
--- a/src/ap/wnm_ap.c
|
||||||
|
+++ b/src/ap/wnm_ap.c
|
||||||
|
@@ -386,6 +386,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->iface->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",
|
||||||
|
@@ -646,10 +647,12 @@ int ieee802_11_rx_wnm_action_ap(struct h
|
||||||
|
|
||||||
|
switch (action) {
|
||||||
|
case WNM_BSS_TRANS_MGMT_QUERY:
|
||||||
|
+ hapd->iface->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->iface->openwrt_stats.wnm.bss_transition_response_rx++;
|
||||||
|
ieee802_11_rx_bss_trans_mgmt_resp(hapd, mgmt->sa, payload,
|
||||||
|
plen);
|
||||||
|
return 0;
|
||||||
|
@@ -696,6 +699,7 @@ int wnm_send_disassoc_imminent(struct ho
|
||||||
|
|
||||||
|
pos = mgmt->u.action.u.bss_tm_req.variable;
|
||||||
|
|
||||||
|
+ hapd->iface->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) {
|
||||||
|
@@ -777,6 +781,7 @@ int wnm_send_ess_disassoc_imminent(struc
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ hapd->iface->openwrt_stats.wnm.bss_transition_request_tx++;
|
||||||
|
if (disassoc_timer) {
|
||||||
|
/* send disassociation frame after time-out */
|
||||||
|
set_disassoc_timer(hapd, sta, disassoc_timer);
|
||||||
|
@@ -856,6 +861,7 @@ int wnm_send_bss_tm_req(struct hostapd_d
|
||||||
|
}
|
||||||
|
os_free(buf);
|
||||||
|
|
||||||
|
+ hapd->iface->openwrt_stats.wnm.bss_transition_request_tx++;
|
||||||
|
if (disassoc_timer) {
|
||||||
|
/* send disassociation frame after time-out */
|
||||||
|
set_disassoc_timer(hapd, sta, disassoc_timer);
|
||||||
|
--- a/src/ap/rrm.c
|
||||||
|
+++ b/src/ap/rrm.c
|
||||||
|
@@ -269,6 +269,8 @@ static void hostapd_send_nei_report_resp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ hapd->iface->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);
|
|
@ -406,7 +406,7 @@ hostapd_bss_get_status(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
struct blob_attr *msg)
|
struct blob_attr *msg)
|
||||||
{
|
{
|
||||||
struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj);
|
struct hostapd_data *hapd = container_of(obj, struct hostapd_data, ubus.obj);
|
||||||
void *airtime_table, *dfs_table;
|
void *airtime_table, *dfs_table, *rrm_table, *wnm_table;
|
||||||
struct os_reltime now;
|
struct os_reltime now;
|
||||||
char ssid[SSID_MAX_LEN + 1];
|
char ssid[SSID_MAX_LEN + 1];
|
||||||
char phy_name[17];
|
char phy_name[17];
|
||||||
|
@ -430,6 +430,18 @@ hostapd_bss_get_status(struct ubus_context *ctx, struct ubus_object *obj,
|
||||||
snprintf(phy_name, 17, "%s", hapd->iface->phy);
|
snprintf(phy_name, 17, "%s", hapd->iface->phy);
|
||||||
blobmsg_add_string(&b, "phy", phy_name);
|
blobmsg_add_string(&b, "phy", phy_name);
|
||||||
|
|
||||||
|
/* RRM */
|
||||||
|
rrm_table = blobmsg_open_table(&b, "rrm");
|
||||||
|
blobmsg_add_u64(&b, "neighbor_report_tx", hapd->iface->openwrt_stats.rrm.neighbor_report_tx);
|
||||||
|
blobmsg_close_table(&b, rrm_table);
|
||||||
|
|
||||||
|
/* 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_request_tx", hapd->iface->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_close_table(&b, rrm_table);
|
||||||
|
|
||||||
/* Airtime */
|
/* Airtime */
|
||||||
airtime_table = blobmsg_open_table(&b, "airtime");
|
airtime_table = blobmsg_open_table(&b, "airtime");
|
||||||
blobmsg_add_u64(&b, "time", hapd->iface->last_channel_time);
|
blobmsg_add_u64(&b, "time", hapd->iface->last_channel_time);
|
||||||
|
|
Loading…
Reference in a new issue