[lightning-ln882h] Add static IP support#375
Conversation
…y-eu#375) wifi_sta_connect() always starts DHCP internally; there is no way to pass a dhcp_mode parameter to it like BK72XX's bk_wlan_start_sta_adv_fix. Apply static IP and stop DHCP in wifiEventStaConnected(), immediately after the L2 association event fires, before the SDK-initiated DHCP exchange completes. Emit GOT_IP manually since the netdev callback won't fire when DHCP is stopped. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
648ae3b to
ea5142d
Compare
…am (libretiny-eu#375) Two bugs in the previous static-IP fix (e2d501b + f49e18f): 1. Wrong order in wifiEventStaConnected(): netif_set_addr() was called before netifapi_dhcp_release_and_stop(). When DHCP is already BOUND at the time the connected event fires, netif_set_addr() triggers the LwIP netif status callback with dhcp_supplied_address==true, emitting a spurious GOT_IP before DHCP was stopped. Fix: stop DHCP first, then set the address. 2. Missing fallback in wifiEventIpReceived(): this callback is invoked by the SDK's sta_netif_status_changed_cb() from inside dhcp_recv() in the LwIP tcpip_thread. If DHCP completes before or after the connected event (e.g. roaming, SDK-internal reconnect), the DHCP lease stays active and the client sends periodic renewal requests. Cannot call netifapi_dhcp_release_and_stop() here (deadlock: we ARE the tcpip_thread waiting on itself) and cannot call dhcp_release_and_stop() directly (use-after-free: dhcp_recv() hasn't returned yet). Fix: schedule wifiApplyStaticIpCallback via tcpip_callback(). It runs after dhcp_recv() unwinds, where it is safe to stop DHCP, apply the static address, and emit GOT_IP.
5760e15 to
6686568
Compare
…ct (libretiny-eu#375) When the reconnect/roam fallback path fires (wifiApplyStaticIpCallback), LwIP's dhcp_recv() has already updated the DNS table via DHCP option 6 before we could stop DHCP. Restore info.dns1/dns2 after netif_set_addr() to ensure the user-configured DNS servers survive reconnects. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
Added one more fix: on the reconnect/roam fallback path ( Currently testing on a DS-101JL / BSEED WiFi Touch Light Switch 2 Gang with an LN-CB3S V1.0 module (WL2H-U-2 / LN882H). |
…ct (libretiny-eu#375) When the reconnect/roam fallback path fires (wifiApplyStaticIpCallback), LwIP's dhcp_recv() has already updated the DNS table via DHCP option 6 before we could stop DHCP. Restore info.dns1/dns2 after netif_set_addr() to ensure the user-configured DNS servers survive reconnects. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
3e876e5 to
fc8c881
Compare
…y-eu#375) wifi_sta_connect() always starts DHCP internally; there is no way to pass a dhcp_mode parameter to it like BK72XX's bk_wlan_start_sta_adv_fix. Apply static IP and stop DHCP in wifiEventStaConnected(), immediately after the L2 association event fires, before the SDK-initiated DHCP exchange completes. Emit GOT_IP manually since the netdev callback won't fire when DHCP is stopped. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fc8c881 to
6bf1b38
Compare
…am (libretiny-eu#375) Two bugs in the previous static-IP fix (e2d501b + f49e18f): 1. Wrong order in wifiEventStaConnected(): netif_set_addr() was called before netifapi_dhcp_release_and_stop(). When DHCP is already BOUND at the time the connected event fires, netif_set_addr() triggers the LwIP netif status callback with dhcp_supplied_address==true, emitting a spurious GOT_IP before DHCP was stopped. Fix: stop DHCP first, then set the address. 2. Missing fallback in wifiEventIpReceived(): this callback is invoked by the SDK's sta_netif_status_changed_cb() from inside dhcp_recv() in the LwIP tcpip_thread. If DHCP completes before or after the connected event (e.g. roaming, SDK-internal reconnect), the DHCP lease stays active and the client sends periodic renewal requests. Cannot call netifapi_dhcp_release_and_stop() here (deadlock: we ARE the tcpip_thread waiting on itself) and cannot call dhcp_release_and_stop() directly (use-after-free: dhcp_recv() hasn't returned yet). Fix: schedule wifiApplyStaticIpCallback via tcpip_callback(). It runs after dhcp_recv() unwinds, where it is safe to stop DHCP, apply the static address, and emit GOT_IP.
…ct (libretiny-eu#375) When the reconnect/roam fallback path fires (wifiApplyStaticIpCallback), LwIP's dhcp_recv() has already updated the DNS table via DHCP option 6 before we could stop DHCP. Restore info.dns1/dns2 after netif_set_addr() to ensure the user-configured DNS servers survive reconnects. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…retiny-eu#375) - Replace double-space with tab before trailing comment on lwip/dhcp.h include (AlignTrailingComments + UseTab:Always requires tab alignment to col 24) - Replace double-space with tab+space in ipaddr.addr assignment (AlignConsecutiveAssignments + UseTab:Always requires tab padding)
00524d8 to
07fac3b
Compare
…y-eu#375) wifi_sta_connect() always starts DHCP internally; there is no way to pass a dhcp_mode parameter to it like BK72XX's bk_wlan_start_sta_adv_fix. Apply static IP and stop DHCP in wifiEventStaConnected(), immediately after the L2 association event fires, before the SDK-initiated DHCP exchange completes. Emit GOT_IP manually since the netdev callback won't fire when DHCP is stopped.
…am (libretiny-eu#375) Two bugs in the previous static-IP fix (e2d501b + f49e18f): 1. Wrong order in wifiEventStaConnected(): netif_set_addr() was called before netifapi_dhcp_release_and_stop(). When DHCP is already BOUND at the time the connected event fires, netif_set_addr() triggers the LwIP netif status callback with dhcp_supplied_address==true, emitting a spurious GOT_IP before DHCP was stopped. Fix: stop DHCP first, then set the address. 2. Missing fallback in wifiEventIpReceived(): this callback is invoked by the SDK's sta_netif_status_changed_cb() from inside dhcp_recv() in the LwIP tcpip_thread. If DHCP completes before or after the connected event (e.g. roaming, SDK-internal reconnect), the DHCP lease stays active and the client sends periodic renewal requests. Cannot call netifapi_dhcp_release_and_stop() here (deadlock: we ARE the tcpip_thread waiting on itself) and cannot call dhcp_release_and_stop() directly (use-after-free: dhcp_recv() hasn't returned yet). Fix: schedule wifiApplyStaticIpCallback via tcpip_callback(). It runs after dhcp_recv() unwinds, where it is safe to stop DHCP, apply the static address, and emit GOT_IP.
…ct (libretiny-eu#375) When the reconnect/roam fallback path fires (wifiApplyStaticIpCallback), LwIP's dhcp_recv() has already updated the DNS table via DHCP option 6 before we could stop DHCP. Restore info.dns1/dns2 after netif_set_addr() to ensure the user-configured DNS servers survive reconnects.
…retiny-eu#375) - Replace double-space with tab before trailing comment on lwip/dhcp.h include (AlignTrailingComments + UseTab:Always requires tab alignment to col 24) - Replace double-space with tab+space in ipaddr.addr assignment (AlignConsecutiveAssignments + UseTab:Always requires tab padding)
2b6828b to
cdf3b81
Compare
cdf3b81 to
d5f9469
Compare
|
There is only one pathway to starting DHCP internally by the SDK:
The wifi_manager will always call So only the part that sets a static IP address in STA_CONNECTED should be needed. Tested on ESPHome, works just fine; forcefully kicking the device off the network causes it to reconnect and use the static IP address again. |
The merge of upstream master combined this file's static-IP block with the merged libretiny-eu#375 (kuba2k2) simplification, declaring WiFiNetworkInfo &info twice in wifiEventStaConnected. Restore the DNS-capable implementation (dns_setserver for manual_ip dns1/dns2); the merged libretiny-eu#375 drops it, which breaks MQTT-by-hostname.
Adds static IP support for LN882H. The LN882H SDK always starts DHCP internally in \wifi_sta_connect()\ with no option to disable it, so static IP is not supported at the SDK level. This PR implements static IP by stopping DHCP and applying the configured address after each connect, reconnect and roam event.
Changes
Apply static IP after connect — stop DHCP and apply static IP in \wifiEventStaConnected()\ before the SDK hands over to the application. \wifi_sta_connect()\ always starts DHCP internally with no way to disable it.
*Fix forward declaration of \wifiEventIpReceived* — required for the above.
Ensure static IP survives reconnect and roam — two additional cases:
etif_set_addr()\ was called before
etifapi_dhcp_release_and_stop(). When DHCP is already BOUND, this triggers the netif status callback with \dhcp_supplied_address==true\ before DHCP is stopped. Fixed: stop DHCP first.
etifapi_dhcp_release_and_stop()\ (deadlock) or \dhcp_release_and_stop()\ directly (use-after-free). Fixed: schedule \wifiApplyStaticIpCallback\ via \ cpip_callback()\ to run after \dhcp_recv()\ returns.
Tested on
LN882H-based 2-gang light switch (DS-101JL) running ESPHome — static IP stable across power cycles, reconnects and roaming for several months.