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