From 3df061d90ecb2aca4889fc181695fef674562ff7 Mon Sep 17 00:00:00 2001 From: vyzo Date: Wed, 15 Sep 2021 16:22:10 +0300 Subject: [PATCH 1/4] tag relay hops in relay implementations --- p2p/protocol/circuitv1/relay/relay.go | 34 +++++++++++++++++++++++--- p2p/protocol/circuitv2/relay/relay.go | 35 +++++++++++++++++++++++---- 2 files changed, 60 insertions(+), 9 deletions(-) diff --git a/p2p/protocol/circuitv1/relay/relay.go b/p2p/protocol/circuitv1/relay/relay.go index 4f29a582b4..719733999a 100644 --- a/p2p/protocol/circuitv1/relay/relay.go +++ b/p2p/protocol/circuitv1/relay/relay.go @@ -29,6 +29,9 @@ const ( ConnectTimeout = 30 * time.Second HandshakeTimeout = time.Minute + RelayHopTag = "relay-hop" + MaxRelayHopTag = 5 + maxMessageSize = 4096 ) @@ -158,15 +161,15 @@ func (r *Relay) handleHopStream(s network.Stream, msg *pb.CircuitRelay) { } r.active++ - r.conns[src.ID]++ - r.conns[dest.ID]++ + r.addConn(src.ID) + r.addConn(src.ID) r.mx.Unlock() cleanup := func() { r.mx.Lock() r.active-- - r.conns[src.ID]-- - r.conns[dest.ID]-- + r.rmConn(src.ID) + r.rmConn(dest.ID) r.mx.Unlock() } @@ -262,6 +265,29 @@ func (r *Relay) handleHopStream(s network.Stream, msg *pb.CircuitRelay) { go r.relayConn(bs, s, dest.ID, src.ID, done) } +func (r *Relay) addConn(p peer.ID) { + conns := r.conns[p] + conns++ + r.conns[p] = conns + if conns < MaxRelayHopTag { + r.host.ConnManager().UpsertTag(p, RelayHopTag, func(v int) int { return v + 1 }) + } +} + +func (r *Relay) rmConn(p peer.ID) { + conns := r.conns[p] + conns-- + if conns > 0 { + r.conns[p] = conns + } else { + delete(r.conns, p) + } + if conns < MaxRelayHopTag { + r.host.ConnManager().UpsertTag(p, RelayHopTag, func(v int) int { return v - 1 }) + } + +} + func (r *Relay) relayConn(src, dest network.Stream, srcID, destID peer.ID, done func()) { defer done() diff --git a/p2p/protocol/circuitv2/relay/relay.go b/p2p/protocol/circuitv2/relay/relay.go index ecd6bfc5b6..4a087285d8 100644 --- a/p2p/protocol/circuitv2/relay/relay.go +++ b/p2p/protocol/circuitv2/relay/relay.go @@ -30,6 +30,9 @@ const ( ConnectTimeout = 30 * time.Second HandshakeTimeout = time.Minute + RelayHopTag = "relay-hop" + MaxRelayHopTag = 5 + maxMessageSize = 4096 ) @@ -215,23 +218,23 @@ func (r *Relay) handleConnect(s network.Stream, msg *pbv2.HopMessage) { r.handleError(s, pbv2.Status_RESOURCE_LIMIT_EXCEEDED) return } - r.conns[src]++ destConns := r.conns[dest.ID] if destConns >= r.rc.MaxCircuits { - r.conns[src]-- r.mx.Unlock() log.Debugf("refusing connection from %s to %s; too many connecitons to %s", src, dest.ID, dest.ID) r.handleError(s, pbv2.Status_RESOURCE_LIMIT_EXCEEDED) return } - r.conns[dest.ID]++ + + r.addConn(src) + r.addConn(dest.ID) r.mx.Unlock() cleanup := func() { r.mx.Lock() - r.conns[src]-- - r.conns[dest.ID]-- + r.rmConn(src) + r.rmConn(dest.ID) r.mx.Unlock() } @@ -339,6 +342,28 @@ func (r *Relay) handleConnect(s network.Stream, msg *pbv2.HopMessage) { } } +func (r *Relay) addConn(p peer.ID) { + conns := r.conns[p] + conns++ + r.conns[p] = conns + if conns < MaxRelayHopTag { + r.host.ConnManager().UpsertTag(p, RelayHopTag, func(v int) int { return v + 1 }) + } +} + +func (r *Relay) rmConn(p peer.ID) { + conns := r.conns[p] + conns-- + if conns > 0 { + r.conns[p] = conns + } else { + delete(r.conns, p) + } + if conns < MaxRelayHopTag { + r.host.ConnManager().UpsertTag(p, RelayHopTag, func(v int) int { return v - 1 }) + } +} + func (r *Relay) relayLimited(src, dest network.Stream, srcID, destID peer.ID, limit int64, done func()) { defer done() From 369df59523548ceb80b6070c08bd8582149f8638 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Sep 2021 09:35:20 +0300 Subject: [PATCH 2/4] fix tag increment --- p2p/protocol/circuitv1/relay/relay.go | 2 +- p2p/protocol/circuitv2/relay/relay.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/p2p/protocol/circuitv1/relay/relay.go b/p2p/protocol/circuitv1/relay/relay.go index 719733999a..35ebaae9c3 100644 --- a/p2p/protocol/circuitv1/relay/relay.go +++ b/p2p/protocol/circuitv1/relay/relay.go @@ -282,7 +282,7 @@ func (r *Relay) rmConn(p peer.ID) { } else { delete(r.conns, p) } - if conns < MaxRelayHopTag { + if conns <= MaxRelayHopTag { r.host.ConnManager().UpsertTag(p, RelayHopTag, func(v int) int { return v - 1 }) } diff --git a/p2p/protocol/circuitv2/relay/relay.go b/p2p/protocol/circuitv2/relay/relay.go index 4a087285d8..5ea569d99b 100644 --- a/p2p/protocol/circuitv2/relay/relay.go +++ b/p2p/protocol/circuitv2/relay/relay.go @@ -346,7 +346,7 @@ func (r *Relay) addConn(p peer.ID) { conns := r.conns[p] conns++ r.conns[p] = conns - if conns < MaxRelayHopTag { + if conns <= MaxRelayHopTag { r.host.ConnManager().UpsertTag(p, RelayHopTag, func(v int) int { return v + 1 }) } } From 0d8a1852cfd31feb6f8d951ad0a8df258f9ae4d7 Mon Sep 17 00:00:00 2001 From: vyzo Date: Thu, 16 Sep 2021 14:06:52 +0300 Subject: [PATCH 3/4] make tag value fixed, tagged in first circuit, untagged in last. --- p2p/protocol/circuitv1/relay/relay.go | 13 +++++-------- p2p/protocol/circuitv2/relay/relay.go | 12 +++++------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/p2p/protocol/circuitv1/relay/relay.go b/p2p/protocol/circuitv1/relay/relay.go index 35ebaae9c3..1110261716 100644 --- a/p2p/protocol/circuitv1/relay/relay.go +++ b/p2p/protocol/circuitv1/relay/relay.go @@ -29,8 +29,8 @@ const ( ConnectTimeout = 30 * time.Second HandshakeTimeout = time.Minute - RelayHopTag = "relay-hop" - MaxRelayHopTag = 5 + RelayHopTag = "relay-v1-hop" + RelayHopTagValue = 2 maxMessageSize = 4096 ) @@ -269,8 +269,8 @@ func (r *Relay) addConn(p peer.ID) { conns := r.conns[p] conns++ r.conns[p] = conns - if conns < MaxRelayHopTag { - r.host.ConnManager().UpsertTag(p, RelayHopTag, func(v int) int { return v + 1 }) + if conns == 1 { + r.host.ConnManager().TagPeer(p, RelayHopTag, RelayHopTagValue) } } @@ -281,11 +281,8 @@ func (r *Relay) rmConn(p peer.ID) { r.conns[p] = conns } else { delete(r.conns, p) + r.host.ConnManager().UntagPeer(p, RelayHopTag) } - if conns <= MaxRelayHopTag { - r.host.ConnManager().UpsertTag(p, RelayHopTag, func(v int) int { return v - 1 }) - } - } func (r *Relay) relayConn(src, dest network.Stream, srcID, destID peer.ID, done func()) { diff --git a/p2p/protocol/circuitv2/relay/relay.go b/p2p/protocol/circuitv2/relay/relay.go index 5ea569d99b..a50c32fd98 100644 --- a/p2p/protocol/circuitv2/relay/relay.go +++ b/p2p/protocol/circuitv2/relay/relay.go @@ -30,8 +30,8 @@ const ( ConnectTimeout = 30 * time.Second HandshakeTimeout = time.Minute - RelayHopTag = "relay-hop" - MaxRelayHopTag = 5 + RelayHopTag = "relay-v2-hop" + RelayHopTagValue = 2 maxMessageSize = 4096 ) @@ -346,8 +346,8 @@ func (r *Relay) addConn(p peer.ID) { conns := r.conns[p] conns++ r.conns[p] = conns - if conns <= MaxRelayHopTag { - r.host.ConnManager().UpsertTag(p, RelayHopTag, func(v int) int { return v + 1 }) + if conns == 1 { + r.host.ConnManager().TagPeer(p, RelayHopTag, RelayHopTagValue) } } @@ -358,9 +358,7 @@ func (r *Relay) rmConn(p peer.ID) { r.conns[p] = conns } else { delete(r.conns, p) - } - if conns < MaxRelayHopTag { - r.host.ConnManager().UpsertTag(p, RelayHopTag, func(v int) int { return v - 1 }) + r.host.ConnManager().UntagPeer(p, RelayHopTag) } } From 9674b5cda585204fa07f9829ccddcb46a39fa8c0 Mon Sep 17 00:00:00 2001 From: vyzo Date: Tue, 21 Sep 2021 13:38:50 +0300 Subject: [PATCH 4/4] make hop tags and values private --- p2p/protocol/circuitv1/relay/relay.go | 8 ++++---- p2p/protocol/circuitv2/relay/relay.go | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/p2p/protocol/circuitv1/relay/relay.go b/p2p/protocol/circuitv1/relay/relay.go index 1110261716..1461dda300 100644 --- a/p2p/protocol/circuitv1/relay/relay.go +++ b/p2p/protocol/circuitv1/relay/relay.go @@ -29,8 +29,8 @@ const ( ConnectTimeout = 30 * time.Second HandshakeTimeout = time.Minute - RelayHopTag = "relay-v1-hop" - RelayHopTagValue = 2 + relayHopTag = "relay-v1-hop" + relayHopTagValue = 2 maxMessageSize = 4096 ) @@ -270,7 +270,7 @@ func (r *Relay) addConn(p peer.ID) { conns++ r.conns[p] = conns if conns == 1 { - r.host.ConnManager().TagPeer(p, RelayHopTag, RelayHopTagValue) + r.host.ConnManager().TagPeer(p, relayHopTag, relayHopTagValue) } } @@ -281,7 +281,7 @@ func (r *Relay) rmConn(p peer.ID) { r.conns[p] = conns } else { delete(r.conns, p) - r.host.ConnManager().UntagPeer(p, RelayHopTag) + r.host.ConnManager().UntagPeer(p, relayHopTag) } } diff --git a/p2p/protocol/circuitv2/relay/relay.go b/p2p/protocol/circuitv2/relay/relay.go index a50c32fd98..d4e08d5169 100644 --- a/p2p/protocol/circuitv2/relay/relay.go +++ b/p2p/protocol/circuitv2/relay/relay.go @@ -30,8 +30,8 @@ const ( ConnectTimeout = 30 * time.Second HandshakeTimeout = time.Minute - RelayHopTag = "relay-v2-hop" - RelayHopTagValue = 2 + relayHopTag = "relay-v2-hop" + relayHopTagValue = 2 maxMessageSize = 4096 ) @@ -347,7 +347,7 @@ func (r *Relay) addConn(p peer.ID) { conns++ r.conns[p] = conns if conns == 1 { - r.host.ConnManager().TagPeer(p, RelayHopTag, RelayHopTagValue) + r.host.ConnManager().TagPeer(p, relayHopTag, relayHopTagValue) } } @@ -358,7 +358,7 @@ func (r *Relay) rmConn(p peer.ID) { r.conns[p] = conns } else { delete(r.conns, p) - r.host.ConnManager().UntagPeer(p, RelayHopTag) + r.host.ConnManager().UntagPeer(p, relayHopTag) } }