mirror of
https://github.com/slackhq/nebula.git
synced 2026-02-14 16:54:22 +01:00
54 lines
1.6 KiB
Go
54 lines
1.6 KiB
Go
package overlay
|
|
|
|
import (
|
|
"io"
|
|
"net/netip"
|
|
|
|
"github.com/slackhq/nebula/routing"
|
|
)
|
|
|
|
type Device interface {
|
|
io.ReadWriteCloser
|
|
Activate() error
|
|
Networks() []netip.Prefix
|
|
Name() string
|
|
RoutesFor(netip.Addr) routing.Gateways
|
|
SupportsMultiqueue() bool
|
|
NewMultiQueueReader() (io.ReadWriteCloser, error)
|
|
}
|
|
|
|
// BatchReader is an optional interface that devices can implement
|
|
// to support reading multiple packets in a single batch operation.
|
|
// This can significantly reduce syscall overhead under high load.
|
|
type BatchReader interface {
|
|
// ReadBatch reads up to len(packets) packets into the provided buffers.
|
|
// Each packet is read into packets[i] and its length is stored in sizes[i].
|
|
// Returns the number of packets read, or an error.
|
|
// A return of (0, nil) indicates no packets were available (non-blocking).
|
|
ReadBatch(packets [][]byte, sizes []int) (int, error)
|
|
}
|
|
|
|
// AsBatchReader returns a BatchReader if the reader supports batch operations,
|
|
// otherwise returns nil.
|
|
func AsBatchReader(r io.ReadWriteCloser) BatchReader {
|
|
if br, ok := r.(BatchReader); ok {
|
|
return br
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// BatchEnabler is an optional interface for devices that need explicit
|
|
// enabling of batch read support (e.g., setting non-blocking mode).
|
|
type BatchEnabler interface {
|
|
EnableBatchReading() error
|
|
}
|
|
|
|
// EnableBatchReading enables batch reading on the device if supported.
|
|
// Returns nil if the device doesn't support or need explicit enabling.
|
|
func EnableBatchReading(d interface{}) error {
|
|
if be, ok := d.(BatchEnabler); ok {
|
|
return be.EnableBatchReading()
|
|
}
|
|
return nil
|
|
}
|