From b91743e0197bb286c6c638b0f1a423e8402b53eb Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Tue, 16 Jan 2024 12:01:50 +0900 Subject: [PATCH] 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. --- src/network/networkd-nexthop.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index 67eba509d3..07a971a0e9 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; }