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