diff --git a/components/lwip/apps/dhcpserver/dhcpserver.c b/components/lwip/apps/dhcpserver/dhcpserver.c index 2b0c1328bc..4b1237cc7b 100644 --- a/components/lwip/apps/dhcpserver/dhcpserver.c +++ b/components/lwip/apps/dhcpserver/dhcpserver.c @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD + * SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: Apache-2.0 */ @@ -139,6 +139,7 @@ struct dhcps_t { void* dhcps_cb_arg; struct udp_pcb *dhcps_pcb; dhcps_handle_state state; + bool has_declined_ip; }; @@ -166,6 +167,7 @@ dhcps_t *dhcps_new(void) dhcps->dhcps_dns = 0x00; dhcps->dhcps_pcb = NULL; dhcps->state = DHCPS_HANDLE_CREATED; + dhcps->has_declined_ip = false; return dhcps; } @@ -939,9 +941,9 @@ static u8_t parse_options(dhcps_t *dhcps, u8_t *optptr, s16_t len) break; case DHCPDECLINE://4 - s.state = DHCPS_STATE_IDLE; + s.state = DHCPS_STATE_DECLINE; #if DHCPS_DEBUG - DHCPS_LOG("dhcps: DHCPD_STATE_IDLE\n"); + DHCPS_LOG("dhcps: DHCPS_STATE_DECLINE\n"); #endif break; @@ -987,6 +989,10 @@ static s16_t parse_msg(dhcps_t *dhcps, struct dhcps_msg *m, u16_t len) dhcps->renew = false; if (dhcps->plist != NULL) { + if (dhcps->has_declined_ip) { + dhcps->has_declined_ip = false; + } + for (pback_node = dhcps->plist; pback_node != NULL; pback_node = pback_node->pnext) { pdhcps_pool = pback_node->pnode; @@ -1017,7 +1023,11 @@ static s16_t parse_msg(dhcps_t *dhcps, struct dhcps_msg *m, u16_t len) } } } else { - dhcps->client_address.addr = dhcps->dhcps_poll.start_ip.addr; + if (dhcps->has_declined_ip) { + dhcps->has_declined_ip = false; + } else { + dhcps->client_address.addr = dhcps->dhcps_poll.start_ip.addr; + } } if (dhcps->client_address_plus.addr > dhcps->dhcps_poll.end_ip.addr) { @@ -1068,7 +1078,7 @@ POOL_CHECK: s16_t ret = parse_options(dhcps, &m->options[4], len);; - if (ret == DHCPS_STATE_RELEASE || ret == DHCPS_STATE_NAK) { + if (ret == DHCPS_STATE_RELEASE || ret == DHCPS_STATE_NAK || ret == DHCPS_STATE_DECLINE) { if (pnode != NULL) { node_remove_from_list(&dhcps->plist, pnode); free(pnode); @@ -1080,6 +1090,9 @@ POOL_CHECK: pdhcps_pool = NULL; } + if (ret == DHCPS_STATE_DECLINE) { + dhcps->has_declined_ip = true; + } memset(&dhcps->client_address, 0x0, sizeof(dhcps->client_address)); }