Updated through tag hostap_2_5 from git://w1.fi/hostap.git
[mech_eap.git] / libeap / 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 time
8 import logging
9 logger = logging.getLogger()
10
11 import hwsim_utils
12 from utils import HwsimSkip
13 from test_p2p_channel import set_country
14
15 def wait_ap_ready(dev):
16     ev = dev.wait_event(["CTRL-EVENT-CONNECTED"])
17     if ev is None:
18         raise Exception("AP failed to start")
19
20 def test_wpas_ap_open(dev):
21     """wpa_supplicant AP mode - open network"""
22     if "FAIL" not in dev[0].request("DEAUTHENTICATE 00:11:22:33:44:55"):
23         raise Exception("Unexpected DEAUTHENTICATE accepted")
24     if "FAIL" not in dev[0].request("DISASSOCIATE 00:11:22:33:44:55"):
25         raise Exception("Unexpected DISASSOCIATE accepted")
26     if "FAIL" not in dev[0].request("CHAN_SWITCH 0 2432"):
27         raise Exception("Unexpected CHAN_SWITCH accepted")
28
29     id = dev[0].add_network()
30     dev[0].set_network(id, "mode", "2")
31     dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
32     dev[0].set_network(id, "key_mgmt", "NONE")
33     dev[0].set_network(id, "frequency", "2412")
34     dev[0].set_network(id, "scan_freq", "2412")
35     dev[0].select_network(id)
36     wait_ap_ready(dev[0])
37
38     if "FAIL" not in dev[0].request("DEAUTHENTICATE foo"):
39         raise Exception("Invalid DEAUTHENTICATE accepted")
40     if "FAIL" not in dev[0].request("DISASSOCIATE foo"):
41         raise Exception("Invalid DISASSOCIATE accepted")
42
43     dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
44     dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
45     hwsim_utils.test_connectivity(dev[0], dev[1])
46     hwsim_utils.test_connectivity(dev[1], dev[2])
47
48     addr1 = dev[1].p2p_interface_addr()
49     addr2 = dev[2].p2p_interface_addr()
50     addrs = [ addr1, addr2 ]
51     sta = dev[0].get_sta(None)
52     if sta['addr'] not in addrs:
53         raise Exception("Unexpected STA address")
54     sta1 = dev[0].get_sta(sta['addr'])
55     if sta1['addr'] not in addrs:
56         raise Exception("Unexpected STA address")
57     sta2 = dev[0].get_sta(sta['addr'], next=True)
58     if sta2['addr'] not in addrs:
59         raise Exception("Unexpected STA2 address")
60     sta3 = dev[0].get_sta(sta2['addr'], next=True)
61     if len(sta3) != 0:
62         raise Exception("Unexpected STA iteration result (did not stop)")
63
64     status = dev[0].get_status()
65     if status['mode'] != "AP":
66         raise Exception("Unexpected status mode")
67
68     dev[1].dump_monitor()
69     dev[2].dump_monitor()
70     dev[0].request("DEAUTHENTICATE " + addr1)
71     dev[0].request("DISASSOCIATE " + addr2)
72     dev[1].wait_disconnected(timeout=10)
73     dev[2].wait_disconnected(timeout=10)
74     dev[1].wait_connected(timeout=10, error="Reconnection timed out")
75     dev[2].wait_connected(timeout=10, error="Reconnection timed out")
76     dev[1].request("DISCONNECT")
77     dev[2].request("DISCONNECT")
78
79 def test_wpas_ap_wep(dev):
80     """wpa_supplicant AP mode - WEP"""
81     id = dev[0].add_network()
82     dev[0].set_network(id, "mode", "2")
83     dev[0].set_network_quoted(id, "ssid", "wpas-ap-wep")
84     dev[0].set_network(id, "key_mgmt", "NONE")
85     dev[0].set_network(id, "frequency", "2412")
86     dev[0].set_network(id, "scan_freq", "2412")
87     dev[0].set_network_quoted(id, "wep_key0", "hello")
88     dev[0].select_network(id)
89     wait_ap_ready(dev[0])
90
91     dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"',
92                    scan_freq="2412")
93     hwsim_utils.test_connectivity(dev[0], dev[1])
94     dev[1].request("DISCONNECT")
95
96 def test_wpas_ap_no_ssid(dev):
97     """wpa_supplicant AP mode - invalid network configuration"""
98     id = dev[0].add_network()
99     dev[0].set_network(id, "mode", "2")
100     dev[0].set_network(id, "key_mgmt", "NONE")
101     dev[0].set_network(id, "frequency", "2412")
102     dev[0].set_network(id, "scan_freq", "2412")
103     dev[0].select_network(id)
104     ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
105     if ev is not None:
106         raise Exception("Unexpected AP start")
107
108 def test_wpas_ap_default_frequency(dev):
109     """wpa_supplicant AP mode - default frequency"""
110     id = dev[0].add_network()
111     dev[0].set_network(id, "mode", "2")
112     dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
113     dev[0].set_network(id, "key_mgmt", "NONE")
114     dev[0].set_network(id, "scan_freq", "2412")
115     dev[0].select_network(id)
116     wait_ap_ready(dev[0])
117     dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462")
118     dev[1].request("DISCONNECT")
119
120 def test_wpas_ap_invalid_frequency(dev):
121     """wpa_supplicant AP mode - invalid frequency configuration"""
122     id = dev[0].add_network()
123     dev[0].set_network(id, "mode", "2")
124     dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
125     dev[0].set_network(id, "key_mgmt", "NONE")
126     dev[0].set_network(id, "frequency", "2413")
127     dev[0].set_network(id, "scan_freq", "2412")
128     dev[0].select_network(id)
129     ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
130     if ev is not None:
131         raise Exception("Unexpected AP start")
132
133 def test_wpas_ap_wps(dev):
134     """wpa_supplicant AP mode - WPS operations"""
135     id = dev[0].add_network()
136     dev[0].set_network(id, "mode", "2")
137     dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
138     dev[0].set_network_quoted(id, "psk", "1234567890")
139     dev[0].set_network(id, "frequency", "2412")
140     dev[0].set_network(id, "scan_freq", "2412")
141     dev[0].select_network(id)
142     wait_ap_ready(dev[0])
143     bssid = dev[0].p2p_interface_addr()
144
145     logger.info("Test PBC mode start/stop")
146     if "FAIL" not in dev[0].request("WPS_CANCEL"):
147         raise Exception("Unexpected WPS_CANCEL success")
148     dev[0].request("WPS_PBC")
149     ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
150     if ev is None:
151         raise Exception("PBC mode start timeout")
152     if "OK" not in dev[0].request("WPS_CANCEL"):
153         raise Exception("Unexpected WPS_CANCEL failure")
154     ev = dev[0].wait_event(["WPS-TIMEOUT"])
155     if ev is None:
156         raise Exception("PBC mode disabling timeout")
157
158     logger.info("Test PBC protocol run")
159     dev[0].request("WPS_PBC")
160     ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
161     if ev is None:
162         raise Exception("PBC mode start timeout")
163     dev[1].request("WPS_PBC")
164     dev[1].wait_connected(timeout=30, error="WPS PBC operation timed out")
165     hwsim_utils.test_connectivity(dev[0], dev[1])
166
167     logger.info("Test AP PIN to learn configuration")
168     pin = dev[0].request("WPS_AP_PIN random")
169     if "FAIL" in pin:
170         raise Exception("Could not generate random AP PIN")
171     if pin not in dev[0].request("WPS_AP_PIN get"):
172         raise Exception("Could not fetch current AP PIN")
173     dev[2].wps_reg(bssid, pin)
174     hwsim_utils.test_connectivity(dev[1], dev[2])
175
176     dev[1].request("REMOVE_NETWORK all")
177     dev[2].request("REMOVE_NETWORK all")
178
179     logger.info("Test AP PIN operations")
180     dev[0].request("WPS_AP_PIN disable")
181     dev[0].request("WPS_AP_PIN set " + pin + " 1")
182     time.sleep(1.1)
183     if "FAIL" not in dev[0].request("WPS_AP_PIN get"):
184         raise Exception("AP PIN unexpectedly still enabled")
185
186     pin = dev[1].wps_read_pin()
187     dev[0].request("WPS_PIN any " + pin)
188     dev[1].request("WPS_PIN any " + pin)
189     dev[1].wait_connected(timeout=30)
190     dev[1].request("REMOVE_NETWORK all")
191     dev[1].dump_monitor()
192
193     dev[0].request("WPS_PIN any " + pin + " 100")
194     dev[1].request("WPS_PIN any " + pin)
195     dev[1].wait_connected(timeout=30)
196     dev[1].request("REMOVE_NETWORK all")
197     dev[1].dump_monitor()
198
199     dev[0].request("WPS_AP_PIN set 12345670")
200     dev[0].dump_monitor()
201
202     runs = ("88887777", "12340000", "00000000", "12345670")
203     for pin in runs:
204         logger.info("Try AP PIN " + pin)
205         dev[2].dump_monitor()
206         dev[2].request("WPS_REG " + bssid + " " + pin)
207         ev = dev[2].wait_event(["WPS-SUCCESS", "WPS-FAIL msg"], timeout=15)
208         if ev is None:
209             raise Exception("WPS operation timed out")
210         if "WPS-SUCCESS" in ev:
211             raise Exception("WPS operation succeeded unexpectedly")
212         dev[2].wait_disconnected(timeout=10)
213         dev[2].request("WPS_CANCEL")
214         dev[2].request("REMOVE_NETWORK all")
215     ev = dev[0].wait_event(["WPS-AP-SETUP-LOCKED"])
216     if ev is None:
217         raise Exception("WPS AP PIN not locked")
218
219     dev[0].dump_monitor()
220     logger.info("Test random AP PIN timeout")
221     pin = dev[0].request("WPS_AP_PIN random 1")
222     if "FAIL" in pin:
223         raise Exception("Could not generate random AP PIN")
224     res = dev[0].request("WPS_AP_PIN get")
225     if pin not in res:
226         raise Exception("Could not fetch current AP PIN")
227     for i in range(10):
228         time.sleep(0.2)
229         res = dev[0].request("WPS_AP_PIN get")
230         if "FAIL" in res:
231             break
232     if "FAIL" not in res:
233         raise Exception("WPS_AP_PIN random timeout did not work")
234
235     if "FAIL" not in dev[0].request("WPS_AP_PIN foo"):
236         raise Exception("Invalid WPS_AP_PIN command not rejected")
237     if "FAIL" not in dev[0].request("WPS_AP_PIN set"):
238         raise Exception("Invalid WPS_AP_PIN command not rejected")
239
240 def test_wpas_ap_wps_pbc_overlap(dev):
241     """wpa_supplicant AP mode - WPS operations with PBC overlap"""
242     id = dev[0].add_network()
243     dev[0].set_network(id, "mode", "2")
244     dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
245     dev[0].set_network_quoted(id, "psk", "1234567890")
246     dev[0].set_network(id, "frequency", "2412")
247     dev[0].set_network(id, "scan_freq", "2412")
248     dev[0].select_network(id)
249     wait_ap_ready(dev[0])
250     bssid = dev[0].p2p_interface_addr()
251
252     dev[1].scan_for_bss(bssid, freq="2412")
253     dev[1].dump_monitor()
254     dev[2].scan_for_bss(bssid, freq="2412")
255     dev[2].dump_monitor()
256     dev[0].request("WPS_PBC")
257     dev[1].request("WPS_PBC " + bssid)
258     dev[2].request("WPS_PBC " + bssid)
259
260     ev = dev[1].wait_event(["WPS-M2D"], timeout=15)
261     if ev is None:
262         raise Exception("PBC session overlap not detected (dev1)")
263     if "config_error=12" not in ev:
264         raise Exception("PBC session overlap not correctly reported (dev1)")
265
266     ev = dev[2].wait_event(["WPS-M2D"], timeout=15)
267     if ev is None:
268         raise Exception("PBC session overlap not detected (dev2)")
269     if "config_error=12" not in ev:
270         raise Exception("PBC session overlap not correctly reported (dev2)")
271
272     if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC"):
273         raise Exception("WPS_PBC(AP) accepted during overlap")
274     if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC any"):
275         raise Exception("WPS_PBC(AP) accepted during overlap")
276     dev[0].request("WPS_CANCEL")
277     dev[1].request("WPS_CANCEL")
278     dev[2].request("WPS_CANCEL")
279
280 def test_wpas_ap_dfs(dev):
281     """wpa_supplicant AP mode - DFS"""
282     try:
283         _test_wpas_ap_dfs(dev)
284     finally:
285         set_country("00")
286         dev[0].request("SET country 00")
287         dev[1].flush_scan_cache()
288
289 def _test_wpas_ap_dfs(dev):
290     set_country("US")
291     dev[0].request("SET country US")
292     id = dev[0].add_network()
293     dev[0].set_network(id, "mode", "2")
294     dev[0].set_network_quoted(id, "ssid", "wpas-ap-dfs")
295     dev[0].set_network(id, "key_mgmt", "NONE")
296     dev[0].set_network(id, "frequency", "5260")
297     dev[0].set_network(id, "scan_freq", "5260")
298     dev[0].select_network(id)
299
300     ev = dev[0].wait_event(["DFS-CAC-START"])
301     if ev is None:
302         # For now, assume DFS is not supported by all kernel builds.
303         raise HwsimSkip("CAC did not start - assume not supported")
304
305     ev = dev[0].wait_event(["DFS-CAC-COMPLETED"], timeout=70)
306     if ev is None:
307         raise Exception("CAC did not complete")
308     if "success=1" not in ev:
309         raise Exception("CAC failed")
310     if "freq=5260" not in ev:
311         raise Exception("Unexpected DFS freq result")
312
313     ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"])
314     if ev is None:
315         raise Exception("AP failed to start")
316
317     dev[1].connect("wpas-ap-dfs", key_mgmt="NONE")
318
319 def test_wpas_ap_disable(dev):
320     """wpa_supplicant AP mode - DISABLE_NETWORK"""
321     id = dev[0].add_network()
322     dev[0].set_network(id, "mode", "2")
323     dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
324     dev[0].set_network(id, "key_mgmt", "NONE")
325     dev[0].set_network(id, "scan_freq", "2412")
326     dev[0].select_network(id)
327
328     ev = dev[0].wait_event(["AP-ENABLED"])
329     if ev is None:
330         raise Exception("AP-ENABLED event not seen")
331     wait_ap_ready(dev[0])
332     dev[0].request("DISABLE_NETWORK %d" % id)
333     ev = dev[0].wait_event(["AP-DISABLED"])
334     if ev is None:
335         raise Exception("AP-DISABLED event not seen")
336     dev[0].wait_disconnected()