# HG changeset patch # User Roy Marples # Date 1598770981 -3600 # Node ID edcbeacf2225a2348898ed1ba867850cc480909e # Parent 9edfc000a89b677781d679b381d614eeb0c9cf8d DHCP: Request offered IP when using lastlease Also, set expired state on using last lease rather than last lease extension. diff -r 9edfc000a89b -r edcbeacf2225 src/dhcp.c --- a/src/dhcp.c Thu Aug 20 16:28:47 2020 +0100 +++ b/src/dhcp.c Sun Aug 30 08:03:01 2020 +0100 @@ -836,7 +836,7 @@ if (type == DHCP_DECLINE || (type == DHCP_REQUEST && (state->addr == NULL || - state->added & STATE_FAKE || + state->added & (STATE_FAKE | STATE_EXPIRED) || lease->addr.s_addr != state->addr->addr.s_addr))) { putip = true; @@ -2367,19 +2367,6 @@ eloop_event_add(ctx->eloop, state->udp_rfd, dhcp_handleifudp, ifp); } -static void -dhcp_lastlease(void *arg) -{ - struct interface *ifp = arg; - struct dhcp_state *state = D_STATE(ifp); - - loginfox("%s: timed out contacting a DHCP server, using last lease", - ifp->name); - dhcp_bind(ifp); - state->interval = 0; - dhcp_discover(ifp); -} - static size_t dhcp_message_new(struct bootp **bootp, const struct in_addr *addr, const struct in_addr *mask) @@ -2479,6 +2466,26 @@ #endif static void +dhcp_lastlease(void *arg) +{ + struct interface *ifp = arg; + struct dhcp_state *state = D_STATE(ifp); + + loginfox("%s: timed out contacting a DHCP server, using last lease", + ifp->name); +#if defined(ARP) || defined(KERNEL_RFC5227) + dhcp_arp_bind(ifp); +#else + dhcp_bind(ifp); +#endif + /* Set expired here because dhcp_bind() -> ipv4_addaddr() will reset + * state */ + state->added |= STATE_EXPIRED; + state->interval = 0; + dhcp_discover(ifp); +} + +static void dhcp_static(struct interface *ifp) { struct if_options *ifo;