<term><varname>Gateway=</varname></term>
<listitem>
<para>Takes the gateway address or the special values <literal>_dhcp4</literal> and
- <literal>_ipv6ra</literal>. If <literal>_dhcp4</literal> or <literal>_ipv6ra</literal> is
- set, then the gateway address provided by DHCPv4 or IPv6 RA is used.</para>
+ <literal>_ipv6ra</literal>. If <literal>_dhcp4</literal> or <literal>_ipv6ra</literal> is set, then
+ the gateway address provided by DHCPv4 or IPv6 RA is used. When<literal>_dhcp4</literal>, the
+ acquired DHCPv4 address will be used as the preferred source address of the route, unless it is
+ explicitly configured in <varname>PreferredSource=</varname>.</para>
<xi:include href="version-info.xml" xpointer="v211"/>
</listitem>
<varlistentry>
<term><varname>PreferredSource=</varname></term>
<listitem>
- <para>The preferred source address of the route. The address must be in the format described
- in
+ <para>The preferred source address of the route. Takes <literal>no</literal> or an address
+ in the format described in
<citerefentry project='man-pages'><refentrytitle>inet_pton</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
- </para>
+ If <varname>Gateway=_dhcp4</varname> is specified, defaults to the acquired DHCPv4 address.
+ Otherwise, defaults to unset. The value <literal>no</literal> may be useful to configure a route
+ with <varname>Gateway=_dhcp4</varname> without setting preferred source route address.</para>
<xi:include href="version-info.xml" xpointer="v227"/>
</listitem>
route->nexthop.gw.in = gw;
+ if (!route->prefsrc_set) {
+ r = sd_dhcp_lease_get_address(link->dhcp_lease, &route->prefsrc.in);
+ if (r < 0)
+ return r;
+ }
+
r = dhcp4_request_prefix_route(link, route);
if (r < 0)
return r;
Route *route = ASSERT_PTR(userdata);
int r;
- assert(rvalue);
+ if (isempty(rvalue)) {
+ route->prefsrc_set = false;
+ route->prefsrc = IN_ADDR_NULL;
+ return 1;
+ }
+
+ r = parse_boolean(rvalue);
+ if (r == 0) {
+ /* Accepts only no. That prohibits prefsrc set by DHCP lease. */
+ route->prefsrc_set = true;
+ route->prefsrc = IN_ADDR_NULL;
+ return 1;
+ }
if (route->family == AF_UNSPEC)
r = in_addr_from_string_auto(rvalue, &route->family, &route->prefsrc);
if (r < 0)
return log_syntax_parse_error(unit, filename, line, r, lvalue, rvalue);
+ route->prefsrc_set = true;
return 1;
}