]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/route-nexthop: make multipath_route_get_link() take fallback link 30932/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 13 Jan 2024 03:05:32 +0000 (12:05 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 13 Jan 2024 21:04:46 +0000 (06:04 +0900)
No functional change, just refactoring.

src/network/networkd-route-nexthop.c
src/network/networkd-route-nexthop.h
src/network/networkd-route.c

index 4ffaf1aea0da5f13f890bf80f1bea24dbc20ef2f..7947eb1b61159cf00c400a0e50a08308f72fee5c 100644 (file)
 #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)));
index 7a0b0adce267b991809534fe046675dc67b0b678..af832d5d9cd13dafb68e2345859787b0af9ad425 100644 (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);
index a71ee4375ad779122da0ac9c93a2453255b6e8b1..3d1923a5240fc9926b4979340fc568805d35c1a7 100644 (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;