fix(dhcp): fix dhcp server recv decline issue

This commit is contained in:
wangtao@espressif.com
2025-03-04 11:23:17 +08:00
parent 517e489c75
commit 8e11fdf1fd

View File

@@ -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 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -139,6 +139,7 @@ struct dhcps_t {
void* dhcps_cb_arg; void* dhcps_cb_arg;
struct udp_pcb *dhcps_pcb; struct udp_pcb *dhcps_pcb;
dhcps_handle_state state; dhcps_handle_state state;
bool has_declined_ip;
}; };
@@ -166,6 +167,7 @@ dhcps_t *dhcps_new(void)
dhcps->dhcps_dns = 0x00; dhcps->dhcps_dns = 0x00;
dhcps->dhcps_pcb = NULL; dhcps->dhcps_pcb = NULL;
dhcps->state = DHCPS_HANDLE_CREATED; dhcps->state = DHCPS_HANDLE_CREATED;
dhcps->has_declined_ip = false;
return dhcps; return dhcps;
} }
@@ -939,9 +941,9 @@ static u8_t parse_options(dhcps_t *dhcps, u8_t *optptr, s16_t len)
break; break;
case DHCPDECLINE://4 case DHCPDECLINE://4
s.state = DHCPS_STATE_IDLE; s.state = DHCPS_STATE_DECLINE;
#if DHCPS_DEBUG #if DHCPS_DEBUG
DHCPS_LOG("dhcps: DHCPD_STATE_IDLE\n"); DHCPS_LOG("dhcps: DHCPS_STATE_DECLINE\n");
#endif #endif
break; break;
@@ -987,6 +989,10 @@ static s16_t parse_msg(dhcps_t *dhcps, struct dhcps_msg *m, u16_t len)
dhcps->renew = false; dhcps->renew = false;
if (dhcps->plist != NULL) { 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) { for (pback_node = dhcps->plist; pback_node != NULL; pback_node = pback_node->pnext) {
pdhcps_pool = pback_node->pnode; pdhcps_pool = pback_node->pnode;
@@ -1016,9 +1022,13 @@ static s16_t parse_msg(dhcps_t *dhcps, struct dhcps_msg *m, u16_t len)
} }
} }
} }
} else {
if (dhcps->has_declined_ip) {
dhcps->has_declined_ip = false;
} else { } else {
dhcps->client_address.addr = dhcps->dhcps_poll.start_ip.addr; dhcps->client_address.addr = dhcps->dhcps_poll.start_ip.addr;
} }
}
if (dhcps->client_address_plus.addr > dhcps->dhcps_poll.end_ip.addr) { if (dhcps->client_address_plus.addr > dhcps->dhcps_poll.end_ip.addr) {
dhcps->client_address.addr = first_address.addr; dhcps->client_address.addr = first_address.addr;
@@ -1068,7 +1078,7 @@ POOL_CHECK:
s16_t ret = parse_options(dhcps, &m->options[4], len);; 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) { if (pnode != NULL) {
node_remove_from_list(&dhcps->plist, pnode); node_remove_from_list(&dhcps->plist, pnode);
free(pnode); free(pnode);
@@ -1080,6 +1090,9 @@ POOL_CHECK:
pdhcps_pool = NULL; pdhcps_pool = NULL;
} }
if (ret == DHCPS_STATE_DECLINE) {
dhcps->has_declined_ip = true;
}
memset(&dhcps->client_address, 0x0, sizeof(dhcps->client_address)); memset(&dhcps->client_address, 0x0, sizeof(dhcps->client_address));
} }