Add generic provision method. This method receives a seeker and an advertiser devices, advertisement id, method, and a flag which indicates whether deferred flow is expected. The method returns P2PS-PROV-DONE events and the pin (if keypad or display method is used). This method is needed to simplify the P2PS provision flows in the tests. This method complies to the P2PS specification regarding the expected order of the show and display PIN events. Signed-off-by: Andrei Otcheretianski <andrei.otcheretianski@intel.com> Reviewed-by: Max Stepanov <Max.Stepanov@intel.com> Reviewed-by: Ilan Peer <ilan.peer@intel.com>
1174 lines
57 KiB
Python
1174 lines
57 KiB
Python
# P2P services
|
|
# Copyright (c) 2014-2015, Qualcomm Atheros, Inc.
|
|
#
|
|
# This software may be distributed under the terms of the BSD license.
|
|
# See README for more details.
|
|
|
|
import logging
|
|
logger = logging.getLogger()
|
|
import time
|
|
import random
|
|
import re
|
|
|
|
import hwsim_utils
|
|
from wpasupplicant import WpaSupplicant
|
|
from test_p2p_grpform import check_grpform_results
|
|
from test_p2p_grpform import remove_group
|
|
from test_p2p_persistent import go_neg_pin_authorized_persistent
|
|
from utils import HwsimSkip
|
|
|
|
# Dev[0] -> Advertiser
|
|
# Dev[1] -> Seeker
|
|
# ev0 -> Event generated at advertiser side
|
|
# ev1 -> Event generated at Seeker side
|
|
|
|
def p2ps_advertise(r_dev, r_role, svc_name, srv_info, rsp_info=None):
|
|
"""P2PS Advertise function"""
|
|
adv_id = random.randrange(1, 0xFFFFFFFF)
|
|
advid = hex(adv_id)[2:]
|
|
|
|
if rsp_info is not None and srv_info is not None:
|
|
if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + " svc_info='" + srv_info + "'" + " rsp_info=" + rsp_info + "'"):
|
|
raise Exception("P2P_SERVICE_ADD with response info and service info failed")
|
|
|
|
if rsp_info is None and srv_info is not None:
|
|
if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + " svc_info='" + srv_info + "'"):
|
|
raise Exception("P2P_SERVICE_ADD with service info failed")
|
|
|
|
if rsp_info is None and srv_info is None:
|
|
if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + " "):
|
|
raise Exception("P2P_SERVICE_ADD without service info and without response info failed")
|
|
|
|
if rsp_info is not None and srv_info is None:
|
|
if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(adv_id) + " 1 1108 " + svc_name + " svc_info='" + " rsp_info=" + rsp_info + "'"):
|
|
raise Exception("P2P_SERVICE_ADD with response info failed")
|
|
|
|
r_dev.p2p_listen()
|
|
return advid
|
|
|
|
def p2ps_exact_seek(i_dev, r_dev, svc_name, srv_info=None,
|
|
single_peer_expected=True):
|
|
"""P2PS exact service seek request"""
|
|
if srv_info is not None:
|
|
ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
|
|
if ev1 is None:
|
|
raise Exception("Failed to add Service Discovery request for exact seek request")
|
|
|
|
if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek=" + svc_name):
|
|
raise Exception("Failed to initiate seek operation")
|
|
|
|
timeout = time.time() + 10
|
|
ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
|
|
while ev1 is not None and not single_peer_expected:
|
|
if r_dev.p2p_dev_addr() in ev1 and "adv_id=" in ev1:
|
|
break
|
|
ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
|
|
|
|
if timeout < time.time():
|
|
raise Exception("Device not found")
|
|
|
|
if ev1 is None:
|
|
raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
|
|
if r_dev.p2p_dev_addr() not in ev1:
|
|
raise Exception("Unexpected peer")
|
|
|
|
if srv_info is None:
|
|
adv_id = ev1.split("adv_id=")[1].split(" ")[0]
|
|
rcvd_svc_name = ev1.split("asp_svc=")[1].split(" ")[0]
|
|
if rcvd_svc_name != svc_name:
|
|
raise Exception("service name not matching")
|
|
else:
|
|
ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("Failed to receive Service Discovery Response")
|
|
if r_dev.p2p_dev_addr() not in ev1:
|
|
raise Exception("Service Discovery response from Unknown Peer")
|
|
if srv_info is not None and srv_info not in ev1:
|
|
raise Exception("service info not available in Service Discovery response")
|
|
adv_id = ev1.split(" ")[3]
|
|
rcvd_svc_name = ev1.split(" ")[6]
|
|
if rcvd_svc_name != svc_name:
|
|
raise Exception("service name not matching")
|
|
|
|
return [adv_id, rcvd_svc_name]
|
|
|
|
def p2ps_nonexact_seek(i_dev, r_dev, svc_name, srv_info=None, adv_num=None):
|
|
"""P2PS nonexact service seek request"""
|
|
if adv_num is None:
|
|
adv_num = 1
|
|
if srv_info is not None:
|
|
ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
|
|
else:
|
|
ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '")
|
|
if ev1 is None:
|
|
raise Exception("Failed to add Service Discovery request for nonexact seek request")
|
|
if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek="):
|
|
raise Exception("Failed to initiate seek")
|
|
ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
|
|
if r_dev.p2p_dev_addr() not in ev1:
|
|
raise Exception("Unexpected peer")
|
|
ev_list = []
|
|
for i in range (0, adv_num):
|
|
ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("Failed to receive Service Discovery Response")
|
|
if r_dev.p2p_dev_addr() not in ev1:
|
|
raise Exception("Service Discovery response from Unknown Peer")
|
|
if srv_info is not None and srv_info not in ev1:
|
|
raise Exception("service info not available in Service Discovery response")
|
|
adv_id = ev1.split(" ")[3]
|
|
rcvd_svc_name = ev1.split(" ")[6]
|
|
ev_list.append(''.join([adv_id, ' ', rcvd_svc_name]))
|
|
return ev_list
|
|
|
|
def p2ps_parse_event(ev, *args):
|
|
ret = ()
|
|
for arg in args:
|
|
m = re.search("\s+" + arg + r"=(\S+)", ev)
|
|
ret += (m.group(1) if m is not None else None,)
|
|
return ret
|
|
|
|
def p2ps_provision(seeker, advertiser, adv_id, auto_accept=True, method="1000"):
|
|
addr0 = seeker.p2p_dev_addr()
|
|
addr1 = advertiser.p2p_dev_addr()
|
|
|
|
seeker.asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr1, session_id=1,
|
|
session_mac=addr0, method=method)
|
|
|
|
if not auto_accept or method == "100":
|
|
pin = None
|
|
ev_pd_start = advertiser.wait_global_event(["P2PS-PROV-START"],
|
|
timeout=10)
|
|
if ev_pd_start is None:
|
|
raise Exception("P2PS-PROV-START timeout on Advertiser side")
|
|
peer = ev_pd_start.split()[1]
|
|
advert_id, advert_mac, session, session_mac =\
|
|
p2ps_parse_event(ev_pd_start, "adv_id", "adv_mac", "session", "mac")
|
|
|
|
ev = seeker.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
|
|
|
|
if method == "100":
|
|
ev = advertiser.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
|
|
timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
|
|
if addr0 not in ev:
|
|
raise Exception("Unknown peer " + addr0)
|
|
ev = seeker.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
|
|
timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on seeker side")
|
|
if addr1 not in ev:
|
|
raise Exception("Unknown peer " + addr1)
|
|
pin = ev.split()[2]
|
|
elif method == "8":
|
|
ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
|
|
timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
|
|
if addr0 not in ev:
|
|
raise Exception("Unknown peer " + addr0)
|
|
pin = ev.split()[2]
|
|
|
|
advertiser.asp_provision(peer, adv_id=advert_id, adv_mac=advert_mac,
|
|
session_id=int(session, 0),
|
|
session_mac=session_mac, status=12)
|
|
|
|
ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on seeker side")
|
|
|
|
ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev2 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on advertiser side")
|
|
|
|
if method == "8":
|
|
ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
|
|
timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
|
|
if addr1 not in ev:
|
|
raise Exception("Unknown peer " + addr1)
|
|
|
|
if pin is not None:
|
|
return ev1, ev2, pin
|
|
return ev1, ev2
|
|
|
|
# Auto-accept is true and the method is either P2PS or advertiser is DISPLAY
|
|
ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on seeker side")
|
|
|
|
ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev2 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on advertiser side")
|
|
|
|
if method == "8":
|
|
ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
|
|
if addr1 not in ev:
|
|
raise Exception("Unknown peer " + addr1)
|
|
ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
|
|
timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
|
|
if addr0 not in ev:
|
|
raise Exception("Unknown peer " + addr0)
|
|
pin = ev.split()[2]
|
|
return ev1, ev2, pin
|
|
|
|
return ev1, ev2
|
|
|
|
def p2p_connect_p2ps_method(i_dev, r_dev, autoaccept):
|
|
"""P2PS connect function with p2ps method"""
|
|
if autoaccept == False:
|
|
if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " 12345670 p2ps persistent auth"):
|
|
raise Exception("P2P_CONNECT fails on seeker side")
|
|
ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on Advertiser side")
|
|
|
|
if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " 12345670 p2ps persistent"):
|
|
raise Exception("P2P_CONNECT fails on Advertiser side")
|
|
|
|
else:
|
|
if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " 12345670 p2ps persistent auth"):
|
|
raise Exception("P2P_CONNECT fails on Advertiser side")
|
|
ev1 = i_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=5)
|
|
if ev1 is None:
|
|
raise Exception("Failed to receive deferred acceptance at seeker")
|
|
|
|
if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " 12345670 p2ps persistent"):
|
|
raise Exception("P2P_CONNECT fails on seeker side")
|
|
ev0 = r_dev.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("GO Neg did not succeed")
|
|
ev0 = r_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
|
|
if ev0 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
|
|
r_dev.group_form_result(ev0)
|
|
|
|
ev1 = i_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=5)
|
|
if ev1 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on seeker side")
|
|
i_dev.group_form_result(ev1)
|
|
|
|
def p2ps_provision_keypad_method(i_dev, r_dev, autoaccept,
|
|
initiator_or_responder):
|
|
"""P2PS keypad method provisioning function"""
|
|
if autoaccept == False and initiator_or_responder == 'initiator':
|
|
ev = i_dev.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("Provisioning deferred on seeker side")
|
|
ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
|
|
if r_dev.p2p_dev_addr() not in ev1:
|
|
raise Exception("Unknown peer ")
|
|
ev = r_dev.wait_global_event(["P2PS-PROV-START"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2PS-PROV-START timeout on Advertiser side")
|
|
|
|
if autoaccept == False and initiator_or_responder == 'responder':
|
|
ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on seeker side")
|
|
ev0 = r_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=5)
|
|
if ev0 is None:
|
|
raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
|
|
|
|
if autoaccept == True and initiator_or_responder == 'initiator':
|
|
ev1 = i_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on seeker side")
|
|
ev2 = i_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
|
|
if ev2 is None:
|
|
raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
|
|
if r_dev.p2p_dev_addr() not in ev2:
|
|
raise Exception("Unknown peer ")
|
|
return ev1
|
|
|
|
def p2ps_provision_display_method(i_dev, r_dev, autoaccept,
|
|
initiator_or_responder):
|
|
"""P2PS display method provisioning function"""
|
|
if initiator_or_responder == 'initiator':
|
|
ev0 = r_dev.wait_global_event(["P2PS-PROV-START"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2PS-PROV-START timeout on Advertiser side")
|
|
if autoaccept == False:
|
|
ev = i_dev.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("Provisioning deferred on seeker side")
|
|
ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on Seeker side")
|
|
if r_dev.p2p_dev_addr() not in ev1:
|
|
raise Exception("Unknown peer ")
|
|
pin = ev1.split(" ")[2]
|
|
else:
|
|
ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on advertiser")
|
|
ev0 = r_dev.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
|
|
if ev0 is None:
|
|
raise Exception("PIN Display on advertiser side")
|
|
pin = ev0.split(" ")[2]
|
|
return pin
|
|
|
|
def p2ps_connect_pin(pin, i_dev, r_dev, initiator_method):
|
|
"""P2PS function to perform connection using PIN method"""
|
|
if initiator_method=="display":
|
|
if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " " + pin + " display persistent "):
|
|
raise Exception("P2P_CONNECT fails on seeker side")
|
|
ev0 = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("Failed to receive P2P_GO-NEG-REQUEST on responder side")
|
|
if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " " + pin + " keypad persistent "):
|
|
raise Exception("P2P_CONNECT fails on Advertiser side")
|
|
else:
|
|
if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " " + pin + " keypad persistent "):
|
|
raise Exception("P2P_CONNECT fails on seeker side")
|
|
ev0 = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("Failed to receive P2P_GO-NEG-REQUEST on responder side")
|
|
if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " " + pin + " display persistent "):
|
|
raise Exception("P2P_CONNECT fails on Advertiser side")
|
|
|
|
ev0 = r_dev.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("GO Neg did not succeed on advertiser side")
|
|
peer_mac = ev0.split("peer_dev=")[1].split(" ")[0]
|
|
|
|
ev1 = i_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on seeker side")
|
|
i_dev.group_form_result(ev1)
|
|
|
|
ev_grpfrm = r_dev.wait_global_event(["P2P-GROUP-FORMATION-SUCCESS"],
|
|
timeout=10)
|
|
if ev_grpfrm is None:
|
|
raise Exception("Group Formation failed on advertiser side")
|
|
|
|
ev = r_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
|
|
res = r_dev.group_form_result(ev)
|
|
|
|
if res['role'] == "GO":
|
|
ev_grpfrm = r_dev.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
|
|
if ev_grpfrm is None:
|
|
raise Exception("AP-STA-CONNECTED timeout on advertiser side")
|
|
if i_dev.p2p_dev_addr() not in ev_grpfrm:
|
|
raise Exception("Group formed with unknown Peer")
|
|
else:
|
|
ev1 = i_dev.wait_global_event(["AP-STA-CONNECTED"], timeout=5)
|
|
if ev1 is None:
|
|
raise Exception("AP-STA-CONNECTED timeout on Seeker side")
|
|
if r_dev.p2p_dev_addr() not in ev1:
|
|
raise Exception("Group formed with unknown Peer")
|
|
|
|
def set_no_group_iface(dev, enable):
|
|
if enable:
|
|
res = dev.get_driver_status()
|
|
if (int(res['capa.flags'], 0) & 0x20000000):
|
|
raise HwsimSkip("P2P Device used. Cannot set enable no_group_iface")
|
|
dev.global_request("SET p2p_no_group_iface 1")
|
|
else:
|
|
dev.global_request("SET p2p_no_group_iface 0")
|
|
|
|
def test_p2ps_exact_search(dev):
|
|
"""P2PS exact service request"""
|
|
p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx')
|
|
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
|
|
def test_p2ps_exact_search_srvinfo(dev):
|
|
"""P2PS exact service request with service info"""
|
|
p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='2 GB')
|
|
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
|
|
def test_p2ps_nonexact_search(dev):
|
|
"""P2PS nonexact seek request"""
|
|
p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.play.rx',
|
|
srv_info='I support Miracast Mode ')
|
|
ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.play*')
|
|
adv_id = ev_list[0].split()[0]
|
|
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
|
|
def test_p2ps_nonexact_search_srvinfo(dev):
|
|
"""P2PS nonexact seek request with service info"""
|
|
p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send*',
|
|
srv_info='2 GB')
|
|
adv_id = ev_list[0].split()[0]
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
|
|
def test_p2ps_connect_p2ps_method_nonautoaccept(dev):
|
|
"""P2PS connect for non-auto-accept and P2PS config method"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send*',
|
|
srv_info='2 GB')
|
|
adv_id = ev_list[0].split(" ")[0]
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=1000"):
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
ev0 = dev[0].wait_global_event(["P2PS-PROV-START"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2PS-PROV-START timeout on advertiser side")
|
|
ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=15)
|
|
if ev1 is None:
|
|
raise Exception("Provisioning deferred timeout on seeker side")
|
|
dev[1].p2p_listen()
|
|
if "OK" not in dev[0].global_request("P2P_ASP_PROVISION_RESP " + addr1 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " status=12"):
|
|
raise Exception("Failed to send deferred acceptance from advertizer")
|
|
ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=15)
|
|
if ev1 is None:
|
|
raise Exception("Failed to receive deferred acceptance at seeker")
|
|
|
|
p2p_connect_p2ps_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False)
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_connect_p2ps_method_autoaccept(dev):
|
|
"""P2PS connection with P2PS default config method and auto-accept"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='2 GB')
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=1000"):
|
|
raise Exception("P2P_ASP_PROVISION failed on seeker side")
|
|
|
|
ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on advertiser side")
|
|
|
|
p2p_connect_p2ps_method(i_dev=dev[1], r_dev=dev[0], autoaccept=True)
|
|
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_connect_keypad_method_nonautoaccept(dev):
|
|
"""P2PS Connection with non-auto-accept and seeker having keypad method"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send*',
|
|
srv_info='2 GB')
|
|
adv_id = ev_list[0].split(" ")[0]
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=8"): # keypad method on seeker side
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False,
|
|
initiator_or_responder='initiator')
|
|
dev[1].p2p_listen()
|
|
|
|
if "OK" not in dev[0].global_request("P2P_ASP_PROVISION_RESP " + addr1 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " status=12"):
|
|
raise Exception("Failed to send deferred acceptance from advertizer")
|
|
|
|
pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
|
|
autoaccept=False,
|
|
initiator_or_responder='responder')
|
|
p2ps_connect_pin(pin, i_dev=dev[0], r_dev=dev[1],
|
|
initiator_method="display")
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_connect_display_method_nonautoaccept(dev):
|
|
"""P2PS connection with non-auto-accept and seeker having display method"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds*', srv_info='2 GB')
|
|
adv_id = ev_list[0].split(" ")[0]
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=100"): # keypad method on seeker side
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
|
|
autoaccept=False,
|
|
initiator_or_responder='initiator')
|
|
dev[1].p2p_listen()
|
|
|
|
if "OK" not in dev[0].global_request("P2P_ASP_PROVISION_RESP " + addr1 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " status=12"):
|
|
raise Exception("Failed to send deferred acceptance from advertiser")
|
|
p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False,
|
|
initiator_or_responder='responder')
|
|
p2ps_connect_pin(pin, i_dev=dev[0], r_dev=dev[1], initiator_method="keypad")
|
|
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_connect_keypad_method_autoaccept(dev):
|
|
"""P2PS connection with auto-accept and keypad method on seeker side"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='2 GB')
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=8"): # keypad method on seeker side
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
|
|
p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=True,
|
|
initiator_or_responder='initiator')
|
|
pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
|
|
autoaccept=True,
|
|
initiator_or_responder='responder')
|
|
p2ps_connect_pin(pin, i_dev=dev[1], r_dev=dev[0], initiator_method="Keypad")
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_connect_display_method_autoaccept(dev):
|
|
"""P2PS connection with auto-accept and display method on seeker side"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='2 GB')
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=100"): # display method on seeker side
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
|
|
pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
|
|
autoaccept=True,
|
|
initiator_or_responder='initiator')
|
|
dev[1].p2p_listen()
|
|
|
|
p2ps_connect_pin(pin, i_dev=dev[1], r_dev=dev[0], initiator_method="display")
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_connect_adv_go_p2ps_method(dev):
|
|
"""P2PS auto-accept connection with advertisement as GO and P2PS method"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='2 GB')
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=1000"):
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
|
|
ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("Timed out while waiting for prov done on advertizer")
|
|
if "go=" not in ev0:
|
|
raise Exception("Advertiser failed to become GO")
|
|
|
|
adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
|
|
if adv_conncap == "4":
|
|
logger.info("Advertiser is GO")
|
|
ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
|
|
dev[0].group_form_result(ev0)
|
|
|
|
ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on seeker side")
|
|
|
|
seeker_conncap = ev1.split("conncap=")[1].split(" ")[0]
|
|
|
|
if "join=" in ev1:
|
|
if "OK" not in dev[1].global_request("P2P_CONNECT " + addr0 + " 12345670 p2ps persistent join"):
|
|
raise Exception("P2P_CONNECT failed on seeker side")
|
|
ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
|
|
if ev1 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on seeker side")
|
|
dev[1].group_form_result(ev1)
|
|
|
|
ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
|
|
if ev0 is None:
|
|
raise Exception("AP-STA-CONNECTED timeout on advertiser side")
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_connect_adv_client_p2ps_method(dev):
|
|
"""P2PS auto-accept connection with advertisement as Client and P2PS method"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='2 GB')
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=1000"):
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
|
|
ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on advertiser side")
|
|
if "join=" not in ev0:
|
|
raise Exception("Advertiser failed to become Client")
|
|
|
|
adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
|
|
if adv_conncap == "2":
|
|
logger.info("Advertiser is Client")
|
|
|
|
ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=5)
|
|
if ev1 is None:
|
|
raise Exception("Provisioning failed on seeker side")
|
|
|
|
seeker_conncap = ev1.split("conncap=")[1].split(" ")[0]
|
|
ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on seeker side")
|
|
dev[1].group_form_result(ev1)
|
|
|
|
if "join=" in ev0:
|
|
if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 p2ps persistent join"):
|
|
raise Exception("P2P_CONNECT failed on seeker side")
|
|
|
|
ev0 = dev[0].wait_global_event(["P2P-GROUP-FORMATION-SUCCESS"], timeout=15)
|
|
if ev0 is None:
|
|
raise Exception("P2P Group Formation failed on advertiser side")
|
|
|
|
ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
|
|
dev[0].group_form_result(ev0)
|
|
|
|
ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
|
|
if ev1 is None:
|
|
raise Exception("Group formation failed")
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def p2ps_connect_adv_go_pin_method(dev, keep_group=False):
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='2 GB')
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=8"): # keypad method on seeker side
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
|
|
seek_prov_ev = p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0],
|
|
autoaccept=True,
|
|
initiator_or_responder='initiator')
|
|
|
|
ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on advertier side")
|
|
adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
|
|
if adv_conncap == "4":
|
|
logger.info("Advertiser is GO")
|
|
ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
|
|
if ev0 is None:
|
|
raise Exception("PIN Display on advertiser side")
|
|
pin = ev0.split(" ")[2]
|
|
|
|
ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
|
|
dev[0].group_form_result(ev0)
|
|
|
|
ev0 = dev[0].group_request("WPS_PIN any " + pin)
|
|
if ev0 is None:
|
|
raise Exception("Failed to initiate Pin authorization on registrar side")
|
|
if "join=" in seek_prov_ev:
|
|
if "OK" not in dev[1].global_request("P2P_CONNECT " + addr0 + " " + pin + " keypad persistent join"):
|
|
raise Exception("P2P_CONNECT failed on seeker side")
|
|
ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on seeker side")
|
|
dev[1].group_form_result(ev1)
|
|
|
|
ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("AP-STA-CONNECTED timeout on advertiser side")
|
|
|
|
if not keep_group:
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_connect_adv_go_pin_method(dev):
|
|
"""P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
|
|
p2ps_connect_adv_go_pin_method(dev)
|
|
|
|
def test_p2ps_connect_adv_client_pin_method(dev):
|
|
"""P2PS advertiser as client with keypad config method on seeker side and auto-accept"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
dev[0].flush_scan_cache()
|
|
p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='2 GB')
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=8"): # keypad method on seeker side
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
|
|
seek_prov_ev = p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0],
|
|
autoaccept=True,
|
|
initiator_or_responder='initiator')
|
|
|
|
adv_prov = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if adv_prov is None:
|
|
raise Exception("Prov failed on advertiser")
|
|
adv_conncap = adv_prov.split("conncap=")[1].split(" ")[0]
|
|
if adv_conncap == "2":
|
|
logger.info("Advertiser is Client")
|
|
adv_pin_show_event = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
|
|
timeout=5)
|
|
if adv_pin_show_event is None:
|
|
raise Exception("PIN Display on advertiser side")
|
|
pin = adv_pin_show_event.split(" ")[2]
|
|
|
|
ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on seeker side")
|
|
dev[1].group_form_result(ev1)
|
|
|
|
ev1 = dev[1].group_request("WPS_PIN any " + pin)
|
|
if ev1 is None:
|
|
raise Exception("Failed to initiate Pin authorization on registrar side")
|
|
|
|
if "join=" in adv_prov:
|
|
if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " " + pin + " display persistent join"):
|
|
raise Exception("P2P_CONNECT failed on advertiser side")
|
|
ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("Group formation failed to start on seeker side")
|
|
dev[0].group_form_result(ev0)
|
|
|
|
ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("AP-STA-CONNECTED timeout on advertiser side")
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_service_discovery_multiple_queries(dev):
|
|
"""P2P service discovery with multiple queries"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
adv_id1 = p2ps_advertise(r_dev=dev[0], r_role='0',
|
|
svc_name='org.wi-fi.wfds.send.tx',
|
|
srv_info='I can transfer files upto size of 2 GB')
|
|
adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='0',
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size of 2 GB')
|
|
adv_id3 = p2ps_advertise(r_dev=dev[0], r_role='1',
|
|
svc_name='org.wi-fi.wfds.display.tx',
|
|
srv_info='Miracast Mode')
|
|
adv_id4 = p2ps_advertise(r_dev=dev[0], r_role='1',
|
|
svc_name='org.wi-fi.wfds.display.rx',
|
|
srv_info='Miracast Mode')
|
|
|
|
dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 1 org.wi-fi.wfds.display.tx 'Miracast Mode'")
|
|
dev[1].global_request("P2P_FIND 10 type=social seek=org.wi-fi.wfds.display.tx")
|
|
dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 2 org.wi-fi.wfds.send* 'size of 2 GB'")
|
|
dev[1].p2p_stop_find()
|
|
dev[1].global_request("P2P_FIND 10 type=social seek=")
|
|
ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P Device Found timed out")
|
|
if addr0 not in ev:
|
|
raise Exception("Unexpected service discovery request source")
|
|
ev_list = []
|
|
for i in range(0, 3):
|
|
ev = dev[1].wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P Service discovery timed out")
|
|
if addr0 in ev:
|
|
ev_list.append(ev)
|
|
if len(ev_list) == 3:
|
|
break
|
|
dev[1].p2p_stop_find()
|
|
|
|
for test in [ ("seek=org.wi-fi.wfds.display.TX",
|
|
"asp_svc=org.wi-fi.wfds.display.tx"),
|
|
("seek=foo seek=org.wi-fi.wfds.display.tx seek=bar",
|
|
"asp_svc=org.wi-fi.wfds.display.tx"),
|
|
("seek=1 seek=2 seek=3 seek=org.wi-fi.wfds.display.tx seek=4 seek=5 seek=6",
|
|
"asp_svc=org.wi-fi.wfds.display.tx"),
|
|
("seek=not-found", None),
|
|
("seek=org.wi-fi.wfds", "asp_svc=org.wi-fi.wfds")]:
|
|
dev[2].global_request("P2P_FIND 10 type=social " + test[0])
|
|
if test[1] is None:
|
|
ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=1)
|
|
if ev is not None:
|
|
raise Exception("Unexpected device found: " + ev)
|
|
continue
|
|
ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("P2P device discovery timed out (dev2)")
|
|
if test[1] not in ev:
|
|
raise Exception("Expected asp_svc not reported: " + ev)
|
|
dev[2].p2p_stop_find()
|
|
dev[2].request("P2P_FLUSH")
|
|
|
|
dev[0].p2p_stop_find()
|
|
|
|
ev1 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id1))
|
|
if ev1 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
ev2 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
|
|
if ev2 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
ev3 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id3))
|
|
if ev3 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
ev4 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id4))
|
|
if ev4 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
|
|
if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
|
|
raise Exception("P2P_SERVICE_ADD failed")
|
|
if "OK" not in dev[0].global_request("P2P_SERVICE_DEL asp all"):
|
|
raise Exception("P2P_SERVICE_DEL asp all failed")
|
|
if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
|
|
raise Exception("P2P_SERVICE_ADD failed")
|
|
if "OK" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
|
|
raise Exception("P2P_SERVICE_REP failed")
|
|
if "FAIL" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
|
|
raise Exception("Invalid P2P_SERVICE_REP accepted")
|
|
if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345678 1 1108 org.wi-fi.wfds.something svc_info='Test'"):
|
|
raise Exception("P2P_SERVICE_ADD failed")
|
|
if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345679 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
|
|
raise Exception("P2P_SERVICE_ADD failed")
|
|
|
|
def get_ifnames():
|
|
with open('/proc/net/dev', 'r') as f:
|
|
data = f.read()
|
|
ifnames = []
|
|
for line in data.splitlines():
|
|
ifname = line.strip().split(' ')[0]
|
|
if ':' not in ifname:
|
|
continue
|
|
ifname = ifname.split(':')[0]
|
|
ifnames.append(ifname)
|
|
return ifnames
|
|
|
|
def p2ps_connect_p2ps_method(dev, keep_group=False):
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
dev[0].flush_scan_cache()
|
|
dev[1].flush_scan_cache()
|
|
p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='2 GB')
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='test-session-info-data' method=1000"):
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
|
|
ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on advertiser side")
|
|
if "join=" not in ev0:
|
|
raise Exception("join parameter missing from P2PS-PROV-DONE")
|
|
|
|
ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=5)
|
|
if ev1 is None:
|
|
raise Exception("Provisioning failed on seeker side")
|
|
|
|
ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
|
|
if ev1 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on seeker side")
|
|
res1 = dev[1].group_form_result(ev1)
|
|
ifnames = get_ifnames()
|
|
|
|
if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 p2ps persistent join"):
|
|
raise Exception("P2P_CONNECT failed on seeker side")
|
|
|
|
ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
|
|
if ev0 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
|
|
res0 = dev[0].group_form_result(ev0)
|
|
|
|
ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
|
|
if ev1 is None:
|
|
raise Exception("Group formation failed")
|
|
|
|
if not keep_group:
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
ifnames = ifnames + get_ifnames()
|
|
remove_group(dev[0], dev[1])
|
|
ifnames = ifnames + get_ifnames()
|
|
|
|
return (res0, res1, ifnames)
|
|
|
|
def has_string_prefix(vals, prefix):
|
|
for val in vals:
|
|
if val.startswith(prefix):
|
|
return True
|
|
return False
|
|
|
|
def test_p2ps_connect_p2ps_method_1(dev):
|
|
"""P2PS connection with P2PS method - no group interface"""
|
|
set_no_group_iface(dev[0], 1)
|
|
set_no_group_iface(dev[1], 1)
|
|
|
|
(res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
|
|
if res0['ifname'] != dev[0].ifname:
|
|
raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
|
|
if res1['ifname'] != dev[1].ifname:
|
|
raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
|
|
if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
|
|
raise Exception("dev0 group interface unexpectedly present")
|
|
if has_string_prefix(ifnames, 'p2p-' + res1['ifname']):
|
|
raise Exception("dev1 group interface unexpectedly present")
|
|
|
|
def test_p2ps_connect_p2ps_method_2(dev):
|
|
"""P2PS connection with P2PS method - group interface on dev0"""
|
|
set_no_group_iface(dev[0], 0)
|
|
set_no_group_iface(dev[1], 1)
|
|
|
|
(res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
|
|
if not res0['ifname'].startswith('p2p-' + dev[0].ifname + '-'):
|
|
raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
|
|
if res1['ifname'] != dev[1].ifname:
|
|
raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
|
|
if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
|
|
raise Exception("dev0 group interface unexpectedly present")
|
|
|
|
def test_p2ps_connect_p2ps_method_3(dev):
|
|
"""P2PS connection with P2PS method - group interface on dev1"""
|
|
set_no_group_iface(dev[0], 1)
|
|
set_no_group_iface(dev[1], 0)
|
|
|
|
(res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
|
|
if res0['ifname'] != dev[0].ifname:
|
|
raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
|
|
if not res1['ifname'].startswith('p2p-' + dev[1].ifname + '-'):
|
|
raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
|
|
if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
|
|
raise Exception("dev0 group interface unexpectedly present")
|
|
|
|
def test_p2ps_connect_p2ps_method_4(dev):
|
|
"""P2PS connection with P2PS method - group interface on both"""
|
|
set_no_group_iface(dev[0], 0)
|
|
set_no_group_iface(dev[1], 0)
|
|
|
|
(res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
|
|
if not res0['ifname'].startswith('p2p-' + dev[0].ifname + '-'):
|
|
raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
|
|
if not res1['ifname'].startswith('p2p-' + dev[1].ifname + '-'):
|
|
raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
|
|
|
|
def test_p2ps_connect_adv_go_persistent(dev):
|
|
"""P2PS auto-accept connection with advertisement as GO and having persistent group"""
|
|
addr0 = dev[0].p2p_dev_addr()
|
|
addr1 = dev[1].p2p_dev_addr()
|
|
|
|
go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
|
|
r_dev=dev[1], r_intent=0)
|
|
dev[0].remove_group()
|
|
dev[1].wait_go_ending_session()
|
|
|
|
p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='2 GB')
|
|
if "OK" not in dev[1].global_request("P2P_ASP_PROVISION " + addr0 + " adv_id=" + str(adv_id) + " adv_mac=" + addr0 + " session=1 session_mac=" + addr1 + " info='' method=1000"):
|
|
raise Exception("Failed to request provisioning on seeker")
|
|
|
|
ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("Timed out while waiting for prov done on advertizer")
|
|
if "persist=" not in ev0:
|
|
raise Exception("Advertiser did not indicate persistent group")
|
|
id0 = ev0.split("persist=")[1].split(" ")[0]
|
|
if "OK" not in dev[0].global_request("P2P_GROUP_ADD persistent=" + id0 + " freq=2412"):
|
|
raise Exception("Could not re-start persistent group")
|
|
|
|
ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
|
|
if ev0 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
|
|
dev[0].group_form_result(ev0)
|
|
|
|
ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2PS-PROV-DONE timeout on seeker side")
|
|
|
|
if "persist=" not in ev1:
|
|
raise Exception("Seeker did not indicate persistent group")
|
|
id1 = ev1.split("persist=")[1].split(" ")[0]
|
|
if "OK" not in dev[1].global_request("P2P_GROUP_ADD persistent=" + id1 + " freq=2412"):
|
|
raise Exception("Could not re-start persistent group")
|
|
|
|
ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
|
|
if ev1 is None:
|
|
raise Exception("P2P-GROUP-STARTED timeout on seeker side")
|
|
dev[1].group_form_result(ev1)
|
|
|
|
ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=15)
|
|
if ev0 is None:
|
|
raise Exception("AP-STA-CONNECTED timeout on advertiser side")
|
|
ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if ev0 is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_client_probe(dev):
|
|
"""P2PS CLI discoverability on operating channel"""
|
|
cli_probe = dev[0].global_request("SET p2p_cli_probe 1")
|
|
p2ps_connect_p2ps_method(dev, keep_group=True)
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
single_peer_expected=False)
|
|
dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_go_probe(dev):
|
|
"""P2PS GO discoverability on operating channel"""
|
|
p2ps_connect_adv_go_pin_method(dev, keep_group=True)
|
|
[adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
single_peer_expected=False)
|
|
dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
remove_group(dev[0], dev[1])
|
|
|
|
def test_p2ps_wildcard_p2ps(dev):
|
|
"""P2PS wildcard SD Probe Request/Response"""
|
|
p2ps_wildcard = "org.wi-fi.wfds"
|
|
|
|
adv_id = p2ps_advertise(r_dev=dev[0], r_role='1',
|
|
svc_name='org.foo.service',
|
|
srv_info='I can do stuff')
|
|
adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='1',
|
|
svc_name='org.wi-fi.wfds.send.rx',
|
|
srv_info='I can receive files upto size 2 GB')
|
|
|
|
if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=org.foo.service seek=" + p2ps_wildcard):
|
|
raise Exception("Failed on P2P_FIND command")
|
|
|
|
ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
|
|
if dev[0].p2p_dev_addr() not in ev1:
|
|
raise Exception("Unexpected peer")
|
|
|
|
ev2 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
|
|
if ev2 is None:
|
|
raise Exception("P2P-DEVICE-FOUND timeout on seeker side (2)")
|
|
if dev[0].p2p_dev_addr() not in ev2:
|
|
raise Exception("Unexpected peer (2)")
|
|
|
|
if p2ps_wildcard not in ev1 + ev2:
|
|
raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event")
|
|
if "org.foo.service" not in ev1 + ev2:
|
|
raise Exception("Vendor specific service name not found in P2P-DEVICE-FOUND event")
|
|
|
|
if "OK" not in dev[1].global_request("P2P_STOP_FIND"):
|
|
raise Exception("P2P_STOP_FIND failed")
|
|
dev[1].dump_monitor()
|
|
|
|
res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
|
|
if res is None:
|
|
raise Exception("Unable to remove the advertisement instance")
|
|
|
|
if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
|
|
raise Exception("Failed on P2P_FIND command")
|
|
|
|
ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
|
|
if ev1 is None:
|
|
raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
|
|
if dev[0].p2p_dev_addr() not in ev1:
|
|
raise Exception("Unexpected peer")
|
|
if p2ps_wildcard not in ev1:
|
|
raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event (2)")
|
|
dev[1].dump_monitor()
|
|
|
|
res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
|
|
if res is None:
|
|
raise Exception("Unable to remove the advertisement instance 2")
|
|
|
|
if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
|
|
raise Exception("Failed on P2P_FIND command")
|
|
|
|
ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=2)
|
|
if ev1 is not None:
|
|
raise Exception("Unexpected P2P-DEVICE-FOUND event on seeker side")
|
|
dev[1].p2p_stop_find()
|
|
dev[1].dump_monitor()
|
|
|
|
def test_p2ps_many_services_in_probe(dev):
|
|
"""P2PS with large number of services in Probe Request/Response"""
|
|
long1 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.a'
|
|
long2 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.b'
|
|
long3 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.c'
|
|
long4 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.d'
|
|
long5 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.e'
|
|
for name in [ long1, long2, long3, long4, long5 ]:
|
|
p2ps_advertise(r_dev=dev[0], r_role='1',
|
|
svc_name=name,
|
|
srv_info='I can do stuff')
|
|
|
|
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)):
|
|
raise Exception("Failed on P2P_FIND command")
|
|
|
|
events = ""
|
|
# Note: Require only four events since all the services do not fit within
|
|
# the length limit.
|
|
for i in range(4):
|
|
ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
|
|
if ev is None:
|
|
raise Exception("Missing P2P-DEVICE-FOUND")
|
|
events = events + ev
|
|
dev[1].p2p_stop_find()
|
|
dev[1].dump_monitor()
|
|
for name in [ long2, long3, long4, long5 ]:
|
|
if name not in events:
|
|
raise Exception("Service missing from peer events")
|