summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/dhcpv4.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/dhcpv4.c b/src/dhcpv4.c
index 8469038..618475f 100644
--- a/src/dhcpv4.c
+++ b/src/dhcpv4.c
@@ -618,6 +618,8 @@ static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
}
memcpy(a->hwaddr, mac, sizeof(a->hwaddr));
memcpy(a->hostname, hostname, hostlen);
+ // Don't consider new assignment as infinite
+ a->valid_until = now;
assigned = dhcpv4_assign(iface, a, raddr);
}
@@ -642,10 +644,11 @@ static struct dhcpv4_assignment* dhcpv4_lease(struct interface *iface,
leasetime = iface->dhcpv4_leasetime;
}
- // Was only a discover; mark binding for removal
- if (assigned && a->valid_until < now) {
- a->valid_until = ((msg == DHCPV4_MSG_DISCOVER) ? now : ((leasetime == UINT32_MAX) ?
- 0 : (time_t)(now + leasetime)));
+ if (assigned) {
+ if (!INFINITE_VALID(a->valid_until))
+ // Was only a discover; mark binding for removal
+ a->valid_until = ((msg == DHCPV4_MSG_DISCOVER) ? now : ((leasetime == UINT32_MAX) ?
+ 0 : (time_t)(now + leasetime)));
} else if (!assigned && a) { // Cleanup failed assignment
free(a);
a = NULL;