network/route-nexthop: make multipath_route_get_link() take fallback link
No functional change, just refactoring.
This commit is contained in:
@@ -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)));
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user