X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-route.c;h=25db676f059aa78d842553f327647e178d520caa;hb=f647962d64e844689f3e2acfce6102fc47e76df2;hp=77c2daddc50f052339062812b332aa2263d83606;hpb=44e7b9492617408130d11ffa451c2660942974f6;p=elogind.git diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 77c2daddc..25db676f0 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -22,6 +22,7 @@ #include #include "networkd.h" +#include "networkd-link.h" #include "utf8.h" #include "util.h" @@ -112,18 +113,16 @@ int route_drop(Route *route, Link *link, r = sd_rtnl_message_new_route(link->manager->rtnl, &req, RTM_DELROUTE, route->family, route->protocol); - if (r < 0) { - log_error("Could not create RTM_DELROUTE message: %s", strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "Could not create RTM_DELROUTE message: %m"); - 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 (!in_addr_is_null(route->family, &route->in_addr)) { + 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) + return log_error_errno(r, "Could not append RTA_GATEWAY attribute: %m"); } if (route->dst_prefixlen) { @@ -131,41 +130,38 @@ int route_drop(Route *route, Link *link, 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; - } + if (r < 0) + return log_error_errno(r, "Could not append RTA_DST attribute: %m"); 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; - } + if (r < 0) + return log_error_errno(r, "Could not set destination prefix length: %m"); } - r = sd_rtnl_message_route_set_scope(req, route->scope); - if (r < 0) { - log_error("Could not set scope: %s", strerror(-r)); - return r; + if (!in_addr_is_null(route->family, &route->prefsrc_addr)) { + if (route->family == AF_INET) + r = sd_rtnl_message_append_in_addr(req, RTA_PREFSRC, &route->prefsrc_addr.in); + else if (route->family == AF_INET6) + r = sd_rtnl_message_append_in6_addr(req, RTA_PREFSRC, &route->prefsrc_addr.in6); + if (r < 0) + return log_error_errno(r, "Could not append RTA_PREFSRC attribute: %m"); } + r = sd_rtnl_message_route_set_scope(req, route->scope); + if (r < 0) + return log_error_errno(r, "Could not set scope: %m"); + 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; - } + if (r < 0) + return log_error_errno(r, "Could not append RTA_PRIORITY attribute: %m"); 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; - } + if (r < 0) + return log_error_errno(r, "Could not append RTA_OIF attribute: %m"); 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; - } + if (r < 0) + return log_error_errno(r, "Could not send rtnetlink message: %m"); link_ref(link); @@ -186,18 +182,16 @@ int route_configure(Route *route, Link *link, r = sd_rtnl_message_new_route(link->manager->rtnl, &req, RTM_NEWROUTE, route->family, route->protocol); - if (r < 0) { - log_error("Could not create RTM_NEWROUTE message: %s", strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "Could not create RTM_NEWROUTE message: %m"); - 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 (!in_addr_is_null(route->family, &route->in_addr)) { + 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) + return log_error_errno(r, "Could not append RTA_GATEWAY attribute: %m"); } if (route->dst_prefixlen) { @@ -205,41 +199,38 @@ int route_configure(Route *route, Link *link, 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; - } + if (r < 0) + return log_error_errno(r, "Could not append RTA_DST attribute: %m"); 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; - } + if (r < 0) + return log_error_errno(r, "Could not set destination prefix length: %m"); } - r = sd_rtnl_message_route_set_scope(req, route->scope); - if (r < 0) { - log_error("Could not set scope: %s", strerror(-r)); - return r; + if (!in_addr_is_null(route->family, &route->prefsrc_addr)) { + if (route->family == AF_INET) + r = sd_rtnl_message_append_in_addr(req, RTA_PREFSRC, &route->prefsrc_addr.in); + else if (route->family == AF_INET6) + r = sd_rtnl_message_append_in6_addr(req, RTA_PREFSRC, &route->prefsrc_addr.in6); + if (r < 0) + return log_error_errno(r, "Could not append RTA_PREFSRC attribute: %m"); } + r = sd_rtnl_message_route_set_scope(req, route->scope); + if (r < 0) + return log_error_errno(r, "Could not set scope: %m"); + 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; - } + if (r < 0) + return log_error_errno(r, "Could not append RTA_PRIORITY attribute: %m"); 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; - } + if (r < 0) + return log_error_errno(r, "Could not append RTA_OIF attribute: %m"); 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; - } + if (r < 0) + return log_error_errno(r, "Could not send rtnetlink message: %m"); link_ref(link);