1 # wpa_supplicant control interface
2 # Copyright (c) 2014, Qualcomm Atheros, Inc.
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
8 logger = logging.getLogger()
13 from wpasupplicant import WpaSupplicant
14 from utils import alloc_fail
16 def test_wpas_ctrl_network(dev):
17 """wpa_supplicant ctrl_iface network set/get"""
18 id = dev[0].add_network()
20 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id)):
21 raise Exception("Unexpected success for invalid SET_NETWORK")
22 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " name"):
23 raise Exception("Unexpected success for invalid SET_NETWORK")
24 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id + 1) + " proto OPEN"):
25 raise Exception("Unexpected success for invalid network id")
26 if "FAIL" not in dev[0].request("GET_NETWORK " + str(id)):
27 raise Exception("Unexpected success for invalid GET_NETWORK")
28 if "FAIL" not in dev[0].request("GET_NETWORK " + str(id + 1) + " proto"):
29 raise Exception("Unexpected success for invalid network id")
31 tests = (("key_mgmt", "WPA-PSK WPA-EAP IEEE8021X NONE WPA-NONE FT-PSK FT-EAP WPA-PSK-SHA256 WPA-EAP-SHA256"),
32 ("pairwise", "CCMP-256 GCMP-256 CCMP GCMP TKIP"),
33 ("group", "CCMP-256 GCMP-256 CCMP GCMP TKIP WEP104 WEP40"),
34 ("auth_alg", "OPEN SHARED LEAP"),
35 ("scan_freq", "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15"),
36 ("freq_list", "2412 2417"),
38 ("bssid", "00:11:22:33:44:55"),
39 ("proto", "WPA RSN OSEN"),
41 ("go_p2p_dev_addr", "22:33:44:55:66:aa"),
42 ("p2p_client_list", "22:33:44:55:66:bb 02:11:22:33:44:55"))
44 dev[0].set_network_quoted(id, "ssid", "test")
45 for field, value in tests:
46 dev[0].set_network(id, field, value)
47 res = dev[0].get_network(id, field)
49 raise Exception("Unexpected response for '" + field + "': '" + res + "'")
51 q_tests = (("identity", "hello"),
52 ("anonymous_identity", "foo@nowhere.com"))
53 for field, value in q_tests:
54 dev[0].set_network_quoted(id, field, value)
55 res = dev[0].get_network(id, field)
56 if res != '"' + value + '"':
57 raise Exception("Unexpected quoted response for '" + field + "': '" + res + "'")
59 get_tests = (("foo", None), ("ssid", '"test"'))
60 for field, value in get_tests:
61 res = dev[0].get_network(id, field)
63 raise Exception("Unexpected response for '" + field + "': '" + res + "'")
65 if dev[0].get_network(id, "password"):
66 raise Exception("Unexpected response for 'password'")
67 dev[0].set_network_quoted(id, "password", "foo")
68 if dev[0].get_network(id, "password") != '*':
69 raise Exception("Unexpected response for 'password' (expected *)")
70 dev[0].set_network(id, "password", "hash:12345678901234567890123456789012")
71 if dev[0].get_network(id, "password") != '*':
72 raise Exception("Unexpected response for 'password' (expected *)")
73 dev[0].set_network(id, "password", "NULL")
74 if dev[0].get_network(id, "password"):
75 raise Exception("Unexpected response for 'password'")
76 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " password hash:12"):
77 raise Exception("Unexpected success for invalid password hash")
78 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " password hash:123456789012345678x0123456789012"):
79 raise Exception("Unexpected success for invalid password hash")
81 dev[0].set_network(id, "identity", "414243")
82 if dev[0].get_network(id, "identity") != '"ABC"':
83 raise Exception("Unexpected identity hex->text response")
85 dev[0].set_network(id, "identity", 'P"abc\ndef"')
86 if dev[0].get_network(id, "identity") != "6162630a646566":
87 raise Exception("Unexpected identity printf->hex response")
89 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' identity P"foo'):
90 raise Exception("Unexpected success for invalid identity string")
92 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' identity 12x3'):
93 raise Exception("Unexpected success for invalid identity string")
96 if "FAIL" in dev[0].request("SET_NETWORK " + str(id) + ' wep_key' + str(i) + ' aabbccddee'):
97 raise Exception("Unexpected wep_key set failure")
98 if dev[0].get_network(id, "wep_key" + str(i)) != '*':
99 raise Exception("Unexpected wep_key get failure")
101 if "FAIL" in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
102 raise Exception("Unexpected failure for psk_list string")
104 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list 00:11:x2:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
105 raise Exception("Unexpected success for invalid psk_list string")
107 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:x2:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
108 raise Exception("Unexpected success for invalid psk_list string")
110 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55+0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
111 raise Exception("Unexpected success for invalid psk_list string")
113 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde'):
114 raise Exception("Unexpected success for invalid psk_list string")
116 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdex'):
117 raise Exception("Unexpected success for invalid psk_list string")
119 if dev[0].get_network(id, "psk_list"):
120 raise Exception("Unexpected psk_list get response")
122 if dev[0].list_networks()[0]['ssid'] != "test":
123 raise Exception("Unexpected ssid in LIST_NETWORKS")
124 dev[0].set_network(id, "ssid", "NULL")
125 if dev[0].list_networks()[0]['ssid'] != "":
126 raise Exception("Unexpected ssid in LIST_NETWORKS after clearing it")
128 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' ssid "0123456789abcdef0123456789abcdef0"'):
129 raise Exception("Too long SSID accepted")
130 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' scan_ssid qwerty'):
131 raise Exception("Invalid integer accepted")
132 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' scan_ssid 2'):
133 raise Exception("Too large integer accepted")
134 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk 12345678'):
135 raise Exception("Invalid PSK accepted")
136 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk "1234567"'):
137 raise Exception("Too short PSK accepted")
138 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk "1234567890123456789012345678901234567890123456789012345678901234"'):
139 raise Exception("Too long PSK accepted")
140 dev[0].set_network_quoted(id, "psk", "123456768");
141 dev[0].set_network_quoted(id, "psk", "123456789012345678901234567890123456789012345678901234567890123");
142 if dev[0].get_network(id, "psk") != '*':
143 raise Exception("Unexpected psk read result");
145 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' eap UNKNOWN'):
146 raise Exception("Unknown EAP method accepted")
148 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' password "foo'):
149 raise Exception("Invalid password accepted")
151 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' wep_key0 "foo'):
152 raise Exception("Invalid WEP key accepted")
153 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' wep_key0 "12345678901234567"'):
154 raise Exception("Too long WEP key accepted")
155 # too short WEP key is ignored
156 dev[0].set_network_quoted(id, "wep_key0", "1234")
157 dev[0].set_network_quoted(id, "wep_key1", "12345")
158 dev[0].set_network_quoted(id, "wep_key2", "1234567890123")
159 dev[0].set_network_quoted(id, "wep_key3", "1234567890123456")
161 dev[0].set_network(id, "go_p2p_dev_addr", "any")
162 if dev[0].get_network(id, "go_p2p_dev_addr") is not None:
163 raise Exception("Unexpected go_p2p_dev_addr value")
164 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' go_p2p_dev_addr 00:11:22:33:44'):
165 raise Exception("Invalid go_p2p_dev_addr accepted")
166 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' p2p_client_list 00:11:22:33:44'):
167 raise Exception("Invalid p2p_client_list accepted")
168 if "FAIL" in dev[0].request('SET_NETWORK ' + str(id) + ' p2p_client_list 00:11:22:33:44:55 00:1'):
169 raise Exception("p2p_client_list truncation workaround failed")
170 if dev[0].get_network(id, "p2p_client_list") != "00:11:22:33:44:55":
171 raise Exception("p2p_client_list truncation workaround did not work")
173 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' auth_alg '):
174 raise Exception("Empty auth_alg accepted")
175 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' auth_alg FOO'):
176 raise Exception("Invalid auth_alg accepted")
178 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' proto '):
179 raise Exception("Empty proto accepted")
180 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' proto FOO'):
181 raise Exception("Invalid proto accepted")
183 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise '):
184 raise Exception("Empty pairwise accepted")
185 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise FOO'):
186 raise Exception("Invalid pairwise accepted")
187 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise WEP40'):
188 raise Exception("Invalid pairwise accepted")
190 if "OK" not in dev[0].request('BSSID ' + str(id) + ' 00:11:22:33:44:55'):
191 raise Exception("Unexpected BSSID failure")
192 if dev[0].request("GET_NETWORK 0 bssid") != '00:11:22:33:44:55':
193 raise Exception("BSSID command did not set network bssid")
194 if "OK" not in dev[0].request('BSSID ' + str(id) + ' 00:00:00:00:00:00'):
195 raise Exception("Unexpected BSSID failure")
196 if "FAIL" not in dev[0].request("GET_NETWORK 0 bssid"):
197 raise Exception("bssid claimed configured after clearing")
198 if "FAIL" not in dev[0].request('BSSID 123 00:11:22:33:44:55'):
199 raise Exception("Unexpected BSSID success")
200 if "FAIL" not in dev[0].request('BSSID ' + str(id) + ' 00:11:22:33:44'):
201 raise Exception("Unexpected BSSID success")
202 if "FAIL" not in dev[0].request('BSSID ' + str(id)):
203 raise Exception("Unexpected BSSID success")
205 tests = [ "02:11:22:33:44:55",
206 "02:11:22:33:44:55 02:ae:be:ce:53:77",
207 "02:11:22:33:44:55/ff:00:ff:00:ff:00",
208 "02:11:22:33:44:55/ff:00:ff:00:ff:00 f2:99:88:77:66:55",
209 "f2:99:88:77:66:55 02:11:22:33:44:55/ff:00:ff:00:ff:00",
210 "f2:99:88:77:66:55 02:11:22:33:44:55/ff:00:ff:00:ff:00 12:34:56:78:90:ab",
211 "02:11:22:33:44:55/ff:ff:ff:00:00:00 02:ae:be:ce:53:77/00:00:00:00:00:ff" ]
213 dev[0].set_network(id, "bssid_blacklist", val)
214 res = dev[0].get_network(id, "bssid_blacklist")
216 raise Exception("Unexpected bssid_blacklist value: %s != %s" % (res, val))
217 dev[0].set_network(id, "bssid_whitelist", val)
218 res = dev[0].get_network(id, "bssid_whitelist")
220 raise Exception("Unexpected bssid_whitelist value: %s != %s" % (res, val))
224 "00:11:22:33:44:55q",
225 "00:11:22:33:44:55/",
226 "00:11:22:33:44:55/66:77:88:99:aa:b" ]
228 if "FAIL" not in dev[0].request("SET_NETWORK %d bssid_blacklist %s" % (id, val)):
229 raise Exception("Invalid bssid_blacklist value accepted")
231 def test_wpas_ctrl_many_networks(dev, apdev):
232 """wpa_supplicant ctrl_iface LIST_NETWORKS with huge number of networks"""
233 for i in range(1000):
234 id = dev[0].add_network()
235 res = dev[0].request("LIST_NETWORKS")
237 raise Exception("Last added network was unexpectedly included")
238 res = dev[0].request("LIST_NETWORKS LAST_ID=%d" % (id - 2))
239 if str(id) not in res:
240 raise Exception("Last added network was not present when using LAST_ID")
242 def test_wpas_ctrl_dup_network(dev, apdev):
243 """wpa_supplicant ctrl_iface DUP_NETWORK"""
245 passphrase = 'qwertyuiop'
246 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
247 hostapd.add_ap(apdev[0]['ifname'], params)
249 src = dev[0].connect("another", psk=passphrase, scan_freq="2412",
250 only_add_network=True)
251 id = dev[0].add_network()
252 dev[0].set_network_quoted(id, "ssid", ssid)
253 for f in [ "key_mgmt", "psk", "scan_freq" ]:
254 res = dev[0].request("DUP_NETWORK {} {} {}".format(src, id, f))
256 raise Exception("DUP_NETWORK failed")
257 dev[0].connect_network(id)
259 if "FAIL" not in dev[0].request("DUP_NETWORK "):
260 raise Exception("Unexpected DUP_NETWORK success")
261 if "FAIL" not in dev[0].request("DUP_NETWORK %d " % id):
262 raise Exception("Unexpected DUP_NETWORK success")
263 if "FAIL" not in dev[0].request("DUP_NETWORK %d %d" % (id, id)):
264 raise Exception("Unexpected DUP_NETWORK success")
265 if "FAIL" not in dev[0].request("DUP_NETWORK 123456 1234567 "):
266 raise Exception("Unexpected DUP_NETWORK success")
267 if "FAIL" not in dev[0].request("DUP_NETWORK %d 123456 " % id):
268 raise Exception("Unexpected DUP_NETWORK success")
269 if "FAIL" not in dev[0].request("DUP_NETWORK %d %d foo" % (id, id)):
270 raise Exception("Unexpected DUP_NETWORK success")
271 dev[0].request("DISCONNECT")
272 if "OK" not in dev[0].request("DUP_NETWORK %d %d ssid" % (id, id)):
273 raise Exception("Unexpected DUP_NETWORK failure")
277 ev = dev.wait_event(["CRED-ADDED"])
279 raise Exception("Missing CRED-ADDED event")
280 if " " + str(id) not in ev:
281 raise Exception("CRED-ADDED event without matching id")
284 def set_cred(dev, id, field, value):
285 dev.set_cred(id, field, value)
286 ev = dev.wait_event(["CRED-MODIFIED"])
288 raise Exception("Missing CRED-MODIFIED event")
289 if " " + str(id) + " " not in ev:
290 raise Exception("CRED-MODIFIED event without matching id")
292 raise Exception("CRED-MODIFIED event without matching field")
294 def set_cred_quoted(dev, id, field, value):
295 dev.set_cred_quoted(id, field, value)
296 ev = dev.wait_event(["CRED-MODIFIED"])
298 raise Exception("Missing CRED-MODIFIED event")
299 if " " + str(id) + " " not in ev:
300 raise Exception("CRED-MODIFIED event without matching id")
302 raise Exception("CRED-MODIFIED event without matching field")
304 def remove_cred(dev, id):
306 ev = dev.wait_event(["CRED-REMOVED"])
308 raise Exception("Missing CRED-REMOVED event")
309 if " " + str(id) not in ev:
310 raise Exception("CRED-REMOVED event without matching id")
312 def test_wpas_ctrl_cred(dev):
313 """wpa_supplicant ctrl_iface cred set"""
314 id1 = add_cred(dev[0])
315 if "FAIL" not in dev[0].request("SET_CRED " + str(id1 + 1) + " temporary 1"):
316 raise Exception("SET_CRED succeeded unexpectedly on unknown cred id")
317 if "FAIL" not in dev[0].request("SET_CRED " + str(id1)):
318 raise Exception("Invalid SET_CRED succeeded unexpectedly")
319 if "FAIL" not in dev[0].request("SET_CRED " + str(id1) + " temporary"):
320 raise Exception("Invalid SET_CRED succeeded unexpectedly")
321 if "FAIL" not in dev[0].request("GET_CRED " + str(id1 + 1) + " temporary"):
322 raise Exception("GET_CRED succeeded unexpectedly on unknown cred id")
323 if "FAIL" not in dev[0].request("GET_CRED " + str(id1)):
324 raise Exception("Invalid GET_CRED succeeded unexpectedly")
325 if "FAIL" not in dev[0].request("GET_CRED " + str(id1) + " foo"):
326 raise Exception("Invalid GET_CRED succeeded unexpectedly")
327 id = add_cred(dev[0])
328 id2 = add_cred(dev[0])
329 set_cred(dev[0], id, "temporary", "1")
330 set_cred(dev[0], id, "priority", "1")
331 set_cred(dev[0], id, "pcsc", "1")
332 set_cred_quoted(dev[0], id, "private_key_passwd", "test")
333 set_cred_quoted(dev[0], id, "domain_suffix_match", "test")
334 set_cred_quoted(dev[0], id, "phase1", "test")
335 set_cred_quoted(dev[0], id, "phase2", "test")
337 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " eap FOO"):
338 raise Exception("Unexpected success on unknown EAP method")
340 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " username 12xa"):
341 raise Exception("Unexpected success on invalid string")
343 for i in ("11", "1122", "112233445566778899aabbccddeeff00"):
344 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " roaming_consortium " + i):
345 raise Exception("Unexpected success on invalid roaming_consortium")
347 dev[0].set_cred(id, "excluded_ssid", "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff")
348 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " excluded_ssid 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00"):
349 raise Exception("Unexpected success on invalid excluded_ssid")
351 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " foo 4142"):
352 raise Exception("Unexpected success on unknown field")
354 id3 = add_cred(dev[0])
355 id4 = add_cred(dev[0])
356 if len(dev[0].request("LIST_CREDS").splitlines()) != 6:
357 raise Exception("Unexpected LIST_CREDS result(1)")
359 remove_cred(dev[0], id1)
360 remove_cred(dev[0], id3)
361 remove_cred(dev[0], id4)
362 remove_cred(dev[0], id2)
363 remove_cred(dev[0], id)
364 if "FAIL" not in dev[0].request("REMOVE_CRED 1"):
365 raise Exception("Unexpected success on invalid remove cred")
366 if len(dev[0].request("LIST_CREDS").splitlines()) != 1:
367 raise Exception("Unexpected LIST_CREDS result(2)")
369 id = add_cred(dev[0])
370 values = [ ("temporary", "1", False),
371 ("temporary", "0", False),
372 ("pcsc", "1", False),
373 ("realm", "example.com", True),
374 ("username", "user@example.com", True),
375 ("password", "foo", True, "*"),
376 ("ca_cert", "ca.pem", True),
377 ("client_cert", "user.pem", True),
378 ("private_key", "key.pem", True),
379 ("private_key_passwd", "foo", True, "*"),
380 ("imsi", "310026-000000000", True),
381 ("milenage", "foo", True, "*"),
382 ("domain_suffix_match", "example.com", True),
383 ("domain", "example.com", True),
384 ("domain", "example.org", True, "example.com\nexample.org"),
385 ("roaming_consortium", "0123456789", False),
386 ("required_roaming_consortium", "456789", False),
387 ("eap", "TTLS", False),
388 ("phase1", "foo=bar1", True),
389 ("phase2", "foo=bar2", True),
390 ("excluded_ssid", "test", True),
391 ("excluded_ssid", "foo", True, "test\nfoo"),
392 ("roaming_partner", "example.com,0,4,*", True),
393 ("roaming_partner", "example.org,1,2,US", True,
394 "example.com,0,4,*\nexample.org,1,2,US"),
395 ("update_identifier", "4", False),
396 ("provisioning_sp", "sp.example.com", True),
397 ("sp_priority", "7", False),
398 ("min_dl_bandwidth_home", "100", False),
399 ("min_ul_bandwidth_home", "101", False),
400 ("min_dl_bandwidth_roaming", "102", False),
401 ("min_ul_bandwidth_roaming", "103", False),
402 ("max_bss_load", "57", False),
403 ("req_conn_capab", "6:22,80,443", False),
404 ("req_conn_capab", "17:500", False, "6:22,80,443\n17:500"),
405 ("req_conn_capab", "50", False, "6:22,80,443\n17:500\n50"),
406 ("ocsp", "1", False) ]
409 set_cred_quoted(dev[0], id, v[0], v[1])
411 set_cred(dev[0], id, v[0], v[1])
412 val = dev[0].get_cred(id, v[0])
418 raise Exception("Unexpected GET_CRED value for {}: {} != {}".format(v[0], val, expect))
419 creds = dev[0].request("LIST_CREDS").splitlines()
421 raise Exception("Unexpected LIST_CREDS result(3)")
422 if creds[1] != "0\texample.com\tuser@example.com\texample.com\t310026-000000000":
423 raise Exception("Unexpected LIST_CREDS value")
424 remove_cred(dev[0], id)
425 if len(dev[0].request("LIST_CREDS").splitlines()) != 1:
426 raise Exception("Unexpected LIST_CREDS result(4)")
428 id = add_cred(dev[0])
429 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
430 id = add_cred(dev[0])
431 set_cred_quoted(dev[0], id, "domain", "bar.example.com")
432 id = add_cred(dev[0])
433 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
434 if "OK" not in dev[0].request("REMOVE_CRED sp_fqdn=foo.example.com"):
435 raise Exception("REMOVE_CRED failed")
436 creds = dev[0].request("LIST_CREDS")
437 if "foo.example.com" in creds:
438 raise Exception("REMOVE_CRED sp_fqdn did not remove cred")
439 if "bar.example.com" not in creds:
440 raise Exception("REMOVE_CRED sp_fqdn removed incorrect cred")
441 dev[0].request("REMOVE_CRED all")
443 id = add_cred(dev[0])
444 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
445 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.foo.example.com")
446 id = add_cred(dev[0])
447 set_cred_quoted(dev[0], id, "domain", "bar.example.com")
448 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.bar.example.com")
449 id = add_cred(dev[0])
450 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
451 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.foo.example.com")
452 if "OK" not in dev[0].request("REMOVE_CRED provisioning_sp=sp.foo.example.com"):
453 raise Exception("REMOVE_CRED failed")
454 creds = dev[0].request("LIST_CREDS")
455 if "foo.example.com" in creds:
456 raise Exception("REMOVE_CRED provisioning_sp did not remove cred")
457 if "bar.example.com" not in creds:
458 raise Exception("REMOVE_CRED provisioning_sp removed incorrect cred")
459 dev[0].request("REMOVE_CRED all")
461 # Test large number of creds and LIST_CREDS truncation
462 dev[0].dump_monitor()
463 for i in range(0, 100):
464 id = add_cred(dev[0])
465 set_cred_quoted(dev[0], id, "realm", "relatively.long.realm.test%d.example.com" % i)
466 dev[0].dump_monitor()
467 creds = dev[0].request("LIST_CREDS")
468 for i in range(0, 100):
469 dev[0].remove_cred(i)
470 dev[0].dump_monitor()
471 if len(creds) < 3900 or len(creds) > 4100:
472 raise Exception("Unexpected LIST_CREDS length: %d" % len(creds))
473 if "test10.example.com" not in creds:
474 raise Exception("Missing credential")
475 if len(creds.splitlines()) > 95:
476 raise Exception("Too many LIST_CREDS entries in the buffer")
478 def test_wpas_ctrl_pno(dev):
479 """wpa_supplicant ctrl_iface pno"""
480 if "FAIL" not in dev[0].request("SET pno 1"):
481 raise Exception("Unexpected success in enabling PNO without enabled network blocks")
482 id = dev[0].add_network()
483 dev[0].set_network_quoted(id, "ssid", "test")
484 dev[0].set_network(id, "key_mgmt", "NONE")
485 dev[0].request("ENABLE_NETWORK " + str(id) + " no-connect")
486 #mac80211_hwsim does not yet support PNO, so this fails
487 if "FAIL" not in dev[0].request("SET pno 1"):
488 raise Exception("Unexpected success in enabling PNO")
489 if "FAIL" not in dev[0].request("SET pno 1 freq=2000-3000,5180"):
490 raise Exception("Unexpected success in enabling PNO")
491 if "FAIL" not in dev[0].request("SET pno 1 freq=0-6000"):
492 raise Exception("Unexpected success in enabling PNO")
493 if "FAIL" in dev[0].request("SET pno 0"):
494 raise Exception("Unexpected failure in disabling PNO")
496 def test_wpas_ctrl_get(dev):
497 """wpa_supplicant ctrl_iface get"""
498 if "FAIL" in dev[0].request("GET version"):
499 raise Exception("Unexpected get failure for version")
500 if "FAIL" in dev[0].request("GET wifi_display"):
501 raise Exception("Unexpected get failure for wifi_display")
502 if "FAIL" not in dev[0].request("GET foo"):
503 raise Exception("Unexpected success on get command")
505 def test_wpas_ctrl_preauth(dev):
506 """wpa_supplicant ctrl_iface preauth"""
507 if "FAIL" not in dev[0].request("PREAUTH "):
508 raise Exception("Unexpected success on invalid PREAUTH")
509 if "FAIL" in dev[0].request("PREAUTH 00:11:22:33:44:55"):
510 raise Exception("Unexpected failure on PREAUTH")
512 def test_wpas_ctrl_stkstart(dev):
513 """wpa_supplicant ctrl_iface strkstart"""
514 if "FAIL" not in dev[0].request("STKSTART "):
515 raise Exception("Unexpected success on invalid STKSTART")
516 if "FAIL" not in dev[0].request("STKSTART 00:11:22:33:44:55"):
517 raise Exception("Unexpected success on STKSTART")
519 def test_wpas_ctrl_tdls_discover(dev):
520 """wpa_supplicant ctrl_iface tdls_discover"""
521 if "FAIL" not in dev[0].request("TDLS_DISCOVER "):
522 raise Exception("Unexpected success on invalid TDLS_DISCOVER")
523 if "FAIL" not in dev[0].request("TDLS_DISCOVER 00:11:22:33:44:55"):
524 raise Exception("Unexpected success on TDLS_DISCOVER")
526 def test_wpas_ctrl_tdls_chan_switch(dev):
527 """wpa_supplicant ctrl_iface tdls_chan_switch error cases"""
528 for args in [ '', '00:11:22:33:44:55' ]:
529 if "FAIL" not in dev[0].request("TDLS_CANCEL_CHAN_SWITCH " + args):
530 raise Exception("Unexpected success on invalid TDLS_CANCEL_CHAN_SWITCH: " + args)
532 for args in [ '', 'foo ', '00:11:22:33:44:55 ', '00:11:22:33:44:55 q',
533 '00:11:22:33:44:55 81', '00:11:22:33:44:55 81 1234',
534 '00:11:22:33:44:55 81 1234 center_freq1=234 center_freq2=345 bandwidth=456 sec_channel_offset=567 ht vht' ]:
535 if "FAIL" not in dev[0].request("TDLS_CHAN_SWITCH " + args):
536 raise Exception("Unexpected success on invalid TDLS_CHAN_SWITCH: " + args)
538 def test_wpas_ctrl_addr(dev):
539 """wpa_supplicant ctrl_iface invalid address"""
540 if "FAIL" not in dev[0].request("TDLS_SETUP "):
541 raise Exception("Unexpected success on invalid TDLS_SETUP")
542 if "FAIL" not in dev[0].request("TDLS_TEARDOWN "):
543 raise Exception("Unexpected success on invalid TDLS_TEARDOWN")
544 if "FAIL" not in dev[0].request("FT_DS "):
545 raise Exception("Unexpected success on invalid FT_DS")
546 if "FAIL" not in dev[0].request("WPS_PBC 00:11:22:33:44"):
547 raise Exception("Unexpected success on invalid WPS_PBC")
548 if "FAIL" not in dev[0].request("WPS_PIN 00:11:22:33:44"):
549 raise Exception("Unexpected success on invalid WPS_PIN")
550 if "FAIL" not in dev[0].request("WPS_NFC 00:11:22:33:44"):
551 raise Exception("Unexpected success on invalid WPS_NFC")
552 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44 12345670"):
553 raise Exception("Unexpected success on invalid WPS_REG")
554 if "FAIL" not in dev[0].request("IBSS_RSN 00:11:22:33:44"):
555 raise Exception("Unexpected success on invalid IBSS_RSN")
556 if "FAIL" not in dev[0].request("BLACKLIST 00:11:22:33:44"):
557 raise Exception("Unexpected success on invalid BLACKLIST")
559 def test_wpas_ctrl_wps_errors(dev):
560 """wpa_supplicant ctrl_iface WPS error cases"""
561 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55"):
562 raise Exception("Unexpected success on invalid WPS_REG")
563 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233"):
564 raise Exception("Unexpected success on invalid WPS_REG")
565 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233 OPEN"):
566 raise Exception("Unexpected success on invalid WPS_REG")
567 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233 OPEN NONE"):
568 raise Exception("Unexpected success on invalid WPS_REG")
570 if "FAIL" not in dev[0].request("WPS_AP_PIN random"):
571 raise Exception("Unexpected success on WPS_AP_PIN in non-AP mode")
573 if "FAIL" not in dev[0].request("WPS_ER_PIN any"):
574 raise Exception("Unexpected success on invalid WPS_ER_PIN")
576 if "FAIL" not in dev[0].request("WPS_ER_LEARN 00:11:22:33:44:55"):
577 raise Exception("Unexpected success on invalid WPS_ER_LEARN")
579 if "FAIL" not in dev[0].request("WPS_ER_SET_CONFIG 00:11:22:33:44:55"):
580 raise Exception("Unexpected success on invalid WPS_ER_SET_CONFIG")
582 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55"):
583 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
584 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670"):
585 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
586 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233"):
587 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
588 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233 OPEN"):
589 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
590 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233 OPEN NONE"):
591 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
593 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN WPS"):
594 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN")
595 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN FOO 00:11:22:33:44:55"):
596 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN")
597 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN NDEF 00:11:22:33:44:55"):
598 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN")
600 if "FAIL" not in dev[0].request("WPS_NFC_CONFIG_TOKEN FOO"):
601 raise Exception("Unexpected success on invalid WPS_NFC_CONFIG_TOKEN")
602 if "FAIL" not in dev[0].request("WPS_NFC_CONFIG_TOKEN WPS FOO"):
603 raise Exception("Unexpected success on invalid WPS_NFC_CONFIG_TOKEN")
604 if "FAIL" not in dev[0].request("WPS_NFC_TOKEN FOO"):
605 raise Exception("Unexpected success on invalid WPS_NFC_TOKEN")
607 def test_wpas_ctrl_config_parser(dev):
608 """wpa_supplicant ctrl_iface SET config parser"""
609 if "FAIL" not in dev[0].request("SET pbc_in_m1 qwerty"):
610 raise Exception("Non-number accepted as integer")
611 if "FAIL" not in dev[0].request("SET eapol_version 0"):
612 raise Exception("Out-of-range value accepted")
613 if "FAIL" not in dev[0].request("SET eapol_version 10"):
614 raise Exception("Out-of-range value accepted")
616 if "FAIL" not in dev[0].request("SET serial_number 0123456789abcdef0123456789abcdef0"):
617 raise Exception("Too long string accepted")
619 def test_wpas_ctrl_mib(dev):
620 """wpa_supplicant ctrl_iface MIB"""
621 mib = dev[0].get_mib()
622 if "dot11RSNAOptionImplemented" not in mib:
623 raise Exception("Missing MIB entry")
624 if mib["dot11RSNAOptionImplemented"] != "TRUE":
625 raise Exception("Unexpected dot11RSNAOptionImplemented value")
627 def test_wpas_ctrl_set_wps_params(dev):
628 """wpa_supplicant ctrl_iface SET config_methods"""
629 ts = [ "config_methods label virtual_display virtual_push_button keypad",
630 "device_type 1-0050F204-1",
631 "os_version 01020300",
632 "uuid 12345678-9abc-def0-1234-56789abcdef0" ]
634 if "OK" not in dev[2].request("SET " + t):
635 raise Exception("SET failed for: " + t)
637 def test_wpas_ctrl_level(dev):
638 """wpa_supplicant ctrl_iface LEVEL"""
640 if "FAIL" not in dev[2].request("LEVEL 3"):
641 raise Exception("Unexpected LEVEL success")
642 if "OK" not in dev[2].mon.request("LEVEL 2"):
643 raise Exception("Unexpected LEVEL failure")
644 dev[2].request("SCAN freq=2412")
645 ev = dev[2].wait_event(["State:"], timeout=5)
647 raise Exception("No debug message received")
648 dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=5)
650 dev[2].mon.request("LEVEL 3")
652 def test_wpas_ctrl_bssid_filter(dev, apdev):
653 """wpa_supplicant bssid_filter"""
655 if "OK" not in dev[2].request("SET bssid_filter " + apdev[0]['bssid']):
656 raise Exception("Failed to set bssid_filter")
657 params = { "ssid": "test" }
658 hostapd.add_ap(apdev[0]['ifname'], params)
659 hostapd.add_ap(apdev[1]['ifname'], params)
660 dev[2].scan_for_bss(apdev[0]['bssid'], freq="2412")
661 dev[2].scan(freq="2412")
662 bss = dev[2].get_bss(apdev[0]['bssid'])
663 if bss is None or len(bss) == 0:
664 raise Exception("Missing BSS data")
665 bss = dev[2].get_bss(apdev[1]['bssid'])
666 if bss and len(bss) != 0:
667 raise Exception("Unexpected BSS data")
668 dev[2].request("SET bssid_filter ")
669 dev[2].scan(freq="2412")
670 bss = dev[2].get_bss(apdev[0]['bssid'])
671 if bss is None or len(bss) == 0:
672 raise Exception("Missing BSS data")
673 bss = dev[2].get_bss(apdev[1]['bssid'])
674 if bss is None or len(bss) == 0:
675 raise Exception("Missing BSS data(2)")
676 res = dev[2].request("SCAN_RESULTS").splitlines()
677 if "test" not in res[1] or "test" not in res[2]:
678 raise Exception("SSID missing from SCAN_RESULTS")
679 if apdev[0]['bssid'] not in res[1] and apdev[1]['bssid'] not in res[1]:
680 raise Exception("BSS1 missing from SCAN_RESULTS")
681 if apdev[0]['bssid'] not in res[2] and apdev[1]['bssid'] not in res[2]:
682 raise Exception("BSS1 missing from SCAN_RESULTS")
684 if "FAIL" not in dev[2].request("SET bssid_filter 00:11:22:33:44:55 00:11:22:33:44"):
685 raise Exception("Unexpected success for invalid SET bssid_filter")
687 dev[2].request("SET bssid_filter ")
689 def test_wpas_ctrl_disallow_aps(dev, apdev):
690 """wpa_supplicant ctrl_iface disallow_aps"""
691 params = { "ssid": "test" }
692 hostapd.add_ap(apdev[0]['ifname'], params)
694 if "FAIL" not in dev[0].request("SET disallow_aps bssid "):
695 raise Exception("Unexpected success on invalid disallow_aps")
696 if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44"):
697 raise Exception("Unexpected success on invalid disallow_aps")
698 if "FAIL" not in dev[0].request("SET disallow_aps ssid 0"):
699 raise Exception("Unexpected success on invalid disallow_aps")
700 if "FAIL" not in dev[0].request("SET disallow_aps ssid 4q"):
701 raise Exception("Unexpected success on invalid disallow_aps")
702 if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 ssid 112233 ssid 123"):
703 raise Exception("Unexpected success on invalid disallow_aps")
704 if "FAIL" not in dev[0].request("SET disallow_aps ssid 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f00"):
705 raise Exception("Unexpected success on invalid disallow_aps")
706 if "FAIL" not in dev[0].request("SET disallow_aps foo 112233445566"):
707 raise Exception("Unexpected success on invalid disallow_aps")
709 dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
710 hostapd.add_ap(apdev[1]['ifname'], params)
711 dev[0].dump_monitor()
712 if "OK" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 bssid 00:22:33:44:55:66"):
713 raise Exception("Failed to set disallow_aps")
714 if "OK" not in dev[0].request("SET disallow_aps bssid " + apdev[0]['bssid']):
715 raise Exception("Failed to set disallow_aps")
716 ev = dev[0].wait_connected(timeout=15, error="Reassociation timed out")
717 if apdev[1]['bssid'] not in ev:
718 raise Exception("Unexpected BSSID")
720 dev[0].dump_monitor()
721 if "OK" not in dev[0].request("SET disallow_aps ssid " + "test".encode("hex")):
722 raise Exception("Failed to set disallow_aps")
723 dev[0].wait_disconnected(timeout=5, error="Disconnection not seen")
724 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
726 raise Exception("Unexpected reassociation")
728 dev[0].request("DISCONNECT")
729 dev[0].p2p_start_go(freq=2412)
730 if "OK" not in dev[0].request("SET disallow_aps "):
731 raise Exception("Failed to set disallow_aps")
733 def test_wpas_ctrl_blob(dev):
734 """wpa_supplicant ctrl_iface SET blob"""
735 if "FAIL" not in dev[0].request("SET blob foo"):
736 raise Exception("Unexpected SET success")
737 if "FAIL" not in dev[0].request("SET blob foo 0"):
738 raise Exception("Unexpected SET success")
739 if "FAIL" not in dev[0].request("SET blob foo 0q"):
740 raise Exception("Unexpected SET success")
741 if "OK" not in dev[0].request("SET blob foo 00"):
742 raise Exception("Unexpected SET failure")
743 if "OK" not in dev[0].request("SET blob foo 0011"):
744 raise Exception("Unexpected SET failure")
746 def test_wpas_ctrl_set_uapsd(dev):
747 """wpa_supplicant ctrl_iface SET uapsd"""
748 if "FAIL" not in dev[0].request("SET uapsd foo"):
749 raise Exception("Unexpected SET success")
750 if "FAIL" not in dev[0].request("SET uapsd 0,0,0"):
751 raise Exception("Unexpected SET success")
752 if "FAIL" not in dev[0].request("SET uapsd 0,0"):
753 raise Exception("Unexpected SET success")
754 if "FAIL" not in dev[0].request("SET uapsd 0"):
755 raise Exception("Unexpected SET success")
756 if "OK" not in dev[0].request("SET uapsd 1,1,1,1;1"):
757 raise Exception("Unexpected SET failure")
758 if "OK" not in dev[0].request("SET uapsd 0,0,0,0;0"):
759 raise Exception("Unexpected SET failure")
760 if "OK" not in dev[0].request("SET uapsd disable"):
761 raise Exception("Unexpected SET failure")
763 def test_wpas_ctrl_set(dev):
764 """wpa_supplicant ctrl_iface SET"""
770 "dot11RSNAConfigPMKLifetime 0",
771 "dot11RSNAConfigPMKReauthThreshold 101",
772 "dot11RSNAConfigSATimeout 0",
773 "wps_version_number -1",
774 "wps_version_number 256" ]
776 if "FAIL" not in dev[0].request("SET " + val):
777 raise Exception("Unexpected SET success for " + val)
779 vals = [ "EAPOL::heldPeriod 60",
780 "EAPOL::authPeriod 30",
781 "EAPOL::startPeriod 30",
783 "dot11RSNAConfigSATimeout 60",
790 if "OK" not in dev[0].request("SET " + val):
791 raise Exception("Unexpected SET failure for " + val)
793 def test_wpas_ctrl_get_capability(dev):
794 """wpa_supplicant ctrl_iface GET_CAPABILITY"""
795 if "FAIL" not in dev[0].request("GET_CAPABILITY 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"):
796 raise Exception("Unexpected success on invalid GET_CAPABILITY")
797 if "FAIL" not in dev[0].request("GET_CAPABILITY eap foo"):
798 raise Exception("Unexpected success on invalid GET_CAPABILITY")
799 if "AP" not in dev[0].request("GET_CAPABILITY modes strict"):
800 raise Exception("Unexpected GET_CAPABILITY response")
801 res = dev[0].get_capability("eap")
802 if "TTLS" not in res:
803 raise Exception("Unexpected GET_CAPABILITY eap response: " + str(res))
805 res = dev[0].get_capability("pairwise")
806 if "CCMP" not in res:
807 raise Exception("Unexpected GET_CAPABILITY pairwise response: " + str(res))
809 res = dev[0].get_capability("group")
810 if "CCMP" not in res:
811 raise Exception("Unexpected GET_CAPABILITY group response: " + str(res))
813 res = dev[0].get_capability("key_mgmt")
814 if "WPA-PSK" not in res or "WPA-EAP" not in res:
815 raise Exception("Unexpected GET_CAPABILITY key_mgmt response: " + str(res))
817 res = dev[0].get_capability("proto")
818 if "WPA" not in res or "RSN" not in res:
819 raise Exception("Unexpected GET_CAPABILITY proto response: " + str(res))
821 res = dev[0].get_capability("auth_alg")
822 if "OPEN" not in res or "SHARED" not in res:
823 raise Exception("Unexpected GET_CAPABILITY auth_alg response: " + str(res))
825 res = dev[0].get_capability("modes")
826 if "IBSS" not in res or "AP" not in res:
827 raise Exception("Unexpected GET_CAPABILITY modes response: " + str(res))
829 res = dev[0].get_capability("channels")
830 if "8" not in res or "36" not in res:
831 raise Exception("Unexpected GET_CAPABILITY channels response: " + str(res))
833 res = dev[0].get_capability("freq")
834 if "2457" not in res or "5180" not in res:
835 raise Exception("Unexpected GET_CAPABILITY freq response: " + str(res))
837 res = dev[0].get_capability("tdls")
838 if "EXTERNAL" not in res[0]:
839 raise Exception("Unexpected GET_CAPABILITY tdls response: " + str(res))
841 res = dev[0].get_capability("erp")
842 if res is None or "ERP" not in res[0]:
843 raise Exception("Unexpected GET_CAPABILITY erp response: " + str(res))
845 if dev[0].get_capability("foo") is not None:
846 raise Exception("Unexpected GET_CAPABILITY foo response: " + str(res))
848 def test_wpas_ctrl_nfc_report_handover(dev):
849 """wpa_supplicant ctrl_iface NFC_REPORT_HANDOVER"""
860 if "FAIL" not in dev[0].request("NFC_REPORT_HANDOVER " + v):
861 raise Exception("Unexpected NFC_REPORT_HANDOVER success for " + v)
863 def test_wpas_ctrl_nfc_tag_read(dev):
864 """wpa_supplicant ctrl_iface WPS_NFC_TAG_READ"""
865 vals = [ "FOO", "0Q", "00", "000000", "10000001", "10000000", "00000000",
866 "100e0000", "100e0001ff", "100e000411110000", "100e0004100e0001" ]
868 if "FAIL" not in dev[0].request("WPS_NFC_TAG_READ " + v):
869 raise Exception("Unexpected WPS_NFC_TAG_READ success for " + v)
871 def test_wpas_ctrl_nfc_get_handover(dev):
872 """wpa_supplicant ctrl_iface NFC_GET_HANDOVER"""
873 vals = [ "FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P" ]
875 if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_REQ " + v):
876 raise Exception("Unexpected NFC_GET_HANDOVER_REQ success for " + v)
878 vals = [ "NDEF WPS", "NDEF P2P-CR", "WPS P2P-CR" ]
880 if "FAIL" in dev[0].request("NFC_GET_HANDOVER_REQ " + v):
881 raise Exception("Unexpected NFC_GET_HANDOVER_REQ failure for " + v)
883 vals = [ "FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P",
884 "NDEF WPS", "NDEF WPS uuid" ]
886 if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_SEL " + v):
887 raise Exception("Unexpected NFC_GET_HANDOVER_SEL success for " + v)
889 vals = [ "NDEF P2P-CR", "WPS P2P-CR", "NDEF P2P-CR-TAG",
892 if "FAIL" in dev[0].request("NFC_GET_HANDOVER_SEL " + v):
893 raise Exception("Unexpected NFC_GET_HANDOVER_SEL failure for " + v)
895 def get_blacklist(dev):
896 return dev.request("BLACKLIST").splitlines()
898 def test_wpas_ctrl_blacklist(dev):
899 """wpa_supplicant ctrl_iface BLACKLIST"""
900 if "OK" not in dev[0].request("BLACKLIST clear"):
901 raise Exception("BLACKLIST clear failed")
902 b = get_blacklist(dev[0])
904 raise Exception("Unexpected blacklist contents: " + str(b))
905 if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:55"):
906 raise Exception("BLACKLIST add failed")
907 b = get_blacklist(dev[0])
908 if "00:11:22:33:44:55" not in b:
909 raise Exception("Unexpected blacklist contents: " + str(b))
910 if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:56"):
911 raise Exception("BLACKLIST add failed")
912 b = get_blacklist(dev[0])
913 if "00:11:22:33:44:55" not in b or "00:11:22:33:44:56" not in b:
914 raise Exception("Unexpected blacklist contents: " + str(b))
915 if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:56"):
916 raise Exception("BLACKLIST add failed")
917 b = get_blacklist(dev[0])
918 if "00:11:22:33:44:55" not in b or "00:11:22:33:44:56" not in b or len(b) != 2:
919 raise Exception("Unexpected blacklist contents: " + str(b))
921 if "OK" not in dev[0].request("BLACKLIST clear"):
922 raise Exception("BLACKLIST clear failed")
923 if dev[0].request("BLACKLIST") != "":
924 raise Exception("Unexpected blacklist contents")
926 def test_wpas_ctrl_blacklist_oom(dev):
927 """wpa_supplicant ctrl_iface BLACKLIST and out-of-memory"""
928 with alloc_fail(dev[0], 1, "wpa_blacklist_add"):
929 if "FAIL" not in dev[0].request("BLACKLIST aa:bb:cc:dd:ee:ff"):
930 raise Exception("Unexpected success with allocation failure")
932 def test_wpas_ctrl_log_level(dev):
933 """wpa_supplicant ctrl_iface LOG_LEVEL"""
934 level = dev[2].request("LOG_LEVEL")
935 if "Current level: MSGDUMP" not in level:
936 raise Exception("Unexpected debug level(1): " + level)
937 if "Timestamp: 1" not in level:
938 raise Exception("Unexpected timestamp(1): " + level)
940 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 0"):
941 raise Exception("LOG_LEVEL failed")
942 level = dev[2].request("LOG_LEVEL")
943 if "Current level: MSGDUMP" not in level:
944 raise Exception("Unexpected debug level(2): " + level)
945 if "Timestamp: 0" not in level:
946 raise Exception("Unexpected timestamp(2): " + level)
948 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 1"):
949 raise Exception("LOG_LEVEL failed")
950 level = dev[2].request("LOG_LEVEL")
951 if "Current level: MSGDUMP" not in level:
952 raise Exception("Unexpected debug level(3): " + level)
953 if "Timestamp: 1" not in level:
954 raise Exception("Unexpected timestamp(3): " + level)
956 if "FAIL" not in dev[2].request("LOG_LEVEL FOO"):
957 raise Exception("Invalid LOG_LEVEL accepted")
959 for lev in [ "EXCESSIVE", "MSGDUMP", "DEBUG", "INFO", "WARNING", "ERROR" ]:
960 if "OK" not in dev[2].request("LOG_LEVEL " + lev):
961 raise Exception("LOG_LEVEL failed for " + lev)
962 level = dev[2].request("LOG_LEVEL")
963 if "Current level: " + lev not in level:
964 raise Exception("Unexpected debug level: " + level)
966 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 1"):
967 raise Exception("LOG_LEVEL failed")
968 level = dev[2].request("LOG_LEVEL")
969 if "Current level: MSGDUMP" not in level:
970 raise Exception("Unexpected debug level(3): " + level)
971 if "Timestamp: 1" not in level:
972 raise Exception("Unexpected timestamp(3): " + level)
974 def test_wpas_ctrl_enable_disable_network(dev, apdev):
975 """wpa_supplicant ctrl_iface ENABLE/DISABLE_NETWORK"""
976 params = { "ssid": "test" }
977 hostapd.add_ap(apdev[0]['ifname'], params)
979 id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412",
980 only_add_network=True)
981 if "OK" not in dev[0].request("DISABLE_NETWORK " + str(id)):
982 raise Exception("Failed to disable network")
983 if "OK" not in dev[0].request("ENABLE_NETWORK " + str(id) + " no-connect"):
984 raise Exception("Failed to enable network")
985 if "OK" not in dev[0].request("DISABLE_NETWORK all"):
986 raise Exception("Failed to disable networks")
987 if "OK" not in dev[0].request("ENABLE_NETWORK " + str(id)):
988 raise Exception("Failed to enable network")
989 dev[0].wait_connected(timeout=10)
990 if "OK" not in dev[0].request("DISABLE_NETWORK " + str(id)):
991 raise Exception("Failed to disable network")
992 dev[0].wait_disconnected(timeout=10)
995 if "OK" not in dev[0].request("ENABLE_NETWORK all"):
996 raise Exception("Failed to enable network")
997 dev[0].wait_connected(timeout=10)
998 if "OK" not in dev[0].request("DISABLE_NETWORK all"):
999 raise Exception("Failed to disable network")
1000 dev[0].wait_disconnected(timeout=10)
1002 def test_wpas_ctrl_country(dev, apdev):
1003 """wpa_supplicant SET/GET country code"""
1005 # work around issues with possible pending regdom event from the end of
1006 # the previous test case
1008 dev[0].dump_monitor()
1010 if "OK" not in dev[0].request("SET country FI"):
1011 raise Exception("Failed to set country code")
1012 if dev[0].request("GET country") != "FI":
1013 raise Exception("Country code set failed")
1014 ev = dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"])
1016 raise Exception("regdom change event not seen")
1017 if "init=USER type=COUNTRY alpha2=FI" not in ev:
1018 raise Exception("Unexpected event contents: " + ev)
1019 dev[0].request("SET country 00")
1020 if dev[0].request("GET country") != "00":
1021 raise Exception("Country code set failed")
1022 ev = dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"])
1024 raise Exception("regdom change event not seen")
1025 if "init=CORE type=WORLD" not in ev:
1026 raise Exception("Unexpected event contents: " + ev)
1028 subprocess.call(['sudo', 'iw', 'reg', 'set', '00'])
1030 def test_wpas_ctrl_suspend_resume(dev):
1031 """wpa_supplicant SUSPEND/RESUME"""
1032 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1033 wpas.interface_add("wlan5")
1034 if "OK" not in wpas.global_request("SUSPEND"):
1035 raise Exception("SUSPEND failed")
1037 if "OK" not in wpas.global_request("RESUME"):
1038 raise Exception("RESUME failed")
1039 if "OK" not in wpas.request("SUSPEND"):
1040 raise Exception("Per-interface SUSPEND failed")
1041 if "OK" not in wpas.request("RESUME"):
1042 raise Exception("Per-interface RESUME failed")
1043 ev = wpas.wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10)
1045 raise Exception("Scan not completed")
1047 def test_wpas_ctrl_global(dev):
1048 """wpa_supplicant global control interface"""
1049 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1050 wpas.interface_add("wlan5")
1052 if "PONG" not in wpas.global_request("PING"):
1053 raise Exception("PING failed")
1054 if "wlan5" not in wpas.global_request("INTERFACES"):
1055 raise Exception("Interface not found")
1056 if "UNKNOWN COMMAND" not in wpas.global_request("FOO"):
1057 raise Exception("Unexpected response to unknown command")
1058 if "PONG" not in wpas.global_request("IFNAME=wlan5 PING"):
1059 raise Exception("Per-interface PING failed")
1060 if "FAIL-NO-IFNAME-MATCH" not in wpas.global_request("IFNAME=notfound PING"):
1061 raise Exception("Unknown interface not reported correctly")
1062 if "FAIL" not in wpas.global_request("SAVE_CONFIG"):
1063 raise Exception("SAVE_CONFIG succeeded unexpectedly")
1064 if "OK" not in wpas.global_request("SET wifi_display 0"):
1065 raise Exception("SET failed")
1066 if "wifi_display=0" not in wpas.global_request("STATUS"):
1067 raise Exception("wifi_display not disabled")
1068 if "OK" not in wpas.global_request("SET wifi_display 1"):
1069 raise Exception("SET failed")
1070 if "wifi_display=1" not in wpas.global_request("STATUS"):
1071 raise Exception("wifi_display not enabled")
1072 if "FAIL" not in wpas.global_request("SET foo 1"):
1073 raise Exception("SET succeeded unexpectedly")
1075 if "p2p_state=IDLE" not in wpas.global_request("STATUS"):
1076 raise Exception("P2P was disabled")
1077 wpas.request("P2P_SET disabled 1")
1078 if "p2p_state=DISABLED" not in wpas.global_request("STATUS"):
1079 raise Exception("P2P was not disabled")
1080 wpas.request("P2P_SET disabled 0")
1081 if "p2p_state=IDLE" not in wpas.global_request("STATUS"):
1082 raise Exception("P2P was not enabled")
1084 # driver_nl80211.c does not support interface list, so do not fail because
1086 logger.debug(wpas.global_request("INTERFACE_LIST"))
1088 if "FAIL" not in wpas.global_request("INTERFACE_ADD "):
1089 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1090 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO"):
1091 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1092 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf"):
1093 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1094 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver"):
1095 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1096 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface"):
1097 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1098 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam"):
1099 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1100 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam bridge"):
1101 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1102 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam bridge foo"):
1103 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1104 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO "):
1105 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1107 def test_wpas_ctrl_roam(dev, apdev):
1108 """wpa_supplicant ctrl_iface ROAM error cases"""
1109 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44"):
1110 raise Exception("Unexpected success")
1111 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"):
1112 raise Exception("Unexpected success")
1113 params = { "ssid": "test" }
1114 hostapd.add_ap(apdev[0]['ifname'], params)
1115 id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
1116 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"):
1117 raise Exception("Unexpected success")
1119 def test_wpas_ctrl_ipaddr(dev, apdev):
1120 """wpa_supplicant IP address in STATUS"""
1122 subprocess.call(['ip', 'addr', 'add', '10.174.65.207/32', 'dev',
1124 ipaddr = dev[0].get_status_field('ip_address')
1125 if ipaddr != '10.174.65.207':
1126 raise Exception("IP address not in STATUS output")
1128 subprocess.call(['ip', 'addr', 'del', '10.174.65.207/32', 'dev',
1131 def test_wpas_ctrl_neighbor_rep_req(dev, apdev):
1132 """wpa_supplicant ctrl_iface NEIGHBOR_REP_REQUEST"""
1133 params = { "ssid": "test" }
1134 hostapd.add_ap(apdev[0]['ifname'], params)
1135 params = { "ssid": "test2", "radio_measurements": "1" }
1136 hostapd.add_ap(apdev[1]['ifname'], params)
1138 dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
1139 if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
1140 raise Exception("Request succeeded unexpectedly")
1141 if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=abcdef"):
1142 raise Exception("Request succeeded unexpectedly")
1143 dev[0].request("DISCONNECT")
1145 rrm = int(dev[0].get_driver_status_field("capa.rrm_flags"), 16)
1146 if rrm & 0x5 != 0x5:
1147 logger.info("Driver does not support required RRM capabilities - skip rest of the test case")
1150 dev[0].connect("test2", key_mgmt="NONE", scan_freq="2412")
1152 # These requests are expected to get sent properly, but since hostapd does
1153 # not yet support processing of the request, these are expected to fail.
1155 if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
1156 raise Exception("Request failed")
1157 ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
1158 "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
1160 raise Exception("RRM report result not indicated")
1161 logger.info("RRM result: " + ev)
1163 if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=abcdef"):
1164 raise Exception("Request failed")
1165 ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
1166 "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
1168 raise Exception("RRM report result not indicated")
1169 logger.info("RRM result: " + ev)
1171 def test_wpas_ctrl_rsp(dev, apdev):
1172 """wpa_supplicant ctrl_iface CTRL-RSP-"""
1173 if "FAIL" not in dev[0].request("CTRL-RSP-"):
1174 raise Exception("Request succeeded unexpectedly")
1175 if "FAIL" not in dev[0].request("CTRL-RSP-foo-"):
1176 raise Exception("Request succeeded unexpectedly")
1177 if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567"):
1178 raise Exception("Request succeeded unexpectedly")
1179 if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567:"):
1180 raise Exception("Request succeeded unexpectedly")
1181 id = dev[0].add_network()
1182 if "FAIL" not in dev[0].request("CTRL-RSP-foo-%d:" % id):
1183 raise Exception("Request succeeded unexpectedly")
1184 for req in [ "IDENTITY", "PASSWORD", "NEW_PASSWORD", "PIN", "OTP",
1185 "PASSPHRASE", "SIM" ]:
1186 if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)):
1187 raise Exception("Request failed unexpectedly")
1188 if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)):
1189 raise Exception("Request failed unexpectedly")
1191 def test_wpas_ctrl_vendor(dev, apdev):
1192 """wpa_supplicant ctrl_iface VENDOR"""
1199 if "FAIL" not in dev[0].request("VENDOR " + cmd):
1200 raise Exception("Invalid VENDOR command accepted: " + cmd)
1202 def test_wpas_ctrl_mgmt_tx(dev, apdev):
1203 """wpa_supplicant ctrl_iface MGMT_TX"""
1205 "00:11:22:33:44:55 foo",
1206 "00:11:22:33:44:55 11:22:33:44:55:66",
1207 "00:11:22:33:44:55 11:22:33:44:55:66 freq=0 no_cck=0 wait_time=0 action=123",
1208 "00:11:22:33:44:55 11:22:33:44:55:66 action=12qq" ]
1210 if "FAIL" not in dev[0].request("MGMT_TX " + cmd):
1211 raise Exception("Invalid MGMT_TX command accepted: " + cmd)
1213 if "OK" not in dev[0].request("MGMT_TX_DONE"):
1214 raise Exception("MGMT_TX_DONE failed")
1216 def test_wpas_ctrl_driver_event(dev, apdev):
1217 """wpa_supplicant ctrl_iface DRIVER_EVENT"""
1218 if "FAIL" not in dev[0].request("DRIVER_EVENT foo"):
1219 raise Exception("Invalid DRIVER_EVENT accepted")
1221 def test_wpas_ctrl_eapol_rx(dev, apdev):
1222 """wpa_supplicant ctrl_iface EAPOL_RX"""
1224 "00:11:22:33:44:55 123",
1225 "00:11:22:33:44:55 12qq" ]
1227 if "FAIL" not in dev[0].request("EAPOL_RX " + cmd):
1228 raise Exception("Invalid EAPOL_RX command accepted: " + cmd)
1230 def test_wpas_ctrl_data_test(dev, apdev):
1231 """wpa_supplicant ctrl_iface DATA_TEST"""
1232 dev[0].request("DATA_TEST_CONFIG 0")
1233 if "FAIL" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"):
1234 raise Exception("DATA_TEST_TX accepted when not in test mode")
1237 if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"):
1238 raise Exception("DATA_TEST_CONFIG failed")
1239 if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"):
1240 raise Exception("DATA_TEST_CONFIG failed")
1242 "00:11:22:33:44:55 foo",
1243 "00:11:22:33:44:55 00:11:22:33:44:55 -1",
1244 "00:11:22:33:44:55 00:11:22:33:44:55 256" ]
1246 if "FAIL" not in dev[0].request("DATA_TEST_TX " + cmd):
1247 raise Exception("Invalid DATA_TEST_TX command accepted: " + cmd)
1248 if "OK" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"):
1249 raise Exception("DATA_TEST_TX failed")
1251 dev[0].request("DATA_TEST_CONFIG 0")
1255 "00112233445566778899aabbccdde",
1256 "00112233445566778899aabbccdq" ]
1258 if "FAIL" not in dev[0].request("DATA_TEST_FRAME " + cmd):
1259 raise Exception("Invalid DATA_TEST_FRAME command accepted: " + cmd)
1261 if "OK" not in dev[0].request("DATA_TEST_FRAME 00112233445566778899aabbccddee"):
1262 raise Exception("DATA_TEST_FRAME failed")
1264 def test_wpas_ctrl_vendor_elem(dev, apdev):
1265 """wpa_supplicant ctrl_iface VENDOR_ELEM"""
1266 if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 "):
1267 raise Exception("VENDOR_ELEM_ADD failed")
1274 if "FAIL" not in dev[0].request("VENDOR_ELEM_ADD " + cmd):
1275 raise Exception("Invalid VENDOR_ELEM_ADD command accepted: " + cmd)
1280 if "FAIL" not in dev[0].request("VENDOR_ELEM_GET " + cmd):
1281 raise Exception("Invalid VENDOR_ELEM_GET command accepted: " + cmd)
1283 dev[0].request("VENDOR_ELEM_REMOVE 1 *")
1293 if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1294 raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1296 dev[0].request("VENDOR_ELEM_ADD 1 000100")
1297 if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 "):
1298 raise Exception("VENDOR_ELEM_REMOVE failed")
1307 if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1308 raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1309 if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 000100"):
1310 raise Exception("VENDOR_ELEM_REMOVE failed")
1312 def test_wpas_ctrl_misc(dev, apdev):
1313 """wpa_supplicant ctrl_iface and miscellaneous commands"""
1314 if "OK" not in dev[0].request("RELOG"):
1315 raise Exception("RELOG failed")
1316 if dev[0].request("IFNAME") != dev[0].ifname:
1317 raise Exception("IFNAME returned unexpected response")
1318 if "FAIL" not in dev[0].request("REATTACH"):
1319 raise Exception("REATTACH accepted while disabled")
1320 if "OK" not in dev[2].request("RECONFIGURE"):
1321 raise Exception("RECONFIGURE failed")
1322 if "FAIL" in dev[0].request("INTERFACE_LIST"):
1323 raise Exception("INTERFACE_LIST failed")
1324 if "UNKNOWN COMMAND" not in dev[0].request("FOO"):
1325 raise Exception("Unknown command accepted")
1327 if "FAIL" not in dev[0].global_request("INTERFACE_REMOVE foo"):
1328 raise Exception("Invalid INTERFACE_REMOVE accepted")
1329 if "FAIL" not in dev[0].global_request("SET foo"):
1330 raise Exception("Invalid global SET accepted")