diff options
author | Gavin Li <git@thegavinli.com> | 2014-11-25 00:51:31 +0100 |
---|---|---|
committer | Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> | 2014-11-27 06:24:52 +0100 |
commit | 59580681f5f950335b5ec40bb4c4a70dca6b2830 (patch) | |
tree | b10899ee0dbb38ea2d261b7f43061d541d1b3d74 /src/network | |
parent | build-sys: do not install tmpfiles and sysusers files by default (diff) | |
download | systemd-59580681f5f950335b5ec40bb4c4a70dca6b2830.tar.xz systemd-59580681f5f950335b5ec40bb4c4a70dca6b2830.zip |
networkd: route - allow routes without a gateway
For IPv6, the kernel returns EINVAL if a route is added with the
RTA_GATEWAY attribute set to in6addr_any (::). A route without a
gateway is useful in some situations, such as layer 3 tunneling
(sit, gre, etc.).
This patch prevents the RTA_GATEWAY attribute from being added
when route.in_addr is ip6addr_any (::).
Diffstat (limited to 'src/network')
-rw-r--r-- | src/network/networkd-route.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 10d8cd902a..82c9e002fd 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -118,13 +118,15 @@ int route_drop(Route *route, Link *link, 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 (!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) { + log_error("Could not append RTA_GATEWAY attribute: %s", strerror(-r)); + return r; + } } if (route->dst_prefixlen) { @@ -203,13 +205,15 @@ int route_configure(Route *route, Link *link, 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 (!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) { + log_error("Could not append RTA_GATEWAY attribute: %s", strerror(-r)); + return r; + } } if (route->dst_prefixlen) { |