2 # Copyright (c) 2014-2015, Qualcomm Atheros, Inc.
4 # This software may be distributed under the terms of the BSD license.
5 # See README for more details.
8 logger = logging.getLogger()
14 from wpasupplicant import WpaSupplicant
16 from p2p_utils import *
17 from utils import HwsimSkip
18 from hwsim import HWSimRadio
20 # Dev[0] -> Advertiser
22 # ev0 -> Event generated at advertiser side
23 # ev1 -> Event generated at Seeker side
25 def p2ps_advertise(r_dev, r_role, svc_name, srv_info, rsp_info=None, cpt=None):
26 """P2PS Advertise function"""
27 adv_id = random.randrange(1, 0xFFFFFFFF)
28 advid = hex(adv_id)[2:]
30 cpt_param = (" cpt=" + cpt) if cpt is not None else ""
32 if rsp_info is not None and srv_info is not None:
33 if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + cpt_param + " svc_info='" + srv_info + "'" + " rsp_info=" + rsp_info + "'"):
34 raise Exception("P2P_SERVICE_ADD with response info and service info failed")
36 if rsp_info is None and srv_info is not None:
37 if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + cpt_param + " svc_info='" + srv_info + "'"):
38 raise Exception("P2P_SERVICE_ADD with service info failed")
40 if rsp_info is None and srv_info is None:
41 if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + cpt_param):
42 raise Exception("P2P_SERVICE_ADD without service info and without response info failed")
44 if rsp_info is not None and srv_info is None:
45 if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(adv_id) + " 1 1108 " + svc_name + cpt_param + " svc_info='" + " rsp_info=" + rsp_info + "'"):
46 raise Exception("P2P_SERVICE_ADD with response info failed")
51 def p2ps_exact_seek(i_dev, r_dev, svc_name, srv_info=None,
52 single_peer_expected=True):
53 """P2PS exact service seek request"""
54 if srv_info is not None:
55 ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
57 raise Exception("Failed to add Service Discovery request for exact seek request")
59 if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek=" + svc_name):
60 raise Exception("Failed to initiate seek operation")
62 timeout = time.time() + 10
63 ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
64 while ev1 is not None and not single_peer_expected:
65 if r_dev.p2p_dev_addr() in ev1 and "adv_id=" in ev1:
67 ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
69 if timeout < time.time():
70 raise Exception("Device not found")
73 raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
74 if r_dev.p2p_dev_addr() not in ev1:
75 raise Exception("Unexpected peer")
78 adv_id = ev1.split("adv_id=")[1].split(" ")[0]
79 rcvd_svc_name = ev1.split("asp_svc=")[1].split(" ")[0]
80 if rcvd_svc_name != svc_name:
81 raise Exception("service name not matching")
83 ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
85 raise Exception("Failed to receive Service Discovery Response")
86 if r_dev.p2p_dev_addr() not in ev1:
87 raise Exception("Service Discovery response from Unknown Peer")
88 if srv_info is not None and srv_info not in ev1:
89 raise Exception("service info not available in Service Discovery response")
90 adv_id = ev1.split(" ")[3]
91 rcvd_svc_name = ev1.split(" ")[6]
92 if rcvd_svc_name != svc_name:
93 raise Exception("service name not matching")
96 return [adv_id, rcvd_svc_name]
98 def p2ps_nonexact_seek(i_dev, r_dev, svc_name, srv_info=None, adv_num=None):
99 """P2PS nonexact service seek request"""
102 if srv_info is not None:
103 ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
105 ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '")
107 raise Exception("Failed to add Service Discovery request for nonexact seek request")
108 if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek="):
109 raise Exception("Failed to initiate seek")
110 ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
112 raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
113 if r_dev.p2p_dev_addr() not in ev1:
114 raise Exception("Unexpected peer")
116 for i in range (0, adv_num):
117 ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
119 raise Exception("Failed to receive Service Discovery Response")
120 if r_dev.p2p_dev_addr() not in ev1:
121 raise Exception("Service Discovery response from Unknown Peer")
122 if srv_info is not None and srv_info not in ev1:
123 raise Exception("service info not available in Service Discovery response")
124 adv_id = ev1.split(" ")[3]
125 rcvd_svc_name = ev1.split(" ")[6]
126 ev_list.append(''.join([adv_id, ' ', rcvd_svc_name]))
128 i_dev.p2p_stop_find()
131 def p2ps_parse_event(ev, *args):
134 m = re.search("\s+" + arg + r"=(\S+)", ev)
135 ret += (m.group(1) if m is not None else None,)
138 def p2ps_provision(seeker, advertiser, adv_id, auto_accept=True, method="1000",
139 adv_cpt=None, seeker_cpt=None, handler=None, adv_role=None,
141 addr0 = seeker.p2p_dev_addr()
142 addr1 = advertiser.p2p_dev_addr()
144 seeker.asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr1, session_id=1,
145 session_mac=addr0, method=method, cpt=seeker_cpt,
148 if not auto_accept or method == "100":
150 ev_pd_start = advertiser.wait_global_event(["P2PS-PROV-START"],
152 if ev_pd_start is None:
153 raise Exception("P2PS-PROV-START timeout on Advertiser side")
154 peer = ev_pd_start.split()[1]
155 advert_id, advert_mac, session, session_mac =\
156 p2ps_parse_event(ev_pd_start, "adv_id", "adv_mac", "session", "mac")
158 ev = seeker.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
160 raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
163 handler(seeker, advertiser)
165 # Put seeker into a listen state, since we expect the deferred flow to
167 seeker.p2p_ext_listen(500, 500)
170 ev = advertiser.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
173 raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
175 raise Exception("Unknown peer " + addr0)
176 ev = seeker.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
179 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on seeker side")
181 raise Exception("Unknown peer " + addr1)
184 ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
187 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
189 raise Exception("Unknown peer " + addr0)
192 # Stop P2P_LISTEN before issuing P2P_ASP_PROVISION_RESP to avoid
193 # excessive delay and test case timeouts if it takes large number of
194 # retries to find the peer awake on its Listen channel.
195 advertiser.p2p_stop_find()
197 advertiser.asp_provision(peer, adv_id=advert_id, adv_mac=advert_mac,
198 session_id=int(session, 0),
199 session_mac=session_mac, status=12,
200 cpt=adv_cpt, role=adv_role)
202 ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
204 raise Exception("P2PS-PROV-DONE timeout on seeker side")
206 ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
208 raise Exception("P2PS-PROV-DONE timeout on advertiser side")
211 ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
214 raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
216 raise Exception("Unknown peer " + addr1)
218 seeker.p2p_cancel_ext_listen()
223 # Auto-accept is true and the method is either P2PS or advertiser is DISPLAY
224 ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
226 raise Exception("P2PS-PROV-DONE timeout on seeker side")
228 ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
230 raise Exception("P2PS-PROV-DONE timeout on advertiser side")
233 ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
235 raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
237 raise Exception("Unknown peer " + addr1)
238 ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
241 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
243 raise Exception("Unknown peer " + addr0)
249 def p2ps_connect_pd(dev0, dev1, ev0, ev1, pin=None, join_extra="", go_ev=None):
250 conf_methods_map = {"8": "p2ps", "1": "display", "5": "keypad"}
251 peer0 = ev0.split()[1]
252 peer1 = ev1.split()[1]
253 status0, conncap0, adv_id0, adv_mac0, mac0, session0, dev_passwd_id0, go0, join0, feature_cap0, persist0, group_ssid0 =\
254 p2ps_parse_event(ev0, "status", "conncap", "adv_id", "adv_mac", "mac", "session", "dev_passwd_id", "go", "join", "feature_cap", "persist", "group_ssid")
255 status1, conncap1, adv_id1, adv_mac1, mac1, session1, dev_passwd_id1, go1, join1, feature_cap1, persist1, group_ssid1 =\
256 p2ps_parse_event(ev1, "status", "conncap", "adv_id", "adv_mac", "mac", "session", "dev_passwd_id", "go", "join", "feature_cap", "persist", "group_ssid")
258 if status0 != "0" and status0 != "12":
259 raise Exception("PD failed on " + dev0.p2p_dev_addr())
261 if status1 != "0" and status1 != "12":
262 raise Exception("PD failed on " + dev1.p2p_dev_addr())
264 if status0 == "12" and status1 == "12":
265 raise Exception("Both sides have status 12 which doesn't make sense")
267 if adv_id0 != adv_id1 or adv_id0 is None:
268 raise Exception("Adv. IDs don't match")
270 if adv_mac0 != adv_mac1 or adv_mac0 is None:
271 raise Exception("Adv. MACs don't match")
273 if session0 != session1 or session0 is None:
274 raise Exception("Session IDs don't match")
276 if mac0 != mac1 or mac0 is None:
277 raise Exception("Session MACs don't match")
279 #TODO: Validate feature capability
281 if bool(persist0) != bool(persist1):
282 raise Exception("Only one peer has persistent group")
284 if persist0 is None and not all([conncap0, conncap1, dev_passwd_id0,
286 raise Exception("Persistent group not used but conncap/dev_passwd_id are missing")
288 if persist0 is not None and any([conncap0, conncap1, dev_passwd_id0,
290 raise Exception("Persistent group is used but conncap/dev_passwd_id are present")
292 # Persistent Connection (todo: handle frequency)
293 if persist0 is not None:
295 if "OK" not in dev0.global_request("P2P_GROUP_ADD persistent=" + persist0 + " freq=2412"):
296 raise Exception("Could not re-start persistent group")
297 ev0 = dev0.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
299 raise Exception("P2P-GROUP-STARTED timeout on " + dev0.p2p_dev_addr())
300 dev0.group_form_result(ev0)
302 if "OK" not in dev1.global_request("P2P_GROUP_ADD persistent=" + persist1 + " freq=2412"):
303 raise Exception("Could not re-start persistent group")
304 ev1 = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
306 raise Exception("P2P-GROUP-STARTED timeout on " + dev1.p2p_dev_addr())
307 dev1.group_form_result(ev1)
309 ev = dev0.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
311 raise Exception("AP-STA-CONNECTED timeout on " + dev0.p2p_dev_addr())
313 ev = dev1.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
315 raise Exception("AP-STA-CONNECTED timeout on " + dev1.p2p_dev_addr())
318 method0 = conf_methods_map[dev_passwd_id0]
319 method1 = conf_methods_map[dev_passwd_id1]
321 raise Exception("Unsupported method")
323 if method0 == "p2ps":
326 raise Exception("Pin is not provided")
328 if conncap0 == "1" and conncap1 == "1": # NEW/NEW - GON
329 if any([join0, join1, go0, go1]):
330 raise Exception("Unexpected join/go PD attributes")
332 if "OK" not in dev0.global_request("P2P_CONNECT " + peer0 + " " + pin + " " + method0 + " persistent auth"):
333 raise Exception("P2P_CONNECT fails on " + dev0.p2p_dev_addr())
334 if "OK" not in dev1.global_request("P2P_CONNECT " + peer1 + " " + pin + " " + method1 + " persistent"):
335 raise Exception("P2P_CONNECT fails on " + dev1.p2p_dev_addr())
336 ev = dev0.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
338 raise Exception("GO Neg did not succeed on " + dev0.p2p_dev_addr())
339 ev = dev1.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
341 raise Exception("GO Neg did not succeed on " + dev1.p2p_dev_addr())
342 ev = dev0.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
344 raise Exception("P2P-GROUP-STARTED timeout on " + dev0.p2p_dev_addr())
345 dev0.group_form_result(ev)
346 ev = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
348 raise Exception("P2P-GROUP-STARTED timeout on " + dev1.p2p_dev_addr())
349 dev1.group_form_result(ev)
351 if conncap0 == "2" and conncap1 == "4": # dev0 CLI, dev1 GO
352 dev_cli, dev_go, go_if, join_address, go_method, cli_method, join_ssid = dev0, dev1, go1, join0, method1, method0, group_ssid0
353 elif conncap0 == "4" and conncap1 == "2": # dev0 GO, dev1 CLI
354 dev_cli, dev_go, go_if, join_address, go_method, cli_method, join_ssid = dev1, dev0, go0, join1, method0, method1, group_ssid1
356 raise Exception("Bad connection capabilities")
359 raise Exception("Device " + dev_go.p2p_dev_addr() + " failed to become GO")
360 if join_address is None:
361 raise Exception("Device " + dev_cli.p2p_dev_addr() + " failed to become CLI")
363 if not dev_go.get_group_ifname().startswith('p2p-'):
367 ev = dev_go.wait_global_event(["P2P-GROUP-STARTED"],
370 raise Exception("P2P-GROUP-STARTED timeout on " + dev_go.p2p_dev_addr())
371 dev_go.group_form_result(ev)
373 if go_method != "p2ps":
374 ev = dev_go.group_request("WPS_PIN any " + pin)
376 raise Exception("Failed to initiate pin authorization on registrar side")
378 group_ssid_txt = " ssid=" + join_ssid
381 if "OK" not in dev_cli.global_request("P2P_CONNECT " + join_address + " " + pin + " " + cli_method + join_extra + " persistent join" + group_ssid_txt):
382 raise Exception("P2P_CONNECT failed on " + dev_cli.p2p_dev_addr())
383 ev = dev_cli.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
385 raise Exception("P2P-GROUP-STARTED timeout on " + dev_cli.p2p_dev_addr())
386 dev_cli.group_form_result(ev)
387 ev = dev_go.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
389 raise Exception("AP-STA-CONNECTED timeout on " + dev_go.p2p_dev_addr())
391 hwsim_utils.test_connectivity_p2p(dev0, dev1)
393 def set_no_group_iface(dev, enable):
395 res = dev.get_driver_status()
396 if (int(res['capa.flags'], 0) & 0x20000000):
397 raise HwsimSkip("P2P Device used. Cannot set enable no_group_iface")
398 dev.global_request("SET p2p_no_group_iface 1")
400 dev.global_request("SET p2p_no_group_iface 0")
402 def test_p2ps_exact_search(dev):
403 """P2PS exact service request"""
404 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
405 srv_info='I can receive files upto size 2 GB')
406 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
407 svc_name='org.wi-fi.wfds.send.rx')
409 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
411 raise Exception("Unable to remove the advertisement instance")
413 def test_p2ps_exact_search_srvinfo(dev):
414 """P2PS exact service request with service info"""
415 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
416 srv_info='I can receive files upto size 2 GB')
417 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
418 svc_name='org.wi-fi.wfds.send.rx',
421 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
423 raise Exception("Unable to remove the advertisement instance")
425 def test_p2ps_nonexact_search(dev):
426 """P2PS nonexact seek request"""
427 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.play.rx',
428 srv_info='I support Miracast Mode ')
429 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
430 svc_name='org.wi-fi.wfds.play*')
431 adv_id = ev_list[0].split()[0]
433 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
435 raise Exception("Unable to remove the advertisement instance")
437 def test_p2ps_nonexact_search_srvinfo(dev):
438 """P2PS nonexact seek request with service info"""
439 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
440 srv_info='I can receive files upto size 2 GB')
441 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
442 svc_name='org.wi-fi.wfds.send*',
444 adv_id = ev_list[0].split()[0]
445 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
447 raise Exception("Unable to remove the advertisement instance")
449 def test_p2ps_connect_p2ps_method_nonautoaccept(dev):
450 """P2PS connect for non-auto-accept and P2PS config method"""
451 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
452 srv_info='I can receive files upto size 2 GB')
453 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
454 svc_name='org.wi-fi.wfds.send*',
456 adv_id = ev_list[0].split()[0]
457 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False)
458 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
460 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
462 raise Exception("Unable to remove the advertisement instance")
463 remove_group(dev[0], dev[1])
465 def test_p2ps_connect_p2ps_method_autoaccept(dev):
466 """P2PS connection with P2PS default config method and auto-accept"""
467 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
468 srv_info='I can receive files upto size 2 GB')
469 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
470 svc_name='org.wi-fi.wfds.send.rx',
473 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
474 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
476 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
478 raise Exception("Unable to remove the advertisement instance")
479 remove_group(dev[0], dev[1])
481 def test_p2ps_connect_keypad_method_nonautoaccept(dev):
482 """P2PS Connection with non-auto-accept and seeker having keypad method"""
483 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
484 srv_info='I can receive files upto size 2 GB')
485 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
486 svc_name='org.wi-fi.wfds.send*',
488 adv_id = ev_list[0].split()[0]
490 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False, method="8")
491 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
493 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
495 raise Exception("Unable to remove the advertisement instance")
496 remove_group(dev[0], dev[1])
498 def test_p2ps_connect_display_method_nonautoaccept(dev):
499 """P2PS connection with non-auto-accept and seeker having display method"""
500 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
501 srv_info='I can receive files upto size 2 GB')
502 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
503 svc_name='org.wi-fi.wfds*', srv_info='2 GB')
504 adv_id = ev_list[0].split()[0]
506 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False, method="100")
507 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
509 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
511 raise Exception("Unable to remove the advertisement instance")
512 remove_group(dev[0], dev[1])
514 def test_p2ps_connect_keypad_method_autoaccept(dev):
515 """P2PS connection with auto-accept and keypad method on seeker side"""
516 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
517 srv_info='I can receive files upto size 2 GB')
518 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
519 svc_name='org.wi-fi.wfds.send.rx',
522 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
523 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
525 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
527 raise Exception("Unable to remove the advertisement instance")
528 remove_group(dev[0], dev[1])
530 def test_p2ps_connect_display_method_autoaccept(dev):
531 """P2PS connection with auto-accept and display method on seeker side"""
532 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
533 srv_info='I can receive files upto size 2 GB')
534 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
535 svc_name='org.wi-fi.wfds.send.rx',
538 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="100")
539 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
541 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
543 raise Exception("Unable to remove the advertisement instance")
544 remove_group(dev[0], dev[1])
546 def test_p2ps_connect_adv_go_p2ps_method(dev):
547 """P2PS auto-accept connection with advertisement as GO and P2PS method"""
548 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
549 srv_info='I can receive files upto size 2 GB')
550 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
551 svc_name='org.wi-fi.wfds.send.rx',
554 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
555 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
557 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
559 raise Exception("Unable to remove the advertisement instance")
560 remove_group(dev[0], dev[1])
562 def test_p2ps_connect_adv_go_p2ps_method_group_iface(dev):
563 """P2PS auto-accept connection with advertisement as GO and P2PS method using separate group interface"""
564 set_no_group_iface(dev[0], 0)
565 set_no_group_iface(dev[1], 0)
566 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
567 srv_info='I can receive files upto size 2 GB')
568 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
569 svc_name='org.wi-fi.wfds.send.rx',
572 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
573 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
575 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
577 raise Exception("Unable to remove the advertisement instance")
578 remove_group(dev[0], dev[1])
580 def test_p2ps_connect_adv_client_p2ps_method(dev):
581 """P2PS auto-accept connection with advertisement as Client and P2PS method"""
582 p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
583 srv_info='I can receive files upto size 2 GB')
584 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
585 svc_name='org.wi-fi.wfds.send.rx',
588 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
589 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
591 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
593 raise Exception("Unable to remove the advertisement instance")
594 remove_group(dev[0], dev[1])
596 def p2ps_connect_adv_go_pin_method(dev, keep_group=False):
597 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
598 srv_info='I can receive files upto size 2 GB')
599 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
600 svc_name='org.wi-fi.wfds.send.rx',
602 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
603 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
606 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
608 raise Exception("Unable to remove the advertisement instance")
609 remove_group(dev[0], dev[1])
611 def test_p2ps_connect_adv_go_pin_method(dev):
612 """P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
613 p2ps_connect_adv_go_pin_method(dev)
615 def test_p2ps_connect_adv_client_pin_method(dev):
616 """P2PS advertiser as client with keypad config method on seeker side and auto-accept"""
617 dev[0].flush_scan_cache()
618 p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
619 srv_info='I can receive files upto size 2 GB')
620 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
621 svc_name='org.wi-fi.wfds.send.rx',
624 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
625 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
627 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
629 raise Exception("Unable to remove the advertisement instance")
630 remove_group(dev[0], dev[1])
632 def test_p2ps_service_discovery_multiple_queries(dev):
633 """P2P service discovery with multiple queries"""
634 addr0 = dev[0].p2p_dev_addr()
635 addr1 = dev[1].p2p_dev_addr()
636 adv_id1 = p2ps_advertise(r_dev=dev[0], r_role='0',
637 svc_name='org.wi-fi.wfds.send.tx',
638 srv_info='I can transfer files upto size of 2 GB')
639 adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='0',
640 svc_name='org.wi-fi.wfds.send.rx',
641 srv_info='I can receive files upto size of 2 GB')
642 adv_id3 = p2ps_advertise(r_dev=dev[0], r_role='1',
643 svc_name='org.wi-fi.wfds.display.tx',
644 srv_info='Miracast Mode')
645 adv_id4 = p2ps_advertise(r_dev=dev[0], r_role='1',
646 svc_name='org.wi-fi.wfds.display.rx',
647 srv_info='Miracast Mode')
649 dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 1 org.wi-fi.wfds.display.tx 'Miracast Mode'")
650 dev[1].global_request("P2P_FIND 10 type=social seek=org.wi-fi.wfds.display.tx")
651 dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 2 org.wi-fi.wfds.send* 'size of 2 GB'")
652 dev[1].p2p_stop_find()
653 dev[1].global_request("P2P_FIND 10 type=social seek=")
654 ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
656 raise Exception("P2P Device Found timed out")
658 raise Exception("Unexpected service discovery request source")
660 for i in range(0, 3):
661 ev = dev[1].wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
663 raise Exception("P2P Service discovery timed out")
666 if len(ev_list) == 3:
668 dev[1].p2p_stop_find()
670 for test in [ ("seek=org.wi-fi.wfds.display.TX",
671 "asp_svc=org.wi-fi.wfds.display.tx"),
672 ("seek=foo seek=org.wi-fi.wfds.display.tx seek=bar",
673 "asp_svc=org.wi-fi.wfds.display.tx"),
674 ("seek=1 seek=2 seek=3 seek=org.wi-fi.wfds.display.tx seek=4 seek=5 seek=6",
675 "asp_svc=org.wi-fi.wfds.display.tx"),
676 ("seek=not-found", None),
677 ("seek=org.wi-fi.wfds", "asp_svc=org.wi-fi.wfds")]:
678 dev[2].global_request("P2P_FIND 10 type=social " + test[0])
680 ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=1)
682 raise Exception("Unexpected device found: " + ev)
684 ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
686 raise Exception("P2P device discovery timed out (dev2)")
687 if test[1] not in ev:
688 raise Exception("Expected asp_svc not reported: " + ev)
689 dev[2].p2p_stop_find()
690 dev[2].request("P2P_FLUSH")
692 dev[0].p2p_stop_find()
694 ev1 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id1))
696 raise Exception("Unable to remove the advertisement instance")
697 ev2 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
699 raise Exception("Unable to remove the advertisement instance")
700 ev3 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id3))
702 raise Exception("Unable to remove the advertisement instance")
703 ev4 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id4))
705 raise Exception("Unable to remove the advertisement instance")
707 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
708 raise Exception("P2P_SERVICE_ADD failed")
709 if "OK" not in dev[0].global_request("P2P_SERVICE_DEL asp all"):
710 raise Exception("P2P_SERVICE_DEL asp all failed")
711 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
712 raise Exception("P2P_SERVICE_ADD failed")
713 if "OK" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
714 raise Exception("P2P_SERVICE_REP failed")
715 if "FAIL" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
716 raise Exception("Invalid P2P_SERVICE_REP accepted")
717 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345678 1 1108 org.wi-fi.wfds.something svc_info='Test'"):
718 raise Exception("P2P_SERVICE_ADD failed")
719 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345679 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
720 raise Exception("P2P_SERVICE_ADD failed")
723 with open('/proc/net/dev', 'r') as f:
726 for line in data.splitlines():
727 ifname = line.strip().split(' ')[0]
728 if ':' not in ifname:
730 ifname = ifname.split(':')[0]
731 ifnames.append(ifname)
734 def p2ps_connect_p2ps_method(dev, keep_group=False, join_extra="", flush=True):
736 dev[0].flush_scan_cache()
737 dev[1].flush_scan_cache()
738 p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
739 srv_info='I can receive files upto size 2 GB')
740 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
741 svc_name='org.wi-fi.wfds.send.rx',
743 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
745 if "join=" in ev0 and "go=" in ev1:
746 # dev[1] started GO and dev[0] is about to join it.
747 # Parse P2P-GROUP-STARTED from the GO to learn the operating frequency.
748 go_ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
750 raise Exception("P2P-GROUP-STARTED timeout on dev1")
751 res = dev[1].group_form_result(go_ev)
753 join_extra = " freq=" + res['freq']
755 ifnames = get_ifnames()
756 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, join_extra=join_extra,
759 grp_ifname0 = dev[0].get_group_ifname()
760 grp_ifname1 = dev[1].get_group_ifname()
762 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
764 raise Exception("Unable to remove the advertisement instance")
765 ifnames = ifnames + get_ifnames()
766 remove_group(dev[0], dev[1])
767 ifnames = ifnames + get_ifnames()
769 return grp_ifname0, grp_ifname1, ifnames
771 def has_string_prefix(vals, prefix):
773 if val.startswith(prefix):
777 def test_p2ps_connect_p2ps_method_1(dev):
778 """P2PS connection with P2PS method - no group interface"""
779 set_no_group_iface(dev[0], 1)
780 set_no_group_iface(dev[1], 1)
782 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
783 if grp_ifname0 != dev[0].ifname:
784 raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
785 if grp_ifname1 != dev[1].ifname:
786 raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
787 if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
788 raise Exception("dev0 group interface unexpectedly present")
789 if has_string_prefix(ifnames, 'p2p-' + grp_ifname1):
790 raise Exception("dev1 group interface unexpectedly present")
792 def test_p2ps_connect_p2ps_method_2(dev):
793 """P2PS connection with P2PS method - group interface on dev0"""
794 set_no_group_iface(dev[0], 0)
795 set_no_group_iface(dev[1], 1)
797 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
798 if not grp_ifname0.startswith('p2p-' + dev[0].ifname + '-'):
799 raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
800 if grp_ifname1 != dev[1].ifname:
801 raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
802 if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
803 raise Exception("dev0 group interface unexpectedly present")
805 def test_p2ps_connect_p2ps_method_3(dev):
806 """P2PS connection with P2PS method - group interface on dev1"""
807 set_no_group_iface(dev[0], 1)
808 set_no_group_iface(dev[1], 0)
810 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
811 if grp_ifname0 != dev[0].ifname:
812 raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
813 if not grp_ifname1.startswith('p2p-' + dev[1].ifname + '-'):
814 raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
815 if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
816 raise Exception("dev0 group interface unexpectedly present")
818 def test_p2ps_connect_p2ps_method_4(dev):
819 """P2PS connection with P2PS method - group interface on both"""
820 set_no_group_iface(dev[0], 0)
821 set_no_group_iface(dev[1], 0)
823 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
824 if not grp_ifname0.startswith('p2p-' + dev[0].ifname + '-'):
825 raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
826 if not grp_ifname1.startswith('p2p-' + dev[1].ifname + '-'):
827 raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
829 def test_p2ps_connect_adv_go_persistent(dev):
830 """P2PS auto-accept connection with advertisement as GO and having persistent group"""
831 go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
832 r_dev=dev[1], r_intent=0)
833 dev[0].remove_group()
834 dev[1].wait_go_ending_session()
836 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
837 srv_info='I can receive files upto size 2 GB')
838 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
839 svc_name='org.wi-fi.wfds.send.rx',
841 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
842 if "persist=" not in ev0 or "persist=" not in ev1:
843 raise Exception("Persistent group isn't used by peers")
845 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
846 remove_group(dev[0], dev[1])
848 def test_p2ps_adv_go_persistent_no_peer_entry(dev):
849 """P2PS advertisement as GO having persistent group (no peer entry)"""
850 go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
851 r_dev=dev[1], r_intent=0)
852 dev[0].remove_group()
853 dev[1].wait_go_ending_session()
855 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
856 srv_info='I can receive files upto size 2 GB')
857 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
858 svc_name='org.wi-fi.wfds.send.rx',
860 dev[0].global_request("P2P_FLUSH")
862 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
863 if "persist=" not in ev0 or "persist=" not in ev1:
864 raise Exception("Persistent group isn't used by peers")
866 def test_p2ps_pd_follow_on_status_failure(dev):
867 """P2PS PD follow on request with status 11"""
868 addr0 = dev[0].p2p_dev_addr()
869 addr1 = dev[1].p2p_dev_addr()
871 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
872 srv_info='I can receive files upto size 2 GB')
873 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
874 svc_name='org.wi-fi.wfds.send.rx',
876 dev[1].asp_provision(addr0, adv_id=str(adv_id), adv_mac=addr0,
877 session_id=1, session_mac=addr1)
878 ev_pd_start = dev[0].wait_global_event(["P2PS-PROV-START"], timeout=10)
879 if ev_pd_start is None:
880 raise Exception("P2PS-PROV-START timeout on Advertiser side")
881 ev = dev[1].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
883 raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
884 dev[1].p2p_ext_listen(500, 500)
885 dev[0].p2p_stop_find()
886 dev[0].asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr0, session_id=1,
887 session_mac=addr1, status=11, method=0)
889 ev = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
891 raise Exception("P2P-PROV-DONE timeout on seeker side")
893 raise Exception("P2P-PROV-DONE without adv_id on seeker side")
894 if "status=11" not in ev:
895 raise Exception("P2P-PROV-DONE without status on seeker side")
897 ev = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
899 raise Exception("P2P-PROV-DONE timeout on advertiser side")
901 raise Exception("P2P-PROV-DONE without adv_id on advertiser side")
902 if "status=11" not in ev:
903 raise Exception("P2P-PROV-DONE without status on advertiser side")
905 def test_p2ps_client_probe(dev):
906 """P2PS CLI discoverability on operating channel"""
907 cli_probe = dev[0].global_request("SET p2p_cli_probe 1")
908 p2ps_connect_p2ps_method(dev, keep_group=True)
909 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
910 svc_name='org.wi-fi.wfds.send.rx',
911 single_peer_expected=False)
912 dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
913 remove_group(dev[0], dev[1])
915 def test_p2ps_go_probe(dev):
916 """P2PS GO discoverability on operating channel"""
917 p2ps_connect_adv_go_pin_method(dev, keep_group=True)
918 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
919 svc_name='org.wi-fi.wfds.send.rx',
920 single_peer_expected=False)
921 dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
922 remove_group(dev[0], dev[1])
924 def test_p2ps_wildcard_p2ps(dev):
925 """P2PS wildcard SD Probe Request/Response"""
926 p2ps_wildcard = "org.wi-fi.wfds"
928 adv_id = p2ps_advertise(r_dev=dev[0], r_role='1',
929 svc_name='org.foo.service',
930 srv_info='I can do stuff')
931 adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='1',
932 svc_name='org.wi-fi.wfds.send.rx',
933 srv_info='I can receive files upto size 2 GB')
935 if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=org.foo.service seek=" + p2ps_wildcard):
936 raise Exception("Failed on P2P_FIND command")
938 ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
940 raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
941 if dev[0].p2p_dev_addr() not in ev1:
942 raise Exception("Unexpected peer")
944 ev2 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
946 raise Exception("P2P-DEVICE-FOUND timeout on seeker side (2)")
947 if dev[0].p2p_dev_addr() not in ev2:
948 raise Exception("Unexpected peer (2)")
950 if p2ps_wildcard not in ev1 + ev2:
951 raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event")
952 if "org.foo.service" not in ev1 + ev2:
953 raise Exception("Vendor specific service name not found in P2P-DEVICE-FOUND event")
955 if "OK" not in dev[1].global_request("P2P_STOP_FIND"):
956 raise Exception("P2P_STOP_FIND failed")
957 dev[1].dump_monitor()
959 res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
961 raise Exception("Unable to remove the advertisement instance")
963 if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
964 raise Exception("Failed on P2P_FIND command")
966 ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
968 raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
969 if dev[0].p2p_dev_addr() not in ev1:
970 raise Exception("Unexpected peer")
971 if p2ps_wildcard not in ev1:
972 raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event (2)")
973 dev[1].dump_monitor()
975 res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
977 raise Exception("Unable to remove the advertisement instance 2")
979 if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
980 raise Exception("Failed on P2P_FIND command")
982 ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=2)
984 raise Exception("Unexpected P2P-DEVICE-FOUND event on seeker side")
985 dev[1].p2p_stop_find()
986 dev[1].dump_monitor()
988 def test_p2ps_many_services_in_probe(dev):
989 """P2PS with large number of services in Probe Request/Response"""
990 long1 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.a'
991 long2 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.b'
992 long3 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.c'
993 long4 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.d'
994 long5 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.e'
995 for name in [ long1, long2, long3, long4, long5 ]:
996 p2ps_advertise(r_dev=dev[0], r_role='1',
998 srv_info='I can do stuff')
1000 if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=%s seek=%s seek=%s seek=%s seek=%s" % (long1, long2, long3, long4, long5)):
1001 raise Exception("Failed on P2P_FIND command")
1004 # Note: Require only four events since all the services do not fit within
1007 ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
1009 raise Exception("Missing P2P-DEVICE-FOUND")
1010 events = events + ev
1011 dev[1].p2p_stop_find()
1012 dev[1].dump_monitor()
1013 for name in [ long2, long3, long4, long5 ]:
1014 if name not in events:
1015 raise Exception("Service missing from peer events")
1017 def p2ps_test_feature_capability_cpt(dev, adv_cpt, seeker_cpt, adv_role,
1019 p2ps_advertise(r_dev=dev[0], r_role=adv_role,
1020 svc_name='org.wi-fi.wfds.send.rx',
1021 srv_info='I can receive files upto size 2 GB', cpt=adv_cpt)
1022 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1023 svc_name='org.wi-fi.wfds.send.rx',
1025 auto_accept = adv_role != "0"
1026 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id,
1027 auto_accept=auto_accept, adv_cpt=adv_cpt,
1028 seeker_cpt=seeker_cpt, method="8")
1030 status0, fcap0 = p2ps_parse_event(ev0, "status", "feature_cap")
1031 status1, fcap1 = p2ps_parse_event(ev0, "status", "feature_cap")
1034 raise Exception("Bad feature capability on Seeker side")
1036 raise Exception("Bad feature capability on Advertiser side")
1038 raise Exception("Incompatible feature capability values")
1040 if status0 not in ("0", "12") or status1 not in ("0", "12"):
1041 raise Exception("Unexpected PD result status")
1043 if result == "UDP" and fcap0[1] != "1":
1044 raise Exception("Unexpected CPT feature capability value (expected: UDP)")
1045 elif result == "MAC" and fcap0[1] != "2":
1046 raise Exception("Unexpected CPT feature capability value (expected: MAC)")
1048 ev = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1050 raise Exception("Unable to remove the advertisement instance")
1052 def test_p2ps_feature_capability_mac_autoaccept(dev):
1053 """P2PS PD Feature Capability CPT: advertiser MAC, seeker UDP:MAC, autoaccept"""
1054 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
1055 adv_role="4", result="MAC")
1057 def test_p2ps_feature_capability_mac_nonautoaccept(dev):
1058 """P2PS PD Feature Capability CPT: advertiser:MAC, seeker UDP:MAC, nonautoaccept"""
1059 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
1060 adv_role="0", result="MAC")
1062 def test_p2ps_feature_capability_mac_udp_autoaccept(dev):
1063 """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, autoaccept"""
1064 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
1065 seeker_cpt="UDP:MAC", adv_role="2",
1068 def test_p2ps_feature_capability_mac_udp_nonautoaccept(dev):
1069 """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, nonautoaccept"""
1070 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
1071 seeker_cpt="UDP:MAC", adv_role="0",
1074 def test_p2ps_feature_capability_udp_mac_autoaccept(dev):
1075 """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, autoaccept"""
1076 p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
1077 seeker_cpt="MAC:UDP", adv_role="2",
1080 def test_p2ps_feature_capability_udp_mac_nonautoaccept(dev):
1081 """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, nonautoaccept"""
1082 p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
1083 seeker_cpt="MAC:UDP", adv_role="0",
1086 def test_p2ps_channel_one_connected(dev, apdev):
1087 """P2PS connection with P2PS method - one of the stations connected"""
1088 set_no_group_iface(dev[0], 0)
1089 set_no_group_iface(dev[1], 0)
1092 hapd = hostapd.add_ap(apdev[0],
1093 { "ssid": 'bss-2.4ghz', "channel": '7' })
1094 dev[1].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2442")
1096 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev, keep_group=True, join_extra=" freq=2442")
1097 freq = dev[0].get_group_status_field('freq');
1100 raise Exception('Unexpected frequency for group 2442 != ' + freq)
1102 remove_group(dev[0], dev[1])
1103 dev[0].global_request("P2P_SERVICE_DEL asp all")
1105 def set_random_listen_chan(dev):
1106 chan = random.randrange(0, 3) * 5 + 1
1107 dev.global_request("P2P_SET listen_channel %d" % chan)
1109 def test_p2ps_channel_both_connected_same(dev, apdev):
1110 """P2PS connection with P2PS method - stations connected on same channel"""
1111 set_no_group_iface(dev[2], 0)
1112 set_no_group_iface(dev[1], 0)
1114 dev[2].global_request("P2P_SET listen_channel 6")
1115 dev[1].global_request("P2P_SET listen_channel 6")
1117 dev[1].flush_scan_cache()
1118 dev[2].flush_scan_cache()
1121 hapd = hostapd.add_ap(apdev[0],
1122 { "ssid": 'bss-2.4ghz', "channel": '6' })
1124 dev[2].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2437")
1125 dev[1].connect("bss-2.4ghz", key_mgmt="NONE", scan_freq="2437")
1127 tmpdev = [ dev[2], dev[1] ]
1128 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(tmpdev, keep_group=True, join_extra=" freq=2437", flush=False)
1129 freq = dev[2].get_group_status_field('freq');
1132 raise Exception('Unexpected frequency for group 2437 != ' + freq)
1134 remove_group(dev[2], dev[1])
1135 dev[2].global_request("P2P_SERVICE_DEL asp all")
1136 for i in range(1, 3):
1137 set_random_listen_chan(dev[i])
1139 def disconnect_handler(seeker, advertiser):
1140 advertiser.request("DISCONNECT")
1141 advertiser.wait_disconnected(timeout=1)
1143 def test_p2ps_channel_both_connected_different(dev, apdev):
1144 """P2PS connection with P2PS method - stations connected on different channel"""
1145 if dev[0].get_mcc() > 1:
1146 raise HwsimSkip('Skip due to MCC being enabled')
1148 set_no_group_iface(dev[0], 0)
1149 set_no_group_iface(dev[1], 0)
1152 hapd1 = hostapd.add_ap(apdev[0],
1153 { "ssid": 'bss-channel-3', "channel": '3' })
1155 hapd2 = hostapd.add_ap(apdev[1],
1156 { "ssid": 'bss-channel-10', "channel": '10' })
1158 dev[0].connect("bss-channel-3", key_mgmt="NONE", scan_freq="2422")
1159 dev[1].connect("bss-channel-10", key_mgmt="NONE", scan_freq="2457")
1161 p2ps_advertise(r_dev=dev[0], r_role='2',
1162 svc_name='org.wi-fi.wfds.send.rx',
1163 srv_info='I can receive files upto size 2 GB')
1164 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1165 svc_name='org.wi-fi.wfds.send.rx',
1168 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1169 handler=disconnect_handler)
1170 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1171 freq = dev[0].get_group_status_field('freq');
1173 raise Exception('Unexpected frequency for group 2457 != ' + freq)
1175 remove_group(dev[0], dev[1])
1176 dev[0].global_request("P2P_SERVICE_DEL asp all")
1178 def test_p2ps_channel_both_connected_different_mcc(dev, apdev):
1179 """P2PS connection with P2PS method - stations connected on different channels with mcc"""
1180 if dev[0].get_mcc() == 1:
1181 raise HwsimSkip('Skip case due to MCC not enabled')
1183 set_no_group_iface(dev[0], 0)
1184 set_no_group_iface(dev[1], 0)
1187 hapd1 = hostapd.add_ap(apdev[0],
1188 { "ssid": 'bss-channel-3', "channel": '3' })
1190 hapd2 = hostapd.add_ap(apdev[1],
1191 { "ssid": 'bss-channel-10', "channel": '10' })
1193 dev[0].connect("bss-channel-3", key_mgmt="NONE", scan_freq="2422")
1194 dev[1].connect("bss-channel-10", key_mgmt="NONE", scan_freq="2457")
1196 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev, keep_group=True)
1197 freq = dev[0].get_group_status_field('freq');
1199 if freq != '2422' and freq != '2457':
1200 raise Exception('Unexpected frequency for group =' + freq)
1202 remove_group(dev[0], dev[1])
1203 dev[0].global_request("P2P_SERVICE_DEL asp all")
1205 def clear_disallow_handler(seeker, advertiser):
1206 advertiser.global_request("P2P_SET disallow_freq ")
1208 def test_p2ps_channel_disallow_freq(dev, apdev):
1209 """P2PS connection with P2PS method - disallow freqs"""
1210 set_no_group_iface(dev[0], 0)
1211 set_no_group_iface(dev[1], 0)
1214 dev[0].global_request("P2P_SET disallow_freq 2412-2457")
1215 dev[1].global_request("P2P_SET disallow_freq 2417-2462")
1217 p2ps_advertise(r_dev=dev[0], r_role='2',
1218 svc_name='org.wi-fi.wfds.send.rx',
1219 srv_info='I can receive files upto size 2 GB')
1221 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1222 svc_name='org.wi-fi.wfds.send.rx',
1225 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1226 handler=clear_disallow_handler)
1227 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1229 freq = dev[0].get_group_status_field('freq');
1231 raise Exception('Unexpected frequency for group 2412 != ' + freq)
1233 remove_group(dev[0], dev[1])
1234 dev[0].global_request("P2P_SERVICE_DEL asp all")
1235 dev[0].global_request("P2P_SET disallow_freq ")
1236 dev[1].global_request("P2P_SET disallow_freq ")
1238 def test_p2ps_channel_sta_connected_disallow_freq(dev, apdev):
1239 """P2PS connection with P2PS method - one station and disallow freqs"""
1240 if dev[0].get_mcc() > 1:
1241 raise HwsimSkip('Skip due to MCC being enabled')
1243 set_no_group_iface(dev[0], 0)
1244 set_no_group_iface(dev[1], 0)
1247 dev[0].global_request("P2P_SET disallow_freq 2437")
1248 hapd = hostapd.add_ap(apdev[0],
1249 { "ssid": 'bss-channel-6', "channel": '6' })
1251 dev[1].connect("bss-channel-6", key_mgmt="NONE", scan_freq="2437")
1253 p2ps_advertise(r_dev=dev[0], r_role='2',
1254 svc_name='org.wi-fi.wfds.send.rx',
1255 srv_info='I can receive files upto size 2 GB')
1256 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1257 svc_name='org.wi-fi.wfds.send.rx',
1260 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1261 handler=clear_disallow_handler)
1262 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1264 freq = dev[0].get_group_status_field('freq');
1266 raise Exception('Unexpected frequency for group 2437 != ' + freq)
1268 remove_group(dev[0], dev[1])
1269 dev[0].global_request("P2P_SET disallow_freq ")
1270 dev[0].global_request("P2P_SERVICE_DEL asp all")
1272 def test_p2ps_channel_sta_connected_disallow_freq_mcc(dev, apdev):
1273 """P2PS connection with P2PS method - one station and disallow freqs with mcc"""
1274 with HWSimRadio(n_channels=2) as (radio, iface):
1275 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1276 wpas.interface_add(iface)
1278 if wpas.get_mcc() < 2:
1279 raise Exception("New radio does not support MCC")
1281 set_no_group_iface(dev[0], 0)
1282 set_no_group_iface(wpas, 0)
1285 dev[0].global_request("P2P_SET disallow_freq 2437")
1286 hapd1 = hostapd.add_ap(apdev[0],
1287 { "ssid": 'bss-channel-6', "channel": '6' })
1289 wpas.connect("bss-channel-6", key_mgmt="NONE", scan_freq="2437")
1291 tmpdev = [ dev[0], wpas ]
1292 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(tmpdev, keep_group=True)
1294 freq = dev[0].get_group_status_field('freq');
1296 raise Exception('Unexpected frequency=2437')
1298 remove_group(dev[0], wpas)
1299 dev[0].global_request("P2P_SET disallow_freq ")
1300 dev[0].global_request("P2P_SERVICE_DEL asp all")
1302 def test_p2ps_active_go_adv(dev, apdev):
1303 """P2PS connection with P2PS method - active GO on advertiser"""
1304 set_no_group_iface(dev[0], 0)
1305 set_no_group_iface(dev[1], 0)
1309 dev[0].global_request("P2P_GROUP_ADD persistent")
1310 ev = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1312 raise Exception("P2P-GROUP-STARTED timeout on " + dev[0].p2p_dev_addr())
1314 dev[0].group_form_result(ev)
1316 p2ps_advertise(r_dev=dev[0], r_role='4',
1317 svc_name='org.wi-fi.wfds.send.rx',
1318 srv_info='I can receive files upto size 2 GB')
1319 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1320 svc_name='org.wi-fi.wfds.send.rx',
1321 single_peer_expected=False)
1323 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
1325 # explicitly stop find/listen as otherwise the long listen started by
1326 # the advertiser would prevent the seeker to connect with the P2P GO
1327 dev[0].p2p_stop_find()
1328 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1330 remove_group(dev[0], dev[1])
1331 dev[0].global_request("P2P_SERVICE_DEL asp all")
1333 def test_p2ps_active_go_seeker(dev, apdev):
1334 """P2PS connection with P2PS method - active GO on seeker"""
1335 set_no_group_iface(dev[0], 0)
1336 set_no_group_iface(dev[1], 0)
1339 # Add a P2P GO on the seeker
1340 dev[1].global_request("P2P_GROUP_ADD persistent")
1341 ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1343 raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1345 res = dev[1].group_form_result(ev)
1347 p2ps_advertise(r_dev=dev[0], r_role='2',
1348 svc_name='org.wi-fi.wfds.send.rx',
1349 srv_info='I can receive files upto size 2 GB')
1350 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1351 svc_name='org.wi-fi.wfds.send.rx',
1354 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
1355 p2ps_connect_pd(dev[0], dev[1], ev0, ev1,
1356 join_extra=" freq=" + res['freq'])
1358 remove_group(dev[0], dev[1])
1359 dev[0].global_request("P2P_SERVICE_DEL asp all")
1361 def test_p2ps_channel_active_go_and_station_same(dev, apdev):
1362 """P2PS connection, active P2P GO and station on channel"""
1363 set_no_group_iface(dev[2], 0)
1364 set_no_group_iface(dev[1], 0)
1366 dev[2].global_request("P2P_SET listen_channel 11")
1367 dev[1].global_request("P2P_SET listen_channel 11")
1369 hapd = hostapd.add_ap(apdev[0],
1370 { "ssid": 'bss-channel-11', "channel": '11' })
1372 dev[2].connect("bss-channel-11", key_mgmt="NONE", scan_freq="2462")
1374 # Add a P2P GO on the seeker
1375 dev[1].global_request("P2P_GROUP_ADD freq=2462 persistent")
1376 ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1378 raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1380 dev[1].group_form_result(ev)
1382 p2ps_advertise(r_dev=dev[2], r_role='2',
1383 svc_name='org.wi-fi.wfds.send.rx',
1384 srv_info='I can receive files upto size 2 GB')
1385 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[2],
1386 svc_name='org.wi-fi.wfds.send.rx',
1389 ev1, ev0 = p2ps_provision(dev[1], dev[2], adv_id)
1390 p2ps_connect_pd(dev[2], dev[1], ev0, ev1, join_extra=" freq=2462")
1392 remove_group(dev[2], dev[1])
1393 dev[2].global_request("P2P_SERVICE_DEL asp all")
1394 for i in range(1, 3):
1395 set_random_listen_chan(dev[i])
1397 def test_p2ps_channel_active_go_and_station_different(dev, apdev):
1398 """P2PS connection, active P2P GO and station on channel"""
1399 if dev[0].get_mcc() > 1:
1400 raise HwsimSkip('Skip due to MCC being enabled')
1402 set_no_group_iface(dev[0], 0)
1403 set_no_group_iface(dev[1], 0)
1406 hapd = hostapd.add_ap(apdev[0],
1407 { "ssid": 'bss-channel-2', "channel": '2' })
1409 dev[0].connect("bss-channel-2", key_mgmt="NONE", scan_freq="2417")
1411 # Add a P2P GO on the seeker. Force the listen channel to be the same,
1412 # as extended listen will not kick as long as P2P GO is waiting for
1413 # initial connection.
1414 dev[1].global_request("P2P_SET listen_channel 11")
1415 dev[1].global_request("P2P_GROUP_ADD freq=2462 persistent")
1416 ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1418 raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1420 dev[1].group_form_result(ev)
1422 p2ps_advertise(r_dev=dev[0], r_role='2',
1423 svc_name='org.wi-fi.wfds.send.rx',
1424 srv_info='I can receive files upto size 2 GB')
1425 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1426 svc_name='org.wi-fi.wfds.send.rx',
1429 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False,
1430 handler=disconnect_handler, adv_role='2',
1432 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1433 freq = dev[0].get_group_status_field('freq');
1435 raise Exception('Unexpected frequency for group 2462!=' + freq)
1437 dev[0].global_request("P2P_SERVICE_DEL asp all")
1438 set_random_listen_chan(dev[1])
1440 def test_p2ps_channel_active_go_and_station_different_mcc(dev, apdev):
1441 """P2PS connection, active P2P GO and station on channel"""
1442 if dev[0].get_mcc() == 1:
1443 raise HwsimSkip('Skip due to MCC not being enabled')
1445 set_no_group_iface(dev[0], 0)
1446 set_no_group_iface(dev[1], 0)
1449 hapd = hostapd.add_ap(apdev[0],
1450 { "ssid": 'bss-channel-6', "channel": '6' })
1452 dev[0].connect("bss-channel-6", key_mgmt="NONE", scan_freq="2437")
1454 # Add a P2P GO on the seeker
1455 dev[1].global_request("P2P_GROUP_ADD freq=2462 persistent")
1456 ev = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
1458 raise Exception("P2P-GROUP-STARTED timeout on " + dev[1].p2p_dev_addr())
1460 dev[1].group_form_result(ev)
1462 p2ps_advertise(r_dev=dev[0], r_role='2',
1463 svc_name='org.wi-fi.wfds.send.rx',
1464 srv_info='I can receive files upto size 2 GB')
1465 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
1466 svc_name='org.wi-fi.wfds.send.rx',
1469 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
1470 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
1472 remove_group(dev[0], dev[1])
1473 dev[0].request("DISCONNECT")
1475 dev[0].global_request("P2P_SERVICE_DEL asp all")
1477 def test_p2ps_connect_p2p_device(dev):
1478 """P2PS connection using cfg80211 P2P Device"""
1479 run_p2ps_connect_p2p_device(dev, 0)
1481 def test_p2ps_connect_p2p_device_no_group_iface(dev):
1482 """P2PS connection using cfg80211 P2P Device (no separate group interface)"""
1483 run_p2ps_connect_p2p_device(dev, 1)
1485 def run_p2ps_connect_p2p_device(dev, no_group_iface):
1486 with HWSimRadio(use_p2p_device=True) as (radio, iface):
1487 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1488 wpas.interface_add(iface)
1489 wpas.global_request("SET p2p_no_group_iface %d" % no_group_iface)
1491 p2ps_advertise(r_dev=dev[0], r_role='1',
1492 svc_name='org.wi-fi.wfds.send.rx',
1493 srv_info='I can receive files upto size 2 GB')
1494 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=wpas, r_dev=dev[0],
1495 svc_name='org.wi-fi.wfds.send.rx',
1498 ev1, ev0 = p2ps_provision(wpas, dev[0], adv_id)
1499 p2ps_connect_pd(dev[0], wpas, ev0, ev1)
1501 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1503 raise Exception("Unable to remove the advertisement instance")
1504 remove_group(dev[0], wpas)
1506 def test_p2ps_connect_p2p_device2(dev):
1507 """P2PS connection using cfg80211 P2P Device (reverse)"""
1508 run_p2ps_connect_p2p_device2(dev, 0)
1510 def test_p2ps_connect_p2p_device2_no_group_iface(dev):
1511 """P2PS connection using cfg80211 P2P Device (reverse) (no separate group interface)"""
1512 run_p2ps_connect_p2p_device2(dev, 1)
1514 def run_p2ps_connect_p2p_device2(dev, no_group_iface):
1515 with HWSimRadio(use_p2p_device=True) as (radio, iface):
1516 wpas = WpaSupplicant(global_iface='/tmp/wpas-wlan5')
1517 wpas.interface_add(iface)
1518 wpas.global_request("SET p2p_no_group_iface %d" % no_group_iface)
1520 p2ps_advertise(r_dev=wpas, r_role='1',
1521 svc_name='org.wi-fi.wfds.send.rx',
1522 srv_info='I can receive files upto size 2 GB')
1523 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[0], r_dev=wpas,
1524 svc_name='org.wi-fi.wfds.send.rx',
1527 ev1, ev0 = p2ps_provision(dev[0], wpas, adv_id)
1528 p2ps_connect_pd(wpas, dev[0], ev0, ev1)
1530 ev0 = wpas.global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1532 raise Exception("Unable to remove the advertisement instance")
1533 remove_group(wpas, dev[0])