mpsc tunnel may be stuck by slow tcp stream, should not panic for this (#406)
Some checks failed
EasyTier Core / pre_job (push) Has been cancelled
EasyTier GUI / pre_job (push) Has been cancelled
EasyTier Mobile / pre_job (push) Has been cancelled
EasyTier Test / pre_job (push) Has been cancelled
EasyTier Core / build (freebsd-13.2-x86_64, 13.2, ubuntu-latest, x86_64-unknown-freebsd) (push) Has been cancelled
EasyTier Core / build (linux-aarch64, ubuntu-latest, aarch64-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (linux-arm, ubuntu-latest, arm-unknown-linux-musleabi) (push) Has been cancelled
EasyTier Core / build (linux-armhf, ubuntu-latest, arm-unknown-linux-musleabihf) (push) Has been cancelled
EasyTier Core / build (linux-armv7, ubuntu-latest, armv7-unknown-linux-musleabi) (push) Has been cancelled
EasyTier Core / build (linux-armv7hf, ubuntu-latest, armv7-unknown-linux-musleabihf) (push) Has been cancelled
EasyTier Core / build (linux-mips, ubuntu-latest, mips-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (linux-mipsel, ubuntu-latest, mipsel-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (linux-x86_64, ubuntu-latest, x86_64-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (macos-aarch64, macos-latest, aarch64-apple-darwin) (push) Has been cancelled
EasyTier Core / build (macos-x86_64, macos-latest, x86_64-apple-darwin) (push) Has been cancelled
EasyTier Core / build (windows-x86_64, windows-latest, x86_64-pc-windows-msvc) (push) Has been cancelled
EasyTier Core / core-result (push) Has been cancelled
EasyTier GUI / build-gui (linux-aarch64, aarch64-unknown-linux-gnu, ubuntu-latest, aarch64-unknown-linux-musl) (push) Has been cancelled
EasyTier GUI / build-gui (linux-x86_64, x86_64-unknown-linux-gnu, ubuntu-latest, x86_64-unknown-linux-musl) (push) Has been cancelled
EasyTier GUI / build-gui (macos-aarch64, aarch64-apple-darwin, macos-latest, aarch64-apple-darwin) (push) Has been cancelled
EasyTier GUI / build-gui (macos-x86_64, x86_64-apple-darwin, macos-latest, x86_64-apple-darwin) (push) Has been cancelled
EasyTier GUI / build-gui (windows-x86_64, x86_64-pc-windows-msvc, windows-latest, x86_64-pc-windows-msvc) (push) Has been cancelled
EasyTier GUI / gui-result (push) Has been cancelled
EasyTier Mobile / build-mobile (android, ubuntu-latest, android) (push) Has been cancelled
EasyTier Mobile / mobile-result (push) Has been cancelled
EasyTier Test / test (push) Has been cancelled

* mpsc tunnel may be stuck by slow tcp stream, should not panic for this
* disallow node connect to self
This commit is contained in:
Sijie.Sun 2024-10-11 00:12:14 +08:00 committed by GitHub
parent 7ab8cad1af
commit d2291628e0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 56 additions and 11 deletions

View File

@ -224,8 +224,13 @@ impl PeerConn {
self.info = Some(rsp); self.info = Some(rsp);
self.is_client = Some(false); self.is_client = Some(false);
self.send_handshake().await?; self.send_handshake().await?;
if self.get_peer_id() == self.my_peer_id {
Err(Error::WaitRespError("peer id conflict".to_owned()))
} else {
Ok(()) Ok(())
} }
}
#[tracing::instrument] #[tracing::instrument]
pub async fn do_handshake_as_client(&mut self) -> Result<(), Error> { pub async fn do_handshake_as_client(&mut self) -> Result<(), Error> {
@ -235,8 +240,13 @@ impl PeerConn {
tracing::info!("handshake response: {:?}", rsp); tracing::info!("handshake response: {:?}", rsp);
self.info = Some(rsp); self.info = Some(rsp);
self.is_client = Some(true); self.is_client = Some(true);
if self.get_peer_id() == self.my_peer_id {
Err(Error::WaitRespError("peer id conflict".to_owned()))
} else {
Ok(()) Ok(())
} }
}
pub fn handshake_done(&self) -> bool { pub fn handshake_done(&self) -> bool {
self.info.is_some() self.info.is_some()
@ -396,6 +406,24 @@ mod tests {
use crate::tunnel::filter::PacketRecorderTunnelFilter; use crate::tunnel::filter::PacketRecorderTunnelFilter;
use crate::tunnel::ring::create_ring_tunnel_pair; use crate::tunnel::ring::create_ring_tunnel_pair;
#[tokio::test]
async fn peer_conn_handshake_same_id() {
let (c, s) = create_ring_tunnel_pair();
let c_peer_id = new_peer_id();
let s_peer_id = c_peer_id;
let mut c_peer = PeerConn::new(c_peer_id, get_mock_global_ctx(), Box::new(c));
let mut s_peer = PeerConn::new(s_peer_id, get_mock_global_ctx(), Box::new(s));
let (c_ret, s_ret) = tokio::join!(
c_peer.do_handshake_as_client(),
s_peer.do_handshake_as_server()
);
assert!(c_ret.is_err());
assert!(s_ret.is_err());
}
#[tokio::test] #[tokio::test]
async fn peer_conn_handshake() { async fn peer_conn_handshake() {
let (c, s) = create_ring_tunnel_pair(); let (c, s) = create_ring_tunnel_pair();

View File

@ -294,6 +294,8 @@ impl PeerConnPinger {
let need_close = if last_rx_packets != current_rx_packets { let need_close = if last_rx_packets != current_rx_packets {
// if we receive some packet from peers, we should relax the condition // if we receive some packet from peers, we should relax the condition
counter > 50 && loss_rate_1 > 0.5 counter > 50 && loss_rate_1 > 0.5
// TODO: wait more time to see if the loss rate is still high after no rx
} else { } else {
true true
}; };

View File

@ -70,17 +70,32 @@ impl<T: Tunnel> MpscTunnel<T> {
sink: &mut Pin<Box<dyn ZCPacketSink>>, sink: &mut Pin<Box<dyn ZCPacketSink>>,
) -> Result<(), TunnelError> { ) -> Result<(), TunnelError> {
let item = rx.recv().await.with_context(|| "recv error")?; let item = rx.recv().await.with_context(|| "recv error")?;
match timeout(Duration::from_secs(10), async move {
sink.feed(item).await?; sink.feed(item).await?;
while let Ok(item) = rx.try_recv() { while let Ok(item) = rx.try_recv() {
if let Err(e) = timeout(Duration::from_secs(5), sink.feed(item)) match sink.feed(item).await {
.await Err(e) => {
.unwrap()
{
tracing::error!(?e, "feed error"); tracing::error!(?e, "feed error");
break; return Err(e);
}
Ok(_) => {}
} }
} }
sink.flush().await sink.flush().await
})
.await
{
Ok(Ok(_)) => Ok(()),
Ok(Err(e)) => {
tracing::error!(?e, "forward error");
Err(e)
}
Err(e) => {
tracing::error!(?e, "forward timeout");
Err(e.into())
}
}
} }
pub fn get_stream(&mut self) -> Pin<Box<dyn ZCPacketStream>> { pub fn get_stream(&mut self) -> Pin<Box<dyn ZCPacketStream>> {