git: ae8d58814089 - main - vnet tests: verify that we can load if_epair and if_bridge

From: Kristof Provost <kp_at_FreeBSD.org>
Date: Tue, 23 Jul 2024 15:00:08 UTC
The branch main has been updated by kp:

URL: https://cgit.FreeBSD.org/src/commit/?id=ae8d58814089308028046ac80aeeb9cbb784bd0a

commit ae8d58814089308028046ac80aeeb9cbb784bd0a
Author:     Kristof Provost <kp@FreeBSD.org>
AuthorDate: 2024-07-18 20:36:55 +0000
Commit:     Kristof Provost <kp@FreeBSD.org>
CommitDate: 2024-07-23 13:57:25 +0000

    vnet tests: verify that we can load if_epair and if_bridge
    
    We're going to start running many of the vnet tests in nested jails (so they
    can run in parallel). That means the tests won't be able to load kernel modules,
    which we commonly do for if_epair and if_bridge.
    
    Just assume that all vnet tests need this, because so many of them do that we
    don't want to manually annotate all of them.
    This is essentially a no-op on non-nested tests.
    
    Do the same for the python test framework.
    
    While here also have pflog_init actually call pft_init. While having pflog
    loaded implies we have pf too pft_init also checks for vimage support, and now
    for if_epair.
    
    Reviewed by:    markj
    MFC after:      1 month
    Sponsored by:   Rubicon Communications, LLC ("Netgate")
    Differential Revision:  https://reviews.freebsd.org/D46039
---
 tests/atf_python/sys/net/vnet.py |  6 ++++++
 tests/sys/common/vnet.subr       | 21 +++++++++++++++++++++
 tests/sys/netpfil/pf/utils.subr  |  2 ++
 3 files changed, 29 insertions(+)

diff --git a/tests/atf_python/sys/net/vnet.py b/tests/atf_python/sys/net/vnet.py
index 67fe15fff69c..6da5f2625990 100644
--- a/tests/atf_python/sys/net/vnet.py
+++ b/tests/atf_python/sys/net/vnet.py
@@ -334,6 +334,10 @@ class VnetTestTemplate(BaseTest):
     NEED_ROOT: bool = True
     TOPOLOGY = {}
 
+    def _require_default_modules(self):
+        libc.kldload("if_epair.ko")
+        self.require_module("if_epair")
+
     def _get_vnet_handler(self, vnet_alias: str):
         handler_name = "{}_handler".format(vnet_alias)
         return getattr(self, handler_name, None)
@@ -451,6 +455,8 @@ class VnetTestTemplate(BaseTest):
     def setup_method(self, _method):
         """Sets up all the required topology and handlers for the given test"""
         super().setup_method(_method)
+        self._require_default_modules()
+
         # TestIP6Output.test_output6_pktinfo[ipandif]
         topology_id = get_topology_id(self.test_id)
         topology = self.TOPOLOGY
diff --git a/tests/sys/common/vnet.subr b/tests/sys/common/vnet.subr
index fd67385655fc..bd98b02da33f 100644
--- a/tests/sys/common/vnet.subr
+++ b/tests/sys/common/vnet.subr
@@ -11,11 +11,32 @@ unlist_interface()
 	sed -i "" /^$1\$/d created_interfaces.lst
 }
 
+_vnet_check_req()
+{
+	type=$1
+
+	if kldstat -q -n if_${type}.ko; then
+		return
+	fi
+
+	if ! kldload -n -q if_${type}; then
+		atf_skip "if_${type}.ko is required to run this test."
+		return
+	fi
+}
+
 vnet_init()
 {
 	if [ "`sysctl -i -n kern.features.vimage`" != 1 ]; then
 		atf_skip "This test requires VIMAGE"
 	fi
+
+	# Check if we can create if_epair or if_bridge interfaces.
+	# We may be running in a jail already, unable to load modules.
+	# If so, skip this test because it very likely (but not certainly)
+	# wants at least one of those
+	_vnet_check_req epair
+	_vnet_check_req bridge
 }
 
 vnet_mkepair()
diff --git a/tests/sys/netpfil/pf/utils.subr b/tests/sys/netpfil/pf/utils.subr
index 25720c1bcb66..f02dfc22049f 100644
--- a/tests/sys/netpfil/pf/utils.subr
+++ b/tests/sys/netpfil/pf/utils.subr
@@ -83,6 +83,8 @@ pfsynct_init()
 
 pflog_init()
 {
+	pft_init
+
 	if ! kldstat -q -m pflog; then
 		atf_skip "This test requires pflog"
 	fi