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