test_p2p_service.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512
  1. # P2P service discovery test cases
  2. # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
  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 uuid
  10. import hwsim_utils
  11. def add_bonjour_services(dev):
  12. dev.global_request("P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027")
  13. dev.global_request("P2P_SERVICE_ADD bonjour 076578616d706c650b5f6166706f766572746370c00c001001 00")
  14. dev.global_request("P2P_SERVICE_ADD bonjour 045f697070c00c000c01 094d795072696e746572c027")
  15. dev.global_request("P2P_SERVICE_ADD bonjour 096d797072696e746572045f697070c00c001001 09747874766572733d311a70646c3d6170706c69636174696f6e2f706f7374736372797074")
  16. def add_upnp_services(dev):
  17. dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice")
  18. dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:5566d33e-9774-09ab-4822-333456785632::upnp:rootdevice")
  19. dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:1122de4e-8574-59ab-9322-333456789044::urn:schemas-upnp-org:service:ContentDirectory:2")
  20. dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:5566d33e-9774-09ab-4822-333456785632::urn:schemas-upnp-org:service:ContentDirectory:2")
  21. dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp-org:device:InternetGatewayDevice:1")
  22. def add_extra_services(dev):
  23. for i in range(0, 100):
  24. dev.global_request("P2P_SERVICE_ADD upnp 10 uuid:" + str(uuid.uuid4()) + "::upnp:rootdevice")
  25. def run_sd(dev, dst, query, exp_query=None, fragment=False, query2=None):
  26. addr0 = dev[0].p2p_dev_addr()
  27. addr1 = dev[1].p2p_dev_addr()
  28. add_bonjour_services(dev[0])
  29. add_upnp_services(dev[0])
  30. if fragment:
  31. add_extra_services(dev[0])
  32. dev[0].p2p_listen()
  33. dev[1].global_request("P2P_FLUSH")
  34. dev[1].global_request("P2P_SERV_DISC_REQ " + dst + " " + query)
  35. if query2:
  36. dev[1].global_request("P2P_SERV_DISC_REQ " + dst + " " + query2)
  37. if not dev[1].discover_peer(addr0, social=True, force_find=True):
  38. raise Exception("Peer " + addr0 + " not found")
  39. ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
  40. if ev is None:
  41. raise Exception("Service discovery timed out")
  42. if addr1 not in ev:
  43. raise Exception("Unexpected service discovery request source")
  44. if exp_query is None:
  45. exp_query = query
  46. if exp_query not in ev and (query2 is None or query2 not in ev):
  47. raise Exception("Unexpected service discovery request contents")
  48. if query2:
  49. ev_list = []
  50. for i in range(0, 4):
  51. ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
  52. if ev is None:
  53. raise Exception("Service discovery timed out")
  54. if addr0 in ev:
  55. ev_list.append(ev)
  56. if len(ev_list) == 2:
  57. break
  58. return ev_list
  59. for i in range(0, 2):
  60. ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
  61. if ev is None:
  62. raise Exception("Service discovery timed out")
  63. if addr0 in ev:
  64. break
  65. dev[0].p2p_stop_find()
  66. dev[1].p2p_stop_find()
  67. if "OK" not in dev[0].global_request("P2P_SERVICE_DEL upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"):
  68. raise Exception("Failed to delete a UPnP service")
  69. if "FAIL" not in dev[0].global_request("P2P_SERVICE_DEL upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"):
  70. raise Exception("Unexpected deletion success for UPnP service")
  71. if "OK" not in dev[0].global_request("P2P_SERVICE_DEL bonjour 0b5f6166706f766572746370c00c000c01"):
  72. raise Exception("Failed to delete a Bonjour service")
  73. if "FAIL" not in dev[0].global_request("P2P_SERVICE_DEL bonjour 0b5f6166706f766572746370c00c000c01"):
  74. raise Exception("Unexpected deletion success for Bonjour service")
  75. return ev
  76. def test_p2p_service_discovery(dev):
  77. """P2P service discovery"""
  78. addr0 = dev[0].p2p_dev_addr()
  79. for dst in [ "00:00:00:00:00:00", addr0 ]:
  80. ev = run_sd(dev, dst, "02000001")
  81. if "0b5f6166706f766572746370c00c000c01" not in ev:
  82. raise Exception("Unexpected service discovery response contents (Bonjour)")
  83. if "496e7465726e6574" not in ev:
  84. raise Exception("Unexpected service discovery response contents (UPnP)")
  85. for req in [ "foo 02000001",
  86. addr0,
  87. addr0 + " upnp qq urn:schemas-upnp-org:device:InternetGatewayDevice:1",
  88. addr0 + " upnp 10",
  89. addr0 + " 123",
  90. addr0 + " qq" ]:
  91. if "FAIL" not in dev[1].global_request("P2P_SERV_DISC_REQ " + req):
  92. raise Exception("Invalid P2P_SERV_DISC_REQ accepted: " + req)
  93. def test_p2p_service_discovery2(dev):
  94. """P2P service discovery with one peer having no services"""
  95. dev[2].p2p_listen()
  96. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  97. ev = run_sd(dev, dst, "02000001")
  98. if "0b5f6166706f766572746370c00c000c01" not in ev:
  99. raise Exception("Unexpected service discovery response contents (Bonjour)")
  100. if "496e7465726e6574" not in ev:
  101. raise Exception("Unexpected service discovery response contents (UPnP)")
  102. def test_p2p_service_discovery3(dev):
  103. """P2P service discovery for Bonjour with one peer having no services"""
  104. dev[2].p2p_listen()
  105. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  106. ev = run_sd(dev, dst, "02000101")
  107. if "0b5f6166706f766572746370c00c000c01" not in ev:
  108. raise Exception("Unexpected service discovery response contents (Bonjour)")
  109. def test_p2p_service_discovery4(dev):
  110. """P2P service discovery for UPnP with one peer having no services"""
  111. dev[2].p2p_listen()
  112. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  113. ev = run_sd(dev, dst, "02000201")
  114. if "496e7465726e6574" not in ev:
  115. raise Exception("Unexpected service discovery response contents (UPnP)")
  116. def test_p2p_service_discovery_multiple_queries(dev):
  117. """P2P service discovery with multiple queries"""
  118. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  119. ev = run_sd(dev, dst, "02000201", query2="02000101")
  120. if "0b5f6166706f766572746370c00c000c01" not in ev[0] + ev[1]:
  121. raise Exception("Unexpected service discovery response contents (Bonjour)")
  122. if "496e7465726e6574" not in ev[0] + ev[1]:
  123. raise Exception("Unexpected service discovery response contents (UPnP)")
  124. def test_p2p_service_discovery_multiple_queries2(dev):
  125. """P2P service discovery with multiple queries with one peer having no services"""
  126. dev[2].p2p_listen()
  127. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  128. ev = run_sd(dev, dst, "02000201", query2="02000101")
  129. if "0b5f6166706f766572746370c00c000c01" not in ev[0] + ev[1]:
  130. raise Exception("Unexpected service discovery response contents (Bonjour)")
  131. if "496e7465726e6574" not in ev[0] + ev[1]:
  132. raise Exception("Unexpected service discovery response contents (UPnP)")
  133. def test_p2p_service_discovery_fragmentation(dev):
  134. """P2P service discovery with fragmentation"""
  135. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  136. ev = run_sd(dev, dst, "02000001", fragment=True)
  137. if not "long response" in ev:
  138. if "0b5f6166706f766572746370c00c000c01" not in ev:
  139. raise Exception("Unexpected service discovery response contents (Bonjour)")
  140. if "496e7465726e6574" not in ev:
  141. raise Exception("Unexpected service discovery response contents (UPnP)")
  142. def test_p2p_service_discovery_bonjour(dev):
  143. """P2P service discovery (Bonjour)"""
  144. ev = run_sd(dev, "00:00:00:00:00:00", "02000101")
  145. if "0b5f6166706f766572746370c00c000c01" not in ev:
  146. raise Exception("Unexpected service discovery response contents (Bonjour)")
  147. if "045f697070c00c000c01" not in ev:
  148. raise Exception("Unexpected service discovery response contents (Bonjour)")
  149. if "496e7465726e6574" in ev:
  150. raise Exception("Unexpected service discovery response contents (UPnP not expected)")
  151. def test_p2p_service_discovery_bonjour2(dev):
  152. """P2P service discovery (Bonjour AFS)"""
  153. ev = run_sd(dev, "00:00:00:00:00:00", "130001010b5f6166706f766572746370c00c000c01")
  154. if "0b5f6166706f766572746370c00c000c01" not in ev:
  155. raise Exception("Unexpected service discovery response contents (Bonjour)")
  156. if "045f697070c00c000c01" in ev:
  157. raise Exception("Unexpected service discovery response contents (Bonjour mismatching)")
  158. if "496e7465726e6574" in ev:
  159. raise Exception("Unexpected service discovery response contents (UPnP not expected)")
  160. def test_p2p_service_discovery_bonjour3(dev):
  161. """P2P service discovery (Bonjour AFS - no match)"""
  162. ev = run_sd(dev, "00:00:00:00:00:00", "130001010b5f6166706f766572746370c00c000c02")
  163. if "0300010102" not in ev:
  164. raise Exception("Requested-info-not-available was not indicated")
  165. if "0b5f6166706f766572746370c00c000c01" in ev:
  166. raise Exception("Unexpected service discovery response contents (Bonjour)")
  167. if "045f697070c00c000c01" in ev:
  168. raise Exception("Unexpected service discovery response contents (Bonjour mismatching)")
  169. if "496e7465726e6574" in ev:
  170. raise Exception("Unexpected service discovery response contents (UPnP not expected)")
  171. def test_p2p_service_discovery_upnp(dev):
  172. """P2P service discovery (UPnP)"""
  173. ev = run_sd(dev, "00:00:00:00:00:00", "02000201")
  174. if "0b5f6166706f766572746370c00c000c01" in ev:
  175. raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
  176. if "496e7465726e6574" not in ev:
  177. raise Exception("Unexpected service discovery response contents (UPnP)")
  178. def test_p2p_service_discovery_upnp2(dev):
  179. """P2P service discovery (UPnP using request helper)"""
  180. ev = run_sd(dev, "00:00:00:00:00:00", "upnp 10 ssdp:all", "0b00020110737364703a616c6c")
  181. if "0b5f6166706f766572746370c00c000c01" in ev:
  182. raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
  183. if "496e7465726e6574" not in ev:
  184. raise Exception("Unexpected service discovery response contents (UPnP)")
  185. def test_p2p_service_discovery_upnp3(dev):
  186. """P2P service discovery (UPnP using request helper - no match)"""
  187. ev = run_sd(dev, "00:00:00:00:00:00", "upnp 10 ssdp:foo", "0b00020110737364703a666f6f")
  188. if "0300020102" not in ev:
  189. raise Exception("Requested-info-not-available was not indicated")
  190. if "0b5f6166706f766572746370c00c000c01" in ev:
  191. raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
  192. if "496e7465726e6574" in ev:
  193. raise Exception("Unexpected service discovery response contents (UPnP)")
  194. def test_p2p_service_discovery_ws(dev):
  195. """P2P service discovery (WS-Discovery)"""
  196. ev = run_sd(dev, "00:00:00:00:00:00", "02000301")
  197. if "0b5f6166706f766572746370c00c000c01" in ev:
  198. raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
  199. if "496e7465726e6574" in ev:
  200. raise Exception("Unexpected service discovery response contents (UPnP not expected)")
  201. if "0300030101" not in ev:
  202. raise Exception("Unexpected service discovery response contents (WS)")
  203. def test_p2p_service_discovery_wfd(dev):
  204. """P2P service discovery (Wi-Fi Display)"""
  205. dev[0].global_request("SET wifi_display 1")
  206. ev = run_sd(dev, "00:00:00:00:00:00", "02000401")
  207. if " 030004" in ev:
  208. raise Exception("Unexpected response to invalid WFD SD query")
  209. dev[0].global_request("SET wifi_display 0")
  210. ev = run_sd(dev, "00:00:00:00:00:00", "0300040100")
  211. if "0300040101" not in ev:
  212. raise Exception("Unexpected response to WFD SD query (protocol was disabled)")
  213. def test_p2p_service_discovery_req_cancel(dev):
  214. """Cancel a P2P service discovery request"""
  215. if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ ab"):
  216. raise Exception("Unexpected SD cancel success")
  217. if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ qq"):
  218. raise Exception("Unexpected SD cancel success")
  219. query = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000001")
  220. if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query):
  221. raise Exception("Unexpected SD cancel failure")
  222. query1 = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000001")
  223. query2 = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000002")
  224. query3 = dev[0].global_request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000003")
  225. if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query2):
  226. raise Exception("Unexpected SD cancel failure")
  227. if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query1):
  228. raise Exception("Unexpected SD cancel failure")
  229. if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query3):
  230. raise Exception("Unexpected SD cancel failure")
  231. query = dev[0].global_request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 02000001")
  232. if "OK" not in dev[0].global_request("P2P_SERV_DISC_CANCEL_REQ " + query):
  233. raise Exception("Unexpected SD(broadcast) cancel failure")
  234. def test_p2p_service_discovery_go(dev):
  235. """P2P service discovery from GO"""
  236. addr0 = dev[0].p2p_dev_addr()
  237. addr1 = dev[1].p2p_dev_addr()
  238. add_bonjour_services(dev[0])
  239. add_upnp_services(dev[0])
  240. dev[0].p2p_start_go(freq=2412)
  241. dev[1].global_request("P2P_FLUSH")
  242. dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
  243. if not dev[1].discover_peer(addr0, social=True, force_find=True):
  244. raise Exception("Peer " + addr0 + " not found")
  245. ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
  246. if ev is None:
  247. raise Exception("Service discovery timed out")
  248. if addr1 not in ev:
  249. raise Exception("Unexpected service discovery request source")
  250. ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
  251. if ev is None:
  252. raise Exception("Service discovery timed out")
  253. if addr0 not in ev:
  254. raise Exception("Unexpected service discovery response source")
  255. if "0b5f6166706f766572746370c00c000c01" not in ev:
  256. raise Exception("Unexpected service discovery response contents (Bonjour)")
  257. if "496e7465726e6574" not in ev:
  258. raise Exception("Unexpected service discovery response contents (UPnP)")
  259. dev[1].p2p_stop_find()
  260. dev[0].global_request("P2P_SERVICE_FLUSH")
  261. dev[1].global_request("P2P_FLUSH")
  262. dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
  263. if not dev[1].discover_peer(addr0, social=True, force_find=True):
  264. raise Exception("Peer " + addr0 + " not found")
  265. ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
  266. if ev is None:
  267. raise Exception("Service discovery timed out")
  268. if addr1 not in ev:
  269. raise Exception("Unexpected service discovery request source")
  270. ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=10)
  271. if ev is None:
  272. raise Exception("Service discovery timed out")
  273. if addr0 not in ev:
  274. raise Exception("Unexpected service discovery response source")
  275. if "0300000101" not in ev:
  276. raise Exception("Unexpected service discovery response contents (Bonjour)")
  277. dev[1].p2p_stop_find()
  278. def _test_p2p_service_discovery_external(dev):
  279. addr0 = dev[0].p2p_dev_addr()
  280. addr1 = dev[1].p2p_dev_addr()
  281. if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_EXTERNAL 2"):
  282. raise Exception("Invalid P2P_SERV_DISC_EXTERNAL accepted")
  283. if "OK" not in dev[0].global_request("P2P_SERV_DISC_EXTERNAL 1"):
  284. raise Exception("P2P_SERV_DISC_EXTERNAL failed")
  285. dev[0].p2p_listen()
  286. dev[1].global_request("P2P_FLUSH")
  287. dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
  288. if not dev[1].discover_peer(addr0, social=True, force_find=True):
  289. raise Exception("Peer " + addr0 + " not found")
  290. ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
  291. if ev is None:
  292. raise Exception("Service discovery timed out")
  293. if addr1 not in ev:
  294. raise Exception("Unexpected service discovery request source")
  295. arg = ev.split(' ')
  296. resp = "0300000101"
  297. if "OK" not in dev[0].global_request("P2P_SERV_DISC_RESP %s %s %s %s" % (arg[2], arg[3], arg[4], resp)):
  298. raise Exception("P2P_SERV_DISC_RESP failed")
  299. ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=15)
  300. if ev is None:
  301. raise Exception("Service discovery timed out")
  302. if addr0 not in ev:
  303. raise Exception("Unexpected address in SD Response: " + ev)
  304. if ev.split(' ')[4] != resp:
  305. raise Exception("Unexpected response data SD Response: " + ev)
  306. ver = ev.split(' ')[3]
  307. dev[0].global_request("P2P_SERVICE_UPDATE")
  308. dev[1].global_request("P2P_FLUSH")
  309. dev[1].global_request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
  310. if not dev[1].discover_peer(addr0, social=True, force_find=True):
  311. raise Exception("Peer " + addr0 + " not found")
  312. ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=10)
  313. if ev is None:
  314. raise Exception("Service discovery timed out")
  315. if addr1 not in ev:
  316. raise Exception("Unexpected service discovery request source")
  317. arg = ev.split(' ')
  318. resp = "0300000101"
  319. if "OK" not in dev[0].global_request("P2P_SERV_DISC_RESP %s %s %s %s" % (arg[2], arg[3], arg[4], resp)):
  320. raise Exception("P2P_SERV_DISC_RESP failed")
  321. ev = dev[1].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=15)
  322. if ev is None:
  323. raise Exception("Service discovery timed out")
  324. if addr0 not in ev:
  325. raise Exception("Unexpected address in SD Response: " + ev)
  326. if ev.split(' ')[4] != resp:
  327. raise Exception("Unexpected response data SD Response: " + ev)
  328. ver2 = ev.split(' ')[3]
  329. if ver == ver2:
  330. raise Exception("Service list version did not change")
  331. for cmd in [ "%s%s%s%s" % (arg[2], arg[3], arg[4], resp),
  332. "%s %s %s %s" % ("0", arg[3], arg[4], resp),
  333. "%s %s %s %s" % (arg[2], "foo", arg[4], resp),
  334. "%s %s%s%s" % (arg[2], arg[3], arg[4], resp),
  335. "%s %s %s%s" % (arg[2], arg[3], arg[4], resp),
  336. "%s %s %s %s" % (arg[2], arg[3], arg[4], "12345"),
  337. "%s %s %s %s" % (arg[2], arg[3], arg[4], "qq") ]:
  338. if "FAIL" not in dev[0].global_request("P2P_SERV_DISC_RESP " + cmd):
  339. raise Exception("Invalid P2P_SERV_DISC_RESP accepted: " + cmd)
  340. def test_p2p_service_discovery_external(dev):
  341. """P2P service discovery using external response"""
  342. try:
  343. _test_p2p_service_discovery_external(dev)
  344. finally:
  345. dev[0].global_request("P2P_SERV_DISC_EXTERNAL 0")
  346. def test_p2p_service_discovery_invalid_commands(dev):
  347. """P2P service discovery invalid commands"""
  348. for cmd in [ "bonjour",
  349. "bonjour 12",
  350. "bonjour 123 12",
  351. "bonjour qq 12",
  352. "bonjour 12 123",
  353. "bonjour 12 qq",
  354. "upnp 10",
  355. "upnp qq uuid:",
  356. "foo bar" ]:
  357. if "FAIL" not in dev[0].global_request("P2P_SERVICE_ADD " + cmd):
  358. raise Exception("Invalid P2P_SERVICE_ADD accepted: " + cmd)
  359. for cmd in [ "bonjour",
  360. "bonjour 123",
  361. "bonjour qq",
  362. "upnp 10",
  363. "upnp ",
  364. "upnp qq uuid:",
  365. "foo bar" ]:
  366. if "FAIL" not in dev[0].global_request("P2P_SERVICE_DEL " + cmd):
  367. raise Exception("Invalid P2P_SERVICE_DEL accepted: " + cmd)
  368. def test_p2p_service_discovery_cancel_during_query(dev):
  369. """P2P service discovery and cancel during query"""
  370. for i in range(2):
  371. add_bonjour_services(dev[i])
  372. add_upnp_services(dev[i])
  373. add_extra_services(dev[i])
  374. dev[i].p2p_listen()
  375. dev[2].request("P2P_FLUSH")
  376. id1 = dev[2].request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 02000201")
  377. id2 = dev[2].request("P2P_SERV_DISC_REQ 00:00:00:00:00:00 02000101")
  378. dev[2].p2p_find(social=True)
  379. ev = dev[2].wait_global_event(["P2P-DEVICE-FOUND"], timeout=15)
  380. if ev is None:
  381. raise Exception("Could not discover peer")
  382. if "OK" not in dev[2].request("P2P_SERV_DISC_CANCEL_REQ " + id1):
  383. raise Exception("Failed to cancel req1")
  384. if "OK" not in dev[2].request("P2P_SERV_DISC_CANCEL_REQ " + id2):
  385. raise Exception("Failed to cancel req2")
  386. ev = dev[2].wait_global_event(["P2P-SERV-DISC-RESP"], timeout=3)
  387. # we may or may not get a response depending on timing, so ignore the result
  388. dev[2].p2p_stop_find()
  389. dev[1].p2p_stop_find()
  390. dev[0].p2p_stop_find()
  391. def get_p2p_state(dev):
  392. res = dev.global_request("STATUS")
  393. p2p_state = None
  394. for line in res.splitlines():
  395. if line.startswith("p2p_state="):
  396. p2p_state = line.split('=')[1]
  397. break
  398. if p2p_state is None:
  399. raise Exception("Could not get p2p_state")
  400. return p2p_state
  401. def test_p2p_service_discovery_peer_not_listening(dev):
  402. """P2P service discovery and peer not listening"""
  403. addr0 = dev[0].p2p_dev_addr()
  404. addr1 = dev[1].p2p_dev_addr()
  405. add_bonjour_services(dev[0])
  406. add_upnp_services(dev[0])
  407. dev[0].p2p_listen()
  408. dev[1].global_request("P2P_FIND 1 type=social")
  409. ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=4)
  410. if ev is None:
  411. raise Exception("Peer not found")
  412. dev[0].p2p_stop_find()
  413. ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=1)
  414. ev = dev[1].wait_event(["CTRL-EVENT-SCAN-STARTED"], timeout=1)
  415. time.sleep(0.03)
  416. dev[1].request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
  417. ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=1)
  418. if ev is not None:
  419. raise Exception("Service discovery request unexpectedly received")
  420. ev = dev[1].wait_global_event(["P2P-FIND-STOPPED", "P2P-SERV-DISC-RESP"],
  421. timeout=10)
  422. if ev is None:
  423. raise Exception("P2P-FIND-STOPPED event timed out")
  424. if "P2P-SERV-DISC-RESP" in ev:
  425. raise Exception("Unexpected SD response")
  426. p2p_state = get_p2p_state(dev[1])
  427. if p2p_state != "IDLE":
  428. raise Exception("Unexpected p2p_state after P2P_FIND timeout: " + p2p_state)
  429. def test_p2p_service_discovery_peer_not_listening2(dev):
  430. """P2P service discovery and peer not listening"""
  431. addr0 = dev[0].p2p_dev_addr()
  432. addr1 = dev[1].p2p_dev_addr()
  433. add_bonjour_services(dev[0])
  434. add_upnp_services(dev[0])
  435. dev[0].p2p_listen()
  436. dev[1].global_request("P2P_FIND type=social")
  437. ev = dev[1].wait_global_event(["P2P-DEVICE-FOUND"], timeout=10)
  438. if ev is None:
  439. raise Exception("Peer not found")
  440. dev[0].p2p_stop_find()
  441. time.sleep(0.53)
  442. dev[1].request("P2P_SERV_DISC_REQ " + addr0 + " 02000001")
  443. ev = dev[0].wait_global_event(["P2P-SERV-DISC-REQ"], timeout=0.5)
  444. if ev is not None:
  445. raise Exception("Service discovery request unexpectedly received")
  446. dev[1].p2p_stop_find()
  447. ev = dev[1].wait_global_event(["P2P-FIND-STOPPED", "P2P-SERV-DISC-RESP"],
  448. timeout=10)
  449. if ev is None:
  450. raise Exception("P2P-FIND-STOPPED event timed out")
  451. if "P2P-SERV-DISC-RESP" in ev:
  452. raise Exception("Unexpected SD response")
  453. p2p_state = get_p2p_state(dev[1])
  454. if p2p_state != "IDLE":
  455. raise Exception("Unexpected p2p_state after P2P_FIND timeout: " + p2p_state)