Compare commits

..

No commits in common. "ab79ee58de53483f49554ecf251f5a3bcb6358af" and "dd9444c5ef1d30991b0f6351f37b8d27d0b127ff" have entirely different histories.

5 changed files with 21 additions and 39 deletions

4
Cargo.lock generated
View File

@ -600,9 +600,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.48" version = "1.0.45"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cc371affeffc477f42a221a1e4297aedcea33d47d19b61455588bd9d8f6b19ac" checksum = "ea9c5432ff16d6152371f808fb5a871cd67368171b09bb21b43df8e4a47a3556"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View File

@ -270,10 +270,7 @@ impl<D: Device, P: Protocol, S: Socket, TS: TimeSource> GenericCloud<D, P, S, TS
pub fn connect<Addr: ToSocketAddrs + fmt::Debug + Clone>(&mut self, addr: Addr) -> Result<(), Error> { pub fn connect<Addr: ToSocketAddrs + fmt::Debug + Clone>(&mut self, addr: Addr) -> Result<(), Error> {
let addrs = resolve(&addr)?.into_iter().map(mapped_addr).collect::<Vec<_>>(); let addrs = resolve(&addr)?.into_iter().map(mapped_addr).collect::<Vec<_>>();
for addr in &addrs { for addr in &addrs {
if self.own_addresses.contains(addr) if self.own_addresses.contains(addr) || self.peers.contains_key(addr) {
|| self.peers.contains_key(addr)
|| self.pending_inits.contains_key(addr)
{
return Ok(()) return Ok(())
} }
} }
@ -356,7 +353,7 @@ impl<D: Device, P: Protocol, S: Socket, TS: TimeSource> GenericCloud<D, P, S, TS
} }
} }
for addr in del { for addr in del {
info!("Forgot peer {} due to timeout", addr_nice(addr)); info!("Forgot peer: {}", addr_nice(addr));
self.peers.remove(&addr); self.peers.remove(&addr);
self.table.remove_claims(addr); self.table.remove_claims(addr);
self.connect_sock(addr)?; // Try to reconnect self.connect_sock(addr)?; // Try to reconnect
@ -611,7 +608,6 @@ impl<D: Device, P: Protocol, S: Socket, TS: TimeSource> GenericCloud<D, P, S, TS
fn remove_peer(&mut self, addr: SocketAddr) { fn remove_peer(&mut self, addr: SocketAddr) {
if let Some(_peer) = self.peers.remove(&addr) { if let Some(_peer) = self.peers.remove(&addr) {
info!("Closing connection to {}", addr_nice(addr));
self.table.remove_claims(addr); self.table.remove_claims(addr);
} }
} }
@ -705,28 +701,20 @@ impl<D: Device, P: Protocol, S: Socket, TS: TimeSource> GenericCloud<D, P, S, TS
} }
pub fn handle_net_message(&mut self, src: SocketAddr, data: &mut MsgBuffer) -> Result<(), Error> { pub fn handle_net_message(&mut self, src: SocketAddr, data: &mut MsgBuffer) -> Result<(), Error> {
let src = mapped_addr(src);
debug!("Received {} bytes from {}", data.len(), src); debug!("Received {} bytes from {}", data.len(), src);
let msg_result = if let Some(init) = self.pending_inits.get_mut(&src) { let msg_result = if let Some(init) = self.pending_inits.get_mut(&src) {
init.handle_message(data) init.handle_message(data)
} else if is_init_message(data.message()) { } else if is_init_message(data.message()) {
let mut init = self.crypto.peer_instance(self.create_node_info()); let mut init = self.crypto.peer_instance(self.create_node_info());
let msg_result = init.handle_message(data); let msg_result = init.handle_message(data);
match msg_result { if msg_result.is_ok() {
Ok(res) => { self.pending_inits.insert(src, init);
self.pending_inits.insert(src, init);
Ok(res)
}
Err(err) => {
debug!("Init error from {}: {}", src, err);
info!("Ignoring invalid init message from peer {}", addr_nice(src));
return Ok(())
}
} }
msg_result
} else if let Some(peer) = self.peers.get_mut(&src) { } else if let Some(peer) = self.peers.get_mut(&src) {
peer.crypto.handle_message(data) peer.crypto.handle_message(data)
} else { } else {
info!("Ignoring non-init message from unknown peer {}", addr_nice(src)); error!("Received non-init message from unknown peer {}", addr_nice(src));
return Ok(()) return Ok(())
}; };
match msg_result { match msg_result {
@ -749,12 +737,10 @@ impl<D: Device, P: Protocol, S: Socket, TS: TimeSource> GenericCloud<D, P, S, TS
let src = try_fail!(self.socket.receive(buffer), "Failed to read from network socket: {}"); let src = try_fail!(self.socket.receive(buffer), "Failed to read from network socket: {}");
self.traffic.count_in_traffic(src, buffer.len()); self.traffic.count_in_traffic(src, buffer.len());
if let Err(e) = self.handle_net_message(src, buffer) { if let Err(e) = self.handle_net_message(src, buffer) {
error!("Error: {}", e);
if let Error::CryptoInit(_) = e { if let Error::CryptoInit(_) = e {
debug!("Crypto init error: {}", e); info!("Closing pending connection to {} due to error", addr_nice(src));
info!("Closing pending connection to {} due to error in crypto init", addr_nice(src));
self.pending_inits.remove(&src); self.pending_inits.remove(&src);
} else {
error!("Error: {}", e);
} }
} }
} }

View File

@ -174,7 +174,7 @@ impl CryptoCore {
tag_space.clone_from_slice(tag.as_ref()); tag_space.clone_from_slice(tag.as_ref());
} }
fn decrypt_with_key(key: &mut CryptoKey, nonce: Nonce, data_and_tag: &mut [u8]) -> Result<(), Error> { fn decrypt_with_key<'a>(key: &mut CryptoKey, nonce: Nonce, data_and_tag: &'a mut [u8]) -> Result<(), Error> {
if nonce < key.min_nonce { if nonce < key.min_nonce {
return Err(Error::Crypto("Old nonce rejected")) return Err(Error::Crypto("Old nonce rejected"))
} }

View File

@ -82,7 +82,6 @@ pub const CLOSING: u8 = 5;
pub const SALTED_NODE_ID_HASH_LEN: usize = 20; pub const SALTED_NODE_ID_HASH_LEN: usize = 20;
pub type SaltedNodeIdHash = [u8; SALTED_NODE_ID_HASH_LEN]; pub type SaltedNodeIdHash = [u8; SALTED_NODE_ID_HASH_LEN];
#[allow(clippy::large_enum_variant)] #[allow(clippy::large_enum_variant)]
pub enum InitMsg { pub enum InitMsg {
Ping { Ping {
@ -562,7 +561,6 @@ impl<P: Payload> InitState<P> {
}) })
.max_by(|(_, s1), (_, s2)| if s1 < s2 { cmp::Ordering::Less } else { cmp::Ordering::Greater }); .max_by(|(_, s1), (_, s2)| if s1 < s2 { cmp::Ordering::Less } else { cmp::Ordering::Greater });
if let Some(algo) = algo { if let Some(algo) = algo {
debug!("Init: best algorithm is {:?} with speed {}", algo.0, algo.1);
Ok(Some(algo)) Ok(Some(algo))
} else { } else {
Err(Error::CryptoInit("No common algorithms")) Err(Error::CryptoInit("No common algorithms"))

View File

@ -39,7 +39,7 @@ mod internal {
return None return None
} }
}; };
debug!("Port-forwarding: found router at {}", gateway.addr); info!("Port-forwarding: found router at {}", gateway.addr);
let internal_addr = SocketAddrV4::new(get_internal_ip(), port); let internal_addr = SocketAddrV4::new(get_internal_ip(), port);
// Query the external address // Query the external address
let external_ip = match gateway.get_external_ip() { let external_ip = match gateway.get_external_ip() {
@ -50,10 +50,9 @@ mod internal {
} }
}; };
if let Ok((port, timeout)) = Self::get_any_forwarding(&gateway, internal_addr, port) { if let Ok((port, timeout)) = Self::get_any_forwarding(&gateway, internal_addr, port) {
debug!("Port-forwarding: external IP is {}", external_ip); info!("Port-forwarding: external IP is {}", external_ip);
let external_addr = SocketAddrV4::new(external_ip, port); let external_addr = SocketAddrV4::new(external_ip, port);
debug!("Port-forwarding has timeout {}", timeout); info!("Port-forwarding: successfully activated port forward on {}, timeout: {}", external_addr, timeout);
info!("Port-forwarding: successfully activated port forward on {}", external_addr);
let next_extension = let next_extension =
if timeout > 0 { Some(SystemTimeSource::now() + Time::from(timeout) - 60) } else { None }; if timeout > 0 { Some(SystemTimeSource::now() + Time::from(timeout) - 60) } else { None };
Some(PortForwarding { internal_addr, external_addr, gateway, next_extension }) Some(PortForwarding { internal_addr, external_addr, gateway, next_extension })
@ -79,12 +78,11 @@ mod internal {
return Ok(a) return Ok(a)
} }
} }
warn!("Failed to activate port forwarding");
Err(()) Err(())
} }
fn get_forwarding(gateway: &Gateway, addr: SocketAddrV4, port: u16) -> Result<(u16, u32), ()> { fn get_forwarding(gateway: &Gateway, addr: SocketAddrV4, port: u16) -> Result<(u16, u32), ()> {
debug!("Trying external port {}", port); info!("Trying external port {}", port);
if port == 0 { if port == 0 {
match gateway.add_any_port(PortMappingProtocol::UDP, addr, LEASE_TIME, DESCRIPTION) { match gateway.add_any_port(PortMappingProtocol::UDP, addr, LEASE_TIME, DESCRIPTION) {
Ok(port) => Ok((port, LEASE_TIME)), Ok(port) => Ok((port, LEASE_TIME)),
@ -92,13 +90,13 @@ mod internal {
match gateway.add_any_port(PortMappingProtocol::UDP, addr, 0, DESCRIPTION) { match gateway.add_any_port(PortMappingProtocol::UDP, addr, 0, DESCRIPTION) {
Ok(port) => Ok((port, 0)), Ok(port) => Ok((port, 0)),
Err(err) => { Err(err) => {
debug!("Port-forwarding: failed to activate port forwarding: {}", err); error!("Port-forwarding: failed to activate port forwarding: {}", err);
Err(()) Err(())
} }
} }
} }
Err(err) => { Err(err) => {
debug!("Port-forwarding: failed to activate port forwarding: {}", err); error!("Port-forwarding: failed to activate port forwarding: {}", err);
Err(()) Err(())
} }
} }
@ -110,13 +108,13 @@ mod internal {
match gateway.add_port(PortMappingProtocol::UDP, port, addr, 0, DESCRIPTION) { match gateway.add_port(PortMappingProtocol::UDP, port, addr, 0, DESCRIPTION) {
Ok(()) => Ok((port, 0)), Ok(()) => Ok((port, 0)),
Err(err) => { Err(err) => {
debug!("Port-forwarding: failed to activate port forwarding: {}", err); error!("Port-forwarding: failed to activate port forwarding: {}", err);
Err(()) Err(())
} }
} }
} }
Err(err) => { Err(err) => {
debug!("Port-forwarding: failed to activate port forwarding: {}", err); error!("Port-forwarding: failed to activate port forwarding: {}", err);
Err(()) Err(())
} }
} }
@ -139,7 +137,7 @@ mod internal {
DESCRIPTION DESCRIPTION
) { ) {
Ok(()) => debug!("Port-forwarding: extended port forwarding"), Ok(()) => debug!("Port-forwarding: extended port forwarding"),
Err(err) => debug!("Port-forwarding: failed to extend port forwarding: {}", err) Err(err) => error!("Port-forwarding: failed to extend port forwarding: {}", err)
}; };
self.next_extension = Some(SystemTimeSource::now() + Time::from(LEASE_TIME) - 60); self.next_extension = Some(SystemTimeSource::now() + Time::from(LEASE_TIME) - 60);
} }
@ -147,7 +145,7 @@ mod internal {
fn deactivate(&self) { fn deactivate(&self) {
match self.gateway.remove_port(PortMappingProtocol::UDP, self.external_addr.port()) { match self.gateway.remove_port(PortMappingProtocol::UDP, self.external_addr.port()) {
Ok(()) => info!("Port-forwarding: successfully deactivated port forwarding"), Ok(()) => info!("Port-forwarding: successfully deactivated port forwarding"),
Err(err) => debug!("Port-forwarding: failed to deactivate port forwarding: {}", err) Err(err) => error!("Port-forwarding: failed to deactivate port forwarding: {}", err)
} }
} }
} }