Skip to content

AROSTCP

Nick Andrews edited this page Mar 5, 2026 · 12 revisions

AROSTCP bsdsocket.library — Implementation Status & To-Do Summary

This document tracks what is implemented, partially implemented, and not yet implemented in the AROSTCP network stack.

Last updated against codebase: March 2026.


Feature Overview

Core Protocol Support — IMPLEMENTED ✅

Protocol Status Key Files
IPv4 ✅ Complete netinet/ip_input.c, ip_output.c, in.c, in_pcb.c
IPv6 ✅ Complete netinet6/ip6_input.c, ip6_output.c, in6.c, in6_pcb.c
TCP (v4+v6) ✅ Complete netinet/tcp_input.c, tcp_output.c, tcp_usrreq.c, netinet6/
UDP (v4+v6) ✅ Complete netinet/udp_usrreq.c, netinet6/udp6_usrreq.c
ICMP ✅ Complete netinet/ip_icmp.c
ICMPv6 ✅ Complete netinet6/icmp6.c
Raw IP (v4+v6) ✅ Complete netinet/raw_ip.c
ARP ✅ Complete net/sana2arp.c

IPv6 Control Plane — IMPLEMENTED ✅

Feature Status Key Files
NDP (Neighbor Discovery) ✅ Complete netinet6/nd6.c, nd6_nbr.c, nd6_rtr.c
DAD (Duplicate Address Detection) ✅ Complete netinet6/nd6.c (nd6_dad_start/timer)
SLAAC (Stateless Auto-config) ✅ Complete netinet6/nd6_rtr.c (RA processing, prefix handling)
Router Discovery ✅ Complete netinet6/nd6_rtr.c (RS/RA)
MLD (Multicast Listener Discovery) ✅ Complete netinet6/mld6.c, mld6.h (MLDv1, RFC 2710)
IPv6 Multicast membership ✅ Complete netinet6/in6.c (in6_addmulti/delmulti), in6_proto.c
IPv6 socket options ✅ Complete netinet6/in6_proto.c (ip6_ctloutput)
IPv6 ioctls ✅ Complete netinet6/in6.c (in6_control)

Network Interface Layer — IMPLEMENTED ✅

Feature Status Key Files
SANA-II device integration ✅ Complete net/if_sana.c, sana2config.c
Loopback interface ✅ Complete net/if_loop.c
Interface management ✅ Complete net/if.c
Routing table (radix tree) ✅ Complete net/route.c, net/radix.c
PF_ROUTE routing socket ✅ Complete net/rtsock.c (RTM_ADD/DELETE/CHANGE/GET + notifications)
BPF (packet capture/filter) ✅ Complete net/bpf.c, net/bpf_filter.c
Packet filter framework ✅ Complete net/pfil.c (conditional on ENABLE_PACKET_FILTER)
IP Filter / firewall ✅ Complete net/ipfilter.c (rule engine, NAT support)

BSD Socket API — IMPLEMENTED ✅

Feature Status Key Files
Core socket ops ✅ Complete kern/uipc_socket.c, uipc_socket2.c
DNS resolver ✅ Complete api/res_init.c, res_query.c, res_send.c, res_mkquery.c
Name resolution ✅ Complete api/gethostnamadr.c, getxbyy.c
inet_ntop / inet_pton ✅ Complete api/inet_ntop.c
if_nameindex / getifaddrs ✅ Complete api/if_nameindex.c, getifaddrs.c

Configuration & Services — IMPLEMENTED ✅

Feature Status Key Files
DHCPv4 client ✅ Complete kern/amiga_dhcp.c (external dhclient launcher)
DHCPv6 client ✅ Complete kern/amiga_dhcp.c (conditional on INET6 && DHCP6)
Network database ✅ Complete kern/amiga_netdb.c
ARexx interface ✅ Complete kern/amiga_rexx.c
GUI configuration ✅ Complete kern/amiga_gui.c
Logging / debug ✅ Complete kern/amiga_log.c, kern/subr_prf.c
RC file configuration ✅ Complete kern/amiga_rc.c, amiga_config.c

Network Utilities — IMPLEMENTED ✅

Utility Location
arp common/C/arp.c
ifconfig common/C/ifconfig.c
ping common/C/ping.c
route common/C/route.c
netstat common/C/netstat/ (inet, inet6, route, if, mbuf stats)
traceroute common/C/traceroute/
nslookup common/C/nslookup/ (interactive mode)
hostname common/C/hostname.c
resolve common/C/resolve.c
logger common/C/logger.c
whoami common/C/whoami.c
ipf common/C/ipf/ (IP Filter rule management)
ipnat common/C/ipnat/ (NAT rule management)

Roadshow "extended" API — Status

BPF (Berkeley Packet Filter) — IMPLEMENTED ✅

Full kernel BPF engine with RX/TX hook points and Roadshow API layer.

  • bpf_open() — allocates & initializes BPF descriptor
  • bpf_close() — closes descriptor and frees resources
  • bpf_read() — reads captured packets from hold buffer
  • bpf_write() — transmits raw packets via interface
  • bpf_set_notify_mask() — sets EXEC signal notification
  • bpf_set_interrupt_mask() — sets interrupt mask
  • bpf_ioctl() — handles 16+ ioctl commands (BIOCGBLEN, BIOCSBLEN, BIOCSETF, BIOCFLUSH, BIOCPROMISC, BIOCGDLT, BIOCSETIF, BIOCGSTATS, BIOCVERSION, etc.)
  • bpf_data_waiting() — returns bytes available for reading

Kernel infrastructure:

  • BPF VM/interpreter (net/bpf_filter.c — full instruction set)
  • Attach/detach hooks in SANA-II RX/TX paths (net/if_sana.c)
  • Per-interface filter lists and frame dispatch (net/bpf.c)
  • Notify/interrupt signal semantics

Route Management — IMPLEMENTED ✅

Full TagItem-based route API with BSD 4.4 routing socket support.

  • AddRouteTagList() — parses tags, calls rtrequest(RTM_ADD, ...)
  • DeleteRouteTagList() — parses tags, calls rtrequest(RTM_DELETE, ...)
  • ChangeRouteTagList() — atomic delete+re-add under splnet
  • FreeRouteInfo() — frees allocated route info buffer
  • GetRouteInfo() — two-pass radix walk, returns rt_msghdr array with filtering

Kernel infrastructure:

  • PF_ROUTE domain registered (net/rtsock.c)
  • RTM_ADD / RTM_DELETE / RTM_GET / RTM_CHANGE / RTM_LOCK messages
  • RTM_MISS / RTM_RESOLVE / RTM_REDIRECT / RTM_IFINFO / RTM_NEWADDR / RTM_DELADDR notifications

Interface Management — PARTIALLY IMPLEMENTED ⚠�

Most are ENOSYS stubs; QueryInterfaceTagList is functional.

  • AddInterfaceTagList() — STUB (returns -1, ENOSYS)
  • ConfigureInterfaceTagList() — STUB (returns -1, ENOSYS)
  • QueryInterfaceTagList() — IMPLEMENTED (full implementation in amiga_netstat.c)
  • ObtainInterfaceList() — STUB (returns NULL)
  • ReleaseInterfaceList() — STUB
  • BeginInterfaceConfig() — STUB
  • AbortInterfaceConfig() — STUB
  • CreateAddrAllocMessageA() — STUB (returns 0)
  • DeleteAddrAllocMessage() — STUB
  • RemoveInterface() — NOT PRESENT (no entry point)

Work remaining:

  • Dynamic SANA-II device open/close and interface lifecycle management
  • TagItem parsing for Add/Configure
  • Runtime address allocation / configuration hooks
  • ObtainInterfaceList / ReleaseInterfaceList list management

Network Monitoring — NOT IMPLEMENTED �

All are ENOSYS stubs.

  • AddNetMonitorHookTagList() — STUB (returns -1, ENOSYS)
  • RemoveNetMonitorHook() — STUB
  • GetNetworkStatistics() — STUB (returns -1, ENOSYS)

Work required:

  • Stats wrapper over existing if_data counters (low effort)
  • Monitor hook callback injection points into RX/TX paths (medium effort)

DNS Server Management — PARTIALLY IMPLEMENTED ⚠�

Runtime add/remove/list is implemented; default domain name API is missing.

  • AddDomainNameServer() — IMPLEMENTED (parses address, adds to DynDB.dyn_NameServers)
  • RemoveDomainNameServer() — IMPLEMENTED (finds and removes from list)
  • ObtainDomainNameServerList() — IMPLEMENTED (returns populated list from static + dynamic entries)
  • ReleaseDomainNameServerList() — IMPLEMENTED (walks list, frees all nodes)
  • GetDefaultDomainName() — NOT PRESENT (no entry point)
  • SetDefaultDomainName() — NOT PRESENT (no entry point)

Work remaining:

  • Implement GetDefaultDomainName() / SetDefaultDomainName() (read/write default domain from resolver state)

IPv6 control plane — IMPLEMENTED ✅

IPPROTO_IPV6 socket options — FUNCTIONAL

ip6_ctloutput() in netinet6/in6_proto.c implements real option handling with backing kernel state.

  • IPV6_JOIN_GROUP — calls in6_joingroup_inp() → in6_addmulti() → MLD report
  • IPV6_LEAVE_GROUP — calls in6_leavegroup_inp() → in6_delmulti() → MLD done
  • IPV6_MULTICAST_IF — sets im6o->im6o_multicast_ifp
  • IPV6_MULTICAST_HOPS — sets im6o->im6o_multicast_hlim (validated 0-255 or -1)
  • IPV6_MULTICAST_LOOP — sets im6o->im6o_multicast_loop
  • IPV6_V6ONLY — sets inp->in6p_v6only
  • IPV6_RECVPKTINFO — sets/clears IN6P_PKTINFO flag
  • IPV6_TCLASS — sets inp->in6p_tclass
  • IPV6_UNICAST_HOPS — sets inp->in6p_hops
  • IPV6_HOPLIMIT — NOT HANDLED (get/set hop limit ancillary data)

IPv6 Multicast — IMPLEMENTED ✅

Full multicast stack with MLD protocol support.

  • Per-socket IPv6 group membership list (struct ip6_moptions, max 20 groups)
  • Per-interface multicast group table (struct in6_multi linked list, in6_multihead)
  • MLD (Multicast Listener Discovery) — MLDv1 per RFC 2710 (netinet6/mld6.c)
    • Query/Report/Done message handling
    • Per-group state machine (IDLE/LAZY/SLEEPING/AWAKENING)
    • Report timer with random delay
    • Report suppression on hearing other reports
    • Unsolicited reports on join, Done on leave
    • ff02::1 (all-nodes) exemption per RFC 2710 §6
  • SANA-II multicast MAC registration (sana_add_mcast6 / sana_del_mcast6)

IoctlSocket() — IPv6 ioctls — IMPLEMENTED ✅

IPv6 address management ioctls are handled in in6_control():

  • SIOCGIFADDR_IN6 — get IPv6 interface address
  • SIOCAIFADDR_IN6 — add/configure IPv6 interface address
  • SIOCDIFADDR_IN6 — delete IPv6 interface address
  • SIOCGLIFADDR — enumerate addresses (used by getifaddrs)

Compatibility / spec gaps

Miami compatibility extensions — PARTIALLY IMPLEMENTED ⚠�

  • MiamiSysCtl() — STUB (returns ENOSYS)
  • MiamiGetHardwareLen() — STUB (returns 0)
  • MiamiSetSocksConn() — STUB (returns FALSE)
  • MiamiOpenSSL() — returns NULL (no SSL support; intentional, not an error)
  • MiamiCloseSSL() — no-op (intentional)
  • sockatmark() — STUB (returns 0)
  • MiamiPFAddHook() — IMPLEMENTED (allocates hook, adds to pfil_list)
  • MiamiPFRemoveHook() — IMPLEMENTED (removes from pfil_list, frees)

Spec-documented functions missing entirely from source

These exist in bsdsocket.doc.txt but have no implementation in AROSTCP.

  • ProcessIsServer()
  • ObtainServerSocket()
  • ChangeRoadshowData()
  • ObtainRoadshowData()
  • ReleaseRoadshowData()

Work required:

  • Add entry points to avoid link-time failures/null vectors
  • Implement minimal viable semantics (RoadshowData likely needs compatibility shim)

SO_REUSEPORT vs SO_REUSEADDR semantics

BSD-standard behavior is implemented in netinet/in_pcb.c:

  • Multicast addresses: SO_REUSEADDR is treated as SO_REUSEPORT (allows full duplication)

  • Unicast addresses: SO_REUSEPORT required on both sockets for shared binds

  • This matches FreeBSD/macOS semantics; differs from Linux where SO_REUSEADDR alone enables UDP port sharing

  • Decide whether to:

    • Keep behavior (BSD-standard) and document it, or
    • Adjust PCB/bind logic for Linux-like UDP reuse semantics

Remaining implementation backlog (ordered by priority)

  1. Implement IPV6_HOPLIMIT socket option (ancillary data for received hop limit)
  2. Implement GetDefaultDomainName() / SetDefaultDomainName()
  3. Implement interface management API (AddInterfaceTagList, ConfigureInterfaceTagList, ObtainInterfaceList, etc.)
  4. Implement network monitoring hooks + statistics wrapper (GetNetworkStatistics, AddNetMonitorHookTagList)
  5. Add missing spec functions (ProcessIsServer, ObtainServerSocket, RoadshowData*)
  6. Implement remaining Miami stubs (MiamiSysCtl, MiamiGetHardwareLen, sockatmark)
  7. Implement RemoveInterface() entry point

What changed since the original wiki page

The following items from the original to-do list have been completed:

Item Status Change
BPF (all 8 API functions + kernel engine) � NOT IMPLEMENTED → ✅ IMPLEMENTED
Route management (all 5 API functions) � NOT IMPLEMENTED → ✅ IMPLEMENTED
PF_ROUTE routing socket + RTM messages � NOT IMPLEMENTED → ✅ IMPLEMENTED
IPv6 socket options (ip6_ctloutput) � SILENT NO-OP → ✅ IMPLEMENTED (9 of 10 options)
IPv6 multicast (membership + MLD + delivery) � NOT IMPLEMENTED → ✅ IMPLEMENTED (MLDv1 RFC 2710)
IPv6 ioctls (SIOCGIFADDR_IN6, etc.) � NOT IMPLEMENTED → ✅ IMPLEMENTED
DNS Add/Remove/Obtain/Release � NOT IMPLEMENTED → ✅ IMPLEMENTED (4 of 6 functions)
QueryInterfaceTagList() � NOT IMPLEMENTED → ✅ IMPLEMENTED
MiamiPFAddHook() / MiamiPFRemoveHook() ⚠� PARTIAL → ✅ IMPLEMENTED
Packet filter framework (pfil + ipfilter) (not listed) → ✅ IMPLEMENTED
IP Filter / firewall engine + NAT (not listed) → ✅ IMPLEMENTED
MLD (Multicast Listener Discovery) � NOT IMPLEMENTED → ✅ IMPLEMENTED
DHCPv4 + DHCPv6 client (not listed) → ✅ IMPLEMENTED
NDP / DAD / SLAAC / Router Discovery (not listed) → ✅ IMPLEMENTED

Original backlog of 10 items: 7 fully completed, 2 partially completed, 1 remaining (interface management).

Clone this wiki locally