From 53f8fdb534d5222a0e852e38afde3f49832ace06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20M=C3=A9lotte?= Date: Thu, 26 Nov 2020 09:27:40 +0100 Subject: [PATCH] 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 'AP_MGMT_FRAME_RECEIVED'. Note that to avoid completely flooding the ctrl_iface, not all management frames are included (e.g. beacons are excluded). Signed-off-by: Raphaël Mélotte --- hostapd/config_file.c | 2 ++ hostapd/hostapd.conf | 4 ++++ src/ap/ap_config.h | 2 ++ src/ap/ieee802_11.c | 25 +++++++++++++++++++++++++ src/common/wpa_ctrl.h | 3 +++ 5 files changed, 36 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) { + conf->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 management frames: +# 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 @@ -1060,6 +1060,8 @@ struct hostapd_config { unsigned int airtime_update_interval; #define AIRTIME_MODE_MAX (__AIRTIME_MODE_MAX - 1) #endif /* CONFIG_AIRTIME_POLICY */ + + u8 notify_mgmt_frames; }; --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -4878,6 +4878,28 @@ static int handle_action(struct hostapd_ return 1; } +/** + * 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 IEEE 802.11 header) + * @len: length of frame data in octets + * + * Notify the control interface of any 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 @@ -4969,6 +4991,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->iconf->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 @@ -396,6 +396,9 @@ extern "C" { #define BIT(x) (1U << (x)) #endif +/* Event triggered for received management frame */ +#define AP_MGMT_FRAME_RECEIVED "AP-MGMT-FRAME-RECEIVED " + /* BSS command information masks */ #define WPA_BSS_MASK_ALL 0xFFFDFFFF