chiark / gitweb /
update TODO
[elogind.git] / src / network / networkd-route.c
index 77c2daddc50f052339062812b332aa2263d83606..25db676f059aa78d842553f327647e178d520caa 100644 (file)
@@ -22,6 +22,7 @@
 #include <net/if.h>
 
 #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);