tests: Clear config_methods at the end of wpas_ctrl_set_wps_params
[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
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     try:
682         _test_wpas_ctrl_set_wps_params(dev)
683     finally:
684         dev[2].request("SET config_methods ")
685
686 def _test_wpas_ctrl_set_wps_params(dev):
687     ts = [ "config_methods label virtual_display virtual_push_button keypad",
688            "device_type 1-0050F204-1",
689            "os_version 01020300",
690            "uuid 12345678-9abc-def0-1234-56789abcdef0" ]
691     for t in ts:
692         if "OK" not in dev[2].request("SET " + t):
693             raise Exception("SET failed for: " + t)
694
695     ts = [ "uuid 12345678+9abc-def0-1234-56789abcdef0",
696            "uuid 12345678-qabc-def0-1234-56789abcdef0",
697            "uuid 12345678-9abc+def0-1234-56789abcdef0",
698            "uuid 12345678-9abc-qef0-1234-56789abcdef0",
699            "uuid 12345678-9abc-def0+1234-56789abcdef0",
700            "uuid 12345678-9abc-def0-q234-56789abcdef0",
701            "uuid 12345678-9abc-def0-1234+56789abcdef0",
702            "uuid 12345678-9abc-def0-1234-q6789abcdef0",
703            "uuid qwerty" ]
704     for t in ts:
705         if "FAIL" not in dev[2].request("SET " + t):
706             raise Exception("SET succeeded for: " + t)
707
708 def test_wpas_ctrl_level(dev):
709     """wpa_supplicant ctrl_iface LEVEL"""
710     try:
711         if "FAIL" not in dev[2].request("LEVEL 3"):
712             raise Exception("Unexpected LEVEL success")
713         if "OK" not in dev[2].mon.request("LEVEL 2"):
714             raise Exception("Unexpected LEVEL failure")
715         dev[2].request("SCAN freq=2412")
716         ev = dev[2].wait_event(["State:"], timeout=5)
717         if ev is None:
718             raise Exception("No debug message received")
719         dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=5)
720     finally:
721         dev[2].mon.request("LEVEL 3")
722
723 def test_wpas_ctrl_bssid_filter(dev, apdev):
724     """wpa_supplicant bssid_filter"""
725     try:
726         if "OK" not in dev[2].request("SET bssid_filter " + apdev[0]['bssid']):
727             raise Exception("Failed to set bssid_filter")
728         params = { "ssid": "test" }
729         hostapd.add_ap(apdev[0]['ifname'], params)
730         hostapd.add_ap(apdev[1]['ifname'], params)
731         dev[2].scan_for_bss(apdev[0]['bssid'], freq="2412")
732         dev[2].scan(freq="2412")
733         bss = dev[2].get_bss(apdev[0]['bssid'])
734         if bss is None or len(bss) == 0:
735             raise Exception("Missing BSS data")
736         bss = dev[2].get_bss(apdev[1]['bssid'])
737         if bss and len(bss) != 0:
738             raise Exception("Unexpected BSS data")
739         dev[2].request("SET bssid_filter ")
740         dev[2].scan(freq="2412")
741         bss = dev[2].get_bss(apdev[0]['bssid'])
742         if bss is None or len(bss) == 0:
743             raise Exception("Missing BSS data")
744         bss = dev[2].get_bss(apdev[1]['bssid'])
745         if bss is None or len(bss) == 0:
746             raise Exception("Missing BSS data(2)")
747         res = dev[2].request("SCAN_RESULTS").splitlines()
748         if "test" not in res[1] or "test" not in res[2]:
749             raise Exception("SSID missing from SCAN_RESULTS")
750         if apdev[0]['bssid'] not in res[1] and apdev[1]['bssid'] not in res[1]:
751             raise Exception("BSS1 missing from SCAN_RESULTS")
752         if apdev[0]['bssid'] not in res[2] and apdev[1]['bssid'] not in res[2]:
753             raise Exception("BSS1 missing from SCAN_RESULTS")
754
755         if "FAIL" not in dev[2].request("SET bssid_filter 00:11:22:33:44:55 00:11:22:33:44"):
756             raise Exception("Unexpected success for invalid SET bssid_filter")
757     finally:
758         dev[2].request("SET bssid_filter ")
759
760 def test_wpas_ctrl_disallow_aps(dev, apdev):
761     """wpa_supplicant ctrl_iface disallow_aps"""
762     params = { "ssid": "test" }
763     hostapd.add_ap(apdev[0]['ifname'], params)
764
765     if "FAIL" not in dev[0].request("SET disallow_aps bssid "):
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"):
768         raise Exception("Unexpected success on invalid disallow_aps")
769     if "FAIL" not in dev[0].request("SET disallow_aps ssid 0"):
770         raise Exception("Unexpected success on invalid disallow_aps")
771     if "FAIL" not in dev[0].request("SET disallow_aps ssid 4q"):
772         raise Exception("Unexpected success on invalid disallow_aps")
773     if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 ssid 112233 ssid 123"):
774         raise Exception("Unexpected success on invalid disallow_aps")
775     if "FAIL" not in dev[0].request("SET disallow_aps ssid 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f00"):
776         raise Exception("Unexpected success on invalid disallow_aps")
777     if "FAIL" not in dev[0].request("SET disallow_aps foo 112233445566"):
778         raise Exception("Unexpected success on invalid disallow_aps")
779
780     dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
781     hostapd.add_ap(apdev[1]['ifname'], params)
782     dev[0].scan_for_bss(apdev[1]['bssid'], freq="2412")
783     dev[0].dump_monitor()
784     if "OK" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 bssid 00:22:33:44:55:66"):
785         raise Exception("Failed to set disallow_aps")
786     if "OK" not in dev[0].request("SET disallow_aps bssid " + apdev[0]['bssid']):
787         raise Exception("Failed to set disallow_aps")
788     ev = dev[0].wait_connected(timeout=30, error="Reassociation timed out")
789     if apdev[1]['bssid'] not in ev:
790         raise Exception("Unexpected BSSID")
791
792     dev[0].dump_monitor()
793     if "OK" not in dev[0].request("SET disallow_aps ssid " + "test".encode("hex")):
794         raise Exception("Failed to set disallow_aps")
795     dev[0].wait_disconnected(timeout=5, error="Disconnection not seen")
796     ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
797     if ev is not None:
798         raise Exception("Unexpected reassociation")
799
800     dev[0].request("DISCONNECT")
801     dev[0].p2p_start_go(freq=2412)
802     if "OK" not in dev[0].request("SET disallow_aps "):
803         raise Exception("Failed to set disallow_aps")
804
805 def test_wpas_ctrl_blob(dev):
806     """wpa_supplicant ctrl_iface SET blob"""
807     if "FAIL" not in dev[0].request("SET blob foo"):
808         raise Exception("Unexpected SET success")
809     if "FAIL" not in dev[0].request("SET blob foo 0"):
810         raise Exception("Unexpected SET success")
811     if "FAIL" not in dev[0].request("SET blob foo 0q"):
812         raise Exception("Unexpected SET success")
813     if "OK" not in dev[0].request("SET blob foo 00"):
814         raise Exception("Unexpected SET failure")
815     if "OK" not in dev[0].request("SET blob foo 0011"):
816         raise Exception("Unexpected SET failure")
817
818 def test_wpas_ctrl_set_uapsd(dev):
819     """wpa_supplicant ctrl_iface SET uapsd"""
820     if "FAIL" not in dev[0].request("SET uapsd foo"):
821         raise Exception("Unexpected SET success")
822     if "FAIL" not in dev[0].request("SET uapsd 0,0,0"):
823         raise Exception("Unexpected SET success")
824     if "FAIL" not in dev[0].request("SET uapsd 0,0"):
825         raise Exception("Unexpected SET success")
826     if "FAIL" not in dev[0].request("SET uapsd 0"):
827         raise Exception("Unexpected SET success")
828     if "OK" not in dev[0].request("SET uapsd 1,1,1,1;1"):
829         raise Exception("Unexpected SET failure")
830     if "OK" not in dev[0].request("SET uapsd 0,0,0,0;0"):
831         raise Exception("Unexpected SET failure")
832     if "OK" not in dev[0].request("SET uapsd disable"):
833         raise Exception("Unexpected SET failure")
834
835 def test_wpas_ctrl_set(dev):
836     """wpa_supplicant ctrl_iface SET"""
837     vals = [ "foo",
838              "ampdu 0",
839              "radio_disable 0",
840              "ps 10",
841              "ps 1",
842              "dot11RSNAConfigPMKLifetime 0",
843              "dot11RSNAConfigPMKReauthThreshold 101",
844              "dot11RSNAConfigSATimeout 0",
845              "wps_version_number -1",
846              "wps_version_number 256" ]
847     for val in vals:
848         if "FAIL" not in dev[0].request("SET " + val):
849             raise Exception("Unexpected SET success for " + val)
850
851     vals = [ "EAPOL::heldPeriod 60",
852              "EAPOL::authPeriod 30",
853              "EAPOL::startPeriod 30",
854              "EAPOL::maxStart 3",
855              "dot11RSNAConfigSATimeout 60",
856              "ps -1",
857              "ps 0",
858              "no_keep_alive 0",
859              "tdls_disabled 1",
860              "tdls_disabled 0" ]
861     for val in vals:
862         if "OK" not in dev[0].request("SET " + val):
863             raise Exception("Unexpected SET failure for " + val)
864
865 def test_wpas_ctrl_get_capability(dev):
866     """wpa_supplicant ctrl_iface GET_CAPABILITY"""
867     if "FAIL" not in dev[0].request("GET_CAPABILITY 1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"):
868         raise Exception("Unexpected success on invalid GET_CAPABILITY")
869     if "FAIL" not in dev[0].request("GET_CAPABILITY eap foo"):
870         raise Exception("Unexpected success on invalid GET_CAPABILITY")
871     if "AP" not in dev[0].request("GET_CAPABILITY modes strict"):
872         raise Exception("Unexpected GET_CAPABILITY response")
873     res = dev[0].get_capability("eap")
874     if "TTLS" not in res:
875         raise Exception("Unexpected GET_CAPABILITY eap response: " + str(res))
876
877     res = dev[0].get_capability("pairwise")
878     if "CCMP" not in res:
879         raise Exception("Unexpected GET_CAPABILITY pairwise response: " + str(res))
880
881     res = dev[0].get_capability("group")
882     if "CCMP" not in res:
883         raise Exception("Unexpected GET_CAPABILITY group response: " + str(res))
884
885     res = dev[0].get_capability("key_mgmt")
886     if "WPA-PSK" not in res or "WPA-EAP" not in res:
887         raise Exception("Unexpected GET_CAPABILITY key_mgmt response: " + str(res))
888
889     res = dev[0].get_capability("proto")
890     if "WPA" not in res or "RSN" not in res:
891         raise Exception("Unexpected GET_CAPABILITY proto response: " + str(res))
892
893     res = dev[0].get_capability("auth_alg")
894     if "OPEN" not in res or "SHARED" not in res:
895         raise Exception("Unexpected GET_CAPABILITY auth_alg response: " + str(res))
896
897     res = dev[0].get_capability("modes")
898     if "IBSS" not in res or "AP" not in res:
899         raise Exception("Unexpected GET_CAPABILITY modes response: " + str(res))
900
901     res = dev[0].get_capability("channels")
902     if "8" not in res or "36" not in res:
903         raise Exception("Unexpected GET_CAPABILITY channels response: " + str(res))
904
905     res = dev[0].get_capability("freq")
906     if "2457" not in res or "5180" not in res:
907         raise Exception("Unexpected GET_CAPABILITY freq response: " + str(res))
908
909     res = dev[0].get_capability("tdls")
910     if "EXTERNAL" not in res[0]:
911         raise Exception("Unexpected GET_CAPABILITY tdls response: " + str(res))
912
913     res = dev[0].get_capability("erp")
914     if res is None or "ERP" not in res[0]:
915         raise Exception("Unexpected GET_CAPABILITY erp response: " + str(res))
916
917     if dev[0].get_capability("foo") is not None:
918         raise Exception("Unexpected GET_CAPABILITY foo response: " + str(res))
919
920 def test_wpas_ctrl_nfc_report_handover(dev):
921     """wpa_supplicant ctrl_iface NFC_REPORT_HANDOVER"""
922     vals = [ "FOO",
923              "ROLE freq=12345",
924              "ROLE TYPE",
925              "ROLE TYPE REQ",
926              "ROLE TYPE REQ SEL",
927              "ROLE TYPE 0Q SEL",
928              "ROLE TYPE 00 SEL",
929              "ROLE TYPE 00 0Q",
930              "ROLE TYPE 00 00" ]
931     for v in vals:
932         if "FAIL" not in dev[0].request("NFC_REPORT_HANDOVER " + v):
933             raise Exception("Unexpected NFC_REPORT_HANDOVER success for " + v)
934
935 def test_wpas_ctrl_nfc_tag_read(dev):
936     """wpa_supplicant ctrl_iface WPS_NFC_TAG_READ"""
937     vals = [ "FOO", "0Q", "00", "000000", "10000001", "10000000", "00000000",
938              "100e0000", "100e0001ff", "100e000411110000", "100e0004100e0001" ]
939     for v in vals:
940         if "FAIL" not in dev[0].request("WPS_NFC_TAG_READ " + v):
941             raise Exception("Unexpected WPS_NFC_TAG_READ success for " + v)
942
943 def test_wpas_ctrl_nfc_get_handover(dev):
944     """wpa_supplicant ctrl_iface NFC_GET_HANDOVER"""
945     vals = [ "FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P" ]
946     for v in vals:
947         if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_REQ " + v):
948             raise Exception("Unexpected NFC_GET_HANDOVER_REQ success for " + v)
949
950     vals = [ "NDEF WPS", "NDEF P2P-CR", "WPS P2P-CR" ]
951     for v in vals:
952         if "FAIL" in dev[0].request("NFC_GET_HANDOVER_REQ " + v):
953             raise Exception("Unexpected NFC_GET_HANDOVER_REQ failure for " + v)
954
955     vals = [ "FOO", "FOO BAR", "WPS WPS", "WPS WPS-CR", "WPS FOO", "NDEF P2P",
956              "NDEF WPS", "NDEF WPS uuid" ]
957     for v in vals:
958         if "FAIL" not in dev[0].request("NFC_GET_HANDOVER_SEL " + v):
959             raise Exception("Unexpected NFC_GET_HANDOVER_SEL success for " + v)
960
961     vals = [ "NDEF P2P-CR", "WPS P2P-CR", "NDEF P2P-CR-TAG",
962              "WPS P2P-CR-TAG" ]
963     for v in vals:
964         if "FAIL" in dev[0].request("NFC_GET_HANDOVER_SEL " + v):
965             raise Exception("Unexpected NFC_GET_HANDOVER_SEL failure for " + v)
966
967 def get_blacklist(dev):
968     return dev.request("BLACKLIST").splitlines()
969
970 def test_wpas_ctrl_blacklist(dev):
971     """wpa_supplicant ctrl_iface BLACKLIST"""
972     if "OK" not in dev[0].request("BLACKLIST clear"):
973         raise Exception("BLACKLIST clear failed")
974     b = get_blacklist(dev[0])
975     if len(b) != 0:
976         raise Exception("Unexpected blacklist contents: " + str(b))
977     if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:55"):
978         raise Exception("BLACKLIST add failed")
979     b = get_blacklist(dev[0])
980     if "00:11:22:33:44:55" not in b:
981         raise Exception("Unexpected blacklist contents: " + str(b))
982     if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:56"):
983         raise Exception("BLACKLIST add failed")
984     b = get_blacklist(dev[0])
985     if "00:11:22:33:44:55" not in b or "00:11:22:33:44:56" not in b:
986         raise Exception("Unexpected blacklist contents: " + str(b))
987     if "OK" not in dev[0].request("BLACKLIST 00:11:22:33:44:56"):
988         raise Exception("BLACKLIST add failed")
989     b = get_blacklist(dev[0])
990     if "00:11:22:33:44:55" not in b or "00:11:22:33:44:56" not in b or len(b) != 2:
991         raise Exception("Unexpected blacklist contents: " + str(b))
992
993     if "OK" not in dev[0].request("BLACKLIST clear"):
994         raise Exception("BLACKLIST clear failed")
995     if dev[0].request("BLACKLIST") != "":
996         raise Exception("Unexpected blacklist contents")
997
998 def test_wpas_ctrl_blacklist_oom(dev):
999     """wpa_supplicant ctrl_iface BLACKLIST and out-of-memory"""
1000     with alloc_fail(dev[0], 1, "wpa_blacklist_add"):
1001         if "FAIL" not in dev[0].request("BLACKLIST aa:bb:cc:dd:ee:ff"):
1002             raise Exception("Unexpected success with allocation failure")
1003
1004 def test_wpas_ctrl_log_level(dev):
1005     """wpa_supplicant ctrl_iface LOG_LEVEL"""
1006     level = dev[2].request("LOG_LEVEL")
1007     if "Current level: MSGDUMP" not in level:
1008         raise Exception("Unexpected debug level(1): " + level)
1009     if "Timestamp: 1" not in level:
1010         raise Exception("Unexpected timestamp(1): " + level)
1011
1012     if "OK" not in dev[2].request("LOG_LEVEL  MSGDUMP  0"):
1013         raise Exception("LOG_LEVEL failed")
1014     level = dev[2].request("LOG_LEVEL")
1015     if "Current level: MSGDUMP" not in level:
1016         raise Exception("Unexpected debug level(2): " + level)
1017     if "Timestamp: 0" not in level:
1018         raise Exception("Unexpected timestamp(2): " + level)
1019
1020     if "OK" not in dev[2].request("LOG_LEVEL  MSGDUMP  1"):
1021         raise Exception("LOG_LEVEL failed")
1022     level = dev[2].request("LOG_LEVEL")
1023     if "Current level: MSGDUMP" not in level:
1024         raise Exception("Unexpected debug level(3): " + level)
1025     if "Timestamp: 1" not in level:
1026         raise Exception("Unexpected timestamp(3): " + level)
1027
1028     if "FAIL" not in dev[2].request("LOG_LEVEL FOO"):
1029         raise Exception("Invalid LOG_LEVEL accepted")
1030
1031     for lev in [ "EXCESSIVE", "MSGDUMP", "DEBUG", "INFO", "WARNING", "ERROR" ]:
1032         if "OK" not in dev[2].request("LOG_LEVEL " + lev):
1033             raise Exception("LOG_LEVEL failed for " + lev)
1034         level = dev[2].request("LOG_LEVEL")
1035         if "Current level: " + lev not in level:
1036             raise Exception("Unexpected debug level: " + level)
1037
1038     if "OK" not in dev[2].request("LOG_LEVEL  MSGDUMP  1"):
1039         raise Exception("LOG_LEVEL failed")
1040     level = dev[2].request("LOG_LEVEL")
1041     if "Current level: MSGDUMP" not in level:
1042         raise Exception("Unexpected debug level(3): " + level)
1043     if "Timestamp: 1" not in level:
1044         raise Exception("Unexpected timestamp(3): " + level)
1045
1046 def test_wpas_ctrl_enable_disable_network(dev, apdev):
1047     """wpa_supplicant ctrl_iface ENABLE/DISABLE_NETWORK"""
1048     params = { "ssid": "test" }
1049     hostapd.add_ap(apdev[0]['ifname'], params)
1050
1051     id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412",
1052                         only_add_network=True)
1053     if "OK" not in dev[0].request("DISABLE_NETWORK " + str(id)):
1054         raise Exception("Failed to disable network")
1055     if "OK" not in dev[0].request("ENABLE_NETWORK " + str(id) + " no-connect"):
1056         raise Exception("Failed to enable network")
1057     if "OK" not in dev[0].request("DISABLE_NETWORK all"):
1058         raise Exception("Failed to disable networks")
1059     if "OK" not in dev[0].request("ENABLE_NETWORK " + str(id)):
1060         raise Exception("Failed to enable network")
1061     dev[0].wait_connected(timeout=10)
1062     if "OK" not in dev[0].request("DISABLE_NETWORK " + str(id)):
1063         raise Exception("Failed to disable network")
1064     dev[0].wait_disconnected(timeout=10)
1065     time.sleep(0.1)
1066
1067     if "OK" not in dev[0].request("ENABLE_NETWORK all"):
1068         raise Exception("Failed to enable network")
1069     dev[0].wait_connected(timeout=10)
1070     if "OK" not in dev[0].request("DISABLE_NETWORK all"):
1071         raise Exception("Failed to disable network")
1072     dev[0].wait_disconnected(timeout=10)
1073
1074 def test_wpas_ctrl_country(dev, apdev):
1075     """wpa_supplicant SET/GET country code"""
1076     try:
1077         # work around issues with possible pending regdom event from the end of
1078         # the previous test case
1079         time.sleep(0.2)
1080         dev[0].dump_monitor()
1081
1082         if "OK" not in dev[0].request("SET country FI"):
1083             raise Exception("Failed to set country code")
1084         if dev[0].request("GET country") != "FI":
1085             raise Exception("Country code set failed")
1086         ev = dev[0].wait_global_event(["CTRL-EVENT-REGDOM-CHANGE"], 10)
1087         if ev is None:
1088             raise Exception("regdom change event not seen")
1089         if "init=USER type=COUNTRY alpha2=FI" not in ev:
1090             raise Exception("Unexpected event contents: " + ev)
1091         dev[0].request("SET country 00")
1092         if dev[0].request("GET country") != "00":
1093             raise Exception("Country code set failed")
1094         ev = dev[0].wait_global_event(["CTRL-EVENT-REGDOM-CHANGE"], 10)
1095         if ev is None:
1096             raise Exception("regdom change event not seen")
1097         if "init=CORE type=WORLD" not in ev:
1098             raise Exception("Unexpected event contents: " + ev)
1099     finally:
1100         subprocess.call(['iw', 'reg', 'set', '00'])
1101
1102 def test_wpas_ctrl_suspend_resume(dev):
1103     """wpa_supplicant SUSPEND/RESUME"""
1104     wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1105     wpas.interface_add("wlan5")
1106     if "OK" not in wpas.global_request("SUSPEND"):
1107         raise Exception("SUSPEND failed")
1108     time.sleep(1)
1109     if "OK" not in wpas.global_request("RESUME"):
1110         raise Exception("RESUME failed")
1111     if "OK" not in wpas.request("SUSPEND"):
1112         raise Exception("Per-interface SUSPEND failed")
1113     if "OK" not in wpas.request("RESUME"):
1114         raise Exception("Per-interface RESUME failed")
1115     ev = wpas.wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=10)
1116     if ev is None:
1117         raise Exception("Scan not completed")
1118
1119 def test_wpas_ctrl_global(dev):
1120     """wpa_supplicant global control interface"""
1121     wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1122     wpas.interface_add("wlan5")
1123
1124     if "PONG" not in wpas.global_request("PING"):
1125         raise Exception("PING failed")
1126     if "wlan5" not in wpas.global_request("INTERFACES"):
1127         raise Exception("Interface not found")
1128     if "UNKNOWN COMMAND" not in wpas.global_request("FOO"):
1129         raise Exception("Unexpected response to unknown command")
1130     if "PONG" not in wpas.global_request("IFNAME=wlan5 PING"):
1131         raise Exception("Per-interface PING failed")
1132     if "FAIL-NO-IFNAME-MATCH" not in wpas.global_request("IFNAME=notfound PING"):
1133         raise Exception("Unknown interface not reported correctly")
1134     if "FAIL" not in wpas.global_request("SAVE_CONFIG"):
1135         raise Exception("SAVE_CONFIG succeeded unexpectedly")
1136     if "OK" not in wpas.global_request("SET wifi_display 0"):
1137         raise Exception("SET failed")
1138     if "wifi_display=0" not in wpas.global_request("STATUS"):
1139         raise Exception("wifi_display not disabled")
1140     if "OK" not in wpas.global_request("SET wifi_display 1"):
1141         raise Exception("SET failed")
1142     if "wifi_display=1" not in wpas.global_request("STATUS"):
1143         raise Exception("wifi_display not enabled")
1144     if "FAIL" not in wpas.global_request("SET foo 1"):
1145         raise Exception("SET succeeded unexpectedly")
1146
1147     if "p2p_state=IDLE" not in wpas.global_request("STATUS"):
1148         raise Exception("P2P was disabled")
1149     wpas.global_request("P2P_SET disabled 1")
1150     if "p2p_state=DISABLED" not in wpas.global_request("STATUS"):
1151         raise Exception("P2P was not disabled")
1152     wpas.global_request("P2P_SET disabled 0")
1153     if "p2p_state=IDLE" not in wpas.global_request("STATUS"):
1154         raise Exception("P2P was not enabled")
1155
1156     # driver_nl80211.c does not support interface list, so do not fail because
1157     # of that
1158     logger.debug(wpas.global_request("INTERFACE_LIST"))
1159
1160     if "FAIL" not in wpas.global_request("INTERFACE_ADD "):
1161         raise Exception("INTERFACE_ADD succeeded unexpectedly")
1162     if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO"):
1163         raise Exception("INTERFACE_ADD succeeded unexpectedly")
1164     if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO     conf"):
1165         raise Exception("INTERFACE_ADD succeeded unexpectedly")
1166     if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO     conf    driver"):
1167         raise Exception("INTERFACE_ADD succeeded unexpectedly")
1168     if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO     conf    driver  ctrliface"):
1169         raise Exception("INTERFACE_ADD succeeded unexpectedly")
1170     if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO     conf    driver  ctrliface       driverparam"):
1171         raise Exception("INTERFACE_ADD succeeded unexpectedly")
1172     if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO     conf    driver  ctrliface       driverparam     bridge"):
1173         raise Exception("INTERFACE_ADD succeeded unexpectedly")
1174     if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO     conf    driver  ctrliface       driverparam     bridge  foo"):
1175         raise Exception("INTERFACE_ADD succeeded unexpectedly")
1176     if "FAIL" not in wpas.global_request("INTERFACE_ADD FOO                                     "):
1177         raise Exception("INTERFACE_ADD succeeded unexpectedly")
1178
1179 def test_wpas_ctrl_roam(dev, apdev):
1180     """wpa_supplicant ctrl_iface ROAM error cases"""
1181     if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44"):
1182         raise Exception("Unexpected success")
1183     if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"):
1184         raise Exception("Unexpected success")
1185     params = { "ssid": "test" }
1186     hostapd.add_ap(apdev[0]['ifname'], params)
1187     id = dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
1188     if "FAIL" not in dev[0].request("ROAM 00:11:22:33:44:55"):
1189         raise Exception("Unexpected success")
1190
1191 def test_wpas_ctrl_ipaddr(dev, apdev):
1192     """wpa_supplicant IP address in STATUS"""
1193     try:
1194         subprocess.call(['ip', 'addr', 'add', '10.174.65.207/32', 'dev',
1195                          dev[0].ifname])
1196         ipaddr = dev[0].get_status_field('ip_address')
1197         if ipaddr != '10.174.65.207':
1198             raise Exception("IP address not in STATUS output")
1199     finally:
1200         subprocess.call(['ip', 'addr', 'del', '10.174.65.207/32', 'dev',
1201                          dev[0].ifname])
1202
1203 def test_wpas_ctrl_neighbor_rep_req(dev, apdev):
1204     """wpa_supplicant ctrl_iface NEIGHBOR_REP_REQUEST"""
1205     params = { "ssid": "test" }
1206     hostapd.add_ap(apdev[0]['ifname'], params)
1207     params = { "ssid": "test2", "radio_measurements": "1" }
1208     hostapd.add_ap(apdev[1]['ifname'], params)
1209
1210     dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
1211     if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
1212         raise Exception("Request succeeded unexpectedly")
1213     if "FAIL" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=abcdef"):
1214         raise Exception("Request succeeded unexpectedly")
1215     dev[0].request("DISCONNECT")
1216
1217     rrm = int(dev[0].get_driver_status_field("capa.rrm_flags"), 16)
1218     if rrm & 0x5 != 0x5:
1219         logger.info("Driver does not support required RRM capabilities - skip rest of the test case")
1220         return
1221
1222     dev[0].connect("test2", key_mgmt="NONE", scan_freq="2412")
1223
1224     # These requests are expected to get sent properly, but since hostapd does
1225     # not yet support processing of the request, these are expected to fail.
1226     
1227     if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST"):
1228         raise Exception("Request failed")
1229     ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
1230                              "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
1231     if ev is None:
1232         raise Exception("RRM report result not indicated")
1233     logger.info("RRM result: " + ev)
1234
1235     if "OK" not in dev[0].request("NEIGHBOR_REP_REQUEST ssid=abcdef"):
1236         raise Exception("Request failed")
1237     ev = dev[0].wait_event([ "RRM-NEIGHBOR-REP-RECEIVED",
1238                              "RRM-NEIGHBOR-REP-REQUEST-FAILED" ], timeout=10)
1239     if ev is None:
1240         raise Exception("RRM report result not indicated")
1241     logger.info("RRM result: " + ev)
1242
1243 def test_wpas_ctrl_rsp(dev, apdev):
1244     """wpa_supplicant ctrl_iface CTRL-RSP-"""
1245     if "FAIL" not in dev[0].request("CTRL-RSP-"):
1246         raise Exception("Request succeeded unexpectedly")
1247     if "FAIL" not in dev[0].request("CTRL-RSP-foo-"):
1248         raise Exception("Request succeeded unexpectedly")
1249     if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567"):
1250         raise Exception("Request succeeded unexpectedly")
1251     if "FAIL" not in dev[0].request("CTRL-RSP-foo-1234567:"):
1252         raise Exception("Request succeeded unexpectedly")
1253     id = dev[0].add_network()
1254     if "FAIL" not in dev[0].request("CTRL-RSP-foo-%d:" % id):
1255         raise Exception("Request succeeded unexpectedly")
1256     for req in [ "IDENTITY", "PASSWORD", "NEW_PASSWORD", "PIN", "OTP",
1257                  "PASSPHRASE", "SIM" ]:
1258         if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)):
1259             raise Exception("Request failed unexpectedly")
1260         if "OK" not in dev[0].request("CTRL-RSP-%s-%d:" % (req, id)):
1261             raise Exception("Request failed unexpectedly")
1262
1263 def test_wpas_ctrl_vendor(dev, apdev):
1264     """wpa_supplicant ctrl_iface VENDOR"""
1265     cmds = [ "foo",
1266              "1",
1267              "1 foo",
1268              "1 2foo",
1269              "1 2 qq" ]
1270     for cmd in cmds:
1271         if "FAIL" not in dev[0].request("VENDOR " + cmd):
1272             raise Exception("Invalid VENDOR command accepted: " + cmd)
1273
1274 def test_wpas_ctrl_mgmt_tx(dev, apdev):
1275     """wpa_supplicant ctrl_iface MGMT_TX"""
1276     cmds = [ "foo",
1277              "00:11:22:33:44:55 foo",
1278              "00:11:22:33:44:55 11:22:33:44:55:66",
1279              "00:11:22:33:44:55 11:22:33:44:55:66 freq=0 no_cck=0 wait_time=0 action=123",
1280              "00:11:22:33:44:55 11:22:33:44:55:66 action=12qq" ]
1281     for cmd in cmds:
1282         if "FAIL" not in dev[0].request("MGMT_TX " + cmd):
1283             raise Exception("Invalid MGMT_TX command accepted: " + cmd)
1284
1285     if "OK" not in dev[0].request("MGMT_TX_DONE"):
1286         raise Exception("MGMT_TX_DONE failed")
1287
1288 def test_wpas_ctrl_driver_event(dev, apdev):
1289     """wpa_supplicant ctrl_iface DRIVER_EVENT"""
1290     if "FAIL" not in dev[0].request("DRIVER_EVENT foo"):
1291         raise Exception("Invalid DRIVER_EVENT accepted")
1292
1293 def test_wpas_ctrl_eapol_rx(dev, apdev):
1294     """wpa_supplicant ctrl_iface EAPOL_RX"""
1295     cmds = [ "foo",
1296              "00:11:22:33:44:55 123",
1297              "00:11:22:33:44:55 12qq" ]
1298     for cmd in cmds:
1299         if "FAIL" not in dev[0].request("EAPOL_RX " + cmd):
1300             raise Exception("Invalid EAPOL_RX command accepted: " + cmd)
1301
1302 def test_wpas_ctrl_data_test(dev, apdev):
1303     """wpa_supplicant ctrl_iface DATA_TEST"""
1304     dev[0].request("DATA_TEST_CONFIG 0")
1305     if "FAIL" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"):
1306         raise Exception("DATA_TEST_TX accepted when not in test mode")
1307
1308     try:
1309         if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"):
1310             raise Exception("DATA_TEST_CONFIG failed")
1311         if "OK" not in dev[0].request("DATA_TEST_CONFIG 1"):
1312             raise Exception("DATA_TEST_CONFIG failed")
1313         cmds = [ "foo",
1314                  "00:11:22:33:44:55 foo",
1315                  "00:11:22:33:44:55 00:11:22:33:44:55 -1",
1316                  "00:11:22:33:44:55 00:11:22:33:44:55 256" ]
1317         for cmd in cmds:
1318             if "FAIL" not in dev[0].request("DATA_TEST_TX " + cmd):
1319                 raise Exception("Invalid DATA_TEST_TX command accepted: " + cmd)
1320         if "OK" not in dev[0].request("DATA_TEST_TX 00:11:22:33:44:55 00:11:22:33:44:55 0"):
1321             raise Exception("DATA_TEST_TX failed")
1322     finally:
1323         dev[0].request("DATA_TEST_CONFIG 0")
1324
1325     cmds = [ "",
1326              "00",
1327              "00112233445566778899aabbccdde",
1328              "00112233445566778899aabbccdq" ]
1329     for cmd in cmds:
1330         if "FAIL" not in dev[0].request("DATA_TEST_FRAME " + cmd):
1331             raise Exception("Invalid DATA_TEST_FRAME command accepted: " + cmd)
1332
1333     if "OK" not in dev[0].request("DATA_TEST_FRAME 00112233445566778899aabbccddee"):
1334         raise Exception("DATA_TEST_FRAME failed")
1335
1336 def test_wpas_ctrl_vendor_elem(dev, apdev):
1337     """wpa_supplicant ctrl_iface VENDOR_ELEM"""
1338     if "OK" not in dev[0].request("VENDOR_ELEM_ADD 1 "):
1339         raise Exception("VENDOR_ELEM_ADD failed")
1340     cmds = [ "-1 ",
1341              "255 ",
1342              "1",
1343              "1 123",
1344              "1 12qq34" ]
1345     for cmd in cmds:
1346         if "FAIL" not in dev[0].request("VENDOR_ELEM_ADD " + cmd):
1347             raise Exception("Invalid VENDOR_ELEM_ADD command accepted: " + cmd)
1348
1349     cmds = [ "-1 ",
1350              "255 " ]
1351     for cmd in cmds:
1352         if "FAIL" not in dev[0].request("VENDOR_ELEM_GET " + cmd):
1353             raise Exception("Invalid VENDOR_ELEM_GET command accepted: " + cmd)
1354
1355     dev[0].request("VENDOR_ELEM_REMOVE 1 *")
1356     cmds = [ "-1 ",
1357              "255 ",
1358              "1",
1359              "1",
1360              "1 123",
1361              "1 12qq34",
1362              "1 12",
1363              "1 0000" ]
1364     for cmd in cmds:
1365         if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1366             raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1367
1368     dev[0].request("VENDOR_ELEM_ADD 1 000100")
1369     if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 "):
1370         raise Exception("VENDOR_ELEM_REMOVE failed")
1371     cmds = [ "-1 ",
1372              "255 ",
1373              "1",
1374              "1 123",
1375              "1 12qq34",
1376              "1 12",
1377              "1 0000" ]
1378     for cmd in cmds:
1379         if "FAIL" not in dev[0].request("VENDOR_ELEM_REMOVE " + cmd):
1380             raise Exception("Invalid VENDOR_ELEM_REMOVE command accepted: " + cmd)
1381     if "OK" not in dev[0].request("VENDOR_ELEM_REMOVE 1 000100"):
1382         raise Exception("VENDOR_ELEM_REMOVE failed")
1383
1384 def test_wpas_ctrl_misc(dev, apdev):
1385     """wpa_supplicant ctrl_iface and miscellaneous commands"""
1386     if "OK" not in dev[0].request("RELOG"):
1387         raise Exception("RELOG failed")
1388     if dev[0].request("IFNAME") != dev[0].ifname:
1389         raise Exception("IFNAME returned unexpected response")
1390     if "FAIL" not in dev[0].request("REATTACH"):
1391         raise Exception("REATTACH accepted while disabled")
1392     if "OK" not in dev[2].request("RECONFIGURE"):
1393         raise Exception("RECONFIGURE failed")
1394     if "FAIL" in dev[0].request("INTERFACE_LIST"):
1395         raise Exception("INTERFACE_LIST failed")
1396     if "UNKNOWN COMMAND" not in dev[0].request("FOO"):
1397         raise Exception("Unknown command accepted")
1398
1399     if "FAIL" not in dev[0].global_request("INTERFACE_REMOVE foo"):
1400         raise Exception("Invalid INTERFACE_REMOVE accepted")
1401     if "FAIL" not in dev[0].global_request("SET foo"):
1402         raise Exception("Invalid global SET accepted")
1403
1404 def test_wpas_ctrl_dump(dev, apdev):
1405     """wpa_supplicant ctrl_iface and DUMP/GET global parameters"""
1406     vals = dev[0].get_config()
1407     logger.info("Config values from DUMP: " + str(vals))
1408     for field in vals:
1409         res = dev[0].request("GET " + field)
1410         if res == 'FAIL\n':
1411             res = "null"
1412         if res != vals[field]:
1413             print "'{}' != '{}'".format(res, vals[field])
1414             raise Exception("Mismatch in config field " + field)
1415     if "beacon_int" not in vals:
1416         raise Exception("Missing config field")
1417
1418 def test_wpas_ctrl_interface_add(dev, apdev):
1419     """wpa_supplicant INTERFACE_ADD/REMOVE with vif creation/removal"""
1420     hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
1421     dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
1422     hwsim_utils.test_connectivity(dev[0], hapd)
1423
1424     ifname = "test-" + dev[0].ifname
1425     dev[0].interface_add(ifname, create=True)
1426     wpas = WpaSupplicant(ifname=ifname)
1427     wpas.connect("open", key_mgmt="NONE", scan_freq="2412")
1428     hwsim_utils.test_connectivity(wpas, hapd)
1429     hwsim_utils.test_connectivity(dev[0], hapd)
1430     dev[0].global_request("INTERFACE_REMOVE " + ifname)
1431     hwsim_utils.test_connectivity(dev[0], hapd)
1432
1433 def test_wpas_ctrl_interface_add_many(dev, apdev):
1434     """wpa_supplicant INTERFACE_ADD/REMOVE with vif creation/removal (many)"""
1435     try:
1436         _test_wpas_ctrl_interface_add_many(dev, apdev)
1437     finally:
1438         for i in range(10):
1439             ifname = "test%d-" % i + dev[0].ifname
1440             dev[0].global_request("INTERFACE_REMOVE " + ifname)
1441
1442 def _test_wpas_ctrl_interface_add_many(dev, apdev):
1443     hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
1444     dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
1445     hwsim_utils.test_connectivity(dev[0], hapd)
1446     dev[0].dump_monitor()
1447
1448     l = []
1449     for i in range(10):
1450         ifname = "test%d-" % i + dev[0].ifname
1451         dev[0].interface_add(ifname, create=True)
1452         wpas = WpaSupplicant(ifname=ifname)
1453         wpas.connect("open", key_mgmt="NONE", scan_freq="2412")
1454         wpas.dump_monitor()
1455         l.append(wpas)
1456         dev[0].dump_monitor()
1457     for wpas in l:
1458         wpas.dump_monitor()
1459         hwsim_utils.test_connectivity(wpas, hapd)
1460         wpas.dump_monitor()
1461     dev[0].dump_monitor()
1462
1463 def test_wpas_ctrl_interface_add2(dev, apdev):
1464     """wpa_supplicant INTERFACE_ADD/REMOVE with vif without creation/removal"""
1465     ifname = "test-ext-" + dev[0].ifname
1466     try:
1467         _test_wpas_ctrl_interface_add2(dev, apdev, ifname)
1468     finally:
1469         subprocess.call(['iw', 'dev', ifname, 'del'])
1470
1471 def _test_wpas_ctrl_interface_add2(dev, apdev, ifname):
1472     hapd = hostapd.add_ap(apdev[0]['ifname'], { "ssid": "open" })
1473     dev[0].connect("open", key_mgmt="NONE", scan_freq="2412")
1474     hwsim_utils.test_connectivity(dev[0], hapd)
1475
1476     subprocess.call(['iw', 'dev', dev[0].ifname, 'interface', 'add', ifname,
1477                      'type', 'station'])
1478     subprocess.call(['ip', 'link', 'set', 'dev', ifname, 'address',
1479                      '02:01:00:00:02:01'])
1480     dev[0].interface_add(ifname, set_ifname=False, all_params=True)
1481     wpas = WpaSupplicant(ifname=ifname)
1482     wpas.connect("open", key_mgmt="NONE", scan_freq="2412")
1483     hwsim_utils.test_connectivity(wpas, hapd)
1484     hwsim_utils.test_connectivity(dev[0], hapd)
1485     del wpas
1486     dev[0].global_request("INTERFACE_REMOVE " + ifname)
1487     hwsim_utils.test_connectivity(dev[0], hapd)
1488
1489 def test_wpas_ctrl_wait(dev, apdev, test_params):
1490     """wpa_supplicant control interface wait for client"""
1491     logfile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.log-wpas')
1492     pidfile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.pid-wpas')
1493     conffile = os.path.join(test_params['logdir'], 'wpas_ctrl_wait.conf')
1494     with open(conffile, 'w') as f:
1495         f.write("ctrl_interface=DIR=/var/run/wpa_supplicant\n")
1496
1497     prg = os.path.join(test_params['logdir'],
1498                        'alt-wpa_supplicant/wpa_supplicant/wpa_supplicant')
1499     if not os.path.exists(prg):
1500         prg = '../../wpa_supplicant/wpa_supplicant'
1501     arg = [ prg ]
1502     cmd = subprocess.Popen(arg, stdout=subprocess.PIPE)
1503     out = cmd.communicate()[0]
1504     cmd.wait()
1505     tracing = "Linux tracing" in out
1506
1507     with HWSimRadio() as (radio, iface):
1508         arg = [ prg, '-BdddW', '-P', pidfile, '-f', logfile,
1509                 '-Dnl80211', '-c', conffile, '-i', iface ]
1510         if tracing:
1511             arg += [ '-T' ]
1512         logger.info("Start wpa_supplicant: " + str(arg))
1513         subprocess.call(arg)
1514         wpas = WpaSupplicant(ifname=iface)
1515         if "PONG" not in wpas.request("PING"):
1516             raise Exception("Could not PING wpa_supplicant")
1517         if not os.path.exists(pidfile):
1518             raise Exception("PID file not created")
1519         if "OK" not in wpas.request("TERMINATE"):
1520             raise Exception("Could not TERMINATE")
1521         ev = wpas.wait_event([ "CTRL-EVENT-TERMINATING" ], timeout=2)
1522         if ev is None:
1523             raise Exception("No termination event received")
1524         for i in range(20):
1525             if not os.path.exists(pidfile):
1526                 break
1527             time.sleep(0.1)
1528         if os.path.exists(pidfile):
1529             raise Exception("PID file not removed")
1530
1531 def test_wpas_ctrl_oom(dev):
1532     """Various wpa_supplicant ctrl_iface OOM cases"""
1533     try:
1534         _test_wpas_ctrl_oom(dev)
1535     finally:
1536         dev[0].request("VENDOR_ELEM_REMOVE 1 *")
1537         dev[0].request("VENDOR_ELEM_REMOVE 2 *")
1538         dev[0].request("SET bssid_filter ")
1539
1540 def _test_wpas_ctrl_oom(dev):
1541     dev[0].request('VENDOR_ELEM_ADD 2 000100')
1542     tests = [ ('DRIVER_EVENT AVOID_FREQUENCIES 2412', 'FAIL',
1543                1, 'freq_range_list_parse'),
1544               ('P2P_SET disallow_freq 2412', 'FAIL',
1545                1, 'freq_range_list_parse'),
1546               ('SCAN freq=2412', 'FAIL',
1547                1, 'freq_range_list_parse'),
1548               ('INTERWORKING_SELECT freq=2412', 'FAIL',
1549                1, 'freq_range_list_parse'),
1550               ('SCAN ssid 112233', 'FAIL',
1551                1, 'wpas_ctrl_scan'),
1552               ('MGMT_TX 00:00:00:00:00:00 00:00:00:00:00:00 action=00', 'FAIL',
1553                1, 'wpas_ctrl_iface_mgmt_tx'),
1554               ('EAPOL_RX 00:00:00:00:00:00 00', 'FAIL',
1555                1, 'wpas_ctrl_iface_eapol_rx'),
1556               ('DATA_TEST_FRAME 00112233445566778899aabbccddee', 'FAIL',
1557                1, 'wpas_ctrl_iface_data_test_frame'),
1558               ('DATA_TEST_FRAME 00112233445566778899aabbccddee', 'FAIL',
1559                1, 'l2_packet_init;wpas_ctrl_iface_data_test_frame'),
1560               ('VENDOR_ELEM_ADD 1 000100', 'FAIL',
1561                1, 'wpas_ctrl_vendor_elem_add'),
1562               ('VENDOR_ELEM_ADD 2 000100', 'FAIL',
1563                2, 'wpas_ctrl_vendor_elem_add'),
1564               ('VENDOR_ELEM_REMOVE 2 000100', 'FAIL',
1565                1, 'wpas_ctrl_vendor_elem_remove'),
1566               ('SET bssid_filter 00:11:22:33:44:55', 'FAIL',
1567                1, 'set_bssid_filter'),
1568               ('SET disallow_aps bssid 00:11:22:33:44:55', 'FAIL',
1569                1, 'set_disallow_aps'),
1570               ('SET disallow_aps ssid 11', 'FAIL',
1571                1, 'set_disallow_aps'),
1572               ('SET blob foo 0011', 'FAIL',
1573                1, 'wpas_ctrl_set_blob'),
1574               ('SET blob foo 0011', 'FAIL',
1575                2, 'wpas_ctrl_set_blob'),
1576               ('SET blob foo 0011', 'FAIL',
1577                3, 'wpas_ctrl_set_blob'),
1578               ('WPS_NFC_TAG_READ 00', 'FAIL',
1579                1, 'wpa_supplicant_ctrl_iface_wps_nfc_tag_read'),
1580               ('WPS_NFC_TOKEN NDEF', 'FAIL',
1581                1, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1582               ('WPS_NFC_TOKEN NDEF', 'FAIL',
1583                2, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1584               ('WPS_NFC_TOKEN NDEF', 'FAIL',
1585                3, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1586               ('WPS_NFC_TOKEN NDEF', 'FAIL',
1587                4, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1588               ('WPS_NFC_TOKEN NDEF', 'FAIL',
1589                5, 'wpa_supplicant_ctrl_iface_wps_nfc_token'),
1590               ('NFC_REPORT_HANDOVER ROLE TYPE 00 00', 'FAIL',
1591                1, 'wpas_ctrl_nfc_report_handover'),
1592               ('NFC_REPORT_HANDOVER ROLE TYPE 00 00', 'FAIL',
1593                2, 'wpas_ctrl_nfc_report_handover'),
1594               ('NFC_GET_HANDOVER_REQ NDEF WPS-CR', 'FAIL',
1595                1, 'wps_build_nfc_handover_req'),
1596               ('NFC_GET_HANDOVER_REQ NDEF WPS-CR', 'FAIL',
1597                1, 'ndef_build_record'),
1598               ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', None,
1599                1, 'wpas_p2p_nfc_handover'),
1600               ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', 'FAIL',
1601                2, 'wpas_p2p_nfc_handover'),
1602               ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', None,
1603                1, 'wps_build_nfc_handover_req_p2p'),
1604               ('NFC_GET_HANDOVER_REQ NDEF P2P-CR', 'FAIL',
1605                1, 'ndef_build_record'),
1606               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', None,
1607                1, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1608               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', None,
1609                1, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1610               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL',
1611                2, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1612               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', 'FAIL',
1613                2, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1614               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL',
1615                3, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1616               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', 'FAIL',
1617                3, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1618               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR-TAG', 'FAIL',
1619                4, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1620               ('NFC_GET_HANDOVER_SEL NDEF P2P-CR', 'FAIL',
1621                4, 'wpas_ctrl_nfc_get_handover_sel_p2p'),
1622               ('P2P_ASP_PROVISION_RESP 00:11:22:33:44:55 id=1', 'FAIL',
1623                1, 'p2p_parse_asp_provision_cmd'),
1624               ('P2P_SERV_DISC_REQ 00:11:22:33:44:55 02000001', 'FAIL',
1625                1, 'p2p_ctrl_serv_disc_req'),
1626               ('P2P_SERV_DISC_RESP 2412 00:11:22:33:44:55 1 00', 'FAIL',
1627                1, 'p2p_ctrl_serv_disc_resp'),
1628               ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027',
1629                'FAIL',
1630                1, 'p2p_ctrl_service_add_bonjour'),
1631               ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027',
1632                'FAIL',
1633                2, 'p2p_ctrl_service_add_bonjour'),
1634               ('P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027',
1635                'FAIL',
1636                3, 'p2p_ctrl_service_add_bonjour'),
1637               ('P2P_SERVICE_DEL bonjour 0b5f6166706f766572746370c00c000c01',
1638                'FAIL',
1639                1, 'p2p_ctrl_service_del_bonjour'),
1640               ('GAS_REQUEST 00:11:22:33:44:55 00', 'FAIL',
1641                1, 'gas_request'),
1642               ('GAS_REQUEST 00:11:22:33:44:55 00 11', 'FAIL',
1643                2, 'gas_request'),
1644               ('HS20_GET_NAI_HOME_REALM_LIST 00:11:22:33:44:55 realm=example.com',
1645               'FAIL',
1646               1, 'hs20_nai_home_realm_list'),
1647               ('HS20_GET_NAI_HOME_REALM_LIST 00:11:22:33:44:55 00',
1648               'FAIL',
1649               1, 'hs20_get_nai_home_realm_list'),
1650               ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1651                1, 'wpas_ctrl_iface_wnm_sleep'),
1652               ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1653                2, 'wpas_ctrl_iface_wnm_sleep'),
1654               ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1655                3, 'wpas_ctrl_iface_wnm_sleep'),
1656               ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1657                4, 'wpas_ctrl_iface_wnm_sleep'),
1658               ('WNM_SLEEP enter tfs_req=11', 'FAIL',
1659                5, 'wpas_ctrl_iface_wnm_sleep'),
1660               ('WNM_SLEEP enter', 'FAIL',
1661                3, 'wpas_ctrl_iface_wnm_sleep'),
1662               ('VENDOR 1 1 00', 'FAIL',
1663                1, 'wpa_supplicant_vendor_cmd'),
1664               ('VENDOR 1 1 00', 'FAIL',
1665                2, 'wpa_supplicant_vendor_cmd'),
1666               ('RADIO_WORK add test', 'FAIL',
1667                1, 'wpas_ctrl_radio_work_add'),
1668               ('RADIO_WORK add test', 'FAIL',
1669                2, 'wpas_ctrl_radio_work_add'),
1670               ('AUTOSCAN periodic:1', 'FAIL',
1671                1, 'wpa_supplicant_ctrl_iface_autoscan'),
1672               ('PING', None,
1673                1, 'wpa_supplicant_ctrl_iface_process') ]
1674     for cmd,exp,count,func in tests:
1675         with alloc_fail(dev[0], count, func):
1676             res = dev[0].request(cmd)
1677             if exp and exp not in res:
1678                 raise Exception("Unexpected success for '%s' during OOM" % cmd)
1679
1680     tests = [ ('FOO', None,
1681                1, 'wpa_supplicant_global_ctrl_iface_process'),
1682               ('IFNAME=notfound PING', 'FAIL\n',
1683                1, 'wpas_global_ctrl_iface_ifname') ]
1684     for cmd,exp,count,func in tests:
1685         with alloc_fail(dev[0], count, func):
1686             res = dev[0].global_request(cmd)
1687             if exp and exp not in res:
1688                 raise Exception("Unexpected success for '%s' during OOM" % cmd)
1689
1690 def test_wpas_ctrl_socket_full(dev, apdev, test_params):
1691     """wpa_supplicant control socket and full send buffer"""
1692     if not dev[0].ping():
1693         raise Exception("Could not ping wpa_supplicant at the beginning of the test")
1694     dev[0].get_status()
1695
1696     counter = 0
1697
1698     s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
1699     local = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter)
1700     counter += 1
1701     s.bind(local)
1702     s.connect("/var/run/wpa_supplicant/wlan0")
1703     for i in range(20):
1704         logger.debug("Command %d" % i)
1705         try:
1706             s.send("MIB")
1707         except Exception, e:
1708             logger.info("Could not send command %d: %s" % (i, str(e)))
1709             break
1710         # Close without receiving response
1711         time.sleep(0.01)
1712
1713     if not dev[0].ping():
1714         raise Exception("Could not ping wpa_supplicant in the middle of the test")
1715     dev[0].get_status()
1716
1717     s2 = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
1718     local2 = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter)
1719     counter += 1
1720     s2.bind(local2)
1721     s2.connect("/var/run/wpa_supplicant/wlan0")
1722     for i in range(10):
1723         logger.debug("Command %d [2]" % i)
1724         try:
1725             s2.send("MIB")
1726         except Exception, e:
1727             logger.info("Could not send command %d [2]: %s" % (i, str(e)))
1728             break
1729         # Close without receiving response
1730         time.sleep(0.01)
1731
1732     s.close()
1733     os.unlink(local)
1734
1735     for i in range(10):
1736         logger.debug("Command %d [3]" % i)
1737         try:
1738             s2.send("MIB")
1739         except Exception, e:
1740             logger.info("Could not send command %d [3]: %s" % (i, str(e)))
1741             break
1742         # Close without receiving response
1743         time.sleep(0.01)
1744
1745     s2.close()
1746     os.unlink(local2)
1747
1748     if not dev[0].ping():
1749         raise Exception("Could not ping wpa_supplicant in the middle of the test [2]")
1750     dev[0].get_status()
1751
1752     s = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
1753     local = "/tmp/wpa_ctrl_test_%d-%d" % (os.getpid(), counter)
1754     counter += 1
1755     s.bind(local)
1756     s.connect("/var/run/wpa_supplicant/wlan0")
1757     s.send("ATTACH")
1758     res = s.recv(100)
1759     if "OK" not in res:
1760         raise Exception("Could not attach a test socket")
1761
1762     for i in range(5):
1763         dev[0].scan(freq=2412)
1764
1765     s.close()
1766     os.unlink(local)
1767
1768     for i in range(5):
1769         dev[0].scan(freq=2412)
1770
1771     if not dev[0].ping():
1772         raise Exception("Could not ping wpa_supplicant at the end of the test")
1773     dev[0].get_status()
1774
1775 def test_wpas_ctrl_event_burst(dev, apdev):
1776     """wpa_supplicant control socket and event burst"""
1777     if "OK" not in dev[0].request("EVENT_TEST 1000"):
1778         raise Exception("Could not request event messages")
1779
1780     total_i = 0
1781     total_g = 0
1782     for i in range(100):
1783         (i,g) = dev[0].dump_monitor()
1784         total_i += i
1785         total_g += g
1786         logger.info("Received i=%d g=%d" % (i, g))
1787         if total_i >= 1000 and total_g >= 1000:
1788             break
1789         time.sleep(0.05)
1790
1791     if total_i < 1000:
1792         raise Exception("Some per-interface events not seen: %d" % total_i)
1793     if total_g < 1000:
1794         raise Exception("Some global events not seen: %d" % total_g)
1795
1796     if not dev[0].ping():
1797         raise Exception("Could not ping wpa_supplicant at the end of the test")