From: Fernando Fernandez Mancera <fmancera@suse.de>
To: netdev@vger.kernel.org
Cc: linux-kselftest@vger.kernel.org, horms@kernel.org,
pabeni@redhat.com, kuba@kernel.org, edumazet@google.com,
dsahern@kernel.org, davem@davemloft.net,
Fernando Fernandez Mancera <fmancera@suse.de>
Subject: [PATCH 3/3 net-next v4] selftests: net: add test for IPv4 devconf netlink notifications
Date: Sun, 10 May 2026 10:15:28 +0200 [thread overview]
Message-ID: <20260510081528.5257-3-fmancera@suse.de> (raw)
In-Reply-To: <20260510081528.5257-1-fmancera@suse.de>
Introduce a new test, `ipv4_devconf_notify`, to verify that the kernel
sends the appropriate netlink notifications when IPv4 devconf parameters
are modified.
Since YNL currently has a bug where it declares an array of u32 values
instead of the nested attributes expected by the kernel for devconf set
operations, a temporary hack (`patched_add_attr`) is included to
pack the netlink attributes correctly.
Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de>
---
v3: added this patch to the series as requested by Paolo.
v4: fixed lint warnings, some of them cannot be fixed as they are
related to the YNL hack.
---
tools/testing/selftests/net/rtnetlink.py | 74 ++++++++++++++++++++++--
1 file changed, 70 insertions(+), 4 deletions(-)
diff --git a/tools/testing/selftests/net/rtnetlink.py b/tools/testing/selftests/net/rtnetlink.py
index e9ad5e88da97..c4136e73b6d0 100755
--- a/tools/testing/selftests/net/rtnetlink.py
+++ b/tools/testing/selftests/net/rtnetlink.py
@@ -1,17 +1,22 @@
#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-2.0
-from lib.py import ksft_exit, ksft_run, ksft_ge, RtnlAddrFamily
import socket
+import struct
+import time
+import types
+from lib.py import bkg, ip, ksft_exit, ksft_run, ksft_ge, ksft_true
+from lib.py import NetNS, NetNSEnter, RtnlAddrFamily, RtnlFamily
IPV4_ALL_HOSTS_MULTICAST = b'\xe0\x00\x00\x01'
-def dump_mcaddr_check(rtnl: RtnlAddrFamily) -> None:
+def dump_mcaddr_check() -> None:
"""
Verify that at least one interface has the IPv4 all-hosts multicast address.
At least the loopback interface should have this address.
"""
+ rtnl = RtnlAddrFamily()
addresses = rtnl.getmulticast({"ifa-family": socket.AF_INET}, dump=True)
all_host_multicasts = [
@@ -21,9 +26,70 @@ def dump_mcaddr_check(rtnl: RtnlAddrFamily) -> None:
ksft_ge(len(all_host_multicasts), 1,
"No interface found with the IPv4 all-hosts multicast address")
+def ipv4_devconf_notify() -> None:
+ """
+ Configure an interface and set ipv4-devconf values through netlink
+ to verify that the appropriate netlink notifications are being sent.
+ """
+
+ with NetNS() as ns:
+ with NetNSEnter(str(ns)):
+ rtnl = RtnlFamily()
+
+ ifname = "dummy1"
+ ip(f"link add name {ifname} type dummy", ns=str(ns))
+
+ link_info = ip(f"link show dev {ifname}", ns=str(ns), json=True)
+ ksft_true(bool(link_info), f"Failed to retrieve link info for {ifname}")
+ ifindex = link_info[0]["ifindex"]
+
+ # YNL do not support netconf notifications yet
+ with bkg("ip monitor", ns=str(ns)) as cmd_obj:
+ original_add_attr = rtnl._add_attr
+ time.sleep(0.5)
+
+ # Currently YNL has a bug for applying devconf values,
+ # this hack fixes it. In essence, YNL is declaring an
+ # array of u32 values, while kernel expects a nested attribute
+ # on set operation.
+ def patched_add_attr(self, space, name, value, search_attrs):
+ if name == 'conf' and value == b"MAGIC_CONF":
+ fwd_attr = struct.pack("=HHI", 8, 1, 1)
+ proxy_arp_attr = struct.pack("=HHI", 8, 3, 1)
+ rp_filter_attr = struct.pack("=HHI", 8, 8, 1)
+ ignore_routes_attr = struct.pack("=HHI", 8, 29, 1)
+
+ return struct.pack("=HH", 36, 0x8001) + fwd_attr \
+ + proxy_arp_attr \
+ + rp_filter_attr \
+ + ignore_routes_attr
+
+ return original_add_attr(space, name, value, search_attrs)
+
+ rtnl._add_attr = types.MethodType(patched_add_attr, rtnl)
+
+ req = {
+ "ifi-index": ifindex,
+ "af-spec": {
+ "inet": {
+ "conf": b"MAGIC_CONF"
+ }
+ }
+ }
+ rtnl.newlink(req)
+ time.sleep(0.5)
+
+ ksft_true(f"inet {ifname} ignore_routes_with_linkdown on" in cmd_obj.stdout,
+ f"No 'ignore_routes_with_linkdown on' notificiation found for interface {ifname}")
+ ksft_true(f"inet {ifname} rp_filter strict" in cmd_obj.stdout,
+ f"No 'rp_filter strict' notificiation found for interface {ifname}")
+ ksft_true(f"inet {ifname} proxy_neigh on" in cmd_obj.stdout,
+ f"No 'proxy_neigh on' notificiation found for interface {ifname}")
+ ksft_true(f"inet {ifname} forwarding on" in cmd_obj.stdout,
+ f"No 'forwarding on' notificiation found for interface {ifname}")
+
def main() -> None:
- rtnl = RtnlAddrFamily()
- ksft_run([dump_mcaddr_check], args=(rtnl, ))
+ ksft_run([dump_mcaddr_check, ipv4_devconf_notify])
ksft_exit()
if __name__ == "__main__":
--
2.53.0
next prev parent reply other threads:[~2026-05-10 8:15 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-10 8:15 [PATCH 1/3 net-next v4] ipv4: centralize devconf sysctl handling Fernando Fernandez Mancera
2026-05-10 8:15 ` [PATCH 2/3 net-next v4] ipv4: handle devconf post-set actions on netlink updates Fernando Fernandez Mancera
2026-05-14 2:30 ` Jakub Kicinski
2026-05-14 9:16 ` Fernando Fernandez Mancera
2026-05-10 8:15 ` Fernando Fernandez Mancera [this message]
2026-05-14 2:35 ` [PATCH 3/3 net-next v4] selftests: net: add test for IPv4 devconf netlink notifications Jakub Kicinski
2026-05-14 9:42 ` Fernando Fernandez Mancera
2026-05-14 23:24 ` Jakub Kicinski
2026-05-15 8:02 ` Fernando Fernandez Mancera
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=20260510081528.5257-3-fmancera@suse.de \
--to=fmancera@suse.de \
--cc=davem@davemloft.net \
--cc=dsahern@kernel.org \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kselftest@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.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.