X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-route.c;h=8b020adba469a29739357262e8e362a8bae6b659;hp=488d3f5013719bac0be8a34fe11a2a73778eb099;hb=ecb08ec6a5c52f2d940f3b8147e2a480affd46e1;hpb=f048a16b464295a4e0a4f4c1210f06343ad31231 diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 488d3f501..8b020adba 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -26,7 +26,7 @@ #include "utf8.h" #include "util.h" #include "conf-parser.h" -#include "net-util.h" +#include "network-internal.h" int route_new_static(Network *network, unsigned section, Route **ret) { _cleanup_route_free_ Route *route = NULL; @@ -47,6 +47,9 @@ int route_new_static(Network *network, unsigned section, Route **ret) { if (!route) return -ENOMEM; + route->family = AF_UNSPEC; + route->scope = RT_SCOPE_UNIVERSE; + route->network = network; LIST_PREPEND(static_routes, network->static_routes, route); @@ -69,6 +72,9 @@ int route_new_dynamic(Route **ret) { if (!route) return -ENOMEM; + route->family = AF_UNSPEC; + route->scope = RT_SCOPE_UNIVERSE; + *ret = route; route = NULL; @@ -90,9 +96,80 @@ void route_free(Route *route) { free(route); } +int route_drop(Route *route, Link *link, + sd_rtnl_message_handler_t callback) { + _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL; + int r; + + assert(link); + assert(link->manager); + assert(link->manager->rtnl); + assert(link->ifindex > 0); + assert(route->family == AF_INET || route->family == AF_INET6); + + r = sd_rtnl_message_new_route(link->manager->rtnl, &req, + RTM_DELROUTE, route->family); + if (r < 0) { + log_error("Could not create RTM_DELROUTE message: %s", strerror(-r)); + return r; + } + + if (route->family == AF_INET) + r = sd_rtnl_message_append_in_addr(req, RTA_GATEWAY, &route->in_addr.in); + else if (route->family == AF_INET6) + r = sd_rtnl_message_append_in6_addr(req, RTA_GATEWAY, &route->in_addr.in6); + if (r < 0) { + log_error("Could not append RTA_GATEWAY attribute: %s", strerror(-r)); + return r; + } + + if (route->dst_prefixlen) { + if (route->family == AF_INET) + r = sd_rtnl_message_append_in_addr(req, RTA_DST, &route->dst_addr.in); + else if (route->family == AF_INET6) + r = sd_rtnl_message_append_in6_addr(req, RTA_DST, &route->dst_addr.in6); + if (r < 0) { + log_error("Could not append RTA_DST attribute: %s", strerror(-r)); + return r; + } + + r = sd_rtnl_message_route_set_dst_prefixlen(req, route->dst_prefixlen); + if (r < 0) { + log_error("Could not set destination prefix length: %s", strerror(-r)); + return r; + } + } + + r = sd_rtnl_message_route_set_scope(req, route->scope); + if (r < 0) { + log_error("Could not set scope: %s", strerror(-r)); + return r; + } + + r = sd_rtnl_message_append_u32(req, RTA_PRIORITY, route->metrics); + if (r < 0) { + log_error("Could not append RTA_PRIORITY attribute: %s", strerror(-r)); + return r; + } + + r = sd_rtnl_message_append_u32(req, RTA_OIF, link->ifindex); + if (r < 0) { + log_error("Could not append RTA_OIF attribute: %s", strerror(-r)); + return r; + } + + r = sd_rtnl_call_async(link->manager->rtnl, req, callback, link, 0, NULL); + if (r < 0) { + log_error("Could not send rtnetlink message: %s", strerror(-r)); + return r; + } + + return 0; +} + int route_configure(Route *route, Link *link, sd_rtnl_message_handler_t callback) { - _cleanup_sd_rtnl_message_unref_ sd_rtnl_message *req = NULL; + _cleanup_rtnl_message_unref_ sd_rtnl_message *req = NULL; int r; assert(link); @@ -101,7 +178,8 @@ int route_configure(Route *route, Link *link, assert(link->ifindex > 0); assert(route->family == AF_INET || route->family == AF_INET6); - r = sd_rtnl_message_route_new(RTM_NEWROUTE, route->family, &req); + r = sd_rtnl_message_new_route(link->manager->rtnl, &req, + RTM_NEWROUTE, route->family); if (r < 0) { log_error("Could not create RTM_NEWROUTE message: %s", strerror(-r)); return r; @@ -133,6 +211,18 @@ int route_configure(Route *route, Link *link, } } + r = sd_rtnl_message_route_set_scope(req, route->scope); + if (r < 0) { + log_error("Could not set scope: %s", strerror(-r)); + return r; + } + + r = sd_rtnl_message_append_u32(req, RTA_PRIORITY, route->metrics); + if (r < 0) { + log_error("Could not append RTA_PRIORITY attribute: %s", strerror(-r)); + return r; + } + r = sd_rtnl_message_append_u32(req, RTA_OIF, link->ifindex); if (r < 0) { log_error("Could not append RTA_OIF attribute: %s", strerror(-r));