diff --git a/interface.go b/interface.go index 584ea3e..133627e 100644 --- a/interface.go +++ b/interface.go @@ -344,6 +344,9 @@ func NewInterface(ctx context.Context, c *InterfaceConfig) (*Interface, error) { if decryptWorkers < 0 { decryptWorkers = 0 } + if runtime.GOOS != "linux" { + decryptWorkers = 0 + } queueDepth := c.DecryptQueueDepth if queueDepth <= 0 { diff --git a/udp/udp_darwin.go b/udp/udp_darwin.go index 747e5a8..edadfc2 100644 --- a/udp/udp_darwin.go +++ b/udp/udp_darwin.go @@ -180,9 +180,7 @@ func (u *StdConn) ListenOut(r EncReader) { u.l.WithError(err).Error("unexpected udp socket receive error") } - payload := make([]byte, n) - copy(payload, buffer[:n]) - r(netip.AddrPortFrom(rua.Addr().Unmap(), rua.Port()), payload, func() {}) + r(netip.AddrPortFrom(rua.Addr().Unmap(), rua.Port()), buffer[:n], nil) } } diff --git a/udp/udp_generic.go b/udp/udp_generic.go index 8a3b0d8..75fa661 100644 --- a/udp/udp_generic.go +++ b/udp/udp_generic.go @@ -82,8 +82,6 @@ func (u *GenericConn) ListenOut(r EncReader) { return } - payload := make([]byte, n) - copy(payload, buffer[:n]) - r(netip.AddrPortFrom(rua.Addr().Unmap(), rua.Port()), payload, func() {}) + r(netip.AddrPortFrom(rua.Addr().Unmap(), rua.Port()), buffer[:n], nil) } } diff --git a/udp/udp_linux.go b/udp/udp_linux.go index a8299c1..af20534 100644 --- a/udp/udp_linux.go +++ b/udp/udp_linux.go @@ -452,12 +452,23 @@ func (s *sendShard) flushPendingLocked() error { if queue == nil { err = s.processTask(task) } else { - defer func() { - if r := recover(); r != nil { - err = s.processTask(task) + sent := false + func() { + defer func() { + if r := recover(); r != nil { + err = s.processTask(task) + sent = true + } + }() + select { + case queue <- task: + sent = true + default: } }() - queue <- task + if !sent { + err = s.processTask(task) + } } s.mu.Lock() return err diff --git a/udp/udp_rio_windows.go b/udp/udp_rio_windows.go index 7193d39..3c665de 100644 --- a/udp/udp_rio_windows.go +++ b/udp/udp_rio_windows.go @@ -149,9 +149,7 @@ func (u *RIOConn) ListenOut(r EncReader) { continue } - payload := make([]byte, n) - copy(payload, buffer[:n]) - r(netip.AddrPortFrom(netip.AddrFrom16(rua.Addr).Unmap(), (rua.Port>>8)|((rua.Port&0xff)<<8)), payload, func() {}) + r(netip.AddrPortFrom(netip.AddrFrom16(rua.Addr).Unmap(), (rua.Port>>8)|((rua.Port&0xff)<<8)), buffer[:n], nil) } }