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