From: Manoj Sekar Date: Mon, 26 Feb 2024 12:48:21 +0000 (+0530) Subject: Multi-AP: Move IE parameters into a struct for extensibility X-Git-Tag: hostap_2_11~275 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=61e46f860c93b08f23c5684c95c039ec54c169cc;p=thirdparty%2Fhostap.git Multi-AP: Move IE parameters into a struct for extensibility This makes it easier to extend the information that is encoded in the Multi-AP element. Signed-off-by: Manoj Sekar --- diff --git a/src/ap/ieee802_11.c b/src/ap/ieee802_11.c index 77c4d30ee..1526c3d1a 100644 --- a/src/ap/ieee802_11.c +++ b/src/ap/ieee802_11.c @@ -90,16 +90,17 @@ static int add_associated_sta(struct hostapd_data *hapd, 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); } diff --git a/src/common/ieee802_11_common.c b/src/common/ieee802_11_common.c index 0b2ad61f5..8bde67f26 100644 --- a/src/common/ieee802_11_common.c +++ b/src/common/ieee802_11_common.c @@ -2571,21 +2571,28 @@ 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) { 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; } diff --git a/src/common/ieee802_11_common.h b/src/common/ieee802_11_common.h index da057bdb2..4eba71097 100644 --- a/src/common/ieee802_11_common.h +++ b/src/common/ieee802_11_common.h @@ -30,6 +30,10 @@ struct mb_ies_info { u8 nof_ies; }; +struct multi_ap_params { + u8 capability; +}; + /* Parsed Information Elements */ struct ieee802_11_elems { const u8 *ssid; @@ -267,7 +271,8 @@ const u8 * get_vendor_ie(const u8 *ies, size_t len, u32 vendor_type); 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; diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c index 045ea6d62..b67eb3418 100644 --- a/wpa_supplicant/sme.c +++ b/wpa_supplicant/sme.c @@ -2408,12 +2408,15 @@ mscs_fail: 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"); diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 98ecb7a74..e9fea83e4 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -3809,10 +3809,13 @@ mscs_end: 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");