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.
Round-trip a packet carrying a UDP payload
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
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);
Coder<Ipv6Packet>
A coder for Ipv6Packet values.