package io import ( "context" ) type Verdict int const ( // VerdictAccept accepts the packet, but continues to process the stream. VerdictAccept Verdict = iota // VerdictAcceptModify is like VerdictAccept, but replaces the packet with a new one. VerdictAcceptModify // VerdictAcceptStream accepts the packet and stops processing the stream. VerdictAcceptStream // VerdictDrop drops the packet, but does not block the stream. VerdictDrop // VerdictDropStream drops the packet and blocks the stream. VerdictDropStream ) // Packet represents an IP packet. type Packet interface { // StreamID is the ID of the stream the packet belongs to. StreamID() uint32 // Data is the raw packet data, starting with the IP header. Data() []byte } // PacketCallback is called for each packet received. // Return false to "unregister" and stop receiving packets. // It must be safe for concurrent use. type PacketCallback func(Packet, error) bool type PacketIO interface { // Register registers a callback to be called for each packet received. // The callback should be called in one or more separate goroutines, // and stop when the context is cancelled. Register(context.Context, PacketCallback) error // SetVerdict sets the verdict for a packet. SetVerdict(Packet, Verdict, []byte) error // Close closes the packet IO. Close() error } type ErrInvalidPacket struct { Err error } func (e *ErrInvalidPacket) Error() string { return "invalid packet: " + e.Err.Error() }