hostapd: add OpenWrt specific statistic counters
[openwrt/staging/mkresin.git] / package / network / services / hostapd / patches / 590-rrm-wnm-statistics.patch
diff --git a/package/network/services/hostapd/patches/590-rrm-wnm-statistics.patch b/package/network/services/hostapd/patches/590-rrm-wnm-statistics.patch
new file mode 100644 (file)
index 0000000..feb3b09
--- /dev/null
@@ -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);