aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-03-04 12:57:14 +0100
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-03-04 12:57:14 +0100
commitfa16ecc5202a8ba9e329e2f25c67106beb517d2f (patch)
tree3fc87ea2ffaac85e6bd7b5263a01fd7d84aa1b8a
parent6cebc7c79a1cfb36cb2ed714c8123356b6e9f3e8 (diff)
allow clients to pick up leases they already have
-rw-r--r--src/lease.rs17
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()));