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
15 from test_p2p_grpform import check_grpform_results
16 from test_p2p_grpform import remove_group
17 from test_p2p_persistent import go_neg_pin_authorized_persistent
18 from utils import HwsimSkip
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")
95 return [adv_id, rcvd_svc_name]
97 def p2ps_nonexact_seek(i_dev, r_dev, svc_name, srv_info=None, adv_num=None):
98 """P2PS nonexact service seek request"""
101 if srv_info is not None:
102 ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
104 ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '")
106 raise Exception("Failed to add Service Discovery request for nonexact seek request")
107 if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek="):
108 raise Exception("Failed to initiate seek")
109 ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
111 raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
112 if r_dev.p2p_dev_addr() not in ev1:
113 raise Exception("Unexpected peer")
115 for i in range (0, adv_num):
116 ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
118 raise Exception("Failed to receive Service Discovery Response")
119 if r_dev.p2p_dev_addr() not in ev1:
120 raise Exception("Service Discovery response from Unknown Peer")
121 if srv_info is not None and srv_info not in ev1:
122 raise Exception("service info not available in Service Discovery response")
123 adv_id = ev1.split(" ")[3]
124 rcvd_svc_name = ev1.split(" ")[6]
125 ev_list.append(''.join([adv_id, ' ', rcvd_svc_name]))
128 def p2ps_parse_event(ev, *args):
131 m = re.search("\s+" + arg + r"=(\S+)", ev)
132 ret += (m.group(1) if m is not None else None,)
135 def p2ps_provision(seeker, advertiser, adv_id, auto_accept=True, method="1000", adv_cpt=None, seeker_cpt=None):
136 addr0 = seeker.p2p_dev_addr()
137 addr1 = advertiser.p2p_dev_addr()
139 seeker.asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr1, session_id=1,
140 session_mac=addr0, method=method, cpt=seeker_cpt)
142 if not auto_accept or method == "100":
144 ev_pd_start = advertiser.wait_global_event(["P2PS-PROV-START"],
146 if ev_pd_start is None:
147 raise Exception("P2PS-PROV-START timeout on Advertiser side")
148 peer = ev_pd_start.split()[1]
149 advert_id, advert_mac, session, session_mac =\
150 p2ps_parse_event(ev_pd_start, "adv_id", "adv_mac", "session", "mac")
152 ev = seeker.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
154 raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
157 ev = advertiser.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
160 raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
162 raise Exception("Unknown peer " + addr0)
163 ev = seeker.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
166 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on seeker side")
168 raise Exception("Unknown peer " + addr1)
171 ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
174 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
176 raise Exception("Unknown peer " + addr0)
179 advertiser.asp_provision(peer, adv_id=advert_id, adv_mac=advert_mac,
180 session_id=int(session, 0),
181 session_mac=session_mac, status=12,
184 ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
186 raise Exception("P2PS-PROV-DONE timeout on seeker side")
188 ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
190 raise Exception("P2PS-PROV-DONE timeout on advertiser side")
193 ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
196 raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
198 raise Exception("Unknown peer " + addr1)
204 # Auto-accept is true and the method is either P2PS or advertiser is DISPLAY
205 ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
207 raise Exception("P2PS-PROV-DONE timeout on seeker side")
209 ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
211 raise Exception("P2PS-PROV-DONE timeout on advertiser side")
214 ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
216 raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
218 raise Exception("Unknown peer " + addr1)
219 ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
222 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
224 raise Exception("Unknown peer " + addr0)
230 def p2ps_connect_pd(dev0, dev1, ev0, ev1, pin=None):
231 conf_methods_map = {"8": "p2ps", "1": "display", "5": "keypad"}
232 peer0 = ev0.split()[1]
233 peer1 = ev1.split()[1]
234 status0, conncap0, adv_id0, adv_mac0, mac0, session0, dev_passwd_id0, go0, join0, feature_cap0, persist0 =\
235 p2ps_parse_event(ev0, "status", "conncap", "adv_id", "adv_mac", "mac", "session", "dev_passwd_id", "go", "join", "feature_cap", "persist")
236 status1, conncap1, adv_id1, adv_mac1, mac1, session1, dev_passwd_id1, go1, join1, feature_cap1, persist1 =\
237 p2ps_parse_event(ev1, "status", "conncap", "adv_id", "adv_mac", "mac", "session", "dev_passwd_id", "go", "join", "feature_cap", "persist")
239 if status0 != "0" and status0 != "12":
240 raise Exception("PD failed on " + dev0.p2p_dev_addr())
242 if status1 != "0" and status1 != "12":
243 raise Exception("PD failed on " + dev1.p2p_dev_addr())
245 if status0 == "12" and status1 == "12":
246 raise Exception("Both sides have status 12 which doesn't make sense")
248 if adv_id0 != adv_id1 or adv_id0 is None:
249 raise Exception("Adv. IDs don't match")
251 if adv_mac0 != adv_mac1 or adv_mac0 is None:
252 raise Exception("Adv. MACs don't match")
254 if session0 != session1 or session0 is None:
255 raise Exception("Session IDs don't match")
257 if mac0 != mac1 or mac0 is None:
258 raise Exception("Session MACs don't match")
260 #TODO: Validate feature capability
262 if bool(persist0) != bool(persist1):
263 raise Exception("Only one peer has persistent group")
265 if persist0 is None and not all([conncap0, conncap1, dev_passwd_id0,
267 raise Exception("Persistent group not used but conncap/dev_passwd_id are missing")
269 if persist0 is not None and any([conncap0, conncap1, dev_passwd_id0,
271 raise Exception("Persistent group is used but conncap/dev_passwd_id are present")
273 # Persistent Connection (todo: handle frequency)
274 if persist0 is not None:
275 if "OK" not in dev0.global_request("P2P_GROUP_ADD persistent=" + persist0 + " freq=2412"):
276 raise Exception("Could not re-start persistent group")
277 ev0 = dev0.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
279 raise Exception("P2P-GROUP-STARTED timeout on " + dev0.p2p_dev_addr())
280 dev0.group_form_result(ev0)
282 if "OK" not in dev1.global_request("P2P_GROUP_ADD persistent=" + persist1 + " freq=2412"):
283 raise Exception("Could not re-start persistent group")
284 ev1 = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
286 raise Exception("P2P-GROUP-STARTED timeout on " + dev1.p2p_dev_addr())
287 dev1.group_form_result(ev1)
289 ev = dev0.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
291 raise Exception("AP-STA-CONNECTED timeout on " + dev0.p2p_dev_addr())
293 ev = dev1.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
295 raise Exception("AP-STA-CONNECTED timeout on " + dev1.p2p_dev_addr())
298 method0 = conf_methods_map[dev_passwd_id0]
299 method1 = conf_methods_map[dev_passwd_id1]
301 raise Exception("Unsupported method")
303 if method0 == "p2ps":
306 raise Exception("Pin is not provided")
308 if conncap0 == "1" and conncap1 == "1": # NEW/NEW - GON
309 if any([join0, join1, go0, go1]):
310 raise Exception("Unexpected join/go PD attributes")
312 if "OK" not in dev0.global_request("P2P_CONNECT " + peer0 + " " + pin + " " + method0 + " persistent auth"):
313 raise Exception("P2P_CONNECT fails on " + dev0.p2p_dev_addr())
314 if "OK" not in dev1.global_request("P2P_CONNECT " + peer1 + " " + pin + " " + method1 + " persistent"):
315 raise Exception("P2P_CONNECT fails on " + dev1.p2p_dev_addr())
316 ev = dev0.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
318 raise Exception("GO Neg did not succeed on " + dev0.p2p_dev_addr())
319 ev = dev1.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
321 raise Exception("GO Neg did not succeed on " + dev1.p2p_dev_addr())
322 ev = dev0.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
324 raise Exception("P2P-GROUP-STARTED timeout on " + dev0.p2p_dev_addr())
325 dev0.group_form_result(ev)
326 ev = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
328 raise Exception("P2P-GROUP-STARTED timeout on " + dev1.p2p_dev_addr())
329 dev1.group_form_result(ev)
331 if conncap0 == "2" and conncap1 == "4": # dev0 CLI, dev1 GO
332 dev_cli, dev_go, go_if, join_address, go_method, cli_method = dev0, dev1, go1, join0, method1, method0
333 elif conncap0 == "4" and conncap1 == "2": # dev0 GO, dev1 CLI
334 dev_cli, dev_go, go_if, join_address, go_method, cli_method = dev1, dev0, go0, join1, method0, method1
336 raise Exception("Bad connection capabilities")
339 raise Exception("Device " + dev_go.p2p_dev_addr() + " failed to become GO")
340 if join_address is None:
341 raise Exception("Device " + dev_cli.p2p_dev_addr() + " failed to become CLI")
342 ev = dev_go.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
344 raise Exception("P2P-GROUP-STARTED timeout on " + dev_go.p2p_dev_addr())
345 dev_go.group_form_result(ev)
346 if go_method != "p2ps":
347 ev = dev_go.group_request("WPS_PIN any " + pin)
349 raise Exception("Failed to initiate pin authorization on registrar side")
350 if "OK" not in dev_cli.global_request("P2P_CONNECT " + join_address + " " + pin + " " + cli_method + " persistent join"):
351 raise Exception("P2P_CONNECT failed on " + dev_cli.p2p_dev_addr())
352 ev = dev_cli.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
354 raise Exception("P2P-GROUP-STARTED timeout on " + dev_cli.p2p_dev_addr())
355 dev_cli.group_form_result(ev)
356 ev = dev_go.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
358 raise Exception("AP-STA-CONNECTED timeout on " + dev_go.p2p_dev_addr())
360 hwsim_utils.test_connectivity_p2p(dev0, dev1)
362 def set_no_group_iface(dev, enable):
364 res = dev.get_driver_status()
365 if (int(res['capa.flags'], 0) & 0x20000000):
366 raise HwsimSkip("P2P Device used. Cannot set enable no_group_iface")
367 dev.global_request("SET p2p_no_group_iface 1")
369 dev.global_request("SET p2p_no_group_iface 0")
371 def test_p2ps_exact_search(dev):
372 """P2PS exact service request"""
373 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
374 srv_info='I can receive files upto size 2 GB')
375 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
376 svc_name='org.wi-fi.wfds.send.rx')
378 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
380 raise Exception("Unable to remove the advertisement instance")
382 def test_p2ps_exact_search_srvinfo(dev):
383 """P2PS exact service request with service info"""
384 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
385 srv_info='I can receive files upto size 2 GB')
386 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
387 svc_name='org.wi-fi.wfds.send.rx',
390 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
392 raise Exception("Unable to remove the advertisement instance")
394 def test_p2ps_nonexact_search(dev):
395 """P2PS nonexact seek request"""
396 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.play.rx',
397 srv_info='I support Miracast Mode ')
398 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
399 svc_name='org.wi-fi.wfds.play*')
400 adv_id = ev_list[0].split()[0]
402 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
404 raise Exception("Unable to remove the advertisement instance")
406 def test_p2ps_nonexact_search_srvinfo(dev):
407 """P2PS nonexact seek request with service info"""
408 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
409 srv_info='I can receive files upto size 2 GB')
410 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
411 svc_name='org.wi-fi.wfds.send*',
413 adv_id = ev_list[0].split()[0]
414 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
416 raise Exception("Unable to remove the advertisement instance")
418 def test_p2ps_connect_p2ps_method_nonautoaccept(dev):
419 """P2PS connect for non-auto-accept and P2PS config method"""
420 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
421 srv_info='I can receive files upto size 2 GB')
422 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
423 svc_name='org.wi-fi.wfds.send*',
425 adv_id = ev_list[0].split()[0]
426 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False)
427 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
429 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
431 raise Exception("Unable to remove the advertisement instance")
432 remove_group(dev[0], dev[1])
434 def test_p2ps_connect_p2ps_method_autoaccept(dev):
435 """P2PS connection with P2PS default config method and auto-accept"""
436 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
437 srv_info='I can receive files upto size 2 GB')
438 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
439 svc_name='org.wi-fi.wfds.send.rx',
442 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
443 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
445 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
447 raise Exception("Unable to remove the advertisement instance")
448 remove_group(dev[0], dev[1])
450 def test_p2ps_connect_keypad_method_nonautoaccept(dev):
451 """P2PS Connection with non-auto-accept and seeker having keypad method"""
452 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
453 srv_info='I can receive files upto size 2 GB')
454 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
455 svc_name='org.wi-fi.wfds.send*',
457 adv_id = ev_list[0].split()[0]
459 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False, method="8")
460 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
462 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
464 raise Exception("Unable to remove the advertisement instance")
465 remove_group(dev[0], dev[1])
467 def test_p2ps_connect_display_method_nonautoaccept(dev):
468 """P2PS connection with non-auto-accept and seeker having display method"""
469 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
470 srv_info='I can receive files upto size 2 GB')
471 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
472 svc_name='org.wi-fi.wfds*', srv_info='2 GB')
473 adv_id = ev_list[0].split()[0]
475 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False, method="100")
476 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
478 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
480 raise Exception("Unable to remove the advertisement instance")
481 remove_group(dev[0], dev[1])
483 def test_p2ps_connect_keypad_method_autoaccept(dev):
484 """P2PS connection with auto-accept and keypad method on seeker side"""
485 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
486 srv_info='I can receive files upto size 2 GB')
487 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
488 svc_name='org.wi-fi.wfds.send.rx',
491 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
492 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
494 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
496 raise Exception("Unable to remove the advertisement instance")
497 remove_group(dev[0], dev[1])
499 def test_p2ps_connect_display_method_autoaccept(dev):
500 """P2PS connection with auto-accept and display method on seeker side"""
501 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
502 srv_info='I can receive files upto size 2 GB')
503 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
504 svc_name='org.wi-fi.wfds.send.rx',
507 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="100")
508 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
510 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
512 raise Exception("Unable to remove the advertisement instance")
513 remove_group(dev[0], dev[1])
515 def test_p2ps_connect_adv_go_p2ps_method(dev):
516 """P2PS auto-accept connection with advertisement as GO and P2PS method"""
517 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
518 srv_info='I can receive files upto size 2 GB')
519 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
520 svc_name='org.wi-fi.wfds.send.rx',
523 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
524 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
526 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
528 raise Exception("Unable to remove the advertisement instance")
529 remove_group(dev[0], dev[1])
531 def test_p2ps_connect_adv_go_p2ps_method_group_iface(dev):
532 """P2PS auto-accept connection with advertisement as GO and P2PS method using separate group interface"""
533 set_no_group_iface(dev[0], 0)
534 set_no_group_iface(dev[1], 0)
535 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
536 srv_info='I can receive files upto size 2 GB')
537 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
538 svc_name='org.wi-fi.wfds.send.rx',
541 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
542 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
544 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
546 raise Exception("Unable to remove the advertisement instance")
547 remove_group(dev[0], dev[1])
549 def test_p2ps_connect_adv_client_p2ps_method(dev):
550 """P2PS auto-accept connection with advertisement as Client and P2PS method"""
551 p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
552 srv_info='I can receive files upto size 2 GB')
553 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
554 svc_name='org.wi-fi.wfds.send.rx',
557 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
558 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
560 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
562 raise Exception("Unable to remove the advertisement instance")
563 remove_group(dev[0], dev[1])
565 def p2ps_connect_adv_go_pin_method(dev, keep_group=False):
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',
571 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
572 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
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_go_pin_method(dev):
581 """P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
582 p2ps_connect_adv_go_pin_method(dev)
584 def test_p2ps_connect_adv_client_pin_method(dev):
585 """P2PS advertiser as client with keypad config method on seeker side and auto-accept"""
586 dev[0].flush_scan_cache()
587 p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
588 srv_info='I can receive files upto size 2 GB')
589 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
590 svc_name='org.wi-fi.wfds.send.rx',
593 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
594 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
596 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
598 raise Exception("Unable to remove the advertisement instance")
599 remove_group(dev[0], dev[1])
601 def test_p2ps_service_discovery_multiple_queries(dev):
602 """P2P service discovery with multiple queries"""
603 addr0 = dev[0].p2p_dev_addr()
604 addr1 = dev[1].p2p_dev_addr()
605 adv_id1 = p2ps_advertise(r_dev=dev[0], r_role='0',
606 svc_name='org.wi-fi.wfds.send.tx',
607 srv_info='I can transfer files upto size of 2 GB')
608 adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='0',
609 svc_name='org.wi-fi.wfds.send.rx',
610 srv_info='I can receive files upto size of 2 GB')
611 adv_id3 = p2ps_advertise(r_dev=dev[0], r_role='1',
612 svc_name='org.wi-fi.wfds.display.tx',
613 srv_info='Miracast Mode')
614 adv_id4 = p2ps_advertise(r_dev=dev[0], r_role='1',
615 svc_name='org.wi-fi.wfds.display.rx',
616 srv_info='Miracast Mode')
618 dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 1 org.wi-fi.wfds.display.tx 'Miracast Mode'")
619 dev[1].global_request("P2P_FIND 10 type=social seek=org.wi-fi.wfds.display.tx")
620 dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 2 org.wi-fi.wfds.send* 'size of 2 GB'")
621 dev[1].p2p_stop_find()
622 dev[1].global_request("P2P_FIND 10 type=social seek=")
623 ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
625 raise Exception("P2P Device Found timed out")
627 raise Exception("Unexpected service discovery request source")
629 for i in range(0, 3):
630 ev = dev[1].wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
632 raise Exception("P2P Service discovery timed out")
635 if len(ev_list) == 3:
637 dev[1].p2p_stop_find()
639 for test in [ ("seek=org.wi-fi.wfds.display.TX",
640 "asp_svc=org.wi-fi.wfds.display.tx"),
641 ("seek=foo seek=org.wi-fi.wfds.display.tx seek=bar",
642 "asp_svc=org.wi-fi.wfds.display.tx"),
643 ("seek=1 seek=2 seek=3 seek=org.wi-fi.wfds.display.tx seek=4 seek=5 seek=6",
644 "asp_svc=org.wi-fi.wfds.display.tx"),
645 ("seek=not-found", None),
646 ("seek=org.wi-fi.wfds", "asp_svc=org.wi-fi.wfds")]:
647 dev[2].global_request("P2P_FIND 10 type=social " + test[0])
649 ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=1)
651 raise Exception("Unexpected device found: " + ev)
653 ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
655 raise Exception("P2P device discovery timed out (dev2)")
656 if test[1] not in ev:
657 raise Exception("Expected asp_svc not reported: " + ev)
658 dev[2].p2p_stop_find()
659 dev[2].request("P2P_FLUSH")
661 dev[0].p2p_stop_find()
663 ev1 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id1))
665 raise Exception("Unable to remove the advertisement instance")
666 ev2 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
668 raise Exception("Unable to remove the advertisement instance")
669 ev3 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id3))
671 raise Exception("Unable to remove the advertisement instance")
672 ev4 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id4))
674 raise Exception("Unable to remove the advertisement instance")
676 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
677 raise Exception("P2P_SERVICE_ADD failed")
678 if "OK" not in dev[0].global_request("P2P_SERVICE_DEL asp all"):
679 raise Exception("P2P_SERVICE_DEL asp all failed")
680 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
681 raise Exception("P2P_SERVICE_ADD failed")
682 if "OK" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
683 raise Exception("P2P_SERVICE_REP failed")
684 if "FAIL" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
685 raise Exception("Invalid P2P_SERVICE_REP accepted")
686 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345678 1 1108 org.wi-fi.wfds.something svc_info='Test'"):
687 raise Exception("P2P_SERVICE_ADD failed")
688 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345679 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
689 raise Exception("P2P_SERVICE_ADD failed")
692 with open('/proc/net/dev', 'r') as f:
695 for line in data.splitlines():
696 ifname = line.strip().split(' ')[0]
697 if ':' not in ifname:
699 ifname = ifname.split(':')[0]
700 ifnames.append(ifname)
703 def p2ps_connect_p2ps_method(dev, keep_group=False):
704 dev[0].flush_scan_cache()
705 dev[1].flush_scan_cache()
706 p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
707 srv_info='I can receive files upto size 2 GB')
708 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
709 svc_name='org.wi-fi.wfds.send.rx',
711 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
712 ifnames = get_ifnames()
713 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
715 grp_ifname0 = dev[0].get_group_ifname()
716 grp_ifname1 = dev[1].get_group_ifname()
718 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
720 raise Exception("Unable to remove the advertisement instance")
721 ifnames = ifnames + get_ifnames()
722 remove_group(dev[0], dev[1])
723 ifnames = ifnames + get_ifnames()
725 return grp_ifname0, grp_ifname1, ifnames
727 def has_string_prefix(vals, prefix):
729 if val.startswith(prefix):
733 def test_p2ps_connect_p2ps_method_1(dev):
734 """P2PS connection with P2PS method - no group interface"""
735 set_no_group_iface(dev[0], 1)
736 set_no_group_iface(dev[1], 1)
738 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
739 if grp_ifname0 != dev[0].ifname:
740 raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
741 if grp_ifname1 != dev[1].ifname:
742 raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
743 if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
744 raise Exception("dev0 group interface unexpectedly present")
745 if has_string_prefix(ifnames, 'p2p-' + grp_ifname1):
746 raise Exception("dev1 group interface unexpectedly present")
748 def test_p2ps_connect_p2ps_method_2(dev):
749 """P2PS connection with P2PS method - group interface on dev0"""
750 set_no_group_iface(dev[0], 0)
751 set_no_group_iface(dev[1], 1)
753 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
754 if not grp_ifname0.startswith('p2p-' + dev[0].ifname + '-'):
755 raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
756 if grp_ifname1 != dev[1].ifname:
757 raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
758 if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
759 raise Exception("dev0 group interface unexpectedly present")
761 def test_p2ps_connect_p2ps_method_3(dev):
762 """P2PS connection with P2PS method - group interface on dev1"""
763 set_no_group_iface(dev[0], 1)
764 set_no_group_iface(dev[1], 0)
766 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
767 if grp_ifname0 != dev[0].ifname:
768 raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
769 if not grp_ifname1.startswith('p2p-' + dev[1].ifname + '-'):
770 raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
771 if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
772 raise Exception("dev0 group interface unexpectedly present")
774 def test_p2ps_connect_p2ps_method_4(dev):
775 """P2PS connection with P2PS method - group interface on both"""
776 set_no_group_iface(dev[0], 0)
777 set_no_group_iface(dev[1], 0)
779 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
780 if not grp_ifname0.startswith('p2p-' + dev[0].ifname + '-'):
781 raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
782 if not grp_ifname1.startswith('p2p-' + dev[1].ifname + '-'):
783 raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
785 def test_p2ps_connect_adv_go_persistent(dev):
786 """P2PS auto-accept connection with advertisement as GO and having persistent group"""
787 go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
788 r_dev=dev[1], r_intent=0)
789 dev[0].remove_group()
790 dev[1].wait_go_ending_session()
792 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
793 srv_info='I can receive files upto size 2 GB')
794 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
795 svc_name='org.wi-fi.wfds.send.rx',
797 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
798 if "persist=" not in ev0 or "persist=" not in ev1:
799 raise Exception("Persistent group isn't used by peers")
801 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
802 remove_group(dev[0], dev[1])
804 def test_p2ps_client_probe(dev):
805 """P2PS CLI discoverability on operating channel"""
806 cli_probe = dev[0].global_request("SET p2p_cli_probe 1")
807 p2ps_connect_p2ps_method(dev, keep_group=True)
808 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
809 svc_name='org.wi-fi.wfds.send.rx',
810 single_peer_expected=False)
811 dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
812 remove_group(dev[0], dev[1])
814 def test_p2ps_go_probe(dev):
815 """P2PS GO discoverability on operating channel"""
816 p2ps_connect_adv_go_pin_method(dev, keep_group=True)
817 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
818 svc_name='org.wi-fi.wfds.send.rx',
819 single_peer_expected=False)
820 dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
821 remove_group(dev[0], dev[1])
823 def test_p2ps_wildcard_p2ps(dev):
824 """P2PS wildcard SD Probe Request/Response"""
825 p2ps_wildcard = "org.wi-fi.wfds"
827 adv_id = p2ps_advertise(r_dev=dev[0], r_role='1',
828 svc_name='org.foo.service',
829 srv_info='I can do stuff')
830 adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='1',
831 svc_name='org.wi-fi.wfds.send.rx',
832 srv_info='I can receive files upto size 2 GB')
834 if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=org.foo.service seek=" + p2ps_wildcard):
835 raise Exception("Failed on P2P_FIND command")
837 ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
839 raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
840 if dev[0].p2p_dev_addr() not in ev1:
841 raise Exception("Unexpected peer")
843 ev2 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
845 raise Exception("P2P-DEVICE-FOUND timeout on seeker side (2)")
846 if dev[0].p2p_dev_addr() not in ev2:
847 raise Exception("Unexpected peer (2)")
849 if p2ps_wildcard not in ev1 + ev2:
850 raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event")
851 if "org.foo.service" not in ev1 + ev2:
852 raise Exception("Vendor specific service name not found in P2P-DEVICE-FOUND event")
854 if "OK" not in dev[1].global_request("P2P_STOP_FIND"):
855 raise Exception("P2P_STOP_FIND failed")
856 dev[1].dump_monitor()
858 res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
860 raise Exception("Unable to remove the advertisement instance")
862 if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
863 raise Exception("Failed on P2P_FIND command")
865 ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
867 raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
868 if dev[0].p2p_dev_addr() not in ev1:
869 raise Exception("Unexpected peer")
870 if p2ps_wildcard not in ev1:
871 raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event (2)")
872 dev[1].dump_monitor()
874 res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
876 raise Exception("Unable to remove the advertisement instance 2")
878 if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
879 raise Exception("Failed on P2P_FIND command")
881 ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=2)
883 raise Exception("Unexpected P2P-DEVICE-FOUND event on seeker side")
884 dev[1].p2p_stop_find()
885 dev[1].dump_monitor()
887 def test_p2ps_many_services_in_probe(dev):
888 """P2PS with large number of services in Probe Request/Response"""
889 long1 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.a'
890 long2 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.b'
891 long3 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.c'
892 long4 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.d'
893 long5 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.e'
894 for name in [ long1, long2, long3, long4, long5 ]:
895 p2ps_advertise(r_dev=dev[0], r_role='1',
897 srv_info='I can do stuff')
899 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)):
900 raise Exception("Failed on P2P_FIND command")
903 # Note: Require only four events since all the services do not fit within
906 ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
908 raise Exception("Missing P2P-DEVICE-FOUND")
910 dev[1].p2p_stop_find()
911 dev[1].dump_monitor()
912 for name in [ long2, long3, long4, long5 ]:
913 if name not in events:
914 raise Exception("Service missing from peer events")
916 def p2ps_test_feature_capability_cpt(dev, adv_cpt, seeker_cpt, adv_role,
918 p2ps_advertise(r_dev=dev[0], r_role=adv_role,
919 svc_name='org.wi-fi.wfds.send.rx',
920 srv_info='I can receive files upto size 2 GB', cpt=adv_cpt)
921 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
922 svc_name='org.wi-fi.wfds.send.rx',
924 auto_accept = adv_role != "0"
925 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id,
926 auto_accept=auto_accept, adv_cpt=adv_cpt,
927 seeker_cpt=seeker_cpt, method="8")
929 status0, fcap0 = p2ps_parse_event(ev0, "status", "feature_cap")
930 status1, fcap1 = p2ps_parse_event(ev0, "status", "feature_cap")
933 raise Exception("Bad feature capability on Seeker side")
935 raise Exception("Bad feature capability on Advertiser side")
937 raise Exception("Incompatible feature capability values")
939 if status0 not in ("0", "12") or status1 not in ("0", "12"):
940 raise Exception("Unexpected PD result status")
942 if result == "UDP" and fcap0[1] != "1":
943 raise Exception("Unexpected CPT feature capability value (expected: UDP)")
944 elif result == "MAC" and fcap0[1] != "2":
945 raise Exception("Unexpected CPT feature capability value (expected: MAC)")
947 ev = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
949 raise Exception("Unable to remove the advertisement instance")
951 def test_p2ps_feature_capability_mac_autoaccept(dev):
952 """P2PS PD Feature Capability CPT: advertiser MAC, seeker UDP:MAC, autoaccept"""
953 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
954 adv_role="4", result="MAC")
956 def test_p2ps_feature_capability_mac_nonautoaccept(dev):
957 """P2PS PD Feature Capability CPT: advertiser:MAC, seeker UDP:MAC, nonautoaccept"""
958 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
959 adv_role="0", result="MAC")
961 def test_p2ps_feature_capability_mac_udp_autoaccept(dev):
962 """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, autoaccept"""
963 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
964 seeker_cpt="UDP:MAC", adv_role="2",
967 def test_p2ps_feature_capability_mac_udp_nonautoaccept(dev):
968 """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, nonautoaccept"""
969 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
970 seeker_cpt="UDP:MAC", adv_role="0",
973 def test_p2ps_feature_capability_udp_mac_autoaccept(dev):
974 """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, autoaccept"""
975 p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
976 seeker_cpt="MAC:UDP", adv_role="2",
979 def test_p2ps_feature_capability_udp_mac_nonautoaccept(dev):
980 """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, nonautoaccept"""
981 p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
982 seeker_cpt="MAC:UDP", adv_role="0",