network: drop use of legacy DHCP relay agent in sd-dhcp-server
Then, this deprecates - BindToInterface= - RelayTarget= - RelayAgentCircuitId= - RelayAgentRemoteId= settings in [DHCPServer] section. These are gracefully translated as new settings.
This commit is contained in:
+3
-53
@@ -464,10 +464,9 @@
|
||||
|
||||
<para>Even if this is enabled, the DHCP server will not be started automatically and wait for the
|
||||
persistent storage being ready to load/save leases in the storage, unless
|
||||
<varname>RelayTarget=</varname> or <varname>PersistLeases=no/runtime</varname> are specified in the
|
||||
[DHCPServer] section. It will be started after
|
||||
<filename>systemd-networkd-persistent-storage.service</filename> is started, which calls
|
||||
<command>networkctl persistent-storage yes</command>. See
|
||||
<varname>PersistLeases=no/runtime</varname> is specified in the [DHCPServer] section. It will be
|
||||
started after <filename>systemd-networkd-persistent-storage.service</filename> is started, which
|
||||
calls <command>networkctl persistent-storage yes</command>. See
|
||||
<citerefentry><refentrytitle>networkctl</refentrytitle><manvolnum>1</manvolnum></citerefentry>
|
||||
for more details.</para>
|
||||
|
||||
@@ -4279,52 +4278,6 @@ ServerAddress=192.168.0.1/24</programlisting>
|
||||
<xi:include href="version-info.xml" xpointer="v246"/>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><varname>BindToInterface=</varname></term>
|
||||
<listitem>
|
||||
<para>Takes a boolean value. When <literal>yes</literal>, DHCP server socket will be bound
|
||||
to its network interface and all socket communication will be restricted to this interface.
|
||||
Defaults to <literal>yes</literal>, except if <varname>RelayTarget=</varname> is used (see below),
|
||||
in which case it defaults to <literal>no</literal>.</para>
|
||||
|
||||
<xi:include href="version-info.xml" xpointer="v249"/>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><varname>RelayTarget=</varname></term>
|
||||
<listitem>
|
||||
<para>Takes an IPv4 address, which must be in the format described in
|
||||
<citerefentry project='man-pages'><refentrytitle>inet_pton</refentrytitle><manvolnum>3</manvolnum></citerefentry>.
|
||||
Turns this DHCP server into a DHCP relay agent. See <ulink url="https://tools.ietf.org/html/rfc1542">RFC 1542</ulink>.
|
||||
The address is the address of DHCP server or another relay agent to forward DHCP messages to and from.</para>
|
||||
|
||||
<xi:include href="version-info.xml" xpointer="v249"/>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><varname>RelayAgentCircuitId=</varname></term>
|
||||
<listitem>
|
||||
<para>Specifies value for Agent Circuit ID suboption of Relay Agent Information option.
|
||||
Takes a string, which must be in the format <literal>string:<replaceable>value</replaceable></literal>,
|
||||
where <literal><replaceable>value</replaceable></literal> should be replaced with the value of the suboption.
|
||||
Defaults to unset (means no Agent Circuit ID suboption is generated).
|
||||
Ignored if <varname>RelayTarget=</varname> is not specified.</para>
|
||||
|
||||
<xi:include href="version-info.xml" xpointer="v249"/>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><varname>RelayAgentRemoteId=</varname></term>
|
||||
<listitem>
|
||||
<para>Specifies value for Agent Remote ID suboption of Relay Agent Information option.
|
||||
Takes a string, which must be in the format <literal>string:<replaceable>value</replaceable></literal>,
|
||||
where <literal><replaceable>value</replaceable></literal> should be replaced with the value of the suboption.
|
||||
Defaults to unset (means no Agent Remote ID suboption is generated).
|
||||
Ignored if <varname>RelayTarget=</varname> is not specified.</para>
|
||||
|
||||
<xi:include href="version-info.xml" xpointer="v249"/>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><varname>RapidCommit=</varname></term>
|
||||
@@ -4356,9 +4309,6 @@ ServerAddress=192.168.0.1/24</programlisting>
|
||||
<citerefentry><refentrytitle>networkd.conf</refentrytitle><manvolnum>5</manvolnum></citerefentry>,
|
||||
which defaults to <literal>yes</literal>, will be used.</para>
|
||||
|
||||
<para>When <varname>RelayTarget=</varname> is specified, this setting will be ignored and no leases
|
||||
will be saved, as there will be no bound lease on the server.</para>
|
||||
|
||||
<xi:include href="version-info.xml" xpointer="v256"/>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
@@ -209,6 +209,18 @@ static int link_configure_dhcp_relay(Link *link) {
|
||||
}
|
||||
|
||||
link->dhcp_relay_interface = TAKE_PTR(interface);
|
||||
|
||||
if (link->network->dhcp_relay_interface_mode == DHCP_RELAY_INTERFACE_COMPAT &&
|
||||
!link->dhcp_relay_interface_compat) {
|
||||
r = sd_dhcp_relay_add_interface(
|
||||
link->manager->dhcp_relay,
|
||||
DHCP_RELAY_IFINDEX_UNBOUND,
|
||||
/* is_upstream= */ true,
|
||||
&link->dhcp_relay_interface_compat);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -298,6 +310,12 @@ int link_start_dhcp_relay(Link *link) {
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (link->dhcp_relay_interface_compat) {
|
||||
r = sd_dhcp_relay_interface_start(link->dhcp_relay_interface_compat);
|
||||
if (r < 0)
|
||||
return r;
|
||||
}
|
||||
|
||||
log_link_debug(link, "Relaying DHCPv4 messages.");
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
typedef enum DHCPRelayInterfaceMode {
|
||||
DHCP_RELAY_INTERFACE_UPSTREAM,
|
||||
DHCP_RELAY_INTERFACE_DOWNSTREAM,
|
||||
DHCP_RELAY_INTERFACE_COMPAT,
|
||||
_DHCP_RELAY_INTERFACE_MAX,
|
||||
_DHCP_RELAY_INTERFACE_INVALID = -EINVAL,
|
||||
} DHCPRelayInterfaceMode;
|
||||
|
||||
@@ -30,9 +30,6 @@ static int property_get_leases(
|
||||
if (!s)
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Link %s has no DHCP server.", l->ifname);
|
||||
|
||||
if (sd_dhcp_server_is_in_relay_mode(s))
|
||||
return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, "Link %s has DHCP relay agent active.", l->ifname);
|
||||
|
||||
r = sd_bus_message_open_container(reply, 'a', "(uayayayayt)");
|
||||
if (r < 0)
|
||||
return r;
|
||||
@@ -82,15 +79,12 @@ static int property_get_pool_size(
|
||||
sd_bus_message *reply,
|
||||
void *userdata,
|
||||
sd_bus_error *error) {
|
||||
|
||||
Link *l = ASSERT_PTR(userdata);
|
||||
sd_dhcp_server *s;
|
||||
uint32_t v;
|
||||
|
||||
assert(reply);
|
||||
|
||||
s = l->dhcp_server;
|
||||
v = s && !sd_dhcp_server_is_in_relay_mode(s) ? s->pool_size : UINT32_MAX;
|
||||
|
||||
uint32_t v = l->dhcp_server ? l->dhcp_server->pool_size : UINT32_MAX;
|
||||
return sd_bus_message_append_basic(reply, 'u', &v);
|
||||
}
|
||||
|
||||
@@ -102,15 +96,12 @@ static int property_get_pool_offset(
|
||||
sd_bus_message *reply,
|
||||
void *userdata,
|
||||
sd_bus_error *error) {
|
||||
|
||||
Link *l = ASSERT_PTR(userdata);
|
||||
sd_dhcp_server *s;
|
||||
uint32_t v;
|
||||
|
||||
assert(reply);
|
||||
|
||||
s = l->dhcp_server;
|
||||
v = s && !sd_dhcp_server_is_in_relay_mode(s) ? s->pool_offset : UINT32_MAX;
|
||||
|
||||
uint32_t v = l->dhcp_server ? l->dhcp_server->pool_offset : UINT32_MAX;
|
||||
return sd_bus_message_append_basic(reply, 'u', &v);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "fileio.h"
|
||||
#include "hashmap.h"
|
||||
#include "hostname-setup.h"
|
||||
#include "iovec-util.h"
|
||||
#include "network-common.h"
|
||||
#include "networkd-address.h"
|
||||
#include "networkd-dhcp-server.h"
|
||||
@@ -66,6 +67,31 @@ int network_adjust_dhcp_server(Network *network, Set **addresses) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (in4_addr_is_set(&network->dhcp_relay_target_address)) {
|
||||
if (!in4_addr_is_set(&network->manager->dhcp_relay_server_address)) {
|
||||
/* [DHCPServer] RelayTarget= in .network file is replaced with
|
||||
* [DHCPRelay] ServerAddress= in networkd.conf. */
|
||||
network->manager->dhcp_relay_server_address = network->dhcp_relay_target_address;
|
||||
|
||||
/* [DHCPServer] RelayAgentRemoteId= in .network file is replaced with
|
||||
* [DHCPRelay] RemoteId= in networkd.conf. */
|
||||
if (!iovec_is_set(&network->manager->dhcp_relay_remote_id)) {
|
||||
iovec_done(&network->manager->dhcp_relay_remote_id);
|
||||
network->manager->dhcp_relay_remote_id = TAKE_STRUCT(network->dhcp_relay_remote_id);
|
||||
}
|
||||
}
|
||||
|
||||
/* Copy [DHCPServer] ServerAddress= to [DHCPRelay] AgentAddress= if unspecified. */
|
||||
if (!in4_addr_is_set(&network->dhcp_relay_agent_address_in_addr))
|
||||
network->dhcp_relay_agent_address_in_addr = network->dhcp_server_address_in_addr;
|
||||
|
||||
/* Assume this interface acts as a downstream interface of the DHCP relay agent. Also,
|
||||
* configure a catch-all upstream socket. */
|
||||
network->dhcp_relay_interface_mode = DHCP_RELAY_INTERFACE_COMPAT;
|
||||
network->dhcp_server = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
assert(network->dhcp_server_address_prefixlen <= 32);
|
||||
|
||||
if (network->dhcp_server_address_prefixlen == 0) {
|
||||
@@ -160,9 +186,6 @@ static DHCPServerPersistLeases link_get_dhcp_server_persist_leases(Link *link) {
|
||||
assert(link->manager);
|
||||
assert(link->network);
|
||||
|
||||
if (in4_addr_is_set(&link->network->dhcp_server_relay_target))
|
||||
return DHCP_SERVER_PERSIST_LEASES_NO; /* On relay mode. Nothing saved in the persistent storage. */
|
||||
|
||||
if (link->network->dhcp_server_persist_leases >= 0)
|
||||
return link->network->dhcp_server_persist_leases;
|
||||
|
||||
@@ -571,7 +594,6 @@ static int dhcp4_server_configure(Link *link) {
|
||||
DHCPStaticLease *static_lease;
|
||||
Link *uplink = NULL;
|
||||
Address *address;
|
||||
bool bind_to_interface;
|
||||
int r;
|
||||
|
||||
assert(link);
|
||||
@@ -681,19 +703,6 @@ static int dhcp4_server_configure(Link *link) {
|
||||
return log_link_error_errno(link, r, "Failed to set router address for DHCP server: %m");
|
||||
}
|
||||
|
||||
r = sd_dhcp_server_set_relay_target(link->dhcp_server, &link->network->dhcp_server_relay_target);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Failed to set relay target for DHCP server: %m");
|
||||
|
||||
bind_to_interface = sd_dhcp_server_is_in_relay_mode(link->dhcp_server) ? false : link->network->dhcp_server_bind_to_interface;
|
||||
r = sd_dhcp_server_set_bind_to_interface(link->dhcp_server, bind_to_interface);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Failed to set interface binding for DHCP server: %m");
|
||||
|
||||
r = sd_dhcp_server_set_relay_agent_information(link->dhcp_server, link->network->dhcp_server_relay_agent_circuit_id, link->network->dhcp_server_relay_agent_remote_id);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Failed to set agent circuit/remote id for DHCP server: %m");
|
||||
|
||||
if (link->network->dhcp_server_emit_timezone) {
|
||||
_cleanup_free_ char *buffer = NULL;
|
||||
const char *tz = NULL;
|
||||
@@ -815,38 +824,6 @@ int link_request_dhcp_server(Link *link) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_dhcp_server_relay_agent_suboption(
|
||||
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) {
|
||||
|
||||
char **suboption_value = data;
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
|
||||
if (isempty(rvalue)) {
|
||||
*suboption_value = mfree(*suboption_value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char *p = startswith(rvalue, "string:");
|
||||
if (!p) {
|
||||
log_syntax(unit, LOG_WARNING, filename, line, 0,
|
||||
"Failed to parse %s=%s'. Invalid format, ignoring.", lvalue, rvalue);
|
||||
return 0;
|
||||
}
|
||||
return free_and_strdup(suboption_value, empty_to_null(p));
|
||||
}
|
||||
|
||||
int config_parse_dhcp_server_emit(
|
||||
const char *unit,
|
||||
const char *filename,
|
||||
|
||||
@@ -18,7 +18,6 @@ int link_request_dhcp_server(Link *link);
|
||||
int link_start_dhcp4_server(Link *link);
|
||||
void manager_toggle_dhcp4_server_state(Manager *manager, bool start);
|
||||
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_relay_agent_suboption);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_emit);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_address);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_server_ipv6_only_preferred);
|
||||
|
||||
@@ -855,8 +855,7 @@ int link_object_find(sd_bus *bus, const char *path, const char *interface, void
|
||||
if (r < 0)
|
||||
return 0;
|
||||
|
||||
if (streq(interface, "org.freedesktop.network1.DHCPServer") &&
|
||||
(!link->dhcp_server || sd_dhcp_server_is_in_relay_mode(link->dhcp_server)))
|
||||
if (streq(interface, "org.freedesktop.network1.DHCPServer") && !link->dhcp_server)
|
||||
return 0;
|
||||
|
||||
if (streq(interface, "org.freedesktop.network1.DHCPv4Client") && !link->dhcp_client)
|
||||
|
||||
@@ -243,6 +243,7 @@ static void link_free_engines(Link *link) {
|
||||
return;
|
||||
|
||||
link->dhcp_relay_interface = sd_dhcp_relay_interface_unref(link->dhcp_relay_interface);
|
||||
link->dhcp_relay_interface_compat = sd_dhcp_relay_interface_unref(link->dhcp_relay_interface_compat);
|
||||
link->dhcp_server = sd_dhcp_server_unref(link->dhcp_server);
|
||||
|
||||
link->dhcp_client = sd_dhcp_client_unref(link->dhcp_client);
|
||||
@@ -431,6 +432,10 @@ int link_stop_engines(Link *link, bool may_keep_dynamic) {
|
||||
if (r < 0)
|
||||
RET_GATHER(ret, log_link_warning_errno(link, r, "Could not stop DHCP relay agent: %m"));
|
||||
|
||||
r = sd_dhcp_relay_interface_stop(link->dhcp_relay_interface_compat);
|
||||
if (r < 0)
|
||||
RET_GATHER(ret, log_link_warning_errno(link, r, "Could not stop DHCP relay agent (compat): %m"));
|
||||
|
||||
r = sd_dhcp_server_stop(link->dhcp_server);
|
||||
if (r < 0)
|
||||
RET_GATHER(ret, log_link_warning_errno(link, r, "Could not stop DHCPv4 server: %m"));
|
||||
@@ -1168,6 +1173,7 @@ static int link_drop_dynamic_config(Link *link, Network *network) {
|
||||
RET_GATHER(r, link_drop_dhcp6_config(link, network));
|
||||
RET_GATHER(r, link_drop_dhcp_pd_config(link, network));
|
||||
link->dhcp_relay_interface = sd_dhcp_relay_interface_unref(link->dhcp_relay_interface);
|
||||
link->dhcp_relay_interface_compat = sd_dhcp_relay_interface_unref(link->dhcp_relay_interface_compat);
|
||||
link->dhcp_server = sd_dhcp_server_unref(link->dhcp_server);
|
||||
link->lldp_rx = sd_lldp_rx_unref(link->lldp_rx); /* TODO: keep the received neighbors. */
|
||||
link->lldp_tx = sd_lldp_tx_unref(link->lldp_tx);
|
||||
|
||||
@@ -144,6 +144,7 @@ typedef struct Link {
|
||||
bool bearer_configured:1;
|
||||
|
||||
sd_dhcp_relay_interface *dhcp_relay_interface;
|
||||
sd_dhcp_relay_interface *dhcp_relay_interface_compat;
|
||||
sd_dhcp_server *dhcp_server;
|
||||
|
||||
sd_ndisc *ndisc;
|
||||
|
||||
@@ -369,9 +369,9 @@ DHCPRelay.ExtraOption, config_parse_dhcp_option_tlv,
|
||||
DHCPRelay.InterfacePriority, config_parse_int, 0, offsetof(Network, dhcp_relay_interface_priority)
|
||||
DHCPServer.ServerAddress, config_parse_dhcp_server_address, 0, 0
|
||||
DHCPServer.UplinkInterface, config_parse_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)
|
||||
DHCPServer.RelayTarget, config_parse_in_addr_non_null, AF_INET, offsetof(Network, dhcp_relay_target_address) /* deprecated */
|
||||
DHCPServer.RelayAgentCircuitId, config_parse_dhcp_option, /* check_length= */ true, offsetof(Network, dhcp_relay_circuit_id) /* deprecated */
|
||||
DHCPServer.RelayAgentRemoteId, config_parse_dhcp_option, /* check_length= */ true, offsetof(Network, dhcp_relay_remote_id) /* deprecated */
|
||||
DHCPServer.MaxLeaseTimeSec, config_parse_sec, 0, offsetof(Network, dhcp_server_max_lease_time_usec)
|
||||
DHCPServer.DefaultLeaseTimeSec, config_parse_sec, 0, offsetof(Network, dhcp_server_default_lease_time_usec)
|
||||
DHCPServer.IPv6OnlyPreferredSec, config_parse_dhcp_server_ipv6_only_preferred, 0, offsetof(Network, dhcp_server_ipv6_only_preferred_usec)
|
||||
@@ -397,7 +397,7 @@ DHCPServer.PoolOffset, config_parse_uint32,
|
||||
DHCPServer.PoolSize, config_parse_uint32, 0, offsetof(Network, dhcp_server_pool_size)
|
||||
DHCPServer.SendOption, config_parse_dhcp_option_tlv, 0, offsetof(Network, dhcp_server_extra_options)
|
||||
DHCPServer.SendVendorOption, config_parse_dhcp_option_tlv, 0, offsetof(Network, dhcp_server_vendor_options)
|
||||
DHCPServer.BindToInterface, config_parse_bool, 0, offsetof(Network, dhcp_server_bind_to_interface)
|
||||
DHCPServer.BindToInterface, config_parse_warn_compat, DISABLED_LEGACY, 0
|
||||
DHCPServer.BootServerAddress, config_parse_in_addr_non_null, AF_INET, offsetof(Network, dhcp_server_boot_server_address)
|
||||
DHCPServer.BootServerName, config_parse_dns_name, 0, offsetof(Network, dhcp_server_boot_server_name)
|
||||
DHCPServer.BootFilename, config_parse_string, CONFIG_PARSE_STRING_SAFE_AND_ASCII, offsetof(Network, dhcp_server_boot_filename)
|
||||
|
||||
@@ -437,7 +437,6 @@ int network_load_one(Manager *manager, OrderedHashmap **networks, const char *fi
|
||||
.dhcp_relay_interface_mode = _DHCP_RELAY_INTERFACE_INVALID,
|
||||
.dhcp_relay_extra_options = TLV_INIT(TLV_DHCP4_SUBOPTION),
|
||||
|
||||
.dhcp_server_bind_to_interface = true,
|
||||
.dhcp_server_emit[SD_DHCP_LEASE_DNS].emit = true,
|
||||
.dhcp_server_emit[SD_DHCP_LEASE_NTP].emit = true,
|
||||
.dhcp_server_emit[SD_DHCP_LEASE_SIP].emit = true,
|
||||
@@ -773,13 +772,12 @@ static Network *network_free(Network *network) {
|
||||
set_free(network->dnssec_negative_trust_anchors);
|
||||
|
||||
/* DHCP relay agent */
|
||||
iovec_done(&network->dhcp_relay_remote_id);
|
||||
iovec_done(&network->dhcp_relay_circuit_id);
|
||||
iovec_done(&network->dhcp_relay_vss);
|
||||
tlv_done(&network->dhcp_relay_extra_options);
|
||||
|
||||
/* DHCP server */
|
||||
free(network->dhcp_server_relay_agent_circuit_id);
|
||||
free(network->dhcp_server_relay_agent_remote_id);
|
||||
free(network->dhcp_server_boot_server_name);
|
||||
free(network->dhcp_server_boot_filename);
|
||||
free(network->dhcp_server_timezone);
|
||||
|
||||
@@ -212,8 +212,10 @@ typedef struct Network {
|
||||
/* DHCP Relay Agent Support */
|
||||
DHCPRelayInterfaceMode dhcp_relay_interface_mode;
|
||||
Address *dhcp_relay_agent_address;
|
||||
struct in_addr dhcp_relay_target_address; /* for deprecated DHCPServer.RelayTarget= */
|
||||
struct in_addr dhcp_relay_agent_address_in_addr;
|
||||
struct in_addr dhcp_relay_gateway_address;
|
||||
struct iovec dhcp_relay_remote_id; /* for deprecated DHCPServer.RelayAgentRemoteId= */
|
||||
struct iovec dhcp_relay_circuit_id;
|
||||
struct iovec dhcp_relay_vss;
|
||||
TLV dhcp_relay_extra_options;
|
||||
@@ -221,15 +223,11 @@ typedef struct Network {
|
||||
|
||||
/* DHCP Server Support */
|
||||
bool dhcp_server;
|
||||
bool dhcp_server_bind_to_interface;
|
||||
unsigned char dhcp_server_address_prefixlen;
|
||||
struct in_addr dhcp_server_address_in_addr;
|
||||
const Address *dhcp_server_address;
|
||||
int dhcp_server_uplink_index;
|
||||
char *dhcp_server_uplink_name;
|
||||
struct in_addr dhcp_server_relay_target;
|
||||
char *dhcp_server_relay_agent_circuit_id;
|
||||
char *dhcp_server_relay_agent_remote_id;
|
||||
NetworkDHCPServerEmitAddress dhcp_server_emit[_SD_DHCP_LEASE_SERVER_TYPE_MAX];
|
||||
bool dhcp_server_emit_router;
|
||||
struct in_addr dhcp_server_router;
|
||||
|
||||
@@ -3,13 +3,12 @@
|
||||
Name=client-peer
|
||||
|
||||
[Network]
|
||||
Address=192.168.6.2/24
|
||||
Address=198.51.100.10/24
|
||||
DHCPServer=yes
|
||||
IPv4Forwarding=yes
|
||||
IPv6AcceptRA=no
|
||||
|
||||
[DHCPServer]
|
||||
RelayTarget=192.168.5.1
|
||||
RelayTarget=192.0.2.1
|
||||
BindToInterface=no
|
||||
RelayAgentCircuitId=string:sample_circuit_id
|
||||
RelayAgentRemoteId=string:sample_remote_id
|
||||
|
||||
@@ -4,5 +4,4 @@ Name=client
|
||||
|
||||
[Network]
|
||||
DHCP=yes
|
||||
IPv4Forwarding=yes
|
||||
IPv6AcceptRA=no
|
||||
|
||||
@@ -3,6 +3,5 @@
|
||||
Name=server-peer
|
||||
|
||||
[Network]
|
||||
Address=192.168.5.2/24
|
||||
IPv4Forwarding=yes
|
||||
Address=192.0.2.2/24
|
||||
IPv6AcceptRA=no
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
[Match]
|
||||
Name=server
|
||||
|
||||
[Network]
|
||||
Address=192.168.5.1/24
|
||||
IPv4Forwarding=yes
|
||||
DHCPServer=yes
|
||||
IPv6AcceptRA=no
|
||||
|
||||
[DHCPServer]
|
||||
BindToInterface=no
|
||||
PoolOffset=150
|
||||
PoolSize=1
|
||||
DNS=192.168.5.1
|
||||
NTP=192.168.5.1
|
||||
@@ -1,9 +0,0 @@
|
||||
# SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
[NetDev]
|
||||
Name=server
|
||||
Kind=veth
|
||||
MACAddress=12:34:56:78:9b:bc
|
||||
|
||||
[Peer]
|
||||
Name=server-peer
|
||||
MACAddress=12:34:56:78:9b:bd
|
||||
@@ -8364,11 +8364,22 @@ class NetworkdDHCPServerRelayAgentTests(unittest.TestCase, Utilities):
|
||||
tear_down_common()
|
||||
|
||||
def test_relay_agent(self):
|
||||
check_output('ip netns add ns-server')
|
||||
check_output('ip link add server type veth peer server-peer')
|
||||
check_output('ip link set server netns ns-server')
|
||||
check_output('ip netns exec ns-server ip link set server up')
|
||||
check_output('ip netns exec ns-server ip address add 192.0.2.1/24 dev server')
|
||||
|
||||
start_dnsmasq(
|
||||
namespace='ns-server',
|
||||
interface='server',
|
||||
ipv4_range='198.51.100.100,198.51.100.109',
|
||||
ipv4_router='198.51.100.10',
|
||||
)
|
||||
|
||||
copy_network_unit(
|
||||
'25-agent-veth-client.netdev',
|
||||
'25-agent-veth-server.netdev',
|
||||
'25-agent-client.network',
|
||||
'25-agent-server.network',
|
||||
'25-agent-client-peer.network',
|
||||
'25-agent-server-peer.network',
|
||||
)
|
||||
@@ -8378,7 +8389,7 @@ class NetworkdDHCPServerRelayAgentTests(unittest.TestCase, Utilities):
|
||||
|
||||
output = networkctl_status('client')
|
||||
print(output)
|
||||
self.assertRegex(output, r'Address: 192.168.5.150 \(DHCPv4 via 192.168.5.1\)')
|
||||
self.assertRegex(output, r'Address: 198\.51\.100\.10[0-9] \(DHCPv4 via 192\.0\.2\.1\)')
|
||||
|
||||
def test_relay_agent_on_bridge(self):
|
||||
copy_network_unit(
|
||||
@@ -8392,7 +8403,7 @@ class NetworkdDHCPServerRelayAgentTests(unittest.TestCase, Utilities):
|
||||
self.wait_online('bridge-relay:routable', 'client-peer:enslaved')
|
||||
|
||||
# For issue #30763.
|
||||
self.check_networkd_log('bridge-relay: DHCPv4 server: STARTED')
|
||||
self.check_networkd_log('bridge-relay: Relaying DHCPv4 messages')
|
||||
|
||||
def test_sd_dhcp_relay(self):
|
||||
check_output('ip netns add ns-relay')
|
||||
|
||||
Reference in New Issue
Block a user