depends on PACKAGE_wpa-supplicant || \
PACKAGE_wpa-supplicant-openssl || \
PACKAGE_wpa-supplicant-wolfssl || \
- PACKAGE_wpa-supplicant-mesh || \
+ PACKAGE_wpa-supplicant-mesh-openssl || \
+ PACKAGE_wpa-supplicant-mesh-wolfssl || \
PACKAGE_wpa-supplicant-mini || \
+ PACKAGE_wpa-supplicant-p2p || \
PACKAGE_wpad || \
PACKAGE_wpad-openssl || \
PACKAGE_wpad-wolfssl || \
depends on PACKAGE_wpa-supplicant || \
PACKAGE_wpa-supplicant-openssl || \
PACKAGE_wpa-supplicant-wolfssl || \
- PACKAGE_wpa-supplicant-mesh || \
+ PACKAGE_wpa-supplicant-mesh-openssl || \
+ PACKAGE_wpa-supplicant-mesh-wolfssl || \
PACKAGE_wpa-supplicant-mini || \
+ PACKAGE_wpa-supplicant-p2p || \
PACKAGE_wpad || \
PACKAGE_wpad-openssl || \
PACKAGE_wpad-wolfssl || \
depends on PACKAGE_wpa-supplicant || \
PACKAGE_wpa-supplicant-openssl || \
PACKAGE_wpa-supplicant-wolfssl || \
- PACKAGE_wpa-supplicant-mesh || \
+ PACKAGE_wpa-supplicant-mesh-openssl || \
+ PACKAGE_wpa-supplicant-mesh-wolfssl || \
PACKAGE_wpa-supplicant-mini || \
+ PACKAGE_wpa-supplicant-p2p || \
PACKAGE_wpad || \
PACKAGE_wpad-openssl || \
PACKAGE_wpad-wolfssl || \
include $(TOPDIR)/rules.mk
PKG_NAME:=hostapd
-PKG_RELEASE:=2
+PKG_RELEASE:=3
PKG_SOURCE_URL:=http://w1.fi/hostap.git
PKG_SOURCE_PROTO:=git
CONFIG_DRIVER_11N_SUPPORT \
CONFIG_DRIVER_11AC_SUPPORT \
+WPAD_PROVIDERS:=wpad-mini wpad wpad-openssl wpad-wolfssl \
+ wpad-mesh-openssl wpad-mesh-wolfssl
+
+SUPPLICANT_ONLY_PROVIDERS:=wpa-supplicant-mini wpa-supplicant-p2p \
+ wpa-supplicant wpa-supplicant-openssl wpa-supplicant-wolfssl \
+ wpa-supplicant-mesh-openssl wpa-supplicant-mesh-wolfssl
+
+HOSTAPD_ONLY_PROVIDERS:=hostapd-mini hostapd hostapd-openssl hostapd-wolfssl
+
+EAPOL_TEST_PROVIDERS:=eapol-test eapol-test-openssl eapol-test-wolfssl
+
+SUPPLICANT_PROVIDERS:=$(WPAD_PROVIDERS) $(SUPPLICANT_ONLY_PROVIDERS)
+HOSTAPD_PROVIDERS:=$(WPAD_PROVIDERS) $(HOSTAPD_ONLY_PROVIDERS)
+ANY_SUPPLICANT_PROVIDERS:=$(WPAD_PROVIDERS) $(SUPPLICANT_ONLY_PROVIDERS)
+ANY_HOSTAPD_PROVIDERS:=$(WPAD_PROVIDERS) $(HOSTAPD_ONLY_PROVIDERS)
+ANY_PROVIDERS:=$(WPAD_PROVIDERS) $(SUPPLICANT_ONLY_PROVIDERS) $(HOSTAPD_ONLY_PROVIDERS)
+
LOCAL_TYPE=$(strip \
$(if $(findstring wpad,$(BUILD_VARIANT)),wpad, \
$(if $(findstring supplicant,$(BUILD_VARIANT)),supplicant, \
STAMP_CONFIGURED:=$(STAMP_CONFIGURED)_$(CONFIG_WPA_MSG_MIN_PRIORITY)
-WPAD_PROVIDERS:=wpad-mini wpad wpad-openssl wpad-wolfssl \
- wpad-mesh-openssl wpad-mesh-wolfssl
-
-SUPPLICANT_ONLY_PROVIDERS:=wpa_supplicant-mini wpa_supplicant-p2p \
- wpa_supplicant wpa_supplicant-openssl wpa_supplicant-wolfssl \
- wpa_supplicant-mesh-openssl wpa_supplicant-mesh-wolfssl
-
-HOSTAPD_ONLY_PROVIDERS:=hostapd-mini hostapd hostapd-openssl hostapd-wolfssl
-
-EAPOL_TEST_PROVIDERS:=eapol-test eapol-test-openssl eapol-test-wolfssl
-
-SUPPLICANT_PROVIDERS:=$(WPAD_PROVIDERS) $(SUPPLICANT_ONLY_PROVIDERS)
-HOSTAPD_PROVIDERS:=$(WPAD_PROVIDERS) $(HOSTAPD_ONLY_PROVIDERS)
-ANY_PROVIDERS:=$(WPAD_PROVIDERS) $(HOSTAPD_ONLY_PROVIDERS) $(SUPPLICANT_ONLY_PROVIDERS)
ifneq ($(CONFIG_DRIVER_11N_SUPPORT),)
HOSTAPD_IEEE80211N:=y
define Package/hostapd-utils
$(call Package/hostapd/Default)
TITLE+= (utils)
- DEPENDS:=@$(subst $(space),||,$(foreach pkg,$(HOSTAPD_PROVIDERS),PACKAGE_$(pkg)))
+ DEPENDS:=@$(subst $(space),||,$(foreach pkg,$(ANY_HOSTAPD_PROVIDERS),PACKAGE_$(pkg)))
endef
define Package/hostapd-utils/description
$(call Package/wpad/Default)
TITLE+= (full)
VARIANT:=wpad-full-internal
+ CONFLICTS:=$(filter-out wpad-mesh-wolfssl,\
+ $(filter-out wpad-mesh-openssl ,\
+ $(filter-out wpad-openssl ,\
+ $(filter-out wpad-wolfssl ,\
+ $(filter-out wpad-wolfssl ,\
+ $(filter-out wpad ,\
+ $(ANY_PROVIDERS)\
+ ))))))
endef
define Package/wpad-openssl
$(call Package/wpad/Default)
TITLE+= (WPA-PSK only)
VARIANT:=wpad-mini
+ CONFLICTS:=$(SUPPLICANT_ONLY_PROVIDERS)
endef
define Package/wpad-mini/description
define Package/wpa-supplicant
$(Package/wpa-supplicant/Default)
- CONFLICTS:=$(filter-out wpa-supplicant ,$(SUPPLICANT_ONLY_PROVIDERS))
VARIANT:=supplicant-full-internal
+ CONFLICTS:=wpa-supplicant-mini
endef
define Package/wpa-supplicant-openssl
$(Package/wpa-supplicant/Default)
- CONFLICTS:=$(filter-out wpa-supplicant-openssl ,$(SUPPLICANT_ONLY_PROVIDERS))
+ CONFLICTS:=$(filter-out wpa-supplicant-wolfssl ,\
+ $(filter-out wpa-supplicant-openssl ,\
+ $(filter-out wpa-supplicant-mesh-openssl ,\
+ $(filter-out wpa-supplicant-mesh-wolfssl ,\
+ $(SUPPLICANT_ONLY_PROVIDERS)\
+ ))))
VARIANT:=supplicant-full-openssl
DEPENDS+=+libopenssl
PROVIDES:=wpa-supplicant
define Package/wpa-supplicant-wolfssl
$(Package/wpa-supplicant/Default)
- CONFLICTS:=$(filter-out wpa-supplicant-wolfssl ,$(SUPPLICANT_ONLY_PROVIDERS))
+ CONFLICTS:=$(filter-out wpa-supplicant-wolfssl ,\
+ $(filter-out wpa-supplicant-openssl ,\
+ $(filter-out wpa-supplicant-mesh-openssl ,\
+ $(filter-out wpa-supplicant-mesh-wolfssl ,\
+ $(SUPPLICANT_ONLY_PROVIDERS)\
+ ))))
VARIANT:=supplicant-full-wolfssl
DEPENDS+=+libwolfssl
PROVIDES:=wpa-supplicant
$(Package/wpa-supplicant)
TITLE:=WPA Supplicant (with Wi-Fi P2P support)
DEPENDS:=$(DRV_DEPENDS) @PACKAGE_kmod-cfg80211
- CONFLICTS:=$(filter-out wpa-supplicant-p2p ,$(SUPPLICANT_ONLY_PROVIDERS))
+ CONFLICTS:=$(filter-out wpa-supplicant-openssl ,\
+ $(filter-out wpa-supplicant-wolfssl ,\
+ $(filter-out wpa-supplicant-p2p ,\
+ $(filter-out wpa-supplicant-mesh-openssl ,\
+ $(filter-out wpa-supplicant-mesh-wolfssl ,\
+ $(SUPPLICANT_ONLY_PROVIDERS)\
+ )))))
VARIANT:=supplicant-p2p-internal
PROVIDES:=wpa-supplicant
endef
define Package/wpa-supplicant-mesh/Default
- $(Package/wpa-supplicant)
+ $(Package/wpa-supplicant/Default)
TITLE:=WPA Supplicant (with 802.11s and SAE)
DEPENDS:=$(DRV_DEPENDS) @PACKAGE_kmod-cfg80211 @(!TARGET_uml||BROKEN)
PROVIDES:=wpa-supplicant wpa-supplicant-mesh
endef
define Package/wpa-supplicant-mini
- $(Package/wpa-supplicant)
+ $(Package/wpa-supplicant/Default)
TITLE:=WPA Supplicant (minimal version)
DEPENDS:=$(DRV_DEPENDS)
- CONFLICTS:=$(filter-out wpa-supplicant-mini ,$(SUPPLICANT_ONLY_PROVIDERS))
VARIANT:=supplicant-mini
PROVIDES:=wpa-supplicant
endef
define Package/wpa-cli
SECTION:=net
CATEGORY:=Network
- DEPENDS:=@$(subst $(space),||,$(foreach pkg,$(SUPPLICANT_PROVIDERS),PACKAGE_$(pkg)))
+ DEPENDS:=@$(subst $(space),||,$(foreach pkg,$(ANY_SUPPLICANT_PROVIDERS),PACKAGE_$(pkg)))
TITLE:=WPA Supplicant command line control utility
endef
VARIANT:=supplicant-full-openssl
CONFLICTS:=$(filter-out eapol-test-openssl ,$(EAPOL_TEST_PROVIDERS))
DEPENDS:=$(DRV_DEPENDS) +libopenssl
+ PROVIDES:=eapol-test
endef
define Package/eapol-test-wolfssl
VARIANT:=supplicant-full-wolfssl
CONFLICTS:=$(filter-out eapol-test-openssl ,$(filter-out eapol-test-wolfssl ,$(EAPOL_TEST_PROVIDERS)))
DEPENDS:=$(DRV_DEPENDS) +libwolfssl
+ PROVIDES:=eapol-test
endef
+++ /dev/null
-From 8a6a7112e5b1391018531f6b6c317f8870e0fcb6 Mon Sep 17 00:00:00 2001
-Date: Thu, 3 May 2018 13:12:28 +0200
-Subject: [PATCH 1/2] Revert "wpa_supplicant: Increase authentication timeout
- if CAC is started"
-
-This reverts commit 37547ad63c9df61ce6899675028594da2527efef.
----
- wpa_supplicant/events.c | 95 ++++---------------------------
- wpa_supplicant/wpa_supplicant.c | 20 -------
- wpa_supplicant/wpa_supplicant_i.h | 3 -
- 3 files changed, 10 insertions(+), 108 deletions(-)
-
---- a/wpa_supplicant/events.c
-+++ b/wpa_supplicant/events.c
-@@ -3776,81 +3776,6 @@ static void wpa_supplicant_event_port_au
- }
-
-
--static unsigned int wpas_event_cac_ms(const struct wpa_supplicant *wpa_s,
-- int freq)
--{
-- size_t i;
-- int j;
--
-- for (i = 0; i < wpa_s->hw.num_modes; i++) {
-- const struct hostapd_hw_modes *mode = &wpa_s->hw.modes[i];
--
-- for (j = 0; j < mode->num_channels; j++) {
-- const struct hostapd_channel_data *chan;
--
-- chan = &mode->channels[j];
-- if (chan->freq == freq)
-- return chan->dfs_cac_ms;
-- }
-- }
--
-- return 0;
--}
--
--
--static void wpas_event_dfs_cac_started(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar)
--{
--#if defined(NEED_AP_MLME) && defined(CONFIG_AP)
-- if (wpa_s->ap_iface) {
-- wpas_ap_event_dfs_cac_started(wpa_s, radar);
-- } else
--#endif /* NEED_AP_MLME && CONFIG_AP */
-- {
-- unsigned int cac_time = wpas_event_cac_ms(wpa_s, radar->freq);
--
-- cac_time /= 1000; /* convert from ms to sec */
-- if (!cac_time)
-- cac_time = 10 * 60; /* max timeout: 10 minutes */
--
-- /* Restart auth timeout: CAC time added to initial timeout */
-- wpas_auth_timeout_restart(wpa_s, cac_time);
-- }
--}
--
--
--static void wpas_event_dfs_cac_finished(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar)
--{
--#if defined(NEED_AP_MLME) && defined(CONFIG_AP)
-- if (wpa_s->ap_iface) {
-- wpas_ap_event_dfs_cac_finished(wpa_s, radar);
-- } else
--#endif /* NEED_AP_MLME && CONFIG_AP */
-- {
-- /* Restart auth timeout with original value after CAC is
-- * finished */
-- wpas_auth_timeout_restart(wpa_s, 0);
-- }
--}
--
--
--static void wpas_event_dfs_cac_aborted(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar)
--{
--#if defined(NEED_AP_MLME) && defined(CONFIG_AP)
-- if (wpa_s->ap_iface) {
-- wpas_ap_event_dfs_cac_aborted(wpa_s, radar);
-- } else
--#endif /* NEED_AP_MLME && CONFIG_AP */
-- {
-- /* Restart auth timeout with original value after CAC is
-- * aborted */
-- wpas_auth_timeout_restart(wpa_s, 0);
-- }
--}
--
--
- static void wpa_supplicant_event_assoc_auth(struct wpa_supplicant *wpa_s,
- union wpa_event_data *data)
- {
-@@ -4298,25 +4223,25 @@ void wpa_supplicant_event(void *ctx, enu
- wpas_ap_event_dfs_radar_detected(wpa_s,
- &data->dfs_event);
- break;
-- case EVENT_DFS_NOP_FINISHED:
-- if (data)
-- wpas_ap_event_dfs_cac_nop_finished(wpa_s,
-- &data->dfs_event);
-- break;
--#endif /* NEED_AP_MLME */
--#endif /* CONFIG_AP */
- case EVENT_DFS_CAC_STARTED:
- if (data)
-- wpas_event_dfs_cac_started(wpa_s, &data->dfs_event);
-+ wpas_ap_event_dfs_cac_started(wpa_s, &data->dfs_event);
- break;
- case EVENT_DFS_CAC_FINISHED:
- if (data)
-- wpas_event_dfs_cac_finished(wpa_s, &data->dfs_event);
-+ wpas_ap_event_dfs_cac_finished(wpa_s, &data->dfs_event);
- break;
- case EVENT_DFS_CAC_ABORTED:
- if (data)
-- wpas_event_dfs_cac_aborted(wpa_s, &data->dfs_event);
-+ wpas_ap_event_dfs_cac_aborted(wpa_s, &data->dfs_event);
-+ break;
-+ case EVENT_DFS_NOP_FINISHED:
-+ if (data)
-+ wpas_ap_event_dfs_cac_nop_finished(wpa_s,
-+ &data->dfs_event);
- break;
-+#endif /* NEED_AP_MLME */
-+#endif /* CONFIG_AP */
- case EVENT_RX_MGMT: {
- u16 fc, stype;
- const struct ieee80211_mgmt *mgmt;
---- a/wpa_supplicant/wpa_supplicant.c
-+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -243,30 +243,10 @@ void wpa_supplicant_req_auth_timeout(str
- wpa_dbg(wpa_s, MSG_DEBUG, "Setting authentication timeout: %d sec "
- "%d usec", sec, usec);
- eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
-- wpa_s->last_auth_timeout_sec = sec;
- eloop_register_timeout(sec, usec, wpa_supplicant_timeout, wpa_s, NULL);
- }
-
-
--/*
-- * wpas_auth_timeout_restart - Restart and change timeout for authentication
-- * @wpa_s: Pointer to wpa_supplicant data
-- * @sec_diff: difference in seconds applied to original timeout value
-- */
--void wpas_auth_timeout_restart(struct wpa_supplicant *wpa_s, int sec_diff)
--{
-- int new_sec = wpa_s->last_auth_timeout_sec + sec_diff;
--
-- if (eloop_is_timeout_registered(wpa_supplicant_timeout, wpa_s, NULL)) {
-- wpa_dbg(wpa_s, MSG_DEBUG,
-- "Authentication timeout restart: %d sec", new_sec);
-- eloop_cancel_timeout(wpa_supplicant_timeout, wpa_s, NULL);
-- eloop_register_timeout(new_sec, 0, wpa_supplicant_timeout,
-- wpa_s, NULL);
-- }
--}
--
--
- /**
- * wpa_supplicant_cancel_auth_timeout - Cancel authentication timeout
- * @wpa_s: Pointer to wpa_supplicant data
---- a/wpa_supplicant/wpa_supplicant_i.h
-+++ b/wpa_supplicant/wpa_supplicant_i.h
-@@ -1182,8 +1182,6 @@ struct wpa_supplicant {
- /* RIC elements for FT protocol */
- struct wpabuf *ric_ies;
-
-- int last_auth_timeout_sec;
--
- #ifdef CONFIG_DPP
- struct dl_list dpp_bootstrap; /* struct dpp_bootstrap_info */
- struct dl_list dpp_configurator; /* struct dpp_configurator */
-@@ -1258,7 +1256,6 @@ void wpa_supplicant_initiate_eapol(struc
- void wpa_clear_keys(struct wpa_supplicant *wpa_s, const u8 *addr);
- void wpa_supplicant_req_auth_timeout(struct wpa_supplicant *wpa_s,
- int sec, int usec);
--void wpas_auth_timeout_restart(struct wpa_supplicant *wpa_s, int sec_diff);
- void wpa_supplicant_reinit_autoscan(struct wpa_supplicant *wpa_s);
- void wpa_supplicant_set_state(struct wpa_supplicant *wpa_s,
- enum wpa_states state);
+++ /dev/null
-From 0d4900ccd1c7ec5c5ffecf5040f9c07a6a32deef Mon Sep 17 00:00:00 2001
-Date: Thu, 3 May 2018 13:12:35 +0200
-Subject: [PATCH 2/2] Revert "wpa_supplicant: Rename wpas_event_*() to
- wpas_ap_event_*()"
-
-This reverts commit 2dd5fbbff884af488870a37e339b4817c83954de.
----
- wpa_supplicant/ap.c | 20 ++++++++++----------
- wpa_supplicant/ap.h | 18 +++++++++---------
- wpa_supplicant/events.c | 13 ++++++-------
- 3 files changed, 25 insertions(+), 26 deletions(-)
-
---- a/wpa_supplicant/ap.c
-+++ b/wpa_supplicant/ap.c
-@@ -1537,8 +1537,8 @@ int wpas_ap_pmksa_cache_add_external(str
-
-
- #ifdef NEED_AP_MLME
--void wpas_ap_event_dfs_radar_detected(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar)
-+void wpas_event_dfs_radar_detected(struct wpa_supplicant *wpa_s,
-+ struct dfs_event *radar)
- {
- if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
- return;
-@@ -1550,8 +1550,8 @@ void wpas_ap_event_dfs_radar_detected(st
- }
-
-
--void wpas_ap_event_dfs_cac_started(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar)
-+void wpas_event_dfs_cac_started(struct wpa_supplicant *wpa_s,
-+ struct dfs_event *radar)
- {
- if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
- return;
-@@ -1562,8 +1562,8 @@ void wpas_ap_event_dfs_cac_started(struc
- }
-
-
--void wpas_ap_event_dfs_cac_finished(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar)
-+void wpas_event_dfs_cac_finished(struct wpa_supplicant *wpa_s,
-+ struct dfs_event *radar)
- {
- if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
- return;
-@@ -1574,8 +1574,8 @@ void wpas_ap_event_dfs_cac_finished(stru
- }
-
-
--void wpas_ap_event_dfs_cac_aborted(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar)
-+void wpas_event_dfs_cac_aborted(struct wpa_supplicant *wpa_s,
-+ struct dfs_event *radar)
- {
- if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
- return;
-@@ -1586,8 +1586,8 @@ void wpas_ap_event_dfs_cac_aborted(struc
- }
-
-
--void wpas_ap_event_dfs_cac_nop_finished(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar)
-+void wpas_event_dfs_cac_nop_finished(struct wpa_supplicant *wpa_s,
-+ struct dfs_event *radar)
- {
- if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
- return;
---- a/wpa_supplicant/ap.h
-+++ b/wpa_supplicant/ap.h
-@@ -89,16 +89,16 @@ int wpas_ap_pmksa_cache_list_mesh(struct
- char *buf, size_t len);
- int wpas_ap_pmksa_cache_add_external(struct wpa_supplicant *wpa_s, char *cmd);
-
--void wpas_ap_event_dfs_radar_detected(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar);
--void wpas_ap_event_dfs_cac_started(struct wpa_supplicant *wpa_s,
-+void wpas_event_dfs_radar_detected(struct wpa_supplicant *wpa_s,
- struct dfs_event *radar);
--void wpas_ap_event_dfs_cac_finished(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar);
--void wpas_ap_event_dfs_cac_aborted(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar);
--void wpas_ap_event_dfs_cac_nop_finished(struct wpa_supplicant *wpa_s,
-- struct dfs_event *radar);
-+void wpas_event_dfs_cac_started(struct wpa_supplicant *wpa_s,
-+ struct dfs_event *radar);
-+void wpas_event_dfs_cac_finished(struct wpa_supplicant *wpa_s,
-+ struct dfs_event *radar);
-+void wpas_event_dfs_cac_aborted(struct wpa_supplicant *wpa_s,
-+ struct dfs_event *radar);
-+void wpas_event_dfs_cac_nop_finished(struct wpa_supplicant *wpa_s,
-+ struct dfs_event *radar);
-
- void ap_periodic(struct wpa_supplicant *wpa_s);
-
---- a/wpa_supplicant/events.c
-+++ b/wpa_supplicant/events.c
-@@ -4220,25 +4220,24 @@ void wpa_supplicant_event(void *ctx, enu
- #ifdef NEED_AP_MLME
- case EVENT_DFS_RADAR_DETECTED:
- if (data)
-- wpas_ap_event_dfs_radar_detected(wpa_s,
-- &data->dfs_event);
-+ wpas_event_dfs_radar_detected(wpa_s, &data->dfs_event);
- break;
- case EVENT_DFS_CAC_STARTED:
- if (data)
-- wpas_ap_event_dfs_cac_started(wpa_s, &data->dfs_event);
-+ wpas_event_dfs_cac_started(wpa_s, &data->dfs_event);
- break;
- case EVENT_DFS_CAC_FINISHED:
- if (data)
-- wpas_ap_event_dfs_cac_finished(wpa_s, &data->dfs_event);
-+ wpas_event_dfs_cac_finished(wpa_s, &data->dfs_event);
- break;
- case EVENT_DFS_CAC_ABORTED:
- if (data)
-- wpas_ap_event_dfs_cac_aborted(wpa_s, &data->dfs_event);
-+ wpas_event_dfs_cac_aborted(wpa_s, &data->dfs_event);
- break;
- case EVENT_DFS_NOP_FINISHED:
- if (data)
-- wpas_ap_event_dfs_cac_nop_finished(wpa_s,
-- &data->dfs_event);
-+ wpas_event_dfs_cac_nop_finished(wpa_s,
-+ &data->dfs_event);
- break;
- #endif /* NEED_AP_MLME */
- #endif /* CONFIG_AP */
-From 032e70833de4b251fc4a159b2cc4ef28d0f1df0d Mon Sep 17 00:00:00 2001
+From 02ae4382f45f772e3630460459eb4e5af64e71b4 Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:54:58 -0700
-Subject: [PATCH 01/16] mesh: factor out mesh join function
+Date: Tue, 29 May 2018 14:39:05 -0700
+Subject: [PATCH 01/18] mesh: factor out mesh join function
mesh join function consitss of 2 parts which are preparing
configurations and sending join event to driver.
-From 6da64b1e056e0b1be18b6ab37c820acb4a0f3cf4 Mon Sep 17 00:00:00 2001
+From 89db76eeff6502dfa39b011962ec9d560ed4c2ee Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:54:59 -0700
-Subject: [PATCH 02/16] mesh: factor out rsn initialization
+Date: Tue, 29 May 2018 14:39:06 -0700
+Subject: [PATCH 02/18] mesh: factor out rsn initialization
RSN initialization can be used in different phases
if mesh initialization and mesh join don't happen
-From 95425b5becaeda8a515c942f417696e5df34bbc8 Mon Sep 17 00:00:00 2001
+From 07bad5f256cbe8a4b45d32c5b43b870ee815fb42 Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:00 -0700
-Subject: [PATCH 03/16] mesh: relocate RSN init function
+Date: Tue, 29 May 2018 14:39:07 -0700
+Subject: [PATCH 03/18] mesh: relocate RSN init function
RSN init function should work together with mesh join
when it's used. Since mesh join could be called at different stage
-From 32044a7bb26858bedaf147c77f49f5cef1133de3 Mon Sep 17 00:00:00 2001
+From bd05de484bfa61def530d717c7234381f6b33cf7 Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:01 -0700
-Subject: [PATCH 04/16] mesh: use setup completion callback to complete mesh
+Date: Tue, 29 May 2018 14:39:08 -0700
+Subject: [PATCH 04/18] mesh: use setup completion callback to complete mesh
join
mesh join function is the last function to be called during
-From e2f13b1fac9799db83a37fc57df9471d9bb5b711 Mon Sep 17 00:00:00 2001
+From dbe9afab3b2dceb35d478ac43dfcf8fdc5e23a22 Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:02 -0700
-Subject: [PATCH 05/16] mesh: reflect country setting to mesh configuration
+Date: Tue, 29 May 2018 14:39:09 -0700
+Subject: [PATCH 05/18] mesh: reflect country setting to mesh configuration
wpa_supplicant configuration has country parameter that is
supposed to be used in AP mode to indicate supporting 802.11h
is required to support 802.11h and 802.11d to use DFS channels.
---
- wpa_supplicant/mesh.c | 8 ++++++++
- 1 file changed, 8 insertions(+)
+ wpa_supplicant/mesh.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
--- a/wpa_supplicant/mesh.c
+++ b/wpa_supplicant/mesh.c
-From 37bf08621eee53f30b464be71876c02e235077ba Mon Sep 17 00:00:00 2001
+From 51e759da5026b3e64f801135b5d53f2198bbd2f0 Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:03 -0700
-Subject: [PATCH 06/16] mesh: inform kernel driver DFS handler in userspace
+Date: Tue, 29 May 2018 14:39:10 -0700
+Subject: [PATCH 06/18] mesh: inform kernel driver DFS handler in userspace
NL80211_ATTR_HANDLE_DFS is required by kerenel space
to enable DFS channels that indicates DFS handler
-From 8190aab3344ae9746c897093f88f3679239d135d Mon Sep 17 00:00:00 2001
+From bdc77efe681d5b88f3256e2bb6e706d4eaf09518 Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:04 -0700
-Subject: [PATCH 07/16] mesh: apply channel attributes before running Mesh
+Date: Tue, 29 May 2018 14:39:11 -0700
+Subject: [PATCH 07/18] mesh: apply channel attributes before running Mesh
This helps mesh interface initializes with correct
channel parameters.
-From e001251cb5708c406d477eca6aa912e5692b17fe Mon Sep 17 00:00:00 2001
+From eb9888ba41faaeb8fd07392ad46808b7d894cc14 Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:05 -0700
-Subject: [PATCH 08/16] mesh: set interface type to mesh before setting
+Date: Tue, 29 May 2018 14:39:12 -0700
+Subject: [PATCH 08/18] mesh: set interface type to mesh before setting
interface
Correct interface type is required to start DFS CAC that can be
-From 3cefd0bf495ad51a860b56281a8cae32bc4bd086 Mon Sep 17 00:00:00 2001
+From fa3af966032267e618b19bbf06a536ddb81ddbdf Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:06 -0700
-Subject: [PATCH 09/16] mesh: set mesh center frequency
+Date: Tue, 29 May 2018 14:39:13 -0700
+Subject: [PATCH 09/18] mesh: set mesh center frequency
vht center frequency value is required to compose the correct channel info.
-From 90aa570a894a907d11f85ced43a248198e24acc1 Mon Sep 17 00:00:00 2001
+From 9a8ca54a264a2820af614043e7af853166b320b0 Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:07 -0700
-Subject: [PATCH 10/16] mesh: consider mesh interface on dfs event handler
+Date: Tue, 29 May 2018 14:39:14 -0700
+Subject: [PATCH 10/18] mesh: consider mesh interface on dfs event handler
Once mesh starts supporting DFS channels, it has to handle DFS related events
from drivers, hence add mesh interface to the check list.
---
wpa_supplicant/ap.c | 71 ++++++++++++++++++++++++++++++-----------
- wpa_supplicant/events.c | 1 +
- 2 files changed, 54 insertions(+), 18 deletions(-)
+ wpa_supplicant/events.c | 7 ++--
+ 2 files changed, 57 insertions(+), 21 deletions(-)
--- a/wpa_supplicant/ap.c
+++ b/wpa_supplicant/ap.c
}
@@ -1540,10 +1545,16 @@ int wpas_ap_pmksa_cache_add_external(str
- void wpas_event_dfs_radar_detected(struct wpa_supplicant *wpa_s,
- struct dfs_event *radar)
+ void wpas_ap_event_dfs_radar_detected(struct wpa_supplicant *wpa_s,
+ struct dfs_event *radar)
{
- if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
- return;
radar->ht_enabled, radar->chan_offset,
radar->chan_width,
radar->cf1, radar->cf2);
-@@ -1553,10 +1564,16 @@ void wpas_event_dfs_radar_detected(struc
- void wpas_event_dfs_cac_started(struct wpa_supplicant *wpa_s,
- struct dfs_event *radar)
+@@ -1553,10 +1564,16 @@ void wpas_ap_event_dfs_radar_detected(st
+ void wpas_ap_event_dfs_cac_started(struct wpa_supplicant *wpa_s,
+ struct dfs_event *radar)
{
- if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
- return;
radar->ht_enabled, radar->chan_offset,
radar->chan_width, radar->cf1, radar->cf2);
}
-@@ -1565,10 +1582,16 @@ void wpas_event_dfs_cac_started(struct w
- void wpas_event_dfs_cac_finished(struct wpa_supplicant *wpa_s,
- struct dfs_event *radar)
+@@ -1565,10 +1582,16 @@ void wpas_ap_event_dfs_cac_started(struc
+ void wpas_ap_event_dfs_cac_finished(struct wpa_supplicant *wpa_s,
+ struct dfs_event *radar)
{
- if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
- return;
radar->ht_enabled, radar->chan_offset,
radar->chan_width, radar->cf1, radar->cf2);
}
-@@ -1577,10 +1600,16 @@ void wpas_event_dfs_cac_finished(struct
- void wpas_event_dfs_cac_aborted(struct wpa_supplicant *wpa_s,
- struct dfs_event *radar)
+@@ -1577,10 +1600,16 @@ void wpas_ap_event_dfs_cac_finished(stru
+ void wpas_ap_event_dfs_cac_aborted(struct wpa_supplicant *wpa_s,
+ struct dfs_event *radar)
{
- if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
- return;
radar->ht_enabled, radar->chan_offset,
radar->chan_width, radar->cf1, radar->cf2);
}
-@@ -1589,10 +1618,16 @@ void wpas_event_dfs_cac_aborted(struct w
- void wpas_event_dfs_cac_nop_finished(struct wpa_supplicant *wpa_s,
- struct dfs_event *radar)
+@@ -1589,10 +1618,16 @@ void wpas_ap_event_dfs_cac_aborted(struc
+ void wpas_ap_event_dfs_cac_nop_finished(struct wpa_supplicant *wpa_s,
+ struct dfs_event *radar)
{
- if (!wpa_s->ap_iface || !wpa_s->ap_iface->bss[0])
- return;
}
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
-@@ -4203,6 +4203,7 @@ void wpa_supplicant_event(void *ctx, enu
+@@ -3802,7 +3802,7 @@ static void wpas_event_dfs_cac_started(s
+ struct dfs_event *radar)
+ {
+ #if defined(NEED_AP_MLME) && defined(CONFIG_AP)
+- if (wpa_s->ap_iface) {
++ if (wpa_s->ap_iface || wpa_s->ifmsh) {
+ wpas_ap_event_dfs_cac_started(wpa_s, radar);
+ } else
+ #endif /* NEED_AP_MLME && CONFIG_AP */
+@@ -3823,7 +3823,7 @@ static void wpas_event_dfs_cac_finished(
+ struct dfs_event *radar)
+ {
+ #if defined(NEED_AP_MLME) && defined(CONFIG_AP)
+- if (wpa_s->ap_iface) {
++ if (wpa_s->ap_iface || wpa_s->ifmsh) {
+ wpas_ap_event_dfs_cac_finished(wpa_s, radar);
+ } else
+ #endif /* NEED_AP_MLME && CONFIG_AP */
+@@ -3839,7 +3839,7 @@ static void wpas_event_dfs_cac_aborted(s
+ struct dfs_event *radar)
+ {
+ #if defined(NEED_AP_MLME) && defined(CONFIG_AP)
+- if (wpa_s->ap_iface) {
++ if (wpa_s->ap_iface || wpa_s->ifmsh) {
+ wpas_ap_event_dfs_cac_aborted(wpa_s, radar);
+ } else
+ #endif /* NEED_AP_MLME && CONFIG_AP */
+@@ -4278,6 +4278,7 @@ void wpa_supplicant_event(void *ctx, enu
#ifdef CONFIG_AP
if (wpa_s->current_ssid->mode == WPAS_MODE_AP ||
wpa_s->current_ssid->mode == WPAS_MODE_P2P_GO ||
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -2040,6 +2040,8 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2060,6 +2060,8 @@ void ibss_mesh_setup_freq(struct wpa_sup
struct hostapd_freq_params vht_freq;
int chwidth, seg0, seg1;
u32 vht_caps = 0;
freq->freq = ssid->frequency;
-@@ -2116,8 +2118,11 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2136,8 +2138,11 @@ void ibss_mesh_setup_freq(struct wpa_sup
return;
/* Check primary channel flags */
#ifdef CONFIG_HT_OVERRIDES
if (ssid->disable_ht40)
-@@ -2143,8 +2148,11 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2163,8 +2168,11 @@ void ibss_mesh_setup_freq(struct wpa_sup
return;
/* Check secondary channel flags */
freq->channel = pri_chan->chan;
-@@ -2234,8 +2242,11 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2254,8 +2262,11 @@ void ibss_mesh_setup_freq(struct wpa_sup
return;
/* Back to HT configuration if channel not usable */
}
chwidth = VHT_CHANWIDTH_80MHZ;
-@@ -2255,10 +2266,11 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2275,10 +2286,11 @@ void ibss_mesh_setup_freq(struct wpa_sup
if (!chan)
continue;
-From 912b5c89328f1f9585e64fd13460928c71f28352 Mon Sep 17 00:00:00 2001
+From 4a8245ec2e9d48e464488477a3e7ed234009c216 Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:09 -0700
-Subject: [PATCH 12/16] mesh: allow mesh to send channel switch request
+Date: Tue, 29 May 2018 14:39:16 -0700
+Subject: [PATCH 12/18] mesh: allow mesh to send channel switch request
add mesh type to nl80211 channel switch request,
so mesh is able to send the request to kernel drivers.
-From d7ae7271dce4203bfcd79a230acb24f03f38633d Mon Sep 17 00:00:00 2001
+From 267395271c1a36b54ef21070acff2cadce241035 Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:10 -0700
-Subject: [PATCH 13/16] mesh: do not allow pri/sec channel switch
+Date: Tue, 29 May 2018 14:39:17 -0700
+Subject: [PATCH 13/18] mesh: do not allow pri/sec channel switch
We don't want mesh to switch the channel from primary to secondary,
since mesh points are not able to join each other in that case.
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -2165,7 +2165,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2185,7 +2185,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
}
freq->sec_channel_offset = ht40;
-From 48f31256ffebfc43d6b14b93597aa2c7e2975dc4 Mon Sep 17 00:00:00 2001
+From 9423e8be0393e82c8622806a0529e47fd5583c0b Mon Sep 17 00:00:00 2001
-Date: Tue, 17 Apr 2018 21:55:12 -0700
-Subject: [PATCH 15/16] mesh: do not use offchan mgmt tx on DFS
+Date: Tue, 29 May 2018 14:39:19 -0700
+Subject: [PATCH 15/18] mesh: do not use offchan mgmt tx on DFS
Drivers don't allow mesh to use offchannel on management Tx.
---
- src/drivers/driver_nl80211.c | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
+ src/drivers/driver_nl80211.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
struct ieee80211_hdr *hdr;
wpa_printf(MSG_DEBUG, "nl80211: Send Action frame (ifindex=%d, "
-@@ -7190,6 +7194,12 @@ static int wpa_driver_nl80211_send_actio
+@@ -7189,7 +7193,11 @@ static int wpa_driver_nl80211_send_actio
+ } else {
os_memset(bss->rand_addr, 0, ETH_ALEN);
}
-
+-
+ if (is_mesh_interface(drv->nlmode) &&
+ (modes = nl80211_get_hw_feature_data(bss, &num_modes, &flags,
+ &dfs_domain)) &&
+ ieee80211_is_dfs(freq, modes, num_modes))
+ offchanok = 0;
-+
if (is_ap_interface(drv->nlmode) &&
(!(drv->capa.flags & WPA_DRIVER_FLAGS_OFFCHANNEL_TX) ||
(int) freq == bss->freq || drv->device_ap_sme ||
-@@ -7201,7 +7211,7 @@ static int wpa_driver_nl80211_send_actio
+@@ -7201,7 +7209,7 @@ static int wpa_driver_nl80211_send_actio
ret = nl80211_send_frame_cmd(bss, freq, wait_time, buf,
24 + data_len,
&drv->send_action_cookie,
--- /dev/null
+From fa9d565fe8841b288f29137c23a7ab2584dd9510 Mon Sep 17 00:00:00 2001
+Date: Tue, 29 May 2018 14:39:20 -0700
+Subject: [PATCH 16/18] mesh: fix channel switch error during CAC
+
+Mesh interface has used its channel parameters that configured
+during its initialization even after channel switched due to
+DFS radar detection during CAC which caused channel switch error.
+This change fixes the error by updating its channel parameters
+when channel's been changed from initial one.
+
+---
+ wpa_supplicant/mesh.c | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+--- a/wpa_supplicant/mesh.c
++++ b/wpa_supplicant/mesh.c
+@@ -11,6 +11,7 @@
+ #include "utils/common.h"
+ #include "utils/eloop.h"
+ #include "utils/uuid.h"
++#include "common/hw_features_common.h"
+ #include "common/ieee802_11_defs.h"
+ #include "common/wpa_ctrl.h"
+ #include "ap/sta_info.h"
+@@ -394,10 +395,35 @@ void wpa_supplicant_mesh_add_scan_ie(str
+ void wpas_mesh_complete_cb(void *ctx)
+ {
+ struct wpa_supplicant *wpa_s = (struct wpa_supplicant *)ctx;
++ struct hostapd_iface *ifmsh = wpa_s->ifmsh;
+ struct wpa_driver_mesh_join_params *params = wpa_s->mesh_params;
+ struct wpa_ssid *ssid = wpa_s->current_ssid;
+ int ret = 0;
+
++ /*
++ * inspect if channel's been changed since initialized.
++ * i.e. DFS radar detection
++ */
++ if (ifmsh->freq != params->freq.freq) {
++ wpa_s->assoc_freq = ifmsh->freq;
++ ssid->frequency = ifmsh->freq;
++ if (hostapd_set_freq_params(¶ms->freq,
++ ifmsh->conf->hw_mode,
++ ifmsh->freq,
++ ifmsh->conf->channel,
++ ifmsh->conf->ieee80211n,
++ ifmsh->conf->ieee80211ac,
++ ifmsh->conf->secondary_channel,
++ ifmsh->conf->vht_oper_chwidth,
++ ifmsh->conf->vht_oper_centr_freq_seg0_idx,
++ ifmsh->conf->vht_oper_centr_freq_seg1_idx,
++ ifmsh->conf->vht_capab)) {
++ wpa_printf(MSG_ERROR, "Error updating mesh frequency params.");
++ wpa_supplicant_mesh_deinit(wpa_s);
++ return;
++ }
++ }
++
+ if (wpas_mesh_init_rsn(wpa_s)) {
+ wpa_printf(MSG_ERROR, "Init RSN failed. Deinit mesh...");
+ wpa_supplicant_mesh_deinit(wpa_s);
+++ /dev/null
-From 9a01d7f21bd33725dc33325a437c3cc4185ee8bd Mon Sep 17 00:00:00 2001
-Date: Wed, 18 Apr 2018 19:24:31 +0200
-Subject: [PATCH 16/16] mesh: make forwarding configurable
-
-Allow mesh_fwding to be specified in a mesh bss config, pass that
-to the driver (only nl80211 implemented for now) and announce
-forwarding capability accordingly.
-
----
- src/ap/ap_config.h | 2 ++
- src/drivers/driver.h | 2 ++
- src/drivers/driver_nl80211.c | 3 +++
- wpa_supplicant/config.c | 4 ++++
- wpa_supplicant/config.h | 9 +++++++++
- wpa_supplicant/config_file.c | 4 ++++
- wpa_supplicant/config_ssid.h | 5 +++++
- wpa_supplicant/mesh.c | 6 ++++++
- wpa_supplicant/mesh_mpm.c | 4 ++--
- wpa_supplicant/wpa_supplicant.conf | 3 +++
- 10 files changed, 40 insertions(+), 2 deletions(-)
-
---- a/src/ap/ap_config.h
-+++ b/src/ap/ap_config.h
-@@ -49,6 +49,7 @@ struct mesh_conf {
- int dot11MeshRetryTimeout; /* msec */
- int dot11MeshConfirmTimeout; /* msec */
- int dot11MeshHoldingTimeout; /* msec */
-+ int mesh_fwding;
- };
-
- #define MAX_STA_COUNT 2007
-@@ -624,6 +625,7 @@ struct hostapd_bss_config {
-
- #define MESH_ENABLED BIT(0)
- int mesh;
-+ int mesh_fwding;
-
- u8 radio_measurements[RRM_CAPABILITIES_IE_LEN];
-
---- a/src/drivers/driver.h
-+++ b/src/drivers/driver.h
-@@ -1363,6 +1363,7 @@ struct wpa_driver_mesh_bss_params {
- #define WPA_DRIVER_MESH_CONF_FLAG_MAX_PEER_LINKS 0x00000004
- #define WPA_DRIVER_MESH_CONF_FLAG_HT_OP_MODE 0x00000008
- #define WPA_DRIVER_MESH_CONF_FLAG_RSSI_THRESHOLD 0x00000010
-+#define WPA_DRIVER_MESH_CONF_FLAG_FORWARDING 0x00000020
- /*
- * TODO: Other mesh configuration parameters would go here.
- * See NL80211_MESHCONF_* for all the mesh config parameters.
-@@ -1372,6 +1373,7 @@ struct wpa_driver_mesh_bss_params {
- int peer_link_timeout;
- int max_peer_links;
- int rssi_threshold;
-+ int forwarding;
- u16 ht_opmode;
- };
-
---- a/src/drivers/driver_nl80211.c
-+++ b/src/drivers/driver_nl80211.c
-@@ -9230,6 +9230,9 @@ static int nl80211_put_mesh_config(struc
- if (((params->flags & WPA_DRIVER_MESH_CONF_FLAG_AUTO_PLINKS) &&
- nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
- params->auto_plinks)) ||
-+ ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_FORWARDING) &&
-+ nla_put_u8(msg, NL80211_MESHCONF_FORWARDING,
-+ params->forwarding)) ||
- ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_MAX_PEER_LINKS) &&
- nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
- params->max_peer_links)) ||
---- a/wpa_supplicant/config.c
-+++ b/wpa_supplicant/config.c
-@@ -2212,6 +2212,7 @@ static const struct parse_data ssid_fiel
- #ifdef CONFIG_MESH
- { INT_RANGE(mode, 0, 5) },
- { INT_RANGE(no_auto_peer, 0, 1) },
-+ { INT_RANGE(mesh_fwding, 0, 1) },
- { INT_RANGE(mesh_rssi_threshold, -255, 1) },
- #else /* CONFIG_MESH */
- { INT_RANGE(mode, 0, 4) },
-@@ -2763,6 +2764,7 @@ void wpa_config_set_network_defaults(str
- ssid->dot11MeshRetryTimeout = DEFAULT_MESH_RETRY_TIMEOUT;
- ssid->dot11MeshConfirmTimeout = DEFAULT_MESH_CONFIRM_TIMEOUT;
- ssid->dot11MeshHoldingTimeout = DEFAULT_MESH_HOLDING_TIMEOUT;
-+ ssid->mesh_fwding = DEFAULT_MESH_FWDING;
- ssid->mesh_rssi_threshold = DEFAULT_MESH_RSSI_THRESHOLD;
- #endif /* CONFIG_MESH */
- #ifdef CONFIG_HT_OVERRIDES
-@@ -3978,6 +3980,7 @@ struct wpa_config * wpa_config_alloc_emp
- config->user_mpm = DEFAULT_USER_MPM;
- config->max_peer_links = DEFAULT_MAX_PEER_LINKS;
- config->mesh_max_inactivity = DEFAULT_MESH_MAX_INACTIVITY;
-+ config->mesh_fwding = DEFAULT_MESH_FWDING;
- config->dot11RSNASAERetransPeriod =
- DEFAULT_DOT11_RSNA_SAE_RETRANS_PERIOD;
- config->fast_reauth = DEFAULT_FAST_REAUTH;
-@@ -4600,6 +4603,7 @@ static const struct global_parse_data gl
- { INT(user_mpm), 0 },
- { INT_RANGE(max_peer_links, 0, 255), 0 },
- { INT(mesh_max_inactivity), 0 },
-+ { INT_RANGE(mesh_fwding, 0, 1), 0 },
- { INT(dot11RSNASAERetransPeriod), 0 },
- #endif /* CONFIG_MESH */
- { INT(disable_scan_offload), 0 },
---- a/wpa_supplicant/config.h
-+++ b/wpa_supplicant/config.h
-@@ -18,6 +18,7 @@
- #define DEFAULT_USER_MPM 1
- #define DEFAULT_MAX_PEER_LINKS 99
- #define DEFAULT_MESH_MAX_INACTIVITY 300
-+#define DEFAULT_MESH_FWDING 1
- /*
- * The default dot11RSNASAERetransPeriod is defined as 40 ms in the standard,
- * but use 1000 ms in practice to avoid issues on low power CPUs.
-@@ -1306,6 +1307,14 @@ struct wpa_config {
- int mesh_max_inactivity;
-
- /**
-+ * mesh_fwding - Mesh network layer-2 forwarding
-+ *
-+ * This controls whether to enable layer-2 forwarding.
-+ * By default: 1: enabled
-+ */
-+ int mesh_fwding;
-+
-+ /**
- * dot11RSNASAERetransPeriod - Timeout to retransmit SAE Auth frame
- *
- * This timeout value is used in mesh STA to retransmit
---- a/wpa_supplicant/config_file.c
-+++ b/wpa_supplicant/config_file.c
-@@ -818,6 +818,7 @@ static void wpa_config_write_network(FIL
- #endif /* IEEE8021X_EAPOL */
- INT(mode);
- INT(no_auto_peer);
-+ INT(mesh_fwding);
- INT(frequency);
- INT(fixed_freq);
- #ifdef CONFIG_ACS
-@@ -1450,6 +1451,9 @@ static void wpa_config_write_global(FILE
- fprintf(f, "mesh_max_inactivity=%d\n",
- config->mesh_max_inactivity);
-
-+ if (config->mesh_fwding != DEFAULT_MESH_FWDING)
-+ fprintf(f, "mesh_fwding=%d\n", config->mesh_fwding);
-+
- if (config->dot11RSNASAERetransPeriod !=
- DEFAULT_DOT11_RSNA_SAE_RETRANS_PERIOD)
- fprintf(f, "dot11RSNASAERetransPeriod=%d\n",
---- a/wpa_supplicant/config_ssid.h
-+++ b/wpa_supplicant/config_ssid.h
-@@ -500,6 +500,11 @@ struct wpa_ssid {
- int dot11MeshConfirmTimeout; /* msec */
- int dot11MeshHoldingTimeout; /* msec */
-
-+ /**
-+ * Mesh network layer-2 forwarding
-+ */
-+ int mesh_fwding;
-+
- int ht;
- int ht40;
-
---- a/wpa_supplicant/mesh.c
-+++ b/wpa_supplicant/mesh.c
-@@ -120,6 +120,7 @@ static struct mesh_conf * mesh_config_cr
- conf->mesh_cc_id = 0;
- conf->mesh_sp_id = MESH_SYNC_METHOD_NEIGHBOR_OFFSET;
- conf->mesh_auth_id = (conf->security & MESH_CONF_SEC_AUTH) ? 1 : 0;
-+ conf->mesh_fwding = ssid->mesh_fwding;
- conf->dot11MeshMaxRetries = ssid->dot11MeshMaxRetries;
- conf->dot11MeshRetryTimeout = ssid->dot11MeshRetryTimeout;
- conf->dot11MeshConfirmTimeout = ssid->dot11MeshConfirmTimeout;
-@@ -255,6 +256,7 @@ static int wpa_supplicant_mesh_init(stru
- bss->conf->start_disabled = 1;
- bss->conf->mesh = MESH_ENABLED;
- bss->conf->ap_max_inactivity = wpa_s->conf->mesh_max_inactivity;
-+ bss->conf->mesh_fwding = wpa_s->conf->mesh_fwding;
-
- if (ieee80211_is_dfs(ssid->frequency, wpa_s->hw.modes,
- wpa_s->hw.num_modes) && wpa_s->conf->country[0]) {
-@@ -508,6 +510,10 @@ int wpa_supplicant_join_mesh(struct wpa_
- }
- params->conf.peer_link_timeout = wpa_s->conf->mesh_max_inactivity;
-
-+ /* always explicitely set forwarding to on or off for now */
-+ params->conf.flags |= WPA_DRIVER_MESH_CONF_FLAG_FORWARDING;
-+ params->conf.forwarding = ssid->mesh_fwding;
-+
- wpa_s->mesh_params = params;
- if (wpa_supplicant_mesh_init(wpa_s, ssid, ¶ms->freq)) {
- wpa_msg(wpa_s, MSG_ERROR, "Failed to init mesh");
---- a/wpa_supplicant/mesh_mpm.c
-+++ b/wpa_supplicant/mesh_mpm.c
-@@ -288,9 +288,9 @@ static void mesh_mpm_send_plink_action(s
- info = (bss->num_plinks > 63 ? 63 : bss->num_plinks) << 1;
- /* TODO: Add Connected to Mesh Gate/AS subfields */
- wpabuf_put_u8(buf, info);
-- /* always forwarding & accepting plinks for now */
-+ /* set forwarding & always accepting plinks for now */
- wpabuf_put_u8(buf, MESH_CAP_ACCEPT_ADDITIONAL_PEER |
-- MESH_CAP_FORWARDING);
-+ (conf->mesh_fwding ? MESH_CAP_FORWARDING : 0));
- } else { /* Peer closing frame */
- /* IE: Mesh ID */
- wpabuf_put_u8(buf, WLAN_EID_MESH_ID);
---- a/wpa_supplicant/wpa_supplicant.conf
-+++ b/wpa_supplicant/wpa_supplicant.conf
-@@ -153,6 +153,9 @@ ap_scan=1
- # This timeout value is used in mesh STA to clean up inactive stations.
- #mesh_max_inactivity=300
-
-+# Enable 802.11s layer-2 routing and forwarding
-+#mesh_fwding=1
-+
- # cert_in_cb - Whether to include a peer certificate dump in events
- # This controls whether peer certificates for authentication server and
- # its certificate chain are included in EAP peer certificate events. This is
--- /dev/null
+From d3201adfe7d2219217a07ef16ef365ad59c1a89b Mon Sep 17 00:00:00 2001
+Date: Tue, 29 May 2018 14:39:21 -0700
+Subject: [PATCH 17/18] mesh: use right interface context to send DFS event
+ messages
+
+use mesh interface context to send DFS event messages when
+DFS events are on mesh interface.
+
+---
+ src/ap/dfs.c | 27 +++++++++++++++++++--------
+ 1 file changed, 19 insertions(+), 8 deletions(-)
+
+--- a/src/ap/dfs.c
++++ b/src/ap/dfs.c
+@@ -637,6 +637,17 @@ static unsigned int dfs_get_cac_time(str
+ }
+
+
++static void *get_message_ctx(struct hostapd_iface *iface)
++{
++#ifdef CONFIG_MESH
++ if (iface->mconf)
++ return iface->owner;
++#endif /* CONFIG_MESH */
++
++ return iface->bss[0]->msg_ctx;
++}
++
++
+ /*
+ * Main DFS handler
+ * 1 - continue channel/ap setup
+@@ -719,7 +730,7 @@ int hostapd_handle_dfs(struct hostapd_if
+ /* Finally start CAC */
+ hostapd_set_state(iface, HAPD_IFACE_DFS);
+ wpa_printf(MSG_DEBUG, "DFS start CAC on %d MHz", iface->freq);
+- wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_CAC_START
++ wpa_msg(get_message_ctx(iface), MSG_INFO, DFS_EVENT_CAC_START
+ "freq=%d chan=%d sec_chan=%d, width=%d, seg0=%d, seg1=%d, cac_time=%ds",
+ iface->freq,
+ iface->conf->channel, iface->conf->secondary_channel,
+@@ -768,7 +779,7 @@ int hostapd_dfs_complete_cac(struct host
+ int ht_enabled, int chan_offset, int chan_width,
+ int cf1, int cf2)
+ {
+- wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_CAC_COMPLETED
++ wpa_msg(get_message_ctx(iface), MSG_INFO, DFS_EVENT_CAC_COMPLETED
+ "success=%d freq=%d ht_enabled=%d chan_offset=%d chan_width=%d cf1=%d cf2=%d",
+ success, freq, ht_enabled, chan_offset, chan_width, cf1, cf2);
+
+@@ -810,7 +821,7 @@ int hostapd_dfs_pre_cac_expired(struct h
+ int ht_enabled, int chan_offset, int chan_width,
+ int cf1, int cf2)
+ {
+- wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_PRE_CAC_EXPIRED
++ wpa_msg(get_message_ctx(iface), MSG_INFO, DFS_EVENT_PRE_CAC_EXPIRED
+ "freq=%d ht_enabled=%d chan_offset=%d chan_width=%d cf1=%d cf2=%d",
+ freq, ht_enabled, chan_offset, chan_width, cf1, cf2);
+
+@@ -848,7 +859,7 @@ static int hostapd_dfs_start_channel_swi
+
+ wpa_printf(MSG_DEBUG, "DFS will switch to a new channel %d",
+ channel->chan);
+- wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_NEW_CHANNEL
++ wpa_msg(get_message_ctx(iface), MSG_INFO, DFS_EVENT_NEW_CHANNEL
+ "freq=%d chan=%d sec_chan=%d", channel->freq,
+ channel->chan, secondary_channel);
+
+@@ -935,7 +946,7 @@ static int hostapd_dfs_start_channel_swi
+
+ wpa_printf(MSG_DEBUG, "DFS will switch to a new channel %d",
+ channel->chan);
+- wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_NEW_CHANNEL
++ wpa_msg(get_message_ctx(iface), MSG_INFO, DFS_EVENT_NEW_CHANNEL
+ "freq=%d chan=%d sec_chan=%d", channel->freq,
+ channel->chan, secondary_channel);
+
+@@ -997,7 +1008,7 @@ int hostapd_dfs_radar_detected(struct ho
+ {
+ int res;
+
+- wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_RADAR_DETECTED
++ wpa_msg(get_message_ctx(iface), MSG_INFO, DFS_EVENT_RADAR_DETECTED
+ "freq=%d ht_enabled=%d chan_offset=%d chan_width=%d cf1=%d cf2=%d",
+ freq, ht_enabled, chan_offset, chan_width, cf1, cf2);
+
+@@ -1028,7 +1039,7 @@ int hostapd_dfs_nop_finished(struct host
+ int ht_enabled, int chan_offset, int chan_width,
+ int cf1, int cf2)
+ {
+- wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_NOP_FINISHED
++ wpa_msg(get_message_ctx(iface), MSG_INFO, DFS_EVENT_NOP_FINISHED
+ "freq=%d ht_enabled=%d chan_offset=%d chan_width=%d cf1=%d cf2=%d",
+ freq, ht_enabled, chan_offset, chan_width, cf1, cf2);
+
+@@ -1078,7 +1089,7 @@ int hostapd_dfs_start_cac(struct hostapd
+ int ht_enabled, int chan_offset, int chan_width,
+ int cf1, int cf2)
+ {
+- wpa_msg(iface->bss[0]->msg_ctx, MSG_INFO, DFS_EVENT_CAC_START
++ wpa_msg(get_message_ctx(iface), MSG_INFO, DFS_EVENT_CAC_START
+ "freq=%d chan=%d chan_offset=%d width=%d seg0=%d "
+ "seg1=%d cac_time=%ds",
+ freq, (freq - 5000) / 5, chan_offset, chan_width, cf1, cf2, 60);
--- /dev/null
+From 9a01d7f21bd33725dc33325a437c3cc4185ee8bd Mon Sep 17 00:00:00 2001
+Date: Wed, 18 Apr 2018 19:24:31 +0200
+Subject: [PATCH 16/16] mesh: make forwarding configurable
+
+Allow mesh_fwding to be specified in a mesh bss config, pass that
+to the driver (only nl80211 implemented for now) and announce
+forwarding capability accordingly.
+
+---
+ src/ap/ap_config.h | 2 ++
+ src/drivers/driver.h | 2 ++
+ src/drivers/driver_nl80211.c | 3 +++
+ wpa_supplicant/config.c | 4 ++++
+ wpa_supplicant/config.h | 9 +++++++++
+ wpa_supplicant/config_file.c | 4 ++++
+ wpa_supplicant/config_ssid.h | 5 +++++
+ wpa_supplicant/mesh.c | 6 ++++++
+ wpa_supplicant/mesh_mpm.c | 4 ++--
+ wpa_supplicant/wpa_supplicant.conf | 3 +++
+ 10 files changed, 40 insertions(+), 2 deletions(-)
+
+--- a/src/ap/ap_config.h
++++ b/src/ap/ap_config.h
+@@ -49,6 +49,7 @@ struct mesh_conf {
+ int dot11MeshRetryTimeout; /* msec */
+ int dot11MeshConfirmTimeout; /* msec */
+ int dot11MeshHoldingTimeout; /* msec */
++ int mesh_fwding;
+ };
+
+ #define MAX_STA_COUNT 2007
+@@ -624,6 +625,7 @@ struct hostapd_bss_config {
+
+ #define MESH_ENABLED BIT(0)
+ int mesh;
++ int mesh_fwding;
+
+ u8 radio_measurements[RRM_CAPABILITIES_IE_LEN];
+
+--- a/src/drivers/driver.h
++++ b/src/drivers/driver.h
+@@ -1363,6 +1363,7 @@ struct wpa_driver_mesh_bss_params {
+ #define WPA_DRIVER_MESH_CONF_FLAG_MAX_PEER_LINKS 0x00000004
+ #define WPA_DRIVER_MESH_CONF_FLAG_HT_OP_MODE 0x00000008
+ #define WPA_DRIVER_MESH_CONF_FLAG_RSSI_THRESHOLD 0x00000010
++#define WPA_DRIVER_MESH_CONF_FLAG_FORWARDING 0x00000020
+ /*
+ * TODO: Other mesh configuration parameters would go here.
+ * See NL80211_MESHCONF_* for all the mesh config parameters.
+@@ -1372,6 +1373,7 @@ struct wpa_driver_mesh_bss_params {
+ int peer_link_timeout;
+ int max_peer_links;
+ int rssi_threshold;
++ int forwarding;
+ u16 ht_opmode;
+ };
+
+--- a/src/drivers/driver_nl80211.c
++++ b/src/drivers/driver_nl80211.c
+@@ -9228,6 +9228,9 @@ static int nl80211_put_mesh_config(struc
+ if (((params->flags & WPA_DRIVER_MESH_CONF_FLAG_AUTO_PLINKS) &&
+ nla_put_u8(msg, NL80211_MESHCONF_AUTO_OPEN_PLINKS,
+ params->auto_plinks)) ||
++ ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_FORWARDING) &&
++ nla_put_u8(msg, NL80211_MESHCONF_FORWARDING,
++ params->forwarding)) ||
+ ((params->flags & WPA_DRIVER_MESH_CONF_FLAG_MAX_PEER_LINKS) &&
+ nla_put_u16(msg, NL80211_MESHCONF_MAX_PEER_LINKS,
+ params->max_peer_links)) ||
+--- a/wpa_supplicant/config.c
++++ b/wpa_supplicant/config.c
+@@ -2212,6 +2212,7 @@ static const struct parse_data ssid_fiel
+ #ifdef CONFIG_MESH
+ { INT_RANGE(mode, 0, 5) },
+ { INT_RANGE(no_auto_peer, 0, 1) },
++ { INT_RANGE(mesh_fwding, 0, 1) },
+ { INT_RANGE(mesh_rssi_threshold, -255, 1) },
+ #else /* CONFIG_MESH */
+ { INT_RANGE(mode, 0, 4) },
+@@ -2763,6 +2764,7 @@ void wpa_config_set_network_defaults(str
+ ssid->dot11MeshRetryTimeout = DEFAULT_MESH_RETRY_TIMEOUT;
+ ssid->dot11MeshConfirmTimeout = DEFAULT_MESH_CONFIRM_TIMEOUT;
+ ssid->dot11MeshHoldingTimeout = DEFAULT_MESH_HOLDING_TIMEOUT;
++ ssid->mesh_fwding = DEFAULT_MESH_FWDING;
+ ssid->mesh_rssi_threshold = DEFAULT_MESH_RSSI_THRESHOLD;
+ #endif /* CONFIG_MESH */
+ #ifdef CONFIG_HT_OVERRIDES
+@@ -3978,6 +3980,7 @@ struct wpa_config * wpa_config_alloc_emp
+ config->user_mpm = DEFAULT_USER_MPM;
+ config->max_peer_links = DEFAULT_MAX_PEER_LINKS;
+ config->mesh_max_inactivity = DEFAULT_MESH_MAX_INACTIVITY;
++ config->mesh_fwding = DEFAULT_MESH_FWDING;
+ config->dot11RSNASAERetransPeriod =
+ DEFAULT_DOT11_RSNA_SAE_RETRANS_PERIOD;
+ config->fast_reauth = DEFAULT_FAST_REAUTH;
+@@ -4600,6 +4603,7 @@ static const struct global_parse_data gl
+ { INT(user_mpm), 0 },
+ { INT_RANGE(max_peer_links, 0, 255), 0 },
+ { INT(mesh_max_inactivity), 0 },
++ { INT_RANGE(mesh_fwding, 0, 1), 0 },
+ { INT(dot11RSNASAERetransPeriod), 0 },
+ #endif /* CONFIG_MESH */
+ { INT(disable_scan_offload), 0 },
+--- a/wpa_supplicant/config.h
++++ b/wpa_supplicant/config.h
+@@ -18,6 +18,7 @@
+ #define DEFAULT_USER_MPM 1
+ #define DEFAULT_MAX_PEER_LINKS 99
+ #define DEFAULT_MESH_MAX_INACTIVITY 300
++#define DEFAULT_MESH_FWDING 1
+ /*
+ * The default dot11RSNASAERetransPeriod is defined as 40 ms in the standard,
+ * but use 1000 ms in practice to avoid issues on low power CPUs.
+@@ -1306,6 +1307,14 @@ struct wpa_config {
+ int mesh_max_inactivity;
+
+ /**
++ * mesh_fwding - Mesh network layer-2 forwarding
++ *
++ * This controls whether to enable layer-2 forwarding.
++ * By default: 1: enabled
++ */
++ int mesh_fwding;
++
++ /**
+ * dot11RSNASAERetransPeriod - Timeout to retransmit SAE Auth frame
+ *
+ * This timeout value is used in mesh STA to retransmit
+--- a/wpa_supplicant/config_file.c
++++ b/wpa_supplicant/config_file.c
+@@ -818,6 +818,7 @@ static void wpa_config_write_network(FIL
+ #endif /* IEEE8021X_EAPOL */
+ INT(mode);
+ INT(no_auto_peer);
++ INT(mesh_fwding);
+ INT(frequency);
+ INT(fixed_freq);
+ #ifdef CONFIG_ACS
+@@ -1450,6 +1451,9 @@ static void wpa_config_write_global(FILE
+ fprintf(f, "mesh_max_inactivity=%d\n",
+ config->mesh_max_inactivity);
+
++ if (config->mesh_fwding != DEFAULT_MESH_FWDING)
++ fprintf(f, "mesh_fwding=%d\n", config->mesh_fwding);
++
+ if (config->dot11RSNASAERetransPeriod !=
+ DEFAULT_DOT11_RSNA_SAE_RETRANS_PERIOD)
+ fprintf(f, "dot11RSNASAERetransPeriod=%d\n",
+--- a/wpa_supplicant/config_ssid.h
++++ b/wpa_supplicant/config_ssid.h
+@@ -500,6 +500,11 @@ struct wpa_ssid {
+ int dot11MeshConfirmTimeout; /* msec */
+ int dot11MeshHoldingTimeout; /* msec */
+
++ /**
++ * Mesh network layer-2 forwarding
++ */
++ int mesh_fwding;
++
+ int ht;
+ int ht40;
+
+--- a/wpa_supplicant/mesh.c
++++ b/wpa_supplicant/mesh.c
+@@ -121,6 +121,7 @@ static struct mesh_conf * mesh_config_cr
+ conf->mesh_cc_id = 0;
+ conf->mesh_sp_id = MESH_SYNC_METHOD_NEIGHBOR_OFFSET;
+ conf->mesh_auth_id = (conf->security & MESH_CONF_SEC_AUTH) ? 1 : 0;
++ conf->mesh_fwding = ssid->mesh_fwding;
+ conf->dot11MeshMaxRetries = ssid->dot11MeshMaxRetries;
+ conf->dot11MeshRetryTimeout = ssid->dot11MeshRetryTimeout;
+ conf->dot11MeshConfirmTimeout = ssid->dot11MeshConfirmTimeout;
+@@ -256,6 +257,7 @@ static int wpa_supplicant_mesh_init(stru
+ bss->conf->start_disabled = 1;
+ bss->conf->mesh = MESH_ENABLED;
+ bss->conf->ap_max_inactivity = wpa_s->conf->mesh_max_inactivity;
++ bss->conf->mesh_fwding = wpa_s->conf->mesh_fwding;
+
+ if (ieee80211_is_dfs(ssid->frequency, wpa_s->hw.modes,
+ wpa_s->hw.num_modes) && wpa_s->conf->country[0]) {
+@@ -534,6 +536,10 @@ int wpa_supplicant_join_mesh(struct wpa_
+ }
+ params->conf.peer_link_timeout = wpa_s->conf->mesh_max_inactivity;
+
++ /* always explicitely set forwarding to on or off for now */
++ params->conf.flags |= WPA_DRIVER_MESH_CONF_FLAG_FORWARDING;
++ params->conf.forwarding = ssid->mesh_fwding;
++
+ wpa_s->mesh_params = params;
+ if (wpa_supplicant_mesh_init(wpa_s, ssid, ¶ms->freq)) {
+ wpa_msg(wpa_s, MSG_ERROR, "Failed to init mesh");
+--- a/wpa_supplicant/mesh_mpm.c
++++ b/wpa_supplicant/mesh_mpm.c
+@@ -288,9 +288,9 @@ static void mesh_mpm_send_plink_action(s
+ info = (bss->num_plinks > 63 ? 63 : bss->num_plinks) << 1;
+ /* TODO: Add Connected to Mesh Gate/AS subfields */
+ wpabuf_put_u8(buf, info);
+- /* always forwarding & accepting plinks for now */
++ /* set forwarding & always accepting plinks for now */
+ wpabuf_put_u8(buf, MESH_CAP_ACCEPT_ADDITIONAL_PEER |
+- MESH_CAP_FORWARDING);
++ (conf->mesh_fwding ? MESH_CAP_FORWARDING : 0));
+ } else { /* Peer closing frame */
+ /* IE: Mesh ID */
+ wpabuf_put_u8(buf, WLAN_EID_MESH_ID);
+--- a/wpa_supplicant/wpa_supplicant.conf
++++ b/wpa_supplicant/wpa_supplicant.conf
+@@ -153,6 +153,9 @@ ap_scan=1
+ # This timeout value is used in mesh STA to clean up inactive stations.
+ #mesh_max_inactivity=300
+
++# Enable 802.11s layer-2 routing and forwarding
++#mesh_fwding=1
++
+ # cert_in_cb - Whether to include a peer certificate dump in events
+ # This controls whether peer certificates for authentication server and
+ # its certificate chain are included in EAP peer certificate events. This is
--- a/wpa_supplicant/mesh.c
+++ b/wpa_supplicant/mesh.c
-@@ -214,7 +214,7 @@ static int wpa_supplicant_mesh_init(stru
+@@ -215,7 +215,7 @@ static int wpa_supplicant_mesh_init(stru
return 0;
}
struct dl_list list;
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -2292,6 +2292,9 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2312,6 +2312,9 @@ void ibss_mesh_setup_freq(struct wpa_sup
vht_caps |= VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
seg0 = 114;
}
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -2124,9 +2124,15 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2144,9 +2144,15 @@ void ibss_mesh_setup_freq(struct wpa_sup
if (!dfs_enabled)
return;
#endif /* CONFIG_HT_OVERRIDES */
/* Check/setup HT40+/HT40- */
-@@ -2154,8 +2160,6 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2174,8 +2180,6 @@ void ibss_mesh_setup_freq(struct wpa_sup
if (!dfs_enabled)
return;
if (ht40 == -1) {
if (!(pri_chan->flag & HOSTAPD_CHAN_HT40MINUS))
return;
-@@ -2199,6 +2203,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2219,6 +2223,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
wpa_scan_results_free(scan_res);
}
wpa_printf(MSG_DEBUG,
"IBSS/mesh: setup freq channel %d, sec_channel_offset %d",
freq->channel, freq->sec_channel_offset);
-@@ -2294,7 +2299,10 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2314,7 +2319,10 @@ void ibss_mesh_setup_freq(struct wpa_sup
}
} else if (ssid->max_oper_chwidth == VHT_CHANWIDTH_USE_HT) {
chwidth = VHT_CHANWIDTH_USE_HT;
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -272,9 +272,10 @@ void wpa_supplicant_cancel_auth_timeout(
+@@ -292,9 +292,10 @@ void wpa_supplicant_cancel_auth_timeout(
*/
void wpa_supplicant_initiate_eapol(struct wpa_supplicant *wpa_s)
{
os_memset(&global, 0, sizeof(global));
--- a/wpa_supplicant/events.c
+++ b/wpa_supplicant/events.c
-@@ -3901,8 +3901,8 @@ static void wpas_event_assoc_reject(stru
+@@ -3976,8 +3976,8 @@ static void wpas_event_assoc_reject(stru
}
{
struct wpa_supplicant *wpa_s = ctx;
int resched;
-@@ -4669,7 +4669,7 @@ void wpa_supplicant_event(void *ctx, enu
+@@ -4745,7 +4745,7 @@ void wpa_supplicant_event(void *ctx, enu
}
struct wpa_supplicant *wpa_s;
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -5777,7 +5777,6 @@ struct wpa_interface * wpa_supplicant_ma
+@@ -5797,7 +5797,6 @@ struct wpa_interface * wpa_supplicant_ma
return NULL;
}
/**
* wpa_supplicant_match_existing - Match existing interfaces
* @global: Pointer to global data from wpa_supplicant_init()
-@@ -5814,6 +5813,11 @@ static int wpa_supplicant_match_existing
+@@ -5834,6 +5833,11 @@ static int wpa_supplicant_match_existing
#endif /* CONFIG_MATCH_IFACE */
/**
* wpa_supplicant_add_iface - Add a new network interface
-@@ -6070,6 +6074,8 @@ struct wpa_global * wpa_supplicant_init(
+@@ -6090,6 +6094,8 @@ struct wpa_global * wpa_supplicant_init(
#ifndef CONFIG_NO_WPA_MSG
wpa_msg_register_ifname_cb(wpa_supplicant_msg_ifname_cb);
#endif /* CONFIG_NO_WPA_MSG */
INT(fixed_freq);
--- a/wpa_supplicant/mesh.c
+++ b/wpa_supplicant/mesh.c
-@@ -287,6 +287,8 @@ static int wpa_supplicant_mesh_init(stru
+@@ -288,6 +288,8 @@ static int wpa_supplicant_mesh_init(stru
frequency);
goto out_free;
}
if (conf->hw_mode == HOSTAPD_MODE_IEEE80211A && ssid->vht) {
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -2031,12 +2031,12 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2051,12 +2051,12 @@ void ibss_mesh_setup_freq(struct wpa_sup
{
enum hostapd_hw_mode hw_mode;
struct hostapd_hw_modes *mode = NULL;
unsigned int j, k;
struct hostapd_freq_params vht_freq;
int chwidth, seg0, seg1;
-@@ -2106,7 +2106,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2126,7 +2126,7 @@ void ibss_mesh_setup_freq(struct wpa_sup
return;
/* Setup higher BW only for 5 GHz */
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -4228,7 +4228,7 @@ wpa_supplicant_alloc(struct wpa_supplica
+@@ -4248,7 +4248,7 @@ wpa_supplicant_alloc(struct wpa_supplica
if (wpa_s == NULL)
return NULL;
wpa_s->scan_req = INITIAL_SCAN_REQ;
nl80211_destroy_bss(bss);
if (!bss->added_if)
i802_set_iface_flags(bss, 0);
-@@ -7439,7 +7442,6 @@ static int wpa_driver_nl80211_deinit_ap(
+@@ -7437,7 +7440,6 @@ static int wpa_driver_nl80211_deinit_ap(
if (!is_ap_interface(drv->nlmode))
return -1;
wpa_driver_nl80211_del_beacon(bss);
/*
* If the P2P GO interface was dynamically added, then it is
-@@ -7459,7 +7461,6 @@ static int wpa_driver_nl80211_stop_ap(vo
+@@ -7457,7 +7459,6 @@ static int wpa_driver_nl80211_stop_ap(vo
if (!is_ap_interface(drv->nlmode))
return -1;
wpa_driver_nl80211_del_beacon(bss);
/* Configure default/group WEP keys for static WEP */
int wpa_set_wep_keys(struct wpa_supplicant *wpa_s, struct wpa_ssid *ssid)
{
-@@ -893,12 +942,16 @@ void wpa_supplicant_set_state(struct wpa
+@@ -913,12 +962,16 @@ void wpa_supplicant_set_state(struct wpa
sme_sched_obss_scan(wpa_s, 1);
wpa_s->new_connection = 1;
wpa_drv_set_operstate(wpa_s, 0);
#ifndef IEEE8021X_EAPOL
-@@ -1927,6 +1980,8 @@ void wpa_supplicant_associate(struct wpa
+@@ -1947,6 +2000,8 @@ void wpa_supplicant_associate(struct wpa
wpa_ssid_txt(ssid->ssid, ssid->ssid_len),
ssid->id);
wpas_notify_mesh_group_started(wpa_s, ssid);
#else /* CONFIG_MESH */
wpa_msg(wpa_s, MSG_ERROR,
"mesh mode support not included in the build");
-@@ -5403,6 +5458,16 @@ static int wpa_supplicant_init_iface(str
+@@ -5423,6 +5478,16 @@ static int wpa_supplicant_init_iface(str
sizeof(wpa_s->bridge_ifname));
}
/* RSNA Supplicant Key Management - INITIALIZE */
eapol_sm_notify_portEnabled(wpa_s->eapol, FALSE);
eapol_sm_notify_portValid(wpa_s->eapol, FALSE);
-@@ -5724,6 +5789,11 @@ static void wpa_supplicant_deinit_iface(
+@@ -5744,6 +5809,11 @@ static void wpa_supplicant_deinit_iface(
if (terminate)
wpa_msg(wpa_s, MSG_INFO, WPA_EVENT_TERMINATING);
* macsec_policy - Determines the policy for MACsec secure session
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -3041,6 +3041,12 @@ static void wpas_start_assoc_cb(struct w
+@@ -3061,6 +3061,12 @@ static void wpas_start_assoc_cb(struct w
params.beacon_int = ssid->beacon_int;
else
params.beacon_int = wpa_s->conf->beacon_int;
/**
--- a/src/drivers/driver_nl80211.c
+++ b/src/drivers/driver_nl80211.c
-@@ -9250,6 +9250,18 @@ static int nl80211_put_mesh_id(struct nl
+@@ -9248,6 +9248,18 @@ static int nl80211_put_mesh_id(struct nl
}
static int nl80211_put_mesh_config(struct nl_msg *msg,
struct wpa_driver_mesh_bss_params *params)
{
-@@ -9311,6 +9323,7 @@ static int nl80211_join_mesh(struct i802
+@@ -9309,6 +9321,7 @@ static int nl80211_join_mesh(struct i802
nl80211_put_basic_rates(msg, params->basic_rates) ||
nl80211_put_mesh_id(msg, params->meshid, params->meshid_len) ||
nl80211_put_beacon_int(msg, params->beacon_int) ||
--- a/wpa_supplicant/mesh.c
+++ b/wpa_supplicant/mesh.c
-@@ -456,6 +456,7 @@ int wpa_supplicant_join_mesh(struct wpa_
+@@ -482,6 +482,7 @@ int wpa_supplicant_join_mesh(struct wpa_
params->meshid = ssid->ssid;
params->meshid_len = ssid->ssid_len;
--- a/wpa_supplicant/wpa_supplicant.c
+++ b/wpa_supplicant/wpa_supplicant.c
-@@ -2104,11 +2104,13 @@ void ibss_mesh_setup_freq(struct wpa_sup
+@@ -2124,11 +2124,13 @@ void ibss_mesh_setup_freq(struct wpa_sup
for (j = 0; j < wpa_s->last_scan_res_used; j++) {
struct wpa_bss *bss = wpa_s->last_scan_res[j];