]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: dhcp-server: introduce Router= setting to specify router address
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 2 Nov 2021 03:58:50 +0000 (12:58 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 2 Nov 2021 18:15:00 +0000 (03:15 +0900)
Closes #21202.

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

index f7c4e3e49e81a0f156b69912621d0aa0fd1fdb7c..49814a05eb84e9961b9ee8b4c575bab62d691b45 100644 (file)
@@ -2482,12 +2482,16 @@ Token=prefixstable:2002:da8:1::</programlisting></para>
 
       <varlistentry>
         <term><varname>EmitRouter=</varname></term>
-
-        <listitem><para>Similar to the <varname>EmitDNS=</varname>
-        setting described above, this setting configures whether the
-        DHCP lease should contain the router option. The same syntax,
-        propagation semantics and defaults apply as for
-        <varname>EmitDNS=</varname>.</para></listitem>
+        <term><varname>Router=</varname></term>
+
+        <listitem><para>The <varname>EmitRouter=</varname> setting takes a boolean value, and configures
+        whether the DHCP lease should contain the router option. The <varname>Router=</varname> setting
+        takes an IPv4 address, and configures the router address to be emitted. When the
+        <varname>Router=</varname> setting is not specified, then the server address will be used for
+        the router option. When the <varname>EmitRouter=</varname> setting is disabled, the
+        <varname>Router=</varname> setting will be ignored. The <varname>EmitRouter=</varname> setting
+        defaults to true, and the <varname>Router=</varname> setting defaults to unset.
+        </para></listitem>
       </varlistentry>
 
       <varlistentry>
index 3b87a4c0668f1a5596cff22e7f6f217c901ef6d7..13d8cd77b44ebd005c1d41859e0d31bb90ef5fcf 100644 (file)
@@ -68,6 +68,7 @@ struct sd_dhcp_server {
         OrderedSet *vendor_options;
 
         bool emit_router;
+        struct in_addr router_address;
 
         Hashmap *bound_leases_by_client_id;
         Hashmap *bound_leases_by_address;
index 604c34fe155b9369fc2ba463473b41b68d5aa44f..261818b46ac8905153ca880c8b3fe772767e9e9c 100644 (file)
@@ -533,7 +533,10 @@ static int server_send_offer_or_ack(
 
         if (server->emit_router) {
                 r = dhcp_option_append(&packet->dhcp, req->max_optlen, &offset, 0,
-                                       SD_DHCP_OPTION_ROUTER, 4, &server->address);
+                                       SD_DHCP_OPTION_ROUTER, 4,
+                                       in4_addr_is_set(&server->router_address) ?
+                                       &server->router_address.s_addr :
+                                       &server->address);
                 if (r < 0)
                         return r;
         }
@@ -1418,15 +1421,18 @@ int sd_dhcp_server_set_lpr(sd_dhcp_server *server, const struct in_addr lpr[], s
         return sd_dhcp_server_set_servers(server, SD_DHCP_LEASE_LPR, lpr, n);
 }
 
-int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled) {
+int sd_dhcp_server_set_router(sd_dhcp_server *server, const struct in_addr *router) {
         assert_return(server, -EINVAL);
 
-        if (enabled == server->emit_router)
-                return 0;
+        /* router is NULL: router option will not be appended.
+         * router is null address (0.0.0.0): the server address will be used as the router address.
+         * otherwise: the specified address will be used as the router address.*/
 
-        server->emit_router = enabled;
+        server->emit_router = router;
+        if (router)
+                server->router_address = *router;
 
-        return 1;
+        return 0;
 }
 
 int sd_dhcp_server_add_option(sd_dhcp_server *server, sd_dhcp_option *v) {
index 45ef1b4903dd3854182bcf70ea387b471ced56dc..9fa0c4233c5363f54e61efb50cf63d3cd11664b6 100644 (file)
@@ -448,9 +448,11 @@ static int dhcp4_server_configure(Link *link) {
                                                dhcp_lease_server_type_to_string(type));
         }
 
-        r = sd_dhcp_server_set_emit_router(link->dhcp_server, link->network->dhcp_server_emit_router);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Failed to set router emission for DHCP server: %m");
+        if (link->network->dhcp_server_emit_router) {
+                r = sd_dhcp_server_set_router(link->dhcp_server, &link->network->dhcp_server_router);
+                if (r < 0)
+                        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)
index 595dd36121a4d7550687f2c956d56a44aa221fb6..1f0a625183bb2b68d719f368f3c35a0279d1490e 100644 (file)
@@ -290,6 +290,7 @@ DHCPServer.SMTP,                             config_parse_dhcp_server_emit,
 DHCPServer.EmitLPR,                          config_parse_bool,                                        0,                             offsetof(Network, dhcp_server_emit[SD_DHCP_LEASE_LPR].emit)
 DHCPServer.LPR,                              config_parse_dhcp_server_emit,                            0,                             offsetof(Network, dhcp_server_emit[SD_DHCP_LEASE_LPR])
 DHCPServer.EmitRouter,                       config_parse_bool,                                        0,                             offsetof(Network, dhcp_server_emit_router)
+DHCPServer.Router,                           config_parse_in_addr_non_null,                            AF_INET,                       offsetof(Network, dhcp_server_router)
 DHCPServer.EmitTimezone,                     config_parse_bool,                                        0,                             offsetof(Network, dhcp_server_emit_timezone)
 DHCPServer.Timezone,                         config_parse_timezone,                                    0,                             offsetof(Network, dhcp_server_timezone)
 DHCPServer.PoolOffset,                       config_parse_uint32,                                      0,                             offsetof(Network, dhcp_server_pool_offset)
index 91553265da2d6b051546848724fe9e8367cf1aa9..f5258c9fcd71b5f8f3213a90f69ad124869a22df 100644 (file)
@@ -202,6 +202,7 @@ struct Network {
         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;
         bool dhcp_server_emit_timezone;
         char *dhcp_server_timezone;
         usec_t dhcp_server_default_lease_time_usec, dhcp_server_max_lease_time_usec;
index 149a14fdc6a8061cd3e3b6b3794f8cbbca7cb144..59ef27e1dcdb3a04247aefbddd3de41fa7f021f1 100644 (file)
@@ -60,7 +60,7 @@ int sd_dhcp_server_configure_pool(sd_dhcp_server *server, const struct in_addr *
 
 int sd_dhcp_server_set_bind_to_interface(sd_dhcp_server *server, int enabled);
 int sd_dhcp_server_set_timezone(sd_dhcp_server *server, const char *timezone);
-int sd_dhcp_server_set_emit_router(sd_dhcp_server *server, int enabled);
+int sd_dhcp_server_set_router(sd_dhcp_server *server, const struct in_addr *address);
 
 int sd_dhcp_server_set_servers(
                 sd_dhcp_server *server,
index 985c2fc0d3fc3e6032d7e79d622325f33e10be5b..2ff20e0f083789e6bdc4b186ed760062f6d01534 100644 (file)
@@ -379,6 +379,7 @@ SMTP=
 EmitLPR=
 LPR=
 EmitRouter=
+Router=
 MaxLeaseTimeSec=
 DefaultLeaseTimeSec=
 EmitTimezone=