Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / tests / hwsim / test_ibss.py
1 # IBSS test cases
2 # Copyright (c) 2013-2015, Jouni Malinen <j@w1.fi>
3 #
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
6
7 import logging
8 logger = logging.getLogger()
9 import time
10 import re
11 import subprocess
12
13 import hwsim_utils
14 from utils import alloc_fail
15
16 def connect_ibss_cmd(dev, id, freq=2412):
17     dev.dump_monitor()
18     dev.select_network(id, freq=str(freq))
19
20 def wait_ibss_connection(dev):
21     logger.info(dev.ifname + " waiting for IBSS start/join to complete")
22     ev = dev.wait_connected(timeout=20,
23                             error="Connection to the IBSS timed out")
24     exp = r'<.>(CTRL-EVENT-CONNECTED) - Connection to ([0-9a-f:]*) completed.*'
25     s = re.split(exp, ev)
26     if len(s) < 3:
27         return None
28     return s[2]
29
30 def wait_4way_handshake(dev1, dev2):
31     logger.info(dev1.ifname + " waiting for 4-way handshake completion with " + dev2.ifname + " " + dev2.p2p_interface_addr())
32     ev = dev1.wait_event(["IBSS-RSN-COMPLETED " + dev2.p2p_interface_addr()],
33                          timeout=20)
34     if ev is None:
35         raise Exception("4-way handshake in IBSS timed out")
36
37 def wait_4way_handshake2(dev1, dev2, dev3):
38     logger.info(dev1.ifname + " waiting for 4-way handshake completion with " + dev2.ifname + " " + dev2.p2p_interface_addr() + " and " + dev3.p2p_interface_addr())
39     ev = dev1.wait_event(["IBSS-RSN-COMPLETED " + dev2.p2p_interface_addr(),
40                           "IBSS-RSN-COMPLETED " + dev3.p2p_interface_addr()],
41                          timeout=20)
42     if ev is None:
43         raise Exception("4-way handshake in IBSS timed out")
44     ev = dev1.wait_event(["IBSS-RSN-COMPLETED " + dev2.p2p_interface_addr(),
45                           "IBSS-RSN-COMPLETED " + dev3.p2p_interface_addr()],
46                          timeout=20)
47     if ev is None:
48         raise Exception("4-way handshake in IBSS timed out")
49
50 def add_ibss(dev, ssid, psk=None, proto=None, key_mgmt=None, pairwise=None,
51              group=None, beacon_int=None, bssid=None, scan_freq=None,
52              wep_key0=None, freq=2412):
53     id = dev.add_network()
54     dev.set_network(id, "mode", "1")
55     dev.set_network(id, "frequency", str(freq))
56     if scan_freq:
57         dev.set_network(id, "scan_freq", str(scan_freq))
58     dev.set_network_quoted(id, "ssid", ssid)
59     if psk:
60         dev.set_network_quoted(id, "psk", psk)
61     if proto:
62         dev.set_network(id, "proto", proto)
63     if key_mgmt:
64         dev.set_network(id, "key_mgmt", key_mgmt)
65     if pairwise:
66         dev.set_network(id, "pairwise", pairwise)
67     if group:
68         dev.set_network(id, "group", group)
69     if beacon_int:
70         dev.set_network(id, "beacon_int", beacon_int)
71     if bssid:
72         dev.set_network(id, "bssid", bssid)
73     if wep_key0:
74         dev.set_network(id, "wep_key0", wep_key0)
75     dev.request("ENABLE_NETWORK " + str(id) + " no-connect")
76     return id
77
78 def add_ibss_rsn(dev, ssid):
79     return add_ibss(dev, ssid, "12345678", "RSN", "WPA-PSK", "CCMP", "CCMP")
80
81 def add_ibss_rsn_tkip(dev, ssid):
82     return add_ibss(dev, ssid, "12345678", "RSN", "WPA-PSK", "TKIP", "TKIP")
83
84 def add_ibss_wpa_none(dev, ssid):
85     return add_ibss(dev, ssid, "12345678", "WPA", "WPA-NONE", "TKIP", "TKIP")
86
87 def add_ibss_wpa_none_ccmp(dev, ssid):
88     return add_ibss(dev, ssid, "12345678", "WPA", "WPA-NONE", "CCMP", "CCMP")
89
90 def test_ibss_rsn(dev):
91     """IBSS RSN"""
92     ssid="ibss-rsn"
93
94     logger.info("Start IBSS on the first STA")
95     id = add_ibss_rsn(dev[0], ssid)
96     connect_ibss_cmd(dev[0], id)
97     bssid0 = wait_ibss_connection(dev[0])
98
99     logger.info("Join two STAs to the IBSS")
100
101     id = add_ibss_rsn(dev[1], ssid)
102     connect_ibss_cmd(dev[1], id)
103     bssid1 = wait_ibss_connection(dev[1])
104     if bssid0 != bssid1:
105         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
106         # try to merge with a scan
107         dev[1].scan()
108     wait_4way_handshake(dev[0], dev[1])
109     wait_4way_handshake(dev[1], dev[0])
110
111     id = add_ibss_rsn(dev[2], ssid)
112     connect_ibss_cmd(dev[2], id)
113     bssid2 = wait_ibss_connection(dev[2])
114     if bssid0 != bssid2:
115         logger.info("STA0 BSSID " + bssid0 + " differs from STA2 BSSID " + bssid2)
116         # try to merge with a scan
117         dev[2].scan()
118     wait_4way_handshake(dev[0], dev[2])
119     wait_4way_handshake2(dev[2], dev[0], dev[1])
120
121     # Allow some time for all peers to complete key setup
122     time.sleep(3)
123     hwsim_utils.test_connectivity(dev[0], dev[1])
124     hwsim_utils.test_connectivity(dev[0], dev[2])
125     hwsim_utils.test_connectivity(dev[1], dev[2])
126
127     dev[1].request("REMOVE_NETWORK all")
128     time.sleep(1)
129     id = add_ibss_rsn(dev[1], ssid)
130     connect_ibss_cmd(dev[1], id)
131     bssid1 = wait_ibss_connection(dev[1])
132     if bssid0 != bssid1:
133         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
134         # try to merge with a scan
135         dev[1].scan()
136     wait_4way_handshake(dev[0], dev[1])
137     wait_4way_handshake(dev[1], dev[0])
138     time.sleep(3)
139     hwsim_utils.test_connectivity(dev[0], dev[1])
140
141     if "OK" not in dev[0].request("IBSS_RSN " + dev[1].p2p_interface_addr()):
142         raise Exception("IBSS_RSN command failed")
143
144 def test_ibss_wpa_none(dev):
145     """IBSS WPA-None"""
146     ssid="ibss-wpa-none"
147
148     logger.info("Start IBSS on the first STA")
149     id = add_ibss_wpa_none(dev[0], ssid)
150     connect_ibss_cmd(dev[0], id)
151     bssid0 = wait_ibss_connection(dev[0])
152
153     # This is a bit ugly, but no one really cares about WPA-None, so there may
154     # not be enough justification to clean this up.. For now, wpa_supplicant
155     # will show two connection events with mac80211_hwsim where the first one
156     # comes with all zeros address.
157     if bssid0 == "00:00:00:00:00:00":
158         logger.info("Waiting for real BSSID on the first STA")
159         bssid0 = wait_ibss_connection(dev[0])
160
161     logger.info("Join two STAs to the IBSS")
162
163     id = add_ibss_wpa_none(dev[1], ssid)
164     connect_ibss_cmd(dev[1], id)
165     id = add_ibss_wpa_none(dev[2], ssid)
166     connect_ibss_cmd(dev[2], id)
167
168     bssid1 = wait_ibss_connection(dev[1])
169     if bssid0 != bssid1:
170         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
171         bssid1 = wait_ibss_connection(dev[1])
172
173     bssid2 = wait_ibss_connection(dev[2])
174     if bssid0 != bssid2:
175         logger.info("STA0 BSSID " + bssid0 + " differs from STA2 BSSID " + bssid2)
176         bssid2 = wait_ibss_connection(dev[2])
177
178     logger.info("bssid0=%s bssid1=%s bssid2=%s" % (bssid0, bssid1, bssid2))
179
180     bss = dev[0].get_bss(bssid0)
181     if not bss:
182         bss = dev[1].get_bss(bssid1)
183         if not bss:
184             raise Exception("Could not find BSS entry for IBSS")
185     if 'flags' not in bss:
186         raise Exception("Could not get BSS flags from BSS table")
187     if "[WPA-None-TKIP]" not in bss['flags']:
188         raise Exception("Unexpected BSS flags: " + bss['flags'])
189
190     # Allow some time for all peers to complete key setup
191     time.sleep(1)
192
193     # This is supposed to work, but looks like WPA-None does not work with
194     # mac80211 currently..
195     try:
196         hwsim_utils.test_connectivity(dev[0], dev[1])
197     except Exception, e:
198         logger.info("Ignoring known connectivity failure: " + str(e))
199     try:
200         hwsim_utils.test_connectivity(dev[0], dev[2])
201     except Exception, e:
202         logger.info("Ignoring known connectivity failure: " + str(e))
203     try:
204         hwsim_utils.test_connectivity(dev[1], dev[2])
205     except Exception, e:
206         logger.info("Ignoring known connectivity failure: " + str(e))
207
208 def test_ibss_wpa_none_ccmp(dev):
209     """IBSS WPA-None/CCMP"""
210     ssid="ibss-wpa-none"
211
212     logger.info("Start IBSS on the first STA")
213     id = add_ibss_wpa_none(dev[0], ssid)
214     connect_ibss_cmd(dev[0], id)
215     bssid0 = wait_ibss_connection(dev[0])
216
217     # This is a bit ugly, but no one really cares about WPA-None, so there may
218     # not be enough justification to clean this up.. For now, wpa_supplicant
219     # will show two connection events with mac80211_hwsim where the first one
220     # comes with all zeros address.
221     if bssid0 == "00:00:00:00:00:00":
222         logger.info("Waiting for real BSSID on the first STA")
223         bssid0 = wait_ibss_connection(dev[0])
224
225
226     logger.info("Join a STA to the IBSS")
227     id = add_ibss_wpa_none(dev[1], ssid)
228     connect_ibss_cmd(dev[1], id)
229
230     bssid1 = wait_ibss_connection(dev[1])
231     if bssid0 != bssid1:
232         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
233         bssid1 = wait_ibss_connection(dev[1])
234
235     logger.info("bssid0=%s bssid1=%s" % (bssid0, bssid1))
236
237     # Allow some time for all peers to complete key setup
238     time.sleep(1)
239
240     # This is supposed to work, but looks like WPA-None does not work with
241     # mac80211 currently..
242     try:
243         hwsim_utils.test_connectivity(dev[0], dev[1])
244     except Exception, e:
245         logger.info("Ignoring known connectivity failure: " + str(e))
246
247 def test_ibss_open(dev):
248     """IBSS open (no security)"""
249     ssid="ibss"
250     id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150")
251     connect_ibss_cmd(dev[0], id)
252     bssid0 = wait_ibss_connection(dev[0])
253
254     id = add_ibss(dev[1], ssid, key_mgmt="NONE", beacon_int="200")
255     connect_ibss_cmd(dev[1], id)
256     bssid1 = wait_ibss_connection(dev[1])
257     if bssid0 != bssid1:
258         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
259
260     res = dev[0].request("SCAN_RESULTS")
261     if "[IBSS]" not in res:
262         res = dev[1].request("SCAN_RESULTS")
263         if "[IBSS]" not in res:
264             raise Exception("IBSS flag missing from scan results: " + res)
265     bss = dev[0].get_bss(bssid0)
266     if not bss:
267         bss = dev[1].get_bss(bssid1)
268         if not bss:
269             raise Exception("Could not find BSS entry for IBSS")
270     if 'flags' not in bss:
271         raise Exception("Could not get BSS flags from BSS table")
272     if "[IBSS]" not in bss['flags']:
273         raise Exception("Unexpected BSS flags: " + bss['flags'])
274
275 def test_ibss_open_fixed_bssid(dev):
276     """IBSS open (no security) and fixed BSSID"""
277     ssid="ibss"
278     bssid="02:11:22:33:44:55"
279     try:
280         dev[0].request("AP_SCAN 2")
281         add_ibss(dev[0], ssid, key_mgmt="NONE", bssid=bssid, beacon_int="150")
282         dev[0].request("REASSOCIATE")
283
284         dev[1].request("AP_SCAN 2")
285         add_ibss(dev[1], ssid, key_mgmt="NONE", bssid=bssid, beacon_int="200")
286         dev[1].request("REASSOCIATE")
287
288         bssid0 = wait_ibss_connection(dev[0])
289         bssid1 = wait_ibss_connection(dev[1])
290         if bssid0 != bssid:
291             raise Exception("STA0 BSSID " + bssid0 + " differs from fixed BSSID " + bssid)
292         if bssid1 != bssid:
293             raise Exception("STA0 BSSID " + bssid0 + " differs from fixed BSSID " + bssid)
294     finally:
295         dev[0].request("AP_SCAN 1")
296         dev[1].request("AP_SCAN 1")
297
298 def test_ibss_open_retry(dev):
299     """IBSS open (no security) with cfg80211 retry workaround"""
300     subprocess.check_call(['iw', 'dev', dev[0].ifname, 'set', 'type', 'adhoc'])
301     subprocess.check_call(['iw', 'dev', dev[0].ifname, 'ibss', 'join',
302                            'ibss-test', '2412', 'HT20', 'fixed-freq',
303                            '02:22:33:44:55:66'])
304     ssid="ibss"
305     try:
306         dev[0].request("AP_SCAN 2")
307         id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150",
308                       bssid="02:33:44:55:66:77", scan_freq=2412)
309         #connect_ibss_cmd(dev[0], id)
310         dev[0].request("REASSOCIATE")
311         bssid0 = wait_ibss_connection(dev[0])
312
313         subprocess.check_call(['iw', 'dev', dev[0].ifname, 'ibss', 'leave'])
314         time.sleep(1)
315         dev[0].request("DISCONNECT")
316     finally:
317         dev[0].request("AP_SCAN 1")
318
319 def test_ibss_rsn_tkip(dev):
320     """IBSS RSN with TKIP as the cipher"""
321     ssid="ibss-rsn-tkip"
322
323     id = add_ibss_rsn_tkip(dev[0], ssid)
324     connect_ibss_cmd(dev[0], id)
325     bssid0 = wait_ibss_connection(dev[0])
326
327     id = add_ibss_rsn_tkip(dev[1], ssid)
328     connect_ibss_cmd(dev[1], id)
329     bssid1 = wait_ibss_connection(dev[1])
330     if bssid0 != bssid1:
331         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
332         # try to merge with a scan
333         dev[1].scan()
334     wait_4way_handshake(dev[0], dev[1])
335     wait_4way_handshake(dev[1], dev[0])
336
337 def test_ibss_wep(dev):
338     """IBSS with WEP"""
339     ssid="ibss-wep"
340
341     id = add_ibss(dev[0], ssid, key_mgmt="NONE", wep_key0='"hello"')
342     connect_ibss_cmd(dev[0], id)
343     bssid0 = wait_ibss_connection(dev[0])
344
345     id = add_ibss(dev[1], ssid, key_mgmt="NONE", wep_key0='"hello"')
346     connect_ibss_cmd(dev[1], id)
347     bssid1 = wait_ibss_connection(dev[1])
348
349 def test_ibss_rsn_error_case(dev):
350     """IBSS RSN regression test for IBSS_RSN prior IBSS setup"""
351     if "FAIL" not in dev[0].request("IBSS_RSN 02:03:04:05:06:07"):
352         raise Exception("Unexpected IBSS_RSN result")
353
354 def test_ibss_5ghz(dev):
355     """IBSS on 5 GHz band"""
356     try:
357         _test_ibss_5ghz(dev)
358     finally:
359         subprocess.call(['iw', 'reg', 'set', '00'])
360         dev[0].flush_scan_cache()
361         dev[1].flush_scan_cache()
362
363 def _test_ibss_5ghz(dev):
364     subprocess.call(['iw', 'reg', 'set', 'US'])
365     for i in range(2):
366         for j in range(5):
367             ev = dev[i].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=5)
368             if ev is None:
369                 raise Exception("No regdom change event")
370             if "alpha2=US" in ev:
371                 break
372         dev[i].dump_monitor()
373
374     ssid="ibss"
375     id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150", freq=5180)
376     connect_ibss_cmd(dev[0], id, freq=5180)
377     bssid0 = wait_ibss_connection(dev[0])
378
379     dev[1].scan_for_bss(bssid0, freq=5180)
380     id = add_ibss(dev[1], ssid, key_mgmt="NONE", beacon_int="200", freq=5180)
381     connect_ibss_cmd(dev[1], id, freq=5180)
382     bssid1 = wait_ibss_connection(dev[1])
383     if bssid0 != bssid1:
384         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
385
386     dev[0].request("DISCONNECT")
387     dev[1].request("DISCONNECT")
388     dev[0].dump_monitor()
389     dev[1].dump_monitor()
390
391 def test_ibss_rsn_oom(dev):
392     """IBSS RSN OOM during wpa_init"""
393     with alloc_fail(dev[0], 1, "wpa_init"):
394         ssid="ibss-rsn"
395         id = add_ibss_rsn(dev[0], ssid)
396         connect_ibss_cmd(dev[0], id)
397         bssid0 = wait_ibss_connection(dev[0])