#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;
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)));
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);
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;
assert(route);
assert(ret);
+ /* link may be NULL */
+
if (!route_needs_convert(route)) {
*ret = NULL;
return 0;
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;
_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) {
_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) {
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");
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;