batching

package
v1.105.0-pre Latest Latest
Warning

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

Go to latest
Published: Sep 30, 2026 License: BSD-3-Clause Imports: 23 Imported by: 2

Documentation

Overview

Package batching implements a socket optimized for increased throughput.

Index

Constants

View Source
const (
	// ReadSlabMultiple is the minimum slab length accepted by [Conn.ReadBatch],
	// and is the suggested multiple when passing a larger value.
	ReadSlabMultiple = 1<<16 - 1
	// MinimumReadBatchSize is the minimum number of packets descriptors accepted
	// by [Conn.ReadBatch].
	MinimumReadBatchSize = udpGROCountMax
	// MaximumWriteBatchSize is the maximum number of buffs accepted by
	// [Conn.WriteBatchTo].
	MaximumWriteBatchSize = 128
)

Variables

This section is empty.

Functions

func TryUpgradeToConn

func TryUpgradeToConn(pconn nettype.PacketConn, network string, rxqOverflowsMetricName string, knobs *controlknobs.Knobs) nettype.PacketConn

TryUpgradeToConn probes the capabilities of the OS and pconn, and upgrades pconn to a Conn if appropriate. If len(rxqOverflowsMetricName) is nonzero, then read ops will propagate the SO_RXQ_OVFL control message counter to a clientmetric with the supplied name. If knobs is non-nil, UDP GSO and/or UDP GRO may be disabled via control-plane node attributes.

Types

type Conn

type Conn interface {
	nettype.PacketConn
	// ReadFromUDPAddrPort always returns an error, as UDP GRO is incompatible
	// with single packet reads. A single datagram may be multiple, coalesced
	// datagrams, and this API lacks the ability to pass that context.
	//
	// TODO: consider detaching Conn from [nettype.PacketConn]
	ReadFromUDPAddrPort([]byte) (int, netip.AddrPort, error)
	// ReadBatch reads datagrams from [Conn] into slab, and describes them in
	// packets. It returns the number of populated packet descriptors. A single
	// GRO-coalesced datagram may produce multiple descriptors.
	//
	// packets must have a length >= [MinimumReadBatchSize]. slab must have a
	// length >= [ReadSlabMultiple]. ReadBatch reads only as many datagrams as
	// both arguments can accommodate.
	ReadBatch(slab []byte, packets []ReceivedPacket) (n int, err error)
	// WriteBatchTo writes buffs to addr.
	//
	// If geneve.VNI.IsSet(), then geneve is encoded into the space preceding
	// offset, and offset must equal [packet.GeneveFixedHeaderLength]. If
	// !geneve.VNI.IsSet() then the space preceding offset is ignored.
	//
	// len(buffs) must be <= [MaximumWriteBatchSize].
	//
	// WriteBatchTo may return a [neterror.ErrUDPGSODisabled] error if UDP GSO
	// was disabled as a result of a send error.
	WriteBatchTo(buffs [][]byte, addr netip.AddrPort, geneve packet.GeneveHeader, offset int) error
}

Conn is a nettype.PacketConn that provides batched i/o using platform-specific optimizations, e.g. {recv,send}mmsg & UDP GSO/GRO.

Conn does not support single packet reads (see ReadFromUDPAddrPort docs). It is the caller's responsibility to use the appropriate read API where a nettype.PacketConn has been upgraded to support batched i/o.

Conn originated from (and is still used by) magicsock where its API was strongly influenced by wireguard-go/conn.Bind constraints, namely wireguard-go's ownership of packet memory.

type ReceivedPacket added in v1.104.0

type ReceivedPacket struct {
	// Offset is the starting byte offset into the slab supplied to [Conn.ReadBatch].
	Offset int
	// Size is the size of the packet.
	Size int
	// Source is the source address that sent the packet.
	Source netip.AddrPort
}

ReceivedPacket describes a packet read by Conn.ReadBatch.

Jump to

Keyboard shortcuts

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