Skip to content

Commit 4c2ba47

Browse files
committed
Quietly log error on UDP_NETRESET ioctl on Windows.
1 parent 105e0ec commit 4c2ba47

2 files changed

Lines changed: 22 additions & 12 deletions

File tree

udp/udp_generic.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package udp
1010

1111
import (
1212
"context"
13+
"errors"
1314
"fmt"
1415
"net"
1516
"net/netip"
@@ -84,8 +85,12 @@ func (u *GenericConn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *f
8485
// Just read one packet at a time
8586
n, rua, err := u.ReadFromUDPAddrPort(buffer)
8687
if err != nil {
87-
u.l.WithError(err).Debug("udp socket is closed, exiting read loop")
88-
return
88+
if errors.Is(err, net.ErrClosed) {
89+
u.l.WithError(err).Debug("udp socket is closed, exiting read loop")
90+
return
91+
}
92+
u.l.WithError(err).Warn("unexpected udp socket receive error")
93+
continue
8994
}
9095

9196
r(

udp/udp_rio_windows.go

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func NewRIOListener(l *logrus.Logger, addr netip.Addr, port int) (*RIOConn, erro
6969

7070
u := &RIOConn{l: l}
7171

72-
err := u.bind(&windows.SockaddrInet6{Addr: addr.As16(), Port: port})
72+
err := u.bind(l, &windows.SockaddrInet6{Addr: addr.As16(), Port: port})
7373
if err != nil {
7474
return nil, fmt.Errorf("bind: %w", err)
7575
}
@@ -85,11 +85,11 @@ func NewRIOListener(l *logrus.Logger, addr netip.Addr, port int) (*RIOConn, erro
8585
return u, nil
8686
}
8787

88-
func (u *RIOConn) bind(sa windows.Sockaddr) error {
88+
func (u *RIOConn) bind(l *logrus.Logger, sa windows.Sockaddr) error {
8989
var err error
9090
u.sock, err = winrio.Socket(windows.AF_INET6, windows.SOCK_DGRAM, windows.IPPROTO_UDP)
9191
if err != nil {
92-
return err
92+
return fmt.Errorf("winrio.Socket error: %w", err)
9393
}
9494

9595
// Enable v4 for this socket
@@ -103,35 +103,40 @@ func (u *RIOConn) bind(sa windows.Sockaddr) error {
103103
size := uint32(unsafe.Sizeof(flag))
104104
err = syscall.WSAIoctl(syscall.Handle(u.sock), syscall.SIO_UDP_CONNRESET, (*byte)(unsafe.Pointer(&flag)), size, nil, 0, &ret, nil, 0)
105105
if err != nil {
106-
return err
106+
// This is a best-effort to prevent errors from being returned by the udp recv operation.
107+
// Quietly log a failure and continue.
108+
l.WithError(err).Debug("failed to set UDP_CONNRESET ioctl")
107109
}
110+
108111
ret = 0
109112
flag = 0
110113
size = uint32(unsafe.Sizeof(flag))
111114
SIO_UDP_NETRESET := uint32(syscall.IOC_IN | syscall.IOC_VENDOR | 15)
112115
err = syscall.WSAIoctl(syscall.Handle(u.sock), SIO_UDP_NETRESET, (*byte)(unsafe.Pointer(&flag)), size, nil, 0, &ret, nil, 0)
113116
if err != nil {
114-
return err
117+
// This is a best-effort to prevent errors from being returned by the udp recv operation.
118+
// Quietly log a failure and continue.
119+
l.WithError(err).Debug("failed to set UDP_NETRESET ioctl")
115120
}
116121

117122
err = u.rx.Open()
118123
if err != nil {
119-
return err
124+
return fmt.Errorf("error rx.Open(): %w", err)
120125
}
121126

122127
err = u.tx.Open()
123128
if err != nil {
124-
return err
129+
return fmt.Errorf("error tx.Open(): %w", err)
125130
}
126131

127132
u.rq, err = winrio.CreateRequestQueue(u.sock, packetsPerRing, 1, packetsPerRing, 1, u.rx.cq, u.tx.cq, 0)
128133
if err != nil {
129-
return err
134+
return fmt.Errorf("error CreateRequestQueue: %w", err)
130135
}
131136

132137
err = windows.Bind(u.sock, sa)
133138
if err != nil {
134-
return err
139+
return fmt.Errorf("error windows.Bind(): %w", err)
135140
}
136141

137142
return nil
@@ -152,7 +157,7 @@ func (u *RIOConn) ListenOut(r EncReader, lhf LightHouseHandlerFunc, cache *firew
152157
u.l.WithError(err).Debug("udp socket is closed, exiting read loop")
153158
return
154159
}
155-
u.l.WithError(err).Error("unexpected udp socket receive error")
160+
u.l.WithError(err).Warn("unexpected udp socket receive error")
156161
continue
157162
}
158163

0 commit comments

Comments
 (0)