aboutsummaryrefslogtreecommitdiffstats
path: root/package/network/services/hostapd/patches/002-mesh-fix-channel-init-order-disable-pri-sec-channel-.patch
blob: c7101b1dbcfa9218fb2aa9d2995e1fda02d0cf4b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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);