test_wpas_mesh.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  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 res.find("[MESH]") < 0:
  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].set_network(id, "mesh_ht_mode", "HT40+")
  136. dev[0].mesh_group_add(id)
  137. id = dev[1].add_network()
  138. dev[1].set_network(id, "mode", "5")
  139. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
  140. dev[1].set_network(id, "key_mgmt", "NONE")
  141. dev[1].set_network(id, "frequency", "2412")
  142. dev[1].set_network(id, "mesh_ht_mode", "HT40+")
  143. dev[1].mesh_group_add(id)
  144. # Check for mesh joined
  145. check_mesh_group_added(dev[0])
  146. check_mesh_group_added(dev[1])
  147. # Check for Mesh scan
  148. check_mesh_scan(dev[0], "use_id=1")
  149. def wrap_wpas_mesh_test(test, dev, apdev):
  150. import hwsim_utils
  151. def _test_connectivity(dev1, dev2):
  152. return hwsim_utils.test_connectivity(dev1, dev2)
  153. return test(dev, apdev, _test_connectivity)
  154. def _test_wpas_mesh_open(dev, apdev, test_connectivity):
  155. id = dev[0].add_network()
  156. dev[0].set_network(id, "mode", "5")
  157. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
  158. dev[0].set_network(id, "key_mgmt", "NONE")
  159. dev[0].set_network(id, "frequency", "2412")
  160. dev[0].set_network(id, "mesh_ht_mode", "HT40+")
  161. dev[0].mesh_group_add(id)
  162. id = dev[1].add_network()
  163. dev[1].set_network(id, "mode", "5")
  164. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
  165. dev[1].set_network(id, "key_mgmt", "NONE")
  166. dev[1].set_network(id, "frequency", "2412")
  167. dev[1].set_network(id, "mesh_ht_mode", "HT40+")
  168. dev[1].mesh_group_add(id)
  169. # Check for mesh joined
  170. check_mesh_group_added(dev[0])
  171. check_mesh_group_added(dev[1])
  172. # Check for peer connected
  173. check_mesh_peer_connected(dev[0])
  174. check_mesh_peer_connected(dev[1])
  175. # Test connectivity 0->1 and 1->0
  176. test_connectivity(dev[0], dev[1])
  177. def test_wpas_mesh_open(dev, apdev):
  178. """wpa_supplicant open MESH network connectivity"""
  179. return wrap_wpas_mesh_test(_test_wpas_mesh_open, dev, apdev)
  180. def _test_wpas_mesh_open_no_auto(dev, apdev, test_connectivity):
  181. id = dev[0].add_network()
  182. dev[0].set_network(id, "mode", "5")
  183. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
  184. dev[0].set_network(id, "key_mgmt", "NONE")
  185. dev[0].set_network(id, "frequency", "2412")
  186. dev[0].set_network(id, "dot11MeshMaxRetries", "16")
  187. dev[0].set_network(id, "dot11MeshRetryTimeout", "255")
  188. dev[0].mesh_group_add(id)
  189. id = dev[1].add_network()
  190. dev[1].set_network(id, "mode", "5")
  191. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
  192. dev[1].set_network(id, "key_mgmt", "NONE")
  193. dev[1].set_network(id, "frequency", "2412")
  194. dev[1].set_network(id, "no_auto_peer", "1")
  195. dev[1].mesh_group_add(id)
  196. # Check for mesh joined
  197. check_mesh_group_added(dev[0])
  198. check_mesh_group_added(dev[1])
  199. # Check for peer connected
  200. check_mesh_peer_connected(dev[0])
  201. check_mesh_peer_connected(dev[1])
  202. # Test connectivity 0->1 and 1->0
  203. test_connectivity(dev[0], dev[1])
  204. def test_wpas_mesh_open_no_auto(dev, apdev):
  205. """wpa_supplicant open MESH network connectivity"""
  206. return wrap_wpas_mesh_test(_test_wpas_mesh_open_no_auto, dev, apdev)
  207. def _test_wpas_mesh_secure(dev, apdev, test_connectivity):
  208. dev[0].request("SET sae_groups ")
  209. id = dev[0].add_network()
  210. dev[0].set_network(id, "mode", "5")
  211. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-sec")
  212. dev[0].set_network(id, "key_mgmt", "SAE")
  213. dev[0].set_network(id, "frequency", "2412")
  214. dev[0].set_network_quoted(id, "psk", "thisismypassphrase!")
  215. dev[0].mesh_group_add(id)
  216. dev[1].request("SET sae_groups ")
  217. id = dev[1].add_network()
  218. dev[1].set_network(id, "mode", "5")
  219. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-sec")
  220. dev[1].set_network(id, "key_mgmt", "SAE")
  221. dev[1].set_network(id, "frequency", "2412")
  222. dev[1].set_network_quoted(id, "psk", "thisismypassphrase!")
  223. dev[1].mesh_group_add(id)
  224. # Check for mesh joined
  225. check_mesh_group_added(dev[0])
  226. check_mesh_group_added(dev[1])
  227. # Check for peer connected
  228. check_mesh_peer_connected(dev[0])
  229. check_mesh_peer_connected(dev[1])
  230. # Test connectivity 0->1 and 1->0
  231. test_connectivity(dev[0], dev[1])
  232. def test_wpas_mesh_secure(dev, apdev):
  233. """wpa_supplicant secure MESH network connectivity"""
  234. return wrap_wpas_mesh_test(_test_wpas_mesh_secure, dev, apdev)
  235. def _test_wpas_mesh_secure_no_auto(dev, apdev, test_connectivity):
  236. dev[0].request("SET sae_groups ")
  237. id = dev[0].add_network()
  238. dev[0].set_network(id, "mode", "5")
  239. dev[0].set_network_quoted(id, "ssid", "wpas-mesh-sec")
  240. dev[0].set_network(id, "key_mgmt", "SAE")
  241. dev[0].set_network(id, "frequency", "2412")
  242. dev[0].set_network_quoted(id, "psk", "thisismypassphrase!")
  243. dev[0].mesh_group_add(id)
  244. dev[1].request("SET sae_groups ")
  245. id = dev[1].add_network()
  246. dev[1].set_network(id, "mode", "5")
  247. dev[1].set_network_quoted(id, "ssid", "wpas-mesh-sec")
  248. dev[1].set_network(id, "key_mgmt", "SAE")
  249. dev[1].set_network(id, "frequency", "2412")
  250. dev[1].set_network_quoted(id, "psk", "thisismypassphrase!")
  251. dev[1].set_network(id, "no_auto_peer", "1")
  252. dev[1].mesh_group_add(id)
  253. # Check for mesh joined
  254. check_mesh_group_added(dev[0])
  255. check_mesh_group_added(dev[1])
  256. # Check for peer connected
  257. check_mesh_peer_connected(dev[0])
  258. check_mesh_peer_connected(dev[1])
  259. # Test connectivity 0->1 and 1->0
  260. test_connectivity(dev[0], dev[1])
  261. def test_wpas_mesh_secure_no_auto(dev, apdev):
  262. """wpa_supplicant secure MESH network connectivity"""
  263. return wrap_wpas_mesh_test(_test_wpas_mesh_secure_no_auto, dev, apdev)
  264. def test_wpas_mesh_ctrl(dev):
  265. """wpa_supplicant ctrl_iface mesh command error cases"""
  266. if "FAIL" not in dev[0].request("MESH_GROUP_ADD 123"):
  267. raise Exception("Unexpected MESH_GROUP_ADD success")
  268. id = dev[0].add_network()
  269. if "FAIL" not in dev[0].request("MESH_GROUP_ADD %d" % id):
  270. raise Exception("Unexpected MESH_GROUP_ADD success")
  271. dev[0].set_network(id, "mode", "5")
  272. dev[0].set_network(id, "key_mgmt", "WPA-PSK")
  273. if "FAIL" not in dev[0].request("MESH_GROUP_ADD %d" % id):
  274. raise Exception("Unexpected MESH_GROUP_ADD success")
  275. if "FAIL" not in dev[0].request("MESH_GROUP_REMOVE foo"):
  276. raise Exception("Unexpected MESH_GROUP_REMOVE success")