]> git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_wpas_ctrl.py
tests: Memory allocation failure in wpa_supplicant blacklist
[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 subprocess
10 import time
11
12 import hostapd
13 from wpasupplicant import WpaSupplicant
14 from utils import alloc_fail
15
16 def test_wpas_ctrl_network(dev):
17 """wpa_supplicant ctrl_iface network set/get"""
18 id = dev[0].add_network()
19
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")
30
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"),
37 ("scan_ssid", "1"),
38 ("bssid", "00:11:22:33:44:55"),
39 ("proto", "WPA RSN OSEN"),
40 ("eap", "TLS"),
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"))
43
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)
48 if res != value:
49 raise Exception("Unexpected response for '" + field + "': '" + res + "'")
50
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 + "'")
58
59 get_tests = (("foo", None), ("ssid", '"test"'))
60 for field, value in get_tests:
61 res = dev[0].get_network(id, field)
62 if res != value:
63 raise Exception("Unexpected response for '" + field + "': '" + res + "'")
64
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")
80
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")
84
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")
88
89 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' identity P"foo'):
90 raise Exception("Unexpected success for invalid identity string")
91
92 if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' identity 12x3'):
93 raise Exception("Unexpected success for invalid identity string")
94
95 for i in range(0, 4):
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")
100
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")
103
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")
106
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")
109
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")
112
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")
115
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")
118
119 if dev[0].get_network(id, "psk_list"):
120 raise Exception("Unexpected psk_list get response")
121
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")
127
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");
144
145 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' eap UNKNOWN'):
146 raise Exception("Unknown EAP method accepted")
147
148 if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' password "foo'):
149 raise Exception("Invalid password accepted")
150
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")
160
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")
172
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")
177
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")
182
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")
189
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")
204
205 def test_wpas_ctrl_many_networks(dev, apdev):
206 """wpa_supplicant ctrl_iface LIST_NETWORKS with huge number of networks"""
207 for i in range(1000):
208 id = dev[0].add_network()
209 res = dev[0].request("LIST_NETWORKS")
210 if str(id) in res:
211 raise Exception("Last added network was unexpectedly included")
212 res = dev[0].request("LIST_NETWORKS LAST_ID=%d" % (id - 2))
213 if str(id) not in res:
214 raise Exception("Last added network was not present when using LAST_ID")
215
216 def test_wpas_ctrl_dup_network(dev, apdev):
217 """wpa_supplicant ctrl_iface DUP_NETWORK"""
218 ssid = "target"
219 passphrase = 'qwertyuiop'
220 params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
221 hostapd.add_ap(apdev[0]['ifname'], params)
222
223 src = dev[0].connect("another", psk=passphrase, scan_freq="2412",
224 only_add_network=True)
225 id = dev[0].add_network()
226 dev[0].set_network_quoted(id, "ssid", ssid)
227 for f in [ "key_mgmt", "psk", "scan_freq" ]:
228 res = dev[0].request("DUP_NETWORK {} {} {}".format(src, id, f))
229 if "OK" not in res:
230 raise Exception("DUP_NETWORK failed")
231 dev[0].connect_network(id)
232
233 if "FAIL" not in dev[0].request("DUP_NETWORK "):
234 raise Exception("Unexpected DUP_NETWORK success")
235 if "FAIL" not in dev[0].request("DUP_NETWORK %d " % id):
236 raise Exception("Unexpected DUP_NETWORK success")
237 if "FAIL" not in dev[0].request("DUP_NETWORK %d %d" % (id, id)):
238 raise Exception("Unexpected DUP_NETWORK success")
239 if "FAIL" not in dev[0].request("DUP_NETWORK 123456 1234567 "):
240 raise Exception("Unexpected DUP_NETWORK success")
241 if "FAIL" not in dev[0].request("DUP_NETWORK %d 123456 " % id):
242 raise Exception("Unexpected DUP_NETWORK success")
243 if "FAIL" not in dev[0].request("DUP_NETWORK %d %d foo" % (id, id)):
244 raise Exception("Unexpected DUP_NETWORK success")
245 dev[0].request("DISCONNECT")
246 if "OK" not in dev[0].request("DUP_NETWORK %d %d ssid" % (id, id)):
247 raise Exception("Unexpected DUP_NETWORK failure")
248
249 def add_cred(dev):
250 id = dev.add_cred()
251 ev = dev.wait_event(["CRED-ADDED"])
252 if ev is None:
253 raise Exception("Missing CRED-ADDED event")
254 if " " + str(id) not in ev:
255 raise Exception("CRED-ADDED event without matching id")
256 return id
257
258 def set_cred(dev, id, field, value):
259 dev.set_cred(id, field, value)
260 ev = dev.wait_event(["CRED-MODIFIED"])
261 if ev is None:
262 raise Exception("Missing CRED-MODIFIED event")
263 if " " + str(id) + " " not in ev:
264 raise Exception("CRED-MODIFIED event without matching id")
265 if field not in ev:
266 raise Exception("CRED-MODIFIED event without matching field")
267
268 def set_cred_quoted(dev, id, field, value):
269 dev.set_cred_quoted(id, field, value)
270 ev = dev.wait_event(["CRED-MODIFIED"])
271 if ev is None:
272 raise Exception("Missing CRED-MODIFIED event")
273 if " " + str(id) + " " not in ev:
274 raise Exception("CRED-MODIFIED event without matching id")
275 if field not in ev:
276 raise Exception("CRED-MODIFIED event without matching field")
277
278 def remove_cred(dev, id):
279 dev.remove_cred(id)
280 ev = dev.wait_event(["CRED-REMOVED"])
281 if ev is None:
282 raise Exception("Missing CRED-REMOVED event")
283 if " " + str(id) not in ev:
284 raise Exception("CRED-REMOVED event without matching id")
285
286 def test_wpas_ctrl_cred(dev):
287 """wpa_supplicant ctrl_iface cred set"""
288 id1 = add_cred(dev[0])
289 if "FAIL" not in dev[0].request("SET_CRED " + str(id1 + 1) + " temporary 1"):
290 raise Exception("SET_CRED succeeded unexpectedly on unknown cred id")
291 if "FAIL" not in dev[0].request("SET_CRED " + str(id1)):
292 raise Exception("Invalid SET_CRED succeeded unexpectedly")
293 if "FAIL" not in dev[0].request("SET_CRED " + str(id1) + " temporary"):
294 raise Exception("Invalid SET_CRED succeeded unexpectedly")
295 if "FAIL" not in dev[0].request("GET_CRED " + str(id1 + 1) + " temporary"):
296 raise Exception("GET_CRED succeeded unexpectedly on unknown cred id")
297 if "FAIL" not in dev[0].request("GET_CRED " + str(id1)):
298 raise Exception("Invalid GET_CRED succeeded unexpectedly")
299 if "FAIL" not in dev[0].request("GET_CRED " + str(id1) + " foo"):
300 raise Exception("Invalid GET_CRED succeeded unexpectedly")
301 id = add_cred(dev[0])
302 id2 = add_cred(dev[0])
303 set_cred(dev[0], id, "temporary", "1")
304 set_cred(dev[0], id, "priority", "1")
305 set_cred(dev[0], id, "pcsc", "1")
306 set_cred_quoted(dev[0], id, "private_key_passwd", "test")
307 set_cred_quoted(dev[0], id, "domain_suffix_match", "test")
308 set_cred_quoted(dev[0], id, "phase1", "test")
309 set_cred_quoted(dev[0], id, "phase2", "test")
310
311 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " eap FOO"):
312 raise Exception("Unexpected success on unknown EAP method")
313
314 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " username 12xa"):
315 raise Exception("Unexpected success on invalid string")
316
317 for i in ("11", "1122", "112233445566778899aabbccddeeff00"):
318 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " roaming_consortium " + i):
319 raise Exception("Unexpected success on invalid roaming_consortium")
320
321 dev[0].set_cred(id, "excluded_ssid", "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff")
322 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " excluded_ssid 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00"):
323 raise Exception("Unexpected success on invalid excluded_ssid")
324
325 if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " foo 4142"):
326 raise Exception("Unexpected success on unknown field")
327
328 id3 = add_cred(dev[0])
329 id4 = add_cred(dev[0])
330 if len(dev[0].request("LIST_CREDS").splitlines()) != 6:
331 raise Exception("Unexpected LIST_CREDS result(1)")
332
333 remove_cred(dev[0], id1)
334 remove_cred(dev[0], id3)
335 remove_cred(dev[0], id4)
336 remove_cred(dev[0], id2)
337 remove_cred(dev[0], id)
338 if "FAIL" not in dev[0].request("REMOVE_CRED 1"):
339 raise Exception("Unexpected success on invalid remove cred")
340 if len(dev[0].request("LIST_CREDS").splitlines()) != 1:
341 raise Exception("Unexpected LIST_CREDS result(2)")
342
343 id = add_cred(dev[0])
344 values = [ ("temporary", "1", False),
345 ("temporary", "0", False),
346 ("pcsc", "1", False),
347 ("realm", "example.com", True),
348 ("username", "user@example.com", True),
349 ("password", "foo", True, "*"),
350 ("ca_cert", "ca.pem", True),
351 ("client_cert", "user.pem", True),
352 ("private_key", "key.pem", True),
353 ("private_key_passwd", "foo", True, "*"),
354 ("imsi", "310026-000000000", True),
355 ("milenage", "foo", True, "*"),
356 ("domain_suffix_match", "example.com", True),
357 ("domain", "example.com", True),
358 ("domain", "example.org", True, "example.com\nexample.org"),
359 ("roaming_consortium", "0123456789", False),
360 ("required_roaming_consortium", "456789", False),
361 ("eap", "TTLS", False),
362 ("phase1", "foo=bar1", True),
363 ("phase2", "foo=bar2", True),
364 ("excluded_ssid", "test", True),
365 ("excluded_ssid", "foo", True, "test\nfoo"),
366 ("roaming_partner", "example.com,0,4,*", True),
367 ("roaming_partner", "example.org,1,2,US", True,
368 "example.com,0,4,*\nexample.org,1,2,US"),
369 ("update_identifier", "4", False),
370 ("provisioning_sp", "sp.example.com", True),
371 ("sp_priority", "7", False),
372 ("min_dl_bandwidth_home", "100", False),
373 ("min_ul_bandwidth_home", "101", False),
374 ("min_dl_bandwidth_roaming", "102", False),
375 ("min_ul_bandwidth_roaming", "103", False),
376 ("max_bss_load", "57", False),
377 ("req_conn_capab", "6:22,80,443", False),
378 ("req_conn_capab", "17:500", False, "6:22,80,443\n17:500"),
379 ("req_conn_capab", "50", False, "6:22,80,443\n17:500\n50"),
380 ("ocsp", "1", False) ]
381 for v in values:
382 if v[2]:
383 set_cred_quoted(dev[0], id, v[0], v[1])
384 else:
385 set_cred(dev[0], id, v[0], v[1])
386 val = dev[0].get_cred(id, v[0])
387 if len(v) == 4:
388 expect = v[3]
389 else:
390 expect = v[1]
391 if val != expect:
392 raise Exception("Unexpected GET_CRED value for {}: {} != {}".format(v[0], val, expect))
393 creds = dev[0].request("LIST_CREDS").splitlines()
394 if len(creds) != 2:
395 raise Exception("Unexpected LIST_CREDS result(3)")
396 if creds[1] != "0\texample.com\tuser@example.com\texample.com\t310026-000000000":
397 raise Exception("Unexpected LIST_CREDS value")
398 remove_cred(dev[0], id)
399 if len(dev[0].request("LIST_CREDS").splitlines()) != 1:
400 raise Exception("Unexpected LIST_CREDS result(4)")
401
402 id = add_cred(dev[0])
403 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
404 id = add_cred(dev[0])
405 set_cred_quoted(dev[0], id, "domain", "bar.example.com")
406 id = add_cred(dev[0])
407 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
408 if "OK" not in dev[0].request("REMOVE_CRED sp_fqdn=foo.example.com"):
409 raise Exception("REMOVE_CRED failed")
410 creds = dev[0].request("LIST_CREDS")
411 if "foo.example.com" in creds:
412 raise Exception("REMOVE_CRED sp_fqdn did not remove cred")
413 if "bar.example.com" not in creds:
414 raise Exception("REMOVE_CRED sp_fqdn removed incorrect cred")
415 dev[0].request("REMOVE_CRED all")
416
417 id = add_cred(dev[0])
418 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
419 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.foo.example.com")
420 id = add_cred(dev[0])
421 set_cred_quoted(dev[0], id, "domain", "bar.example.com")
422 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.bar.example.com")
423 id = add_cred(dev[0])
424 set_cred_quoted(dev[0], id, "domain", "foo.example.com")
425 set_cred_quoted(dev[0], id, "provisioning_sp", "sp.foo.example.com")
426 if "OK" not in dev[0].request("REMOVE_CRED provisioning_sp=sp.foo.example.com"):
427 raise Exception("REMOVE_CRED failed")
428 creds = dev[0].request("LIST_CREDS")
429 if "foo.example.com" in creds:
430 raise Exception("REMOVE_CRED provisioning_sp did not remove cred")
431 if "bar.example.com" not in creds:
432 raise Exception("REMOVE_CRED provisioning_sp removed incorrect cred")
433 dev[0].request("REMOVE_CRED all")
434
435 # Test large number of creds and LIST_CREDS truncation
436 dev[0].dump_monitor()
437 for i in range(0, 100):
438 id = add_cred(dev[0])
439 set_cred_quoted(dev[0], id, "realm", "relatively.long.realm.test%d.example.com" % i)
440 dev[0].dump_monitor()
441 creds = dev[0].request("LIST_CREDS")
442 for i in range(0, 100):
443 dev[0].remove_cred(i)
444 dev[0].dump_monitor()
445 if len(creds) < 3900 or len(creds) > 4100:
446 raise Exception("Unexpected LIST_CREDS length: %d" % len(creds))
447 if "test10.example.com" not in creds:
448 raise Exception("Missing credential")
449 if len(creds.splitlines()) > 95:
450 raise Exception("Too many LIST_CREDS entries in the buffer")
451
452 def test_wpas_ctrl_pno(dev):
453 """wpa_supplicant ctrl_iface pno"""
454 if "FAIL" not in dev[0].request("SET pno 1"):
455 raise Exception("Unexpected success in enabling PNO without enabled network blocks")
456 id = dev[0].add_network()
457 dev[0].set_network_quoted(id, "ssid", "test")
458 dev[0].set_network(id, "key_mgmt", "NONE")
459 dev[0].request("ENABLE_NETWORK " + str(id) + " no-connect")
460 #mac80211_hwsim does not yet support PNO, so this fails
461 if "FAIL" not in dev[0].request("SET pno 1"):
462 raise Exception("Unexpected success in enabling PNO")
463 if "FAIL" not in dev[0].request("SET pno 1 freq=2000-3000,5180"):
464 raise Exception("Unexpected success in enabling PNO")
465 if "FAIL" not in dev[0].request("SET pno 1 freq=0-6000"):
466 raise Exception("Unexpected success in enabling PNO")
467 if "FAIL" in dev[0].request("SET pno 0"):
468 raise Exception("Unexpected failure in disabling PNO")
469
470 def test_wpas_ctrl_get(dev):
471 """wpa_supplicant ctrl_iface get"""
472 if "FAIL" in dev[0].request("GET version"):
473 raise Exception("Unexpected get failure for version")
474 if "FAIL" in dev[0].request("GET wifi_display"):
475 raise Exception("Unexpected get failure for wifi_display")
476 if "FAIL" not in dev[0].request("GET foo"):
477 raise Exception("Unexpected success on get command")
478
479 def test_wpas_ctrl_preauth(dev):
480 """wpa_supplicant ctrl_iface preauth"""
481 if "FAIL" not in dev[0].request("PREAUTH "):
482 raise Exception("Unexpected success on invalid PREAUTH")
483 if "FAIL" in dev[0].request("PREAUTH 00:11:22:33:44:55"):
484 raise Exception("Unexpected failure on PREAUTH")
485
486 def test_wpas_ctrl_stkstart(dev):
487 """wpa_supplicant ctrl_iface strkstart"""
488 if "FAIL" not in dev[0].request("STKSTART "):
489 raise Exception("Unexpected success on invalid STKSTART")
490 if "FAIL" not in dev[0].request("STKSTART 00:11:22:33:44:55"):
491 raise Exception("Unexpected success on STKSTART")
492
493 def test_wpas_ctrl_tdls_discover(dev):
494 """wpa_supplicant ctrl_iface tdls_discover"""
495 if "FAIL" not in dev[0].request("TDLS_DISCOVER "):
496 raise Exception("Unexpected success on invalid TDLS_DISCOVER")
497 if "FAIL" not in dev[0].request("TDLS_DISCOVER 00:11:22:33:44:55"):
498 raise Exception("Unexpected success on TDLS_DISCOVER")
499
500 def test_wpas_ctrl_tdls_chan_switch(dev):
501 """wpa_supplicant ctrl_iface tdls_chan_switch error cases"""
502 for args in [ '', '00:11:22:33:44:55' ]:
503 if "FAIL" not in dev[0].request("TDLS_CANCEL_CHAN_SWITCH " + args):
504 raise Exception("Unexpected success on invalid TDLS_CANCEL_CHAN_SWITCH: " + args)
505
506 for args in [ '', 'foo ', '00:11:22:33:44:55 ', '00:11:22:33:44:55 q',
507 '00:11:22:33:44:55 81', '00:11:22:33:44:55 81 1234',
508 '00:11:22:33:44:55 81 1234 center_freq1=234 center_freq2=345 bandwidth=456 sec_channel_offset=567 ht vht' ]:
509 if "FAIL" not in dev[0].request("TDLS_CHAN_SWITCH " + args):
510 raise Exception("Unexpected success on invalid TDLS_CHAN_SWITCH: " + args)
511
512 def test_wpas_ctrl_addr(dev):
513 """wpa_supplicant ctrl_iface invalid address"""
514 if "FAIL" not in dev[0].request("TDLS_SETUP "):
515 raise Exception("Unexpected success on invalid TDLS_SETUP")
516 if "FAIL" not in dev[0].request("TDLS_TEARDOWN "):
517 raise Exception("Unexpected success on invalid TDLS_TEARDOWN")
518 if "FAIL" not in dev[0].request("FT_DS "):
519 raise Exception("Unexpected success on invalid FT_DS")
520 if "FAIL" not in dev[0].request("WPS_PBC 00:11:22:33:44"):
521 raise Exception("Unexpected success on invalid WPS_PBC")
522 if "FAIL" not in dev[0].request("WPS_PIN 00:11:22:33:44"):
523 raise Exception("Unexpected success on invalid WPS_PIN")
524 if "FAIL" not in dev[0].request("WPS_NFC 00:11:22:33:44"):
525 raise Exception("Unexpected success on invalid WPS_NFC")
526 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44 12345670"):
527 raise Exception("Unexpected success on invalid WPS_REG")
528 if "FAIL" not in dev[0].request("IBSS_RSN 00:11:22:33:44"):
529 raise Exception("Unexpected success on invalid IBSS_RSN")
530 if "FAIL" not in dev[0].request("BLACKLIST 00:11:22:33:44"):
531 raise Exception("Unexpected success on invalid BLACKLIST")
532
533 def test_wpas_ctrl_wps_errors(dev):
534 """wpa_supplicant ctrl_iface WPS error cases"""
535 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55"):
536 raise Exception("Unexpected success on invalid WPS_REG")
537 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233"):
538 raise Exception("Unexpected success on invalid WPS_REG")
539 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233 OPEN"):
540 raise Exception("Unexpected success on invalid WPS_REG")
541 if "FAIL" not in dev[0].request("WPS_REG 00:11:22:33:44:55 12345670 2233 OPEN NONE"):
542 raise Exception("Unexpected success on invalid WPS_REG")
543
544 if "FAIL" not in dev[0].request("WPS_AP_PIN random"):
545 raise Exception("Unexpected success on WPS_AP_PIN in non-AP mode")
546
547 if "FAIL" not in dev[0].request("WPS_ER_PIN any"):
548 raise Exception("Unexpected success on invalid WPS_ER_PIN")
549
550 if "FAIL" not in dev[0].request("WPS_ER_LEARN 00:11:22:33:44:55"):
551 raise Exception("Unexpected success on invalid WPS_ER_LEARN")
552
553 if "FAIL" not in dev[0].request("WPS_ER_SET_CONFIG 00:11:22:33:44:55"):
554 raise Exception("Unexpected success on invalid WPS_ER_SET_CONFIG")
555
556 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55"):
557 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
558 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670"):
559 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
560 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233"):
561 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
562 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233 OPEN"):
563 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
564 if "FAIL" not in dev[0].request("WPS_ER_CONFIG 00:11:22:33:44:55 12345670 2233 OPEN NONE"):
565 raise Exception("Unexpected success on invalid WPS_ER_CONFIG")
566
567 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN WPS"):
568 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN")
569 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN FOO 00:11:22:33:44:55"):
570 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN")
571 if "FAIL" not in dev[0].request("WPS_ER_NFC_CONFIG_TOKEN NDEF 00:11:22:33:44:55"):
572 raise Exception("Unexpected success on invalid WPS_ER_NFC_CONFIG_TOKEN")
573
574 if "FAIL" not in dev[0].request("WPS_NFC_CONFIG_TOKEN FOO"):
575 raise Exception("Unexpected success on invalid WPS_NFC_CONFIG_TOKEN")
576 if "FAIL" not in dev[0].request("WPS_NFC_CONFIG_TOKEN WPS FOO"):
577 raise Exception("Unexpected success on invalid WPS_NFC_CONFIG_TOKEN")
578 if "FAIL" not in dev[0].request("WPS_NFC_TOKEN FOO"):
579 raise Exception("Unexpected success on invalid WPS_NFC_TOKEN")
580
581 def test_wpas_ctrl_config_parser(dev):
582 """wpa_supplicant ctrl_iface SET config parser"""
583 if "FAIL" not in dev[0].request("SET pbc_in_m1 qwerty"):
584 raise Exception("Non-number accepted as integer")
585 if "FAIL" not in dev[0].request("SET eapol_version 0"):
586 raise Exception("Out-of-range value accepted")
587 if "FAIL" not in dev[0].request("SET eapol_version 10"):
588 raise Exception("Out-of-range value accepted")
589
590 if "FAIL" not in dev[0].request("SET serial_number 0123456789abcdef0123456789abcdef0"):
591 raise Exception("Too long string accepted")
592
593 def test_wpas_ctrl_mib(dev):
594 """wpa_supplicant ctrl_iface MIB"""
595 mib = dev[0].get_mib()
596 if "dot11RSNAOptionImplemented" not in mib:
597 raise Exception("Missing MIB entry")
598 if mib["dot11RSNAOptionImplemented"] != "TRUE":
599 raise Exception("Unexpected dot11RSNAOptionImplemented value")
600
601 def test_wpas_ctrl_set_wps_params(dev):
602 """wpa_supplicant ctrl_iface SET config_methods"""
603 ts = [ "config_methods label virtual_display virtual_push_button keypad",
604 "device_type 1-0050F204-1",
605 "os_version 01020300",
606 "uuid 12345678-9abc-def0-1234-56789abcdef0" ]
607 for t in ts:
608 if "OK" not in dev[2].request("SET " + t):
609 raise Exception("SET failed for: " + t)
610
611 def test_wpas_ctrl_level(dev):
612 """wpa_supplicant ctrl_iface LEVEL"""
613 try:
614 if "FAIL" not in dev[2].request("LEVEL 3"):
615 raise Exception("Unexpected LEVEL success")
616 if "OK" not in dev[2].mon.request("LEVEL 2"):
617 raise Exception("Unexpected LEVEL failure")
618 dev[2].request("SCAN freq=2412")
619 ev = dev[2].wait_event(["State:"], timeout=5)
620 if ev is None:
621 raise Exception("No debug message received")
622 dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=5)
623 finally:
624 dev[2].mon.request("LEVEL 3")
625
626 def test_wpas_ctrl_bssid_filter(dev, apdev):
627 """wpa_supplicant bssid_filter"""
628 try:
629 if "OK" not in dev[2].request("SET bssid_filter " + apdev[0]['bssid']):
630 raise Exception("Failed to set bssid_filter")
631 params = { "ssid": "test" }
632 hostapd.add_ap(apdev[0]['ifname'], params)
633 hostapd.add_ap(apdev[1]['ifname'], params)
634 dev[2].scan_for_bss(apdev[0]['bssid'], freq="2412")
635 dev[2].scan(freq="2412")
636 bss = dev[2].get_bss(apdev[0]['bssid'])
637 if bss is None or len(bss) == 0:
638 raise Exception("Missing BSS data")
639 bss = dev[2].get_bss(apdev[1]['bssid'])
640 if bss and len(bss) != 0:
641 raise Exception("Unexpected BSS data")
642 dev[2].request("SET bssid_filter ")
643 dev[2].scan(freq="2412")
644 bss = dev[2].get_bss(apdev[0]['bssid'])
645 if bss is None or len(bss) == 0:
646 raise Exception("Missing BSS data")
647 bss = dev[2].get_bss(apdev[1]['bssid'])
648 if bss is None or len(bss) == 0:
649 raise Exception("Missing BSS data(2)")
650 res = dev[2].request("SCAN_RESULTS").splitlines()
651 if "test" not in res[1] or "test" not in res[2]:
652 raise Exception("SSID missing from SCAN_RESULTS")
653 if apdev[0]['bssid'] not in res[1] and apdev[1]['bssid'] not in res[1]:
654 raise Exception("BSS1 missing from SCAN_RESULTS")
655 if apdev[0]['bssid'] not in res[2] and apdev[1]['bssid'] not in res[2]:
656 raise Exception("BSS1 missing from SCAN_RESULTS")
657
658 if "FAIL" not in dev[2].request("SET bssid_filter 00:11:22:33:44:55 00:11:22:33:44"):
659 raise Exception("Unexpected success for invalid SET bssid_filter")
660 finally:
661 dev[2].request("SET bssid_filter ")
662
663 def test_wpas_ctrl_disallow_aps(dev, apdev):
664 """wpa_supplicant ctrl_iface disallow_aps"""
665 params = { "ssid": "test" }
666 hostapd.add_ap(apdev[0]['ifname'], params)
667
668 if "FAIL" not in dev[0].request("SET disallow_aps bssid "):
669 raise Exception("Unexpected success on invalid disallow_aps")
670 if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44"):
671 raise Exception("Unexpected success on invalid disallow_aps")
672 if "FAIL" not in dev[0].request("SET disallow_aps ssid 0"):
673 raise Exception("Unexpected success on invalid disallow_aps")
674 if "FAIL" not in dev[0].request("SET disallow_aps ssid 4q"):
675 raise Exception("Unexpected success on invalid disallow_aps")
676 if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 ssid 112233 ssid 123"):
677 raise Exception("Unexpected success on invalid disallow_aps")
678 if "FAIL" not in dev[0].request("SET disallow_aps ssid 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f00"):
679 raise Exception("Unexpected success on invalid disallow_aps")
680 if "FAIL" not in dev[0].request("SET disallow_aps foo 112233445566"):
681 raise Exception("Unexpected success on invalid disallow_aps")
682
683 dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
684 hostapd.add_ap(apdev[1]['ifname'], params)
685 dev[0].dump_monitor()
686 if "OK" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 bssid 00:22:33:44:55:66"):
687 raise Exception("Failed to set disallow_aps")
688 if "OK" not in dev[0].request("SET disallow_aps bssid " + apdev[0]['bssid']):
689 raise Exception("Failed to set disallow_aps")
690 ev = dev[0].wait_connected(timeout=15, error="Reassociation timed out")
691 if apdev[1]['bssid'] not in ev:
692 raise Exception("Unexpected BSSID")
693
694 dev[0].dump_monitor()
695 if "OK" not in dev[0].request("SET disallow_aps ssid " + "test".encode("hex")):
696 raise Exception("Failed to set disallow_aps")
697 dev[0].wait_disconnected(timeout=5, error="Disconnection not seen")
698 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
699 if ev is not None:
700 raise Exception("Unexpected reassociation")
701
702 dev[0].request("DISCONNECT")
703 dev[0].p2p_start_go(freq=2412)
704 if "OK" not in dev[0].request("SET disallow_aps "):
705 raise Exception("Failed to set disallow_aps")
706
707 def test_wpas_ctrl_blob(dev):
708 """wpa_supplicant ctrl_iface SET blob"""
709 if "FAIL" not in dev[0].request("SET blob foo"):
710 raise Exception("Unexpected SET success")
711 if "FAIL" not in dev[0].request("SET blob foo 0"):
712 raise Exception("Unexpected SET success")
713 if "FAIL" not in dev[0].request("SET blob foo 0q"):
714 raise Exception("Unexpected SET success")
715 if "OK" not in dev[0].request("SET blob foo 00"):
716 raise Exception("Unexpected SET failure")
717 if "OK" not in dev[0].request("SET blob foo 0011"):
718 raise Exception("Unexpected SET failure")
719
720 def test_wpas_ctrl_set_uapsd(dev):
721 """wpa_supplicant ctrl_iface SET uapsd"""
722 if "FAIL" not in dev[0].request("SET uapsd foo"):
723 raise Exception("Unexpected SET success")
724 if "FAIL" not in dev[0].request("SET uapsd 0,0,0"):
725 raise Exception("Unexpected SET success")
726 if "FAIL" not in dev[0].request("SET uapsd 0,0"):
727 raise Exception("Unexpected SET success")
728 if "FAIL" not in dev[0].request("SET uapsd 0"):
729 raise Exception("Unexpected SET success")
730 if "OK" not in dev[0].request("SET uapsd 1,1,1,1;1"):
731 raise Exception("Unexpected SET failure")
732 if "OK" not in dev[0].request("SET uapsd 0,0,0,0;0"):
733 raise Exception("Unexpected SET failure")
734 if "OK" not in dev[0].request("SET uapsd disable"):
735 raise Exception("Unexpected SET failure")
736
737 def test_wpas_ctrl_set(dev):
738 """wpa_supplicant ctrl_iface SET"""
739 vals = [ "foo",
740 "ampdu 0",
741 "radio_disable 0",
742 "ps 10",
743 "ps 1",
744 "dot11RSNAConfigPMKLifetime 0",
745 "dot11RSNAConfigPMKReauthThreshold 101",
746 "dot11RSNAConfigSATimeout 0",
747 "wps_version_number -1",
748 "wps_version_number 256" ]
749 for val in vals:
750 if "FAIL" not in dev[0].request("SET " + val):
751 raise Exception("Unexpected SET success for " + val)
752
753 vals = [ "EAPOL::heldPeriod 60",
754 "EAPOL::authPeriod 30",
755 "EAPOL::startPeriod 30",
756 "EAPOL::maxStart 3",
757 "dot11RSNAConfigSATimeout 60",
758 "ps -1",
759 "ps 0",
760 "no_keep_alive 0",
761 "tdls_disabled 1",
762 "tdls_disabled 0" ]
763 for val in vals:
764 if "OK" not in dev[0].request("SET " + val):
765 raise Exception("Unexpected SET failure for " + val)
766
767 def test_wpas_ctrl_get_capability(dev):
768 """wpa_supplicant ctrl_iface GET_CAPABILITY"""
769 if "FAIL" not in dev[0].request("GET_CAPABILITY 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"):
770 raise Exception("Unexpected success on invalid GET_CAPABILITY")
771 if "FAIL" not in dev[0].request("GET_CAPABILITY eap foo"):
772 raise Exception("Unexpected success on invalid GET_CAPABILITY")
773 if "AP" not in dev[0].request("GET_CAPABILITY modes strict"):
774 raise Exception("Unexpected GET_CAPABILITY response")
775 res = dev[0].get_capability("eap")
776 if "TTLS" not in res:
777 raise Exception("Unexpected GET_CAPABILITY eap response: " + str(res))
778
779 res = dev[0].get_capability("pairwise")
780 if "CCMP" not in res:
781 raise Exception("Unexpected GET_CAPABILITY pairwise response: " + str(res))
782
783 res = dev[0].get_capability("group")
784 if "CCMP" not in res:
785 raise Exception("Unexpected GET_CAPABILITY group response: " + str(res))
786
787 res = dev[0].get_capability("key_mgmt")
788 if "WPA-PSK" not in res or "WPA-EAP" not in res:
789 raise Exception("Unexpected GET_CAPABILITY key_mgmt response: " + str(res))
790
791 res = dev[0].get_capability("proto")
792 if "WPA" not in res or "RSN" not in res:
793 raise Exception("Unexpected GET_CAPABILITY proto response: " + str(res))
794
795 res = dev[0].get_capability("auth_alg")
796 if "OPEN" not in res or "SHARED" not in res:
797 raise Exception("Unexpected GET_CAPABILITY auth_alg response: " + str(res))
798
799 res = dev[0].get_capability("modes")
800 if "IBSS" not in res or "AP" not in res:
801 raise Exception("Unexpected GET_CAPABILITY modes response: " + str(res))
802
803 res = dev[0].get_capability("channels")
804 if "8" not in res or "36" not in res:
805 raise Exception("Unexpected GET_CAPABILITY channels response: " + str(res))
806
807 res = dev[0].get_capability("freq")
808 if "2457" not in res or "5180" not in res:
809 raise Exception("Unexpected GET_CAPABILITY freq response: " + str(res))
810
811 res = dev[0].get_capability("tdls")
812 if "EXTERNAL" not in res[0]:
813 raise Exception("Unexpected GET_CAPABILITY tdls response: " + str(res))
814
815 res = dev[0].get_capability("erp")
816 if res is None or "ERP" not in res[0]:
817 raise Exception("Unexpected GET_CAPABILITY erp response: " + str(res))
818
819 if dev[0].get_capability("foo") is not None:
820 raise Exception("Unexpected GET_CAPABILITY foo response: " + str(res))
821
822 def test_wpas_ctrl_nfc_report_handover(dev):
823 """wpa_supplicant ctrl_iface NFC_REPORT_HANDOVER"""
824 vals = [ "FOO",
825 "ROLE freq=12345",
826 "ROLE TYPE",
827 "ROLE TYPE REQ",
828 "ROLE TYPE REQ SEL",
829 "ROLE TYPE 0Q SEL",
830 "ROLE TYPE 00 SEL",
831 "ROLE TYPE 00 0Q",
832 "ROLE TYPE 00 00" ]
833 for v in vals:
834 if "FAIL" not in dev[0].request("NFC_REPORT_HANDOVER " + v):
835 raise Exception("Unexpected NFC_REPORT_HANDOVER success for " + v)
836
837 def test_wpas_ctrl_nfc_tag_read(dev):
838 """wpa_supplicant ctrl_iface WPS_NFC_TAG_READ"""
839 vals = [ "FOO", "0Q", "00", "000000", "10000001", "10000000", "00000000",
840 "100e0000", "100e0001ff", "100e000411110000", "100e0004100e0001" ]
841 for v in vals:
842 if "FAIL" not in dev[0].request("WPS_NFC_TAG_READ " + v):
843 raise Exception("Unexpected WPS_NFC_TAG_READ success for " + v)
844
845 def test_wpas_ctrl_nfc_get_handover(dev):
846 """wpa_supplicant ctrl_iface NFC_GET_HANDOVER"""
847 vals = [ "FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P" ]
848 for v in vals:
849 if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_REQ " + v):
850 raise Exception("Unexpected NFC_GET_HANDOVER_REQ success for " + v)
851
852 vals = [ "NDEF WPS", "NDEF P2P-CR", "WPS P2P-CR" ]
853 for v in vals:
854 if "FAIL" in dev[0].request("NFC_GET_HANDOVER_REQ " + v):
855 raise Exception("Unexpected NFC_GET_HANDOVER_REQ failure for " + v)
856
857 vals = [ "FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P",
858 "NDEF WPS", "NDEF WPS uuid" ]
859 for v in vals:
860 if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_SEL " + v):
861 raise Exception("Unexpected NFC_GET_HANDOVER_SEL success for " + v)
862
863 vals = [ "NDEF P2P-CR", "WPS P2P-CR", "NDEF P2P-CR-TAG",
864 "WPS P2P-CR-TAG" ]
865 for v in vals:
866 if "FAIL" in dev[0].request("NFC_GET_HANDOVER_SEL " + v):
867 raise Exception("Unexpected NFC_GET_HANDOVER_SEL failure for " + v)
868
869 def get_blacklist(dev):
870 return dev.request("BLACKLIST").splitlines()
871
872 def test_wpas_ctrl_blacklist(dev):
873 """wpa_supplicant ctrl_iface BLACKLIST"""
874 if "OK" not in dev[0].request("BLACKLIST clear"):
875 raise Exception("BLACKLIST clear failed")
876 b = get_blacklist(dev[0])
877 if len(b) != 0:
878 raise Exception("Unexpected blacklist contents: " + str(b))
879 if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:55"):
880 raise Exception("BLACKLIST add failed")
881 b = get_blacklist(dev[0])
882 if "00:11:22:33:44:55" not in b:
883 raise Exception("Unexpected blacklist contents: " + str(b))
884 if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:56"):
885 raise Exception("BLACKLIST add failed")
886 b = get_blacklist(dev[0])
887 if "00:11:22:33:44:55" not in b or "00:11:22:33:44:56" not in b:
888 raise Exception("Unexpected blacklist contents: " + str(b))
889 if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:56"):
890 raise Exception("BLACKLIST add failed")
891 b = get_blacklist(dev[0])
892 if "00:11:22:33:44:55" not in b or "00:11:22:33:44:56" not in b or len(b) != 2:
893 raise Exception("Unexpected blacklist contents: " + str(b))
894
895 if "OK" not in dev[0].request("BLACKLIST clear"):
896 raise Exception("BLACKLIST clear failed")
897 if dev[0].request("BLACKLIST") != "":
898 raise Exception("Unexpected blacklist contents")
899
900 def test_wpas_ctrl_blacklist_oom(dev):
901 """wpa_supplicant ctrl_iface BLACKLIST and out-of-memory"""
902 with alloc_fail(dev[0], 1, "wpa_blacklist_add"):
903 if "FAIL" not in dev[0].request("BLACKLIST aa:bb:cc:dd:ee:ff"):
904 raise Exception("Unexpected success with allocation failure")
905
906 def test_wpas_ctrl_log_level(dev):
907 """wpa_supplicant ctrl_iface LOG_LEVEL"""
908 level = dev[2].request("LOG_LEVEL")
909 if "Current level: MSGDUMP" not in level:
910 raise Exception("Unexpected debug level(1): " + level)
911 if "Timestamp: 1" not in level:
912 raise Exception("Unexpected timestamp(1): " + level)
913
914 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 0"):
915 raise Exception("LOG_LEVEL failed")
916 level = dev[2].request("LOG_LEVEL")
917 if "Current level: MSGDUMP" not in level:
918 raise Exception("Unexpected debug level(2): " + level)
919 if "Timestamp: 0" not in level:
920 raise Exception("Unexpected timestamp(2): " + level)
921
922 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 1"):
923 raise Exception("LOG_LEVEL failed")
924 level = dev[2].request("LOG_LEVEL")
925 if "Current level: MSGDUMP" not in level:
926 raise Exception("Unexpected debug level(3): " + level)
927 if "Timestamp: 1" not in level:
928 raise Exception("Unexpected timestamp(3): " + level)
929
930 if "FAIL" not in dev[2].request("LOG_LEVEL FOO"):
931 raise Exception("Invalid LOG_LEVEL accepted")
932
933 for lev in [ "EXCESSIVE", "MSGDUMP", "DEBUG", "INFO", "WARNING", "ERROR" ]:
934 if "OK" not in dev[2].request("LOG_LEVEL " + lev):
935 raise Exception("LOG_LEVEL failed for " + lev)
936 level = dev[2].request("LOG_LEVEL")
937 if "Current level: " + lev not in level:
938 raise Exception("Unexpected debug level: " + level)
939
940 if "OK" not in dev[2].request("LOG_LEVEL MSGDUMP 1"):
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(3): " + level)
945 if "Timestamp: 1" not in level:
946 raise Exception("Unexpected timestamp(3): " + level)
947
948 def test_wpas_ctrl_enable_disable_network(dev, apdev):
949 """wpa_supplicant ctrl_iface ENABLE/DISABLE_NETWORK"""
950 params = { "ssid": "test" }
951 hostapd.add_ap(apdev[0]['ifname'], params)
952
953 id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412",
954 only_add_network=True)
955 if "OK" not in dev[0].request("DISABLE_NETWORK " + str(id)):
956 raise Exception("Failed to disable network")
957 if "OK" not in dev[0].request("ENABLE_NETWORK " + str(id) + " no-connect"):
958 raise Exception("Failed to enable network")
959 if "OK" not in dev[0].request("DISABLE_NETWORK all"):
960 raise Exception("Failed to disable networks")
961 if "OK" not in dev[0].request("ENABLE_NETWORK " + str(id)):
962 raise Exception("Failed to enable network")
963 dev[0].wait_connected(timeout=10)
964 if "OK" not in dev[0].request("DISABLE_NETWORK " + str(id)):
965 raise Exception("Failed to disable network")
966 dev[0].wait_disconnected(timeout=10)
967 time.sleep(0.1)
968
969 if "OK" not in dev[0].request("ENABLE_NETWORK all"):
970 raise Exception("Failed to enable network")
971 dev[0].wait_connected(timeout=10)
972 if "OK" not in dev[0].request("DISABLE_NETWORK all"):
973 raise Exception("Failed to disable network")
974 dev[0].wait_disconnected(timeout=10)
975
976 def test_wpas_ctrl_country(dev, apdev):
977 """wpa_supplicant SET/GET country code"""
978 try:
979 # work around issues with possible pending regdom event from the end of
980 # the previous test case
981 time.sleep(0.2)
982 dev[0].dump_monitor()
983
984 if "OK" not in dev[0].request("SET country FI"):
985 raise Exception("Failed to set country code")
986 if dev[0].request("GET country") != "FI":
987 raise Exception("Country code set failed")
988 ev = dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"])
989 if ev is None:
990 raise Exception("regdom change event not seen")
991 if "init=USER type=COUNTRY alpha2=FI" not in ev:
992 raise Exception("Unexpected event contents: " + ev)
993 dev[0].request("SET country 00")
994 if dev[0].request("GET country") != "00":
995 raise Exception("Country code set failed")
996 ev = dev[0].wait_event(["CTRL-EVENT-REGDOM-CHANGE"])
997 if ev is None:
998 raise Exception("regdom change event not seen")
999 if "init=CORE type=WORLD" not in ev:
1000 raise Exception("Unexpected event contents: " + ev)
1001 finally:
1002 subprocess.call(['sudo', 'iw', 'reg', 'set', '00'])
1003
1004 def test_wpas_ctrl_suspend_resume(dev):
1005 """wpa_supplicant SUSPEND/RESUME"""
1006 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1007 wpas.interface_add("wlan5")
1008 if "OK" not in wpas.global_request("SUSPEND"):
1009 raise Exception("SUSPEND failed")
1010 time.sleep(1)
1011 if "OK" not in wpas.global_request("RESUME"):
1012 raise Exception("RESUME failed")
1013 if "OK" not in wpas.request("SUSPEND"):
1014 raise Exception("Per-interface SUSPEND failed")
1015 if "OK" not in wpas.request("RESUME"):
1016 raise Exception("Per-interface RESUME failed")
1017 ev = wpas.wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10)
1018 if ev is None:
1019 raise Exception("Scan not completed")
1020
1021 def test_wpas_ctrl_global(dev):
1022 """wpa_supplicant global control interface"""
1023 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1024 wpas.interface_add("wlan5")
1025
1026 if "PONG" not in wpas.global_request("PING"):
1027 raise Exception("PING failed")
1028 if "wlan5" not in wpas.global_request("INTERFACES"):
1029 raise Exception("Interface not found")
1030 if "UNKNOWN COMMAND" not in wpas.global_request("FOO"):
1031 raise Exception("Unexpected response to unknown command")
1032 if "PONG" not in wpas.global_request("IFNAME=wlan5 PING"):
1033 raise Exception("Per-interface PING failed")
1034 if "FAIL-NO-IFNAME-MATCH" not in wpas.global_request("IFNAME=notfound PING"):
1035 raise Exception("Unknown interface not reported correctly")
1036 if "FAIL" not in wpas.global_request("SAVE_CONFIG"):
1037 raise Exception("SAVE_CONFIG succeeded unexpectedly")
1038 if "OK" not in wpas.global_request("SET wifi_display 0"):
1039 raise Exception("SET failed")
1040 if "wifi_display=0" not in wpas.global_request("STATUS"):
1041 raise Exception("wifi_display not disabled")
1042 if "OK" not in wpas.global_request("SET wifi_display 1"):
1043 raise Exception("SET failed")
1044 if "wifi_display=1" not in wpas.global_request("STATUS"):
1045 raise Exception("wifi_display not enabled")
1046 if "FAIL" not in wpas.global_request("SET foo 1"):
1047 raise Exception("SET succeeded unexpectedly")
1048
1049 if "p2p_state=IDLE" not in wpas.global_request("STATUS"):
1050 raise Exception("P2P was disabled")
1051 wpas.request("P2P_SET disabled 1")
1052 if "p2p_state=DISABLED" not in wpas.global_request("STATUS"):
1053 raise Exception("P2P was not disabled")
1054 wpas.request("P2P_SET disabled 0")
1055 if "p2p_state=IDLE" not in wpas.global_request("STATUS"):
1056 raise Exception("P2P was not enabled")
1057
1058 # driver_nl80211.c does not support interface list, so do not fail because
1059 # of that
1060 logger.debug(wpas.global_request("INTERFACE_LIST"))
1061
1062 if "FAIL" not in wpas.global_request("INTERFACE_ADD "):
1063 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1064 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO"):
1065 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1066 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf"):
1067 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1068 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver"):
1069 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1070 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface"):
1071 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1072 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam"):
1073 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1074 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam bridge"):
1075 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1076 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO conf driver ctrliface driverparam bridge foo"):
1077 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1078 if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO "):
1079 raise Exception("INTERFACE_ADD succeeded unexpectedly")
1080
1081 def test_wpas_ctrl_roam(dev, apdev):
1082 """wpa_supplicant ctrl_iface ROAM error cases"""
1083 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44"):
1084 raise Exception("Unexpected success")
1085 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"):
1086 raise Exception("Unexpected success")
1087 params = { "ssid": "test" }
1088 hostapd.add_ap(apdev[0]['ifname'], params)
1089 id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
1090 if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"):
1091 raise Exception("Unexpected success")
1092
1093 def test_wpas_ctrl_ipaddr(dev, apdev):
1094 """wpa_supplicant IP address in STATUS"""
1095 try:
1096 subprocess.call(['ip', 'addr', 'add', '10.174.65.207/32', 'dev',
1097 dev[0].ifname])
1098 ipaddr = dev[0].get_status_field('ip_address')
1099 if ipaddr != '10.174.65.207':
1100 raise Exception("IP address not in STATUS output")
1101 finally:
1102 subprocess.call(['ip', 'addr', 'del', '10.174.65.207/32', 'dev',
1103 dev[0].ifname])
1104
1105 def test_wpas_ctrl_neighbor_rep_req(dev, apdev):
1106 """wpa_supplicant ctrl_iface NEIGHBOR_REP_REQUEST"""
1107 params = { "ssid": "test" }
1108 hostapd.add_ap(apdev[0]['ifname'], params)
1109 params = { "ssid": "test2", "radio_measurements": "1" }
1110 hostapd.add_ap(apdev[1]['ifname'], params)
1111
1112 dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
1113 if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
1114 raise Exception("Request succeeded unexpectedly")
1115 if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=abcdef"):
1116 raise Exception("Request succeeded unexpectedly")
1117 dev[0].request("DISCONNECT")
1118
1119 rrm = int(dev[0].get_driver_status_field("capa.rrm_flags"), 16)
1120 if rrm & 0x5 != 0x5:
1121 logger.info("Driver does not support required RRM capabilities - skip rest of the test case")
1122 return
1123
1124 dev[0].connect("test2", key_mgmt="NONE", scan_freq="2412")
1125
1126 # These requests are expected to get sent properly, but since hostapd does
1127 # not yet support processing of the request, these are expected to fail.
1128
1129 if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
1130 raise Exception("Request failed")
1131 ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
1132 "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
1133 if ev is None:
1134 raise Exception("RRM report result not indicated")
1135 logger.info("RRM result: " + ev)
1136
1137 if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=abcdef"):
1138 raise Exception("Request failed")
1139 ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
1140 "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
1141 if ev is None:
1142 raise Exception("RRM report result not indicated")
1143 logger.info("RRM result: " + ev)
1144
1145 def test_wpas_ctrl_rsp(dev, apdev):
1146 """wpa_supplicant ctrl_iface CTRL-RSP-"""
1147 if "FAIL" not in dev[0].request("CTRL-RSP-"):
1148 raise Exception("Request succeeded unexpectedly")
1149 if "FAIL" not in dev[0].request("CTRL-RSP-foo-"):
1150 raise Exception("Request succeeded unexpectedly")
1151 if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567"):
1152 raise Exception("Request succeeded unexpectedly")
1153 if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567:"):
1154 raise Exception("Request succeeded unexpectedly")
1155 id = dev[0].add_network()
1156 if "FAIL" not in dev[0].request("CTRL-RSP-foo-%d:" % id):
1157 raise Exception("Request succeeded unexpectedly")
1158 for req in [ "IDENTITY", "PASSWORD", "NEW_PASSWORD", "PIN", "OTP",
1159 "PASSPHRASE", "SIM" ]:
1160 if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)):
1161 raise Exception("Request failed unexpectedly")
1162 if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)):
1163 raise Exception("Request failed unexpectedly")
1164
1165 def test_wpas_ctrl_vendor(dev, apdev):
1166 """wpa_supplicant ctrl_iface VENDOR"""
1167 cmds = [ "foo",
1168 "1",
1169 "1 foo",
1170 "1 2foo",
1171 "1 2 qq" ]
1172 for cmd in cmds:
1173 if "FAIL" not in dev[0].request("VENDOR " + cmd):
1174 raise Exception("Invalid VENDOR command accepted: " + cmd)
1175
1176 def test_wpas_ctrl_mgmt_tx(dev, apdev):
1177 """wpa_supplicant ctrl_iface MGMT_TX"""
1178 cmds = [ "foo",
1179 "00:11:22:33:44:55 foo",
1180 "00:11:22:33:44:55 11:22:33:44:55:66",
1181 "00:11:22:33:44:55 11:22:33:44:55:66 freq=0 no_cck=0 wait_time=0 action=123",
1182 "00:11:22:33:44:55 11:22:33:44:55:66 action=12qq" ]
1183 for cmd in cmds:
1184 if "FAIL" not in dev[0].request("MGMT_TX " + cmd):
1185 raise Exception("Invalid MGMT_TX command accepted: " + cmd)
1186
1187 if "OK" not in dev[0].request("MGMT_TX_DONE"):
1188 raise Exception("MGMT_TX_DONE failed")
1189
1190 def test_wpas_ctrl_driver_event(dev, apdev):
1191 """wpa_supplicant ctrl_iface DRIVER_EVENT"""
1192 if "FAIL" not in dev[0].request("DRIVER_EVENT foo"):
1193 raise Exception("Invalid DRIVER_EVENT accepted")
1194
1195 def test_wpas_ctrl_eapol_rx(dev, apdev):
1196 """wpa_supplicant ctrl_iface EAPOL_RX"""
1197 cmds = [ "foo",
1198 "00:11:22:33:44:55 123",
1199 "00:11:22:33:44:55 12qq" ]
1200 for cmd in cmds:
1201 if "FAIL" not in dev[0].request("EAPOL_RX " + cmd):
1202 raise Exception("Invalid EAPOL_RX command accepted: " + cmd)
1203
1204 def test_wpas_ctrl_data_test(dev, apdev):
1205 """wpa_supplicant ctrl_iface DATA_TEST"""
1206 dev[0].request("DATA_TEST_CONFIG 0")
1207 if "FAIL" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"):
1208 raise Exception("DATA_TEST_TX accepted when not in test mode")
1209
1210 try:
1211 if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"):
1212 raise Exception("DATA_TEST_CONFIG failed")
1213 if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"):
1214 raise Exception("DATA_TEST_CONFIG failed")
1215 cmds = [ "foo",
1216 "00:11:22:33:44:55 foo",
1217 "00:11:22:33:44:55 00:11:22:33:44:55 -1",
1218 "00:11:22:33:44:55 00:11:22:33:44:55 256" ]
1219 for cmd in cmds:
1220 if "FAIL" not in dev[0].request("DATA_TEST_TX " + cmd):
1221 raise Exception("Invalid DATA_TEST_TX command accepted: " + cmd)
1222 if "OK" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"):
1223 raise Exception("DATA_TEST_TX failed")
1224 finally:
1225 dev[0].request("DATA_TEST_CONFIG 0")
1226
1227 cmds = [ "",
1228 "00",
1229 "00112233445566778899aabbccdde",
1230 "00112233445566778899aabbccdq" ]
1231 for cmd in cmds:
1232 if "FAIL" not in dev[0].request("DATA_TEST_FRAME " + cmd):
1233 raise Exception("Invalid DATA_TEST_FRAME command accepted: " + cmd)
1234
1235 if "OK" not in dev[0].request("DATA_TEST_FRAME 00112233445566778899aabbccddee"):
1236 raise Exception("DATA_TEST_FRAME failed")
1237
1238 def test_wpas_ctrl_vendor_elem(dev, apdev):
1239 """wpa_supplicant ctrl_iface VENDOR_ELEM"""
1240 if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 "):
1241 raise Exception("VENDOR_ELEM_ADD failed")
1242 cmds = [ "-1 ",
1243 "13 ",
1244 "1",
1245 "1 123",
1246 "1 12qq34" ]
1247 for cmd in cmds:
1248 if "FAIL" not in dev[0].request("VENDOR_ELEM_ADD " + cmd):
1249 raise Exception("Invalid VENDOR_ELEM_ADD command accepted: " + cmd)
1250
1251 cmds = [ "-1 ",
1252 "13 " ]
1253 for cmd in cmds:
1254 if "FAIL" not in dev[0].request("VENDOR_ELEM_GET " + cmd):
1255 raise Exception("Invalid VENDOR_ELEM_GET command accepted: " + cmd)
1256
1257 dev[0].request("VENDOR_ELEM_REMOVE 1 *")
1258 cmds = [ "-1 ",
1259 "13 ",
1260 "1",
1261 "1",
1262 "1 123",
1263 "1 12qq34",
1264 "1 12",
1265 "1 0000" ]
1266 for cmd in cmds:
1267 if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1268 raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1269
1270 dev[0].request("VENDOR_ELEM_ADD 1 000100")
1271 if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 "):
1272 raise Exception("VENDOR_ELEM_REMOVE failed")
1273 cmds = [ "-1 ",
1274 "13 ",
1275 "1",
1276 "1 123",
1277 "1 12qq34",
1278 "1 12",
1279 "1 0000" ]
1280 for cmd in cmds:
1281 if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1282 raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1283 if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 000100"):
1284 raise Exception("VENDOR_ELEM_REMOVE failed")
1285
1286 def test_wpas_ctrl_misc(dev, apdev):
1287 """wpa_supplicant ctrl_iface and miscellaneous commands"""
1288 if "OK" not in dev[0].request("RELOG"):
1289 raise Exception("RELOG failed")
1290 if dev[0].request("IFNAME") != dev[0].ifname:
1291 raise Exception("IFNAME returned unexpected response")
1292 if "FAIL" not in dev[0].request("REATTACH"):
1293 raise Exception("REATTACH accepted while disabled")
1294 if "OK" not in dev[2].request("RECONFIGURE"):
1295 raise Exception("RECONFIGURE failed")
1296 if "FAIL" in dev[0].request("INTERFACE_LIST"):
1297 raise Exception("INTERFACE_LIST failed")
1298 if "UNKNOWN COMMAND" not in dev[0].request("FOO"):
1299 raise Exception("Unknown command accepted")
1300
1301 if "FAIL" not in dev[0].global_request("INTERFACE_REMOVE foo"):
1302 raise Exception("Invalid INTERFACE_REMOVE accepted")
1303 if "FAIL" not in dev[0].global_request("SET foo"):
1304 raise Exception("Invalid global SET accepted")