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
7from remotehost import remote_compatible
8import logging
9logger = logging.getLogger()
10import time
11import re
12import subprocess
13
14import hwsim_utils
15from utils import *
16
17def connect_ibss_cmd(dev, id, freq=2412):
18    dev.dump_monitor()
19    dev.select_network(id, freq=str(freq))
20
21def 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
31def 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
38def 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
51def 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
83def 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
87def add_ibss_rsn_tkip(dev, ssid):
88    return add_ibss(dev, ssid, "12345678", "RSN", "WPA-PSK", "TKIP", "TKIP")
89
90def add_ibss_wpa_none(dev, ssid):
91    return add_ibss(dev, ssid, "12345678", "WPA", "WPA-NONE", "TKIP", "TKIP")
92
93def add_ibss_wpa_none_ccmp(dev, ssid):
94    return add_ibss(dev, ssid, "12345678", "WPA", "WPA-NONE", "CCMP", "CCMP")
95
96def 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
161def 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
190def 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
261def 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
302def 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
339def 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    finally:
359        dev[0].request("AP_SCAN 1")
360        dev[1].request("AP_SCAN 1")
361
362def test_ibss_open_retry(dev):
363    """IBSS open (no security) with cfg80211 retry workaround"""
364    subprocess.check_call(['iw', 'dev', dev[0].ifname, 'set', 'type', 'adhoc'])
365    subprocess.check_call(['iw', 'dev', dev[0].ifname, 'ibss', 'join',
366                           'ibss-test', '2412', 'HT20', 'fixed-freq',
367                           '02:22:33:44:55:66'])
368    ssid = "ibss"
369    try:
370        dev[0].request("AP_SCAN 2")
371        id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150",
372                      bssid="02:33:44:55:66:77", scan_freq=2412)
373        #connect_ibss_cmd(dev[0], id)
374        dev[0].request("REASSOCIATE")
375        bssid0 = wait_ibss_connection(dev[0])
376
377        subprocess.check_call(['iw', 'dev', dev[0].ifname, 'ibss', 'leave'])
378        time.sleep(1)
379        dev[0].request("DISCONNECT")
380    finally:
381        dev[0].request("AP_SCAN 1")
382
383def test_ibss_rsn_tkip(dev):
384    """IBSS RSN with TKIP as the cipher"""
385    skip_without_tkip(dev[0])
386    skip_without_tkip(dev[1])
387    ssid = "ibss-rsn-tkip"
388
389    id = add_ibss_rsn_tkip(dev[0], ssid)
390    connect_ibss_cmd(dev[0], id)
391    bssid0 = wait_ibss_connection(dev[0])
392
393    id = add_ibss_rsn_tkip(dev[1], ssid)
394    connect_ibss_cmd(dev[1], id)
395    bssid1 = wait_ibss_connection(dev[1])
396    if bssid0 != bssid1:
397        logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
398        # try to merge with a scan
399        dev[1].scan()
400    wait_4way_handshake(dev[0], dev[1])
401    wait_4way_handshake(dev[1], dev[0])
402
403def test_ibss_wep(dev):
404    """IBSS with WEP"""
405    check_wep_capa(dev[0])
406    check_wep_capa(dev[1])
407
408    ssid = "ibss-wep"
409
410    id = add_ibss(dev[0], ssid, key_mgmt="NONE", wep_key0='"hello"')
411    connect_ibss_cmd(dev[0], id)
412    bssid0 = wait_ibss_connection(dev[0])
413
414    id = add_ibss(dev[1], ssid, key_mgmt="NONE", wep_key0='"hello"')
415    connect_ibss_cmd(dev[1], id)
416    bssid1 = wait_ibss_connection(dev[1])
417
418@remote_compatible
419def test_ibss_rsn_error_case(dev):
420    """IBSS RSN regression test for IBSS_RSN prior IBSS setup"""
421    if "FAIL" not in dev[0].request("IBSS_RSN 02:03:04:05:06:07"):
422        raise Exception("Unexpected IBSS_RSN result")
423
424def test_ibss_5ghz(dev):
425    """IBSS on 5 GHz band"""
426    try:
427        _test_ibss_5ghz(dev)
428    finally:
429        subprocess.call(['iw', 'reg', 'set', '00'])
430        dev[0].flush_scan_cache()
431        dev[1].flush_scan_cache()
432
433def _test_ibss_5ghz(dev):
434    subprocess.call(['iw', 'reg', 'set', 'US'])
435    for i in range(2):
436        for j in range(5):
437            ev = dev[i].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=5)
438            if ev is None:
439                raise Exception("No regdom change event")
440            if "alpha2=US" in ev:
441                break
442        dev[i].dump_monitor()
443
444    ssid = "ibss"
445    id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150", freq=5180)
446    connect_ibss_cmd(dev[0], id, freq=5180)
447    bssid0 = wait_ibss_connection(dev[0])
448
449    dev[1].scan_for_bss(bssid0, freq=5180)
450    id = add_ibss(dev[1], ssid, key_mgmt="NONE", beacon_int="200", freq=5180)
451    connect_ibss_cmd(dev[1], id, freq=5180)
452    bssid1 = wait_ibss_connection(dev[1])
453    if bssid0 != bssid1:
454        logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
455
456    dev[0].request("DISCONNECT")
457    dev[1].request("DISCONNECT")
458    dev[0].dump_monitor()
459    dev[1].dump_monitor()
460
461def test_ibss_vht_80p80(dev):
462    """IBSS on VHT 80+80 MHz channel"""
463    try:
464        _test_ibss_vht_80p80(dev)
465    finally:
466        subprocess.call(['iw', 'reg', 'set', '00'])
467        dev[0].flush_scan_cache()
468        dev[1].flush_scan_cache()
469
470def _test_ibss_vht_80p80(dev):
471    subprocess.call(['iw', 'reg', 'set', 'US'])
472    for i in range(2):
473        for j in range(5):
474            ev = dev[i].wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=5)
475            if ev is None:
476                raise Exception("No regdom change event")
477            if "alpha2=US" in ev:
478                break
479        dev[i].dump_monitor()
480
481    ssid = "ibss"
482    id = add_ibss(dev[0], ssid, key_mgmt="NONE", freq=5180, chwidth=3)
483    connect_ibss_cmd(dev[0], id, freq=5180)
484    bssid0 = wait_ibss_connection(dev[0])
485    sig = dev[0].request("SIGNAL_POLL").splitlines()
486    if "FREQUENCY=5180" not in sig:
487        raise Exception("Unexpected SIGNAL_POLL value(1): " + str(sig))
488    if "WIDTH=80+80 MHz" not in sig:
489        raise Exception("Unexpected SIGNAL_POLL value(2): " + str(sig))
490    if "CENTER_FRQ1=5210" not in sig:
491        raise Exception("Unexpected SIGNAL_POLL value(3): " + str(sig))
492    if "CENTER_FRQ2=5775" not in sig:
493        raise Exception("Unexpected SIGNAL_POLL value(4): " + str(sig))
494
495    dev[1].scan_for_bss(bssid0, freq=5180)
496    id = add_ibss(dev[1], ssid, key_mgmt="NONE", freq=5180, chwidth=3)
497    connect_ibss_cmd(dev[1], id, freq=5180)
498    bssid1 = wait_ibss_connection(dev[1])
499    if bssid0 != bssid1:
500        logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
501
502    sig = dev[1].request("SIGNAL_POLL").splitlines()
503    if "FREQUENCY=5180" not in sig:
504        raise Exception("Unexpected SIGNAL_POLL value(1b): " + str(sig))
505    logger.info("STA1 SIGNAL_POLL: " + str(sig))
506    # For now, don't report errors on joining STA failing to get 80+80 MHZ
507    # since mac80211 missed functionality for that to work.
508
509    dev[0].request("DISCONNECT")
510    dev[1].request("DISCONNECT")
511    dev[0].dump_monitor()
512    dev[1].dump_monitor()
513
514def test_ibss_rsn_oom(dev):
515    """IBSS RSN OOM during wpa_init"""
516    with alloc_fail(dev[0], 1, "wpa_init"):
517        ssid = "ibss-rsn"
518        id = add_ibss_rsn(dev[0], ssid, scan_freq=2412)
519        connect_ibss_cmd(dev[0], id)
520        bssid0 = wait_ibss_connection(dev[0])
521    dev[0].request("REMOVE_NETWORK all")
522    dev[0].dump_monitor()
523
524    with alloc_fail(dev[0], 1, "=ibss_rsn_init"):
525        ssid = "ibss-rsn"
526        id = add_ibss_rsn(dev[0], ssid, scan_freq=2412)
527        connect_ibss_cmd(dev[0], id)
528        bssid0 = wait_ibss_connection(dev[0])
529    dev[0].request("REMOVE_NETWORK all")
530    dev[0].dump_monitor()
531
532def send_eapol_rx(dev, dst):
533    if "OK" not in dev.request("EAPOL_RX %s 0203005f02008a001000000000000000013a54fb19d8a785f5986bdc2ba800553550bc9513e6603eb50809154588c22b110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" % dst):
534        raise Exception("EAPOL_RX for %s failed" % dst)
535
536def test_ibss_rsn_eapol_trigger(dev):
537    """IBSS RSN and EAPOL trigger for a new peer"""
538    ssid = "ibss-rsn"
539
540    id = add_ibss_rsn(dev[0], ssid, scan_freq=2412)
541    connect_ibss_cmd(dev[0], id)
542    bssid0 = wait_ibss_connection(dev[0])
543
544    send_eapol_rx(dev[0], "02:ff:00:00:00:01")
545    send_eapol_rx(dev[0], "02:ff:00:00:00:01")
546
547    dst = "02:ff:00:00:00:01"
548    logger.info("Too short EAPOL frame")
549    if "OK" not in dev[0].request("EAPOL_RX %s 0203005e02008a001000000000000000013a54fb19d8a785f5986bdc2ba800553550bc9513e6603eb50809154588c22b1100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" % dst):
550        raise Exception("EAPOL_RX for %s failed" % dst)
551    logger.info("RSN: EAPOL frame (type 255) discarded, not a Key frame")
552    if "OK" not in dev[0].request("EAPOL_RX %s 02ff005f02008a001000000000000000013a54fb19d8a785f5986bdc2ba800553550bc9513e6603eb50809154588c22b110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" % dst):
553        raise Exception("EAPOL_RX for %s failed" % dst)
554    logger.info("RSN: EAPOL frame payload size 96 invalid (frame size 99)")
555    if "OK" not in dev[0].request("EAPOL_RX %s 0203006002008a001000000000000000013a54fb19d8a785f5986bdc2ba800553550bc9513e6603eb50809154588c22b110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" % dst):
556        raise Exception("EAPOL_RX for %s failed" % dst)
557    logger.info("RSN: EAPOL-Key type (255) unknown, discarded")
558    if "OK" not in dev[0].request("EAPOL_RX %s 0203005fff008a001000000000000000013a54fb19d8a785f5986bdc2ba800553550bc9513e6603eb50809154588c22b110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" % dst):
559        raise Exception("EAPOL_RX for %s failed" % dst)
560
561    with alloc_fail(dev[0], 1, "ibss_rsn_rx_eapol"):
562        send_eapol_rx(dev[0], "02:ff:00:00:00:02")
563        wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
564
565    with alloc_fail(dev[0], 1, "wpa_auth_sta_init;ibss_rsn_auth_init"):
566        send_eapol_rx(dev[0], "02:ff:00:00:00:03")
567        wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
568
569    with alloc_fail(dev[0], 1, "=ibss_rsn_peer_init"):
570        send_eapol_rx(dev[0], "02:ff:00:00:00:04")
571        wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
572
573    with alloc_fail(dev[0], 1, "ibss_rsn_process_rx_eapol"):
574        send_eapol_rx(dev[0], "02:ff:00:00:00:05")
575        wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
576
577    with alloc_fail(dev[0], 1,
578                    "wpa_sm_set_assoc_wpa_ie_default;ibss_rsn_supp_init"):
579        send_eapol_rx(dev[0], "02:ff:00:00:00:06")
580        wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
581
582    with alloc_fail(dev[0], 1, "wpa_sm_init;ibss_rsn_supp_init"):
583        send_eapol_rx(dev[0], "02:ff:00:00:00:07")
584        wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
585
586    with alloc_fail(dev[0], 1, "=ibss_rsn_supp_init"):
587        send_eapol_rx(dev[0], "02:ff:00:00:00:08")
588        wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
589
590    with alloc_fail(dev[0], 1, "supp_alloc_eapol"):
591        send_eapol_rx(dev[0], "02:ff:00:00:00:09")
592        wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
593
594    with alloc_fail(dev[0], 1, "wpa_validate_wpa_ie;ibss_rsn_auth_init"):
595        send_eapol_rx(dev[0], "02:ff:00:00:00:0a")
596        wait_fail_trigger(dev[0], "GET_ALLOC_FAIL")
597
598    logger.info("RSN: Timeout on waiting Authentication frame response")
599    if "OK" not in dev[0].request("IBSS_RSN 02:ff:00:00:00:0b"):
600        raise Exception("Unexpected IBSS_RSN result")
601    time.sleep(1.1)
602