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