For multiple bssid to work we need to add a new IE to the beacon and probe responses that includes the information on the non-transmitting BSSs. Signed-off-by: John Crispin <john@xxxxxxxxxxx> --- src/ap/beacon.c | 6 +++++ src/ap/ieee802_11.h | 1 + src/ap/ieee802_11_shared.c | 47 ++++++++++++++++++++++++++++++++++++ src/common/ieee802_11_defs.h | 2 ++ 4 files changed, 56 insertions(+) diff --git a/src/ap/beacon.c b/src/ap/beacon.c index d3453102b..c62adb816 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -527,6 +527,9 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, pos = hostapd_eid_rm_enabled_capab(hapd, pos, epos - pos); pos = hostapd_get_mde(hapd, pos, epos - pos); + if (hapd->iconf->multiple_bssid) + pos = hostapd_eid_multiple_bssid(hapd, pos); + /* eCSA IE */ csa_pos = hostapd_eid_ecsa(hapd, pos); if (csa_pos != pos) @@ -1246,6 +1249,9 @@ int ieee802_11_build_ap_params(struct hostapd_data *hapd, tailend - tailpos); tailpos = hostapd_get_mde(hapd, tailpos, tailend - tailpos); + if (hapd->iconf->multiple_bssid) + tailpos = hostapd_eid_multiple_bssid(hapd, tailpos); + /* eCSA IE */ csa_pos = hostapd_eid_ecsa(hapd, tailpos); if (csa_pos != tailpos) diff --git a/src/ap/ieee802_11.h b/src/ap/ieee802_11.h index ea8c60846..16db30340 100644 --- a/src/ap/ieee802_11.h +++ b/src/ap/ieee802_11.h @@ -119,6 +119,7 @@ u8 * hostapd_eid_time_zone(struct hostapd_data *hapd, u8 *eid); int hostapd_update_time_adv(struct hostapd_data *hapd); void hostapd_client_poll_ok(struct hostapd_data *hapd, const u8 *addr); u8 * hostapd_eid_bss_max_idle_period(struct hostapd_data *hapd, u8 *eid); +u8 * hostapd_eid_multiple_bssid(struct hostapd_data *hapd, u8 *eid); int auth_sae_init_committed(struct hostapd_data *hapd, struct sta_info *sta); #ifdef CONFIG_SAE diff --git a/src/ap/ieee802_11_shared.c b/src/ap/ieee802_11_shared.c index 79ed450e2..7092a264a 100644 --- a/src/ap/ieee802_11_shared.c +++ b/src/ap/ieee802_11_shared.c @@ -6,6 +6,7 @@ * See README for more details. */ +#include <math.h> #include "utils/includes.h" #include "utils/common.h" @@ -356,6 +357,8 @@ static void hostapd_ext_capab_byte(struct hostapd_data *hapd, u8 *pos, int idx) *pos |= 0x02; /* Bit 17 - WNM-Sleep Mode */ if (hapd->conf->bss_transition) *pos |= 0x08; /* Bit 19 - BSS Transition */ + if (hapd->iconf->multiple_bssid) + *pos |= 0x40; /* Bit 22 - Multiple BSSID */ break; case 3: /* Bits 24-31 */ #ifdef CONFIG_WNM_AP @@ -1122,3 +1125,47 @@ u8 * hostapd_eid_rsnxe(struct hostapd_data *hapd, u8 *eid, size_t len) return pos; } + + +u8 * hostapd_eid_multiple_bssid(struct hostapd_data *hapd, u8 *eid) +{ + u8 *size_offset; + int i; + + *eid++ = WLAN_EID_MULTIPLE_BSSID; + size_offset = eid++; + *eid = (u8)ceil(log2(hapd->iface->num_bss)); + if (*eid < 2) + *eid = 2; + eid++; + + for (i = 1; i < hapd->iface->num_bss; i++) { + struct hostapd_data *bss = hapd->iface->bss[i]; + u8 *bss_size_offset; + u16 capab_info; + + *eid++ = WLAN_EID_SUBELEMENT_NONTRANSMITTED_BSSID_PROFILE; + bss_size_offset = eid++; + + *eid++ = WLAN_EID_NONTRANSMITTED_BSSID_CAPA; + *eid++ = sizeof(capab_info); + capab_info = host_to_le16(hostapd_own_capab_info(bss)); + os_memcpy(eid, (const void*)&capab_info, sizeof(capab_info)); + eid += sizeof(capab_info); + + *eid++ = WLAN_EID_SSID; + *eid++ = bss->conf->ssid.ssid_len; + os_memcpy(eid, bss->conf->ssid.ssid, bss->conf->ssid.ssid_len); + eid += bss->conf->ssid.ssid_len; + + *eid++ = WLAN_EID_MULTIPLE_BSSID_INDEX; + *eid++ = 1; + *eid++ = i; + + *bss_size_offset = (eid - bss_size_offset) - 1; + } + + *size_offset = (eid - size_offset) - 1; + + return eid; +} diff --git a/src/common/ieee802_11_defs.h b/src/common/ieee802_11_defs.h index 3fc4200a0..a7c846088 100644 --- a/src/common/ieee802_11_defs.h +++ b/src/common/ieee802_11_defs.h @@ -451,6 +451,8 @@ #define WLAN_EID_RSNX 244 #define WLAN_EID_EXTENSION 255 +#define WLAN_EID_SUBELEMENT_NONTRANSMITTED_BSSID_PROFILE 0 + /* Element ID Extension (EID 255) values */ #define WLAN_EID_EXT_ASSOC_DELAY_INFO 1 #define WLAN_EID_EXT_FILS_REQ_PARAMS 2 -- 2.20.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap