function ipv6Packet
ipv6Packet(): Coder<Ipv6Packet>

Creates a coder for an IPv6 packet's fixed header (RFC 8200) plus whatever follows it.

The payload length is derived from payloadLength (payload.length === payloadLength), so encoding always writes IPV6_HEADER_SIZE + payload.length bytes. payloadLength is not computed for you on encode — set it to payload.length yourself.

No extension-header parsing happens here (see the module docs): a packet whose nextHeader names an extension header still has that header's bytes sitting in payload, undecoded.

Examples

Round-trip a packet carrying a UDP payload

import { assertEquals } from "@std/assert";
import { ipv6Packet, IPV6_HEADER_SIZE, IPV6_NEXT_HEADER } from "@binstruct/ipv6";

const coder = ipv6Packet();
const payload = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);
const packet = {
  versionClassFlow: { version: 6, trafficClass: 0, flowLabel: 0x12345 },
  payloadLength: payload.length,
  nextHeader: IPV6_NEXT_HEADER.UDP,
  hopLimit: 64,
  sourceAddress: new Uint8Array(16).fill(0x11),
  destinationAddress: new Uint8Array(16).fill(0x22),
  payload,
};

const buffer = new Uint8Array(IPV6_HEADER_SIZE + payload.length);
const written = coder.encode(packet, buffer);
const [decoded, read] = coder.decode(buffer.subarray(0, written));

assertEquals(written, IPV6_HEADER_SIZE + payload.length);
assertEquals(read, written);
assertEquals(decoded.versionClassFlow.flowLabel, 0x12345);
assertEquals(decoded.nextHeader, IPV6_NEXT_HEADER.UDP);
assertEquals(decoded.payload, payload);

Decode a known-wire loopback packet with no payload

import { assertEquals } from "@std/assert";
import { ipv6Packet, IPV6_NEXT_HEADER } from "@binstruct/ipv6";

// deno-fmt-ignore
const wire = new Uint8Array([
  0x60, 0x00, 0x00, 0x00, // version=6, trafficClass=0, flowLabel=0
  0x00, 0x00,             // payloadLength = 0
  0x3b,                   // nextHeader = 59 (No Next Header)
  0x40,                   // hopLimit = 64
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // ::1
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, // ::1
]);

const [decoded, read] = ipv6Packet().decode(wire);

assertEquals(read, wire.length);
assertEquals(decoded.versionClassFlow.version, 6);
assertEquals(decoded.payloadLength, 0);
assertEquals(decoded.nextHeader, IPV6_NEXT_HEADER.NO_NEXT_HEADER);
assertEquals(decoded.sourceAddress[15], 1);
assertEquals(decoded.payload.length, 0);

Return Type

Coder<Ipv6Packet>

A coder for Ipv6Packet values.