Packet Representations
This module defines the core protocol-level packet structures used by the networking stack. It provides a unified way to serialize and deserialize common protocols (Ethernet, IPv4, TCP, UDP, etc.), with fields and conventions inspired by existing stacks like smoltcp.
It is designed for modular use — each protocol module (ethernet
, ipv4
, tcp
, etc.) exports its own strongly typed representations and conversion methods. Together, they form the backbone for encoding, decoding, and inspecting packet data throughout the stack.
Design Goals
- Protocol Isolation: Each protocol is self-contained and exposes only the relevant fields and logic.
- Structured Parsing: Like smoltcp, packets are parsed from raw byte slices using type-safe structs with field-level accessors.
- Flexible Composition: Designed so higher-level protocols (e.g., TCP over IPv4 over Ethernet) can layer on top of one another cleanly.
Error Handling
Usage for the user should return errors on a failed deserialization. The main way users will interact with the representations is by calling serialize
/deserialize
. This means that when we have a malformed packet, deserialize
should inform the user by returning an Error
.
Protocol Modules
Each protocol is defined in its own file and module, documented below:
ethernet
Represents Ethernet II frames. Includes fields like:
- Destination and source MAC address
- EtherType (IPv4, ARP, etc.)
- Frame payload
arp
Represents ARP packets. Fields include:
- Hardware and protocol type
- Operation (request/reply)
- Sender and target hardware/IP addresses
ipv4
Represents IPv4 packets. Fields include:
- Version, IHL, total length
- Source and destination IP addresses
- Protocol (TCP, UDP, ICMP)
- Payload
icmp
Represents ICMP messages such as:
- Echo request/reply (ping)
- Destination unreachable
- Time exceeded
Provides high-level enums to match against message types.
udp
Represents UDP datagrams, with:
- Source and destination ports
- Length and checksum
- Payload
tcp
Represents TCP segments. Contains:
- Port numbers, sequence/ack numbers
- Control flags (SYN, ACK, FIN, etc.)
- Window size, checksum
- Payload (after header and options)
dns
Represents basic DNS packets, including:
- Header fields (ID, flags, question count, etc.)
- Question and answer sections
- No full parsing of all record types yet (TODO)
http
Simple and incomplete representation of HTTP requests/responses. Useful for debugging or application-level testing.
- Method (GET, POST, etc.)
- Path, headers, body
- Minimal parsing
dhcp
Represents DHCP messages, including:
- Message type (DISCOVER, OFFER, etc.)
- Client hardware address, transaction ID
- Option list
Used during IP address configuration over UDP.
Device Module
The dev
module defines the Device
trait, which provides a consistent interface for sending and receiving raw bytes from network interfaces (e.g., tap0
). It is used by higher-level stack logic to bridge between the OS interface and the packet representations defined here.