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:
parent
c620f873e5
commit
6b87eed670
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue