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)
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");
}
}
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");