test_p2ps.py 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858
  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 hwsim_utils
  11. from wpasupplicant import WpaSupplicant
  12. from test_p2p_grpform import check_grpform_results
  13. from test_p2p_grpform import remove_group
  14. # Dev[0] -> Advertiser
  15. # Dev[1] -> Seeker
  16. # ev0 -> Event generated at advertiser side
  17. # ev1 -> Event generated at Seeker side
  18. def p2ps_advertise(r_dev, r_role, svc_name, srv_info, rsp_info=None):
  19. """P2PS Advertise function"""
  20. adv_id = random.randrange(1, 0xFFFFFFFF)
  21. advid = hex(adv_id)[2:]
  22. if rsp_info is not None and srv_info is not None:
  23. 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 + "'"):
  24. raise Exception("P2P_SERVICE_ADD with response info and service info failed")
  25. if rsp_info is None and srv_info is not None:
  26. 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 + "'"):
  27. raise Exception("P2P_SERVICE_ADD with service info failed")
  28. if rsp_info is None and srv_info is None:
  29. if "OK" not in r_dev.global_request("P2P_SERVICE_ADD asp " + str(r_role) + " " + str(advid) + " 1 1108 " + svc_name + " "):
  30. raise Exception("P2P_SERVICE_ADD without service info and without response info failed")
  31. if rsp_info is not None and srv_info is None:
  32. 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 + "'"):
  33. raise Exception("P2P_SERVICE_ADD with response info failed")
  34. r_dev.p2p_listen()
  35. return advid
  36. def p2ps_exact_seek(i_dev, r_dev, svc_name, srv_info=None):
  37. """P2PS exact service seek request"""
  38. if srv_info is not None:
  39. ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
  40. if ev1 is None:
  41. raise Exception("Failed to add Service Discovery request for exact seek request")
  42. if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek=" + svc_name):
  43. raise Exception("Failed to initiate seek operation")
  44. ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  45. if ev1 is None:
  46. raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
  47. if r_dev.p2p_dev_addr() not in ev1:
  48. raise Exception("Unexpected peer")
  49. if srv_info is None:
  50. adv_id = ev1.split("adv_id=")[1].split(" ")[0]
  51. rcvd_svc_name = ev1.split("asp_svc=")[1].split(" ")[0]
  52. if rcvd_svc_name != svc_name:
  53. raise Exception("service name not matching")
  54. else:
  55. ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
  56. if ev1 is None:
  57. raise Exception("Failed to receive Service Discovery Response")
  58. if r_dev.p2p_dev_addr() not in ev1:
  59. raise Exception("Service Discovery response from Unknown Peer")
  60. if srv_info is not None and srv_info not in ev1:
  61. raise Exception("service info not available in Service Discovery response")
  62. adv_id = ev1.split(" ")[3]
  63. rcvd_svc_name = ev1.split(" ")[6]
  64. if rcvd_svc_name != svc_name:
  65. raise Exception("service name not matching")
  66. return [adv_id, rcvd_svc_name]
  67. def p2ps_nonexact_seek(i_dev, r_dev, svc_name, srv_info=None, adv_num=None):
  68. """P2PS nonexact service seek request"""
  69. if adv_num is None:
  70. adv_num = 1
  71. if srv_info is not None:
  72. ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '" + srv_info + "'")
  73. else:
  74. ev1 = i_dev.global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 asp 1 " + svc_name + " '")
  75. if ev1 is None:
  76. raise Exception("Failed to add Service Discovery request for nonexact seek request")
  77. if "OK" not in i_dev.global_request("P2P_FIND 10 type=social seek="):
  78. raise Exception("Failed to initiate seek")
  79. ev1 = i_dev.wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  80. if ev1 is None:
  81. raise Exception("P2P-DEVICE-FOUND timeout on seeker side")
  82. if r_dev.p2p_dev_addr() not in ev1:
  83. raise Exception("Unexpected peer")
  84. ev_list = []
  85. for i in range (0, adv_num):
  86. ev1 = i_dev.wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
  87. if ev1 is None:
  88. raise Exception("Failed to receive Service Discovery Response")
  89. if r_dev.p2p_dev_addr() not in ev1:
  90. raise Exception("Service Discovery response from Unknown Peer")
  91. if srv_info is not None and srv_info not in ev1:
  92. raise Exception("service info not available in Service Discovery response")
  93. adv_id = ev1.split(" ")[3]
  94. rcvd_svc_name = ev1.split(" ")[6]
  95. ev_list.append(''.join([adv_id, ' ', rcvd_svc_name]))
  96. return ev_list
  97. def p2p_connect_p2ps_method(i_dev, r_dev, autoaccept):
  98. """P2PS connect function with p2ps method"""
  99. if autoaccept == False:
  100. if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " 12345670 p2ps persistent auth"):
  101. raise Exception("P2P_CONNECT fails on seeker side")
  102. ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  103. if ev0 is None:
  104. raise Exception("P2PS-PROV-DONE timeout on Advertiser side")
  105. if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " 12345670 p2ps persistent"):
  106. raise Exception("P2P_CONNECT fails on Advertiser side")
  107. else:
  108. if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " 12345670 p2ps persistent auth"):
  109. raise Exception("P2P_CONNECT fails on Advertiser side")
  110. ev1 = i_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=5)
  111. if ev1 is None:
  112. raise Exception("Failed to receive deferred acceptance at seeker")
  113. if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " 12345670 p2ps persistent"):
  114. raise Exception("P2P_CONNECT fails on seeker side")
  115. ev0 = r_dev.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
  116. if ev0 is None:
  117. raise Exception("GO Neg did not succeed")
  118. ev0 = r_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  119. if ev0 is None:
  120. raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
  121. ev1 = i_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=5)
  122. if ev1 is None:
  123. raise Exception("P2P-GROUP-STARTED timeout on seeker side")
  124. def p2ps_provision_keypad_method(i_dev, r_dev, autoaccept,
  125. initiator_or_responder):
  126. """P2PS keypad method provisioning function"""
  127. if autoaccept == False and initiator_or_responder == 'initiator':
  128. ev = i_dev.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
  129. if ev is None:
  130. raise Exception("Provisioning deferred on seeker side")
  131. ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
  132. if ev1 is None:
  133. raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on seeker side")
  134. if r_dev.p2p_dev_addr() not in ev1:
  135. raise Exception("Unknown peer ")
  136. ev = r_dev.wait_global_event(["P2PS-PROV-START"], timeout=10)
  137. if ev is None:
  138. raise Exception("P2PS-PROV-START timeout on Advertiser side")
  139. if autoaccept == False and initiator_or_responder == 'responder':
  140. ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  141. if ev0 is None:
  142. raise Exception("P2PS-PROV-DONE timeout on seeker side")
  143. ev0 = r_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=5)
  144. if ev0 is None:
  145. raise Exception("P2P-PROV-DISC-ENTER-PIN timeout on advertiser side")
  146. if autoaccept == True and initiator_or_responder == 'initiator':
  147. ev1 = i_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  148. if ev1 is None:
  149. raise Exception("P2PS-PROV-DONE timeout on seeker side")
  150. ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-ENTER-PIN"], timeout=10)
  151. if ev1 is None:
  152. raise Exception("P2P-PROV-DISC-ENTER-PIN failed on seeker side")
  153. if r_dev.p2p_dev_addr() not in ev1:
  154. raise Exception("Unknown peer ")
  155. return ev1
  156. def p2ps_provision_display_method(i_dev, r_dev, autoaccept,
  157. initiator_or_responder):
  158. """P2PS display method provisioning function"""
  159. if initiator_or_responder == 'initiator':
  160. ev0 = r_dev.wait_global_event(["P2PS-PROV-START"], timeout=10)
  161. if ev0 is None:
  162. raise Exception("P2PS-PROV-START timeout on Advertiser side")
  163. if autoaccept == False:
  164. ev = i_dev.wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=10)
  165. if ev is None:
  166. raise Exception("Provisioning deferred on seeker side")
  167. ev1 = i_dev.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=10)
  168. if ev1 is None:
  169. raise Exception("P2P-PROV-DISC-SHOW-PIN timeout on Seeker side")
  170. if r_dev.p2p_dev_addr() not in ev1:
  171. raise Exception("Unknown peer ")
  172. pin = ev1.split(" ")[2]
  173. else:
  174. ev0 = r_dev.wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  175. if ev0 is None:
  176. raise Exception("P2PS-PROV-DONE timeout on advertiser")
  177. ev0 = r_dev.wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  178. if ev0 is None:
  179. raise Exception("PIN Display on advertiser side")
  180. pin = ev0.split(" ")[2]
  181. return pin
  182. def p2ps_connect_pin(pin, i_dev, r_dev, initiator_method):
  183. """P2PS function to perform connection using PIN method"""
  184. if initiator_method=="display":
  185. if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " " + pin + " display persistent "):
  186. raise Exception("P2P_CONNECT fails on seeker side")
  187. ev0 = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  188. if ev0 is None:
  189. raise Exception("Failed to receive P2P_GO-NEG-REQUEST on responder side")
  190. if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " " + pin + " keypad persistent "):
  191. raise Exception("P2P_CONNECT fails on Advertiser side")
  192. else:
  193. if "OK" not in i_dev.global_request("P2P_CONNECT " + r_dev.p2p_dev_addr() + " " + pin + " keypad persistent "):
  194. raise Exception("P2P_CONNECT fails on seeker side")
  195. ev0 = r_dev.wait_global_event(["P2P-GO-NEG-REQUEST"], timeout=10)
  196. if ev0 is None:
  197. raise Exception("Failed to receive P2P_GO-NEG-REQUEST on responder side")
  198. if "OK" not in r_dev.global_request("P2P_CONNECT " + i_dev.p2p_dev_addr() + " " + pin + " display persistent "):
  199. raise Exception("P2P_CONNECT fails on Advertiser side")
  200. ev0 = r_dev.wait_global_event(["P2P-GO-NEG-SUCCESS"], timeout=10)
  201. if ev0 is None:
  202. raise Exception("GO Neg did not succeed on advertiser side")
  203. peer_mac = ev0.split("peer_dev=")[1].split(" ")[0]
  204. ev1 = i_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  205. if ev1 is None:
  206. raise Exception("P2P-GROUP-STARTED timeout on seeker side")
  207. ev_grpfrm = r_dev.wait_global_event(["P2P-GROUP-FORMATION-SUCCESS"],
  208. timeout=10)
  209. if ev_grpfrm is None:
  210. raise Exception("Group Formation failed on advertiser side")
  211. ev = r_dev.wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  212. if ev is None:
  213. raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
  214. Role = ev.split(" ")[2]
  215. if Role == "GO":
  216. ev_grpfrm = r_dev.wait_global_event(["AP-STA-CONNECTED"], timeout=10)
  217. if ev_grpfrm is None:
  218. raise Exception("AP-STA-CONNECTED timeout on advertiser side")
  219. if i_dev.p2p_dev_addr() not in ev_grpfrm:
  220. raise Exception("Group formed with unknown Peer")
  221. else:
  222. ev1 = i_dev.wait_global_event(["AP-STA-CONNECTED"], timeout=5)
  223. if ev1 is None:
  224. raise Exception("AP-STA-CONNECTED timeout on Seeker side")
  225. if r_dev.p2p_dev_addr() not in ev1:
  226. raise Exception("Group formed with unknown Peer")
  227. def test_p2ps_exact_search(dev):
  228. """P2PS exact service request"""
  229. addr0 = dev[0].p2p_dev_addr()
  230. addr1 = dev[1].p2p_dev_addr()
  231. p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
  232. srv_info='I can receive files upto size 2 GB')
  233. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  234. svc_name='org.wi-fi.wfds.send.rx')
  235. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  236. if ev0 is None:
  237. raise Exception("Unable to remove the advertisement instance")
  238. def test_p2ps_exact_search_srvinfo(dev):
  239. """P2PS exact service request with service info"""
  240. addr0 = dev[0].p2p_dev_addr()
  241. addr1 = dev[1].p2p_dev_addr()
  242. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
  243. srv_info='I can receive files upto size 2 GB')
  244. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  245. svc_name='org.wi-fi.wfds.send.rx',
  246. srv_info='2 GB')
  247. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  248. if ev0 is None:
  249. raise Exception("Unable to remove the advertisement instance")
  250. def test_p2ps_nonexact_search(dev):
  251. """P2PS nonexact seek request"""
  252. addr0 = dev[0].p2p_dev_addr()
  253. addr1 = dev[1].p2p_dev_addr()
  254. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.play.rx',
  255. srv_info='I support Miracast Mode ')
  256. ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
  257. svc_name='org.wi-fi.wfds.play*')
  258. adv_id = ev_list[0].split(" ")[0]
  259. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  260. if ev0 is None:
  261. raise Exception("Unable to remove the advertisement instance")
  262. def test_p2ps_nonexact_search_srvinfo(dev):
  263. """P2PS nonexact seek request with service info"""
  264. addr0 = dev[0].p2p_dev_addr()
  265. addr1 = dev[1].p2p_dev_addr()
  266. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
  267. srv_info='I can receive files upto size 2 GB')
  268. ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
  269. svc_name='org.wi-fi.wfds.send*',
  270. srv_info='2 GB')
  271. adv_id = ev_list[0].split(" ")[0]
  272. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  273. if ev0 is None:
  274. raise Exception("Unable to remove the advertisement instance")
  275. def test_p2ps_connect_p2ps_method_nonautoaccept(dev):
  276. """P2PS connect for non-auto-accept and P2PS config method"""
  277. addr0 = dev[0].p2p_dev_addr()
  278. addr1 = dev[1].p2p_dev_addr()
  279. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
  280. srv_info='I can receive files upto size 2 GB')
  281. ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
  282. svc_name='org.wi-fi.wfds.send*',
  283. srv_info='2 GB')
  284. adv_id = ev_list[0].split(" ")[0]
  285. 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"):
  286. raise Exception("Failed to request provisioning on seeker")
  287. ev0 = dev[0].wait_global_event(["P2PS-PROV-START"], timeout=10)
  288. if ev0 is None:
  289. raise Exception("P2PS-PROV-START timeout on advertiser side")
  290. ev1 = dev[1].wait_global_event(["P2P-PROV-DISC-FAILURE"], timeout=15)
  291. if ev1 is None:
  292. raise Exception("Provisioning deferred timeout on seeker side")
  293. dev[1].p2p_listen()
  294. 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"):
  295. raise Exception("Failed to send deferred acceptance from advertizer")
  296. ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=15)
  297. if ev1 is None:
  298. raise Exception("Failed to receive deferred acceptance at seeker")
  299. p2p_connect_p2ps_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False)
  300. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  301. if ev0 is None:
  302. raise Exception("Unable to remove the advertisement instance")
  303. remove_group(dev[0], dev[1])
  304. def test_p2ps_connect_p2ps_method_autoaccept(dev):
  305. """P2PS connection with P2PS default config method and auto-accept"""
  306. addr0 = dev[0].p2p_dev_addr()
  307. addr1 = dev[1].p2p_dev_addr()
  308. p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
  309. srv_info='I can receive files upto size 2 GB')
  310. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  311. svc_name='org.wi-fi.wfds.send.rx',
  312. srv_info='2 GB')
  313. 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"):
  314. raise Exception("P2P_ASP_PROVISION failed on seeker side")
  315. ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  316. if ev0 is None:
  317. raise Exception("P2PS-PROV-DONE timeout on advertiser side")
  318. p2p_connect_p2ps_method(i_dev=dev[1], r_dev=dev[0], autoaccept=True)
  319. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  320. if ev0 is None:
  321. raise Exception("Unable to remove the advertisement instance")
  322. remove_group(dev[0], dev[1])
  323. def test_p2ps_connect_keypad_method_nonautoaccept(dev):
  324. """P2PS Connection with non-auto-accept and seeker having keypad method"""
  325. addr0 = dev[0].p2p_dev_addr()
  326. addr1 = dev[1].p2p_dev_addr()
  327. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
  328. srv_info='I can receive files upto size 2 GB')
  329. ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
  330. svc_name='org.wi-fi.wfds.send*',
  331. srv_info='2 GB')
  332. adv_id = ev_list[0].split(" ")[0]
  333. 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
  334. raise Exception("Failed to request provisioning on seeker")
  335. p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False,
  336. initiator_or_responder='initiator')
  337. dev[1].p2p_listen()
  338. 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"):
  339. raise Exception("Failed to send deferred acceptance from advertizer")
  340. pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
  341. autoaccept=False,
  342. initiator_or_responder='responder')
  343. p2ps_connect_pin(pin, i_dev=dev[0], r_dev=dev[1],
  344. initiator_method="display")
  345. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  346. if ev0 is None:
  347. raise Exception("Unable to remove the advertisement instance")
  348. remove_group(dev[0], dev[1])
  349. def test_p2ps_connect_display_method_nonautoaccept(dev):
  350. """P2PS connection with non-auto-accept and seeker having display method"""
  351. addr0 = dev[0].p2p_dev_addr()
  352. addr1 = dev[1].p2p_dev_addr()
  353. p2ps_advertise(r_dev=dev[0], r_role='0', svc_name='org.wi-fi.wfds.send.rx',
  354. srv_info='I can receive files upto size 2 GB')
  355. ev_list = p2ps_nonexact_seek(i_dev=dev[1], r_dev=dev[0],
  356. svc_name='org.wi-fi.wfds*', srv_info='2 GB')
  357. adv_id = ev_list[0].split(" ")[0]
  358. 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
  359. raise Exception("Failed to request provisioning on seeker")
  360. pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
  361. autoaccept=False,
  362. initiator_or_responder='initiator')
  363. dev[1].p2p_listen()
  364. 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"):
  365. raise Exception("Failed to send deferred acceptance from advertiser")
  366. p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=False,
  367. initiator_or_responder='responder')
  368. p2ps_connect_pin(pin, i_dev=dev[0], r_dev=dev[1], initiator_method="keypad")
  369. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  370. if ev0 is None:
  371. raise Exception("Unable to remove the advertisement instance")
  372. remove_group(dev[0], dev[1])
  373. def test_p2ps_connect_keypad_method_autoaccept(dev):
  374. """P2PS connection with auto-accept and keypad method on seeker side"""
  375. addr0 = dev[0].p2p_dev_addr()
  376. addr1 = dev[1].p2p_dev_addr()
  377. p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
  378. srv_info='I can receive files upto size 2 GB')
  379. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  380. svc_name='org.wi-fi.wfds.send.rx',
  381. srv_info='2 GB')
  382. 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
  383. raise Exception("Failed to request provisioning on seeker")
  384. p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0], autoaccept=True,
  385. initiator_or_responder='initiator')
  386. pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
  387. autoaccept=True,
  388. initiator_or_responder='responder')
  389. p2ps_connect_pin(pin, i_dev=dev[1], r_dev=dev[0], initiator_method="Keypad")
  390. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  391. if ev0 is None:
  392. raise Exception("Unable to remove the advertisement instance")
  393. remove_group(dev[0], dev[1])
  394. def test_p2ps_connect_display_method_autoaccept(dev):
  395. """P2PS connection with auto-accept and display method on seeker side"""
  396. addr0 = dev[0].p2p_dev_addr()
  397. addr1 = dev[1].p2p_dev_addr()
  398. p2ps_advertise(r_dev=dev[0], r_role='1', svc_name='org.wi-fi.wfds.send.rx',
  399. srv_info='I can receive files upto size 2 GB')
  400. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  401. svc_name='org.wi-fi.wfds.send.rx',
  402. srv_info='2 GB')
  403. 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
  404. raise Exception("Failed to request provisioning on seeker")
  405. pin = p2ps_provision_display_method(i_dev=dev[1], r_dev=dev[0],
  406. autoaccept=True,
  407. initiator_or_responder='initiator')
  408. dev[1].p2p_listen()
  409. p2ps_connect_pin(pin, i_dev=dev[1], r_dev=dev[0], initiator_method="display")
  410. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  411. if ev0 is None:
  412. raise Exception("Unable to remove the advertisement instance")
  413. remove_group(dev[0], dev[1])
  414. def test_p2ps_connect_adv_go_p2ps_method(dev):
  415. """P2PS auto-accept connection with advertisement as GO and P2PS method"""
  416. addr0 = dev[0].p2p_dev_addr()
  417. addr1 = dev[1].p2p_dev_addr()
  418. p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
  419. srv_info='I can receive files upto size 2 GB')
  420. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  421. svc_name='org.wi-fi.wfds.send.rx',
  422. srv_info='2 GB')
  423. 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"):
  424. raise Exception("Failed to request provisioning on seeker")
  425. ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  426. if ev0 is None:
  427. raise Exception("Timed out while waiting for prov done on advertizer")
  428. if "go=" not in ev0:
  429. raise Exception("Advertiser failed to become GO")
  430. adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
  431. if adv_conncap == "4":
  432. logger.info("Advertiser is GO")
  433. ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  434. if ev0 is None:
  435. raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
  436. ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  437. if ev1 is None:
  438. raise Exception("P2PS-PROV-DONE timeout on seeker side")
  439. seeker_conncap = ev1.split("conncap=")[1].split(" ")[0]
  440. if "join=" in ev1:
  441. if "OK" not in dev[1].global_request("P2P_CONNECT " + addr0 + " 12345670 p2ps persistent join"):
  442. raise Exception("P2P_CONNECT failed on seeker side")
  443. ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  444. if ev1 is None:
  445. raise Exception("P2P-GROUP-STARTED timeout on seeker side")
  446. ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
  447. if ev0 is None:
  448. raise Exception("AP-STA-CONNECTED timeout on advertiser side")
  449. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  450. if ev0 is None:
  451. raise Exception("Unable to remove the advertisement instance")
  452. remove_group(dev[0], dev[1])
  453. def test_p2ps_connect_adv_client_p2ps_method(dev):
  454. """P2PS auto-accept connection with advertisement as Client and P2PS method"""
  455. addr0 = dev[0].p2p_dev_addr()
  456. addr1 = dev[1].p2p_dev_addr()
  457. p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
  458. srv_info='I can receive files upto size 2 GB')
  459. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  460. svc_name='org.wi-fi.wfds.send.rx',
  461. srv_info='2 GB')
  462. 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"):
  463. raise Exception("Failed to request provisioning on seeker")
  464. ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  465. if ev0 is None:
  466. raise Exception("P2PS-PROV-DONE timeout on advertiser side")
  467. if "join=" not in ev0:
  468. raise Exception("Advertiser failed to become Client")
  469. adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
  470. if adv_conncap == "2":
  471. logger.info("Advertiser is Client")
  472. ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=5)
  473. if ev1 is None:
  474. raise Exception("Provisioning failed on seeker side")
  475. seeker_conncap = ev1.split("conncap=")[1].split(" ")[0]
  476. ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  477. if ev1 is None:
  478. raise Exception("P2P-GROUP-STARTED timeout on seeker side")
  479. if "join=" in ev0:
  480. if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 p2ps persistent join"):
  481. raise Exception("P2P_CONNECT failed on seeker side")
  482. ev0 = dev[0].wait_global_event(["P2P-GROUP-FORMATION-SUCCESS"], timeout=15)
  483. if ev0 is None:
  484. raise Exception("P2P Group Formation failed on advertiser side")
  485. ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  486. if ev0 is None:
  487. raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
  488. ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
  489. if ev1 is None:
  490. raise Exception("Group formation failed")
  491. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  492. if ev0 is None:
  493. raise Exception("Unable to remove the advertisement instance")
  494. remove_group(dev[0], dev[1])
  495. def test_p2ps_connect_adv_go_pin_method(dev):
  496. """P2PS advertiser as GO with keypad config method on seeker side and auto-accept"""
  497. addr0 = dev[0].p2p_dev_addr()
  498. addr1 = dev[1].p2p_dev_addr()
  499. p2ps_advertise(r_dev=dev[0], r_role='4', svc_name='org.wi-fi.wfds.send.rx',
  500. srv_info='I can receive files upto size 2 GB')
  501. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  502. svc_name='org.wi-fi.wfds.send.rx',
  503. srv_info='2 GB')
  504. 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
  505. raise Exception("Failed to request provisioning on seeker")
  506. seek_prov_ev = p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0],
  507. autoaccept=True,
  508. initiator_or_responder='initiator')
  509. ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  510. if ev0 is None:
  511. raise Exception("P2PS-PROV-DONE timeout on advertier side")
  512. adv_conncap = ev0.split("conncap=")[1].split(" ")[0]
  513. if adv_conncap == "4":
  514. logger.info("Advertiser is GO")
  515. ev0 = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"], timeout=5)
  516. if ev0 is None:
  517. raise Exception("PIN Display on advertiser side")
  518. pin = ev0.split(" ")[2]
  519. ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  520. if ev0 is None:
  521. raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
  522. ev0 = dev[0].group_request("WPS_PIN any " + pin)
  523. if ev0 is None:
  524. raise Exception("Failed to initiate Pin authorization on registrar side")
  525. if "join=" in seek_prov_ev:
  526. if "OK" not in dev[1].global_request("P2P_CONNECT " + addr0 + " " + pin + " keypad persistent join"):
  527. raise Exception("P2P_CONNECT failed on seeker side")
  528. ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  529. if ev1 is None:
  530. raise Exception("P2P-GROUP-STARTED timeout on seeker side")
  531. ev0 = dev[0].wait_global_event(["AP-STA-CONNECTED"], timeout=10)
  532. if ev0 is None:
  533. raise Exception("AP-STA-CONNECTED timeout on advertiser side")
  534. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  535. if ev0 is None:
  536. raise Exception("Unable to remove the advertisement instance")
  537. remove_group(dev[0], dev[1])
  538. def test_p2ps_connect_adv_client_pin_method(dev):
  539. """P2PS advertiser as client with keypad config method on seeker side and auto-accept"""
  540. addr0 = dev[0].p2p_dev_addr()
  541. addr1 = dev[1].p2p_dev_addr()
  542. dev[0].flush_scan_cache()
  543. p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
  544. srv_info='I can receive files upto size 2 GB')
  545. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  546. svc_name='org.wi-fi.wfds.send.rx',
  547. srv_info='2 GB')
  548. 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
  549. raise Exception("Failed to request provisioning on seeker")
  550. seek_prov_ev = p2ps_provision_keypad_method(i_dev=dev[1], r_dev=dev[0],
  551. autoaccept=True,
  552. initiator_or_responder='initiator')
  553. adv_prov = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  554. if adv_prov is None:
  555. raise Exception("Prov failed on advertiser")
  556. adv_conncap = adv_prov.split("conncap=")[1].split(" ")[0]
  557. if adv_conncap == "2":
  558. logger.info("Advertiser is Client")
  559. adv_pin_show_event = dev[0].wait_global_event(["P2P-PROV-DISC-SHOW-PIN"],
  560. timeout=5)
  561. if adv_pin_show_event is None:
  562. raise Exception("PIN Display on advertiser side")
  563. pin = adv_pin_show_event.split(" ")[2]
  564. ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  565. if ev1 is None:
  566. raise Exception("P2P-GROUP-STARTED timeout on seeker side")
  567. ev1 = dev[1].group_request("WPS_PIN any " + pin)
  568. if ev1 is None:
  569. raise Exception("Failed to initiate Pin authorization on registrar side")
  570. if "join=" in adv_prov:
  571. if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " " + pin + " display persistent join"):
  572. raise Exception("P2P_CONNECT failed on advertiser side")
  573. ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=10)
  574. if ev0 is None:
  575. raise Exception("Group formation failed to start on seeker side")
  576. ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=10)
  577. if ev1 is None:
  578. raise Exception("AP-STA-CONNECTED timeout on advertiser side")
  579. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  580. if ev0 is None:
  581. raise Exception("Unable to remove the advertisement instance")
  582. remove_group(dev[0], dev[1])
  583. def test_p2ps_service_discovery_multiple_queries(dev):
  584. """P2P service discovery with multiple queries"""
  585. addr0 = dev[0].p2p_dev_addr()
  586. addr1 = dev[1].p2p_dev_addr()
  587. adv_id1 = p2ps_advertise(r_dev=dev[0], r_role='0',
  588. svc_name='org.wi-fi.wfds.send.tx',
  589. srv_info='I can transfer files upto size of 2 GB')
  590. adv_id2 = p2ps_advertise(r_dev=dev[0], r_role='0',
  591. svc_name='org.wi-fi.wfds.send.rx',
  592. srv_info='I can receive files upto size of 2 GB')
  593. adv_id3 = p2ps_advertise(r_dev=dev[0], r_role='1',
  594. svc_name='org.wi-fi.wfds.display.tx',
  595. srv_info='Miracast Mode')
  596. adv_id4 = p2ps_advertise(r_dev=dev[0], r_role='1',
  597. svc_name='org.wi-fi.wfds.display.rx',
  598. srv_info='Miracast Mode')
  599. dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 1 org.wi-fi.wfds.display.tx 'Miracast Mode'")
  600. dev[1].global_request("P2P_FIND 10 type=social seek=org.wi-fi.wfds.display.tx")
  601. dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " asp 2 org.wi-fi.wfds.send* 'size of 2 GB'")
  602. dev[1].p2p_stop_find()
  603. dev[1].global_request("P2P_FIND 10 type=social seek=")
  604. ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  605. if ev is None:
  606. raise Exception("P2P Device Found timed out")
  607. if addr0 not in ev:
  608. raise Exception("Unexpected service discovery request source")
  609. ev_list = []
  610. for i in range(0, 3):
  611. ev = dev[1].wait_global_event(["P2P-SERV-ASP-RESP"], timeout=10)
  612. if ev is None:
  613. raise Exception("P2P Service discovery timed out")
  614. if addr0 in ev:
  615. ev_list.append(ev)
  616. if len(ev_list) == 3:
  617. break
  618. dev[1].p2p_stop_find()
  619. for test in [ ("seek=org.wi-fi.wfds.display.TX",
  620. "asp_svc=org.wi-fi.wfds.display.tx"),
  621. ("seek=foo seek=org.wi-fi.wfds.display.tx seek=bar",
  622. "asp_svc=org.wi-fi.wfds.display.tx"),
  623. ("seek=1 seek=2 seek=3 seek=org.wi-fi.wfds.display.tx seek=4 seek=5 seek=6",
  624. "asp_svc=org.wi-fi.wfds.display.tx"),
  625. ("seek=not-found", None),
  626. ("seek=org.wi-fi.wfds", "asp_svc=org.wi-fi.wfds")]:
  627. dev[2].global_request("P2P_FIND 10 type=social " + test[0])
  628. if test[1] is None:
  629. ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=1)
  630. if ev is not None:
  631. raise Exception("Unexpected device found: " + ev)
  632. continue
  633. ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  634. if ev is None:
  635. raise Exception("P2P device discovery timed out (dev2)")
  636. if test[1] not in ev:
  637. raise Exception("Expected asp_svc not reported: " + ev)
  638. dev[2].p2p_stop_find()
  639. dev[2].request("P2P_FLUSH")
  640. dev[0].p2p_stop_find()
  641. ev1 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id1))
  642. if ev1 is None:
  643. raise Exception("Unable to remove the advertisement instance")
  644. ev2 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id2))
  645. if ev2 is None:
  646. raise Exception("Unable to remove the advertisement instance")
  647. ev3 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id3))
  648. if ev3 is None:
  649. raise Exception("Unable to remove the advertisement instance")
  650. ev4 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id4))
  651. if ev4 is None:
  652. raise Exception("Unable to remove the advertisement instance")
  653. if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
  654. raise Exception("P2P_SERVICE_ADD failed")
  655. if "OK" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.foobar svc_info='Test'"):
  656. raise Exception("P2P_SERVICE_REP failed")
  657. if "FAIL" not in dev[0].global_request("P2P_SERVICE_REP asp 1 12345678 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
  658. raise Exception("Invalid P2P_SERVICE_REP accepted")
  659. if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345678 1 1108 org.wi-fi.wfds.something svc_info='Test'"):
  660. raise Exception("P2P_SERVICE_ADD failed")
  661. if "OK" not in dev[0].global_request("P2P_SERVICE_ADD asp 1 a2345679 1 1108 org.wi-fi.wfds.Foo svc_info='Test'"):
  662. raise Exception("P2P_SERVICE_ADD failed")
  663. def get_ifnames():
  664. with open('/proc/net/dev', 'r') as f:
  665. data = f.read()
  666. ifnames = []
  667. for line in data.splitlines():
  668. ifname = line.strip().split(' ')[0]
  669. if ':' not in ifname:
  670. continue
  671. ifname = ifname.split(':')[0]
  672. ifnames.append(ifname)
  673. return ifnames
  674. def p2ps_connect_p2ps_method(dev):
  675. addr0 = dev[0].p2p_dev_addr()
  676. addr1 = dev[1].p2p_dev_addr()
  677. dev[0].flush_scan_cache()
  678. dev[1].flush_scan_cache()
  679. p2ps_advertise(r_dev=dev[0], r_role='2', svc_name='org.wi-fi.wfds.send.rx',
  680. srv_info='I can receive files upto size 2 GB')
  681. [adv_id, rcvd_svc_name] = p2ps_exact_seek(i_dev=dev[1], r_dev=dev[0],
  682. svc_name='org.wi-fi.wfds.send.rx',
  683. srv_info='2 GB')
  684. 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"):
  685. raise Exception("Failed to request provisioning on seeker")
  686. ev0 = dev[0].wait_global_event(["P2PS-PROV-DONE"], timeout=10)
  687. if ev0 is None:
  688. raise Exception("P2PS-PROV-DONE timeout on advertiser side")
  689. if "join=" not in ev0:
  690. raise Exception("join parameter missing from P2PS-PROV-DONE")
  691. ev1 = dev[1].wait_global_event(["P2PS-PROV-DONE"], timeout=5)
  692. if ev1 is None:
  693. raise Exception("Provisioning failed on seeker side")
  694. ev1 = dev[1].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  695. if ev1 is None:
  696. raise Exception("P2P-GROUP-STARTED timeout on seeker side")
  697. res1 = dev[1].group_form_result(ev1)
  698. ifnames1 = get_ifnames()
  699. if "OK" not in dev[0].global_request("P2P_CONNECT " + addr1 + " 12345670 p2ps persistent join"):
  700. raise Exception("P2P_CONNECT failed on seeker side")
  701. ev0 = dev[0].wait_global_event(["P2P-GROUP-STARTED"], timeout=15)
  702. if ev0 is None:
  703. raise Exception("P2P-GROUP-STARTED timeout on advertiser side")
  704. res0 = dev[0].group_form_result(ev0)
  705. ev1 = dev[1].wait_global_event(["AP-STA-CONNECTED"], timeout=5)
  706. if ev1 is None:
  707. raise Exception("Group formation failed")
  708. ev0 = dev[0].global_request("P2P_SERVICE_DEL asp " + str(adv_id))
  709. if ev0 is None:
  710. raise Exception("Unable to remove the advertisement instance")
  711. ifnames2 = get_ifnames()
  712. remove_group(dev[0], dev[1])
  713. ifnames3 = get_ifnames()
  714. return (res0, res1, ifnames1 + ifnames2 + ifnames3)
  715. def has_string_prefix(vals, prefix):
  716. for val in vals:
  717. if val.startswith(prefix):
  718. return True
  719. return False
  720. def test_p2ps_connect_p2ps_method_1(dev):
  721. """P2PS connection with P2PS method - no group interface"""
  722. (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
  723. if res0['ifname'] != dev[0].ifname:
  724. raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
  725. if res1['ifname'] != dev[1].ifname:
  726. raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
  727. if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
  728. raise Exception("dev0 group interface unexpectedly present")
  729. if has_string_prefix(ifnames, 'p2p-' + res1['ifname']):
  730. raise Exception("dev1 group interface unexpectedly present")
  731. def test_p2ps_connect_p2ps_method_2(dev):
  732. """P2PS connection with P2PS method - group interface on dev0"""
  733. dev[0].request("SET p2p_no_group_iface 0")
  734. (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
  735. if not res0['ifname'].startswith('p2p-' + dev[0].ifname + '-'):
  736. raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
  737. if res1['ifname'] != dev[1].ifname:
  738. raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
  739. if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
  740. raise Exception("dev0 group interface unexpectedly present")
  741. def test_p2ps_connect_p2ps_method_3(dev):
  742. """P2PS connection with P2PS method - group interface on dev1"""
  743. dev[1].request("SET p2p_no_group_iface 0")
  744. (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
  745. if res0['ifname'] != dev[0].ifname:
  746. raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
  747. if not res1['ifname'].startswith('p2p-' + dev[1].ifname + '-'):
  748. raise Exception("unexpected dev1 group ifname: " + res1['ifname'])
  749. if has_string_prefix(ifnames, 'p2p-' + res0['ifname']):
  750. raise Exception("dev0 group interface unexpectedly present")
  751. def test_p2ps_connect_p2ps_method_4(dev):
  752. """P2PS connection with P2PS method - group interface on both"""
  753. dev[0].request("SET p2p_no_group_iface 0")
  754. dev[1].request("SET p2p_no_group_iface 0")
  755. (res0, res1, ifnames) = p2ps_connect_p2ps_method(dev)
  756. if not res0['ifname'].startswith('p2p-' + dev[0].ifname + '-'):
  757. raise Exception("unexpected dev0 group ifname: " + res0['ifname'])
  758. if not res1['ifname'].startswith('p2p-' + dev[1].ifname + '-'):
  759. raise Exception("unexpected dev1 group ifname: " + res1['ifname'])