]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/dhcp-server: use the pinned fd of persistent storge 31811/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 15 Mar 2024 15:49:25 +0000 (00:49 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 15 Mar 2024 16:12:05 +0000 (01:12 +0900)
src/network/networkd-dhcp-server.c

index b0887cc95e3b38205fc450e0b97a90481f454ced..a1869a855998b2c5666c4626a7eba1f73eb3e0df 100644 (file)
@@ -156,12 +156,25 @@ int link_start_dhcp4_server(Link *link) {
         if (!link_has_carrier(link))
                 return 0;
 
+        if (sd_dhcp_server_is_running(link->dhcp_server))
+                return 0; /* already started. */
+
         /* TODO: Maybe, also check the system time is synced. If the system does not have RTC battery, then
          * the realtime clock in not usable in the early boot stage, and all saved leases may be wrongly
          * handled as expired and dropped. */
-        if (!sd_dhcp_server_is_in_relay_mode(link->dhcp_server) &&
-            link->manager->persistent_storage_fd < 0)
-                return 0;
+        if (!sd_dhcp_server_is_in_relay_mode(link->dhcp_server)) {
+
+                if (link->manager->persistent_storage_fd < 0)
+                        return 0; /* persistent storage is not ready. */
+
+                _cleanup_free_ char *lease_file = path_join("dhcp-server-lease", link->ifname);
+                if (!lease_file)
+                        return -ENOMEM;
+
+                r = sd_dhcp_server_set_lease_file(link->dhcp_server, link->manager->persistent_storage_fd, lease_file);
+                if (r < 0)
+                        return r;
+        }
 
         r = sd_dhcp_server_start(link->dhcp_server);
         if (r < 0)
@@ -183,13 +196,18 @@ void manager_toggle_dhcp4_server_state(Manager *manager, bool start) {
                 if (sd_dhcp_server_is_in_relay_mode(link->dhcp_server))
                         continue;
 
-                if (start)
-                        r = link_start_dhcp4_server(link);
-                else
-                        r = sd_dhcp_server_stop(link->dhcp_server);
+                /* Even if 'start' is true, first we need to stop the server. Otherwise, we cannot (re)set
+                 * the lease file in link_start_dhcp4_server(). */
+                r = sd_dhcp_server_stop(link->dhcp_server);
                 if (r < 0)
-                        log_link_debug_errno(link, r, "Failed to %s DHCP server, ignoring: %m",
-                                             start ? "start" : "stop");
+                        log_link_debug_errno(link, r, "Failed to stop DHCP server, ignoring: %m");
+
+                if (!start)
+                        continue;
+
+                r = link_start_dhcp4_server(link);
+                if (r < 0)
+                        log_link_debug_errno(link, r, "Failed to start DHCP server, ignoring: %m");
         }
 }
 
@@ -572,16 +590,6 @@ static int dhcp4_server_configure(Link *link) {
                         return log_link_error_errno(link, r, "Failed to set DHCPv4 static lease for DHCP server: %m");
         }
 
-        if (!sd_dhcp_server_is_in_relay_mode(link->dhcp_server)) {
-                _cleanup_free_ char *lease_file = path_join("/var/lib/systemd/network/dhcp-server-lease/", link->ifname);
-                if (!lease_file)
-                        return log_oom();
-
-                r = sd_dhcp_server_set_lease_file(link->dhcp_server, AT_FDCWD, lease_file);
-                if (r < 0)
-                        log_link_warning_errno(link, r, "Failed to load DHCPv4 server leases, ignoring: %m");
-        }
-
         r = link_start_dhcp4_server(link);
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not start DHCPv4 server instance: %m");