diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-04 12:57:14 +0100 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-03-04 12:57:14 +0100 |
commit | fa16ecc5202a8ba9e329e2f25c67106beb517d2f (patch) | |
tree | 3fc87ea2ffaac85e6bd7b5263a01fd7d84aa1b8a | |
parent | 6cebc7c79a1cfb36cb2ed714c8123356b6e9f3e8 (diff) |
allow clients to pick up leases they already have
-rw-r--r-- | src/lease.rs | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/lease.rs b/src/lease.rs index 5fa7547..779ec31 100644 --- a/src/lease.rs +++ b/src/lease.rs @@ -42,6 +42,11 @@ pub trait LeaseManager { self.taken_addresses().any(|addr| addr == address) } + fn is_unavailable(&self, address: Ipv4Addr, client_id: &[u8]) -> bool { + self.leases() + .any(|lease| lease.address == address && lease.client_id != client_id) + } + fn free_addresses(&self) -> Vec<Ipv4Addr> { let mut taken = self.taken_addresses(); @@ -141,9 +146,19 @@ impl LeaseManager for LeaseDummyManager { } fn request(&mut self, address: Ipv4Addr, client_id: &[u8]) -> bool { - if self.is_taken(address) { + if self.is_unavailable(address, client_id) { false } else { + let lease = self + .leases + .iter() + .enumerate() + .find(|(_, v)| v.client_id == client_id); + + if let Some(lease) = lease { + self.leases.remove(lease.0); + } + self.leases .push(Lease::new(address, self.lease_time(), client_id.to_vec())); |