1
0
mirror of https://github.com/systemd/systemd.git synced 2024-12-26 03:22:00 +03:00

network: make route_configure() return all created routes

This commit is contained in:
Yu Watanabe 2021-04-29 23:18:29 +09:00
parent b19afdfef8
commit 5cb76467af

View File

@ -1312,10 +1312,12 @@ static int route_configure(
const Route *route,
Link *link,
link_netlink_message_handler_t callback,
Route **ret) {
unsigned *ret_n_routes,
Route ***ret_routes) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
Route *nr;
_cleanup_free_ Route **routes = NULL;
unsigned n_routes = 0; /* avoid false maybe-uninitialized warning */
int r, k;
assert(link);
@ -1324,6 +1326,7 @@ static int route_configure(
assert(link->ifindex > 0);
assert(IN_SET(route->family, AF_INET, AF_INET6));
assert(callback);
assert(!!ret_n_routes == !!ret_routes);
if (route_get(link->manager, link, route, NULL) <= 0 &&
set_size(link->routes) >= routes_max())
@ -1406,21 +1409,36 @@ static int route_configure(
if (route->nexthop_id != 0 ||
in_addr_is_set(route->gw_family, &route->gw) ||
ordered_set_isempty(route->multipath_routes)) {
k = route_add_and_setup_timer(link, route, NULL, &nr);
if (ret_routes) {
n_routes = 1;
routes = new(Route*, n_routes);
if (!routes)
return log_oom();
}
k = route_add_and_setup_timer(link, route, NULL, routes);
if (k < 0)
return k;
} else {
MultipathRoute *m;
Route **p;
r = append_nexthops(route, req);
if (r < 0)
return log_link_error_errno(link, r, "Could not append RTA_MULTIPATH attribute: %m");
assert(!ret);
if (ret_routes) {
n_routes = ordered_set_size(route->multipath_routes);
routes = new(Route*, n_routes);
if (!routes)
return log_oom();
}
k = 0;
p = routes;
ORDERED_SET_FOREACH(m, route->multipath_routes) {
r = route_add_and_setup_timer(link, route, m, NULL);
r = route_add_and_setup_timer(link, route, m, ret_routes ? p++ : NULL);
if (r < 0)
return r;
if (r > 0)
@ -1435,8 +1453,10 @@ static int route_configure(
link_ref(link);
if (ret)
*ret = nr;
if (ret_routes) {
*ret_n_routes = n_routes;
*ret_routes = TAKE_PTR(routes);
}
return k;
}
@ -1580,7 +1600,8 @@ static int route_is_ready_to_configure(const Route *route, Link *link) {
}
int request_process_route(Request *req) {
Route *ret = NULL;
_cleanup_free_ Route **routes = NULL;
unsigned n_routes;
int r;
assert(req);
@ -1596,14 +1617,19 @@ int request_process_route(Request *req) {
return r;
r = route_configure(req->route, req->link, req->netlink_handler,
ordered_set_isempty(req->route->multipath_routes) ? &ret : NULL);
req->after_configure ? &n_routes : NULL,
req->after_configure ? &routes : NULL);
if (r < 0)
return r;
if (req->after_configure) {
r = req->after_configure(req, ret);
if (r < 0)
return r;
assert(n_routes > 0);
for (unsigned i = 0; i < n_routes; i++) {
r = req->after_configure(req, routes[i]);
if (r < 0)
return r;
}
}
return 1;