tests: Add room for more vendor elems in wpas_ctrl_vendor_elem
[mech_eap.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     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" ]
212     for val in tests:
213         dev[0].set_network(id, "bssid_blacklist", val)
214         res = dev[0].get_network(id, "bssid_blacklist")
215         if res != val:
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")
219         if res != val:
220             raise Exception("Unexpected bssid_whitelist value: %s != %s" % (res, val))
221
222     tests = [ "foo",
223               "00:11:22:33:44:5",
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" ]
227     for val in tests:
228         if "FAIL" not in dev[0].request("SET_NETWORK %d bssid_blacklist %s" % (id, val)):
229             raise Exception("Invalid bssid_blacklist value accepted")
230
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")
236     if str(id) in res:
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")
241
242 def test_wpas_ctrl_dup_network(dev, apdev):
243     """wpa_supplicant ctrl_iface DUP_NETWORK"""
244     ssid = "target"
245     passphrase = 'qwertyuiop'
246     params = hostapd.wpa2_params(ssid=ssid, passphrase=passphrase)
247     hostapd.add_ap(apdev[0]['ifname'], params)
248
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))
255         if "OK" not in res:
256             raise Exception("DUP_NETWORK failed")
257     dev[0].connect_network(id)
258
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")
274
275 def add_cred(dev):
276     id = dev.add_cred()
277     ev = dev.wait_event(["CRED-ADDED"])
278     if ev is None:
279         raise Exception("Missing CRED-ADDED event")
280     if " " + str(id) not in ev:
281         raise Exception("CRED-ADDED event without matching id")
282     return id
283
284 def set_cred(dev, id, field, value):
285     dev.set_cred(id, field, value)
286     ev = dev.wait_event(["CRED-MODIFIED"])
287     if ev is None:
288         raise Exception("Missing CRED-MODIFIED event")
289     if " " + str(id) + " " not in ev:
290         raise Exception("CRED-MODIFIED event without matching id")
291     if field not in ev:
292         raise Exception("CRED-MODIFIED event without matching field")
293
294 def set_cred_quoted(dev, id, field, value):
295     dev.set_cred_quoted(id, field, value)
296     ev = dev.wait_event(["CRED-MODIFIED"])
297     if ev is None:
298         raise Exception("Missing CRED-MODIFIED event")
299     if " " + str(id) + " " not in ev:
300         raise Exception("CRED-MODIFIED event without matching id")
301     if field not in ev:
302         raise Exception("CRED-MODIFIED event without matching field")
303
304 def remove_cred(dev, id):
305     dev.remove_cred(id)
306     ev = dev.wait_event(["CRED-REMOVED"])
307     if ev is None:
308         raise Exception("Missing CRED-REMOVED event")
309     if " " + str(id) not in ev:
310         raise Exception("CRED-REMOVED event without matching id")
311
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")
336
337     if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " eap FOO"):
338         raise Exception("Unexpected success on unknown EAP method")
339
340     if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " username 12xa"):
341         raise Exception("Unexpected success on invalid string")
342
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")
346
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")
350
351     if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " foo 4142"):
352         raise Exception("Unexpected success on unknown field")
353
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)")
358
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)")
368
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) ]
407     for v in values:
408         if v[2]:
409             set_cred_quoted(dev[0], id, v[0], v[1])
410         else:
411             set_cred(dev[0], id, v[0], v[1])
412         val = dev[0].get_cred(id, v[0])
413         if len(v) == 4:
414             expect = v[3]
415         else:
416             expect = v[1]
417         if val != expect:
418             raise Exception("Unexpected GET_CRED value for {}: {} != {}".format(v[0], val, expect))
419     creds = dev[0].request("LIST_CREDS").splitlines()
420     if len(creds) != 2:
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)")
427
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")
442
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")
460
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")
477
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")
495
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")
504
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")
511
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")
518
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")
525
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)
531
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)
537
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")
558
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")
569
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")
572
573     if "FAIL" not in dev[0].request("WPS_ER_PIN any"):
574         raise Exception("Unexpected success on invalid WPS_ER_PIN")
575
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")
578
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")
581
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")
592
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")
599
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")
606
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")
615
616     if "FAIL" not in dev[0].request("SET serial_number 0123456789abcdef0123456789abcdef0"):
617         raise Exception("Too long string accepted")
618
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")
626
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" ]
633     for t in ts:
634         if "OK" not in dev[2].request("SET " + t):
635             raise Exception("SET failed for: " + t)
636
637 def test_wpas_ctrl_level(dev):
638     """wpa_supplicant ctrl_iface LEVEL"""
639     try:
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)
646         if ev is None:
647             raise Exception("No debug message received")
648         dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=5)
649     finally:
650         dev[2].mon.request("LEVEL 3")
651
652 def test_wpas_ctrl_bssid_filter(dev, apdev):
653     """wpa_supplicant bssid_filter"""
654     try:
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")
683
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")
686     finally:
687         dev[2].request("SET bssid_filter ")
688
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)
693
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")
708
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")
719
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)
725     if ev is not None:
726         raise Exception("Unexpected reassociation")
727
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")
732
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")
745
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")
762
763 def test_wpas_ctrl_set(dev):
764     """wpa_supplicant ctrl_iface SET"""
765     vals = [ "foo",
766              "ampdu 0",
767              "radio_disable 0",
768              "ps 10",
769              "ps 1",
770              "dot11RSNAConfigPMKLifetime 0",
771              "dot11RSNAConfigPMKReauthThreshold 101",
772              "dot11RSNAConfigSATimeout 0",
773              "wps_version_number -1",
774              "wps_version_number 256" ]
775     for val in vals:
776         if "FAIL" not in dev[0].request("SET " + val):
777             raise Exception("Unexpected SET success for " + val)
778
779     vals = [ "EAPOL::heldPeriod 60",
780              "EAPOL::authPeriod 30",
781              "EAPOL::startPeriod 30",
782              "EAPOL::maxStart 3",
783              "dot11RSNAConfigSATimeout 60",
784              "ps -1",
785              "ps 0",
786              "no_keep_alive 0",
787              "tdls_disabled 1",
788              "tdls_disabled 0" ]
789     for val in vals:
790         if "OK" not in dev[0].request("SET " + val):
791             raise Exception("Unexpected SET failure for " + val)
792
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))
804
805     res = dev[0].get_capability("pairwise")
806     if "CCMP" not in res:
807         raise Exception("Unexpected GET_CAPABILITY pairwise response: " + str(res))
808
809     res = dev[0].get_capability("group")
810     if "CCMP" not in res:
811         raise Exception("Unexpected GET_CAPABILITY group response: " + str(res))
812
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))
816
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))
820
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))
824
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))
828
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))
832
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))
836
837     res = dev[0].get_capability("tdls")
838     if "EXTERNAL" not in res[0]:
839         raise Exception("Unexpected GET_CAPABILITY tdls response: " + str(res))
840
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))
844
845     if dev[0].get_capability("foo") is not None:
846         raise Exception("Unexpected GET_CAPABILITY foo response: " + str(res))
847
848 def test_wpas_ctrl_nfc_report_handover(dev):
849     """wpa_supplicant ctrl_iface NFC_REPORT_HANDOVER"""
850     vals = [ "FOO",
851              "ROLE freq=12345",
852              "ROLE TYPE",
853              "ROLE TYPE REQ",
854              "ROLE TYPE REQ SEL",
855              "ROLE TYPE 0Q SEL",
856              "ROLE TYPE 00 SEL",
857              "ROLE TYPE 00 0Q",
858              "ROLE TYPE 00 00" ]
859     for v in vals:
860         if "FAIL" not in dev[0].request("NFC_REPORT_HANDOVER " + v):
861             raise Exception("Unexpected NFC_REPORT_HANDOVER success for " + v)
862
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" ]
867     for v in vals:
868         if "FAIL" not in dev[0].request("WPS_NFC_TAG_READ " + v):
869             raise Exception("Unexpected WPS_NFC_TAG_READ success for " + v)
870
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" ]
874     for v in vals:
875         if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_REQ " + v):
876             raise Exception("Unexpected NFC_GET_HANDOVER_REQ success for " + v)
877
878     vals = [ "NDEF WPS", "NDEF P2P-CR", "WPS P2P-CR" ]
879     for v in vals:
880         if "FAIL" in dev[0].request("NFC_GET_HANDOVER_REQ " + v):
881             raise Exception("Unexpected NFC_GET_HANDOVER_REQ failure for " + v)
882
883     vals = [ "FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P",
884              "NDEF WPS", "NDEF WPS uuid" ]
885     for v in vals:
886         if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_SEL " + v):
887             raise Exception("Unexpected NFC_GET_HANDOVER_SEL success for " + v)
888
889     vals = [ "NDEF P2P-CR", "WPS P2P-CR", "NDEF P2P-CR-TAG",
890              "WPS P2P-CR-TAG" ]
891     for v in vals:
892         if "FAIL" in dev[0].request("NFC_GET_HANDOVER_SEL " + v):
893             raise Exception("Unexpected NFC_GET_HANDOVER_SEL failure for " + v)
894
895 def get_blacklist(dev):
896     return dev.request("BLACKLIST").splitlines()
897
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])
903     if len(b) != 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))
920
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")
925
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")
931
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)
939
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)
947
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)
955
956     if "FAIL" not in dev[2].request("LOG_LEVEL FOO"):
957         raise Exception("Invalid LOG_LEVEL accepted")
958
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)
965
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)
973
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)
978
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)
993     time.sleep(0.1)
994
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)
1001
1002 def test_wpas_ctrl_country(dev, apdev):
1003     """wpa_supplicant SET/GET country code"""
1004     try:
1005         # work around issues with possible pending regdom event from the end of
1006         # the previous test case
1007         time.sleep(0.2)
1008         dev[0].dump_monitor()
1009
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"])
1015         if ev is None:
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"])
1023         if ev is None:
1024             raise Exception("regdom change event not seen")
1025         if "init=CORE type=WORLD" not in ev:
1026             raise Exception("Unexpected event contents: " + ev)
1027     finally:
1028         subprocess.call(['sudo', 'iw', 'reg', 'set', '00'])
1029
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")
1036     time.sleep(1)
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)
1044     if ev is None:
1045         raise Exception("Scan not completed")
1046
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")
1051
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")
1074
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")
1083
1084     # driver_nl80211.c does not support interface list, so do not fail because
1085     # of that
1086     logger.debug(wpas.global_request("INTERFACE_LIST"))
1087
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")
1106
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")
1118
1119 def test_wpas_ctrl_ipaddr(dev, apdev):
1120     """wpa_supplicant IP address in STATUS"""
1121     try:
1122         subprocess.call(['ip', 'addr', 'add', '10.174.65.207/32', 'dev',
1123                          dev[0].ifname])
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")
1127     finally:
1128         subprocess.call(['ip', 'addr', 'del', '10.174.65.207/32', 'dev',
1129                          dev[0].ifname])
1130
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)
1137
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")
1144
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")
1148         return
1149
1150     dev[0].connect("test2", key_mgmt="NONE", scan_freq="2412")
1151
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.
1154     
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)
1159     if ev is None:
1160         raise Exception("RRM report result not indicated")
1161     logger.info("RRM result: " + ev)
1162
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)
1167     if ev is None:
1168         raise Exception("RRM report result not indicated")
1169     logger.info("RRM result: " + ev)
1170
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")
1190
1191 def test_wpas_ctrl_vendor(dev, apdev):
1192     """wpa_supplicant ctrl_iface VENDOR"""
1193     cmds = [ "foo",
1194              "1",
1195              "1 foo",
1196              "1 2foo",
1197              "1 2 qq" ]
1198     for cmd in cmds:
1199         if "FAIL" not in dev[0].request("VENDOR " + cmd):
1200             raise Exception("Invalid VENDOR command accepted: " + cmd)
1201
1202 def test_wpas_ctrl_mgmt_tx(dev, apdev):
1203     """wpa_supplicant ctrl_iface MGMT_TX"""
1204     cmds = [ "foo",
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" ]
1209     for cmd in cmds:
1210         if "FAIL" not in dev[0].request("MGMT_TX " + cmd):
1211             raise Exception("Invalid MGMT_TX command accepted: " + cmd)
1212
1213     if "OK" not in dev[0].request("MGMT_TX_DONE"):
1214         raise Exception("MGMT_TX_DONE failed")
1215
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")
1220
1221 def test_wpas_ctrl_eapol_rx(dev, apdev):
1222     """wpa_supplicant ctrl_iface EAPOL_RX"""
1223     cmds = [ "foo",
1224              "00:11:22:33:44:55 123",
1225              "00:11:22:33:44:55 12qq" ]
1226     for cmd in cmds:
1227         if "FAIL" not in dev[0].request("EAPOL_RX " + cmd):
1228             raise Exception("Invalid EAPOL_RX command accepted: " + cmd)
1229
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")
1235
1236     try:
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")
1241         cmds = [ "foo",
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" ]
1245         for cmd in cmds:
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")
1250     finally:
1251         dev[0].request("DATA_TEST_CONFIG 0")
1252
1253     cmds = [ "",
1254              "00",
1255              "00112233445566778899aabbccdde",
1256              "00112233445566778899aabbccdq" ]
1257     for cmd in cmds:
1258         if "FAIL" not in dev[0].request("DATA_TEST_FRAME " + cmd):
1259             raise Exception("Invalid DATA_TEST_FRAME command accepted: " + cmd)
1260
1261     if "OK" not in dev[0].request("DATA_TEST_FRAME 00112233445566778899aabbccddee"):
1262         raise Exception("DATA_TEST_FRAME failed")
1263
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")
1268     cmds = [ "-1 ",
1269              "255 ",
1270              "1",
1271              "1 123",
1272              "1 12qq34" ]
1273     for cmd in cmds:
1274         if "FAIL" not in dev[0].request("VENDOR_ELEM_ADD " + cmd):
1275             raise Exception("Invalid VENDOR_ELEM_ADD command accepted: " + cmd)
1276
1277     cmds = [ "-1 ",
1278              "255 " ]
1279     for cmd in cmds:
1280         if "FAIL" not in dev[0].request("VENDOR_ELEM_GET " + cmd):
1281             raise Exception("Invalid VENDOR_ELEM_GET command accepted: " + cmd)
1282
1283     dev[0].request("VENDOR_ELEM_REMOVE 1 *")
1284     cmds = [ "-1 ",
1285              "255 ",
1286              "1",
1287              "1",
1288              "1 123",
1289              "1 12qq34",
1290              "1 12",
1291              "1 0000" ]
1292     for cmd in cmds:
1293         if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1294             raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1295
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")
1299     cmds = [ "-1 ",
1300              "255 ",
1301              "1",
1302              "1 123",
1303              "1 12qq34",
1304              "1 12",
1305              "1 0000" ]
1306     for cmd in cmds:
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")
1311
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")
1326
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")