[PATCH 05/13] mbssid: add multiple BSSID elements
Aloka Dixit
quic_alokad at quicinc.com
Thu Apr 21 13:05:57 PDT 2022
On 4/7/2022 1:30 PM, Jouni Malinen wrote:
> On Wed, Mar 02, 2022 at 02:26:26PM -0800, Aloka Dixit wrote:
>> Add data as per IEEE Std 802.11-2020 9.4.2.45 Multiple BSSID element.
>> Include this element in beacons and probe response frames when mbssid
>> is enabled. Split the BSSes into multiple elements if the data
>> does not fit in 255 bytes allowed for a single element.
>>
>
>> @@ -462,8 +510,11 @@ static u8 * hostapd_gen_probe_resp(struct hostapd_data *hapd,
>> + buflen += hostapd_eid_mbssid_len(hapd, WLAN_FC_STYPE_PROBE_RESP, NULL);
> ...
>> + pos = hostapd_eid_mbssid(hapd, pos, epos, WLAN_FC_STYPE_PROBE_RESP, 0,
>> + NULL);
>
> Is there something preventing the case of this Probe Response frame
> ending up being too long to fit within the maximum MMPDU length if there
> is a large number of nontransmitted BSSIDs?
>
Hi Jouni,
Not really, but in practice I haven't seen it overflowing yet with 16
BSSes with currently supported data.
Please let me know if you think we should add extra length checks here.
>> +
>> +static size_t hostapd_eid_mbssid_elem_len(struct hostapd_data *hapd,
>> + u32 frame_type, size_t *bss_index)
>> +{
>> + size_t len = 3, i;
>> +
>> + for (i = *bss_index; i < hapd->iface->num_bss; i++) {
>> + struct hostapd_data *bss = hapd->iface->bss[i];
>> + const u8 *auth, *rsn, *rsnx;
>> + size_t nontx_profile_len, auth_len;
>> +
>> + if (!bss || !bss->conf || !bss->started)
>> + continue;
>> +
>> + /*
>> + * Sublement ID: 1 byte
>> + * Length: 1 byte
>> + * Nontransmitted capabilities: 4 bytes
>> + * SSID element: 2 + variable
>> + * Multiple BSSID Index Element: 3 bytes (+2 bytes in beacons)
>> + * Fixed length = 1 + 1 + 4 + 2 + 3 = 11
>> + */
>> + nontx_profile_len = 11 + bss->conf->ssid.ssid_len;
>> +
>> + if (frame_type == WLAN_FC_STYPE_BEACON)
>> + nontx_profile_len += 2;
>> +
>> + auth = wpa_auth_get_wpa_ie(bss->wpa_auth, &auth_len);
>> + if (auth) {
>> + rsn = get_ie(auth, auth_len, WLAN_EID_RSN);
>> + if (rsn)
>> + nontx_profile_len += (2 + rsn[1]);
>> +
>> + rsnx = get_ie(auth, auth_len, WLAN_EID_RSNX);
>> + if (rsnx)
>> + nontx_profile_len += (2 + rsnx[1]);
>> + }
>
> Are those all the elements that are needed here? There seems to be a lot
> of other things that could differ between the nontransmitted BSSIDs and
> the transmitted BSSID. The same would obviously apply to
> hostapd_eid_mbssid_elem() below.
>
Radio properties are same as the transmitting one.
I have currently included the details required for a successful
association with a non-transmitting profile.
It is not possible to cover all elements without enabling all advanced
features. So I hope that whoever enables particular feature with MBSSID
will take care of modifying this function as well.
>> diff --git a/src/drivers/driver.h b/src/drivers/driver.h
>> + /**
>> + * mbssid_elem - Buffer containing all multiple BSSID elements
>> + */
>> + u8 *mbssid_elem;
>
> Should that be const u8 * instead?
>
No, this field is similar to head, tail etc in the same struct. Warning
is seen if os_free() is called on a 'const' pointer.
>> + /**
>> + * mbssid_elem_offset - Offsets to elements in mbssid_elem.
>> + * Kernel will use these offsets to generate multiple BSSID beacons.
>> + */
>> + u8 **mbssid_elem_offset;
>
> const?
>
Same as above.
Thanks.
More information about the Hostap
mailing list