tests: NFC_REPORT_HANDOVER error cases
[mech_eap.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 hostapd
8
9 def test_wpas_ctrl_network(dev):
10     """wpa_supplicant ctrl_iface network set/get"""
11     id = dev[0].add_network()
12
13     tests = (("key_mgmt", "WPA-PSK WPA-EAP IEEE8021X NONE WPA-NONE FT-PSK FT-EAP WPA-PSK-SHA256 WPA-EAP-SHA256"),
14              ("pairwise", "CCMP-256 GCMP-256 CCMP GCMP TKIP"),
15              ("group", "CCMP-256 GCMP-256 CCMP GCMP TKIP WEP104 WEP40"),
16              ("auth_alg", "OPEN SHARED LEAP"),
17              ("scan_freq", "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15"),
18              ("freq_list", "2412 2417"),
19              ("scan_ssid", "1"),
20              ("bssid", "00:11:22:33:44:55"),
21              ("proto", "WPA RSN OSEN"),
22              ("eap", "TLS"),
23              ("go_p2p_dev_addr", "22:33:44:55:66:aa"),
24              ("p2p_client_list", "22:33:44:55:66:bb 02:11:22:33:44:55"))
25
26     dev[0].set_network_quoted(id, "ssid", "test")
27     for field, value in tests:
28         dev[0].set_network(id, field, value)
29         res = dev[0].get_network(id, field)
30         if res != value:
31             raise Exception("Unexpected response for '" + field + "': '" + res + "'")
32
33     q_tests = (("identity", "hello"),
34                ("anonymous_identity", "foo@nowhere.com"))
35     for field, value in q_tests:
36         dev[0].set_network_quoted(id, field, value)
37         res = dev[0].get_network(id, field)
38         if res != '"' + value + '"':
39             raise Exception("Unexpected quoted response for '" + field + "': '" + res + "'")
40
41     get_tests = (("foo", None), ("ssid", '"test"'))
42     for field, value in get_tests:
43         res = dev[0].get_network(id, field)
44         if res != value:
45             raise Exception("Unexpected response for '" + field + "': '" + res + "'")
46
47     if dev[0].get_network(id, "password"):
48         raise Exception("Unexpected response for 'password'")
49     dev[0].set_network_quoted(id, "password", "foo")
50     if dev[0].get_network(id, "password") != '*':
51         raise Exception("Unexpected response for 'password' (expected *)")
52     dev[0].set_network(id, "password", "hash:12345678901234567890123456789012")
53     if dev[0].get_network(id, "password") != '*':
54         raise Exception("Unexpected response for 'password' (expected *)")
55     dev[0].set_network(id, "password", "NULL")
56     if dev[0].get_network(id, "password"):
57         raise Exception("Unexpected response for 'password'")
58     if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " password hash:12"):
59         raise Exception("Unexpected success for invalid password hash")
60     if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + " password hash:123456789012345678x0123456789012"):
61         raise Exception("Unexpected success for invalid password hash")
62
63     dev[0].set_network(id, "identity", "414243")
64     if dev[0].get_network(id, "identity") != '"ABC"':
65         raise Exception("Unexpected identity hex->text response")
66
67     dev[0].set_network(id, "identity", 'P"abc\ndef"')
68     if dev[0].get_network(id, "identity") != "6162630a646566":
69         raise Exception("Unexpected identity printf->hex response")
70
71     if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' identity P"foo'):
72         raise Exception("Unexpected success for invalid identity string")
73
74     if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' identity 12x3'):
75         raise Exception("Unexpected success for invalid identity string")
76
77     for i in range(0, 4):
78         if "FAIL" in dev[0].request("SET_NETWORK " + str(id) + ' wep_key' + str(i) + ' aabbccddee'):
79             raise Exception("Unexpected wep_key set failure")
80         if dev[0].get_network(id, "wep_key" + str(i)) != '*':
81             raise Exception("Unexpected wep_key get failure")
82
83     if "FAIL" in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
84         raise Exception("Unexpected failure for psk_list string")
85
86     if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list 00:11:x2:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
87         raise Exception("Unexpected success for invalid psk_list string")
88
89     if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:x2:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
90         raise Exception("Unexpected success for invalid psk_list string")
91
92     if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55+0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'):
93         raise Exception("Unexpected success for invalid psk_list string")
94
95     if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcde'):
96         raise Exception("Unexpected success for invalid psk_list string")
97
98     if "FAIL" not in dev[0].request("SET_NETWORK " + str(id) + ' psk_list P2P-00:11:22:33:44:55-0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdex'):
99         raise Exception("Unexpected success for invalid psk_list string")
100
101     if dev[0].get_network(id, "psk_list"):
102         raise Exception("Unexpected psk_list get response")
103
104     if dev[0].list_networks()[0]['ssid'] != "test":
105         raise Exception("Unexpected ssid in LIST_NETWORKS")
106     dev[0].set_network(id, "ssid", "NULL")
107     if dev[0].list_networks()[0]['ssid'] != "":
108         raise Exception("Unexpected ssid in LIST_NETWORKS after clearing it")
109
110     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' ssid "0123456789abcdef0123456789abcdef0"'):
111         raise Exception("Too long SSID accepted")
112     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' scan_ssid qwerty'):
113         raise Exception("Invalid integer accepted")
114     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' scan_ssid 2'):
115         raise Exception("Too large integer accepted")
116     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk 12345678'):
117         raise Exception("Invalid PSK accepted")
118     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk "1234567"'):
119         raise Exception("Too short PSK accepted")
120     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' psk "1234567890123456789012345678901234567890123456789012345678901234"'):
121         raise Exception("Too long PSK accepted")
122     dev[0].set_network_quoted(id, "psk", "123456768");
123     dev[0].set_network_quoted(id, "psk", "123456789012345678901234567890123456789012345678901234567890123");
124     if dev[0].get_network(id, "psk") != '*':
125         raise Exception("Unexpected psk read result");
126
127     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' eap UNKNOWN'):
128         raise Exception("Unknown EAP method accepted")
129
130     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' password "foo'):
131         raise Exception("Invalid password accepted")
132
133     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' wep_key0 "foo'):
134         raise Exception("Invalid WEP key accepted")
135     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' wep_key0 "12345678901234567"'):
136         raise Exception("Too long WEP key accepted")
137     # too short WEP key is ignored
138     dev[0].set_network_quoted(id, "wep_key0", "1234")
139     dev[0].set_network_quoted(id, "wep_key1", "12345")
140     dev[0].set_network_quoted(id, "wep_key2", "1234567890123")
141     dev[0].set_network_quoted(id, "wep_key3", "1234567890123456")
142
143     dev[0].set_network(id, "go_p2p_dev_addr", "any")
144     if dev[0].get_network(id, "go_p2p_dev_addr") is not None:
145         raise Exception("Unexpected go_p2p_dev_addr value")
146     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' go_p2p_dev_addr 00:11:22:33:44'):
147         raise Exception("Invalid go_p2p_dev_addr accepted")
148     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' p2p_client_list 00:11:22:33:44'):
149         raise Exception("Invalid p2p_client_list accepted")
150     if "FAIL" in dev[0].request('SET_NETWORK ' + str(id) + ' p2p_client_list 00:11:22:33:44:55 00:1'):
151         raise Exception("p2p_client_list truncation workaround failed")
152     if dev[0].get_network(id, "p2p_client_list") != "00:11:22:33:44:55":
153         raise Exception("p2p_client_list truncation workaround did not work")
154
155     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' auth_alg '):
156         raise Exception("Empty auth_alg accepted")
157     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' auth_alg FOO'):
158         raise Exception("Invalid auth_alg accepted")
159
160     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' proto '):
161         raise Exception("Empty proto accepted")
162     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' proto FOO'):
163         raise Exception("Invalid proto accepted")
164
165     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise '):
166         raise Exception("Empty pairwise accepted")
167     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise FOO'):
168         raise Exception("Invalid pairwise accepted")
169     if "FAIL" not in dev[0].request('SET_NETWORK ' + str(id) + ' pairwise WEP40'):
170         raise Exception("Invalid pairwise accepted")
171
172 def add_cred(dev):
173     id = dev.add_cred()
174     ev = dev.wait_event(["CRED-ADDED"])
175     if ev is None:
176         raise Exception("Missing CRED-ADDED event")
177     if " " + str(id) not in ev:
178         raise Exception("CRED-ADDED event without matching id")
179     return id
180
181 def set_cred(dev, id, field, value):
182     dev.set_cred(id, field, value)
183     ev = dev.wait_event(["CRED-MODIFIED"])
184     if ev is None:
185         raise Exception("Missing CRED-MODIFIED event")
186     if " " + str(id) + " " not in ev:
187         raise Exception("CRED-MODIFIED event without matching id")
188     if field not in ev:
189         raise Exception("CRED-MODIFIED event without matching field")
190
191 def set_cred_quoted(dev, id, field, value):
192     dev.set_cred_quoted(id, field, value)
193     ev = dev.wait_event(["CRED-MODIFIED"])
194     if ev is None:
195         raise Exception("Missing CRED-MODIFIED event")
196     if " " + str(id) + " " not in ev:
197         raise Exception("CRED-MODIFIED event without matching id")
198     if field not in ev:
199         raise Exception("CRED-MODIFIED event without matching field")
200
201 def remove_cred(dev, id):
202     dev.remove_cred(id)
203     ev = dev.wait_event(["CRED-REMOVED"])
204     if ev is None:
205         raise Exception("Missing CRED-REMOVED event")
206     if " " + str(id) not in ev:
207         raise Exception("CRED-REMOVED event without matching id")
208
209 def test_wpas_ctrl_cred(dev):
210     """wpa_supplicant ctrl_iface cred set"""
211     id1 = add_cred(dev[0])
212     id = add_cred(dev[0])
213     id2 = add_cred(dev[0])
214     set_cred(dev[0], id, "temporary", "1")
215     set_cred(dev[0], id, "priority", "1")
216     set_cred(dev[0], id, "pcsc", "1")
217     set_cred_quoted(dev[0], id, "private_key_passwd", "test")
218     set_cred_quoted(dev[0], id, "domain_suffix_match", "test")
219     set_cred_quoted(dev[0], id, "phase1", "test")
220     set_cred_quoted(dev[0], id, "phase2", "test")
221
222     if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " eap FOO"):
223         raise Exception("Unexpected success on unknown EAP method")
224
225     if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " username 12xa"):
226         raise Exception("Unexpected success on invalid string")
227
228     for i in ("11", "1122", "112233445566778899aabbccddeeff00"):
229         if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " roaming_consortium " + i):
230             raise Exception("Unexpected success on invalid roaming_consortium")
231
232     dev[0].set_cred(id, "excluded_ssid", "00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff")
233     if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " excluded_ssid 00112233445566778899aabbccddeeff00112233445566778899aabbccddeeff00"):
234         raise Exception("Unexpected success on invalid excluded_ssid")
235
236     if "FAIL" not in dev[0].request("SET_CRED " + str(id) + " foo 4142"):
237         raise Exception("Unexpected success on unknown field")
238
239     id3 = add_cred(dev[0])
240     id4 = add_cred(dev[0])
241
242     remove_cred(dev[0], id1)
243     remove_cred(dev[0], id3)
244     remove_cred(dev[0], id4)
245     remove_cred(dev[0], id2)
246     remove_cred(dev[0], id)
247     if "FAIL" not in dev[0].request("REMOVE_CRED 1"):
248         raise Exception("Unexpected success on invalid remove cred")
249
250     id = add_cred(dev[0])
251     values = [ ("temporary", "1", False),
252                ("temporary", "0", False),
253                ("pcsc", "1", False),
254                ("realm", "example.com", True),
255                ("username", "user@example.com", True),
256                ("password", "foo", True, "*"),
257                ("ca_cert", "ca.pem", True),
258                ("client_cert", "user.pem", True),
259                ("private_key", "key.pem", True),
260                ("private_key_passwd", "foo", True, "*"),
261                ("imsi", "310026-000000000", True),
262                ("milenage", "foo", True, "*"),
263                ("domain_suffix_match", "example.com", True),
264                ("domain", "example.com", True),
265                ("domain", "example.org", True, "example.com\nexample.org"),
266                ("roaming_consortium", "0123456789", False),
267                ("required_roaming_consortium", "456789", False),
268                ("eap", "TTLS", False),
269                ("phase1", "foo=bar1", True),
270                ("phase2", "foo=bar2", True),
271                ("excluded_ssid", "test", True),
272                ("excluded_ssid", "foo", True, "test\nfoo"),
273                ("roaming_partner", "example.com,0,4,*", True),
274                ("roaming_partner", "example.org,1,2,US", True,
275                 "example.com,0,4,*\nexample.org,1,2,US"),
276                ("update_identifier", "4", False),
277                ("provisioning_sp", "sp.example.com", True),
278                ("sp_priority", "7", False),
279                ("min_dl_bandwidth_home", "100", False),
280                ("min_ul_bandwidth_home", "101", False),
281                ("min_dl_bandwidth_roaming", "102", False),
282                ("min_ul_bandwidth_roaming", "103", False),
283                ("max_bss_load", "57", False),
284                ("req_conn_capab", "6:22,80,443", False),
285                ("req_conn_capab", "17:500", False, "6:22,80,443\n17:500"),
286                ("req_conn_capab", "50", False, "6:22,80,443\n17:500\n50"),
287                ("ocsp", "1", False) ]
288     for v in values:
289         if v[2]:
290             set_cred_quoted(dev[0], id, v[0], v[1])
291         else:
292             set_cred(dev[0], id, v[0], v[1])
293         val = dev[0].get_cred(id, v[0])
294         if len(v) == 4:
295             expect = v[3]
296         else:
297             expect = v[1]
298         if val != expect:
299             raise Exception("Unexpected GET_CRED value for {}: {} != {}".format(v[0], val, expect))
300     remove_cred(dev[0], id)
301
302 def test_wpas_ctrl_pno(dev):
303     """wpa_supplicant ctrl_iface pno"""
304     if "FAIL" not in dev[0].request("SET pno 1"):
305         raise Exception("Unexpected success in enabling PNO without enabled network blocks")
306     id = dev[0].add_network()
307     dev[0].set_network_quoted(id, "ssid", "test")
308     dev[0].set_network(id, "key_mgmt", "NONE")
309     dev[0].request("ENABLE_NETWORK " + str(id) + " no-connect")
310     #mac80211_hwsim does not yet support PNO, so this fails
311     if "FAIL" not in dev[0].request("SET pno 1"):
312         raise Exception("Unexpected success in enabling PNO")
313     if "FAIL" not in dev[0].request("SET pno 1 freq=2000-3000,5180"):
314         raise Exception("Unexpected success in enabling PNO")
315     if "FAIL" not in dev[0].request("SET pno 1 freq=0-6000"):
316         raise Exception("Unexpected success in enabling PNO")
317     if "FAIL" in dev[0].request("SET pno 0"):
318         raise Exception("Unexpected failure in disabling PNO")
319
320 def test_wpas_ctrl_get(dev):
321     """wpa_supplicant ctrl_iface get"""
322     if "FAIL" in dev[0].request("GET version"):
323         raise Exception("Unexpected get failure for version")
324     if "FAIL" in dev[0].request("GET wifi_display"):
325         raise Exception("Unexpected get failure for wifi_display")
326     if "FAIL" not in dev[0].request("GET foo"):
327         raise Exception("Unexpected success on get command")
328
329 def test_wpas_ctrl_preauth(dev):
330     """wpa_supplicant ctrl_iface preauth"""
331     if "FAIL" not in dev[0].request("PREAUTH "):
332         raise Exception("Unexpected success on invalid PREAUTH")
333     if "FAIL" in dev[0].request("PREAUTH 00:11:22:33:44:55"):
334         raise Exception("Unexpected failure on PREAUTH")
335
336 def test_wpas_ctrl_stkstart(dev):
337     """wpa_supplicant ctrl_iface strkstart"""
338     if "FAIL" not in dev[0].request("STKSTART "):
339         raise Exception("Unexpected success on invalid STKSTART")
340     if "FAIL" not in dev[0].request("STKSTART 00:11:22:33:44:55"):
341         raise Exception("Unexpected success on STKSTART")
342
343 def test_wpas_ctrl_tdls_discover(dev):
344     """wpa_supplicant ctrl_iface tdls_discover"""
345     if "FAIL" not in dev[0].request("TDLS_DISCOVER "):
346         raise Exception("Unexpected success on invalid TDLS_DISCOVER")
347     if "FAIL" not in dev[0].request("TDLS_DISCOVER 00:11:22:33:44:55"):
348         raise Exception("Unexpected success on TDLS_DISCOVER")
349
350 def test_wpas_ctrl_addr(dev):
351     """wpa_supplicant ctrl_iface invalid address"""
352     if "FAIL" not in dev[0].request("TDLS_SETUP "):
353         raise Exception("Unexpected success on invalid TDLS_SETUP")
354     if "FAIL" not in dev[0].request("TDLS_TEARDOWN "):
355         raise Exception("Unexpected success on invalid TDLS_TEARDOWN")
356     if "FAIL" not in dev[0].request("FT_DS "):
357         raise Exception("Unexpected success on invalid FT_DS")
358     if "FAIL" not in dev[0].request("WPS_PBC 00:11:22:33:44"):
359         raise Exception("Unexpected success on invalid WPS_PBC")
360     if "FAIL" not in dev[0].request("WPS_PIN 00:11:22:33:44"):
361         raise Exception("Unexpected success on invalid WPS_PIN")
362     if "FAIL" not in dev[0].request("WPS_NFC 00:11:22:33:44"):
363         raise Exception("Unexpected success on invalid WPS_NFC")
364     if "FAIL" not in dev[0].request("WPS_REG 12345670 00:11:22:33:44"):
365         raise Exception("Unexpected success on invalid WPS_REG")
366     if "FAIL" not in dev[0].request("IBSS_RSN 00:11:22:33:44"):
367         raise Exception("Unexpected success on invalid IBSS_RSN")
368
369 def test_wpas_ctrl_config_parser(dev):
370     """wpa_supplicant ctrl_iface SET config parser"""
371     if "FAIL" not in dev[0].request("SET pbc_in_m1 qwerty"):
372         raise Exception("Non-number accepted as integer")
373     if "FAIL" not in dev[0].request("SET eapol_version 0"):
374         raise Exception("Out-of-range value accepted")
375     if "FAIL" not in dev[0].request("SET eapol_version 10"):
376         raise Exception("Out-of-range value accepted")
377
378     if "FAIL" not in dev[0].request("SET serial_number 0123456789abcdef0123456789abcdef0"):
379         raise Exception("Too long string accepted")
380
381 def test_wpas_ctrl_mib(dev):
382     """wpa_supplicant ctrl_iface MIB"""
383     mib = dev[0].get_mib()
384     if "dot11RSNAOptionImplemented" not in mib:
385         raise Exception("Missing MIB entry")
386     if mib["dot11RSNAOptionImplemented"] != "TRUE":
387         raise Exception("Unexpected dot11RSNAOptionImplemented value")
388
389 def test_wpas_ctrl_set_wps_params(dev):
390     """wpa_supplicant ctrl_iface SET config_methods"""
391     ts = [ "config_methods label virtual_display virtual_push_button keypad",
392            "device_type 1-0050F204-1",
393            "os_version 01020300",
394            "uuid 12345678-9abc-def0-1234-56789abcdef0" ]
395     for t in ts:
396         if "OK" not in dev[2].request("SET " + t):
397             raise Exception("SET failed for: " + t)
398
399 def test_wpas_ctrl_level(dev):
400     """wpa_supplicant ctrl_iface LEVEL"""
401     try:
402         if "FAIL" not in dev[2].request("LEVEL 3"):
403             raise Exception("Unexpected LEVEL success")
404         if "OK" not in dev[2].mon.request("LEVEL 2"):
405             raise Exception("Unexpected LEVEL failure")
406         dev[2].request("SCAN freq=2412")
407         ev = dev[2].wait_event(["State:"], timeout=5)
408         if ev is None:
409             raise Exception("No debug message received")
410         dev[2].wait_event(["CTRL-EVENT-SCAN-RESULTS"], timeout=5)
411     finally:
412         dev[2].mon.request("LEVEL 3")
413
414 def test_wpas_ctrl_bssid_filter(dev, apdev):
415     """wpa_supplicant bssid_filter"""
416     try:
417         if "OK" not in dev[2].request("SET bssid_filter " + apdev[0]['bssid']):
418             raise Exception("Failed to set bssid_filter")
419         params = { "ssid": "test" }
420         hostapd.add_ap(apdev[0]['ifname'], params)
421         hostapd.add_ap(apdev[1]['ifname'], params)
422         dev[2].scan(freq="2412")
423         bss = dev[2].get_bss(apdev[0]['bssid'])
424         if len(bss) == 0:
425             raise Exception("Missing BSS data")
426         bss = dev[2].get_bss(apdev[1]['bssid'])
427         if len(bss) != 0:
428             raise Exception("Unexpected BSS data")
429         dev[2].request("SET bssid_filter ")
430         dev[2].scan(freq="2412")
431         bss = dev[2].get_bss(apdev[0]['bssid'])
432         if len(bss) == 0:
433             raise Exception("Missing BSS data")
434         bss = dev[2].get_bss(apdev[1]['bssid'])
435         if len(bss) == 0:
436             raise Exception("Missing BSS data(2)")
437
438         if "FAIL" not in dev[2].request("SET bssid_filter 00:11:22:33:44:55 00:11:22:33:44"):
439             raise Exception("Unexpected success for invalid SET bssid_filter")
440     finally:
441         dev[2].request("SET bssid_filter ")
442
443 def test_wpas_ctrl_disallow_aps(dev, apdev):
444     """wpa_supplicant ctrl_iface disallow_aps"""
445     params = { "ssid": "test" }
446     hostapd.add_ap(apdev[0]['ifname'], params)
447
448     if "FAIL" not in dev[0].request("SET disallow_aps bssid "):
449         raise Exception("Unexpected success on invalid disallow_aps")
450     if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44"):
451         raise Exception("Unexpected success on invalid disallow_aps")
452     if "FAIL" not in dev[0].request("SET disallow_aps ssid 0"):
453         raise Exception("Unexpected success on invalid disallow_aps")
454     if "FAIL" not in dev[0].request("SET disallow_aps ssid 4q"):
455         raise Exception("Unexpected success on invalid disallow_aps")
456     if "FAIL" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 ssid 112233 ssid 123"):
457         raise Exception("Unexpected success on invalid disallow_aps")
458     if "FAIL" not in dev[0].request("SET disallow_aps ssid 000102030405060708090a0b0c0d0e0f000102030405060708090a0b0c0d0e0f00"):
459         raise Exception("Unexpected success on invalid disallow_aps")
460     if "FAIL" not in dev[0].request("SET disallow_aps foo 112233445566"):
461         raise Exception("Unexpected success on invalid disallow_aps")
462
463     dev[0].connect("test", key_mgmt="NONE", scan_freq="2412")
464     hostapd.add_ap(apdev[1]['ifname'], params)
465     dev[0].dump_monitor()
466     if "OK" not in dev[0].request("SET disallow_aps bssid 00:11:22:33:44:55 bssid 00:22:33:44:55:66"):
467         raise Exception("Failed to set disallow_aps")
468     if "OK" not in dev[0].request("SET disallow_aps bssid " + apdev[0]['bssid']):
469         raise Exception("Failed to set disallow_aps")
470     ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=15)
471     if ev is None:
472         raise Exception("Reassociation timed out")
473     if apdev[1]['bssid'] not in ev:
474         raise Exception("Unexpected BSSID")
475
476     dev[0].dump_monitor()
477     if "OK" not in dev[0].request("SET disallow_aps ssid " + "test".encode("hex")):
478         raise Exception("Failed to set disallow_aps")
479     ev = dev[0].wait_event(["CTRL-EVENT-DISCONNECTED"], timeout=5)
480     if ev is None:
481         raise Exception("Disconnection not seen")
482     ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
483     if ev is not None:
484         raise Exception("Unexpected reassociation")
485
486 def test_wpas_ctrl_blob(dev):
487     """wpa_supplicant ctrl_iface SET blob"""
488     if "FAIL" not in dev[0].request("SET blob foo"):
489         raise Exception("Unexpected SET success")
490     if "FAIL" not in dev[0].request("SET blob foo 0"):
491         raise Exception("Unexpected SET success")
492     if "FAIL" not in dev[0].request("SET blob foo 0q"):
493         raise Exception("Unexpected SET success")
494     if "OK" not in dev[0].request("SET blob foo 00"):
495         raise Exception("Unexpected SET failure")
496     if "OK" not in dev[0].request("SET blob foo 0011"):
497         raise Exception("Unexpected SET failure")
498
499 def test_wpas_ctrl_set_uapsd(dev):
500     """wpa_supplicant ctrl_iface SET uapsd"""
501     if "FAIL" not in dev[0].request("SET uapsd foo"):
502         raise Exception("Unexpected SET success")
503     if "FAIL" not in dev[0].request("SET uapsd 0,0,0"):
504         raise Exception("Unexpected SET success")
505     if "FAIL" not in dev[0].request("SET uapsd 0,0"):
506         raise Exception("Unexpected SET success")
507     if "FAIL" not in dev[0].request("SET uapsd 0"):
508         raise Exception("Unexpected SET success")
509     if "OK" not in dev[0].request("SET uapsd 1,1,1,1;1"):
510         raise Exception("Unexpected SET failure")
511     if "OK" not in dev[0].request("SET uapsd 0,0,0,0;0"):
512         raise Exception("Unexpected SET failure")
513     if "OK" not in dev[0].request("SET uapsd disable"):
514         raise Exception("Unexpected SET failure")
515
516 def test_wpas_ctrl_set(dev):
517     """wpa_supplicant ctrl_iface SET"""
518     vals = [ "foo",
519              "dot11RSNAConfigPMKLifetime 0",
520              "dot11RSNAConfigPMKReauthThreshold 101",
521              "dot11RSNAConfigSATimeout 0",
522              "wps_version_number -1",
523              "wps_version_number 256" ]
524     for val in vals:
525         if "FAIL" not in dev[0].request("SET " + val):
526             raise Exception("Unexpected SET success for " + val)
527
528     vals = [ "EAPOL::heldPeriod 60",
529              "EAPOL::authPeriod 30",
530              "EAPOL::startPeriod 30",
531              "EAPOL::maxStart 3",
532              "dot11RSNAConfigSATimeout 60",
533              "tdls_disabled 1",
534              "tdls_disabled 0" ]
535     for val in vals:
536         if "OK" not in dev[0].request("SET " + val):
537             raise Exception("Unexpected SET failure for " + val)
538
539 def test_wpas_ctrl_get_capability(dev):
540     """wpa_supplicant ctrl_iface GET_CAPABILITY"""
541     res = dev[0].get_capability("eap")
542     if "TTLS" not in res:
543         raise Exception("Unexpected GET_CAPABILITY eap response: " + str(res))
544
545     res = dev[0].get_capability("pairwise")
546     if "CCMP" not in res:
547         raise Exception("Unexpected GET_CAPABILITY pairwise response: " + str(res))
548
549     res = dev[0].get_capability("group")
550     if "CCMP" not in res:
551         raise Exception("Unexpected GET_CAPABILITY group response: " + str(res))
552
553     res = dev[0].get_capability("key_mgmt")
554     if "WPA-PSK" not in res or "WPA-EAP" not in res:
555         raise Exception("Unexpected GET_CAPABILITY key_mgmt response: " + str(res))
556
557     res = dev[0].get_capability("proto")
558     if "WPA" not in res or "RSN" not in res:
559         raise Exception("Unexpected GET_CAPABILITY proto response: " + str(res))
560
561     res = dev[0].get_capability("auth_alg")
562     if "OPEN" not in res or "SHARED" not in res:
563         raise Exception("Unexpected GET_CAPABILITY auth_alg response: " + str(res))
564
565     res = dev[0].get_capability("modes")
566     if "IBSS" not in res or "AP" not in res:
567         raise Exception("Unexpected GET_CAPABILITY modes response: " + str(res))
568
569     res = dev[0].get_capability("channels")
570     if "8" not in res or "36" not in res:
571         raise Exception("Unexpected GET_CAPABILITY channels response: " + str(res))
572
573     res = dev[0].get_capability("freq")
574     if "2457" not in res or "5180" not in res:
575         raise Exception("Unexpected GET_CAPABILITY freq response: " + str(res))
576
577     res = dev[0].get_capability("tdls")
578     if "EXTERNAL" not in res[0]:
579         raise Exception("Unexpected GET_CAPABILITY tdls response: " + str(res))
580
581     if dev[0].get_capability("foo") is not None:
582         raise Exception("Unexpected GET_CAPABILITY foo response: " + str(res))
583
584 def test_wpas_ctrl_nfc_report_handover(dev):
585     """wpa_supplicant ctrl_iface NFC_REPORT_HANDOVER"""
586     vals = [ "FOO",
587              "ROLE freq=12345",
588              "ROLE TYPE",
589              "ROLE TYPE REQ",
590              "ROLE TYPE REQ SEL",
591              "ROLE TYPE 0Q SEL",
592              "ROLE TYPE 00 SEL",
593              "ROLE TYPE 00 0Q",
594              "ROLE TYPE 00 00" ]
595     for v in vals:
596         if "FAIL" not in dev[0].request("NFC_REPORT_HANDOVER " + v):
597             raise Exception("Unexpected NFC_REPORT_HANDOVER success for " + v)