}
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
}
}
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,
PeerMaxRequests maxRequests // Maximum pending requests the peer allows.
- logger log.Logger
+ logger log.Logger
+ protocolLogger log.Logger
}
PeerSource string
if cn.choking {
c('c')
}
- c('-')
+ c(':')
ret += cn.connectionFlags()
- c('-')
+ c(':')
if cn.peerInterested {
c('i')
}
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 {
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)
}
if !info.HasV2() {
return
}
+ if !pc.v2 {
+ return
+ }
baseLayer := pp.Integer(merkle.Log2RoundingUp(merkle.RoundUpToPowerOfTwo(
uint((pc.t.usualPieceSize() + merkle.BlockSize - 1) / merkle.BlockSize)),
))