From 1c62c4fe0b54fb419b875cb2bae82a261518a745 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 20 Jan 2024 15:55:06 +0900 Subject: [PATCH] network/route: update MTU of IPv6 route even if the kernel returns -EEXIST --- src/network/networkd-route.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index a142719fb7..05280a582f 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -874,6 +874,19 @@ int route_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Li * notification, so we need to update the timer here. */ existing->lifetime_usec = route->lifetime_usec; (void) route_setup_timer(existing, NULL); + + /* This may be a bug in the kernel, but the MTU of an IPv6 route can be updated only + * when the route has an expiration timer managed by the kernel (not by us). + * See fib6_add_rt2node() in net/ipv6/ip6_fib.c of the kernel. */ + if (existing->family == AF_INET6 && + existing->expiration_managed_by_kernel) { + r = route_metric_set(&existing->metric, RTAX_MTU, route_metric_get(&route->metric, RTAX_MTU)); + if (r < 0) { + log_oom(); + link_enter_failed(link); + return 0; + } + } } } else if (r < 0) { -- 2.25.1