diff mbox series

[v2,2/3] mesh: fix channel init order, disable pri/sec channel switch

Message ID 20200619100732.37533-3-markus.theil@tu-ilmenau.de
State Superseded
Headers show
Series Fix and unify wpa_supplicant AP/mesh frequency setup | expand

Commit Message

Markus Theil June 19, 2020, 10:07 a.m. UTC
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(-)
diff mbox series

Patch

diff --git a/tests/hwsim/test_wpas_mesh.py b/tests/hwsim/test_wpas_mesh.py
index 3c918184f..bc07f5e25 100644
--- 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"""
diff --git a/wpa_supplicant/mesh.c b/wpa_supplicant/mesh.c
index 8cacf28e1..941c95cfd 100644
--- a/wpa_supplicant/mesh.c
+++ b/wpa_supplicant/mesh.c
@@ -363,6 +363,29 @@  static int wpa_supplicant_mesh_init(struct wpa_supplicant *wpa_s,
 		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(struct wpa_supplicant *wpa_s,
 		return -1;
 	}
 
-	wpa_supplicant_conf_ap_ht(wpa_s, ssid, conf);
-
 	return 0;
 out_free:
 	wpa_supplicant_mesh_deinit(wpa_s);