<varlistentry>
<term><varname>Gateway=</varname></term>
<listitem>
- <para>As in the <literal>[Network]</literal> section.</para>
+ <para>Takes the gateway address or special value <literal>dhcp</literal>. If
+ <literal>dhcp</literal>, then the gateway address provided by DHCP (or in the IPv6 case,
+ provided by IPv6 RA) is used.</para>
</listitem>
</varlistentry>
<varlistentry>
return log_link_error_errno(link, r, "Could not set router: %m");
}
+ Route *rt;
+ LIST_FOREACH(routes, rt, link->network->static_routes) {
+ if (!rt->gateway_from_dhcp)
+ continue;
+
+ if (rt->family != AF_INET)
+ continue;
+
+ rt->gw.in = router[0];
+
+ r = route_configure(rt, link, dhcp4_route_handler);
+ if (r < 0)
+ return log_link_error_errno(link, r, "Could not set gateway: %m");
+ if (r > 0)
+ link->dhcp4_messages++;
+ }
+
return link_set_dns_routes(link, &address);
}
if (remove_all || !set_contains(link->dhcp_routes, route))
(void) route_remove(route, link, NULL);
+ Route *rt;
+ LIST_FOREACH(routes, rt, link->network->static_routes) {
+ if (!rt->gateway_from_dhcp)
+ continue;
+
+ if (rt->family != AF_INET)
+ continue;
+
+ if (!remove_all && in4_addr_equal(router, &rt->gw.in))
+ continue;
+
+ (void) route_remove(rt, link, NULL);
+ }
+
return 0;
}
/* First add the routes that enable us to talk to gateways, then add in the others that need a gateway. */
for (phase = 0; phase < _PHASE_MAX; phase++)
LIST_FOREACH(routes, rt, link->network->static_routes) {
+ if (rt->gateway_from_dhcp)
+ continue;
if ((in_addr_is_null(rt->family, &rt->gw) && ordered_set_isempty(rt->multipath_routes)) != (phase == PHASE_NON_GATEWAY))
continue;
if (r > 0)
link->ndisc_messages++;
+ Route *route_gw;
+ LIST_FOREACH(routes, route_gw, link->network->static_routes) {
+ if (!route_gw->gateway_from_dhcp)
+ continue;
+
+ if (route_gw->family != AF_INET6)
+ continue;
+
+ route_gw->gw = gateway;
+
+ r = route_configure(route_gw, link, ndisc_netlink_route_message_handler);
+ if (r < 0) {
+ log_link_error_errno(link, r, "Could not set gateway: %m");
+ link_enter_failed(link);
+ return r;
+ }
+ if (r > 0)
+ link->ndisc_messages++;
+ }
+
return 0;
}
/* we are not in an Route section, so treat
* this as the special '0' section */
r = route_new_static(network, NULL, 0, &n);
- } else
+ if (r < 0)
+ return r;
+ } else {
r = route_new_static(network, filename, section_line, &n);
- if (r < 0)
- return r;
+ if (r < 0)
+ return r;
+
+ if (streq(rvalue, "dhcp")) {
+ n->gateway_from_dhcp = true;
+ TAKE_PTR(n);
+ return 0;
+ }
+ }
if (n->family == AF_UNSPEC)
r = in_addr_from_string_auto(rvalue, &n->family, &n->gw);
unsigned char pref;
unsigned flags;
int gateway_onlink;
+ bool gateway_from_dhcp;
union in_addr_union gw;
union in_addr_union dst;