From: Daniel Borkmann <daniel@iogearbox.net>
To: netdev@vger.kernel.org
Cc: bpf@vger.kernel.org, kuba@kernel.org, davem@davemloft.net,
razor@blackwall.org, pabeni@redhat.com, willemb@google.com,
sdf@fomichev.me, john.fastabend@gmail.com, martin.lau@kernel.org,
jordan@jrife.io, maciej.fijalkowski@intel.com,
magnus.karlsson@intel.com, dw@davidwei.uk, toke@redhat.com,
yangzhenze@bytedance.com, wangdongdong.6@bytedance.com
Subject: [PATCH net-next v8 16/16] selftests/net: Add netkit container tests
Date: Thu, 29 Jan 2026 23:28:30 +0100 [thread overview]
Message-ID: <20260129222830.439687-17-daniel@iogearbox.net> (raw)
In-Reply-To: <20260129222830.439687-1-daniel@iogearbox.net>
From: David Wei <dw@davidwei.uk>
Add two tests using NetDrvContEnv. One basic test 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.
Second is a selftest for netkit queue leasing, using io_uring zero copy
test binary inside of a netns with netkit. This checks that memory
providers can be bound against virtual queues in a netkit within a
netns that are leasing from a physical netdev in the default netns.
Signed-off-by: David Wei <dw@davidwei.uk>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
---
.../testing/selftests/drivers/net/hw/Makefile | 2 +
.../selftests/drivers/net/hw/nk_netns.py | 23 +++++
.../selftests/drivers/net/hw/nk_qlease.py | 90 +++++++++++++++++++
3 files changed, 115 insertions(+)
create mode 100755 tools/testing/selftests/drivers/net/hw/nk_netns.py
create mode 100755 tools/testing/selftests/drivers/net/hw/nk_qlease.py
diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testing/selftests/drivers/net/hw/Makefile
index 9c163ba6feee..39ad86d693b3 100644
--- a/tools/testing/selftests/drivers/net/hw/Makefile
+++ b/tools/testing/selftests/drivers/net/hw/Makefile
@@ -32,6 +32,8 @@ 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/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()
diff --git a/tools/testing/selftests/drivers/net/hw/nk_qlease.py b/tools/testing/selftests/drivers/net/hw/nk_qlease.py
new file mode 100755
index 000000000000..85db7c358a95
--- /dev/null
+++ b/tools/testing/selftests/drivers/net/hw/nk_qlease.py
@@ -0,0 +1,90 @@
+#!/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, NetNSEnter, EthtoolFamily, NetdevFamily
+from lib.py import bkg, cmd, defer, ethtool, rand_port, wait_port_listen, ip
+
+
+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')
+ ethnl = EthtoolFamily()
+
+ channels = ethnl.channels_get({'header': {'dev-index': cfg.ifindex}})
+ channels = channels['combined-count']
+ if channels < 2:
+ raise KsftSkipEx('Test requires NETIF with at least 2 combined channels')
+
+ rings = ethnl.rings_get({'header': {'dev-index': cfg.ifindex}})
+ rx_rings = rings['rx']
+ hds_thresh = rings.get('hds-thresh', 0)
+
+ ethnl.rings_set({'header': {'dev-index': cfg.ifindex},
+ 'tcp-data-split': 'enabled',
+ 'hds-thresh': 0,
+ 'rx': 64})
+ defer(ethnl.rings_set, {'header': {'dev-index': cfg.ifindex},
+ 'tcp-data-split': 'unknown',
+ 'hds-thresh': hds_thresh,
+ 'rx': rx_rings})
+
+ cfg.src_queue = channels - 1
+ 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}")
+
+ with NetNSEnter(str(cfg.netns)):
+ netdevnl = NetdevFamily()
+ bind_result = netdevnl.queue_create(
+ {
+ "ifindex": cfg.nk_guest_ifindex,
+ "type": "rx",
+ "lease": {
+ "ifindex": cfg.ifindex,
+ "queue": {"id": cfg.src_queue, "type": "rx"},
+ "netns-id": 0,
+ },
+ }
+ )
+ cfg.nk_queue = bind_result['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__, rxqueues=2) 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()
--
2.43.0
next prev parent reply other threads:[~2026-01-29 22:29 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-29 22:28 [PATCH net-next v8 00/16] netkit: Support for io_uring zero-copy and AF_XDP Daniel Borkmann
2026-01-29 22:28 ` [PATCH net-next v8 01/16] net: Add queue-create operation Daniel Borkmann
2026-01-29 22:28 ` [PATCH net-next v8 02/16] net: Implement netdev_nl_queue_create_doit Daniel Borkmann
2026-01-31 23:45 ` Jakub Kicinski
2026-03-05 4:38 ` Daniel Borkmann
2026-03-06 2:10 ` Jakub Kicinski
2026-03-06 5:49 ` Daniel Borkmann
2026-01-29 22:28 ` [PATCH net-next v8 03/16] net: Add lease info to queue-get response Daniel Borkmann
2026-01-31 23:43 ` Jakub Kicinski
2026-02-01 0:15 ` Jakub Kicinski
2026-01-29 22:28 ` [PATCH net-next v8 04/16] net, ethtool: Disallow leased real rxqs to be resized Daniel Borkmann
2026-01-31 23:45 ` Jakub Kicinski
2026-01-29 22:28 ` [PATCH net-next v8 05/16] net: Slightly simplify net_mp_{open,close}_rxq Daniel Borkmann
2026-01-31 23:48 ` Jakub Kicinski
2026-01-29 22:28 ` [PATCH net-next v8 06/16] net: Proxy net_mp_{open,close}_rxq for leased queues Daniel Borkmann
2026-02-01 0:02 ` Jakub Kicinski
2026-02-01 22:09 ` David Wei
2026-01-29 22:28 ` [PATCH net-next v8 07/16] net: Proxy netdev_queue_get_dma_dev " Daniel Borkmann
2026-02-01 0:04 ` Jakub Kicinski
2026-02-01 22:23 ` David Wei
2026-01-29 22:28 ` [PATCH net-next v8 08/16] xsk: Extend xsk_rcv_check validation Daniel Borkmann
2026-01-29 22:28 ` [PATCH net-next v8 09/16] xsk: Proxy pool management for leased queues Daniel Borkmann
2026-01-29 22:28 ` [PATCH net-next v8 10/16] netkit: Add single device mode for netkit Daniel Borkmann
2026-01-29 22:28 ` [PATCH net-next v8 11/16] netkit: Implement rtnl_link_ops->alloc and ndo_queue_create Daniel Borkmann
2026-02-01 0:19 ` Jakub Kicinski
2026-02-01 22:27 ` David Wei
2026-01-29 22:28 ` [PATCH net-next v8 12/16] netkit: Add netkit notifier to check for unregistering devices Daniel Borkmann
2026-01-29 22:28 ` [PATCH net-next v8 13/16] netkit: Add xsk support for af_xdp applications Daniel Borkmann
2026-01-29 22:28 ` [PATCH net-next v8 14/16] selftests/net: Add bpf skb forwarding program Daniel Borkmann
2026-01-29 22:28 ` [PATCH net-next v8 15/16] selftests/net: Add env for container based tests Daniel Borkmann
2026-02-01 0:38 ` Jakub Kicinski
2026-02-01 22:53 ` David Wei
2026-02-02 18:41 ` Jakub Kicinski
2026-02-10 0:25 ` David Wei
2026-02-05 2:08 ` Bobby Eshleman
2026-02-05 2:34 ` Bobby Eshleman
2026-02-10 17:30 ` David Wei
2026-01-29 22:28 ` Daniel Borkmann [this message]
2026-02-01 0:24 ` [PATCH net-next v8 16/16] selftests/net: Add netkit container tests Jakub Kicinski
2026-02-01 22:54 ` David Wei
2026-02-05 1:44 ` Bobby Eshleman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260129222830.439687-17-daniel@iogearbox.net \
--to=daniel@iogearbox.net \
--cc=bpf@vger.kernel.org \
--cc=davem@davemloft.net \
--cc=dw@davidwei.uk \
--cc=john.fastabend@gmail.com \
--cc=jordan@jrife.io \
--cc=kuba@kernel.org \
--cc=maciej.fijalkowski@intel.com \
--cc=magnus.karlsson@intel.com \
--cc=martin.lau@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=razor@blackwall.org \
--cc=sdf@fomichev.me \
--cc=toke@redhat.com \
--cc=wangdongdong.6@bytedance.com \
--cc=willemb@google.com \
--cc=yangzhenze@bytedance.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox