]> git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_wpas_ctrl.py
tests: Read monitor events explicitly in wpas_ctrl_interface_add_many
[thirdparty/hostap.git] / tests / hwsim / test_wpas_ctrl.py
1 # wpa_supplicant control interface
2 # Copyright (c) 2014, Qualcomm Atheros, Inc.
3 #
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
6
7 import logging
8 logger = logging.getLogger()
9 import os
10 import socket
11 import subprocess
12 import time
13
14 import hostapd
15 import hwsim_utils
16 from hwsim import HWSimRadio
17 from wpasupplicant import WpaSupplicant
18 from utils import alloc_fail
19
20 def test_wpas_ctrl_network(dev):
21 """wpa_supplicant ctrl_iface network set/get"""
22 id = dev[0].add_network()
23
24 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id)):
25 raise Exception("Unexpected success for invalid SET_NETWORK")
26 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " name"):
27 raise Exception("Unexpected success for invalid SET_NETWORK")
28 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id + 1) + " proto OPEN"):
29 raise Exception("Unexpected success for invalid network id")
30 if "FAIL" not in dev[0].request("GET_NETWORK " + str(id)):
31 raise Exception("Unexpected success for invalid GET_NETWORK")
32 if "FAIL" not in dev[0].request("GET_NETWORK " + str(id + 1) + " proto"):
33 raise Exception("Unexpected success for invalid network id")
34
35 tests = (("key_mgmt", "WPA-PSK WPA-EAP IEEE8021X NONE WPA-NONE FT-PSK FT-EAP WPA-PSK-SHA256 WPA-EAP-SHA256"),
36 ("pairwise", "CCMP-256 GCMP-256 CCMP GCMP TKIP"),
37 ("group", "CCMP-256 GCMP-256 CCMP GCMP TKIP"),
38 ("auth_alg", "OPEN SHARED LEAP"),
39 ("scan_freq", "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15"),
40 ("freq_list", "2412 2417"),
41 ("scan_ssid", "1"),
42 ("bssid", "00:11:22:33:44:55"),
43 ("proto", "WPA RSN OSEN"),
44 ("eap", "TLS"),
45 ("go_p2p_dev_addr", "22:33:44:55:66:aa"),
46 ("p2p_client_list", "22:33:44:55:66:bb 02:11:22:33:44:55"))
47
48 dev[0].set_network_quoted(id, "ssid", "test")
49 for field, value in tests:
50 dev[0].set_network(id, field, value)
51 res = dev[0].get_network(id, field)
52 if res != value:
53 raise Exception("Unexpected response for '" + field + "': '" + res + "'")
54
55 q_tests = (("identity", "hello"),
56 ("anonymous_identity", "foo@nowhere.com"))
57 for field, value in q_tests:
58 dev[0].set_network_quoted(id, field, value)
59 res = dev[0].get_network(id, field)
60 if res != '"' + value + '"':
61 raise Exception("Unexpected quoted response for '" + field + "': '" + res + "'")
62
63 get_tests = (("foo", None), ("ssid", '"test"'))
64 for field, value in get_tests:
65 res = dev[0].get_network(id, field)
66 if res != value:
67 raise Exception("Unexpected response for '" + field + "': '" + res + "'")
68
69 if dev[0].get_network(id, "password"):
70 raise Exception("Unexpected response for 'password'")
71 dev[0].set_network_quoted(id, "password", "foo")
72 if dev[0].get_network(id, "password") != '*':
73 raise Exception("Unexpected response for 'password' (expected *)")
74 dev[0].set_network(id, "password", "hash:12345678901234567890123456789012")
75 if dev[0].get_network(id, "password") != '*':
76 raise Exception("Unexpected response for 'password' (expected *)")
77 dev[0].set_network(id, "password", "NULL")
78 if dev[0].get_network(id, "password"):
79 raise Exception("Unexpected response for 'password'")
80 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " password hash:12"):
81 raise Exception("Unexpected success for invalid password hash")
82 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " password hash:123456789012345678x0123456789012"):
83 raise Exception("Unexpected success for invalid password hash")
84
85 dev[0].set_network(id, "identity", "414243")
86 if dev[0].get_network(id, "identity") != '"ABC"':
87 raise Exception("Unexpected identity hex->text response")
88
89 dev[0].set_network(id, "identity", 'P"abc\ndef"')
90 if dev[0].get_network(id, "identity") != "6162630a646566":
91 raise Exception("Unexpected identity printf->hex response")
92
93 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' identity P"foo'):
94 raise Exception("Unexpected success for invalid identity string")
95
96 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' identity 12x3'):
97 raise Exception("Unexpected success for invalid identity string")
98
99 for i in range(0, 4):
100 if "FAIL" in dev[0].request("SET_NETWORK " + str(id) + ' wep_key' + str(i) + ' aabbccddee'):
101 raise Exception("Unexpected wep_key set failure")
102 if dev[0].get_network(id, "wep_key" + str(i)) != '*':
103 raise Exception("Unexpected wep_key get failure")
104
105 if "FAIL" in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
106 raise Exception("Unexpected failure for psk_list string")
107
108 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list 00:11:x2:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
109 raise Exception("Unexpected success for invalid psk_list string")
110
111 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:x2:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
112 raise Exception("Unexpected success for invalid psk_list string")
113
114 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55+0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
115 raise Exception("Unexpected success for invalid psk_list string")
116
117 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde'):
118 raise Exception("Unexpected success for invalid psk_list string")
119
120 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdex'):
121 raise Exception("Unexpected success for invalid psk_list string")
122
123 if dev[0].get_network(id, "psk_list"):
124 raise Exception("Unexpected psk_list get response")
125
126 if dev[0].list_networks()[0]['ssid'] != "test":
127 raise Exception("Unexpected ssid in LIST_NETWORKS")
128 dev[0].set_network(id, "ssid", "NULL")
129 if dev[0].list_networks()[0]['ssid'] != "":
130 raise Exception("Unexpected ssid in LIST_NETWORKS after clearing it")
131
132 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' ssid "0123456789abcdef0123456789abcdef0"'):
133 raise Exception("Too long SSID accepted")
134 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' scan_ssid qwerty'):
135 raise Exception("Invalid integer accepted")
136 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' scan_ssid 2'):
137 raise Exception("Too large integer accepted")
138 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk 12345678'):
139 raise Exception("Invalid PSK accepted")
140 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk "1234567"'):
141 raise Exception("Too short PSK accepted")
142 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk "1234567890123456789012345678901234567890123456789012345678901234"'):
143 raise Exception("Too long PSK accepted")
144 dev[0].set_network_quoted(id, "psk", "123456768");
145 dev[0].set_network_quoted(id, "psk", "123456789012345678901234567890123456789012345678901234567890123");
146 if dev[0].get_network(id, "psk") != '*':
147 raise Exception("Unexpected psk read result");
148
149 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' eap UNKNOWN'):
150 raise Exception("Unknown EAP method accepted")
151
152 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' password "foo'):
153 raise Exception("Invalid password accepted")
154
155 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' wep_key0 "foo'):
156 raise Exception("Invalid WEP key accepted")
157 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' wep_key0 "12345678901234567"'):
158 raise Exception("Too long WEP key accepted")
159 # too short WEP key is ignored
160 dev[0].set_network_quoted(id, "wep_key0", "1234")
161 dev[0].set_network_quoted(id, "wep_key1", "12345")
162 dev[0].set_network_quoted(id, "wep_key2", "1234567890123")
163 dev[0].set_network_quoted(id, "wep_key3", "1234567890123456")
164
165 dev[0].set_network(id, "go_p2p_dev_addr", "any")
166 if dev[0].get_network(id, "go_p2p_dev_addr") is not None:
167 raise Exception("Unexpected go_p2p_dev_addr value")
168 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' go_p2p_dev_addr 00:11:22:33:44'):
169 raise Exception("Invalid go_p2p_dev_addr accepted")
170 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' p2p_client_list 00:11:22:33:44'):
171 raise Exception("Invalid p2p_client_list accepted")
172 if "FAIL" in dev[0].request('SET_NETWORK ' + str(id) + ' p2p_client_list 00:11:22:33:44:55 00:1'):
173 raise Exception("p2p_client_list truncation workaround failed")
174 if dev[0].get_network(id, "p2p_client_list") != "00:11:22:33:44:55":
175 raise Exception("p2p_client_list truncation workaround did not work")
176
177 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' auth_alg '):
178 raise Exception("Empty auth_alg accepted")
179 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' auth_alg FOO'):
180 raise Exception("Invalid auth_alg accepted")
181
182 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' proto '):
183 raise Exception("Empty proto accepted")
184 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' proto FOO'):
185 raise Exception("Invalid proto accepted")
186
187 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise '):
188 raise Exception("Empty pairwise accepted")
189 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise FOO'):
190 raise Exception("Invalid pairwise accepted")
191 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise WEP40'):
192 raise Exception("Invalid pairwise accepted")
193
194 if "OK" not in dev[0].request('BSSID ' + str(id) + ' 00:11:22:33:44:55'):
195 raise Exception("Unexpected BSSID failure")
196 if dev[0].request("GET_NETWORK 0 bssid") != '00:11:22:33:44:55':
197 raise Exception("BSSID command did not set network bssid")
198 if "OK" not in dev[0].request('BSSID ' + str(id) + ' 00:00:00:00:00:00'):
199 raise Exception("Unexpected BSSID failure")
200 if "FAIL" not in dev[0].request("GET_NETWORK 0 bssid"):
201 raise Exception("bssid claimed configured after clearing")
202 if "FAIL" not in dev[0].request('BSSID 123 00:11:22:33:44:55'):
203 raise Exception("Unexpected BSSID success")
204 if "FAIL" not in dev[0].request('BSSID ' + str(id) + ' 00:11:22:33:44'):
205 raise Exception("Unexpected BSSID success")
206 if "FAIL" not in dev[0].request('BSSID ' + str(id)):
207 raise Exception("Unexpected BSSID success")
208
209 tests = [ "02:11:22:33:44:55",
210 "02:11:22:33:44:55 02:ae:be:ce:53:77",
211 "02:11:22:33:44:55/ff:00:ff:00:ff:00",
212 "02:11:22:33:44:55/ff:00:ff:00:ff:00 f2:99:88:77:66:55",
213 "f2:99:88:77:66:55 02:11:22:33:44:55/ff:00:ff:00:ff:00",
214 "f2:99:88:77:66:55 02:11:22:33:44:55/ff:00:ff:00:ff:00 12:34:56:78:90:ab",
215 "02:11:22:33:44:55/ff:ff:ff:00:00:00 02:ae:be:ce:53:77/00:00:00:00:00:ff" ]
216 for val in tests:
217 dev[0].set_network(id, "bssid_blacklist", val)
218 res = dev[0].get_network(id, "bssid_blacklist")
219 if res != val:
220 raise Exception("Unexpected bssid_blacklist value: %s != %s" % (res, val))
221 dev[0].set_network(id, "bssid_whitelist", val)
222 res = dev[0].get_network(id, "bssid_whitelist")
223 if res != val:
224 raise Exception("Unexpected bssid_whitelist value: %s != %s" % (res, val))
225
226 tests = [ "foo",
227 "00:11:22:33:44:5",
228 "00:11:22:33:44:55q",
229 "00:11:22:33:44:55/",
230 "00:11:22:33:44:55/66:77:88:99:aa:b" ]
231 for val in tests:
232 if "FAIL" not in dev[0].request("SET_NETWORK %d bssid_blacklist %s" % (id, val)):
233 raise Exception("Invalid bssid_blacklist value accepted")
234
235 def test_wpas_ctrl_network_oom(dev):
236 """wpa_supplicant ctrl_iface network OOM in string parsing"""
237 id = dev[0].add_network()
238
239 tests = [ ('"foo"', 1, 'dup_binstr;wpa_config_set'),
240 ('P"foo"', 1, 'dup_binstr;wpa_config_set'),
241 ('P"foo"', 2, 'wpa_config_set'),
242 ('112233', 1, 'wpa_config_set') ]
243 for val,count,func in tests:
244 with alloc_fail(dev[0], count, func):
245 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' ssid ' + val):
246 raise Exception("Unexpected success for SET_NETWORK during OOM")
247
248 def test_wpas_ctrl_many_networks(dev, apdev):
249 """wpa_supplicant ctrl_iface LIST_NETWORKS with huge number of networks"""
250 for i in range(1000):
251 id = dev[0].add_network()
252 res = dev[0].request("LIST_NETWORKS")
253 if str(id) in res:
254 raise Exception("Last added network was unexpectedly included")
255 res = dev[0].request("LIST_NETWORKS LAST_ID=%d" % (id - 2))
256 if str(id) not in res:
257 raise Exception("Last added network was not present when using LAST_ID")
258 # This command can take a very long time under valgrind testing on a low
259 # power CPU, so increase the command timeout significantly to avoid issues
260 # with the test case failing and following reset operation timing out.
261 dev[0].request("REMOVE_NETWORK all", timeout=60)
262
263 def test_wpas_ctrl_dup_network(dev, apdev):
264 """wpa_supplicant ctrl_iface DUP_NETWORK"""
265 ssid = "target"
266 passphrase = 'qwertyuiop'
267 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
268 hostapd.add_ap(apdev[0]['ifname'], params)
269
270 src = dev[0].connect("another", psk=passphrase, scan_freq="2412",
271 only_add_network=True)
272 id = dev[0].add_network()
273 dev[0].set_network_quoted(id, "ssid", ssid)
274 for f in [ "key_mgmt", "psk", "scan_freq" ]:
275 res = dev[0].request("DUP_NETWORK {} {} {}".format(src, id, f))
276 if "OK" not in res:
277 raise Exception("DUP_NETWORK failed")
278 dev[0].connect_network(id)
279
280 if "FAIL" not in dev[0].request("DUP_NETWORK "):
281 raise Exception("Unexpected DUP_NETWORK success")
282 if "FAIL" not in dev[0].request("DUP_NETWORK %d " % id):
283 raise Exception("Unexpected DUP_NETWORK success")
284 if "FAIL" not in dev[0].request("DUP_NETWORK %d %d" % (id, id)):
285 raise Exception("Unexpected DUP_NETWORK success")
286 if "FAIL" not in dev[0].request("DUP_NETWORK 123456 1234567 "):
287 raise Exception("Unexpected DUP_NETWORK success")
288 if "FAIL" not in dev[0].request("DUP_NETWORK %d 123456 " % id):
289 raise Exception("Unexpected DUP_NETWORK success")
290 if "FAIL" not in dev[0].request("DUP_NETWORK %d %d foo" % (id, id)):
291 raise Exception("Unexpected DUP_NETWORK success")
292 dev[0].request("DISCONNECT")
293 if "OK" not in dev[0].request("DUP_NETWORK %d %d ssid" % (id, id)):
294 raise Exception("Unexpected DUP_NETWORK failure")
295
296 def test_wpas_ctrl_dup_network_global(dev, apdev):
297 """wpa_supplicant ctrl_iface DUP_NETWORK (global)"""
298 ssid = "target"
299 passphrase = 'qwertyuiop'
300 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
301 hostapd.add_ap(apdev[0]['ifname'], params)
302
303 src = dev[0].connect("another", psk=passphrase, scan_freq="2412",
304 only_add_network=True)
305 id = dev[0].add_network()
306 dev[0].set_network_quoted(id, "ssid", ssid)
307 for f in [ "key_mgmt", "psk", "scan_freq" ]:
308 res = dev[0].global_request("DUP_NETWORK {} {} {} {} {}".format(dev[0].ifname, dev[0].ifname, src, id, f))
309 if "OK" not in res:
310 raise Exception("DUP_NETWORK failed")
311 dev[0].connect_network(id)
312
313 if "FAIL" not in dev[0].global_request("DUP_NETWORK "):
314 raise Exception("Unexpected DUP_NETWORK success")
315 if "FAIL" not in dev[0].global_request("DUP_NETWORK %s" % dev[0].ifname):
316 raise Exception("Unexpected DUP_NETWORK success")
317 if "FAIL" not in dev[0].global_request("DUP_NETWORK %s %s" % (dev[0].ifname, dev[0].ifname)):
318 raise Exception("Unexpected DUP_NETWORK success")
319 if "FAIL" not in dev[0].global_request("DUP_NETWORK %s %s %d" % (dev[0].ifname, dev[0].ifname, id)):
320 raise Exception("Unexpected DUP_NETWORK success")
321 if "FAIL" not in dev[0].global_request("DUP_NETWORK %s %s %d %d" % (dev[0].ifname, dev[0].ifname, id, id)):
322 raise Exception("Unexpected DUP_NETWORK success")
323 dev[0].request("DISCONNECT")
324 if "OK" not in dev[0].global_request("DUP_NETWORK %s %s %d %d ssid" % (dev[0].ifname, dev[0].ifname, id, id)):
325 raise Exception("Unexpected DUP_NETWORK failure")
326
327 def add_cred(dev):
328 id = dev.add_cred()
329 ev = dev.wait_event(["CRED-ADDED"])
330 if ev is None:
331 raise Exception("Missing CRED-ADDED event")
332 if " " + str(id) not in ev:
333 raise Exception("CRED-ADDED event without matching id")
334 return id
335
336 def set_cred(dev, id, field, value):
337 dev.set_cred(id, field, value)
338 ev = dev.wait_event(["CRED-MODIFIED"])
339 if ev is None:
340 raise Exception("Missing CRED-MODIFIED event")
341 if " " + str(id) + " " not in ev:
342 raise Exception("CRED-MODIFIED event without matching id")
343 if field not in ev:
344 raise Exception("CRED-MODIFIED event without matching field")
345
346 def set_cred_quoted(dev, id, field, value):
347 dev.set_cred_quoted(id, field, value)
348 ev = dev.wait_event(["CRED-MODIFIED"])
349 if ev is None:
350 raise Exception("Missing CRED-MODIFIED event")
351 if " " + str(id) + " " not in ev:
352 raise Exception("CRED-MODIFIED event without matching id")
353 if field not in ev:
354 raise Exception("CRED-MODIFIED event without matching field")
355
356 def remove_cred(dev, id):
357 dev.remove_cred(id)
358 ev = dev.wait_event(["CRED-REMOVED"])
359 if ev is None:
360 raise Exception("Missing CRED-REMOVED event")
361 if " " + str(id) not in ev:
362 raise Exception("CRED-REMOVED event without matching id")
363
364 def test_wpas_ctrl_cred(dev):
365 """wpa_supplicant ctrl_iface cred set"""
366 id1 = add_cred(dev[0])
367 if "FAIL" not in dev[0].request("SET_CRED " + str(id1 + 1) + " temporary 1"):
368 raise Exception("SET_CRED succeeded unexpectedly on unknown cred id")
369 if "FAIL" not in dev[0].request("SET_CRED " + str(id1)):
370 raise Exception("Invalid SET_CRED succeeded unexpectedly")
371 if "FAIL" not in dev[0].request("SET_CRED " + str(id1) + " temporary"):
372 raise Exception("Invalid SET_CRED succeeded unexpectedly")
373 if "FAIL" not in dev[0].request("GET_CRED " + str(id1 + 1) + " temporary"):
374 raise Exception("GET_CRED succeeded unexpectedly on unknown cred id")
375 if "FAIL" not in dev[0].request("GET_CRED " + str(id1)):
376 raise Exception("Invalid GET_CRED succeeded unexpectedly")
377 if "FAIL" not in dev[0].request("GET_CRED " + str(id1) + " foo"):
378 raise Exception("Invalid GET_CRED succeeded unexpectedly")
379 id = add_cred(dev[0])
380 id2 = add_cred(dev[0])
381 set_cred(dev[0], id, "temporary", "1")
382 set_cred(dev[0], id, "priority", "1")
383 set_cred(dev[0], id, "pcsc", "1")
384 set_cred_quoted(dev[0], id, "private_key_passwd", "test")
385 set_cred_quoted(dev[0], id, "domain_suffix_match", "test")
386 set_cred_quoted(dev[0], id, "phase1", "test")
387 set_cred_quoted(dev[0], id, "phase2", "test")
388
389 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " eap FOO"):
390 raise Exception("Unexpected success on unknown EAP method")
391
392 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " username 12xa"):
393 raise Exception("Unexpected success on invalid string")
394
395 for i in ("11", "1122", "112233445566778899aabbccddeeff00"):
396 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " roaming_consortium " + i):
397 raise Exception("Unexpected success on invalid roaming_consortium")
398
399 dev[0].set_cred(id, "excluded_ssid", "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff")
400 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " excluded_ssid 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00"):
401 raise Exception("Unexpected success on invalid excluded_ssid")
402
403 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " foo 4142"):
404 raise Exception("Unexpected success on unknown field")
405
406 id3 = add_cred(dev[0])
407 id4 = add_cred(dev[0])
408 if len(dev[0].request("LIST_CREDS").splitlines()) != 6:
409 raise Exception("Unexpected LIST_CREDS result(1)")
410
411 remove_cred(dev[0], id1)
412 remove_cred(dev[0], id3)
413 remove_cred(dev[0], id4)
414 remove_cred(dev[0], id2)
415 remove_cred(dev[0], id)
416 if "FAIL" not in dev[0].request("REMOVE_CRED 1"):
417 raise Exception("Unexpected success on invalid remove cred")
418 if len(dev[0].request("LIST_CREDS").splitlines()) != 1:
419 raise Exception("Unexpected LIST_CREDS result(2)")
420
421 id = add_cred(dev[0])
422 values = [ ("temporary", "1", False),
423 ("temporary", "0", False),
424 ("pcsc", "1", False),
425 ("realm", "example.com", True),
426 ("username", "user@example.com", True),
427 ("password", "foo", True, "*"),
428 ("ca_cert", "ca.pem", True),
429 ("client_cert", "user.pem", True),
430 ("private_key", "key.pem", True),
431 ("private_key_passwd", "foo", True, "*"),
432 ("imsi", "310026-000000000", True),
433 ("milenage", "foo", True, "*"),
434 ("domain_suffix_match", "example.com", True),
435 ("domain", "example.com", True),
436 ("domain", "example.org", True, "example.com\nexample.org"),
437 ("roaming_consortium", "0123456789", False),
438 ("required_roaming_consortium", "456789", False),
439 ("eap", "TTLS", False),
440 ("phase1", "foo=bar1", True),
441 ("phase2", "foo=bar2", True),
442 ("excluded_ssid", "test", True),
443 ("excluded_ssid", "foo", True, "test\nfoo"),
444 ("roaming_partner", "example.com,0,4,*", True),
445 ("roaming_partner", "example.org,1,2,US", True,
446 "example.com,0,4,*\nexample.org,1,2,US"),
447 ("update_identifier", "4", False),
448 ("provisioning_sp", "sp.example.com", True),
449 ("sp_priority", "7", False),
450 ("min_dl_bandwidth_home", "100", False),
451 ("min_ul_bandwidth_home", "101", False),
452 ("min_dl_bandwidth_roaming", "102", False),
453 ("min_ul_bandwidth_roaming", "103", False),
454 ("max_bss_load", "57", False),
455 ("req_conn_capab", "6:22,80,443", False),
456 ("req_conn_capab", "17:500", False, "6:22,80,443\n17:500"),
457 ("req_conn_capab", "50", False, "6:22,80,443\n17:500\n50"),
458 ("ocsp", "1", False) ]
459 for v in values:
460 if v[2]:
461 set_cred_quoted(dev[0], id, v[0], v[1])
462 else:
463 set_cred(dev[0], id, v[0], v[1])
464 val = dev[0].get_cred(id, v[0])
465 if len(v) == 4:
466 expect = v[3]
467 else:
468 expect = v[1]
469 if val != expect:
470 raise Exception("Unexpected GET_CRED value for {}: {} != {}".format(v[0], val, expect))
471 creds = dev[0].request("LIST_CREDS").splitlines()
472 if len(creds) != 2:
473 raise Exception("Unexpected LIST_CREDS result(3)")
474 if creds[1] != "0\texample.com\tuser@example.com\texample.com\t310026-000000000":
475 raise Exception("Unexpected LIST_CREDS value")
476 remove_cred(dev[0], id)
477 if len(dev[0].request("LIST_CREDS").splitlines()) != 1:
478 raise Exception("Unexpected LIST_CREDS result(4)")
479
480 id = add_cred(dev[0])
481 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
482 id = add_cred(dev[0])
483 set_cred_quoted(dev[0], id, "domain", "bar.example.com")
484 id = add_cred(dev[0])
485 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
486 if "OK" not in dev[0].request("REMOVE_CRED sp_fqdn=foo.example.com"):
487 raise Exception("REMOVE_CRED failed")
488 creds = dev[0].request("LIST_CREDS")
489 if "foo.example.com" in creds:
490 raise Exception("REMOVE_CRED sp_fqdn did not remove cred")
491 if "bar.example.com" not in creds:
492 raise Exception("REMOVE_CRED sp_fqdn removed incorrect cred")
493 dev[0].request("REMOVE_CRED all")
494
495 id = add_cred(dev[0])
496 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
497 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.foo.example.com")
498 id = add_cred(dev[0])
499 set_cred_quoted(dev[0], id, "domain", "bar.example.com")
500 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.bar.example.com")
501 id = add_cred(dev[0])
502 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
503 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.foo.example.com")
504 if "OK" not in dev[0].request("REMOVE_CRED provisioning_sp=sp.foo.example.com"):
505 raise Exception("REMOVE_CRED failed")
506 creds = dev[0].request("LIST_CREDS")
507 if "foo.example.com" in creds:
508 raise Exception("REMOVE_CRED provisioning_sp did not remove cred")
509 if "bar.example.com" not in creds:
510 raise Exception("REMOVE_CRED provisioning_sp removed incorrect cred")
511 dev[0].request("REMOVE_CRED all")
512
513 # Test large number of creds and LIST_CREDS truncation
514 dev[0].dump_monitor()
515 for i in range(0, 100):
516 id = add_cred(dev[0])
517 set_cred_quoted(dev[0], id, "realm", "relatively.long.realm.test%d.example.com" % i)
518 dev[0].dump_monitor()
519 creds = dev[0].request("LIST_CREDS")
520 for i in range(0, 100):
521 dev[0].remove_cred(i)
522 dev[0].dump_monitor()
523 if len(creds) < 3900 or len(creds) > 4100:
524 raise Exception("Unexpected LIST_CREDS length: %d" % len(creds))
525 if "test10.example.com" not in creds:
526 raise Exception("Missing credential")
527 if len(creds.splitlines()) > 95:
528 raise Exception("Too many LIST_CREDS entries in the buffer")
529
530 def test_wpas_ctrl_pno(dev):
531 """wpa_supplicant ctrl_iface pno"""
532 if "FAIL" not in dev[0].request("SET pno 1"):
533 raise Exception("Unexpected success in enabling PNO without enabled network blocks")
534 id = dev[0].add_network()
535 dev[0].set_network_quoted(id, "ssid", "test")
536 dev[0].set_network(id, "key_mgmt", "NONE")
537 dev[0].request("ENABLE_NETWORK " + str(id) + " no-connect")
538 #mac80211_hwsim does not yet support PNO, so this fails
539 if "FAIL" not in dev[0].request("SET pno 1"):
540 raise Exception("Unexpected success in enabling PNO")
541 if "FAIL" not in dev[0].request("SET pno 1 freq=2000-3000,5180"):
542 raise Exception("Unexpected success in enabling PNO")
543 if "FAIL" not in dev[0].request("SET pno 1 freq=0-6000"):
544 raise Exception("Unexpected success in enabling PNO")
545 if "FAIL" in dev[0].request("SET pno 0"):
546 raise Exception("Unexpected failure in disabling PNO")
547
548 def test_wpas_ctrl_get(dev):
549 """wpa_supplicant ctrl_iface get"""
550 if "FAIL" in dev[0].request("GET version"):
551 raise Exception("Unexpected get failure for version")
552 if "FAIL" in dev[0].request("GET wifi_display"):
553 raise Exception("Unexpected get failure for wifi_display")
554 if "FAIL" not in dev[0].request("GET foo"):
555 raise Exception("Unexpected success on get command")
556
557 def test_wpas_ctrl_preauth(dev):
558 """wpa_supplicant ctrl_iface preauth"""
559 if "FAIL" not in dev[0].request("PREAUTH "):
560 raise Exception("Unexpected success on invalid PREAUTH")
561 if "FAIL" in dev[0].request("PREAUTH 00:11:22:33:44:55"):
562 raise Exception("Unexpected failure on PREAUTH")
563
564 def test_wpas_ctrl_stkstart(dev):
565 """wpa_supplicant ctrl_iface strkstart"""
566 if "FAIL" not in dev[0].request("STKSTART "):
567 raise Exception("Unexpected success on invalid STKSTART")
568 if "FAIL" not in dev[0].request("STKSTART 00:11:22:33:44:55"):
569 raise Exception("Unexpected success on STKSTART")
570
571 def test_wpas_ctrl_tdls_discover(dev):
572 """wpa_supplicant ctrl_iface tdls_discover"""
573 if "FAIL" not in dev[0].request("TDLS_DISCOVER "):
574 raise Exception("Unexpected success on invalid TDLS_DISCOVER")
575 if "FAIL" not in dev[0].request("TDLS_DISCOVER 00:11:22:33:44:55"):
576 raise Exception("Unexpected success on TDLS_DISCOVER")
577
578 def test_wpas_ctrl_tdls_chan_switch(dev):
579 """wpa_supplicant ctrl_iface tdls_chan_switch error cases"""
580 for args in [ '', '00:11:22:33:44:55' ]:
581 if "FAIL" not in dev[0].request("TDLS_CANCEL_CHAN_SWITCH " + args):
582 raise Exception("Unexpected success on invalid TDLS_CANCEL_CHAN_SWITCH: " + args)
583
584 for args in [ '', 'foo ', '00:11:22:33:44:55 ', '00:11:22:33:44:55 q',
585 '00:11:22:33:44:55 81', '00:11:22:33:44:55 81 1234',
586 '00:11:22:33:44:55 81 1234 center_freq1=234 center_freq2=345 bandwidth=456 sec_channel_offset=567 ht vht' ]:
587 if "FAIL" not in dev[0].request("TDLS_CHAN_SWITCH " + args):
588 raise Exception("Unexpected success on invalid TDLS_CHAN_SWITCH: " + args)
589
590 def test_wpas_ctrl_addr(dev):
591 """wpa_supplicant ctrl_iface invalid address"""
592 if "FAIL" not in dev[0].request("TDLS_SETUP "):
593 raise Exception("Unexpected success on invalid TDLS_SETUP")
594 if "FAIL" not in dev[0].request("TDLS_TEARDOWN "):
595 raise Exception("Unexpected success on invalid TDLS_TEARDOWN")
596 if "FAIL" not in dev[0].request("FT_DS "):
597 raise Exception("Unexpected success on invalid FT_DS")
598 if "FAIL" not in dev[0].request("WPS_PBC 00:11:22:33:44"):
599 raise Exception("Unexpected success on invalid WPS_PBC")
600 if "FAIL" not in dev[0].request("WPS_PIN 00:11:22:33:44"):
601 raise Exception("Unexpected success on invalid WPS_PIN")
602 if "FAIL" not in dev[0].request("WPS_NFC 00:11:22:33:44"):
603 raise Exception("Unexpected success on invalid WPS_NFC")
604 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44 12345670"):
605 raise Exception("Unexpected success on invalid WPS_REG")
606 if "FAIL" not in dev[0].request("IBSS_RSN 00:11:22:33:44"):
607 raise Exception("Unexpected success on invalid IBSS_RSN")
608 if "FAIL" not in dev[0].request("BLACKLIST 00:11:22:33:44"):
609 raise Exception("Unexpected success on invalid BLACKLIST")
610
611 def test_wpas_ctrl_wps_errors(dev):
612 """wpa_supplicant ctrl_iface WPS error cases"""
613 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55"):
614 raise Exception("Unexpected success on invalid WPS_REG")
615 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233"):
616 raise Exception("Unexpected success on invalid WPS_REG")
617 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233 OPEN"):
618 raise Exception("Unexpected success on invalid WPS_REG")
619 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233 OPEN NONE"):
620 raise Exception("Unexpected success on invalid WPS_REG")
621
622 if "FAIL" not in dev[0].request("WPS_AP_PIN random"):
623 raise Exception("Unexpected success on WPS_AP_PIN in non-AP mode")
624
625 if "FAIL" not in dev[0].request("WPS_ER_PIN any"):
626 raise Exception("Unexpected success on invalid WPS_ER_PIN")
627
628 if "FAIL" not in dev[0].request("WPS_ER_LEARN 00:11:22:33:44:55"):
629 raise Exception("Unexpected success on invalid WPS_ER_LEARN")
630
631 if "FAIL" not in dev[0].request("WPS_ER_SET_CONFIG 00:11:22:33:44:55"):
632 raise Exception("Unexpected success on invalid WPS_ER_SET_CONFIG")
633
634 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55"):
635 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
636 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670"):
637 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
638 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233"):
639 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
640 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233 OPEN"):
641 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
642 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233 OPEN NONE"):
643 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
644
645 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN WPS"):
646 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN")
647 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN FOO 00:11:22:33:44:55"):
648 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN")
649 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN NDEF 00:11:22:33:44:55"):
650 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN")
651
652 if "FAIL" not in dev[0].request("WPS_NFC_CONFIG_TOKEN FOO"):
653 raise Exception("Unexpected success on invalid WPS_NFC_CONFIG_TOKEN")
654 if "FAIL" not in dev[0].request("WPS_NFC_CONFIG_TOKEN WPS FOO"):
655 raise Exception("Unexpected success on invalid WPS_NFC_CONFIG_TOKEN")
656 if "FAIL" not in dev[0].request("WPS_NFC_TOKEN FOO"):
657 raise Exception("Unexpected success on invalid WPS_NFC_TOKEN")
658
659 def test_wpas_ctrl_config_parser(dev):
660 """wpa_supplicant ctrl_iface SET config parser"""
661 if "FAIL" not in dev[0].request("SET pbc_in_m1 qwerty"):
662 raise Exception("Non-number accepted as integer")
663 if "FAIL" not in dev[0].request("SET eapol_version 0"):
664 raise Exception("Out-of-range value accepted")
665 if "FAIL" not in dev[0].request("SET eapol_version 10"):
666 raise Exception("Out-of-range value accepted")
667
668 if "FAIL" not in dev[0].request("SET serial_number 0123456789abcdef0123456789abcdef0"):
669 raise Exception("Too long string accepted")
670
671 def test_wpas_ctrl_mib(dev):
672 """wpa_supplicant ctrl_iface MIB"""
673 mib = dev[0].get_mib()
674 if "dot11RSNAOptionImplemented" not in mib:
675 raise Exception("Missing MIB entry")
676 if mib["dot11RSNAOptionImplemented"] != "TRUE":
677 raise Exception("Unexpected dot11RSNAOptionImplemented value")
678
679 def test_wpas_ctrl_set_wps_params(dev):
680 """wpa_supplicant ctrl_iface SET config_methods"""
681 ts = [ "config_methods label virtual_display virtual_push_button keypad",
682 "device_type 1-0050F204-1",
683 "os_version 01020300",
684 "uuid 12345678-9abc-def0-1234-56789abcdef0" ]
685 for t in ts:
686 if "OK" not in dev[2].request("SET " + t):
687 raise Exception("SET failed for: " + t)
688
689 ts = [ "uuid 12345678+9abc-def0-1234-56789abcdef0",
690 "uuid 12345678-qabc-def0-1234-56789abcdef0",
691 "uuid 12345678-9abc+def0-1234-56789abcdef0",
692 "uuid 12345678-9abc-qef0-1234-56789abcdef0",
693 "uuid 12345678-9abc-def0+1234-56789abcdef0",
694 "uuid 12345678-9abc-def0-q234-56789abcdef0",
695 "uuid 12345678-9abc-def0-1234+56789abcdef0",
696 "uuid 12345678-9abc-def0-1234-q6789abcdef0",
697 "uuid qwerty" ]
698 for t in ts:
699 if "FAIL" not in dev[2].request("SET " + t):
700 raise Exception("SET succeeded for: " + t)
701
702 def test_wpas_ctrl_level(dev):
703 """wpa_supplicant ctrl_iface LEVEL"""
704 try:
705 if "FAIL" not in dev[2].request("LEVEL 3"):
706 raise Exception("Unexpected LEVEL success")
707 if "OK" not in dev[2].mon.request("LEVEL 2"):
708 raise Exception("Unexpected LEVEL failure")
709 dev[2].request("SCAN freq=2412")
710 ev = dev[2].wait_event(["State:"], timeout=5)
711 if ev is None:
712 raise Exception("No debug message received")
713 dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=5)
714 finally:
715 dev[2].mon.request("LEVEL 3")
716
717 def test_wpas_ctrl_bssid_filter(dev, apdev):
718 """wpa_supplicant bssid_filter"""
719 try:
720 if "OK" not in dev[2].request("SET bssid_filter " + apdev[0]['bssid']):
721 raise Exception("Failed to set bssid_filter")
722 params = { "ssid": "test" }
723 hostapd.add_ap(apdev[0]['ifname'], params)
724 hostapd.add_ap(apdev[1]['ifname'], params)
725 dev[2].scan_for_bss(apdev[0]['bssid'], freq="2412")
726 dev[2].scan(freq="2412")
727 bss = dev[2].get_bss(apdev[0]['bssid'])
728 if bss is None or len(bss) == 0:
729 raise Exception("Missing BSS data")
730 bss = dev[2].get_bss(apdev[1]['bssid'])
731 if bss and len(bss) != 0:
732 raise Exception("Unexpected BSS data")
733 dev[2].request("SET bssid_filter ")
734 dev[2].scan(freq="2412")
735 bss = dev[2].get_bss(apdev[0]['bssid'])
736 if bss is None or len(bss) == 0:
737 raise Exception("Missing BSS data")
738 bss = dev[2].get_bss(apdev[1]['bssid'])
739 if bss is None or len(bss) == 0:
740 raise Exception("Missing BSS data(2)")
741 res = dev[2].request("SCAN_RESULTS").splitlines()
742 if "test" not in res[1] or "test" not in res[2]:
743 raise Exception("SSID missing from SCAN_RESULTS")
744 if apdev[0]['bssid'] not in res[1] and apdev[1]['bssid'] not in res[1]:
745 raise Exception("BSS1 missing from SCAN_RESULTS")
746 if apdev[0]['bssid'] not in res[2] and apdev[1]['bssid'] not in res[2]:
747 raise Exception("BSS1 missing from SCAN_RESULTS")
748
749 if "FAIL" not in dev[2].request("SET bssid_filter 00:11:22:33:44:55 00:11:22:33:44"):
750 raise Exception("Unexpected success for invalid SET bssid_filter")
751 finally:
752 dev[2].request("SET bssid_filter ")
753
754 def test_wpas_ctrl_disallow_aps(dev, apdev):
755 """wpa_supplicant ctrl_iface disallow_aps"""
756 params = { "ssid": "test" }
757 hostapd.add_ap(apdev[0]['ifname'], params)
758
759 if "FAIL" not in dev[0].request("SET disallow_aps bssid "):
760 raise Exception("Unexpected success on invalid disallow_aps")
761 if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44"):
762 raise Exception("Unexpected success on invalid disallow_aps")
763 if "FAIL" not in dev[0].request("SET disallow_aps ssid 0"):
764 raise Exception("Unexpected success on invalid disallow_aps")
765 if "FAIL" not in dev[0].request("SET disallow_aps ssid 4q"):
766 raise Exception("Unexpected success on invalid disallow_aps")
767 if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 ssid 112233 ssid 123"):
768 raise Exception("Unexpected success on invalid disallow_aps")
769 if "FAIL" not in dev[0].request("SET disallow_aps ssid 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f00"):
770 raise Exception("Unexpected success on invalid disallow_aps")
771 if "FAIL" not in dev[0].request("SET disallow_aps foo 112233445566"):
772 raise Exception("Unexpected success on invalid disallow_aps")
773
774 dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
775 hostapd.add_ap(apdev[1]['ifname'], params)
776 dev[0].scan_for_bss(apdev[1]['bssid'], freq="2412")
777 dev[0].dump_monitor()
778 if "OK" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 bssid 00:22:33:44:55:66"):
779 raise Exception("Failed to set disallow_aps")
780 if "OK" not in dev[0].request("SET disallow_aps bssid " + apdev[0]['bssid']):
781 raise Exception("Failed to set disallow_aps")
782 ev = dev[0].wait_connected(timeout=30, error="Reassociation timed out")
783 if apdev[1]['bssid'] not in ev:
784 raise Exception("Unexpected BSSID")
785
786 dev[0].dump_monitor()
787 if "OK" not in dev[0].request("SET disallow_aps ssid " + "test".encode("hex")):
788 raise Exception("Failed to set disallow_aps")
789 dev[0].wait_disconnected(timeout=5, error="Disconnection not seen")
790 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
791 if ev is not None:
792 raise Exception("Unexpected reassociation")
793
794 dev[0].request("DISCONNECT")
795 dev[0].p2p_start_go(freq=2412)
796 if "OK" not in dev[0].request("SET disallow_aps "):
797 raise Exception("Failed to set disallow_aps")
798
799 def test_wpas_ctrl_blob(dev):
800 """wpa_supplicant ctrl_iface SET blob"""
801 if "FAIL" not in dev[0].request("SET blob foo"):
802 raise Exception("Unexpected SET success")
803 if "FAIL" not in dev[0].request("SET blob foo 0"):
804 raise Exception("Unexpected SET success")
805 if "FAIL" not in dev[0].request("SET blob foo 0q"):
806 raise Exception("Unexpected SET success")
807 if "OK" not in dev[0].request("SET blob foo 00"):
808 raise Exception("Unexpected SET failure")
809 if "OK" not in dev[0].request("SET blob foo 0011"):
810 raise Exception("Unexpected SET failure")
811
812 def test_wpas_ctrl_set_uapsd(dev):
813 """wpa_supplicant ctrl_iface SET uapsd"""
814 if "FAIL" not in dev[0].request("SET uapsd foo"):
815 raise Exception("Unexpected SET success")
816 if "FAIL" not in dev[0].request("SET uapsd 0,0,0"):
817 raise Exception("Unexpected SET success")
818 if "FAIL" not in dev[0].request("SET uapsd 0,0"):
819 raise Exception("Unexpected SET success")
820 if "FAIL" not in dev[0].request("SET uapsd 0"):
821 raise Exception("Unexpected SET success")
822 if "OK" not in dev[0].request("SET uapsd 1,1,1,1;1"):
823 raise Exception("Unexpected SET failure")
824 if "OK" not in dev[0].request("SET uapsd 0,0,0,0;0"):
825 raise Exception("Unexpected SET failure")
826 if "OK" not in dev[0].request("SET uapsd disable"):
827 raise Exception("Unexpected SET failure")
828
829 def test_wpas_ctrl_set(dev):
830 """wpa_supplicant ctrl_iface SET"""
831 vals = [ "foo",
832 "ampdu 0",
833 "radio_disable 0",
834 "ps 10",
835 "ps 1",
836 "dot11RSNAConfigPMKLifetime 0",
837 "dot11RSNAConfigPMKReauthThreshold 101",
838 "dot11RSNAConfigSATimeout 0",
839 "wps_version_number -1",
840 "wps_version_number 256" ]
841 for val in vals:
842 if "FAIL" not in dev[0].request("SET " + val):
843 raise Exception("Unexpected SET success for " + val)
844
845 vals = [ "EAPOL::heldPeriod 60",
846 "EAPOL::authPeriod 30",
847 "EAPOL::startPeriod 30",
848 "EAPOL::maxStart 3",
849 "dot11RSNAConfigSATimeout 60",
850 "ps -1",
851 "ps 0",
852 "no_keep_alive 0",
853 "tdls_disabled 1",
854 "tdls_disabled 0" ]
855 for val in vals:
856 if "OK" not in dev[0].request("SET " + val):
857 raise Exception("Unexpected SET failure for " + val)
858
859 def test_wpas_ctrl_get_capability(dev):
860 """wpa_supplicant ctrl_iface GET_CAPABILITY"""
861 if "FAIL" not in dev[0].request("GET_CAPABILITY 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"):
862 raise Exception("Unexpected success on invalid GET_CAPABILITY")
863 if "FAIL" not in dev[0].request("GET_CAPABILITY eap foo"):
864 raise Exception("Unexpected success on invalid GET_CAPABILITY")
865 if "AP" not in dev[0].request("GET_CAPABILITY modes strict"):
866 raise Exception("Unexpected GET_CAPABILITY response")
867 res = dev[0].get_capability("eap")
868 if "TTLS" not in res:
869 raise Exception("Unexpected GET_CAPABILITY eap response: " + str(res))
870
871 res = dev[0].get_capability("pairwise")
872 if "CCMP" not in res:
873 raise Exception("Unexpected GET_CAPABILITY pairwise response: " + str(res))
874
875 res = dev[0].get_capability("group")
876 if "CCMP" not in res:
877 raise Exception("Unexpected GET_CAPABILITY group response: " + str(res))
878
879 res = dev[0].get_capability("key_mgmt")
880 if "WPA-PSK" not in res or "WPA-EAP" not in res:
881 raise Exception("Unexpected GET_CAPABILITY key_mgmt response: " + str(res))
882
883 res = dev[0].get_capability("proto")
884 if "WPA" not in res or "RSN" not in res:
885 raise Exception("Unexpected GET_CAPABILITY proto response: " + str(res))
886
887 res = dev[0].get_capability("auth_alg")
888 if "OPEN" not in res or "SHARED" not in res:
889 raise Exception("Unexpected GET_CAPABILITY auth_alg response: " + str(res))
890
891 res = dev[0].get_capability("modes")
892 if "IBSS" not in res or "AP" not in res:
893 raise Exception("Unexpected GET_CAPABILITY modes response: " + str(res))
894
895 res = dev[0].get_capability("channels")
896 if "8" not in res or "36" not in res:
897 raise Exception("Unexpected GET_CAPABILITY channels response: " + str(res))
898
899 res = dev[0].get_capability("freq")
900 if "2457" not in res or "5180" not in res:
901 raise Exception("Unexpected GET_CAPABILITY freq response: " + str(res))
902
903 res = dev[0].get_capability("tdls")
904 if "EXTERNAL" not in res[0]:
905 raise Exception("Unexpected GET_CAPABILITY tdls response: " + str(res))
906
907 res = dev[0].get_capability("erp")
908 if res is None or "ERP" not in res[0]:
909 raise Exception("Unexpected GET_CAPABILITY erp response: " + str(res))
910
911 if dev[0].get_capability("foo") is not None:
912 raise Exception("Unexpected GET_CAPABILITY foo response: " + str(res))
913
914 def test_wpas_ctrl_nfc_report_handover(dev):
915 """wpa_supplicant ctrl_iface NFC_REPORT_HANDOVER"""
916 vals = [ "FOO",
917 "ROLE freq=12345",
918 "ROLE TYPE",
919 "ROLE TYPE REQ",
920 "ROLE TYPE REQ SEL",
921 "ROLE TYPE 0Q SEL",
922 "ROLE TYPE 00 SEL",
923 "ROLE TYPE 00 0Q",
924 "ROLE TYPE 00 00" ]
925 for v in vals:
926 if "FAIL" not in dev[0].request("NFC_REPORT_HANDOVER " + v):
927 raise Exception("Unexpected NFC_REPORT_HANDOVER success for " + v)
928
929 def test_wpas_ctrl_nfc_tag_read(dev):
930 """wpa_supplicant ctrl_iface WPS_NFC_TAG_READ"""
931 vals = [ "FOO", "0Q", "00", "000000", "10000001", "10000000", "00000000",
932 "100e0000", "100e0001ff", "100e000411110000", "100e0004100e0001" ]
933 for v in vals:
934 if "FAIL" not in dev[0].request("WPS_NFC_TAG_READ " + v):
935 raise Exception("Unexpected WPS_NFC_TAG_READ success for " + v)
936
937 def test_wpas_ctrl_nfc_get_handover(dev):
938 """wpa_supplicant ctrl_iface NFC_GET_HANDOVER"""
939 vals = [ "FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P" ]
940 for v in vals:
941 if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_REQ " + v):
942 raise Exception("Unexpected NFC_GET_HANDOVER_REQ success for " + v)
943
944 vals = [ "NDEF WPS", "NDEF P2P-CR", "WPS P2P-CR" ]
945 for v in vals:
946 if "FAIL" in dev[0].request("NFC_GET_HANDOVER_REQ " + v):
947 raise Exception("Unexpected NFC_GET_HANDOVER_REQ failure for " + v)
948
949 vals = [ "FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P",
950 "NDEF WPS", "NDEF WPS uuid" ]
951 for v in vals:
952 if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_SEL " + v):
953 raise Exception("Unexpected NFC_GET_HANDOVER_SEL success for " + v)
954
955 vals = [ "NDEF P2P-CR", "WPS P2P-CR", "NDEF P2P-CR-TAG",
956 "WPS P2P-CR-TAG" ]
957 for v in vals:
958 if "FAIL" in dev[0].request("NFC_GET_HANDOVER_SEL " + v):
959 raise Exception("Unexpected NFC_GET_HANDOVER_SEL failure for " + v)
960
961 def get_blacklist(dev):
962 return dev.request("BLACKLIST").splitlines()
963
964 def test_wpas_ctrl_blacklist(dev):
965 """wpa_supplicant ctrl_iface BLACKLIST"""
966 if "OK" not in dev[0].request("BLACKLIST clear"):
967 raise Exception("BLACKLIST clear failed")
968 b = get_blacklist(dev[0])
969 if len(b) != 0:
970 raise Exception("Unexpected blacklist contents: " + str(b))
971 if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:55"):
972 raise Exception("BLACKLIST add failed")
973 b = get_blacklist(dev[0])
974 if "00:11:22:33:44:55" not in b:
975 raise Exception("Unexpected blacklist contents: " + str(b))
976 if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:56"):
977 raise Exception("BLACKLIST add failed")
978 b = get_blacklist(dev[0])
979 if "00:11:22:33:44:55" not in b or "00:11:22:33:44:56" not in b:
980 raise Exception("Unexpected blacklist contents: " + str(b))
981 if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:56"):
982 raise Exception("BLACKLIST add failed")
983 b = get_blacklist(dev[0])
984 if "00:11:22:33:44:55" not in b or "00:11:22:33:44:56" not in b or len(b) != 2:
985 raise Exception("Unexpected blacklist contents: " + str(b))
986
987 if "OK" not in dev[0].request("BLACKLIST clear"):
988 raise Exception("BLACKLIST clear failed")
989 if dev[0].request("BLACKLIST") != "":
990 raise Exception("Unexpected blacklist contents")
991
992 def test_wpas_ctrl_blacklist_oom(dev):
993 """wpa_supplicant ctrl_iface BLACKLIST and out-of-memory"""
994 with alloc_fail(dev[0], 1, "wpa_blacklist_add"):
995 if "FAIL" not in dev[0].request("BLACKLIST aa:bb:cc:dd:ee:ff"):
996 raise Exception("Unexpected success with allocation failure")
997
998 def test_wpas_ctrl_log_level(dev):
999 """wpa_supplicant ctrl_iface LOG_LEVEL"""
1000 level = dev[2].request("LOG_LEVEL")
1001 if "Current level: MSGDUMP" not in level:
1002 raise Exception("Unexpected debug level(1): " + level)
1003 if "Timestamp: 1" not in level:
1004 raise Exception("Unexpected timestamp(1): " + level)
1005
1006 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 0"):
1007 raise Exception("LOG_LEVEL failed")
1008 level = dev[2].request("LOG_LEVEL")
1009 if "Current level: MSGDUMP" not in level:
1010 raise Exception("Unexpected debug level(2): " + level)
1011 if "Timestamp: 0" not in level:
1012 raise Exception("Unexpected timestamp(2): " + level)
1013
1014 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 1"):
1015 raise Exception("LOG_LEVEL failed")
1016 level = dev[2].request("LOG_LEVEL")
1017 if "Current level: MSGDUMP" not in level:
1018 raise Exception("Unexpected debug level(3): " + level)
1019 if "Timestamp: 1" not in level:
1020 raise Exception("Unexpected timestamp(3): " + level)
1021
1022 if "FAIL" not in dev[2].request("LOG_LEVEL FOO"):
1023 raise Exception("Invalid LOG_LEVEL accepted")
1024
1025 for lev in [ "EXCESSIVE", "MSGDUMP", "DEBUG", "INFO", "WARNING", "ERROR" ]:
1026 if "OK" not in dev[2].request("LOG_LEVEL " + lev):
1027 raise Exception("LOG_LEVEL failed for " + lev)
1028 level = dev[2].request("LOG_LEVEL")
1029 if "Current level: " + lev not in level:
1030 raise Exception("Unexpected debug level: " + level)
1031
1032 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 1"):
1033 raise Exception("LOG_LEVEL failed")
1034 level = dev[2].request("LOG_LEVEL")
1035 if "Current level: MSGDUMP" not in level:
1036 raise Exception("Unexpected debug level(3): " + level)
1037 if "Timestamp: 1" not in level:
1038 raise Exception("Unexpected timestamp(3): " + level)
1039
1040 def test_wpas_ctrl_enable_disable_network(dev, apdev):
1041 """wpa_supplicant ctrl_iface ENABLE/DISABLE_NETWORK"""
1042 params = { "ssid": "test" }
1043 hostapd.add_ap(apdev[0]['ifname'], params)
1044
1045 id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412",
1046 only_add_network=True)
1047 if "OK" not in dev[0].request("DISABLE_NETWORK " + str(id)):
1048 raise Exception("Failed to disable network")
1049 if "OK" not in dev[0].request("ENABLE_NETWORK " + str(id) + " no-connect"):
1050 raise Exception("Failed to enable network")
1051 if "OK" not in dev[0].request("DISABLE_NETWORK all"):
1052 raise Exception("Failed to disable networks")
1053 if "OK" not in dev[0].request("ENABLE_NETWORK " + str(id)):
1054 raise Exception("Failed to enable network")
1055 dev[0].wait_connected(timeout=10)
1056 if "OK" not in dev[0].request("DISABLE_NETWORK " + str(id)):
1057 raise Exception("Failed to disable network")
1058 dev[0].wait_disconnected(timeout=10)
1059 time.sleep(0.1)
1060
1061 if "OK" not in dev[0].request("ENABLE_NETWORK all"):
1062 raise Exception("Failed to enable network")
1063 dev[0].wait_connected(timeout=10)
1064 if "OK" not in dev[0].request("DISABLE_NETWORK all"):
1065 raise Exception("Failed to disable network")
1066 dev[0].wait_disconnected(timeout=10)
1067
1068 def test_wpas_ctrl_country(dev, apdev):
1069 """wpa_supplicant SET/GET country code"""
1070 try:
1071 # work around issues with possible pending regdom event from the end of
1072 # the previous test case
1073 time.sleep(0.2)
1074 dev[0].dump_monitor()
1075
1076 if "OK" not in dev[0].request("SET country FI"):
1077 raise Exception("Failed to set country code")
1078 if dev[0].request("GET country") != "FI":
1079 raise Exception("Country code set failed")
1080 ev = dev[0].wait_global_event(["CTRL-EVENT-REGDOM-CHANGE"], 10)
1081 if ev is None:
1082 raise Exception("regdom change event not seen")
1083 if "init=USER type=COUNTRY alpha2=FI" not in ev:
1084 raise Exception("Unexpected event contents: " + ev)
1085 dev[0].request("SET country 00")
1086 if dev[0].request("GET country") != "00":
1087 raise Exception("Country code set failed")
1088 ev = dev[0].wait_global_event(["CTRL-EVENT-REGDOM-CHANGE"], 10)
1089 if ev is None:
1090 raise Exception("regdom change event not seen")
1091 if "init=CORE type=WORLD" not in ev:
1092 raise Exception("Unexpected event contents: " + ev)
1093 finally:
1094 subprocess.call(['iw', 'reg', 'set', '00'])
1095
1096 def test_wpas_ctrl_suspend_resume(dev):
1097 """wpa_supplicant SUSPEND/RESUME"""
1098 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1099 wpas.interface_add("wlan5")
1100 if "OK" not in wpas.global_request("SUSPEND"):
1101 raise Exception("SUSPEND failed")
1102 time.sleep(1)
1103 if "OK" not in wpas.global_request("RESUME"):
1104 raise Exception("RESUME failed")
1105 if "OK" not in wpas.request("SUSPEND"):
1106 raise Exception("Per-interface SUSPEND failed")
1107 if "OK" not in wpas.request("RESUME"):
1108 raise Exception("Per-interface RESUME failed")
1109 ev = wpas.wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10)
1110 if ev is None:
1111 raise Exception("Scan not completed")
1112
1113 def test_wpas_ctrl_global(dev):
1114 """wpa_supplicant global control interface"""
1115 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1116 wpas.interface_add("wlan5")
1117
1118 if "PONG" not in wpas.global_request("PING"):
1119 raise Exception("PING failed")
1120 if "wlan5" not in wpas.global_request("INTERFACES"):
1121 raise Exception("Interface not found")
1122 if "UNKNOWN COMMAND" not in wpas.global_request("FOO"):
1123 raise Exception("Unexpected response to unknown command")
1124 if "PONG" not in wpas.global_request("IFNAME=wlan5 PING"):
1125 raise Exception("Per-interface PING failed")
1126 if "FAIL-NO-IFNAME-MATCH" not in wpas.global_request("IFNAME=notfound PING"):
1127 raise Exception("Unknown interface not reported correctly")
1128 if "FAIL" not in wpas.global_request("SAVE_CONFIG"):
1129 raise Exception("SAVE_CONFIG succeeded unexpectedly")
1130 if "OK" not in wpas.global_request("SET wifi_display 0"):
1131 raise Exception("SET failed")
1132 if "wifi_display=0" not in wpas.global_request("STATUS"):
1133 raise Exception("wifi_display not disabled")
1134 if "OK" not in wpas.global_request("SET wifi_display 1"):
1135 raise Exception("SET failed")
1136 if "wifi_display=1" not in wpas.global_request("STATUS"):
1137 raise Exception("wifi_display not enabled")
1138 if "FAIL" not in wpas.global_request("SET foo 1"):
1139 raise Exception("SET succeeded unexpectedly")
1140
1141 if "p2p_state=IDLE" not in wpas.global_request("STATUS"):
1142 raise Exception("P2P was disabled")
1143 wpas.global_request("P2P_SET disabled 1")
1144 if "p2p_state=DISABLED" not in wpas.global_request("STATUS"):
1145 raise Exception("P2P was not disabled")
1146 wpas.global_request("P2P_SET disabled 0")
1147 if "p2p_state=IDLE" not in wpas.global_request("STATUS"):
1148 raise Exception("P2P was not enabled")
1149
1150 # driver_nl80211.c does not support interface list, so do not fail because
1151 # of that
1152 logger.debug(wpas.global_request("INTERFACE_LIST"))
1153
1154 if "FAIL" not in wpas.global_request("INTERFACE_ADD "):
1155 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1156 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO"):
1157 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1158 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf"):
1159 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1160 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver"):
1161 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1162 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface"):
1163 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1164 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam"):
1165 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1166 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam bridge"):
1167 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1168 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam bridge foo"):
1169 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1170 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO "):
1171 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1172
1173 def test_wpas_ctrl_roam(dev, apdev):
1174 """wpa_supplicant ctrl_iface ROAM error cases"""
1175 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44"):
1176 raise Exception("Unexpected success")
1177 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"):
1178 raise Exception("Unexpected success")
1179 params = { "ssid": "test" }
1180 hostapd.add_ap(apdev[0]['ifname'], params)
1181 id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
1182 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"):
1183 raise Exception("Unexpected success")
1184
1185 def test_wpas_ctrl_ipaddr(dev, apdev):
1186 """wpa_supplicant IP address in STATUS"""
1187 try:
1188 subprocess.call(['ip', 'addr', 'add', '10.174.65.207/32', 'dev',
1189 dev[0].ifname])
1190 ipaddr = dev[0].get_status_field('ip_address')
1191 if ipaddr != '10.174.65.207':
1192 raise Exception("IP address not in STATUS output")
1193 finally:
1194 subprocess.call(['ip', 'addr', 'del', '10.174.65.207/32', 'dev',
1195 dev[0].ifname])
1196
1197 def test_wpas_ctrl_neighbor_rep_req(dev, apdev):
1198 """wpa_supplicant ctrl_iface NEIGHBOR_REP_REQUEST"""
1199 params = { "ssid": "test" }
1200 hostapd.add_ap(apdev[0]['ifname'], params)
1201 params = { "ssid": "test2", "radio_measurements": "1" }
1202 hostapd.add_ap(apdev[1]['ifname'], params)
1203
1204 dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
1205 if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
1206 raise Exception("Request succeeded unexpectedly")
1207 if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=abcdef"):
1208 raise Exception("Request succeeded unexpectedly")
1209 dev[0].request("DISCONNECT")
1210
1211 rrm = int(dev[0].get_driver_status_field("capa.rrm_flags"), 16)
1212 if rrm & 0x5 != 0x5:
1213 logger.info("Driver does not support required RRM capabilities - skip rest of the test case")
1214 return
1215
1216 dev[0].connect("test2", key_mgmt="NONE", scan_freq="2412")
1217
1218 # These requests are expected to get sent properly, but since hostapd does
1219 # not yet support processing of the request, these are expected to fail.
1220
1221 if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
1222 raise Exception("Request failed")
1223 ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
1224 "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
1225 if ev is None:
1226 raise Exception("RRM report result not indicated")
1227 logger.info("RRM result: " + ev)
1228
1229 if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=abcdef"):
1230 raise Exception("Request failed")
1231 ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
1232 "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
1233 if ev is None:
1234 raise Exception("RRM report result not indicated")
1235 logger.info("RRM result: " + ev)
1236
1237 def test_wpas_ctrl_rsp(dev, apdev):
1238 """wpa_supplicant ctrl_iface CTRL-RSP-"""
1239 if "FAIL" not in dev[0].request("CTRL-RSP-"):
1240 raise Exception("Request succeeded unexpectedly")
1241 if "FAIL" not in dev[0].request("CTRL-RSP-foo-"):
1242 raise Exception("Request succeeded unexpectedly")
1243 if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567"):
1244 raise Exception("Request succeeded unexpectedly")
1245 if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567:"):
1246 raise Exception("Request succeeded unexpectedly")
1247 id = dev[0].add_network()
1248 if "FAIL" not in dev[0].request("CTRL-RSP-foo-%d:" % id):
1249 raise Exception("Request succeeded unexpectedly")
1250 for req in [ "IDENTITY", "PASSWORD", "NEW_PASSWORD", "PIN", "OTP",
1251 "PASSPHRASE", "SIM" ]:
1252 if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)):
1253 raise Exception("Request failed unexpectedly")
1254 if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)):
1255 raise Exception("Request failed unexpectedly")
1256
1257 def test_wpas_ctrl_vendor(dev, apdev):
1258 """wpa_supplicant ctrl_iface VENDOR"""
1259 cmds = [ "foo",
1260 "1",
1261 "1 foo",
1262 "1 2foo",
1263 "1 2 qq" ]
1264 for cmd in cmds:
1265 if "FAIL" not in dev[0].request("VENDOR " + cmd):
1266 raise Exception("Invalid VENDOR command accepted: " + cmd)
1267
1268 def test_wpas_ctrl_mgmt_tx(dev, apdev):
1269 """wpa_supplicant ctrl_iface MGMT_TX"""
1270 cmds = [ "foo",
1271 "00:11:22:33:44:55 foo",
1272 "00:11:22:33:44:55 11:22:33:44:55:66",
1273 "00:11:22:33:44:55 11:22:33:44:55:66 freq=0 no_cck=0 wait_time=0 action=123",
1274 "00:11:22:33:44:55 11:22:33:44:55:66 action=12qq" ]
1275 for cmd in cmds:
1276 if "FAIL" not in dev[0].request("MGMT_TX " + cmd):
1277 raise Exception("Invalid MGMT_TX command accepted: " + cmd)
1278
1279 if "OK" not in dev[0].request("MGMT_TX_DONE"):
1280 raise Exception("MGMT_TX_DONE failed")
1281
1282 def test_wpas_ctrl_driver_event(dev, apdev):
1283 """wpa_supplicant ctrl_iface DRIVER_EVENT"""
1284 if "FAIL" not in dev[0].request("DRIVER_EVENT foo"):
1285 raise Exception("Invalid DRIVER_EVENT accepted")
1286
1287 def test_wpas_ctrl_eapol_rx(dev, apdev):
1288 """wpa_supplicant ctrl_iface EAPOL_RX"""
1289 cmds = [ "foo",
1290 "00:11:22:33:44:55 123",
1291 "00:11:22:33:44:55 12qq" ]
1292 for cmd in cmds:
1293 if "FAIL" not in dev[0].request("EAPOL_RX " + cmd):
1294 raise Exception("Invalid EAPOL_RX command accepted: " + cmd)
1295
1296 def test_wpas_ctrl_data_test(dev, apdev):
1297 """wpa_supplicant ctrl_iface DATA_TEST"""
1298 dev[0].request("DATA_TEST_CONFIG 0")
1299 if "FAIL" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"):
1300 raise Exception("DATA_TEST_TX accepted when not in test mode")
1301
1302 try:
1303 if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"):
1304 raise Exception("DATA_TEST_CONFIG failed")
1305 if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"):
1306 raise Exception("DATA_TEST_CONFIG failed")
1307 cmds = [ "foo",
1308 "00:11:22:33:44:55 foo",
1309 "00:11:22:33:44:55 00:11:22:33:44:55 -1",
1310 "00:11:22:33:44:55 00:11:22:33:44:55 256" ]
1311 for cmd in cmds:
1312 if "FAIL" not in dev[0].request("DATA_TEST_TX " + cmd):
1313 raise Exception("Invalid DATA_TEST_TX command accepted: " + cmd)
1314 if "OK" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"):
1315 raise Exception("DATA_TEST_TX failed")
1316 finally:
1317 dev[0].request("DATA_TEST_CONFIG 0")
1318
1319 cmds = [ "",
1320 "00",
1321 "00112233445566778899aabbccdde",
1322 "00112233445566778899aabbccdq" ]
1323 for cmd in cmds:
1324 if "FAIL" not in dev[0].request("DATA_TEST_FRAME " + cmd):
1325 raise Exception("Invalid DATA_TEST_FRAME command accepted: " + cmd)
1326
1327 if "OK" not in dev[0].request("DATA_TEST_FRAME 00112233445566778899aabbccddee"):
1328 raise Exception("DATA_TEST_FRAME failed")
1329
1330 def test_wpas_ctrl_vendor_elem(dev, apdev):
1331 """wpa_supplicant ctrl_iface VENDOR_ELEM"""
1332 if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 "):
1333 raise Exception("VENDOR_ELEM_ADD failed")
1334 cmds = [ "-1 ",
1335 "255 ",
1336 "1",
1337 "1 123",
1338 "1 12qq34" ]
1339 for cmd in cmds:
1340 if "FAIL" not in dev[0].request("VENDOR_ELEM_ADD " + cmd):
1341 raise Exception("Invalid VENDOR_ELEM_ADD command accepted: " + cmd)
1342
1343 cmds = [ "-1 ",
1344 "255 " ]
1345 for cmd in cmds:
1346 if "FAIL" not in dev[0].request("VENDOR_ELEM_GET " + cmd):
1347 raise Exception("Invalid VENDOR_ELEM_GET command accepted: " + cmd)
1348
1349 dev[0].request("VENDOR_ELEM_REMOVE 1 *")
1350 cmds = [ "-1 ",
1351 "255 ",
1352 "1",
1353 "1",
1354 "1 123",
1355 "1 12qq34",
1356 "1 12",
1357 "1 0000" ]
1358 for cmd in cmds:
1359 if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1360 raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1361
1362 dev[0].request("VENDOR_ELEM_ADD 1 000100")
1363 if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 "):
1364 raise Exception("VENDOR_ELEM_REMOVE failed")
1365 cmds = [ "-1 ",
1366 "255 ",
1367 "1",
1368 "1 123",
1369 "1 12qq34",
1370 "1 12",
1371 "1 0000" ]
1372 for cmd in cmds:
1373 if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1374 raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1375 if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 000100"):
1376 raise Exception("VENDOR_ELEM_REMOVE failed")
1377
1378 def test_wpas_ctrl_misc(dev, apdev):
1379 """wpa_supplicant ctrl_iface and miscellaneous commands"""
1380 if "OK" not in dev[0].request("RELOG"):
1381 raise Exception("RELOG failed")
1382 if dev[0].request("IFNAME") != dev[0].ifname:
1383 raise Exception("IFNAME returned unexpected response")
1384 if "FAIL" not in dev[0].request("REATTACH"):
1385 raise Exception("REATTACH accepted while disabled")
1386 if "OK" not in dev[2].request("RECONFIGURE"):
1387 raise Exception("RECONFIGURE failed")
1388 if "FAIL" in dev[0].request("INTERFACE_LIST"):
1389 raise Exception("INTERFACE_LIST failed")
1390 if "UNKNOWN COMMAND" not in dev[0].request("FOO"):
1391 raise Exception("Unknown command accepted")
1392
1393 if "FAIL" not in dev[0].global_request("INTERFACE_REMOVE foo"):
1394 raise Exception("Invalid INTERFACE_REMOVE accepted")
1395 if "FAIL" not in dev[0].global_request("SET foo"):
1396 raise Exception("Invalid global SET accepted")
1397
1398 def test_wpas_ctrl_dump(dev, apdev):
1399 """wpa_supplicant ctrl_iface and DUMP/GET global parameters"""
1400 vals = dev[0].get_config()
1401 logger.info("Config values from DUMP: " + str(vals))
1402 for field in vals:
1403 res = dev[0].request("GET " + field)
1404 if res == 'FAIL\n':
1405 res = "null"
1406 if res != vals[field]:
1407 print "'{}' != '{}'".format(res, vals[field])
1408 raise Exception("Mismatch in config field " + field)
1409 if "beacon_int" not in vals:
1410 raise Exception("Missing config field")
1411
1412 def test_wpas_ctrl_interface_add(dev, apdev):
1413 """wpa_supplicant INTERFACE_ADD/REMOVE with vif creation/removal"""
1414 hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
1415 dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
1416 hwsim_utils.test_connectivity(dev[0], hapd)
1417
1418 ifname = "test-" + dev[0].ifname
1419 dev[0].interface_add(ifname, create=True)
1420 wpas = WpaSupplicant(ifname=ifname)
1421 wpas.connect("open", key_mgmt="NONE", scan_freq="2412")
1422 hwsim_utils.test_connectivity(wpas, hapd)
1423 hwsim_utils.test_connectivity(dev[0], hapd)
1424 dev[0].global_request("INTERFACE_REMOVE " + ifname)
1425 hwsim_utils.test_connectivity(dev[0], hapd)
1426
1427 def test_wpas_ctrl_interface_add_many(dev, apdev):
1428 """wpa_supplicant INTERFACE_ADD/REMOVE with vif creation/removal (many)"""
1429 try:
1430 _test_wpas_ctrl_interface_add_many(dev, apdev)
1431 finally:
1432 for i in range(10):
1433 ifname = "test%d-" % i + dev[0].ifname
1434 dev[0].global_request("INTERFACE_REMOVE " + ifname)
1435
1436 def _test_wpas_ctrl_interface_add_many(dev, apdev):
1437 hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
1438 dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
1439 hwsim_utils.test_connectivity(dev[0], hapd)
1440 dev[0].dump_monitor()
1441
1442 l = []
1443 for i in range(10):
1444 ifname = "test%d-" % i + dev[0].ifname
1445 dev[0].interface_add(ifname, create=True)
1446 wpas = WpaSupplicant(ifname=ifname)
1447 wpas.connect("open", key_mgmt="NONE", scan_freq="2412")
1448 wpas.dump_monitor()
1449 l.append(wpas)
1450 dev[0].dump_monitor()
1451 for wpas in l:
1452 wpas.dump_monitor()
1453 hwsim_utils.test_connectivity(wpas, hapd)
1454 wpas.dump_monitor()
1455 dev[0].dump_monitor()
1456
1457 def test_wpas_ctrl_interface_add2(dev, apdev):
1458 """wpa_supplicant INTERFACE_ADD/REMOVE with vif without creation/removal"""
1459 ifname = "test-ext-" + dev[0].ifname
1460 try:
1461 _test_wpas_ctrl_interface_add2(dev, apdev, ifname)
1462 finally:
1463 subprocess.call(['iw', 'dev', ifname, 'del'])
1464
1465 def _test_wpas_ctrl_interface_add2(dev, apdev, ifname):
1466 hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
1467 dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
1468 hwsim_utils.test_connectivity(dev[0], hapd)
1469
1470 subprocess.call(['iw', 'dev', dev[0].ifname, 'interface', 'add', ifname,
1471 'type', 'station'])
1472 dev[0].interface_add(ifname, set_ifname=False, all_params=True)
1473 wpas = WpaSupplicant(ifname=ifname)
1474 wpas.connect("open", key_mgmt="NONE", scan_freq="2412")
1475 hwsim_utils.test_connectivity(wpas, hapd)
1476 hwsim_utils.test_connectivity(dev[0], hapd)
1477 del wpas
1478 dev[0].global_request("INTERFACE_REMOVE " + ifname)
1479 hwsim_utils.test_connectivity(dev[0], hapd)
1480
1481 def test_wpas_ctrl_wait(dev, apdev, test_params):
1482 """wpa_supplicant control interface wait for client"""
1483 logfile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.log-wpas')
1484 pidfile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.pid-wpas')
1485 conffile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.conf')
1486 with open(conffile, 'w') as f:
1487 f.write("ctrl_interface=DIR=/var/run/wpa_supplicant\n")
1488
1489 prg = os.path.join(test_params['logdir'],
1490 'alt-wpa_supplicant/wpa_supplicant/wpa_supplicant')
1491 if not os.path.exists(prg):
1492 prg = '../../wpa_supplicant/wpa_supplicant'
1493 arg = [ prg ]
1494 cmd = subprocess.Popen(arg, stdout=subprocess.PIPE)
1495 out = cmd.communicate()[0]
1496 cmd.wait()
1497 tracing = "Linux tracing" in out
1498
1499 with HWSimRadio() as (radio, iface):
1500 arg = [ prg, '-BdddW', '-P', pidfile, '-f', logfile,
1501 '-Dnl80211', '-c', conffile, '-i', iface ]
1502 if tracing:
1503 arg += [ '-T' ]
1504 logger.info("Start wpa_supplicant: " + str(arg))
1505 subprocess.call(arg)
1506 wpas = WpaSupplicant(ifname=iface)
1507 if "PONG" not in wpas.request("PING"):
1508 raise Exception("Could not PING wpa_supplicant")
1509 if not os.path.exists(pidfile):
1510 raise Exception("PID file not created")
1511 if "OK" not in wpas.request("TERMINATE"):
1512 raise Exception("Could not TERMINATE")
1513 ev = wpas.wait_event([ "CTRL-EVENT-TERMINATING" ], timeout=2)
1514 if ev is None:
1515 raise Exception("No termination event received")
1516 for i in range(20):
1517 if not os.path.exists(pidfile):
1518 break
1519 time.sleep(0.1)
1520 if os.path.exists(pidfile):
1521 raise Exception("PID file not removed")
1522
1523 def test_wpas_ctrl_oom(dev):
1524 """Various wpa_supplicant ctrl_iface OOM cases"""
1525 try:
1526 _test_wpas_ctrl_oom(dev)
1527 finally:
1528 dev[0].request("VENDOR_ELEM_REMOVE 1 *")
1529 dev[0].request("VENDOR_ELEM_REMOVE 2 *")
1530 dev[0].request("SET bssid_filter ")
1531
1532 def _test_wpas_ctrl_oom(dev):
1533 dev[0].request('VENDOR_ELEM_ADD 2 000100')
1534 tests = [ ('DRIVER_EVENT AVOID_FREQUENCIES 2412', 'FAIL',
1535 1, 'freq_range_list_parse'),
1536 ('P2P_SET disallow_freq 2412', 'FAIL',
1537 1, 'freq_range_list_parse'),
1538 ('SCAN freq=2412', 'FAIL',
1539 1, 'freq_range_list_parse'),
1540 ('INTERWORKING_SELECT freq=2412', 'FAIL',
1541 1, 'freq_range_list_parse'),
1542 ('SCAN ssid 112233', 'FAIL',
1543 1, 'wpas_ctrl_scan'),
1544 ('MGMT_TX 00:00:00:00:00:00 00:00:00:00:00:00 action=00', 'FAIL',
1545 1, 'wpas_ctrl_iface_mgmt_tx'),
1546 ('EAPOL_RX 00:00:00:00:00:00 00', 'FAIL',
1547 1, 'wpas_ctrl_iface_eapol_rx'),
1548 ('DATA_TEST_FRAME 00112233445566778899aabbccddee', 'FAIL',
1549 1, 'wpas_ctrl_iface_data_test_frame'),
1550 ('DATA_TEST_FRAME 00112233445566778899aabbccddee', 'FAIL',
1551 1, 'l2_packet_init;wpas_ctrl_iface_data_test_frame'),
1552 ('VENDOR_ELEM_ADD 1 000100', 'FAIL',
1553 1, 'wpas_ctrl_vendor_elem_add'),
1554 ('VENDOR_ELEM_ADD 2 000100', 'FAIL',
1555 2, 'wpas_ctrl_vendor_elem_add'),
1556 ('VENDOR_ELEM_REMOVE 2 000100', 'FAIL',
1557 1, 'wpas_ctrl_vendor_elem_remove'),
1558 ('SET bssid_filter 00:11:22:33:44:55', 'FAIL',
1559 1, 'set_bssid_filter'),
1560 ('SET disallow_aps bssid 00:11:22:33:44:55', 'FAIL',
1561 1, 'set_disallow_aps'),
1562 ('SET disallow_aps ssid 11', 'FAIL',
1563 1, 'set_disallow_aps'),
1564 ('SET blob foo 0011', 'FAIL',
1565 1, 'wpas_ctrl_set_blob'),
1566 ('SET blob foo 0011', 'FAIL',
1567 2, 'wpas_ctrl_set_blob'),
1568 ('SET blob foo 0011', 'FAIL',
1569 3, 'wpas_ctrl_set_blob'),
1570 ('WPS_NFC_TAG_READ 00', 'FAIL',
1571 1, 'wpa_supplicant_ctrl_iface_wps_nfc_tag_read'),
1572 ('WPS_NFC_TOKEN NDEF', 'FAIL',
1573 1, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1574 ('WPS_NFC_TOKEN NDEF', 'FAIL',
1575 2, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1576 ('WPS_NFC_TOKEN NDEF', 'FAIL',
1577 3, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1578 ('WPS_NFC_TOKEN NDEF', 'FAIL',
1579 4, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1580 ('WPS_NFC_TOKEN NDEF', 'FAIL',
1581 5, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1582 ('NFC_REPORT_HANDOVER ROLE TYPE 00 00', 'FAIL',
1583 1, 'wpas_ctrl_nfc_report_handover'),
1584 ('NFC_REPORT_HANDOVER ROLE TYPE 00 00', 'FAIL',
1585 2, 'wpas_ctrl_nfc_report_handover'),
1586 ('NFC_GET_HANDOVER_REQ NDEF WPS-CR', 'FAIL',
1587 1, 'wps_build_nfc_handover_req'),
1588 ('NFC_GET_HANDOVER_REQ NDEF WPS-CR', 'FAIL',
1589 1, 'ndef_build_record'),
1590 ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', None,
1591 1, 'wpas_p2p_nfc_handover'),
1592 ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', 'FAIL',
1593 2, 'wpas_p2p_nfc_handover'),
1594 ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', None,
1595 1, 'wps_build_nfc_handover_req_p2p'),
1596 ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', 'FAIL',
1597 1, 'ndef_build_record'),
1598 ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', None,
1599 1, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1600 ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', None,
1601 1, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1602 ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL',
1603 2, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1604 ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', 'FAIL',
1605 2, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1606 ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL',
1607 3, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1608 ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', 'FAIL',
1609 3, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1610 ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL',
1611 4, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1612 ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', 'FAIL',
1613 4, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1614 ('P2P_ASP_PROVISION_RESP 00:11:22:33:44:55 id=1', 'FAIL',
1615 1, 'p2p_parse_asp_provision_cmd'),
1616 ('P2P_SERV_DISC_REQ 00:11:22:33:44:55 02000001', 'FAIL',
1617 1, 'p2p_ctrl_serv_disc_req'),
1618 ('P2P_SERV_DISC_RESP 2412 00:11:22:33:44:55 1 00', 'FAIL',
1619 1, 'p2p_ctrl_serv_disc_resp'),
1620 ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027',
1621 'FAIL',
1622 1, 'p2p_ctrl_service_add_bonjour'),
1623 ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027',
1624 'FAIL',
1625 2, 'p2p_ctrl_service_add_bonjour'),
1626 ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027',
1627 'FAIL',
1628 3, 'p2p_ctrl_service_add_bonjour'),
1629 ('P2P_SERVICE_DEL bonjour 0b5f6166706f766572746370c00c000c01',
1630 'FAIL',
1631 1, 'p2p_ctrl_service_del_bonjour'),
1632 ('GAS_REQUEST 00:11:22:33:44:55 00', 'FAIL',
1633 1, 'gas_request'),
1634 ('GAS_REQUEST 00:11:22:33:44:55 00 11', 'FAIL',
1635 2, 'gas_request'),
1636 ('HS20_GET_NAI_HOME_REALM_LIST 00:11:22:33:44:55 realm=example.com',
1637 'FAIL',
1638 1, 'hs20_nai_home_realm_list'),
1639 ('HS20_GET_NAI_HOME_REALM_LIST 00:11:22:33:44:55 00',
1640 'FAIL',
1641 1, 'hs20_get_nai_home_realm_list'),
1642 ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1643 1, 'wpas_ctrl_iface_wnm_sleep'),
1644 ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1645 2, 'wpas_ctrl_iface_wnm_sleep'),
1646 ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1647 3, 'wpas_ctrl_iface_wnm_sleep'),
1648 ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1649 4, 'wpas_ctrl_iface_wnm_sleep'),
1650 ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1651 5, 'wpas_ctrl_iface_wnm_sleep'),
1652 ('WNM_SLEEP enter', 'FAIL',
1653 3, 'wpas_ctrl_iface_wnm_sleep'),
1654 ('VENDOR 1 1 00', 'FAIL',
1655 1, 'wpa_supplicant_vendor_cmd'),
1656 ('VENDOR 1 1 00', 'FAIL',
1657 2, 'wpa_supplicant_vendor_cmd'),
1658 ('RADIO_WORK add test', 'FAIL',
1659 1, 'wpas_ctrl_radio_work_add'),
1660 ('RADIO_WORK add test', 'FAIL',
1661 2, 'wpas_ctrl_radio_work_add'),
1662 ('AUTOSCAN periodic:1', 'FAIL',
1663 1, 'wpa_supplicant_ctrl_iface_autoscan'),
1664 ('PING', None,
1665 1, 'wpa_supplicant_ctrl_iface_process') ]
1666 for cmd,exp,count,func in tests:
1667 with alloc_fail(dev[0], count, func):
1668 res = dev[0].request(cmd)
1669 if exp and exp not in res:
1670 raise Exception("Unexpected success for '%s' during OOM" % cmd)
1671
1672 tests = [ ('FOO', None,
1673 1, 'wpa_supplicant_global_ctrl_iface_process'),
1674 ('IFNAME=notfound PING', 'FAIL\n',
1675 1, 'wpas_global_ctrl_iface_ifname') ]
1676 for cmd,exp,count,func in tests:
1677 with alloc_fail(dev[0], count, func):
1678 res = dev[0].global_request(cmd)
1679 if exp and exp not in res:
1680 raise Exception("Unexpected success for '%s' during OOM" % cmd)
1681
1682 def test_wpas_ctrl_socket_full(dev, apdev, test_params):
1683 """wpa_supplicant control socket and full send buffer"""
1684 if not dev[0].ping():
1685 raise Exception("Could not ping wpa_supplicant at the beginning of the test")
1686 dev[0].get_status()
1687
1688 counter = 0
1689
1690 s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
1691 local = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter)
1692 counter += 1
1693 s.bind(local)
1694 s.connect("/var/run/wpa_supplicant/wlan0")
1695 for i in range(20):
1696 logger.debug("Command %d" % i)
1697 try:
1698 s.send("MIB")
1699 except Exception, e:
1700 logger.info("Could not send command %d: %s" % (i, str(e)))
1701 break
1702 # Close without receiving response
1703 time.sleep(0.01)
1704
1705 if not dev[0].ping():
1706 raise Exception("Could not ping wpa_supplicant in the middle of the test")
1707 dev[0].get_status()
1708
1709 s2 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
1710 local2 = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter)
1711 counter += 1
1712 s2.bind(local2)
1713 s2.connect("/var/run/wpa_supplicant/wlan0")
1714 for i in range(10):
1715 logger.debug("Command %d [2]" % i)
1716 try:
1717 s2.send("MIB")
1718 except Exception, e:
1719 logger.info("Could not send command %d [2]: %s" % (i, str(e)))
1720 break
1721 # Close without receiving response
1722 time.sleep(0.01)
1723
1724 s.close()
1725 os.unlink(local)
1726
1727 for i in range(10):
1728 logger.debug("Command %d [3]" % i)
1729 try:
1730 s2.send("MIB")
1731 except Exception, e:
1732 logger.info("Could not send command %d [3]: %s" % (i, str(e)))
1733 break
1734 # Close without receiving response
1735 time.sleep(0.01)
1736
1737 s2.close()
1738 os.unlink(local2)
1739
1740 if not dev[0].ping():
1741 raise Exception("Could not ping wpa_supplicant in the middle of the test [2]")
1742 dev[0].get_status()
1743
1744 s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
1745 local = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter)
1746 counter += 1
1747 s.bind(local)
1748 s.connect("/var/run/wpa_supplicant/wlan0")
1749 s.send("ATTACH")
1750 res = s.recv(100)
1751 if "OK" not in res:
1752 raise Exception("Could not attach a test socket")
1753
1754 for i in range(5):
1755 dev[0].scan(freq=2412)
1756
1757 s.close()
1758 os.unlink(local)
1759
1760 for i in range(5):
1761 dev[0].scan(freq=2412)
1762
1763 if not dev[0].ping():
1764 raise Exception("Could not ping wpa_supplicant at the end of the test")
1765 dev[0].get_status()
1766
1767 def test_wpas_ctrl_event_burst(dev, apdev):
1768 """wpa_supplicant control socket and event burst"""
1769 if "OK" not in dev[0].request("EVENT_TEST 1000"):
1770 raise Exception("Could not request event messages")
1771
1772 total_i = 0
1773 total_g = 0
1774 for i in range(100):
1775 (i,g) = dev[0].dump_monitor()
1776 total_i += i
1777 total_g += g
1778 logger.info("Received i=%d g=%d" % (i, g))
1779 if total_i >= 1000 and total_g >= 1000:
1780 break
1781 time.sleep(0.05)
1782
1783 if total_i < 1000:
1784 raise Exception("Some per-interface events not seen: %d" % total_i)
1785 if total_g < 1000:
1786 raise Exception("Some global events not seen: %d" % total_g)
1787
1788 if not dev[0].ping():
1789 raise Exception("Could not ping wpa_supplicant at the end of the test")