]> git.ipfire.org Git - thirdparty/hostap.git/blame - tests/hwsim/test_p2p_autogo.py
WPS: Ignore other APs if PBC is used with a specific BSSID
[thirdparty/hostap.git] / tests / hwsim / test_p2p_autogo.py
CommitLineData
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 7from remotehost import remote_compatible
7cb08cdb 8import time
07a2e61b 9import subprocess
4ea8d3b5 10import logging
c9aa4308 11logger = logging.getLogger()
4ea8d3b5
JM
12
13import hwsim_utils
19ae1d07 14import utils
81e787b7 15from utils import HwsimSkip
c7860beb 16from wlantest import Wlantest
0afb797e 17from wpasupplicant import WpaSupplicant
9cb34130
JM
18from p2p_utils import *
19from test_p2p_messages import mgmt_tx, parse_p2p_public_action
4ea8d3b5
JM
20
21def 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
85def 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
99def 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
114def 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
138def 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
181def 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 202def 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
216def 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 234def 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
286def 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
325def test_autogo_chan_switch(dev):
326 """P2P autonomous GO switching channels"""
5e8f2319
JM
327 run_autogo_chan_switch(dev)
328
329def 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
350def 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
356def 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
365def 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
383def 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
396def 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
437def 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
471def 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
484def 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
525def 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
549def 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
586def 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
624def 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
644def 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
674def 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
696def 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
705def _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
753def 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
766def 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
842def 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
862def 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
882def 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
889def 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")