From patchwork Wed Dec 5 10:23:53 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnout Vandecappelle X-Patchwork-Id: 1008148 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.infradead.org (client-ip=2607:7c80:54:e::133; helo=bombadil.infradead.org; envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=mind.be Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="cPdxnKGy"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=mind-be.20150623.gappssmtp.com header.i=@mind-be.20150623.gappssmtp.com header.b="yv+RgoW1"; dkim-atps=neutral Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 438vzp54kzz9sCh for ; Wed, 5 Dec 2018 21:27:02 +1100 (AEDT) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ARv7Y+QZW6x3K7kUHondCQnP2JBAscHGr3TBzTVrMx8=; b=cPdxnKGyjEqOog krnSFdSIdo5biyZ/jnAZPdIX2UziY+Tk+tN2EYqFpmdhVRVohTVlxag/bPDbEM3Bap6bfv2RYKacW SbTQ+1pOgZPHqpVhv5FENJvSGE94DqtSbvMXeJC37AN/y5FaUJNYKfP55TIX/RtP3TTv/J5W0Qur5 yP8aLzKS0ePXNMztvhMTf/z8eTZSY/6slJN6W2PefZgk/eqE6Huit+D2jRzQsu8XABEiD5rl9urSx PH3hD5Y52v2xWYpidS/3bSg2eGMALD/p5lBxjMcW40gqod6D5lYOhupdGiCHbL589zwQNccs/8QHZ hCo21S2yk0Ftymmivw5A==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gUUOL-0006D1-JS; Wed, 05 Dec 2018 10:26:53 +0000 Received: from mail-ed1-x542.google.com ([2a00:1450:4864:20::542]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gUUO7-0005sA-7F for hostap@lists.infradead.org; Wed, 05 Dec 2018 10:26:44 +0000 Received: by mail-ed1-x542.google.com with SMTP id d3so16536530edx.7 for ; Wed, 05 Dec 2018 02:26:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=mind-be.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=4Fq/61Iu4WIk+/tTez7S0H5tJMMn7TbCrmcDqSSzrxE=; b=yv+RgoW1a7XIgimuzmwMAqr77otanlb+lE5a4vR8OPG688Sh1fllPtNI+HGDfKCOMb 0I98onj+dSQE2b9sbI6ixBkjE491p4Nk2zXvGL3hOnXRmifHbrnD5phSbz8WUweP9Zkw uQ8v4bUrqVgMVHHTZv3ciDOmP4dPs9ZFE58McTnXCx6AQz/CzGrq896YCGGIX7jttXAK QahZ/sLvhObkzqGjvGkQNMpBYKWaxt3yHeEcxKJQNyW+znFUD8X6pEEMnaalugfnvSM/ UrkpyPIsrK9V8fxqjQV3hjiRYt4zNGF5eciJjhS0PYUqxHukhtHYpbkI3ATnVTBuGv8W zliA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=4Fq/61Iu4WIk+/tTez7S0H5tJMMn7TbCrmcDqSSzrxE=; b=PZ1j9UzV9EJCpVHySuVynh+ubFSIY3yJaulIZauqAYTnTJeeyWkj/D3TUWARNTnyDj +5Uwt9TzLBst8UBjpCLcMMf1kAeSkrPsyO30IqYU5Xdw/mmO6B/MBNzIpbHUnJfSj4qq sQO4zNblr3qIrPX5RSylTddxxkGDMPrM8bDdhIbvrgMxMzUlKeYrkzbmbIkn4hjejUTg OazoTpwLONlxM+PEElvIUXe9rawm9JjlgCLeD6xhxfRtp7gHpHpthaAw74J37l3tdWdB 1WYb9DAAhqvSLabPipJn+KtD+UAm1kvhJ/yI7LCmW8DFm+Jl4PsLyYqzq7Xej+Rik+Ub 1ALg== X-Gm-Message-State: AA+aEWbOOwYmljZgjWTO8OsXyfOGJv+6CbfYyAyN132KE6yvKjeCdBlu 1EjM0LU93/DAGbQtcXQvnJ6fPU9yvok= X-Google-Smtp-Source: AFSGD/VHHWezofYFEflJCpl2RNbMbgQ/jByZpzd51TD7n6vSnPJGbdXaHJ/aNQYLWE+9Rm1lOUwlew== X-Received: by 2002:a17:906:22ca:: with SMTP id q10-v6mr18416327eja.66.1544005586867; Wed, 05 Dec 2018 02:26:26 -0800 (PST) Received: from localhost.localdomain (ip-188-118-3-185.reverse.destiny.be. [188.118.3.185]) by smtp.gmail.com with ESMTPSA id z2sm5438020edd.4.2018.12.05.02.26.25 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 05 Dec 2018 02:26:26 -0800 (PST) From: "Arnout Vandecappelle (Essensium/Mind)" To: hostap@lists.infradead.org Subject: [PATCH v3 03/12] wpa_supplicant: Add Multi-AP backhaul STA support Date: Wed, 5 Dec 2018 11:23:53 +0100 Message-Id: <20181205102401.17810-4-arnout@mind.be> X-Mailer: git-send-email 2.19.2 In-Reply-To: <20181205102401.17810-1-arnout@mind.be> References: <20181205102401.17810-1-arnout@mind.be> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20181205_022639_508325_EFA5736A X-CRM114-Status: GOOD ( 25.20 ) X-Spam-Score: 1.0 (+) X-Spam-Report: SpamAssassin version 3.4.2 on bombadil.infradead.org summary: Content analysis details: (1.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [2a00:1450:4864:20:0:0:0:542 listed in] [list.dnswl.org] 1.0 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) 0.0 HEADER_FROM_DIFFERENT_DOMAINS From and EnvelopeFrom 2nd level mail domains are different -0.1 DKIM_VALID Message has at least one valid DKIM or DK signature 0.1 DKIM_SIGNED Message has a DKIM or DK signature, not necessarily valid 0.0 DKIMWL_WL_MED DKIMwl.org - Whitelisted Medium sender X-BeenThere: hostap@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Arnout Vandecappelle , Venkateswara Naralasetty , Jouni Malinen Sender: "Hostap" Errors-To: hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org From: Venkateswara Naralasetty Advertise vendor specific Multi-AP IE in (Re)Association request and process Multi-AP IE from (Re)Association response frames if the user enables Multi-AP fuctionality. If the (Re)Association response does not contain the Multi-AP IE, deassociate. This patch introduces a new configuration parameter 'multi_ap_backhaul_sta' to enable/disable Multi-AP functionality. Enable 4addr mode after association (if the Association Response contains the Multi-AP IE). Also enable the bridge in that case. This is necessary because wpa_supplicant only enables the bridge in wpa_drv_if_add(), which only gets called when an interface is added through the control interface, not when it is configured from the command line. Signed-off-by: Venkateswara Naralasetty Signed-off-by: Jouni Malinen Signed-off-by: Arnout Vandecappelle (Essensium/Mind) --- v3 (Arnout): Improve commit message v2: * changed configuration from multi_ap_enabled to multiap_backhaul_sta * made multiap_backhaul_sta configuration static * used single helper function to build all different cases of Multi-AP IE contents --- I believe that adding the bridge in set_4addr_mode is actually wrong. The real problem IMO is that the -b command-line option doesn't work in station mode. Even more, I think the 4addr mode should not be set like this. Instead, I think both the bridge and the 4addr mode should be controlled by whatever entity creates the VIF. So if the VIF is already created externally (i.e. command-line configuration), it must already have been set to 4addr mode and added to the bridge. While if wpa_supplicant creates the interface, it must set 4addr mode when creating the interface (i.e. the wds argument of if_add() should be set). --- src/drivers/driver.h | 11 +++++++ src/drivers/driver_nl80211.c | 45 +++++++++++++++++++++++++ wpa_supplicant/Makefile | 4 +++ wpa_supplicant/config.c | 3 ++ wpa_supplicant/config_ssid.h | 8 +++++ wpa_supplicant/defconfig | 3 ++ wpa_supplicant/driver_i.h | 10 ++++++ wpa_supplicant/events.c | 53 ++++++++++++++++++++++++++++++ wpa_supplicant/sme.c | 14 +++++++- wpa_supplicant/wpa_supplicant.c | 29 ++++++++++++++++ wpa_supplicant/wpa_supplicant.conf | 4 +++ wpa_supplicant/wpa_supplicant_i.h | 6 ++++ 12 files changed, 189 insertions(+), 1 deletion(-) diff --git a/src/drivers/driver.h b/src/drivers/driver.h index 4ac9f16a0..3ae52d43f 100644 --- a/src/drivers/driver.h +++ b/src/drivers/driver.h @@ -4092,6 +4092,17 @@ struct wpa_driver_ops { */ int (*send_external_auth_status)(void *priv, struct external_auth *params); + +#ifdef CONFIG_MULTI_AP + /** + * set_4addr_mode - Set 4address mode + * @priv: Private driver interface data + * @val: 0 - disabale 4addr mode + * 1 - enable 4addr mode + * @brige_ifname - Bridge interface name + */ + int (*set_4addr_mode)(void *priv, const char *dridge_ifname, int val); +#endif /* CONFIG_MULTI_AP */ }; /** diff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c index b2c4120eb..0b2e79653 100644 --- a/src/drivers/driver_nl80211.c +++ b/src/drivers/driver_nl80211.c @@ -10647,6 +10647,48 @@ fail: return ret; } +#ifdef CONFIG_MULTI_AP +static int nl80211_set_4addr_mode(void *priv, const char *bridge_ifname, + int val) +{ + struct i802_bss *bss = priv; + struct wpa_driver_nl80211_data *drv = bss->drv; + struct nl_msg *msg; + int ret = -ENOBUFS; + + msg = nl80211_cmd_msg(drv->first_bss, 0, NL80211_CMD_SET_INTERFACE); + if (!msg || nla_put_u8(msg, NL80211_ATTR_4ADDR, val)) + goto fail; + + if (bridge_ifname[0] && bss->added_if_into_bridge && !val) { + if (linux_br_del_if(drv->global->ioctl_sock, + bridge_ifname, bss->ifname)) { + wpa_printf(MSG_ERROR, "nl80211: Failed to remove the " + "interface %s to a bridge %s", + bss->ifname, bridge_ifname); + return -1; + } + bss->added_if_into_bridge = 0; + } + + ret = send_and_recv_msgs(drv, msg, NULL, NULL); + msg = NULL; + if (!ret) { + if (bridge_ifname[0] && val) { + if (i802_check_bridge(drv, bss, + bridge_ifname, bss->ifname) < 0) + return -1; + } + return 0; + } + +fail: + nlmsg_free(msg); + wpa_printf(MSG_ERROR, "nl80211: Failed to enable/disable 4addr"); + + return ret; +} +#endif /* CONFIG_MULTI_AP */ const struct wpa_driver_ops wpa_driver_nl80211_ops = { .name = "nl80211", @@ -10776,4 +10818,7 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = { .get_ext_capab = nl80211_get_ext_capab, .update_connect_params = nl80211_update_connection_params, .send_external_auth_status = nl80211_send_external_auth_status, +#ifdef CONFIG_MULTI_AP + .set_4addr_mode = nl80211_set_4addr_mode, +#endif /* CONFIG_MULTI_AP */ }; diff --git a/wpa_supplicant/Makefile b/wpa_supplicant/Makefile index c2e93e20b..52892eaaf 100644 --- a/wpa_supplicant/Makefile +++ b/wpa_supplicant/Makefile @@ -96,6 +96,10 @@ CONFIG_NO_RANDOM_POOL= CONFIG_OPENSSL_CMAC=y endif +ifdef CONFIG_MULTI_AP +CFLAGS += -DCONFIG_MULTI_AP +endif + OBJS = config.o OBJS += notify.o OBJS += bss.o diff --git a/wpa_supplicant/config.c b/wpa_supplicant/config.c index c43960697..bd73bcfc8 100644 --- a/wpa_supplicant/config.c +++ b/wpa_supplicant/config.c @@ -2320,6 +2320,9 @@ static const struct parse_data ssid_fields[] = { #endif /* CONFIG_DPP */ { INT_RANGE(owe_group, 0, 65535) }, { INT_RANGE(owe_only, 0, 1) }, +#ifdef CONFIG_MULTI_AP + { INT_RANGE(multiap_backhaul_sta, 0, 1) }, +#endif }; #undef OFFSET diff --git a/wpa_supplicant/config_ssid.h b/wpa_supplicant/config_ssid.h index d2a52d760..2dc3fbff3 100644 --- a/wpa_supplicant/config_ssid.h +++ b/wpa_supplicant/config_ssid.h @@ -937,6 +937,14 @@ struct wpa_ssid { * the selection attempts for OWE BSS exceed the configured threshold. */ int owe_transition_bss_select_count; + +#ifdef CONFIG_MULTI_AP + /* + * 0 = normal station + * 1 = backhaul station + */ + int multiap_backhaul_sta; +#endif /* CONFIG_MULTI_AP */ }; #endif /* CONFIG_SSID_H */ diff --git a/wpa_supplicant/defconfig b/wpa_supplicant/defconfig index 08f585779..3c3081c95 100644 --- a/wpa_supplicant/defconfig +++ b/wpa_supplicant/defconfig @@ -593,3 +593,6 @@ CONFIG_BACKEND=file # Opportunistic Wireless Encryption (OWE) # Experimental implementation of draft-harkins-owe-07.txt #CONFIG_OWE=y + +#Multi-AP protocol support +#CONFIG_MULTI_AP=y diff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h index 078de23f7..9c1a26d8b 100644 --- a/wpa_supplicant/driver_i.h +++ b/wpa_supplicant/driver_i.h @@ -30,6 +30,16 @@ static inline void wpa_drv_deinit(struct wpa_supplicant *wpa_s) wpa_s->driver->deinit(wpa_s->drv_priv); } +#ifdef CONFIG_MULTI_AP +static inline int wpa_drv_set_4addr_mode(struct wpa_supplicant *wpa_s, int val) +{ + if (wpa_s->driver->set_4addr_mode) + return wpa_s->driver->set_4addr_mode(wpa_s->drv_priv, + wpa_s->bridge_ifname, val); + return -1; +} +#endif /* CONFIG_MULTI_AP */ + static inline int wpa_drv_set_param(struct wpa_supplicant *wpa_s, const char *param) { diff --git a/wpa_supplicant/events.c b/wpa_supplicant/events.c index dd6dd5267..62100e7b4 100644 --- a/wpa_supplicant/events.c +++ b/wpa_supplicant/events.c @@ -2266,6 +2266,55 @@ static void interworking_process_assoc_resp(struct wpa_supplicant *wpa_s, #endif /* CONFIG_INTERWORKING */ +#ifdef CONFIG_MULTI_AP +static void multi_ap_process_assoc_resp(struct wpa_supplicant *wpa_s, + const u8 *ies, size_t ies_len) +{ + struct ieee802_11_elems elems; + const u8 *map_sub_elem, *pos; + size_t len; + + if (!wpa_s->current_ssid->multiap_backhaul_sta) + return; + + if (ies == NULL) + return; + + if (ieee802_11_parse_elems(ies, ies_len, &elems, 1) == ParseFailed) + return; + + if (elems.multi_ap && (elems.multi_ap_len >= 7)) { + pos = elems.multi_ap + 4; + len = elems.multi_ap_len - 4; + + map_sub_elem = get_ie(pos, len, MULTI_AP_SUB_ELEM_TYPE); + if (!map_sub_elem || map_sub_elem[1] < 1) { + wpa_printf(MSG_INFO, "invalid Multi-AP sub elem type\n"); + goto fail; + } + + if (!(map_sub_elem[2] & MULTI_AP_BACKHAUL_BSS)) { + wpa_printf(MSG_INFO, "AP doesn't support BACKHAUL BSS"); + goto fail; + } + + if (wpa_drv_set_4addr_mode(wpa_s, 1)) { + wpa_printf(MSG_ERROR, "failed to sed 4addr mode\n"); + goto fail; + } + wpa_s->enabled_4addr_mode = 1; + } else { + wpa_printf(MSG_INFO, "AP doesn't support Multi-AP protocol"); + goto fail; + } + + return; + +fail: + wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING); + return; +} +#endif /* CONFIG_MULTI_AP */ #ifdef CONFIG_FST static int wpas_fst_update_mbie(struct wpa_supplicant *wpa_s, @@ -2343,6 +2392,10 @@ static int wpa_supplicant_event_associnfo(struct wpa_supplicant *wpa_s, get_ie(data->assoc_info.resp_ies, data->assoc_info.resp_ies_len, WLAN_EID_VHT_CAP)) wpa_s->ieee80211ac = 1; +#ifdef CONFIG_MULTI_AP + multi_ap_process_assoc_resp(wpa_s, data->assoc_info.resp_ies, + data->assoc_info.resp_ies_len); +#endif /* CONFIG_MULTI_AP */ } if (data->assoc_info.beacon_ies) wpa_hexdump(MSG_DEBUG, "beacon_ies", diff --git a/wpa_supplicant/sme.c b/wpa_supplicant/sme.c index d569acad8..1c444ff86 100644 --- a/wpa_supplicant/sme.c +++ b/wpa_supplicant/sme.c @@ -39,7 +39,6 @@ static void sme_obss_scan_timeout(void *eloop_ctx, void *timeout_ctx); static void sme_stop_sa_query(struct wpa_supplicant *wpa_s); #endif /* CONFIG_IEEE80211W */ - #ifdef CONFIG_SAE static int index_within_array(const int *array, int idx) @@ -1548,6 +1547,19 @@ void sme_associate(struct wpa_supplicant *wpa_s, enum wpas_mode mode, } #endif /* CONFIG_OWE */ +#ifdef CONFIG_MULTI_AP + if (wpa_s->conf->ssid->multiap_backhaul_sta) { + if (wpa_s->sme.assoc_req_ie_len + 9 > + sizeof(wpa_s->sme.assoc_req_ie)) { + wpa_printf(MSG_ERROR, + "Multi-AP: Not enough buffer for Assoc req frame element"); + return; + } + u8 *pos = wpa_s->sme.assoc_req_ie + wpa_s->sme.assoc_req_ie_len; + wpa_add_multi_ap_info_ie(pos, &wpa_s->sme.assoc_req_ie_len); + } +#endif /* CONFIG_MULTI_AP */ + params.bssid = bssid; params.ssid = wpa_s->sme.ssid; params.ssid_len = wpa_s->sme.ssid_len; diff --git a/wpa_supplicant/wpa_supplicant.c b/wpa_supplicant/wpa_supplicant.c index 0fe2adb6b..357a4e193 100644 --- a/wpa_supplicant/wpa_supplicant.c +++ b/wpa_supplicant/wpa_supplicant.c @@ -285,6 +285,23 @@ void wpa_supplicant_cancel_auth_timeout(struct wpa_supplicant *wpa_s) wpa_s->last_con_fail_realm_len = 0; } +#ifdef CONFIG_MULTI_AP +void wpa_add_multi_ap_info_ie(u8 *pos, size_t *len) +{ + u8 *buf = pos; + + *buf++ = WLAN_EID_VENDOR_SPECIFIC; + *buf++ = 7; /* len */ + WPA_PUT_BE24(buf, OUI_WFA); + buf += 3; + *buf++ = MULTI_AP_OUI_TYPE; + *buf++ = MULTI_AP_SUB_ELEM_TYPE; + *buf++ = 1; /*sub element len */ + *buf++ = MULTI_AP_BACKHAUL_STA; + + *len += (buf - pos); +} +#endif /* CONFIG_MULTI_AP */ /** * wpa_supplicant_initiate_eapol - Configure EAPOL state machine @@ -2808,6 +2825,11 @@ static u8 * wpas_populate_assoc_ies( } #endif /* CONFIG_IEEE80211R */ +#ifdef CONFIG_MULTI_AP + if (ssid->multiap_backhaul_sta && ((max_wpa_ie_len - wpa_ie_len) > 9)) + wpa_add_multi_ap_info_ie(wpa_ie, &wpa_ie_len); +#endif /* CONFIG_MULTI_AP */ + params->wpa_ie = wpa_ie; params->wpa_ie_len = wpa_ie_len; params->auth_alg = algs; @@ -3286,6 +3308,13 @@ void wpa_supplicant_deauthenticate(struct wpa_supplicant *wpa_s, zero_addr = 1; } +#ifdef CONFIG_MULTI_AP + if (wpa_s->enabled_4addr_mode) { + if (wpa_drv_set_4addr_mode(wpa_s, 0)) + wpa_s->enabled_4addr_mode = 0; + } +#endif + #ifdef CONFIG_TDLS wpa_tdls_teardown_peers(wpa_s->wpa); #endif /* CONFIG_TDLS */ diff --git a/wpa_supplicant/wpa_supplicant.conf b/wpa_supplicant/wpa_supplicant.conf index 4f5916025..1d5c6a175 100644 --- a/wpa_supplicant/wpa_supplicant.conf +++ b/wpa_supplicant/wpa_supplicant.conf @@ -1422,6 +1422,10 @@ fast_reauth=1 # Transitioning between states). #fst_llt=100 +# Set satation to use as BACKHAUL STA. +# default = 0 +# multiap_backhaul_sta = 1 (configure as backhaul STA). + # Example blocks: # Simple case: WPA-PSK, PSK as an ASCII passphrase, allow all valid ciphers diff --git a/wpa_supplicant/wpa_supplicant_i.h b/wpa_supplicant/wpa_supplicant_i.h index 8b749f44e..0687182bc 100644 --- a/wpa_supplicant/wpa_supplicant_i.h +++ b/wpa_supplicant/wpa_supplicant_i.h @@ -1234,6 +1234,9 @@ struct wpa_supplicant { unsigned int disable_fils:1; #endif /* CONFIG_FILS */ unsigned int ieee80211ac:1; +#ifdef CONFIG_MULTI_AP + char enabled_4addr_mode; +#endif }; @@ -1493,4 +1496,7 @@ int wpas_ctrl_iface_get_pref_freq_list_override(struct wpa_supplicant *wpa_s, int wpa_is_fils_supported(struct wpa_supplicant *wpa_s); int wpa_is_fils_sk_pfs_supported(struct wpa_supplicant *wpa_s); +#ifdef CONFIG_MULTI_AP +void wpa_add_multi_ap_info_ie(u8 *pos, size_t *len); +#endif #endif /* WPA_SUPPLICANT_I_H */