diff --git a/internet/definitions.go b/internet/definitions.go index da5c8be..55a4fb9 100644 --- a/internet/definitions.go +++ b/internet/definitions.go @@ -42,7 +42,7 @@ type node struct { } var ( - errZeroMaxNodes = errors.New("zero max ports") + errZeroMaxNodesArg = errors.New("zero max nodes arg") errZeroPort = errors.New("port must be greater than zero") errInvalidProto = errors.New("invalid protocol") errProtoRegistered = errors.New("protocol already registered") diff --git a/internet/stack-ethernet.go b/internet/stack-ethernet.go index 197ef80..c2ebaad 100644 --- a/internet/stack-ethernet.go +++ b/internet/stack-ethernet.go @@ -41,7 +41,7 @@ func (ls *StackEthernet) Reset6(mac, gateway [6]byte, mtu, maxNodes int) error { if mtu > math.MaxUint16 || mtu < 256 { return errors.New("invalid MTU") } else if maxNodes <= 0 { - return errZeroMaxNodes + return errZeroMaxNodesArg } ls.handlers = slices.Grow(ls.handlers[:0], maxNodes) *ls = StackEthernet{ diff --git a/internet/stack-ip.go b/internet/stack-ip.go index 64b0384..5ac4549 100644 --- a/internet/stack-ip.go +++ b/internet/stack-ip.go @@ -30,7 +30,7 @@ type StackIP struct { func (sb *StackIP) Reset(addr netip.Addr, maxNodes int) error { if maxNodes <= 0 { - return errZeroMaxNodes + return errZeroMaxNodesArg } err := sb.SetAddr(addr) if err != nil { diff --git a/internet/stack-ports.go b/internet/stack-ports.go index 2016e30..bd51284 100644 --- a/internet/stack-ports.go +++ b/internet/stack-ports.go @@ -28,7 +28,7 @@ func (ps *StackPorts) Reset(protocol uint64, dstPortOffset uint16, maxNodes int) if protocol > math.MaxUint16 { return errInvalidProto } else if maxNodes <= 0 { - return errZeroMaxNodes + return errZeroMaxNodesArg } ps.handlers = slices.Grow(ps.handlers[:0], maxNodes) *ps = StackPorts{ diff --git a/x/xnet/stack-async.go b/x/xnet/stack-async.go index 7adfee3..7193d1f 100644 --- a/x/xnet/stack-async.go +++ b/x/xnet/stack-async.go @@ -123,14 +123,15 @@ func (s *StackAsync) Reset(cfg StackConfig) error { } // Enable TCP if connections present. - - err = s.tcps.ResetTCP(cfg.MaxTCPConns) - if err != nil { - return err - } - err = s.ip.Register(&s.tcps) - if err != nil { - return err + if cfg.MaxTCPConns > 0 { + err = s.tcps.ResetTCP(cfg.MaxTCPConns) + if err != nil { + return err + } + err = s.ip.Register(&s.tcps) + if err != nil { + return err + } } // Now setup stacks. diff --git a/x/xnet/stack-retrying.go b/x/xnet/stack-retrying.go index 52e17e7..464e2b1 100644 --- a/x/xnet/stack-retrying.go +++ b/x/xnet/stack-retrying.go @@ -85,13 +85,19 @@ func (s StackRetrying) DoResolveHardwareAddress6(addr netip.Addr, timeout time.D func (s StackRetrying) DoDialTCP(conn *tcp.Conn, localPort uint16, addrp netip.AddrPort, timeout time.Duration, retries int) (err error) { expectEnd := time.Now().Add(timeout * time.Duration(retries)) + var firstErr error for i := 0; i < retries; i++ { err = s.block.DoDialTCP(conn, localPort, addrp, timeout) if err == nil { return nil + } else if firstErr == nil { + firstErr = err } } if time.Now().Before(expectEnd) { + if err != firstErr { + return errors.Join(firstErr, err) + } return err } return errRetriesExceeded