| --- a/src/ap/hostapd.h |
| +++ b/src/ap/hostapd.h |
| @@ -162,6 +162,21 @@ struct hostapd_sae_commit_queue { |
| }; |
| |
| /** |
| + * 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 { |
| @@ -175,6 +190,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/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->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", |
| @@ -659,10 +660,12 @@ int ieee802_11_rx_wnm_action_ap(struct h |
| |
| switch (action) { |
| 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; |
| @@ -709,6 +712,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) { |
| @@ -790,6 +794,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); |
| @@ -870,6 +875,7 @@ int wnm_send_bss_tm_req(struct hostapd_d |
| } |
| os_free(buf); |
| |
| + hapd->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->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); |