#include "networkd-link.h"
#include "networkd-manager.h"
#include "networkd-network.h"
+#include "networkd-ntp.h"
#include "networkd-queue.h"
#include "networkd-route-util.h"
#include "parse-util.h"
return 0;
}
+static bool dhcp_server_persist_leases(Link *link) {
+ assert(link);
+ assert(link->manager);
+ assert(link->network);
+
+ if (in4_addr_is_set(&link->network->dhcp_server_relay_target))
+ return false; /* On relay mode. Nothing saved in the persistent storage. */
+
+ if (link->network->dhcp_server_persist_leases >= 0)
+ return link->network->dhcp_server_persist_leases;
+
+ return link->manager->dhcp_server_persist_leases;
+}
+
int address_acquire_from_dhcp_server_leases_file(Link *link, const Address *address, union in_addr_union *ret) {
struct in_addr a;
uint8_t prefixlen;
if (!link_dhcp4_server_enabled(link))
return -ENOENT;
+ if (!dhcp_server_persist_leases(link))
+ return -ENOENT;
+
if (link->manager->persistent_storage_fd < 0)
return -EBUSY; /* The persistent storage is not ready, try later again. */
lease_file,
&a,
&prefixlen);
- if (r < 0)
+ if (r == -ENOENT)
return r;
+ if (r < 0)
+ return log_warning_errno(r, "Failed to load lease file %s: %s",
+ lease_file,
+ r == -ENXIO ? "expected JSON content not found" :
+ r == -EINVAL ? "invalid JSON" :
+ STRERROR(r));
if (prefixlen != address->prefixlen)
return -ENOENT;
/* 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)) {
+ if (dhcp_server_persist_leases(link)) {
if (link->manager->persistent_storage_fd < 0)
return 0; /* persistent storage is not ready. */
HASHMAP_FOREACH(link, manager->links_by_index) {
if (!link->dhcp_server)
continue;
- if (sd_dhcp_server_is_in_relay_mode(link->dhcp_server))
+ if (!dhcp_server_persist_leases(link))
continue;
/* Even if 'start' is true, first we need to stop the server. Otherwise, we cannot (re)set
addresses[n_addresses++] = ia;
}
- use_dhcp_lease_data = link->network->dhcp_use_dns;
+ use_dhcp_lease_data = link_get_use_dns(link, NETWORK_CONFIG_SOURCE_DHCP4);
break;
case SD_DHCP_LEASE_NTP: {
addresses[n_addresses++] = ia.in;
}
- use_dhcp_lease_data = link->network->dhcp_use_ntp;
+ use_dhcp_lease_data = link_get_use_ntp(link, NETWORK_CONFIG_SOURCE_DHCP4);
break;
}