]>
Commit | Line | Data |
---|---|---|
fdae3c40 JM |
1 | #!/usr/bin/python |
2 | # | |
3 | # IBSS test cases | |
4 | # Copyright (c) 2013, Jouni Malinen <j@w1.fi> | |
5 | # | |
6 | # This software may be distributed under the terms of the BSD license. | |
7 | # See README for more details. | |
8 | ||
9 | import logging | |
10 | logger = logging.getLogger(__name__) | |
11 | import time | |
dcfb4d65 | 12 | import re |
fdae3c40 JM |
13 | |
14 | import hwsim_utils | |
15 | ||
16 | def connect_ibss_cmd(dev, id): | |
17 | dev.dump_monitor() | |
18 | dev.select_network(id) | |
19 | ||
20 | def wait_ibss_connection(dev): | |
e5a39838 | 21 | logger.info(dev.ifname + " waiting for IBSS start/join to complete") |
fdae3c40 JM |
22 | ev = dev.wait_event(["CTRL-EVENT-CONNECTED"], timeout=20) |
23 | if ev is None: | |
24 | raise Exception("Connection to the IBSS timed out") | |
dcfb4d65 JM |
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] | |
e5a39838 JM |
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") | |
fdae3c40 | 37 | |
3d5b356a JM |
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 | ||
fdae3c40 JM |
51 | def add_ibss(dev, ssid, psk=None, proto=None, key_mgmt=None, pairwise=None, group=None): |
52 | id = dev.add_network() | |
53 | dev.set_network(id, "mode", "1") | |
54 | dev.set_network(id, "frequency", "2412") | |
55 | dev.set_network_quoted(id, "ssid", ssid) | |
56 | if psk: | |
57 | dev.set_network_quoted(id, "psk", psk) | |
58 | if proto: | |
59 | dev.set_network(id, "proto", proto) | |
60 | if key_mgmt: | |
61 | dev.set_network(id, "key_mgmt", key_mgmt) | |
62 | if pairwise: | |
63 | dev.set_network(id, "pairwise", pairwise) | |
64 | if group: | |
65 | dev.set_network(id, "group", group) | |
66 | return id | |
67 | ||
68 | def add_ibss_rsn(dev, ssid): | |
69 | return add_ibss(dev, ssid, "12345678", "RSN", "WPA-PSK", "CCMP", "CCMP") | |
70 | ||
71 | def test_ibss_rsn(dev): | |
72 | """IBSS RSN""" | |
73 | ssid="ibss-rsn" | |
74 | ||
75 | logger.info("Start IBSS on the first STA") | |
76 | id = add_ibss_rsn(dev[0], ssid) | |
77 | connect_ibss_cmd(dev[0], id) | |
dcfb4d65 | 78 | bssid0 = wait_ibss_connection(dev[0]) |
fdae3c40 JM |
79 | |
80 | logger.info("Join two STAs to the IBSS") | |
81 | ||
82 | id = add_ibss_rsn(dev[1], ssid) | |
83 | connect_ibss_cmd(dev[1], id) | |
dcfb4d65 JM |
84 | bssid1 = wait_ibss_connection(dev[1]) |
85 | if bssid0 != bssid1: | |
86 | logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1) | |
87 | # try to merge with a scan | |
88 | dev[1].scan() | |
e5a39838 JM |
89 | wait_4way_handshake(dev[0], dev[1]) |
90 | wait_4way_handshake(dev[1], dev[0]) | |
fdae3c40 JM |
91 | |
92 | id = add_ibss_rsn(dev[2], ssid) | |
93 | connect_ibss_cmd(dev[2], id) | |
dcfb4d65 JM |
94 | bssid2 = wait_ibss_connection(dev[2]) |
95 | if bssid0 != bssid2: | |
96 | logger.info("STA0 BSSID " + bssid0 + " differs from STA2 BSSID " + bssid2) | |
97 | # try to merge with a scan | |
98 | dev[2].scan() | |
e5a39838 | 99 | wait_4way_handshake(dev[0], dev[2]) |
3d5b356a | 100 | wait_4way_handshake2(dev[2], dev[0], dev[1]) |
fdae3c40 JM |
101 | |
102 | # Allow some time for all peers to complete key setup | |
103 | time.sleep(3) | |
104 | hwsim_utils.test_connectivity(dev[0].ifname, dev[1].ifname) | |
105 | hwsim_utils.test_connectivity(dev[0].ifname, dev[2].ifname) | |
fdae3c40 | 106 | hwsim_utils.test_connectivity(dev[1].ifname, dev[2].ifname) |