diff --git a/p2p/transport/quic/conn.go b/p2p/transport/quic/conn.go index fc5451690e..cff7654513 100644 --- a/p2p/transport/quic/conn.go +++ b/p2p/transport/quic/conn.go @@ -19,6 +19,9 @@ type pConn interface { // count conn reference DecreaseCount() IncreaseCount() + + // is reuseport enable + Reuseport() bool } type conn struct { diff --git a/p2p/transport/quic/listener.go b/p2p/transport/quic/listener.go index 435d5a230f..d7cabd96c1 100644 --- a/p2p/transport/quic/listener.go +++ b/p2p/transport/quic/listener.go @@ -146,7 +146,14 @@ func (l *listener) setupConn(qconn quic.Connection) (*conn, error) { // Close closes the listener. func (l *listener) Close() error { defer l.conn.DecreaseCount() - return l.quicListener.Close() + + err := l.quicListener.Close() + + if !l.conn.Reuseport() { + // close the underlying connection + l.conn.Close() + } + return err } // Addr returns the address of this listener. diff --git a/p2p/transport/quic/reuse.go b/p2p/transport/quic/reuse.go index 43eb2cd361..8e1c873e6f 100644 --- a/p2p/transport/quic/reuse.go +++ b/p2p/transport/quic/reuse.go @@ -43,6 +43,10 @@ func (c *reuseConn) DecreaseCount() { c.mutex.Unlock() } +func (c *reuseConn) Reuseport() bool { + return true +} + func (c *reuseConn) ShouldGarbageCollect(now time.Time) bool { c.mutex.Lock() defer c.mutex.Unlock() diff --git a/p2p/transport/quic/transport.go b/p2p/transport/quic/transport.go index 70da014103..5bad7b8fdc 100644 --- a/p2p/transport/quic/transport.go +++ b/p2p/transport/quic/transport.go @@ -58,8 +58,9 @@ type noreuseConn struct { *net.UDPConn } -func (c *noreuseConn) IncreaseCount() {} -func (c *noreuseConn) DecreaseCount() {} +func (c *noreuseConn) IncreaseCount() {} +func (c *noreuseConn) DecreaseCount() {} +func (c *noreuseConn) Reuseport() bool { return false } type connManager struct { reuseUDP4 *reuse @@ -406,6 +407,7 @@ func (t *transport) Listen(addr ma.Multiaddr) (tpt.Listener, error) { } ln, err := newListener(conn, t, t.localPeer, t.privKey, t.identity, t.rcmgr) if err != nil { + conn.Close() conn.DecreaseCount() return nil, err }