diff --git a/util/network/src/host.rs b/util/network/src/host.rs index 50c721fb6..b0de67499 100644 --- a/util/network/src/host.rs +++ b/util/network/src/host.rs @@ -857,11 +857,16 @@ impl Host { // Add it to the node table if !s.info.originated { if let Ok(address) = s.remote_addr() { - let entry = NodeEntry { id: id, endpoint: NodeEndpoint { address: address, udp_port: address.port() } }; - self.nodes.write().add_node(Node::new(entry.id.clone(), entry.endpoint.clone())); - let mut discovery = self.discovery.lock(); - if let Some(ref mut discovery) = *discovery { - discovery.add_node(entry); + // We can't know remote listening ports, so just assume defaults and hope for the best. + let endpoint = NodeEndpoint { address: SocketAddr::new(address.ip(), DEFAULT_PORT), udp_port: DEFAULT_PORT }; + let entry = NodeEntry { id: id, endpoint: endpoint }; + let mut nodes = self.nodes.write(); + if !nodes.contains(&entry.id) { + nodes.add_node(Node::new(entry.id.clone(), entry.endpoint.clone())); + let mut discovery = self.discovery.lock(); + if let Some(ref mut discovery) = *discovery { + discovery.add_node(entry); + } } } } diff --git a/util/network/src/node_table.rs b/util/network/src/node_table.rs index 8498f4190..1481187d4 100644 --- a/util/network/src/node_table.rs +++ b/util/network/src/node_table.rs @@ -236,6 +236,11 @@ impl NodeTable { self.nodes.get_mut(id) } + /// Check if a node exists in the table. + pub fn contains(&self, id: &NodeId) -> bool { + self.nodes.contains_key(id) + } + /// Apply table changes coming from discovery pub fn update(&mut self, mut update: TableUpdates, reserved: &HashSet) { for (_, node) in update.added.drain() {