hostapd: Add an option to notify management frames on ctrl_iface

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>
This commit is contained in:
Raphaël Mélotte 2020-11-30 12:10:46 +01:00 committed by Jouni Malinen
parent e79febb3f5
commit 4a7e0ac268
5 changed files with 39 additions and 0 deletions

View file

@ -4368,6 +4368,8 @@ static int hostapd_config_fill(struct hostapd_config *conf,
bss->multicast_to_unicast = atoi(pos); bss->multicast_to_unicast = atoi(pos);
} else if (os_strcmp(buf, "broadcast_deauth") == 0) { } else if (os_strcmp(buf, "broadcast_deauth") == 0) {
bss->broadcast_deauth = atoi(pos); bss->broadcast_deauth = atoi(pos);
} else if (os_strcmp(buf, "notify_mgmt_frames") == 0) {
bss->notify_mgmt_frames = atoi(pos);
#ifdef CONFIG_DPP #ifdef CONFIG_DPP
} else if (os_strcmp(buf, "dpp_name") == 0) { } else if (os_strcmp(buf, "dpp_name") == 0) {
os_free(bss->dpp_name); os_free(bss->dpp_name);

View file

@ -571,6 +571,10 @@ wmm_ac_vo_acm=0
# Default: 1 (enabled) # Default: 1 (enabled)
#broadcast_deauth=1 #broadcast_deauth=1
# Get notifications for received Management frames on control interface
# Default: 0 (disabled)
#notify_mgmt_frames=0
##### IEEE 802.11n related configuration ###################################### ##### IEEE 802.11n related configuration ######################################
# ieee80211n: Whether IEEE 802.11n (HT) is enabled # ieee80211n: Whether IEEE 802.11n (HT) is enabled

View file

@ -736,6 +736,8 @@ struct hostapd_bss_config {
int broadcast_deauth; int broadcast_deauth;
int notify_mgmt_frames;
#ifdef CONFIG_DPP #ifdef CONFIG_DPP
char *dpp_name; char *dpp_name;
char *dpp_mud_url; char *dpp_mud_url;

View file

@ -6023,6 +6023,31 @@ static int handle_action(struct hostapd_data *hapd,
} }
/**
* 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 * ieee802_11_mgmt - process incoming IEEE 802.11 management frames
* @hapd: hostapd BSS data structure (the BSS to which the management frame was * @hapd: hostapd BSS data structure (the BSS to which the management frame was
@ -6113,6 +6138,9 @@ int ieee802_11_mgmt(struct hostapd_data *hapd, const u8 *buf, size_t len,
if (hapd->iconf->track_sta_max_num) if (hapd->iconf->track_sta_max_num)
sta_track_add(hapd->iface, mgmt->sa, ssi_signal); sta_track_add(hapd->iface, mgmt->sa, ssi_signal);
if (hapd->conf->notify_mgmt_frames)
notify_mgmt_frame(hapd, buf, len);
switch (stype) { switch (stype) {
case WLAN_FC_STYPE_AUTH: case WLAN_FC_STYPE_AUTH:
wpa_printf(MSG_DEBUG, "mgmt::auth"); wpa_printf(MSG_DEBUG, "mgmt::auth");

View file

@ -404,6 +404,9 @@ extern "C" {
* frame=<saqueryreq/saqueryresp> error=<error string> */ * frame=<saqueryreq/saqueryresp> error=<error string> */
#define OCV_FAILURE "OCV-FAILURE " #define OCV_FAILURE "OCV-FAILURE "
/* Event triggered for received management frame */
#define AP_MGMT_FRAME_RECEIVED "AP-MGMT-FRAME-RECEIVED "
#ifndef BIT #ifndef BIT
#define BIT(x) (1U << (x)) #define BIT(x) (1U << (x))
#endif #endif