Add the multiple bssid IEs to the probe response. If this is a unicast request only add the requested non-transmitting BSS. Beacons track the IEs in an additional array and pass them to the kernel which will be responsible for creating the EMA beacons. When generating a beacon or probe response for a non transmitting BSS, always use the transmittings BSSs data. If this is a legacy beacon, the helper becomes a no-op. Signed-off-by: John Crispin <john@xxxxxxxxxxx> --- src/ap/beacon.c | 30 ++++++++++++++++++++++++++++-- src/ap/ieee802_11_shared.c | 2 ++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/ap/beacon.c b/src/ap/beacon.c index 4988ee2a1..c59842edc 100644 --- a/src/ap/beacon.c +++ b/src/ap/beacon.c @@ -293,7 +293,7 @@ static const u8 * hostapd_vendor_wpa_ie(struct hostapd_data *hapd, } -static u8 * hostapd_get_rsne(struct hostapd_data *hapd, u8 *pos, size_t len) +u8 * hostapd_get_rsne(struct hostapd_data *hapd, u8 *pos, size_t len) { const u8 *ie; @@ -436,6 +436,9 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, u8 *pos, *epos, *csa_pos; size_t buflen; + if (hapd->iconf->multiple_bssid) + hapd = hostapd_get_primary_bss(hapd); + #define MAX_PROBERESP_LEN 768 buflen = MAX_PROBERESP_LEN; #ifdef CONFIG_WPS @@ -472,6 +475,8 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd, buflen += hostapd_mbo_ie_len(hapd); buflen += hostapd_eid_owe_trans_len(hapd); buflen += hostapd_eid_dpp_cc_len(hapd); + if (hapd->iconf->multiple_bssid) + buflen += hostapd_eid_multiple_bssid_len(hapd); resp = os_zalloc(buflen); if (resp == NULL) @@ -527,6 +532,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, epos, 0, NULL, 0, 0); + /* eCSA IE */ csa_pos = hostapd_eid_ecsa(hapd, pos); if (csa_pos != pos) @@ -818,6 +826,10 @@ void handle_probe_req(struct hostapd_data *hapd, size_t csa_offs_len; struct radius_sta rad_info; + if (hapd->iconf->multiple_bssid && + hapd != hostapd_get_primary_bss(hapd)) + return; + if (len < IEEE80211_HDRLEN) return; ie = ((const u8 *) mgmt) + IEEE80211_HDRLEN; @@ -1061,7 +1073,7 @@ void handle_probe_req(struct hostapd_data *hapd, hapd->cs_c_off_ecsa_proberesp; } - ret = hostapd_drv_send_mlme(hapd, resp, resp_len, noack, + ret = hostapd_drv_send_mlme(hostapd_get_primary_bss(hapd), resp, resp_len, noack, csa_offs_len ? csa_offs : NULL, csa_offs_len, 0); @@ -1461,6 +1473,8 @@ void ieee802_11_free_ap_params(struct wpa_driver_ap_params *params) params->head = NULL; os_free(params->proberesp); params->proberesp = NULL; + os_free(params->multiple_bssid_ies); + params->multiple_bssid_ies = NULL; } @@ -1507,8 +1521,20 @@ int ieee802_11_set_beacon(struct hostapd_data *hapd) IEEE80211_MODE_AP); #endif /* CONFIG_IEEE80211AX */ if (hapd->iconf->multiple_bssid) { + int len = hostapd_eid_multiple_bssid_len(hapd); + u8 *end; + params.multiple_bssid_index = hostapd_get_bss_index(hapd); params.multiple_bssid_count = iface->num_bss; + params.multiple_bssid_ies = os_zalloc(len); + if (params.multiple_bssid_ies == NULL) + goto fail; + end = hostapd_eid_multiple_bssid(hapd, params.multiple_bssid_ies, + params.multiple_bssid_ies + len, + 1, params.multiple_bssid_ie_offsets, + ¶ms.multiple_bssid_ie_count, + MULTIPLE_BSSID_IE_MAX); + params.multiple_bssid_ie_len = end - params.multiple_bssid_ies; } hapd->reenable_beacon = 0; diff --git a/src/ap/ieee802_11_shared.c b/src/ap/ieee802_11_shared.c index 79ed450e2..961e91e66 100644 --- a/src/ap/ieee802_11_shared.c +++ b/src/ap/ieee802_11_shared.c @@ -356,6 +356,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 -- 2.25.1 _______________________________________________ Hostap mailing list Hostap@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/hostap