tests: DEAUTHENTICATE/DISASSCIATE/CHAN_SWITCH error cases
[mech_eap.git] / tests / hwsim / test_wpas_ap.py
1 # wpa_supplicant AP mode tests
2 # Copyright (c) 2014, Qualcomm Atheros, Inc.
3 #
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
6
7 import time
8 import logging
9 logger = logging.getLogger()
10
11 import hwsim_utils
12
13 def wait_ap_ready(dev):
14     ev = dev.wait_event(["CTRL-EVENT-CONNECTED"])
15     if ev is None:
16         raise Exception("AP failed to start")
17
18 def test_wpas_ap_open(dev):
19     """wpa_supplicant AP mode - open network"""
20     if "FAIL" not in dev[0].request("DEAUTHENTICATE 00:11:22:33:44:55"):
21         raise Exception("Unexpected DEAUTHENTICATE accepted")
22     if "FAIL" not in dev[0].request("DISASSOCIATE 00:11:22:33:44:55"):
23         raise Exception("Unexpected DISASSOCIATE accepted")
24     if "FAIL" not in dev[0].request("CHAN_SWITCH 0 2432"):
25         raise Exception("Unexpected CHAN_SWITCH accepted")
26
27     id = dev[0].add_network()
28     dev[0].set_network(id, "mode", "2")
29     dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
30     dev[0].set_network(id, "key_mgmt", "NONE")
31     dev[0].set_network(id, "frequency", "2412")
32     dev[0].set_network(id, "scan_freq", "2412")
33     dev[0].select_network(id)
34     wait_ap_ready(dev[0])
35
36     if "FAIL" not in dev[0].request("DEAUTHENTICATE foo"):
37         raise Exception("Invalid DEAUTHENTICATE accepted")
38     if "FAIL" not in dev[0].request("DISASSOCIATE foo"):
39         raise Exception("Invalid DISASSOCIATE accepted")
40
41     dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
42     dev[2].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2412")
43     hwsim_utils.test_connectivity(dev[0], dev[1])
44     hwsim_utils.test_connectivity(dev[1], dev[2])
45
46     addr1 = dev[1].p2p_interface_addr()
47     addr2 = dev[2].p2p_interface_addr()
48     addrs = [ addr1, addr2 ]
49     sta = dev[0].get_sta(None)
50     if sta['addr'] not in addrs:
51         raise Exception("Unexpected STA address")
52     sta1 = dev[0].get_sta(sta['addr'])
53     if sta1['addr'] not in addrs:
54         raise Exception("Unexpected STA address")
55     sta2 = dev[0].get_sta(sta['addr'], next=True)
56     if sta2['addr'] not in addrs:
57         raise Exception("Unexpected STA2 address")
58     sta3 = dev[0].get_sta(sta2['addr'], next=True)
59     if len(sta3) != 0:
60         raise Exception("Unexpected STA iteration result (did not stop)")
61
62     status = dev[0].get_status()
63     if status['mode'] != "AP":
64         raise Exception("Unexpected status mode")
65
66     dev[1].dump_monitor()
67     dev[2].dump_monitor()
68     dev[0].request("DEAUTHENTICATE " + addr1)
69     dev[0].request("DISASSOCIATE " + addr2)
70     ev = dev[1].wait_event(["CTRL-EVENT-DISCONNECTED"])
71     if ev is None:
72         raise Exception("Disconnection timed out")
73     ev = dev[2].wait_event(["CTRL-EVENT-DISCONNECTED"])
74     if ev is None:
75         raise Exception("Disconnection timed out")
76     ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"])
77     if ev is None:
78         raise Exception("Reconnection timed out")
79     ev = dev[2].wait_event(["CTRL-EVENT-CONNECTED"])
80     if ev is None:
81         raise Exception("Reconnection timed out")
82     dev[1].request("DISCONNECT")
83     dev[2].request("DISCONNECT")
84
85 def test_wpas_ap_wep(dev):
86     """wpa_supplicant AP mode - WEP"""
87     id = dev[0].add_network()
88     dev[0].set_network(id, "mode", "2")
89     dev[0].set_network_quoted(id, "ssid", "wpas-ap-wep")
90     dev[0].set_network(id, "key_mgmt", "NONE")
91     dev[0].set_network(id, "frequency", "2412")
92     dev[0].set_network(id, "scan_freq", "2412")
93     dev[0].set_network_quoted(id, "wep_key0", "hello")
94     dev[0].select_network(id)
95     wait_ap_ready(dev[0])
96
97     dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"',
98                    scan_freq="2412")
99     hwsim_utils.test_connectivity(dev[0], dev[1])
100     dev[1].request("DISCONNECT")
101
102 def test_wpas_ap_no_ssid(dev):
103     """wpa_supplicant AP mode - invalid network configuration"""
104     id = dev[0].add_network()
105     dev[0].set_network(id, "mode", "2")
106     dev[0].set_network(id, "key_mgmt", "NONE")
107     dev[0].set_network(id, "frequency", "2412")
108     dev[0].set_network(id, "scan_freq", "2412")
109     dev[0].select_network(id)
110     ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
111     if ev is not None:
112         raise Exception("Unexpected AP start")
113
114 def test_wpas_ap_default_frequency(dev):
115     """wpa_supplicant AP mode - default frequency"""
116     id = dev[0].add_network()
117     dev[0].set_network(id, "mode", "2")
118     dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
119     dev[0].set_network(id, "key_mgmt", "NONE")
120     dev[0].set_network(id, "scan_freq", "2412")
121     dev[0].select_network(id)
122     wait_ap_ready(dev[0])
123     dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462")
124     dev[1].request("DISCONNECT")
125
126 def test_wpas_ap_invalid_frequency(dev):
127     """wpa_supplicant AP mode - invalid frequency configuration"""
128     id = dev[0].add_network()
129     dev[0].set_network(id, "mode", "2")
130     dev[0].set_network_quoted(id, "ssid", "wpas-ap-open")
131     dev[0].set_network(id, "key_mgmt", "NONE")
132     dev[0].set_network(id, "frequency", "2413")
133     dev[0].set_network(id, "scan_freq", "2412")
134     dev[0].select_network(id)
135     ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1)
136     if ev is not None:
137         raise Exception("Unexpected AP start")
138
139 def test_wpas_ap_wps(dev):
140     """wpa_supplicant AP mode - WPS operations"""
141     id = dev[0].add_network()
142     dev[0].set_network(id, "mode", "2")
143     dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
144     dev[0].set_network_quoted(id, "psk", "1234567890")
145     dev[0].set_network(id, "frequency", "2412")
146     dev[0].set_network(id, "scan_freq", "2412")
147     dev[0].select_network(id)
148     wait_ap_ready(dev[0])
149     bssid = dev[0].p2p_interface_addr()
150
151     logger.info("Test PBC mode start/stop")
152     if "FAIL" not in dev[0].request("WPS_CANCEL"):
153         raise Exception("Unexpected WPS_CANCEL success")
154     dev[0].request("WPS_PBC")
155     ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
156     if ev is None:
157         raise Exception("PBC mode start timeout")
158     if "OK" not in dev[0].request("WPS_CANCEL"):
159         raise Exception("Unexpected WPS_CANCEL failure")
160     ev = dev[0].wait_event(["WPS-TIMEOUT"])
161     if ev is None:
162         raise Exception("PBC mode disabling timeout")
163
164     logger.info("Test PBC protocol run")
165     dev[0].request("WPS_PBC")
166     ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
167     if ev is None:
168         raise Exception("PBC mode start timeout")
169     dev[1].request("WPS_PBC")
170     ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30)
171     if ev is None:
172         raise Exception("WPS PBC operation timed out")
173     hwsim_utils.test_connectivity(dev[0], dev[1])
174
175     logger.info("Test AP PIN to learn configuration")
176     pin = dev[0].request("WPS_AP_PIN random")
177     if "FAIL" in pin:
178         raise Exception("Could not generate random AP PIN")
179     if pin not in dev[0].request("WPS_AP_PIN get"):
180         raise Exception("Could not fetch current AP PIN")
181     dev[2].wps_reg(bssid, pin)
182     hwsim_utils.test_connectivity(dev[1], dev[2])
183
184     dev[1].request("REMOVE_NETWORK all")
185     dev[2].request("REMOVE_NETWORK all")
186
187     logger.info("Test AP PIN operations")
188     dev[0].request("WPS_AP_PIN disable")
189     dev[0].request("WPS_AP_PIN set " + pin + " 1")
190     time.sleep(1.1)
191     if "FAIL" not in dev[0].request("WPS_AP_PIN get"):
192         raise Exception("AP PIN unexpectedly still enabled")
193
194     pin = dev[1].wps_read_pin()
195     dev[0].request("WPS_PIN any " + pin)
196     dev[1].request("WPS_PIN any " + pin)
197     ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30)
198     if ev is None:
199         raise Exception("Association with the AP timed out")
200     dev[1].request("REMOVE_NETWORK all")
201     dev[1].dump_monitor()
202
203     dev[0].request("WPS_PIN any " + pin + " 100")
204     dev[1].request("WPS_PIN any " + pin)
205     ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30)
206     if ev is None:
207         raise Exception("Association with the AP timed out")
208     dev[1].request("REMOVE_NETWORK all")
209     dev[1].dump_monitor()
210
211     dev[0].request("WPS_AP_PIN set 12345670")
212     dev[0].dump_monitor()
213
214     runs = ("88887777", "12340000", "00000000", "12345670")
215     for pin in runs:
216         logger.info("Try AP PIN " + pin)
217         dev[2].dump_monitor()
218         dev[2].request("WPS_REG " + bssid + " " + pin)
219         ev = dev[2].wait_event(["WPS-SUCCESS", "WPS-FAIL msg"], timeout=15)
220         if ev is None:
221             raise Exception("WPS operation timed out")
222         if "WPS-SUCCESS" in ev:
223             raise Exception("WPS operation succeeded unexpectedly")
224         ev = dev[2].wait_event(["CTRL-EVENT-DISCONNECTED"])
225         if ev is None:
226             raise Exception("Timeout while waiting for disconnection")
227         dev[2].request("WPS_CANCEL")
228         dev[2].request("REMOVE_NETWORK all")
229     ev = dev[0].wait_event(["WPS-AP-SETUP-LOCKED"])
230     if ev is None:
231         raise Exception("WPS AP PIN not locked")
232
233     dev[0].dump_monitor()
234     logger.info("Test random AP PIN timeout")
235     pin = dev[0].request("WPS_AP_PIN random 1")
236     if "FAIL" in pin:
237         raise Exception("Could not generate random AP PIN")
238     res = dev[0].request("WPS_AP_PIN get")
239     if pin not in res:
240         raise Exception("Could not fetch current AP PIN")
241     for i in range(10):
242         time.sleep(0.2)
243         res = dev[0].request("WPS_AP_PIN get")
244         if "FAIL" in res:
245             break
246     if "FAIL" not in res:
247         raise Exception("WPS_AP_PIN random timeout did not work")
248
249     if "FAIL" not in dev[0].request("WPS_AP_PIN foo"):
250         raise Exception("Invalid WPS_AP_PIN command not rejected")
251     if "FAIL" not in dev[0].request("WPS_AP_PIN set"):
252         raise Exception("Invalid WPS_AP_PIN command not rejected")
253
254 def test_wpas_ap_wps_pbc_overlap(dev):
255     """wpa_supplicant AP mode - WPS operations with PBC overlap"""
256     id = dev[0].add_network()
257     dev[0].set_network(id, "mode", "2")
258     dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps")
259     dev[0].set_network_quoted(id, "psk", "1234567890")
260     dev[0].set_network(id, "frequency", "2412")
261     dev[0].set_network(id, "scan_freq", "2412")
262     dev[0].select_network(id)
263     wait_ap_ready(dev[0])
264     bssid = dev[0].p2p_interface_addr()
265
266     dev[1].scan_for_bss(bssid, freq="2412")
267     dev[1].dump_monitor()
268     dev[2].scan_for_bss(bssid, freq="2412")
269     dev[2].dump_monitor()
270     dev[0].request("WPS_PBC")
271     dev[1].request("WPS_PBC " + bssid)
272     dev[2].request("WPS_PBC " + bssid)
273
274     ev = dev[1].wait_event(["WPS-M2D"], timeout=15)
275     if ev is None:
276         raise Exception("PBC session overlap not detected (dev1)")
277     if "config_error=12" not in ev:
278         raise Exception("PBC session overlap not correctly reported (dev1)")
279
280     ev = dev[2].wait_event(["WPS-M2D"], timeout=15)
281     if ev is None:
282         raise Exception("PBC session overlap not detected (dev2)")
283     if "config_error=12" not in ev:
284         raise Exception("PBC session overlap not correctly reported (dev2)")
285
286     if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC"):
287         raise Exception("WPS_PBC(AP) accepted during overlap")
288     if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC any"):
289         raise Exception("WPS_PBC(AP) accepted during overlap")
290     dev[0].request("WPS_CANCEL")
291     dev[1].request("WPS_CANCEL")
292     dev[2].request("WPS_CANCEL")