1 # wpa_supplicant AP mode tests
2 # Copyright (c) 2014, Qualcomm Atheros, Inc.
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
9 logger = logging.getLogger()
12 from utils import HwsimSkip
13 from test_p2p_channel import set_country
15 def wait_ap_ready(dev):
16 ev = dev.wait_event(["CTRL-EVENT-CONNECTED"])
18 raise Exception("AP failed to start")
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")
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)
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")
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])
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)
62 raise Exception("Unexpected STA iteration result (did not stop)")
64 status = dev[0].get_status()
65 if status['mode'] != "AP":
66 raise Exception("Unexpected status mode")
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")
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)
91 dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"',
93 hwsim_utils.test_connectivity(dev[0], dev[1])
94 dev[1].request("DISCONNECT")
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)
106 raise Exception("Unexpected AP start")
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")
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)
131 raise Exception("Unexpected AP start")
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()
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"])
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"])
156 raise Exception("PBC mode disabling timeout")
158 logger.info("Test PBC protocol run")
159 dev[0].request("WPS_PBC")
160 ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
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])
167 logger.info("Test AP PIN to learn configuration")
168 pin = dev[0].request("WPS_AP_PIN random")
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])
176 dev[1].request("REMOVE_NETWORK all")
177 dev[2].request("REMOVE_NETWORK all")
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")
183 if "FAIL" not in dev[0].request("WPS_AP_PIN get"):
184 raise Exception("AP PIN unexpectedly still enabled")
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()
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()
199 dev[0].request("WPS_AP_PIN set 12345670")
200 dev[0].dump_monitor()
202 runs = ("88887777", "12340000", "00000000", "12345670")
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)
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"])
217 raise Exception("WPS AP PIN not locked")
219 dev[0].dump_monitor()
220 logger.info("Test random AP PIN timeout")
221 pin = dev[0].request("WPS_AP_PIN random 1")
223 raise Exception("Could not generate random AP PIN")
224 res = dev[0].request("WPS_AP_PIN get")
226 raise Exception("Could not fetch current AP PIN")
229 res = dev[0].request("WPS_AP_PIN get")
232 if "FAIL" not in res:
233 raise Exception("WPS_AP_PIN random timeout did not work")
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")
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()
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)
260 ev = dev[1].wait_event(["WPS-M2D"], timeout=15)
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)")
266 ev = dev[2].wait_event(["WPS-M2D"], timeout=15)
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)")
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")
280 def test_wpas_ap_dfs(dev):
281 """wpa_supplicant AP mode - DFS"""
283 _test_wpas_ap_dfs(dev)
286 dev[0].request("SET country 00")
287 dev[1].flush_scan_cache()
289 def _test_wpas_ap_dfs(dev):
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)
300 ev = dev[0].wait_event(["DFS-CAC-START"])
302 # For now, assume DFS is not supported by all kernel builds.
303 raise HwsimSkip("CAC did not start - assume not supported")
305 ev = dev[0].wait_event(["DFS-CAC-COMPLETED"], timeout=70)
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")
313 ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"])
315 raise Exception("AP failed to start")
317 dev[1].connect("wpas-ap-dfs", key_mgmt="NONE")
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)
328 ev = dev[0].wait_event(["AP-ENABLED"])
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"])
335 raise Exception("AP-DISABLED event not seen")
336 dev[0].wait_disconnected()