network traffic.</para></listitem>
</varlistentry>
+ <varlistentry>
+ <term><varname>UplinkInterface=</varname></term>
+ <listitem><para>Specifies name or index of uplink interface, or one of the special values
+ <literal>:none</literal> and <literal>:auto</literal>. When emitting DNS, NTP, or SIP servers
+ are enabled but no servers are specified, the servers configured in the uplink interface will
+ be emitted. When <literal>:auto</literal>, the link which has default gateway with higher
+ priority will be automatically selected. When <literal>:none</literal>, no uplink interface
+ will be selected. Defaults to <literal>:auto</literal>.</para></listitem>
+ </varlistentry>
+
<varlistentry>
<term><varname>EmitDNS=</varname></term>
<term><varname>DNS=</varname></term>
return -ENOENT;
}
+static int dhcp_server_find_uplink(Link *link, Link **ret) {
+ assert(link);
+
+ if (link->network->dhcp_server_uplink_name)
+ return link_get_by_name(link->manager, link->network->dhcp_server_uplink_name, ret);
+
+ if (link->network->dhcp_server_uplink_index > 0)
+ return link_get(link->manager, link->network->dhcp_server_uplink_index, ret);
+
+ if (link->network->dhcp_server_uplink_index == 0) {
+ /* It is not necessary to propagate error in automatic selection. */
+ if (manager_find_uplink(link->manager, AF_INET, link, ret) < 0)
+ *ret = NULL;
+ return 0;
+ }
+
+ *ret = NULL;
+ return 0;
+}
+
static int link_push_uplink_to_dhcp_server(
Link *link,
sd_dhcp_lease_server_type_t what,
else {
/* Emission is requested, but nothing explicitly configured. Let's find a suitable upling */
if (!acquired_uplink) {
- (void) manager_find_uplink(link->manager, AF_INET, link, &uplink);
+ (void) dhcp_server_find_uplink(link, &uplink);
acquired_uplink = true;
}
}
static bool dhcp_server_is_ready_to_configure(Link *link) {
+ Link *uplink = NULL;
Address *a;
assert(link);
if (!address_is_ready(a))
return false;
+ if (dhcp_server_find_uplink(link, &uplink) < 0)
+ return false;
+
+ if (uplink && !uplink->network)
+ return false;
+
return true;
}
network->dhcp_server_address_prefixlen = prefixlen;
return 0;
}
+
+int config_parse_dhcp_server_uplink(
+ 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;
+ int r;
+
+ assert(filename);
+ assert(lvalue);
+ assert(rvalue);
+
+ if (isempty(rvalue) || streq(rvalue, ":auto")) {
+ network->dhcp_server_uplink_index = 0; /* uplink will be selected automatically */
+ network->dhcp_server_uplink_name = mfree(network->dhcp_server_uplink_name);
+ return 0;
+ }
+
+ if (streq(rvalue, ":none")) {
+ network->dhcp_server_uplink_index = -1; /* uplink will not be selected automatically */
+ network->dhcp_server_uplink_name = mfree(network->dhcp_server_uplink_name);
+ return 0;
+ }
+
+ r = parse_ifindex(rvalue);
+ if (r > 0) {
+ network->dhcp_server_uplink_index = r;
+ network->dhcp_server_uplink_name = mfree(network->dhcp_server_uplink_name);
+ return 0;
+ }
+
+ if (!ifname_valid_full(rvalue, IFNAME_VALID_ALTERNATIVE)) {
+ log_syntax(unit, LOG_WARNING, filename, line, 0,
+ "Invalid interface name in %s=, ignoring assignment: %s", lvalue, rvalue);
+ return 0;
+ }
+
+ r = free_and_strdup_warn(&network->dhcp_server_uplink_name, rvalue);
+ if (r < 0)
+ return r;
+
+ network->dhcp_server_uplink_index = 0;
+ return 0;
+}
IPv6AcceptRA.RouteAllowList, config_parse_ndisc_address_filter, 0, offsetof(Network, ndisc_allow_listed_route_prefix)
IPv6AcceptRA.RouteDenyList, config_parse_ndisc_address_filter, 0, offsetof(Network, ndisc_deny_listed_route_prefix)
DHCPServer.ServerAddress, config_parse_dhcp_server_address, 0, 0
+DHCPServer.UplinkInterface, config_parse_dhcp_server_uplink, 0, 0
DHCPServer.RelayTarget, config_parse_in_addr_non_null, AF_INET, offsetof(Network, dhcp_server_relay_target)
DHCPServer.RelayAgentCircuitId, config_parse_dhcp_server_relay_agent_suboption, 0, offsetof(Network, dhcp_server_relay_agent_circuit_id)
DHCPServer.RelayAgentRemoteId, config_parse_dhcp_server_relay_agent_suboption, 0, offsetof(Network, dhcp_server_relay_agent_remote_id)