]> git.ipfire.org Git - thirdparty/hostap.git/blame - tests/hwsim/test_ibss.py
tests: Add wait_connected() and wait_disconnected() helpers
[thirdparty/hostap.git] / tests / hwsim / test_ibss.py
CommitLineData
fdae3c40
JM
1# IBSS test cases
2# Copyright (c) 2013, 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
7import logging
c9aa4308 8logger = logging.getLogger()
fdae3c40 9import time
dcfb4d65 10import re
fdae3c40
JM
11
12import hwsim_utils
13
14def connect_ibss_cmd(dev, id):
15 dev.dump_monitor()
ca4fd182 16 dev.select_network(id, freq="2412")
fdae3c40
JM
17
18def wait_ibss_connection(dev):
e5a39838 19 logger.info(dev.ifname + " waiting for IBSS start/join to complete")
5f35a5e2
JM
20 ev = dev.wait_connected(timeout=20,
21 error="Connection to the IBSS timed out")
dcfb4d65
JM
22 exp = r'<.>(CTRL-EVENT-CONNECTED) - Connection to ([0-9a-f:]*) completed.*'
23 s = re.split(exp, ev)
24 if len(s) < 3:
25 return None
26 return s[2]
e5a39838
JM
27
28def wait_4way_handshake(dev1, dev2):
29 logger.info(dev1.ifname + " waiting for 4-way handshake completion with " + dev2.ifname + " " + dev2.p2p_interface_addr())
30 ev = dev1.wait_event(["IBSS-RSN-COMPLETED " + dev2.p2p_interface_addr()],
31 timeout=20)
32 if ev is None:
33 raise Exception("4-way handshake in IBSS timed out")
fdae3c40 34
3d5b356a
JM
35def wait_4way_handshake2(dev1, dev2, dev3):
36 logger.info(dev1.ifname + " waiting for 4-way handshake completion with " + dev2.ifname + " " + dev2.p2p_interface_addr() + " and " + dev3.p2p_interface_addr())
37 ev = dev1.wait_event(["IBSS-RSN-COMPLETED " + dev2.p2p_interface_addr(),
38 "IBSS-RSN-COMPLETED " + dev3.p2p_interface_addr()],
39 timeout=20)
40 if ev is None:
41 raise Exception("4-way handshake in IBSS timed out")
42 ev = dev1.wait_event(["IBSS-RSN-COMPLETED " + dev2.p2p_interface_addr(),
43 "IBSS-RSN-COMPLETED " + dev3.p2p_interface_addr()],
44 timeout=20)
45 if ev is None:
46 raise Exception("4-way handshake in IBSS timed out")
47
ca38a309 48def add_ibss(dev, ssid, psk=None, proto=None, key_mgmt=None, pairwise=None, group=None, beacon_int=None, bssid=None):
fdae3c40
JM
49 id = dev.add_network()
50 dev.set_network(id, "mode", "1")
51 dev.set_network(id, "frequency", "2412")
52 dev.set_network_quoted(id, "ssid", ssid)
53 if psk:
54 dev.set_network_quoted(id, "psk", psk)
55 if proto:
56 dev.set_network(id, "proto", proto)
57 if key_mgmt:
58 dev.set_network(id, "key_mgmt", key_mgmt)
59 if pairwise:
60 dev.set_network(id, "pairwise", pairwise)
61 if group:
62 dev.set_network(id, "group", group)
13adbe23
JM
63 if beacon_int:
64 dev.set_network(id, "beacon_int", beacon_int)
ca38a309
JM
65 if bssid:
66 dev.set_network(id, "bssid", bssid)
67 dev.request("ENABLE_NETWORK " + str(id) + " no-connect")
fdae3c40
JM
68 return id
69
70def add_ibss_rsn(dev, ssid):
71 return add_ibss(dev, ssid, "12345678", "RSN", "WPA-PSK", "CCMP", "CCMP")
72
910d2ca7
JM
73def add_ibss_wpa_none(dev, ssid):
74 return add_ibss(dev, ssid, "12345678", "WPA", "WPA-NONE", "TKIP", "TKIP")
75
d65a90d7
JM
76def add_ibss_wpa_none_ccmp(dev, ssid):
77 return add_ibss(dev, ssid, "12345678", "WPA", "WPA-NONE", "CCMP", "CCMP")
78
fdae3c40
JM
79def test_ibss_rsn(dev):
80 """IBSS RSN"""
81 ssid="ibss-rsn"
82
83 logger.info("Start IBSS on the first STA")
84 id = add_ibss_rsn(dev[0], ssid)
85 connect_ibss_cmd(dev[0], id)
dcfb4d65 86 bssid0 = wait_ibss_connection(dev[0])
fdae3c40
JM
87
88 logger.info("Join two STAs to the IBSS")
89
90 id = add_ibss_rsn(dev[1], ssid)
91 connect_ibss_cmd(dev[1], id)
dcfb4d65
JM
92 bssid1 = wait_ibss_connection(dev[1])
93 if bssid0 != bssid1:
94 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
95 # try to merge with a scan
96 dev[1].scan()
e5a39838
JM
97 wait_4way_handshake(dev[0], dev[1])
98 wait_4way_handshake(dev[1], dev[0])
fdae3c40
JM
99
100 id = add_ibss_rsn(dev[2], ssid)
101 connect_ibss_cmd(dev[2], id)
dcfb4d65
JM
102 bssid2 = wait_ibss_connection(dev[2])
103 if bssid0 != bssid2:
104 logger.info("STA0 BSSID " + bssid0 + " differs from STA2 BSSID " + bssid2)
105 # try to merge with a scan
106 dev[2].scan()
e5a39838 107 wait_4way_handshake(dev[0], dev[2])
3d5b356a 108 wait_4way_handshake2(dev[2], dev[0], dev[1])
fdae3c40
JM
109
110 # Allow some time for all peers to complete key setup
111 time.sleep(3)
a8375c94
JM
112 hwsim_utils.test_connectivity(dev[0], dev[1])
113 hwsim_utils.test_connectivity(dev[0], dev[2])
114 hwsim_utils.test_connectivity(dev[1], dev[2])
910d2ca7 115
bba4616c
JM
116 dev[1].request("REMOVE_NETWORK all")
117 time.sleep(1)
118 id = add_ibss_rsn(dev[1], ssid)
119 connect_ibss_cmd(dev[1], id)
120 bssid1 = wait_ibss_connection(dev[1])
121 if bssid0 != bssid1:
122 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
123 # try to merge with a scan
124 dev[1].scan()
125 wait_4way_handshake(dev[0], dev[1])
126 wait_4way_handshake(dev[1], dev[0])
127 time.sleep(3)
a8375c94 128 hwsim_utils.test_connectivity(dev[0], dev[1])
bba4616c 129
ed685e43
JM
130 if "OK" not in dev[0].request("IBSS_RSN " + dev[1].p2p_interface_addr()):
131 raise Exception("IBSS_RSN command failed")
132
910d2ca7
JM
133def test_ibss_wpa_none(dev):
134 """IBSS WPA-None"""
135 ssid="ibss-wpa-none"
136
137 logger.info("Start IBSS on the first STA")
138 id = add_ibss_wpa_none(dev[0], ssid)
139 connect_ibss_cmd(dev[0], id)
140 bssid0 = wait_ibss_connection(dev[0])
141
910d2ca7
JM
142 # This is a bit ugly, but no one really cares about WPA-None, so there may
143 # not be enough justification to clean this up.. For now, wpa_supplicant
144 # will show two connection events with mac80211_hwsim where the first one
145 # comes with all zeros address.
146 if bssid0 == "00:00:00:00:00:00":
147 logger.info("Waiting for real BSSID on the first STA")
148 bssid0 = wait_ibss_connection(dev[0])
149
d65a90d7
JM
150 logger.info("Join two STAs to the IBSS")
151
152 id = add_ibss_wpa_none(dev[1], ssid)
153 connect_ibss_cmd(dev[1], id)
154 id = add_ibss_wpa_none(dev[2], ssid)
155 connect_ibss_cmd(dev[2], id)
156
910d2ca7
JM
157 bssid1 = wait_ibss_connection(dev[1])
158 if bssid0 != bssid1:
159 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
160 bssid1 = wait_ibss_connection(dev[1])
161
162 bssid2 = wait_ibss_connection(dev[2])
163 if bssid0 != bssid2:
164 logger.info("STA0 BSSID " + bssid0 + " differs from STA2 BSSID " + bssid2)
165 bssid2 = wait_ibss_connection(dev[2])
166
167 print bssid0
168 print bssid1
169 print bssid2
170
d463c556
JM
171 bss = dev[0].get_bss(bssid0)
172 if not bss:
173 bss = dev[1].get_bss(bssid1)
174 if not bss:
175 raise Exception("Could not find BSS entry for IBSS")
176 if 'flags' not in bss:
177 raise Exception("Could not get BSS flags from BSS table")
178 if "[WPA-None-TKIP]" not in bss['flags']:
179 raise Exception("Unexpected BSS flags: " + bss['flags'])
180
910d2ca7
JM
181 # Allow some time for all peers to complete key setup
182 time.sleep(1)
183
184 # This is supposed to work, but looks like WPA-None does not work with
185 # mac80211 currently..
186 try:
a8375c94 187 hwsim_utils.test_connectivity(dev[0], dev[1])
910d2ca7
JM
188 except Exception, e:
189 logger.info("Ignoring known connectivity failure: " + str(e))
190 try:
a8375c94 191 hwsim_utils.test_connectivity(dev[0], dev[2])
910d2ca7
JM
192 except Exception, e:
193 logger.info("Ignoring known connectivity failure: " + str(e))
194 try:
a8375c94 195 hwsim_utils.test_connectivity(dev[1], dev[2])
910d2ca7
JM
196 except Exception, e:
197 logger.info("Ignoring known connectivity failure: " + str(e))
13adbe23 198
d65a90d7
JM
199def test_ibss_wpa_none_ccmp(dev):
200 """IBSS WPA-None/CCMP"""
201 ssid="ibss-wpa-none"
202
203 logger.info("Start IBSS on the first STA")
204 id = add_ibss_wpa_none(dev[0], ssid)
205 connect_ibss_cmd(dev[0], id)
206 bssid0 = wait_ibss_connection(dev[0])
207
208 # This is a bit ugly, but no one really cares about WPA-None, so there may
209 # not be enough justification to clean this up.. For now, wpa_supplicant
210 # will show two connection events with mac80211_hwsim where the first one
211 # comes with all zeros address.
212 if bssid0 == "00:00:00:00:00:00":
213 logger.info("Waiting for real BSSID on the first STA")
214 bssid0 = wait_ibss_connection(dev[0])
215
216
217 logger.info("Join a STA to the IBSS")
218 id = add_ibss_wpa_none(dev[1], ssid)
219 connect_ibss_cmd(dev[1], id)
220
221 bssid1 = wait_ibss_connection(dev[1])
222 if bssid0 != bssid1:
223 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
224 bssid1 = wait_ibss_connection(dev[1])
225
226 print bssid0
227 print bssid1
228
229 # Allow some time for all peers to complete key setup
230 time.sleep(1)
231
232 # This is supposed to work, but looks like WPA-None does not work with
233 # mac80211 currently..
234 try:
a8375c94 235 hwsim_utils.test_connectivity(dev[0], dev[1])
d65a90d7
JM
236 except Exception, e:
237 logger.info("Ignoring known connectivity failure: " + str(e))
238
13adbe23
JM
239def test_ibss_open(dev):
240 """IBSS open (no security)"""
241 ssid="ibss"
242 id = add_ibss(dev[0], ssid, key_mgmt="NONE", beacon_int="150")
243 connect_ibss_cmd(dev[0], id)
244 bssid0 = wait_ibss_connection(dev[0])
245
246 id = add_ibss(dev[1], ssid, key_mgmt="NONE", beacon_int="200")
247 connect_ibss_cmd(dev[1], id)
248 bssid1 = wait_ibss_connection(dev[1])
249 if bssid0 != bssid1:
250 logger.info("STA0 BSSID " + bssid0 + " differs from STA1 BSSID " + bssid1)
ca38a309 251
d463c556
JM
252 res = dev[0].request("SCAN_RESULTS")
253 if "[IBSS]" not in res:
254 res = dev[1].request("SCAN_RESULTS")
255 if "[IBSS]" not in res:
256 raise Exception("IBSS flag missing from scan results: " + res)
257 bss = dev[0].get_bss(bssid0)
258 if not bss:
259 bss = dev[1].get_bss(bssid1)
260 if not bss:
261 raise Exception("Could not find BSS entry for IBSS")
262 if 'flags' not in bss:
263 raise Exception("Could not get BSS flags from BSS table")
264 if "[IBSS]" not in bss['flags']:
265 raise Exception("Unexpected BSS flags: " + bss['flags'])
266
ca38a309
JM
267def test_ibss_open_fixed_bssid(dev):
268 """IBSS open (no security) and fixed BSSID"""
269 ssid="ibss"
270 bssid="02:11:22:33:44:55"
271 try:
272 dev[0].request("AP_SCAN 2")
273 add_ibss(dev[0], ssid, key_mgmt="NONE", bssid=bssid, beacon_int="150")
274 dev[0].request("REASSOCIATE")
275
276 dev[1].request("AP_SCAN 2")
277 add_ibss(dev[1], ssid, key_mgmt="NONE", bssid=bssid, beacon_int="200")
278 dev[1].request("REASSOCIATE")
279
280 bssid0 = wait_ibss_connection(dev[0])
281 bssid1 = wait_ibss_connection(dev[1])
282 if bssid0 != bssid:
283 raise Exception("STA0 BSSID " + bssid0 + " differs from fixed BSSID " + bssid)
284 if bssid1 != bssid:
285 raise Exception("STA0 BSSID " + bssid0 + " differs from fixed BSSID " + bssid)
286 finally:
287 dev[0].request("AP_SCAN 1")
288 dev[1].request("AP_SCAN 1")