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 from remotehost import remote_compatible
8 import logging
9 logger = logging.getLogger()
10 import time
11 import re
12 import subprocess
13 
14 import hwsim_utils
15 from utils import *
16 
17 def connect_ibss_cmd(dev, id, freq=2412):
18     dev.dump_monitor()
19     dev.select_network(id, freq=str(freq))
20 
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.*'
26     s = re.split(exp, ev)
27     if len(s) < 3:
28         return None
29     return s[2]
30 
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()],
34                          timeout=20)
35     if ev is None:
36         raise Exception("4-way handshake in IBSS timed out")
37 
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()],
42                          timeout=20)
43     if ev is None:
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()],
47                          timeout=20)
48     if ev is None:
49         raise Exception("4-way handshake in IBSS timed out")
50 
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, group_rekey=0):
54     id = dev.add_network()
55     dev.set_network(id, "mode", "1")
56     dev.set_network(id, "frequency", str(freq))
57     if chwidth > 0:
58         dev.set_network(id, "max_oper_chwidth", str(chwidth))
59     if scan_freq:
60         dev.set_network(id, "scan_freq", str(scan_freq))
61     dev.set_network_quoted(id, "ssid", ssid)
62     if psk:
63         dev.set_network_quoted(id, "psk", psk)
64     if proto:
65         dev.set_network(id, "proto", proto)
66     if key_mgmt:
67         dev.set_network(id, "key_mgmt", key_mgmt)
68     if pairwise:
69         dev.set_network(id, "pairwise", pairwise)
70     if group:
71         dev.set_network(id, "group", group)
72     if beacon_int:
73         dev.set_network(id, "beacon_int", beacon_int)
74     if bssid:
75         dev.set_network(id, "bssid", bssid)
76     if wep_key0:
77         dev.set_network(id, "wep_key0", wep_key0)
78     if group_rekey:
79         dev.set_network(id, "group_rekey", str(group_rekey))
80     dev.request("ENABLE_NETWORK " + str(id) + " no-connect")
81     return id
82 
83 def add_ibss_rsn(dev, ssid, group_rekey=0, scan_freq=None):
84     return add_ibss(dev, ssid, "12345678", "RSN", "WPA-PSK", "CCMP", "CCMP",
85                     group_rekey=group_rekey, scan_freq=scan_freq)
86 
87 def add_ibss_rsn_tkip(dev, ssid):
88     return add_ibss(dev, ssid, "12345678", "RSN", "WPA-PSK", "TKIP", "TKIP")
89 
90 def add_ibss_wpa_none(dev, ssid):
91     return add_ibss(dev, ssid, "12345678", "WPA", "WPA-NONE", "TKIP", "TKIP")
92 
93 def add_ibss_wpa_none_ccmp(dev, ssid):
94     return add_ibss(dev, ssid, "12345678", "WPA", "WPA-NONE", "CCMP", "CCMP")
95 
96 def test_ibss_rsn(dev):
97     """IBSS RSN"""
98     ssid = "ibss-rsn"
99 
100     logger.info("Start IBSS on the first STA")
101     id = add_ibss_rsn(dev[0], ssid)
102     # FIX: For now, this disables HT to avoid a strange issue with mac80211
103     # frame reordering during the final test_connectivity() call. Once that is
104     # figured out, these disable_ht=1 calls should be removed from the test
105     # case.
106     dev[0].set_network(id, "disable_ht", "1")
107     connect_ibss_cmd(dev[0], id)
108     bssid0 = wait_ibss_connection(dev[0])
109 
110     logger.info("Join two STAs to the IBSS")
111 
112     id = add_ibss_rsn(dev[1], ssid)
113     dev[1].set_network(id, "disable_ht", "1")
114     connect_ibss_cmd(dev[1], id)
115     bssid1 = wait_ibss_connection(dev[1])
116     if bssid0 != bssid1:
117         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
118         # try to merge with a scan
119         dev[1].scan()
120     wait_4way_handshake(dev[0], dev[1])
121     wait_4way_handshake(dev[1], dev[0])
122 
123     id = add_ibss_rsn(dev[2], ssid)
124     connect_ibss_cmd(dev[2], id)
125     bssid2 = wait_ibss_connection(dev[2])
126     if bssid0 != bssid2:
127         logger.info("STA0 BSSID " + bssid0 + " differs from STA2 BSSID " + bssid2)
128         # try to merge with a scan
129         dev[2].scan()
130     wait_4way_handshake(dev[0], dev[2])
131     wait_4way_handshake2(dev[2], dev[0], dev[1])
132 
133     # Allow some time for all peers to complete key setup
134     time.sleep(3)
135     hwsim_utils.test_connectivity(dev[0], dev[1])
136     hwsim_utils.test_connectivity(dev[0], dev[2])
137     hwsim_utils.test_connectivity(dev[1], dev[2])
138 
139     dev[1].request("REMOVE_NETWORK all")
140     time.sleep(1)
141     id = add_ibss_rsn(dev[1], ssid)
142     dev[1].set_network(id, "disable_ht", "1")
143     connect_ibss_cmd(dev[1], id)
144     bssid1 = wait_ibss_connection(dev[1])
145     if bssid0 != bssid1:
146         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
147         # try to merge with a scan
148         dev[1].scan()
149     wait_4way_handshake(dev[0], dev[1])
150     wait_4way_handshake(dev[1], dev[0])
151     time.sleep(3)
152     hwsim_utils.test_connectivity(dev[0], dev[1])
153 
154     if "OK" not in dev[0].request("IBSS_RSN " + dev[1].p2p_interface_addr()):
155         raise Exception("IBSS_RSN command failed")
156 
157     key_mgmt = dev[0].get_status_field("key_mgmt")
158     if key_mgmt != "WPA2-PSK":
159         raise Exception("Unexpected STATUS key_mgmt: " + key_mgmt)
160 
161 def test_ibss_rsn_group_rekey(dev):
162     """IBSS RSN group rekeying"""
163     ssid = "ibss-rsn"
164 
165     logger.info("Start IBSS on the first STA")
166     id = add_ibss_rsn(dev[0], ssid, group_rekey=4, scan_freq=2412)
167     connect_ibss_cmd(dev[0], id)
168     bssid0 = wait_ibss_connection(dev[0])
169     dev[0].dump_monitor()
170 
171     logger.info("Join two STAs to the IBSS")
172 
173     dev[1].scan_for_bss(bssid0, freq=2412)
174     id = add_ibss_rsn(dev[1], ssid, scan_freq=2412)
175     connect_ibss_cmd(dev[1], id)
176     bssid1 = wait_ibss_connection(dev[1])
177     if bssid0 != bssid1:
178         raise Exception("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
179     wait_4way_handshake(dev[0], dev[1])
180     wait_4way_handshake(dev[1], dev[0])
181     dev[0].dump_monitor()
182     dev[1].dump_monitor()
183 
184     hwsim_utils.test_connectivity(dev[0], dev[1])
185     ev = dev[1].wait_event(["RSN: Group rekeying completed"], timeout=10)
186     if ev is None:
187         raise Exception("No group rekeying reported")
188     hwsim_utils.test_connectivity(dev[0], dev[1])
189 
190 def test_ibss_wpa_none(dev):
191     """IBSS WPA-None"""
192     skip_without_tkip(dev[0])
193     skip_without_tkip(dev[1])
194     skip_without_tkip(dev[2])
195     ssid = "ibss-wpa-none"
196 
197     logger.info("Start IBSS on the first STA")
198     id = add_ibss_wpa_none(dev[0], ssid)
199     connect_ibss_cmd(dev[0], id)
200     bssid0 = wait_ibss_connection(dev[0])
201 
202     # This is a bit ugly, but no one really cares about WPA-None, so there may
203     # not be enough justification to clean this up.. For now, wpa_supplicant
204     # will show two connection events with mac80211_hwsim where the first one
205     # comes with all zeros address.
206     if bssid0 == "00:00:00:00:00:00":
207         logger.info("Waiting for real BSSID on the first STA")
208         bssid0 = wait_ibss_connection(dev[0])
209 
210     logger.info("Join two STAs to the IBSS")
211 
212     id = add_ibss_wpa_none(dev[1], ssid)
213     connect_ibss_cmd(dev[1], id)
214     id = add_ibss_wpa_none(dev[2], ssid)
215     connect_ibss_cmd(dev[2], id)
216 
217     bssid1 = wait_ibss_connection(dev[1])
218     if bssid0 != bssid1:
219         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
220         bssid1 = wait_ibss_connection(dev[1])
221 
222     bssid2 = wait_ibss_connection(dev[2])
223     if bssid0 != bssid2:
224         logger.info("STA0 BSSID " + bssid0 + " differs from STA2 BSSID " + bssid2)
225         bssid2 = wait_ibss_connection(dev[2])
226 
227     logger.info("bssid0=%s bssid1=%s bssid2=%s" % (bssid0, bssid1, bssid2))
228 
229     bss = dev[0].get_bss(bssid0)
230     if not bss:
231         bss = dev[1].get_bss(bssid1)
232         if not bss:
233             raise Exception("Could not find BSS entry for IBSS")
234     if 'flags' not in bss:
235         raise Exception("Could not get BSS flags from BSS table")
236     if "[WPA-None-TKIP]" not in bss['flags']:
237         raise Exception("Unexpected BSS flags: " + bss['flags'])
238 
239     # Allow some time for all peers to complete key setup
240     time.sleep(1)
241 
242     # This is supposed to work, but looks like WPA-None does not work with
243     # mac80211 currently..
244     try:
245         hwsim_utils.test_connectivity(dev[0], dev[1])
246     except Exception as e:
247         logger.info("Ignoring known connectivity failure: " + str(e))
248     try:
249         hwsim_utils.test_connectivity(dev[0], dev[2])
250     except Exception as e:
251         logger.info("Ignoring known connectivity failure: " + str(e))
252     try:
253         hwsim_utils.test_connectivity(dev[1], dev[2])
254     except Exception as e:
255         logger.info("Ignoring known connectivity failure: " + str(e))
256 
257     key_mgmt = dev[0].get_status_field("key_mgmt")
258     if key_mgmt != "WPA-NONE":
259         raise Exception("Unexpected STATUS key_mgmt: " + key_mgmt)
260 
261 def test_ibss_wpa_none_ccmp(dev):
262     """IBSS WPA-None/CCMP"""
263     skip_without_tkip(dev[0])
264     skip_without_tkip(dev[1])
265     ssid = "ibss-wpa-none"
266 
267     logger.info("Start IBSS on the first STA")
268     id = add_ibss_wpa_none(dev[0], ssid)
269     connect_ibss_cmd(dev[0], id)
270     bssid0 = wait_ibss_connection(dev[0])
271 
272     # This is a bit ugly, but no one really cares about WPA-None, so there may
273     # not be enough justification to clean this up.. For now, wpa_supplicant
274     # will show two connection events with mac80211_hwsim where the first one
275     # comes with all zeros address.
276     if bssid0 == "00:00:00:00:00:00":
277         logger.info("Waiting for real BSSID on the first STA")
278         bssid0 = wait_ibss_connection(dev[0])
279 
280 
281     logger.info("Join a STA to the IBSS")
282     id = add_ibss_wpa_none(dev[1], ssid)
283     connect_ibss_cmd(dev[1], id)
284 
285     bssid1 = wait_ibss_connection(dev[1])
286     if bssid0 != bssid1:
287         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
288         bssid1 = wait_ibss_connection(dev[1])
289 
290     logger.info("bssid0=%s bssid1=%s" % (bssid0, bssid1))
291 
292     # Allow some time for all peers to complete key setup
293     time.sleep(1)
294 
295     # This is supposed to work, but looks like WPA-None does not work with
296     # mac80211 currently..
297     try:
298         hwsim_utils.test_connectivity(dev[0], dev[1])
299     except Exception as e:
300         logger.info("Ignoring known connectivity failure: " + str(e))
301 
302 def test_ibss_open(dev):
303     """IBSS open (no security)"""
304     ssid = "ibss"
305     id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150")
306     connect_ibss_cmd(dev[0], id)
307     bssid0 = wait_ibss_connection(dev[0])
308 
309     id = add_ibss(dev[1], ssid, key_mgmt="NONE", beacon_int="200")
310     connect_ibss_cmd(dev[1], id)
311     bssid1 = wait_ibss_connection(dev[1])
312     if bssid0 != bssid1:
313         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
314 
315     res = dev[0].request("SCAN_RESULTS")
316     if "[IBSS]" not in res:
317         res = dev[1].request("SCAN_RESULTS")
318         if "[IBSS]" not in res:
319             raise Exception("IBSS flag missing from scan results: " + res)
320     bss = dev[0].get_bss(bssid0)
321     if not bss:
322         bss = dev[1].get_bss(bssid1)
323         if not bss:
324             raise Exception("Could not find BSS entry for IBSS")
325     if 'flags' not in bss:
326         raise Exception("Could not get BSS flags from BSS table")
327     if "[IBSS]" not in bss['flags']:
328         raise Exception("Unexpected BSS flags: " + bss['flags'])
329 
330     freq0 = dev[0].get_status_field("freq")
331     freq1 = dev[1].get_status_field("freq")
332     if freq0 != "2412" or freq1 != "2412":
333         raise Exception("IBSS operating frequency not reported correctly (%s %s)" % (freq0, freq1))
334 
335     key_mgmt = dev[0].get_status_field("key_mgmt")
336     if key_mgmt != "NONE":
337         raise Exception("Unexpected STATUS key_mgmt: " + key_mgmt)
338 
339 def test_ibss_open_fixed_bssid(dev):
340     """IBSS open (no security) and fixed BSSID"""
341     ssid = "ibss"
342     bssid = "02:11:22:33:44:55"
343     try:
344         dev[0].request("AP_SCAN 2")
345         add_ibss(dev[0], ssid, key_mgmt="NONE", bssid=bssid, beacon_int="150")
346         dev[0].request("REASSOCIATE")
347 
348         dev[1].request("AP_SCAN 2")
349         add_ibss(dev[1], ssid, key_mgmt="NONE", bssid=bssid, beacon_int="200")
350         dev[1].request("REASSOCIATE")
351 
352         bssid0 = wait_ibss_connection(dev[0])
353         bssid1 = wait_ibss_connection(dev[1])
354         if bssid0 != bssid:
355             raise Exception("STA0 BSSID " + bssid0 + " differs from fixed BSSID " + bssid)
356         if bssid1 != bssid:
357             raise Exception("STA0 BSSID " + bssid0 + " differs from fixed BSSID " + bssid)
358         dev[0].request("DISCONNECT")
359         dev[1].request("DISCONNECT")
360     finally:
361         dev[0].request("AP_SCAN 1")
362         dev[1].request("AP_SCAN 1")
363         dev[0].flush_scan_cache()
364         dev[1].flush_scan_cache()
365 
366 def test_ibss_open_retry(dev):
367     """IBSS open (no security) with cfg80211 retry workaround"""
368     subprocess.check_call(['iw', 'dev', dev[0].ifname, 'set', 'type', 'adhoc'])
369     subprocess.check_call(['iw', 'dev', dev[0].ifname, 'ibss', 'join',
370                            'ibss-test', '2412', 'HT20', 'fixed-freq',
371                            '02:22:33:44:55:66'])
372     ssid = "ibss"
373     try:
374         dev[0].request("AP_SCAN 2")
375         id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150",
376                       bssid="02:33:44:55:66:77", scan_freq=2412)
377         #connect_ibss_cmd(dev[0], id)
378         dev[0].request("REASSOCIATE")
379         bssid0 = wait_ibss_connection(dev[0])
380 
381         subprocess.check_call(['iw', 'dev', dev[0].ifname, 'ibss', 'leave'])
382         time.sleep(1)
383         dev[0].request("DISCONNECT")
384     finally:
385         dev[0].request("AP_SCAN 1")
386 
387 def test_ibss_rsn_tkip(dev):
388     """IBSS RSN with TKIP as the cipher"""
389     skip_without_tkip(dev[0])
390     skip_without_tkip(dev[1])
391     ssid = "ibss-rsn-tkip"
392 
393     id = add_ibss_rsn_tkip(dev[0], ssid)
394     connect_ibss_cmd(dev[0], id)
395     bssid0 = wait_ibss_connection(dev[0])
396 
397     id = add_ibss_rsn_tkip(dev[1], ssid)
398     connect_ibss_cmd(dev[1], id)
399     bssid1 = wait_ibss_connection(dev[1])
400     if bssid0 != bssid1:
401         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
402         # try to merge with a scan
403         dev[1].scan()
404     wait_4way_handshake(dev[0], dev[1])
405     wait_4way_handshake(dev[1], dev[0])
406 
407 def test_ibss_wep(dev):
408     """IBSS with WEP"""
409     check_wep_capa(dev[0])
410     check_wep_capa(dev[1])
411 
412     ssid = "ibss-wep"
413 
414     id = add_ibss(dev[0], ssid, key_mgmt="NONE", wep_key0='"hello"')
415     connect_ibss_cmd(dev[0], id)
416     bssid0 = wait_ibss_connection(dev[0])
417 
418     id = add_ibss(dev[1], ssid, key_mgmt="NONE", wep_key0='"hello"')
419     connect_ibss_cmd(dev[1], id)
420     bssid1 = wait_ibss_connection(dev[1])
421 
422 @remote_compatible
423 def test_ibss_rsn_error_case(dev):
424     """IBSS RSN regression test for IBSS_RSN prior IBSS setup"""
425     if "FAIL" not in dev[0].request("IBSS_RSN 02:03:04:05:06:07"):
426         raise Exception("Unexpected IBSS_RSN result")
427 
428 def test_ibss_5ghz(dev):
429     """IBSS on 5 GHz band"""
430     try:
431         _test_ibss_5ghz(dev)
432     finally:
433         subprocess.call(['iw', 'reg', 'set', '00'])
434         dev[0].flush_scan_cache()
435         dev[1].flush_scan_cache()
436 
437 def _test_ibss_5ghz(dev):
438     subprocess.call(['iw', 'reg', 'set', 'US'])
439     for i in range(2):
440         for j in range(5):
441             ev = dev[i].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=5)
442             if ev is None:
443                 raise Exception("No regdom change event")
444             if "alpha2=US" in ev:
445                 break
446         dev[i].dump_monitor()
447 
448     ssid = "ibss"
449     id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150", freq=5180)
450     connect_ibss_cmd(dev[0], id, freq=5180)
451     bssid0 = wait_ibss_connection(dev[0])
452 
453     dev[1].scan_for_bss(bssid0, freq=5180)
454     id = add_ibss(dev[1], ssid, key_mgmt="NONE", beacon_int="200", freq=5180)
455     connect_ibss_cmd(dev[1], id, freq=5180)
456     bssid1 = wait_ibss_connection(dev[1])
457     if bssid0 != bssid1:
458         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
459 
460     dev[0].request("DISCONNECT")
461     dev[1].request("DISCONNECT")
462     dev[0].dump_monitor()
463     dev[1].dump_monitor()
464 
465 def test_ibss_vht_80p80(dev):
466     """IBSS on VHT 80+80 MHz channel"""
467     try:
468         _test_ibss_vht_80p80(dev)
469     finally:
470         subprocess.call(['iw', 'reg', 'set', '00'])
471         dev[0].flush_scan_cache()
472         dev[1].flush_scan_cache()
473 
474 def _test_ibss_vht_80p80(dev):
475     subprocess.call(['iw', 'reg', 'set', 'US'])
476     for i in range(2):
477         for j in range(5):
478             ev = dev[i].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=5)
479             if ev is None:
480                 raise Exception("No regdom change event")
481             if "alpha2=US" in ev:
482                 break
483         dev[i].dump_monitor()
484 
485     ssid = "ibss"
486     id = add_ibss(dev[0], ssid, key_mgmt="NONE", freq=5180, chwidth=3)
487     connect_ibss_cmd(dev[0], id, freq=5180)
488     bssid0 = wait_ibss_connection(dev[0])
489     sig = dev[0].request("SIGNAL_POLL").splitlines()
490     if "FREQUENCY=5180" not in sig:
491         raise Exception("Unexpected SIGNAL_POLL value(1): " + str(sig))
492     if "WIDTH=80+80 MHz" not in sig:
493         raise Exception("Unexpected SIGNAL_POLL value(2): " + str(sig))
494     if "CENTER_FRQ1=5210" not in sig:
495         raise Exception("Unexpected SIGNAL_POLL value(3): " + str(sig))
496     if "CENTER_FRQ2=5775" not in sig:
497         raise Exception("Unexpected SIGNAL_POLL value(4): " + str(sig))
498 
499     dev[1].scan_for_bss(bssid0, freq=5180)
500     id = add_ibss(dev[1], ssid, key_mgmt="NONE", freq=5180, chwidth=3)
501     connect_ibss_cmd(dev[1], id, freq=5180)
502     bssid1 = wait_ibss_connection(dev[1])
503     if bssid0 != bssid1:
504         logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
505 
506     sig = dev[1].request("SIGNAL_POLL").splitlines()
507     if "FREQUENCY=5180" not in sig:
508         raise Exception("Unexpected SIGNAL_POLL value(1b): " + str(sig))
509     logger.info("STA1 SIGNAL_POLL: " + str(sig))
510     # For now, don't report errors on joining STA failing to get 80+80 MHZ
511     # since mac80211 missed functionality for that to work.
512 
513     dev[0].request("DISCONNECT")
514     dev[1].request("DISCONNECT")
515     dev[0].dump_monitor()
516     dev[1].dump_monitor()
517 
518 def test_ibss_rsn_oom(dev):
519     """IBSS RSN OOM during wpa_init"""
520     with alloc_fail(dev[0], 1, "wpa_init"):
521         ssid = "ibss-rsn"
522         id = add_ibss_rsn(dev[0], ssid, scan_freq=2412)
523         connect_ibss_cmd(dev[0], id)
524         bssid0 = wait_ibss_connection(dev[0])
525     dev[0].request("REMOVE_NETWORK all")
526     dev[0].dump_monitor()
527 
528     with alloc_fail(dev[0], 1, "=ibss_rsn_init"):
529         ssid = "ibss-rsn"
530         id = add_ibss_rsn(dev[0], ssid, scan_freq=2412)
531         connect_ibss_cmd(dev[0], id)
532         bssid0 = wait_ibss_connection(dev[0])
533     dev[0].request("REMOVE_NETWORK all")
534     dev[0].dump_monitor()
535 
536 def send_eapol_rx(dev, dst):
537     if "OK" not in dev.request("EAPOL_RX %s 0203005f02008a001000000000000000013a54fb19d8a785f5986bdc2ba800553550bc9513e6603eb50809154588c22b110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" % dst):
538         raise Exception("EAPOL_RX for %s failed" % dst)
539 
540 def test_ibss_rsn_eapol_trigger(dev):
541     """IBSS RSN and EAPOL trigger for a new peer"""
542     ssid = "ibss-rsn"
543 
544     id = add_ibss_rsn(dev[0], ssid, scan_freq=2412)
545     connect_ibss_cmd(dev[0], id)
546     bssid0 = wait_ibss_connection(dev[0])
547 
548     send_eapol_rx(dev[0], "02:ff:00:00:00:01")
549     send_eapol_rx(dev[0], "02:ff:00:00:00:01")
550 
551     dst = "02:ff:00:00:00:01"
552     logger.info("Too short EAPOL frame")
553     if "OK" not in dev[0].request("EAPOL_RX %s 0203005e02008a001000000000000000013a54fb19d8a785f5986bdc2ba800553550bc9513e6603eb50809154588c22b1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" % dst):
554         raise Exception("EAPOL_RX for %s failed" % dst)
555     logger.info("RSN: EAPOL frame (type 255) discarded, not a Key frame")
556     if "OK" not in dev[0].request("EAPOL_RX %s 02ff005f02008a001000000000000000013a54fb19d8a785f5986bdc2ba800553550bc9513e6603eb50809154588c22b110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" % dst):
557         raise Exception("EAPOL_RX for %s failed" % dst)
558     logger.info("RSN: EAPOL frame payload size 96 invalid (frame size 99)")
559     if "OK" not in dev[0].request("EAPOL_RX %s 0203006002008a001000000000000000013a54fb19d8a785f5986bdc2ba800553550bc9513e6603eb50809154588c22b110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" % dst):
560         raise Exception("EAPOL_RX for %s failed" % dst)
561     logger.info("RSN: EAPOL-Key type (255) unknown, discarded")
562     if "OK" not in dev[0].request("EAPOL_RX %s 0203005fff008a001000000000000000013a54fb19d8a785f5986bdc2ba800553550bc9513e6603eb50809154588c22b110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" % dst):
563         raise Exception("EAPOL_RX for %s failed" % dst)
564 
565     with alloc_fail(dev[0], 1, "ibss_rsn_rx_eapol"):
566         send_eapol_rx(dev[0], "02:ff:00:00:00:02")
567         wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
568 
569     with alloc_fail(dev[0], 1, "wpa_auth_sta_init;ibss_rsn_auth_init"):
570         send_eapol_rx(dev[0], "02:ff:00:00:00:03")
571         wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
572 
573     with alloc_fail(dev[0], 1, "=ibss_rsn_peer_init"):
574         send_eapol_rx(dev[0], "02:ff:00:00:00:04")
575         wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
576 
577     with alloc_fail(dev[0], 1, "ibss_rsn_process_rx_eapol"):
578         send_eapol_rx(dev[0], "02:ff:00:00:00:05")
579         wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
580 
581     with alloc_fail(dev[0], 1,
582                     "wpa_sm_set_assoc_wpa_ie_default;ibss_rsn_supp_init"):
583         send_eapol_rx(dev[0], "02:ff:00:00:00:06")
584         wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
585 
586     with alloc_fail(dev[0], 1, "wpa_sm_init;ibss_rsn_supp_init"):
587         send_eapol_rx(dev[0], "02:ff:00:00:00:07")
588         wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
589 
590     with alloc_fail(dev[0], 1, "=ibss_rsn_supp_init"):
591         send_eapol_rx(dev[0], "02:ff:00:00:00:08")
592         wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
593 
594     with alloc_fail(dev[0], 1, "supp_alloc_eapol"):
595         send_eapol_rx(dev[0], "02:ff:00:00:00:09")
596         wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
597 
598     with alloc_fail(dev[0], 1, "wpa_validate_wpa_ie;ibss_rsn_auth_init"):
599         send_eapol_rx(dev[0], "02:ff:00:00:00:0a")
600         wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
601 
602     logger.info("RSN: Timeout on waiting Authentication frame response")
603     if "OK" not in dev[0].request("IBSS_RSN 02:ff:00:00:00:0b"):
604         raise Exception("Unexpected IBSS_RSN result")
605     time.sleep(1.1)
606