]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
ipv6: fix missing notification for ignore_routes_with_linkdown
authorFernando Fernandez Mancera <fmancera@suse.de>
Mon, 22 Jun 2026 13:08:57 +0000 (15:08 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 24 Jun 2026 02:12:48 +0000 (19:12 -0700)
When changing the ignore_routes_with_linkdown sysctl for a specific
interface, the RTM_NEWNETCONF netlink notification was not being emitted
to userspace. Fix this by emitting the notification when needed.

In addition, fix bogus return value for successful "all" and specific
interface write operation leading to a wrong reset of the position
pointer.

Fixes: 35103d11173b ("net: ipv6 sysctl option to ignore routes when nexthop link is down")
Reviewed-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Link: https://patch.msgid.link/20260622130857.5115-7-fmancera@suse.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/ipv6/addrconf.c

index 82b6f603faa04495da201d52ba7da8d2599ea03a..cbe681de3818825907b8f6e00ae91bf45a9dc9c8 100644 (file)
@@ -955,11 +955,7 @@ static int addrconf_fixup_linkdown(const struct ctl_table *table, int *p, int ne
                                                     NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
                                                     NETCONFA_IFINDEX_DEFAULT,
                                                     net->ipv6.devconf_dflt);
-               rtnl_net_unlock(net);
-               return 0;
-       }
-
-       if (p == &net->ipv6.devconf_all->ignore_routes_with_linkdown) {
+       } else if (p == &net->ipv6.devconf_all->ignore_routes_with_linkdown) {
                WRITE_ONCE(net->ipv6.devconf_dflt->ignore_routes_with_linkdown, newf);
                addrconf_linkdown_change(net, newf);
                if ((!newf) ^ (!old))
@@ -968,11 +964,21 @@ static int addrconf_fixup_linkdown(const struct ctl_table *table, int *p, int ne
                                                     NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
                                                     NETCONFA_IFINDEX_ALL,
                                                     net->ipv6.devconf_all);
+       } else {
+               if (!newf ^ !old) {
+                       struct inet6_dev *idev = table->extra1;
+
+                       inet6_netconf_notify_devconf(net,
+                                                    RTM_NEWNETCONF,
+                                                    NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN,
+                                                    idev->dev->ifindex,
+                                                    &idev->cnf);
+               }
        }
 
        rtnl_net_unlock(net);
 
-       return 1;
+       return 0;
 }
 
 #endif