From: Tom Gundersen Date: Sat, 7 Dec 2013 22:03:19 +0000 (+0100) Subject: networkd: add support for Route sections X-Git-Tag: v209~870 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=ae4c67a7c6bb4efb858822838efe81008c965a98 networkd: add support for Route sections --- diff --git a/man/systemd-networkd.service.xml b/man/systemd-networkd.service.xml index 134432578..4cd0872b9 100644 --- a/man/systemd-networkd.service.xml +++ b/man/systemd-networkd.service.xml @@ -209,6 +209,24 @@ An address label. + + + The [Route] section accepts the following keys: + + + + Gateway + + As in the [Network] section. + + + + Destination + + The destination prefix of the route. Possibly followed by a slash and the + prefixlength, if ommitted a full-length host route is assumed. + + diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index 385f1bb85..f710df6bf 100644 --- a/src/network/networkd-gperf.gperf +++ b/src/network/networkd-gperf.gperf @@ -26,5 +26,7 @@ Network.Address, config_parse_address, 0, 0 Network.Gateway, config_parse_gateway, 0, 0 Address.Address, config_parse_address, 0, 0 Address.Label, config_parse_label, 0, 0 +Route.Gateway, config_parse_gateway, 0, 0 +Route.Destination, config_parse_destination, 0, 0 Bridge.Description, config_parse_string, 0, offsetof(Bridge, description) Bridge.Name, config_parse_ifname, 0, offsetof(Bridge, name) diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 22604b3af..3eaefa2cc 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -110,12 +110,12 @@ int route_configure(Route *route, Link *link, 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_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_append_u32(req, RTA_OIF, link->ifindex); @@ -204,20 +204,9 @@ int config_parse_destination(const char *unit, /* Destination=address/prefixlen */ - /* prefixlen */ + /* address */ e = strchr(rvalue, '/'); if (e) { - unsigned i; - r = safe_atou(e + 1, &i); - if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, EINVAL, - "Route destination prefix length is invalid, " - "ignoring assignment: %s", e + 1); - return 0; - } - - n->dst_prefixlen = (unsigned char) i; - address = strndup(rvalue, e - rvalue); if (!address) return log_oom(); @@ -234,6 +223,30 @@ int config_parse_destination(const char *unit, return 0; } + /* prefixlen */ + if (e) { + unsigned i; + + r = safe_atou(e + 1, &i); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, EINVAL, + "Route destination prefix length is invalid, " + "ignoring assignment: %s", e + 1); + return 0; + } + + n->dst_prefixlen = (unsigned char) i; + } else { + switch (n->family) { + case AF_INET: + n->dst_prefixlen = 32; + break; + case AF_INET6: + n->dst_prefixlen = 128; + break; + } + } + n = NULL; return 0;