diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 1c8808c0f..5b90e26d2 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c @@ -195,7 +195,11 @@ void FAST_FUNC read_leases(const char *file) uint32_t static_nip; if (expires <= 0) - continue; + /* We keep expired leases: add_lease() will add + * a lease with 0 seconds remaining. + * Fewer IP address changes this way for mass reboot scenario. + */ + expires = 0; /* Check if there is a different static lease for this IP or MAC */ static_nip = get_static_nip_by_mac(server_config.static_leases, lease.lease_mac); diff --git a/networking/udhcp/leases.c b/networking/udhcp/leases.c index 844bb60b1..411b74962 100644 --- a/networking/udhcp/leases.c +++ b/networking/udhcp/leases.c @@ -17,7 +17,9 @@ static struct dyn_lease *oldest_expired_lease(void) /* Unexpired leases have g_leases[i].expires >= current time * and therefore can't ever match */ for (i = 0; i < server_config.max_leases; i++) { - if (g_leases[i].expires < oldest_time) { + if (g_leases[i].expires == 0 /* empty entry */ + || g_leases[i].expires < oldest_time + ) { oldest_time = g_leases[i].expires; oldest_lease = &g_leases[i]; }