network/dhcp-server: use the pinned fd of persistent storge

This commit is contained in:
Yu Watanabe 2024-03-16 00:49:25 +09:00
parent e1254d0616
commit 7eafdbeb00

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