From c8d69ab2e20af6f555754988c5bd3015c0319123 Mon Sep 17 00:00:00 2001 From: Roman Borschel Date: Mon, 22 Mar 2021 10:53:30 +0100 Subject: [PATCH] [identify] Add configurable automatic push on listen addr changes. (#2004) * Add configurable automatic push of listen addr changes. * Update changelog and cleanup. --- protocols/identify/CHANGELOG.md | 4 ++++ protocols/identify/src/identify.rs | 35 ++++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/protocols/identify/CHANGELOG.md b/protocols/identify/CHANGELOG.md index a3eee56830f..e652fd8eeef 100644 --- a/protocols/identify/CHANGELOG.md +++ b/protocols/identify/CHANGELOG.md @@ -1,5 +1,9 @@ # 0.29.0 [unreleased] +- Add support for configurable automatic push to connected peers + on listen addr changes. Disabled by default. + [PR 2004](https://github.com/libp2p/rust-libp2p/pull/2004) + - Implement the `/ipfs/id/push/1.0.0` protocol. cf. https://github.com/libp2p/specs/tree/master/identify#identifypush [PR 1999](https://github.com/libp2p/rust-libp2p/pull/1999) diff --git a/protocols/identify/src/identify.rs b/protocols/identify/src/identify.rs index 970ea8345c2..dbd3587ec46 100644 --- a/protocols/identify/src/identify.rs +++ b/protocols/identify/src/identify.rs @@ -107,6 +107,16 @@ pub struct IdentifyConfig { /// /// Defaults to 5 minutes. pub interval: Duration, + + /// Whether new or expired listen addresses of the local node should + /// trigger an active push of an identify message to all connected peers. + /// + /// Enabling this option can result in connected peers being informed + /// earlier about new or expired listen addresses of the local node, + /// i.e. before the next periodic identify request with each peer. + /// + /// Disabled by default. + pub push_listen_addr_updates: bool, } impl IdentifyConfig { @@ -119,6 +129,7 @@ impl IdentifyConfig { local_public_key, initial_delay: Duration::from_millis(500), interval: Duration::from_secs(5 * 60), + push_listen_addr_updates: false, } } @@ -141,6 +152,14 @@ impl IdentifyConfig { self.interval = d; self } + + /// Configures whether new or expired listen addresses of the local + /// node should trigger an active push of an identify message to all + /// connected peers. + pub fn with_push_listen_addr_updates(mut self, b: bool) -> Self { + self.push_listen_addr_updates = b; + self + } } impl Identify { @@ -194,7 +213,7 @@ impl NetworkBehaviour for Identify { ConnectedPoint::Listener { send_back_addr, .. } => send_back_addr.clone(), }; - self.connected.entry(*peer_id).or_default().insert(*conn, addr.clone()); + self.connected.entry(*peer_id).or_default().insert(*conn, addr); } fn inject_connection_closed(&mut self, peer_id: &PeerId, conn: &ConnectionId, _: &ConnectedPoint) { @@ -214,6 +233,18 @@ impl NetworkBehaviour for Identify { self.pending_push.remove(peer_id); } + fn inject_new_listen_addr(&mut self, _addr: &Multiaddr) { + if self.config.push_listen_addr_updates { + self.pending_push.extend(self.connected.keys()); + } + } + + fn inject_expired_listen_addr(&mut self, _addr: &Multiaddr) { + if self.config.push_listen_addr_updates { + self.pending_push.extend(self.connected.keys()); + } + } + fn inject_event( &mut self, peer_id: PeerId, @@ -341,7 +372,7 @@ impl NetworkBehaviour for Identify { Poll::Ready(Err(err)) => { let event = IdentifyEvent::Error { peer_id: peer, - error: ProtocolsHandlerUpgrErr::Upgrade(UpgradeError::Apply(err.into())) + error: ProtocolsHandlerUpgrErr::Upgrade(UpgradeError::Apply(err)) }; return Poll::Ready(NetworkBehaviourAction::GenerateEvent(event)); },