From: Tulio A M Mendes Date: Thu, 12 Feb 2026 04:24:31 +0000 (-0300) Subject: feat: DNS resolver — enable lwIP DNS, kernel dns_resolve() wrapper with async callbac... X-Git-Url: https://projects.tadryanom.me/sitemap.xml?a=commitdiff_plain;h=95060fa59df3bdc596f66921cca1ce9f68122a90;p=AdrOS.git feat: DNS resolver — enable lwIP DNS, kernel dns_resolve() wrapper with async callback + timeout --- diff --git a/Makefile b/Makefile index 686d3ce..404e863 100644 --- a/Makefile +++ b/Makefile @@ -35,7 +35,7 @@ ifeq ($(ARCH),x86) $(LWIPDIR)/core/netif.c $(LWIPDIR)/core/pbuf.c $(LWIPDIR)/core/raw.c \ $(LWIPDIR)/core/stats.c $(LWIPDIR)/core/sys.c $(LWIPDIR)/core/tcp.c \ $(LWIPDIR)/core/tcp_in.c $(LWIPDIR)/core/tcp_out.c $(LWIPDIR)/core/timeouts.c \ - $(LWIPDIR)/core/udp.c + $(LWIPDIR)/core/udp.c $(LWIPDIR)/core/dns.c LWIP_IPV4 := $(LWIPDIR)/core/ipv4/etharp.c $(LWIPDIR)/core/ipv4/icmp.c \ $(LWIPDIR)/core/ipv4/ip4.c $(LWIPDIR)/core/ipv4/ip4_addr.c \ $(LWIPDIR)/core/ipv4/ip4_frag.c diff --git a/include/dns.h b/include/dns.h new file mode 100644 index 0000000..d33fd92 --- /dev/null +++ b/include/dns.h @@ -0,0 +1,9 @@ +#ifndef DNS_H +#define DNS_H + +#include + +void dns_resolver_init(uint32_t server_ip); +int dns_resolve(const char* hostname, uint32_t* out_ip); + +#endif diff --git a/src/net/dns.c b/src/net/dns.c new file mode 100644 index 0000000..c24e8cd --- /dev/null +++ b/src/net/dns.c @@ -0,0 +1,62 @@ +#include "dns.h" +#include "uart_console.h" + +#include "lwip/dns.h" +#include "lwip/ip_addr.h" + +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); + dns_setserver(0, &dns_server); + uart_print("[DNS] Resolver initialized\n"); +} + +static volatile int dns_done; +static volatile uint32_t dns_result_ip; + +static void dns_found_cb(const char* name, const ip_addr_t* ipaddr, void* arg) { + (void)name; + (void)arg; + if (ipaddr) { + dns_result_ip = ip4_addr_get_u32(ip_2_ip4(ipaddr)); + } else { + dns_result_ip = 0; + } + dns_done = 1; +} + +int dns_resolve(const char* hostname, uint32_t* out_ip) { + if (!hostname || !out_ip) return -1; + + ip_addr_t resolved; + dns_done = 0; + dns_result_ip = 0; + + err_t err = dns_gethostbyname(hostname, &resolved, dns_found_cb, 0); + if (err == ERR_OK) { + /* Already cached */ + *out_ip = ip4_addr_get_u32(ip_2_ip4(&resolved)); + return 0; + } + if (err == ERR_INPROGRESS) { + /* Wait for callback — simple busy-wait with timeout */ + extern uint32_t get_tick_count(void); + uint32_t deadline = get_tick_count() + 250; /* 5 second timeout at 50Hz */ + while (!dns_done && get_tick_count() < deadline) { + /* Let lwIP process packets */ + extern void schedule(void); + schedule(); + } + if (dns_done && dns_result_ip != 0) { + *out_ip = dns_result_ip; + return 0; + } + return -2; /* timeout or NXDOMAIN */ + } + + return -1; /* error */ +} diff --git a/src/net/lwip_port/lwipopts.h b/src/net/lwip_port/lwipopts.h index 2146ebd..662be29 100644 --- a/src/net/lwip_port/lwipopts.h +++ b/src/net/lwip_port/lwipopts.h @@ -28,7 +28,8 @@ #define LWIP_TCP 1 #define LWIP_DHCP 0 #define LWIP_AUTOIP 0 -#define LWIP_DNS 0 +#define LWIP_DNS 1 +#define LWIP_NO_CTYPE_H 1 #define LWIP_IGMP 0 /* ---- TCP tuning ---- */