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:
parent
e79febb3f5
commit
4a7e0ac268
5 changed files with 39 additions and 0 deletions
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue