[PATCH v3 6/7] multiple_bssid: always use the transmitting BSSs when generating the beacons
John Crispin
john at phrozen.org
Wed Aug 12 12:52:26 EDT 2020
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 at phrozen.org>
---
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
More information about the Hostap
mailing list