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