From: Matt Joiner Date: Tue, 19 Mar 2024 04:21:48 +0000 (+1100) Subject: Track v2 state in peer conn X-Git-Tag: v1.56.0~48 X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=01d4ec3994019580e610ac84991d6e041efcef42;p=btrtrc.git Track v2 state in peer conn --- diff --git a/client.go b/client.go index ed1a0c71..f0587686 100644 --- a/client.go +++ b/client.go @@ -1016,6 +1016,10 @@ func (cl *Client) receiveHandshakes(c *PeerConn) (t *Torrent, err error) { } cl.lock() t = cl.torrentsByShortHash[ih] + if t.infoHashV2.Ok && *t.infoHashV2.Value.ToShort() == ih { + torrent.Add("v2 handshakes received", 1) + c.v2 = true + } cl.unlock() return } @@ -1662,7 +1666,7 @@ func (cl *Client) newConnection(nc net.Conn, opts newConnectionOpts) (c *PeerCon } c.peerImpl = c c.logger = cl.logger.WithDefaultLevel(log.Warning) - c.logger = c.logger.WithContextText(fmt.Sprintf("%T %p", c, c)) + c.logger = c.logger.WithContextText(fmt.Sprintf("%T %p", c, c)).WithNames(protocolLoggingName) c.setRW(connStatsReadWriter{nc, c}) c.r = &rateLimitedReader{ l: cl.config.DownloadRateLimiter, diff --git a/logging.go b/logging.go new file mode 100644 index 00000000..bfc985c8 --- /dev/null +++ b/logging.go @@ -0,0 +1,3 @@ +package torrent + +const protocolLoggingName = "protocol" diff --git a/peer.go b/peer.go index 37d7ca57..71b8e855 100644 --- a/peer.go +++ b/peer.go @@ -96,7 +96,8 @@ type ( PeerMaxRequests maxRequests // Maximum pending requests the peer allows. - logger log.Logger + logger log.Logger + protocolLogger log.Logger } PeerSource string @@ -225,9 +226,9 @@ func (cn *Peer) statusFlags() (ret string) { if cn.choking { c('c') } - c('-') + c(':') ret += cn.connectionFlags() - c('-') + c(':') if cn.peerInterested { c('i') } diff --git a/peerconn.go b/peerconn.go index 232da671..8bf510ea 100644 --- a/peerconn.go +++ b/peerconn.go @@ -183,20 +183,30 @@ func (cn *PeerConn) peerPieces() *roaring.Bitmap { return &cn._peerPieces } -func (cn *PeerConn) connectionFlags() (ret string) { - c := func(b byte) { - ret += string([]byte{b}) +func (cn *PeerConn) connectionFlags() string { + var sb strings.Builder + add := func(s string) { + if sb.Len() > 0 { + sb.WriteByte(',') + } + sb.WriteString(s) + } + // From first relevant to last. + add(string(cn.Discovery)) + if cn.utp() { + add("U") } if cn.cryptoMethod == mse.CryptoMethodRC4 { - c('E') + add("E") } else if cn.headerEncrypted { - c('e') + add("e") } - ret += string(cn.Discovery) - if cn.utp() { - c('U') + if cn.v2 { + add("v2") + } else { + add("v1") } - return + return sb.String() } func (cn *PeerConn) utp() bool { @@ -883,7 +893,7 @@ func (c *PeerConn) mainReadLoop() (err error) { case pp.Hashes: err = c.onReadHashes(&msg) case pp.HashRequest, pp.HashReject: - c.logger.Levelf(log.Info, "received unimplemented BitTorrent v2 message: %v", msg.Type) + c.protocolLogger.Levelf(log.Info, "received unimplemented BitTorrent v2 message: %v", msg.Type) default: err = fmt.Errorf("received unknown message type: %#v", msg.Type) } @@ -1243,6 +1253,9 @@ func (pc *PeerConn) requestMissingHashes() { if !info.HasV2() { return } + if !pc.v2 { + return + } baseLayer := pp.Integer(merkle.Log2RoundingUp(merkle.RoundUpToPowerOfTwo( uint((pc.t.usualPieceSize() + merkle.BlockSize - 1) / merkle.BlockSize)), ))