* [PATCH net-next 1/4] selftests/net: Add bpf skb forwarding program
2026-02-10 20:04 [PATCH net-next 0/4] selftests/net: add netkit container env and test David Wei
@ 2026-02-10 20:04 ` David Wei
2026-02-10 20:04 ` [PATCH net-next 2/4] selftests/net: Export Netlink class via lib.py David Wei
` (2 subsequent siblings)
3 siblings, 0 replies; 8+ messages in thread
From: David Wei @ 2026-02-10 20:04 UTC (permalink / raw)
To: netdev
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Joe Damato, Wei Wang, Bobby Eshleman,
Stanislav Fomichev, Nikolay Aleksandrov
Add nk_forward.bpf.c, a BPF program that forwards skbs matching some IPv6
prefix received on eth0 ifindex to a specified netkit ifindex. This will
be needed by netkit container tests.
Signed-off-by: David Wei <dw@davidwei.uk>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Stanislav Fomichev <sdf@fomichev.me>
Reviewed-by: Nikolay Aleksandrov <razor@blackwall.org>
---
.../selftests/drivers/net/hw/nk_forward.bpf.c | 49 +++++++++++++++++++
1 file changed, 49 insertions(+)
create mode 100644 tools/testing/selftests/drivers/net/hw/nk_forward.bpf.c
diff --git a/tools/testing/selftests/drivers/net/hw/nk_forward.bpf.c b/tools/testing/selftests/drivers/net/hw/nk_forward.bpf.c
new file mode 100644
index 000000000000..86ebfc1445b6
--- /dev/null
+++ b/tools/testing/selftests/drivers/net/hw/nk_forward.bpf.c
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: GPL-2.0
+#include <linux/bpf.h>
+#include <linux/pkt_cls.h>
+#include <linux/if_ether.h>
+#include <linux/ipv6.h>
+#include <linux/in6.h>
+#include <bpf/bpf_endian.h>
+#include <bpf/bpf_helpers.h>
+
+#define TC_ACT_OK 0
+#define ETH_P_IPV6 0x86DD
+
+#define ctx_ptr(field) ((void *)(long)(field))
+
+#define v6_p64_equal(a, b) (a.s6_addr32[0] == b.s6_addr32[0] && \
+ a.s6_addr32[1] == b.s6_addr32[1])
+
+volatile __u32 netkit_ifindex;
+volatile __u8 ipv6_prefix[16];
+
+SEC("tc/ingress")
+int tc_redirect_peer(struct __sk_buff *skb)
+{
+ void *data_end = ctx_ptr(skb->data_end);
+ void *data = ctx_ptr(skb->data);
+ struct in6_addr *peer_addr;
+ struct ipv6hdr *ip6h;
+ struct ethhdr *eth;
+
+ peer_addr = (struct in6_addr *)ipv6_prefix;
+
+ if (skb->protocol != bpf_htons(ETH_P_IPV6))
+ return TC_ACT_OK;
+
+ eth = data;
+ if ((void *)(eth + 1) > data_end)
+ return TC_ACT_OK;
+
+ ip6h = data + sizeof(struct ethhdr);
+ if ((void *)(ip6h + 1) > data_end)
+ return TC_ACT_OK;
+
+ if (!v6_p64_equal(ip6h->daddr, (*peer_addr)))
+ return TC_ACT_OK;
+
+ return bpf_redirect_peer(netkit_ifindex, 0);
+}
+
+char __license[] SEC("license") = "GPL";
--
2.47.3
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH net-next 2/4] selftests/net: Export Netlink class via lib.py
2026-02-10 20:04 [PATCH net-next 0/4] selftests/net: add netkit container env and test David Wei
2026-02-10 20:04 ` [PATCH net-next 1/4] selftests/net: Add bpf skb forwarding program David Wei
@ 2026-02-10 20:04 ` David Wei
2026-02-11 16:12 ` Bobby Eshleman
2026-02-10 20:04 ` [PATCH net-next 3/4] selftests/net: Add env for container based tests David Wei
2026-02-10 20:04 ` [PATCH net-next 4/4] selftests/net: Add netkit container ping test David Wei
3 siblings, 1 reply; 8+ messages in thread
From: David Wei @ 2026-02-10 20:04 UTC (permalink / raw)
To: netdev
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Joe Damato, Wei Wang, Bobby Eshleman,
Stanislav Fomichev, Nikolay Aleksandrov
Making rtnl newlink calls requires constants defined in Netlink class in
pyynl. Export it.
Signed-off-by: David Wei <dw@davidwei.uk>
---
tools/testing/selftests/drivers/net/lib/py/__init__.py | 4 ++--
tools/testing/selftests/net/lib/py/__init__.py | 4 ++--
tools/testing/selftests/net/lib/py/ynl.py | 4 ++--
3 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/tools/testing/selftests/drivers/net/lib/py/__init__.py b/tools/testing/selftests/drivers/net/lib/py/__init__.py
index 8b75faa9af6d..a18e21069f7a 100644
--- a/tools/testing/selftests/drivers/net/lib/py/__init__.py
+++ b/tools/testing/selftests/drivers/net/lib/py/__init__.py
@@ -19,7 +19,7 @@ try:
# Import one by one to avoid pylint false positives
from net.lib.py import NetNS, NetNSEnter, NetdevSimDev
from net.lib.py import EthtoolFamily, NetdevFamily, NetshaperFamily, \
- NlError, RtnlFamily, DevlinkFamily, PSPFamily
+ NlError, RtnlFamily, DevlinkFamily, PSPFamily, Netlink
from net.lib.py import CmdExitFailure
from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \
fd_read_timeout, ip, rand_port, wait_port_listen, wait_file
@@ -31,7 +31,7 @@ try:
__all__ = ["NetNS", "NetNSEnter", "NetdevSimDev",
"EthtoolFamily", "NetdevFamily", "NetshaperFamily",
- "NlError", "RtnlFamily", "DevlinkFamily", "PSPFamily",
+ "NlError", "RtnlFamily", "DevlinkFamily", "PSPFamily", "Netlink",
"CmdExitFailure",
"bkg", "cmd", "bpftool", "bpftrace", "defer", "ethtool",
"fd_read_timeout", "ip", "rand_port",
diff --git a/tools/testing/selftests/net/lib/py/__init__.py b/tools/testing/selftests/net/lib/py/__init__.py
index f528b67639de..fec518c2a0dc 100644
--- a/tools/testing/selftests/net/lib/py/__init__.py
+++ b/tools/testing/selftests/net/lib/py/__init__.py
@@ -15,7 +15,7 @@ from .nsim import NetdevSim, NetdevSimDev
from .utils import CmdExitFailure, fd_read_timeout, cmd, bkg, defer, \
bpftool, ip, ethtool, bpftrace, rand_port, wait_port_listen, wait_file, tool
from .ynl import NlError, YnlFamily, EthtoolFamily, NetdevFamily, RtnlFamily, RtnlAddrFamily
-from .ynl import NetshaperFamily, DevlinkFamily, PSPFamily
+from .ynl import NetshaperFamily, DevlinkFamily, PSPFamily, Netlink
__all__ = ["KSRC",
"KsftFailEx", "KsftSkipEx", "KsftXfailEx", "ksft_pr", "ksft_eq",
@@ -30,4 +30,4 @@ __all__ = ["KSRC",
"NetdevSim", "NetdevSimDev",
"NetshaperFamily", "DevlinkFamily", "PSPFamily", "NlError",
"YnlFamily", "EthtoolFamily", "NetdevFamily", "RtnlFamily",
- "RtnlAddrFamily"]
+ "RtnlAddrFamily", "Netlink"]
diff --git a/tools/testing/selftests/net/lib/py/ynl.py b/tools/testing/selftests/net/lib/py/ynl.py
index 32c223e93b2c..a52b067f7589 100644
--- a/tools/testing/selftests/net/lib/py/ynl.py
+++ b/tools/testing/selftests/net/lib/py/ynl.py
@@ -13,14 +13,14 @@ try:
SPEC_PATH = KSFT_DIR / "net/lib/specs"
sys.path.append(tools_full_path.as_posix())
- from net.lib.ynl.pyynl.lib import YnlFamily, NlError
+ from net.lib.ynl.pyynl.lib import YnlFamily, NlError, Netlink
else:
# Running in tree
tools_full_path = KSRC / "tools"
SPEC_PATH = KSRC / "Documentation/netlink/specs"
sys.path.append(tools_full_path.as_posix())
- from net.ynl.pyynl.lib import YnlFamily, NlError
+ from net.ynl.pyynl.lib import YnlFamily, NlError, Netlink
except ModuleNotFoundError as e:
ksft_pr("Failed importing `ynl` library from kernel sources")
ksft_pr(str(e))
--
2.47.3
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH net-next 2/4] selftests/net: Export Netlink class via lib.py
2026-02-10 20:04 ` [PATCH net-next 2/4] selftests/net: Export Netlink class via lib.py David Wei
@ 2026-02-11 16:12 ` Bobby Eshleman
0 siblings, 0 replies; 8+ messages in thread
From: Bobby Eshleman @ 2026-02-11 16:12 UTC (permalink / raw)
To: David Wei
Cc: netdev, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Joe Damato, Wei Wang,
Stanislav Fomichev, Nikolay Aleksandrov
On Tue, Feb 10, 2026 at 12:04:17PM -0800, David Wei wrote:
> Making rtnl newlink calls requires constants defined in Netlink class in
> pyynl. Export it.
>
> Signed-off-by: David Wei <dw@davidwei.uk>
> ---
> tools/testing/selftests/drivers/net/lib/py/__init__.py | 4 ++--
> tools/testing/selftests/net/lib/py/__init__.py | 4 ++--
> tools/testing/selftests/net/lib/py/ynl.py | 4 ++--
> 3 files changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/tools/testing/selftests/drivers/net/lib/py/__init__.py b/tools/testing/selftests/drivers/net/lib/py/__init__.py
> index 8b75faa9af6d..a18e21069f7a 100644
> --- a/tools/testing/selftests/drivers/net/lib/py/__init__.py
> +++ b/tools/testing/selftests/drivers/net/lib/py/__init__.py
> @@ -19,7 +19,7 @@ try:
> # Import one by one to avoid pylint false positives
> from net.lib.py import NetNS, NetNSEnter, NetdevSimDev
> from net.lib.py import EthtoolFamily, NetdevFamily, NetshaperFamily, \
> - NlError, RtnlFamily, DevlinkFamily, PSPFamily
> + NlError, RtnlFamily, DevlinkFamily, PSPFamily, Netlink
> from net.lib.py import CmdExitFailure
> from net.lib.py import bkg, cmd, bpftool, bpftrace, defer, ethtool, \
> fd_read_timeout, ip, rand_port, wait_port_listen, wait_file
> @@ -31,7 +31,7 @@ try:
>
> __all__ = ["NetNS", "NetNSEnter", "NetdevSimDev",
> "EthtoolFamily", "NetdevFamily", "NetshaperFamily",
> - "NlError", "RtnlFamily", "DevlinkFamily", "PSPFamily",
> + "NlError", "RtnlFamily", "DevlinkFamily", "PSPFamily", "Netlink",
> "CmdExitFailure",
> "bkg", "cmd", "bpftool", "bpftrace", "defer", "ethtool",
> "fd_read_timeout", "ip", "rand_port",
> diff --git a/tools/testing/selftests/net/lib/py/__init__.py b/tools/testing/selftests/net/lib/py/__init__.py
> index f528b67639de..fec518c2a0dc 100644
> --- a/tools/testing/selftests/net/lib/py/__init__.py
> +++ b/tools/testing/selftests/net/lib/py/__init__.py
> @@ -15,7 +15,7 @@ from .nsim import NetdevSim, NetdevSimDev
> from .utils import CmdExitFailure, fd_read_timeout, cmd, bkg, defer, \
> bpftool, ip, ethtool, bpftrace, rand_port, wait_port_listen, wait_file, tool
> from .ynl import NlError, YnlFamily, EthtoolFamily, NetdevFamily, RtnlFamily, RtnlAddrFamily
> -from .ynl import NetshaperFamily, DevlinkFamily, PSPFamily
> +from .ynl import NetshaperFamily, DevlinkFamily, PSPFamily, Netlink
>
> __all__ = ["KSRC",
> "KsftFailEx", "KsftSkipEx", "KsftXfailEx", "ksft_pr", "ksft_eq",
> @@ -30,4 +30,4 @@ __all__ = ["KSRC",
> "NetdevSim", "NetdevSimDev",
> "NetshaperFamily", "DevlinkFamily", "PSPFamily", "NlError",
> "YnlFamily", "EthtoolFamily", "NetdevFamily", "RtnlFamily",
> - "RtnlAddrFamily"]
> + "RtnlAddrFamily", "Netlink"]
> diff --git a/tools/testing/selftests/net/lib/py/ynl.py b/tools/testing/selftests/net/lib/py/ynl.py
> index 32c223e93b2c..a52b067f7589 100644
> --- a/tools/testing/selftests/net/lib/py/ynl.py
> +++ b/tools/testing/selftests/net/lib/py/ynl.py
> @@ -13,14 +13,14 @@ try:
> SPEC_PATH = KSFT_DIR / "net/lib/specs"
>
> sys.path.append(tools_full_path.as_posix())
> - from net.lib.ynl.pyynl.lib import YnlFamily, NlError
> + from net.lib.ynl.pyynl.lib import YnlFamily, NlError, Netlink
> else:
> # Running in tree
> tools_full_path = KSRC / "tools"
> SPEC_PATH = KSRC / "Documentation/netlink/specs"
>
> sys.path.append(tools_full_path.as_posix())
> - from net.ynl.pyynl.lib import YnlFamily, NlError
> + from net.ynl.pyynl.lib import YnlFamily, NlError, Netlink
> except ModuleNotFoundError as e:
> ksft_pr("Failed importing `ynl` library from kernel sources")
> ksft_pr(str(e))
> --
> 2.47.3
>
Reviewed-by: Bobby Eshleman <bobbyeshleman@meta.com>
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next 3/4] selftests/net: Add env for container based tests
2026-02-10 20:04 [PATCH net-next 0/4] selftests/net: add netkit container env and test David Wei
2026-02-10 20:04 ` [PATCH net-next 1/4] selftests/net: Add bpf skb forwarding program David Wei
2026-02-10 20:04 ` [PATCH net-next 2/4] selftests/net: Export Netlink class via lib.py David Wei
@ 2026-02-10 20:04 ` David Wei
2026-02-11 17:43 ` Bobby Eshleman
2026-02-10 20:04 ` [PATCH net-next 4/4] selftests/net: Add netkit container ping test David Wei
3 siblings, 1 reply; 8+ messages in thread
From: David Wei @ 2026-02-10 20:04 UTC (permalink / raw)
To: netdev
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Joe Damato, Wei Wang, Bobby Eshleman,
Stanislav Fomichev, Nikolay Aleksandrov
Add an env NetDrvContEnv for container based selftests. This automates
the setup of a netns, netkit pair with one inside the netns, and a BPF
program that forwards skbs from the NETIF host inside the container.
Currently only netkit is used, but other virtual netdevs e.g. veth can
be used too.
Expect netkit container datapath selftests to have a publicly routable
IP prefix to assign to netkit in a container, such that packets will
land on eth0. The BPF skb forward program will then forward such packets
from the host netns to the container netns.
Signed-off-by: David Wei <dw@davidwei.uk>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
---
.../testing/selftests/drivers/net/README.rst | 19 ++
.../drivers/net/hw/lib/py/__init__.py | 7 +-
.../selftests/drivers/net/lib/py/__init__.py | 7 +-
.../selftests/drivers/net/lib/py/env.py | 163 ++++++++++++++++++
4 files changed, 190 insertions(+), 6 deletions(-)
diff --git a/tools/testing/selftests/drivers/net/README.rst b/tools/testing/selftests/drivers/net/README.rst
index eb838ae94844..39370a83f238 100644
--- a/tools/testing/selftests/drivers/net/README.rst
+++ b/tools/testing/selftests/drivers/net/README.rst
@@ -62,6 +62,25 @@ LOCAL_V4, LOCAL_V6, REMOTE_V4, REMOTE_V6
Local and remote endpoint IP addresses.
+LOCAL_PREFIX_V4, LOCAL_PREFIX_V6
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Local IP prefix/subnet which can be used to allocate extra IP addresses (for
+network name spaces behind macvlan, veth, netkit devices). DUT must be
+reachable using these addresses from the endpoint.
+
+ +-------------+ +----------------------------+
+ | INIT NS | | TEST NS |
+ | +---------+ | | +------------------------+ |
+ | | NETIF | | bpf | | Netkit | |
+ | | |-|--------|>| nk_guest | |
+ | +---------+ | | | {LOCAL_PREFIX_V6}::2:2 | |
+ | +---------+ | | +------------------------+ |
+ | | Netkit | | +----------------------------+
+ | | nk_host | |
+ | +---------+ |
+ +-------------+
+
REMOTE_TYPE
~~~~~~~~~~~
diff --git a/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py b/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py
index d5d247eca6b7..022008249313 100644
--- a/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py
+++ b/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py
@@ -3,6 +3,7 @@
"""
Driver test environment (hardware-only tests).
NetDrvEnv and NetDrvEpEnv are the main environment classes.
+NetDrvContEnv extends NetDrvEpEnv with netkit container support.
Former is for local host only tests, latter creates / connects
to a remote endpoint. See NIPA wiki for more information about
running and writing driver tests.
@@ -29,7 +30,7 @@ try:
from net.lib.py import ksft_eq, ksft_ge, ksft_in, ksft_is, ksft_lt, \
ksft_ne, ksft_not_in, ksft_raises, ksft_true, ksft_gt, ksft_not_none
from drivers.net.lib.py import GenerateTraffic, Remote, Iperf3Runner
- from drivers.net.lib.py import NetDrvEnv, NetDrvEpEnv
+ from drivers.net.lib.py import NetDrvEnv, NetDrvEpEnv, NetDrvContEnv
__all__ = ["NetNS", "NetNSEnter", "NetdevSimDev",
"EthtoolFamily", "NetdevFamily", "NetshaperFamily",
@@ -44,8 +45,8 @@ try:
"ksft_eq", "ksft_ge", "ksft_in", "ksft_is", "ksft_lt",
"ksft_ne", "ksft_not_in", "ksft_raises", "ksft_true", "ksft_gt",
"ksft_not_none", "ksft_not_none",
- "NetDrvEnv", "NetDrvEpEnv", "GenerateTraffic", "Remote",
- "Iperf3Runner"]
+ "NetDrvEnv", "NetDrvEpEnv", "NetDrvContEnv", "GenerateTraffic",
+ "Remote", "Iperf3Runner"]
except ModuleNotFoundError as e:
print("Failed importing `net` library from kernel sources")
print(str(e))
diff --git a/tools/testing/selftests/drivers/net/lib/py/__init__.py b/tools/testing/selftests/drivers/net/lib/py/__init__.py
index a18e21069f7a..6b55068d5370 100644
--- a/tools/testing/selftests/drivers/net/lib/py/__init__.py
+++ b/tools/testing/selftests/drivers/net/lib/py/__init__.py
@@ -3,6 +3,7 @@
"""
Driver test environment.
NetDrvEnv and NetDrvEpEnv are the main environment classes.
+NetDrvContEnv extends NetDrvEpEnv with netkit container support.
Former is for local host only tests, latter creates / connects
to a remote endpoint. See NIPA wiki for more information about
running and writing driver tests.
@@ -43,12 +44,12 @@ try:
"ksft_ne", "ksft_not_in", "ksft_raises", "ksft_true", "ksft_gt",
"ksft_not_none", "ksft_not_none"]
- from .env import NetDrvEnv, NetDrvEpEnv
+ from .env import NetDrvEnv, NetDrvEpEnv, NetDrvContEnv
from .load import GenerateTraffic, Iperf3Runner
from .remote import Remote
- __all__ += ["NetDrvEnv", "NetDrvEpEnv", "GenerateTraffic", "Remote",
- "Iperf3Runner"]
+ __all__ += ["NetDrvEnv", "NetDrvEpEnv", "NetDrvContEnv", "GenerateTraffic",
+ "Remote", "Iperf3Runner"]
except ModuleNotFoundError as e:
print("Failed importing `net` library from kernel sources")
print(str(e))
diff --git a/tools/testing/selftests/drivers/net/lib/py/env.py b/tools/testing/selftests/drivers/net/lib/py/env.py
index 41cc248ac848..857ae0f37516 100644
--- a/tools/testing/selftests/drivers/net/lib/py/env.py
+++ b/tools/testing/selftests/drivers/net/lib/py/env.py
@@ -1,13 +1,16 @@
# SPDX-License-Identifier: GPL-2.0
+import ipaddress
import os
import time
+import json
from pathlib import Path
from lib.py import KsftSkipEx, KsftXfailEx
from lib.py import ksft_setup, wait_file
from lib.py import cmd, ethtool, ip, CmdExitFailure
from lib.py import NetNS, NetdevSimDev
from .remote import Remote
+from . import bpftool, RtnlFamily, Netlink
class NetDrvEnvBase:
@@ -289,3 +292,163 @@ class NetDrvEpEnv(NetDrvEnvBase):
data.get('stats-block-usecs', 0) / 1000 / 1000
time.sleep(self._stats_settle_time)
+
+
+class NetDrvContEnv(NetDrvEpEnv):
+ """
+ Class for an environment with a netkit pair setup for forwarding traffic
+ between the physical interface and a network namespace.
+ +-------------+ +----------------------------+
+ | INIT NS | | TEST NS |
+ | +---------+ | | +------------------------+ |
+ | | NETIF | | bpf | | Netkit | |
+ | | |-|--------|>| nk_guest | |
+ | +---------+ | | | {LOCAL_PREFIX_V6}::2:2 | |
+ | +---------+ | | +------------------------+ |
+ | | Netkit | | +----------------------------+
+ | | nk_host | |
+ | +---------+ |
+ +-------------+
+ """
+
+ def __init__(self, src_path, rxqueues=1, **kwargs):
+ super().__init__(src_path, **kwargs)
+
+ self.netns = None
+ self._nk_host_ifname = None
+ self._nk_guest_ifname = None
+ self._tc_clsact_added = False
+ self._tc_attached = False
+ self._bpf_prog_pref = None
+ self._bpf_prog_id = None
+ self._init_ns_attached = False
+
+ self.require_ipver("6")
+ local_prefix = self.env.get("LOCAL_PREFIX_V6")
+ if not local_prefix:
+ raise KsftSkipEx("LOCAL_PREFIX_V6 required")
+
+ local_prefix = local_prefix.rstrip("/64").rstrip("::").rstrip(":")
+ self.ipv6_prefix = f"{local_prefix}::"
+ self.nk_host_ipv6 = f"{local_prefix}::2:1"
+ self.nk_guest_ipv6 = f"{local_prefix}::2:2"
+
+ rtnl = RtnlFamily()
+ rtnl.newlink(
+ {
+ "linkinfo": {
+ "kind": "netkit",
+ "data": {
+ "mode": "l2",
+ "policy": "forward",
+ "peer-policy": "forward",
+ },
+ },
+ "num-rx-queues": rxqueues,
+ },
+ flags=[Netlink.NLM_F_CREATE, Netlink.NLM_F_EXCL],
+ )
+
+ all_links = ip("-d link show", json=True)
+ netkit_links = [link for link in all_links
+ if link.get('linkinfo', {}).get('info_kind') == 'netkit'
+ and 'UP' not in link.get('flags', [])]
+
+ if len(netkit_links) != 2:
+ raise KsftSkipEx("Failed to create netkit pair")
+
+ netkit_links.sort(key=lambda x: x['ifindex'])
+ self._nk_host_ifname = netkit_links[1]['ifname']
+ self._nk_guest_ifname = netkit_links[0]['ifname']
+ self.nk_host_ifindex = netkit_links[1]['ifindex']
+ self.nk_guest_ifindex = netkit_links[0]['ifindex']
+
+ self._setup_ns()
+ self._attach_bpf()
+
+ def __del__(self):
+ if self._tc_attached:
+ cmd(f"tc filter del dev {self.ifname} ingress pref {self._bpf_prog_pref}")
+ self._tc_attached = False
+
+ if self._tc_clsact_added:
+ cmd(f"tc qdisc del dev {self.ifname} clsact")
+ self._tc_clsact_added = False
+
+ if self._nk_host_ifname:
+ cmd(f"ip link del dev {self._nk_host_ifname}")
+ self._nk_host_ifname = None
+ self._nk_guest_ifname = None
+
+ if self._init_ns_attached:
+ cmd("ip netns del init", fail=False)
+ self._init_ns_attached = False
+
+ if self.netns:
+ del self.netns
+ self.netns = None
+
+ super().__del__()
+
+ def _setup_ns(self):
+ self.netns = NetNS()
+ cmd("ip netns attach init 1")
+ self._init_ns_attached = True
+ ip("netns set init 0", ns=self.netns)
+ ip(f"link set dev {self._nk_guest_ifname} netns {self.netns.name}")
+ ip(f"link set dev {self._nk_host_ifname} up")
+ ip(f"-6 addr add fe80::1/64 dev {self._nk_host_ifname} nodad")
+ ip(f"-6 route add {self.nk_guest_ipv6}/128 via fe80::2 dev {self._nk_host_ifname}")
+
+ ip("link set lo up", ns=self.netns)
+ ip(f"link set dev {self._nk_guest_ifname} up", ns=self.netns)
+ ip(f"-6 addr add fe80::2/64 dev {self._nk_guest_ifname}", ns=self.netns)
+ ip(f"-6 addr add {self.nk_guest_ipv6}/64 dev {self._nk_guest_ifname} nodad", ns=self.netns)
+ ip(f"-6 route add default via fe80::1 dev {self._nk_guest_ifname}", ns=self.netns)
+
+ def _tc_ensure_clsact(self):
+ qdisc = json.loads(cmd(f"tc -j qdisc show dev {self.ifname}").stdout)
+ for q in qdisc:
+ if q['kind'] == 'clsact':
+ return
+ cmd(f"tc qdisc add dev {self.ifname} clsact")
+ self._tc_clsact_added = True
+
+ def _get_bpf_prog_ids(self):
+ filter = json.loads(cmd(f"tc -j filter show dev {self.ifname} ingress").stdout)
+ for bpf in filter:
+ if 'options' not in bpf:
+ continue
+ if bpf['options']['bpf_name'].startswith('nk_forward.bpf'):
+ return (bpf['pref'], bpf['options']['prog']['id'])
+ if self._bpf_prog_pref is None:
+ raise Exception("Failed to get BPF prog ID")
+
+ def _attach_bpf(self):
+ bpf_obj = self.test_dir / "nk_forward.bpf.o"
+ if not bpf_obj.exists():
+ raise KsftSkipEx("BPF prog not found")
+
+ self._tc_ensure_clsact()
+ cmd(f"tc filter add dev {self.ifname} ingress bpf obj {bpf_obj} sec tc/ingress direct-action")
+ self._tc_attached = True
+
+ (self._bpf_prog_pref, self._bpf_prog_id) = self._get_bpf_prog_ids()
+ prog_info = bpftool(f"prog show id {self._bpf_prog_id}", json=True)
+ map_ids = prog_info.get("map_ids", [])
+
+ bss_map_id = None
+ for map_id in map_ids:
+ map_info = bpftool(f"map show id {map_id}", json=True)
+ if map_info.get("name").endswith("bss"):
+ bss_map_id = map_id
+
+ if bss_map_id is None:
+ raise Exception("Failed to find .bss map")
+
+ ipv6_addr = ipaddress.IPv6Address(self.ipv6_prefix)
+ ipv6_bytes = ipv6_addr.packed
+ ifindex_bytes = self.nk_host_ifindex.to_bytes(4, byteorder='little')
+ value = ipv6_bytes + ifindex_bytes
+ value_hex = ' '.join(f'{b:02x}' for b in value)
+ bpftool(f"map update id {bss_map_id} key hex 00 00 00 00 value hex {value_hex}")
--
2.47.3
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH net-next 3/4] selftests/net: Add env for container based tests
2026-02-10 20:04 ` [PATCH net-next 3/4] selftests/net: Add env for container based tests David Wei
@ 2026-02-11 17:43 ` Bobby Eshleman
0 siblings, 0 replies; 8+ messages in thread
From: Bobby Eshleman @ 2026-02-11 17:43 UTC (permalink / raw)
To: David Wei
Cc: netdev, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Joe Damato, Wei Wang,
Stanislav Fomichev, Nikolay Aleksandrov
On Tue, Feb 10, 2026 at 12:04:18PM -0800, David Wei wrote:
> Add an env NetDrvContEnv for container based selftests. This automates
> the setup of a netns, netkit pair with one inside the netns, and a BPF
> program that forwards skbs from the NETIF host inside the container.
>
> Currently only netkit is used, but other virtual netdevs e.g. veth can
> be used too.
>
> Expect netkit container datapath selftests to have a publicly routable
> IP prefix to assign to netkit in a container, such that packets will
> land on eth0. The BPF skb forward program will then forward such packets
> from the host netns to the container netns.
>
> Signed-off-by: David Wei <dw@davidwei.uk>
> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
> ---
> .../testing/selftests/drivers/net/README.rst | 19 ++
> .../drivers/net/hw/lib/py/__init__.py | 7 +-
> .../selftests/drivers/net/lib/py/__init__.py | 7 +-
> .../selftests/drivers/net/lib/py/env.py | 163 ++++++++++++++++++
> 4 files changed, 190 insertions(+), 6 deletions(-)
>
> diff --git a/tools/testing/selftests/drivers/net/README.rst b/tools/testing/selftests/drivers/net/README.rst
> index eb838ae94844..39370a83f238 100644
> --- a/tools/testing/selftests/drivers/net/README.rst
> +++ b/tools/testing/selftests/drivers/net/README.rst
> @@ -62,6 +62,25 @@ LOCAL_V4, LOCAL_V6, REMOTE_V4, REMOTE_V6
>
> Local and remote endpoint IP addresses.
>
> +LOCAL_PREFIX_V4, LOCAL_PREFIX_V6
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I think LOCAL_PREFIX_V4 is not supported in this series?
> +
> +Local IP prefix/subnet which can be used to allocate extra IP addresses (for
> +network name spaces behind macvlan, veth, netkit devices). DUT must be
> +reachable using these addresses from the endpoint.
> +
> + +-------------+ +----------------------------+
> + | INIT NS | | TEST NS |
> + | +---------+ | | +------------------------+ |
> + | | NETIF | | bpf | | Netkit | |
> + | | |-|--------|>| nk_guest | |
> + | +---------+ | | | {LOCAL_PREFIX_V6}::2:2 | |
> + | +---------+ | | +------------------------+ |
> + | | Netkit | | +----------------------------+
> + | | nk_host | |
> + | +---------+ |
> + +-------------+
> +
> REMOTE_TYPE
> ~~~~~~~~~~~
>
> diff --git a/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py b/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py
> index d5d247eca6b7..022008249313 100644
> --- a/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py
> +++ b/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py
> @@ -3,6 +3,7 @@
> """
> Driver test environment (hardware-only tests).
> NetDrvEnv and NetDrvEpEnv are the main environment classes.
> +NetDrvContEnv extends NetDrvEpEnv with netkit container support.
> Former is for local host only tests, latter creates / connects
> to a remote endpoint. See NIPA wiki for more information about
> running and writing driver tests.
> @@ -29,7 +30,7 @@ try:
> from net.lib.py import ksft_eq, ksft_ge, ksft_in, ksft_is, ksft_lt, \
> ksft_ne, ksft_not_in, ksft_raises, ksft_true, ksft_gt, ksft_not_none
> from drivers.net.lib.py import GenerateTraffic, Remote, Iperf3Runner
> - from drivers.net.lib.py import NetDrvEnv, NetDrvEpEnv
> + from drivers.net.lib.py import NetDrvEnv, NetDrvEpEnv, NetDrvContEnv
>
> __all__ = ["NetNS", "NetNSEnter", "NetdevSimDev",
> "EthtoolFamily", "NetdevFamily", "NetshaperFamily",
> @@ -44,8 +45,8 @@ try:
> "ksft_eq", "ksft_ge", "ksft_in", "ksft_is", "ksft_lt",
> "ksft_ne", "ksft_not_in", "ksft_raises", "ksft_true", "ksft_gt",
> "ksft_not_none", "ksft_not_none",
> - "NetDrvEnv", "NetDrvEpEnv", "GenerateTraffic", "Remote",
> - "Iperf3Runner"]
> + "NetDrvEnv", "NetDrvEpEnv", "NetDrvContEnv", "GenerateTraffic",
> + "Remote", "Iperf3Runner"]
> except ModuleNotFoundError as e:
> print("Failed importing `net` library from kernel sources")
> print(str(e))
> diff --git a/tools/testing/selftests/drivers/net/lib/py/__init__.py b/tools/testing/selftests/drivers/net/lib/py/__init__.py
> index a18e21069f7a..6b55068d5370 100644
> --- a/tools/testing/selftests/drivers/net/lib/py/__init__.py
> +++ b/tools/testing/selftests/drivers/net/lib/py/__init__.py
> @@ -3,6 +3,7 @@
> """
> Driver test environment.
> NetDrvEnv and NetDrvEpEnv are the main environment classes.
> +NetDrvContEnv extends NetDrvEpEnv with netkit container support.
> Former is for local host only tests, latter creates / connects
> to a remote endpoint. See NIPA wiki for more information about
> running and writing driver tests.
> @@ -43,12 +44,12 @@ try:
> "ksft_ne", "ksft_not_in", "ksft_raises", "ksft_true", "ksft_gt",
> "ksft_not_none", "ksft_not_none"]
>
> - from .env import NetDrvEnv, NetDrvEpEnv
> + from .env import NetDrvEnv, NetDrvEpEnv, NetDrvContEnv
> from .load import GenerateTraffic, Iperf3Runner
> from .remote import Remote
>
> - __all__ += ["NetDrvEnv", "NetDrvEpEnv", "GenerateTraffic", "Remote",
> - "Iperf3Runner"]
> + __all__ += ["NetDrvEnv", "NetDrvEpEnv", "NetDrvContEnv", "GenerateTraffic",
> + "Remote", "Iperf3Runner"]
> except ModuleNotFoundError as e:
> print("Failed importing `net` library from kernel sources")
> print(str(e))
> diff --git a/tools/testing/selftests/drivers/net/lib/py/env.py b/tools/testing/selftests/drivers/net/lib/py/env.py
> index 41cc248ac848..857ae0f37516 100644
> --- a/tools/testing/selftests/drivers/net/lib/py/env.py
> +++ b/tools/testing/selftests/drivers/net/lib/py/env.py
> @@ -1,13 +1,16 @@
> # SPDX-License-Identifier: GPL-2.0
>
> +import ipaddress
> import os
> import time
> +import json
> from pathlib import Path
> from lib.py import KsftSkipEx, KsftXfailEx
> from lib.py import ksft_setup, wait_file
> from lib.py import cmd, ethtool, ip, CmdExitFailure
> from lib.py import NetNS, NetdevSimDev
> from .remote import Remote
> +from . import bpftool, RtnlFamily, Netlink
>
>
> class NetDrvEnvBase:
> @@ -289,3 +292,163 @@ class NetDrvEpEnv(NetDrvEnvBase):
> data.get('stats-block-usecs', 0) / 1000 / 1000
>
> time.sleep(self._stats_settle_time)
> +
> +
> +class NetDrvContEnv(NetDrvEpEnv):
> + """
> + Class for an environment with a netkit pair setup for forwarding traffic
> + between the physical interface and a network namespace.
> + +-------------+ +----------------------------+
> + | INIT NS | | TEST NS |
> + | +---------+ | | +------------------------+ |
> + | | NETIF | | bpf | | Netkit | |
> + | | |-|--------|>| nk_guest | |
> + | +---------+ | | | {LOCAL_PREFIX_V6}::2:2 | |
> + | +---------+ | | +------------------------+ |
> + | | Netkit | | +----------------------------+
> + | | nk_host | |
> + | +---------+ |
> + +-------------+
> + """
> +
> + def __init__(self, src_path, rxqueues=1, **kwargs):
> + super().__init__(src_path, **kwargs)
> +
> + self.netns = None
> + self._nk_host_ifname = None
> + self._nk_guest_ifname = None
> + self._tc_clsact_added = False
> + self._tc_attached = False
> + self._bpf_prog_pref = None
> + self._bpf_prog_id = None
> + self._init_ns_attached = False
> +
> + self.require_ipver("6")
> + local_prefix = self.env.get("LOCAL_PREFIX_V6")
> + if not local_prefix:
> + raise KsftSkipEx("LOCAL_PREFIX_V6 required")
> +
> + local_prefix = local_prefix.rstrip("/64").rstrip("::").rstrip(":")
> + self.ipv6_prefix = f"{local_prefix}::"
> + self.nk_host_ipv6 = f"{local_prefix}::2:1"
> + self.nk_guest_ipv6 = f"{local_prefix}::2:2"
> +
> + rtnl = RtnlFamily()
> + rtnl.newlink(
> + {
> + "linkinfo": {
> + "kind": "netkit",
> + "data": {
> + "mode": "l2",
> + "policy": "forward",
> + "peer-policy": "forward",
> + },
> + },
> + "num-rx-queues": rxqueues,
> + },
> + flags=[Netlink.NLM_F_CREATE, Netlink.NLM_F_EXCL],
> + )
> +
> + all_links = ip("-d link show", json=True)
> + netkit_links = [link for link in all_links
> + if link.get('linkinfo', {}).get('info_kind') == 'netkit'
> + and 'UP' not in link.get('flags', [])]
> +
> + if len(netkit_links) != 2:
> + raise KsftSkipEx("Failed to create netkit pair")
> +
> + netkit_links.sort(key=lambda x: x['ifindex'])
> + self._nk_host_ifname = netkit_links[1]['ifname']
> + self._nk_guest_ifname = netkit_links[0]['ifname']
> + self.nk_host_ifindex = netkit_links[1]['ifindex']
> + self.nk_guest_ifindex = netkit_links[0]['ifindex']
> +
> + self._setup_ns()
> + self._attach_bpf()
> +
> + def __del__(self):
> + if self._tc_attached:
> + cmd(f"tc filter del dev {self.ifname} ingress pref {self._bpf_prog_pref}")
> + self._tc_attached = False
I know this was resolved before, but unfortunately I think these might
have to be getattr (or another approach) for the case of
super().__init__() failing? I found one bad setup may result in
resolve_remote_ifc() failing and cascading up:
Traceback (most recent call last):
File "/data/users/bobbyeshleman/linux-worktrees/tcp-dm-netkit/./tools/testing/selftests/drivers/net/hw/nk_netns.py", line 29, in <module>
main()
File "/data/users/bobbyeshleman/linux-worktrees/tcp-dm-netkit/./tools/testing/selftests/drivers/net/hw/nk_netns.py", line 23, in main
with NetDrvContEnv(__file__) as cfg:
File "/data/users/bobbyeshleman/linux-worktrees/tcp-dm-netkit/tools/testing/selftests/drivers/net/lib/py/env.py", line 315, in __init__
super().__init__(src_path, **kwargs)
File "/data/users/bobbyeshleman/linux-worktrees/tcp-dm-netkit/tools/testing/selftests/drivers/net/lib/py/env.py", line 173, in __init__
self.remote_ifname = self.resolve_remote_ifc()
File "/data/users/bobbyeshleman/linux-worktrees/tcp-dm-netkit/tools/testing/selftests/drivers/net/lib/py/env.py", line 234, in resolve_remote_ifc
return v6[0]["ifname"] if v6 else v4[0]["ifname"]
TypeError: 'NoneType' object is not subscriptable
Exception ignored in: <function NetDrvContEnv.__del__ at 0x7fab5578c1f0>
Traceback (most recent call last):
File "/data/users/bobbyeshleman/linux-worktrees/tcp-dm-netkit/tools/testing/selftests/drivers/net/lib/py/env.py", line 370, in __del__
if self._tc_attached:
AttributeError: 'NetDrvContEnv' object has no attribute '_tc_attached'
Best,
Bobby
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next 4/4] selftests/net: Add netkit container ping test
2026-02-10 20:04 [PATCH net-next 0/4] selftests/net: add netkit container env and test David Wei
` (2 preceding siblings ...)
2026-02-10 20:04 ` [PATCH net-next 3/4] selftests/net: Add env for container based tests David Wei
@ 2026-02-10 20:04 ` David Wei
2026-02-11 17:53 ` Bobby Eshleman
3 siblings, 1 reply; 8+ messages in thread
From: David Wei @ 2026-02-10 20:04 UTC (permalink / raw)
To: netdev
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Joe Damato, Wei Wang, Bobby Eshleman,
Stanislav Fomichev, Nikolay Aleksandrov
Add a basic ping test using NetDrvContEnv that sets up a netkit pair,
with one end in a netns. Use LOCAL_PREFIX_V6 and nk_forward BPF program
to ping from a remote host to the netkit in netns.
Signed-off-by: David Wei <dw@davidwei.uk>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
---
.../testing/selftests/drivers/net/hw/Makefile | 1 +
tools/testing/selftests/drivers/net/hw/config | 3 +++
.../selftests/drivers/net/hw/nk_netns.py | 23 +++++++++++++++++++
3 files changed, 27 insertions(+)
create mode 100755 tools/testing/selftests/drivers/net/hw/nk_netns.py
diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testing/selftests/drivers/net/hw/Makefile
index a64140333a46..91df028abfc0 100644
--- a/tools/testing/selftests/drivers/net/hw/Makefile
+++ b/tools/testing/selftests/drivers/net/hw/Makefile
@@ -32,6 +32,7 @@ TEST_PROGS = \
irq.py \
loopback.sh \
nic_timestamp.py \
+ nk_netns.py \
pp_alloc_fail.py \
rss_api.py \
rss_ctx.py \
diff --git a/tools/testing/selftests/drivers/net/hw/config b/tools/testing/selftests/drivers/net/hw/config
index 2307aa001be1..b6524040418e 100644
--- a/tools/testing/selftests/drivers/net/hw/config
+++ b/tools/testing/selftests/drivers/net/hw/config
@@ -1,3 +1,4 @@
+CONFIG_BPF_SYSCALL=y
CONFIG_FAIL_FUNCTION=y
CONFIG_FAULT_INJECTION=y
CONFIG_FAULT_INJECTION_DEBUG_FS=y
@@ -5,6 +6,8 @@ CONFIG_FUNCTION_ERROR_INJECTION=y
CONFIG_IO_URING=y
CONFIG_IPV6=y
CONFIG_IPV6_GRE=y
+CONFIG_NETKIT=y
+CONFIG_NET_CLS_BPF=y
CONFIG_NET_IPGRE=y
CONFIG_NET_IPGRE_DEMUX=y
CONFIG_UDMABUF=y
diff --git a/tools/testing/selftests/drivers/net/hw/nk_netns.py b/tools/testing/selftests/drivers/net/hw/nk_netns.py
new file mode 100755
index 000000000000..afa8638195d8
--- /dev/null
+++ b/tools/testing/selftests/drivers/net/hw/nk_netns.py
@@ -0,0 +1,23 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0
+
+from lib.py import ksft_run, ksft_exit
+from lib.py import NetDrvContEnv
+from lib.py import cmd
+
+
+def test_ping(cfg) -> None:
+ cfg.require_ipver("6")
+
+ cmd(f"ping -c 1 -W5 {cfg.nk_guest_ipv6}", host=cfg.remote)
+ cmd(f"ping -c 1 -W5 {cfg.remote_addr_v['6']}", ns=cfg.netns)
+
+
+def main() -> None:
+ with NetDrvContEnv(__file__) as cfg:
+ ksft_run([test_ping], args=(cfg,))
+ ksft_exit()
+
+
+if __name__ == "__main__":
+ main()
--
2.47.3
^ permalink raw reply related [flat|nested] 8+ messages in thread* Re: [PATCH net-next 4/4] selftests/net: Add netkit container ping test
2026-02-10 20:04 ` [PATCH net-next 4/4] selftests/net: Add netkit container ping test David Wei
@ 2026-02-11 17:53 ` Bobby Eshleman
0 siblings, 0 replies; 8+ messages in thread
From: Bobby Eshleman @ 2026-02-11 17:53 UTC (permalink / raw)
To: David Wei
Cc: netdev, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Joe Damato, Wei Wang,
Stanislav Fomichev, Nikolay Aleksandrov
On Tue, Feb 10, 2026 at 12:04:19PM -0800, David Wei wrote:
> Add a basic ping test using NetDrvContEnv that sets up a netkit pair,
> with one end in a netns. Use LOCAL_PREFIX_V6 and nk_forward BPF program
> to ping from a remote host to the netkit in netns.
>
> Signed-off-by: David Wei <dw@davidwei.uk>
> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
> ---
> .../testing/selftests/drivers/net/hw/Makefile | 1 +
> tools/testing/selftests/drivers/net/hw/config | 3 +++
> .../selftests/drivers/net/hw/nk_netns.py | 23 +++++++++++++++++++
> 3 files changed, 27 insertions(+)
> create mode 100755 tools/testing/selftests/drivers/net/hw/nk_netns.py
>
> diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testing/selftests/drivers/net/hw/Makefile
> index a64140333a46..91df028abfc0 100644
> --- a/tools/testing/selftests/drivers/net/hw/Makefile
> +++ b/tools/testing/selftests/drivers/net/hw/Makefile
> @@ -32,6 +32,7 @@ TEST_PROGS = \
> irq.py \
> loopback.sh \
> nic_timestamp.py \
> + nk_netns.py \
> pp_alloc_fail.py \
> rss_api.py \
> rss_ctx.py \
> diff --git a/tools/testing/selftests/drivers/net/hw/config b/tools/testing/selftests/drivers/net/hw/config
> index 2307aa001be1..b6524040418e 100644
> --- a/tools/testing/selftests/drivers/net/hw/config
> +++ b/tools/testing/selftests/drivers/net/hw/config
> @@ -1,3 +1,4 @@
> +CONFIG_BPF_SYSCALL=y
> CONFIG_FAIL_FUNCTION=y
> CONFIG_FAULT_INJECTION=y
> CONFIG_FAULT_INJECTION_DEBUG_FS=y
> @@ -5,6 +6,8 @@ CONFIG_FUNCTION_ERROR_INJECTION=y
> CONFIG_IO_URING=y
> CONFIG_IPV6=y
> CONFIG_IPV6_GRE=y
> +CONFIG_NETKIT=y
> +CONFIG_NET_CLS_BPF=y
> CONFIG_NET_IPGRE=y
> CONFIG_NET_IPGRE_DEMUX=y
> CONFIG_UDMABUF=y
I did find CONFIG_NET_SCH_INGRESS=y being needed for the qdisc too,
sorry for missing that last rev.
> diff --git a/tools/testing/selftests/drivers/net/hw/nk_netns.py b/tools/testing/selftests/drivers/net/hw/nk_netns.py
> new file mode 100755
> index 000000000000..afa8638195d8
> --- /dev/null
> +++ b/tools/testing/selftests/drivers/net/hw/nk_netns.py
> @@ -0,0 +1,23 @@
> +#!/usr/bin/env python3
> +# SPDX-License-Identifier: GPL-2.0
> +
> +from lib.py import ksft_run, ksft_exit
> +from lib.py import NetDrvContEnv
> +from lib.py import cmd
> +
> +
> +def test_ping(cfg) -> None:
> + cfg.require_ipver("6")
> +
> + cmd(f"ping -c 1 -W5 {cfg.nk_guest_ipv6}", host=cfg.remote)
> + cmd(f"ping -c 1 -W5 {cfg.remote_addr_v['6']}", ns=cfg.netns)
> +
> +
> +def main() -> None:
> + with NetDrvContEnv(__file__) as cfg:
> + ksft_run([test_ping], args=(cfg,))
> + ksft_exit()
> +
> +
> +if __name__ == "__main__":
> + main()
> --
> 2.47.3
>
I had some issues getting this to work until I enabled IPv6 forwarding.
I wasn't able to tell if this was only required because of my particular
REMOTE_TYPE=netns setup, or if it is something that is required by this
test specifically?
I'm also running this directly, but maybe this is done prior in
kselftest?
Best,
Bobby
^ permalink raw reply [flat|nested] 8+ messages in thread