From 7c3b04db907aadf0661055e3837d1bb31e59c607 Mon Sep 17 00:00:00 2001 From: timzaak Date: Mon, 19 Jun 2023 15:39:48 +0800 Subject: [PATCH 1/4] bak --- client/lib/src/device/mod.rs | 23 ++++++----------------- client/lib/src/device/peer.rs | 20 ++++++++++++++++++-- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/client/lib/src/device/mod.rs b/client/lib/src/device/mod.rs index e7dc2db..a081745 100644 --- a/client/lib/src/device/mod.rs +++ b/client/lib/src/device/mod.rs @@ -255,7 +255,6 @@ pub async fn tun_read_handle(peers: &Arc>, udp4: &UdpSocket, udp6: } else { tracing::error!("No endpoint"); } - //TODO: get tcp socket from peers and send } _ => panic!("Unexpected result from encapsulate"), }; @@ -384,10 +383,7 @@ pub async fn tcp_peers_timer( } TunnResult::Err(e) => tracing::error!(message = "Timer error", error = ?e), TunnResult::WriteToNetwork(packet) => { - if let TcpConnection::Connected(connection) = &mut p.endpoint.tcp_conn { - let _ = connection.write_all(packet).await; - } - + p.endpoint.tcp_write(packet).await; } _ => tracing::warn!("Unexpected result from update_timers"), }; @@ -571,11 +567,7 @@ pub fn tcp_handler( }, WriterState::PeerWriter(peer)=> { let mut p = peer.lock().await; - if let TcpConnection::Connected(w) = &mut p.endpoint.tcp_conn { - let _ = w.write_all(cookie).await; - }else { - tracing::warn!("should not come here"); - } + p.endpoint.tcp_write(packet).await; } } continue; @@ -619,10 +611,7 @@ pub fn tcp_handler( TunnResult::Err(_) => continue, TunnResult::WriteToNetwork(packet) => { flush = true; - - if let TcpConnection::Connected(conn) = &mut p.endpoint.tcp_conn { - let _ = conn.write_all(packet).await; - } + p.endpoint.tcp_write(packet).await; } TunnResult::WriteToTunnelV4(packet, addr) => { // tracing::debug!("{addr:?}"); @@ -680,15 +669,15 @@ pub fn tcp_handler( while let TunnResult::WriteToNetwork(packet) = p.tunnel.decapsulate(None, &[], &mut dst_buf[..]) { - if let TcpConnection::Connected(conn) = &mut p.endpoint.tcp_conn { - let _ = conn.write_all(packet).await; - } + p.endpoint.tcp_write(packet).await; } } } } tracing::info!("tcp: {addr:?} close"); }); + + } diff --git a/client/lib/src/device/peer.rs b/client/lib/src/device/peer.rs index a77e038..3ba54aa 100644 --- a/client/lib/src/device/peer.rs +++ b/client/lib/src/device/peer.rs @@ -11,6 +11,7 @@ use std::sync::Arc; use std::time::SystemTime; use boringtun::noise::{Tunn, TunnResult}; +use tokio::io::AsyncWriteExt; use tokio::net::{UdpSocket}; use tokio::net::tcp::OwnedWriteHalf; use crate::device::allowed_ips::AllowedIps; @@ -29,6 +30,22 @@ pub struct Endpoint { pub tcp_conn: TcpConnection, } +impl Endpoint { + pub async fn tcp_write(&mut self, bytes:&[u8]) { + if let TcpConnection::Connected(conn) = &mut self.tcp_conn { + match conn.write_all(bytes).await { + Ok(_) => { + // do nothing + }, + Err(e) => { + tracing::error!("tcp conn of {:?} fail, error: {}", conn.peer_addr(), e); + self.tcp_conn = TcpConnection::ConnectedFailure(e); + } + }; + } + } +} + pub struct Peer { /// The associated tunnel struct pub(crate) tunnel: Tunn, @@ -104,8 +121,7 @@ impl Peer { pub fn shutdown_endpoint(&mut self) { if let Some(_) = &mut self.endpoint.udp_conn.take() { tracing::info!("disconnecting from endpoint"); - } - if let TcpConnection::Connected(_) = &mut self.endpoint.tcp_conn { + } else if let TcpConnection::Connected(_) = &mut self.endpoint.tcp_conn { tracing::info!("disconnecting tcp connection"); } self.endpoint.tcp_conn = TcpConnection::Nothing; From 06b8c2341b495514721cb55037de90a9ace7dba9 Mon Sep 17 00:00:00 2001 From: timzaak Date: Mon, 19 Jun 2023 21:12:02 +0800 Subject: [PATCH 2/4] fix it --- client/lib/src/device/mod.rs | 12 ++++++++---- client/lib/src/device/peer.rs | 4 ++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/client/lib/src/device/mod.rs b/client/lib/src/device/mod.rs index a081745..8e6fe32 100644 --- a/client/lib/src/device/mod.rs +++ b/client/lib/src/device/mod.rs @@ -341,6 +341,7 @@ pub async fn tcp_peers_timer( ) { let mut interval = time::interval(Duration::from_millis(250)); let mut dst_buf: Vec= vec![0; MAX_UDP_SIZE]; + let error_recovery_duration = Duration::from_secs(10); loop { interval.tick().await; @@ -352,7 +353,10 @@ pub async fn tcp_peers_timer( None => continue, }; match &mut p.endpoint.tcp_conn { - TcpConnection::Nothing | TcpConnection::ConnectedFailure(_) => { + TcpConnection::ConnectedFailure(_, time) if time.elapsed().map(|x| x < error_recovery_duration).unwrap_or(false) => { + continue; + } + TcpConnection::Nothing | TcpConnection::ConnectedFailure(..) => { if node_type == NodeType::NodeClient || ip < &p.ip { p.endpoint.tcp_conn = TcpConnection::Connecting(SystemTime::now()); match TcpStream::connect(&endpoint_addr).await { @@ -363,7 +367,7 @@ pub async fn tcp_peers_timer( }, Err(error) => { tracing::debug!("connect {endpoint_addr:?} failure, error: {error:?}"); - p.endpoint.tcp_conn = TcpConnection::ConnectedFailure(error) + p.endpoint.tcp_conn = TcpConnection::ConnectedFailure(error, SystemTime::now()); } }; } @@ -567,7 +571,7 @@ pub fn tcp_handler( }, WriterState::PeerWriter(peer)=> { let mut p = peer.lock().await; - p.endpoint.tcp_write(packet).await; + p.endpoint.tcp_write(cookie).await; } } continue; @@ -593,7 +597,7 @@ pub fn tcp_handler( }; let mut p = peer.lock().await; - if let TcpConnection::Nothing | TcpConnection::ConnectedFailure(_) = p.endpoint.tcp_conn { + if let TcpConnection::Nothing | TcpConnection::ConnectedFailure(..) = p.endpoint.tcp_conn { if let WriterState::PureWriter(_) = &mut writer { let pure_writer = mem::replace(&mut writer,WriterState::PeerWriter(peer.clone())); if let WriterState::PureWriter(_writer) = pure_writer { diff --git a/client/lib/src/device/peer.rs b/client/lib/src/device/peer.rs index 3ba54aa..7e7753e 100644 --- a/client/lib/src/device/peer.rs +++ b/client/lib/src/device/peer.rs @@ -21,7 +21,7 @@ pub enum TcpConnection { Nothing, Connecting(SystemTime), Connected(OwnedWriteHalf), - ConnectedFailure(std::io::Error) + ConnectedFailure(std::io::Error, SystemTime), } #[derive(Debug)] pub struct Endpoint { @@ -39,7 +39,7 @@ impl Endpoint { }, Err(e) => { tracing::error!("tcp conn of {:?} fail, error: {}", conn.peer_addr(), e); - self.tcp_conn = TcpConnection::ConnectedFailure(e); + self.tcp_conn = TcpConnection::ConnectedFailure(e, SystemTime::now()); } }; } From 485024c4fe6cfc8146611c339f1bc6934aa0b6e9 Mon Sep 17 00:00:00 2001 From: timzaak Date: Mon, 19 Jun 2023 21:16:32 +0800 Subject: [PATCH 3/4] bak it --- admin-web/src/view/network/NetworkDetailPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin-web/src/view/network/NetworkDetailPage.tsx b/admin-web/src/view/network/NetworkDetailPage.tsx index bd099cc..b1887eb 100644 --- a/admin-web/src/view/network/NetworkDetailPage.tsx +++ b/admin-web/src/view/network/NetworkDetailPage.tsx @@ -67,7 +67,7 @@ export default function NetworkDetailPage() { - @@ -84,4 +84,4 @@ export default function NetworkDetailPage() { // add Nodes Navigator, Invite Code // // -// \ No newline at end of file +// From 63d384f52c74f16c20c731cba548b2523793e255 Mon Sep 17 00:00:00 2001 From: timzaak Date: Mon, 19 Jun 2023 21:19:21 +0800 Subject: [PATCH 4/4] Revert "bak it" This reverts commit 485024c4fe6cfc8146611c339f1bc6934aa0b6e9. --- admin-web/src/view/network/NetworkDetailPage.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/admin-web/src/view/network/NetworkDetailPage.tsx b/admin-web/src/view/network/NetworkDetailPage.tsx index b1887eb..bd099cc 100644 --- a/admin-web/src/view/network/NetworkDetailPage.tsx +++ b/admin-web/src/view/network/NetworkDetailPage.tsx @@ -67,7 +67,7 @@ export default function NetworkDetailPage() { - @@ -84,4 +84,4 @@ export default function NetworkDetailPage() { // add Nodes Navigator, Invite Code // // -// +// \ No newline at end of file