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