netstack

package
v0.0.0-...-72de509 Latest Latest
Warning

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

Go to latest
Published: Jun 16, 2026 License: MPL-2.0 Imports: 41 Imported by: 0

Documentation

Overview

Package netstack provides the implemention of data-link layer endpoints backed by boundary-preserving file descriptors (e.g., TUN devices, seqpacket/datagram sockets).

Adopted from: github.com/google/gvisor/blob/f33d034/pkg/tcpip/link/fdbased/endpoint.go since fdbased isn't built when building for android (it is only built for linux).

Index

Constants

View Source
const (
	// DirectionSend indicates a sent packet.
	DirectionSend = iota
	// DirectionRecv indicates a received packet.
	DirectionRecv
)
View Source
const SnapLen uint32 = 2048 // in bytes; some sufficient value

SnapLen is the maximum bytes of a packet to be saved. Packets with a length less than or equal to snapLen will be saved in their entirety. Longer packets will be truncated to snapLen. TODO: MTU instead of SnapLen? Must match pcapsink.begin()

Variables

This section is empty.

Functions

func DebugLog

func DebugLog(y bool) (l string)

func HandlerAddrs

func HandlerAddrs(hdl GConnHandler) (ifaddr4 netip.Prefix, ifaddr6 netip.Prefix)

func InboundTCP

func InboundTCP(who string, s *stack.Stack, in net.Conn, to, from netip.AddrPort, h GTCPConnHandler) error

s is the netstack to use for dialing (reads/writes). in is the incoming connection to netstack, s. to (src) is remote. from (dst) is local (to netstack, s). h is the handler that handles connection in into netstack, s, by dialing to from (dst) from to (src).

func InboundUDP

func InboundUDP(who string, s *stack.Stack, in net.Conn, to, from netip.AddrPort, h GUDPConnHandler) error

func LogPacket

func LogPacket(prefix string, dir Direction, protocol tcpip.NetworkProtocolNumber, pkt *stack.PacketBuffer)

LogPacket logs a packet to stdout.

func NewNetstack

func NewNetstack() (s *stack.Stack)

also: github.com/google/gvisor/blob/adbdac747/runsc/boot/loader.go#L1132 github.com/FlowerWrong/tun2socks/blob/1045a49618/cmd/netstack/main.go github.com/zen-of-proxy/go-tun2io/blob/c08b329b8/tun2io/util.go github.com/WireGuard/wireguard-go/blob/42c9af4/tun/netstack/tun.go github.com/telepresenceio/telepresence/pull/2709

func NewReverseGConnHandler

func NewReverseGConnHandler(pctx context.Context, to *stack.Stack, of tcpip.NICID, ep SeamlessEndpoint, via GConnHandler) *gconnhandler

func OutboundICMP

func OutboundICMP(id string, s *stack.Stack, hdl GICMPHandler)

github.com/google/gvisor/blob/738e1d995f/pkg/tcpip/network/ipv4/icmp.go github.com/google/gvisor/blob/738e1d995f/pkg/tcpip/network/ipv6/icmp.go

func OutboundTCP

func OutboundTCP(who string, s *stack.Stack, h GTCPConnHandler)

OutboundTCP sets up a TCP forwarder h to handle TCP packets. If h is nil, s uses the (built-in) default TCP forwarding logic.

func OutboundUDP

func OutboundUDP(who string, s *stack.Stack, h GUDPConnHandler)

OutboundUDP sets up a UDP forwarder h for outbound UDP packets. If h is nil, s uses the (built-in) default UDP forwarding logic.

func Pcap2File

func Pcap2File(y bool) (ok bool)

func Pcap2Stdout

func Pcap2Stdout(y bool) (ok bool)

func PcapModes

func PcapModes() string

PCAP logging modes: - stdout: packets are logged to stdout - file: packets are logged to a file - none: no packets are logged

func Route

func Route(s *stack.Stack, l3 string)

func SetNetstackOpts

func SetNetstackOpts(s *stack.Stack)

func StackAddrs

func StackAddrs(s *stack.Stack, nic tcpip.NICID) (netip.Addr, netip.Addr)

func Stat

func Stat(s *stack.Stack) (out *x.NetStat, err error)

func Up

ref: github.com/brewlin/net-protocol/blob/ec64e5f899/internal/endpoint/endpoint.go#L20

func WritePCAPHeader

func WritePCAPHeader(w io.Writer) error

Types

type DemuxerFn

type DemuxerFn func(in net.Conn, to netip.AddrPort) error

type Direction

type Direction int

A Direction indicates whether the packing is being sent or received.

func (Direction) String

func (dr Direction) String() string

type EpStat

type EpStat struct {
	// Fd is the file descriptor of the endpoint.
	Fd int
	// Alive indicates whether the endpoint is alive.
	Alive bool
	// Age is the age of the endpoint.
	Age string
	// Read is the number of bytes read from the endpoint.
	Read string
	// Written is the number of bytes written to the endpoint.
	Written string
	// LastRead is the last time the endpoint was read from.
	LastRead string
	// LastWrite is the last time the endpoint was written to.
	LastWrite string
}

func (EpStat) String

func (s EpStat) String() string

type FdSwapper

type FdSwapper interface {
	// Swap closes existing FDs; uses new fd.
	Swap(fd, mtu int) error
	// Dispose closes all existing FDs.
	Dispose() error
	// Stat returns EpStat (fd, age, read, written, lastRead, lastWrite).
	Stat() EpStat
}

type GBaseConnHandler

type GBaseConnHandler interface {
	// OpenConns returns the number of active connections.
	OpenConns() string
	// CloseConns closes conns by ids, or all if ids is empty.
	CloseConns([]string) []string
	// end closes the handler and all its connections.
	End()
}

type GConnHandler

type GConnHandler interface {
	Src() []netip.Prefix
	TCP() GTCPConnHandler         // TCP returns the TCP handler.
	UDP() GUDPConnHandler         // UDP returns the UDP handler.
	ICMP() GICMPHandler           // ICMP returns the ICMP handler.
	CloseConns(csv string) string // CloseConns closes the connections with the given IDs, or all if empty.
}

func NewGConnHandler

func NewGConnHandler(addrs []netip.Prefix, tcp GTCPConnHandler, udp GUDPConnHandler, icmp GICMPHandler) GConnHandler

type GEchoConnHandler

type GEchoConnHandler interface {
	// Ping informs if ICMP Echo from src to dst is replied to
	Ping(msg []byte, src, dst netip.AddrPort) bool
}

type GICMPConn

type GICMPConn struct {
	// contains filtered or unexported fields
}

func DialPingAddr

func DialPingAddr(s *stack.Stack, nic tcpip.NICID, laddr, raddr netip.Addr) (*GICMPConn, error)

func (*GICMPConn) Close

func (pc *GICMPConn) Close() error

func (*GICMPConn) LocalAddr

func (pc *GICMPConn) LocalAddr() net.Addr

func (*GICMPConn) Read

func (pc *GICMPConn) Read(p []byte) (n int, err error)

func (*GICMPConn) ReadFrom

func (pc *GICMPConn) ReadFrom(p []byte) (n int, addr net.Addr, err error)

func (*GICMPConn) RemoteAddr

func (pc *GICMPConn) RemoteAddr() net.Addr

func (*GICMPConn) SetDeadline

func (pc *GICMPConn) SetDeadline(t time.Time) error

func (*GICMPConn) SetReadDeadline

func (pc *GICMPConn) SetReadDeadline(t time.Time) error

func (*GICMPConn) SetWriteDeadline

func (pc *GICMPConn) SetWriteDeadline(t time.Time) error

func (*GICMPConn) SyscallConn

func (pc *GICMPConn) SyscallConn() (syscall.RawConn, error)

SyscallConn implements core.ICMPConn.

func (*GICMPConn) Write

func (pc *GICMPConn) Write(p []byte) (n int, err error)

func (*GICMPConn) WriteTo

func (pc *GICMPConn) WriteTo(p []byte, addr net.Addr) (n int, err error)

type GICMPHandler

type GICMPHandler interface {
	GBaseConnHandler
	GEchoConnHandler
}

type GMuxConnHandler

type GMuxConnHandler[T gconns] interface {
	// ProxyMux proxies data between conn and multiple destinations
	// (endpoint-independent mapping).
	ProxyMux(in T, src, dst netip.AddrPort, dmx DemuxerFn) bool
}

type GSpecConnHandler

type GSpecConnHandler[T gconns] interface {
	GBaseConnHandler
	// Proxy copies data between conn and dst (egress).
	// must not block forever as it may block netstack
	// see: netstack/dispatcher.go:newReadvDispatcher
	Proxy(in T, src, dst netip.AddrPort) bool
	// ReverseProxy copies data between conn and dst (ingress).
	ReverseProxy(out T, in net.Conn, src, dst netip.AddrPort) bool
	// Error notes the error in connecting src to dst; retrying if necessary.
	Error(in T, src, dst netip.AddrPort, err error)
}

type GTCPConn

type GTCPConn struct {
	// contains filtered or unexported fields
}

func (*GTCPConn) Abort

func (g *GTCPConn) Abort()

Abort aborts the connection by sending a RST segment.

func (*GTCPConn) Close

func (g *GTCPConn) Close() error

func (*GTCPConn) CloseRead

func (g *GTCPConn) CloseRead() error

func (*GTCPConn) CloseWrite

func (g *GTCPConn) CloseWrite() error

func (*GTCPConn) Establish

func (g *GTCPConn) Establish() (open bool, err error)

func (*GTCPConn) LocalAddr

func (g *GTCPConn) LocalAddr() net.Addr

gonet conn local and remote addresses may be nil ref: github.com/tailscale/tailscale/blob/8c5c87be2/wgengine/netstack/netstack.go#L768-L775 and: github.com/google/gvisor/blob/ffabadf0/pkg/tcpip/transport/tcp/endpoint.go#L2759

func (*GTCPConn) Read

func (g *GTCPConn) Read(data []byte) (int, error)

func (*GTCPConn) RemoteAddr

func (g *GTCPConn) RemoteAddr() net.Addr

func (*GTCPConn) SetDeadline

func (g *GTCPConn) SetDeadline(t time.Time) error

func (*GTCPConn) SetReadDeadline

func (g *GTCPConn) SetReadDeadline(t time.Time) error

func (*GTCPConn) SetWriteDeadline

func (g *GTCPConn) SetWriteDeadline(t time.Time) error

func (*GTCPConn) Write

func (g *GTCPConn) Write(data []byte) (int, error)

type GTCPConnHandler

type GTCPConnHandler interface {
	GSpecConnHandler[*GTCPConn]
}

type GUDPConn

type GUDPConn struct {
	// contains filtered or unexported fields
}

func (*GUDPConn) Close

func (g *GUDPConn) Close() error

Close closes the connection.

func (*GUDPConn) Establish

func (g *GUDPConn) Establish() error

func (*GUDPConn) LocalAddr

func (g *GUDPConn) LocalAddr() (addr net.Addr)

func (*GUDPConn) Read

func (g *GUDPConn) Read(data []byte) (int, error)

func (*GUDPConn) ReadFrom

func (g *GUDPConn) ReadFrom(data []byte) (int, net.Addr, error)

func (*GUDPConn) RemoteAddr

func (g *GUDPConn) RemoteAddr() (addr net.Addr)

func (*GUDPConn) SetDeadline

func (g *GUDPConn) SetDeadline(t time.Time) error

func (*GUDPConn) SetReadDeadline

func (g *GUDPConn) SetReadDeadline(t time.Time) error

func (*GUDPConn) SetWriteDeadline

func (g *GUDPConn) SetWriteDeadline(t time.Time) error

func (*GUDPConn) StatefulTeardown

func (g *GUDPConn) StatefulTeardown() (fin bool)

func (*GUDPConn) Write

func (g *GUDPConn) Write(data []byte) (int, error)

func (*GUDPConn) WriteTo

func (g *GUDPConn) WriteTo(data []byte, addr net.Addr) (int, error)

type GUDPConnHandler

type GUDPConnHandler interface {
	GSpecConnHandler[*GUDPConn]
	GMuxConnHandler[*GUDPConn]
}

type Options

type Options struct {
	// FDs is a set of FDs used to read/write packets.
	FDs []int

	// MTU is the mtu to use for this endpoint.
	MTU uint32

	// EthernetHeader if true, indicates that the endpoint should read/write
	// ethernet frames instead of IP packets.
	EthernetHeader bool

	// Address is the link address for this endpoint. Only used if
	// EthernetHeader is true.
	Address tcpip.LinkAddress

	// SaveRestore if true, indicates that this NIC capability set should
	// include CapabilitySaveRestore
	SaveRestore bool

	// DisconnectOk if true, indicates that this NIC capability set should
	// include CapabilityDisconnectOk.
	DisconnectOk bool

	// TXChecksumOffload if true, indicates that this endpoints capability
	// set should include CapabilityTXChecksumOffload.
	TXChecksumOffload bool

	// RXChecksumOffload if true, indicates that this endpoints capability
	// set should include CapabilityRXChecksumOffload.
	RXChecksumOffload bool

	// If MaxSyscallHeaderBytes is non-zero, it is the maximum number of bytes
	// of struct iovec, msghdr, and mmsghdr that may be passed by each host
	// system call.
	MaxSyscallHeaderBytes int
}

Options specify the details about the fd-based endpoint to be created.

type PingAddr

type PingAddr struct {
	// contains filtered or unexported fields
}

func PingAddrFromAddr

func PingAddrFromAddr(addr netip.Addr) *PingAddr

func (PingAddr) Addr

func (ipp PingAddr) Addr() netip.Addr

func (PingAddr) Network

func (ipp PingAddr) Network() string

func (PingAddr) String

func (ipp PingAddr) String() string

type SeamlessEndpoint

type SeamlessEndpoint interface {
	stack.LinkEndpoint
	FdSwapper
}

func NewEndpoint

func NewEndpoint(dev, mtu int, sink io.WriteCloser) (ep SeamlessEndpoint, err error)

ref: github.com/google/gvisor/blob/91f58d2cc/pkg/tcpip/sample/tun_tcp_echo/main.go#L102

Jump to

Keyboard shortcuts

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