Then, replace route_remove_and_drop() with it.
If a route is requested, and the request is already called,
we may not received its reply and notification from the kernel, and
the corresponding Route object may not be remembered. Even in such
case, we need to remove the route, otherwise the route will come
later after the function called.
This is the version for route of
f22b586a215962416bdbd692aabb89b1ac2999d0.
link_remove_dhcp_pd_subnet_prefix(link, &route->dst.in6);
- RET_GATHER(ret, route_remove(route));
- route_cancel_request(route, link);
+ RET_GATHER(ret, route_remove_and_cancel(route, link->manager));
}
} else {
Address *address;
.address = route->dst }))
continue;
- (void) route_remove(route);
-
- route_cancel_request(route, uplink);
+ (void) route_remove_and_cancel(route, uplink->manager);
}
set_clear(uplink->dhcp_pd_prefixes);
if (only_marked && !route_is_marked(route))
continue;
- RET_GATHER(ret, route_remove(route));
- route_cancel_request(route, link);
+ RET_GATHER(ret, route_remove_and_cancel(route, link->manager));
}
SET_FOREACH(address, link->addresses) {
if (only_marked && !route_is_marked(route))
continue;
- RET_GATHER(ret, route_remove(route));
- route_cancel_request(route, link);
+ RET_GATHER(ret, route_remove_and_cancel(route, link->manager));
}
SET_FOREACH(address, link->addresses) {
if (route->lifetime_usec >= timestamp_usec)
continue; /* the route is still valid */
- r = route_remove_and_drop(route);
+ r = route_remove_and_cancel(route, link->manager);
if (r < 0)
RET_GATHER(ret, log_link_warning_errno(link, r, "Failed to remove outdated SLAAC route, ignoring: %m"));
}
return 1;
}
-int route_remove(Route *route) {
+int route_remove(Route *route, Manager *manager) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
Link *link = NULL;
int r;
assert(route);
- Manager *manager = ASSERT_PTR(route->manager);
+ assert(manager);
log_route_debug(route, "Removing", manager);
return 0;
}
-int route_remove_and_drop(Route *route) {
- if (!route)
- return 0;
+int route_remove_and_cancel(Route *route, Manager *manager) {
+ bool waiting = false;
+ Request *req;
- route_cancel_request(route, NULL);
+ assert(route);
+ assert(manager);
+
+ /* If the route is remembered by the manager, then use the remembered object. */
+ (void) route_get(manager, route, &route);
- if (route_exists(route))
- return route_remove(route);
+ /* Cancel the request for the route. If the request is already called but we have not received the
+ * notification about the request, then explicitly remove the route. */
+ if (route_get_request(manager, route, &req) >= 0) {
+ waiting = req->waiting_reply;
+ request_detach(req);
+ route_cancel_requesting(route);
+ }
- if (route->state == 0)
- route_free(route);
+ /* If we know that the route will come or already exists, remove it. */
+ if (waiting || (route->manager && route_exists(route)))
+ return route_remove(route, manager);
return 0;
}
assert(route->manager);
- r = route_remove(route);
+ r = route_remove(route, route->manager);
if (r < 0) {
Link *link = NULL;
(void) route_get_link(route->manager, route, &link);
return 0;
}
-void route_cancel_request(Route *route, Link *link) {
- assert(route);
- Manager *manager = ASSERT_PTR(route->manager ?: ASSERT_PTR(link)->manager);
-
- if (!route_is_requesting(route))
- return;
-
- Request *req;
- if (route_get_request(manager, route, &req) >= 0)
- request_detach(req);
-
- route_cancel_requesting(route);
-}
-
static int process_route_one(
Manager *manager,
uint16_t type,
if (!route_is_marked(route))
continue;
- RET_GATHER(r, route_remove(route));
+ RET_GATHER(r, route_remove(route, link->manager));
}
return r;
int route_dup(const Route *src, const RouteNextHop *nh, Route **ret);
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);
+int route_remove(Route *route, Manager *manager);
+int route_remove_and_cancel(Route *route, Manager *manager);
int route_get(Manager *manager, const Route *route, Route **ret);
}
int link_foreignize_routes(Link *link);
-void route_cancel_request(Route *route, Link *link);
int link_request_route(
Link *link,
const Route *route,