]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: drop use of legacy DHCP relay agent in sd-dhcp-server
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 3 May 2026 23:29:51 +0000 (08:29 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 21 May 2026 07:55:59 +0000 (16:55 +0900)
Then, this deprecates
- BindToInterface=
- RelayTarget=
- RelayAgentCircuitId=
- RelayAgentRemoteId=
settings in [DHCPServer] section.
These are gracefully translated as new settings.

18 files changed:
man/systemd.network.xml
src/network/networkd-dhcp-relay.c
src/network/networkd-dhcp-relay.h
src/network/networkd-dhcp-server-bus.c
src/network/networkd-dhcp-server.c
src/network/networkd-dhcp-server.h
src/network/networkd-link-bus.c
src/network/networkd-link.c
src/network/networkd-link.h
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
test/test-network/conf/25-agent-client-peer.network
test/test-network/conf/25-agent-client.network
test/test-network/conf/25-agent-server-peer.network
test/test-network/conf/25-agent-server.network [deleted file]
test/test-network/conf/25-agent-veth-server.netdev [deleted file]
test/test-network/systemd-networkd-tests.py

index fcb700bff03aa88eac7aadca6a66bc9cdf9127a4..dc97e17838aabb123daee34f6fa72f5f65c1dfda 100644 (file)
 
           <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>
index 5e793a0a124d3bdf2e538bdc2bae4057354e3b42..7811d9d58575745020c44886c223c24c08accde3 100644 (file)
@@ -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;
 }
index 7d56740edeabb579d2731f262268ccabfb05dec6..2a676931bd4a74d7f97365daf95a4237a2c24bcf 100644 (file)
@@ -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;
index e5ee6d3f6d5c36668713be4cb093aa1509af0f11..58e0a26f22fc11420bc83ee14c23326a5ae530d8 100644 (file)
@@ -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);
 }
 
index 9903c6b9d323309bac89fe19751250a034ffe9f9..2ee5a70abc513539acc5107d276b312a2e31bb08 100644 (file)
@@ -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,
index e46ad3a8579af08a9fc6431696fa833044fa87c9..f60ca2d3971ae59c5a344791b5e8b16b975c4624 100644 (file)
@@ -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);
index a375d0c18b235ca64373bc67362dc08a896ca950..53ac080a4724706df3877d29c91810361422bbe0 100644 (file)
@@ -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)
index 969818e9f7622d181006ed68bce82c4e7644b829..6d15e8deb4964b5fb607d7dd348b76a2d081e915 100644 (file)
@@ -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);
index 4c3e53b93eabc7b2c26924d20bfb55733ef53375..5a3d1d944744e8fa5c0e0faf45843355e815cbb5 100644 (file)
@@ -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;
index 4b54c6d88de6f06ea90a7eedc654e599b12a15d2..81b9784b49a4cb16970d9844181f77e1a7717e2b 100644 (file)
@@ -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)
index b1569866d10dadb16708f58a04f81f6afbcf7ef6..d63eeaa47882e3de9e8f5f3f24e2d836eb0378d7 100644 (file)
@@ -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);
index d9e516ff4ecaf171ea514cdaeb0875932eaf56ef..893b3022bb4b13261eddcdcc5c2ee3d7ff7b415f 100644 (file)
@@ -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;
index 4d7d758d2977820ca2c38253b8cc303a74f60d91..eaa3dfa57290a86b03f5647e84609015c6e85efe 100644 (file)
@@ -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
index 219d40a9b7ca3f205360f787bf1a509a43694dfb..731f8fe5b6230878e93a5732dae069902338af6a 100644 (file)
@@ -4,5 +4,4 @@ Name=client
 
 [Network]
 DHCP=yes
-IPv4Forwarding=yes
 IPv6AcceptRA=no
index 5e005c79ecd09ffcec9f3bf1bf6e1f6be8fc88a6..ef1e80fcadb02ae34878d460c1affea982502745 100644 (file)
@@ -3,6 +3,5 @@
 Name=server-peer
 
 [Network]
-Address=192.168.5.2/24
-IPv4Forwarding=yes
+Address=192.0.2.2/24
 IPv6AcceptRA=no
diff --git a/test/test-network/conf/25-agent-server.network b/test/test-network/conf/25-agent-server.network
deleted file mode 100644 (file)
index 0108039..0000000
+++ /dev/null
@@ -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
diff --git a/test/test-network/conf/25-agent-veth-server.netdev b/test/test-network/conf/25-agent-veth-server.netdev
deleted file mode 100644 (file)
index 1427024..0000000
+++ /dev/null
@@ -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
index 28c418460c079b2194cc719cba7a4f2428f9ae21..31496286472cb575f8b5e5f64d165ad013a6f486 100755 (executable)
@@ -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')