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 <jouni@codeaurora.org>
This commit is contained in:
Ankita Bajaj 2018-10-16 20:02:19 +05:30 committed by Jouni Malinen
parent 1695b4dc37
commit 0f0aa2a640
4 changed files with 18 additions and 33 deletions

View file

@ -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;
}

View file

@ -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 ||

View file

@ -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;

View file

@ -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;