test_p2p_service.py 24 KB

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