]> Sergey Matveev's repositories - btrtrc.git/blobdiff - peerconn.go
Fix TestSeedAfterDownloading when cgo is disabled
[btrtrc.git] / peerconn.go
index 71a38925fd02e9ff55048f8ce07b83663a0572b9..68da20f1b1db29e54085fb31d7a7b97ab3d12134 100644 (file)
@@ -15,10 +15,12 @@ import (
        "time"
 
        "github.com/RoaringBitmap/roaring"
+       "github.com/anacrolix/generics"
        . "github.com/anacrolix/generics"
        "github.com/anacrolix/log"
        "github.com/anacrolix/missinggo/v2/bitmap"
        "github.com/anacrolix/multiless"
+       "golang.org/x/exp/maps"
        "golang.org/x/time/rate"
 
        "github.com/anacrolix/torrent/bencode"
@@ -40,6 +42,7 @@ type PeerConn struct {
        // See BEP 3 etc.
        PeerID             PeerID
        PeerExtensionBytes pp.PeerExtensionBits
+       PeerListenPort     int
 
        // The actual Conn, used for closing, and setting socket options. Do not use methods on this
        // while holding any mutexes.
@@ -66,7 +69,7 @@ type PeerConn struct {
 }
 
 func (cn *PeerConn) pexStatus() string {
-       if !cn.bitExtensionEnabled(pp.ExtensionBitExtended) {
+       if !cn.bitExtensionEnabled(pp.ExtensionBitLtep) {
                return "extended protocol disabled"
        }
        if cn.PeerExtensionIDs == nil {
@@ -75,11 +78,24 @@ func (cn *PeerConn) pexStatus() string {
        if !cn.supportsExtension(pp.ExtensionNamePex) {
                return "unsupported"
        }
-       return fmt.Sprintf(
-               "%v conns, %v unsent events",
-               len(cn.pex.remoteLiveConns),
-               cn.pex.numPending(),
-       )
+       if true {
+               return fmt.Sprintf(
+                       "%v conns, %v unsent events",
+                       len(cn.pex.remoteLiveConns),
+                       cn.pex.numPending(),
+               )
+       } else {
+               // This alternative branch prints out the remote live conn addresses.
+               return fmt.Sprintf(
+                       "%v conns, %v unsent events",
+                       strings.Join(generics.SliceMap(
+                               maps.Keys(cn.pex.remoteLiveConns),
+                               func(from netip.AddrPort) string {
+                                       return from.String()
+                               }), ","),
+                       cn.pex.numPending(),
+               )
+       }
 }
 
 func (cn *PeerConn) peerImplStatusLines() []string {
@@ -1039,25 +1055,31 @@ func (c *PeerConn) pexPeerFlags() pp.PexPeerFlags {
 // This returns the address to use if we want to dial the peer again. It incorporates the peer's
 // advertised listen port.
 func (c *PeerConn) dialAddr() PeerRemoteAddr {
-       if !c.outgoing && c.PeerListenPort != 0 {
-               switch addr := c.RemoteAddr.(type) {
-               case *net.TCPAddr:
-                       dialAddr := *addr
-                       dialAddr.Port = c.PeerListenPort
-                       return &dialAddr
-               case *net.UDPAddr:
-                       dialAddr := *addr
-                       dialAddr.Port = c.PeerListenPort
-                       return &dialAddr
-               }
+       if c.outgoing || c.PeerListenPort == 0 {
+               return c.RemoteAddr
        }
-       return c.RemoteAddr
+       addrPort, err := addrPortFromPeerRemoteAddr(c.RemoteAddr)
+       if err != nil {
+               c.logger.Levelf(
+                       log.Warning,
+                       "error parsing %q for alternate dial port: %v",
+                       c.RemoteAddr,
+                       err,
+               )
+               return c.RemoteAddr
+       }
+       return netip.AddrPortFrom(addrPort.Addr(), uint16(c.PeerListenPort))
 }
 
-func (c *PeerConn) pexEvent(t pexEventType) pexEvent {
+func (c *PeerConn) pexEvent(t pexEventType) (_ pexEvent, err error) {
        f := c.pexPeerFlags()
-       addr := c.dialAddr()
-       return pexEvent{t, addr, f, nil}
+       dialAddr := c.dialAddr()
+       addr, err := addrPortFromPeerRemoteAddr(dialAddr)
+       if err != nil || !addr.IsValid() {
+               err = fmt.Errorf("parsing dial addr %q: %w", dialAddr, err)
+               return
+       }
+       return pexEvent{t, addr, f, nil}, nil
 }
 
 func (c *PeerConn) String() string {
@@ -1076,10 +1098,9 @@ func (pc *PeerConn) remoteIsTransmission() bool {
        return bytes.HasPrefix(pc.PeerID[:], []byte("-TR")) && pc.PeerID[7] == '-'
 }
 
-func (pc *PeerConn) remoteAddrPort() Option[netip.AddrPort] {
-       return Some(pc.conn.RemoteAddr().(interface {
-               AddrPort() netip.AddrPort
-       }).AddrPort())
+func (pc *PeerConn) remoteDialAddrPort() (netip.AddrPort, error) {
+       dialAddr := pc.dialAddr()
+       return addrPortFromPeerRemoteAddr(dialAddr)
 }
 
 func (pc *PeerConn) bitExtensionEnabled(bit pp.ExtensionBit) bool {