2 # Copyright (c) 2013-2015, Jouni Malinen <j@w1.fi>
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
7 from remotehost import remote_compatible
9 logger = logging.getLogger()
15 from utils import alloc_fail
17 def connect_ibss_cmd(dev, id, freq=2412):
19 dev.select_network(id, freq=str(freq))
21 def wait_ibss_connection(dev):
22 logger.info(dev.ifname + " waiting for IBSS start/join to complete")
23 ev = dev.wait_connected(timeout=20,
24 error="Connection to the IBSS timed out")
25 exp = r'<.>(CTRL-EVENT-CONNECTED) - Connection to ([0-9a-f:]*) completed.*'
31 def wait_4way_handshake(dev1, dev2):
32 logger.info(dev1.ifname + " waiting for 4-way handshake completion with " + dev2.ifname + " " + dev2.p2p_interface_addr())
33 ev = dev1.wait_event(["IBSS-RSN-COMPLETED " + dev2.p2p_interface_addr()],
36 raise Exception("4-way handshake in IBSS timed out")
38 def wait_4way_handshake2(dev1, dev2, dev3):
39 logger.info(dev1.ifname + " waiting for 4-way handshake completion with " + dev2.ifname + " " + dev2.p2p_interface_addr() + " and " + dev3.p2p_interface_addr())
40 ev = dev1.wait_event(["IBSS-RSN-COMPLETED " + dev2.p2p_interface_addr(),
41 "IBSS-RSN-COMPLETED " + dev3.p2p_interface_addr()],
44 raise Exception("4-way handshake in IBSS timed out")
45 ev = dev1.wait_event(["IBSS-RSN-COMPLETED " + dev2.p2p_interface_addr(),
46 "IBSS-RSN-COMPLETED " + dev3.p2p_interface_addr()],
49 raise Exception("4-way handshake in IBSS timed out")
51 def add_ibss(dev, ssid, psk=None, proto=None, key_mgmt=None, pairwise=None,
52 group=None, beacon_int=None, bssid=None, scan_freq=None,
53 wep_key0=None, freq=2412, chwidth=0):
54 id = dev.add_network()
55 dev.set_network(id, "mode", "1")
56 dev.set_network(id, "frequency", str(freq))
58 dev.set_network(id, "max_oper_chwidth", str(chwidth))
60 dev.set_network(id, "scan_freq", str(scan_freq))
61 dev.set_network_quoted(id, "ssid", ssid)
63 dev.set_network_quoted(id, "psk", psk)
65 dev.set_network(id, "proto", proto)
67 dev.set_network(id, "key_mgmt", key_mgmt)
69 dev.set_network(id, "pairwise", pairwise)
71 dev.set_network(id, "group", group)
73 dev.set_network(id, "beacon_int", beacon_int)
75 dev.set_network(id, "bssid", bssid)
77 dev.set_network(id, "wep_key0", wep_key0)
78 dev.request("ENABLE_NETWORK " + str(id) + " no-connect")
81 def add_ibss_rsn(dev, ssid):
82 return add_ibss(dev, ssid, "12345678", "RSN", "WPA-PSK", "CCMP", "CCMP")
84 def add_ibss_rsn_tkip(dev, ssid):
85 return add_ibss(dev, ssid, "12345678", "RSN", "WPA-PSK", "TKIP", "TKIP")
87 def add_ibss_wpa_none(dev, ssid):
88 return add_ibss(dev, ssid, "12345678", "WPA", "WPA-NONE", "TKIP", "TKIP")
90 def add_ibss_wpa_none_ccmp(dev, ssid):
91 return add_ibss(dev, ssid, "12345678", "WPA", "WPA-NONE", "CCMP", "CCMP")
93 def test_ibss_rsn(dev):
97 logger.info("Start IBSS on the first STA")
98 id = add_ibss_rsn(dev[0], ssid)
99 connect_ibss_cmd(dev[0], id)
100 bssid0 = wait_ibss_connection(dev[0])
102 logger.info("Join two STAs to the IBSS")
104 id = add_ibss_rsn(dev[1], ssid)
105 connect_ibss_cmd(dev[1], id)
106 bssid1 = wait_ibss_connection(dev[1])
108 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
109 # try to merge with a scan
111 wait_4way_handshake(dev[0], dev[1])
112 wait_4way_handshake(dev[1], dev[0])
114 id = add_ibss_rsn(dev[2], ssid)
115 connect_ibss_cmd(dev[2], id)
116 bssid2 = wait_ibss_connection(dev[2])
118 logger.info("STA0 BSSID " + bssid0 + " differs from STA2 BSSID " + bssid2)
119 # try to merge with a scan
121 wait_4way_handshake(dev[0], dev[2])
122 wait_4way_handshake2(dev[2], dev[0], dev[1])
124 # Allow some time for all peers to complete key setup
126 hwsim_utils.test_connectivity(dev[0], dev[1])
127 hwsim_utils.test_connectivity(dev[0], dev[2])
128 hwsim_utils.test_connectivity(dev[1], dev[2])
130 dev[1].request("REMOVE_NETWORK all")
132 id = add_ibss_rsn(dev[1], ssid)
133 connect_ibss_cmd(dev[1], id)
134 bssid1 = wait_ibss_connection(dev[1])
136 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
137 # try to merge with a scan
139 wait_4way_handshake(dev[0], dev[1])
140 wait_4way_handshake(dev[1], dev[0])
142 hwsim_utils.test_connectivity(dev[0], dev[1])
144 if "OK" not in dev[0].request("IBSS_RSN " + dev[1].p2p_interface_addr()):
145 raise Exception("IBSS_RSN command failed")
147 key_mgmt = dev[0].get_status_field("key_mgmt")
148 if key_mgmt != "WPA2-PSK":
149 raise Exception("Unexpected STATUS key_mgmt: " + key_mgmt)
151 def test_ibss_wpa_none(dev):
155 logger.info("Start IBSS on the first STA")
156 id = add_ibss_wpa_none(dev[0], ssid)
157 connect_ibss_cmd(dev[0], id)
158 bssid0 = wait_ibss_connection(dev[0])
160 # This is a bit ugly, but no one really cares about WPA-None, so there may
161 # not be enough justification to clean this up.. For now, wpa_supplicant
162 # will show two connection events with mac80211_hwsim where the first one
163 # comes with all zeros address.
164 if bssid0 == "00:00:00:00:00:00":
165 logger.info("Waiting for real BSSID on the first STA")
166 bssid0 = wait_ibss_connection(dev[0])
168 logger.info("Join two STAs to the IBSS")
170 id = add_ibss_wpa_none(dev[1], ssid)
171 connect_ibss_cmd(dev[1], id)
172 id = add_ibss_wpa_none(dev[2], ssid)
173 connect_ibss_cmd(dev[2], id)
175 bssid1 = wait_ibss_connection(dev[1])
177 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
178 bssid1 = wait_ibss_connection(dev[1])
180 bssid2 = wait_ibss_connection(dev[2])
182 logger.info("STA0 BSSID " + bssid0 + " differs from STA2 BSSID " + bssid2)
183 bssid2 = wait_ibss_connection(dev[2])
185 logger.info("bssid0=%s bssid1=%s bssid2=%s" % (bssid0, bssid1, bssid2))
187 bss = dev[0].get_bss(bssid0)
189 bss = dev[1].get_bss(bssid1)
191 raise Exception("Could not find BSS entry for IBSS")
192 if 'flags' not in bss:
193 raise Exception("Could not get BSS flags from BSS table")
194 if "[WPA-None-TKIP]" not in bss['flags']:
195 raise Exception("Unexpected BSS flags: " + bss['flags'])
197 # Allow some time for all peers to complete key setup
200 # This is supposed to work, but looks like WPA-None does not work with
201 # mac80211 currently..
203 hwsim_utils.test_connectivity(dev[0], dev[1])
205 logger.info("Ignoring known connectivity failure: " + str(e))
207 hwsim_utils.test_connectivity(dev[0], dev[2])
209 logger.info("Ignoring known connectivity failure: " + str(e))
211 hwsim_utils.test_connectivity(dev[1], dev[2])
213 logger.info("Ignoring known connectivity failure: " + str(e))
215 key_mgmt = dev[0].get_status_field("key_mgmt")
216 if key_mgmt != "WPA-NONE":
217 raise Exception("Unexpected STATUS key_mgmt: " + key_mgmt)
219 def test_ibss_wpa_none_ccmp(dev):
220 """IBSS WPA-None/CCMP"""
223 logger.info("Start IBSS on the first STA")
224 id = add_ibss_wpa_none(dev[0], ssid)
225 connect_ibss_cmd(dev[0], id)
226 bssid0 = wait_ibss_connection(dev[0])
228 # This is a bit ugly, but no one really cares about WPA-None, so there may
229 # not be enough justification to clean this up.. For now, wpa_supplicant
230 # will show two connection events with mac80211_hwsim where the first one
231 # comes with all zeros address.
232 if bssid0 == "00:00:00:00:00:00":
233 logger.info("Waiting for real BSSID on the first STA")
234 bssid0 = wait_ibss_connection(dev[0])
237 logger.info("Join a STA to the IBSS")
238 id = add_ibss_wpa_none(dev[1], ssid)
239 connect_ibss_cmd(dev[1], id)
241 bssid1 = wait_ibss_connection(dev[1])
243 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
244 bssid1 = wait_ibss_connection(dev[1])
246 logger.info("bssid0=%s bssid1=%s" % (bssid0, bssid1))
248 # Allow some time for all peers to complete key setup
251 # This is supposed to work, but looks like WPA-None does not work with
252 # mac80211 currently..
254 hwsim_utils.test_connectivity(dev[0], dev[1])
256 logger.info("Ignoring known connectivity failure: " + str(e))
258 def test_ibss_open(dev):
259 """IBSS open (no security)"""
261 id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150")
262 connect_ibss_cmd(dev[0], id)
263 bssid0 = wait_ibss_connection(dev[0])
265 id = add_ibss(dev[1], ssid, key_mgmt="NONE", beacon_int="200")
266 connect_ibss_cmd(dev[1], id)
267 bssid1 = wait_ibss_connection(dev[1])
269 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
271 res = dev[0].request("SCAN_RESULTS")
272 if "[IBSS]" not in res:
273 res = dev[1].request("SCAN_RESULTS")
274 if "[IBSS]" not in res:
275 raise Exception("IBSS flag missing from scan results: " + res)
276 bss = dev[0].get_bss(bssid0)
278 bss = dev[1].get_bss(bssid1)
280 raise Exception("Could not find BSS entry for IBSS")
281 if 'flags' not in bss:
282 raise Exception("Could not get BSS flags from BSS table")
283 if "[IBSS]" not in bss['flags']:
284 raise Exception("Unexpected BSS flags: " + bss['flags'])
286 freq0 = dev[0].get_status_field("freq")
287 freq1 = dev[1].get_status_field("freq")
288 if freq0 != "2412" or freq1 != "2412":
289 raise Exception("IBSS operating frequency not reported correctly (%s %s)" % (freq0, freq1))
291 key_mgmt = dev[0].get_status_field("key_mgmt")
292 if key_mgmt != "NONE":
293 raise Exception("Unexpected STATUS key_mgmt: " + key_mgmt)
295 def test_ibss_open_fixed_bssid(dev):
296 """IBSS open (no security) and fixed BSSID"""
298 bssid="02:11:22:33:44:55"
300 dev[0].request("AP_SCAN 2")
301 add_ibss(dev[0], ssid, key_mgmt="NONE", bssid=bssid, beacon_int="150")
302 dev[0].request("REASSOCIATE")
304 dev[1].request("AP_SCAN 2")
305 add_ibss(dev[1], ssid, key_mgmt="NONE", bssid=bssid, beacon_int="200")
306 dev[1].request("REASSOCIATE")
308 bssid0 = wait_ibss_connection(dev[0])
309 bssid1 = wait_ibss_connection(dev[1])
311 raise Exception("STA0 BSSID " + bssid0 + " differs from fixed BSSID " + bssid)
313 raise Exception("STA0 BSSID " + bssid0 + " differs from fixed BSSID " + bssid)
315 dev[0].request("AP_SCAN 1")
316 dev[1].request("AP_SCAN 1")
318 def test_ibss_open_retry(dev):
319 """IBSS open (no security) with cfg80211 retry workaround"""
320 subprocess.check_call(['iw', 'dev', dev[0].ifname, 'set', 'type', 'adhoc'])
321 subprocess.check_call(['iw', 'dev', dev[0].ifname, 'ibss', 'join',
322 'ibss-test', '2412', 'HT20', 'fixed-freq',
323 '02:22:33:44:55:66'])
326 dev[0].request("AP_SCAN 2")
327 id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150",
328 bssid="02:33:44:55:66:77", scan_freq=2412)
329 #connect_ibss_cmd(dev[0], id)
330 dev[0].request("REASSOCIATE")
331 bssid0 = wait_ibss_connection(dev[0])
333 subprocess.check_call(['iw', 'dev', dev[0].ifname, 'ibss', 'leave'])
335 dev[0].request("DISCONNECT")
337 dev[0].request("AP_SCAN 1")
339 def test_ibss_rsn_tkip(dev):
340 """IBSS RSN with TKIP as the cipher"""
343 id = add_ibss_rsn_tkip(dev[0], ssid)
344 connect_ibss_cmd(dev[0], id)
345 bssid0 = wait_ibss_connection(dev[0])
347 id = add_ibss_rsn_tkip(dev[1], ssid)
348 connect_ibss_cmd(dev[1], id)
349 bssid1 = wait_ibss_connection(dev[1])
351 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
352 # try to merge with a scan
354 wait_4way_handshake(dev[0], dev[1])
355 wait_4way_handshake(dev[1], dev[0])
357 def test_ibss_wep(dev):
361 id = add_ibss(dev[0], ssid, key_mgmt="NONE", wep_key0='"hello"')
362 connect_ibss_cmd(dev[0], id)
363 bssid0 = wait_ibss_connection(dev[0])
365 id = add_ibss(dev[1], ssid, key_mgmt="NONE", wep_key0='"hello"')
366 connect_ibss_cmd(dev[1], id)
367 bssid1 = wait_ibss_connection(dev[1])
370 def test_ibss_rsn_error_case(dev):
371 """IBSS RSN regression test for IBSS_RSN prior IBSS setup"""
372 if "FAIL" not in dev[0].request("IBSS_RSN 02:03:04:05:06:07"):
373 raise Exception("Unexpected IBSS_RSN result")
375 def test_ibss_5ghz(dev):
376 """IBSS on 5 GHz band"""
380 subprocess.call(['iw', 'reg', 'set', '00'])
381 dev[0].flush_scan_cache()
382 dev[1].flush_scan_cache()
384 def _test_ibss_5ghz(dev):
385 subprocess.call(['iw', 'reg', 'set', 'US'])
388 ev = dev[i].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=5)
390 raise Exception("No regdom change event")
391 if "alpha2=US" in ev:
393 dev[i].dump_monitor()
396 id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150", freq=5180)
397 connect_ibss_cmd(dev[0], id, freq=5180)
398 bssid0 = wait_ibss_connection(dev[0])
400 dev[1].scan_for_bss(bssid0, freq=5180)
401 id = add_ibss(dev[1], ssid, key_mgmt="NONE", beacon_int="200", freq=5180)
402 connect_ibss_cmd(dev[1], id, freq=5180)
403 bssid1 = wait_ibss_connection(dev[1])
405 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
407 dev[0].request("DISCONNECT")
408 dev[1].request("DISCONNECT")
409 dev[0].dump_monitor()
410 dev[1].dump_monitor()
412 def test_ibss_vht_80p80(dev):
413 """IBSS on VHT 80+80 MHz channel"""
415 _test_ibss_vht_80p80(dev)
417 subprocess.call(['iw', 'reg', 'set', '00'])
418 dev[0].flush_scan_cache()
419 dev[1].flush_scan_cache()
421 def _test_ibss_vht_80p80(dev):
422 subprocess.call(['iw', 'reg', 'set', 'US'])
425 ev = dev[i].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=5)
427 raise Exception("No regdom change event")
428 if "alpha2=US" in ev:
430 dev[i].dump_monitor()
433 id = add_ibss(dev[0], ssid, key_mgmt="NONE", freq=5180, chwidth=3)
434 connect_ibss_cmd(dev[0], id, freq=5180)
435 bssid0 = wait_ibss_connection(dev[0])
436 sig = dev[0].request("SIGNAL_POLL").splitlines()
437 if "FREQUENCY=5180" not in sig:
438 raise Exception("Unexpected SIGNAL_POLL value(1): " + str(sig))
439 if "WIDTH=80+80 MHz" not in sig:
440 raise Exception("Unexpected SIGNAL_POLL value(2): " + str(sig))
441 if "CENTER_FRQ1=5210" not in sig:
442 raise Exception("Unexpected SIGNAL_POLL value(3): " + str(sig))
443 if "CENTER_FRQ2=5775" not in sig:
444 raise Exception("Unexpected SIGNAL_POLL value(4): " + str(sig))
446 dev[1].scan_for_bss(bssid0, freq=5180)
447 id = add_ibss(dev[1], ssid, key_mgmt="NONE", freq=5180, chwidth=3)
448 connect_ibss_cmd(dev[1], id, freq=5180)
449 bssid1 = wait_ibss_connection(dev[1])
451 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
453 sig = dev[1].request("SIGNAL_POLL").splitlines()
454 if "FREQUENCY=5180" not in sig:
455 raise Exception("Unexpected SIGNAL_POLL value(1b): " + str(sig))
456 logger.info("STA1 SIGNAL_POLL: " + str(sig))
457 # For now, don't report errors on joining STA failing to get 80+80 MHZ
458 # since mac80211 missed functionality for that to work.
460 dev[0].request("DISCONNECT")
461 dev[1].request("DISCONNECT")
462 dev[0].dump_monitor()
463 dev[1].dump_monitor()
465 def test_ibss_rsn_oom(dev):
466 """IBSS RSN OOM during wpa_init"""
467 with alloc_fail(dev[0], 1, "wpa_init"):
469 id = add_ibss_rsn(dev[0], ssid)
470 connect_ibss_cmd(dev[0], id)
471 bssid0 = wait_ibss_connection(dev[0])