networkd: route - support 'onlink' routes (#5734)

This work based on Tom's original patch
teg@1312172

By setting GatewayOnlink=yes, the kernel will assume that the gateway is onlink
even if there is no route to it.

Resolves issue #1283.
This commit is contained in:
Susant Sahani 2017-04-21 14:52:30 +05:30 committed by Lennart Poettering
parent 3e06055500
commit 28959f7d3e
4 changed files with 53 additions and 0 deletions

View File

@ -809,6 +809,16 @@
<para>As in the <literal>[Network]</literal> section.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>GatewayOnlink=</varname></term>
<listitem>
<para>The <literal>GatewayOnlink</literal> option tells the kernel that the it does not have
to check if the gateway is reachable directly by the current machine (i.e., the kernel does
not need to check if the gateway is attached to the local network), so that we can insert the
route in the kernel table without it being complained about. A boolean, defaults to <literal>no</literal>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><varname>Destination=</varname></term>
<listitem>

View File

@ -86,6 +86,7 @@ Route.Metric, config_parse_route_priority,
Route.Scope, config_parse_route_scope, 0, 0
Route.PreferredSource, config_parse_preferred_src, 0, 0
Route.Table, config_parse_route_table, 0, 0
Route.GatewayOnlink, config_parse_gateway_onlink, 0, 0
DHCP.ClientIdentifier, config_parse_dhcp_client_identifier, 0, offsetof(Network, dhcp_client_identifier)
DHCP.UseDNS, config_parse_bool, 0, offsetof(Network, dhcp_use_dns)
DHCP.UseNTP, config_parse_bool, 0, offsetof(Network, dhcp_use_ntp)

View File

@ -939,3 +939,44 @@ int config_parse_route_table(const char *unit,
return 0;
}
int config_parse_gateway_onlink(const char *unit,
const char *filename,
unsigned line,
const char *section,
unsigned section_line,
const char *lvalue,
int ltype,
const char *rvalue,
void *data,
void *userdata) {
Network *network = userdata;
_cleanup_route_free_ Route *n = NULL;
int r;
assert(filename);
assert(section);
assert(lvalue);
assert(rvalue);
assert(data);
r = route_new_static(network, filename, section_line, &n);
if (r < 0)
return r;
r = parse_boolean(rvalue);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, r,
"Could not parse gateway onlink \"%s\", ignoring assignment: %m", rvalue);
return 0;
}
if (r)
n->flags |= RTNH_F_ONLINK;
else
n->flags &= ~RTNH_F_ONLINK;
n = NULL;
return 0;
}

View File

@ -75,3 +75,4 @@ int config_parse_destination(const char *unit, const char *filename, unsigned li
int config_parse_route_priority(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_route_scope(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_route_table(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);
int config_parse_gateway_onlink(const char *unit, const char *filename, unsigned line, const char *section, unsigned section_line, const char *lvalue, int ltype, const char *rvalue, void *data, void *userdata);