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
17from test_ap_psk import find_wpas_process, read_process_memory, verify_not_present, get_key_locations
18
19def 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
24def set_regdom(dev, country):
25    dev.set("country", country)
26    for i in range(5):
27        ev = dev.wait_event(["CTRL-EVENT-REGDOM-CHANGE"], timeout=5)
28        if not ev:
29            return
30        if "alpha2=" + country in ev:
31            return
32    logger.info("No regdom change event indicated")
33
34def log_channel_info(dev):
35    gen = dev.get_status_field('wifi_generation')
36    if gen:
37        logger.info("Wi-Fi Generation: " + gen)
38    sig = dev.request("SIGNAL_POLL").splitlines()
39    logger.info(sig)
40
41def test_wpas_ap_open(dev):
42    """wpa_supplicant AP mode - open network"""
43    if "FAIL" not in dev[0].request("DEAUTHENTICATE 00:11:22:33:44:55"):
44        raise Exception("Unexpected DEAUTHENTICATE accepted")
45    if "FAIL" not in dev[0].request("DISASSOCIATE 00:11:22:33:44:55"):
46        raise Exception("Unexpected DISASSOCIATE accepted")
47    if "FAIL" not in dev[0].request("CHAN_SWITCH 0 2432"):
48        raise Exception("Unexpected CHAN_SWITCH accepted")
49
50    id = dev[0].add_network()
51    dev[0].set_network(id, "mode", "2")
52    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
53    dev[0].set_network(id, "key_mgmt", "NONE")
54    dev[0].set_network(id, "frequency", "2412")
55    dev[0].set_network(id, "scan_freq", "2412")
56    dev[0].select_network(id)
57    wait_ap_ready(dev[0])
58
59    if "FAIL" not in dev[0].request("DEAUTHENTICATE foo"):
60        raise Exception("Invalid DEAUTHENTICATE accepted")
61    if "FAIL" not in dev[0].request("DISASSOCIATE foo"):
62        raise Exception("Invalid DISASSOCIATE accepted")
63
64    dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
65    dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
66    hwsim_utils.test_connectivity(dev[0], dev[1])
67    hwsim_utils.test_connectivity(dev[1], dev[2])
68
69    addr1 = dev[1].p2p_interface_addr()
70    addr2 = dev[2].p2p_interface_addr()
71    addrs = [addr1, addr2]
72    sta = dev[0].get_sta(None)
73    if sta['addr'] not in addrs:
74        raise Exception("Unexpected STA address")
75    sta1 = dev[0].get_sta(sta['addr'])
76    if sta1['addr'] not in addrs:
77        raise Exception("Unexpected STA address")
78    sta2 = dev[0].get_sta(sta['addr'], next=True)
79    if sta2['addr'] not in addrs:
80        raise Exception("Unexpected STA2 address")
81    sta3 = dev[0].get_sta(sta2['addr'], next=True)
82    if len(sta3) != 0:
83        raise Exception("Unexpected STA iteration result (did not stop)")
84
85    status = dev[0].get_status()
86    if status['mode'] != "AP":
87        raise Exception("Unexpected status mode")
88
89    dev[1].dump_monitor()
90    dev[2].dump_monitor()
91    dev[0].request("DEAUTHENTICATE " + addr1)
92    dev[0].request("DISASSOCIATE " + addr2)
93    dev[1].wait_disconnected(timeout=10)
94    dev[2].wait_disconnected(timeout=10)
95    dev[1].wait_connected(timeout=10, error="Reconnection timed out")
96    dev[2].wait_connected(timeout=10, error="Reconnection timed out")
97    dev[1].request("DISCONNECT")
98    dev[2].request("DISCONNECT")
99
100def test_wpas_ap_open_isolate(dev):
101    """wpa_supplicant AP mode - open network with client isolation"""
102    try:
103        dev[0].set("ap_isolate", "1")
104        id = dev[0].add_network()
105        dev[0].set_network(id, "mode", "2")
106        dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
107        dev[0].set_network(id, "key_mgmt", "NONE")
108        dev[0].set_network(id, "frequency", "2412")
109        dev[0].set_network(id, "scan_freq", "2412")
110        dev[0].select_network(id)
111        wait_ap_ready(dev[0])
112
113        dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
114        dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
115        hwsim_utils.test_connectivity(dev[0], dev[1])
116        hwsim_utils.test_connectivity(dev[0], dev[2])
117        hwsim_utils.test_connectivity(dev[1], dev[2], success_expected=False,
118                                      timeout=1)
119    finally:
120        dev[0].set("ap_isolate", "0")
121
122@remote_compatible
123def test_wpas_ap_wep(dev):
124    """wpa_supplicant AP mode - WEP"""
125    check_wep_capa(dev[0])
126    id = dev[0].add_network()
127    dev[0].set_network(id, "mode", "2")
128    dev[0].set_network_quoted(id, "ssid", "wpas-ap-wep")
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].set_network_quoted(id, "wep_key0", "hello")
133    dev[0].select_network(id)
134    wait_ap_ready(dev[0])
135
136    dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"',
137                   scan_freq="2412")
138    hwsim_utils.test_connectivity(dev[0], dev[1])
139    dev[1].request("DISCONNECT")
140
141@remote_compatible
142def test_wpas_ap_no_ssid(dev):
143    """wpa_supplicant AP mode - invalid network configuration"""
144    id = dev[0].add_network()
145    dev[0].set_network(id, "mode", "2")
146    dev[0].set_network(id, "key_mgmt", "NONE")
147    dev[0].set_network(id, "frequency", "2412")
148    dev[0].set_network(id, "scan_freq", "2412")
149    dev[0].select_network(id)
150    ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
151    if ev is not None:
152        raise Exception("Unexpected AP start")
153
154@remote_compatible
155def test_wpas_ap_default_frequency(dev):
156    """wpa_supplicant AP mode - default frequency"""
157    id = dev[0].add_network()
158    dev[0].set_network(id, "mode", "2")
159    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
160    dev[0].set_network(id, "key_mgmt", "NONE")
161    dev[0].set_network(id, "scan_freq", "2412")
162    dev[0].select_network(id)
163    wait_ap_ready(dev[0])
164    dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462")
165    dev[1].request("DISCONNECT")
166
167@remote_compatible
168def test_wpas_ap_invalid_frequency(dev):
169    """wpa_supplicant AP mode - invalid frequency configuration"""
170    id = dev[0].add_network()
171    dev[0].set_network(id, "mode", "2")
172    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
173    dev[0].set_network(id, "key_mgmt", "NONE")
174    dev[0].set_network(id, "frequency", "2413")
175    dev[0].set_network(id, "scan_freq", "2412")
176    dev[0].select_network(id)
177    ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
178    if ev is not None:
179        raise Exception("Unexpected AP start")
180
181def test_wpas_ap_wps(dev):
182    """wpa_supplicant AP mode - WPS operations"""
183    id = dev[0].add_network()
184    dev[0].set_network(id, "mode", "2")
185    dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
186    dev[0].set_network_quoted(id, "psk", "1234567890")
187    dev[0].set_network(id, "frequency", "2412")
188    dev[0].set_network(id, "scan_freq", "2412")
189    dev[0].select_network(id)
190    wait_ap_ready(dev[0])
191    bssid = dev[0].p2p_interface_addr()
192
193    logger.info("Test PBC mode start/stop")
194    if "FAIL" not in dev[0].request("WPS_CANCEL"):
195        raise Exception("Unexpected WPS_CANCEL success")
196    dev[0].request("WPS_PBC")
197    ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
198    if ev is None:
199        raise Exception("PBC mode start timeout")
200    if "OK" not in dev[0].request("WPS_CANCEL"):
201        raise Exception("Unexpected WPS_CANCEL failure")
202    ev = dev[0].wait_event(["WPS-TIMEOUT"])
203    if ev is None:
204        raise Exception("PBC mode disabling timeout")
205
206    logger.info("Test PBC protocol run")
207    dev[0].request("WPS_PBC")
208    ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
209    if ev is None:
210        raise Exception("PBC mode start timeout")
211    dev[1].request("WPS_PBC")
212    dev[1].wait_connected(timeout=30, error="WPS PBC operation timed out")
213    dev[0].wait_sta(addr=dev[1].own_addr())
214    hwsim_utils.test_connectivity(dev[0], dev[1])
215
216    logger.info("Test AP PIN to learn configuration")
217    pin = dev[0].request("WPS_AP_PIN random")
218    if "FAIL" in pin:
219        raise Exception("Could not generate random AP PIN")
220    if pin not in dev[0].request("WPS_AP_PIN get"):
221        raise Exception("Could not fetch current AP PIN")
222    dev[2].wps_reg(bssid, pin)
223    dev[0].wait_sta(addr=dev[2].own_addr())
224    hwsim_utils.test_connectivity(dev[1], dev[2])
225
226    dev[1].request("REMOVE_NETWORK all")
227    dev[2].request("REMOVE_NETWORK all")
228    dev[0].wait_sta_disconnect()
229    dev[0].wait_sta_disconnect()
230
231    logger.info("Test AP PIN operations")
232    dev[0].request("WPS_AP_PIN disable")
233    dev[0].request("WPS_AP_PIN set " + pin + " 1")
234    time.sleep(1.1)
235    if "FAIL" not in dev[0].request("WPS_AP_PIN get"):
236        raise Exception("AP PIN unexpectedly still enabled")
237
238    pin = dev[1].wps_read_pin()
239    dev[0].request("WPS_PIN any " + pin)
240    dev[1].request("WPS_PIN any " + pin)
241    dev[1].wait_connected(timeout=30)
242    dev[0].wait_sta(addr=dev[1].own_addr())
243    dev[1].request("REMOVE_NETWORK all")
244    dev[1].wait_disconnected()
245    dev[0].wait_sta_disconnect(addr=dev[1].own_addr())
246    dev[1].dump_monitor()
247
248    dev[0].request("WPS_PIN any " + pin + " 100")
249    dev[1].request("WPS_PIN any " + pin)
250    dev[1].wait_connected(timeout=30)
251    dev[0].wait_sta(addr=dev[1].own_addr())
252    dev[1].request("REMOVE_NETWORK all")
253    dev[1].wait_disconnected()
254    dev[0].wait_sta_disconnect(addr=dev[1].own_addr())
255    dev[1].dump_monitor()
256
257    dev[0].request("WPS_AP_PIN set 12345670")
258    dev[0].dump_monitor()
259
260    runs = ("88887777", "12340000", "00000000", "12345670")
261    for pin in runs:
262        logger.info("Try AP PIN " + pin)
263        dev[2].dump_monitor()
264        dev[2].request("WPS_REG " + bssid + " " + pin)
265        ev = dev[2].wait_event(["WPS-SUCCESS", "WPS-FAIL msg"], timeout=15)
266        if ev is None:
267            raise Exception("WPS operation timed out")
268        if "WPS-SUCCESS" in ev:
269            raise Exception("WPS operation succeeded unexpectedly")
270        dev[2].wait_disconnected(timeout=10)
271        dev[2].request("WPS_CANCEL")
272        dev[2].request("REMOVE_NETWORK all")
273    ev = dev[0].wait_event(["WPS-AP-SETUP-LOCKED"])
274    if ev is None:
275        raise Exception("WPS AP PIN not locked")
276
277    dev[0].dump_monitor()
278    logger.info("Test random AP PIN timeout")
279    pin = dev[0].request("WPS_AP_PIN random 1")
280    if "FAIL" in pin:
281        raise Exception("Could not generate random AP PIN")
282    res = dev[0].request("WPS_AP_PIN get")
283    if pin not in res:
284        raise Exception("Could not fetch current AP PIN")
285    for i in range(10):
286        time.sleep(0.2)
287        res = dev[0].request("WPS_AP_PIN get")
288        if "FAIL" in res:
289            break
290    if "FAIL" not in res:
291        raise Exception("WPS_AP_PIN random timeout did not work")
292
293    if "FAIL" not in dev[0].request("WPS_AP_PIN foo"):
294        raise Exception("Invalid WPS_AP_PIN command not rejected")
295    if "FAIL" not in dev[0].request("WPS_AP_PIN set"):
296        raise Exception("Invalid WPS_AP_PIN command not rejected")
297
298def test_wpas_ap_wps_frag(dev):
299    """wpa_supplicant AP mode - WPS operations with fragmentation"""
300    id = dev[0].add_network()
301    dev[0].set_network(id, "mode", "2")
302    dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
303    dev[0].set_network_quoted(id, "psk", "1234567890")
304    dev[0].set_network(id, "frequency", "2412")
305    dev[0].set_network(id, "scan_freq", "2412")
306    dev[0].set_network(id, "fragment_size", "300")
307    dev[0].select_network(id)
308    wait_ap_ready(dev[0])
309    bssid = dev[0].own_addr()
310
311    pin = dev[1].wps_read_pin()
312    dev[0].request("WPS_PIN any " + pin)
313    dev[1].scan_for_bss(bssid, freq="2412")
314    dev[1].request("WPS_PIN " + bssid + " " + pin)
315    dev[1].wait_connected(timeout=30)
316
317def test_wpas_ap_wps_pbc_overlap(dev):
318    """wpa_supplicant AP mode - WPS operations with PBC overlap"""
319    id = dev[0].add_network()
320    dev[0].set_network(id, "mode", "2")
321    dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
322    dev[0].set_network_quoted(id, "psk", "1234567890")
323    dev[0].set_network(id, "frequency", "2412")
324    dev[0].set_network(id, "scan_freq", "2412")
325    dev[0].select_network(id)
326    wait_ap_ready(dev[0])
327    bssid = dev[0].p2p_interface_addr()
328
329    dev[1].scan_for_bss(bssid, freq="2412")
330    dev[1].dump_monitor()
331    dev[2].scan_for_bss(bssid, freq="2412")
332    dev[2].dump_monitor()
333    dev[0].request("WPS_PBC")
334    dev[1].request("WPS_PBC " + bssid)
335    dev[2].request("WPS_PBC " + bssid)
336
337    ev = dev[1].wait_event(["WPS-M2D"], timeout=15)
338    if ev is None:
339        raise Exception("PBC session overlap not detected (dev1)")
340    if "config_error=12" not in ev:
341        raise Exception("PBC session overlap not correctly reported (dev1)")
342
343    ev = dev[2].wait_event(["WPS-M2D"], timeout=15)
344    if ev is None:
345        raise Exception("PBC session overlap not detected (dev2)")
346    if "config_error=12" not in ev:
347        raise Exception("PBC session overlap not correctly reported (dev2)")
348
349    if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC"):
350        raise Exception("WPS_PBC(AP) accepted during overlap")
351    if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC any"):
352        raise Exception("WPS_PBC(AP) accepted during overlap")
353    dev[0].request("WPS_CANCEL")
354    dev[1].request("WPS_CANCEL")
355    dev[2].request("WPS_CANCEL")
356
357@remote_compatible
358def test_wpas_ap_wps_disabled(dev):
359    """wpa_supplicant AP mode - WPS disabled"""
360    id = dev[0].add_network()
361    dev[0].set_network(id, "mode", "2")
362    dev[0].set_network_quoted(id, "ssid", "wpas-ap-no-wps")
363    dev[0].set_network_quoted(id, "psk", "12345678")
364    dev[0].set_network(id, "frequency", "2412")
365    dev[0].set_network(id, "scan_freq", "2412")
366    dev[0].set_network(id, "wps_disabled", "1")
367    dev[0].select_network(id)
368    wait_ap_ready(dev[0])
369
370    dev[1].connect("wpas-ap-no-wps", psk="12345678", scan_freq="2412")
371    dev[1].request("DISCONNECT")
372    dev[1].wait_disconnected()
373
374def test_wpas_ap_dfs(dev):
375    """wpa_supplicant AP mode - DFS"""
376    if dev[0].get_mcc() > 1:
377        raise HwsimSkip("DFS is not supported with multi channel contexts")
378
379    try:
380        _test_wpas_ap_dfs(dev)
381    finally:
382        set_country("00")
383        dev[0].request("SET country 00")
384        dev[1].flush_scan_cache()
385
386def _test_wpas_ap_dfs(dev):
387    set_country("US")
388    dev[0].request("SET country US")
389    id = dev[0].add_network()
390    dev[0].set_network(id, "mode", "2")
391    dev[0].set_network_quoted(id, "ssid", "wpas-ap-dfs")
392    dev[0].set_network(id, "key_mgmt", "NONE")
393    dev[0].set_network(id, "frequency", "5260")
394    dev[0].set_network(id, "scan_freq", "5260")
395    dev[0].select_network(id)
396
397    ev = dev[0].wait_event(["DFS-CAC-START"])
398    if ev is None:
399        # For now, assume DFS is not supported by all kernel builds.
400        raise HwsimSkip("CAC did not start - assume not supported")
401
402    ev = dev[0].wait_event(["DFS-CAC-COMPLETED"], timeout=70)
403    if ev is None:
404        raise Exception("CAC did not complete")
405    if "success=1" not in ev:
406        raise Exception("CAC failed")
407    if "freq=5260" not in ev:
408        raise Exception("Unexpected DFS freq result")
409
410    ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"])
411    if ev is None:
412        raise Exception("AP failed to start")
413
414    dev[1].connect("wpas-ap-dfs", key_mgmt="NONE", timeout=30)
415    dev[1].wait_regdom(country_ie=True)
416    dev[0].request("DISCONNECT")
417    dev[1].disconnect_and_stop_scan()
418
419@remote_compatible
420def test_wpas_ap_disable(dev):
421    """wpa_supplicant AP mode - DISABLE_NETWORK"""
422    id = dev[0].add_network()
423    dev[0].set_network(id, "mode", "2")
424    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
425    dev[0].set_network(id, "key_mgmt", "NONE")
426    dev[0].set_network(id, "scan_freq", "2412")
427    dev[0].select_network(id)
428
429    ev = dev[0].wait_event(["AP-ENABLED"])
430    if ev is None:
431        raise Exception("AP-ENABLED event not seen")
432    wait_ap_ready(dev[0])
433    dev[0].request("DISABLE_NETWORK %d" % id)
434    ev = dev[0].wait_event(["AP-DISABLED"])
435    if ev is None:
436        raise Exception("AP-DISABLED event not seen")
437    dev[0].wait_disconnected()
438
439def test_wpas_ap_acs(dev):
440    """wpa_supplicant AP mode - ACS"""
441    res = dev[0].get_capability("acs")
442    if res is None or "ACS" not in res:
443        raise HwsimSkip("ACS not supported")
444
445    # For now, make sure the last operating channel was on 2.4 GHz band to get
446    # sufficient survey data from mac80211_hwsim.
447    id = dev[0].add_network()
448    dev[0].set_network(id, "mode", "2")
449    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
450    dev[0].set_network(id, "key_mgmt", "NONE")
451    dev[0].set_network(id, "frequency", "2412")
452    dev[0].set_network(id, "scan_freq", "2412")
453    dev[0].select_network(id)
454    wait_ap_ready(dev[0])
455    dev[0].request("REMOVE_NETWORK all")
456    dev[0].wait_disconnected()
457
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", "2417")
463    dev[0].set_network(id, "scan_freq", "2417")
464    dev[0].set_network(id, "acs", "1")
465    dev[0].select_network(id)
466    wait_ap_ready(dev[0])
467
468    # ACS prefers channels 1, 6, 11
469    freq = dev[0].get_status_field('freq')
470    if freq == "2417":
471        raise Exception("Unexpected operating channel selected")
472
473    dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq=freq)
474
475@remote_compatible
476def test_wpas_ap_and_assoc_req_p2p_ie(dev):
477    """wpa_supplicant AP mode - unexpected P2P IE in Association Request"""
478    try:
479        _test_wpas_ap_and_assoc_req_p2p_ie(dev)
480    finally:
481        dev[1].request("VENDOR_ELEM_REMOVE 13 *")
482        dev[0].request("P2P_SET disabled 0")
483
484def _test_wpas_ap_and_assoc_req_p2p_ie(dev):
485    dev[0].request("P2P_SET disabled 1")
486    id = dev[0].add_network()
487    dev[0].set_network(id, "mode", "2")
488    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
489    dev[0].set_network(id, "key_mgmt", "NONE")
490    dev[0].set_network(id, "frequency", "2412")
491    dev[0].set_network(id, "scan_freq", "2412")
492    dev[0].select_network(id)
493    wait_ap_ready(dev[0])
494
495    dev[1].request("VENDOR_ELEM_ADD 13 dd04506f9a09")
496    dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
497    dev[1].request("DISCONNECT")
498    dev[1].wait_disconnected()
499
500    dev[0].request("DISCONNECT")
501    dev[0].wait_disconnected()
502
503@remote_compatible
504def test_wpas_ap_open_ht_disabled(dev):
505    """wpa_supplicant AP mode - open network and HT disabled"""
506    id = dev[0].add_network()
507    dev[0].set_network(id, "mode", "2")
508    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
509    dev[0].set_network(id, "key_mgmt", "NONE")
510    dev[0].set_network(id, "frequency", "2412")
511    dev[0].set_network(id, "scan_freq", "2412")
512    dev[0].set_network(id, "disable_ht", "1")
513    dev[0].select_network(id)
514    wait_ap_ready(dev[0])
515
516    dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
517    hwsim_utils.test_connectivity(dev[0], dev[1])
518
519def test_wpas_ap_failures(dev):
520    """wpa_supplicant AP mode - failures"""
521    # No SSID configured for AP mode
522    id = dev[0].add_network()
523    dev[0].set_network(id, "mode", "2")
524    dev[0].set_network(id, "key_mgmt", "NONE")
525    dev[0].set_network(id, "frequency", "2412")
526    dev[0].set_network(id, "scan_freq", "2412")
527    dev[0].select_network(id)
528    ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=0.1)
529    if ev is not None:
530        raise Exception("Unexpected connection event")
531    dev[0].request("REMOVE_NETWORK all")
532
533    # Invalid pbss value(2) for AP mode
534    dev[0].dump_monitor()
535    id = dev[0].add_network()
536    dev[0].set_network(id, "mode", "2")
537    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
538    dev[0].set_network(id, "key_mgmt", "NONE")
539    dev[0].set_network(id, "frequency", "2412")
540    dev[0].set_network(id, "scan_freq", "2412")
541    dev[0].set_network(id, "pbss", "2")
542    dev[0].select_network(id)
543    ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
544                            "CTRL-EVENT-DISCONNECTED"], timeout=0.1)
545    if ev is not None and "CTRL-EVENT-CONNECTED" in ev:
546        raise Exception("Unexpected connection event(2)")
547    dev[0].request("REMOVE_NETWORK all")
548
549def test_wpas_ap_oom(dev):
550    """wpa_supplicant AP mode - OOM"""
551    id = dev[0].add_network()
552    dev[0].set_network(id, "mode", "2")
553    dev[0].set_network_quoted(id, "ssid", "wpas-ap")
554    dev[0].set_network_quoted(id, "psk", "1234567890")
555    dev[0].set_network(id, "frequency", "2412")
556    dev[0].set_network(id, "scan_freq", "2412")
557    with alloc_fail(dev[0], 1, "=wpa_supplicant_conf_ap"):
558        dev[0].select_network(id)
559        dev[0].wait_disconnected()
560    dev[0].request("REMOVE_NETWORK all")
561
562    id = dev[0].add_network()
563    dev[0].set_network(id, "mode", "2")
564    dev[0].set_network_quoted(id, "ssid", "wpas-ap")
565    dev[0].set_network(id, "psk", "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef")
566    dev[0].set_network(id, "frequency", "2412")
567    dev[0].set_network(id, "scan_freq", "2412")
568    with alloc_fail(dev[0], 1, "=wpa_supplicant_conf_ap"):
569        dev[0].select_network(id)
570        dev[0].wait_disconnected()
571    dev[0].request("REMOVE_NETWORK all")
572
573    if "WEP40" in dev[0].get_capability("group"):
574        id = dev[0].add_network()
575        dev[0].set_network(id, "mode", "2")
576        dev[0].set_network_quoted(id, "ssid", "wpas-ap")
577        dev[0].set_network(id, "key_mgmt", "NONE")
578        dev[0].set_network_quoted(id, "wep_key0", "hello")
579        dev[0].set_network(id, "frequency", "2412")
580        dev[0].set_network(id, "scan_freq", "2412")
581        with alloc_fail(dev[0], 1, "=wpa_supplicant_conf_ap"):
582            dev[0].select_network(id)
583            dev[0].wait_disconnected()
584        dev[0].request("REMOVE_NETWORK all")
585
586    wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
587    wpas.interface_add("wlan5")
588    wpas.request("SET manufacturer test")
589    wpas.request("SET model_name test")
590    wpas.request("SET model_number test")
591    wpas.request("SET serial_number test")
592    wpas.request("SET serial_number test")
593    wpas.request("SET serial_number test")
594    wpas.request("SET ap_vendor_elements dd0411223301")
595    id = wpas.add_network()
596    wpas.set_network(id, "mode", "2")
597    wpas.set_network_quoted(id, "ssid", "wpas-ap")
598    wpas.set_network(id, "key_mgmt", "NONE")
599    wpas.set_network(id, "frequency", "2412")
600    wpas.set_network(id, "scan_freq", "2412")
601
602    for i in range(5):
603        with alloc_fail(wpas, i, "=wpa_supplicant_conf_ap"):
604            wpas.select_network(id)
605            ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED",
606                                    "CTRL-EVENT-DISCONNECTED"], timeout=1)
607        wpas.request("DISCONNECT")
608        wpas.wait_disconnected()
609
610def test_wpas_ap_params(dev):
611    """wpa_supplicant AP mode - parameters"""
612    wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
613    wpas.interface_add("wlan5")
614    wpas.request("SET manufacturer test")
615    wpas.request("SET model_name test")
616    wpas.request("SET model_number test")
617    wpas.request("SET serial_number test")
618    wpas.request("SET serial_number test")
619    wpas.request("SET serial_number test")
620    wpas.request("SET ap_vendor_elements dd0411223301")
621    id = wpas.add_network()
622    wpas.set_network(id, "mode", "2")
623    wpas.set_network_quoted(id, "ssid", "wpas-ap")
624    wpas.set_network(id, "key_mgmt", "NONE")
625    wpas.set_network(id, "frequency", "2412")
626    wpas.set_network(id, "scan_freq", "2412")
627    wpas.select_network(id)
628    wpas.wait_connected()
629    wpas.request("DISCONNECT")
630    wpas.wait_disconnected()
631
632    wpas.request("SET beacon_int 200 3")
633    wpas.request("SET dtim_period 3")
634    wpas.select_network(id)
635    wpas.wait_connected()
636    wpas.request("DISCONNECT")
637    wpas.wait_disconnected()
638
639    wpas.set_network(id, "beacon_int", "300")
640    wpas.set_network(id, "dtim_period", "2")
641    wpas.select_network(id)
642    wpas.wait_connected()
643    if "---- AP ----" not in wpas.request("PMKSA"):
644        raise Exception("AP section missing from PMKSA output")
645    if "OK" not in wpas.request("PMKSA_FLUSH"):
646        raise Exception("PMKSA_FLUSH failed")
647    wpas.request("DISCONNECT")
648    wpas.wait_disconnected()
649
650def test_wpas_ap_global_sta(dev):
651    """wpa_supplicant AP mode - STA commands on global control interface"""
652    id = dev[0].add_network()
653    dev[0].set_network(id, "mode", "2")
654    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
655    dev[0].set_network(id, "key_mgmt", "NONE")
656    dev[0].set_network(id, "frequency", "2412")
657    dev[0].set_network(id, "scan_freq", "2412")
658    dev[0].select_network(id)
659    wait_ap_ready(dev[0])
660
661    dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
662
663    addr1 = dev[1].own_addr()
664    res = dev[0].global_request("STA " + addr1)
665    if "UNKNOWN COMMAND" in res:
666        raise Exception("STA command not known on global control interface")
667    res = dev[0].global_request("STA-FIRST")
668    if "UNKNOWN COMMAND" in res:
669        raise Exception("STA-FIRST command not known on global control interface")
670    res = dev[0].global_request("STA-NEXT " + addr1)
671    if "UNKNOWN COMMAND" in res:
672        raise Exception("STA-NEXT command not known on global control interface")
673    dev[1].request("DISCONNECT")
674    dev[1].wait_disconnected()
675    dev[0].request("DISCONNECT")
676    dev[0].wait_disconnected()
677
678def test_wpas_ap_5ghz(dev):
679    """wpa_supplicant AP mode - 5 GHz"""
680    try:
681        _test_wpas_ap_5ghz(dev)
682    finally:
683        set_country("00")
684        dev[0].request("SET country 00")
685        dev[1].flush_scan_cache()
686
687def _test_wpas_ap_5ghz(dev):
688    set_country("US")
689    dev[0].request("SET country US")
690    id = dev[0].add_network()
691    dev[0].set_network(id, "mode", "2")
692    dev[0].set_network_quoted(id, "ssid", "wpas-ap-5ghz")
693    dev[0].set_network(id, "key_mgmt", "NONE")
694    dev[0].set_network(id, "frequency", "5180")
695    dev[0].set_network(id, "scan_freq", "5180")
696    dev[0].select_network(id)
697    wait_ap_ready(dev[0])
698
699    dev[1].connect("wpas-ap-5ghz", key_mgmt="NONE", scan_freq="5180")
700    log_channel_info(dev[1])
701    dev[1].request("DISCONNECT")
702    dev[1].wait_disconnected()
703
704def test_wpas_ap_open_ht40(dev):
705    """wpa_supplicant AP mode - HT 40 MHz"""
706    id = dev[0].add_network()
707    set_regdom(dev[0], "FI")
708    try:
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", "5180")
713        dev[0].set_network(id, "scan_freq", "5180")
714        dev[0].set_network(id, "ht40", "1")
715        dev[0].select_network(id)
716        wait_ap_ready(dev[0])
717
718        dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="5180")
719        log_channel_info(dev[1])
720        sig = dev[1].request("SIGNAL_POLL").splitlines()
721        hwsim_utils.test_connectivity(dev[0], dev[1])
722        dev[1].request("DISCONNECT")
723        dev[1].wait_disconnected()
724        if "FREQUENCY=5180" not in sig:
725            raise Exception("Unexpected SIGNAL_POLL value(1): " + str(sig))
726        if "WIDTH=40 MHz" not in sig:
727            raise Exception("Unexpected SIGNAL_POLL value(2): " + str(sig))
728    finally:
729        set_country("00")
730        dev[0].set("country", "00")
731        dev[1].flush_scan_cache()
732
733def test_wpas_ap_open_vht80(dev):
734    """wpa_supplicant AP mode - VHT 80 MHz"""
735    id = dev[0].add_network()
736    set_regdom(dev[0], "FI")
737    try:
738        dev[0].set_network(id, "mode", "2")
739        dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
740        dev[0].set_network(id, "key_mgmt", "NONE")
741        dev[0].set_network(id, "frequency", "5180")
742        dev[0].set_network(id, "scan_freq", "5180")
743        dev[0].set_network(id, "vht", "1")
744        dev[0].set_network(id, "vht_center_freq1", "5210")
745        dev[0].set_network(id, "max_oper_chwidth", "1")
746        dev[0].set_network(id, "ht40", "1")
747        dev[0].select_network(id)
748        wait_ap_ready(dev[0])
749
750        dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="5180")
751        log_channel_info(dev[1])
752        sig = dev[1].request("SIGNAL_POLL").splitlines()
753        hwsim_utils.test_connectivity(dev[0], dev[1])
754        dev[1].request("DISCONNECT")
755        dev[1].wait_disconnected()
756        if "FREQUENCY=5180" not in sig:
757            raise Exception("Unexpected SIGNAL_POLL value(1): " + str(sig))
758        if "WIDTH=80 MHz" not in sig:
759            raise Exception("Unexpected SIGNAL_POLL value(2): " + str(sig))
760    finally:
761        set_country("00")
762        dev[0].set("country", "00")
763        dev[1].flush_scan_cache()
764
765def test_wpas_ap_open_vht80_us(dev):
766    """wpa_supplicant AP mode - VHT 80 MHz (US) channel 149"""
767    run_wpas_ap_open_vht80_us(dev, 5745, 5775, 1)
768
769def test_wpas_ap_open_vht80_us_153(dev):
770    """wpa_supplicant AP mode - VHT 80 MHz (US) channel 153"""
771    run_wpas_ap_open_vht80_us(dev, 5765, 5775, -1)
772
773def test_wpas_ap_open_vht80_us_157(dev):
774    """wpa_supplicant AP mode - VHT 80 MHz (US) channel 157"""
775    run_wpas_ap_open_vht80_us(dev, 5785, 5775, 1)
776
777def test_wpas_ap_open_vht80_us_161(dev):
778    """wpa_supplicant AP mode - VHT 80 MHz (US) channel 161"""
779    run_wpas_ap_open_vht80_us(dev, 5805, 5775, -1)
780
781def run_wpas_ap_open_vht80_us(dev, freq, center_freq, ht40):
782    id = dev[0].add_network()
783    set_regdom(dev[0], "US")
784    try:
785        dev[0].set_network(id, "mode", "2")
786        dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
787        dev[0].set_network(id, "key_mgmt", "NONE")
788        dev[0].set_network(id, "frequency", str(freq))
789        dev[0].set_network(id, "scan_freq", str(freq))
790        dev[0].set_network(id, "vht", "1")
791        dev[0].set_network(id, "vht_center_freq1", str(center_freq))
792        dev[0].set_network(id, "max_oper_chwidth", "1")
793        dev[0].set_network(id, "ht40", str(ht40))
794        dev[0].select_network(id)
795        wait_ap_ready(dev[0])
796
797        dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq=str(freq))
798        log_channel_info(dev[1])
799        sig = dev[1].request("SIGNAL_POLL").splitlines()
800        hwsim_utils.test_connectivity(dev[0], dev[1])
801        dev[1].request("DISCONNECT")
802        dev[1].wait_disconnected()
803        if "FREQUENCY=" + str(freq) not in sig:
804            raise Exception("Unexpected SIGNAL_POLL value(1): " + str(sig))
805        if "WIDTH=80 MHz" not in sig:
806            raise Exception("Unexpected SIGNAL_POLL value(2): " + str(sig))
807    finally:
808        dev[0].request("REMOVE_NETWORK all")
809        dev[0].wait_disconnected()
810        set_country("00")
811        dev[0].set("country", "00")
812        dev[1].flush_scan_cache()
813
814def test_wpas_ap_no_ht(dev):
815    """wpa_supplicant AP mode - HT disabled"""
816    id = dev[0].add_network()
817    dev[0].set_network(id, "mode", "2")
818    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
819    dev[0].set_network(id, "key_mgmt", "NONE")
820    dev[0].set_network(id, "frequency", "2412")
821    dev[0].set_network(id, "scan_freq", "2412")
822    dev[0].set_network(id, "ht", "0")
823    dev[0].set_network(id, "wps_disabled", "1")
824    dev[0].select_network(id)
825    wait_ap_ready(dev[0])
826    dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
827    sig = dev[1].request("SIGNAL_POLL").splitlines()
828    dev[1].request("DISCONNECT")
829    dev[1].wait_disconnected()
830    dev[0].request("REMOVE_NETWORK all")
831    dev[0].wait_disconnected()
832
833    id = dev[0].add_network()
834    dev[0].set_network(id, "mode", "2")
835    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
836    dev[0].set_network(id, "key_mgmt", "NONE")
837    dev[0].set_network(id, "frequency", "2412")
838    dev[0].set_network(id, "scan_freq", "2412")
839    dev[0].set_network(id, "wps_disabled", "1")
840    dev[0].select_network(id)
841    wait_ap_ready(dev[0])
842    dev[1].flush_scan_cache()
843    dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
844    sig2 = dev[1].request("SIGNAL_POLL").splitlines()
845    dev[1].request("DISCONNECT")
846    dev[1].wait_disconnected()
847    dev[0].request("REMOVE_NETWORK all")
848    dev[0].wait_disconnected()
849
850    if "WIDTH=20 MHz (no HT)" not in sig:
851        raise Exception("HT was not disabled: " + str(sig))
852    if "WIDTH=20 MHz" not in sig2:
853        raise Exception("HT was not enabled: " + str(sig2))
854
855def test_wpas_ap_async_fail(dev):
856    """wpa_supplicant AP mode - Async failure"""
857    id = dev[0].add_network()
858    set_regdom(dev[0], "FI")
859    try:
860        dev[0].set_network(id, "mode", "2")
861        dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
862        dev[0].set_network(id, "key_mgmt", "NONE")
863        dev[0].set_network(id, "frequency", "5180")
864        dev[0].set_network(id, "scan_freq", "5180")
865        dev[0].set_network(id, "vht", "1")
866        dev[0].set_network(id, "vht_center_freq1", "5210")
867        dev[0].set_network(id, "max_oper_chwidth", "1")
868        dev[0].set_network(id, "ht40", "1")
869
870        with alloc_fail(dev[0], 1,
871                        "nl80211_get_scan_results;ieee80211n_check_scan"):
872            dev[0].select_network(id)
873            dev[0].wait_disconnected()
874    finally:
875        dev[0].set("country", "00")
876        clear_regdom_dev(dev)
877
878def test_wpas_ap_sae(dev):
879    """wpa_supplicant AP mode - SAE using psk"""
880    run_wpas_ap_sae(dev, False)
881
882def test_wpas_ap_sae_pmf1(dev):
883    """wpa_supplicant AP mode - SAE using psk and pmf=1"""
884    try:
885        dev[0].set("pmf", "1")
886        run_wpas_ap_sae(dev, False, pmf=2)
887    finally:
888        dev[0].set("pmf", "0")
889
890def test_wpas_ap_sae_pmf2(dev):
891    """wpa_supplicant AP mode - SAE using psk and pmf=2"""
892    try:
893        dev[0].set("pmf", "2")
894        run_wpas_ap_sae(dev, False, pmf=1)
895    finally:
896        dev[0].set("pmf", "0")
897
898def test_wpas_ap_sae_password(dev):
899    """wpa_supplicant AP mode - SAE using sae_password"""
900    run_wpas_ap_sae(dev, True)
901
902def test_wpas_ap_sae_pwe_1(dev):
903    """wpa_supplicant AP mode - SAE using sae_password and sae_pwe=1"""
904    try:
905        dev[0].set("sae_pwe", "1")
906        dev[1].set("sae_pwe", "1")
907        run_wpas_ap_sae(dev, True, sae_password_id=True)
908    finally:
909        dev[0].set("sae_pwe", "0")
910        dev[1].set("sae_pwe", "0")
911
912def run_wpas_ap_sae(dev, sae_password, sae_password_id=False, pmf=0):
913    check_sae_capab(dev[0])
914    check_sae_capab(dev[1])
915    dev[0].request("SET sae_groups ")
916    id = dev[0].add_network()
917    dev[0].set_network(id, "mode", "2")
918    dev[0].set_network_quoted(id, "ssid", "wpas-ap-sae")
919    dev[0].set_network(id, "proto", "WPA2")
920    dev[0].set_network(id, "key_mgmt", "SAE")
921    dev[0].set_network(id, "pairwise", "CCMP")
922    dev[0].set_network(id, "group", "CCMP")
923    if sae_password:
924        dev[0].set_network_quoted(id, "sae_password", "12345678")
925    else:
926        dev[0].set_network_quoted(id, "psk", "12345678")
927    if sae_password_id:
928        pw_id = "pw id"
929        dev[0].set_network_quoted(id, "sae_password_id", pw_id)
930    else:
931        pw_id = None
932    dev[0].set_network(id, "frequency", "2412")
933    dev[0].set_network(id, "scan_freq", "2412")
934    dev[0].set_network(id, "wps_disabled", "1")
935    dev[0].select_network(id)
936    wait_ap_ready(dev[0])
937
938    dev[1].request("SET sae_groups ")
939    dev[1].connect("wpas-ap-sae", key_mgmt="SAE", sae_password="12345678",
940                   sae_password_id=pw_id, scan_freq="2412", ieee80211w=str(pmf))
941
942def test_wpas_ap_scan(dev, apdev):
943    """wpa_supplicant AP mode and scanning"""
944    dev[0].flush_scan_cache()
945
946    hapd = hostapd.add_ap(apdev[0], {"ssid": "open"})
947    bssid = hapd.own_addr()
948
949    id = dev[0].add_network()
950    dev[0].set_network(id, "mode", "2")
951    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
952    dev[0].set_network(id, "key_mgmt", "NONE")
953    dev[0].set_network(id, "frequency", "2412")
954    dev[0].set_network(id, "scan_freq", "2412")
955    dev[0].select_network(id)
956    wait_ap_ready(dev[0])
957    dev[0].dump_monitor()
958
959    if "OK" not in dev[0].request("SCAN freq=2412"):
960        raise Exception("SCAN command not accepted")
961    ev = dev[0].wait_event(["CTRL-EVENT-SCAN-RESULTS",
962                            "CTRL-EVENT-SCAN-FAILED"], 15)
963    if ev is None:
964        raise Exception("Scan result timed out")
965    if "CTRL-EVENT-SCAN-FAILED ret=-95" in ev:
966        # Scanning in AP mode not supported
967        return
968    if "CTRL-EVENT-SCAN-FAILED" in ev:
969        raise Exception("Unexpected scan failure reason: " + ev)
970    if "CTRL-EVENT-SCAN-RESULTS" in ev:
971        bss = dev[0].get_bss(bssid)
972        if not bss:
973            raise Exception("AP not found in scan")
974
975def test_wpas_ap_sae(dev):
976    """wpa_supplicant AP mode - SAE using psk"""
977    run_wpas_ap_sae(dev, False)
978
979def test_wpas_ap_sae_and_psk_transition_disable(dev):
980    """wpa_supplicant AP mode - SAE+PSK transition disable indication"""
981    check_sae_capab(dev[0])
982    check_sae_capab(dev[1])
983    dev[0].set("sae_groups", "")
984    id = dev[0].add_network()
985    dev[0].set_network(id, "mode", "2")
986    dev[0].set_network_quoted(id, "ssid", "wpas-ap-sae")
987    dev[0].set_network(id, "proto", "WPA2")
988    dev[0].set_network(id, "key_mgmt", "SAE")
989    dev[0].set_network(id, "transition_disable", "1")
990    dev[0].set_network(id, "ieee80211w", "1")
991    dev[0].set_network(id, "pairwise", "CCMP")
992    dev[0].set_network(id, "group", "CCMP")
993    dev[0].set_network_quoted(id, "psk", "12345678")
994    dev[0].set_network(id, "frequency", "2412")
995    dev[0].set_network(id, "scan_freq", "2412")
996    dev[0].set_network(id, "wps_disabled", "1")
997    dev[0].select_network(id)
998    wait_ap_ready(dev[0])
999
1000    dev[1].set("sae_groups", "")
1001    dev[1].connect("wpas-ap-sae", key_mgmt="SAE WPA-PSK",
1002                   psk="12345678", ieee80211w="1",
1003                   scan_freq="2412", wait_connect=False)
1004    ev = dev[1].wait_event(["TRANSITION-DISABLE"], timeout=15)
1005    if ev is None:
1006        raise Exception("Transition disable not indicated")
1007    if ev.split(' ')[1] != "01":
1008        raise Exception("Unexpected transition disable bitmap: " + ev)
1009
1010    val = dev[1].get_network(id, "ieee80211w")
1011    if val != "2":
1012        raise Exception("Unexpected ieee80211w value: " + val)
1013    val = dev[1].get_network(id, "key_mgmt")
1014    if val != "SAE":
1015        raise Exception("Unexpected key_mgmt value: " + val)
1016    val = dev[1].get_network(id, "group")
1017    if val != "CCMP":
1018        raise Exception("Unexpected group value: " + val)
1019    val = dev[1].get_network(id, "proto")
1020    if val != "RSN":
1021        raise Exception("Unexpected proto value: " + val)
1022
1023    dev[1].request("DISCONNECT")
1024    dev[1].wait_disconnected()
1025    dev[1].request("RECONNECT")
1026    dev[1].wait_connected()
1027
1028def test_wpas_ap_vendor_elems(dev):
1029    """wpa_supplicant AP mode - vendor elements"""
1030    id = dev[0].add_network()
1031    dev[0].set_network(id, "mode", "2")
1032    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
1033    dev[0].set_network(id, "key_mgmt", "NONE")
1034    dev[0].set_network(id, "frequency", "2412")
1035    dev[0].set_network(id, "scan_freq", "2412")
1036    dev[0].select_network(id)
1037    wait_ap_ready(dev[0])
1038
1039    try:
1040        beacon_elems = "dd0411223301"
1041        dev[0].set("ap_vendor_elements", beacon_elems)
1042        dev[0].set("ap_assocresp_elements", "dd0411223302")
1043        if "OK" not in dev[0].request("UPDATE_BEACON"):
1044            raise Exception("UPDATE_BEACON failed")
1045
1046        dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
1047        bss = dev[1].get_bss(dev[0].own_addr())
1048        if beacon_elems not in bss['ie']:
1049            raise Exception("Vendor element not visible in scan results")
1050    finally:
1051        dev[0].set("ap_vendor_elements", "")
1052        dev[0].set("ap_assocresp_elements", "")
1053
1054def test_wpas_ap_lifetime_in_memory(dev, apdev, params):
1055    """wpa_supplicant AP mode and PSK/PTK lifetime in memory"""
1056    run_wpas_ap_lifetime_in_memory(dev, apdev, params, False)
1057
1058def test_wpas_ap_lifetime_in_memory2(dev, apdev, params):
1059    """wpa_supplicant AP mode and PSK/PTK lifetime in memory (raw PSK)"""
1060    run_wpas_ap_lifetime_in_memory(dev, apdev, params, True)
1061
1062def run_wpas_ap_lifetime_in_memory(dev, apdev, params, raw):
1063    ssid = "test-wpa2-psk"
1064    passphrase = 'qwertyuiop'
1065    psk = '602e323e077bc63bd80307ef4745b754b0ae0a925c2638ecd13a794b9527b9e6'
1066    pmk = binascii.unhexlify(psk)
1067
1068    pid = find_wpas_process(dev[0])
1069
1070    id = dev[0].add_network()
1071    dev[0].set_network(id, "mode", "2")
1072    dev[0].set_network_quoted(id, "ssid", ssid)
1073    dev[0].set_network(id, "proto", "WPA2")
1074    dev[0].set_network(id, "pairwise", "CCMP")
1075    dev[0].set_network(id, "group", "CCMP")
1076    if raw:
1077        dev[0].set_network(id, "psk", psk)
1078    else:
1079        dev[0].set_network_quoted(id, "psk", passphrase)
1080    dev[0].set_network(id, "frequency", "2412")
1081    dev[0].set_network(id, "scan_freq", "2412")
1082
1083    logger.info("Checking keys in memory after network profile configuration")
1084    buf = read_process_memory(pid, pmk)
1085    get_key_locations(buf, pmk, "PMK")
1086
1087    dev[0].select_network(id)
1088    wait_ap_ready(dev[0])
1089
1090    logger.info("Checking keys in memory after AP start")
1091    buf = read_process_memory(pid, pmk)
1092    get_key_locations(buf, pmk, "PMK")
1093
1094    dev[1].connect(ssid, psk=passphrase, scan_freq="2412")
1095    dev[0].wait_sta()
1096
1097    buf = read_process_memory(pid, pmk)
1098
1099    dev[1].request("DISCONNECT")
1100    dev[1].wait_disconnected()
1101    dev[0].wait_sta_disconnect()
1102    time.sleep(1)
1103
1104    buf2 = read_process_memory(pid, pmk)
1105
1106    dev[0].request("REMOVE_NETWORK all")
1107    dev[0].wait_disconnected()
1108
1109    buf3 = read_process_memory(pid, pmk)
1110
1111    dev[1].relog()
1112    ptk = None
1113    gtk = None
1114    with open(os.path.join(params['logdir'], 'log1'), 'r') as f:
1115        for l in f.readlines():
1116            if "WPA: PTK - hexdump" in l:
1117                val = l.strip().split(':')[3].replace(' ', '')
1118                ptk = binascii.unhexlify(val)
1119            if "WPA: Group Key - hexdump" in l:
1120                val = l.strip().split(':')[3].replace(' ', '')
1121                gtk = binascii.unhexlify(val)
1122    if not pmk or not ptk or not gtk:
1123        raise Exception("Could not find keys from debug log")
1124    if len(gtk) != 16:
1125        raise Exception("Unexpected GTK length")
1126
1127    kck = ptk[0:16]
1128    kek = ptk[16:32]
1129    tk = ptk[32:48]
1130
1131    logger.info("Checking keys in memory while associated")
1132    get_key_locations(buf, pmk, "PMK")
1133    if pmk not in buf:
1134        raise HwsimSkip("PMK not found while associated")
1135    if kck not in buf:
1136        raise Exception("KCK not found while associated")
1137    if kek not in buf:
1138        raise Exception("KEK not found while associated")
1139    #if tk in buf:
1140    #    raise Exception("TK found from memory")
1141
1142    logger.info("Checking keys in memory after disassociation")
1143    get_key_locations(buf2, pmk, "PMK")
1144
1145    # Note: PMK/PSK is still present in network configuration and GTK is still
1146    # in use.
1147
1148    fname = params['prefix'] + '.memctx-'
1149    verify_not_present(buf2, kck, fname, "KCK")
1150    verify_not_present(buf2, kek, fname, "KEK")
1151    verify_not_present(buf2, tk, fname, "TK")
1152    get_key_locations(buf2, gtk, "GTK")
1153
1154    logger.info("Checking keys in memory after network profile removal")
1155    get_key_locations(buf3, pmk, "PMK")
1156
1157    verify_not_present(buf3, pmk, fname, "PMK")
1158    verify_not_present(buf3, kck, fname, "KCK")
1159    verify_not_present(buf3, kek, fname, "KEK")
1160    verify_not_present(buf3, tk, fname, "TK")
1161    get_key_locations(buf3, gtk, "GTK")
1162    verify_not_present(buf3, gtk, fname, "GTK")
1163
1164def check_acl(dev, num_accept, num_deny):
1165    accept = dev.request("ACCEPT_ACL SHOW").splitlines()
1166    logger.info("accept entries: " + str(accept))
1167    if len(accept) != num_accept:
1168        raise Exception("Unexpected number of accept entries")
1169    deny = dev.request("DENY_ACL SHOW").splitlines()
1170    logger.info("deny entries: " + str(deny))
1171    if len(deny) != num_deny:
1172        raise Exception("Unexpected number of deny entries")
1173
1174def test_wpas_ap_acl_mgmt(dev):
1175    """wpa_supplicant AP mode - ACL management"""
1176    id = dev[0].add_network()
1177    dev[0].set_network(id, "mode", "2")
1178    dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
1179    dev[0].set_network(id, "key_mgmt", "NONE")
1180    dev[0].set_network(id, "frequency", "2412")
1181    dev[0].set_network(id, "scan_freq", "2412")
1182    dev[0].select_network(id)
1183    wait_ap_ready(dev[0])
1184
1185    addr1 = dev[1].own_addr()
1186    addr2 = dev[2].own_addr()
1187
1188    check_acl(dev[0], 0, 0)
1189    if "OK" not in dev[0].request("ACCEPT_ACL ADD_MAC " + addr1):
1190        raise Exception("ACCEPT_ACL ADD_MAC failed")
1191    check_acl(dev[0], 1, 0)
1192
1193    dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412",
1194                   wait_connect=False)
1195    dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
1196    ev = dev[2].wait_event(["CTRL-EVENT-CONNECTED"], timeout=2)
1197    if ev:
1198        raise Exception("Unexpected connection")
1199    dev[2].request("DISCONNECT")
1200
1201    if "OK" not in dev[0].request("DENY_ACL ADD_MAC " + addr1):
1202        raise Exception("DENY_ACL ADD_MAC failed")
1203    dev[1].wait_disconnected()
1204    dev[1].request("DISCONNECT")
1205
1206    check_acl(dev[0], 1, 1)
1207    if "OK" not in dev[0].request("ACCEPT_ACL CLEAR"):
1208        raise Exception("Failed to clear accept ACL")
1209    check_acl(dev[0], 0, 1)
1210    if "OK" not in dev[0].request("DENY_ACL CLEAR"):
1211        raise Exception("Failed to clear deny ACL")
1212    check_acl(dev[0], 0, 0)
1213