Skip to content

Commit b460f3f

Browse files
authored
feat: do not dial mdns discovered relayed addrs, cleanup code (#12)
1 parent 19491c9 commit b460f3f

File tree

4 files changed

+33
-43
lines changed

4 files changed

+33
-43
lines changed

examples/chat/src/network.rs

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -162,21 +162,18 @@ impl EventLoop {
162162
swarm,
163163
command_receiver,
164164
event_sender,
165-
// discovery_state: discovery::DiscoveryState::new(rendezvous_namespace, 0.5),
166-
discovery: discovery::Discovery::new(discovery::DiscoveryConfig::new(
167-
discovery::RendezvousConfig::new(
168-
rendezvous_namespace,
169-
Duration::from_secs(90),
170-
0.5,
171-
),
165+
discovery: discovery::Discovery::new(discovery::RendezvousConfig::new(
166+
rendezvous_namespace,
167+
Duration::from_secs(90),
168+
0.5,
172169
)),
173170
pending_dial: Default::default(),
174171
}
175172
}
176173

177174
pub(crate) async fn run(mut self) {
178175
let mut rendezvous_discover_tick =
179-
tokio::time::interval(self.discovery.config.rendezvous.discovery_interval);
176+
tokio::time::interval(self.discovery.rendezvous_config.discovery_interval);
180177

181178
loop {
182179
tokio::select! {

examples/chat/src/network/discovery.rs

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,19 @@ use super::EventLoop;
99

1010
#[derive(Debug)]
1111
pub struct Discovery {
12-
pub config: DiscoveryConfig,
12+
pub(crate) rendezvous_config: RendezvousConfig,
1313
pub(crate) state: state::DiscoveryState,
1414
}
1515

1616
impl Discovery {
17-
pub(crate) fn new(config: DiscoveryConfig) -> Self {
17+
pub(crate) fn new(rendezvous_config: RendezvousConfig) -> Self {
1818
Discovery {
1919
state: Default::default(),
20-
config,
20+
rendezvous_config,
2121
}
2222
}
2323
}
2424

25-
#[derive(Debug)]
26-
pub(crate) struct DiscoveryConfig {
27-
pub rendezvous: RendezvousConfig,
28-
}
29-
30-
impl DiscoveryConfig {
31-
pub(crate) fn new(rendezvous: RendezvousConfig) -> Self {
32-
DiscoveryConfig { rendezvous }
33-
}
34-
}
35-
3625
#[derive(Debug)]
3726
pub struct RendezvousConfig {
3827
pub namespace: rendezvous::Namespace,
@@ -102,7 +91,7 @@ impl EventLoop {
10291
info.last_discovery_at().map_or(false, |instant| {
10392
instant.elapsed()
10493
> time::Duration::from_secs_f32(
105-
60.0 / self.discovery.config.rendezvous.discovery_rpm,
94+
60.0 / self.discovery.rendezvous_config.discovery_rpm,
10695
)
10796
})
10897
});
@@ -115,7 +104,7 @@ impl EventLoop {
115104

116105
if !is_throttled {
117106
self.swarm.behaviour_mut().rendezvous.discover(
118-
Some(self.discovery.config.rendezvous.namespace.clone()),
107+
Some(self.discovery.rendezvous_config.namespace.clone()),
119108
peer_info
120109
.rendezvous()
121110
.and_then(|info| info.cookie())
@@ -172,7 +161,7 @@ impl EventLoop {
172161
// This function expectes that the relay peer is already connected.
173162
pub(crate) fn update_rendezvous_registration(&mut self, peer_id: &PeerId) -> eyre::Result<()> {
174163
if let Err(err) = self.swarm.behaviour_mut().rendezvous.register(
175-
self.discovery.config.rendezvous.namespace.clone(),
164+
self.discovery.rendezvous_config.namespace.clone(),
176165
*peer_id,
177166
None,
178167
) {
@@ -183,7 +172,7 @@ impl EventLoop {
183172
}
184173

185174
debug!(
186-
%peer_id, rendezvous_namespace=%(self.discovery.config.rendezvous.namespace),
175+
%peer_id, rendezvous_namespace=%(self.discovery.rendezvous_config.namespace),
187176
"Sent register request to rendezvous node"
188177
);
189178
Ok(())
@@ -220,16 +209,7 @@ impl EventLoop {
220209
.get_preferred_addr()
221210
.wrap_err("Failed to get preferred addr for relay peer")?;
222211

223-
let relayed_addr = match preferred_addr
224-
.clone()
225-
.with(multiaddr::Protocol::P2pCircuit)
226-
.with_p2p(self.swarm.local_peer_id().clone())
227-
{
228-
Ok(addr) => addr,
229-
Err(err) => {
230-
eyre::bail!("Failed to construct relayed addr for relay peer: {:?}", err)
231-
}
232-
};
212+
let relayed_addr = preferred_addr.clone().with(multiaddr::Protocol::P2pCircuit);
233213
self.swarm.listen_on(relayed_addr)?;
234214
self.discovery
235215
.state

examples/chat/src/network/events.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use tracing::{error, info};
1+
use tracing::error;
22

33
use super::*;
44

@@ -83,19 +83,26 @@ impl EventLoop {
8383
}
8484
}
8585
SwarmEvent::OutgoingConnectionError { peer_id, error, .. } => {
86+
debug!("Outgoing connection error: {:?} {:?}", peer_id, error);
8687
if let Some(peer_id) = peer_id {
8788
if let Some(sender) = self.pending_dial.remove(&peer_id) {
8889
let _ = sender.send(Err(eyre::eyre!(error)));
8990
}
9091
}
9192
}
92-
SwarmEvent::IncomingConnectionError { .. } => {}
93+
SwarmEvent::IncomingConnectionError {
94+
send_back_addr,
95+
error,
96+
..
97+
} => {
98+
debug!(?send_back_addr, %error, "Incoming connection error");
99+
}
93100
SwarmEvent::Dialing {
94101
peer_id: Some(peer_id),
95102
..
96103
} => debug!("Dialing peer: {}", peer_id),
97104
SwarmEvent::ExpiredListenAddr { address, .. } => {
98-
trace!("Expired listen address: {}", address)
105+
debug!("Expired listen address: {}", address)
99106
}
100107
SwarmEvent::ListenerClosed {
101108
addresses, reason, ..
@@ -105,7 +112,7 @@ impl EventLoop {
105112
trace!("New external address candidate: {}", address)
106113
}
107114
SwarmEvent::ExternalAddrConfirmed { address } => {
108-
info!("External address confirmed: {}", address);
115+
debug!("External address confirmed: {}", address);
109116
if let Ok(relayed_addr) = RelayedMultiaddr::try_from(&address) {
110117
self.discovery.state.update_relay_reservation_status(
111118
&relayed_addr.relay_peer,

examples/chat/src/network/events/mdns.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use libp2p::mdns;
22
use owo_colors::OwoColorize;
3-
use tracing::{debug, error};
3+
use tracing::{debug, error, info};
44

5-
use super::{EventHandler, EventLoop};
5+
use super::{EventHandler, EventLoop, RelayedMultiaddr};
66

77
impl EventHandler<mdns::Event> for EventLoop {
88
async fn handle(&mut self, event: mdns::Event) {
@@ -11,7 +11,13 @@ impl EventHandler<mdns::Event> for EventLoop {
1111
match event {
1212
mdns::Event::Discovered(peers) => {
1313
for (peer_id, addr) in peers {
14-
debug!(%peer_id, %addr, "Discovered peer via mdns");
14+
if RelayedMultiaddr::try_from(&addr).is_ok() {
15+
// Skip "fake" relayed addresses to avoid OutgoingConnectionError e.g.:
16+
// /ip4/192.168.1.4/udp/4001/quic-v1/p2p/12D3KooWRnt7EmBwrNALhAXAgM151MdH7Ka9tvYS91ZUqnqwpjVg/p2p-circuit/p2p/12D3KooWSUpChB4mHmZNwVV26at6ZsRo25hNBHJRmPa8zfCeT41Y
17+
continue;
18+
}
19+
20+
info!(%peer_id, %addr, "Attempting to dial discovered peer via mdns");
1521

1622
if let Err(err) = self.swarm.dial(addr) {
1723
error!("Failed to dial peer: {:?}", err);

0 commit comments

Comments
 (0)