From: "Björn Töpel" <bjorn@kernel.org>
To: netdev@vger.kernel.org, "David S. Miller" <davem@davemloft.net>,
Andrew Lunn <andrew+netdev@lunn.ch>,
Donald Hunter <donald.hunter@gmail.com>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>,
Maxime Chevallier <maxime.chevallier@bootlin.com>,
Naveen Mamindlapalli <naveenm@marvell.com>,
Paolo Abeni <pabeni@redhat.com>, Simon Horman <horms@kernel.org>
Cc: "Björn Töpel" <bjorn@kernel.org>,
"Danielle Ratson" <danieller@nvidia.com>,
"Hariprasad Kelam" <hkelam@marvell.com>,
"Ido Schimmel" <idosch@nvidia.com>,
"Kory Maincent" <kory.maincent@bootlin.com>,
"Leon Romanovsky" <leon@kernel.org>,
"Michael Chan" <michael.chan@broadcom.com>,
"Oleksij Rempel" <o.rempel@pengutronix.de>,
"Pavan Chebbi" <pavan.chebbi@broadcom.com>,
"Piergiorgio Beruto" <piergiorgio.beruto@gmail.com>,
"Russell King" <linux@armlinux.org.uk>,
"Saeed Mahameed" <saeedm@nvidia.com>,
"Shuah Khan" <shuah@kernel.org>,
"Tariq Toukan" <tariqt@nvidia.com>,
"Willem de Bruijn" <willemb@google.com>,
"Kees Cook" <kees@kernel.org>,
linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org,
linux-rdma@vger.kernel.org
Subject: [PATCH net-next v2 09/12] selftests: drv-net: Add MAC loopback netdevsim test
Date: Wed, 25 Mar 2026 15:50:16 +0100 [thread overview]
Message-ID: <20260325145022.2607545-10-bjorn@kernel.org> (raw)
In-Reply-To: <20260325145022.2607545-1-bjorn@kernel.org>
Add loopback_nsim.py with netdevsim-specific tests for MAC loopback
via the new ethtool_ops loopback callbacks:
- test_get_mac_entry: verify MAC entry appears in dump with correct
component, name, and supported directions
- test_set_mac_local: SET local, verify via GET and debugfs
- test_set_mac_disable: enable then disable
- test_set_mac_unknown_name: SET with wrong name, expect EOPNOTSUPP
Signed-off-by: Björn Töpel <bjorn@kernel.org>
---
.../testing/selftests/drivers/net/hw/Makefile | 1 +
.../selftests/drivers/net/hw/loopback_nsim.py | 138 ++++++++++++++++++
2 files changed, 139 insertions(+)
create mode 100755 tools/testing/selftests/drivers/net/hw/loopback_nsim.py
diff --git a/tools/testing/selftests/drivers/net/hw/Makefile b/tools/testing/selftests/drivers/net/hw/Makefile
index 5a6037a71f8f..74b0e1937980 100644
--- a/tools/testing/selftests/drivers/net/hw/Makefile
+++ b/tools/testing/selftests/drivers/net/hw/Makefile
@@ -33,6 +33,7 @@ TEST_PROGS = \
irq.py \
loopback.sh \
loopback_drv.py \
+ loopback_nsim.py \
nic_timestamp.py \
nk_netns.py \
pp_alloc_fail.py \
diff --git a/tools/testing/selftests/drivers/net/hw/loopback_nsim.py b/tools/testing/selftests/drivers/net/hw/loopback_nsim.py
new file mode 100755
index 000000000000..d05be09f6c14
--- /dev/null
+++ b/tools/testing/selftests/drivers/net/hw/loopback_nsim.py
@@ -0,0 +1,138 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: GPL-2.0
+
+"""Netdevsim-specific tests for MAC loopback via ethtool_ops.
+
+Verifies that MAC loopback entries appear in dumps, that SET
+operations update state correctly (both via GET and debugfs).
+"""
+
+import errno
+import os
+
+from lib.py import ksft_run, ksft_exit, ksft_eq
+from lib.py import KsftFailEx, ksft_disruptive
+from lib.py import EthtoolFamily, NlError
+from lib.py import NetDrvEnv, ip, defer
+
+# Direction flags as YNL returns them
+DIR_NONE = set()
+DIR_LOCAL = {'local'}
+DIR_REMOTE = {'remote'}
+
+
+def _nsim_dfs_path(cfg):
+ return cfg._ns.nsims[0].dfs_dir # pylint: disable=protected-access
+
+
+def _dfs_read_u32(cfg, path):
+ with open(os.path.join(_nsim_dfs_path(cfg), path),
+ encoding="utf-8") as f:
+ return int(f.read().strip())
+
+
+def _dfs_write_u32(cfg, path, val):
+ with open(os.path.join(_nsim_dfs_path(cfg), path), "w",
+ encoding="utf-8") as f:
+ f.write(str(val))
+
+
+def _get_loopback(cfg):
+ results = cfg.ethnl.loopback_get({
+ 'header': {'dev-index': cfg.ifindex}
+ }, dump=True)
+ entries = []
+ for msg in results:
+ if 'entry' in msg:
+ entries.extend(msg['entry'])
+ return entries
+
+
+def _set_loopback(cfg, component, name, direction):
+ cfg.ethnl.loopback_set({
+ 'header': {'dev-index': cfg.ifindex},
+ 'entry': [{
+ 'component': component,
+ 'name': name,
+ 'direction': direction,
+ }]
+ })
+
+
+def test_get_mac_entry(cfg):
+ """GET should return the MAC loopback entry with correct attributes."""
+ entries = _get_loopback(cfg)
+ mac_entries = [e for e in entries if e['component'] == 'mac']
+
+ ksft_eq(len(mac_entries), 1, "Expected 1 MAC loopback entry")
+ ksft_eq(mac_entries[0]['name'], 'mac')
+ ksft_eq(mac_entries[0]['supported'], DIR_LOCAL | DIR_REMOTE)
+ ksft_eq(mac_entries[0]['direction'], DIR_NONE)
+
+
+@ksft_disruptive
+def test_set_mac_local(cfg):
+ """SET MAC local loopback and verify via GET and debugfs."""
+ ip(f"link set dev {cfg.ifname} down")
+ defer(ip, f"link set dev {cfg.ifname} up")
+
+ _set_loopback(cfg, 'mac', 'mac', 'local')
+ defer(_set_loopback, cfg, 'mac', 'mac', 0)
+
+ entries = _get_loopback(cfg)
+ mac = [e for e in entries if e['component'] == 'mac']
+ ksft_eq(mac[0]['direction'], DIR_LOCAL)
+
+ dfs_dir = _dfs_read_u32(cfg, "ethtool/mac_lb/direction")
+ ksft_eq(dfs_dir, 1, "debugfs direction should be 1 (LOCAL)")
+
+
+@ksft_disruptive
+def test_set_mac_disable(cfg):
+ """Enable then disable MAC loopback."""
+ ip(f"link set dev {cfg.ifname} down")
+ defer(ip, f"link set dev {cfg.ifname} up")
+
+ _set_loopback(cfg, 'mac', 'mac', 'local')
+ defer(_set_loopback, cfg, 'mac', 'mac', 0)
+
+ _set_loopback(cfg, 'mac', 'mac', 0)
+
+ entries = _get_loopback(cfg)
+ mac = [e for e in entries if e['component'] == 'mac']
+ ksft_eq(mac[0]['direction'], DIR_NONE, "Direction should be off")
+
+ dfs_dir = _dfs_read_u32(cfg, "ethtool/mac_lb/direction")
+ ksft_eq(dfs_dir, 0, "debugfs direction should be 0")
+
+
+@ksft_disruptive
+def test_set_mac_unknown_name(cfg):
+ """SET with unknown name should fail with EOPNOTSUPP."""
+ ip(f"link set dev {cfg.ifname} down")
+ defer(ip, f"link set dev {cfg.ifname} up")
+
+ try:
+ _set_loopback(cfg, 'mac', 'bogus', 'local')
+ raise KsftFailEx("Should have rejected unknown name")
+ except NlError as e:
+ ksft_eq(e.error, errno.EOPNOTSUPP,
+ "Expected EOPNOTSUPP for unknown name")
+
+
+def main() -> None:
+ """Run netdevsim loopback tests."""
+ with NetDrvEnv(__file__) as cfg:
+ cfg.ethnl = EthtoolFamily()
+
+ ksft_run([
+ test_get_mac_entry,
+ test_set_mac_local,
+ test_set_mac_disable,
+ test_set_mac_unknown_name,
+ ], args=(cfg, ))
+ ksft_exit()
+
+
+if __name__ == "__main__":
+ main()
--
2.53.0
next prev parent reply other threads:[~2026-03-25 14:51 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-25 14:50 [PATCH net-next v2 00/12] ethtool: Generic loopback support Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 01/12] ethtool: Add dump_one_dev callback for per-device sub-iteration Björn Töpel
2026-03-25 18:20 ` Maxime Chevallier
2026-03-25 14:50 ` [PATCH net-next v2 02/12] ethtool: Convert per-PHY commands to dump_one_dev Björn Töpel
2026-03-25 18:21 ` Maxime Chevallier
2026-03-25 14:50 ` [PATCH net-next v2 03/12] ethtool: Add loopback netlink UAPI definitions Björn Töpel
2026-03-26 8:10 ` Maxime Chevallier
2026-03-26 8:55 ` Björn Töpel
2026-03-26 22:22 ` Jakub Kicinski
2026-03-26 22:23 ` Jakub Kicinski
2026-03-27 8:57 ` Maxime Chevallier
2026-03-25 14:50 ` [PATCH net-next v2 04/12] ethtool: Add loopback GET/SET netlink implementation Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 05/12] ethtool: Add CMIS loopback helpers for module loopback control Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 06/12] selftests: drv-net: Add loopback driver test Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 07/12] ethtool: Add MAC loopback support via ethtool_ops Björn Töpel
2026-03-26 9:49 ` Breno Leitao
2026-03-25 14:50 ` [PATCH net-next v2 08/12] netdevsim: Add MAC loopback simulation Björn Töpel
2026-03-26 9:40 ` Breno Leitao
2026-03-25 14:50 ` Björn Töpel [this message]
2026-03-26 9:32 ` [PATCH net-next v2 09/12] selftests: drv-net: Add MAC loopback netdevsim test Breno Leitao
2026-03-26 9:44 ` Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 10/12] MAINTAINERS: Add entry for ethtool loopback Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 11/12] netdevsim: Add module EEPROM simulation via debugfs Björn Töpel
2026-03-25 14:50 ` [PATCH net-next v2 12/12] selftests: drv-net: Add CMIS loopback netdevsim test Björn Töpel
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=20260325145022.2607545-10-bjorn@kernel.org \
--to=bjorn@kernel.org \
--cc=andrew+netdev@lunn.ch \
--cc=danieller@nvidia.com \
--cc=davem@davemloft.net \
--cc=donald.hunter@gmail.com \
--cc=edumazet@google.com \
--cc=hkelam@marvell.com \
--cc=horms@kernel.org \
--cc=idosch@nvidia.com \
--cc=kees@kernel.org \
--cc=kory.maincent@bootlin.com \
--cc=kuba@kernel.org \
--cc=leon@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=linux-rdma@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=maxime.chevallier@bootlin.com \
--cc=michael.chan@broadcom.com \
--cc=naveenm@marvell.com \
--cc=netdev@vger.kernel.org \
--cc=o.rempel@pengutronix.de \
--cc=pabeni@redhat.com \
--cc=pavan.chebbi@broadcom.com \
--cc=piergiorgio.beruto@gmail.com \
--cc=saeedm@nvidia.com \
--cc=shuah@kernel.org \
--cc=tariqt@nvidia.com \
--cc=willemb@google.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.