@@ -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