u8 * hostapd_eid_multi_ap(struct hostapd_data *hapd, u8 *eid)
{
- u8 multi_ap_val = 0;
+ struct multi_ap_params multi_ap = { 0 };
if (!hapd->conf->multi_ap)
return eid;
+
if (hapd->conf->multi_ap & BACKHAUL_BSS)
- multi_ap_val |= MULTI_AP_BACKHAUL_BSS;
+ multi_ap.capability |= MULTI_AP_BACKHAUL_BSS;
if (hapd->conf->multi_ap & FRONTHAUL_BSS)
- multi_ap_val |= MULTI_AP_FRONTHAUL_BSS;
+ multi_ap.capability |= MULTI_AP_FRONTHAUL_BSS;
- return eid + add_multi_ap_ie(eid, 9, multi_ap_val);
+ return eid + add_multi_ap_ie(eid, 9, &multi_ap);
}
}
-size_t add_multi_ap_ie(u8 *buf, size_t len, u8 value)
+size_t add_multi_ap_ie(u8 *buf, size_t len,
+ const struct multi_ap_params *multi_ap)
{
u8 *pos = buf;
+ u8 *len_ptr;
if (len < 9)
return 0;
*pos++ = WLAN_EID_VENDOR_SPECIFIC;
- *pos++ = 7; /* len */
+ len_ptr = pos; /* Length field to be set at the end */
+ pos++;
WPA_PUT_BE24(pos, OUI_WFA);
pos += 3;
*pos++ = MULTI_AP_OUI_TYPE;
+
+ /* Multi-AP Extension subelement */
*pos++ = MULTI_AP_SUB_ELEM_TYPE;
*pos++ = 1; /* len */
- *pos++ = value;
+ *pos++ = multi_ap->capability;
+
+ *len_ptr = pos - len_ptr - 1;
return pos - buf;
}
u8 nof_ies;
};
+struct multi_ap_params {
+ u8 capability;
+};
+
/* Parsed Information Elements */
struct ieee802_11_elems {
const u8 *ssid;
size_t mbo_add_ie(u8 *buf, size_t len, const u8 *attr, size_t attr_len);
-size_t add_multi_ap_ie(u8 *buf, size_t len, u8 value);
+size_t add_multi_ap_ie(u8 *buf, size_t len,
+ const struct multi_ap_params *multi_ap);
struct country_op_class {
u8 country_op_class;
if (ssid && ssid->multi_ap_backhaul_sta) {
size_t multi_ap_ie_len;
+ struct multi_ap_params multi_ap = { 0 };
+
+ multi_ap.capability = MULTI_AP_BACKHAUL_STA;
multi_ap_ie_len = add_multi_ap_ie(
wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len,
sizeof(wpa_s->sme.assoc_req_ie) -
wpa_s->sme.assoc_req_ie_len,
- MULTI_AP_BACKHAUL_STA);
+ &multi_ap);
if (multi_ap_ie_len == 0) {
wpa_printf(MSG_ERROR,
"Multi-AP: Failed to build Multi-AP IE");
if (ssid->multi_ap_backhaul_sta) {
size_t multi_ap_ie_len;
+ struct multi_ap_params multi_ap = { 0 };
+
+ multi_ap.capability = MULTI_AP_BACKHAUL_STA;
multi_ap_ie_len = add_multi_ap_ie(wpa_ie + wpa_ie_len,
max_wpa_ie_len - wpa_ie_len,
- MULTI_AP_BACKHAUL_STA);
+ &multi_ap);
if (multi_ap_ie_len == 0) {
wpa_printf(MSG_ERROR,
"Multi-AP: Failed to build Multi-AP IE");