test_p2ps.py 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991
  1. # P2P services
  2. # Copyright (c) 2014-2015, Qualcomm Atheros, Inc.
  3. #
  4. # This software may be distributed under the terms of the BSD license.
  5. # See README for more details.
  6. import logging
  7. logger = logging.getLogger()
  8. import time
  9. import random
  10. import re
  11. import hwsim_utils
  12. from wpasupplicant import WpaSupplicant
  13. from test_p2p_grpform import check_grpform_results
  14. from test_p2p_grpform import remove_group
  15. from test_p2p_persistent import go_neg_pin_authorized_persistent
  16. from utils import HwsimSkip
  17. # Dev[0] -> Advertiser
  18. # Dev[1] -> Seeker
  19. # ev0 -> Event generated at advertiser side
  20. # ev1 -> Event generated at Seeker side
  21. def p2ps_advertise(r_dev, r_role, svc_name, srv_info, rsp_info=None, cpt=None):
  22. """P2PS Advertise function"""
  23. adv_id = random.randrange(1, 0xFFFFFFFF)
  24. advid = hex(adv_id)[2:]
  25. cpt_param = (" cpt=" + cpt) if cpt is not None else ""
  26. if rsp_info is not None and srv_info is not None:
  27. 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 + "'"):
  28. raise Exception("P2P_SERVICE_ADD with response info and service info failed")
  29. if rsp_info is None and srv_info is not None:
  30. 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 + "'"):
  31. raise Exception("P2P_SERVICE_ADD with service info failed")
  32. if rsp_info is None and srv_info is 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):
  34. raise Exception("P2P_SERVICE_ADD without service info and without response info failed")
  35. if rsp_info is not None and srv_info is None:
  36. 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 + "'"):
  37. raise Exception("P2P_SERVICE_ADD with response info failed")
  38. r_dev.p2p_listen()
  39. return advid
  40. def p2ps_exact_seek(i_dev, r_dev, svc_name, srv_info=None,
  41. single_peer_expected=True):
  42. """P2PS exact service seek request"""
  43. if srv_info is not None:
  44. ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
  45. if ev1 is None:
  46. raise Exception("Failed to add Service Discovery request for exact seek request")
  47. if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek=" + svc_name):
  48. raise Exception("Failed to initiate seek operation")
  49. timeout = time.time() + 10
  50. ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  51. while ev1 is not None and not single_peer_expected:
  52. if r_dev.p2p_dev_addr() in ev1 and "adv_id=" in ev1:
  53. break
  54. ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  55. if timeout < time.time():
  56. raise Exception("Device not found")
  57. if ev1 is None:
  58. raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
  59. if r_dev.p2p_dev_addr() not in ev1:
  60. raise Exception("Unexpected peer")
  61. if srv_info is None:
  62. adv_id = ev1.split("adv_id=")[1].split(" ")[0]
  63. rcvd_svc_name = ev1.split("asp_svc=")[1].split(" ")[0]
  64. if rcvd_svc_name != svc_name:
  65. raise Exception("service name not matching")
  66. else:
  67. ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
  68. if ev1 is None:
  69. raise Exception("Failed to receive Service Discovery Response")
  70. if r_dev.p2p_dev_addr() not in ev1:
  71. raise Exception("Service Discovery response from Unknown Peer")
  72. if srv_info is not None and srv_info not in ev1:
  73. raise Exception("service info not available in Service Discovery response")
  74. adv_id = ev1.split(" ")[3]
  75. rcvd_svc_name = ev1.split(" ")[6]
  76. if rcvd_svc_name != svc_name:
  77. raise Exception("service name not matching")
  78. i_dev.p2p_stop_find()
  79. return [adv_id, rcvd_svc_name]
  80. def p2ps_nonexact_seek(i_dev, r_dev, svc_name, srv_info=None, adv_num=None):
  81. """P2PS nonexact service seek request"""
  82. if adv_num is None:
  83. adv_num = 1
  84. if srv_info is not None:
  85. ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
  86. else:
  87. ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '")
  88. if ev1 is None:
  89. raise Exception("Failed to add Service Discovery request for nonexact seek request")
  90. if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek="):
  91. raise Exception("Failed to initiate seek")
  92. ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  93. if ev1 is None:
  94. raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
  95. if r_dev.p2p_dev_addr() not in ev1:
  96. raise Exception("Unexpected peer")
  97. ev_list = []
  98. for i in range (0, adv_num):
  99. ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
  100. if ev1 is None:
  101. raise Exception("Failed to receive Service Discovery Response")
  102. if r_dev.p2p_dev_addr() not in ev1:
  103. raise Exception("Service Discovery response from Unknown Peer")
  104. if srv_info is not None and srv_info not in ev1:
  105. raise Exception("service info not available in Service Discovery response")
  106. adv_id = ev1.split(" ")[3]
  107. rcvd_svc_name = ev1.split(" ")[6]
  108. ev_list.append(''.join([adv_id, ' ', rcvd_svc_name]))
  109. i_dev.p2p_stop_find()
  110. return ev_list
  111. def p2ps_parse_event(ev, *args):
  112. ret = ()
  113. for arg in args:
  114. m = re.search("\s+" + arg + r"=(\S+)", ev)
  115. ret += (m.group(1) if m is not None else None,)
  116. return ret
  117. def p2ps_provision(seeker, advertiser, adv_id, auto_accept=True, method="1000", adv_cpt=None, seeker_cpt=None):
  118. addr0 = seeker.p2p_dev_addr()
  119. addr1 = advertiser.p2p_dev_addr()
  120. seeker.asp_provision(addr1, adv_id=str(adv_id), adv_mac=addr1, session_id=1,
  121. session_mac=addr0, method=method, cpt=seeker_cpt)
  122. if not auto_accept or method == "100":
  123. pin = None
  124. ev_pd_start = advertiser.wait_global_event(["P2PS-PROV-START"],
  125. timeout=10)
  126. if ev_pd_start is None:
  127. raise Exception("P2PS-PROV-START timeout on Advertiser side")
  128. peer = ev_pd_start.split()[1]
  129. advert_id, advert_mac, session, session_mac =\
  130. p2ps_parse_event(ev_pd_start, "adv_id", "adv_mac", "session", "mac")
  131. ev = seeker.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
  132. if ev is None:
  133. raise Exception("P2P-PROV-DISC-FAILURE timeout on seeker side")
  134. # Put seeker into a listen state, since we expect the deferred flow to
  135. # continue.
  136. seeker.p2p_ext_listen(500, 500)
  137. if method == "100":
  138. ev = advertiser.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
  139. timeout=10)
  140. if ev is None:
  141. raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
  142. if addr0 not in ev:
  143. raise Exception("Unknown peer " + addr0)
  144. ev = seeker.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
  145. timeout=10)
  146. if ev is None:
  147. raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on seeker side")
  148. if addr1 not in ev:
  149. raise Exception("Unknown peer " + addr1)
  150. pin = ev.split()[2]
  151. elif method == "8":
  152. ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
  153. timeout=10)
  154. if ev is None:
  155. raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
  156. if addr0 not in ev:
  157. raise Exception("Unknown peer " + addr0)
  158. pin = ev.split()[2]
  159. advertiser.asp_provision(peer, adv_id=advert_id, adv_mac=advert_mac,
  160. session_id=int(session, 0),
  161. session_mac=session_mac, status=12,
  162. cpt=adv_cpt)
  163. ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  164. if ev1 is None:
  165. raise Exception("P2PS-PROV-DONE timeout on seeker side")
  166. ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  167. if ev2 is None:
  168. raise Exception("P2PS-PROV-DONE timeout on advertiser side")
  169. if method == "8":
  170. ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"],
  171. timeout=10)
  172. if ev is None:
  173. raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
  174. if addr1 not in ev:
  175. raise Exception("Unknown peer " + addr1)
  176. seeker.p2p_cancel_ext_listen()
  177. if pin is not None:
  178. return ev1, ev2, pin
  179. return ev1, ev2
  180. # Auto-accept is true and the method is either P2PS or advertiser is DISPLAY
  181. ev1 = seeker.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  182. if ev1 is None:
  183. raise Exception("P2PS-PROV-DONE timeout on seeker side")
  184. ev2 = advertiser.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  185. if ev2 is None:
  186. raise Exception("P2PS-PROV-DONE timeout on advertiser side")
  187. if method == "8":
  188. ev = seeker.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
  189. if ev is None:
  190. raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
  191. if addr1 not in ev:
  192. raise Exception("Unknown peer " + addr1)
  193. ev = advertiser.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
  194. timeout=10)
  195. if ev is None:
  196. raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on advertiser side")
  197. if addr0 not in ev:
  198. raise Exception("Unknown peer " + addr0)
  199. pin = ev.split()[2]
  200. return ev1, ev2, pin
  201. return ev1, ev2
  202. def p2ps_connect_pd(dev0, dev1, ev0, ev1, pin=None):
  203. conf_methods_map = {"8": "p2ps", "1": "display", "5": "keypad"}
  204. peer0 = ev0.split()[1]
  205. peer1 = ev1.split()[1]
  206. status0, conncap0, adv_id0, adv_mac0, mac0, session0, dev_passwd_id0, go0, join0, feature_cap0, persist0 =\
  207. p2ps_parse_event(ev0, "status", "conncap", "adv_id", "adv_mac", "mac", "session", "dev_passwd_id", "go", "join", "feature_cap", "persist")
  208. status1, conncap1, adv_id1, adv_mac1, mac1, session1, dev_passwd_id1, go1, join1, feature_cap1, persist1 =\
  209. p2ps_parse_event(ev1, "status", "conncap", "adv_id", "adv_mac", "mac", "session", "dev_passwd_id", "go", "join", "feature_cap", "persist")
  210. if status0 != "0" and status0 != "12":
  211. raise Exception("PD failed on " + dev0.p2p_dev_addr())
  212. if status1 != "0" and status1 != "12":
  213. raise Exception("PD failed on " + dev1.p2p_dev_addr())
  214. if status0 == "12" and status1 == "12":
  215. raise Exception("Both sides have status 12 which doesn't make sense")
  216. if adv_id0 != adv_id1 or adv_id0 is None:
  217. raise Exception("Adv. IDs don't match")
  218. if adv_mac0 != adv_mac1 or adv_mac0 is None:
  219. raise Exception("Adv. MACs don't match")
  220. if session0 != session1 or session0 is None:
  221. raise Exception("Session IDs don't match")
  222. if mac0 != mac1 or mac0 is None:
  223. raise Exception("Session MACs don't match")
  224. #TODO: Validate feature capability
  225. if bool(persist0) != bool(persist1):
  226. raise Exception("Only one peer has persistent group")
  227. if persist0 is None and not all([conncap0, conncap1, dev_passwd_id0,
  228. dev_passwd_id1]):
  229. raise Exception("Persistent group not used but conncap/dev_passwd_id are missing")
  230. if persist0 is not None and any([conncap0, conncap1, dev_passwd_id0,
  231. dev_passwd_id1]):
  232. raise Exception("Persistent group is used but conncap/dev_passwd_id are present")
  233. # Persistent Connection (todo: handle frequency)
  234. if persist0 is not None:
  235. if "OK" not in dev0.global_request("P2P_GROUP_ADD persistent=" + persist0 + " freq=2412"):
  236. raise Exception("Could not re-start persistent group")
  237. ev0 = dev0.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  238. if ev0 is None:
  239. raise Exception("P2P-GROUP-STARTED timeout on " + dev0.p2p_dev_addr())
  240. dev0.group_form_result(ev0)
  241. if "OK" not in dev1.global_request("P2P_GROUP_ADD persistent=" + persist1 + " freq=2412"):
  242. raise Exception("Could not re-start persistent group")
  243. ev1 = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  244. if ev1 is None:
  245. raise Exception("P2P-GROUP-STARTED timeout on " + dev1.p2p_dev_addr())
  246. dev1.group_form_result(ev1)
  247. if "GO" in ev0:
  248. ev = dev0.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
  249. if ev is None:
  250. raise Exception("AP-STA-CONNECTED timeout on " + dev0.p2p_dev_addr())
  251. else:
  252. ev = dev1.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
  253. if ev is None:
  254. raise Exception("AP-STA-CONNECTED timeout on " + dev1.p2p_dev_addr())
  255. else:
  256. try:
  257. method0 = conf_methods_map[dev_passwd_id0]
  258. method1 = conf_methods_map[dev_passwd_id1]
  259. except KeyError:
  260. raise Exception("Unsupported method")
  261. if method0 == "p2ps":
  262. pin = "12345670"
  263. if pin is None:
  264. raise Exception("Pin is not provided")
  265. if conncap0 == "1" and conncap1 == "1": # NEW/NEW - GON
  266. if any([join0, join1, go0, go1]):
  267. raise Exception("Unexpected join/go PD attributes")
  268. dev0.p2p_listen()
  269. if "OK" not in dev0.global_request("P2P_CONNECT " + peer0 + " " + pin + " " + method0 + " persistent auth"):
  270. raise Exception("P2P_CONNECT fails on " + dev0.p2p_dev_addr())
  271. if "OK" not in dev1.global_request("P2P_CONNECT " + peer1 + " " + pin + " " + method1 + " persistent"):
  272. raise Exception("P2P_CONNECT fails on " + dev1.p2p_dev_addr())
  273. ev = dev0.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
  274. if ev is None:
  275. raise Exception("GO Neg did not succeed on " + dev0.p2p_dev_addr())
  276. ev = dev1.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
  277. if ev is None:
  278. raise Exception("GO Neg did not succeed on " + dev1.p2p_dev_addr())
  279. ev = dev0.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  280. if ev is None:
  281. raise Exception("P2P-GROUP-STARTED timeout on " + dev0.p2p_dev_addr())
  282. dev0.group_form_result(ev)
  283. ev = dev1.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  284. if ev is None:
  285. raise Exception("P2P-GROUP-STARTED timeout on " + dev1.p2p_dev_addr())
  286. dev1.group_form_result(ev)
  287. else:
  288. if conncap0 == "2" and conncap1 == "4": # dev0 CLI, dev1 GO
  289. dev_cli, dev_go, go_if, join_address, go_method, cli_method = dev0, dev1, go1, join0, method1, method0
  290. elif conncap0 == "4" and conncap1 == "2": # dev0 GO, dev1 CLI
  291. dev_cli, dev_go, go_if, join_address, go_method, cli_method = dev1, dev0, go0, join1, method0, method1
  292. else:
  293. raise Exception("Bad connection capabilities")
  294. if go_if is None:
  295. raise Exception("Device " + dev_go.p2p_dev_addr() + " failed to become GO")
  296. if join_address is None:
  297. raise Exception("Device " + dev_cli.p2p_dev_addr() + " failed to become CLI")
  298. ev = dev_go.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  299. if ev is None:
  300. raise Exception("P2P-GROUP-STARTED timeout on " + dev_go.p2p_dev_addr())
  301. dev_go.group_form_result(ev)
  302. if go_method != "p2ps":
  303. ev = dev_go.group_request("WPS_PIN any " + pin)
  304. if ev is None:
  305. raise Exception("Failed to initiate pin authorization on registrar side")
  306. if "OK" not in dev_cli.global_request("P2P_CONNECT " + join_address + " " + pin + " " + cli_method + " persistent join"):
  307. raise Exception("P2P_CONNECT failed on " + dev_cli.p2p_dev_addr())
  308. ev = dev_cli.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  309. if ev is None:
  310. raise Exception("P2P-GROUP-STARTED timeout on " + dev_cli.p2p_dev_addr())
  311. dev_cli.group_form_result(ev)
  312. ev = dev_go.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
  313. if ev is None:
  314. raise Exception("AP-STA-CONNECTED timeout on " + dev_go.p2p_dev_addr())
  315. hwsim_utils.test_connectivity_p2p(dev0, dev1)
  316. def set_no_group_iface(dev, enable):
  317. if enable:
  318. res = dev.get_driver_status()
  319. if (int(res['capa.flags'], 0) & 0x20000000):
  320. raise HwsimSkip("P2P Device used. Cannot set enable no_group_iface")
  321. dev.global_request("SET p2p_no_group_iface 1")
  322. else:
  323. dev.global_request("SET p2p_no_group_iface 0")
  324. def test_p2ps_exact_search(dev):
  325. """P2PS exact service request"""
  326. p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
  327. srv_info='I can receive files upto size 2 GB')
  328. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  329. svc_name='org.wi-fi.wfds.send.rx')
  330. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  331. if ev0 is None:
  332. raise Exception("Unable to remove the advertisement instance")
  333. def test_p2ps_exact_search_srvinfo(dev):
  334. """P2PS exact service request with service info"""
  335. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
  336. srv_info='I can receive files upto size 2 GB')
  337. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  338. svc_name='org.wi-fi.wfds.send.rx',
  339. srv_info='2 GB')
  340. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  341. if ev0 is None:
  342. raise Exception("Unable to remove the advertisement instance")
  343. def test_p2ps_nonexact_search(dev):
  344. """P2PS nonexact seek request"""
  345. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.play.rx',
  346. srv_info='I support Miracast Mode ')
  347. ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
  348. svc_name='org.wi-fi.wfds.play*')
  349. adv_id = ev_list[0].split()[0]
  350. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  351. if ev0 is None:
  352. raise Exception("Unable to remove the advertisement instance")
  353. def test_p2ps_nonexact_search_srvinfo(dev):
  354. """P2PS nonexact seek request with service info"""
  355. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
  356. srv_info='I can receive files upto size 2 GB')
  357. ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
  358. svc_name='org.wi-fi.wfds.send*',
  359. srv_info='2 GB')
  360. adv_id = ev_list[0].split()[0]
  361. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  362. if ev0 is None:
  363. raise Exception("Unable to remove the advertisement instance")
  364. def test_p2ps_connect_p2ps_method_nonautoaccept(dev):
  365. """P2PS connect for non-auto-accept and P2PS config method"""
  366. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
  367. srv_info='I can receive files upto size 2 GB')
  368. ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
  369. svc_name='org.wi-fi.wfds.send*',
  370. srv_info='2 GB')
  371. adv_id = ev_list[0].split()[0]
  372. ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False)
  373. p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
  374. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  375. if ev0 is None:
  376. raise Exception("Unable to remove the advertisement instance")
  377. remove_group(dev[0], dev[1])
  378. def test_p2ps_connect_p2ps_method_autoaccept(dev):
  379. """P2PS connection with P2PS default config method and auto-accept"""
  380. p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
  381. srv_info='I can receive files upto size 2 GB')
  382. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  383. svc_name='org.wi-fi.wfds.send.rx',
  384. srv_info='2 GB')
  385. ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
  386. p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
  387. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  388. if ev0 is None:
  389. raise Exception("Unable to remove the advertisement instance")
  390. remove_group(dev[0], dev[1])
  391. def test_p2ps_connect_keypad_method_nonautoaccept(dev):
  392. """P2PS Connection with non-auto-accept and seeker having keypad method"""
  393. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
  394. srv_info='I can receive files upto size 2 GB')
  395. ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
  396. svc_name='org.wi-fi.wfds.send*',
  397. srv_info='2 GB')
  398. adv_id = ev_list[0].split()[0]
  399. ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False, method="8")
  400. p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
  401. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  402. if ev0 is None:
  403. raise Exception("Unable to remove the advertisement instance")
  404. remove_group(dev[0], dev[1])
  405. def test_p2ps_connect_display_method_nonautoaccept(dev):
  406. """P2PS connection with non-auto-accept and seeker having display method"""
  407. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
  408. srv_info='I can receive files upto size 2 GB')
  409. ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
  410. svc_name='org.wi-fi.wfds*', srv_info='2 GB')
  411. adv_id = ev_list[0].split()[0]
  412. ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, auto_accept=False, method="100")
  413. p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
  414. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  415. if ev0 is None:
  416. raise Exception("Unable to remove the advertisement instance")
  417. remove_group(dev[0], dev[1])
  418. def test_p2ps_connect_keypad_method_autoaccept(dev):
  419. """P2PS connection with auto-accept and keypad method on seeker side"""
  420. p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
  421. srv_info='I can receive files upto size 2 GB')
  422. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  423. svc_name='org.wi-fi.wfds.send.rx',
  424. srv_info='2 GB')
  425. ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
  426. p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
  427. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  428. if ev0 is None:
  429. raise Exception("Unable to remove the advertisement instance")
  430. remove_group(dev[0], dev[1])
  431. def test_p2ps_connect_display_method_autoaccept(dev):
  432. """P2PS connection with auto-accept and display method on seeker side"""
  433. p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
  434. srv_info='I can receive files upto size 2 GB')
  435. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  436. svc_name='org.wi-fi.wfds.send.rx',
  437. srv_info='2 GB')
  438. ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="100")
  439. p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
  440. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  441. if ev0 is None:
  442. raise Exception("Unable to remove the advertisement instance")
  443. remove_group(dev[0], dev[1])
  444. def test_p2ps_connect_adv_go_p2ps_method(dev):
  445. """P2PS auto-accept connection with advertisement as GO and P2PS method"""
  446. p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
  447. srv_info='I can receive files upto size 2 GB')
  448. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  449. svc_name='org.wi-fi.wfds.send.rx',
  450. srv_info='2 GB')
  451. ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
  452. p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
  453. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  454. if ev0 is None:
  455. raise Exception("Unable to remove the advertisement instance")
  456. remove_group(dev[0], dev[1])
  457. def test_p2ps_connect_adv_go_p2ps_method_group_iface(dev):
  458. """P2PS auto-accept connection with advertisement as GO and P2PS method using separate group interface"""
  459. set_no_group_iface(dev[0], 0)
  460. set_no_group_iface(dev[1], 0)
  461. p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
  462. srv_info='I can receive files upto size 2 GB')
  463. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  464. svc_name='org.wi-fi.wfds.send.rx',
  465. srv_info='2 GB')
  466. ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
  467. p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
  468. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  469. if ev0 is None:
  470. raise Exception("Unable to remove the advertisement instance")
  471. remove_group(dev[0], dev[1])
  472. def test_p2ps_connect_adv_client_p2ps_method(dev):
  473. """P2PS auto-accept connection with advertisement as Client and P2PS method"""
  474. p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
  475. srv_info='I can receive files upto size 2 GB')
  476. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  477. svc_name='org.wi-fi.wfds.send.rx',
  478. srv_info='2 GB')
  479. ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
  480. p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
  481. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  482. if ev0 is None:
  483. raise Exception("Unable to remove the advertisement instance")
  484. remove_group(dev[0], dev[1])
  485. def p2ps_connect_adv_go_pin_method(dev, keep_group=False):
  486. p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
  487. srv_info='I can receive files upto size 2 GB')
  488. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  489. svc_name='org.wi-fi.wfds.send.rx',
  490. srv_info='2 GB')
  491. ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
  492. p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
  493. if not keep_group:
  494. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  495. if ev0 is None:
  496. raise Exception("Unable to remove the advertisement instance")
  497. remove_group(dev[0], dev[1])
  498. def test_p2ps_connect_adv_go_pin_method(dev):
  499. """P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
  500. p2ps_connect_adv_go_pin_method(dev)
  501. def test_p2ps_connect_adv_client_pin_method(dev):
  502. """P2PS advertiser as client with keypad config method on seeker side and auto-accept"""
  503. dev[0].flush_scan_cache()
  504. p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
  505. srv_info='I can receive files upto size 2 GB')
  506. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  507. svc_name='org.wi-fi.wfds.send.rx',
  508. srv_info='2 GB')
  509. ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id, method="8")
  510. p2ps_connect_pd(dev[0], dev[1], ev0, ev1, pin)
  511. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  512. if ev0 is None:
  513. raise Exception("Unable to remove the advertisement instance")
  514. remove_group(dev[0], dev[1])
  515. def test_p2ps_service_discovery_multiple_queries(dev):
  516. """P2P service discovery with multiple queries"""
  517. addr0 = dev[0].p2p_dev_addr()
  518. addr1 = dev[1].p2p_dev_addr()
  519. adv_id1 = p2ps_advertise(r_dev=dev[0], r_role='0',
  520. svc_name='org.wi-fi.wfds.send.tx',
  521. srv_info='I can transfer files upto size of 2 GB')
  522. adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='0',
  523. svc_name='org.wi-fi.wfds.send.rx',
  524. srv_info='I can receive files upto size of 2 GB')
  525. adv_id3 = p2ps_advertise(r_dev=dev[0], r_role='1',
  526. svc_name='org.wi-fi.wfds.display.tx',
  527. srv_info='Miracast Mode')
  528. adv_id4 = p2ps_advertise(r_dev=dev[0], r_role='1',
  529. svc_name='org.wi-fi.wfds.display.rx',
  530. srv_info='Miracast Mode')
  531. dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 1 org.wi-fi.wfds.display.tx 'Miracast Mode'")
  532. dev[1].global_request("P2P_FIND 10 type=social seek=org.wi-fi.wfds.display.tx")
  533. dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 2 org.wi-fi.wfds.send* 'size of 2 GB'")
  534. dev[1].p2p_stop_find()
  535. dev[1].global_request("P2P_FIND 10 type=social seek=")
  536. ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  537. if ev is None:
  538. raise Exception("P2P Device Found timed out")
  539. if addr0 not in ev:
  540. raise Exception("Unexpected service discovery request source")
  541. ev_list = []
  542. for i in range(0, 3):
  543. ev = dev[1].wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
  544. if ev is None:
  545. raise Exception("P2P Service discovery timed out")
  546. if addr0 in ev:
  547. ev_list.append(ev)
  548. if len(ev_list) == 3:
  549. break
  550. dev[1].p2p_stop_find()
  551. for test in [ ("seek=org.wi-fi.wfds.display.TX",
  552. "asp_svc=org.wi-fi.wfds.display.tx"),
  553. ("seek=foo seek=org.wi-fi.wfds.display.tx seek=bar",
  554. "asp_svc=org.wi-fi.wfds.display.tx"),
  555. ("seek=1 seek=2 seek=3 seek=org.wi-fi.wfds.display.tx seek=4 seek=5 seek=6",
  556. "asp_svc=org.wi-fi.wfds.display.tx"),
  557. ("seek=not-found", None),
  558. ("seek=org.wi-fi.wfds", "asp_svc=org.wi-fi.wfds")]:
  559. dev[2].global_request("P2P_FIND 10 type=social " + test[0])
  560. if test[1] is None:
  561. ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=1)
  562. if ev is not None:
  563. raise Exception("Unexpected device found: " + ev)
  564. continue
  565. ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  566. if ev is None:
  567. raise Exception("P2P device discovery timed out (dev2)")
  568. if test[1] not in ev:
  569. raise Exception("Expected asp_svc not reported: " + ev)
  570. dev[2].p2p_stop_find()
  571. dev[2].request("P2P_FLUSH")
  572. dev[0].p2p_stop_find()
  573. ev1 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id1))
  574. if ev1 is None:
  575. raise Exception("Unable to remove the advertisement instance")
  576. ev2 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
  577. if ev2 is None:
  578. raise Exception("Unable to remove the advertisement instance")
  579. ev3 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id3))
  580. if ev3 is None:
  581. raise Exception("Unable to remove the advertisement instance")
  582. ev4 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id4))
  583. if ev4 is None:
  584. raise Exception("Unable to remove the advertisement instance")
  585. if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
  586. raise Exception("P2P_SERVICE_ADD failed")
  587. if "OK" not in dev[0].global_request("P2P_SERVICE_DEL asp all"):
  588. raise Exception("P2P_SERVICE_DEL asp all failed")
  589. if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
  590. raise Exception("P2P_SERVICE_ADD failed")
  591. if "OK" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
  592. raise Exception("P2P_SERVICE_REP failed")
  593. if "FAIL" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
  594. raise Exception("Invalid P2P_SERVICE_REP accepted")
  595. if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345678 1 1108 org.wi-fi.wfds.something svc_info='Test'"):
  596. raise Exception("P2P_SERVICE_ADD failed")
  597. if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345679 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
  598. raise Exception("P2P_SERVICE_ADD failed")
  599. def get_ifnames():
  600. with open('/proc/net/dev', 'r') as f:
  601. data = f.read()
  602. ifnames = []
  603. for line in data.splitlines():
  604. ifname = line.strip().split(' ')[0]
  605. if ':' not in ifname:
  606. continue
  607. ifname = ifname.split(':')[0]
  608. ifnames.append(ifname)
  609. return ifnames
  610. def p2ps_connect_p2ps_method(dev, keep_group=False):
  611. dev[0].flush_scan_cache()
  612. dev[1].flush_scan_cache()
  613. p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
  614. srv_info='I can receive files upto size 2 GB')
  615. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  616. svc_name='org.wi-fi.wfds.send.rx',
  617. srv_info='2 GB')
  618. ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
  619. ifnames = get_ifnames()
  620. p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
  621. grp_ifname0 = dev[0].get_group_ifname()
  622. grp_ifname1 = dev[1].get_group_ifname()
  623. if not keep_group:
  624. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  625. if ev0 is None:
  626. raise Exception("Unable to remove the advertisement instance")
  627. ifnames = ifnames + get_ifnames()
  628. remove_group(dev[0], dev[1])
  629. ifnames = ifnames + get_ifnames()
  630. return grp_ifname0, grp_ifname1, ifnames
  631. def has_string_prefix(vals, prefix):
  632. for val in vals:
  633. if val.startswith(prefix):
  634. return True
  635. return False
  636. def test_p2ps_connect_p2ps_method_1(dev):
  637. """P2PS connection with P2PS method - no group interface"""
  638. set_no_group_iface(dev[0], 1)
  639. set_no_group_iface(dev[1], 1)
  640. (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
  641. if grp_ifname0 != dev[0].ifname:
  642. raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
  643. if grp_ifname1 != dev[1].ifname:
  644. raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
  645. if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
  646. raise Exception("dev0 group interface unexpectedly present")
  647. if has_string_prefix(ifnames, 'p2p-' + grp_ifname1):
  648. raise Exception("dev1 group interface unexpectedly present")
  649. def test_p2ps_connect_p2ps_method_2(dev):
  650. """P2PS connection with P2PS method - group interface on dev0"""
  651. set_no_group_iface(dev[0], 0)
  652. set_no_group_iface(dev[1], 1)
  653. (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
  654. if not grp_ifname0.startswith('p2p-' + dev[0].ifname + '-'):
  655. raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
  656. if grp_ifname1 != dev[1].ifname:
  657. raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
  658. if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
  659. raise Exception("dev0 group interface unexpectedly present")
  660. def test_p2ps_connect_p2ps_method_3(dev):
  661. """P2PS connection with P2PS method - group interface on dev1"""
  662. set_no_group_iface(dev[0], 1)
  663. set_no_group_iface(dev[1], 0)
  664. (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
  665. if grp_ifname0 != dev[0].ifname:
  666. raise Exception("unexpected dev0 group ifname: " + grp_ifname0)
  667. if not grp_ifname1.startswith('p2p-' + dev[1].ifname + '-'):
  668. raise Exception("unexpected dev1 group ifname: " + grp_ifname1)
  669. if has_string_prefix(ifnames, 'p2p-' + grp_ifname0):
  670. raise Exception("dev0 group interface unexpectedly present")
  671. def test_p2ps_connect_p2ps_method_4(dev):
  672. """P2PS connection with P2PS method - group interface on both"""
  673. set_no_group_iface(dev[0], 0)
  674. set_no_group_iface(dev[1], 0)
  675. (grp_ifname0, grp_ifname1, ifnames) = p2ps_connect_p2ps_method(dev)
  676. if not grp_ifname0.startswith('p2p-' + dev[0].ifname + '-'):
  677. raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
  678. if not grp_ifname1.startswith('p2p-' + dev[1].ifname + '-'):
  679. raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
  680. def test_p2ps_connect_adv_go_persistent(dev):
  681. """P2PS auto-accept connection with advertisement as GO and having persistent group"""
  682. go_neg_pin_authorized_persistent(i_dev=dev[0], i_intent=15,
  683. r_dev=dev[1], r_intent=0)
  684. dev[0].remove_group()
  685. dev[1].wait_go_ending_session()
  686. p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
  687. srv_info='I can receive files upto size 2 GB')
  688. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  689. svc_name='org.wi-fi.wfds.send.rx',
  690. srv_info='2 GB')
  691. ev1, ev0 = p2ps_provision(dev[1], dev[0], adv_id)
  692. if "persist=" not in ev0 or "persist=" not in ev1:
  693. raise Exception("Persistent group isn't used by peers")
  694. p2ps_connect_pd(dev[0], dev[1], ev0, ev1)
  695. remove_group(dev[0], dev[1])
  696. def test_p2ps_client_probe(dev):
  697. """P2PS CLI discoverability on operating channel"""
  698. cli_probe = dev[0].global_request("SET p2p_cli_probe 1")
  699. p2ps_connect_p2ps_method(dev, keep_group=True)
  700. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
  701. svc_name='org.wi-fi.wfds.send.rx',
  702. single_peer_expected=False)
  703. dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  704. remove_group(dev[0], dev[1])
  705. def test_p2ps_go_probe(dev):
  706. """P2PS GO discoverability on operating channel"""
  707. p2ps_connect_adv_go_pin_method(dev, keep_group=True)
  708. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[2], r_dev=dev[0],
  709. svc_name='org.wi-fi.wfds.send.rx',
  710. single_peer_expected=False)
  711. dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  712. remove_group(dev[0], dev[1])
  713. def test_p2ps_wildcard_p2ps(dev):
  714. """P2PS wildcard SD Probe Request/Response"""
  715. p2ps_wildcard = "org.wi-fi.wfds"
  716. adv_id = p2ps_advertise(r_dev=dev[0], r_role='1',
  717. svc_name='org.foo.service',
  718. srv_info='I can do stuff')
  719. adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='1',
  720. svc_name='org.wi-fi.wfds.send.rx',
  721. srv_info='I can receive files upto size 2 GB')
  722. if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=org.foo.service seek=" + p2ps_wildcard):
  723. raise Exception("Failed on P2P_FIND command")
  724. ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  725. if ev1 is None:
  726. raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
  727. if dev[0].p2p_dev_addr() not in ev1:
  728. raise Exception("Unexpected peer")
  729. ev2 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  730. if ev2 is None:
  731. raise Exception("P2P-DEVICE-FOUND timeout on seeker side (2)")
  732. if dev[0].p2p_dev_addr() not in ev2:
  733. raise Exception("Unexpected peer (2)")
  734. if p2ps_wildcard not in ev1 + ev2:
  735. raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event")
  736. if "org.foo.service" not in ev1 + ev2:
  737. raise Exception("Vendor specific service name not found in P2P-DEVICE-FOUND event")
  738. if "OK" not in dev[1].global_request("P2P_STOP_FIND"):
  739. raise Exception("P2P_STOP_FIND failed")
  740. dev[1].dump_monitor()
  741. res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  742. if res is None:
  743. raise Exception("Unable to remove the advertisement instance")
  744. if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
  745. raise Exception("Failed on P2P_FIND command")
  746. ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  747. if ev1 is None:
  748. raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
  749. if dev[0].p2p_dev_addr() not in ev1:
  750. raise Exception("Unexpected peer")
  751. if p2ps_wildcard not in ev1:
  752. raise Exception("P2PS Wildcard name not found in P2P-DEVICE-FOUND event (2)")
  753. dev[1].dump_monitor()
  754. res = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
  755. if res is None:
  756. raise Exception("Unable to remove the advertisement instance 2")
  757. if "OK" not in dev[1].global_request("P2P_FIND 10 type=social seek=" + p2ps_wildcard):
  758. raise Exception("Failed on P2P_FIND command")
  759. ev1 = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=2)
  760. if ev1 is not None:
  761. raise Exception("Unexpected P2P-DEVICE-FOUND event on seeker side")
  762. dev[1].p2p_stop_find()
  763. dev[1].dump_monitor()
  764. def test_p2ps_many_services_in_probe(dev):
  765. """P2PS with large number of services in Probe Request/Response"""
  766. long1 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.a'
  767. long2 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.b'
  768. long3 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.c'
  769. long4 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.d'
  770. long5 = 'org.example.0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789.e'
  771. for name in [ long1, long2, long3, long4, long5 ]:
  772. p2ps_advertise(r_dev=dev[0], r_role='1',
  773. svc_name=name,
  774. srv_info='I can do stuff')
  775. 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)):
  776. raise Exception("Failed on P2P_FIND command")
  777. events = ""
  778. # Note: Require only four events since all the services do not fit within
  779. # the length limit.
  780. for i in range(4):
  781. ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  782. if ev is None:
  783. raise Exception("Missing P2P-DEVICE-FOUND")
  784. events = events + ev
  785. dev[1].p2p_stop_find()
  786. dev[1].dump_monitor()
  787. for name in [ long2, long3, long4, long5 ]:
  788. if name not in events:
  789. raise Exception("Service missing from peer events")
  790. def p2ps_test_feature_capability_cpt(dev, adv_cpt, seeker_cpt, adv_role,
  791. result):
  792. p2ps_advertise(r_dev=dev[0], r_role=adv_role,
  793. svc_name='org.wi-fi.wfds.send.rx',
  794. srv_info='I can receive files upto size 2 GB', cpt=adv_cpt)
  795. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  796. svc_name='org.wi-fi.wfds.send.rx',
  797. srv_info='2 GB')
  798. auto_accept = adv_role != "0"
  799. ev1, ev0, pin = p2ps_provision(dev[1], dev[0], adv_id,
  800. auto_accept=auto_accept, adv_cpt=adv_cpt,
  801. seeker_cpt=seeker_cpt, method="8")
  802. status0, fcap0 = p2ps_parse_event(ev0, "status", "feature_cap")
  803. status1, fcap1 = p2ps_parse_event(ev0, "status", "feature_cap")
  804. if fcap0 is None:
  805. raise Exception("Bad feature capability on Seeker side")
  806. if fcap1 is None:
  807. raise Exception("Bad feature capability on Advertiser side")
  808. if fcap0 != fcap1:
  809. raise Exception("Incompatible feature capability values")
  810. if status0 not in ("0", "12") or status1 not in ("0", "12"):
  811. raise Exception("Unexpected PD result status")
  812. if result == "UDP" and fcap0[1] != "1":
  813. raise Exception("Unexpected CPT feature capability value (expected: UDP)")
  814. elif result == "MAC" and fcap0[1] != "2":
  815. raise Exception("Unexpected CPT feature capability value (expected: MAC)")
  816. ev = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  817. if ev is None:
  818. raise Exception("Unable to remove the advertisement instance")
  819. def test_p2ps_feature_capability_mac_autoaccept(dev):
  820. """P2PS PD Feature Capability CPT: advertiser MAC, seeker UDP:MAC, autoaccept"""
  821. p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
  822. adv_role="4", result="MAC")
  823. def test_p2ps_feature_capability_mac_nonautoaccept(dev):
  824. """P2PS PD Feature Capability CPT: advertiser:MAC, seeker UDP:MAC, nonautoaccept"""
  825. p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC", seeker_cpt="UDP:MAC",
  826. adv_role="0", result="MAC")
  827. def test_p2ps_feature_capability_mac_udp_autoaccept(dev):
  828. """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, autoaccept"""
  829. p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
  830. seeker_cpt="UDP:MAC", adv_role="2",
  831. result="MAC")
  832. def test_p2ps_feature_capability_mac_udp_nonautoaccept(dev):
  833. """P2PS PD Feature Capability CPT: advertiser MAC:UDP, seeker UDP:MAC, nonautoaccept"""
  834. p2ps_test_feature_capability_cpt(dev, adv_cpt="MAC:UDP",
  835. seeker_cpt="UDP:MAC", adv_role="0",
  836. result="UDP")
  837. def test_p2ps_feature_capability_udp_mac_autoaccept(dev):
  838. """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, autoaccept"""
  839. p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
  840. seeker_cpt="MAC:UDP", adv_role="2",
  841. result="UDP")
  842. def test_p2ps_feature_capability_udp_mac_nonautoaccept(dev):
  843. """P2PS PD Feature Capability CPT: advertiser UDP:MAC, seeker MAC:UDP, nonautoaccept"""
  844. p2ps_test_feature_capability_cpt(dev, adv_cpt="UDP:MAC",
  845. seeker_cpt="MAC:UDP", adv_role="0",
  846. result="MAC")