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")
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", adv_cpt=None, seeker_cpt=None):
139 addr0 = seeker.p2p_dev_addr()
140 addr1 = advertiser.p2p_dev_addr()
142 seeker.asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr1, session_id=1,
143 session_mac=addr0, method=method, cpt=seeker_cpt)
145 if not auto_accept or method == "100":
147 ev_pd_start = advertiser.wait_global_event(["P2PS-PROV-START"],
149 if ev_pd_start is None:
150 raise Exception("P2PS-PROV-START timeout on Advertiser side")
151 peer = ev_pd_start.split()[1]
152 advert_id, advert_mac, session, session_mac =\
153 p2ps_parse_event(ev_pd_start, "adv_id", "adv_mac", "session", "mac")
155 ev = seeker.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
157 raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
159 # Put seeker into a listen state, since we expect the deferred flow to
161 seeker.p2p_ext_listen(500, 500)
164 ev = advertiser.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
167 raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
169 raise Exception("Unknown peer " + addr0)
170 ev = seeker.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
173 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on seeker side")
175 raise Exception("Unknown peer " + addr1)
178 ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
181 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
183 raise Exception("Unknown peer " + addr0)
186 advertiser.asp_provision(peer, adv_id=advert_id, adv_mac=advert_mac,
187 session_id=int(session, 0),
188 session_mac=session_mac, status=12,
191 ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
193 raise Exception("P2PS-PROV-DONE timeout on seeker side")
195 ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
197 raise Exception("P2PS-PROV-DONE timeout on advertiser side")
200 ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
203 raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
205 raise Exception("Unknown peer " + addr1)
207 seeker.p2p_cancel_ext_listen()
212 # Auto-accept is true and the method is either P2PS or advertiser is DISPLAY
213 ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
215 raise Exception("P2PS-PROV-DONE timeout on seeker side")
217 ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
219 raise Exception("P2PS-PROV-DONE timeout on advertiser side")
222 ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
224 raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
226 raise Exception("Unknown peer " + addr1)
227 ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
230 raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
232 raise Exception("Unknown peer " + addr0)
238 def p2ps_connect_pd(dev0, dev1, ev0, ev1, pin=None):
239 conf_methods_map = {"8": "p2ps", "1": "display", "5": "keypad"}
240 peer0 = ev0.split()[1]
241 peer1 = ev1.split()[1]
242 status0, conncap0, adv_id0, adv_mac0, mac0, session0, dev_passwd_id0, go0, join0, feature_cap0, persist0 =\
243 p2ps_parse_event(ev0, "status", "conncap", "adv_id", "adv_mac", "mac", "session", "dev_passwd_id", "go", "join", "feature_cap", "persist")
244 status1, conncap1, adv_id1, adv_mac1, mac1, session1, dev_passwd_id1, go1, join1, feature_cap1, persist1 =\
245 p2ps_parse_event(ev1, "status", "conncap", "adv_id", "adv_mac", "mac", "session", "dev_passwd_id", "go", "join", "feature_cap", "persist")
247 if status0 != "0" and status0 != "12":
248 raise Exception("PD failed on " + dev0.p2p_dev_addr())
250 if status1 != "0" and status1 != "12":
251 raise Exception("PD failed on " + dev1.p2p_dev_addr())
253 if status0 == "12" and status1 == "12":
254 raise Exception("Both sides have status 12 which doesn't make sense")
256 if adv_id0 != adv_id1 or adv_id0 is None:
257 raise Exception("Adv. IDs don't match")
259 if adv_mac0 != adv_mac1 or adv_mac0 is None:
260 raise Exception("Adv. MACs don't match")
262 if session0 != session1 or session0 is None:
263 raise Exception("Session IDs don't match")
265 if mac0 != mac1 or mac0 is None:
266 raise Exception("Session MACs don't match")
268 #TODO: Validate feature capability
270 if bool(persist0) != bool(persist1):
271 raise Exception("Only one peer has persistent group")
273 if persist0 is None and not all([conncap0, conncap1, dev_passwd_id0,
275 raise Exception("Persistent group not used but conncap/dev_passwd_id are missing")
277 if persist0 is not None and any([conncap0, conncap1, dev_passwd_id0,
279 raise Exception("Persistent group is used but conncap/dev_passwd_id are present")
281 # Persistent Connection (todo: handle frequency)
282 if persist0 is not None:
283 if "OK" not in dev0.global_request("P2P_GROUP_ADD persistent=" + persist0 + " freq=2412"):
284 raise Exception("Could not re-start persistent group")
285 ev0 = dev0.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
287 raise Exception("P2P-GROUP-STARTED timeout on " + dev0.p2p_dev_addr())
288 dev0.group_form_result(ev0)
290 if "OK" not in dev1.global_request("P2P_GROUP_ADD persistent=" + persist1 + " freq=2412"):
291 raise Exception("Could not re-start persistent group")
292 ev1 = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
294 raise Exception("P2P-GROUP-STARTED timeout on " + dev1.p2p_dev_addr())
295 dev1.group_form_result(ev1)
297 ev = dev0.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
299 raise Exception("AP-STA-CONNECTED timeout on " + dev0.p2p_dev_addr())
301 ev = dev1.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
303 raise Exception("AP-STA-CONNECTED timeout on " + dev1.p2p_dev_addr())
306 method0 = conf_methods_map[dev_passwd_id0]
307 method1 = conf_methods_map[dev_passwd_id1]
309 raise Exception("Unsupported method")
311 if method0 == "p2ps":
314 raise Exception("Pin is not provided")
316 if conncap0 == "1" and conncap1 == "1": # NEW/NEW - GON
317 if any([join0, join1, go0, go1]):
318 raise Exception("Unexpected join/go PD attributes")
320 if "OK" not in dev0.global_request("P2P_CONNECT " + peer0 + " " + pin + " " + method0 + " persistent auth"):
321 raise Exception("P2P_CONNECT fails on " + dev0.p2p_dev_addr())
322 if "OK" not in dev1.global_request("P2P_CONNECT " + peer1 + " " + pin + " " + method1 + " persistent"):
323 raise Exception("P2P_CONNECT fails on " + dev1.p2p_dev_addr())
324 ev = dev0.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
326 raise Exception("GO Neg did not succeed on " + dev0.p2p_dev_addr())
327 ev = dev1.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
329 raise Exception("GO Neg did not succeed on " + dev1.p2p_dev_addr())
330 ev = dev0.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
332 raise Exception("P2P-GROUP-STARTED timeout on " + dev0.p2p_dev_addr())
333 dev0.group_form_result(ev)
334 ev = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
336 raise Exception("P2P-GROUP-STARTED timeout on " + dev1.p2p_dev_addr())
337 dev1.group_form_result(ev)
339 if conncap0 == "2" and conncap1 == "4": # dev0 CLI, dev1 GO
340 dev_cli, dev_go, go_if, join_address, go_method, cli_method = dev0, dev1, go1, join0, method1, method0
341 elif conncap0 == "4" and conncap1 == "2": # dev0 GO, dev1 CLI
342 dev_cli, dev_go, go_if, join_address, go_method, cli_method = dev1, dev0, go0, join1, method0, method1
344 raise Exception("Bad connection capabilities")
347 raise Exception("Device " + dev_go.p2p_dev_addr() + " failed to become GO")
348 if join_address is None:
349 raise Exception("Device " + dev_cli.p2p_dev_addr() + " failed to become CLI")
350 ev = dev_go.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
352 raise Exception("P2P-GROUP-STARTED timeout on " + dev_go.p2p_dev_addr())
353 dev_go.group_form_result(ev)
354 if go_method != "p2ps":
355 ev = dev_go.group_request("WPS_PIN any " + pin)
357 raise Exception("Failed to initiate pin authorization on registrar side")
358 if "OK" not in dev_cli.global_request("P2P_CONNECT " + join_address + " " + pin + " " + cli_method + " persistent join"):
359 raise Exception("P2P_CONNECT failed on " + dev_cli.p2p_dev_addr())
360 ev = dev_cli.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
362 raise Exception("P2P-GROUP-STARTED timeout on " + dev_cli.p2p_dev_addr())
363 dev_cli.group_form_result(ev)
364 ev = dev_go.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
366 raise Exception("AP-STA-CONNECTED timeout on " + dev_go.p2p_dev_addr())
368 hwsim_utils.test_connectivity_p2p(dev0, dev1)
370 def set_no_group_iface(dev, enable):
372 res = dev.get_driver_status()
373 if (int(res['capa.flags'], 0) & 0x20000000):
374 raise HwsimSkip("P2P Device used. Cannot set enable no_group_iface")
375 dev.global_request("SET p2p_no_group_iface 1")
377 dev.global_request("SET p2p_no_group_iface 0")
379 def test_p2ps_exact_search(dev):
380 """P2PS exact service request"""
381 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
382 srv_info='I can receive files upto size 2 GB')
383 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
384 svc_name='org.wi-fi.wfds.send.rx')
386 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
388 raise Exception("Unable to remove the advertisement instance")
390 def test_p2ps_exact_search_srvinfo(dev):
391 """P2PS exact service request with service info"""
392 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
393 srv_info='I can receive files upto size 2 GB')
394 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
395 svc_name='org.wi-fi.wfds.send.rx',
398 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
400 raise Exception("Unable to remove the advertisement instance")
402 def test_p2ps_nonexact_search(dev):
403 """P2PS nonexact seek request"""
404 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.play.rx',
405 srv_info='I support Miracast Mode ')
406 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
407 svc_name='org.wi-fi.wfds.play*')
408 adv_id = ev_list[0].split()[0]
410 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
412 raise Exception("Unable to remove the advertisement instance")
414 def test_p2ps_nonexact_search_srvinfo(dev):
415 """P2PS nonexact seek request with service info"""
416 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
417 srv_info='I can receive files upto size 2 GB')
418 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
419 svc_name='org.wi-fi.wfds.send*',
421 adv_id = ev_list[0].split()[0]
422 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
424 raise Exception("Unable to remove the advertisement instance")
426 def test_p2ps_connect_p2ps_method_nonautoaccept(dev):
427 """P2PS connect for non-auto-accept and P2PS config method"""
428 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
429 srv_info='I can receive files upto size 2 GB')
430 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
431 svc_name='org.wi-fi.wfds.send*',
433 adv_id = ev_list[0].split()[0]
434 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False)
435 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
437 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
439 raise Exception("Unable to remove the advertisement instance")
440 remove_group(dev[0], dev[1])
442 def test_p2ps_connect_p2ps_method_autoaccept(dev):
443 """P2PS connection with P2PS default config method and auto-accept"""
444 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
445 srv_info='I can receive files upto size 2 GB')
446 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
447 svc_name='org.wi-fi.wfds.send.rx',
450 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
451 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
453 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
455 raise Exception("Unable to remove the advertisement instance")
456 remove_group(dev[0], dev[1])
458 def test_p2ps_connect_keypad_method_nonautoaccept(dev):
459 """P2PS Connection with non-auto-accept and seeker having keypad method"""
460 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
461 srv_info='I can receive files upto size 2 GB')
462 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
463 svc_name='org.wi-fi.wfds.send*',
465 adv_id = ev_list[0].split()[0]
467 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False, method="8")
468 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
470 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
472 raise Exception("Unable to remove the advertisement instance")
473 remove_group(dev[0], dev[1])
475 def test_p2ps_connect_display_method_nonautoaccept(dev):
476 """P2PS connection with non-auto-accept and seeker having display method"""
477 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
478 srv_info='I can receive files upto size 2 GB')
479 ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
480 svc_name='org.wi-fi.wfds*', srv_info='2 GB')
481 adv_id = ev_list[0].split()[0]
483 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False, method="100")
484 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
486 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
488 raise Exception("Unable to remove the advertisement instance")
489 remove_group(dev[0], dev[1])
491 def test_p2ps_connect_keypad_method_autoaccept(dev):
492 """P2PS connection with auto-accept and keypad method on seeker side"""
493 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
494 srv_info='I can receive files upto size 2 GB')
495 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
496 svc_name='org.wi-fi.wfds.send.rx',
499 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
500 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
502 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
504 raise Exception("Unable to remove the advertisement instance")
505 remove_group(dev[0], dev[1])
507 def test_p2ps_connect_display_method_autoaccept(dev):
508 """P2PS connection with auto-accept and display method on seeker side"""
509 p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
510 srv_info='I can receive files upto size 2 GB')
511 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
512 svc_name='org.wi-fi.wfds.send.rx',
515 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="100")
516 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
518 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
520 raise Exception("Unable to remove the advertisement instance")
521 remove_group(dev[0], dev[1])
523 def test_p2ps_connect_adv_go_p2ps_method(dev):
524 """P2PS auto-accept connection with advertisement as GO and P2PS method"""
525 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
526 srv_info='I can receive files upto size 2 GB')
527 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
528 svc_name='org.wi-fi.wfds.send.rx',
531 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
532 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
534 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
536 raise Exception("Unable to remove the advertisement instance")
537 remove_group(dev[0], dev[1])
539 def test_p2ps_connect_adv_go_p2ps_method_group_iface(dev):
540 """P2PS auto-accept connection with advertisement as GO and P2PS method using separate group interface"""
541 set_no_group_iface(dev[0], 0)
542 set_no_group_iface(dev[1], 0)
543 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
544 srv_info='I can receive files upto size 2 GB')
545 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
546 svc_name='org.wi-fi.wfds.send.rx',
549 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
550 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
552 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
554 raise Exception("Unable to remove the advertisement instance")
555 remove_group(dev[0], dev[1])
557 def test_p2ps_connect_adv_client_p2ps_method(dev):
558 """P2PS auto-accept connection with advertisement as Client and P2PS method"""
559 p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
560 srv_info='I can receive files upto size 2 GB')
561 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
562 svc_name='org.wi-fi.wfds.send.rx',
565 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
566 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
568 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
570 raise Exception("Unable to remove the advertisement instance")
571 remove_group(dev[0], dev[1])
573 def p2ps_connect_adv_go_pin_method(dev, keep_group=False):
574 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
575 srv_info='I can receive files upto size 2 GB')
576 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
577 svc_name='org.wi-fi.wfds.send.rx',
579 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
580 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
583 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
585 raise Exception("Unable to remove the advertisement instance")
586 remove_group(dev[0], dev[1])
588 def test_p2ps_connect_adv_go_pin_method(dev):
589 """P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
590 p2ps_connect_adv_go_pin_method(dev)
592 def test_p2ps_connect_adv_client_pin_method(dev):
593 """P2PS advertiser as client with keypad config method on seeker side and auto-accept"""
594 dev[0].flush_scan_cache()
595 p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
596 srv_info='I can receive files upto size 2 GB')
597 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
598 svc_name='org.wi-fi.wfds.send.rx',
601 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
602 p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
604 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
606 raise Exception("Unable to remove the advertisement instance")
607 remove_group(dev[0], dev[1])
609 def test_p2ps_service_discovery_multiple_queries(dev):
610 """P2P service discovery with multiple queries"""
611 addr0 = dev[0].p2p_dev_addr()
612 addr1 = dev[1].p2p_dev_addr()
613 adv_id1 = p2ps_advertise(r_dev=dev[0], r_role='0',
614 svc_name='org.wi-fi.wfds.send.tx',
615 srv_info='I can transfer files upto size of 2 GB')
616 adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='0',
617 svc_name='org.wi-fi.wfds.send.rx',
618 srv_info='I can receive files upto size of 2 GB')
619 adv_id3 = p2ps_advertise(r_dev=dev[0], r_role='1',
620 svc_name='org.wi-fi.wfds.display.tx',
621 srv_info='Miracast Mode')
622 adv_id4 = p2ps_advertise(r_dev=dev[0], r_role='1',
623 svc_name='org.wi-fi.wfds.display.rx',
624 srv_info='Miracast Mode')
626 dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 1 org.wi-fi.wfds.display.tx 'Miracast Mode'")
627 dev[1].global_request("P2P_FIND 10 type=social seek=org.wi-fi.wfds.display.tx")
628 dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 2 org.wi-fi.wfds.send* 'size of 2 GB'")
629 dev[1].p2p_stop_find()
630 dev[1].global_request("P2P_FIND 10 type=social seek=")
631 ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
633 raise Exception("P2P Device Found timed out")
635 raise Exception("Unexpected service discovery request source")
637 for i in range(0, 3):
638 ev = dev[1].wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
640 raise Exception("P2P Service discovery timed out")
643 if len(ev_list) == 3:
645 dev[1].p2p_stop_find()
647 for test in [ ("seek=org.wi-fi.wfds.display.TX",
648 "asp_svc=org.wi-fi.wfds.display.tx"),
649 ("seek=foo seek=org.wi-fi.wfds.display.tx seek=bar",
650 "asp_svc=org.wi-fi.wfds.display.tx"),
651 ("seek=1 seek=2 seek=3 seek=org.wi-fi.wfds.display.tx seek=4 seek=5 seek=6",
652 "asp_svc=org.wi-fi.wfds.display.tx"),
653 ("seek=not-found", None),
654 ("seek=org.wi-fi.wfds", "asp_svc=org.wi-fi.wfds")]:
655 dev[2].global_request("P2P_FIND 10 type=social " + test[0])
657 ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=1)
659 raise Exception("Unexpected device found: " + ev)
661 ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
663 raise Exception("P2P device discovery timed out (dev2)")
664 if test[1] not in ev:
665 raise Exception("Expected asp_svc not reported: " + ev)
666 dev[2].p2p_stop_find()
667 dev[2].request("P2P_FLUSH")
669 dev[0].p2p_stop_find()
671 ev1 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id1))
673 raise Exception("Unable to remove the advertisement instance")
674 ev2 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
676 raise Exception("Unable to remove the advertisement instance")
677 ev3 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id3))
679 raise Exception("Unable to remove the advertisement instance")
680 ev4 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id4))
682 raise Exception("Unable to remove the advertisement instance")
684 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
685 raise Exception("P2P_SERVICE_ADD failed")
686 if "OK" not in dev[0].global_request("P2P_SERVICE_DEL asp all"):
687 raise Exception("P2P_SERVICE_DEL asp all failed")
688 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
689 raise Exception("P2P_SERVICE_ADD failed")
690 if "OK" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
691 raise Exception("P2P_SERVICE_REP failed")
692 if "FAIL" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
693 raise Exception("Invalid P2P_SERVICE_REP accepted")
694 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345678 1 1108 org.wi-fi.wfds.something svc_info='Test'"):
695 raise Exception("P2P_SERVICE_ADD failed")
696 if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345679 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
697 raise Exception("P2P_SERVICE_ADD failed")
700 with open('/proc/net/dev', 'r') as f:
703 for line in data.splitlines():
704 ifname = line.strip().split(' ')[0]
705 if ':' not in ifname:
707 ifname = ifname.split(':')[0]
708 ifnames.append(ifname)
711 def p2ps_connect_p2ps_method(dev, keep_group=False):
712 dev[0].flush_scan_cache()
713 dev[1].flush_scan_cache()
714 p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
715 srv_info='I can receive files upto size 2 GB')
716 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
717 svc_name='org.wi-fi.wfds.send.rx',
719 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
720 ifnames = get_ifnames()
721 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
723 grp_ifname0 = dev[0].get_group_ifname()
724 grp_ifname1 = dev[1].get_group_ifname()
726 ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
728 raise Exception("Unable to remove the advertisement instance")
729 ifnames = ifnames + get_ifnames()
730 remove_group(dev[0], dev[1])
731 ifnames = ifnames + get_ifnames()
733 return grp_ifname0, grp_ifname1, ifnames
735 def has_string_prefix(vals, prefix):
737 if val.startswith(prefix):
741 def test_p2ps_connect_p2ps_method_1(dev):
742 """P2PS connection with P2PS method - no group interface"""
743 set_no_group_iface(dev[0], 1)
744 set_no_group_iface(dev[1], 1)
746 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
747 if grp_ifname0 != dev[0].ifname:
748 raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
749 if grp_ifname1 != dev[1].ifname:
750 raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
751 if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
752 raise Exception("dev0 group interface unexpectedly present")
753 if has_string_prefix(ifnames, 'p2p-' + grp_ifname1):
754 raise Exception("dev1 group interface unexpectedly present")
756 def test_p2ps_connect_p2ps_method_2(dev):
757 """P2PS connection with P2PS method - group interface on dev0"""
758 set_no_group_iface(dev[0], 0)
759 set_no_group_iface(dev[1], 1)
761 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
762 if not grp_ifname0.startswith('p2p-' + dev[0].ifname + '-'):
763 raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
764 if grp_ifname1 != dev[1].ifname:
765 raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
766 if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
767 raise Exception("dev0 group interface unexpectedly present")
769 def test_p2ps_connect_p2ps_method_3(dev):
770 """P2PS connection with P2PS method - group interface on dev1"""
771 set_no_group_iface(dev[0], 1)
772 set_no_group_iface(dev[1], 0)
774 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
775 if grp_ifname0 != dev[0].ifname:
776 raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
777 if not grp_ifname1.startswith('p2p-' + dev[1].ifname + '-'):
778 raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
779 if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
780 raise Exception("dev0 group interface unexpectedly present")
782 def test_p2ps_connect_p2ps_method_4(dev):
783 """P2PS connection with P2PS method - group interface on both"""
784 set_no_group_iface(dev[0], 0)
785 set_no_group_iface(dev[1], 0)
787 (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
788 if not grp_ifname0.startswith('p2p-' + dev[0].ifname + '-'):
789 raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
790 if not grp_ifname1.startswith('p2p-' + dev[1].ifname + '-'):
791 raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
793 def test_p2ps_connect_adv_go_persistent(dev):
794 """P2PS auto-accept connection with advertisement as GO and having persistent group"""
795 go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
796 r_dev=dev[1], r_intent=0)
797 dev[0].remove_group()
798 dev[1].wait_go_ending_session()
800 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
801 srv_info='I can receive files upto size 2 GB')
802 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
803 svc_name='org.wi-fi.wfds.send.rx',
805 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
806 if "persist=" not in ev0 or "persist=" not in ev1:
807 raise Exception("Persistent group isn't used by peers")
809 p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
810 remove_group(dev[0], dev[1])
812 def test_p2ps_adv_go_persistent_no_peer_entry(dev):
813 """P2PS advertisement as GO having persistent group (no peer entry)"""
814 go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
815 r_dev=dev[1], r_intent=0)
816 dev[0].remove_group()
817 dev[1].wait_go_ending_session()
819 p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
820 srv_info='I can receive files upto size 2 GB')
821 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
822 svc_name='org.wi-fi.wfds.send.rx',
824 dev[0].global_request("P2P_FLUSH")
826 ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
827 if "persist=" not in ev0 or "persist=" not in ev1:
828 raise Exception("Persistent group isn't used by peers")
830 def test_p2ps_pd_follow_on_status_failure(dev):
831 """P2PS PD follow on request with status 11"""
832 addr0 = dev[0].p2p_dev_addr()
833 addr1 = dev[1].p2p_dev_addr()
835 p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
836 srv_info='I can receive files upto size 2 GB')
837 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
838 svc_name='org.wi-fi.wfds.send.rx',
840 dev[1].asp_provision(addr0, adv_id=str(adv_id), adv_mac=addr0,
841 session_id=1, session_mac=addr1)
842 ev_pd_start = dev[0].wait_global_event(["P2PS-PROV-START"], timeout=10)
843 if ev_pd_start is None:
844 raise Exception("P2PS-PROV-START timeout on Advertiser side")
845 ev = dev[1].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
847 raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
848 dev[1].p2p_ext_listen(500, 500)
849 dev[0].asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr0, session_id=1,
850 session_mac=addr1, status=11, method=0)
852 ev = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
854 raise Exception("P2P-PROV-DONE timeout on seeker side")
856 raise Exception("P2P-PROV-DONE without adv_id on seeker side")
857 if "status=11" not in ev:
858 raise Exception("P2P-PROV-DONE without status on seeker side")
860 ev = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
862 raise Exception("P2P-PROV-DONE timeout on advertiser side")
864 raise Exception("P2P-PROV-DONE without adv_id on advertiser side")
865 if "status=11" not in ev:
866 raise Exception("P2P-PROV-DONE without status on advertiser side")
868 def test_p2ps_client_probe(dev):
869 """P2PS CLI discoverability on operating channel"""
870 cli_probe = dev[0].global_request("SET p2p_cli_probe 1")
871 p2ps_connect_p2ps_method(dev, keep_group=True)
872 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
873 svc_name='org.wi-fi.wfds.send.rx',
874 single_peer_expected=False)
875 dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
876 remove_group(dev[0], dev[1])
878 def test_p2ps_go_probe(dev):
879 """P2PS GO discoverability on operating channel"""
880 p2ps_connect_adv_go_pin_method(dev, keep_group=True)
881 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
882 svc_name='org.wi-fi.wfds.send.rx',
883 single_peer_expected=False)
884 dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
885 remove_group(dev[0], dev[1])
887 def test_p2ps_wildcard_p2ps(dev):
888 """P2PS wildcard SD Probe Request/Response"""
889 p2ps_wildcard = "org.wi-fi.wfds"
891 adv_id = p2ps_advertise(r_dev=dev[0], r_role='1',
892 svc_name='org.foo.service',
893 srv_info='I can do stuff')
894 adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='1',
895 svc_name='org.wi-fi.wfds.send.rx',
896 srv_info='I can receive files upto size 2 GB')
898 if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=org.foo.service seek=" + p2ps_wildcard):
899 raise Exception("Failed on P2P_FIND command")
901 ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
903 raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
904 if dev[0].p2p_dev_addr() not in ev1:
905 raise Exception("Unexpected peer")
907 ev2 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
909 raise Exception("P2P-DEVICE-FOUND timeout on seeker side (2)")
910 if dev[0].p2p_dev_addr() not in ev2:
911 raise Exception("Unexpected peer (2)")
913 if p2ps_wildcard not in ev1 + ev2:
914 raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event")
915 if "org.foo.service" not in ev1 + ev2:
916 raise Exception("Vendor specific service name not found in P2P-DEVICE-FOUND event")
918 if "OK" not in dev[1].global_request("P2P_STOP_FIND"):
919 raise Exception("P2P_STOP_FIND failed")
920 dev[1].dump_monitor()
922 res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
924 raise Exception("Unable to remove the advertisement instance")
926 if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
927 raise Exception("Failed on P2P_FIND command")
929 ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
931 raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
932 if dev[0].p2p_dev_addr() not in ev1:
933 raise Exception("Unexpected peer")
934 if p2ps_wildcard not in ev1:
935 raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event (2)")
936 dev[1].dump_monitor()
938 res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
940 raise Exception("Unable to remove the advertisement instance 2")
942 if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
943 raise Exception("Failed on P2P_FIND command")
945 ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=2)
947 raise Exception("Unexpected P2P-DEVICE-FOUND event on seeker side")
948 dev[1].p2p_stop_find()
949 dev[1].dump_monitor()
951 def test_p2ps_many_services_in_probe(dev):
952 """P2PS with large number of services in Probe Request/Response"""
953 long1 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.a'
954 long2 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.b'
955 long3 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.c'
956 long4 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.d'
957 long5 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.e'
958 for name in [ long1, long2, long3, long4, long5 ]:
959 p2ps_advertise(r_dev=dev[0], r_role='1',
961 srv_info='I can do stuff')
963 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)):
964 raise Exception("Failed on P2P_FIND command")
967 # Note: Require only four events since all the services do not fit within
970 ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
972 raise Exception("Missing P2P-DEVICE-FOUND")
974 dev[1].p2p_stop_find()
975 dev[1].dump_monitor()
976 for name in [ long2, long3, long4, long5 ]:
977 if name not in events:
978 raise Exception("Service missing from peer events")
980 def p2ps_test_feature_capability_cpt(dev, adv_cpt, seeker_cpt, adv_role,
982 p2ps_advertise(r_dev=dev[0], r_role=adv_role,
983 svc_name='org.wi-fi.wfds.send.rx',
984 srv_info='I can receive files upto size 2 GB', cpt=adv_cpt)
985 [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
986 svc_name='org.wi-fi.wfds.send.rx',
988 auto_accept = adv_role != "0"
989 ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id,
990 auto_accept=auto_accept, adv_cpt=adv_cpt,
991 seeker_cpt=seeker_cpt, method="8")
993 status0, fcap0 = p2ps_parse_event(ev0, "status", "feature_cap")
994 status1, fcap1 = p2ps_parse_event(ev0, "status", "feature_cap")
997 raise Exception("Bad feature capability on Seeker side")
999 raise Exception("Bad feature capability on Advertiser side")
1001 raise Exception("Incompatible feature capability values")
1003 if status0 not in ("0", "12") or status1 not in ("0", "12"):
1004 raise Exception("Unexpected PD result status")
1006 if result == "UDP" and fcap0[1] != "1":
1007 raise Exception("Unexpected CPT feature capability value (expected: UDP)")
1008 elif result == "MAC" and fcap0[1] != "2":
1009 raise Exception("Unexpected CPT feature capability value (expected: MAC)")
1011 ev = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
1013 raise Exception("Unable to remove the advertisement instance")
1015 def test_p2ps_feature_capability_mac_autoaccept(dev):
1016 """P2PS PD Feature Capability CPT: advertiser MAC, seeker UDP:MAC, autoaccept"""
1017 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
1018 adv_role="4", result="MAC")
1020 def test_p2ps_feature_capability_mac_nonautoaccept(dev):
1021 """P2PS PD Feature Capability CPT: advertiser:MAC, seeker UDP:MAC, nonautoaccept"""
1022 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
1023 adv_role="0", result="MAC")
1025 def test_p2ps_feature_capability_mac_udp_autoaccept(dev):
1026 """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, autoaccept"""
1027 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
1028 seeker_cpt="UDP:MAC", adv_role="2",
1031 def test_p2ps_feature_capability_mac_udp_nonautoaccept(dev):
1032 """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, nonautoaccept"""
1033 p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
1034 seeker_cpt="UDP:MAC", adv_role="0",
1037 def test_p2ps_feature_capability_udp_mac_autoaccept(dev):
1038 """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, autoaccept"""
1039 p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
1040 seeker_cpt="MAC:UDP", adv_role="2",
1043 def test_p2ps_feature_capability_udp_mac_nonautoaccept(dev):
1044 """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, nonautoaccept"""
1045 p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
1046 seeker_cpt="MAC:UDP", adv_role="0",