diff options
| author | rcitach <[email protected]> | 2026-10-15 05:04:05 +0000 |
|---|---|---|
| committer | Rbb666 <[email protected]> | 2026-10-15 13:28:57 +0800 |
| commit | 1e24039cf879539d2ac367c8e6423124787ef23d (patch) | |
| tree | 728d93428d20652e976e99a392ebdce36f5761df /components | |
| parent | 20881ec5710f0aa78cc6d483c5c6d0f09d6105b8 (diff) | |
[DHCP] Optimize the DHCP startup logic
Diffstat (limited to 'components')
| -rw-r--r-- | components/net/lwip-dhcpd/dhcp_server_raw.c | 21 |
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); } } |
