]>
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 | ||
7 | import time | |
8 | import logging | |
9 | logger = logging.getLogger() | |
10 | ||
11 | import hwsim_utils | |
12 | ||
9905de31 JM |
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 | ||
e1a5e09a JM |
18 | def test_wpas_ap_open(dev): |
19 | """wpa_supplicant AP mode - open network""" | |
e869f812 JM |
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 | ||
e1a5e09a JM |
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) | |
9905de31 | 34 | wait_ap_ready(dev[0]) |
e1a5e09a | 35 | |
e869f812 JM |
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 | ||
e1a5e09a JM |
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") | |
a8375c94 JM |
43 | hwsim_utils.test_connectivity(dev[0], dev[1]) |
44 | hwsim_utils.test_connectivity(dev[1], dev[2]) | |
e1a5e09a JM |
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) | |
5f35a5e2 JM |
70 | dev[1].wait_disconnected(timeout=10) |
71 | dev[2].wait_disconnected(timeout=10) | |
72 | dev[1].wait_connected(timeout=10, error="Reconnection timed out") | |
73 | dev[2].wait_connected(timeout=10, error="Reconnection timed out") | |
9905de31 JM |
74 | dev[1].request("DISCONNECT") |
75 | dev[2].request("DISCONNECT") | |
e1a5e09a JM |
76 | |
77 | def test_wpas_ap_wep(dev): | |
78 | """wpa_supplicant AP mode - WEP""" | |
79 | id = dev[0].add_network() | |
80 | dev[0].set_network(id, "mode", "2") | |
81 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-wep") | |
82 | dev[0].set_network(id, "key_mgmt", "NONE") | |
83 | dev[0].set_network(id, "frequency", "2412") | |
84 | dev[0].set_network(id, "scan_freq", "2412") | |
85 | dev[0].set_network_quoted(id, "wep_key0", "hello") | |
86 | dev[0].select_network(id) | |
9905de31 | 87 | wait_ap_ready(dev[0]) |
e1a5e09a JM |
88 | |
89 | dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"', | |
90 | scan_freq="2412") | |
a8375c94 | 91 | hwsim_utils.test_connectivity(dev[0], dev[1]) |
9905de31 | 92 | dev[1].request("DISCONNECT") |
e1a5e09a JM |
93 | |
94 | def test_wpas_ap_no_ssid(dev): | |
95 | """wpa_supplicant AP mode - invalid network configuration""" | |
96 | id = dev[0].add_network() | |
97 | dev[0].set_network(id, "mode", "2") | |
98 | dev[0].set_network(id, "key_mgmt", "NONE") | |
99 | dev[0].set_network(id, "frequency", "2412") | |
100 | dev[0].set_network(id, "scan_freq", "2412") | |
101 | dev[0].select_network(id) | |
102 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1) | |
103 | if ev is not None: | |
104 | raise Exception("Unexpected AP start") | |
105 | ||
106 | def test_wpas_ap_default_frequency(dev): | |
107 | """wpa_supplicant AP mode - default frequency""" | |
108 | id = dev[0].add_network() | |
109 | dev[0].set_network(id, "mode", "2") | |
110 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
111 | dev[0].set_network(id, "key_mgmt", "NONE") | |
112 | dev[0].set_network(id, "scan_freq", "2412") | |
113 | dev[0].select_network(id) | |
9905de31 | 114 | wait_ap_ready(dev[0]) |
e1a5e09a | 115 | dev[1].connect("wpas-ap-open", key_mgmt="NONE", scan_freq="2462") |
9905de31 | 116 | dev[1].request("DISCONNECT") |
e1a5e09a JM |
117 | |
118 | def test_wpas_ap_invalid_frequency(dev): | |
119 | """wpa_supplicant AP mode - invalid frequency configuration""" | |
120 | id = dev[0].add_network() | |
121 | dev[0].set_network(id, "mode", "2") | |
122 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-open") | |
123 | dev[0].set_network(id, "key_mgmt", "NONE") | |
124 | dev[0].set_network(id, "frequency", "2413") | |
125 | dev[0].set_network(id, "scan_freq", "2412") | |
126 | dev[0].select_network(id) | |
127 | ev = dev[0].wait_event(["CTRL-EVENT-CONNECTED"], timeout=1) | |
128 | if ev is not None: | |
129 | raise Exception("Unexpected AP start") | |
130 | ||
131 | def test_wpas_ap_wps(dev): | |
132 | """wpa_supplicant AP mode - WPS operations""" | |
133 | id = dev[0].add_network() | |
134 | dev[0].set_network(id, "mode", "2") | |
135 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps") | |
136 | dev[0].set_network_quoted(id, "psk", "1234567890") | |
137 | dev[0].set_network(id, "frequency", "2412") | |
138 | dev[0].set_network(id, "scan_freq", "2412") | |
139 | dev[0].select_network(id) | |
9905de31 | 140 | wait_ap_ready(dev[0]) |
e1a5e09a JM |
141 | bssid = dev[0].p2p_interface_addr() |
142 | ||
143 | logger.info("Test PBC mode start/stop") | |
144 | if "FAIL" not in dev[0].request("WPS_CANCEL"): | |
145 | raise Exception("Unexpected WPS_CANCEL success") | |
146 | dev[0].request("WPS_PBC") | |
147 | ev = dev[0].wait_event(["WPS-PBC-ACTIVE"]) | |
148 | if ev is None: | |
149 | raise Exception("PBC mode start timeout") | |
150 | if "OK" not in dev[0].request("WPS_CANCEL"): | |
151 | raise Exception("Unexpected WPS_CANCEL failure") | |
152 | ev = dev[0].wait_event(["WPS-TIMEOUT"]) | |
153 | if ev is None: | |
154 | raise Exception("PBC mode disabling timeout") | |
155 | ||
156 | logger.info("Test PBC protocol run") | |
157 | dev[0].request("WPS_PBC") | |
158 | ev = dev[0].wait_event(["WPS-PBC-ACTIVE"]) | |
159 | if ev is None: | |
160 | raise Exception("PBC mode start timeout") | |
161 | dev[1].request("WPS_PBC") | |
5f35a5e2 | 162 | dev[1].wait_connected(timeout=30, error="WPS PBC operation timed out") |
a8375c94 | 163 | hwsim_utils.test_connectivity(dev[0], dev[1]) |
e1a5e09a JM |
164 | |
165 | logger.info("Test AP PIN to learn configuration") | |
166 | pin = dev[0].request("WPS_AP_PIN random") | |
167 | if "FAIL" in pin: | |
168 | raise Exception("Could not generate random AP PIN") | |
169 | if pin not in dev[0].request("WPS_AP_PIN get"): | |
170 | raise Exception("Could not fetch current AP PIN") | |
171 | dev[2].wps_reg(bssid, pin) | |
a8375c94 | 172 | hwsim_utils.test_connectivity(dev[1], dev[2]) |
e1a5e09a JM |
173 | |
174 | dev[1].request("REMOVE_NETWORK all") | |
175 | dev[2].request("REMOVE_NETWORK all") | |
176 | ||
177 | logger.info("Test AP PIN operations") | |
178 | dev[0].request("WPS_AP_PIN disable") | |
179 | dev[0].request("WPS_AP_PIN set " + pin + " 1") | |
180 | time.sleep(1.1) | |
181 | if "FAIL" not in dev[0].request("WPS_AP_PIN get"): | |
182 | raise Exception("AP PIN unexpectedly still enabled") | |
183 | ||
184 | pin = dev[1].wps_read_pin() | |
185 | dev[0].request("WPS_PIN any " + pin) | |
186 | dev[1].request("WPS_PIN any " + pin) | |
5f35a5e2 | 187 | dev[1].wait_connected(timeout=30) |
6e12eaa4 JM |
188 | dev[1].request("REMOVE_NETWORK all") |
189 | dev[1].dump_monitor() | |
190 | ||
191 | dev[0].request("WPS_PIN any " + pin + " 100") | |
192 | dev[1].request("WPS_PIN any " + pin) | |
5f35a5e2 | 193 | dev[1].wait_connected(timeout=30) |
e1a5e09a JM |
194 | dev[1].request("REMOVE_NETWORK all") |
195 | dev[1].dump_monitor() | |
196 | ||
197 | dev[0].request("WPS_AP_PIN set 12345670") | |
198 | dev[0].dump_monitor() | |
199 | ||
200 | runs = ("88887777", "12340000", "00000000", "12345670") | |
201 | for pin in runs: | |
202 | logger.info("Try AP PIN " + pin) | |
203 | dev[2].dump_monitor() | |
204 | dev[2].request("WPS_REG " + bssid + " " + pin) | |
205 | ev = dev[2].wait_event(["WPS-SUCCESS", "WPS-FAIL msg"], timeout=15) | |
206 | if ev is None: | |
207 | raise Exception("WPS operation timed out") | |
208 | if "WPS-SUCCESS" in ev: | |
209 | raise Exception("WPS operation succeeded unexpectedly") | |
5f35a5e2 | 210 | dev[2].wait_disconnected(timeout=10) |
e1a5e09a JM |
211 | dev[2].request("WPS_CANCEL") |
212 | dev[2].request("REMOVE_NETWORK all") | |
213 | ev = dev[0].wait_event(["WPS-AP-SETUP-LOCKED"]) | |
214 | if ev is None: | |
215 | raise Exception("WPS AP PIN not locked") | |
8e33f9c6 JM |
216 | |
217 | dev[0].dump_monitor() | |
218 | logger.info("Test random AP PIN timeout") | |
219 | pin = dev[0].request("WPS_AP_PIN random 1") | |
220 | if "FAIL" in pin: | |
221 | raise Exception("Could not generate random AP PIN") | |
222 | res = dev[0].request("WPS_AP_PIN get") | |
223 | if pin not in res: | |
224 | raise Exception("Could not fetch current AP PIN") | |
225 | for i in range(10): | |
226 | time.sleep(0.2) | |
227 | res = dev[0].request("WPS_AP_PIN get") | |
228 | if "FAIL" in res: | |
229 | break | |
230 | if "FAIL" not in res: | |
231 | raise Exception("WPS_AP_PIN random timeout did not work") | |
232 | ||
233 | if "FAIL" not in dev[0].request("WPS_AP_PIN foo"): | |
234 | raise Exception("Invalid WPS_AP_PIN command not rejected") | |
235 | if "FAIL" not in dev[0].request("WPS_AP_PIN set"): | |
236 | raise Exception("Invalid WPS_AP_PIN command not rejected") | |
b37dac50 JM |
237 | |
238 | def test_wpas_ap_wps_pbc_overlap(dev): | |
239 | """wpa_supplicant AP mode - WPS operations with PBC overlap""" | |
240 | id = dev[0].add_network() | |
241 | dev[0].set_network(id, "mode", "2") | |
242 | dev[0].set_network_quoted(id, "ssid", "wpas-ap-wps") | |
243 | dev[0].set_network_quoted(id, "psk", "1234567890") | |
244 | dev[0].set_network(id, "frequency", "2412") | |
245 | dev[0].set_network(id, "scan_freq", "2412") | |
246 | dev[0].select_network(id) | |
247 | wait_ap_ready(dev[0]) | |
248 | bssid = dev[0].p2p_interface_addr() | |
249 | ||
250 | dev[1].scan_for_bss(bssid, freq="2412") | |
251 | dev[1].dump_monitor() | |
252 | dev[2].scan_for_bss(bssid, freq="2412") | |
253 | dev[2].dump_monitor() | |
254 | dev[0].request("WPS_PBC") | |
255 | dev[1].request("WPS_PBC " + bssid) | |
256 | dev[2].request("WPS_PBC " + bssid) | |
257 | ||
258 | ev = dev[1].wait_event(["WPS-M2D"], timeout=15) | |
259 | if ev is None: | |
260 | raise Exception("PBC session overlap not detected (dev1)") | |
261 | if "config_error=12" not in ev: | |
262 | raise Exception("PBC session overlap not correctly reported (dev1)") | |
263 | ||
264 | ev = dev[2].wait_event(["WPS-M2D"], timeout=15) | |
265 | if ev is None: | |
266 | raise Exception("PBC session overlap not detected (dev2)") | |
267 | if "config_error=12" not in ev: | |
268 | raise Exception("PBC session overlap not correctly reported (dev2)") | |
269 | ||
270 | if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC"): | |
271 | raise Exception("WPS_PBC(AP) accepted during overlap") | |
272 | if "FAIL-PBC-OVERLAP" not in dev[0].request("WPS_PBC any"): | |
273 | raise Exception("WPS_PBC(AP) accepted during overlap") | |
274 | dev[0].request("WPS_CANCEL") | |
275 | dev[1].request("WPS_CANCEL") | |
276 | dev[2].request("WPS_CANCEL") |