@@ -8,6 +8,7 @@ package intra
88
99import (
1010 "fmt"
11+ "io"
1112 "net"
1213 "net/netip"
1314 "os"
@@ -226,13 +227,16 @@ func (x *muxer) readers() {
226227 log .D ("udp: mux: %s read timeout(%d): %v" , x .cid , timeouterrors , err )
227228 recycle ()
228229 continue
229- } // else: err out
230+ }
230231 }
231232 if err != nil {
232233 log .I ("udp: mux: %s read done n(%d): %v" , x .cid , n , err )
233234 recycle ()
234235 return
235236 }
237+
238+ timeouterrors = 0 // reset on successful reads
239+
236240 if who == nil || n == 0 {
237241 log .W ("udp: mux: %s read done n(%d): nil remote addr; skip" , x .cid , n )
238242 recycle ()
@@ -456,7 +460,7 @@ func (c *demuxconn) RemoteAddr() net.Addr {
456460
457461// SetDeadline implements core.UDPConn.SetDeadline
458462func (c * demuxconn ) SetDeadline (t time.Time ) error {
459- werr := c .SetReadDeadline (t )
463+ werr := c .SetWriteDeadline (t )
460464 rerr := c .SetReadDeadline (t )
461465 return core .JoinErr (werr , rerr )
462466}
@@ -499,8 +503,12 @@ func (c *demuxconn) io(out *[]byte, in *slice) (int, error) {
499503 case <- c .closed :
500504 log .W ("udp: mux: %s demux: read: %v <= %v drop(sz: %d)" , id , c .laddr , c .raddr , q )
501505 in .fin ()
502- case c .overflowCh <- & slice {v : in .v [n :], fin : in .fin }: // overflowCh is never closed
506+ case c .overflowCh <- & slice {v : in .v [n :], fin : in .fin }:
503507 log .W ("udp: mux: %s demux: read: %v <= %v overflow(sz: %d)" , id , c .laddr , c .raddr , q )
508+ default :
509+ log .E ("udp: mux: %s demux: read: %v <= %v dropped(sz: %d)" , id , c .laddr , c .raddr , q )
510+ in .fin ()
511+ return n , io .ErrShortWrite
504512 }
505513 } else {
506514 log .VV ("udp: mux: %s demux: read: %v <= %v done(sz: %d)" , id , c .laddr , c .raddr , n )
0 commit comments