(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;
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;
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;
}
#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 *,