From 0f0aa2a640ff1a1037c7f3323009bb1d12e7a6cd Mon Sep 17 00:00:00 2001 From: Ankita Bajaj Date: Tue, 16 Oct 2018 20:02:19 +0530 Subject: [PATCH] OCE: Move OCE checks to IE formation from hostapd initialization Earlier, the OCE flags were checked during hostapd initialization. This doesn't address few cases like for example when the interface is added from control interface. Move the OCE flag checks to the functions that are forming the MBO/OCE IEs to cover all the different paths for enabling a BSS. Also use macros as appropriate for readability. Signed-off-by: Jouni Malinen --- hostapd/main.c | 23 ++--------------------- src/ap/ap_drv_ops.c | 3 ++- src/ap/hostapd.h | 12 +++++++----- src/ap/ieee802_11_shared.c | 13 +++++++------ 4 files changed, 18 insertions(+), 33 deletions(-) diff --git a/hostapd/main.c b/hostapd/main.c index cbeb6075b..61da9be19 100644 --- a/hostapd/main.c +++ b/hostapd/main.c @@ -873,27 +873,8 @@ int main(int argc, char *argv[]) */ interfaces.terminate_on_error = interfaces.count; for (i = 0; i < interfaces.count; i++) { - if (hostapd_driver_init(interfaces.iface[i])) - goto out; -#ifdef CONFIG_MBO - for (j = 0; j < interfaces.iface[i]->num_bss; j++) { - struct hostapd_data *hapd = interfaces.iface[i]->bss[j]; - - if (hapd && (hapd->conf->oce & OCE_STA_CFON) && - (interfaces.iface[i]->drv_flags & - WPA_DRIVER_FLAGS_OCE_STA_CFON)) - hapd->enable_oce = OCE_STA_CFON; - - if (hapd && (hapd->conf->oce & OCE_AP) && - (interfaces.iface[i]->drv_flags & - WPA_DRIVER_FLAGS_OCE_STA_CFON)) { - /* TODO: Need to add OCE-AP support */ - wpa_printf(MSG_ERROR, - "OCE-AP feature is not yet supported"); - } - } -#endif /* CONFIG_MBO */ - if (hostapd_setup_interface(interfaces.iface[i])) + if (hostapd_driver_init(interfaces.iface[i]) || + hostapd_setup_interface(interfaces.iface[i])) goto out; } diff --git a/src/ap/ap_drv_ops.c b/src/ap/ap_drv_ops.c index 728d7f098..067cf863e 100644 --- a/src/ap/ap_drv_ops.c +++ b/src/ap/ap_drv_ops.c @@ -176,7 +176,8 @@ int hostapd_build_ap_extra_ies(struct hostapd_data *hapd, #endif /* CONFIG_HS20 */ #ifdef CONFIG_MBO - if (hapd->conf->mbo_enabled || hapd->enable_oce) { + if (hapd->conf->mbo_enabled || + OCE_STA_CFON_ENABLED(hapd) || OCE_AP_ENABLED(hapd)) { pos = hostapd_eid_mbo(hapd, buf, sizeof(buf)); if (add_buf_data(&beacon, buf, pos - buf) < 0 || add_buf_data(&proberesp, buf, pos - buf) < 0 || diff --git a/src/ap/hostapd.h b/src/ap/hostapd.h index 9a520f3a9..d304c1171 100644 --- a/src/ap/hostapd.h +++ b/src/ap/hostapd.h @@ -14,6 +14,13 @@ #include "ap_config.h" #include "drivers/driver.h" +#define OCE_STA_CFON_ENABLED(hapd) \ + ((hapd->conf->oce & OCE_STA_CFON) && \ + (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_OCE_STA_CFON)) +#define OCE_AP_ENABLED(hapd) \ + ((hapd->conf->oce & OCE_AP) && \ + (hapd->iface->drv_flags & WPA_DRIVER_FLAGS_OCE_AP)) + struct wpa_ctrl_dst; struct radius_server_data; struct upnp_wps_device_sm; @@ -324,11 +331,6 @@ struct hostapd_data { #ifdef CONFIG_MBO unsigned int mbo_assoc_disallow; - /** - * enable_oce - Enable OCE if it is enabled by user and device also - * supports OCE. - */ - u8 enable_oce; #endif /* CONFIG_MBO */ struct dl_list nr_db; diff --git a/src/ap/ieee802_11_shared.c b/src/ap/ieee802_11_shared.c index c48139965..49e9bf8cc 100644 --- a/src/ap/ieee802_11_shared.c +++ b/src/ap/ieee802_11_shared.c @@ -552,7 +552,8 @@ u8 * hostapd_eid_mbo(struct hostapd_data *hapd, u8 *eid, size_t len) u8 mbo[9], *mbo_pos = mbo; u8 *pos = eid; - if (!hapd->conf->mbo_enabled && !hapd->enable_oce) + if (!hapd->conf->mbo_enabled && + !OCE_STA_CFON_ENABLED(hapd) && !OCE_AP_ENABLED(hapd)) return eid; if (hapd->conf->mbo_enabled) { @@ -568,12 +569,11 @@ u8 * hostapd_eid_mbo(struct hostapd_data *hapd, u8 *eid, size_t len) *mbo_pos++ = hapd->mbo_assoc_disallow; } - if (hapd->enable_oce & (OCE_AP | OCE_STA_CFON)) { + if (OCE_STA_CFON_ENABLED(hapd) || OCE_AP_ENABLED(hapd)) { u8 ctrl; ctrl = OCE_RELEASE; - if ((hapd->enable_oce & (OCE_AP | OCE_STA_CFON)) == - OCE_STA_CFON) + if (OCE_STA_CFON_ENABLED(hapd) && !OCE_AP_ENABLED(hapd)) ctrl |= OCE_IS_STA_CFON; *mbo_pos++ = OCE_ATTR_ID_CAPA_IND; @@ -591,7 +591,8 @@ u8 hostapd_mbo_ie_len(struct hostapd_data *hapd) { u8 len; - if (!hapd->conf->mbo_enabled && !hapd->enable_oce) + if (!hapd->conf->mbo_enabled && + !OCE_STA_CFON_ENABLED(hapd) && !OCE_AP_ENABLED(hapd)) return 0; /* @@ -603,7 +604,7 @@ u8 hostapd_mbo_ie_len(struct hostapd_data *hapd) len += 3 + (hapd->mbo_assoc_disallow ? 3 : 0); /* OCE capability indication attribute (3) */ - if (hapd->enable_oce & (OCE_AP | OCE_STA_CFON)) + if (OCE_STA_CFON_ENABLED(hapd) || OCE_AP_ENABLED(hapd)) len += 3; return len;