]> 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 4c4bcce03b755561de39b337c149faee6bd5a837..60ebdd403c318a9d3fafd7bed7ced1d24aca865e 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -49,11 +49,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 f47b10dce7a9df7a384a9dec0318ad1ba4b9d625..f22aa8a9d9c2a9ad1dbc85a7df4ed87be7e3d842 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 883bdac790e20fd85db38f662bb6459f56b8d7c0..113aeeb12aaec9a9ee22b89d80cab307da612c42 100644 (file)
@@ -247,7 +247,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;
@@ -312,7 +313,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) {
@@ -390,7 +392,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 a6bd27ba8438ea2d5c63dd6772ceb354f9217e4e..e2bbf609c0614707af5397196802052802c7c281 100644 (file)
 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 ebe15c97d7713a0124b5eb1d2582a2902b4441f7..dc0ccc6e70a83a61ecd4c5e216c8193897072317 100644 (file)
@@ -148,7 +148,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++) {