From 1ca180b994bc6a299450894ea3c836e434c8db72 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 11 Nov 2024 13:51:49 +0900 Subject: [PATCH] network/nexthop: do not remove depending nexthops when a nexthop is removed Previously, when a nexthop is removed, depending nexthops were removed, but that's not necessary, as the kernel keeps them, at least with v6.11. --- src/network/networkd-nexthop.c | 16 +++------------- test/test-network/systemd-networkd-tests.py | 13 ++++++++++--- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index e0fa4745ea7..76f2371bd8e 100644 --- a/src/network/networkd-nexthop.c +++ b/src/network/networkd-nexthop.c @@ -491,19 +491,9 @@ static int nexthop_remove_dependents(NextHop *nexthop, Manager *manager) { assert(nexthop); assert(manager); - /* 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. */ - - void *id; - SET_FOREACH(id, nexthop->nexthops) { - NextHop *nh; - - if (nexthop_get_by_id(manager, PTR_TO_UINT32(id), &nh) < 0) - continue; - - RET_GATHER(r, nexthop_remove(nh, manager)); - } + /* If a nexthop is removed, the kernel silently removes 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. */ Route *route; SET_FOREACH(route, nexthop->routes) diff --git a/test/test-network/systemd-networkd-tests.py b/test/test-network/systemd-networkd-tests.py index 111da949abe..6b19a8a9388 100755 --- a/test/test-network/systemd-networkd-tests.py +++ b/test/test-network/systemd-networkd-tests.py @@ -4798,11 +4798,18 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities): # Remove nexthop with ID 20 check_output('ip nexthop del id 20') + + # Check the nexthop ID 20 is dropped from the group nexthop. + output = check_output('ip -0 nexthop list id 21') + print(output) + self.assertRegex(output, r'id 21 group 1,3') + + # Remove nexthop with ID 21 + check_output('ip nexthop del id 21') copy_network_unit('11-dummy.netdev', '25-nexthop-test1.network') networkctl_reload() - # 25-nexthop-test1.network requests a route with nexthop ID 21, - # which is silently removed by the kernel when nexthop with ID 20 is removed in the above, + # 25-nexthop-test1.network requests a route with nexthop ID 21, which is removed in the above, # hence test1 should be stuck in the configuring state. self.wait_operstate('test1', operstate='routable', setup_state='configuring') @@ -4811,7 +4818,7 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities): output = networkctl_status('test1') self.assertIn('State: routable (configuring)', output) - # Check if the route which needs nexthop 20 and 21 are forgotten. + # Check if the route which needs nexthop 21 are forgotten. output = networkctl_json() check_json(output) self.assertNotIn('"Destination":[10.10.10.14]', output) -- 2.47.3