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