mirror of
https://github.com/morgan9e/systemd
synced 2026-04-14 08:25:20 +09:00
network/route: update expiration timer only when we know the route exists
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user