Merge branch 'fix/fix_dhcp_server_recv_decline_issue_v52' into 'release/v5.2'

fix(dhcp): fix dhcp server recv decline issue v52

See merge request espressif/esp-idf!38501
This commit is contained in:
Jiang Jiang Jian
2025-04-22 10:17:50 +08:00

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;
@ -1017,7 +1023,11 @@ static s16_t parse_msg(dhcps_t *dhcps, struct dhcps_msg *m, u16_t len)
} }
} }
} else { } 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) { 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);; 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));
} }