summaryrefslogtreecommitdiff
path: root/components
diff options
context:
space:
mode:
authorrcitach <[email protected]>2026-10-15 05:04:05 +0000
committerRbb666 <[email protected]>2026-10-15 13:28:57 +0800
commit1e24039cf879539d2ac367c8e6423124787ef23d (patch)
tree728d93428d20652e976e99a392ebdce36f5761df /components
parent20881ec5710f0aa78cc6d483c5c6d0f09d6105b8 (diff)
[DHCP] Optimize the DHCP startup logic
Diffstat (limited to 'components')
-rw-r--r--components/net/lwip-dhcpd/dhcp_server_raw.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/components/net/lwip-dhcpd/dhcp_server_raw.c b/components/net/lwip-dhcpd/dhcp_server_raw.c
index b271ce36b9..2e18966151 100644
--- a/components/net/lwip-dhcpd/dhcp_server_raw.c
+++ b/components/net/lwip-dhcpd/dhcp_server_raw.c
@@ -577,7 +577,6 @@ dhcp_server_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p, const ip_addr_t
break;
}
node_prev = node;
- node = node->next;
}
if (node != NULL)
@@ -615,6 +614,7 @@ err_t
dhcp_server_start(struct netif *netif, ip4_addr_t *start, ip4_addr_t *end)
{
struct dhcp_server *dhcp_server;
+ err_t err;
/* If this netif alreday use the dhcp server. */
for (dhcp_server = lw_dhcp_server; dhcp_server != NULL; dhcp_server = dhcp_server->next)
@@ -640,9 +640,6 @@ dhcp_server_start(struct netif *netif, ip4_addr_t *start, ip4_addr_t *end)
/* clear data structure */
memset(dhcp_server, 0, sizeof(struct dhcp_server));
- /* store this dhcp server to list */
- dhcp_server->next = lw_dhcp_server;
- lw_dhcp_server = dhcp_server;
dhcp_server->netif = netif;
dhcp_server->node_list = NULL;
dhcp_server->start = *start;
@@ -654,15 +651,27 @@ dhcp_server_start(struct netif *netif, ip4_addr_t *start, ip4_addr_t *end)
if (dhcp_server->pcb == NULL)
{
LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_server_start(): could not obtain pcb\n"));
+ mem_free(dhcp_server);
return ERR_MEM;
}
ip_set_option(dhcp_server->pcb, SOF_BROADCAST);
/* set up local and remote port for the pcb */
- udp_bind(dhcp_server->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
+ err = udp_bind(dhcp_server->pcb, IP_ADDR_ANY, DHCP_SERVER_PORT);
+ if (err != ERR_OK)
+ {
+ LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_server_start(): could not bind pcb, err=%d\n", (int)err));
+ udp_remove(dhcp_server->pcb);
+ mem_free(dhcp_server);
+ return err;
+ }
//udp_connect(dhcp_server->pcb, IP_ADDR_ANY, DHCP_CLIENT_PORT);
/* set up the recv callback and argument */
udp_recv(dhcp_server->pcb, dhcp_server_recv, dhcp_server);
+
+ /* Publish the server only after all resources are ready. */
+ dhcp_server->next = lw_dhcp_server;
+ lw_dhcp_server = dhcp_server;
LWIP_DEBUGF(DHCP_DEBUG | LWIP_DBG_TRACE, ("dhcp_server_start(): starting DHCP server\n"));
return ERR_OK;
@@ -742,7 +751,7 @@ void dhcpd_start(const char *netif_name)
res = dhcp_server_start(netif, &ip_start, &ip_end);
if (res != 0)
{
- DEBUG_PRINTF("dhcp_server_start res: %s.\r\n", res);
+ DEBUG_PRINTF("dhcp_server_start res: %d.\r\n", (int)res);
}
}