]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: add NextServer= and Filename= setting to [DHCPServer] section 22615/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 24 Feb 2022 17:43:40 +0000 (02:43 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 24 Feb 2022 17:45:47 +0000 (02:45 +0900)
Closes #4403.

man/systemd.network.xml
src/network/networkd-dhcp-server.c
src/network/networkd-network-gperf.gperf
src/network/networkd-network.c
src/network/networkd-network.h
test/fuzz/fuzz-network-parser/directives.network

index 5939e38a00a1cd04c71abb692ca21b9e6a5bdbd2..3f5a22e801b4d21bcf8773dd3e239896de46a186 100644 (file)
@@ -2626,6 +2626,23 @@ Token=prefixstable:2002:da8:1::</programlisting></para>
         <filename>/etc/localtime</filename> symlink.</para></listitem>
       </varlistentry>
 
+      <varlistentry>
+        <term><varname>NextServer=</varname></term>
+
+        <listitem>
+          <para>Takes an IPv4 address. Configures the next server used by e.g. PXE boot systems.
+          Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
+
+      <varlistentry>
+        <term><varname>Filename=</varname></term>
+
+        <listitem>
+          <para>Takes a path or url to a file loaded by e.g. a PXE boot loader. Defaults to unset.</para>
+        </listitem>
+      </varlistentry>
+
       <varlistentry>
         <term><varname>SendOption=</varname></term>
         <listitem>
index b28d13ba65abab8c2684f6529ca885030eea394c..c4eaac3dee37e9efab819cdd53866d023b5776d5 100644 (file)
@@ -416,6 +416,14 @@ static int dhcp4_server_configure(Link *link) {
                         return log_link_error_errno(link, r, "Failed to set default lease time for DHCPv4 server instance: %m");
         }
 
+        r = sd_dhcp_server_set_next_server(link->dhcp_server, &link->network->dhcp_server_next_server);
+        if (r < 0)
+                return log_link_warning_errno(link, r, "Failed to set next server for DHCPv4 server instance: %m");
+
+        r = sd_dhcp_server_set_filename(link->dhcp_server, link->network->dhcp_server_filename);
+        if (r < 0)
+                return log_link_warning_errno(link, r, "Failed to set filename for DHCPv4 server instance: %m");
+
         for (sd_dhcp_lease_server_type_t type = 0; type < _SD_DHCP_LEASE_SERVER_TYPE_MAX; type ++) {
 
                 if (!link->network->dhcp_server_emit[type].emit)
index edce61996adc3357546084173b7c54672b4130a2..5d83a25c7015a2e59da70898883062898262a313 100644 (file)
@@ -305,6 +305,8 @@ DHCPServer.PoolSize,                         config_parse_uint32,
 DHCPServer.SendVendorOption,                 config_parse_dhcp_send_option,                            0,                             offsetof(Network, dhcp_server_send_vendor_options)
 DHCPServer.SendOption,                       config_parse_dhcp_send_option,                            0,                             offsetof(Network, dhcp_server_send_options)
 DHCPServer.BindToInterface,                  config_parse_bool,                                        0,                             offsetof(Network, dhcp_server_bind_to_interface)
+DHCPServer.NextServer,                       config_parse_in_addr_non_null,                            AF_INET,                       offsetof(Network, dhcp_server_next_server)
+DHCPServer.Filename,                         config_parse_string,                                      0,                             offsetof(Network, dhcp_server_filename)
 DHCPServerStaticLease.Address,               config_parse_dhcp_static_lease_address,                   0,                             0
 DHCPServerStaticLease.MACAddress,            config_parse_dhcp_static_lease_hwaddr,                    0,                             0
 Bridge.Cost,                                 config_parse_uint32,                                      0,                             offsetof(Network, cost)
index a2c682543901403a4925bec034d2734af79168dd..eeededcb6c81add2814729839953715b649e7df4 100644 (file)
@@ -700,6 +700,7 @@ static Network *network_free(Network *network) {
 
         free(network->dhcp_server_relay_agent_circuit_id);
         free(network->dhcp_server_relay_agent_remote_id);
+        free(network->dhcp_server_filename);
 
         free(network->description);
         free(network->dhcp_vendor_class_identifier);
index 47248f790b837211ff84be8e1d21a211ad5f9294..299d84ed8b590aec7430df413c7dcc2891ed497b 100644 (file)
@@ -200,6 +200,8 @@ struct Network {
         uint32_t dhcp_server_pool_size;
         OrderedHashmap *dhcp_server_send_options;
         OrderedHashmap *dhcp_server_send_vendor_options;
+        struct in_addr dhcp_server_next_server;
+        char *dhcp_server_filename;
 
         /* link local addressing support */
         AddressFamily link_local;
index ef302dca7b74b05e6eeac93ad0965d79ab057958..c682ac4ac1a9fe3ce8dfab8f2d50950e09b31c9f 100644 (file)
@@ -409,6 +409,8 @@ RelayAgentCircuitId=
 RelayAgentRemoteId=
 ServerAddress=
 UplinkInterface=
+NextServer=
+Filename=
 [DHCPServerStaticLease]
 MACAddress=
 Address=