network/route-nexthop: make multipath_route_get_link() take fallback link

No functional change, just refactoring.
This commit is contained in:
Yu Watanabe
2024-01-14 06:04:46 +09:00
parent fad2f72351
commit a0ab69d062
3 changed files with 22 additions and 30 deletions
+13 -23
View File
@@ -13,39 +13,32 @@
#include "parse-util.h"
#include "string-util.h"
int multipath_route_get_link(Manager *manager, const MultipathRoute *m, Link **ret) {
int r;
int multipath_route_get_link(Manager *manager, Link *link, const MultipathRoute *m, Link **ret) {
assert(manager);
assert(m);
if (m->ifindex > 0) {
r = link_get_by_index(manager, m->ifindex, ret);
return r < 0 ? r : 1;
}
if (m->ifname) {
r = link_get_by_name(manager, m->ifname, ret);
return r < 0 ? r : 1;
if (m->ifindex > 0)
return link_get_by_index(manager, m->ifindex, ret);
if (m->ifname)
return link_get_by_name(manager, m->ifname, ret);
if (link) {
if (ret)
*ret = link;
return 0;
}
if (ret)
*ret = NULL;
return 0;
return -ENOENT;
}
static bool multipath_route_is_ready_to_configure(const MultipathRoute *m, Link *link, bool onlink) {
union in_addr_union a = m->gateway.address;
Link *l = NULL;
int r;
assert(m);
assert(link);
r = multipath_route_get_link(link->manager, m, &l);
if (r < 0)
if (multipath_route_get_link(link->manager, link, m, &link) < 0)
return false;
if (r > 0)
link = l;
if (!link_is_ready_to_configure(link, /* allow_unmanaged = */ true))
return false;
@@ -178,12 +171,9 @@ static int append_nexthop_one(Link *link, const Route *route, const MultipathRou
assert(link);
assert(link->manager);
Link *l;
r = multipath_route_get_link(link->manager, m, &l);
r = multipath_route_get_link(link->manager, link, m, &link);
if (r < 0)
return r;
if (r > 0)
link = l;
}
new_rta = realloc(*rta, RTA_ALIGN((*rta)->rta_len) + RTA_SPACE(sizeof(struct rtnexthop)));
+1 -1
View File
@@ -8,7 +8,7 @@ typedef struct Manager Manager;
typedef struct MultipathRoute MultipathRoute;
typedef struct Route Route;
int multipath_route_get_link(Manager *manager, const MultipathRoute *m, Link **ret);
int multipath_route_get_link(Manager *manager, Link *link, const MultipathRoute *m, Link **ret);
int route_nexthops_is_ready_to_configure(const Route *route, Link *link);
int route_nexthops_to_string(const Route *route, char **ret);
+8 -6
View File
@@ -405,7 +405,7 @@ static bool route_needs_convert(const Route *route) {
return route->nexthop_id > 0 || !ordered_set_isempty(route->multipath_routes);
}
static int route_convert(Manager *manager, const Route *route, ConvertedRoutes **ret) {
static int route_convert(Manager *manager, Link *link, const Route *route, ConvertedRoutes **ret) {
_cleanup_(converted_routes_freep) ConvertedRoutes *c = NULL;
int r;
@@ -413,6 +413,8 @@ static int route_convert(Manager *manager, const Route *route, ConvertedRoutes *
assert(route);
assert(ret);
/* link may be NULL */
if (!route_needs_convert(route)) {
*ret = NULL;
return 0;
@@ -484,7 +486,7 @@ static int route_convert(Manager *manager, const Route *route, ConvertedRoutes *
route_apply_multipath_route(c->routes[i], m);
r = multipath_route_get_link(manager, m, &c->links[i]);
r = multipath_route_get_link(manager, link, m, &c->links[i]);
if (r < 0)
return r;
@@ -748,7 +750,7 @@ static void manager_mark_routes(Manager *manager, bool foreign, const Link *exce
_cleanup_(converted_routes_freep) ConvertedRoutes *converted = NULL;
Route *existing;
r = route_convert(manager, route, &converted);
r = route_convert(manager, link, route, &converted);
if (r < 0)
continue;
if (r == 0) {
@@ -847,7 +849,7 @@ int link_drop_foreign_routes(Link *link) {
_cleanup_(converted_routes_freep) ConvertedRoutes *converted = NULL;
Route *existing;
r = route_convert(link->manager, route, &converted);
r = route_convert(link->manager, link, route, &converted);
if (r < 0)
continue;
if (r == 0) {
@@ -1069,7 +1071,7 @@ static int route_process_request(Request *req, Link *link, Route *route) {
return 0;
if (route_needs_convert(route)) {
r = route_convert(link->manager, route, &converted);
r = route_convert(link->manager, link, route, &converted);
if (r < 0)
return log_link_warning_errno(link, r, "Failed to convert route: %m");
@@ -1570,7 +1572,7 @@ int manager_rtnl_process_route(sd_netlink *rtnl, sd_netlink_message *message, Ma
if (!route_needs_convert(tmp))
return process_route_one(m, link, type, TAKE_PTR(tmp), has_cacheinfo ? &cacheinfo : NULL);
r = route_convert(m, tmp, &converted);
r = route_convert(m, link, tmp, &converted);
if (r < 0) {
log_link_warning_errno(link, r, "rtnl: failed to convert received route, ignoring: %m");
return 0;