From 3bbf5f4e6746bb19e433b7e7978a43b0b94e6433 Mon Sep 17 00:00:00 2001 From: Nate Brown Date: Wed, 14 Jun 2023 10:48:52 -0500 Subject: [PATCH] Use an interface for udp conns (#901) --- connection_manager_test.go | 12 ++++++------ control_tester.go | 12 ++++++------ handshake_manager.go | 4 ++-- handshake_manager_test.go | 2 +- interface.go | 10 +++++----- lighthouse.go | 4 ++-- main.go | 2 +- udp/conn.go | 27 +++++++++++++++++++++++++++ udp/udp_android.go | 2 +- udp/udp_darwin.go | 2 +- udp/udp_freebsd.go | 2 +- udp/udp_generic.go | 20 ++++++++++---------- udp/udp_linux.go | 36 ++++++++++++++++++------------------ udp/udp_linux_32.go | 2 +- udp/udp_linux_64.go | 2 +- udp/udp_tester.go | 22 +++++++++++----------- udp/udp_windows.go | 2 +- 17 files changed, 95 insertions(+), 68 deletions(-) diff --git a/connection_manager_test.go b/connection_manager_test.go index 3a25611..bfe57c8 100644 --- a/connection_manager_test.go +++ b/connection_manager_test.go @@ -54,10 +54,10 @@ func Test_NewConnectionManagerTest(t *testing.T) { ifce := &Interface{ hostMap: hostMap, inside: &test.NoopTun{}, - outside: &udp.Conn{}, + outside: &udp.NoopConn{}, firewall: &Firewall{}, lightHouse: lh, - handshakeManager: NewHandshakeManager(l, vpncidr, preferredRanges, hostMap, lh, &udp.Conn{}, defaultHandshakeConfig), + handshakeManager: NewHandshakeManager(l, vpncidr, preferredRanges, hostMap, lh, &udp.NoopConn{}, defaultHandshakeConfig), l: l, } ifce.certState.Store(cs) @@ -133,10 +133,10 @@ func Test_NewConnectionManagerTest2(t *testing.T) { ifce := &Interface{ hostMap: hostMap, inside: &test.NoopTun{}, - outside: &udp.Conn{}, + outside: &udp.NoopConn{}, firewall: &Firewall{}, lightHouse: lh, - handshakeManager: NewHandshakeManager(l, vpncidr, preferredRanges, hostMap, lh, &udp.Conn{}, defaultHandshakeConfig), + handshakeManager: NewHandshakeManager(l, vpncidr, preferredRanges, hostMap, lh, &udp.NoopConn{}, defaultHandshakeConfig), l: l, } ifce.certState.Store(cs) @@ -252,10 +252,10 @@ func Test_NewConnectionManagerTest_DisconnectInvalid(t *testing.T) { ifce := &Interface{ hostMap: hostMap, inside: &test.NoopTun{}, - outside: &udp.Conn{}, + outside: &udp.NoopConn{}, firewall: &Firewall{}, lightHouse: lh, - handshakeManager: NewHandshakeManager(l, vpncidr, preferredRanges, hostMap, lh, &udp.Conn{}, defaultHandshakeConfig), + handshakeManager: NewHandshakeManager(l, vpncidr, preferredRanges, hostMap, lh, &udp.NoopConn{}, defaultHandshakeConfig), l: l, disconnectInvalid: true, caPool: ncp, diff --git a/control_tester.go b/control_tester.go index 48deb13..340ba1c 100644 --- a/control_tester.go +++ b/control_tester.go @@ -21,7 +21,7 @@ import ( func (c *Control) WaitForType(msgType header.MessageType, subType header.MessageSubType, pipeTo *Control) { h := &header.H{} for { - p := c.f.outside.Get(true) + p := c.f.outside.(*udp.TesterConn).Get(true) if err := h.Parse(p.Data); err != nil { panic(err) } @@ -37,7 +37,7 @@ func (c *Control) WaitForType(msgType header.MessageType, subType header.Message func (c *Control) WaitForTypeByIndex(toIndex uint32, msgType header.MessageType, subType header.MessageSubType, pipeTo *Control) { h := &header.H{} for { - p := c.f.outside.Get(true) + p := c.f.outside.(*udp.TesterConn).Get(true) if err := h.Parse(p.Data); err != nil { panic(err) } @@ -90,11 +90,11 @@ func (c *Control) GetFromTun(block bool) []byte { // GetFromUDP will pull a udp packet off the udp side of nebula func (c *Control) GetFromUDP(block bool) *udp.Packet { - return c.f.outside.Get(block) + return c.f.outside.(*udp.TesterConn).Get(block) } func (c *Control) GetUDPTxChan() <-chan *udp.Packet { - return c.f.outside.TxPackets + return c.f.outside.(*udp.TesterConn).TxPackets } func (c *Control) GetTunTxChan() <-chan []byte { @@ -103,7 +103,7 @@ func (c *Control) GetTunTxChan() <-chan []byte { // InjectUDPPacket will inject a packet into the udp side of nebula func (c *Control) InjectUDPPacket(p *udp.Packet) { - c.f.outside.Send(p) + c.f.outside.(*udp.TesterConn).Send(p) } // InjectTunUDPPacket puts a udp packet on the tun interface. Using UDP here because it's a simpler protocol @@ -143,7 +143,7 @@ func (c *Control) GetVpnIp() iputil.VpnIp { } func (c *Control) GetUDPAddr() string { - return c.f.outside.Addr.String() + return c.f.outside.(*udp.TesterConn).Addr.String() } func (c *Control) KillPendingTunnel(vpnIp net.IP) bool { diff --git a/handshake_manager.go b/handshake_manager.go index b02fb28..02b27bb 100644 --- a/handshake_manager.go +++ b/handshake_manager.go @@ -45,7 +45,7 @@ type HandshakeManager struct { pendingHostMap *HostMap mainHostMap *HostMap lightHouse *LightHouse - outside *udp.Conn + outside udp.Conn config HandshakeConfig OutboundHandshakeTimer *LockingTimerWheel[iputil.VpnIp] messageMetrics *MessageMetrics @@ -57,7 +57,7 @@ type HandshakeManager struct { trigger chan iputil.VpnIp } -func NewHandshakeManager(l *logrus.Logger, tunCidr *net.IPNet, preferredRanges []*net.IPNet, mainHostMap *HostMap, lightHouse *LightHouse, outside *udp.Conn, config HandshakeConfig) *HandshakeManager { +func NewHandshakeManager(l *logrus.Logger, tunCidr *net.IPNet, preferredRanges []*net.IPNet, mainHostMap *HostMap, lightHouse *LightHouse, outside udp.Conn, config HandshakeConfig) *HandshakeManager { return &HandshakeManager{ pendingHostMap: NewHostMap(l, "pending", tunCidr, preferredRanges), mainHostMap: mainHostMap, diff --git a/handshake_manager_test.go b/handshake_manager_test.go index 3e39e48..612ea44 100644 --- a/handshake_manager_test.go +++ b/handshake_manager_test.go @@ -23,7 +23,7 @@ func Test_NewHandshakeManagerVpnIp(t *testing.T) { mainHM := NewHostMap(l, "test", vpncidr, preferredRanges) lh := newTestLighthouse() - blah := NewHandshakeManager(l, tuncidr, preferredRanges, mainHM, lh, &udp.Conn{}, defaultHandshakeConfig) + blah := NewHandshakeManager(l, tuncidr, preferredRanges, mainHM, lh, &udp.NoopConn{}, defaultHandshakeConfig) now := time.Now() blah.NextOutboundHandshakeTimerTick(now, mw) diff --git a/interface.go b/interface.go index 220cb25..82ab0f0 100644 --- a/interface.go +++ b/interface.go @@ -26,7 +26,7 @@ const mtu = 9001 type InterfaceConfig struct { HostMap *HostMap - Outside *udp.Conn + Outside udp.Conn Inside overlay.Device certState *CertState Cipher string @@ -52,7 +52,7 @@ type InterfaceConfig struct { type Interface struct { hostMap *HostMap - outside *udp.Conn + outside udp.Conn inside overlay.Device certState atomic.Pointer[CertState] cipher string @@ -80,7 +80,7 @@ type Interface struct { conntrackCacheTimeout time.Duration - writers []*udp.Conn + writers []udp.Conn readers []io.ReadWriteCloser metricHandshakes metrics.Histogram @@ -167,7 +167,7 @@ func NewInterface(ctx context.Context, c *InterfaceConfig) (*Interface, error) { dropMulticast: c.DropMulticast, routines: c.routines, version: c.version, - writers: make([]*udp.Conn, c.routines), + writers: make([]udp.Conn, c.routines), readers: make([]io.ReadWriteCloser, c.routines), caPool: c.caPool, disconnectInvalid: c.disconnectInvalid, @@ -243,7 +243,7 @@ func (f *Interface) run() { func (f *Interface) listenOut(i int) { runtime.LockOSThread() - var li *udp.Conn + var li udp.Conn // TODO clean this up with a coherent interface for each outside connection if i > 0 { li = f.writers[i] diff --git a/lighthouse.go b/lighthouse.go index da604f0..f281f9b 100644 --- a/lighthouse.go +++ b/lighthouse.go @@ -39,7 +39,7 @@ type LightHouse struct { myVpnIp iputil.VpnIp myVpnZeros iputil.VpnIp myVpnNet *net.IPNet - punchConn *udp.Conn + punchConn udp.Conn punchy *Punchy // Local cache of answers from light houses @@ -84,7 +84,7 @@ type LightHouse struct { // NewLightHouseFromConfig will build a Lighthouse struct from the values provided in the config object // addrMap should be nil unless this is during a config reload -func NewLightHouseFromConfig(ctx context.Context, l *logrus.Logger, c *config.C, myVpnNet *net.IPNet, pc *udp.Conn, p *Punchy) (*LightHouse, error) { +func NewLightHouseFromConfig(ctx context.Context, l *logrus.Logger, c *config.C, myVpnNet *net.IPNet, pc udp.Conn, p *Punchy) (*LightHouse, error) { amLighthouse := c.GetBool("lighthouse.am_lighthouse", false) nebulaPort := uint32(c.GetInt("listen.port", 0)) if amLighthouse && nebulaPort == 0 { diff --git a/main.go b/main.go index 4d604f5..e4c2624 100644 --- a/main.go +++ b/main.go @@ -147,7 +147,7 @@ func Main(c *config.C, configTest bool, buildVersion string, logger *logrus.Logg } // set up our UDP listener - udpConns := make([]*udp.Conn, routines) + udpConns := make([]udp.Conn, routines) port := c.GetInt("listen.port", 0) if !configTest { diff --git a/udp/conn.go b/udp/conn.go index f967a9a..33520db 100644 --- a/udp/conn.go +++ b/udp/conn.go @@ -1,6 +1,7 @@ package udp import ( + "github.com/slackhq/nebula/config" "github.com/slackhq/nebula/firewall" "github.com/slackhq/nebula/header" ) @@ -18,3 +19,29 @@ type EncReader func( q int, localCache firewall.ConntrackCache, ) + +type Conn interface { + Rebind() error + LocalAddr() (*Addr, error) + ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firewall.ConntrackCacheTicker, q int) + WriteTo(b []byte, addr *Addr) error + ReloadConfig(c *config.C) +} + +type NoopConn struct{} + +func (NoopConn) Rebind() error { + return nil +} +func (NoopConn) LocalAddr() (*Addr, error) { + return nil, nil +} +func (NoopConn) ListenOut(_ EncReader, _ LightHouseHandlerFunc, _ *firewall.ConntrackCacheTicker, _ int) { + return +} +func (NoopConn) WriteTo(_ []byte, _ *Addr) error { + return nil +} +func (NoopConn) ReloadConfig(_ *config.C) { + return +} diff --git a/udp/udp_android.go b/udp/udp_android.go index d2812a8..08cde96 100644 --- a/udp/udp_android.go +++ b/udp/udp_android.go @@ -34,6 +34,6 @@ func NewListenConfig(multi bool) net.ListenConfig { } } -func (u *Conn) Rebind() error { +func (u *GenericConn) Rebind() error { return nil } diff --git a/udp/udp_darwin.go b/udp/udp_darwin.go index 69d0c58..260ce44 100644 --- a/udp/udp_darwin.go +++ b/udp/udp_darwin.go @@ -37,7 +37,7 @@ func NewListenConfig(multi bool) net.ListenConfig { } } -func (u *Conn) Rebind() error { +func (u *GenericConn) Rebind() error { file, err := u.File() if err != nil { return err diff --git a/udp/udp_freebsd.go b/udp/udp_freebsd.go index 10ff94b..920f91b 100644 --- a/udp/udp_freebsd.go +++ b/udp/udp_freebsd.go @@ -36,6 +36,6 @@ func NewListenConfig(multi bool) net.ListenConfig { } } -func (u *Conn) Rebind() error { +func (u *GenericConn) Rebind() error { return nil } diff --git a/udp/udp_generic.go b/udp/udp_generic.go index ff254eb..490cc61 100644 --- a/udp/udp_generic.go +++ b/udp/udp_generic.go @@ -18,30 +18,30 @@ import ( "github.com/slackhq/nebula/header" ) -type Conn struct { +type GenericConn struct { *net.UDPConn l *logrus.Logger } -func NewListener(l *logrus.Logger, ip net.IP, port int, multi bool, batch int) (*Conn, error) { +func NewListener(l *logrus.Logger, ip net.IP, 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 &Conn{UDPConn: uc, l: l}, nil + return &GenericConn{UDPConn: uc, l: l}, nil } return nil, fmt.Errorf("Unexpected PacketConn: %T %#v", pc, pc) } -func (uc *Conn) WriteTo(b []byte, addr *Addr) error { - _, err := uc.UDPConn.WriteToUDP(b, &net.UDPAddr{IP: addr.IP, Port: int(addr.Port)}) +func (u *GenericConn) WriteTo(b []byte, addr *Addr) error { + _, err := u.UDPConn.WriteToUDP(b, &net.UDPAddr{IP: addr.IP, Port: int(addr.Port)}) return err } -func (uc *Conn) LocalAddr() (*Addr, error) { - a := uc.UDPConn.LocalAddr() +func (u *GenericConn) LocalAddr() (*Addr, error) { + a := u.UDPConn.LocalAddr() switch v := a.(type) { case *net.UDPAddr: @@ -55,11 +55,11 @@ func (uc *Conn) LocalAddr() (*Addr, error) { } } -func (u *Conn) ReloadConfig(c *config.C) { +func (u *GenericConn) ReloadConfig(c *config.C) { // TODO } -func NewUDPStatsEmitter(udpConns []*Conn) func() { +func NewUDPStatsEmitter(udpConns []Conn) func() { // No UDP stats for non-linux return func() {} } @@ -68,7 +68,7 @@ type rawMessage struct { Len uint32 } -func (u *Conn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firewall.ConntrackCacheTicker, q int) { +func (u *GenericConn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firewall.ConntrackCacheTicker, q int) { plaintext := make([]byte, MTU) buffer := make([]byte, MTU) h := &header.H{} diff --git a/udp/udp_linux.go b/udp/udp_linux.go index 26bbe36..60defaa 100644 --- a/udp/udp_linux.go +++ b/udp/udp_linux.go @@ -20,7 +20,7 @@ import ( //TODO: make it support reload as best you can! -type Conn struct { +type StdConn struct { sysFd int l *logrus.Logger batch int @@ -45,7 +45,7 @@ const ( type _SK_MEMINFO [_SK_MEMINFO_VARS]uint32 -func NewListener(l *logrus.Logger, ip net.IP, port int, multi bool, batch int) (*Conn, error) { +func NewListener(l *logrus.Logger, ip net.IP, port int, multi bool, batch int) (Conn, error) { syscall.ForkLock.RLock() fd, err := unix.Socket(unix.AF_INET6, unix.SOCK_DGRAM, unix.IPPROTO_UDP) if err == nil { @@ -77,30 +77,30 @@ func NewListener(l *logrus.Logger, ip net.IP, port int, multi bool, batch int) ( //v, err := unix.GetsockoptInt(fd, unix.SOL_SOCKET, unix.SO_INCOMING_CPU) //l.Println(v, err) - return &Conn{sysFd: fd, l: l, batch: batch}, err + return &StdConn{sysFd: fd, l: l, batch: batch}, err } -func (u *Conn) Rebind() error { +func (u *StdConn) Rebind() error { return nil } -func (u *Conn) SetRecvBuffer(n int) error { +func (u *StdConn) SetRecvBuffer(n int) error { return unix.SetsockoptInt(u.sysFd, unix.SOL_SOCKET, unix.SO_RCVBUFFORCE, n) } -func (u *Conn) SetSendBuffer(n int) error { +func (u *StdConn) SetSendBuffer(n int) error { return unix.SetsockoptInt(u.sysFd, unix.SOL_SOCKET, unix.SO_SNDBUFFORCE, n) } -func (u *Conn) GetRecvBuffer() (int, error) { +func (u *StdConn) GetRecvBuffer() (int, error) { return unix.GetsockoptInt(int(u.sysFd), unix.SOL_SOCKET, unix.SO_RCVBUF) } -func (u *Conn) GetSendBuffer() (int, error) { +func (u *StdConn) GetSendBuffer() (int, error) { return unix.GetsockoptInt(int(u.sysFd), unix.SOL_SOCKET, unix.SO_SNDBUF) } -func (u *Conn) LocalAddr() (*Addr, error) { +func (u *StdConn) LocalAddr() (*Addr, error) { sa, err := unix.Getsockname(u.sysFd) if err != nil { return nil, err @@ -119,7 +119,7 @@ func (u *Conn) LocalAddr() (*Addr, error) { return addr, nil } -func (u *Conn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firewall.ConntrackCacheTicker, q int) { +func (u *StdConn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firewall.ConntrackCacheTicker, q int) { plaintext := make([]byte, MTU) h := &header.H{} fwPacket := &firewall.Packet{} @@ -150,7 +150,7 @@ func (u *Conn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firewall } } -func (u *Conn) ReadSingle(msgs []rawMessage) (int, error) { +func (u *StdConn) ReadSingle(msgs []rawMessage) (int, error) { for { n, _, err := unix.Syscall6( unix.SYS_RECVMSG, @@ -171,7 +171,7 @@ func (u *Conn) ReadSingle(msgs []rawMessage) (int, error) { } } -func (u *Conn) ReadMulti(msgs []rawMessage) (int, error) { +func (u *StdConn) ReadMulti(msgs []rawMessage) (int, error) { for { n, _, err := unix.Syscall6( unix.SYS_RECVMMSG, @@ -191,7 +191,7 @@ func (u *Conn) ReadMulti(msgs []rawMessage) (int, error) { } } -func (u *Conn) WriteTo(b []byte, addr *Addr) error { +func (u *StdConn) WriteTo(b []byte, addr *Addr) error { var rsa unix.RawSockaddrInet6 rsa.Family = unix.AF_INET6 @@ -221,7 +221,7 @@ func (u *Conn) WriteTo(b []byte, addr *Addr) error { } } -func (u *Conn) ReloadConfig(c *config.C) { +func (u *StdConn) ReloadConfig(c *config.C) { b := c.GetInt("listen.read_buffer", 0) if b > 0 { err := u.SetRecvBuffer(b) @@ -253,7 +253,7 @@ func (u *Conn) ReloadConfig(c *config.C) { } } -func (u *Conn) getMemInfo(meminfo *_SK_MEMINFO) error { +func (u *StdConn) getMemInfo(meminfo *_SK_MEMINFO) error { var vallen uint32 = 4 * _SK_MEMINFO_VARS _, _, err := unix.Syscall6(unix.SYS_GETSOCKOPT, uintptr(u.sysFd), uintptr(unix.SOL_SOCKET), uintptr(unix.SO_MEMINFO), uintptr(unsafe.Pointer(meminfo)), uintptr(unsafe.Pointer(&vallen)), 0) if err != 0 { @@ -262,11 +262,11 @@ func (u *Conn) getMemInfo(meminfo *_SK_MEMINFO) error { return nil } -func NewUDPStatsEmitter(udpConns []*Conn) func() { +func NewUDPStatsEmitter(udpConns []Conn) func() { // Check if our kernel supports SO_MEMINFO before registering the gauges var udpGauges [][_SK_MEMINFO_VARS]metrics.Gauge var meminfo _SK_MEMINFO - if err := udpConns[0].getMemInfo(&meminfo); err == nil { + if err := udpConns[0].(*StdConn).getMemInfo(&meminfo); err == nil { udpGauges = make([][_SK_MEMINFO_VARS]metrics.Gauge, len(udpConns)) for i := range udpConns { udpGauges[i] = [_SK_MEMINFO_VARS]metrics.Gauge{ @@ -285,7 +285,7 @@ func NewUDPStatsEmitter(udpConns []*Conn) func() { return func() { for i, gauges := range udpGauges { - if err := udpConns[i].getMemInfo(&meminfo); err == nil { + if err := udpConns[i].(*StdConn).getMemInfo(&meminfo); err == nil { for j := 0; j < _SK_MEMINFO_VARS; j++ { gauges[j].Update(int64(meminfo[j])) } diff --git a/udp/udp_linux_32.go b/udp/udp_linux_32.go index 06cd382..523968c 100644 --- a/udp/udp_linux_32.go +++ b/udp/udp_linux_32.go @@ -30,7 +30,7 @@ type rawMessage struct { Len uint32 } -func (u *Conn) PrepareRawMessages(n int) ([]rawMessage, [][]byte, [][]byte) { +func (u *StdConn) PrepareRawMessages(n int) ([]rawMessage, [][]byte, [][]byte) { msgs := make([]rawMessage, n) buffers := make([][]byte, n) names := make([][]byte, n) diff --git a/udp/udp_linux_64.go b/udp/udp_linux_64.go index c442405..a54f1df 100644 --- a/udp/udp_linux_64.go +++ b/udp/udp_linux_64.go @@ -33,7 +33,7 @@ type rawMessage struct { Pad0 [4]byte } -func (u *Conn) PrepareRawMessages(n int) ([]rawMessage, [][]byte, [][]byte) { +func (u *StdConn) PrepareRawMessages(n int) ([]rawMessage, [][]byte, [][]byte) { msgs := make([]rawMessage, n) buffers := make([][]byte, n) names := make([][]byte, n) diff --git a/udp/udp_tester.go b/udp/udp_tester.go index 8b5e531..4396c48 100644 --- a/udp/udp_tester.go +++ b/udp/udp_tester.go @@ -36,7 +36,7 @@ func (u *Packet) Copy() *Packet { return n } -type Conn struct { +type TesterConn struct { Addr *Addr RxPackets chan *Packet // Packets to receive into nebula @@ -45,8 +45,8 @@ type Conn struct { l *logrus.Logger } -func NewListener(l *logrus.Logger, ip net.IP, port int, _ bool, _ int) (*Conn, error) { - return &Conn{ +func NewListener(l *logrus.Logger, ip net.IP, port int, _ bool, _ int) (Conn, error) { + return &TesterConn{ Addr: &Addr{ip, uint16(port)}, RxPackets: make(chan *Packet, 10), TxPackets: make(chan *Packet, 10), @@ -57,7 +57,7 @@ func NewListener(l *logrus.Logger, ip net.IP, port int, _ bool, _ int) (*Conn, e // Send will place a UdpPacket onto the receive queue for nebula to consume // this is an encrypted packet or a handshake message in most cases // packets were transmitted from another nebula node, you can send them with Tun.Send -func (u *Conn) Send(packet *Packet) { +func (u *TesterConn) Send(packet *Packet) { h := &header.H{} if err := h.Parse(packet.Data); err != nil { panic(err) @@ -74,7 +74,7 @@ func (u *Conn) Send(packet *Packet) { // Get will pull a UdpPacket from the transmit queue // nebula meant to send this message on the network, it will be encrypted // packets were ingested from the tun side (in most cases), you can send them with Tun.Send -func (u *Conn) Get(block bool) *Packet { +func (u *TesterConn) Get(block bool) *Packet { if block { return <-u.TxPackets } @@ -91,7 +91,7 @@ func (u *Conn) Get(block bool) *Packet { // Below this is boilerplate implementation to make nebula actually work //********************************************************************************************************************// -func (u *Conn) WriteTo(b []byte, addr *Addr) error { +func (u *TesterConn) WriteTo(b []byte, addr *Addr) error { p := &Packet{ Data: make([]byte, len(b), len(b)), FromIp: make([]byte, 16), @@ -108,7 +108,7 @@ func (u *Conn) WriteTo(b []byte, addr *Addr) error { return nil } -func (u *Conn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firewall.ConntrackCacheTicker, q int) { +func (u *TesterConn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firewall.ConntrackCacheTicker, q int) { plaintext := make([]byte, MTU) h := &header.H{} fwPacket := &firewall.Packet{} @@ -126,17 +126,17 @@ func (u *Conn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firewall } } -func (u *Conn) ReloadConfig(*config.C) {} +func (u *TesterConn) ReloadConfig(*config.C) {} -func NewUDPStatsEmitter(_ []*Conn) func() { +func NewUDPStatsEmitter(_ []Conn) func() { // No UDP stats for non-linux return func() {} } -func (u *Conn) LocalAddr() (*Addr, error) { +func (u *TesterConn) LocalAddr() (*Addr, error) { return u.Addr, nil } -func (u *Conn) Rebind() error { +func (u *TesterConn) Rebind() error { return nil } diff --git a/udp/udp_windows.go b/udp/udp_windows.go index 1f2ce64..1456ede 100644 --- a/udp/udp_windows.go +++ b/udp/udp_windows.go @@ -24,6 +24,6 @@ func NewListenConfig(multi bool) net.ListenConfig { } } -func (u *Conn) Rebind() error { +func (u *GenericConn) Rebind() error { return nil }