]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
tests: Add test_wpas_mesh test cases
authorJavier Lopez <jlopex@gmail.com>
Mon, 1 Sep 2014 04:23:35 +0000 (00:23 -0400)
committerJouni Malinen <j@w1.fi>
Thu, 20 Nov 2014 14:31:12 +0000 (16:31 +0200)
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@jason.mobarak.name>
[no_auto_peer test by: Javier Cardona <javier@cozybit.com>
Signed-off-by: Javier Lopez <jlopex@gmail.com>
tests/hwsim/example-wpa_supplicant.config
tests/hwsim/test_wpas_mesh.py [new file with mode: 0644]
tests/hwsim/vm/kernel-config
tests/hwsim/wpasupplicant.py

index ed687245120b3c9082fbe9846665176a0961453e..165d8b7476abd9a538d129056ce5c857dfeca927 100644 (file)
@@ -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 (file)
index 0000000..fec1634
--- /dev/null
@@ -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, dev2)
+
+    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)
index b1ad5d3c099ca544d9194ce9ce503c49d26f50a8..6f5341d06246e263fb83a3c975bc8f2a1503186a 100644 (file)
@@ -606,7 +606,7 @@ CONFIG_MAC80211_RC_MINSTREL=y
 CONFIG_MAC80211_RC_MINSTREL_HT=y
 CONFIG_MAC80211_RC_DEFAULT_MINSTREL=y
 CONFIG_MAC80211_RC_DEFAULT="minstrel_ht"
-# CONFIG_MAC80211_MESH is not set
+CONFIG_MAC80211_MESH=y
 CONFIG_MAC80211_DEBUGFS=y
 CONFIG_MAC80211_MESSAGE_TRACING=y
 CONFIG_MAC80211_DEBUG_MENU=y
@@ -617,6 +617,12 @@ CONFIG_MAC80211_STA_DEBUG=y
 CONFIG_MAC80211_HT_DEBUG=y
 CONFIG_MAC80211_IBSS_DEBUG=y
 CONFIG_MAC80211_PS_DEBUG=y
+# CONFIG_MAC80211_MPL_DEBUG is not set
+# CONFIG_MAC80211_MPATH_DEBUG is not set
+# CONFIG_MAC80211_MHWMP_DEBUG is not set
+# CONFIG_MAC80211_MESH_SYNC_DEBUG is not set
+# CONFIG_MAC80211_MESH_CSA_DEBUG is not set
+# CONFIG_MAC80211_MESH_PS_DEBUG is not set
 CONFIG_MAC80211_TDLS_DEBUG=y
 # CONFIG_MAC80211_DEBUG_COUNTERS is not set
 # CONFIG_WIMAX is not set
index fbf44d17556c16ac987c28dbfe1a52abb58726ce..8d0bb5b29f544d3ef2904fa3860b2e79a728b1f0 100644 (file)
@@ -257,6 +257,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)