]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Expect cancel acknowledgement from Transmission v4 clients
authorMatt Joiner <anacrolix@gmail.com>
Mon, 15 Jan 2024 01:43:55 +0000 (12:43 +1100)
committerMatt Joiner <anacrolix@gmail.com>
Mon, 15 Jan 2024 01:55:05 +0000 (12:55 +1100)
peer.go
peerconn.go

diff --git a/peer.go b/peer.go
index 7d524b7f2b762750fbfa3b08ab4153023da8f3bd..c4b4fb9e0e95faff1c6493d984c94fd8d6442543 100644 (file)
--- a/peer.go
+++ b/peer.go
@@ -465,6 +465,7 @@ func (me *Peer) cancel(r RequestIndex) {
                panic("request not existing should have been guarded")
        }
        if me._cancel(r) {
+               // Record that we expect to get a cancel ack.
                if !me.requestState.Cancelled.CheckedAdd(r) {
                        panic("request already cancelled")
                }
index e2d944ff269bb94426772d60f267bb359582d156..7a1639f29a1b18bfa67831fc33930986efeaaa6c 100644 (file)
@@ -297,9 +297,23 @@ func (me *PeerConn) _request(r Request) bool {
 
 func (me *PeerConn) _cancel(r RequestIndex) bool {
        me.write(makeCancelMessage(me.t.requestIndexToRequest(r)))
-       // Transmission does not send rejects for received cancels. See
-       // https://github.com/transmission/transmission/pull/2275.
-       return me.fastEnabled() && !me.remoteIsTransmission()
+       return me.remoteRejectsCancels()
+}
+
+// Whether we should expect a reject message after sending a cancel.
+func (me *PeerConn) remoteRejectsCancels() bool {
+       if !me.fastEnabled() {
+               return false
+       }
+       if me.remoteIsTransmission() {
+               // Transmission did not send rejects for received cancels. See
+               // https://github.com/transmission/transmission/pull/2275. Fixed in 4.0.0-beta.1 onward in
+               // https://github.com/transmission/transmission/commit/76719bf34c255da4fca991c2ad3fa4b65d2154b1.
+               // Peer ID prefix scheme described
+               // https://github.com/transmission/transmission/blob/7ec7607bbcf0fa99bd4b157b9b0f0c411d59f45d/CMakeLists.txt#L128-L149.
+               return me.PeerID[3] >= '4'
+       }
+       return true
 }
 
 func (cn *PeerConn) fillWriteBuffer() {