Help us shape the future of Go! Take the 2026 Go Developer Survey

batching

package
v1.104.2 Latest Latest
Warning

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

Go to latest
Published: Oct 20, 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