Retry UDP receive on Windows in some receive error cases (#1404)

This commit is contained in:
brad-defined 2025-05-13 14:58:37 -04:00 committed by GitHub
parent b55b9019a7
commit 04d7a8ccba
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -14,6 +14,7 @@ import (
"sync"
"sync/atomic"
"syscall"
"time"
"unsafe"
"github.com/sirupsen/logrus"
@ -125,13 +126,27 @@ func (u *RIOConn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firew
fwPacket := &firewall.Packet{}
nb := make([]byte, 12, 12)
consecutiveErrors := 0
for {
// Just read one packet at a time
n, rua, err := u.receive(buffer)
if err != nil {
if errors.Is(err, net.ErrClosed) {
u.l.WithError(err).Debug("udp socket is closed, exiting read loop")
return
}
// Try to suss out whether this is a transient error or something more permanent
consecutiveErrors++
u.l.WithError(err).WithField("consecutiveErrors", consecutiveErrors).Error("unexpected udp socket recieve error")
if consecutiveErrors > 15 {
panic("too many consecutive UDP receive errors")
} else if consecutiveErrors > 10 {
time.Sleep(100 * time.Millisecond)
}
continue
}
consecutiveErrors = 0
r(
netip.AddrPortFrom(netip.AddrFrom16(rua.Addr).Unmap(), (rua.Port>>8)|((rua.Port&0xff)<<8)),