]> Sergey Matveev's repositories - btrtrc.git/blobdiff - peerconn.go
Fix panic logging unknown holepunch error code
[btrtrc.git] / peerconn.go
index 9915758332b7ca1408e58fd566008e3bba224e19..5fda15a2f436135126cd849e3c0271aeece41fe3 100644 (file)
@@ -12,6 +12,7 @@ import (
        "net/netip"
        "strconv"
        "strings"
+       "sync/atomic"
        "time"
 
        "github.com/RoaringBitmap/roaring"
@@ -54,8 +55,10 @@ type PeerConn struct {
 
        messageWriter peerConnMsgWriter
 
-       uploadTimer *time.Timer
-       pex         pexConnState
+       PeerExtensionIDs map[pp.ExtensionName]pp.ExtensionNumber
+       PeerClientName   atomic.Value
+       uploadTimer      *time.Timer
+       pex              pexConnState
 
        // The pieces the peer has claimed to have.
        _peerPieces roaring.Bitmap
@@ -95,7 +98,6 @@ func (cn *PeerConn) pexStatus() string {
                                }), ","),
                        cn.pex.numPending(),
                )
-
        }
 }
 
@@ -104,6 +106,7 @@ func (cn *PeerConn) peerImplStatusLines() []string {
                cn.connString,
                fmt.Sprintf("peer id: %+q", cn.PeerID),
                fmt.Sprintf("extensions: %v", cn.PeerExtensionBytes),
+               fmt.Sprintf("ltep extensions: %v", cn.PeerExtensionIDs),
                fmt.Sprintf("pex: %s", cn.pexStatus()),
        }
 }
@@ -1072,10 +1075,15 @@ func (c *PeerConn) dialAddr() PeerRemoteAddr {
        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 {
@@ -1102,3 +1110,26 @@ func (pc *PeerConn) remoteDialAddrPort() (netip.AddrPort, error) {
 func (pc *PeerConn) bitExtensionEnabled(bit pp.ExtensionBit) bool {
        return pc.t.cl.config.Extensions.GetBit(bit) && pc.PeerExtensionBytes.GetBit(bit)
 }
+
+func (cn *PeerConn) peerPiecesChanged() {
+       cn.t.maybeDropMutuallyCompletePeer(cn)
+}
+
+// Returns whether the connection could be useful to us. We're seeding and
+// they want data, we don't have metainfo and they can provide it, etc.
+func (c *PeerConn) useful() bool {
+       t := c.t
+       if c.closed.IsSet() {
+               return false
+       }
+       if !t.haveInfo() {
+               return c.supportsExtension("ut_metadata")
+       }
+       if t.seeding() && c.peerInterested {
+               return true
+       }
+       if c.peerHasWantedPieces() {
+               return true
+       }
+       return false
+}