diff options
-rw-r--r-- | man/systemd-networkd.service.xml | 18 | ||||
-rw-r--r-- | src/network/networkd-gperf.gperf | 2 | ||||
-rw-r--r-- | src/network/networkd-route.c | 47 |
3 files changed, 50 insertions, 17 deletions
diff --git a/man/systemd-networkd.service.xml b/man/systemd-networkd.service.xml index 1344325782..4cd0872b9a 100644 --- a/man/systemd-networkd.service.xml +++ b/man/systemd-networkd.service.xml @@ -209,6 +209,24 @@ <para>An address label.</para> </listitem> </varlistentry> + </variablelist> + + <para>The <literal>[Route]</literal> section accepts the following keys:</para> + + <variablelist class='network-directives'> + <varlistentry> + <term><varname>Gateway</varname></term> + <listitem> + <para>As in the <literal>[Network]</literal> section.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><varname>Destination</varname></term> + <listitem> + <para>The destination prefix of the route. Possibly followed by a slash and the + prefixlength, if ommitted a full-length host route is assumed.</para> + </listitem> + </varlistentry> </variablelist> </refsect2> </refsect1> diff --git a/src/network/networkd-gperf.gperf b/src/network/networkd-gperf.gperf index 385f1bb856..f710df6bf6 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 22604b3afb..3eaefa2cc7 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; |