From 26a2ccb8368a9968b6ec16068ad68dd0edb40641 Mon Sep 17 00:00:00 2001 From: user Date: Fri, 17 Jul 2026 12:54:43 +0200 Subject: net: UDP sockets in the kernel + a DNS resolver (real hostname lookups) Adds UDP to the kernel socket layer on top of the ICMP core: - net_sum() (raw folded sum) split out of net_cksum() so a UDP pseudo-header (src/dst IP + proto + length) can seed the segment checksum. - udp_send: builds IP+UDP with the pseudo-header checksum; NET_BIND sets the local/source port; net_connect sets the peer. - udp_in: demuxes inbound UDP by destination port to the bound socket (net_find_udp), delivers the payload + source addr. Also fixes a real recv bug: net_pump clobbers BC/DE/HL, so the old recv timeout counted in registers and was effectively random. recv now counts in WRAM. New `nslookup HOST` (PROG_NSLOOKUP=28, bank 30): builds a DNS A query and parses the answer (with 0xC0 name-compression) entirely in userland over a UDP socket - the kernel never sees DNS, just UDP. Verified through the bridge NAT: /# nslookup example.com -> example.com -> 172.66.147.243 This gives us name resolution for the TCP/HTTP demo next. --- c/sock.h | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'c/sock.h') diff --git a/c/sock.h b/c/sock.h index 9af2351..1298271 100644 --- a/c/sock.h +++ b/c/sock.h @@ -42,6 +42,12 @@ static unsigned char net_recv(unsigned char s, void *buf, unsigned char max) { _nr.op = 3; _nr.sock = s; _nr.buf = (unsigned char *)buf; _nr.len = max; return sys_net(&_nr); } +/* set the local (source) port - needed so UDP replies demux back to us */ +static unsigned char net_bind(unsigned char s, unsigned int port) { + _nr.op = 5; _nr.sock = s; + _nr.port_hi = (unsigned char)(port >> 8); _nr.port_lo = (unsigned char)port; + return sys_net(&_nr); +} static void net_close(unsigned char s) { _nr.op = 4; _nr.sock = s; sys_net(&_nr); } -- cgit v1.3.1-sl0p