]>
Commit | Line | Data |
---|---|---|
e1a5e09a JM |
1 | # wpa_supplicant AP mode tests |
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 | ||
e9d2cd71 | 7 | import hostapd |
9fd6804d | 8 | from remotehost import remote_compatible |
e1a5e09a JM |
9 | import time |
10 | import logging | |
11 | logger = logging.getLogger() | |
12 | ||
13 | import hwsim_utils | |
689db8b3 | 14 | from utils import HwsimSkip, alloc_fail, clear_regdom_dev |
1f7cd73c | 15 | from wpasupplicant import WpaSupplicant |
50c3825c | 16 | from test_p2p_channel import set_country |
200c7693 | 17 | from test_wep import check_wep_capa |
e1a5e09a | 18 | |
9905de31 JM |
19 | def wait_ap_ready(dev): |
20 | ev = dev.wait_event(["CTRL-EVENT-CONNECTED"]) | |
21 | if ev is None: | |
22 | raise Exception("AP failed to start") | |
23 | ||
e1a5e09a JM |
24 | def test_wpas_ap_open(dev): |
25 | """wpa_supplicant AP mode - open network""" | |
e869f812 JM |
26 | if "FAIL" not in dev[0].request("DEAUTHENTICATE 00:11:22:33:44:55"): |
27 | raise Exception("Unexpected DEAUTHENTICATE accepted") | |
28 | if "FAIL" not in dev[0].request("DISASSOCIATE 00:11:22:33:44:55"): | |
29 | raise Exception("Unexpected DISASSOCIATE accepted") | |
30 | if "FAIL" not in dev[0].request("CHAN_SWITCH 0 2432"): | |
31 | raise Exception("Unexpected CHAN_SWITCH accepted") | |
32 | ||
e1a5e09a JM |
33 | id = dev[0].add_network() |
34 | dev[0].set_network(id, "mode", "2") | |
35 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
36 | dev[0].set_network(id, "key_mgmt", "NONE") | |
37 | dev[0].set_network(id, "frequency", "2412") | |
38 | dev[0].set_network(id, "scan_freq", "2412") | |
39 | dev[0].select_network(id) | |
9905de31 | 40 | wait_ap_ready(dev[0]) |
e1a5e09a | 41 | |
e869f812 JM |
42 | if "FAIL" not in dev[0].request("DEAUTHENTICATE foo"): |
43 | raise Exception("Invalid DEAUTHENTICATE accepted") | |
44 | if "FAIL" not in dev[0].request("DISASSOCIATE foo"): | |
45 | raise Exception("Invalid DISASSOCIATE accepted") | |
46 | ||
e1a5e09a JM |
47 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") |
48 | dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") | |
a8375c94 JM |
49 | hwsim_utils.test_connectivity(dev[0], dev[1]) |
50 | hwsim_utils.test_connectivity(dev[1], dev[2]) | |
e1a5e09a JM |
51 | |
52 | addr1 = dev[1].p2p_interface_addr() | |
53 | addr2 = dev[2].p2p_interface_addr() | |
fab49f61 | 54 | addrs = [addr1, addr2] |
e1a5e09a JM |
55 | sta = dev[0].get_sta(None) |
56 | if sta['addr'] not in addrs: | |
57 | raise Exception("Unexpected STA address") | |
58 | sta1 = dev[0].get_sta(sta['addr']) | |
59 | if sta1['addr'] not in addrs: | |
60 | raise Exception("Unexpected STA address") | |
61 | sta2 = dev[0].get_sta(sta['addr'], next=True) | |
62 | if sta2['addr'] not in addrs: | |
63 | raise Exception("Unexpected STA2 address") | |
64 | sta3 = dev[0].get_sta(sta2['addr'], next=True) | |
65 | if len(sta3) != 0: | |
66 | raise Exception("Unexpected STA iteration result (did not stop)") | |
67 | ||
68 | status = dev[0].get_status() | |
69 | if status['mode'] != "AP": | |
70 | raise Exception("Unexpected status mode") | |
71 | ||
72 | dev[1].dump_monitor() | |
73 | dev[2].dump_monitor() | |
74 | dev[0].request("DEAUTHENTICATE " + addr1) | |
75 | dev[0].request("DISASSOCIATE " + addr2) | |
5f35a5e2 JM |
76 | dev[1].wait_disconnected(timeout=10) |
77 | dev[2].wait_disconnected(timeout=10) | |
78 | dev[1].wait_connected(timeout=10, error="Reconnection timed out") | |
79 | dev[2].wait_connected(timeout=10, error="Reconnection timed out") | |
9905de31 JM |
80 | dev[1].request("DISCONNECT") |
81 | dev[2].request("DISCONNECT") | |
e1a5e09a | 82 | |
57dc90e3 JM |
83 | def test_wpas_ap_open_isolate(dev): |
84 | """wpa_supplicant AP mode - open network with client isolation""" | |
85 | try: | |
86 | dev[0].set("ap_isolate", "1") | |
87 | id = dev[0].add_network() | |
88 | dev[0].set_network(id, "mode", "2") | |
89 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
90 | dev[0].set_network(id, "key_mgmt", "NONE") | |
91 | dev[0].set_network(id, "frequency", "2412") | |
92 | dev[0].set_network(id, "scan_freq", "2412") | |
93 | dev[0].select_network(id) | |
94 | wait_ap_ready(dev[0]) | |
95 | ||
96 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") | |
97 | dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") | |
98 | hwsim_utils.test_connectivity(dev[0], dev[1]) | |
99 | hwsim_utils.test_connectivity(dev[0], dev[2]) | |
100 | hwsim_utils.test_connectivity(dev[1], dev[2], success_expected=False, | |
101 | timeout=1) | |
102 | finally: | |
103 | dev[0].set("ap_isolate", "0") | |
104 | ||
9fd6804d | 105 | @remote_compatible |
e1a5e09a JM |
106 | def test_wpas_ap_wep(dev): |
107 | """wpa_supplicant AP mode - WEP""" | |
200c7693 | 108 | check_wep_capa(dev[0]) |
e1a5e09a JM |
109 | id = dev[0].add_network() |
110 | dev[0].set_network(id, "mode", "2") | |
111 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-wep") | |
112 | dev[0].set_network(id, "key_mgmt", "NONE") | |
113 | dev[0].set_network(id, "frequency", "2412") | |
114 | dev[0].set_network(id, "scan_freq", "2412") | |
115 | dev[0].set_network_quoted(id, "wep_key0", "hello") | |
116 | dev[0].select_network(id) | |
9905de31 | 117 | wait_ap_ready(dev[0]) |
e1a5e09a JM |
118 | |
119 | dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"', | |
120 | scan_freq="2412") | |
a8375c94 | 121 | hwsim_utils.test_connectivity(dev[0], dev[1]) |
9905de31 | 122 | dev[1].request("DISCONNECT") |
e1a5e09a | 123 | |
9fd6804d | 124 | @remote_compatible |
e1a5e09a JM |
125 | def test_wpas_ap_no_ssid(dev): |
126 | """wpa_supplicant AP mode - invalid network configuration""" | |
127 | id = dev[0].add_network() | |
128 | dev[0].set_network(id, "mode", "2") | |
129 | dev[0].set_network(id, "key_mgmt", "NONE") | |
130 | dev[0].set_network(id, "frequency", "2412") | |
131 | dev[0].set_network(id, "scan_freq", "2412") | |
132 | dev[0].select_network(id) | |
133 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1) | |
134 | if ev is not None: | |
135 | raise Exception("Unexpected AP start") | |
136 | ||
9fd6804d | 137 | @remote_compatible |
e1a5e09a JM |
138 | def test_wpas_ap_default_frequency(dev): |
139 | """wpa_supplicant AP mode - default frequency""" | |
140 | id = dev[0].add_network() | |
141 | dev[0].set_network(id, "mode", "2") | |
142 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
143 | dev[0].set_network(id, "key_mgmt", "NONE") | |
144 | dev[0].set_network(id, "scan_freq", "2412") | |
145 | dev[0].select_network(id) | |
9905de31 | 146 | wait_ap_ready(dev[0]) |
e1a5e09a | 147 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462") |
9905de31 | 148 | dev[1].request("DISCONNECT") |
e1a5e09a | 149 | |
9fd6804d | 150 | @remote_compatible |
e1a5e09a JM |
151 | def test_wpas_ap_invalid_frequency(dev): |
152 | """wpa_supplicant AP mode - invalid frequency configuration""" | |
153 | id = dev[0].add_network() | |
154 | dev[0].set_network(id, "mode", "2") | |
155 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
156 | dev[0].set_network(id, "key_mgmt", "NONE") | |
157 | dev[0].set_network(id, "frequency", "2413") | |
158 | dev[0].set_network(id, "scan_freq", "2412") | |
159 | dev[0].select_network(id) | |
160 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1) | |
161 | if ev is not None: | |
162 | raise Exception("Unexpected AP start") | |
163 | ||
164 | def test_wpas_ap_wps(dev): | |
165 | """wpa_supplicant AP mode - WPS operations""" | |
166 | id = dev[0].add_network() | |
167 | dev[0].set_network(id, "mode", "2") | |
168 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps") | |
169 | dev[0].set_network_quoted(id, "psk", "1234567890") | |
170 | dev[0].set_network(id, "frequency", "2412") | |
171 | dev[0].set_network(id, "scan_freq", "2412") | |
172 | dev[0].select_network(id) | |
9905de31 | 173 | wait_ap_ready(dev[0]) |
e1a5e09a JM |
174 | bssid = dev[0].p2p_interface_addr() |
175 | ||
176 | logger.info("Test PBC mode start/stop") | |
177 | if "FAIL" not in dev[0].request("WPS_CANCEL"): | |
178 | raise Exception("Unexpected WPS_CANCEL success") | |
179 | dev[0].request("WPS_PBC") | |
180 | ev = dev[0].wait_event(["WPS-PBC-ACTIVE"]) | |
181 | if ev is None: | |
182 | raise Exception("PBC mode start timeout") | |
183 | if "OK" not in dev[0].request("WPS_CANCEL"): | |
184 | raise Exception("Unexpected WPS_CANCEL failure") | |
185 | ev = dev[0].wait_event(["WPS-TIMEOUT"]) | |
186 | if ev is None: | |
187 | raise Exception("PBC mode disabling timeout") | |
188 | ||
189 | logger.info("Test PBC protocol run") | |
190 | dev[0].request("WPS_PBC") | |
191 | ev = dev[0].wait_event(["WPS-PBC-ACTIVE"]) | |
192 | if ev is None: | |
193 | raise Exception("PBC mode start timeout") | |
194 | dev[1].request("WPS_PBC") | |
5f35a5e2 | 195 | dev[1].wait_connected(timeout=30, error="WPS PBC operation timed out") |
a8375c94 | 196 | hwsim_utils.test_connectivity(dev[0], dev[1]) |
e1a5e09a JM |
197 | |
198 | logger.info("Test AP PIN to learn configuration") | |
199 | pin = dev[0].request("WPS_AP_PIN random") | |
200 | if "FAIL" in pin: | |
201 | raise Exception("Could not generate random AP PIN") | |
202 | if pin not in dev[0].request("WPS_AP_PIN get"): | |
203 | raise Exception("Could not fetch current AP PIN") | |
204 | dev[2].wps_reg(bssid, pin) | |
a8375c94 | 205 | hwsim_utils.test_connectivity(dev[1], dev[2]) |
e1a5e09a JM |
206 | |
207 | dev[1].request("REMOVE_NETWORK all") | |
208 | dev[2].request("REMOVE_NETWORK all") | |
209 | ||
210 | logger.info("Test AP PIN operations") | |
211 | dev[0].request("WPS_AP_PIN disable") | |
212 | dev[0].request("WPS_AP_PIN set " + pin + " 1") | |
213 | time.sleep(1.1) | |
214 | if "FAIL" not in dev[0].request("WPS_AP_PIN get"): | |
215 | raise Exception("AP PIN unexpectedly still enabled") | |
216 | ||
217 | pin = dev[1].wps_read_pin() | |
218 | dev[0].request("WPS_PIN any " + pin) | |
219 | dev[1].request("WPS_PIN any " + pin) | |
5f35a5e2 | 220 | dev[1].wait_connected(timeout=30) |
6e12eaa4 JM |
221 | dev[1].request("REMOVE_NETWORK all") |
222 | dev[1].dump_monitor() | |
223 | ||
224 | dev[0].request("WPS_PIN any " + pin + " 100") | |
225 | dev[1].request("WPS_PIN any " + pin) | |
5f35a5e2 | 226 | dev[1].wait_connected(timeout=30) |
e1a5e09a JM |
227 | dev[1].request("REMOVE_NETWORK all") |
228 | dev[1].dump_monitor() | |
229 | ||
230 | dev[0].request("WPS_AP_PIN set 12345670") | |
231 | dev[0].dump_monitor() | |
232 | ||
233 | runs = ("88887777", "12340000", "00000000", "12345670") | |
234 | for pin in runs: | |
235 | logger.info("Try AP PIN " + pin) | |
236 | dev[2].dump_monitor() | |
237 | dev[2].request("WPS_REG " + bssid + " " + pin) | |
238 | ev = dev[2].wait_event(["WPS-SUCCESS", "WPS-FAIL msg"], timeout=15) | |
239 | if ev is None: | |
240 | raise Exception("WPS operation timed out") | |
241 | if "WPS-SUCCESS" in ev: | |
242 | raise Exception("WPS operation succeeded unexpectedly") | |
5f35a5e2 | 243 | dev[2].wait_disconnected(timeout=10) |
e1a5e09a JM |
244 | dev[2].request("WPS_CANCEL") |
245 | dev[2].request("REMOVE_NETWORK all") | |
246 | ev = dev[0].wait_event(["WPS-AP-SETUP-LOCKED"]) | |
247 | if ev is None: | |
248 | raise Exception("WPS AP PIN not locked") | |
8e33f9c6 JM |
249 | |
250 | dev[0].dump_monitor() | |
251 | logger.info("Test random AP PIN timeout") | |
252 | pin = dev[0].request("WPS_AP_PIN random 1") | |
253 | if "FAIL" in pin: | |
254 | raise Exception("Could not generate random AP PIN") | |
255 | res = dev[0].request("WPS_AP_PIN get") | |
256 | if pin not in res: | |
257 | raise Exception("Could not fetch current AP PIN") | |
258 | for i in range(10): | |
259 | time.sleep(0.2) | |
260 | res = dev[0].request("WPS_AP_PIN get") | |
261 | if "FAIL" in res: | |
262 | break | |
263 | if "FAIL" not in res: | |
264 | raise Exception("WPS_AP_PIN random timeout did not work") | |
265 | ||
266 | if "FAIL" not in dev[0].request("WPS_AP_PIN foo"): | |
267 | raise Exception("Invalid WPS_AP_PIN command not rejected") | |
268 | if "FAIL" not in dev[0].request("WPS_AP_PIN set"): | |
269 | raise Exception("Invalid WPS_AP_PIN command not rejected") | |
b37dac50 | 270 | |
d1bc3ec8 JM |
271 | def test_wpas_ap_wps_frag(dev): |
272 | """wpa_supplicant AP mode - WPS operations with fragmentation""" | |
273 | id = dev[0].add_network() | |
274 | dev[0].set_network(id, "mode", "2") | |
275 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps") | |
276 | dev[0].set_network_quoted(id, "psk", "1234567890") | |
277 | dev[0].set_network(id, "frequency", "2412") | |
278 | dev[0].set_network(id, "scan_freq", "2412") | |
279 | dev[0].set_network(id, "fragment_size", "300") | |
280 | dev[0].select_network(id) | |
281 | wait_ap_ready(dev[0]) | |
282 | bssid = dev[0].own_addr() | |
283 | ||
284 | pin = dev[1].wps_read_pin() | |
285 | dev[0].request("WPS_PIN any " + pin) | |
286 | dev[1].scan_for_bss(bssid, freq="2412") | |
287 | dev[1].request("WPS_PIN " + bssid + " " + pin) | |
288 | dev[1].wait_connected(timeout=30) | |
289 | ||
b37dac50 JM |
290 | def test_wpas_ap_wps_pbc_overlap(dev): |
291 | """wpa_supplicant AP mode - WPS operations with PBC overlap""" | |
292 | id = dev[0].add_network() | |
293 | dev[0].set_network(id, "mode", "2") | |
294 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps") | |
295 | dev[0].set_network_quoted(id, "psk", "1234567890") | |
296 | dev[0].set_network(id, "frequency", "2412") | |
297 | dev[0].set_network(id, "scan_freq", "2412") | |
298 | dev[0].select_network(id) | |
299 | wait_ap_ready(dev[0]) | |
300 | bssid = dev[0].p2p_interface_addr() | |
301 | ||
302 | dev[1].scan_for_bss(bssid, freq="2412") | |
303 | dev[1].dump_monitor() | |
304 | dev[2].scan_for_bss(bssid, freq="2412") | |
305 | dev[2].dump_monitor() | |
306 | dev[0].request("WPS_PBC") | |
307 | dev[1].request("WPS_PBC " + bssid) | |
308 | dev[2].request("WPS_PBC " + bssid) | |
309 | ||
310 | ev = dev[1].wait_event(["WPS-M2D"], timeout=15) | |
311 | if ev is None: | |
312 | raise Exception("PBC session overlap not detected (dev1)") | |
313 | if "config_error=12" not in ev: | |
314 | raise Exception("PBC session overlap not correctly reported (dev1)") | |
315 | ||
316 | ev = dev[2].wait_event(["WPS-M2D"], timeout=15) | |
317 | if ev is None: | |
318 | raise Exception("PBC session overlap not detected (dev2)") | |
319 | if "config_error=12" not in ev: | |
320 | raise Exception("PBC session overlap not correctly reported (dev2)") | |
321 | ||
322 | if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC"): | |
323 | raise Exception("WPS_PBC(AP) accepted during overlap") | |
324 | if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC any"): | |
325 | raise Exception("WPS_PBC(AP) accepted during overlap") | |
326 | dev[0].request("WPS_CANCEL") | |
327 | dev[1].request("WPS_CANCEL") | |
328 | dev[2].request("WPS_CANCEL") | |
50c3825c | 329 | |
9fd6804d | 330 | @remote_compatible |
f260ce4b JM |
331 | def test_wpas_ap_wps_disabled(dev): |
332 | """wpa_supplicant AP mode - WPS disabled""" | |
333 | id = dev[0].add_network() | |
334 | dev[0].set_network(id, "mode", "2") | |
335 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-no-wps") | |
336 | dev[0].set_network_quoted(id, "psk", "12345678") | |
337 | dev[0].set_network(id, "frequency", "2412") | |
338 | dev[0].set_network(id, "scan_freq", "2412") | |
339 | dev[0].set_network(id, "wps_disabled", "1") | |
340 | dev[0].select_network(id) | |
341 | wait_ap_ready(dev[0]) | |
342 | ||
343 | dev[1].connect("wpas-ap-no-wps", psk="12345678", scan_freq="2412") | |
344 | dev[1].request("DISCONNECT") | |
345 | dev[1].wait_disconnected() | |
346 | ||
50c3825c JM |
347 | def test_wpas_ap_dfs(dev): |
348 | """wpa_supplicant AP mode - DFS""" | |
7487ef14 IP |
349 | if dev[0].get_mcc() > 1: |
350 | raise HwsimSkip("DFS is not supported with multi channel contexts") | |
351 | ||
50c3825c JM |
352 | try: |
353 | _test_wpas_ap_dfs(dev) | |
354 | finally: | |
355 | set_country("00") | |
356 | dev[0].request("SET country 00") | |
357 | dev[1].flush_scan_cache() | |
358 | ||
359 | def _test_wpas_ap_dfs(dev): | |
360 | set_country("US") | |
361 | dev[0].request("SET country US") | |
362 | id = dev[0].add_network() | |
363 | dev[0].set_network(id, "mode", "2") | |
364 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-dfs") | |
365 | dev[0].set_network(id, "key_mgmt", "NONE") | |
366 | dev[0].set_network(id, "frequency", "5260") | |
367 | dev[0].set_network(id, "scan_freq", "5260") | |
368 | dev[0].select_network(id) | |
369 | ||
370 | ev = dev[0].wait_event(["DFS-CAC-START"]) | |
371 | if ev is None: | |
372 | # For now, assume DFS is not supported by all kernel builds. | |
373 | raise HwsimSkip("CAC did not start - assume not supported") | |
374 | ||
375 | ev = dev[0].wait_event(["DFS-CAC-COMPLETED"], timeout=70) | |
376 | if ev is None: | |
377 | raise Exception("CAC did not complete") | |
378 | if "success=1" not in ev: | |
379 | raise Exception("CAC failed") | |
380 | if "freq=5260" not in ev: | |
381 | raise Exception("Unexpected DFS freq result") | |
382 | ||
383 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"]) | |
384 | if ev is None: | |
385 | raise Exception("AP failed to start") | |
386 | ||
387 | dev[1].connect("wpas-ap-dfs", key_mgmt="NONE") | |
b586054f JM |
388 | dev[1].wait_regdom(country_ie=True) |
389 | dev[0].request("DISCONNECT") | |
e01a492c | 390 | dev[1].disconnect_and_stop_scan() |
d0cd00de | 391 | |
9fd6804d | 392 | @remote_compatible |
d0cd00de JM |
393 | def test_wpas_ap_disable(dev): |
394 | """wpa_supplicant AP mode - DISABLE_NETWORK""" | |
395 | id = dev[0].add_network() | |
396 | dev[0].set_network(id, "mode", "2") | |
397 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
398 | dev[0].set_network(id, "key_mgmt", "NONE") | |
399 | dev[0].set_network(id, "scan_freq", "2412") | |
400 | dev[0].select_network(id) | |
401 | ||
402 | ev = dev[0].wait_event(["AP-ENABLED"]) | |
403 | if ev is None: | |
404 | raise Exception("AP-ENABLED event not seen") | |
405 | wait_ap_ready(dev[0]) | |
406 | dev[0].request("DISABLE_NETWORK %d" % id) | |
407 | ev = dev[0].wait_event(["AP-DISABLED"]) | |
408 | if ev is None: | |
409 | raise Exception("AP-DISABLED event not seen") | |
410 | dev[0].wait_disconnected() | |
33dfdcba JM |
411 | |
412 | def test_wpas_ap_acs(dev): | |
413 | """wpa_supplicant AP mode - ACS""" | |
414 | res = dev[0].get_capability("acs") | |
415 | if res is None or "ACS" not in res: | |
416 | raise HwsimSkip("ACS not supported") | |
417 | ||
b49871ec JM |
418 | # For now, make sure the last operating channel was on 2.4 GHz band to get |
419 | # sufficient survey data from mac80211_hwsim. | |
420 | id = dev[0].add_network() | |
421 | dev[0].set_network(id, "mode", "2") | |
422 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
423 | dev[0].set_network(id, "key_mgmt", "NONE") | |
424 | dev[0].set_network(id, "frequency", "2412") | |
425 | dev[0].set_network(id, "scan_freq", "2412") | |
426 | dev[0].select_network(id) | |
427 | wait_ap_ready(dev[0]) | |
428 | dev[0].request("REMOVE_NETWORK all") | |
429 | dev[0].wait_disconnected() | |
430 | ||
33dfdcba JM |
431 | id = dev[0].add_network() |
432 | dev[0].set_network(id, "mode", "2") | |
433 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
434 | dev[0].set_network(id, "key_mgmt", "NONE") | |
435 | dev[0].set_network(id, "frequency", "2417") | |
436 | dev[0].set_network(id, "scan_freq", "2417") | |
437 | dev[0].set_network(id, "acs", "1") | |
438 | dev[0].select_network(id) | |
439 | wait_ap_ready(dev[0]) | |
440 | ||
441 | # ACS prefers channels 1, 6, 11 | |
442 | freq = dev[0].get_status_field('freq') | |
443 | if freq == "2417": | |
444 | raise Exception("Unexpected operating channel selected") | |
445 | ||
446 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq=freq) | |
656f11c7 | 447 | |
9fd6804d | 448 | @remote_compatible |
656f11c7 JM |
449 | def test_wpas_ap_and_assoc_req_p2p_ie(dev): |
450 | """wpa_supplicant AP mode - unexpected P2P IE in Association Request""" | |
451 | try: | |
452 | _test_wpas_ap_and_assoc_req_p2p_ie(dev) | |
453 | finally: | |
454 | dev[1].request("VENDOR_ELEM_REMOVE 13 *") | |
455 | dev[0].request("P2P_SET disabled 0") | |
456 | ||
457 | def _test_wpas_ap_and_assoc_req_p2p_ie(dev): | |
458 | dev[0].request("P2P_SET disabled 1") | |
459 | id = dev[0].add_network() | |
460 | dev[0].set_network(id, "mode", "2") | |
461 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
462 | dev[0].set_network(id, "key_mgmt", "NONE") | |
463 | dev[0].set_network(id, "frequency", "2412") | |
464 | dev[0].set_network(id, "scan_freq", "2412") | |
465 | dev[0].select_network(id) | |
466 | wait_ap_ready(dev[0]) | |
467 | ||
468 | dev[1].request("VENDOR_ELEM_ADD 13 dd04506f9a09") | |
469 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") | |
470 | dev[1].request("DISCONNECT") | |
471 | dev[1].wait_disconnected() | |
472 | ||
473 | dev[0].request("DISCONNECT") | |
474 | dev[0].wait_disconnected() | |
8c9aa2bc | 475 | |
9fd6804d | 476 | @remote_compatible |
8c9aa2bc JM |
477 | def test_wpas_ap_open_ht_disabled(dev): |
478 | """wpa_supplicant AP mode - open network and HT disabled""" | |
479 | id = dev[0].add_network() | |
480 | dev[0].set_network(id, "mode", "2") | |
481 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
482 | dev[0].set_network(id, "key_mgmt", "NONE") | |
483 | dev[0].set_network(id, "frequency", "2412") | |
484 | dev[0].set_network(id, "scan_freq", "2412") | |
485 | dev[0].set_network(id, "disable_ht", "1") | |
486 | dev[0].select_network(id) | |
487 | wait_ap_ready(dev[0]) | |
488 | ||
489 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") | |
490 | hwsim_utils.test_connectivity(dev[0], dev[1]) | |
1f7cd73c JM |
491 | |
492 | def test_wpas_ap_failures(dev): | |
493 | """wpa_supplicant AP mode - failures""" | |
494 | # No SSID configured for AP mode | |
495 | id = dev[0].add_network() | |
496 | dev[0].set_network(id, "mode", "2") | |
497 | dev[0].set_network(id, "key_mgmt", "NONE") | |
498 | dev[0].set_network(id, "frequency", "2412") | |
499 | dev[0].set_network(id, "scan_freq", "2412") | |
500 | dev[0].select_network(id) | |
fab49f61 | 501 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=0.1) |
1f7cd73c JM |
502 | if ev is not None: |
503 | raise Exception("Unexpected connection event") | |
504 | dev[0].request("REMOVE_NETWORK all") | |
505 | ||
506 | # Invalid pbss value(2) for AP mode | |
507 | dev[0].dump_monitor() | |
508 | id = dev[0].add_network() | |
509 | dev[0].set_network(id, "mode", "2") | |
510 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
511 | dev[0].set_network(id, "key_mgmt", "NONE") | |
512 | dev[0].set_network(id, "frequency", "2412") | |
513 | dev[0].set_network(id, "scan_freq", "2412") | |
514 | dev[0].set_network(id, "pbss", "2") | |
515 | dev[0].select_network(id) | |
fab49f61 JM |
516 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED", |
517 | "CTRL-EVENT-DISCONNECTED"], timeout=0.1) | |
1f7cd73c JM |
518 | if ev is not None and "CTRL-EVENT-CONNECTED" in ev: |
519 | raise Exception("Unexpected connection event(2)") | |
520 | dev[0].request("REMOVE_NETWORK all") | |
521 | ||
522 | def test_wpas_ap_oom(dev): | |
523 | """wpa_supplicant AP mode - OOM""" | |
524 | id = dev[0].add_network() | |
525 | dev[0].set_network(id, "mode", "2") | |
526 | dev[0].set_network_quoted(id, "ssid", "wpas-ap") | |
527 | dev[0].set_network_quoted(id, "psk", "1234567890") | |
528 | dev[0].set_network(id, "frequency", "2412") | |
529 | dev[0].set_network(id, "scan_freq", "2412") | |
530 | with alloc_fail(dev[0], 1, "=wpa_supplicant_conf_ap"): | |
531 | dev[0].select_network(id) | |
532 | dev[0].wait_disconnected() | |
533 | dev[0].request("REMOVE_NETWORK all") | |
534 | ||
535 | id = dev[0].add_network() | |
536 | dev[0].set_network(id, "mode", "2") | |
537 | dev[0].set_network_quoted(id, "ssid", "wpas-ap") | |
538 | dev[0].set_network(id, "psk", "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef") | |
539 | dev[0].set_network(id, "frequency", "2412") | |
540 | dev[0].set_network(id, "scan_freq", "2412") | |
541 | with alloc_fail(dev[0], 1, "=wpa_supplicant_conf_ap"): | |
542 | dev[0].select_network(id) | |
543 | dev[0].wait_disconnected() | |
544 | dev[0].request("REMOVE_NETWORK all") | |
545 | ||
200c7693 JM |
546 | if "WEP40" in dev[0].get_capability("group"): |
547 | id = dev[0].add_network() | |
548 | dev[0].set_network(id, "mode", "2") | |
549 | dev[0].set_network_quoted(id, "ssid", "wpas-ap") | |
550 | dev[0].set_network(id, "key_mgmt", "NONE") | |
551 | dev[0].set_network_quoted(id, "wep_key0", "hello") | |
552 | dev[0].set_network(id, "frequency", "2412") | |
553 | dev[0].set_network(id, "scan_freq", "2412") | |
554 | with alloc_fail(dev[0], 1, "=wpa_supplicant_conf_ap"): | |
555 | dev[0].select_network(id) | |
556 | dev[0].wait_disconnected() | |
557 | dev[0].request("REMOVE_NETWORK all") | |
1f7cd73c JM |
558 | |
559 | wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') | |
560 | wpas.interface_add("wlan5") | |
561 | wpas.request("SET manufacturer test") | |
562 | wpas.request("SET model_name test") | |
563 | wpas.request("SET model_number test") | |
564 | wpas.request("SET serial_number test") | |
565 | wpas.request("SET serial_number test") | |
566 | wpas.request("SET serial_number test") | |
567 | wpas.request("SET ap_vendor_elements dd0411223301") | |
568 | id = wpas.add_network() | |
569 | wpas.set_network(id, "mode", "2") | |
570 | wpas.set_network_quoted(id, "ssid", "wpas-ap") | |
571 | wpas.set_network(id, "key_mgmt", "NONE") | |
572 | wpas.set_network(id, "frequency", "2412") | |
573 | wpas.set_network(id, "scan_freq", "2412") | |
574 | ||
575 | for i in range(5): | |
576 | with alloc_fail(wpas, i, "=wpa_supplicant_conf_ap"): | |
577 | wpas.select_network(id) | |
fab49f61 JM |
578 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED", |
579 | "CTRL-EVENT-DISCONNECTED"], timeout=1) | |
1f7cd73c JM |
580 | wpas.request("DISCONNECT") |
581 | wpas.wait_disconnected() | |
582 | ||
583 | def test_wpas_ap_params(dev): | |
584 | """wpa_supplicant AP mode - parameters""" | |
585 | wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') | |
586 | wpas.interface_add("wlan5") | |
587 | wpas.request("SET manufacturer test") | |
588 | wpas.request("SET model_name test") | |
589 | wpas.request("SET model_number test") | |
590 | wpas.request("SET serial_number test") | |
591 | wpas.request("SET serial_number test") | |
592 | wpas.request("SET serial_number test") | |
593 | wpas.request("SET ap_vendor_elements dd0411223301") | |
594 | id = wpas.add_network() | |
595 | wpas.set_network(id, "mode", "2") | |
596 | wpas.set_network_quoted(id, "ssid", "wpas-ap") | |
597 | wpas.set_network(id, "key_mgmt", "NONE") | |
598 | wpas.set_network(id, "frequency", "2412") | |
599 | wpas.set_network(id, "scan_freq", "2412") | |
600 | wpas.select_network(id) | |
601 | wpas.wait_connected() | |
602 | wpas.request("DISCONNECT") | |
603 | wpas.wait_disconnected() | |
604 | ||
605 | wpas.request("SET beacon_int 200 3") | |
606 | wpas.request("SET dtim_period 3") | |
607 | wpas.select_network(id) | |
608 | wpas.wait_connected() | |
609 | wpas.request("DISCONNECT") | |
610 | wpas.wait_disconnected() | |
611 | ||
612 | wpas.set_network(id, "beacon_int", "300") | |
613 | wpas.set_network(id, "dtim_period", "2") | |
614 | wpas.select_network(id) | |
615 | wpas.wait_connected() | |
616 | if "---- AP ----" not in wpas.request("PMKSA"): | |
617 | raise Exception("AP section missing from PMKSA output") | |
618 | if "OK" not in wpas.request("PMKSA_FLUSH"): | |
619 | raise Exception("PMKSA_FLUSH failed") | |
620 | wpas.request("DISCONNECT") | |
621 | wpas.wait_disconnected() | |
92607e91 JM |
622 | |
623 | def test_wpas_ap_global_sta(dev): | |
624 | """wpa_supplicant AP mode - STA commands on global control interface""" | |
625 | id = dev[0].add_network() | |
626 | dev[0].set_network(id, "mode", "2") | |
627 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
628 | dev[0].set_network(id, "key_mgmt", "NONE") | |
629 | dev[0].set_network(id, "frequency", "2412") | |
630 | dev[0].set_network(id, "scan_freq", "2412") | |
631 | dev[0].select_network(id) | |
632 | wait_ap_ready(dev[0]) | |
633 | ||
634 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") | |
635 | ||
636 | addr1 = dev[1].own_addr() | |
637 | res = dev[0].global_request("STA " + addr1) | |
638 | if "UNKNOWN COMMAND" in res: | |
639 | raise Exception("STA command not known on global control interface") | |
640 | res = dev[0].global_request("STA-FIRST") | |
641 | if "UNKNOWN COMMAND" in res: | |
642 | raise Exception("STA-FIRST command not known on global control interface") | |
643 | res = dev[0].global_request("STA-NEXT " + addr1) | |
644 | if "UNKNOWN COMMAND" in res: | |
645 | raise Exception("STA-NEXT command not known on global control interface") | |
646 | dev[1].request("DISCONNECT") | |
647 | dev[1].wait_disconnected() | |
648 | dev[0].request("DISCONNECT") | |
649 | dev[0].wait_disconnected() | |
1722a46b JM |
650 | |
651 | def test_wpas_ap_5ghz(dev): | |
652 | """wpa_supplicant AP mode - 5 GHz""" | |
653 | try: | |
654 | _test_wpas_ap_5ghz(dev) | |
655 | finally: | |
656 | set_country("00") | |
657 | dev[0].request("SET country 00") | |
658 | dev[1].flush_scan_cache() | |
659 | ||
660 | def _test_wpas_ap_5ghz(dev): | |
661 | set_country("US") | |
662 | dev[0].request("SET country US") | |
663 | id = dev[0].add_network() | |
664 | dev[0].set_network(id, "mode", "2") | |
665 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-5ghz") | |
666 | dev[0].set_network(id, "key_mgmt", "NONE") | |
667 | dev[0].set_network(id, "frequency", "5180") | |
668 | dev[0].set_network(id, "scan_freq", "5180") | |
669 | dev[0].select_network(id) | |
670 | wait_ap_ready(dev[0]) | |
671 | ||
672 | dev[1].connect("wpas-ap-5ghz", key_mgmt="NONE", scan_freq="5180") | |
673 | dev[1].request("DISCONNECT") | |
674 | dev[1].wait_disconnected() | |
2ff712fc JB |
675 | |
676 | def test_wpas_ap_open_vht80(dev): | |
677 | """wpa_supplicant AP mode - VHT 80 MHz""" | |
678 | id = dev[0].add_network() | |
679 | dev[0].set("country", "FI") | |
680 | try: | |
681 | dev[0].set_network(id, "mode", "2") | |
682 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
683 | dev[0].set_network(id, "key_mgmt", "NONE") | |
684 | dev[0].set_network(id, "frequency", "5180") | |
685 | dev[0].set_network(id, "scan_freq", "5180") | |
686 | dev[0].set_network(id, "vht", "1") | |
687 | dev[0].set_network(id, "vht_center_freq1", "5210") | |
688 | dev[0].set_network(id, "max_oper_chwidth", "1") | |
689 | dev[0].set_network(id, "ht40", "1") | |
690 | dev[0].select_network(id) | |
691 | wait_ap_ready(dev[0]) | |
692 | ||
693 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="5180") | |
694 | sig = dev[1].request("SIGNAL_POLL").splitlines() | |
695 | hwsim_utils.test_connectivity(dev[0], dev[1]) | |
696 | dev[1].request("DISCONNECT") | |
697 | dev[1].wait_disconnected() | |
698 | if "FREQUENCY=5180" not in sig: | |
699 | raise Exception("Unexpected SIGNAL_POLL value(1): " + str(sig)) | |
700 | if "WIDTH=80 MHz" not in sig: | |
701 | raise Exception("Unexpected SIGNAL_POLL value(2): " + str(sig)) | |
702 | finally: | |
703 | set_country("00") | |
704 | dev[0].set("country", "00") | |
705 | dev[1].flush_scan_cache() | |
3d745aa7 JM |
706 | |
707 | def test_wpas_ap_no_ht(dev): | |
708 | """wpa_supplicant AP mode - HT disabled""" | |
709 | id = dev[0].add_network() | |
710 | dev[0].set_network(id, "mode", "2") | |
711 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
712 | dev[0].set_network(id, "key_mgmt", "NONE") | |
713 | dev[0].set_network(id, "frequency", "2412") | |
714 | dev[0].set_network(id, "scan_freq", "2412") | |
715 | dev[0].set_network(id, "ht", "0") | |
716 | dev[0].set_network(id, "wps_disabled", "1") | |
717 | dev[0].select_network(id) | |
718 | wait_ap_ready(dev[0]) | |
719 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") | |
720 | sig = dev[1].request("SIGNAL_POLL").splitlines() | |
721 | dev[1].request("DISCONNECT") | |
722 | dev[1].wait_disconnected() | |
723 | dev[0].request("REMOVE_NETWORK all") | |
724 | dev[0].wait_disconnected() | |
725 | ||
726 | id = dev[0].add_network() | |
727 | dev[0].set_network(id, "mode", "2") | |
728 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
729 | dev[0].set_network(id, "key_mgmt", "NONE") | |
730 | dev[0].set_network(id, "frequency", "2412") | |
731 | dev[0].set_network(id, "scan_freq", "2412") | |
732 | dev[0].set_network(id, "wps_disabled", "1") | |
733 | dev[0].select_network(id) | |
734 | wait_ap_ready(dev[0]) | |
735 | dev[1].flush_scan_cache() | |
736 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412") | |
737 | sig2 = dev[1].request("SIGNAL_POLL").splitlines() | |
738 | dev[1].request("DISCONNECT") | |
739 | dev[1].wait_disconnected() | |
740 | dev[0].request("REMOVE_NETWORK all") | |
741 | dev[0].wait_disconnected() | |
742 | ||
743 | if "WIDTH=20 MHz (no HT)" not in sig: | |
744 | raise Exception("HT was not disabled: " + str(sig)) | |
745 | if "WIDTH=20 MHz" not in sig2: | |
746 | raise Exception("HT was not enabled: " + str(sig2)) | |
440e9f0b AO |
747 | |
748 | def test_wpas_ap_async_fail(dev): | |
749 | """wpa_supplicant AP mode - Async failure""" | |
750 | id = dev[0].add_network() | |
751 | dev[0].set("country", "FI") | |
752 | try: | |
753 | dev[0].set_network(id, "mode", "2") | |
754 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
755 | dev[0].set_network(id, "key_mgmt", "NONE") | |
756 | dev[0].set_network(id, "frequency", "5180") | |
757 | dev[0].set_network(id, "scan_freq", "5180") | |
758 | dev[0].set_network(id, "vht", "1") | |
759 | dev[0].set_network(id, "vht_center_freq1", "5210") | |
760 | dev[0].set_network(id, "max_oper_chwidth", "1") | |
761 | dev[0].set_network(id, "ht40", "1") | |
762 | ||
763 | with alloc_fail(dev[0], 1, | |
764 | "nl80211_get_scan_results;ieee80211n_check_scan"): | |
765 | dev[0].select_network(id) | |
766 | dev[0].wait_disconnected() | |
767 | finally: | |
689db8b3 | 768 | clear_regdom_dev(dev) |
be907f72 JM |
769 | |
770 | def test_wpas_ap_sae(dev): | |
771 | """wpa_supplicant AP mode - SAE using psk""" | |
772 | run_wpas_ap_sae(dev, False) | |
773 | ||
774 | def test_wpas_ap_sae_password(dev): | |
775 | """wpa_supplicant AP mode - SAE using sae_password""" | |
776 | run_wpas_ap_sae(dev, True) | |
777 | ||
3fa701b5 JM |
778 | def test_wpas_ap_sae_pwe_1(dev): |
779 | """wpa_supplicant AP mode - SAE using sae_password and sae_pwe=1""" | |
780 | try: | |
781 | dev[0].set("sae_pwe", "1") | |
782 | dev[1].set("sae_pwe", "1") | |
783 | run_wpas_ap_sae(dev, True, sae_password_id=True) | |
784 | finally: | |
785 | dev[0].set("sae_pwe", "0") | |
786 | dev[1].set("sae_pwe", "0") | |
787 | ||
788 | def run_wpas_ap_sae(dev, sae_password, sae_password_id=False): | |
be907f72 JM |
789 | if "SAE" not in dev[0].get_capability("auth_alg"): |
790 | raise HwsimSkip("SAE not supported") | |
791 | if "SAE" not in dev[1].get_capability("auth_alg"): | |
792 | raise HwsimSkip("SAE not supported") | |
793 | dev[0].request("SET sae_groups ") | |
794 | id = dev[0].add_network() | |
795 | dev[0].set_network(id, "mode", "2") | |
796 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-sae") | |
797 | dev[0].set_network(id, "proto", "WPA2") | |
798 | dev[0].set_network(id, "key_mgmt", "SAE") | |
799 | dev[0].set_network(id, "pairwise", "CCMP") | |
800 | dev[0].set_network(id, "group", "CCMP") | |
801 | if sae_password: | |
802 | dev[0].set_network_quoted(id, "sae_password", "12345678") | |
803 | else: | |
804 | dev[0].set_network_quoted(id, "psk", "12345678") | |
3fa701b5 JM |
805 | if sae_password_id: |
806 | pw_id = "pw id" | |
807 | dev[0].set_network_quoted(id, "sae_password_id", pw_id) | |
808 | else: | |
809 | pw_id = None | |
be907f72 JM |
810 | dev[0].set_network(id, "frequency", "2412") |
811 | dev[0].set_network(id, "scan_freq", "2412") | |
812 | dev[0].set_network(id, "wps_disabled", "1") | |
813 | dev[0].select_network(id) | |
814 | wait_ap_ready(dev[0]) | |
815 | ||
816 | dev[1].request("SET sae_groups ") | |
3fa701b5 JM |
817 | dev[1].connect("wpas-ap-sae", key_mgmt="SAE", sae_password="12345678", |
818 | sae_password_id=pw_id, scan_freq="2412") | |
e9d2cd71 JM |
819 | |
820 | def test_wpas_ap_scan(dev, apdev): | |
821 | """wpa_supplicant AP mode and scanning""" | |
822 | dev[0].flush_scan_cache() | |
823 | ||
824 | hapd = hostapd.add_ap(apdev[0], {"ssid": "open"}) | |
825 | bssid = hapd.own_addr() | |
826 | ||
827 | id = dev[0].add_network() | |
828 | dev[0].set_network(id, "mode", "2") | |
829 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
830 | dev[0].set_network(id, "key_mgmt", "NONE") | |
831 | dev[0].set_network(id, "frequency", "2412") | |
832 | dev[0].set_network(id, "scan_freq", "2412") | |
833 | dev[0].select_network(id) | |
834 | wait_ap_ready(dev[0]) | |
835 | dev[0].dump_monitor() | |
836 | ||
837 | if "OK" not in dev[0].request("SCAN freq=2412"): | |
838 | raise Exception("SCAN command not accepted") | |
839 | ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS", | |
840 | "CTRL-EVENT-SCAN-FAILED"], 15) | |
841 | if ev is None: | |
842 | raise Exception("Scan result timed out") | |
843 | if "CTRL-EVENT-SCAN-FAILED ret=-95" in ev: | |
844 | # Scanning in AP mode not supported | |
845 | return | |
846 | if "CTRL-EVENT-SCAN-FAILED" in ev: | |
847 | raise Exception("Unexpected scan failure reason: " + ev) | |
848 | if "CTRL-EVENT-SCAN-RESULTS" in ev: | |
849 | bss = dev[0].get_bss(bssid) | |
850 | if not bss: | |
851 | raise Exception("AP not found in scan") | |
5cf5680e JM |
852 | |
853 | def test_wpas_ap_sae(dev): | |
854 | """wpa_supplicant AP mode - SAE using psk""" | |
855 | run_wpas_ap_sae(dev, False) | |
856 | ||
857 | def test_wpas_ap_sae_and_psk_transition_disable(dev): | |
858 | """wpa_supplicant AP mode - SAE+PSK transition disable indication""" | |
859 | if "SAE" not in dev[0].get_capability("auth_alg"): | |
860 | raise HwsimSkip("SAE not supported") | |
861 | if "SAE" not in dev[1].get_capability("auth_alg"): | |
862 | raise HwsimSkip("SAE not supported") | |
863 | dev[0].set("sae_groups", "") | |
864 | id = dev[0].add_network() | |
865 | dev[0].set_network(id, "mode", "2") | |
866 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-sae") | |
867 | dev[0].set_network(id, "proto", "WPA2") | |
868 | dev[0].set_network(id, "key_mgmt", "SAE") | |
869 | dev[0].set_network(id, "transition_disable", "1") | |
870 | dev[0].set_network(id, "ieee80211w", "1") | |
871 | dev[0].set_network(id, "pairwise", "CCMP") | |
872 | dev[0].set_network(id, "group", "CCMP") | |
873 | dev[0].set_network_quoted(id, "psk", "12345678") | |
874 | dev[0].set_network(id, "frequency", "2412") | |
875 | dev[0].set_network(id, "scan_freq", "2412") | |
876 | dev[0].set_network(id, "wps_disabled", "1") | |
877 | dev[0].select_network(id) | |
878 | wait_ap_ready(dev[0]) | |
879 | ||
880 | dev[1].set("sae_groups", "") | |
881 | dev[1].connect("wpas-ap-sae", key_mgmt="SAE WPA-PSK", | |
882 | psk="12345678", ieee80211w="1", | |
883 | scan_freq="2412") | |
884 | ev = dev[1].wait_event(["TRANSITION-DISABLE"], timeout=1) | |
885 | if ev is None: | |
886 | raise Exception("Transition disable not indicated") | |
887 | if ev.split(' ')[1] != "01": | |
888 | raise Exception("Unexpected transition disable bitmap: " + ev) | |
889 | ||
890 | val = dev[1].get_network(id, "ieee80211w") | |
891 | if val != "2": | |
892 | raise Exception("Unexpected ieee80211w value: " + val) | |
893 | val = dev[1].get_network(id, "key_mgmt") | |
894 | if val != "SAE": | |
895 | raise Exception("Unexpected key_mgmt value: " + val) | |
896 | val = dev[1].get_network(id, "group") | |
897 | if val != "CCMP": | |
898 | raise Exception("Unexpected group value: " + val) | |
899 | val = dev[1].get_network(id, "proto") | |
900 | if val != "RSN": | |
901 | raise Exception("Unexpected proto value: " + val) | |
902 | ||
903 | dev[1].request("DISCONNECT") | |
904 | dev[1].wait_disconnected() | |
905 | dev[1].request("RECONNECT") | |
906 | dev[1].wait_connected() |