]>
Commit | Line | Data |
---|---|---|
4ea8d3b5 | 1 | # P2P autonomous GO test cases |
eb9c1554 | 2 | # Copyright (c) 2013-2015, Jouni Malinen <j@w1.fi> |
4ea8d3b5 JM |
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 |
7cb08cdb | 8 | import time |
07a2e61b | 9 | import subprocess |
4ea8d3b5 | 10 | import logging |
c9aa4308 | 11 | logger = logging.getLogger() |
4ea8d3b5 JM |
12 | |
13 | import hwsim_utils | |
19ae1d07 | 14 | import utils |
81e787b7 | 15 | from utils import HwsimSkip |
c7860beb | 16 | from wlantest import Wlantest |
0afb797e | 17 | from wpasupplicant import WpaSupplicant |
9cb34130 JM |
18 | from p2p_utils import * |
19 | from test_p2p_messages import mgmt_tx, parse_p2p_public_action | |
4ea8d3b5 JM |
20 | |
21 | def test_autogo(dev): | |
47c34473 | 22 | """P2P autonomous GO and client joining group""" |
ca9b78ad JM |
23 | addr0 = dev[0].p2p_dev_addr() |
24 | addr2 = dev[2].p2p_dev_addr() | |
19ae1d07 JM |
25 | res = autogo(dev[0]) |
26 | if "p2p-wlan" in res['ifname']: | |
27 | raise Exception("Unexpected group interface name on GO") | |
28 | res = connect_cli(dev[0], dev[1]) | |
29 | if "p2p-wlan" in res['ifname']: | |
30 | raise Exception("Unexpected group interface name on client") | |
36f28187 IP |
31 | bss = dev[1].get_bss("p2p_dev_addr=" + addr0, res['ifname']) |
32 | if not bss or bss['bssid'] != dev[0].p2p_interface_addr(): | |
3a64d523 JM |
33 | raise Exception("Unexpected BSSID in the BSS entry for the GO") |
34 | id = bss['id'] | |
36f28187 IP |
35 | bss = dev[1].get_bss("ID-" + id, res['ifname']) |
36 | if not bss or bss['id'] != id: | |
3a64d523 | 37 | raise Exception("Could not find BSS entry based on id") |
36f28187 | 38 | res = dev[1].group_request("BSS RANGE=" + id + "- MASK=0x1") |
3a64d523 JM |
39 | if "id=" + id not in res: |
40 | raise Exception("Could not find BSS entry based on id range") | |
984c5b96 | 41 | |
d463c556 JM |
42 | res = dev[1].request("SCAN_RESULTS") |
43 | if "[P2P]" not in res: | |
44 | raise Exception("P2P flag missing from scan results: " + res) | |
45 | ||
984c5b96 | 46 | # Presence request to increase testing coverage |
bf1b5973 JM |
47 | if "FAIL" not in dev[1].group_request("P2P_PRESENCE_REQ 30000"): |
48 | raise Exception("Invald P2P_PRESENCE_REQ accepted") | |
49 | if "FAIL" not in dev[1].group_request("P2P_PRESENCE_REQ 30000 102400 30001"): | |
50 | raise Exception("Invald P2P_PRESENCE_REQ accepted") | |
984c5b96 JM |
51 | if "FAIL" in dev[1].group_request("P2P_PRESENCE_REQ 30000 102400"): |
52 | raise Exception("Could not send presence request") | |
d4f2ba74 | 53 | ev = dev[1].wait_group_event(["P2P-PRESENCE-RESPONSE"], 10) |
bf1b5973 JM |
54 | if ev is None: |
55 | raise Exception("Timeout while waiting for Presence Response") | |
56 | if "FAIL" in dev[1].group_request("P2P_PRESENCE_REQ 30000 102400 20000 102400"): | |
57 | raise Exception("Could not send presence request") | |
c0b57b24 | 58 | ev = dev[1].wait_group_event(["P2P-PRESENCE-RESPONSE"]) |
bf1b5973 JM |
59 | if ev is None: |
60 | raise Exception("Timeout while waiting for Presence Response") | |
61 | if "FAIL" in dev[1].group_request("P2P_PRESENCE_REQ"): | |
62 | raise Exception("Could not send presence request") | |
c0b57b24 | 63 | ev = dev[1].wait_group_event(["P2P-PRESENCE-RESPONSE"]) |
984c5b96 JM |
64 | if ev is None: |
65 | raise Exception("Timeout while waiting for Presence Response") | |
66 | ||
ca9b78ad JM |
67 | if not dev[2].discover_peer(addr0): |
68 | raise Exception("Could not discover GO") | |
69 | dev[0].dump_monitor() | |
70 | dev[2].global_request("P2P_PROV_DISC " + addr0 + " display join") | |
71 | ev = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=10) | |
72 | if ev is None: | |
73 | raise Exception("GO did not report P2P-PROV-DISC-SHOW-PIN") | |
74 | if "p2p_dev_addr=" + addr2 not in ev: | |
75 | raise Exception("Unexpected P2P Device Address in event: " + ev) | |
76 | if "group=" + dev[0].group_ifname not in ev: | |
77 | raise Exception("Unexpected group interface in event: " + ev) | |
78 | ev = dev[2].wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10) | |
79 | if ev is None: | |
80 | raise Exception("P2P-PROV-DISC-ENTER-PIN not reported") | |
81 | ||
19ae1d07 JM |
82 | dev[0].remove_group() |
83 | dev[1].wait_go_ending_session() | |
84 | ||
85 | def test_autogo2(dev): | |
86 | """P2P autonomous GO with a separate group interface and client joining group""" | |
9c01d6a9 | 87 | dev[0].global_request("SET p2p_no_group_iface 0") |
ee3f9f38 | 88 | res = autogo(dev[0], freq=2437) |
19ae1d07 JM |
89 | if "p2p-wlan" not in res['ifname']: |
90 | raise Exception("Unexpected group interface name on GO") | |
91 | if res['ifname'] not in utils.get_ifnames(): | |
92 | raise Exception("Could not find group interface netdev") | |
ee3f9f38 | 93 | connect_cli(dev[0], dev[1], social=True, freq=2437) |
4ea8d3b5 | 94 | dev[0].remove_group() |
2c914e24 | 95 | dev[1].wait_go_ending_session() |
19ae1d07 JM |
96 | if res['ifname'] in utils.get_ifnames(): |
97 | raise Exception("Group interface netdev was not removed") | |
98 | ||
99 | def test_autogo3(dev): | |
100 | """P2P autonomous GO and client with a separate group interface joining group""" | |
9c01d6a9 | 101 | dev[1].global_request("SET p2p_no_group_iface 0") |
ee3f9f38 JM |
102 | autogo(dev[0], freq=2462) |
103 | res = connect_cli(dev[0], dev[1], social=True, freq=2462) | |
19ae1d07 JM |
104 | if "p2p-wlan" not in res['ifname']: |
105 | raise Exception("Unexpected group interface name on client") | |
106 | if res['ifname'] not in utils.get_ifnames(): | |
107 | raise Exception("Could not find group interface netdev") | |
108 | dev[0].remove_group() | |
109 | dev[1].wait_go_ending_session() | |
110 | dev[1].ping() | |
111 | if res['ifname'] in utils.get_ifnames(): | |
112 | raise Exception("Group interface netdev was not removed") | |
113 | ||
114 | def test_autogo4(dev): | |
115 | """P2P autonomous GO and client joining group (both with a separate group interface)""" | |
9c01d6a9 IP |
116 | dev[0].global_request("SET p2p_no_group_iface 0") |
117 | dev[1].global_request("SET p2p_no_group_iface 0") | |
ee3f9f38 JM |
118 | res1 = autogo(dev[0], freq=2412) |
119 | res2 = connect_cli(dev[0], dev[1], social=True, freq=2412) | |
19ae1d07 JM |
120 | if "p2p-wlan" not in res1['ifname']: |
121 | raise Exception("Unexpected group interface name on GO") | |
122 | if "p2p-wlan" not in res2['ifname']: | |
123 | raise Exception("Unexpected group interface name on client") | |
124 | ifnames = utils.get_ifnames() | |
125 | if res1['ifname'] not in ifnames: | |
126 | raise Exception("Could not find GO group interface netdev") | |
127 | if res2['ifname'] not in ifnames: | |
128 | raise Exception("Could not find client group interface netdev") | |
129 | dev[0].remove_group() | |
130 | dev[1].wait_go_ending_session() | |
131 | dev[1].ping() | |
132 | ifnames = utils.get_ifnames() | |
133 | if res1['ifname'] in ifnames: | |
134 | raise Exception("GO group interface netdev was not removed") | |
135 | if res2['ifname'] in ifnames: | |
136 | raise Exception("Client group interface netdev was not removed") | |
4ea8d3b5 | 137 | |
0afb797e JM |
138 | def test_autogo_m2d(dev): |
139 | """P2P autonomous GO and clients not authorized""" | |
ee3f9f38 | 140 | autogo(dev[0], freq=2412) |
0afb797e JM |
141 | go_addr = dev[0].p2p_dev_addr() |
142 | ||
8031003f | 143 | dev[1].global_request("SET p2p_no_group_iface 0") |
0afb797e JM |
144 | if not dev[1].discover_peer(go_addr, social=True): |
145 | raise Exception("GO " + go_addr + " not found") | |
146 | dev[1].dump_monitor() | |
147 | ||
148 | if not dev[2].discover_peer(go_addr, social=True): | |
149 | raise Exception("GO " + go_addr + " not found") | |
150 | dev[2].dump_monitor() | |
151 | ||
152 | logger.info("Trying to join the group when GO has not authorized the client") | |
153 | pin = dev[1].wps_read_pin() | |
154 | cmd = "P2P_CONNECT " + go_addr + " " + pin + " join" | |
155 | if "OK" not in dev[1].global_request(cmd): | |
156 | raise Exception("P2P_CONNECT join failed") | |
157 | ||
158 | pin = dev[2].wps_read_pin() | |
159 | cmd = "P2P_CONNECT " + go_addr + " " + pin + " join" | |
160 | if "OK" not in dev[2].global_request(cmd): | |
161 | raise Exception("P2P_CONNECT join failed") | |
162 | ||
cfbdb995 | 163 | ev = dev[1].wait_global_event(["WPS-M2D"], timeout=16) |
0afb797e JM |
164 | if ev is None: |
165 | raise Exception("No global M2D event") | |
166 | ifaces = dev[1].request("INTERFACES").splitlines() | |
167 | iface = ifaces[0] if "p2p-wlan" in ifaces[0] else ifaces[1] | |
168 | wpas = WpaSupplicant(ifname=iface) | |
169 | ev = wpas.wait_event(["WPS-M2D"], timeout=10) | |
170 | if ev is None: | |
171 | raise Exception("No M2D event on group interface") | |
172 | ||
173 | ev = dev[2].wait_global_event(["WPS-M2D"], timeout=10) | |
174 | if ev is None: | |
175 | raise Exception("No global M2D event (2)") | |
176 | ev = dev[2].wait_event(["WPS-M2D"], timeout=10) | |
177 | if ev is None: | |
178 | raise Exception("No M2D event on group interface (2)") | |
179 | ||
9fd6804d | 180 | @remote_compatible |
0afb797e JM |
181 | def test_autogo_fail(dev): |
182 | """P2P autonomous GO and incorrect PIN""" | |
ee3f9f38 | 183 | autogo(dev[0], freq=2412) |
0afb797e JM |
184 | go_addr = dev[0].p2p_dev_addr() |
185 | dev[0].p2p_go_authorize_client("00000000") | |
186 | ||
9c01d6a9 | 187 | dev[1].global_request("SET p2p_no_group_iface 0") |
0afb797e JM |
188 | if not dev[1].discover_peer(go_addr, social=True): |
189 | raise Exception("GO " + go_addr + " not found") | |
190 | dev[1].dump_monitor() | |
191 | ||
192 | logger.info("Trying to join the group when GO has not authorized the client") | |
193 | pin = dev[1].wps_read_pin() | |
194 | cmd = "P2P_CONNECT " + go_addr + " " + pin + " join" | |
195 | if "OK" not in dev[1].global_request(cmd): | |
196 | raise Exception("P2P_CONNECT join failed") | |
197 | ||
198 | ev = dev[1].wait_global_event(["WPS-FAIL"], timeout=10) | |
199 | if ev is None: | |
200 | raise Exception("No global WPS-FAIL event") | |
201 | ||
78ebbf09 | 202 | def test_autogo_2cli(dev): |
47c34473 | 203 | """P2P autonomous GO and two clients joining group""" |
ee3f9f38 JM |
204 | autogo(dev[0], freq=2412) |
205 | connect_cli(dev[0], dev[1], social=True, freq=2412) | |
206 | connect_cli(dev[0], dev[2], social=True, freq=2412) | |
78ebbf09 | 207 | hwsim_utils.test_connectivity_p2p(dev[1], dev[2]) |
672f3a72 | 208 | dev[0].global_request("P2P_REMOVE_CLIENT " + dev[1].p2p_dev_addr()) |
2c914e24 | 209 | dev[1].wait_go_ending_session() |
c93b6706 | 210 | dev[0].global_request("P2P_REMOVE_CLIENT iface=" + dev[2].p2p_interface_addr()) |
2c914e24 | 211 | dev[2].wait_go_ending_session() |
c93b6706 JM |
212 | if "FAIL" not in dev[0].global_request("P2P_REMOVE_CLIENT foo"): |
213 | raise Exception("Invalid P2P_REMOVE_CLIENT command accepted") | |
214 | dev[0].remove_group() | |
78ebbf09 | 215 | |
ab18b03b JM |
216 | def test_autogo_pbc(dev): |
217 | """P2P autonomous GO and PBC""" | |
c0b57b24 | 218 | dev[1].global_request("SET p2p_no_group_iface 0") |
ee3f9f38 | 219 | autogo(dev[0], freq=2412) |
ab18b03b JM |
220 | if "FAIL" not in dev[0].group_request("WPS_PBC p2p_dev_addr=00:11:22:33:44"): |
221 | raise Exception("Invalid WPS_PBC succeeded") | |
222 | if "OK" not in dev[0].group_request("WPS_PBC p2p_dev_addr=" + dev[1].p2p_dev_addr()): | |
223 | raise Exception("WPS_PBC failed") | |
224 | dev[2].p2p_connect_group(dev[0].p2p_dev_addr(), "pbc", timeout=0, | |
225 | social=True) | |
5590d2ec | 226 | ev = dev[2].wait_global_event(["WPS-M2D"], timeout=15) |
ab18b03b JM |
227 | if ev is None: |
228 | raise Exception("WPS-M2D not reported") | |
229 | if "config_error=12" not in ev: | |
230 | raise Exception("Unexpected config_error: " + ev) | |
231 | dev[1].p2p_connect_group(dev[0].p2p_dev_addr(), "pbc", timeout=15, | |
232 | social=True) | |
233 | ||
7cb08cdb | 234 | def test_autogo_tdls(dev): |
47c34473 | 235 | """P2P autonomous GO and two clients using TDLS""" |
07a2e61b JM |
236 | go = dev[0] |
237 | logger.info("Start autonomous GO with fixed parameters " + go.ifname) | |
238 | id = go.add_network() | |
239 | go.set_network_quoted(id, "ssid", "DIRECT-tdls") | |
240 | go.set_network_quoted(id, "psk", "12345678") | |
241 | go.set_network(id, "mode", "3") | |
242 | go.set_network(id, "disabled", "2") | |
ee3f9f38 | 243 | res = go.p2p_start_go(persistent=id, freq="2462") |
07a2e61b | 244 | logger.debug("res: " + str(res)) |
8efc83d4 JA |
245 | Wlantest.setup(go, True) |
246 | wt = Wlantest() | |
c7860beb JM |
247 | wt.flush() |
248 | wt.add_passphrase("12345678") | |
ee3f9f38 JM |
249 | connect_cli(go, dev[1], social=True, freq=2462) |
250 | connect_cli(go, dev[2], social=True, freq=2462) | |
7cb08cdb | 251 | hwsim_utils.test_connectivity_p2p(dev[1], dev[2]) |
07a2e61b JM |
252 | bssid = dev[0].p2p_interface_addr() |
253 | addr1 = dev[1].p2p_interface_addr() | |
7cb08cdb JM |
254 | addr2 = dev[2].p2p_interface_addr() |
255 | dev[1].tdls_setup(addr2) | |
256 | time.sleep(1) | |
257 | hwsim_utils.test_connectivity_p2p(dev[1], dev[2]) | |
bc6e3288 | 258 | conf = wt.get_tdls_counter("setup_conf_ok", bssid, addr1, addr2) |
07a2e61b JM |
259 | if conf == 0: |
260 | raise Exception("No TDLS Setup Confirm (success) seen") | |
bc6e3288 | 261 | dl = wt.get_tdls_counter("valid_direct_link", bssid, addr1, addr2) |
07a2e61b JM |
262 | if dl == 0: |
263 | raise Exception("No valid frames through direct link") | |
bc6e3288 | 264 | wt.tdls_clear(bssid, addr1, addr2) |
7cb08cdb JM |
265 | dev[1].tdls_teardown(addr2) |
266 | time.sleep(1) | |
bc6e3288 | 267 | teardown = wt.get_tdls_counter("teardown", bssid, addr1, addr2) |
d014a150 | 268 | if teardown == 0: |
07a2e61b | 269 | raise Exception("No TDLS Setup Teardown seen") |
bc6e3288 | 270 | wt.tdls_clear(bssid, addr1, addr2) |
7cb08cdb | 271 | hwsim_utils.test_connectivity_p2p(dev[1], dev[2]) |
bc6e3288 | 272 | ap_path = wt.get_tdls_counter("valid_ap_path", bssid, addr1, addr2) |
07a2e61b JM |
273 | if ap_path == 0: |
274 | raise Exception("No valid frames via AP path") | |
bc6e3288 | 275 | direct_link = wt.get_tdls_counter("valid_direct_link", bssid, addr1, addr2) |
07a2e61b JM |
276 | if direct_link > 0: |
277 | raise Exception("Unexpected frames through direct link") | |
c7860beb | 278 | idirect_link = wt.get_tdls_counter("invalid_direct_link", bssid, addr1, |
bc6e3288 | 279 | addr2) |
07a2e61b JM |
280 | if idirect_link > 0: |
281 | raise Exception("Unexpected frames through direct link (invalid)") | |
7cb08cdb JM |
282 | dev[2].remove_group() |
283 | dev[1].remove_group() | |
284 | dev[0].remove_group() | |
7ebf841f JM |
285 | |
286 | def test_autogo_legacy(dev): | |
287 | """P2P autonomous GO and legacy clients""" | |
ee3f9f38 | 288 | res = autogo(dev[0], freq=2462) |
f44c45ac JM |
289 | if dev[0].get_group_status_field("passphrase", extra="WPS") != res['passphrase']: |
290 | raise Exception("passphrase mismatch") | |
acd62025 | 291 | if dev[0].group_request("P2P_GET_PASSPHRASE") != res['passphrase']: |
934d5b04 | 292 | raise Exception("passphrase mismatch(2)") |
7ebf841f JM |
293 | |
294 | logger.info("Connect P2P client") | |
ee3f9f38 | 295 | connect_cli(dev[0], dev[1], social=True, freq=2462) |
7ebf841f | 296 | |
dd15d448 JM |
297 | if "FAIL" not in dev[1].request("P2P_GET_PASSPHRASE"): |
298 | raise Exception("P2P_GET_PASSPHRASE succeeded on P2P Client") | |
299 | ||
7ebf841f JM |
300 | logger.info("Connect legacy WPS client") |
301 | pin = dev[2].wps_read_pin() | |
302 | dev[0].p2p_go_authorize_client(pin) | |
7ebf841f JM |
303 | dev[2].request("P2P_SET disabled 1") |
304 | dev[2].dump_monitor() | |
305 | dev[2].request("WPS_PIN any " + pin) | |
5f35a5e2 | 306 | dev[2].wait_connected(timeout=30) |
7ebf841f JM |
307 | status = dev[2].get_status() |
308 | if status['wpa_state'] != 'COMPLETED': | |
309 | raise Exception("Not fully connected") | |
310 | hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2]) | |
311 | dev[2].request("DISCONNECT") | |
312 | ||
313 | logger.info("Connect legacy non-WPS client") | |
314 | dev[2].request("FLUSH") | |
315 | dev[2].request("P2P_SET disabled 1") | |
316 | dev[2].connect(ssid=res['ssid'], psk=res['passphrase'], proto='RSN', | |
317 | key_mgmt='WPA-PSK', pairwise='CCMP', group='CCMP', | |
318 | scan_freq=res['freq']) | |
319 | hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2]) | |
320 | dev[2].request("DISCONNECT") | |
321 | ||
322 | dev[0].remove_group() | |
323 | dev[1].wait_go_ending_session() | |
393e9019 JM |
324 | |
325 | def test_autogo_chan_switch(dev): | |
326 | """P2P autonomous GO switching channels""" | |
5e8f2319 JM |
327 | run_autogo_chan_switch(dev) |
328 | ||
329 | def run_autogo_chan_switch(dev): | |
393e9019 | 330 | autogo(dev[0], freq=2417) |
5e8f2319 | 331 | connect_cli(dev[0], dev[1], freq=2417) |
4041d2af | 332 | res = dev[0].group_request("CHAN_SWITCH 5 2422") |
393e9019 JM |
333 | if "FAIL" in res: |
334 | # for now, skip test since mac80211_hwsim support is not yet widely | |
335 | # deployed | |
81e787b7 | 336 | raise HwsimSkip("Assume mac80211_hwsim did not support channel switching") |
4041d2af | 337 | ev = dev[0].wait_group_event(["AP-CSA-FINISHED"], timeout=10) |
393e9019 JM |
338 | if ev is None: |
339 | raise Exception("CSA finished event timed out") | |
340 | if "freq=2422" not in ev: | |
341 | raise Exception("Unexpected cahnnel in CSA finished event") | |
342 | dev[0].dump_monitor() | |
343 | dev[1].dump_monitor() | |
344 | time.sleep(0.1) | |
345 | hwsim_utils.test_connectivity_p2p(dev[0], dev[1]) | |
8c7559ee | 346 | |
5e8f2319 JM |
347 | dev[0].remove_group() |
348 | dev[1].wait_go_ending_session() | |
349 | ||
350 | def test_autogo_chan_switch_group_iface(dev): | |
351 | """P2P autonomous GO switching channels (separate group interface)""" | |
352 | dev[0].global_request("SET p2p_no_group_iface 0") | |
353 | run_autogo_chan_switch(dev) | |
354 | ||
9fd6804d | 355 | @remote_compatible |
8c7559ee JM |
356 | def test_autogo_extra_cred(dev): |
357 | """P2P autonomous GO sending two WPS credentials""" | |
358 | if "FAIL" in dev[0].request("SET wps_testing_dummy_cred 1"): | |
359 | raise Exception("Failed to enable test mode") | |
ee3f9f38 JM |
360 | autogo(dev[0], freq=2412) |
361 | connect_cli(dev[0], dev[1], social=True, freq=2412) | |
8c7559ee JM |
362 | dev[0].remove_group() |
363 | dev[1].wait_go_ending_session() | |
75ee44f2 JM |
364 | |
365 | def test_autogo_ifdown(dev): | |
366 | """P2P autonomous GO and external ifdown""" | |
367 | wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') | |
368 | wpas.interface_add("wlan5") | |
369 | res = autogo(wpas) | |
370 | wpas.dump_monitor() | |
371 | wpas.interface_remove("wlan5") | |
372 | wpas.interface_add("wlan5") | |
373 | res = autogo(wpas) | |
374 | wpas.dump_monitor() | |
c4668009 | 375 | subprocess.call(['ifconfig', res['ifname'], 'down']) |
75ee44f2 JM |
376 | ev = wpas.wait_global_event(["P2P-GROUP-REMOVED"], timeout=10) |
377 | if ev is None: | |
378 | raise Exception("Group removal not reported") | |
379 | if res['ifname'] not in ev: | |
380 | raise Exception("Unexpected group removal event: " + ev) | |
42216792 | 381 | |
9fd6804d | 382 | @remote_compatible |
42216792 JM |
383 | def test_autogo_start_during_scan(dev): |
384 | """P2P autonomous GO started during ongoing manual scan""" | |
385 | try: | |
386 | # use autoscan to set scan_req = MANUAL_SCAN_REQ | |
387 | if "OK" not in dev[0].request("AUTOSCAN periodic:1"): | |
388 | raise Exception("Failed to set autoscan") | |
ee3f9f38 JM |
389 | autogo(dev[0], freq=2462) |
390 | connect_cli(dev[0], dev[1], social=True, freq=2462) | |
42216792 JM |
391 | dev[0].remove_group() |
392 | dev[1].wait_go_ending_session() | |
393 | finally: | |
394 | dev[0].request("AUTOSCAN ") | |
31424fa7 JM |
395 | |
396 | def test_autogo_passphrase_len(dev): | |
397 | """P2P autonomous GO and longer passphrase""" | |
398 | try: | |
399 | if "OK" not in dev[0].request("SET p2p_passphrase_len 13"): | |
400 | raise Exception("Failed to set passphrase length") | |
ee3f9f38 | 401 | res = autogo(dev[0], freq=2412) |
31424fa7 JM |
402 | if len(res['passphrase']) != 13: |
403 | raise Exception("Unexpected passphrase length") | |
404 | if dev[0].get_group_status_field("passphrase", extra="WPS") != res['passphrase']: | |
405 | raise Exception("passphrase mismatch") | |
406 | ||
407 | logger.info("Connect P2P client") | |
ee3f9f38 | 408 | connect_cli(dev[0], dev[1], social=True, freq=2412) |
31424fa7 JM |
409 | |
410 | logger.info("Connect legacy WPS client") | |
411 | pin = dev[2].wps_read_pin() | |
412 | dev[0].p2p_go_authorize_client(pin) | |
413 | dev[2].request("P2P_SET disabled 1") | |
414 | dev[2].dump_monitor() | |
415 | dev[2].request("WPS_PIN any " + pin) | |
5f35a5e2 | 416 | dev[2].wait_connected(timeout=30) |
31424fa7 JM |
417 | status = dev[2].get_status() |
418 | if status['wpa_state'] != 'COMPLETED': | |
419 | raise Exception("Not fully connected") | |
420 | dev[2].request("DISCONNECT") | |
421 | ||
422 | logger.info("Connect legacy non-WPS client") | |
423 | dev[2].request("FLUSH") | |
424 | dev[2].request("P2P_SET disabled 1") | |
425 | dev[2].connect(ssid=res['ssid'], psk=res['passphrase'], proto='RSN', | |
426 | key_mgmt='WPA-PSK', pairwise='CCMP', group='CCMP', | |
427 | scan_freq=res['freq']) | |
428 | hwsim_utils.test_connectivity_p2p_sta(dev[1], dev[2]) | |
429 | dev[2].request("DISCONNECT") | |
430 | ||
431 | dev[0].remove_group() | |
432 | dev[1].wait_go_ending_session() | |
433 | finally: | |
434 | dev[0].request("SET p2p_passphrase_len 8") | |
d885a0ba | 435 | |
9fd6804d | 436 | @remote_compatible |
d885a0ba JM |
437 | def test_autogo_bridge(dev): |
438 | """P2P autonomous GO in a bridge""" | |
439 | try: | |
440 | # use autoscan to set scan_req = MANUAL_SCAN_REQ | |
441 | if "OK" not in dev[0].request("AUTOSCAN periodic:1"): | |
442 | raise Exception("Failed to set autoscan") | |
443 | autogo(dev[0]) | |
bbcbbd37 | 444 | ifname = dev[0].get_group_ifname() |
bb04a9a9 JA |
445 | dev[0].cmd_execute(['brctl', 'addbr', 'p2p-br0']) |
446 | dev[0].cmd_execute(['brctl', 'setfd', 'p2p-br0', '0']) | |
447 | dev[0].cmd_execute(['brctl', 'addif', 'p2p-br0', ifname]) | |
448 | dev[0].cmd_execute(['ip', 'link', 'set', 'dev', 'p2p-br0', 'up']) | |
d885a0ba | 449 | time.sleep(0.1) |
bb04a9a9 | 450 | dev[0].cmd_execute(['brctl', 'delif', 'p2p-br0', ifname]) |
d885a0ba | 451 | time.sleep(0.1) |
bb04a9a9 | 452 | dev[0].cmd_execute(['ip', 'link', 'set', 'dev', 'p2p-br0', 'down']) |
d885a0ba | 453 | time.sleep(0.1) |
bb04a9a9 | 454 | dev[0].cmd_execute(['brctl', 'delbr', 'p2p-br0']) |
d885a0ba JM |
455 | ev = dev[0].wait_global_event(["P2P-GROUP-REMOVED"], timeout=1) |
456 | if ev is not None: | |
457 | raise Exception("P2P group removed unexpectedly") | |
bbcbbd37 | 458 | if dev[0].get_group_status_field('wpa_state') != "COMPLETED": |
d885a0ba JM |
459 | raise Exception("Unexpected wpa_state") |
460 | dev[0].remove_group() | |
461 | finally: | |
377babb2 | 462 | dev[0].request("AUTOSCAN ") |
bb04a9a9 JA |
463 | dev[0].cmd_execute(['brctl', 'delif', 'p2p-br0', ifname, |
464 | '2>', '/dev/null'], shell=True) | |
465 | dev[0].cmd_execute(['ip', 'link', 'set', 'dev', 'p2p-br0', 'down', | |
466 | '2>', '/dev/null'], shell=True) | |
467 | dev[0].cmd_execute(['brctl', 'delbr', 'p2p-br0', '2>', '/dev/null'], | |
468 | shell=True) | |
777bbe7a | 469 | |
9fd6804d | 470 | @remote_compatible |
777bbe7a JM |
471 | def test_presence_req_on_group_interface(dev): |
472 | """P2P_PRESENCE_REQ on group interface""" | |
9c01d6a9 | 473 | dev[1].global_request("SET p2p_no_group_iface 0") |
777bbe7a JM |
474 | res = autogo(dev[0], freq=2437) |
475 | res = connect_cli(dev[0], dev[1], social=True, freq=2437) | |
476 | if "FAIL" in dev[1].group_request("P2P_PRESENCE_REQ 30000 102400"): | |
477 | raise Exception("Could not send presence request") | |
478 | ev = dev[1].wait_group_event(["P2P-PRESENCE-RESPONSE"]) | |
479 | if ev is None: | |
480 | raise Exception("Timeout while waiting for Presence Response") | |
481 | dev[0].remove_group() | |
482 | dev[1].wait_go_ending_session() | |
d2b84e43 JM |
483 | |
484 | def test_autogo_join_auto_go_not_found(dev): | |
485 | """P2P_CONNECT-auto not finding GO""" | |
486 | wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') | |
487 | wpas.interface_add("wlan5") | |
488 | wpas.request("P2P_SET listen_channel 1") | |
489 | wpas.global_request("SET p2p_no_group_iface 0") | |
490 | autogo(wpas, freq=2412) | |
491 | addr = wpas.p2p_dev_addr() | |
492 | bssid = wpas.p2p_interface_addr() | |
4b9d79b6 | 493 | wpas.dump_monitor() |
d2b84e43 JM |
494 | |
495 | dev[1].global_request("SET p2p_no_group_iface 0") | |
496 | dev[1].scan_for_bss(bssid, freq=2412) | |
497 | # This makes the GO not show up in the scan iteration following the | |
498 | # P2P_CONNECT command by stopping beaconing and handling Probe Request | |
499 | # frames externally (but not really replying to them). P2P listen mode is | |
500 | # needed to keep the GO listening on the operating channel for the PD | |
501 | # exchange. | |
502 | if "OK" not in wpas.group_request("STOP_AP"): | |
503 | raise Exception("STOP_AP failed") | |
4b9d79b6 | 504 | wpas.dump_monitor() |
d2b84e43 JM |
505 | wpas.group_request("SET ext_mgmt_frame_handling 1") |
506 | wpas.p2p_listen() | |
4b9d79b6 | 507 | wpas.dump_monitor() |
d2b84e43 JM |
508 | time.sleep(0.02) |
509 | dev[1].global_request("P2P_CONNECT " + addr + " pbc auto") | |
510 | ||
c0b57b24 | 511 | ev = dev[1].wait_global_event(["P2P-FALLBACK-TO-GO-NEG-ENABLED"], 15) |
4b9d79b6 | 512 | wpas.dump_monitor() |
d2b84e43 JM |
513 | if ev is None: |
514 | raise Exception("Could not trigger old-scan-only case") | |
515 | return | |
516 | ||
c0b57b24 | 517 | ev = dev[1].wait_global_event(["P2P-FALLBACK-TO-GO-NEG"], 15) |
d2b84e43 JM |
518 | wpas.remove_group() |
519 | if ev is None: | |
520 | raise Exception("Fallback to GO Negotiation not seen") | |
521 | if "reason=GO-not-found" not in ev: | |
522 | raise Exception("Unexpected reason for fallback: " + ev) | |
4b9d79b6 | 523 | wpas.dump_monitor() |
9177b0a8 JM |
524 | |
525 | def test_autogo_join_auto(dev): | |
526 | """P2P_CONNECT-auto joining a group""" | |
527 | autogo(dev[0]) | |
528 | addr = dev[0].p2p_dev_addr() | |
529 | if "OK" not in dev[1].global_request("P2P_CONNECT " + addr + " pbc auto"): | |
530 | raise Exception("P2P_CONNECT failed") | |
531 | ||
532 | ev = dev[0].wait_global_event(["P2P-PROV-DISC-PBC-REQ"], timeout=15) | |
533 | if ev is None: | |
534 | raise Exception("Timeout on P2P-PROV-DISC-PBC-REQ") | |
535 | if "group=" + dev[0].group_ifname not in ev: | |
536 | raise Exception("Unexpected PD event contents: " + ev) | |
537 | dev[0].group_request("WPS_PBC") | |
538 | ||
539 | ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15) | |
540 | if ev is None: | |
541 | raise Exception("Joining the group timed out") | |
542 | dev[1].group_form_result(ev) | |
543 | ||
544 | dev[0].remove_group() | |
545 | dev[1].wait_go_ending_session() | |
546 | dev[1].flush_scan_cache() | |
547 | ||
9fd6804d | 548 | @remote_compatible |
9177b0a8 JM |
549 | def test_autogo_join_auto_go_neg(dev): |
550 | """P2P_CONNECT-auto fallback to GO Neg""" | |
380f3a8b | 551 | dev[1].flush_scan_cache() |
9177b0a8 JM |
552 | dev[0].p2p_listen() |
553 | addr = dev[0].p2p_dev_addr() | |
be4a0d0d JM |
554 | if not dev[1].discover_peer(addr, social=True): |
555 | raise Exception("Peer not found") | |
556 | dev[1].p2p_stop_find() | |
9177b0a8 JM |
557 | if "OK" not in dev[1].global_request("P2P_CONNECT " + addr + " pbc auto"): |
558 | raise Exception("P2P_CONNECT failed") | |
559 | ||
560 | ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15) | |
561 | if ev is None: | |
562 | raise Exception("Timeout on P2P-GO-NEG-REQUEST") | |
563 | peer = ev.split(' ')[1] | |
564 | dev[0].p2p_go_neg_init(peer, None, "pbc", timeout=15, go_intent=15) | |
565 | ||
566 | ev = dev[1].wait_global_event(["P2P-FALLBACK-TO-GO-NEG"], timeout=1) | |
567 | if ev is None: | |
568 | raise Exception("No P2P-FALLBACK-TO-GO-NEG event seen") | |
569 | if "P2P-FALLBACK-TO-GO-NEG-ENABLED" in ev: | |
570 | ev = dev[1].wait_global_event(["P2P-FALLBACK-TO-GO-NEG"], timeout=1) | |
571 | if ev is None: | |
572 | raise Exception("No P2P-FALLBACK-TO-GO-NEG event seen") | |
573 | if "reason=peer-not-running-GO" not in ev: | |
574 | raise Exception("Unexpected reason: " + ev) | |
575 | ||
576 | ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15) | |
577 | if ev is None: | |
578 | raise Exception("Joining the group timed out") | |
579 | dev[1].group_form_result(ev) | |
580 | ||
581 | dev[0].remove_group() | |
582 | dev[1].wait_go_ending_session() | |
583 | dev[1].flush_scan_cache() | |
584 | ||
9fd6804d | 585 | @remote_compatible |
9177b0a8 JM |
586 | def test_autogo_join_auto_go_neg_after_seeing_go(dev): |
587 | """P2P_CONNECT-auto fallback to GO Neg after seeing GO""" | |
588 | autogo(dev[0], freq=2412) | |
589 | addr = dev[0].p2p_dev_addr() | |
590 | bssid = dev[0].p2p_interface_addr() | |
591 | dev[1].scan_for_bss(bssid, freq=2412) | |
592 | dev[0].remove_group() | |
593 | dev[0].p2p_listen() | |
594 | ||
595 | if "OK" not in dev[1].global_request("P2P_CONNECT " + addr + " pbc auto"): | |
596 | raise Exception("P2P_CONNECT failed") | |
597 | ||
598 | ev = dev[1].wait_global_event(["P2P-FALLBACK-TO-GO-NEG-ENABLED"], | |
599 | timeout=15) | |
600 | if ev is None: | |
601 | raise Exception("No P2P-FALLBACK-TO-GO-NEG-ENABLED event seen") | |
602 | ||
603 | ev = dev[0].wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=15) | |
604 | if ev is None: | |
605 | raise Exception("Timeout on P2P-GO-NEG-REQUEST") | |
606 | peer = ev.split(' ')[1] | |
607 | dev[0].p2p_go_neg_init(peer, None, "pbc", timeout=15, go_intent=15) | |
608 | ||
609 | ev = dev[1].wait_global_event(["P2P-FALLBACK-TO-GO-NEG"], timeout=1) | |
610 | if ev is None: | |
611 | raise Exception("No P2P-FALLBACK-TO-GO-NEG event seen") | |
612 | if "reason=no-ACK-to-PD-Req" not in ev and "reason=PD-failed" not in ev: | |
613 | raise Exception("Unexpected reason: " + ev) | |
614 | ||
615 | ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15) | |
616 | if ev is None: | |
617 | raise Exception("Joining the group timed out") | |
618 | dev[1].group_form_result(ev) | |
619 | ||
620 | dev[0].remove_group() | |
621 | dev[1].wait_go_ending_session() | |
622 | dev[1].flush_scan_cache() | |
6d0b4474 JM |
623 | |
624 | def test_go_search_non_social(dev): | |
625 | """P2P_FIND with freq parameter to scan a single channel""" | |
626 | addr0 = dev[0].p2p_dev_addr() | |
627 | autogo(dev[0], freq=2422) | |
628 | dev[1].p2p_find(freq=2422) | |
c0b57b24 | 629 | ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=3.5) |
6d0b4474 | 630 | if ev is None: |
62e0e57a JM |
631 | dev[1].p2p_stop_find() |
632 | dev[1].p2p_find(freq=2422) | |
633 | ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=3.5) | |
634 | if ev is None: | |
635 | raise Exception("Did not find GO quickly enough") | |
6d0b4474 | 636 | dev[2].p2p_listen() |
c0b57b24 | 637 | ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5) |
6d0b4474 JM |
638 | if ev is None: |
639 | raise Exception("Did not find peer") | |
640 | dev[2].p2p_stop_find() | |
641 | dev[1].p2p_stop_find() | |
642 | dev[0].remove_group() | |
bfc048b4 | 643 | |
8a5b0bbd JM |
644 | def test_go_search_non_social2(dev): |
645 | """P2P_FIND with freq parameter to scan a single channel (2)""" | |
646 | addr0 = dev[0].p2p_dev_addr() | |
647 | dev[1].p2p_find(freq=2422) | |
648 | # Wait for the first p2p_find scan round to complete before starting GO | |
649 | time.sleep(1) | |
650 | autogo(dev[0], freq=2422) | |
651 | # Verify that p2p_find is still scanning the specified frequency | |
652 | ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5) | |
653 | if ev is None: | |
654 | dev[1].p2p_stop_find() | |
655 | raise Exception("Did not find GO quickly enough") | |
656 | # Verify that p2p_find is scanning the social channels | |
657 | dev[2].p2p_listen() | |
658 | ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5) | |
659 | if ev is None: | |
660 | raise Exception("Did not find peer") | |
661 | dev[2].p2p_stop_find() | |
662 | dev[1].p2p_stop_find() | |
663 | dev[0].remove_group() | |
664 | dev[1].dump_monitor() | |
665 | ||
666 | # Verify that social channel as the specific channel works | |
667 | dev[1].p2p_find(freq=2412) | |
668 | time.sleep(0.5) | |
669 | dev[2].p2p_listen() | |
670 | ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=5) | |
671 | if ev is None: | |
672 | raise Exception("Did not find peer (2)") | |
673 | ||
bfc048b4 JM |
674 | def test_autogo_many(dev): |
675 | """P2P autonomous GO with large number of GO instances""" | |
9c01d6a9 | 676 | dev[0].global_request("SET p2p_no_group_iface 0") |
bfc048b4 JM |
677 | for i in range(100): |
678 | if "OK" not in dev[0].global_request("P2P_GROUP_ADD freq=2412"): | |
679 | logger.info("Was able to add %d groups" % i) | |
680 | if i < 5: | |
681 | raise Exception("P2P_GROUP_ADD failed") | |
682 | stop_ev = dev[0].wait_global_event(["P2P-GROUP-REMOVE"], timeout=1) | |
683 | if stop_ev is not None: | |
684 | raise Exception("Unexpected P2P-GROUP-REMOVE event") | |
685 | break | |
686 | ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=5) | |
687 | if ev is None: | |
688 | raise Exception("GO start up timed out") | |
689 | dev[0].group_form_result(ev) | |
690 | ||
691 | for i in dev[0].global_request("INTERFACES").splitlines(): | |
692 | dev[0].request("P2P_GROUP_REMOVE " + i) | |
693 | dev[0].dump_monitor() | |
694 | dev[0].request("P2P_GROUP_REMOVE *") | |
eb9c1554 JM |
695 | |
696 | def test_autogo_many_clients(dev): | |
697 | """P2P autonomous GO and many clients (P2P IE fragmentation)""" | |
698 | try: | |
699 | _test_autogo_many_clients(dev) | |
700 | finally: | |
c0b57b24 IP |
701 | dev[0].global_request("SET device_name Device A") |
702 | dev[1].global_request("SET device_name Device B") | |
703 | dev[2].global_request("SET device_name Device C") | |
eb9c1554 JM |
704 | |
705 | def _test_autogo_many_clients(dev): | |
706 | # These long device names will push the P2P IE contents beyond the limit | |
707 | # that requires fragmentation. | |
708 | name0 = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" | |
709 | name1 = "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB" | |
710 | name2 = "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC" | |
711 | name3 = "DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD" | |
c0b57b24 IP |
712 | dev[0].global_request("SET device_name " + name0) |
713 | dev[1].global_request("SET device_name " + name1) | |
714 | dev[2].global_request("SET device_name " + name2) | |
eb9c1554 JM |
715 | |
716 | addr0 = dev[0].p2p_dev_addr() | |
717 | res = autogo(dev[0], freq=2412) | |
718 | bssid = dev[0].p2p_interface_addr() | |
719 | ||
720 | connect_cli(dev[0], dev[1], social=True, freq=2412) | |
721 | dev[0].dump_monitor() | |
722 | connect_cli(dev[0], dev[2], social=True, freq=2412) | |
723 | dev[0].dump_monitor() | |
724 | ||
725 | wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5') | |
726 | wpas.interface_add("wlan5") | |
c0b57b24 IP |
727 | wpas.global_request("SET device_name " + name3) |
728 | wpas.global_request("SET sec_device_type 1-11111111-1") | |
729 | wpas.global_request("SET sec_device_type 2-22222222-2") | |
730 | wpas.global_request("SET sec_device_type 3-33333333-3") | |
731 | wpas.global_request("SET sec_device_type 4-44444444-4") | |
732 | wpas.global_request("SET sec_device_type 5-55555555-5") | |
eb9c1554 JM |
733 | connect_cli(dev[0], wpas, social=True, freq=2412) |
734 | dev[0].dump_monitor() | |
735 | ||
736 | dev[1].dump_monitor() | |
737 | dev[1].p2p_find(freq=2412) | |
738 | ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10) | |
739 | if ev1 is None: | |
740 | raise Exception("Could not find peer (1)") | |
741 | ev2 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10) | |
742 | if ev2 is None: | |
743 | raise Exception("Could not find peer (2)") | |
744 | ev3 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10) | |
745 | if ev3 is None: | |
746 | raise Exception("Could not find peer (3)") | |
747 | dev[1].p2p_stop_find() | |
748 | ||
fab49f61 | 749 | for i in [name0, name2, name3]: |
eb9c1554 JM |
750 | if i not in ev1 and i not in ev2 and i not in ev3: |
751 | raise Exception('name "%s" not found' % i) | |
9464e099 JM |
752 | |
753 | def rx_pd_req(dev): | |
754 | msg = dev.mgmt_rx() | |
755 | if msg is None: | |
756 | raise Exception("MGMT-RX timeout") | |
757 | p2p = parse_p2p_public_action(msg['payload']) | |
758 | if p2p is None: | |
759 | raise Exception("Not a P2P Public Action frame " + str(dialog_token)) | |
760 | if p2p['subtype'] != P2P_PROV_DISC_REQ: | |
761 | raise Exception("Unexpected subtype %d" % p2p['subtype']) | |
762 | p2p['freq'] = msg['freq'] | |
763 | return p2p | |
764 | ||
9fd6804d | 765 | @remote_compatible |
9464e099 JM |
766 | def test_autogo_scan(dev): |
767 | """P2P autonomous GO and no P2P IE in Probe Response scan results""" | |
768 | addr0 = dev[0].p2p_dev_addr() | |
769 | addr1 = dev[1].p2p_dev_addr() | |
770 | dev[0].p2p_start_go(freq=2412, persistent=True) | |
771 | bssid = dev[0].p2p_interface_addr() | |
772 | ||
773 | dev[1].discover_peer(addr0) | |
774 | dev[1].p2p_stop_find() | |
775 | ev = dev[1].wait_global_event(["P2P-FIND-STOPPED"], timeout=2) | |
776 | time.sleep(0.1) | |
777 | dev[1].flush_scan_cache() | |
778 | ||
779 | pin = dev[1].wps_read_pin() | |
780 | dev[0].group_request("WPS_PIN any " + pin) | |
781 | ||
782 | try: | |
783 | dev[1].request("SET p2p_disabled 1") | |
784 | dev[1].request("SCAN freq=2412") | |
785 | ev = dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"]) | |
786 | if ev is None: | |
787 | raise Exception("Active scan did not complete") | |
788 | finally: | |
789 | dev[1].request("SET p2p_disabled 0") | |
790 | ||
791 | for i in range(2): | |
792 | dev[1].request("SCAN freq=2412 passive=1") | |
793 | ev = dev[1].wait_event(["CTRL-EVENT-SCAN-RESULTS"]) | |
794 | if ev is None: | |
795 | raise Exception("Scan did not complete") | |
796 | ||
797 | # Disable management frame processing for a moment to skip Probe Response | |
798 | # frame with P2P IE. | |
799 | dev[0].group_request("SET ext_mgmt_frame_handling 1") | |
800 | ||
a7efe6c3 | 801 | dev[1].global_request("P2P_CONNECT " + bssid + " " + pin + " freq=2412 join") |
9464e099 JM |
802 | |
803 | # Skip the first Probe Request frame | |
804 | ev = dev[0].wait_group_event(["MGMT-RX"], timeout=10) | |
805 | if ev is None: | |
806 | raise Exception("No Probe Request frame seen") | |
807 | if not ev.split(' ')[4].startswith("40"): | |
808 | raise Exception("Not a Probe Request frame") | |
809 | ||
a7efe6c3 AS |
810 | # If a P2P Device is not used, the PD Request will be received on the group |
811 | # interface (which is actually wlan0, since a separate interface is not | |
812 | # used), which was set to external management frame handling, so need to | |
813 | # reply to it manually. | |
814 | res = dev[0].get_driver_status() | |
815 | if not (int(res['capa.flags'], 0) & 0x20000000): | |
816 | # Reply to PD Request while still filtering Probe Request frames | |
817 | msg = rx_pd_req(dev[0]) | |
818 | mgmt_tx(dev[0], "MGMT_TX {} {} freq={} wait_time=10 no_cck=1 action={}".format(addr1, addr0, 2412, "0409506f9a0908%02xdd0a0050f204100800020008" % msg['dialog_token'])) | |
9464e099 JM |
819 | |
820 | # Skip Probe Request frames until something else is received | |
821 | for i in range(10): | |
822 | ev = dev[0].wait_group_event(["MGMT-RX"], timeout=10) | |
823 | if ev is None: | |
824 | raise Exception("No frame seen") | |
825 | if not ev.split(' ')[4].startswith("40"): | |
826 | break | |
827 | ||
828 | # Allow wpa_supplicant to process authentication and association | |
829 | dev[0].group_request("SET ext_mgmt_frame_handling 0") | |
830 | ||
831 | # Joining the group should succeed and indicate persistent group based on | |
832 | # Beacon frame P2P IE. | |
833 | ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10) | |
834 | if ev is None: | |
835 | raise Exception("Failed to join group") | |
836 | if "[PERSISTENT]" not in ev: | |
837 | raise Exception("Did not recognize group as persistent") | |
838 | dev[0].remove_group() | |
839 | dev[1].wait_go_ending_session() | |
05032725 | 840 | |
9fd6804d | 841 | @remote_compatible |
05032725 JM |
842 | def test_autogo_join_before_found(dev): |
843 | """P2P client joining a group before having found GO Device Address""" | |
9c01d6a9 | 844 | dev[0].global_request("SET p2p_no_group_iface 0") |
05032725 JM |
845 | res = autogo(dev[0], freq=2412) |
846 | if "p2p-wlan" not in res['ifname']: | |
847 | raise Exception("Unexpected group interface name on GO") | |
848 | status = dev[0].get_group_status() | |
849 | bssid = status['bssid'] | |
850 | ||
851 | pin = dev[1].wps_read_pin() | |
852 | dev[0].p2p_go_authorize_client(pin) | |
853 | cmd = "P2P_CONNECT " + bssid + " " + pin + " join freq=2412" | |
854 | if "OK" not in dev[1].global_request(cmd): | |
855 | raise Exception("P2P_CONNECT join failed") | |
856 | ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15) | |
857 | if ev is None: | |
858 | raise Exception("Joining the group timed out") | |
859 | dev[0].remove_group() | |
860 | dev[1].wait_go_ending_session() | |
6baab31c JM |
861 | |
862 | def test_autogo_noa(dev): | |
863 | """P2P autonomous GO and NoA""" | |
864 | res = autogo(dev[0]) | |
865 | dev[0].group_request("P2P_SET noa 1,5,20") | |
866 | dev[0].group_request("P2P_SET noa 255,10,50") | |
867 | ||
868 | # Connect and disconnect legacy STA to check NoA special cases | |
869 | try: | |
870 | dev[1].request("SET p2p_disabled 1") | |
871 | dev[1].connect(ssid=res['ssid'], psk=res['passphrase'], proto='RSN', | |
872 | key_mgmt='WPA-PSK', pairwise='CCMP', group='CCMP', | |
873 | scan_freq=res['freq']) | |
874 | dev[0].group_request("P2P_SET noa 255,15,55") | |
875 | dev[1].request("DISCONNECT") | |
876 | dev[1].wait_disconnected() | |
877 | finally: | |
878 | dev[1].request("SET p2p_disabled 0") | |
879 | ||
880 | dev[0].group_request("P2P_SET noa 0,0,0") | |
e0e1fde8 JM |
881 | |
882 | def test_autogo_interworking(dev): | |
883 | """P2P autonomous GO and Interworking""" | |
884 | try: | |
885 | run_autogo_interworking(dev) | |
886 | finally: | |
887 | dev[0].set("go_interworking", "0") | |
888 | ||
889 | def run_autogo_interworking(dev): | |
1d914d01 AO |
890 | dev[0].global_request("SET go_interworking 1") |
891 | dev[0].global_request("SET go_access_network_type 1") | |
892 | dev[0].global_request("SET go_internet 1") | |
893 | dev[0].global_request("SET go_venue_group 2") | |
894 | dev[0].global_request("SET go_venue_type 3") | |
e0e1fde8 JM |
895 | res = autogo(dev[0]) |
896 | bssid = dev[0].p2p_interface_addr() | |
897 | dev[1].scan_for_bss(bssid, freq=res['freq']) | |
898 | bss = dev[1].get_bss(bssid) | |
899 | dev[0].remove_group() | |
900 | if '6b03110203' not in bss['ie']: | |
901 | raise Exception("Interworking element not seen") |