- RFC 1122 - Requirements for Internet Hosts -- Communication Layers
- RFC 791 - Internet Protocol
- RFC 1191 - Path MTU discovery
- RFC 826 - Ethernet Address Resolution Protocol
- RFC 5227 - IPv4 Address Conflict Detection
- RFC 792 - Internet Control Message Protocol
- RFC 3376 - Internet Group Management Protocol, Version 3
- RFC 8200 - Internet Protocol, Version 6 (IPv6) Specification
- RFC 4291 - IP Version 6 Addressing Architecture
- RFC 8201 - Path MTU Discovery for IP version 6
- RFC 4861 - Neighbor Discovery for IP version 6 (IPv6)
- RFC 4862 - IPv6 Stateless Address Autoconfiguration
- RFC 4443 - Internet Control Message Protocol (ICMPv6) for the Internet Protocol Version 6 (IPv6) Specification.
- RFC 3810 - Multicast Listener Discovery Version 2 (MLDv2) for IPv6
- RFC 9293 - Transmission Control Protocol (TCP)
- RFC 7414 - A Roadmap for Transmission Control Protocol (TCP) Specification Documents
The tygress runtime relies on two core concepts:
- network interface
- async I/O driver
Network interfaces are built slightly differently, based on HardwareType. Below are a list of interface state:
- NeighborCache - Map of IpAddr to EtherAddr, with expiry. EthernetII hardware only. Size will be static, but configurable, and require (expiry-based) garbage collection.
- Ipv4MulticastGroups - Set of multicast Ipv4Addr's.
- IpAddrs - Set of IpAddr's bound to the interface.
- IpFragBuffers - List of buffers used for reassembly of IP fragments. Size will be static, but configurable.
- Routes - Map of Cidr block to IpAddr, with expiry.
- SocketSet - List of open network sockets. Need to determine if this will be an array of enum
or multiple arrays, one per socket type. Sockets will generally need a pair of TX/RX ring buffers.
- ScheduledIO - List of read and write wakers. Accessible by the async I/O driver. Socket's will register themselves with the I/O driver for waking via ScheduledIO.
ARP and NDP serve a similar functionality and will both add entries to a neighbor cache structure. To save space, it may be desirable to make different caching structures. In particular, IPv6 makes entries roughly twice as large:
- Timestamp: 8 bytes
- IPv4 address: 4 bytes
- IPv6 address: 16 bytes
- Ethernet address: 6 bytes
- IEEE 802.15.4 address: 8 bytes
However, these tables contain immediate network neighbors, so they shouldn't get too large (?).