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