diff --git a/net/conn/dial.go b/net/conn/dial.go index fdebbc24b..d454cb232 100644 --- a/net/conn/dial.go +++ b/net/conn/dial.go @@ -89,7 +89,7 @@ func (d *Dialer) rawConnDial(ctx context.Context, raddr ma.Multiaddr, remote pee laddr := pickLocalAddr(d.LocalAddrs, raddr) log.Debugf("%s dialing %s -- %s --> %s", d.LocalPeer, remote, laddr, raddr) - if laddr != nil { + if laddr != nil && reuseport.Available() { // dial using reuseport.Dialer, because we're probably reusing addrs. // this is optimistic, as the reuseDial may fail to bind the port. if nconn, retry, reuseErr := d.reuseDial(laddr, raddr); reuseErr == nil { diff --git a/net/conn/listen.go b/net/conn/listen.go index 05d3c229e..d9003a5de 100644 --- a/net/conn/listen.go +++ b/net/conn/listen.go @@ -124,20 +124,7 @@ func (l *listener) Loggable() map[string]interface{} { // Listen listens on the particular multiaddr, with given peer and peerstore. func Listen(ctx context.Context, addr ma.Multiaddr, local peer.ID, sk ic.PrivKey) (Listener, error) { - - network, naddr, err := manet.DialArgs(addr) - if err != nil { - return nil, err - } - - // _ := reuseport.Listen - // ml, err := manet.Listen(addr) - nl, err := reuseport.Listen(network, naddr) - if err != nil { - return nil, fmt.Errorf("Failed to listen on %s: %s", addr, err) - } - - ml, err := manet.WrapNetListener(nl) + ml, err := manetListen(addr) if err != nil { return nil, err } @@ -154,3 +141,23 @@ func Listen(ctx context.Context, addr ma.Multiaddr, local peer.ID, sk ic.PrivKey log.Event(ctx, "swarmListen", l) return l, nil } + +func manetListen(addr ma.Multiaddr) (manet.Listener, error) { + network, naddr, err := manet.DialArgs(addr) + if err != nil { + return nil, err + } + + if reuseport.Available() { + nl, err := reuseport.Listen(network, naddr) + if err == nil { + // hey, it worked! + return manet.WrapNetListener(nl) + } + // reuseport is available, but we failed to listen. log debug, and retry normally. + log.Debugf("reuseport available, but failed to listen: %s %s, %s", network, naddr, err) + } + + // either reuseport not available, or it failed. try normally. + return manet.Listen(addr) +}