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