From: Tulio A M Mendes Date: Sun, 15 Feb 2026 01:47:41 +0000 (-0300) Subject: feat: IPv6 support via lwIP dual-stack X-Git-Url: https://projects.tadryanom.me/sitemap.xml?a=commitdiff_plain;h=aeb5cb36c8a2585b3d738ddc50dd2fa8599f4c11;p=AdrOS.git feat: IPv6 support via lwIP dual-stack - 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 --- diff --git a/Makefile b/Makefile index 4848a49..7b94337 100644 --- 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) diff --git a/include/net/lwipopts.h b/include/net/lwipopts.h index ec99f04..9598c77 100644 --- a/include/net/lwipopts.h +++ b/include/net/lwipopts.h @@ -31,7 +31,17 @@ /* ---- 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 diff --git a/src/kernel/socket.c b/src/kernel/socket.c index 7b63e39..b4d5f18 100644 --- a/src/kernel/socket.c +++ b/src/kernel/socket.c @@ -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); diff --git a/src/net/dns.c b/src/net/dns.c index f276e00..01a1160 100644 --- a/src/net/dns.c +++ b/src/net/dns.c @@ -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"); } diff --git a/src/net/net_ping.c b/src/net/net_ping.c index a5ae9c8..01ed2e1 100644 --- a/src/net/net_ping.c +++ b/src/net/net_ping.c @@ -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++) {