default

Inet stack coder for the @binstruct/* packet family.

Examples

Round-trip a UDP-over-IPv4-over-Ethernet frame

import { assert, assertEquals } from "@std/assert";
import { parseAddressv4 } from "@hertzg/ip/addressv4";
import { ETHERTYPE_IPV4 } from "@binstruct/ipv4";
import { IP_PROTOCOL_UDP } from "@binstruct/udp";
import { inetFrame } from "@binstruct/inet";

const value = {
  dstMac: new Uint8Array([0, 0, 0, 0, 0, 1]),
  srcMac: new Uint8Array([0, 0, 0, 0, 0, 2]),
  etherType: ETHERTYPE_IPV4,
  payload: {
    versionIhl: { version: 4, ihl: 5 },
    typeOfService: 0,
    totalLength: 32,
    identification: 0,
    flagsFragmentOffset: { reserved: 0, dontFragment: 0, moreFragments: 0, fragmentOffset: 0 },
    timeToLive: 64,
    protocol: IP_PROTOCOL_UDP,
    headerChecksum: 0,
    sourceAddress: parseAddressv4("192.0.2.1").address,
    destinationAddress: parseAddressv4("192.0.2.2").address,
    options: new Uint8Array(0),
    payload: {
      srcPort: 53,
      dstPort: 49152,
      length: 12,
      checksum: 0,
      payload: new Uint8Array([0xde, 0xad, 0xbe, 0xef]),
    },
  },
};

const coder = inetFrame();
const buf = new Uint8Array(64);
const written = coder.encode(value, buf);
const [decoded] = coder.decode(buf.subarray(0, written));

assert(!(decoded.payload instanceof Uint8Array));
assert("protocol" in decoded.payload);
assert(!(decoded.payload.payload instanceof Uint8Array));
assert("srcPort" in decoded.payload.payload);
assertEquals(decoded.payload.payload.payload, new Uint8Array([0xde, 0xad, 0xbe, 0xef]));

Functions

f
inetFrame(): Coder<FrameRefined>

Creates a composed coder that walks an Ethernet II frame (@binstruct/ethernet) top-down, dispatching the L2.5/L3 payload by etherType and every deeper layer by its own discriminator field. Frames whose tag has no matching coder surface their payload as a raw Uint8Array.

f
internetChecksum(data: Uint8Array): number

Computes the 16-bit Internet checksum (RFC 1071) over a span of bytes.

f
sllInetFrame(): Coder<SllFrameRefined>

Creates a composed coder that walks a Linux cooked capture (SLL v1) header (@binstruct/sll) top-down, dispatching the payload by protocol — the same EtherType-space dispatch inetFrame performs on Ethernet's etherType, reused here via l3Refiners. Payloads whose tag has no matching coder surface as a raw Uint8Array.

Type Aliases

T
ArpFrame = Omit<Frame, "payload"> & { payload: ArpData; }

Ethernet frame whose payload is an Ethernet/IPv4 ARP packet.

T
Ipv4EspPacket = Omit<Ipv4Packet, "payload"> & { payload: EspPacket; }

IPv4 datagram with a typed ESP transport payload.

T
Ipv4Frame = Omit<Frame, "payload"> & { payload: Ipv4Refined; }

Ethernet frame whose payload is a typed IPv4 datagram.

T
Ipv4IcmpPacket = Omit<Ipv4Packet, "payload"> & { payload: IcmpPacket; }

IPv4 datagram with a typed ICMPv4 transport payload.

T
Ipv4IgmpPacket = Omit<Ipv4Packet, "payload"> & { payload: IgmpMessage; }

IPv4 datagram with a typed IGMP transport payload.

T
Ipv4Refined =
Ipv4TcpPacket
| Ipv4UdpPacket
| Ipv4IcmpPacket
| Ipv4IgmpPacket
| Ipv4EspPacket
| Ipv4Packet

Refined IPv4 datagram — payload narrows by shape (TCP / UDP / ICMP / IGMP / ESP / raw bytes) and the host's protocol field is the on-wire discriminator.

T
Ipv4TcpPacket = Omit<Ipv4Packet, "payload"> & { payload: TcpPacket; }

IPv4 datagram with a typed TCP transport payload.

T
Ipv4UdpPacket = Omit<Ipv4Packet, "payload"> & { payload: UdpRefined; }

IPv4 datagram with a typed UDP transport payload.

T
Ipv6EspPacket = Omit<Ipv6Packet, "payload"> & { payload: EspPacket; }

IPv6 packet with a typed ESP transport payload.

T
Ipv6Frame = Omit<Frame, "payload"> & { payload: Ipv6Refined; }

Ethernet frame whose payload is a typed IPv6 packet.

T
T
Ipv6Refined =
Ipv6TcpPacket
| Ipv6UdpPacket
| Ipv6Icmpv6Packet
| Ipv6EspPacket
| Ipv6Packet

Refined IPv6 packet — payload narrows by shape (TCP / UDP / ICMPv6 / ESP / raw bytes) and the host's nextHeader field is the on-wire discriminator.

T
Ipv6TcpPacket = Omit<Ipv6Packet, "payload"> & { payload: TcpPacket; }

IPv6 packet with a typed TCP transport payload.

T
Ipv6UdpPacket = Omit<Ipv6Packet, "payload"> & { payload: UdpRefined; }

IPv6 packet with a typed UDP transport payload.

T
PppoeDiscoveryFrame = Omit<Frame, "payload"> & { payload: PppoeHeader; }

Ethernet frame whose payload is a PPPoE Discovery-stage packet.

T
PppoeSessionFrame = Omit<Frame, "payload"> & { payload: PppoeSessionPacket; }

Ethernet frame whose payload is a PPPoE Session-stage packet.

T
PppoeSessionPacket =
Omit<PppoeHeader, "payload">
& { payload: PppoeSessionRefined; }

PPPoE Session-stage header whose payload is a typed PPP frame.

T
PppoeSessionRefined = PppoeIpv4Frame | PppoeIpv6Frame | PppHost

Refined PPP frame as carried inside a PPPoE Session payload — payload narrows by shape (IPv4 / IPv6 / raw bytes), dispatched by the PPP protocol ID.

T
SllArpFrame = Omit<SllHeader, "payload"> & { payload: ArpData; }

Linux cooked capture (SLL) header whose payload is an ARP packet.

T
SllFrameRefined =
SllIpv4Frame
| SllIpv6Frame
| SllArpFrame
| SllPppoeDiscoveryFrame
| SllPppoeSessionFrame
| SllVlanFrame
| SllHeader

Decoded Linux cooked capture (SLL v1) header as produced by sllInetFrame. Mirrors FrameRefined one layer down — SLL replaces the real link layer with its own fixed header, but dispatches through the exact same l3Refiners arms via protocol in place of Ethernet's etherType.

T
SllIpv4Frame = Omit<SllHeader, "payload"> & { payload: Ipv4Refined; }

Linux cooked capture (SLL) header whose payload is a typed IPv4 datagram.

T
SllIpv6Frame = Omit<SllHeader, "payload"> & { payload: Ipv6Refined; }

Linux cooked capture (SLL) header whose payload is a typed IPv6 packet.

T
SllPppoeDiscoveryFrame = Omit<SllHeader, "payload"> & { payload: PppoeHeader; }

Linux cooked capture (SLL) header whose payload is a PPPoE Discovery-stage packet.

T
SllPppoeSessionFrame =
Omit<SllHeader, "payload">
& { payload: PppoeSessionPacket; }

Linux cooked capture (SLL) header whose payload is a PPPoE Session-stage packet.

T
SllVlanFrame = Omit<SllHeader, "payload"> & { payload: VlanRefined; }

Linux cooked capture (SLL) header whose payload is a typed VLAN tag.

T
UdpNtpPacket = Omit<UdpPacket, "payload"> & { payload: NtpPacket; }

UDP datagram with a typed NTP transport payload.

T
UdpRefined = UdpVxlanPacket | UdpNtpPacket | UdpBfdPacket | UdpPacket

Refined UDP datagram — payload narrows by shape (VXLAN / NTP / BFD / raw bytes), dispatched by destination port (falling back to source port) since UDP carries no in-band type tag. See udpFrame.

T
VlanFrame = Omit<Frame, "payload"> & { payload: VlanRefined; }

Ethernet frame whose payload is a typed VLAN tag.

T
VlanPppoeDiscoveryFrame = Omit<VlanTag, "payload"> & { payload: PppoeHeader; }

VLAN tag with a typed PPPoE Discovery-stage payload.

T
VlanQinQFrame = Omit<VlanTag, "payload"> & { payload: VlanRefinedShallow; }

VLAN tag carrying a single further nested (QinQ) VLAN tag.

T
VlanRefined = VlanQinQFrame | VlanRefinedShallow

Refined VLAN tag — payload narrows by shape (IPv4 / IPv6 / ARP / PPPoE Discovery / PPPoE Session / one further nested VLAN tag / raw bytes), dispatched by the tag's own encapsulated EtherType. This is what vlanFrame``(1) produces, the depth used at every true root (inetFrame, sllInetFrame).

T
VlanRefinedShallow =
VlanIpv4Frame
| VlanIpv6Frame
| VlanArpFrame
| VlanPppoeDiscoveryFrame
| VlanPppoeSessionFrame
| VlanTag

Refined VLAN tag with no further VLAN dispatch available — payload narrows by shape (IPv4 / IPv6 / ARP / PPPoE Discovery / PPPoE Session / raw bytes). This is what vlanFrame``(0) produces: the inner tag of a QinQ pair, which does not itself dispatch a third stacked VLAN tag.

T
VxlanEthernetFrame =
Omit<VxlanHeader, "innerFrame">
& { innerFrame: FrameRefined; }

VXLAN header whose inner frame is a typed Ethernet stack.