return 0;
}
+static int route_get_link(Manager *manager, const Route *route, Link **ret) {
+ int r;
+
+ assert(manager);
+ assert(route);
+
+ if (route->nexthop_id != 0) {
+ NextHop *nh;
+
+ r = nexthop_get_by_id(manager, route->nexthop_id, &nh);
+ if (r < 0)
+ return r;
+
+ return link_get_by_index(manager, nh->ifindex, ret);
+ }
+
+ return route_nexthop_get_link(manager, NULL, &route->nexthop, ret);
+}
+
int route_dup(const Route *src, Route **ret) {
_cleanup_(route_freep) Route *dest = NULL;
int r;
}
}
-static void log_route_debug(const Route *route, const char *str, const Link *link, const Manager *manager) {
+static void log_route_debug(const Route *route, const char *str, Manager *manager) {
_cleanup_free_ char *state = NULL, *nexthop = NULL, *prefsrc = NULL,
*table = NULL, *scope = NULL, *proto = NULL, *flags = NULL;
const char *dst, *src;
+ Link *link = NULL;
assert(route);
assert(str);
assert(manager);
- /* link may be NULL. */
-
if (!DEBUG_LOGGING)
return;
+ (void) route_get_link(manager, route, &link);
+
(void) network_config_state_to_string_alloc(route->state, &state);
dst = in_addr_is_set(route->family, &route->dst) || route->dst_prefixlen > 0 ?
link = route->link;
manager = route->manager ?: link->manager;
- log_route_debug(route, "Removing", link, manager);
+ log_route_debug(route, "Removing", manager);
r = sd_rtnl_message_new_route(manager->rtnl, &req,
RTM_DELROUTE, route->family,
if (r < 0)
return log_link_warning_errno(route->link, r, "Failed to configure expiration timer for route, ignoring: %m");
- log_route_debug(route, "Configured expiration timer for", route->link, manager);
+ log_route_debug(route, "Configured expiration timer for", manager);
return 1;
}
int r;
assert(route);
- assert(IN_SET(route->family, AF_INET, AF_INET6));
assert(link);
assert(link->manager);
- assert(link->manager->rtnl);
- assert(link->ifindex > 0);
assert(req);
- log_route_debug(route, "Configuring", link, link->manager);
+ log_route_debug(route, "Configuring", link->manager);
r = sd_rtnl_message_new_route(link->manager->rtnl, &m, RTM_NEWROUTE, route->family, route->protocol);
if (r < 0)
route_free(route);
}
- log_route_debug(existing, "Requesting", link, link->manager);
+ log_route_debug(existing, "Requesting", link->manager);
r = link_queue_request_safe(link, REQUEST_TYPE_ROUTE,
existing, NULL,
route_hash_func,
return link_request_route(link, route, false, &link->static_route_messages,
static_route_handler, NULL);
- log_route_debug(route, "Requesting", link, link->manager);
+ log_route_debug(route, "Requesting", link->manager);
return link_queue_request_safe(link, REQUEST_TYPE_ROUTE,
route, NULL, route_hash_func, route_compare_func,
route_process_request,
if (!route) {
if (!manager->manage_foreign_routes) {
route_enter_configured(tmp);
- log_route_debug(tmp, "Ignoring received", link, manager);
+ log_route_debug(tmp, "Ignoring received", manager);
return 0;
}
route->flags = tmp->flags;
route_enter_configured(route);
- log_route_debug(route, is_new ? "Received new" : "Received remembered", link, manager);
+ log_route_debug(route, is_new ? "Received new" : "Received remembered", manager);
(void) route_setup_timer(route, cacheinfo);
if (route) {
route_enter_removed(route);
if (route->state == 0) {
- log_route_debug(route, "Forgetting", link, manager);
+ log_route_debug(route, "Forgetting", manager);
route_free(route);
} else
- log_route_debug(route, "Removed", link, manager);
+ log_route_debug(route, "Removed", manager);
} else
log_route_debug(tmp,
manager->manage_foreign_routes ? "Kernel removed unknown" : "Ignoring received",
- link, manager);
+ manager);
break;