From b07f699e93ab649c0cd2ec416b8f93d1e054b2f2 Mon Sep 17 00:00:00 2001 From: Andrea Coradi Date: Thu, 12 Feb 2026 22:53:35 +0100 Subject: [PATCH 1/4] update lwIP to v2.2.1 and use the official GitHub mirror This is done to fix a known bug in lwIP that caused a null pointer dereference. Source: https://savannah.nongnu.org/bugs/?59831 --- modules/lwip/build.zig.zon | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/lwip/build.zig.zon b/modules/lwip/build.zig.zon index 692c9058c..5b63c68ce 100644 --- a/modules/lwip/build.zig.zon +++ b/modules/lwip/build.zig.zon @@ -7,9 +7,9 @@ }, .dependencies = .{ .lwip = .{ - //.url = "https://download.savannah.nongnu.org/releases/lwip/lwip-2.1.3.zip", - .url = "https://github.com/Ashet-Technologies/deps/raw/refs/heads/main/lwip-2.1.3.zip", - .hash = "N-V-__8AAKCP6ADEah-rtpC4uEsB_-GFFCqsNInUAJY7bH3S", + // .url = "https://download.savannah.nongnu.org/releases/lwip/lwip-2.2.1.zip", + .url = "https://github.com/lwip-tcpip/lwip/archive/refs/tags/STABLE-2_2_1_RELEASE.zip", + .hash = "N-V-__8AAGSTdQCcOKeNITCRoYez502saFXZqz4ucBJ4xTa9", }, }, } From 41ce95ba48c7eb1ee5372d9638f37bda08591bab Mon Sep 17 00:00:00 2001 From: Andrea Coradi Date: Thu, 12 Feb 2026 22:53:49 +0100 Subject: [PATCH 2/4] add adc.c to the needed files to build --- modules/lwip/build.zig | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/lwip/build.zig b/modules/lwip/build.zig index cfea858e3..54ad40161 100644 --- a/modules/lwip/build.zig +++ b/modules/lwip/build.zig @@ -72,6 +72,7 @@ const files = [_][]const u8{ "core/ipv4/ip4_addr.c", "core/ipv4/igmp.c", "core/ipv4/icmp.c", + "core/ipv4/acd.c", // IPv6 implementation: "core/ipv6/icmp6.c", From 009d1b9dfeddd4e195354e3100515684e64029de Mon Sep 17 00:00:00 2001 From: Andrea Coradi Date: Fri, 13 Feb 2026 17:12:18 +0100 Subject: [PATCH 3/4] add lwip_assert_core_locked This function helps identify improper use of lwIP functions in multi-threaded environments, like forgetting to lock the core mutex --- examples/espressif/esp/src/lwip/exports.zig | 7 +++++++ examples/espressif/esp/src/lwip/include/arch/cc.h | 3 +++ 2 files changed, 10 insertions(+) diff --git a/examples/espressif/esp/src/lwip/exports.zig b/examples/espressif/esp/src/lwip/exports.zig index 93f38dffe..c06d9ca95 100644 --- a/examples/espressif/esp/src/lwip/exports.zig +++ b/examples/espressif/esp/src/lwip/exports.zig @@ -25,6 +25,13 @@ export fn lwip_unlock_core_mutex() void { core_mutex.unlock(); } +export fn lwip_assert_core_locked() void { + if (c.lock_tcpip_core == null) return; + + const mutex: *rtos.Mutex = @ptrCast(@alignCast(c.lock_tcpip_core)); + assert(mutex.locked != null); +} + export fn lwip_rand() u32 { return esp.rng.random_u32(); } diff --git a/examples/espressif/esp/src/lwip/include/arch/cc.h b/examples/espressif/esp/src/lwip/include/arch/cc.h index df5207f4c..9671a6e97 100644 --- a/examples/espressif/esp/src/lwip/include/arch/cc.h +++ b/examples/espressif/esp/src/lwip/include/arch/cc.h @@ -9,9 +9,12 @@ typedef unsigned int sys_prot_t; extern uint32_t lwip_rand(void); extern void lwip_lock_core_mutex(); extern void lwip_unlock_core_mutex(); +extern void lwip_assert_core_locked(); extern void lwip_assert(const char *msg, const char *file, int line); extern void lwip_diag(const char *msg, const char *file, int line); +#define LWIP_ASSERT_CORE_LOCKED() do { lwip_assert_core_locked(); } while (0) + #define LWIP_PLATFORM_DIAG(x) \ do { \ lwip_diag((msg), __FILE__, __LINE__); \ From 641e59cbabe434b26213c4325a9536efb100cd84 Mon Sep 17 00:00:00 2001 From: Andrea Coradi Date: Fri, 13 Feb 2026 22:09:57 +0100 Subject: [PATCH 4/4] merge fix --- examples/espressif/esp/src/lwip/exports.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/espressif/esp/src/lwip/exports.zig b/examples/espressif/esp/src/lwip/exports.zig index 607b2e312..c4daf4beb 100644 --- a/examples/espressif/esp/src/lwip/exports.zig +++ b/examples/espressif/esp/src/lwip/exports.zig @@ -28,7 +28,7 @@ export fn lwip_assert_core_locked() void { if (c.lock_tcpip_core == null) return; const mutex: *rtos.Mutex = @ptrCast(@alignCast(c.lock_tcpip_core)); - assert(mutex.locked != null); + std.debug.assert(mutex.locked != null); } export fn lwip_rand() u32 {