Documentation ¶
Overview ¶
Package capture provides the high level / central interface definitions for all slimcap capture sources and core structures. Two Interfaces are supported:
- Source : The most general definition of methods any capture source must provide
- SourceZeroCopy : An extended interface definition adding capabilities for zero-copy operations
In addition to the capture source interfaces it provides the most basic implementation of a network packet, including basic interaction methods (e.g. packet length, payload, type, ...).
Index ¶
Constants ¶
const (
// PacketHdrOffset denotes the header offset / length for storing information about the packet
PacketHdrOffset = 6
)
Variables ¶
var ( // ErrCaptureStopped denotes that the capture was stopped ErrCaptureStopped = errors.New("capture was stopped") // ErrCaptureUnblocked denotes that the capture received an unblocking signal ErrCaptureUnblocked = errors.New("capture was released / unblocked") )
Functions ¶
This section is empty.
Types ¶
type IPLayer ¶
type IPLayer []byte
IPLayer denotes the subset of bytes representing an IP layer
type Packet ¶
type Packet []byte
Packet denotes a packet retrieved via the AF_PACKET ring buffer, [Fulfils the capture.Packet interface] [0:1] - Packet Type [1:2] - IP Layer Offset [2:6] - Total packet length
func BuildPacket ¶
func BuildPacket(sip, dip net.IP, sport, dport uint16, proto byte, addPayload []byte, pktType PacketType, totalLen int) (Packet, error)
BuildPacket provides basic capabilities to construct packets (e.g. for testing purposes)
func NewIPPacket ¶
func NewIPPacket(buf Packet, payload []byte, pktType PacketType, totalLen int, ipLayerOffset byte) Packet
NewIPPacket instantiates a new IP packet from a given payload and packet type / length
func (*Packet) IPLayerOffset ¶
IPLayerOffset returns the offset of the IP layer of the packet (w.r.t. its beginning)
func (*Packet) Len ¶
Len returns the actual data length of the packet payload as consumed from the wire (may be truncated due to)
func (*Packet) Type ¶
func (p *Packet) Type() PacketType
Type denotes the packet type (i.e. the packet direction w.r.t. the interface)
type PacketType ¶
type PacketType = byte
PacketType denotes the packet type (indicating traffic direction) https://github.com/torvalds/linux/blob/master/include/uapi/linux/if_packet.h
const ( PacketThisHost PacketType = iota // PacketThisHost : To us (unicast) PacketBroadcast // PacketBroadcast : To all PacketMulticast // PacketMulticast : To group PacketOtherHost // PacketOtherHost : To someone else PacketOutgoing // PacketOutgoing : Outgoing of any type PacketUnknown PacketType = 255 // PacketUnknown : Unknown packet type / direction )
type Source ¶
type Source interface { // NewPacket creates an empty "buffer" packet to be used as destination for the NextPacket() / NextPayload() / // NextIPPacket() methods (the latter two by calling .Payload() / .IPLayer() on the created buffer). It ensures // that a valid packet of appropriate structure / length is created NewPacket() Packet // NextPacket receives the next packet from the source and returns it. The operation is blocking. In // case a non-nil "buffer" Packet is provided it will be populated with the data (and returned). The // buffer packet can be reused. Otherwise a new Packet is allocated. NextPacket(pBuf Packet) (Packet, error) // NextPayload receives the raw payload of the next packet from the source and returns it. The operation is blocking. // In case a non-nil "buffer" byte slice / payload is provided it will be populated with the data (and returned). // The buffer can be reused. Otherwise a new byte slice / payload is allocated. NextPayload(pBuf []byte) ([]byte, byte, uint32, error) // NextIPPacket receives the IP layer of the next packet from the source and returns it. The operation is blocking. // In case a non-nil "buffer" IPLayer is provided it will be populated with the data (and returned). // The buffer can be reused. Otherwise a new IPLayer is allocated. NextIPPacket(pBuf IPLayer) (IPLayer, PacketType, uint32, error) // NextPacketFn executes the provided function on the next packet received on the source. If possible, the // operation should provide a zero-copy way of interaction with the payload / metadata. All operations on the data // must be completed prior to any subsequent call to any Next*() method. NextPacketFn(func(payload []byte, totalLen uint32, pktType PacketType, ipLayerOffset byte) error) error // Stats returns (and clears) the packet counters of the underlying source Stats() (Stats, error) // Link returns the underlying link Link() *link.Link // Unblock ensures that a potentially ongoing blocking poll operation is released (returning an ErrCaptureUnblock from // any potentially ongoing call to Next*() that might currently be blocked) Unblock() error // Close stops / closes the capture source Close() error }
Source denotes a generic packet capture source
type SourceZeroCopy ¶
type SourceZeroCopy interface { // NextPayloadZeroCopy receives the raw payload of the next packet from the source and returns it. The operation is blocking. // The returned payload provides direct zero-copy access to the underlying data source (e.g. a ring buffer). NextPayloadZeroCopy() ([]byte, PacketType, uint32, error) // NextIPPacketZeroCopy receives the IP layer of the next packet from the source and returns it. The operation is blocking. // The returned IPLayer provides direct zero-copy access to the underlying data source (e.g. a ring buffer). NextIPPacketZeroCopy() (IPLayer, PacketType, uint32, error) // Wrap generic Source Source }
SourceZeroCopy denotes a generic packet capture source that supports zero-copy operations
Directories ¶
Path | Synopsis |
---|---|
Package afpacket implements a capture.Source that allows reading network packets from Linux network interfaces via the AF_PACKET mechanism.
|
Package afpacket implements a capture.Source that allows reading network packets from Linux network interfaces via the AF_PACKET mechanism. |
afring
Package afring implements a capture.Source and a capture.SourceZeroCopy that allows reading network packets from Linux network interfaces via the AF_PACKET / TPacket ring buffer mechanism.
|
Package afring implements a capture.Source and a capture.SourceZeroCopy that allows reading network packets from Linux network interfaces via the AF_PACKET / TPacket ring buffer mechanism. |
socket
Package socket implements AF_PACKET sockets / file descriptors (both for `afring` and plain `afpacket` modes).
|
Package socket implements AF_PACKET sockets / file descriptors (both for `afring` and plain `afpacket` modes). |
Package pcap allows reading / parsing pcap files (compressed and uncompressed) and implement the capture.Source interface.
|
Package pcap allows reading / parsing pcap files (compressed and uncompressed) and implement the capture.Source interface. |