+++ /dev/null
-From 4a7e0ac26839424e6a91d38fd126160b18a30a60 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Rapha=C3=ABl=20M=C3=A9lotte?= <raphael.melotte@mind.be>
-Date: Mon, 30 Nov 2020 12:10:46 +0100
-Subject: hostapd: Add an option to notify management frames on ctrl_iface
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-In some contexts (e.g., Multi-AP) it can be useful to have access to
-some of the management frames in upper layers (e.g., to be able to
-process the content of association requests externally).
-
-Add 'notify_mgmt_frames'. When enabled, it will notify the ctrl_iface
-when a management frame arrives using the AP-MGMT-FRAME-RECEIVED event
-message.
-
-Note that to avoid completely flooding the ctrl_iface, not all
-management frames are included (e.g., Beacon and Probe Request frames
-are excluded).
-
-Signed-off-by: Raphaël Mélotte <raphael.melotte@mind.be>
----
- hostapd/config_file.c | 2 ++
- hostapd/hostapd.conf | 4 ++++
- src/ap/ap_config.h | 2 ++
- src/ap/ieee802_11.c | 28 ++++++++++++++++++++++++++++
- src/common/wpa_ctrl.h | 3 +++
- 5 files changed, 39 insertions(+)
-
---- a/hostapd/config_file.c
-+++ b/hostapd/config_file.c
-@@ -4456,6 +4456,8 @@ static int hostapd_config_fill(struct ho
- bss->multicast_to_unicast = atoi(pos);
- } else if (os_strcmp(buf, "broadcast_deauth") == 0) {
- bss->broadcast_deauth = atoi(pos);
-+ } else if (os_strcmp(buf, "notify_mgmt_frames") == 0) {
-+ bss->notify_mgmt_frames = atoi(pos);
- #ifdef CONFIG_DPP
- } else if (os_strcmp(buf, "dpp_name") == 0) {
- os_free(bss->dpp_name);
---- a/hostapd/hostapd.conf
-+++ b/hostapd/hostapd.conf
-@@ -571,6 +571,10 @@ wmm_ac_vo_acm=0
- # Default: 1 (enabled)
- #broadcast_deauth=1
-
-+# Get notifications for received Management frames on control interface
-+# Default: 0 (disabled)
-+#notify_mgmt_frames=0
-+
- ##### IEEE 802.11n related configuration ######################################
-
- # ieee80211n: Whether IEEE 802.11n (HT) is enabled
---- a/src/ap/ap_config.h
-+++ b/src/ap/ap_config.h
-@@ -745,6 +745,8 @@ struct hostapd_bss_config {
-
- int broadcast_deauth;
-
-+ int notify_mgmt_frames;
-+
- #ifdef CONFIG_DPP
- char *dpp_name;
- char *dpp_mud_url;
---- a/src/ap/ieee802_11.c
-+++ b/src/ap/ieee802_11.c
-@@ -4880,6 +4880,31 @@ static int handle_action(struct hostapd_
-
-
- /**
-+ * notify_mgmt_frame - Notify of Management frames on the control interface
-+ * @hapd: hostapd BSS data structure (the BSS to which the Management frame was
-+ * sent to)
-+ * @buf: Management frame data (starting from the IEEE 802.11 header)
-+ * @len: Length of frame data in octets
-+ *
-+ * Notify the control interface of any received Management frame.
-+ */
-+static void notify_mgmt_frame(struct hostapd_data *hapd, const u8 *buf,
-+ size_t len)
-+{
-+
-+ int hex_len = len * 2 + 1;
-+ char *hex = os_malloc(hex_len);
-+
-+ if (hex) {
-+ wpa_snprintf_hex(hex, hex_len, buf, len);
-+ wpa_msg_ctrl(hapd->msg_ctx, MSG_INFO,
-+ AP_MGMT_FRAME_RECEIVED "buf=%s", hex);
-+ os_free(hex);
-+ }
-+}
-+
-+
-+/**
- * ieee802_11_mgmt - process incoming IEEE 802.11 management frames
- * @hapd: hostapd BSS data structure (the BSS to which the management frame was
- * sent to)
-@@ -4969,6 +4994,9 @@ int ieee802_11_mgmt(struct hostapd_data
- if (hapd->iconf->track_sta_max_num)
- sta_track_add(hapd->iface, mgmt->sa, ssi_signal);
-
-+ if (hapd->conf->notify_mgmt_frames)
-+ notify_mgmt_frame(hapd, buf, len);
-+
- switch (stype) {
- case WLAN_FC_STYPE_AUTH:
- wpa_printf(MSG_DEBUG, "mgmt::auth");
---- a/src/common/wpa_ctrl.h
-+++ b/src/common/wpa_ctrl.h
-@@ -392,6 +392,9 @@ extern "C" {
- * frame=<saqueryreq/saqueryresp> error=<error string> */
- #define OCV_FAILURE "OCV-FAILURE "
-
-+/* Event triggered for received management frame */
-+#define AP_MGMT_FRAME_RECEIVED "AP-MGMT-FRAME-RECEIVED "
-+
- #ifndef BIT
- #define BIT(x) (1U << (x))
- #endif