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