From 9861c4e8503712eb2f3e778ae20846d883e66c67 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 30 Oct 2025 15:33:09 +0800 Subject: [PATCH] connecting_chan, includes the IPInfo --- src/lib.rs | 11 ++++++++--- src/network/async_main.rs | 9 ++++++--- src/network/node.rs | 7 ++++++- src/tcp/tcp_conn.rs | 19 +++++++++++-------- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index da89680..d1972b3 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,6 @@ mod pb; mod tcp; mod utils; -use std::collections::HashMap; use std::{sync::atomic::AtomicU8, time::Duration}; use std::net::{SocketAddr, ToSocketAddrs}; @@ -25,7 +24,12 @@ use sdlan_sn_rs::{ utils::{create_or_load_uuid, get_sdlan_sock_from_socketaddr, Result, SDLanError}, }; -use crate::network::Node; + +#[derive(Clone)] +pub enum ConnectionInfo { + ConnState(ConnectionState), + IPInfo(String), +} #[derive(Clone)] #[repr(u8)] @@ -40,7 +44,7 @@ pub async fn run_sdlan( sender: std::sync::mpsc::Sender, install_channel: &str, - connecting_chan: Option>, // start_stop_sender: Sender, + connecting_chan: Option>, // start_stop_sender: Sender, // start_stop_receiver: Receiver, ) -> Result<()> { let (start_stop_sender, start_stop_chan) = channel(20); @@ -56,6 +60,7 @@ pub async fn run_sdlan( args.tos, start_stop_sender, args.mtu, + connecting_chan.clone(), ) .await { diff --git a/src/network/async_main.rs b/src/network/async_main.rs index 8b27be3..0ae96ce 100755 --- a/src/network/async_main.rs +++ b/src/network/async_main.rs @@ -14,7 +14,7 @@ use crate::pb::{ }; use crate::tcp::{init_tcp_conn, EventType, NakMsgCode, NatType, PacketType, SdlanTcp}; use crate::utils::{send_to_sock, CommandLine}; -use crate::ConnectionState; +use crate::{ConnectionInfo, ConnectionState}; use sdlan_sn_rs::config::AF_INET; use sdlan_sn_rs::peer::{SdlanSock, V6Info}; use sdlan_sn_rs::utils::{get_current_timestamp, ip_to_string, is_multi_broadcast, rsa_decrypt}; @@ -67,6 +67,9 @@ async fn handle_tcp_message(msg: SdlanTcp) { .ip .net_addr .store(dev.net_addr, Ordering::Relaxed); + if let Some(ref chan) = edge.connection_chan { + let _ = chan.send(ConnectionInfo::IPInfo(ip)).await; + } /* let mac = match dev.mac.try_into() { Err(_) => NULL_MAC, @@ -247,7 +250,7 @@ pub async fn async_main( args: CommandLine, start_stop_chan: Receiver, cancel: CancellationToken, - connecting_chan: Option>, + connecting_chan: Option>, ) -> Result<()> { // let _ = PidRecorder::new(".pid"); @@ -339,7 +342,7 @@ pub async fn async_main( || async { edge.set_authorized(false, vec![]); }, - |msg| handle_tcp_message(msg), + |msg| handle_tcp_message(msg), edge.tcp_pong.clone(), // tcp_pong, start_stop_chan, diff --git a/src/network/node.rs b/src/network/node.rs index 4fbc385..691d1ef 100755 --- a/src/network/node.rs +++ b/src/network/node.rs @@ -10,7 +10,7 @@ use tokio::sync::mpsc::Sender; use tokio::sync::oneshot; use tracing::{debug, error}; -use crate::get_base_dir; +use crate::{ConnectionInfo, get_base_dir}; use crate::pb::{ encode_to_tcp_message, encode_to_udp_message, SdlEmpty, SdlStunProbe, SdlStunProbeReply, }; @@ -37,6 +37,7 @@ pub async fn init_edge( tos: u32, start_stop: Sender, mtu: u32, + connecting_chan: Option>, ) -> Result<()> { // gen public key let rsa_path = format!("{}/.client", get_base_dir()); @@ -79,6 +80,7 @@ pub async fn init_edge( tcp_pong.clone(), start_stop, mtu, + connecting_chan, ); do_init_edge(edge)?; @@ -120,6 +122,7 @@ pub struct Node { pub tcp_pong: Arc, start_stop_sender: Sender, + pub connection_chan: Option>, // user token info pub _token: Mutex, @@ -257,6 +260,7 @@ impl Node { tcp_pong: Arc, start_stop: Sender, mtu: u32, + connecting_chan: Option>, ) -> Self { let mode = if cfg!(not(feature = "tun")) { Mode::Tap @@ -271,6 +275,7 @@ impl Node { network_code: Mutex::new(network_code.to_owned()), start_stop_sender: start_stop, + connection_chan: connecting_chan, tcp_pong, diff --git a/src/tcp/tcp_conn.rs b/src/tcp/tcp_conn.rs index ced48f3..ce3ad18 100755 --- a/src/tcp/tcp_conn.rs +++ b/src/tcp/tcp_conn.rs @@ -22,7 +22,7 @@ use tracing::error; use crate::config::TCP_PING_TIME; use crate::network::StartStopInfo; use crate::tcp::read_a_packet; -use crate::ConnectionState; +use crate::{ConnectionInfo, ConnectionState}; use super::tcp_codec::SdlanTcp; @@ -37,7 +37,7 @@ pub struct ReadWriteActor { // actor收到数据之后,发送给上层的发送端口,接收端由handle保存 from_tcp: Sender, cancel: CancellationToken, - connecting_chan: Option>, + connecting_chan: Option>, ipv6_network_restarter: Option>, } @@ -48,7 +48,7 @@ impl ReadWriteActor { from_tcp: Sender, connected: Arc, pong_time: Arc, - connecting_chan: Option>, + connecting_chan: Option>, ipv6_network_restarter: Option>, ) -> Self { Self { @@ -81,7 +81,8 @@ impl ReadWriteActor { let mut start_pkt_id = None; loop { if let Some(ref connecting_chan) = self.connecting_chan { - let _ = connecting_chan.send(ConnectionState::NotConnected).await; + let state = ConnectionInfo::ConnState(ConnectionState::NotConnected); + let _ = connecting_chan.send(state).await; } self.connected.store(false, Ordering::Relaxed); if !started { @@ -117,7 +118,8 @@ impl ReadWriteActor { } if let Some(ref connecting_chan) = self.connecting_chan { - let _ = connecting_chan.send(ConnectionState::Connecting).await; + let state = ConnectionInfo::ConnState(ConnectionState::Connecting); + let _ = connecting_chan.send(state).await; } debug!("try connecting..."); @@ -141,7 +143,8 @@ impl ReadWriteActor { on_connected(&mut stream, start_pkt_id.take()).await; if let Some(ref connecting_chan) = self.connecting_chan { - let _ = connecting_chan.send(ConnectionState::Connected).await; + let state = ConnectionInfo::ConnState(ConnectionState::Connected); + let _ = connecting_chan.send(state).await; } if let Some(ref ipv6_restarter) = self.ipv6_network_restarter { let _ = ipv6_restarter.send(true).await; @@ -264,7 +267,7 @@ impl ReadWriterHandle { pong_time: Arc, start_stop_chan: Receiver, // cancel: CancellationToken, - connecting_chan: Option>, + connecting_chan: Option>, ipv6_network_restarter: Option>, ) -> Self where @@ -321,7 +324,7 @@ pub fn init_tcp_conn<'a, T, T3, T2, F, F2>( pong_time: Arc, // cancel: CancellationToken, start_stop_chan: Receiver, - connecting_chan: Option>, + connecting_chan: Option>, ipv6_network_restarter: Option>, ) where T: for<'b> Fn(&'b mut TcpStream, Option) -> BoxFuture<'b, ()> + Send + 'static,