Jakub Kicinski wrote:
Nothing surprising here, hopefully. Wrap the variables from the environment into a class or spawn a netdevsim based env and pass it to the tests.
Signed-off-by: Jakub Kicinski kuba@kernel.org
.../testing/selftests/drivers/net/README.rst | 31 +++++++ .../selftests/drivers/net/lib/py/env.py | 93 ++++++++++++++++++- .../testing/selftests/net/lib/py/__init__.py | 1 + tools/testing/selftests/net/lib/py/netns.py | 31 +++++++ 4 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/net/lib/py/netns.py
diff --git a/tools/testing/selftests/drivers/net/README.rst b/tools/testing/selftests/drivers/net/README.rst index 5ef7c417d431..ffc15fe5d555 100644 --- a/tools/testing/selftests/drivers/net/README.rst +++ b/tools/testing/selftests/drivers/net/README.rst @@ -23,8 +23,39 @@ Variables can be set in the environment or by creating a net.config # Variable set in a file NETIF=eth0 +Please note that the config parser is very simple, if there are +any non-alphanumeric characters in the value it needs to be in +double quotes.
NETIF
Name of the netdevice against which the test should be executed. When empty or not set software devices will be used. + +LOCAL_V4, LOCAL_V6, EP_V4, EP_V6 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Local and remote (endpoint) IP addresses.
Overall, this is really cool stuff (obviously)!
REMOTE instead of EP?
Apparently I missed the earlier discussion. Would it also be possible to have both sides be remote. Where the test runner might run on the build host, but the kernel under test is run on two test machines.
To a certain extent, same for having two equivalent child network namespaces isolated from the runner's environment.
+EP_TYPE +~~~~~~~
+Communication method used to run commands on the endpoint. +Test framework supports using ``netns`` and ``ssh`` channels. +``netns`` assumes the "remote" interface is part of the same +host, just moved to the specified netns. +``ssh`` communicates with remote endpoint over ``ssh`` and ``scp``.
+Communication methods are defined by classes in ``lib/py/ep_{name}.py``. +It should be possible to add a new method without modifying any of +the framework, by simply adding an appropriately named file to ``lib/py``.
+EP_ARGS +~~~~~~~
+Arguments used to construct the communication channel. +Communication channel dependent::
- for netns - name of the "remote" namespace
- for ssh - name/address of the remote host
diff --git a/tools/testing/selftests/drivers/net/lib/py/env.py b/tools/testing/selftests/drivers/net/lib/py/env.py index a081e168f3db..f63be0a72a53 100644 --- a/tools/testing/selftests/drivers/net/lib/py/env.py +++ b/tools/testing/selftests/drivers/net/lib/py/env.py @@ -4,7 +4,8 @@ import os import shlex from pathlib import Path from lib.py import ip -from lib.py import NetdevSimDev +from lib.py import NetNS, NetdevSimDev +from .endpoint import Endpoint def _load_env_file(src_path): @@ -59,3 +60,93 @@ from lib.py import NetdevSimDev self._ns = None +class NetDrvEpEnv:
- """
- Class for an environment with a local device and "remote endpoint"
- which can be used to send traffic in.
- For local testing it creates two network namespaces and a pair
- of netdevsim devices.
- """
- def __init__(self, src_path):
self.env = _load_env_file(src_path)
# Things we try to destroy
self.endpoint = None
# These are for local testing state
self._netns = None
self._ns = None
self._ns_peer = None
if "NETIF" in self.env:
self.dev = ip("link show dev " + self.env['NETIF'], json=True)[0]
self.v4 = self.env.get("LOCAL_V4")
self.v6 = self.env.get("LOCAL_V6")
self.ep_v4 = self.env.get("EP_V4")
self.ep_v6 = self.env.get("EP_V6")
ep_type = self.env["EP_TYPE"]
ep_args = self.env["EP_ARGS"]
else:
self.create_local()
self.dev = self._ns.nsims[0].dev
self.v4 = "192.0.2.1"
self.v6 ="0100::1"
self.ep_v4 = "192.0.2.2"
self.ep_v6 = "0100::2"
Use FC00::/7 ULA addresses?
ep_type = "netns"
ep_args = self._netns.name
self.endpoint = Endpoint(ep_type, ep_args)
self.addr = self.v6 if self.v6 else self.v4
self.ep_addr = self.ep_v6 if self.ep_v6 else self.ep_v4
self.ifname = self.dev['ifname']
self.ifindex = self.dev['ifindex']