]>
Commit | Line | Data |
---|---|---|
68157c06 JL |
1 | #!/usr/bin/python |
2 | # | |
3 | # wpa_supplicant mesh mode tests | |
4 | # Copyright (c) 2014, cozybit Inc. | |
5 | # | |
6 | # This software may be distributed under the terms of the BSD license. | |
7 | # See README for more details. | |
8 | ||
9 | ||
10 | def check_mesh_scan(dev, params, other_started=False): | |
11 | if not other_started: | |
12 | dev.dump_monitor() | |
13 | id = dev.request("SCAN " + params) | |
14 | if "FAIL" in id: | |
15 | raise Exception("Failed to start scan") | |
16 | id = int(id) | |
17 | ||
18 | if other_started: | |
19 | ev = dev.wait_event(["CTRL-EVENT-SCAN-STARTED"]) | |
20 | if ev is None: | |
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") | |
24 | ||
25 | ev = dev.wait_event(["CTRL-EVENT-SCAN-RESULTS"]) | |
26 | if ev is None: | |
27 | raise Exception("Other scan did not complete") | |
28 | if "id=" + str(id) in ev: | |
29 | raise Exception( | |
30 | "Own scan id unexpectedly included in completed event") | |
31 | ||
32 | ev = dev.wait_event(["CTRL-EVENT-SCAN-STARTED"]) | |
33 | if ev is None: | |
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") | |
37 | ||
38 | ev = dev.wait_event(["CTRL-EVENT-SCAN-RESULTS"]) | |
39 | if ev is None: | |
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") | |
43 | ||
44 | res = dev.request("SCAN_RESULTS") | |
45 | ||
46 | if not res.find("[MESH]"): | |
47 | raise Exception("Scan did not contain a MESH network") | |
48 | ||
49 | ||
50 | def check_mesh_group_added(dev): | |
51 | ev = dev.wait_event(["MESH-GROUP-STARTED"]) | |
52 | if ev is None: | |
53 | raise Exception("Test exception: Couldn't join mesh") | |
54 | ||
55 | ||
56 | def check_mesh_group_removed(dev): | |
57 | ev = dev.wait_event(["MESH-GROUP-REMOVED"]) | |
58 | if ev is None: | |
59 | raise Exception("Test exception: Couldn't leave mesh") | |
60 | ||
61 | ||
62 | def check_mesh_peer_connected(dev): | |
63 | ev = dev.wait_event(["MESH-PEER-CONNECTED"]) | |
64 | if ev is None: | |
65 | raise Exception("Test exception: Remote peer did not connect.") | |
66 | ||
67 | ||
68 | def check_mesh_peer_disconnected(dev): | |
69 | ev = dev.wait_event(["MESH-PEER-DISCONNECTED"]) | |
70 | if ev is None: | |
71 | raise Exception("Test exception: Peer disconnect event not detected.") | |
72 | ||
73 | ||
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) | |
79 | ||
80 | ||
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) | |
89 | ||
90 | # Check for MESH-GROUP-STARTED event | |
91 | check_mesh_group_added(dev[0]) | |
92 | ||
93 | ||
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]) | |
107 | ||
108 | ||
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) | |
117 | ||
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) | |
124 | ||
125 | # Check for mesh joined | |
126 | check_mesh_group_added(dev[0]) | |
127 | check_mesh_group_added(dev[1]) | |
128 | ||
129 | # Check for peer connected | |
130 | check_mesh_peer_connected(dev[0]) | |
131 | check_mesh_peer_connected(dev[1]) | |
132 | ||
133 | ||
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) | |
142 | ||
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) | |
149 | ||
150 | # Check for mesh joined | |
151 | check_mesh_group_added(dev[0]) | |
152 | check_mesh_group_added(dev[1]) | |
153 | ||
154 | # Check for peer connected | |
155 | check_mesh_peer_connected(dev[0]) | |
156 | check_mesh_peer_connected(dev[1]) | |
157 | ||
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]) | |
162 | ||
163 | ||
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].mesh_group_add(id) | |
172 | ||
173 | id = dev[1].add_network() | |
174 | dev[1].set_network(id, "mode", "5") | |
175 | dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open") | |
176 | dev[1].set_network(id, "key_mgmt", "NONE") | |
177 | dev[1].set_network(id, "frequency", "2412") | |
178 | dev[1].mesh_group_add(id) | |
179 | ||
180 | # Check for mesh joined | |
181 | check_mesh_group_added(dev[0]) | |
182 | check_mesh_group_added(dev[1]) | |
183 | ||
184 | # Check for Mesh scan | |
185 | check_mesh_scan(dev[0], "use_id=1") | |
186 | ||
187 | ||
188 | def wrap_wpas_mesh_test(test, dev, apdev): | |
189 | import hwsim_utils | |
190 | ||
191 | def _test_connectivity(dev1, dev2): | |
192 | return hwsim_utils.test_connectivity(dev1, dev2) | |
193 | ||
194 | return test(dev, apdev, _test_connectivity) | |
195 | ||
196 | ||
197 | def _test_wpas_mesh_open(dev, apdev, test_connectivity): | |
198 | """wpa_supplicant open MESH network connectivity""" | |
199 | id = dev[0].add_network() | |
200 | dev[0].set_network(id, "mode", "5") | |
201 | dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open") | |
202 | dev[0].set_network(id, "key_mgmt", "NONE") | |
203 | dev[0].set_network(id, "frequency", "2412") | |
204 | dev[0].mesh_group_add(id) | |
205 | ||
206 | id = dev[1].add_network() | |
207 | dev[1].set_network(id, "mode", "5") | |
208 | dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open") | |
209 | dev[1].set_network(id, "key_mgmt", "NONE") | |
210 | dev[1].set_network(id, "frequency", "2412") | |
211 | dev[1].mesh_group_add(id) | |
212 | ||
213 | # Check for mesh joined | |
214 | check_mesh_group_added(dev[0]) | |
215 | check_mesh_group_added(dev[1]) | |
216 | ||
217 | # Check for peer connected | |
218 | check_mesh_peer_connected(dev[0]) | |
219 | check_mesh_peer_connected(dev[1]) | |
220 | ||
221 | # Test connectivity 0->1 and 1->0 | |
222 | test_connectivity(dev[0], dev[1]) | |
223 | test_connectivity(dev[1], dev[0]) | |
224 | ||
225 | ||
226 | def test_wpas_mesh_open(dev, apdev): | |
227 | return wrap_wpas_mesh_test(_test_wpas_mesh_open, dev, apdev) | |
228 | ||
229 | ||
230 | def _test_wpas_mesh_open_no_auto(dev, apdev, test_connectivity): | |
231 | """wpa_supplicant open MESH network connectivity""" | |
232 | id = dev[0].add_network() | |
233 | dev[0].set_network(id, "mode", "5") | |
234 | dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open") | |
235 | dev[0].set_network(id, "key_mgmt", "NONE") | |
236 | dev[0].set_network(id, "frequency", "2412") | |
237 | dev[0].mesh_group_add(id) | |
238 | ||
239 | id = dev[1].add_network() | |
240 | dev[1].set_network(id, "mode", "5") | |
241 | dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open") | |
242 | dev[1].set_network(id, "key_mgmt", "NONE") | |
243 | dev[1].set_network(id, "frequency", "2412") | |
244 | dev[1].set_network(id, "no_auto_peer", "1") | |
245 | dev[1].mesh_group_add(id) | |
246 | ||
247 | # Check for mesh joined | |
248 | check_mesh_group_added(dev[0]) | |
249 | check_mesh_group_added(dev[1]) | |
250 | ||
251 | # Check for peer connected | |
252 | check_mesh_peer_connected(dev[0]) | |
253 | check_mesh_peer_connected(dev[1]) | |
254 | ||
255 | # Test connectivity 0->1 and 1->0 | |
256 | test_connectivity(dev[0], dev[1]) | |
257 | test_connectivity(dev[1], dev[0]) | |
258 | ||
259 | ||
260 | def test_wpas_mesh_open_no_auto(dev, apdev): | |
261 | return wrap_wpas_mesh_test(_test_wpas_mesh_open_no_auto, dev, apdev) | |
262 | ||
263 | ||
264 | def _test_wpas_mesh_secure(dev, apdev, test_connectivity): | |
265 | """wpa_supplicant secure MESH network connectivity""" | |
266 | id = dev[0].add_network() | |
267 | dev[0].set_network(id, "mode", "5") | |
268 | dev[0].set_network_quoted(id, "ssid", "wpas-mesh-sec") | |
269 | dev[0].set_network(id, "key_mgmt", "SAE") | |
270 | dev[0].set_network(id, "frequency", "2412") | |
271 | dev[0].set_network_quoted(id, "psk", "thisismypassphrase!") | |
272 | dev[0].mesh_group_add(id) | |
273 | ||
274 | id = dev[1].add_network() | |
275 | dev[1].set_network(id, "mode", "5") | |
276 | dev[1].set_network_quoted(id, "ssid", "wpas-mesh-sec") | |
277 | dev[1].set_network(id, "key_mgmt", "SAE") | |
278 | dev[1].set_network(id, "frequency", "2412") | |
279 | dev[1].set_network_quoted(id, "psk", "thisismypassphrase!") | |
280 | dev[1].mesh_group_add(id) | |
281 | ||
282 | # Check for mesh joined | |
283 | check_mesh_group_added(dev[0]) | |
284 | check_mesh_group_added(dev[1]) | |
285 | ||
286 | # Check for peer connected | |
287 | check_mesh_peer_connected(dev[0]) | |
288 | check_mesh_peer_connected(dev[1]) | |
289 | ||
290 | # Test connectivity 0->1 and 1->0 | |
291 | test_connectivity(dev[0], dev[1]) | |
292 | test_connectivity(dev[1], dev[0]) | |
293 | ||
294 | ||
295 | def test_wpas_mesh_secure(dev, apdev): | |
296 | return wrap_wpas_mesh_test(_test_wpas_mesh_secure, dev, apdev) | |
297 | ||
298 | ||
299 | def _test_wpas_mesh_secure_no_auto(dev, apdev, test_connectivity): | |
300 | """wpa_supplicant secure MESH network connectivity""" | |
301 | id = dev[0].add_network() | |
302 | dev[0].set_network(id, "mode", "5") | |
303 | dev[0].set_network_quoted(id, "ssid", "wpas-mesh-sec") | |
304 | dev[0].set_network(id, "key_mgmt", "SAE") | |
305 | dev[0].set_network(id, "frequency", "2412") | |
306 | dev[0].set_network_quoted(id, "psk", "thisismypassphrase!") | |
307 | dev[0].mesh_group_add(id) | |
308 | ||
309 | id = dev[1].add_network() | |
310 | dev[1].set_network(id, "mode", "5") | |
311 | dev[1].set_network_quoted(id, "ssid", "wpas-mesh-sec") | |
312 | dev[1].set_network(id, "key_mgmt", "SAE") | |
313 | dev[1].set_network(id, "frequency", "2412") | |
314 | dev[1].set_network_quoted(id, "psk", "thisismypassphrase!") | |
315 | dev[1].set_network(id, "no_auto_peer", "1") | |
316 | dev[1].mesh_group_add(id) | |
317 | ||
318 | # Check for mesh joined | |
319 | check_mesh_group_added(dev[0]) | |
320 | check_mesh_group_added(dev[1]) | |
321 | ||
322 | # Check for peer connected | |
323 | check_mesh_peer_connected(dev[0]) | |
324 | check_mesh_peer_connected(dev[1]) | |
325 | ||
326 | # Test connectivity 0->1 and 1->0 | |
327 | test_connectivity(dev[0], dev[1]) | |
328 | test_connectivity(dev[1], dev[0]) | |
329 | ||
330 | ||
331 | def test_wpas_mesh_secure_no_auto(dev, apdev): | |
332 | return wrap_wpas_mesh_test(_test_wpas_mesh_secure_no_auto, dev, apdev) |