diff --git a/control/anyfrom_pool.go b/control/anyfrom_pool.go index ae2e94b..4d764c7 100644 --- a/control/anyfrom_pool.go +++ b/control/anyfrom_pool.go @@ -26,6 +26,12 @@ type Anyfrom struct { gotGSOError bool } +func (a *Anyfrom) afterWrite(err error) { + if !a.gotGSOError && isGSOError(err) { + a.gotGSOError = true + } + a.RefreshTtl() +} func (a *Anyfrom) RefreshTtl() { a.deadlineTimer.Reset(a.ttl) } @@ -60,36 +66,21 @@ func (a *Anyfrom) SyscallConn() (syscall.RawConn, error) { return a.UDPConn.SyscallConn() } func (a *Anyfrom) WriteMsgUDP(b []byte, oob []byte, addr *net.UDPAddr) (n int, oobn int, err error) { - defer func() { - if isGSOError(err) { - a.gotGSOError = true - } - a.RefreshTtl() - }() + defer a.afterWrite(err) if a.SupportGso(len(b)) { return a.UDPConn.WriteMsgUDP(b, appendUDPSegmentSizeMsg(oob, uint16(len(b))), addr) } return a.UDPConn.WriteMsgUDP(b, oob, addr) } func (a *Anyfrom) WriteMsgUDPAddrPort(b []byte, oob []byte, addr netip.AddrPort) (n int, oobn int, err error) { - defer func() { - if isGSOError(err) { - a.gotGSOError = true - } - a.RefreshTtl() - }() + defer a.afterWrite(err) if a.SupportGso(len(b)) { return a.UDPConn.WriteMsgUDPAddrPort(b, appendUDPSegmentSizeMsg(oob, uint16(len(b))), addr) } return a.UDPConn.WriteMsgUDPAddrPort(b, oob, addr) } func (a *Anyfrom) WriteTo(b []byte, addr net.Addr) (n int, err error) { - defer func() { - if isGSOError(err) { - a.gotGSOError = true - } - a.RefreshTtl() - }() + defer a.afterWrite(err) if a.SupportGso(len(b)) { n, _, err = a.UDPConn.WriteMsgUDP(b, appendUDPSegmentSizeMsg(nil, uint16(len(b))), addr.(*net.UDPAddr)) return n, err @@ -97,12 +88,7 @@ func (a *Anyfrom) WriteTo(b []byte, addr net.Addr) (n int, err error) { return a.UDPConn.WriteTo(b, addr) } func (a *Anyfrom) WriteToUDP(b []byte, addr *net.UDPAddr) (n int, err error) { - defer func() { - if isGSOError(err) { - a.gotGSOError = true - } - a.RefreshTtl() - }() + defer a.afterWrite(err) if a.SupportGso(len(b)) { n, _, err = a.UDPConn.WriteMsgUDP(b, appendUDPSegmentSizeMsg(nil, uint16(len(b))), addr) return n, err @@ -110,12 +96,7 @@ func (a *Anyfrom) WriteToUDP(b []byte, addr *net.UDPAddr) (n int, err error) { return a.UDPConn.WriteToUDP(b, addr) } func (a *Anyfrom) WriteToUDPAddrPort(b []byte, addr netip.AddrPort) (n int, err error) { - defer func() { - if isGSOError(err) { - a.gotGSOError = true - } - a.RefreshTtl() - }() + defer a.afterWrite(err) if a.SupportGso(len(b)) { n, _, err = a.UDPConn.WriteMsgUDPAddrPort(b, appendUDPSegmentSizeMsg(nil, uint16(len(b))), addr) return n, err