tests: wpa_supplicant interface creation in AP mode
[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
1240 def test_wpas_ctrl_roam(dev, apdev):
1241     """wpa_supplicant ctrl_iface ROAM error cases"""
1242     if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44"):
1243         raise Exception("Unexpected success")
1244     if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"):
1245         raise Exception("Unexpected success")
1246     params = { "ssid": "test" }
1247     hostapd.add_ap(apdev[0]['ifname'], params)
1248     id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
1249     if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"):
1250         raise Exception("Unexpected success")
1251
1252 def test_wpas_ctrl_ipaddr(dev, apdev):
1253     """wpa_supplicant IP address in STATUS"""
1254     try:
1255         subprocess.call(['ip', 'addr', 'add', '10.174.65.207/32', 'dev',
1256                          dev[0].ifname])
1257         ipaddr = dev[0].get_status_field('ip_address')
1258         if ipaddr != '10.174.65.207':
1259             raise Exception("IP address not in STATUS output")
1260     finally:
1261         subprocess.call(['ip', 'addr', 'del', '10.174.65.207/32', 'dev',
1262                          dev[0].ifname])
1263
1264 def test_wpas_ctrl_neighbor_rep_req(dev, apdev):
1265     """wpa_supplicant ctrl_iface NEIGHBOR_REP_REQUEST"""
1266     params = { "ssid": "test" }
1267     hostapd.add_ap(apdev[0]['ifname'], params)
1268     params = { "ssid": "test2", "radio_measurements": "1" }
1269     hostapd.add_ap(apdev[1]['ifname'], params)
1270
1271     dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
1272     if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
1273         raise Exception("Request succeeded unexpectedly")
1274     if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=abcdef"):
1275         raise Exception("Request succeeded unexpectedly")
1276     dev[0].request("DISCONNECT")
1277
1278     rrm = int(dev[0].get_driver_status_field("capa.rrm_flags"), 16)
1279     if rrm & 0x5 != 0x5:
1280         logger.info("Driver does not support required RRM capabilities - skip rest of the test case")
1281         return
1282
1283     dev[0].connect("test2", key_mgmt="NONE", scan_freq="2412")
1284
1285     # These requests are expected to get sent properly, but since hostapd does
1286     # not yet support processing of the request, these are expected to fail.
1287     
1288     if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
1289         raise Exception("Request failed")
1290     ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
1291                              "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
1292     if ev is None:
1293         raise Exception("RRM report result not indicated")
1294     logger.info("RRM result: " + ev)
1295
1296     if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=abcdef"):
1297         raise Exception("Request failed")
1298     ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
1299                              "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
1300     if ev is None:
1301         raise Exception("RRM report result not indicated")
1302     logger.info("RRM result: " + ev)
1303
1304 def test_wpas_ctrl_rsp(dev, apdev):
1305     """wpa_supplicant ctrl_iface CTRL-RSP-"""
1306     if "FAIL" not in dev[0].request("CTRL-RSP-"):
1307         raise Exception("Request succeeded unexpectedly")
1308     if "FAIL" not in dev[0].request("CTRL-RSP-foo-"):
1309         raise Exception("Request succeeded unexpectedly")
1310     if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567"):
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     id = dev[0].add_network()
1315     if "FAIL" not in dev[0].request("CTRL-RSP-foo-%d:" % id):
1316         raise Exception("Request succeeded unexpectedly")
1317     for req in [ "IDENTITY", "PASSWORD", "NEW_PASSWORD", "PIN", "OTP",
1318                  "PASSPHRASE", "SIM" ]:
1319         if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)):
1320             raise Exception("Request failed unexpectedly")
1321         if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)):
1322             raise Exception("Request failed unexpectedly")
1323
1324 def test_wpas_ctrl_vendor(dev, apdev):
1325     """wpa_supplicant ctrl_iface VENDOR"""
1326     cmds = [ "foo",
1327              "1",
1328              "1 foo",
1329              "1 2foo",
1330              "1 2 qq" ]
1331     for cmd in cmds:
1332         if "FAIL" not in dev[0].request("VENDOR " + cmd):
1333             raise Exception("Invalid VENDOR command accepted: " + cmd)
1334
1335 def test_wpas_ctrl_mgmt_tx(dev, apdev):
1336     """wpa_supplicant ctrl_iface MGMT_TX"""
1337     cmds = [ "foo",
1338              "00:11:22:33:44:55 foo",
1339              "00:11:22:33:44:55 11:22:33:44:55:66",
1340              "00:11:22:33:44:55 11:22:33:44:55:66 freq=0 no_cck=0 wait_time=0 action=123",
1341              "00:11:22:33:44:55 11:22:33:44:55:66 action=12qq" ]
1342     for cmd in cmds:
1343         if "FAIL" not in dev[0].request("MGMT_TX " + cmd):
1344             raise Exception("Invalid MGMT_TX command accepted: " + cmd)
1345
1346     if "OK" not in dev[0].request("MGMT_TX_DONE"):
1347         raise Exception("MGMT_TX_DONE failed")
1348
1349 def test_wpas_ctrl_driver_event(dev, apdev):
1350     """wpa_supplicant ctrl_iface DRIVER_EVENT"""
1351     if "FAIL" not in dev[0].request("DRIVER_EVENT foo"):
1352         raise Exception("Invalid DRIVER_EVENT accepted")
1353
1354 def test_wpas_ctrl_eapol_rx(dev, apdev):
1355     """wpa_supplicant ctrl_iface EAPOL_RX"""
1356     cmds = [ "foo",
1357              "00:11:22:33:44:55 123",
1358              "00:11:22:33:44:55 12qq" ]
1359     for cmd in cmds:
1360         if "FAIL" not in dev[0].request("EAPOL_RX " + cmd):
1361             raise Exception("Invalid EAPOL_RX command accepted: " + cmd)
1362
1363 def test_wpas_ctrl_data_test(dev, apdev):
1364     """wpa_supplicant ctrl_iface DATA_TEST"""
1365     dev[0].request("DATA_TEST_CONFIG 0")
1366     if "FAIL" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"):
1367         raise Exception("DATA_TEST_TX accepted when not in test mode")
1368
1369     try:
1370         if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"):
1371             raise Exception("DATA_TEST_CONFIG failed")
1372         if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"):
1373             raise Exception("DATA_TEST_CONFIG failed")
1374         cmds = [ "foo",
1375                  "00:11:22:33:44:55 foo",
1376                  "00:11:22:33:44:55 00:11:22:33:44:55 -1",
1377                  "00:11:22:33:44:55 00:11:22:33:44:55 256" ]
1378         for cmd in cmds:
1379             if "FAIL" not in dev[0].request("DATA_TEST_TX " + cmd):
1380                 raise Exception("Invalid DATA_TEST_TX command accepted: " + cmd)
1381         if "OK" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"):
1382             raise Exception("DATA_TEST_TX failed")
1383     finally:
1384         dev[0].request("DATA_TEST_CONFIG 0")
1385
1386     cmds = [ "",
1387              "00",
1388              "00112233445566778899aabbccdde",
1389              "00112233445566778899aabbccdq" ]
1390     for cmd in cmds:
1391         if "FAIL" not in dev[0].request("DATA_TEST_FRAME " + cmd):
1392             raise Exception("Invalid DATA_TEST_FRAME command accepted: " + cmd)
1393
1394     if "OK" not in dev[0].request("DATA_TEST_FRAME 00112233445566778899aabbccddee"):
1395         raise Exception("DATA_TEST_FRAME failed")
1396
1397 def test_wpas_ctrl_vendor_elem(dev, apdev):
1398     """wpa_supplicant ctrl_iface VENDOR_ELEM"""
1399     if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 "):
1400         raise Exception("VENDOR_ELEM_ADD failed")
1401     cmds = [ "-1 ",
1402              "255 ",
1403              "1",
1404              "1 123",
1405              "1 12qq34" ]
1406     for cmd in cmds:
1407         if "FAIL" not in dev[0].request("VENDOR_ELEM_ADD " + cmd):
1408             raise Exception("Invalid VENDOR_ELEM_ADD command accepted: " + cmd)
1409
1410     cmds = [ "-1 ",
1411              "255 " ]
1412     for cmd in cmds:
1413         if "FAIL" not in dev[0].request("VENDOR_ELEM_GET " + cmd):
1414             raise Exception("Invalid VENDOR_ELEM_GET command accepted: " + cmd)
1415
1416     dev[0].request("VENDOR_ELEM_REMOVE 1 *")
1417     cmds = [ "-1 ",
1418              "255 ",
1419              "1",
1420              "1",
1421              "1 123",
1422              "1 12qq34",
1423              "1 12",
1424              "1 0000" ]
1425     for cmd in cmds:
1426         if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1427             raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1428
1429     dev[0].request("VENDOR_ELEM_ADD 1 000100")
1430     if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 "):
1431         raise Exception("VENDOR_ELEM_REMOVE failed")
1432     cmds = [ "-1 ",
1433              "255 ",
1434              "1",
1435              "1 123",
1436              "1 12qq34",
1437              "1 12",
1438              "1 0000" ]
1439     for cmd in cmds:
1440         if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1441             raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1442     if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 000100"):
1443         raise Exception("VENDOR_ELEM_REMOVE failed")
1444
1445 def test_wpas_ctrl_misc(dev, apdev):
1446     """wpa_supplicant ctrl_iface and miscellaneous commands"""
1447     if "OK" not in dev[0].request("RELOG"):
1448         raise Exception("RELOG failed")
1449     if dev[0].request("IFNAME") != dev[0].ifname:
1450         raise Exception("IFNAME returned unexpected response")
1451     if "FAIL" not in dev[0].request("REATTACH"):
1452         raise Exception("REATTACH accepted while disabled")
1453     if "OK" not in dev[2].request("RECONFIGURE"):
1454         raise Exception("RECONFIGURE failed")
1455     if "FAIL" in dev[0].request("INTERFACE_LIST"):
1456         raise Exception("INTERFACE_LIST failed")
1457     if "UNKNOWN COMMAND" not in dev[0].request("FOO"):
1458         raise Exception("Unknown command accepted")
1459
1460     if "FAIL" not in dev[0].global_request("INTERFACE_REMOVE foo"):
1461         raise Exception("Invalid INTERFACE_REMOVE accepted")
1462     if "FAIL" not in dev[0].global_request("SET foo"):
1463         raise Exception("Invalid global SET accepted")
1464
1465 def test_wpas_ctrl_dump(dev, apdev):
1466     """wpa_supplicant ctrl_iface and DUMP/GET global parameters"""
1467     vals = dev[0].get_config()
1468     logger.info("Config values from DUMP: " + str(vals))
1469     for field in vals:
1470         res = dev[0].request("GET " + field)
1471         if res == 'FAIL\n':
1472             res = "null"
1473         if res != vals[field]:
1474             print "'{}' != '{}'".format(res, vals[field])
1475             raise Exception("Mismatch in config field " + field)
1476     if "beacon_int" not in vals:
1477         raise Exception("Missing config field")
1478
1479 def test_wpas_ctrl_interface_add(dev, apdev):
1480     """wpa_supplicant INTERFACE_ADD/REMOVE with vif creation/removal"""
1481     hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
1482     dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
1483     hwsim_utils.test_connectivity(dev[0], hapd)
1484
1485     ifname = "test-" + dev[0].ifname
1486     dev[0].interface_add(ifname, create=True)
1487     wpas = WpaSupplicant(ifname=ifname)
1488     wpas.connect("open", key_mgmt="NONE", scan_freq="2412")
1489     hwsim_utils.test_connectivity(wpas, hapd)
1490     hwsim_utils.test_connectivity(dev[0], hapd)
1491     dev[0].global_request("INTERFACE_REMOVE " + ifname)
1492     hwsim_utils.test_connectivity(dev[0], hapd)
1493
1494 def test_wpas_ctrl_interface_add_ap(dev, apdev):
1495     """wpa_supplicant INTERFACE_ADD/REMOVE AP interface"""
1496     with HWSimRadio() as (radio, iface):
1497         wpas0 = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1498         wpas0.interface_add(iface)
1499
1500         ifname = "test-wpas-ap"
1501         wpas0.interface_add(ifname, create=True, if_type='ap')
1502         wpas = WpaSupplicant(ifname=ifname)
1503
1504         id = wpas.add_network()
1505         wpas.set_network(id, "mode", "2")
1506         wpas.set_network_quoted(id, "ssid", "wpas-ap-open")
1507         wpas.set_network(id, "key_mgmt", "NONE")
1508         wpas.set_network(id, "frequency", "2412")
1509         wpas.set_network(id, "scan_freq", "2412")
1510         wpas.select_network(id)
1511         wait_ap_ready(wpas)
1512
1513         dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
1514         dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
1515
1516         hwsim_utils.test_connectivity(wpas, dev[1])
1517         hwsim_utils.test_connectivity(dev[1], dev[2])
1518
1519         dev[1].request("DISCONNECT")
1520         dev[2].request("DISCONNECT")
1521         dev[1].wait_disconnected()
1522         dev[2].wait_disconnected()
1523         wpas0.global_request("INTERFACE_REMOVE " + ifname)
1524
1525 def test_wpas_ctrl_interface_add_many(dev, apdev):
1526     """wpa_supplicant INTERFACE_ADD/REMOVE with vif creation/removal (many)"""
1527     try:
1528         _test_wpas_ctrl_interface_add_many(dev, apdev)
1529     finally:
1530         for i in range(10):
1531             ifname = "test%d-" % i + dev[0].ifname
1532             dev[0].global_request("INTERFACE_REMOVE " + ifname)
1533
1534 def _test_wpas_ctrl_interface_add_many(dev, apdev):
1535     hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
1536     dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
1537     hwsim_utils.test_connectivity(dev[0], hapd)
1538     dev[0].dump_monitor()
1539
1540     l = []
1541     for i in range(10):
1542         ifname = "test%d-" % i + dev[0].ifname
1543         dev[0].interface_add(ifname, create=True)
1544         wpas = WpaSupplicant(ifname=ifname)
1545         wpas.connect("open", key_mgmt="NONE", scan_freq="2412")
1546         wpas.dump_monitor()
1547         l.append(wpas)
1548         dev[0].dump_monitor()
1549     for wpas in l:
1550         wpas.dump_monitor()
1551         hwsim_utils.test_connectivity(wpas, hapd)
1552         wpas.dump_monitor()
1553     dev[0].dump_monitor()
1554
1555 def test_wpas_ctrl_interface_add2(dev, apdev):
1556     """wpa_supplicant INTERFACE_ADD/REMOVE with vif without creation/removal"""
1557     ifname = "test-ext-" + dev[0].ifname
1558     try:
1559         _test_wpas_ctrl_interface_add2(dev, apdev, ifname)
1560     finally:
1561         subprocess.call(['iw', 'dev', ifname, 'del'])
1562
1563 def _test_wpas_ctrl_interface_add2(dev, apdev, ifname):
1564     hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
1565     dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
1566     hwsim_utils.test_connectivity(dev[0], hapd)
1567
1568     subprocess.call(['iw', 'dev', dev[0].ifname, 'interface', 'add', ifname,
1569                      'type', 'station'])
1570     subprocess.call(['ip', 'link', 'set', 'dev', ifname, 'address',
1571                      '02:01:00:00:02:01'])
1572     dev[0].interface_add(ifname, set_ifname=False, all_params=True)
1573     wpas = WpaSupplicant(ifname=ifname)
1574     wpas.connect("open", key_mgmt="NONE", scan_freq="2412")
1575     hwsim_utils.test_connectivity(wpas, hapd)
1576     hwsim_utils.test_connectivity(dev[0], hapd)
1577     del wpas
1578     dev[0].global_request("INTERFACE_REMOVE " + ifname)
1579     hwsim_utils.test_connectivity(dev[0], hapd)
1580
1581 def test_wpas_ctrl_wait(dev, apdev, test_params):
1582     """wpa_supplicant control interface wait for client"""
1583     logfile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.log-wpas')
1584     pidfile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.pid-wpas')
1585     conffile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.conf')
1586     with open(conffile, 'w') as f:
1587         f.write("ctrl_interface=DIR=/var/run/wpa_supplicant\n")
1588
1589     prg = os.path.join(test_params['logdir'],
1590                        'alt-wpa_supplicant/wpa_supplicant/wpa_supplicant')
1591     if not os.path.exists(prg):
1592         prg = '../../wpa_supplicant/wpa_supplicant'
1593     arg = [ prg ]
1594     cmd = subprocess.Popen(arg, stdout=subprocess.PIPE)
1595     out = cmd.communicate()[0]
1596     cmd.wait()
1597     tracing = "Linux tracing" in out
1598
1599     with HWSimRadio() as (radio, iface):
1600         arg = [ prg, '-BdddW', '-P', pidfile, '-f', logfile,
1601                 '-Dnl80211', '-c', conffile, '-i', iface ]
1602         if tracing:
1603             arg += [ '-T' ]
1604         logger.info("Start wpa_supplicant: " + str(arg))
1605         subprocess.call(arg)
1606         wpas = WpaSupplicant(ifname=iface)
1607         if "PONG" not in wpas.request("PING"):
1608             raise Exception("Could not PING wpa_supplicant")
1609         if not os.path.exists(pidfile):
1610             raise Exception("PID file not created")
1611         if "OK" not in wpas.request("TERMINATE"):
1612             raise Exception("Could not TERMINATE")
1613         ev = wpas.wait_event([ "CTRL-EVENT-TERMINATING" ], timeout=2)
1614         if ev is None:
1615             raise Exception("No termination event received")
1616         for i in range(20):
1617             if not os.path.exists(pidfile):
1618                 break
1619             time.sleep(0.1)
1620         if os.path.exists(pidfile):
1621             raise Exception("PID file not removed")
1622
1623 def test_wpas_ctrl_oom(dev):
1624     """Various wpa_supplicant ctrl_iface OOM cases"""
1625     try:
1626         _test_wpas_ctrl_oom(dev)
1627     finally:
1628         dev[0].request("VENDOR_ELEM_REMOVE 1 *")
1629         dev[0].request("VENDOR_ELEM_REMOVE 2 *")
1630         dev[0].request("SET bssid_filter ")
1631
1632 def _test_wpas_ctrl_oom(dev):
1633     dev[0].request('VENDOR_ELEM_ADD 2 000100')
1634     tests = [ ('DRIVER_EVENT AVOID_FREQUENCIES 2412', 'FAIL',
1635                1, 'freq_range_list_parse'),
1636               ('P2P_SET disallow_freq 2412', 'FAIL',
1637                1, 'freq_range_list_parse'),
1638               ('SCAN freq=2412', 'FAIL',
1639                1, 'freq_range_list_parse'),
1640               ('INTERWORKING_SELECT freq=2412', 'FAIL',
1641                1, 'freq_range_list_parse'),
1642               ('SCAN ssid 112233', 'FAIL',
1643                1, 'wpas_ctrl_scan'),
1644               ('MGMT_TX 00:00:00:00:00:00 00:00:00:00:00:00 action=00', 'FAIL',
1645                1, 'wpas_ctrl_iface_mgmt_tx'),
1646               ('EAPOL_RX 00:00:00:00:00:00 00', 'FAIL',
1647                1, 'wpas_ctrl_iface_eapol_rx'),
1648               ('DATA_TEST_FRAME 00112233445566778899aabbccddee', 'FAIL',
1649                1, 'wpas_ctrl_iface_data_test_frame'),
1650               ('DATA_TEST_FRAME 00112233445566778899aabbccddee', 'FAIL',
1651                1, 'l2_packet_init;wpas_ctrl_iface_data_test_frame'),
1652               ('VENDOR_ELEM_ADD 1 000100', 'FAIL',
1653                1, 'wpas_ctrl_vendor_elem_add'),
1654               ('VENDOR_ELEM_ADD 2 000100', 'FAIL',
1655                2, 'wpas_ctrl_vendor_elem_add'),
1656               ('VENDOR_ELEM_REMOVE 2 000100', 'FAIL',
1657                1, 'wpas_ctrl_vendor_elem_remove'),
1658               ('SET bssid_filter 00:11:22:33:44:55', 'FAIL',
1659                1, 'set_bssid_filter'),
1660               ('SET disallow_aps bssid 00:11:22:33:44:55', 'FAIL',
1661                1, 'set_disallow_aps'),
1662               ('SET disallow_aps ssid 11', 'FAIL',
1663                1, 'set_disallow_aps'),
1664               ('SET blob foo 0011', 'FAIL',
1665                1, 'wpas_ctrl_set_blob'),
1666               ('SET blob foo 0011', 'FAIL',
1667                2, 'wpas_ctrl_set_blob'),
1668               ('SET blob foo 0011', 'FAIL',
1669                3, 'wpas_ctrl_set_blob'),
1670               ('WPS_NFC_TAG_READ 00', 'FAIL',
1671                1, 'wpa_supplicant_ctrl_iface_wps_nfc_tag_read'),
1672               ('WPS_NFC_TOKEN NDEF', 'FAIL',
1673                1, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1674               ('WPS_NFC_TOKEN NDEF', 'FAIL',
1675                2, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1676               ('WPS_NFC_TOKEN NDEF', 'FAIL',
1677                3, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1678               ('WPS_NFC_TOKEN NDEF', 'FAIL',
1679                4, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1680               ('WPS_NFC_TOKEN NDEF', 'FAIL',
1681                5, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1682               ('NFC_REPORT_HANDOVER ROLE TYPE 00 00', 'FAIL',
1683                1, 'wpas_ctrl_nfc_report_handover'),
1684               ('NFC_REPORT_HANDOVER ROLE TYPE 00 00', 'FAIL',
1685                2, 'wpas_ctrl_nfc_report_handover'),
1686               ('NFC_GET_HANDOVER_REQ NDEF WPS-CR', 'FAIL',
1687                1, 'wps_build_nfc_handover_req'),
1688               ('NFC_GET_HANDOVER_REQ NDEF WPS-CR', 'FAIL',
1689                1, 'ndef_build_record'),
1690               ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', None,
1691                1, 'wpas_p2p_nfc_handover'),
1692               ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', 'FAIL',
1693                2, 'wpas_p2p_nfc_handover'),
1694               ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', None,
1695                1, 'wps_build_nfc_handover_req_p2p'),
1696               ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', 'FAIL',
1697                1, 'ndef_build_record'),
1698               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', None,
1699                1, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1700               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', None,
1701                1, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1702               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL',
1703                2, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1704               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', 'FAIL',
1705                2, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1706               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL',
1707                3, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1708               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', 'FAIL',
1709                3, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1710               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL',
1711                4, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1712               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', 'FAIL',
1713                4, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1714               ('P2P_ASP_PROVISION_RESP 00:11:22:33:44:55 id=1', 'FAIL',
1715                1, 'p2p_parse_asp_provision_cmd'),
1716               ('P2P_SERV_DISC_REQ 00:11:22:33:44:55 02000001', 'FAIL',
1717                1, 'p2p_ctrl_serv_disc_req'),
1718               ('P2P_SERV_DISC_RESP 2412 00:11:22:33:44:55 1 00', 'FAIL',
1719                1, 'p2p_ctrl_serv_disc_resp'),
1720               ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027',
1721                'FAIL',
1722                1, 'p2p_ctrl_service_add_bonjour'),
1723               ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027',
1724                'FAIL',
1725                2, 'p2p_ctrl_service_add_bonjour'),
1726               ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027',
1727                'FAIL',
1728                3, 'p2p_ctrl_service_add_bonjour'),
1729               ('P2P_SERVICE_DEL bonjour 0b5f6166706f766572746370c00c000c01',
1730                'FAIL',
1731                1, 'p2p_ctrl_service_del_bonjour'),
1732               ('GAS_REQUEST 00:11:22:33:44:55 00', 'FAIL',
1733                1, 'gas_request'),
1734               ('GAS_REQUEST 00:11:22:33:44:55 00 11', 'FAIL',
1735                2, 'gas_request'),
1736               ('HS20_GET_NAI_HOME_REALM_LIST 00:11:22:33:44:55 realm=example.com',
1737               'FAIL',
1738               1, 'hs20_nai_home_realm_list'),
1739               ('HS20_GET_NAI_HOME_REALM_LIST 00:11:22:33:44:55 00',
1740               'FAIL',
1741               1, 'hs20_get_nai_home_realm_list'),
1742               ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1743                1, 'wpas_ctrl_iface_wnm_sleep'),
1744               ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1745                2, 'wpas_ctrl_iface_wnm_sleep'),
1746               ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1747                3, 'wpas_ctrl_iface_wnm_sleep'),
1748               ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1749                4, 'wpas_ctrl_iface_wnm_sleep'),
1750               ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1751                5, 'wpas_ctrl_iface_wnm_sleep'),
1752               ('WNM_SLEEP enter', 'FAIL',
1753                3, 'wpas_ctrl_iface_wnm_sleep'),
1754               ('VENDOR 1 1 00', 'FAIL',
1755                1, 'wpa_supplicant_vendor_cmd'),
1756               ('VENDOR 1 1 00', 'FAIL',
1757                2, 'wpa_supplicant_vendor_cmd'),
1758               ('RADIO_WORK add test', 'FAIL',
1759                1, 'wpas_ctrl_radio_work_add'),
1760               ('RADIO_WORK add test', 'FAIL',
1761                2, 'wpas_ctrl_radio_work_add'),
1762               ('AUTOSCAN periodic:1', 'FAIL',
1763                1, 'wpa_supplicant_ctrl_iface_autoscan'),
1764               ('PING', None,
1765                1, 'wpa_supplicant_ctrl_iface_process') ]
1766     for cmd,exp,count,func in tests:
1767         with alloc_fail(dev[0], count, func):
1768             res = dev[0].request(cmd)
1769             if exp and exp not in res:
1770                 raise Exception("Unexpected success for '%s' during OOM" % cmd)
1771
1772     tests = [ ('FOO', None,
1773                1, 'wpa_supplicant_global_ctrl_iface_process'),
1774               ('IFNAME=notfound PING', 'FAIL\n',
1775                1, 'wpas_global_ctrl_iface_ifname') ]
1776     for cmd,exp,count,func in tests:
1777         with alloc_fail(dev[0], count, func):
1778             res = dev[0].global_request(cmd)
1779             if exp and exp not in res:
1780                 raise Exception("Unexpected success for '%s' during OOM" % cmd)
1781
1782 def test_wpas_ctrl_socket_full(dev, apdev, test_params):
1783     """wpa_supplicant control socket and full send buffer"""
1784     if not dev[0].ping():
1785         raise Exception("Could not ping wpa_supplicant at the beginning of the test")
1786     dev[0].get_status()
1787
1788     counter = 0
1789
1790     s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
1791     local = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter)
1792     counter += 1
1793     s.bind(local)
1794     s.connect("/var/run/wpa_supplicant/wlan0")
1795     for i in range(20):
1796         logger.debug("Command %d" % i)
1797         try:
1798             s.send("MIB")
1799         except Exception, e:
1800             logger.info("Could not send command %d: %s" % (i, str(e)))
1801             break
1802         # Close without receiving response
1803         time.sleep(0.01)
1804
1805     if not dev[0].ping():
1806         raise Exception("Could not ping wpa_supplicant in the middle of the test")
1807     dev[0].get_status()
1808
1809     s2 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
1810     local2 = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter)
1811     counter += 1
1812     s2.bind(local2)
1813     s2.connect("/var/run/wpa_supplicant/wlan0")
1814     for i in range(10):
1815         logger.debug("Command %d [2]" % i)
1816         try:
1817             s2.send("MIB")
1818         except Exception, e:
1819             logger.info("Could not send command %d [2]: %s" % (i, str(e)))
1820             break
1821         # Close without receiving response
1822         time.sleep(0.01)
1823
1824     s.close()
1825     os.unlink(local)
1826
1827     for i in range(10):
1828         logger.debug("Command %d [3]" % i)
1829         try:
1830             s2.send("MIB")
1831         except Exception, e:
1832             logger.info("Could not send command %d [3]: %s" % (i, str(e)))
1833             break
1834         # Close without receiving response
1835         time.sleep(0.01)
1836
1837     s2.close()
1838     os.unlink(local2)
1839
1840     if not dev[0].ping():
1841         raise Exception("Could not ping wpa_supplicant in the middle of the test [2]")
1842     dev[0].get_status()
1843
1844     s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
1845     local = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter)
1846     counter += 1
1847     s.bind(local)
1848     s.connect("/var/run/wpa_supplicant/wlan0")
1849     s.send("ATTACH")
1850     res = s.recv(100)
1851     if "OK" not in res:
1852         raise Exception("Could not attach a test socket")
1853
1854     for i in range(5):
1855         dev[0].scan(freq=2412)
1856
1857     s.close()
1858     os.unlink(local)
1859
1860     for i in range(5):
1861         dev[0].scan(freq=2412)
1862
1863     if not dev[0].ping():
1864         raise Exception("Could not ping wpa_supplicant at the end of the test")
1865     dev[0].get_status()
1866
1867 def test_wpas_ctrl_event_burst(dev, apdev):
1868     """wpa_supplicant control socket and event burst"""
1869     if "OK" not in dev[0].request("EVENT_TEST 1000"):
1870         raise Exception("Could not request event messages")
1871
1872     total_i = 0
1873     total_g = 0
1874     for i in range(100):
1875         (i,g) = dev[0].dump_monitor()
1876         total_i += i
1877         total_g += g
1878         logger.info("Received i=%d g=%d" % (i, g))
1879         if total_i >= 1000 and total_g >= 1000:
1880             break
1881         time.sleep(0.05)
1882
1883     if total_i < 1000:
1884         raise Exception("Some per-interface events not seen: %d" % total_i)
1885     if total_g < 1000:
1886         raise Exception("Some global events not seen: %d" % total_g)
1887
1888     if not dev[0].ping():
1889         raise Exception("Could not ping wpa_supplicant at the end of the test")