3 # wpa_supplicant mesh mode tests
4 # Copyright (c) 2014, cozybit Inc.
6 # This software may be distributed under the terms of the BSD license.
7 # See README for more details.
10 def check_mesh_scan(dev, params, other_started=False):
13 id = dev.request("SCAN " + params)
15 raise Exception("Failed to start scan")
19 ev = dev.wait_event(["CTRL-EVENT-SCAN-STARTED"])
21 raise Exception("Other scan did not start")
22 if "id=" + str(id) in ev:
23 raise Exception("Own scan id unexpectedly included in start event")
25 ev = dev.wait_event(["CTRL-EVENT-SCAN-RESULTS"])
27 raise Exception("Other scan did not complete")
28 if "id=" + str(id) in ev:
30 "Own scan id unexpectedly included in completed event")
32 ev = dev.wait_event(["CTRL-EVENT-SCAN-STARTED"])
34 raise Exception("Scan did not start")
35 if "id=" + str(id) not in ev:
36 raise Exception("Scan id not included in start event")
38 ev = dev.wait_event(["CTRL-EVENT-SCAN-RESULTS"])
40 raise Exception("Scan did not complete")
41 if "id=" + str(id) not in ev:
42 raise Exception("Scan id not included in completed event")
44 res = dev.request("SCAN_RESULTS")
46 if res.find("[MESH]") < 0:
47 raise Exception("Scan did not contain a MESH network")
50 def check_mesh_group_added(dev):
51 ev = dev.wait_event(["MESH-GROUP-STARTED"])
53 raise Exception("Test exception: Couldn't join mesh")
56 def check_mesh_group_removed(dev):
57 ev = dev.wait_event(["MESH-GROUP-REMOVED"])
59 raise Exception("Test exception: Couldn't leave mesh")
62 def check_mesh_peer_connected(dev):
63 ev = dev.wait_event(["MESH-PEER-CONNECTED"])
65 raise Exception("Test exception: Remote peer did not connect.")
68 def check_mesh_peer_disconnected(dev):
69 ev = dev.wait_event(["MESH-PEER-DISCONNECTED"])
71 raise Exception("Test exception: Peer disconnect event not detected.")
74 def test_wpas_add_set_remove_support(dev):
75 """wpa_supplicant MESH add/set/remove network support"""
76 id = dev[0].add_network()
77 dev[0].set_network(id, "mode", "5")
78 dev[0].remove_network(id)
81 def test_wpas_mesh_group_added(dev):
82 """wpa_supplicant MESH group add"""
83 id = dev[0].add_network()
84 dev[0].set_network(id, "mode", "5")
85 dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
86 dev[0].set_network(id, "key_mgmt", "NONE")
87 dev[0].set_network(id, "frequency", "2412")
88 dev[0].mesh_group_add(id)
90 # Check for MESH-GROUP-STARTED event
91 check_mesh_group_added(dev[0])
94 def test_wpas_mesh_group_remove(dev):
95 """wpa_supplicant MESH group remove"""
96 id = dev[0].add_network()
97 dev[0].set_network(id, "mode", "5")
98 dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
99 dev[0].set_network(id, "key_mgmt", "NONE")
100 dev[0].set_network(id, "frequency", "2412")
101 dev[0].mesh_group_add(id)
102 # Check for MESH-GROUP-STARTED event
103 check_mesh_group_added(dev[0])
104 dev[0].mesh_group_remove()
105 # Check for MESH-GROUP-REMOVED event
106 check_mesh_group_removed(dev[0])
109 def test_wpas_mesh_peer_connected(dev):
110 """wpa_supplicant MESH peer connected"""
111 id = dev[0].add_network()
112 dev[0].set_network(id, "mode", "5")
113 dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
114 dev[0].set_network(id, "key_mgmt", "NONE")
115 dev[0].set_network(id, "frequency", "2412")
116 dev[0].mesh_group_add(id)
118 id = dev[1].add_network()
119 dev[1].set_network(id, "mode", "5")
120 dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
121 dev[1].set_network(id, "key_mgmt", "NONE")
122 dev[1].set_network(id, "frequency", "2412")
123 dev[1].mesh_group_add(id)
125 # Check for mesh joined
126 check_mesh_group_added(dev[0])
127 check_mesh_group_added(dev[1])
129 # Check for peer connected
130 check_mesh_peer_connected(dev[0])
131 check_mesh_peer_connected(dev[1])
134 def test_wpas_mesh_peer_disconnected(dev):
135 """wpa_supplicant MESH peer disconnected"""
136 id = dev[0].add_network()
137 dev[0].set_network(id, "mode", "5")
138 dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
139 dev[0].set_network(id, "key_mgmt", "NONE")
140 dev[0].set_network(id, "frequency", "2412")
141 dev[0].mesh_group_add(id)
143 id = dev[1].add_network()
144 dev[1].set_network(id, "mode", "5")
145 dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
146 dev[1].set_network(id, "key_mgmt", "NONE")
147 dev[1].set_network(id, "frequency", "2412")
148 dev[1].mesh_group_add(id)
150 # Check for mesh joined
151 check_mesh_group_added(dev[0])
152 check_mesh_group_added(dev[1])
154 # Check for peer connected
155 check_mesh_peer_connected(dev[0])
156 check_mesh_peer_connected(dev[1])
158 # Remove group on dev 1
159 dev[1].mesh_group_remove()
160 # Device 0 should get a disconnection event
161 check_mesh_peer_disconnected(dev[0])
164 def test_wpas_mesh_mode_scan(dev):
165 """wpa_supplicant MESH scan support"""
166 id = dev[0].add_network()
167 dev[0].set_network(id, "mode", "5")
168 dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
169 dev[0].set_network(id, "key_mgmt", "NONE")
170 dev[0].set_network(id, "frequency", "2412")
171 dev[0].set_network(id, "mesh_ht_mode", "HT40+")
172 dev[0].mesh_group_add(id)
174 id = dev[1].add_network()
175 dev[1].set_network(id, "mode", "5")
176 dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
177 dev[1].set_network(id, "key_mgmt", "NONE")
178 dev[1].set_network(id, "frequency", "2412")
179 dev[1].set_network(id, "mesh_ht_mode", "HT40+")
180 dev[1].mesh_group_add(id)
182 # Check for mesh joined
183 check_mesh_group_added(dev[0])
184 check_mesh_group_added(dev[1])
186 # Check for Mesh scan
187 check_mesh_scan(dev[0], "use_id=1")
190 def wrap_wpas_mesh_test(test, dev, apdev):
193 def _test_connectivity(dev1, dev2):
194 return hwsim_utils.test_connectivity(dev1, dev2)
196 return test(dev, apdev, _test_connectivity)
199 def _test_wpas_mesh_open(dev, apdev, test_connectivity):
200 """wpa_supplicant open MESH network connectivity"""
201 id = dev[0].add_network()
202 dev[0].set_network(id, "mode", "5")
203 dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
204 dev[0].set_network(id, "key_mgmt", "NONE")
205 dev[0].set_network(id, "frequency", "2412")
206 dev[0].set_network(id, "mesh_ht_mode", "HT40+")
207 dev[0].mesh_group_add(id)
209 id = dev[1].add_network()
210 dev[1].set_network(id, "mode", "5")
211 dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
212 dev[1].set_network(id, "key_mgmt", "NONE")
213 dev[1].set_network(id, "frequency", "2412")
214 dev[1].set_network(id, "mesh_ht_mode", "HT40+")
215 dev[1].mesh_group_add(id)
217 # Check for mesh joined
218 check_mesh_group_added(dev[0])
219 check_mesh_group_added(dev[1])
221 # Check for peer connected
222 check_mesh_peer_connected(dev[0])
223 check_mesh_peer_connected(dev[1])
225 # Test connectivity 0->1 and 1->0
226 test_connectivity(dev[0], dev[1])
227 test_connectivity(dev[1], dev[0])
230 def test_wpas_mesh_open(dev, apdev):
231 return wrap_wpas_mesh_test(_test_wpas_mesh_open, dev, apdev)
234 def _test_wpas_mesh_open_no_auto(dev, apdev, test_connectivity):
235 """wpa_supplicant open MESH network connectivity"""
236 id = dev[0].add_network()
237 dev[0].set_network(id, "mode", "5")
238 dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
239 dev[0].set_network(id, "key_mgmt", "NONE")
240 dev[0].set_network(id, "frequency", "2412")
241 dev[0].mesh_group_add(id)
243 id = dev[1].add_network()
244 dev[1].set_network(id, "mode", "5")
245 dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
246 dev[1].set_network(id, "key_mgmt", "NONE")
247 dev[1].set_network(id, "frequency", "2412")
248 dev[1].set_network(id, "no_auto_peer", "1")
249 dev[1].mesh_group_add(id)
251 # Check for mesh joined
252 check_mesh_group_added(dev[0])
253 check_mesh_group_added(dev[1])
255 # Check for peer connected
256 check_mesh_peer_connected(dev[0])
257 check_mesh_peer_connected(dev[1])
259 # Test connectivity 0->1 and 1->0
260 test_connectivity(dev[0], dev[1])
261 test_connectivity(dev[1], dev[0])
264 def test_wpas_mesh_open_no_auto(dev, apdev):
265 return wrap_wpas_mesh_test(_test_wpas_mesh_open_no_auto, dev, apdev)
268 def _test_wpas_mesh_secure(dev, apdev, test_connectivity):
269 """wpa_supplicant secure MESH network connectivity"""
270 dev[0].request("SET sae_groups ")
271 id = dev[0].add_network()
272 dev[0].set_network(id, "mode", "5")
273 dev[0].set_network_quoted(id, "ssid", "wpas-mesh-sec")
274 dev[0].set_network(id, "key_mgmt", "SAE")
275 dev[0].set_network(id, "frequency", "2412")
276 dev[0].set_network_quoted(id, "psk", "thisismypassphrase!")
277 dev[0].mesh_group_add(id)
279 dev[1].request("SET sae_groups ")
280 id = dev[1].add_network()
281 dev[1].set_network(id, "mode", "5")
282 dev[1].set_network_quoted(id, "ssid", "wpas-mesh-sec")
283 dev[1].set_network(id, "key_mgmt", "SAE")
284 dev[1].set_network(id, "frequency", "2412")
285 dev[1].set_network_quoted(id, "psk", "thisismypassphrase!")
286 dev[1].mesh_group_add(id)
288 # Check for mesh joined
289 check_mesh_group_added(dev[0])
290 check_mesh_group_added(dev[1])
292 # Check for peer connected
293 check_mesh_peer_connected(dev[0])
294 check_mesh_peer_connected(dev[1])
296 # Test connectivity 0->1 and 1->0
297 test_connectivity(dev[0], dev[1])
298 test_connectivity(dev[1], dev[0])
301 def test_wpas_mesh_secure(dev, apdev):
302 return wrap_wpas_mesh_test(_test_wpas_mesh_secure, dev, apdev)
305 def _test_wpas_mesh_secure_no_auto(dev, apdev, test_connectivity):
306 """wpa_supplicant secure MESH network connectivity"""
307 dev[0].request("SET sae_groups ")
308 id = dev[0].add_network()
309 dev[0].set_network(id, "mode", "5")
310 dev[0].set_network_quoted(id, "ssid", "wpas-mesh-sec")
311 dev[0].set_network(id, "key_mgmt", "SAE")
312 dev[0].set_network(id, "frequency", "2412")
313 dev[0].set_network_quoted(id, "psk", "thisismypassphrase!")
314 dev[0].mesh_group_add(id)
316 dev[1].request("SET sae_groups ")
317 id = dev[1].add_network()
318 dev[1].set_network(id, "mode", "5")
319 dev[1].set_network_quoted(id, "ssid", "wpas-mesh-sec")
320 dev[1].set_network(id, "key_mgmt", "SAE")
321 dev[1].set_network(id, "frequency", "2412")
322 dev[1].set_network_quoted(id, "psk", "thisismypassphrase!")
323 dev[1].set_network(id, "no_auto_peer", "1")
324 dev[1].mesh_group_add(id)
326 # Check for mesh joined
327 check_mesh_group_added(dev[0])
328 check_mesh_group_added(dev[1])
330 # Check for peer connected
331 check_mesh_peer_connected(dev[0])
332 check_mesh_peer_connected(dev[1])
334 # Test connectivity 0->1 and 1->0
335 test_connectivity(dev[0], dev[1])
336 test_connectivity(dev[1], dev[0])
339 def test_wpas_mesh_secure_no_auto(dev, apdev):
340 return wrap_wpas_mesh_test(_test_wpas_mesh_secure_no_auto, dev, apdev)