]> Projects (at) Tadryanom (dot) Me - AdrOS.git/commitdiff
feat: IPv6 support via lwIP dual-stack
authorTulio A M Mendes <[email protected]>
Sun, 15 Feb 2026 01:47:41 +0000 (22:47 -0300)
committerTulio A M Mendes <[email protected]>
Sun, 15 Feb 2026 01:47:41 +0000 (22:47 -0300)
- Enabled LWIP_IPV6=1 with MLD, SLAAC autoconfig, ICMPv6, ND6
- Added all lwIP IPv6 source files (ethip6, icmp6, ip6, nd6, mld6, etc.)
- Fixed dual-stack IP4_ADDR usage in dns.c, net_ping.c, socket.c
  (use ip_2_ip4() + ip_addr_set_zero_ip4() for ip_addr_t)
- 35/35 smoke tests pass, cppcheck clean

Makefile
include/net/lwipopts.h
src/kernel/socket.c
src/net/dns.c
src/net/net_ping.c

index 4848a49962a8d846ccb56ed983ccf1143b55c5f6..7b94337d5db695b3e5ce7f269c0be8d5d0695b6c 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -40,11 +40,15 @@ ifeq ($(ARCH),x86)
         $(LWIPDIR)/core/ipv4/ip4.c $(LWIPDIR)/core/ipv4/ip4_addr.c \
         $(LWIPDIR)/core/ipv4/ip4_frag.c $(LWIPDIR)/core/ipv4/dhcp.c \
         $(LWIPDIR)/core/ipv4/acd.c
+    LWIP_IPV6 := $(LWIPDIR)/core/ipv6/ethip6.c $(LWIPDIR)/core/ipv6/icmp6.c \
+        $(LWIPDIR)/core/ipv6/inet6.c $(LWIPDIR)/core/ipv6/ip6.c \
+        $(LWIPDIR)/core/ipv6/ip6_addr.c $(LWIPDIR)/core/ipv6/ip6_frag.c \
+        $(LWIPDIR)/core/ipv6/mld6.c $(LWIPDIR)/core/ipv6/nd6.c
     LWIP_NETIF := $(LWIPDIR)/netif/ethernet.c
     LWIP_API := $(LWIPDIR)/api/api_lib.c $(LWIPDIR)/api/api_msg.c \
         $(LWIPDIR)/api/err.c $(LWIPDIR)/api/if_api.c $(LWIPDIR)/api/netbuf.c \
         $(LWIPDIR)/api/netifapi.c $(LWIPDIR)/api/tcpip.c
-    LWIP_SOURCES := $(LWIP_CORE) $(LWIP_IPV4) $(LWIP_NETIF) $(LWIP_API)
+    LWIP_SOURCES := $(LWIP_CORE) $(LWIP_IPV4) $(LWIP_IPV6) $(LWIP_NETIF) $(LWIP_API)
     NET_SOURCES := $(wildcard $(SRC_DIR)/net/*.c) $(wildcard $(SRC_DIR)/net/lwip_port/*.c)
     C_SOURCES += $(NET_SOURCES)
 
index ec99f040569751ea15a533d3ee37e4bfb95fc409..9598c772e6fe0ccbba13dd20710b7ea5697f5582 100644 (file)
 
 /* ---- IPv4 ---- */
 #define LWIP_IPV4               1
-#define LWIP_IPV6               0
+#define LWIP_IPV6               1
+#define LWIP_IPV6_MLD           1
+#define LWIP_IPV6_AUTOCONFIG    1
+#define LWIP_ICMP6              1
+#define LWIP_IPV6_DHCP6         0
+#define MEMP_NUM_MLD6_GROUP     4
+#define LWIP_IPV6_NUM_ADDRESSES 3
+#define LWIP_ND6_NUM_NEIGHBORS  8
+#define LWIP_ND6_NUM_DESTINATIONS 8
+#define LWIP_ND6_NUM_PREFIXES   4
+#define LWIP_ND6_NUM_ROUTERS    2
 #define LWIP_ARP                1
 #define LWIP_ICMP               1
 #define LWIP_UDP                1
index 7b63e3934f03b5f78f4829670db45bd4f15ce180..b4d5f18d57cb234bf636afd983abc4ac33725eb0 100644 (file)
@@ -238,7 +238,8 @@ int ksocket_bind(int sid, const struct sockaddr_in* addr) {
     if (!s) return -EBADF;
 
     ip_addr_t ip;
-    ip_addr_set_ip4_u32(&ip, addr->sin_addr);
+    ip_addr_set_zero_ip4(&ip);
+    ip4_addr_set_u32(ip_2_ip4(&ip), addr->sin_addr);
     uint16_t port = ntohs(addr->sin_port);
 
     err_t err;
@@ -303,7 +304,8 @@ int ksocket_connect(int sid, const struct sockaddr_in* addr) {
     if (!s) return -EBADF;
 
     ip_addr_t ip;
-    ip_addr_set_ip4_u32(&ip, addr->sin_addr);
+    ip_addr_set_zero_ip4(&ip);
+    ip4_addr_set_u32(ip_2_ip4(&ip), addr->sin_addr);
     uint16_t port = ntohs(addr->sin_port);
 
     if (s->type == SOCK_STREAM) {
@@ -381,7 +383,8 @@ int ksocket_sendto(int sid, const void* buf, size_t len, int flags,
     if (s->type != SOCK_DGRAM) return -EOPNOTSUPP;
 
     ip_addr_t ip;
-    ip_addr_set_ip4_u32(&ip, dest->sin_addr);
+    ip_addr_set_zero_ip4(&ip);
+    ip4_addr_set_u32(ip_2_ip4(&ip), dest->sin_addr);
     uint16_t port = ntohs(dest->sin_port);
 
     struct pbuf* p = pbuf_alloc(PBUF_TRANSPORT, (u16_t)len, PBUF_RAM);
index f276e009600c4bd1fdb28e059bc77e111b346500..01a1160acf68d0e00b8fc58d7c847c3fbfe1ca7e 100644 (file)
@@ -7,10 +7,11 @@
 void dns_resolver_init(uint32_t server_ip) {
     dns_init();
     ip_addr_t dns_server;
-    IP4_ADDR(&dns_server, (server_ip >> 24) & 0xFF,
-                          (server_ip >> 16) & 0xFF,
-                          (server_ip >> 8) & 0xFF,
-                          server_ip & 0xFF);
+    ip_addr_set_zero_ip4(&dns_server);
+    IP4_ADDR(ip_2_ip4(&dns_server), (server_ip >> 24) & 0xFF,
+                                     (server_ip >> 16) & 0xFF,
+                                     (server_ip >> 8) & 0xFF,
+                                     server_ip & 0xFF);
     dns_setserver(0, &dns_server);
     kprintf("[DNS] Resolver initialized\n");
 }
index a5ae9c8d4168d3b251bc02de89a5df1882ceeead..01ed2e1bc3174b34b7ba50e7943db99731fe14f8 100644 (file)
@@ -139,7 +139,8 @@ void net_ping_test(void) {
     process_sleep(2 * TIMER_HZ); /* ~2 seconds */
 
     ip_addr_t target;
-    IP4_ADDR(&target, 10, 0, 2, 2);
+    ip_addr_set_zero_ip4(&target);
+    IP4_ADDR(ip_2_ip4(&target), 10, 0, 2, 2);
 
     int ok = 0;
     for (int i = 0; i < PING_COUNT; i++) {