From: Yu Watanabe Date: Sat, 20 Jan 2024 06:55:06 +0000 (+0900) Subject: network/route: update MTU of IPv6 route even if the kernel returns -EEXIST X-Git-Tag: v256-rc1~1088 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=1c62c4fe0b54fb419b875cb2bae82a261518a745;p=thirdparty%2Fsystemd.git network/route: update MTU of IPv6 route even if the kernel returns -EEXIST --- diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index a142719fb74..05280a582f6 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) {