1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-10-27 18:55:09 +03:00

networkd: add support for Route sections

This commit is contained in:
Tom Gundersen 2013-12-07 23:03:19 +01:00
parent b0d27a2508
commit ae4c67a7c6
3 changed files with 50 additions and 17 deletions

View File

@ -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>

View File

@ -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)

View File

@ -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;