mirror of
https://github.com/openwrt/openwrt.git
synced 2024-12-27 09:12:39 +00:00
127 lines
4.6 KiB
Diff
127 lines
4.6 KiB
Diff
|
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);
|