From: Yu Watanabe Date: Tue, 9 Jan 2024 07:20:39 +0000 (+0900) Subject: network/route: update expiration timer only when we know the route exists X-Git-Tag: v256-rc1~1166^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2c0b49baabc52e16a6c7acbd5a129e766fcb565d;p=thirdparty%2Fsystemd.git network/route: update expiration timer only when we know the route exists --- diff --git a/src/network/networkd-dhcp-prefix-delegation.c b/src/network/networkd-dhcp-prefix-delegation.c index 2158c773931..168b45349eb 100644 --- a/src/network/networkd-dhcp-prefix-delegation.c +++ b/src/network/networkd-dhcp-prefix-delegation.c @@ -265,7 +265,7 @@ static int dhcp_pd_route_handler(sd_netlink *rtnl, sd_netlink_message *m, Reques assert(link); - r = route_configure_handler_internal(rtnl, m, link, "Failed to add prefix route for DHCP delegated subnet prefix"); + r = route_configure_handler_internal(rtnl, m, link, route, "Failed to add prefix route for DHCP delegated subnet prefix"); if (r <= 0) return r; @@ -625,7 +625,7 @@ static int dhcp4_unreachable_route_handler(sd_netlink *rtnl, sd_netlink_message assert(link); - r = route_configure_handler_internal(rtnl, m, link, "Failed to set unreachable route for DHCPv4 delegated prefix"); + r = route_configure_handler_internal(rtnl, m, link, route, "Failed to set unreachable route for DHCPv4 delegated prefix"); if (r <= 0) return r; @@ -641,7 +641,7 @@ static int dhcp6_unreachable_route_handler(sd_netlink *rtnl, sd_netlink_message assert(link); - r = route_configure_handler_internal(rtnl, m, link, "Failed to set unreachable route for DHCPv6 delegated prefix"); + r = route_configure_handler_internal(rtnl, m, link, route, "Failed to set unreachable route for DHCPv6 delegated prefix"); if (r <= 0) return r; diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 61dc7acb83f..4e38cd27645 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -139,7 +139,7 @@ static int ndisc_route_handler(sd_netlink *rtnl, sd_netlink_message *m, Request assert(link); - r = route_configure_handler_internal(rtnl, m, link, "Could not set NDisc route"); + r = route_configure_handler_internal(rtnl, m, link, route, "Could not set NDisc route"); if (r <= 0) return r; diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 83dfea1392c..f03c871200e 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -1122,15 +1122,27 @@ static int append_nexthops(const Link *link, const Route *route, sd_netlink_mess return 0; } -int route_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg) { +int route_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, Route *route, const char *error_msg) { int r; assert(m); assert(link); + assert(link->manager); + assert(route); assert(error_msg); r = sd_netlink_message_get_errno(m); - if (r < 0 && r != -EEXIST) { + if (r == -EEXIST) { + Route *existing; + + if (route_get(link->manager, link, route, &existing) >= 0) { + /* When re-configuring an existing route, kernel does not send RTM_NEWROUTE + * notification, so we need to update the timer here. */ + existing->lifetime_usec = route->lifetime_usec; + (void) route_setup_timer(existing, NULL); + } + + } else if (r < 0) { log_link_message_warning_errno(link, m, r, error_msg); link_enter_failed(link); return 0; @@ -1378,11 +1390,6 @@ int link_request_route( existing->lifetime_usec = route->lifetime_usec; if (consume_object) route_free(route); - - if (existing->expire) - /* When re-configuring an existing route, kernel does not send RTM_NEWROUTE - * message, so we need to update the timer here. */ - (void) route_setup_timer(existing, NULL); } log_route_debug(existing, "Requesting", link, link->manager); @@ -1404,7 +1411,7 @@ static int static_route_handler(sd_netlink *rtnl, sd_netlink_message *m, Request assert(link); - r = route_configure_handler_internal(rtnl, m, link, "Could not set route"); + r = route_configure_handler_internal(rtnl, m, link, route, "Could not set route"); if (r <= 0) return r; diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h index 0baf199ddbd..3d3dd6ea05c 100644 --- a/src/network/networkd-route.h +++ b/src/network/networkd-route.h @@ -83,7 +83,7 @@ Route *route_free(Route *route); DEFINE_SECTION_CLEANUP_FUNCTIONS(Route, route_free); int route_dup(const Route *src, Route **ret); -int route_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg); +int route_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, Route *route, const char *error_msg); int route_remove(Route *route); int route_remove_and_drop(Route *route);