func getRecvSource()

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
}