test_p2p_service.py 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #!/usr/bin/python
  2. #
  3. # P2P service discovery test cases
  4. # Copyright (c) 2013, Jouni Malinen <j@w1.fi>
  5. #
  6. # This software may be distributed under the terms of the BSD license.
  7. # See README for more details.
  8. import logging
  9. logger = logging.getLogger()
  10. import uuid
  11. import hwsim_utils
  12. def add_bonjour_services(dev):
  13. dev.request("P2P_SERVICE_ADD bonjour 0b5f6166706f766572746370c00c000c01 074578616d706c65c027")
  14. dev.request("P2P_SERVICE_ADD bonjour 076578616d706c650b5f6166706f766572746370c00c001001 00")
  15. dev.request("P2P_SERVICE_ADD bonjour 045f697070c00c000c01 094d795072696e746572c027")
  16. dev.request("P2P_SERVICE_ADD bonjour 096d797072696e746572045f697070c00c001001 09747874766572733d311a70646c3d6170706c69636174696f6e2f706f7374736372797074")
  17. def add_upnp_services(dev):
  18. dev.request("P2P_SERVICE_ADD upnp 10 uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice")
  19. dev.request("P2P_SERVICE_ADD upnp 10 uuid:5566d33e-9774-09ab-4822-333456785632::upnp:rootdevice")
  20. dev.request("P2P_SERVICE_ADD upnp 10 uuid:1122de4e-8574-59ab-9322-333456789044::urn:schemas-upnp-org:service:ContentDirectory:2")
  21. dev.request("P2P_SERVICE_ADD upnp 10 uuid:5566d33e-9774-09ab-4822-333456785632::urn:schemas-upnp-org:service:ContentDirectory:2")
  22. dev.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.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].request("P2P_FLUSH")
  35. dev[1].request("P2P_SERV_DISC_REQ " + dst + " " + query)
  36. if query2:
  37. dev[1].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_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_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_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. return ev
  67. def test_p2p_service_discovery(dev):
  68. """P2P service discovery"""
  69. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  70. ev = run_sd(dev, dst, "02000001")
  71. if "0b5f6166706f766572746370c00c000c01" not in ev:
  72. raise Exception("Unexpected service discovery response contents (Bonjour)")
  73. if "496e7465726e6574" not in ev:
  74. raise Exception("Unexpected service discovery response contents (UPnP)")
  75. def test_p2p_service_discovery2(dev):
  76. """P2P service discovery with one peer having no services"""
  77. dev[2].p2p_listen()
  78. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  79. ev = run_sd(dev, dst, "02000001")
  80. if "0b5f6166706f766572746370c00c000c01" not in ev:
  81. raise Exception("Unexpected service discovery response contents (Bonjour)")
  82. if "496e7465726e6574" not in ev:
  83. raise Exception("Unexpected service discovery response contents (UPnP)")
  84. def test_p2p_service_discovery_multiple_queries(dev):
  85. """P2P service discovery with multiple queries"""
  86. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  87. ev = run_sd(dev, dst, "02000201", query2="02000101")
  88. if "0b5f6166706f766572746370c00c000c01" not in ev[0] + ev[1]:
  89. raise Exception("Unexpected service discovery response contents (Bonjour)")
  90. if "496e7465726e6574" not in ev[0] + ev[1]:
  91. raise Exception("Unexpected service discovery response contents (UPnP)")
  92. def test_p2p_service_discovery_multiple_queries2(dev):
  93. """P2P service discovery with multiple queries with one peer having no services"""
  94. dev[2].p2p_listen()
  95. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  96. ev = run_sd(dev, dst, "02000201", query2="02000101")
  97. if "0b5f6166706f766572746370c00c000c01" not in ev[0] + ev[1]:
  98. raise Exception("Unexpected service discovery response contents (Bonjour)")
  99. if "496e7465726e6574" not in ev[0] + ev[1]:
  100. raise Exception("Unexpected service discovery response contents (UPnP)")
  101. def test_p2p_service_discovery_fragmentation(dev):
  102. """P2P service discovery with fragmentation"""
  103. for dst in [ "00:00:00:00:00:00", dev[0].p2p_dev_addr() ]:
  104. ev = run_sd(dev, dst, "02000001", fragment=True)
  105. if not "long response" in ev:
  106. if "0b5f6166706f766572746370c00c000c01" not in ev:
  107. raise Exception("Unexpected service discovery response contents (Bonjour)")
  108. if "496e7465726e6574" not in ev:
  109. raise Exception("Unexpected service discovery response contents (UPnP)")
  110. def test_p2p_service_discovery_bonjour(dev):
  111. """P2P service discovery (Bonjour)"""
  112. ev = run_sd(dev, "00:00:00:00:00:00", "02000101")
  113. if "0b5f6166706f766572746370c00c000c01" not in ev:
  114. raise Exception("Unexpected service discovery response contents (Bonjour)")
  115. if "045f697070c00c000c01" not in ev:
  116. raise Exception("Unexpected service discovery response contents (Bonjour)")
  117. if "496e7465726e6574" in ev:
  118. raise Exception("Unexpected service discovery response contents (UPnP not expected)")
  119. def test_p2p_service_discovery_bonjour2(dev):
  120. """P2P service discovery (Bonjour AFS)"""
  121. ev = run_sd(dev, "00:00:00:00:00:00", "130001010b5f6166706f766572746370c00c000c01")
  122. if "0b5f6166706f766572746370c00c000c01" not in ev:
  123. raise Exception("Unexpected service discovery response contents (Bonjour)")
  124. if "045f697070c00c000c01" in ev:
  125. raise Exception("Unexpected service discovery response contents (Bonjour mismatching)")
  126. if "496e7465726e6574" in ev:
  127. raise Exception("Unexpected service discovery response contents (UPnP not expected)")
  128. def test_p2p_service_discovery_upnp(dev):
  129. """P2P service discovery (UPnP)"""
  130. ev = run_sd(dev, "00:00:00:00:00:00", "02000201")
  131. if "0b5f6166706f766572746370c00c000c01" in ev:
  132. raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
  133. if "496e7465726e6574" not in ev:
  134. raise Exception("Unexpected service discovery response contents (UPnP)")
  135. def test_p2p_service_discovery_upnp2(dev):
  136. """P2P service discovery (UPnP using request helper)"""
  137. ev = run_sd(dev, "00:00:00:00:00:00", "upnp 10 ssdp:all", "0b00020110737364703a616c6c")
  138. if "0b5f6166706f766572746370c00c000c01" in ev:
  139. raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
  140. if "496e7465726e6574" not in ev:
  141. raise Exception("Unexpected service discovery response contents (UPnP)")
  142. def test_p2p_service_discovery_ws(dev):
  143. """P2P service discovery (WS-Discovery)"""
  144. ev = run_sd(dev, "00:00:00:00:00:00", "02000301")
  145. if "0b5f6166706f766572746370c00c000c01" in ev:
  146. raise Exception("Unexpected service discovery response contents (Bonjour not expected)")
  147. if "496e7465726e6574" in ev:
  148. raise Exception("Unexpected service discovery response contents (UPnP not expected)")
  149. if "0300030101" not in ev:
  150. raise Exception("Unexpected service discovery response contents (WS)")
  151. def test_p2p_service_discovery_req_cancel(dev):
  152. """Cancel a P2P service discovery request"""
  153. if "FAIL" not in dev[0].request("P2P_SERV_DISC_CANCEL_REQ ab"):
  154. raise Exception("Unexpected SD cancel success")
  155. query = dev[0].request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000001")
  156. if "OK" not in dev[0].request("P2P_SERV_DISC_CANCEL_REQ " + query):
  157. raise Exception("Unexpected SD cancel failure")
  158. query1 = dev[0].request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000001")
  159. query2 = dev[0].request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000002")
  160. query3 = dev[0].request("P2P_SERV_DISC_REQ " + dev[1].p2p_dev_addr() + " 02000003")
  161. if "OK" not in dev[0].request("P2P_SERV_DISC_CANCEL_REQ " + query2):
  162. raise Exception("Unexpected SD cancel failure")
  163. if "OK" not in dev[0].request("P2P_SERV_DISC_CANCEL_REQ " + query1):
  164. raise Exception("Unexpected SD cancel failure")
  165. if "OK" not in dev[0].request("P2P_SERV_DISC_CANCEL_REQ " + query3):
  166. raise Exception("Unexpected SD cancel failure")