aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/hostapd/patches/012-mesh-fix-channel-switch-error-during-CAC.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/network/services/hostapd/patches/012-mesh-fix-channel-switch-error-during-CAC.patch')
-rw-r--r--package/network/services/hostapd/patches/012-mesh-fix-channel-switch-error-during-CAC.patch66
1 files changed, 66 insertions, 0 deletions
diff --git a/package/network/services/hostapd/patches/012-mesh-fix-channel-switch-error-during-CAC.patch b/package/network/services/hostapd/patches/012-mesh-fix-channel-switch-error-during-CAC.patch
new file mode 100644
index 0000000000..f324d81ae3
--- /dev/null
+++ b/package/network/services/hostapd/patches/012-mesh-fix-channel-switch-error-during-CAC.patch
@@ -0,0 +1,66 @@
+From ab6995f15aae17af93507dd2344615f91672a31a Mon Sep 17 00:00:00 2001
+From: Peter Oh <peter.oh@bowerswilkins.com>
+Date: Tue, 30 Jun 2020 14:19:00 +0200
+Subject: [PATCH 12/19] 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.
+
+Signed-off-by: Peter Oh <peter.oh@bowerswilkins.com>
+---
+ wpa_supplicant/mesh.c | 34 ++++++++++++++++++++++++++++++++++
+ 1 file changed, 34 insertions(+)
+
+--- a/wpa_supplicant/mesh.c
++++ b/wpa_supplicant/mesh.c
+@@ -13,6 +13,7 @@
+ #include "utils/uuid.h"
+ #include "common/ieee802_11_defs.h"
+ #include "common/wpa_ctrl.h"
++#include "common/hw_features_common.h"
+ #include "ap/sta_info.h"
+ #include "ap/hostapd.h"
+ #include "ap/ieee802_11.h"
+@@ -206,6 +207,39 @@ static int wpas_mesh_complete(struct wpa
+ return -1;
+ }
+
++ /*
++ * 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;
++ struct he_capabilities *he_capab = NULL;
++
++ if (ifmsh->current_mode)
++ he_capab = &ifmsh->current_mode->he_capab[IEEE80211_MODE_MESH];
++
++ if (hostapd_set_freq_params(&params->freq,
++ ifmsh->conf->hw_mode,
++ ifmsh->freq,
++ ifmsh->conf->channel,
++ ifmsh->conf->enable_edmg,
++ ifmsh->conf->edmg_channel,
++ ifmsh->conf->ieee80211n,
++ ifmsh->conf->ieee80211ac,
++ ifmsh->conf->ieee80211ax,
++ ifmsh->conf->secondary_channel,
++ hostapd_get_oper_chwidth(ifmsh->conf),
++ hostapd_get_oper_centr_freq_seg0_idx(ifmsh->conf),
++ hostapd_get_oper_centr_freq_seg1_idx(ifmsh->conf),
++ ifmsh->conf->vht_capab,
++ he_capab)) {
++ wpa_printf(MSG_ERROR, "Error updating mesh frequency params.");
++ wpa_supplicant_mesh_deinit(wpa_s);
++ return -1;
++ }
++ }
++
+ if (ifmsh->mconf->security != MESH_CONF_SEC_NONE &&
+ wpas_mesh_init_rsn(wpa_s)) {
+ wpa_printf(MSG_ERROR,