diff options
| author | tv <tv@krebsco.de> | 2026-11-01 05:00:43 +0100 |
|---|---|---|
| committer | tv <tv@krebsco.de> | 2026-11-01 05:00:43 +0100 |
| commit | 67a476525bf23fec7aa10a962668cc77cce6c685 (patch) | |
| tree | a259ef08154e1bc11efee95b22d3f615f564538b /src/transport/libp2p/driver.rs | |
| parent | c08574fac02c781b615969943e3d0d95ee402537 (diff) | |
libp2p: dial newly announced peer addresses
Diffstat (limited to 'src/transport/libp2p/driver.rs')
| -rw-r--r-- | src/transport/libp2p/driver.rs | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/src/transport/libp2p/driver.rs b/src/transport/libp2p/driver.rs index 145592d..9b4259f 100644 --- a/src/transport/libp2p/driver.rs +++ b/src/transport/libp2p/driver.rs @@ -220,6 +220,7 @@ pub(super) async fn run( book.rtts.remove(&connection_id); if book.connection(&peer_id).is_none() { book.identified.remove(&peer_id); + book.explored.remove(&peer_id); } } let cause = match cause { @@ -267,9 +268,23 @@ pub(super) async fn run( if serving && !left_out && !is_local(&address) && !is_relayed(&address) { swarm.add_external_address(address.clone()); } - let mut book = lock(&book); - if !book.listening.contains(&address) { - book.listening.push(address); + let new_path = !left_out && !is_local(&address) && !is_relayed(&address); + { + let mut book = lock(&book); + if !book.listening.contains(&address) { + book.listening.push(address); + } + // A new interface (ethernet besides the WLAN, say): every + // address may be reached better now. + if new_path { + book.explored.clear(); + } + } + if new_path { + let peers: Vec<PeerId> = swarm.connected_peers().copied().collect(); + for peer in peers { + explore(&mut swarm, &book, peer, true); + } } } SwarmEvent::ExpiredListenAddr { address, .. } => { @@ -501,6 +516,7 @@ pub(super) async fn run( } } upgrade(&mut swarm, &book, peer_id, relaying.local); + explore(&mut swarm, &book, peer_id, false); } SwarmEvent::Behaviour(BehaviourEvent::Mdns( ::libp2p::mdns::Event::Discovered(found), |
