From: Yu Watanabe Date: Sat, 13 Jan 2024 03:05:32 +0000 (+0900) Subject: network/route-nexthop: make multipath_route_get_link() take fallback link X-Git-Tag: v256-rc1~1159^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=a0ab69d062676ee6f70050a7eade21867747a607;p=thirdparty%2Fsystemd.git network/route-nexthop: make multipath_route_get_link() take fallback link No functional change, just refactoring. --- diff --git a/src/network/networkd-route-nexthop.c b/src/network/networkd-route-nexthop.c index 4ffaf1aea0d..7947eb1b611 100644 --- a/src/network/networkd-route-nexthop.c +++ b/src/network/networkd-route-nexthop.c @@ -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))); diff --git a/src/network/networkd-route-nexthop.h b/src/network/networkd-route-nexthop.h index 7a0b0adce26..af832d5d9cd 100644 --- a/src/network/networkd-route-nexthop.h +++ b/src/network/networkd-route-nexthop.h @@ -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); diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index a71ee4375ad..3d1923a5240 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -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;