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