wire

package
v0.0.0-...-602bb2d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 19, 2026 License: MPL-2.0 Imports: 10 Imported by: 0

Documentation

Index

Constants

View Source
const (
	Version4 = 4
	Version6 = 6
)

Valid Version values.

View Source
const IP4HeaderLength = 20

IP4HeaderLength is the length of an IPv4 header with no IP options.

View Source
const IP4SrcAddrOffset = 12
View Source
const IP6HeaderLength = 40

IP6HeaderLength is the length of an IPv6 header with no IP options.

View Source
const IP6SrcAddrOffset = 9
View Source
const MinTCPHeaderSize = 20

Variables

View Source
var (
	// PreferredNames is the set of protocol names that re produced by
	// MarshalText, and are the preferred representation.
	PreferredNames = map[Proto]string{
		51:     "ah",
		DCCP:   "dccp",
		8:      "egp",
		50:     "esp",
		47:     "gre",
		ICMPv4: "icmp",
		IGMP:   "igmp",
		9:      "igp",
		4:      "ipv4",
		ICMPv6: "ipv6-icmp",
		SCTP:   "sctp",
		TCP:    "tcp",
		UDP:    "udp",
	}

	// AcceptedNames is the set of protocol names that are accepted by
	// UnmarshalText.
	AcceptedNames = map[string]Proto{
		"ah":        51,
		"dccp":      DCCP,
		"egp":       8,
		"esp":       50,
		"gre":       47,
		"icmp":      ICMPv4,
		"icmpv4":    ICMPv4,
		"icmpv6":    ICMPv6,
		"igmp":      IGMP,
		"igp":       9,
		"ip-in-ip":  4,
		"ipv4":      4,
		"ipv6-icmp": ICMPv6,
		"sctp":      SCTP,
		"tcp":       TCP,
		"tsmp":      TSMP,
		"udp":       UDP,
	}
)

Prefer names from https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml unless otherwise noted.

View Source
var Pool = ParsedPool{New: func() any { return new(Parsed) }}

Pool holds a pool of Parsed structs for use in filtering.

Functions

func Generate

func Generate(h Header, payload []byte) []byte

Generate generates a new packet with the given Header and payload. This function allocates memory, see Header.Marshal for an allocation-free option.

func Hexdump

func Hexdump(b []byte) string

func UpdateDstAddr

func UpdateDstAddr(q *Parsed, dst netip.Addr)

UpdateDstAddr updates the destination address in the packet buffer (e.g. during DNAT). It also updates the checksum. Currently (2022-12-10) only TCP/UDP/ICMP is supported. It panics if provided with an address in a different family to the parsed packet.

func UpdateSrcAddr

func UpdateSrcAddr(q *Parsed, src netip.Addr)

UpdateSrcAddr updates the source address in the packet buffer (e.g. during SNAT). It also updates the checksum. Currently (2023-09-22) only TCP/UDP/ICMP is supported. It panics if provided with an address in a different family to the parsed packet.

Types

type CaptureMeta

type CaptureMeta struct {
	DidSNAT     bool           // SNAT was performed & the address was updated.
	OriginalSrc netip.AddrPort // The source address before SNAT was performed.
	DidDNAT     bool           // DNAT was performed & the address was updated.
	OriginalDst netip.AddrPort // The destination address before DNAT was performed.
}

CaptureMeta contains metadata that is used when debugging.

type Header interface {
	// Len returns the length of the marshaled packet.
	Len() int
	// Marshal serializes the header into buf, which must be at
	// least Len() bytes long. Implementations of Marshal assume
	// that bytes after the first Len() are payload bytes for the
	// purpose of computing length and checksum fields. Marshal
	// implementations must not allocate memory.
	Marshal(buf []byte) error
}

Header is a packet header capable of marshaling itself into a byte buffer.

type HeaderChecksummer

type HeaderChecksummer interface {
	Header

	// WriteCheck writes the correct checksum into buf, which should
	// be be the already-marshalled header and payload.
	WriteChecksum(buf []byte)
}

HeaderChecksummer is implemented by Header implementations that need to do a checksum over their payloads.

type ICMP4Code

type ICMP4Code uint8

ICMP4Code is an ICMPv4 code, as specified in https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml

const (
	ICMP4NoCode          ICMP4Code = 0
	ICMP4HostUnreachable ICMP4Code = 1
)

type ICMP4Header

type ICMP4Header struct {
	IP4Header
	Type ICMP4Type
	Code ICMP4Code
}

ICMP4Header is an IPv4+ICMPv4 header.

func (ICMP4Header) Len

func (h ICMP4Header) Len() int

Len implements Header.

func (ICMP4Header) Marshal

func (h ICMP4Header) Marshal(buf []byte) error

Marshal implements Header.

func (ICMP4Header) Stringer

func (h ICMP4Header) Stringer() string

func (*ICMP4Header) ToResponse

func (h *ICMP4Header) ToResponse()

ToResponse implements Header. TODO: it doesn't implement it correctly, instead it statically generates an ICMP Echo Reply packet.

type ICMP4Type

type ICMP4Type uint8

ICMP4Type is an ICMPv4 type, as specified in https://www.iana.org/assignments/icmp-parameters/icmp-parameters.xhtml

const (
	ICMP4EchoReply    ICMP4Type = 0x00
	ICMP4EchoRequest  ICMP4Type = 0x08
	ICMP4Unreachable  ICMP4Type = 0x03
	ICMP4TimeExceeded ICMP4Type = 0x0b
	ICMP4ParamProblem ICMP4Type = 0x12
)

func (ICMP4Type) String

func (t ICMP4Type) String() string

type ICMP6Code

type ICMP6Code uint8

ICMP6Code is an ICMPv6 code, as specified in https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml

const (
	ICMP6NoCode  ICMP6Code = 0
	ICMP6NoRoute ICMP6Code = 0 // code 0: no route to destination
)

type ICMP6Header

type ICMP6Header struct {
	IP6Header
	Type ICMP6Type
	Code ICMP6Code
}

ICMP6Header is an IPv4+ICMPv4 header.

func (ICMP6Header) Len

func (h ICMP6Header) Len() int

Len implements Header.

func (ICMP6Header) Marshal

func (h ICMP6Header) Marshal(buf []byte) error

Marshal implements Header.

func (ICMP6Header) Stringer

func (h ICMP6Header) Stringer() string

func (*ICMP6Header) ToResponse

func (h *ICMP6Header) ToResponse()

ToResponse implements Header. TODO: it doesn't implement it correctly, instead it statically generates an ICMP Echo Reply packet.

func (ICMP6Header) WriteChecksum

func (h ICMP6Header) WriteChecksum(p []byte)

WriteChecksum implements HeaderChecksummer, writing just the checksum bytes into the otherwise fully marshaled ICMP6 packet p (which should include the IPv6 header, ICMPv6 header, and payload).

type ICMP6Type

type ICMP6Type uint8

ICMP6Type is an ICMPv6 type, as specified in https://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xhtml

const (
	ICMP6Unreachable  ICMP6Type = 1
	ICMP6PacketTooBig ICMP6Type = 2
	ICMP6TimeExceeded ICMP6Type = 3
	ICMP6ParamProblem ICMP6Type = 4
	ICMP6EchoRequest  ICMP6Type = 128
	ICMP6EchoReply    ICMP6Type = 129
)

func (ICMP6Type) String

func (t ICMP6Type) String() string

type IP4Header

type IP4Header struct {
	IPProto Proto
	IPID    uint16
	Src     netip.Addr
	Dst     netip.Addr
}

IP4Header represents an IPv4 packet header.

func (IP4Header) Len

func (h IP4Header) Len() int

Len implements Header.

func (IP4Header) Marshal

func (h IP4Header) Marshal(buf []byte) error

Marshal implements Header.

func (*IP4Header) ToResponse

func (h *IP4Header) ToResponse()

ToResponse implements Header.

type IP6Header

type IP6Header struct {
	IPProto Proto
	IPID    uint32 // only lower 20 bits used
	Src     netip.Addr
	Dst     netip.Addr
}

IP6Header represents an IPv6 packet header.

func (IP6Header) Len

func (h IP6Header) Len() int

Len implements Header.

func (IP6Header) Marshal

func (h IP6Header) Marshal(buf []byte) error

Marshal implements Header.

func (*IP6Header) ToResponse

func (h *IP6Header) ToResponse()

ToResponse implements Header.

type Parsed

type Parsed struct {

	// IPVersion is the IP protocol version of the packet (4 or
	// 6), or 0 if the packet doesn't look like IPv4 or IPv6.
	IPVersion uint8
	// IPProto is the IP subprotocol (UDP, TCP, etc.). Valid iff IPVersion != 0.
	IPProto Proto
	// Src is the source address. Family matches IPVersion. Port is
	// valid iff IPProto == TCP || IPProto == UDP || IPProto == SCTP.
	Src netip.AddrPort
	// Dst is the destination address. Family matches IPVersion. Port is
	// valid iff IPProto == TCP || IPProto == UDP || IPProto == SCTP.
	Dst netip.AddrPort
	// TCPFlags is the packet's TCP flag bits. Valid iff IPProto == TCP.
	TCPFlags TCPFlag

	// CaptureMeta contains metadata that is used when debugging.
	CaptureMeta CaptureMeta
	// contains filtered or unexported fields
}

Parsed is a minimal decoding of a packet suitable for use in filters.

func (*Parsed) Buffer

func (q *Parsed) Buffer() []byte

Buffer returns the entire packet buffer. This is a read-only view; that is, q retains the ownership of the buffer.

func (*Parsed) Decode

func (q *Parsed) Decode(b []byte)

func (*Parsed) DecodeTrunc

func (q *Parsed) DecodeTrunc(b []byte, trunc bool)

func (*Parsed) EchoIDSeq

func (q *Parsed) EchoIDSeq() uint32

EchoIDSeq extracts the identifier/sequence bytes from an ICMP Echo response, and returns them as a uint32, used to lookup internally routed ICMP echo responses. This function is intentionally lightweight as it is called on every incoming ICMP packet.

func (*Parsed) HasTransportData

func (p *Parsed) HasTransportData() bool

func (*Parsed) ICMP4Header

func (q *Parsed) ICMP4Header() ICMP4Header

func (*Parsed) ICMP6Header

func (q *Parsed) ICMP6Header() ICMP6Header

func (*Parsed) ICMPHeaderString

func (q *Parsed) ICMPHeaderString() string

func (*Parsed) IP4Header

func (q *Parsed) IP4Header() IP4Header

func (*Parsed) IP6Header

func (q *Parsed) IP6Header() IP6Header

func (*Parsed) IsEchoRequest

func (q *Parsed) IsEchoRequest() bool

IsEchoRequest reports whether q is an ICMP Echo Request.

func (*Parsed) IsEchoResponse

func (q *Parsed) IsEchoResponse() bool

IsEchoResponse reports whether q is an IPv4 ICMP Echo Response.

func (*Parsed) IsError

func (q *Parsed) IsError() bool

IsError reports whether q is an ICMP "Error" packet.

func (*Parsed) IsTCPSyn

func (q *Parsed) IsTCPSyn() bool

IsTCPSyn reports whether q is a TCP SYN packet, without ACK set. (i.e. the first packet in a new connection)

func (*Parsed) Payload

func (q *Parsed) Payload() ([]byte, bool)

Payload returns the payload of the IP subprotocol section. This is a read-only view; that is, q retains the ownership of the buffer.

func (*Parsed) String

func (p *Parsed) String() string

func (*Parsed) Transport

func (p *Parsed) Transport() []byte

Transport returns the transport header and payload (IP subprotocol, such as TCP or UDP). This is a read-only view; that is, p retains the ownership of the buffer.

func (*Parsed) UDP4Header

func (q *Parsed) UDP4Header() UDP4Header

type ParsedPool

type ParsedPool sync.Pool

func (*ParsedPool) Get

func (p *ParsedPool) Get() *Parsed

func (*ParsedPool) Put

func (p *ParsedPool) Put(parsed *Parsed)

type Proto

type Proto uint8

Proto is an IP subprotocol as defined by the IANA protocol numbers list (https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml), or the special values Unknown or Fragment.

const (
	// Unknown represents an unknown or unsupported protocol; it's
	// deliberately the zero value. Strictly speaking the zero
	// value is IPv6 hop-by-hop extensions, but we don't support
	// those, so this is still technically correct.
	UnknownProto Proto = 0x00

	// Values from the IANA registry.
	ICMPv4 Proto = 0x01
	IGMP   Proto = 0x02
	ICMPv6 Proto = 0x3a
	TCP    Proto = 0x06
	UDP    Proto = 0x11
	DCCP   Proto = 0x21
	GRE    Proto = 0x2f
	SCTP   Proto = 0x84

	// TSMP is the Tailscale Message Protocol (our ICMP-ish
	// thing), an IP protocol used only between Tailscale nodes
	// (still encrypted by WireGuard) that communicates why things
	// failed, etc.
	//
	// Proto number 99 is reserved for "any private encryption
	// scheme". We never accept these from the host OS stack nor
	// send them to the host network stack. It's only used between
	// nodes.
	TSMP Proto = 99

	// Fragment represents any non-first IP fragment, for which we
	// don't have the sub-protocol header (and therefore can't
	// figure out what the sub-protocol is).
	//
	// 0xFF is reserved in the IANA registry, so we steal it for
	// internal use.
	Fragment Proto = 0xFF
)

func (Proto) String deprecated

func (p Proto) String() string

Deprecated: use MarshalText instead.

type TCPFlag

type TCPFlag uint8
const (
	TCPFlagsOffset = 13

	TCPFin     TCPFlag = 0x01
	TCPSyn     TCPFlag = 0x02
	TCPRst     TCPFlag = 0x04
	TCPPsh     TCPFlag = 0x08
	TCPAck     TCPFlag = 0x10
	TCPUrg     TCPFlag = 0x20
	TCPECNEcho TCPFlag = 0x40
	TCPCWR     TCPFlag = 0x80
	TCPSynAck  TCPFlag = TCPSyn | TCPAck
	TCPECNBits TCPFlag = TCPECNEcho | TCPCWR
)

type UDP4Header

type UDP4Header struct {
	IP4Header
	SrcPort uint16
	DstPort uint16
}

UDP4Header is an IPv4+UDP header.

func (UDP4Header) Len

func (h UDP4Header) Len() int

Len implements Header.

func (UDP4Header) Marshal

func (h UDP4Header) Marshal(buf []byte) error

Marshal implements Header.

func (*UDP4Header) ToResponse

func (h *UDP4Header) ToResponse()

ToResponse implements Header.

type UDP6Header

type UDP6Header struct {
	IP6Header
	SrcPort uint16
	DstPort uint16
}

UDP6Header is an IPv6+UDP header.

func (UDP6Header) Len

func (h UDP6Header) Len() int

Len implements Header.

func (UDP6Header) Marshal

func (h UDP6Header) Marshal(buf []byte) error

Marshal implements Header.

func (*UDP6Header) ToResponse

func (h *UDP6Header) ToResponse()

ToResponse implements Header.

type Version

type Version uint8

Version describes the IP address version.

func (Version) String

func (p Version) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL