client.go | 6 +++++- logging.go | 3 +++ peer.go | 7 ++++--- peerconn.go | 33 +++++++++++++++++++++++---------- diff --git a/client.go b/client.go index ed1a0c714c85fb382af45cde52ebdcf2d07d0b1d..f0587686502ce6bdfab0339874287626eca845ea 100644 --- a/client.go +++ b/client.go @@ -1016,6 +1016,10 @@ return nil, fmt.Errorf("during bt handshake: %w", err) } 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 @@ } } 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 0000000000000000000000000000000000000000..bfc985c833085068883408ee250c0169b53c84b3 --- /dev/null +++ b/logging.go @@ -0,0 +1,3 @@ +package torrent + +const protocolLoggingName = "protocol" diff --git a/peer.go b/peer.go index 37d7ca57f02914ccf59059ecff8a0fe570a91b2d..71b8e855f9c6d5a27f569ab4b64a40a398f882cc 100644 --- a/peer.go +++ b/peer.go @@ -96,7 +96,8 @@ peerAllowedFast typedRoaring.Bitmap[pieceIndex] PeerMaxRequests maxRequests // Maximum pending requests the peer allows. - logger log.Logger + logger log.Logger + protocolLogger log.Logger } PeerSource string @@ -225,9 +226,9 @@ } 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 232da671be70202ece82f730dd6fa81c9e5ceb22..8bf510ead59dd072e2c891ac25157af9baa222b9 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 @@ err = c.onReadExtendedMsg(msg.ExtendedID, msg.ExtendedPayload) 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) } @@ -1241,6 +1251,9 @@ return } info := pc.t.info if !info.HasV2() { + return + } + if !pc.v2 { return } baseLayer := pp.Integer(merkle.Log2RoundingUp(merkle.RoundUpToPowerOfTwo(