aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/hostapd/patches/551-wpa_supplicant-Add-Multi-AP-protocol-support-to-supp.patch
diff options
context:
space:
mode:
authorArnout Vandecappelle (Essensium/Mind) <arnout@mind.be>2018-12-10 17:02:27 +0100
committerDaniel Golle <daniel@makrotopia.org>2019-02-20 13:17:11 +0100
commit2e0f41e73a93e8fa8b74f053e638f05247ee9113 (patch)
treee2b6e0633ebdae58e92575e84ea3c0108521c8ae /package/network/services/hostapd/patches/551-wpa_supplicant-Add-Multi-AP-protocol-support-to-supp.patch
parent8554982e1fd0c8f25e5f154b046eb955f6af2019 (diff)
downloadupstream-2e0f41e73a93e8fa8b74f053e638f05247ee9113.tar.gz
upstream-2e0f41e73a93e8fa8b74f053e638f05247ee9113.tar.bz2
upstream-2e0f41e73a93e8fa8b74f053e638f05247ee9113.zip
hostapd: add Multi-AP patches and config options
Cherry-pick Multi-AP commits from uptream: 9c06f0f6a hostapd: Add Multi-AP protocol support 5abc7823b wpa_supplicant: Add Multi-AP backhaul STA support a1debd338 tests: Refactor test_multi_ap bfcdac1c8 Multi-AP: Don't reject backhaul STA on fronthaul BSS cb3c156e7 tests: Update multi_ap_fronthaul_on_ap to match implementation 56a2d788f WPS: Add multi_ap_subelem to wps_build_wfa_ext() 83ebf5586 wpa_supplicant: Support Multi-AP backhaul STA onboarding with WPS 66819b07b hostapd: Support Multi-AP backhaul STA onboarding with WPS 8682f384c hostapd: Add README-MULTI-AP b1daf498a tests: Multi-AP WPS provisioning Add support for Multi-AP to the UCI configuration. Every wifi-iface gets an option 'multi_ap'. For APs, its value can be 0 (multi-AP support disabled), 1 (backhaul AP), 2 (fronthaul AP), or 3 (fronthaul + backhaul AP). For STAs, it can be 0 (not a backhaul STA) or 1 (backhaul STA, can only associate with backhaul AP). Also add new optional parameter to wps_start ubus call of wpa_supplicant to indicate that a Multi-AP backhaul link is required. Signed-off-by: Daniel Golle <daniel@makrotopia.org> Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Diffstat (limited to 'package/network/services/hostapd/patches/551-wpa_supplicant-Add-Multi-AP-protocol-support-to-supp.patch')
-rw-r--r--package/network/services/hostapd/patches/551-wpa_supplicant-Add-Multi-AP-protocol-support-to-supp.patch311
1 files changed, 311 insertions, 0 deletions
diff --git a/package/network/services/hostapd/patches/551-wpa_supplicant-Add-Multi-AP-protocol-support-to-supp.patch b/package/network/services/hostapd/patches/551-wpa_supplicant-Add-Multi-AP-protocol-support-to-supp.patch
new file mode 100644
index 0000000000..5fc41c20e6
--- /dev/null
+++ b/package/network/services/hostapd/patches/551-wpa_supplicant-Add-Multi-AP-protocol-support-to-supp.patch
@@ -0,0 +1,311 @@
+From 5abc7823bd01f69b8afbe1fd19f65fff86137c44 Mon Sep 17 00:00:00 2001
+From: Venkateswara Naralasetty <vnaralas@codeaurora.org>
+Date: Wed, 5 Dec 2018 11:23:53 +0100
+Subject: [PATCH] wpa_supplicant: Add Multi-AP backhaul STA support
+
+Advertise vendor specific Multi-AP IE in (Re)Association Request frames
+and process Multi-AP IE from (Re)Association Response frames if the user
+enables Multi-AP fuctionality. If the (Re)Association Response frame
+does not contain the Multi-AP IE, disassociate.
+
+This adds a new configuration parameter 'multi_ap_backhaul_sta' to
+enable/disable Multi-AP functionality.
+
+Enable 4-address mode after association (if the Association Response
+frame 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 <vnaralas@codeaurora.org>
+Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
+Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
+---
+ src/drivers/driver.h | 9 ++++++
+ src/drivers/driver_nl80211.c | 44 ++++++++++++++++++++++++++
+ wpa_supplicant/config.c | 1 +
+ wpa_supplicant/config_ssid.h | 7 +++++
+ wpa_supplicant/driver_i.h | 8 +++++
+ wpa_supplicant/events.c | 50 ++++++++++++++++++++++++++++++
+ wpa_supplicant/sme.c | 16 ++++++++++
+ wpa_supplicant/wpa_supplicant.c | 18 +++++++++++
+ wpa_supplicant/wpa_supplicant.conf | 7 +++++
+ wpa_supplicant/wpa_supplicant_i.h | 1 +
+ 10 files changed, 161 insertions(+)
+
+--- a/src/drivers/driver.h
++++ b/src/drivers/driver.h
+@@ -4100,6 +4100,15 @@ struct wpa_driver_ops {
+ */
+ int (*send_external_auth_status)(void *priv,
+ struct external_auth *params);
++
++ /**
++ * set_4addr_mode - Set 4-address mode
++ * @priv: Private driver interface data
++ * @bridge_ifname: Bridge interface name
++ * @val: 0 - disable 4addr mode, 1 - enable 4addr mode
++ * Returns: 0 on success, < 0 on failure
++ */
++ int (*set_4addr_mode)(void *priv, const char *bridge_ifname, int val);
+ };
+
+ /**
+--- a/src/drivers/driver_nl80211.c
++++ b/src/drivers/driver_nl80211.c
+@@ -10728,6 +10728,49 @@ fail:
+ }
+
+
++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;
++
++ wpa_printf(MSG_DEBUG, "nl80211: %s 4addr mode (bridge_ifname: %s)",
++ val ? "Enable" : "Disable", bridge_ifname);
++
++ 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 interface %s from 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 &&
++ 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;
++}
++
++
+ const struct wpa_driver_ops wpa_driver_nl80211_ops = {
+ .name = "nl80211",
+ .desc = "Linux nl80211/cfg80211",
+@@ -10856,4 +10899,5 @@ const struct wpa_driver_ops wpa_driver_n
+ .get_ext_capab = nl80211_get_ext_capab,
+ .update_connect_params = nl80211_update_connection_params,
+ .send_external_auth_status = nl80211_send_external_auth_status,
++ .set_4addr_mode = nl80211_set_4addr_mode,
+ };
+--- a/wpa_supplicant/config.c
++++ b/wpa_supplicant/config.c
+@@ -2416,6 +2416,7 @@ static const struct parse_data ssid_fiel
+ #endif /* CONFIG_DPP */
+ { INT_RANGE(owe_group, 0, 65535) },
+ { INT_RANGE(owe_only, 0, 1) },
++ { INT_RANGE(multi_ap_backhaul_sta, 0, 1) },
+ };
+
+ #undef OFFSET
+--- a/wpa_supplicant/config_ssid.h
++++ b/wpa_supplicant/config_ssid.h
+@@ -950,6 +950,13 @@ struct wpa_ssid {
+ * the selection attempts for OWE BSS exceed the configured threshold.
+ */
+ int owe_transition_bss_select_count;
++
++ /**
++ * multi_ap_backhaul_sta - Multi-AP backhaul STA
++ * 0 = normal (non-Multi-AP) station
++ * 1 = Multi-AP backhaul station
++ */
++ int multi_ap_backhaul_sta;
+ };
+
+ #endif /* CONFIG_SSID_H */
+--- a/wpa_supplicant/driver_i.h
++++ b/wpa_supplicant/driver_i.h
+@@ -1046,4 +1046,12 @@ wpa_drv_send_external_auth_status(struct
+ params);
+ }
+
++static inline int wpa_drv_set_4addr_mode(struct wpa_supplicant *wpa_s, int val)
++{
++ if (!wpa_s->driver->set_4addr_mode)
++ return -1;
++ return wpa_s->driver->set_4addr_mode(wpa_s->drv_priv,
++ wpa_s->bridge_ifname, val);
++}
++
+ #endif /* DRIVER_I_H */
+--- a/wpa_supplicant/events.c
++++ b/wpa_supplicant/events.c
+@@ -324,6 +324,9 @@ void wpa_supplicant_mark_disassoc(struct
+ os_memset(wpa_s->last_tk, 0, sizeof(wpa_s->last_tk));
+ #endif /* CONFIG_TESTING_OPTIONS */
+ wpa_s->ieee80211ac = 0;
++
++ if (wpa_s->enabled_4addr_mode && wpa_drv_set_4addr_mode(wpa_s, 0) == 0)
++ wpa_s->enabled_4addr_mode = 0;
+ }
+
+
+@@ -2267,6 +2270,50 @@ static void interworking_process_assoc_r
+ #endif /* CONFIG_INTERWORKING */
+
+
++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 ||
++ !wpa_s->current_ssid->multi_ap_backhaul_sta ||
++ !ies ||
++ ieee802_11_parse_elems(ies, ies_len, &elems, 1) == ParseFailed)
++ return;
++
++ if (!elems.multi_ap || elems.multi_ap_len < 7) {
++ wpa_printf(MSG_INFO, "AP doesn't support Multi-AP protocol");
++ goto fail;
++ }
++
++ 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");
++ 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) < 0) {
++ wpa_printf(MSG_ERROR, "Failed to set 4addr mode");
++ goto fail;
++ }
++ wpa_s->enabled_4addr_mode = 1;
++ return;
++
++fail:
++ wpa_supplicant_deauthenticate(wpa_s, WLAN_REASON_DEAUTH_LEAVING);
++}
++
++
+ #ifdef CONFIG_FST
+ static int wpas_fst_update_mbie(struct wpa_supplicant *wpa_s,
+ const u8 *ie, size_t ie_len)
+@@ -2343,6 +2390,9 @@ static int wpa_supplicant_event_associnf
+ get_ie(data->assoc_info.resp_ies,
+ data->assoc_info.resp_ies_len, WLAN_EID_VHT_CAP))
+ wpa_s->ieee80211ac = 1;
++
++ multi_ap_process_assoc_resp(wpa_s, data->assoc_info.resp_ies,
++ data->assoc_info.resp_ies_len);
+ }
+ if (data->assoc_info.beacon_ies)
+ wpa_hexdump(MSG_DEBUG, "beacon_ies",
+--- a/wpa_supplicant/sme.c
++++ b/wpa_supplicant/sme.c
+@@ -1552,6 +1552,22 @@ void sme_associate(struct wpa_supplicant
+ }
+ #endif /* CONFIG_OWE */
+
++ if (wpa_s->current_ssid && wpa_s->current_ssid->multi_ap_backhaul_sta) {
++ size_t multi_ap_ie_len;
++
++ 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);
++ if (multi_ap_ie_len == 0) {
++ wpa_printf(MSG_ERROR,
++ "Multi-AP: Failed to build Multi-AP IE");
++ return;
++ }
++ wpa_s->sme.assoc_req_ie_len += multi_ap_ie_len;
++ }
++
+ params.bssid = bssid;
+ params.ssid = wpa_s->sme.ssid;
+ params.ssid_len = wpa_s->sme.ssid_len;
+--- a/wpa_supplicant/wpa_supplicant.c
++++ b/wpa_supplicant/wpa_supplicant.c
+@@ -2893,6 +2893,21 @@ static u8 * wpas_populate_assoc_ies(
+ }
+ #endif /* CONFIG_IEEE80211R */
+
++ if (ssid->multi_ap_backhaul_sta) {
++ size_t multi_ap_ie_len;
++
++ multi_ap_ie_len = add_multi_ap_ie(wpa_ie + wpa_ie_len,
++ max_wpa_ie_len - wpa_ie_len,
++ MULTI_AP_BACKHAUL_STA);
++ if (multi_ap_ie_len == 0) {
++ wpa_printf(MSG_ERROR,
++ "Multi-AP: Failed to build Multi-AP IE");
++ os_free(wpa_ie);
++ return NULL;
++ }
++ wpa_ie_len += multi_ap_ie_len;
++ }
++
+ params->wpa_ie = wpa_ie;
+ params->wpa_ie_len = wpa_ie_len;
+ params->auth_alg = algs;
+@@ -3377,6 +3392,9 @@ void wpa_supplicant_deauthenticate(struc
+ zero_addr = 1;
+ }
+
++ if (wpa_s->enabled_4addr_mode && wpa_drv_set_4addr_mode(wpa_s, 0) == 0)
++ wpa_s->enabled_4addr_mode = 0;
++
+ #ifdef CONFIG_TDLS
+ wpa_tdls_teardown_peers(wpa_s->wpa);
+ #endif /* CONFIG_TDLS */
+--- a/wpa_supplicant/wpa_supplicant.conf
++++ b/wpa_supplicant/wpa_supplicant.conf
+@@ -1399,6 +1399,13 @@ fast_reauth=1
+ # 2: MCS 0-9
+ # 3: not supported
+
++# multi_ap_backhaul_sta: Multi-AP backhaul STA functionality
++# 0 = normal STA (default)
++# 1 = backhaul STA
++# A backhaul STA sends the Multi-AP IE, fails to associate if the AP does not
++# support Multi-AP, and sets 4-address mode if it does. Thus, the netdev can be
++# added to a bridge to allow forwarding frames over this backhaul link.
++
+ ##### Fast Session Transfer (FST) support #####################################
+ #
+ # The options in this section are only available when the build configuration
+--- a/wpa_supplicant/wpa_supplicant_i.h
++++ b/wpa_supplicant/wpa_supplicant_i.h
+@@ -1242,6 +1242,7 @@ struct wpa_supplicant {
+ unsigned int disable_fils:1;
+ #endif /* CONFIG_FILS */
+ unsigned int ieee80211ac:1;
++ unsigned int enabled_4addr_mode:1;
+ };
+
+