From: Yu Watanabe Date: Tue, 16 Jan 2024 03:01:50 +0000 (+0900) Subject: network/nexthop: drop dependent routes on removal X-Git-Tag: v256-rc1~1041^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b91743e0197bb286c6c638b0f1a423e8402b53eb;p=thirdparty%2Fsystemd.git network/nexthop: drop dependent routes on removal If a nexthop is removed, dependent routes are silently removed by the kernel. Hence, networkd may be confused that routes that depends on the nexthop still exist, and may fail to configure other routes or so. This is the one for routes of 3cbbe8635a16f096a3b0eff993f7681401535605. --- diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index 67eba509d33..07a971a0e92 100644 --- a/src/network/networkd-nexthop.c +++ b/src/network/networkd-nexthop.c @@ -12,6 +12,7 @@ #include "networkd-network.h" #include "networkd-nexthop.h" #include "networkd-queue.h" +#include "networkd-route.h" #include "networkd-route-util.h" #include "parse-util.h" #include "set.h" @@ -489,7 +490,7 @@ static int nexthop_remove_dependents(NextHop *nexthop, Manager *manager) { assert(nexthop); assert(manager); - /* If a nexthop is removed, the kernel silently removes nexthops that depend on the + /* If a nexthop is removed, the kernel silently removes nexthops and routes that depend on the * removed nexthop. Let's remove them for safety (though, they are already removed in the kernel, * hence that should fail), and forget them. */ @@ -503,6 +504,10 @@ static int nexthop_remove_dependents(NextHop *nexthop, Manager *manager) { RET_GATHER(r, nexthop_remove(nh, manager)); } + Route *route; + SET_FOREACH(route, nexthop->routes) + RET_GATHER(r, route_remove(route, manager)); + return r; }