summaryrefslogtreecommitdiffstats
path: root/src/transport
diff options
context:
space:
mode:
Diffstat (limited to 'src/transport')
-rw-r--r--src/transport/libp2p.rs8
-rw-r--r--src/transport/mod.rs5
-rw-r--r--src/transport/paths.rs20
-rw-r--r--src/transport/stats.rs10
4 files changed, 24 insertions, 19 deletions
diff --git a/src/transport/libp2p.rs b/src/transport/libp2p.rs
index 995d074..58fbf64 100644
--- a/src/transport/libp2p.rs
+++ b/src/transport/libp2p.rs
@@ -1318,7 +1318,13 @@ impl Transport for Libp2pTransport {
fn location(&self, target: &str) -> Option<String> {
let peer = PeerId::from_str(target).ok()?;
- lock(&self.book).location(&peer).map(Multiaddr::to_string)
+ let address = lock(&self.book).location(&peer)?.clone();
+ Some(
+ address
+ .with_p2p(peer)
+ .unwrap_or_else(|address| address)
+ .to_string(),
+ )
}
fn stats(&self) -> TransportStats {
diff --git a/src/transport/mod.rs b/src/transport/mod.rs
index c70d27f..25ad56d 100644
--- a/src/transport/mod.rs
+++ b/src/transport/mod.rs
@@ -669,8 +669,9 @@ pub(crate) trait Transport: Send + Sync {
None
}
- /// Where messages to `target` (a transport identity) go now: the remote address of
- /// the connection in use, say. By default nowhere but `target` itself (Mycelium).
+ /// Where messages to `target` (a transport identity) go now, as an address that
+ /// names `target` too: the remote address of the connection in use, say. By default
+ /// nowhere but `target` itself (Mycelium).
fn location(&self, target: &str) -> Option<String> {
let _ = target;
None
diff --git a/src/transport/paths.rs b/src/transport/paths.rs
index 1f6d078..ba16794 100644
--- a/src/transport/paths.rs
+++ b/src/transport/paths.rs
@@ -334,7 +334,6 @@ impl Table {
let path = self.paths.get(address);
PathInfo {
address: address.to_owned(),
- location: None,
rtt_ms: path
.and_then(|path| path.rtt)
.map(|rtt| rtt.as_secs_f64() * 1000.0),
@@ -450,13 +449,16 @@ impl Paths {
self.located(infos)
}
- /// `infos` with where each path goes (`Transport::location`); asked outside the
- /// table's lock.
+ /// `infos` with where each path goes, where the transport knows
+ /// (`Transport::location`); asked outside the table's lock.
fn located(&self, mut infos: Vec<PathInfo>) -> Vec<PathInfo> {
for info in &mut infos {
- info.location = self
+ if let Some((link, location)) = self
.split(&info.address)
- .and_then(|(link, target)| link.inner.location(&target));
+ .and_then(|(link, target)| Some((link, link.inner.location(&target)?)))
+ {
+ info.address = link.address(&location);
+ }
}
infos
}
@@ -658,7 +660,7 @@ impl Paths {
stats.merge(link.inner.stats());
}
let now = Instant::now();
- let (mut paths, counts) = {
+ let (paths, counts) = {
let table = self.table.lock_or_recover();
let paths: Vec<PathInfo> = table
.paths
@@ -667,11 +669,9 @@ impl Paths {
.collect();
(paths, table.counts)
};
+ let mut paths = self.located(paths);
paths.sort_by(|a, b| a.address.cmp(&b.address));
- stats.paths = Some(PathsStats {
- paths: self.located(paths),
- counts,
- });
+ stats.paths = Some(PathsStats { paths, counts });
stats
}
diff --git a/src/transport/stats.rs b/src/transport/stats.rs
index 8b456cc..398ffdf 100644
--- a/src/transport/stats.rs
+++ b/src/transport/stats.rs
@@ -47,13 +47,11 @@ pub(crate) struct PathsStats {
#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct PathInfo {
- /// `<scheme>:<transport identity>`: whom the path goes to, as the transport knows it
- /// (a libp2p peer ID, a Mycelium public key, an onion service).
+ /// `<scheme>:<where it goes>`: where the transport says the path goes now
+ /// (`Transport::location`; libp2p: the remote address of its connection, ending in
+ /// the peer ID), else whom it goes to, `<scheme>:<transport identity>` (a libp2p
+ /// peer ID without a connection, a Mycelium public key, an onion service).
pub(crate) address: String,
- /// Where the path goes now (`Transport::location`): for libp2p, the remote address of
- /// its connection. Absent where the address says it all (Mycelium, Tor), or with no
- /// connection.
- pub(crate) location: Option<String>,
/// Smoothed round-trip time of its PINGs (ours, and our keepalives); absent before
/// an answer.
pub(crate) rtt_ms: Option<f64>,