diff --git a/hostapd/config_file.c b/hostapd/config_file.c index cf0853bfd..093dc4f37 100644 --- a/hostapd/config_file.c +++ b/hostapd/config_file.c @@ -4368,6 +4368,8 @@ static int hostapd_config_fill(struct hostapd_config *conf, 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); diff --git a/hostapd/hostapd.conf b/hostapd/hostapd.conf index 666c4e133..6666153a7 100644 --- 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 diff --git a/src/ap/ap_config.h b/src/ap/ap_config.h index fb153c40b..abe58532e 100644 --- a/src/ap/ap_config.h +++ b/src/ap/ap_config.h @@ -736,6 +736,8 @@ struct hostapd_bss_config { int broadcast_deauth; + int notify_mgmt_frames; + #ifdef CONFIG_DPP char *dpp_name; char *dpp_mud_url; diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index daf73efb0..595718f42 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -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 * @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) 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"); diff --git a/src/common/wpa_ctrl.h b/src/common/wpa_ctrl.h index 0f4208518..5688b6fdb 100644 --- a/src/common/wpa_ctrl.h +++ b/src/common/wpa_ctrl.h @@ -404,6 +404,9 @@ extern "C" { * frame= error= */ #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