]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
DHCP: Mark the state as expired on lase lease extension
authorRoy Marples <roy@marples.name>
Thu, 20 Aug 2020 15:09:53 +0000 (16:09 +0100)
committerRoy Marples <roy@marples.name>
Thu, 20 Aug 2020 15:09:53 +0000 (16:09 +0100)
Expired states do not claim any client IP to request from.

src/dhcp.c
src/ipv4.h

index b309b01c4ce9c124891fbca3ba983434493093fa..66e1379c2be7c8122a608f5e9524a47b5759c222 100644 (file)
@@ -777,7 +777,7 @@ make_message(struct bootp **bootpm, const struct interface *ifp, uint8_t type)
            (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 @@ send_message(struct interface *ifp, uint8_t type,
                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 @@ dhcp_expire(void *arg)
        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;
        }
 
index 3b933a7113b0dc45b42811fd947d10ce9e16074a..bb3d5b2c7a7448c742a3cee7c3f516cd27dfa3a0 100644 (file)
@@ -129,6 +129,7 @@ bool inet_getroutes(struct dhcpcd_ctx *, rb_tree_t *);
 
 #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 *,