Skip to content

Commit 8a70f70

Browse files
authored
Merge pull request #1188 from libp2p/feat/relay-tags
Tag relay hops in relay implementations
2 parents d1e2681 + 9674b5c commit 8a70f70

2 files changed

Lines changed: 55 additions & 9 deletions

File tree

p2p/protocol/circuitv1/relay/relay.go

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ const (
2929
ConnectTimeout = 30 * time.Second
3030
HandshakeTimeout = time.Minute
3131

32+
relayHopTag = "relay-v1-hop"
33+
relayHopTagValue = 2
34+
3235
maxMessageSize = 4096
3336
)
3437

@@ -158,15 +161,15 @@ func (r *Relay) handleHopStream(s network.Stream, msg *pb.CircuitRelay) {
158161
}
159162

160163
r.active++
161-
r.conns[src.ID]++
162-
r.conns[dest.ID]++
164+
r.addConn(src.ID)
165+
r.addConn(src.ID)
163166
r.mx.Unlock()
164167

165168
cleanup := func() {
166169
r.mx.Lock()
167170
r.active--
168-
r.conns[src.ID]--
169-
r.conns[dest.ID]--
171+
r.rmConn(src.ID)
172+
r.rmConn(dest.ID)
170173
r.mx.Unlock()
171174
}
172175

@@ -262,6 +265,26 @@ func (r *Relay) handleHopStream(s network.Stream, msg *pb.CircuitRelay) {
262265
go r.relayConn(bs, s, dest.ID, src.ID, done)
263266
}
264267

268+
func (r *Relay) addConn(p peer.ID) {
269+
conns := r.conns[p]
270+
conns++
271+
r.conns[p] = conns
272+
if conns == 1 {
273+
r.host.ConnManager().TagPeer(p, relayHopTag, relayHopTagValue)
274+
}
275+
}
276+
277+
func (r *Relay) rmConn(p peer.ID) {
278+
conns := r.conns[p]
279+
conns--
280+
if conns > 0 {
281+
r.conns[p] = conns
282+
} else {
283+
delete(r.conns, p)
284+
r.host.ConnManager().UntagPeer(p, relayHopTag)
285+
}
286+
}
287+
265288
func (r *Relay) relayConn(src, dest network.Stream, srcID, destID peer.ID, done func()) {
266289
defer done()
267290

p2p/protocol/circuitv2/relay/relay.go

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ const (
3030
ConnectTimeout = 30 * time.Second
3131
HandshakeTimeout = time.Minute
3232

33+
relayHopTag = "relay-v2-hop"
34+
relayHopTagValue = 2
35+
3336
maxMessageSize = 4096
3437
)
3538

@@ -215,23 +218,23 @@ func (r *Relay) handleConnect(s network.Stream, msg *pbv2.HopMessage) {
215218
r.handleError(s, pbv2.Status_RESOURCE_LIMIT_EXCEEDED)
216219
return
217220
}
218-
r.conns[src]++
219221

220222
destConns := r.conns[dest.ID]
221223
if destConns >= r.rc.MaxCircuits {
222-
r.conns[src]--
223224
r.mx.Unlock()
224225
log.Debugf("refusing connection from %s to %s; too many connecitons to %s", src, dest.ID, dest.ID)
225226
r.handleError(s, pbv2.Status_RESOURCE_LIMIT_EXCEEDED)
226227
return
227228
}
228-
r.conns[dest.ID]++
229+
230+
r.addConn(src)
231+
r.addConn(dest.ID)
229232
r.mx.Unlock()
230233

231234
cleanup := func() {
232235
r.mx.Lock()
233-
r.conns[src]--
234-
r.conns[dest.ID]--
236+
r.rmConn(src)
237+
r.rmConn(dest.ID)
235238
r.mx.Unlock()
236239
}
237240

@@ -339,6 +342,26 @@ func (r *Relay) handleConnect(s network.Stream, msg *pbv2.HopMessage) {
339342
}
340343
}
341344

345+
func (r *Relay) addConn(p peer.ID) {
346+
conns := r.conns[p]
347+
conns++
348+
r.conns[p] = conns
349+
if conns == 1 {
350+
r.host.ConnManager().TagPeer(p, relayHopTag, relayHopTagValue)
351+
}
352+
}
353+
354+
func (r *Relay) rmConn(p peer.ID) {
355+
conns := r.conns[p]
356+
conns--
357+
if conns > 0 {
358+
r.conns[p] = conns
359+
} else {
360+
delete(r.conns, p)
361+
r.host.ConnManager().UntagPeer(p, relayHopTag)
362+
}
363+
}
364+
342365
func (r *Relay) relayLimited(src, dest network.Stream, srcID, destID peer.ID, limit int64, done func()) {
343366
defer done()
344367

0 commit comments

Comments
 (0)