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