changeset 5424:28a650d93729 draft

DHCP: Mark the state as expired on lase lease extension Expired states do not claim any client IP to request from.
author Roy Marples <roy@marples.name>
date Thu, 20 Aug 2020 16:09:53 +0100
parents 66a1c1c34366
children 9edfc000a89b
files src/dhcp.c src/ipv4.h
diffstat 2 files changed, 6 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/dhcp.c	Sun Aug 16 19:21:48 2020 +0100
+++ b/src/dhcp.c	Thu Aug 20 16:09:53 2020 +0100
@@ -777,7 +777,7 @@
 	    (type == DHCP_REQUEST &&
 	    state->addr->mask.s_addr == lease->mask.s_addr &&
 	    (state->new == NULL || IS_DHCP(state->new)) &&
-	    !(state->added & STATE_FAKE))))
+	    !(state->added & (STATE_FAKE | STATE_EXPIRED)))))
 		bootp->ciaddr = state->addr->addr.s_addr;
 
 	bootp->op = BOOTREQUEST;
@@ -1745,7 +1745,7 @@
 		goto fail;
 	len = (size_t)r;
 
-	if (!(state->added & STATE_FAKE) &&
+	if (!(state->added & (STATE_FAKE | STATE_EXPIRED)) &&
 	    state->addr != NULL &&
 	    ipv4_iffindaddr(ifp, &state->lease.addr, NULL) != NULL)
 		from.s_addr = state->lease.addr.s_addr;
@@ -1915,7 +1915,10 @@
 	struct interface *ifp = arg;
 
 	if (ifp->options->options & DHCPCD_LASTLEASE_EXTEND) {
+		struct dhcp_state *state = D_STATE(ifp);
+
 		logwarnx("%s: DHCP lease expired, extending lease", ifp->name);
+		state->added |= STATE_EXPIRED;
 		return;
 	}
 
--- a/src/ipv4.h	Sun Aug 16 19:21:48 2020 +0100
+++ b/src/ipv4.h	Thu Aug 20 16:09:53 2020 +0100
@@ -129,6 +129,7 @@
 
 #define STATE_ADDED		0x01
 #define STATE_FAKE		0x02
+#define STATE_EXPIRED		0x04
 
 int ipv4_deladdr(struct ipv4_addr *, int);
 struct ipv4_addr *ipv4_addaddr(struct interface *,