in internal/ip/ip.go [234:272]
func getRecvSource(af int, listenPort layers.TCPPort, intf string, logger *log.Logger) (recvSource, error) {
var (
rs recvSource
ipHeaderOffset uint32
)
fd, err := syscall.Socket(af, syscall.SOCK_RAW, syscall.IPPROTO_TCP)
if err != nil {
return rs, err
}
if err = bindToDevice(fd, intf); err != nil {
return rs, err
}
rs.fd = fd
switch af {
case d.AfInet:
ipHeaderOffset = d.IPv4HeaderLength
case d.AfInet6:
ipHeaderOffset = d.IPv6HeaderLength
}
filter, err := getBPFFilter(ipHeaderOffset, uint32(listenPort))
if err != nil {
logger.Warn("Failed to compile BPF Filter", zap.Error(err))
return rs, nil
}
// Attempt to attach the BPF filter.
// This is currently only supported on Linux systems.
if err := rs.attachBPF(filter); err != nil {
logger.Warn("Failed to attach BPF filter to recvSource. All incoming packets will be processed",
zap.Error(err))
}
return rs, nil
}