[PATCH/RFC 16/18] hwsim_tests: add test_wpas_mesh test cases
Bob Copeland
me
Sun Jul 13 22:19:21 PDT 2014
From: Javier Lopez <jlopex at gmail.com>
This wpa_supplicant tests include basic tests for:
- Mesh scan
- Mesh group add/remove
- Mesh peer connected/disconnected
- Add/Set/Remove to test mesh mode network
- Open mesh connectivity test
- Secure mesh connectivity test
- no_auto_peer
Signed-off-by: Jason Mobarak <x at jason.mobarak.name>
[no_auto_peer test by: Javier Cardona <javier at cozybit.com>
Signed-hostap: Javier Lopez <jlopex at gmail.com>
---
tests/hwsim/example-wpa_supplicant.config | 1 +
tests/hwsim/test_wpas_mesh.py | 332 ++++++++++++++++++++++++++++++
tests/hwsim/wpasupplicant.py | 12 ++
3 files changed, 345 insertions(+)
create mode 100644 tests/hwsim/test_wpas_mesh.py
diff --git a/tests/hwsim/example-wpa_supplicant.config b/tests/hwsim/example-wpa_supplicant.config
index a39b74d..63f5b2c 100644
--- a/tests/hwsim/example-wpa_supplicant.config
+++ b/tests/hwsim/example-wpa_supplicant.config
@@ -76,6 +76,7 @@ CONFIG_LIBNL32=y
CONFIG_IBSS_RSN=y
CONFIG_AP=y
+CONFIG_MESH=y
CONFIG_P2P=y
CONFIG_WIFI_DISPLAY=y
diff --git a/tests/hwsim/test_wpas_mesh.py b/tests/hwsim/test_wpas_mesh.py
new file mode 100644
index 0000000..f1eca36
--- /dev/null
+++ b/tests/hwsim/test_wpas_mesh.py
@@ -0,0 +1,332 @@
+#!/usr/bin/python
+#
+# wpa_supplicant mesh mode tests
+# Copyright (c) 2014, cozybit Inc.
+#
+# This software may be distributed under the terms of the BSD license.
+# See README for more details.
+
+
+def check_mesh_scan(dev, params, other_started=False):
+ if not other_started:
+ dev.dump_monitor()
+ id = dev.request("SCAN " + params)
+ if "FAIL" in id:
+ raise Exception("Failed to start scan")
+ id = int(id)
+
+ if other_started:
+ ev = dev.wait_event(["CTRL-EVENT-SCAN-STARTED"])
+ if ev is None:
+ raise Exception("Other scan did not start")
+ if "id=" + str(id) in ev:
+ raise Exception("Own scan id unexpectedly included in start event")
+
+ ev = dev.wait_event(["CTRL-EVENT-SCAN-RESULTS"])
+ if ev is None:
+ raise Exception("Other scan did not complete")
+ if "id=" + str(id) in ev:
+ raise Exception(
+ "Own scan id unexpectedly included in completed event")
+
+ ev = dev.wait_event(["CTRL-EVENT-SCAN-STARTED"])
+ if ev is None:
+ raise Exception("Scan did not start")
+ if "id=" + str(id) not in ev:
+ raise Exception("Scan id not included in start event")
+
+ ev = dev.wait_event(["CTRL-EVENT-SCAN-RESULTS"])
+ if ev is None:
+ raise Exception("Scan did not complete")
+ if "id=" + str(id) not in ev:
+ raise Exception("Scan id not included in completed event")
+
+ res = dev.request("SCAN_RESULTS")
+
+ if not res.find("[MESH]"):
+ raise Exception("Scan did not contain a MESH network")
+
+
+def check_mesh_group_added(dev):
+ ev = dev.wait_event(["MESH-GROUP-STARTED"])
+ if ev is None:
+ raise Exception("Test exception: Couldn't join mesh")
+
+
+def check_mesh_group_removed(dev):
+ ev = dev.wait_event(["MESH-GROUP-REMOVED"])
+ if ev is None:
+ raise Exception("Test exception: Couldn't leave mesh")
+
+
+def check_mesh_peer_connected(dev):
+ ev = dev.wait_event(["MESH-PEER-CONNECTED"])
+ if ev is None:
+ raise Exception("Test exception: Remote peer did not connect.")
+
+
+def check_mesh_peer_disconnected(dev):
+ ev = dev.wait_event(["MESH-PEER-DISCONNECTED"])
+ if ev is None:
+ raise Exception("Test exception: Peer disconnect event not detected.")
+
+
+def test_wpas_add_set_remove_support(dev):
+ """wpa_supplicant MESH add/set/remove network support"""
+ id = dev[0].add_network()
+ dev[0].set_network(id, "mode", "5")
+ dev[0].remove_network(id)
+
+
+def test_wpas_mesh_group_added(dev):
+ """wpa_supplicant MESH group add"""
+ id = dev[0].add_network()
+ dev[0].set_network(id, "mode", "5")
+ dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[0].set_network(id, "key_mgmt", "NONE")
+ dev[0].set_network(id, "frequency", "2412")
+ dev[0].mesh_group_add(id)
+
+ # Check for MESH-GROUP-STARTED event
+ check_mesh_group_added(dev[0])
+
+
+def test_wpas_mesh_group_remove(dev):
+ """wpa_supplicant MESH group remove"""
+ id = dev[0].add_network()
+ dev[0].set_network(id, "mode", "5")
+ dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[0].set_network(id, "key_mgmt", "NONE")
+ dev[0].set_network(id, "frequency", "2412")
+ dev[0].mesh_group_add(id)
+ # Check for MESH-GROUP-STARTED event
+ check_mesh_group_added(dev[0])
+ dev[0].mesh_group_remove()
+ # Check for MESH-GROUP-REMOVED event
+ check_mesh_group_removed(dev[0])
+
+
+def test_wpas_mesh_peer_connected(dev):
+ """wpa_supplicant MESH peer connected"""
+ id = dev[0].add_network()
+ dev[0].set_network(id, "mode", "5")
+ dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[0].set_network(id, "key_mgmt", "NONE")
+ dev[0].set_network(id, "frequency", "2412")
+ dev[0].mesh_group_add(id)
+
+ id = dev[1].add_network()
+ dev[1].set_network(id, "mode", "5")
+ dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[1].set_network(id, "key_mgmt", "NONE")
+ dev[1].set_network(id, "frequency", "2412")
+ dev[1].mesh_group_add(id)
+
+ # Check for mesh joined
+ check_mesh_group_added(dev[0])
+ check_mesh_group_added(dev[1])
+
+ # Check for peer connected
+ check_mesh_peer_connected(dev[0])
+ check_mesh_peer_connected(dev[1])
+
+
+def test_wpas_mesh_peer_disconnected(dev):
+ """wpa_supplicant MESH peer disconnected"""
+ id = dev[0].add_network()
+ dev[0].set_network(id, "mode", "5")
+ dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[0].set_network(id, "key_mgmt", "NONE")
+ dev[0].set_network(id, "frequency", "2412")
+ dev[0].mesh_group_add(id)
+
+ id = dev[1].add_network()
+ dev[1].set_network(id, "mode", "5")
+ dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[1].set_network(id, "key_mgmt", "NONE")
+ dev[1].set_network(id, "frequency", "2412")
+ dev[1].mesh_group_add(id)
+
+ # Check for mesh joined
+ check_mesh_group_added(dev[0])
+ check_mesh_group_added(dev[1])
+
+ # Check for peer connected
+ check_mesh_peer_connected(dev[0])
+ check_mesh_peer_connected(dev[1])
+
+ # Remove group on dev 1
+ dev[1].mesh_group_remove()
+ # Device 0 should get a disconnection event
+ check_mesh_peer_disconnected(dev[0])
+
+
+def test_wpas_mesh_mode_scan(dev):
+ """wpa_supplicant MESH scan support"""
+ id = dev[0].add_network()
+ dev[0].set_network(id, "mode", "5")
+ dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[0].set_network(id, "key_mgmt", "NONE")
+ dev[0].set_network(id, "frequency", "2412")
+ dev[0].mesh_group_add(id)
+
+ id = dev[1].add_network()
+ dev[1].set_network(id, "mode", "5")
+ dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[1].set_network(id, "key_mgmt", "NONE")
+ dev[1].set_network(id, "frequency", "2412")
+ dev[1].mesh_group_add(id)
+
+ # Check for mesh joined
+ check_mesh_group_added(dev[0])
+ check_mesh_group_added(dev[1])
+
+ # Check for Mesh scan
+ check_mesh_scan(dev[0], "use_id=1")
+
+
+def wrap_wpas_mesh_test(test, dev, apdev):
+ import hwsim_utils
+
+ def _test_connectivity(dev1, dev2):
+ return hwsim_utils.test_connectivity(dev1.ifname, dev2.ifname)
+
+ return test(dev, apdev, _test_connectivity)
+
+
+def _test_wpas_mesh_open(dev, apdev, test_connectivity):
+ """wpa_supplicant open MESH network connectivity"""
+ id = dev[0].add_network()
+ dev[0].set_network(id, "mode", "5")
+ dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[0].set_network(id, "key_mgmt", "NONE")
+ dev[0].set_network(id, "frequency", "2412")
+ dev[0].mesh_group_add(id)
+
+ id = dev[1].add_network()
+ dev[1].set_network(id, "mode", "5")
+ dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[1].set_network(id, "key_mgmt", "NONE")
+ dev[1].set_network(id, "frequency", "2412")
+ dev[1].mesh_group_add(id)
+
+ # Check for mesh joined
+ check_mesh_group_added(dev[0])
+ check_mesh_group_added(dev[1])
+
+ # Check for peer connected
+ check_mesh_peer_connected(dev[0])
+ check_mesh_peer_connected(dev[1])
+
+ # Test connectivity 0->1 and 1->0
+ test_connectivity(dev[0], dev[1])
+ test_connectivity(dev[1], dev[0])
+
+
+def test_wpas_mesh_open(dev, apdev):
+ return wrap_wpas_mesh_test(_test_wpas_mesh_open, dev, apdev)
+
+
+def _test_wpas_mesh_open_no_auto(dev, apdev, test_connectivity):
+ """wpa_supplicant open MESH network connectivity"""
+ id = dev[0].add_network()
+ dev[0].set_network(id, "mode", "5")
+ dev[0].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[0].set_network(id, "key_mgmt", "NONE")
+ dev[0].set_network(id, "frequency", "2412")
+ dev[0].mesh_group_add(id)
+
+ id = dev[1].add_network()
+ dev[1].set_network(id, "mode", "5")
+ dev[1].set_network_quoted(id, "ssid", "wpas-mesh-open")
+ dev[1].set_network(id, "key_mgmt", "NONE")
+ dev[1].set_network(id, "frequency", "2412")
+ dev[1].set_network(id, "no_auto_peer", "1")
+ dev[1].mesh_group_add(id)
+
+ # Check for mesh joined
+ check_mesh_group_added(dev[0])
+ check_mesh_group_added(dev[1])
+
+ # Check for peer connected
+ check_mesh_peer_connected(dev[0])
+ check_mesh_peer_connected(dev[1])
+
+ # Test connectivity 0->1 and 1->0
+ test_connectivity(dev[0], dev[1])
+ test_connectivity(dev[1], dev[0])
+
+
+def test_wpas_mesh_open_no_auto(dev, apdev):
+ return wrap_wpas_mesh_test(_test_wpas_mesh_open_no_auto, dev, apdev)
+
+
+def _test_wpas_mesh_secure(dev, apdev, test_connectivity):
+ """wpa_supplicant secure MESH network connectivity"""
+ id = dev[0].add_network()
+ dev[0].set_network(id, "mode", "5")
+ dev[0].set_network_quoted(id, "ssid", "wpas-mesh-sec")
+ dev[0].set_network(id, "key_mgmt", "SAE")
+ dev[0].set_network(id, "frequency", "2412")
+ dev[0].set_network_quoted(id, "psk", "thisismypassphrase!")
+ dev[0].mesh_group_add(id)
+
+ id = dev[1].add_network()
+ dev[1].set_network(id, "mode", "5")
+ dev[1].set_network_quoted(id, "ssid", "wpas-mesh-sec")
+ dev[1].set_network(id, "key_mgmt", "SAE")
+ dev[1].set_network(id, "frequency", "2412")
+ dev[1].set_network_quoted(id, "psk", "thisismypassphrase!")
+ dev[1].mesh_group_add(id)
+
+ # Check for mesh joined
+ check_mesh_group_added(dev[0])
+ check_mesh_group_added(dev[1])
+
+ # Check for peer connected
+ check_mesh_peer_connected(dev[0])
+ check_mesh_peer_connected(dev[1])
+
+ # Test connectivity 0->1 and 1->0
+ test_connectivity(dev[0], dev[1])
+ test_connectivity(dev[1], dev[0])
+
+
+def test_wpas_mesh_secure(dev, apdev):
+ return wrap_wpas_mesh_test(_test_wpas_mesh_secure, dev, apdev)
+
+
+def _test_wpas_mesh_secure_no_auto(dev, apdev, test_connectivity):
+ """wpa_supplicant secure MESH network connectivity"""
+ id = dev[0].add_network()
+ dev[0].set_network(id, "mode", "5")
+ dev[0].set_network_quoted(id, "ssid", "wpas-mesh-sec")
+ dev[0].set_network(id, "key_mgmt", "SAE")
+ dev[0].set_network(id, "frequency", "2412")
+ dev[0].set_network_quoted(id, "psk", "thisismypassphrase!")
+ dev[0].mesh_group_add(id)
+
+ id = dev[1].add_network()
+ dev[1].set_network(id, "mode", "5")
+ dev[1].set_network_quoted(id, "ssid", "wpas-mesh-sec")
+ dev[1].set_network(id, "key_mgmt", "SAE")
+ dev[1].set_network(id, "frequency", "2412")
+ dev[1].set_network_quoted(id, "psk", "thisismypassphrase!")
+ dev[1].set_network(id, "no_auto_peer", "1")
+ dev[1].mesh_group_add(id)
+
+ # Check for mesh joined
+ check_mesh_group_added(dev[0])
+ check_mesh_group_added(dev[1])
+
+ # Check for peer connected
+ check_mesh_peer_connected(dev[0])
+ check_mesh_peer_connected(dev[1])
+
+ # Test connectivity 0->1 and 1->0
+ test_connectivity(dev[0], dev[1])
+ test_connectivity(dev[1], dev[0])
+
+
+def test_wpas_mesh_secure_no_auto(dev, apdev):
+ return wrap_wpas_mesh_test(_test_wpas_mesh_secure_no_auto, dev, apdev)
diff --git a/tests/hwsim/wpasupplicant.py b/tests/hwsim/wpasupplicant.py
index 5e24e20..9392111 100644
--- a/tests/hwsim/wpasupplicant.py
+++ b/tests/hwsim/wpasupplicant.py
@@ -249,6 +249,18 @@ class WpaSupplicant:
raise Exception("SELECT_NETWORK failed")
return None
+ def mesh_group_add(self, id):
+ id = self.request("MESH_GROUP_ADD " + str(id))
+ if "FAIL" in id:
+ raise Exception("MESH_GROUP_ADD failed")
+ return None
+
+ def mesh_group_remove(self):
+ id = self.request("MESH_GROUP_REMOVE " + str(self.ifname))
+ if "FAIL" in id:
+ raise Exception("MESH_GROUP_REMOVE failed")
+ return None
+
def connect_network(self, id, timeout=10):
self.dump_monitor()
self.select_network(id)
--
2.0.0.rc2
More information about the Hostap
mailing list