-From d869c753b79a1423c2bd9b0afdfa0d89d55a930c Mon Sep 17 00:00:00 2001
+From 93da12fd9ff7596f057ddd3f0e67210960fe6a90 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
+Subject: 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.
+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.
+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(-)
+ wpa_supplicant/mesh.c | 27 +++++++++++++++++++++++++--
+ 1 file changed, 25 insertions(+), 2 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
+@@ -363,6 +363,31 @@ 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.
++ * 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.
++ * 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.`*/
++ * 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
+@@ -374,8 +399,6 @@ static int wpa_supplicant_mesh_init(stru
return -1;
}