return true; /* updated */
}
-int route_nexthop_get_link(Manager *manager, Link *link, const RouteNextHop *nh, Link **ret) {
+int route_nexthop_get_link(Manager *manager, const RouteNextHop *nh, Link **ret) {
assert(manager);
assert(nh);
if (nh->ifname)
return link_get_by_name(manager, nh->ifname, ret);
- if (link) {
- if (ret)
- *ret = link;
- return 0;
- }
-
return -ENOENT;
}
-static bool route_nexthop_is_ready_to_configure(const RouteNextHop *nh, Link *link, bool onlink) {
+static bool route_nexthop_is_ready_to_configure(const RouteNextHop *nh, Manager *manager, bool onlink) {
+ Link *link;
+
assert(nh);
- assert(link);
+ assert(manager);
- if (route_nexthop_get_link(link->manager, link, nh, &link))
+ if (route_nexthop_get_link(manager, nh, &link) < 0)
return false;
if (!link_is_ready_to_configure(link, /* allow_unmanaged = */ true))
return gateway_is_ready(link, onlink, nh->family, &nh->gw);
}
-int route_nexthops_is_ready_to_configure(const Route *route, Link *link) {
+int route_nexthops_is_ready_to_configure(const Route *route, Manager *manager) {
int r;
assert(route);
- assert(link);
-
- Manager *manager = ASSERT_PTR(link->manager);
+ assert(manager);
if (route->nexthop_id != 0) {
struct nexthop_grp *nhg;
return true;
if (ordered_set_isempty(route->nexthops))
- return route_nexthop_is_ready_to_configure(&route->nexthop, link, FLAGS_SET(route->flags, RTNH_F_ONLINK));
+ return route_nexthop_is_ready_to_configure(&route->nexthop, manager, FLAGS_SET(route->flags, RTNH_F_ONLINK));
RouteNextHop *nh;
ORDERED_SET_FOREACH(nh, route->nexthops)
- if (!route_nexthop_is_ready_to_configure(nh, link, FLAGS_SET(route->flags, RTNH_F_ONLINK)))
+ if (!route_nexthop_is_ready_to_configure(nh, manager, FLAGS_SET(route->flags, RTNH_F_ONLINK)))
return false;
return true;
return 0;
}
-static int append_nexthop_one(Link *link, const Route *route, const RouteNextHop *nh, struct rtattr **rta, size_t offset) {
+static int append_nexthop_one(const Route *route, const RouteNextHop *nh, struct rtattr **rta, size_t offset) {
struct rtnexthop *rtnh;
struct rtattr *new_rta;
int r;
assert(rta);
assert(*rta);
- if (nh->ifindex <= 0) {
- assert(link);
- assert(link->manager);
-
- r = route_nexthop_get_link(link->manager, link, nh, &link);
- if (r < 0)
- return r;
- }
-
new_rta = realloc(*rta, RTA_ALIGN((*rta)->rta_len) + RTA_SPACE(sizeof(struct rtnexthop)));
if (!new_rta)
return -ENOMEM;
rtnh = (struct rtnexthop *)((uint8_t *) *rta + offset);
*rtnh = (struct rtnexthop) {
.rtnh_len = sizeof(*rtnh),
- .rtnh_ifindex = nh->ifindex > 0 ? nh->ifindex : link->ifindex,
+ .rtnh_ifindex = nh->ifindex,
.rtnh_hops = nh->weight,
};
return r;
}
-static int netlink_message_append_multipath_route(Link *link, const Route *route, sd_netlink_message *message) {
+static int netlink_message_append_multipath_route(const Route *route, sd_netlink_message *message) {
_cleanup_free_ struct rtattr *rta = NULL;
size_t offset;
int r;
offset = (uint8_t *) RTA_DATA(rta) - (uint8_t *) rta;
if (ordered_set_isempty(route->nexthops)) {
- r = append_nexthop_one(link, route, &route->nexthop, &rta, offset);
+ r = append_nexthop_one(route, &route->nexthop, &rta, offset);
if (r < 0)
return r;
ORDERED_SET_FOREACH(nh, route->nexthops) {
struct rtnexthop *rtnh;
- r = append_nexthop_one(link, route, nh, &rta, offset);
+ r = append_nexthop_one(route, nh, &rta, offset);
if (r < 0)
return r;
return sd_netlink_message_append_data(message, RTA_MULTIPATH, RTA_DATA(rta), RTA_PAYLOAD(rta));
}
-int route_nexthops_set_netlink_message(Link *link, const Route *route, sd_netlink_message *message) {
+int route_nexthops_set_netlink_message(const Route *route, sd_netlink_message *message) {
int r;
assert(route);
return r;
}
- return sd_netlink_message_append_u32(message, RTA_OIF, route->nexthop.ifindex > 0 ? route->nexthop.ifindex : ASSERT_PTR(link)->ifindex);
+ assert(route->nexthop.ifindex > 0);
+ return sd_netlink_message_append_u32(message, RTA_OIF, route->nexthop.ifindex);
}
- return netlink_message_append_multipath_route(link, route, message);
+ return netlink_message_append_multipath_route(route, message);
}
static int route_parse_nexthops(Route *route, const struct rtnexthop *rtnh, size_t size) {
bool route_nexthops_needs_adjust(const Route *route);
int route_adjust_nexthops(Route *route, Link *link);
-int route_nexthop_get_link(Manager *manager, Link *link, const RouteNextHop *nh, Link **ret);
-int route_nexthops_is_ready_to_configure(const Route *route, Link *link);
+int route_nexthop_get_link(Manager *manager, const RouteNextHop *nh, Link **ret);
+int route_nexthops_is_ready_to_configure(const Route *route, Manager *manager);
int route_nexthops_to_string(const Route *route, char **ret);
-int route_nexthops_set_netlink_message(Link *link, const Route *route, sd_netlink_message *message);
+int route_nexthops_set_netlink_message(const Route *route, sd_netlink_message *message);
int route_nexthops_read_netlink_message(Route *route, sd_netlink_message *message);
int route_section_verify_nexthops(Route *route);
assert(!route->wireguard);
Link *link;
- if (route_nexthop_get_link(manager, NULL, &route->nexthop, &link) >= 0) {
+ if (route_nexthop_get_link(manager, &route->nexthop, &link) >= 0) {
r = set_ensure_put(&link->routes, &route_hash_ops, route);
if (r < 0)
return r;
manager = ASSERT_PTR(ASSERT_PTR(link)->manager);
assert(route);
- if (route_nexthop_get_link(manager, NULL, &route->nexthop, &link) >= 0)
+ if (route_nexthop_get_link(manager, &route->nexthop, &link) >= 0)
existing = set_get(link->routes, route);
else
existing = set_get(manager->routes, route);
return link_get_by_index(manager, nh->ifindex, ret);
}
- return route_nexthop_get_link(manager, NULL, &route->nexthop, ret);
+ return route_nexthop_get_link(manager, &route->nexthop, ret);
}
static int route_get_request(Manager *manager, const Route *route, Request **ret) {
strna(proto), strna(scope), strna(route_type_to_string(route->type)), strna(flags));
}
-static int route_set_netlink_message(const Route *route, sd_netlink_message *m, Link *link) {
+static int route_set_netlink_message(const Route *route, sd_netlink_message *m) {
int r;
assert(route);
assert(m);
- /* link may be NULL */
-
/* rtmsg header (and relevant attributes) */
if (route->dst_prefixlen > 0) {
r = netlink_message_append_in_addr_union(m, RTA_DST, route->family, &route->dst);
return r;
/* nexthops */
- r = route_nexthops_set_netlink_message(link, route, m);
+ r = route_nexthops_set_netlink_message(route, m);
if (r < 0)
return r;
if (r < 0)
return log_link_warning_errno(link, r, "Could not create netlink message: %m");
- r = route_set_netlink_message(route, m, link);
+ r = route_set_netlink_message(route, m);
if (r < 0)
return log_link_warning_errno(link, r, "Could not fill netlink message: %m");
if (r < 0)
return r;
- r = route_set_netlink_message(route, m, link);
+ r = route_set_netlink_message(route, m);
if (r < 0)
return r;
return r;
}
- return route_nexthops_is_ready_to_configure(route, link);
+ return route_nexthops_is_ready_to_configure(route, link->manager);
}
static int route_process_request(Request *req, Link *link, Route *route) {