From 7eafdbeb00fe078fc2e8cbe2ae63f53038e8ac73 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 16 Mar 2024 00:49:25 +0900 Subject: [PATCH] network/dhcp-server: use the pinned fd of persistent storge --- src/network/networkd-dhcp-server.c | 46 ++++++++++++++++++------------ 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/src/network/networkd-dhcp-server.c b/src/network/networkd-dhcp-server.c index b0887cc95e3..a1869a85599 100644 --- a/src/network/networkd-dhcp-server.c +++ b/src/network/networkd-dhcp-server.c @@ -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"); -- 2.47.3