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()
13 def wait_ap_ready(dev):
14 ev = dev.wait_event(["CTRL-EVENT-CONNECTED"])
16 raise Exception("AP failed to start")
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")
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)
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")
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])
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)
60 raise Exception("Unexpected STA iteration result (did not stop)")
62 status = dev[0].get_status()
63 if status['mode'] != "AP":
64 raise Exception("Unexpected status mode")
68 dev[0].request("DEAUTHENTICATE " + addr1)
69 dev[0].request("DISASSOCIATE " + addr2)
70 ev = dev[1].wait_event(["CTRL-EVENT-DISCONNECTED"])
72 raise Exception("Disconnection timed out")
73 ev = dev[2].wait_event(["CTRL-EVENT-DISCONNECTED"])
75 raise Exception("Disconnection timed out")
76 ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"])
78 raise Exception("Reconnection timed out")
79 ev = dev[2].wait_event(["CTRL-EVENT-CONNECTED"])
81 raise Exception("Reconnection timed out")
82 dev[1].request("DISCONNECT")
83 dev[2].request("DISCONNECT")
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)
97 dev[1].connect("wpas-ap-wep", key_mgmt="NONE", wep_key0='"hello"',
99 hwsim_utils.test_connectivity(dev[0], dev[1])
100 dev[1].request("DISCONNECT")
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)
112 raise Exception("Unexpected AP start")
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")
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)
137 raise Exception("Unexpected AP start")
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()
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"])
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"])
162 raise Exception("PBC mode disabling timeout")
164 logger.info("Test PBC protocol run")
165 dev[0].request("WPS_PBC")
166 ev = dev[0].wait_event(["WPS-PBC-ACTIVE"])
168 raise Exception("PBC mode start timeout")
169 dev[1].request("WPS_PBC")
170 ev = dev[1].wait_event(["CTRL-EVENT-CONNECTED"], timeout=30)
172 raise Exception("WPS PBC operation timed out")
173 hwsim_utils.test_connectivity(dev[0], dev[1])
175 logger.info("Test AP PIN to learn configuration")
176 pin = dev[0].request("WPS_AP_PIN random")
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])
184 dev[1].request("REMOVE_NETWORK all")
185 dev[2].request("REMOVE_NETWORK all")
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")
191 if "FAIL" not in dev[0].request("WPS_AP_PIN get"):
192 raise Exception("AP PIN unexpectedly still enabled")
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)
199 raise Exception("Association with the AP timed out")
200 dev[1].request("REMOVE_NETWORK all")
201 dev[1].dump_monitor()
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)
207 raise Exception("Association with the AP timed out")
208 dev[1].request("REMOVE_NETWORK all")
209 dev[1].dump_monitor()
211 dev[0].request("WPS_AP_PIN set 12345670")
212 dev[0].dump_monitor()
214 runs = ("88887777", "12340000", "00000000", "12345670")
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)
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"])
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"])
231 raise Exception("WPS AP PIN not locked")
233 dev[0].dump_monitor()
234 logger.info("Test random AP PIN timeout")
235 pin = dev[0].request("WPS_AP_PIN random 1")
237 raise Exception("Could not generate random AP PIN")
238 res = dev[0].request("WPS_AP_PIN get")
240 raise Exception("Could not fetch current AP PIN")
243 res = dev[0].request("WPS_AP_PIN get")
246 if "FAIL" not in res:
247 raise Exception("WPS_AP_PIN random timeout did not work")
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")
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()
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)
274 ev = dev[1].wait_event(["WPS-M2D"], timeout=15)
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)")
280 ev = dev[2].wait_event(["WPS-M2D"], timeout=15)
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)")
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")