| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 | //go:build (!linux || android) && !e2e_testing && !darwin// +build !linux android// +build !e2e_testing// +build !darwin// udp_generic implements the nebula UDP interface in pure Go stdlib. This// means it can be used on platforms like Darwin and Windows.package udpimport (	"context"	"fmt"	"net"	"net/netip"	"github.com/sirupsen/logrus"	"github.com/slackhq/nebula/config")type GenericConn struct {	*net.UDPConn	l *logrus.Logger}var _ Conn = &GenericConn{}func NewGenericListener(l *logrus.Logger, ip netip.Addr, port int, multi bool, batch int) (Conn, error) {	lc := NewListenConfig(multi)	pc, err := lc.ListenPacket(context.TODO(), "udp", net.JoinHostPort(ip.String(), fmt.Sprintf("%v", port)))	if err != nil {		return nil, err	}	if uc, ok := pc.(*net.UDPConn); ok {		return &GenericConn{UDPConn: uc, l: l}, nil	}	return nil, fmt.Errorf("Unexpected PacketConn: %T %#v", pc, pc)}func (u *GenericConn) WriteTo(b []byte, addr netip.AddrPort) error {	_, err := u.UDPConn.WriteToUDPAddrPort(b, addr)	return err}func (u *GenericConn) LocalAddr() (netip.AddrPort, error) {	a := u.UDPConn.LocalAddr()	switch v := a.(type) {	case *net.UDPAddr:		addr, ok := netip.AddrFromSlice(v.IP)		if !ok {			return netip.AddrPort{}, fmt.Errorf("LocalAddr returned invalid IP address: %s", v.IP)		}		return netip.AddrPortFrom(addr, uint16(v.Port)), nil	default:		return netip.AddrPort{}, fmt.Errorf("LocalAddr returned: %#v", a)	}}func (u *GenericConn) ReloadConfig(c *config.C) {}func NewUDPStatsEmitter(udpConns []Conn) func() {	// No UDP stats for non-linux	return func() {}}type rawMessage struct {	Len uint32}func (u *GenericConn) ListenOut(r EncReader) {	buffer := make([]byte, MTU)	for {		// Just read one packet at a time		n, rua, err := u.ReadFromUDPAddrPort(buffer)		if err != nil {			u.l.WithError(err).Debug("udp socket is closed, exiting read loop")			return		}		r(netip.AddrPortFrom(rua.Addr().Unmap(), rua.Port()), buffer[:n])	}}
 |