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