dhcpv4: Keep DHCPv4 assignment lifetime value in sync with assigned leasetime
authorHans Dedecker <dedeckeh@gmail.com>
Thu, 17 Nov 2016 15:11:57 +0000 (16:11 +0100)
committerJohn Crispin <john@phrozen.org>
Mon, 21 Nov 2016 10:35:42 +0000 (11:35 +0100)
Keep the valid_until assignment parameter in sync with the
leasetime assigned to the DHCP client when handling DHCP
request message.
This guarantees the contents of the ubus dhcp ipv4leases valid
parameter is in sync with the client leasetime

Signed-off-by: Hans Dedecker <dedeckeh@gmail.com>
src/dhcpv4.c

index 84690384db0fef14975d91f91b71fff12f72c908..618475ff341655afce591e4660dd1e68f80f04d2 100644 (file)
@@ -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;