aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch')
-rw-r--r--package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch126
1 files changed, 126 insertions, 0 deletions
diff --git a/package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch b/package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch
new file mode 100644
index 0000000000..c7101b1dbc
--- /dev/null
+++ b/package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch
@@ -0,0 +1,126 @@
+From d869c753b79a1423c2bd9b0afdfa0d89d55a930c Mon Sep 17 00:00:00 2001
+From: Markus Theil <markus.theil@tu-ilmenau.de>
+Date: Tue, 30 Jun 2020 13:53:18 +0200
+Subject: [PATCH 02/19] mesh: fix channel init order, disable pri/sec channel
+ switch
+
+wpa_supplicant_conf_ap_ht has to happen before hostapd_setup_interface
+in order for its configuration settings to have effect on interface
+configuration.
+
+Disable primary and secondary channel switch because of missing tie
+breaking rule/frames in mesh networks. A rather long comment about
+this issue is placed in mesh.c in the corresponding place.
+
+In consequence, remove mesh coex test, which contradicts this change.
+
+I was not able to reproduce the memory corruption during
+mesh_secure_ocv_mix_legacy, which lead to a revert of a similar patch
+in the past.
+
+Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de>
+---
+ tests/hwsim/test_wpas_mesh.py | 50 -----------------------------------
+ wpa_supplicant/mesh.c | 25 ++++++++++++++++--
+ 2 files changed, 23 insertions(+), 52 deletions(-)
+
+--- a/tests/hwsim/test_wpas_mesh.py
++++ b/tests/hwsim/test_wpas_mesh.py
+@@ -933,56 +933,6 @@ def _test_wpas_mesh_open_5ghz(dev, apdev
+ dev[0].dump_monitor()
+ dev[1].dump_monitor()
+
+-def test_wpas_mesh_open_5ghz_coex(dev, apdev):
+- """Mesh network on 5 GHz band and 20/40 coex change"""
+- try:
+- _test_wpas_mesh_open_5ghz_coex(dev, apdev)
+- finally:
+- dev[0].request("MESH_GROUP_REMOVE " + dev[0].ifname)
+- dev[1].request("MESH_GROUP_REMOVE " + dev[1].ifname)
+- set_world_reg(apdev0=apdev[0], dev0=dev[0])
+- dev[0].flush_scan_cache()
+- dev[1].flush_scan_cache()
+-
+-def _test_wpas_mesh_open_5ghz_coex(dev, apdev):
+- check_mesh_support(dev[0])
+- subprocess.call(['iw', 'reg', 'set', 'US'])
+-
+- # Start a 20 MHz BSS on channel 40 that would be the secondary channel of
+- # HT40+ mesh on channel 36.
+- params = {"ssid": "test-ht40",
+- "hw_mode": "a",
+- "channel": "40",
+- "country_code": "US"}
+- hapd = hostapd.add_ap(apdev[0], params)
+- bssid = hapd.own_addr()
+-
+- for i in range(2):
+- for j in range(5):
+- ev = dev[i].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=5)
+- if ev is None:
+- raise Exception("No regdom change event")
+- if "alpha2=US" in ev:
+- break
+- dev[i].scan_for_bss(bssid, freq=5200)
+- add_open_mesh_network(dev[i], freq="5180")
+-
+- check_mesh_joined_connected(dev)
+-
+- freq = dev[0].get_status_field("freq")
+- if freq != "5200":
+- raise Exception("Unexpected STATUS freq=" + freq)
+- sig = dev[0].request("SIGNAL_POLL").splitlines()
+- if "FREQUENCY=5200" not in sig:
+- raise Exception("Unexpected SIGNAL_POLL output: " + str(sig))
+-
+- hapd.disable()
+- dev[0].mesh_group_remove()
+- dev[1].mesh_group_remove()
+- check_mesh_group_removed(dev[0])
+- check_mesh_group_removed(dev[1])
+- dev[0].dump_monitor()
+- dev[1].dump_monitor()
+
+ def test_wpas_mesh_open_ht40(dev, apdev):
+ """Mesh and HT40 support difference"""
+--- a/wpa_supplicant/mesh.c
++++ b/wpa_supplicant/mesh.c
+@@ -363,6 +363,29 @@ static int wpa_supplicant_mesh_init(stru
+ conf->basic_rates[rate_len] = -1;
+ }
+
++ /* While it can enhance performance to switch the primary channel, which
++ * is also the secondary channel of another network at the same time),
++ * to the other primary channel, problems exist with this in mesh networks.
++ *
++ * Example with problems:
++ * - 3 mesh nodes M1-M3, freq (5200, 5180)
++ * - other node O1, e.g. AP mode, freq (5180, 5200),
++ * Locations: O1 M1 M2 M3
++ *
++ * M3 can only send frames to M1 over M2, no direct connection is possible
++ * Start O1, M1 and M3 first, M1 or O1 will switch channels to align with
++ * each other. M3 does not swap, because M1 or O1 cannot be reached.
++ * M2 is started afterwards and can either connect to M3 or M1 because of
++ * this primary secondary channel switch.
++ *
++ * Solutions: (1) central coordination -> not always possible
++ * (2) disable pri/sec channel switch in mesh networks
++ *
++ * In AP mode, when all nodes can work independently, this poses of course
++ * no problem, therefore disable it only in mesh mode.`*/
++ conf->no_pri_sec_switch = 1;
++ wpa_supplicant_conf_ap_ht(wpa_s, ssid, conf);
++
+ if (wpa_drv_init_mesh(wpa_s)) {
+ wpa_msg(wpa_s, MSG_ERROR, "Failed to init mesh in driver");
+ return -1;
+@@ -374,8 +397,6 @@ static int wpa_supplicant_mesh_init(stru
+ return -1;
+ }
+
+- wpa_supplicant_conf_ap_ht(wpa_s, ssid, conf);
+-
+ return 0;
+ out_free:
+ wpa_supplicant_mesh_deinit(wpa_s);