hostapd: Add Multi-AP protocol support
The purpose of Multi-AP specification is to enable inter-operability across Wi-Fi access points (APs) from different vendors. This patch introduces one new configuration parameter 'multi_ap' to enable Multi-AP functionality and to configure the BSS as a backhaul and/or fronthaul BSS. Advertise vendor specific Multi-AP capabilities in (Re)Association Response frame, if Multi-AP functionality is enabled through the configuration parameter. A backhaul AP must support receiving both 3addr and 4addr frames from a backhaul STA, so create a VLAN for it just like is done for WDS, i.e., by calling hostapd_set_wds_sta(). Since Multi-AP requires WPA2 (never WEP), we can safely call hostapd_set_wds_encryption() as well and we can reuse the entire WDS condition. To parse the Multi-AP Extension subelement, we use get_ie(): even though that function is meant for parsing IEs, it works for subelements. Signed-off-by: Venkateswara Naralasetty <vnaralas@codeaurora.org> Signed-off-by: Jouni Malinen <jouni@codeaurora.org> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
This commit is contained in:
parent
3006241e43
commit
9c06f0f6ae
9 changed files with 134 additions and 2 deletions
|
@ -126,6 +126,10 @@ static int ieee802_11_parse_vendor_specific(const u8 *pos, size_t elen,
|
|||
elems->roaming_cons_sel = pos;
|
||||
elems->roaming_cons_sel_len = elen;
|
||||
break;
|
||||
case MULTI_AP_OUI_TYPE:
|
||||
elems->multi_ap = pos;
|
||||
elems->multi_ap_len = elen;
|
||||
break;
|
||||
default:
|
||||
wpa_printf(MSG_MSGDUMP, "Unknown WFA "
|
||||
"information element ignored "
|
||||
|
@ -1558,6 +1562,26 @@ 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)
|
||||
{
|
||||
u8 *pos = buf;
|
||||
|
||||
if (len < 9)
|
||||
return 0;
|
||||
|
||||
*pos++ = WLAN_EID_VENDOR_SPECIFIC;
|
||||
*pos++ = 7; /* len */
|
||||
WPA_PUT_BE24(pos, OUI_WFA);
|
||||
pos += 3;
|
||||
*pos++ = MULTI_AP_OUI_TYPE;
|
||||
*pos++ = MULTI_AP_SUB_ELEM_TYPE;
|
||||
*pos++ = 1; /* len */
|
||||
*pos++ = value;
|
||||
|
||||
return pos - buf;
|
||||
}
|
||||
|
||||
|
||||
static const struct country_op_class us_op_class[] = {
|
||||
{ 1, 115 },
|
||||
{ 2, 118 },
|
||||
|
|
|
@ -86,6 +86,7 @@ struct ieee802_11_elems {
|
|||
const u8 *roaming_cons_sel;
|
||||
const u8 *password_id;
|
||||
const u8 *oci;
|
||||
const u8 *multi_ap;
|
||||
|
||||
u8 ssid_len;
|
||||
u8 supp_rates_len;
|
||||
|
@ -133,6 +134,7 @@ struct ieee802_11_elems {
|
|||
u8 roaming_cons_sel_len;
|
||||
u8 password_id_len;
|
||||
u8 oci_len;
|
||||
u8 multi_ap_len;
|
||||
|
||||
struct mb_ies_info mb_ies;
|
||||
};
|
||||
|
@ -194,6 +196,8 @@ const u8 * get_ie_ext(const u8 *ies, size_t len, u8 ext);
|
|||
|
||||
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);
|
||||
|
||||
struct country_op_class {
|
||||
u8 country_op_class;
|
||||
u8 global_op_class;
|
||||
|
|
|
@ -1213,6 +1213,13 @@ struct ieee80211_ampe_ie {
|
|||
#define MBO_OUI_TYPE 22
|
||||
#define OWE_IE_VENDOR_TYPE 0x506f9a1c
|
||||
#define OWE_OUI_TYPE 28
|
||||
#define MULTI_AP_OUI_TYPE 0x1B
|
||||
|
||||
#define MULTI_AP_SUB_ELEM_TYPE 0x06
|
||||
#define MULTI_AP_TEAR_DOWN BIT(4)
|
||||
#define MULTI_AP_FRONTHAUL_BSS BIT(5)
|
||||
#define MULTI_AP_BACKHAUL_BSS BIT(6)
|
||||
#define MULTI_AP_BACKHAUL_STA BIT(7)
|
||||
|
||||
#define WMM_OUI_TYPE 2
|
||||
#define WMM_OUI_SUBTYPE_INFORMATION_ELEMENT 0
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue