#include "alloc-util.h"
#include "extract-word.h"
#include "netlink-util.h"
+#include "networkd-manager.h"
#include "networkd-network.h"
#include "networkd-nexthop.h"
#include "networkd-route.h"
#include "parse-util.h"
#include "string-util.h"
+void route_detach_from_nexthop(Route *route) {
+ NextHop *nh;
+
+ assert(route);
+ assert(route->manager);
+
+ if (route->nexthop_id == 0)
+ return;
+
+ if (nexthop_get_by_id(route->manager, route->nexthop_id, &nh) < 0)
+ return;
+
+ route_unref(set_remove(nh->routes, route));
+}
+
+void route_attach_to_nexthop(Route *route) {
+ NextHop *nh;
+ int r;
+
+ assert(route);
+ assert(route->manager);
+
+ if (route->nexthop_id == 0)
+ return;
+
+ r = nexthop_get_by_id(route->manager, route->nexthop_id, &nh);
+ if (r < 0) {
+ if (route->manager->manage_foreign_nexthops)
+ log_debug_errno(r, "Route has unknown nexthop ID (%"PRIu32"), ignoring.",
+ route->nexthop_id);
+ return;
+ }
+
+ r = set_ensure_put(&nh->routes, &route_hash_ops_unref, route);
+ if (r < 0)
+ return (void) log_debug_errno(r, "Failed to save route to nexthop, ignoring: %m");
+ if (r == 0)
+ return (void) log_debug("Duplicated route assigned to nexthop, ignoring.");
+
+ route_ref(route);
+}
+
static void route_nexthop_done(RouteNextHop *nh) {
assert(nh);
#define ROUTE_NEXTHOP_NULL ((const RouteNextHop) {})
+void route_detach_from_nexthop(Route *route);
+void route_attach_to_nexthop(Route *route);
+
RouteNextHop* route_nexthop_free(RouteNextHop *nh);
DEFINE_TRIVIAL_CLEANUP_FUNC(RouteNextHop*, route_nexthop_free);
}
if (route->manager) {
+ route_detach_from_nexthop(route);
set_remove(route->manager->routes, route);
route->manager = NULL;
return route;
route_compare_func,
route_detach);
+DEFINE_HASH_OPS_WITH_KEY_DESTRUCTOR(
+ route_hash_ops_unref,
+ Route,
+ route_hash_func,
+ route_compare_func,
+ route_unref);
+
DEFINE_HASH_OPS_WITH_VALUE_DESTRUCTOR(
route_section_hash_ops,
ConfigSection,