test_wpas_mesh.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  1. #!/usr/bin/python
  2. #
  3. # wpa_supplicant mesh mode tests
  4. # Copyright (c) 2014, cozybit Inc.
  5. #
  6. # This software may be distributed under the terms of the BSD license.
  7. # See README for more details.
  8. def check_mesh_scan(dev, params, other_started=False):
  9. if not other_started:
  10. dev.dump_monitor()
  11. id = dev.request("SCAN " + params)
  12. if "FAIL" in id:
  13. raise Exception("Failed to start scan")
  14. id = int(id)
  15. if other_started:
  16. ev = dev.wait_event(["CTRL-EVENT-SCAN-STARTED"])
  17. if ev is None:
  18. raise Exception("Other scan did not start")
  19. if "id=" + str(id) in ev:
  20. raise Exception("Own scan id unexpectedly included in start event")
  21. ev = dev.wait_event(["CTRL-EVENT-SCAN-RESULTS"])
  22. if ev is None:
  23. raise Exception("Other scan did not complete")
  24. if "id=" + str(id) in ev:
  25. raise Exception(
  26. "Own scan id unexpectedly included in completed event")
  27. ev = dev.wait_event(["CTRL-EVENT-SCAN-STARTED"])
  28. if ev is None:
  29. raise Exception("Scan did not start")
  30. if "id=" + str(id) not in ev:
  31. raise Exception("Scan id not included in start event")
  32. ev = dev.wait_event(["CTRL-EVENT-SCAN-RESULTS"])
  33. if ev is None:
  34. raise Exception("Scan did not complete")
  35. if "id=" + str(id) not in ev:
  36. raise Exception("Scan id not included in completed event")
  37. res = dev.request("SCAN_RESULTS")
  38. if not res.find("[MESH]"):
  39. raise Exception("Scan did not contain a MESH network")
  40. def check_mesh_group_added(dev):
  41. ev = dev.wait_event(["MESH-GROUP-STARTED"])
  42. if ev is None:
  43. raise Exception("Test exception: Couldn't join mesh")
  44. def check_mesh_group_removed(dev):
  45. ev = dev.wait_event(["MESH-GROUP-REMOVED"])
  46. if ev is None:
  47. raise Exception("Test exception: Couldn't leave mesh")
  48. def check_mesh_peer_connected(dev):
  49. ev = dev.wait_event(["MESH-PEER-CONNECTED"])
  50. if ev is None:
  51. raise Exception("Test exception: Remote peer did not connect.")
  52. def check_mesh_peer_disconnected(dev):
  53. ev = dev.wait_event(["MESH-PEER-DISCONNECTED"])
  54. if ev is None:
  55. raise Exception("Test exception: Peer disconnect event not detected.")
  56. def test_wpas_add_set_remove_support(dev):
  57. """wpa_supplicant MESH add/set/remove network support"""
  58. id = dev[0].add_network()
  59. dev[0].set_network(id, "mode", "5")
  60. dev[0].remove_network(id)
  61. def test_wpas_mesh_group_added(dev):
  62. """wpa_supplicant MESH group add"""
  63. id = dev[0].add_network()
  64. dev[0].set_network(id, "mode", "5")
  65. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
  66. dev[0].set_network(id, "key_mgmt", "NONE")
  67. dev[0].set_network(id, "frequency", "2412")
  68. dev[0].mesh_group_add(id)
  69. # Check for MESH-GROUP-STARTED event
  70. check_mesh_group_added(dev[0])
  71. def test_wpas_mesh_group_remove(dev):
  72. """wpa_supplicant MESH group remove"""
  73. id = dev[0].add_network()
  74. dev[0].set_network(id, "mode", "5")
  75. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
  76. dev[0].set_network(id, "key_mgmt", "NONE")
  77. dev[0].set_network(id, "frequency", "2412")
  78. dev[0].mesh_group_add(id)
  79. # Check for MESH-GROUP-STARTED event
  80. check_mesh_group_added(dev[0])
  81. dev[0].mesh_group_remove()
  82. # Check for MESH-GROUP-REMOVED event
  83. check_mesh_group_removed(dev[0])
  84. def test_wpas_mesh_peer_connected(dev):
  85. """wpa_supplicant MESH peer connected"""
  86. id = dev[0].add_network()
  87. dev[0].set_network(id, "mode", "5")
  88. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
  89. dev[0].set_network(id, "key_mgmt", "NONE")
  90. dev[0].set_network(id, "frequency", "2412")
  91. dev[0].mesh_group_add(id)
  92. id = dev[1].add_network()
  93. dev[1].set_network(id, "mode", "5")
  94. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
  95. dev[1].set_network(id, "key_mgmt", "NONE")
  96. dev[1].set_network(id, "frequency", "2412")
  97. dev[1].mesh_group_add(id)
  98. # Check for mesh joined
  99. check_mesh_group_added(dev[0])
  100. check_mesh_group_added(dev[1])
  101. # Check for peer connected
  102. check_mesh_peer_connected(dev[0])
  103. check_mesh_peer_connected(dev[1])
  104. def test_wpas_mesh_peer_disconnected(dev):
  105. """wpa_supplicant MESH peer disconnected"""
  106. id = dev[0].add_network()
  107. dev[0].set_network(id, "mode", "5")
  108. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
  109. dev[0].set_network(id, "key_mgmt", "NONE")
  110. dev[0].set_network(id, "frequency", "2412")
  111. dev[0].mesh_group_add(id)
  112. id = dev[1].add_network()
  113. dev[1].set_network(id, "mode", "5")
  114. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
  115. dev[1].set_network(id, "key_mgmt", "NONE")
  116. dev[1].set_network(id, "frequency", "2412")
  117. dev[1].mesh_group_add(id)
  118. # Check for mesh joined
  119. check_mesh_group_added(dev[0])
  120. check_mesh_group_added(dev[1])
  121. # Check for peer connected
  122. check_mesh_peer_connected(dev[0])
  123. check_mesh_peer_connected(dev[1])
  124. # Remove group on dev 1
  125. dev[1].mesh_group_remove()
  126. # Device 0 should get a disconnection event
  127. check_mesh_peer_disconnected(dev[0])
  128. def test_wpas_mesh_mode_scan(dev):
  129. """wpa_supplicant MESH scan support"""
  130. id = dev[0].add_network()
  131. dev[0].set_network(id, "mode", "5")
  132. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
  133. dev[0].set_network(id, "key_mgmt", "NONE")
  134. dev[0].set_network(id, "frequency", "2412")
  135. dev[0].mesh_group_add(id)
  136. id = dev[1].add_network()
  137. dev[1].set_network(id, "mode", "5")
  138. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
  139. dev[1].set_network(id, "key_mgmt", "NONE")
  140. dev[1].set_network(id, "frequency", "2412")
  141. dev[1].mesh_group_add(id)
  142. # Check for mesh joined
  143. check_mesh_group_added(dev[0])
  144. check_mesh_group_added(dev[1])
  145. # Check for Mesh scan
  146. check_mesh_scan(dev[0], "use_id=1")
  147. def wrap_wpas_mesh_test(test, dev, apdev):
  148. import hwsim_utils
  149. def _test_connectivity(dev1, dev2):
  150. return hwsim_utils.test_connectivity(dev1, dev2)
  151. return test(dev, apdev, _test_connectivity)
  152. def _test_wpas_mesh_open(dev, apdev, test_connectivity):
  153. """wpa_supplicant open MESH network connectivity"""
  154. id = dev[0].add_network()
  155. dev[0].set_network(id, "mode", "5")
  156. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
  157. dev[0].set_network(id, "key_mgmt", "NONE")
  158. dev[0].set_network(id, "frequency", "2412")
  159. dev[0].mesh_group_add(id)
  160. id = dev[1].add_network()
  161. dev[1].set_network(id, "mode", "5")
  162. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
  163. dev[1].set_network(id, "key_mgmt", "NONE")
  164. dev[1].set_network(id, "frequency", "2412")
  165. dev[1].mesh_group_add(id)
  166. # Check for mesh joined
  167. check_mesh_group_added(dev[0])
  168. check_mesh_group_added(dev[1])
  169. # Check for peer connected
  170. check_mesh_peer_connected(dev[0])
  171. check_mesh_peer_connected(dev[1])
  172. # Test connectivity 0->1 and 1->0
  173. test_connectivity(dev[0], dev[1])
  174. test_connectivity(dev[1], dev[0])
  175. def test_wpas_mesh_open(dev, apdev):
  176. return wrap_wpas_mesh_test(_test_wpas_mesh_open, dev, apdev)
  177. def _test_wpas_mesh_open_no_auto(dev, apdev, test_connectivity):
  178. """wpa_supplicant open MESH network connectivity"""
  179. id = dev[0].add_network()
  180. dev[0].set_network(id, "mode", "5")
  181. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
  182. dev[0].set_network(id, "key_mgmt", "NONE")
  183. dev[0].set_network(id, "frequency", "2412")
  184. dev[0].mesh_group_add(id)
  185. id = dev[1].add_network()
  186. dev[1].set_network(id, "mode", "5")
  187. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
  188. dev[1].set_network(id, "key_mgmt", "NONE")
  189. dev[1].set_network(id, "frequency", "2412")
  190. dev[1].set_network(id, "no_auto_peer", "1")
  191. dev[1].mesh_group_add(id)
  192. # Check for mesh joined
  193. check_mesh_group_added(dev[0])
  194. check_mesh_group_added(dev[1])
  195. # Check for peer connected
  196. check_mesh_peer_connected(dev[0])
  197. check_mesh_peer_connected(dev[1])
  198. # Test connectivity 0->1 and 1->0
  199. test_connectivity(dev[0], dev[1])
  200. test_connectivity(dev[1], dev[0])
  201. def test_wpas_mesh_open_no_auto(dev, apdev):
  202. return wrap_wpas_mesh_test(_test_wpas_mesh_open_no_auto, dev, apdev)
  203. def _test_wpas_mesh_secure(dev, apdev, test_connectivity):
  204. """wpa_supplicant secure MESH network connectivity"""
  205. id = dev[0].add_network()
  206. dev[0].set_network(id, "mode", "5")
  207. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-sec")
  208. dev[0].set_network(id, "key_mgmt", "SAE")
  209. dev[0].set_network(id, "frequency", "2412")
  210. dev[0].set_network_quoted(id, "psk", "thisismypassphrase!")
  211. dev[0].mesh_group_add(id)
  212. id = dev[1].add_network()
  213. dev[1].set_network(id, "mode", "5")
  214. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-sec")
  215. dev[1].set_network(id, "key_mgmt", "SAE")
  216. dev[1].set_network(id, "frequency", "2412")
  217. dev[1].set_network_quoted(id, "psk", "thisismypassphrase!")
  218. dev[1].mesh_group_add(id)
  219. # Check for mesh joined
  220. check_mesh_group_added(dev[0])
  221. check_mesh_group_added(dev[1])
  222. # Check for peer connected
  223. check_mesh_peer_connected(dev[0])
  224. check_mesh_peer_connected(dev[1])
  225. # Test connectivity 0->1 and 1->0
  226. test_connectivity(dev[0], dev[1])
  227. test_connectivity(dev[1], dev[0])
  228. def test_wpas_mesh_secure(dev, apdev):
  229. return wrap_wpas_mesh_test(_test_wpas_mesh_secure, dev, apdev)
  230. def _test_wpas_mesh_secure_no_auto(dev, apdev, test_connectivity):
  231. """wpa_supplicant secure MESH network connectivity"""
  232. id = dev[0].add_network()
  233. dev[0].set_network(id, "mode", "5")
  234. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-sec")
  235. dev[0].set_network(id, "key_mgmt", "SAE")
  236. dev[0].set_network(id, "frequency", "2412")
  237. dev[0].set_network_quoted(id, "psk", "thisismypassphrase!")
  238. dev[0].mesh_group_add(id)
  239. id = dev[1].add_network()
  240. dev[1].set_network(id, "mode", "5")
  241. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-sec")
  242. dev[1].set_network(id, "key_mgmt", "SAE")
  243. dev[1].set_network(id, "frequency", "2412")
  244. dev[1].set_network_quoted(id, "psk", "thisismypassphrase!")
  245. dev[1].set_network(id, "no_auto_peer", "1")
  246. dev[1].mesh_group_add(id)
  247. # Check for mesh joined
  248. check_mesh_group_added(dev[0])
  249. check_mesh_group_added(dev[1])
  250. # Check for peer connected
  251. check_mesh_peer_connected(dev[0])
  252. check_mesh_peer_connected(dev[1])
  253. # Test connectivity 0->1 and 1->0
  254. test_connectivity(dev[0], dev[1])
  255. test_connectivity(dev[1], dev[0])
  256. def test_wpas_mesh_secure_no_auto(dev, apdev):
  257. return wrap_wpas_mesh_test(_test_wpas_mesh_secure_no_auto, dev, apdev)