c.t = t
t.reconcileHandshakeStats(c)
}
+
+func (c *connection) peerPriority() peerPriority {
+ return bep40PriorityIgnoreError(c.remoteIpPort(), c.t.cl.publicAddr(c.remoteIp()))
+}
+
+func (c *connection) remoteIp() net.IP {
+ return missinggo.AddrIP(c.remoteAddr())
+}
+
+func (c *connection) remoteIpPort() ipPort {
+ return ipPort{missinggo.AddrIP(c.remoteAddr()), uint16(missinggo.AddrPort(c.remoteAddr()))}
+}
package torrent
-import "container/heap"
+import (
+ "container/heap"
+ "fmt"
+ "unsafe"
+)
func worseConn(l, r *connection) bool {
var ml multiLess
ml.StrictNext(
l.completedHandshake.Equal(r.completedHandshake),
l.completedHandshake.Before(r.completedHandshake))
- return ml.Final()
+ ml.StrictNext(l.peerPriority() == r.peerPriority(), l.peerPriority() < r.peerPriority())
+ ml.StrictNext(l == r, uintptr(unsafe.Pointer(l)) < uintptr(unsafe.Pointer(r)))
+ less, ok := ml.FinalOk()
+ if !ok {
+ panic(fmt.Sprintf("cannot differentiate %#v and %#v", l, r))
+ }
+ return less
}
type worseConnSlice struct {