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