mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-19 18:31:33 +00:00
130 lines
4.4 KiB
Diff
130 lines
4.4 KiB
Diff
From f9047ae8430692dc4af02533f2aff436645c20f7 Mon Sep 17 00:00:00 2001
|
|
From: John Crispin <john@phrozen.org>
|
|
Date: Wed, 12 Aug 2020 18:29:29 +0200
|
|
Subject: [PATCH 805/820] multiple_bssid: always use the transmitting BSSs when
|
|
generating the beacons
|
|
|
|
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@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
|
|
|