]> git.ipfire.org Git - thirdparty/hostap.git/blob - tests/hwsim/test_wpas_ap.py
tests: Transition disable
[thirdparty/hostap.git] / tests / hwsim / test_wpas_ap.py
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
7 import hostapd
8 from remotehost import remote_compatible
9 import time
10 import logging
11 logger = logging.getLogger()
12
13 import hwsim_utils
14 from utils import HwsimSkip, alloc_fail, clear_regdom_dev
15 from wpasupplicant import WpaSupplicant
16 from test_p2p_channel import set_country
17 from test_wep import check_wep_capa
18
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
24 def test_wpas_ap_open(dev):
25 """wpa_supplicant AP mode - open network"""
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
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)
40 wait_ap_ready(dev[0])
41
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
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")
49 hwsim_utils.test_connectivity(dev[0], dev[1])
50 hwsim_utils.test_connectivity(dev[1], dev[2])
51
52 addr1 = dev[1].p2p_interface_addr()
53 addr2 = dev[2].p2p_interface_addr()
54 addrs = [addr1, addr2]
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)
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")
80 dev[1].request("DISCONNECT")
81 dev[2].request("DISCONNECT")
82
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
105 @remote_compatible
106 def test_wpas_ap_wep(dev):
107 """wpa_supplicant AP mode - WEP"""
108 check_wep_capa(dev[0])
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)
117 wait_ap_ready(dev[0])
118
119 dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"',
120 scan_freq="2412")
121 hwsim_utils.test_connectivity(dev[0], dev[1])
122 dev[1].request("DISCONNECT")
123
124 @remote_compatible
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
137 @remote_compatible
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)
146 wait_ap_ready(dev[0])
147 dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462")
148 dev[1].request("DISCONNECT")
149
150 @remote_compatible
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)
173 wait_ap_ready(dev[0])
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")
195 dev[1].wait_connected(timeout=30, error="WPS PBC operation timed out")
196 hwsim_utils.test_connectivity(dev[0], dev[1])
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)
205 hwsim_utils.test_connectivity(dev[1], dev[2])
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)
220 dev[1].wait_connected(timeout=30)
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)
226 dev[1].wait_connected(timeout=30)
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")
243 dev[2].wait_disconnected(timeout=10)
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")
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")
270
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
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")
329
330 @remote_compatible
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
347 def test_wpas_ap_dfs(dev):
348 """wpa_supplicant AP mode - DFS"""
349 if dev[0].get_mcc() > 1:
350 raise HwsimSkip("DFS is not supported with multi channel contexts")
351
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")
388 dev[1].wait_regdom(country_ie=True)
389 dev[0].request("DISCONNECT")
390 dev[1].disconnect_and_stop_scan()
391
392 @remote_compatible
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()
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
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
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)
447
448 @remote_compatible
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()
475
476 @remote_compatible
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])
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)
501 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=0.1)
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)
516 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
517 "CTRL-EVENT-DISCONNECTED"], timeout=0.1)
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
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")
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)
578 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
579 "CTRL-EVENT-DISCONNECTED"], timeout=1)
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()
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()
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()
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()
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))
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:
768 clear_regdom_dev(dev)
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
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):
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")
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
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 ")
817 dev[1].connect("wpas-ap-sae", key_mgmt="SAE", sae_password="12345678",
818 sae_password_id=pw_id, scan_freq="2412")
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")
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()