From 13f8f0c308a9331c1d96759a94f2037e9d7a0757 Mon Sep 17 00:00:00 2001 From: JackDoan Date: Wed, 28 Jan 2026 13:21:51 -0600 Subject: [PATCH] use shutdown --- interface.go | 12 ++---------- udp/udp_linux.go | 15 +-------------- 2 files changed, 3 insertions(+), 24 deletions(-) diff --git a/interface.go b/interface.go index 7fbe4e9b..fd80cc87 100644 --- a/interface.go +++ b/interface.go @@ -505,20 +505,12 @@ func (f *Interface) Close() error { f.l.WithError(err).Error("Error while closing udp socket") } } - for i, r := range f.readers { - if i == 0 { - continue // f.readers[0] is f.inside, which we want to save for last - } - if err := r.Close(); err != nil { - f.l.WithError(err).Error("Error while closing tun reader") - } - } // Release the tun readers - for _, u := range f.readers { + for i, u := range f.readers { err := u.Close() if err != nil { - f.l.WithError(err).Error("Error while closing tun device") + f.l.WithError(err).WithField("i", i).Error("Error while closing tun device") } } diff --git a/udp/udp_linux.go b/udp/udp_linux.go index 32b9c69b..a90e96d3 100644 --- a/udp/udp_linux.go +++ b/udp/udp_linux.go @@ -9,7 +9,6 @@ import ( "net" "net/netip" "syscall" - "time" "unsafe" "github.com/rcrowley/go-metrics" @@ -18,8 +17,6 @@ import ( "golang.org/x/sys/unix" ) -var readTimeout = unix.NsecToTimeval(int64(time.Millisecond * 500)) - type StdConn struct { sysFd int isV4 bool @@ -50,11 +47,6 @@ func NewListener(l *logrus.Logger, ip netip.Addr, port int, multi bool, batch in } } - // Set a read timeout - if err = unix.SetsockoptTimeval(fd, unix.SOL_SOCKET, unix.SO_RCVTIMEO, &readTimeout); err != nil { - return nil, fmt.Errorf("unable to set SO_RCVTIMEO: %s", err) - } - var sa unix.Sockaddr if ip.Is4() { sa4 := &unix.SockaddrInet4{Port: port} @@ -162,9 +154,6 @@ func (u *StdConn) ReadSingle(msgs []rawMessage) (int, error) { ) if err != 0 { - if err == unix.EAGAIN || err == unix.EINTR { - continue - } return 0, &net.OpError{Op: "recvmsg", Err: err} } @@ -186,9 +175,6 @@ func (u *StdConn) ReadMulti(msgs []rawMessage) (int, error) { ) if err != 0 { - if err == unix.EAGAIN || err == unix.EINTR { - continue - } return 0, &net.OpError{Op: "recvmmsg", Err: err} } @@ -315,6 +301,7 @@ func (u *StdConn) getMemInfo(meminfo *[unix.SK_MEMINFO_VARS]uint32) error { } func (u *StdConn) Close() error { + _ = syscall.Shutdown(u.sysFd, syscall.SHUT_RDWR) return syscall.Close(u.sysFd) }