Identify remote peers by full `SocketAddr`

Wire inboxes were kept per IP address. However, there could be multiple peers
connecting from the same IP (for instance, if it is an IP of a NAT).
This commit is contained in:
Dr. Maxim Orlovsky 2022-11-14 10:04:31 +01:00 committed by Alexis Sellier
parent c620f873e5
commit 6b87eed670
No known key found for this signature in database
1 changed files with 11 additions and 13 deletions

View File

@ -2,7 +2,7 @@ pub mod message;
use std::collections::{BTreeMap, HashMap}; use std::collections::{BTreeMap, HashMap};
use std::convert::TryFrom; use std::convert::TryFrom;
use std::net::IpAddr; use std::net;
use std::ops::{Deref, DerefMut}; use std::ops::{Deref, DerefMut};
use std::string::FromUtf8Error; use std::string::FromUtf8Error;
use std::{io, mem}; use std::{io, mem};
@ -424,7 +424,7 @@ impl Decode for node::Features {
#[derive(Debug)] #[derive(Debug)]
pub struct Wire<R, S, T, G> { pub struct Wire<R, S, T, G> {
inboxes: HashMap<IpAddr, Decoder>, inboxes: HashMap<net::SocketAddr, Decoder>,
inner: service::Service<R, S, T, G>, inner: service::Service<R, S, T, G>,
} }
@ -446,27 +446,25 @@ where
{ {
pub fn connected( pub fn connected(
&mut self, &mut self,
addr: std::net::SocketAddr, addr: net::SocketAddr,
local_addr: &std::net::SocketAddr, local_addr: &net::SocketAddr,
link: Link, link: Link,
) { ) {
self.inboxes.insert(addr.ip(), Decoder::new(256)); self.inboxes.insert(addr, Decoder::new(256));
self.inner.connected(addr, local_addr, link) self.inner.connected(addr, local_addr, link)
} }
pub fn disconnected( pub fn disconnected(
&mut self, &mut self,
addr: &std::net::SocketAddr, addr: &net::SocketAddr,
reason: nakamoto::DisconnectReason<service::DisconnectReason>, reason: nakamoto::DisconnectReason<service::DisconnectReason>,
) { ) {
self.inboxes.remove(&addr.ip()); self.inboxes.remove(&addr);
self.inner.disconnected(addr, &reason) self.inner.disconnected(addr, &reason)
} }
pub fn received_bytes(&mut self, addr: &std::net::SocketAddr, bytes: &[u8]) { pub fn received_bytes(&mut self, addr: &net::SocketAddr, bytes: &[u8]) {
let peer_ip = addr.ip(); if let Some(inbox) = self.inboxes.get_mut(addr) {
if let Some(inbox) = self.inboxes.get_mut(&peer_ip) {
inbox.input(bytes); inbox.input(bytes);
loop { loop {
@ -476,14 +474,14 @@ where
Err(err) => { Err(err) => {
// TODO: Disconnect peer. // TODO: Disconnect peer.
log::error!("Invalid message received from {}: {}", peer_ip, err); log::error!("Invalid message received from {}: {}", addr, err);
return; return;
} }
} }
} }
} else { } else {
log::debug!("Received message from unknown peer {}", peer_ip); log::debug!("Received message from unknown peer {}", addr);
} }
} }
} }