tests: Clear sae_groups to default value in forgotten cases
[mech_eap.git] / tests / hwsim / test_wpas_mesh.py
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 res.find("[MESH]") < 0:
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].set_network(id, "mesh_ht_mode", "HT40+")
172     dev[0].mesh_group_add(id)
173
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)
181
182     # Check for mesh joined
183     check_mesh_group_added(dev[0])
184     check_mesh_group_added(dev[1])
185
186     # Check for Mesh scan
187     check_mesh_scan(dev[0], "use_id=1")
188
189
190 def wrap_wpas_mesh_test(test, dev, apdev):
191     import hwsim_utils
192
193     def _test_connectivity(dev1, dev2):
194         return hwsim_utils.test_connectivity(dev1, dev2)
195
196     return test(dev, apdev, _test_connectivity)
197
198
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)
208
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)
216
217     # Check for mesh joined
218     check_mesh_group_added(dev[0])
219     check_mesh_group_added(dev[1])
220
221     # Check for peer connected
222     check_mesh_peer_connected(dev[0])
223     check_mesh_peer_connected(dev[1])
224
225     # Test connectivity 0->1 and 1->0
226     test_connectivity(dev[0], dev[1])
227     test_connectivity(dev[1], dev[0])
228
229
230 def test_wpas_mesh_open(dev, apdev):
231     return wrap_wpas_mesh_test(_test_wpas_mesh_open, dev, apdev)
232
233
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)
242
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)
250
251     # Check for mesh joined
252     check_mesh_group_added(dev[0])
253     check_mesh_group_added(dev[1])
254
255     # Check for peer connected
256     check_mesh_peer_connected(dev[0])
257     check_mesh_peer_connected(dev[1])
258
259     # Test connectivity 0->1 and 1->0
260     test_connectivity(dev[0], dev[1])
261     test_connectivity(dev[1], dev[0])
262
263
264 def test_wpas_mesh_open_no_auto(dev, apdev):
265     return wrap_wpas_mesh_test(_test_wpas_mesh_open_no_auto, dev, apdev)
266
267
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)
278
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)
287
288     # Check for mesh joined
289     check_mesh_group_added(dev[0])
290     check_mesh_group_added(dev[1])
291
292     # Check for peer connected
293     check_mesh_peer_connected(dev[0])
294     check_mesh_peer_connected(dev[1])
295
296     # Test connectivity 0->1 and 1->0
297     test_connectivity(dev[0], dev[1])
298     test_connectivity(dev[1], dev[0])
299
300
301 def test_wpas_mesh_secure(dev, apdev):
302     return wrap_wpas_mesh_test(_test_wpas_mesh_secure, dev, apdev)
303
304
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)
315
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)
325
326     # Check for mesh joined
327     check_mesh_group_added(dev[0])
328     check_mesh_group_added(dev[1])
329
330     # Check for peer connected
331     check_mesh_peer_connected(dev[0])
332     check_mesh_peer_connected(dev[1])
333
334     # Test connectivity 0->1 and 1->0
335     test_connectivity(dev[0], dev[1])
336     test_connectivity(dev[1], dev[0])
337
338
339 def test_wpas_mesh_secure_no_auto(dev, apdev):
340     return wrap_wpas_mesh_test(_test_wpas_mesh_secure_no_auto, dev, apdev)