summaryrefslogtreecommitdiff
path: root/tools/testing
diff options
context:
space:
mode:
authorJakub Kicinski <kuba@kernel.org>2026-01-20 18:04:55 -0800
committerJakub Kicinski <kuba@kernel.org>2026-01-20 18:06:01 -0800
commit8766d61a1d33cb5f15bfdd6ce9832bbe1fc649c2 (patch)
tree3b48f0bfd96379e5b19d9b78017512016f7cda91 /tools/testing
parent77b9c4a438fc66e2ab004c411056b3fb71a54f2c (diff)
Revert "Merge branch 'netkit-support-for-io_uring-zero-copy-and-af_xdp'"
This reverts commit 77b9c4a438fc66e2ab004c411056b3fb71a54f2c, reversing changes made to 4515ec4ad58a37e70a9e1256c0b993958c9b7497: 931420a2fc36 ("selftests/net: Add netkit container tests") ab771c938d9a ("selftests/net: Make NetDrvContEnv support queue leasing") 6be87fbb2776 ("selftests/net: Add env for container based tests") 61d99ce3dfc2 ("selftests/net: Add bpf skb forwarding program") 920da3634194 ("netkit: Add xsk support for af_xdp applications") eef51113f8af ("netkit: Add netkit notifier to check for unregistering devices") b5ef109d22d4 ("netkit: Implement rtnl_link_ops->alloc and ndo_queue_create") b5c3fa4a0b16 ("netkit: Add single device mode for netkit") 0073d2fd679d ("xsk: Proxy pool management for leased queues") 1ecea95dd3b5 ("xsk: Extend xsk_rcv_check validation") 804bf334d08a ("net: Proxy netdev_queue_get_dma_dev for leased queues") 0caa9a8ddec3 ("net: Proxy net_mp_{open,close}_rxq for leased queues") ff8889ff9107 ("net, ethtool: Disallow leased real rxqs to be resized") 9e2103f36110 ("net: Add lease info to queue-get response") 31127deddef4 ("net: Implement netdev_nl_queue_create_doit") a5546e18f77c ("net: Add queue-create operation") The series will conflict with io_uring work, and the code needs more polish. Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'tools/testing')
-rw-r--r--tools/testing/selftests/drivers/net/README.rst7
-rw-r--r--tools/testing/selftests/drivers/net/hw/Makefile2
-rw-r--r--tools/testing/selftests/drivers/net/hw/lib/py/__init__.py7
-rw-r--r--tools/testing/selftests/drivers/net/hw/nk_forward.bpf.c49
-rwxr-xr-xtools/testing/selftests/drivers/net/hw/nk_netns.py23
-rwxr-xr-xtools/testing/selftests/drivers/net/hw/nk_qlease.py55
-rw-r--r--tools/testing/selftests/drivers/net/lib/py/__init__.py7
-rw-r--r--tools/testing/selftests/drivers/net/lib/py/env.py157
8 files changed, 6 insertions, 301 deletions
diff --git a/tools/testing/selftests/drivers/net/README.rst b/tools/testing/selftests/drivers/net/README.rst
index b94e81c2e030..eb838ae94844 100644
--- a/tools/testing/selftests/drivers/net/README.rst
+++ b/tools/testing/selftests/drivers/net/README.rst
@@ -62,13 +62,6 @@ 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.
-
REMOTE_TYPE
~~~~~~~~~~~
diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testing/selftests/drivers/net/hw/Makefile
index 39ad86d693b3..9c163ba6feee 100644
--- a/tools/testing/selftests/drivers/net/hw/Makefile
+++ b/tools/testing/selftests/drivers/net/hw/Makefile
@@ -32,8 +32,6 @@ TEST_PROGS = \
irq.py \
loopback.sh \
nic_timestamp.py \
- nk_netns.py \
- nk_qlease.py \
pp_alloc_fail.py \
rss_api.py \
rss_ctx.py \
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 022008249313..d5d247eca6b7 100644
--- a/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py
+++ b/tools/testing/selftests/drivers/net/hw/lib/py/__init__.py
@@ -3,7 +3,6 @@
"""
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.
@@ -30,7 +29,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, NetDrvContEnv
+ from drivers.net.lib.py import NetDrvEnv, NetDrvEpEnv
__all__ = ["NetNS", "NetNSEnter", "NetdevSimDev",
"EthtoolFamily", "NetdevFamily", "NetshaperFamily",
@@ -45,8 +44,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", "NetDrvContEnv", "GenerateTraffic",
- "Remote", "Iperf3Runner"]
+ "NetDrvEnv", "NetDrvEpEnv", "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/hw/nk_forward.bpf.c b/tools/testing/selftests/drivers/net/hw/nk_forward.bpf.c
deleted file mode 100644
index 86ebfc1445b6..000000000000
--- a/tools/testing/selftests/drivers/net/hw/nk_forward.bpf.c
+++ /dev/null
@@ -1,49 +0,0 @@
-// 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";
diff --git a/tools/testing/selftests/drivers/net/hw/nk_netns.py b/tools/testing/selftests/drivers/net/hw/nk_netns.py
deleted file mode 100755
index afa8638195d8..000000000000
--- a/tools/testing/selftests/drivers/net/hw/nk_netns.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/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()
diff --git a/tools/testing/selftests/drivers/net/hw/nk_qlease.py b/tools/testing/selftests/drivers/net/hw/nk_qlease.py
deleted file mode 100755
index 738a46d2d20c..000000000000
--- a/tools/testing/selftests/drivers/net/hw/nk_qlease.py
+++ /dev/null
@@ -1,55 +0,0 @@
-#!/usr/bin/env python3
-# SPDX-License-Identifier: GPL-2.0
-
-import re
-from os import path
-from lib.py import ksft_run, ksft_exit
-from lib.py import NetDrvContEnv
-from lib.py import bkg, cmd, defer, ethtool, rand_port, wait_port_listen
-
-
-def create_rss_ctx(cfg):
- output = ethtool(f"-X {cfg.ifname} context new start {cfg.src_queue} equal 1").stdout
- values = re.search(r'New RSS context is (\d+)', output).group(1)
- return int(values)
-
-
-def set_flow_rule(cfg):
- output = ethtool(f"-N {cfg.ifname} flow-type tcp6 dst-port {cfg.port} action {cfg.src_queue}").stdout
- values = re.search(r'ID (\d+)', output).group(1)
- return int(values)
-
-
-def set_flow_rule_rss(cfg, rss_ctx_id):
- output = ethtool(f"-N {cfg.ifname} flow-type tcp6 dst-port {cfg.port} context {rss_ctx_id}").stdout
- values = re.search(r'ID (\d+)', output).group(1)
- return int(values)
-
-
-def test_iou_zcrx(cfg) -> None:
- cfg.require_ipver('6')
-
- ethtool(f"-X {cfg.ifname} equal {cfg.src_queue}")
- defer(ethtool, f"-X {cfg.ifname} default")
-
- flow_rule_id = set_flow_rule(cfg)
- defer(ethtool, f"-N {cfg.ifname} delete {flow_rule_id}")
-
- rx_cmd = f"ip netns exec {cfg.netns.name} {cfg.bin_local} -s -p {cfg.port} -i {cfg._nk_guest_ifname} -q {cfg.nk_queue}"
- tx_cmd = f"{cfg.bin_remote} -c -h {cfg.nk_guest_ipv6} -p {cfg.port} -l 12840"
- with bkg(rx_cmd, exit_wait=True):
- wait_port_listen(cfg.port, proto="tcp", ns=cfg.netns)
- cmd(tx_cmd, host=cfg.remote)
-
-
-def main() -> None:
- with NetDrvContEnv(__file__, lease=True) as cfg:
- cfg.bin_local = path.abspath(path.dirname(__file__) + "/../../../drivers/net/hw/iou-zcrx")
- cfg.bin_remote = cfg.remote.deploy(cfg.bin_local)
- cfg.port = rand_port()
- ksft_run([test_iou_zcrx], args=(cfg,))
- ksft_exit()
-
-
-if __name__ == "__main__":
- main()
diff --git a/tools/testing/selftests/drivers/net/lib/py/__init__.py b/tools/testing/selftests/drivers/net/lib/py/__init__.py
index be3a8a936882..8b75faa9af6d 100644
--- a/tools/testing/selftests/drivers/net/lib/py/__init__.py
+++ b/tools/testing/selftests/drivers/net/lib/py/__init__.py
@@ -3,7 +3,6 @@
"""
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.
@@ -44,12 +43,12 @@ try:
"ksft_ne", "ksft_not_in", "ksft_raises", "ksft_true", "ksft_gt",
"ksft_not_none", "ksft_not_none"]
- from .env import NetDrvEnv, NetDrvEpEnv, NetDrvContEnv
+ from .env import NetDrvEnv, NetDrvEpEnv
from .load import GenerateTraffic, Iperf3Runner
from .remote import Remote
- __all__ += ["NetDrvEnv", "NetDrvEpEnv", "NetDrvContEnv", "GenerateTraffic",
- "Remote", "Iperf3Runner"]
+ __all__ += ["NetDrvEnv", "NetDrvEpEnv", "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 7066d78395c6..41cc248ac848 100644
--- a/tools/testing/selftests/drivers/net/lib/py/env.py
+++ b/tools/testing/selftests/drivers/net/lib/py/env.py
@@ -1,17 +1,13 @@
# SPDX-License-Identifier: GPL-2.0
-import ipaddress
import os
-import re
import time
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 lib.py import NetdevFamily, EthtoolFamily
from .remote import Remote
-from . import bpftool
class NetDrvEnvBase:
@@ -293,156 +289,3 @@ 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.
- """
-
- def __init__(self, src_path, lease=False, **kwargs):
- super().__init__(src_path, **kwargs)
-
- self.require_ipver("6")
- local_prefix = self.env.get("LOCAL_PREFIX_V6")
- if not local_prefix:
- raise KsftSkipEx("LOCAL_PREFIX_V6 required")
-
- self.netdevnl = NetdevFamily()
- self.ethnl = EthtoolFamily()
-
- 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"
-
- self.netns = None
- self._nk_host_ifname = None
- self._nk_guest_ifname = None
- self._tc_attached = False
- self._bpf_prog_pref = None
- self._bpf_prog_id = None
- self._leased = False
-
- nk_rxqueues = 1
- if lease:
- nk_rxqueues = 2
- ip(f"link add type netkit mode l2 forward peer forward numrxqueues {nk_rxqueues}")
-
- 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']
-
- if lease:
- self._lease_queues()
-
- 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._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.netns:
- del self.netns
- self.netns = None
-
- if self._leased:
- self.ethnl.rings_set({'header': {'dev-index': self.ifindex},
- 'tcp-data-split': 'unknown',
- 'hds-thresh': self._hds_thresh,
- 'rx': self._rx_rings})
- self._leased = False
-
- super().__del__()
-
- def _lease_queues(self):
- channels = self.ethnl.channels_get({'header': {'dev-index': self.ifindex}})
- channels = channels['combined-count']
- if channels < 2:
- raise KsftSkipEx('Test requires NETIF with at least 2 combined channels')
-
- rings = self.ethnl.rings_get({'header': {'dev-index': self.ifindex}})
- self._rx_rings = rings['rx']
- self._hds_thresh = rings.get('hds-thresh', 0)
- self.ethnl.rings_set({'header': {'dev-index': self.ifindex},
- 'tcp-data-split': 'enabled',
- 'hds-thresh': 0,
- 'rx': 64})
- self.src_queue = channels - 1
- bind_result = self.netdevnl.queue_create(
- {
- "ifindex": self.nk_guest_ifindex,
- "type": "rx",
- "lease": {
- "ifindex": self.ifindex,
- "queue": {"id": self.src_queue, "type": "rx"},
- },
- }
- )
- self.nk_queue = bind_result['id']
- self._leased = True
-
- def _setup_ns(self):
- self.netns = 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 _attach_bpf(self):
- bpf_obj = self.test_dir / "nk_forward.bpf.o"
- if not bpf_obj.exists():
- raise KsftSkipEx("BPF prog not found")
-
- cmd(f"tc filter add dev {self.ifname} ingress bpf obj {bpf_obj} sec tc/ingress direct-action")
- self._tc_attached = True
-
- tc_info = cmd(f"tc filter show dev {self.ifname} ingress").stdout
- match = re.search(r'pref (\d+).*nk_forward\.bpf.*id (\d+)', tc_info)
- if not match:
- raise Exception("Failed to get BPF prog ID")
- self._bpf_prog_pref = int(match.group(1))
- self._bpf_prog_id = int(match.group(2))
-
- 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}")