mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-07 10:14:35 +00:00
fix peer establish direct conn with subnet proxy to one of local interface (#1782)
* fix peer establish direct conn with subnet proxy to one of local interface * fix peer mgr ref loop
This commit is contained in:
@@ -233,7 +233,6 @@ impl AsyncTcpConnector for Socks5KcpConnector {
|
||||
kcp_endpoint,
|
||||
peer_mgr: self.peer_mgr.clone(),
|
||||
};
|
||||
println!("connect to kcp endpoint, addr = {:?}", addr);
|
||||
let ret = c
|
||||
.connect(self.src_addr, addr)
|
||||
.await
|
||||
@@ -355,7 +354,7 @@ impl Socks5ServerNet {
|
||||
pub fn new(
|
||||
ipv4_addr: cidr::Ipv4Inet,
|
||||
auth: Option<SimpleUserPassword>,
|
||||
peer_manager: Arc<PeerManager>,
|
||||
peer_manager: Weak<PeerManager>,
|
||||
packet_recv: Arc<Mutex<mpsc::Receiver<ZCPacket>>>,
|
||||
entries: Socks5EntrySet,
|
||||
) -> Self {
|
||||
@@ -390,6 +389,10 @@ impl Socks5ServerNet {
|
||||
|
||||
let dst = ipv4.get_destination();
|
||||
let packet = ZCPacket::new_with_payload(&data);
|
||||
let Some(peer_manager) = peer_manager.upgrade() else {
|
||||
tracing::warn!("peer manager is gone, smoltcp sender exited");
|
||||
return;
|
||||
};
|
||||
if let Err(e) = peer_manager
|
||||
.send_msg_by_ip(packet, IpAddr::V4(dst), false)
|
||||
.await
|
||||
@@ -474,7 +477,7 @@ struct UdpClientKey {
|
||||
|
||||
pub struct Socks5Server {
|
||||
global_ctx: Arc<GlobalCtx>,
|
||||
peer_manager: Arc<PeerManager>,
|
||||
peer_manager: Weak<PeerManager>,
|
||||
auth: Option<SimpleUserPassword>,
|
||||
|
||||
tasks: Arc<std::sync::Mutex<JoinSet<()>>>,
|
||||
@@ -587,7 +590,7 @@ impl Socks5Server {
|
||||
let (packet_sender, packet_recv) = mpsc::channel(1024);
|
||||
Arc::new(Self {
|
||||
global_ctx,
|
||||
peer_manager,
|
||||
peer_manager: Arc::downgrade(&peer_manager),
|
||||
auth,
|
||||
|
||||
tasks: Arc::new(std::sync::Mutex::new(JoinSet::new())),
|
||||
@@ -675,7 +678,7 @@ impl Socks5Server {
|
||||
)?;
|
||||
|
||||
let entries = self.entries.clone();
|
||||
let peer_manager = Arc::downgrade(&self.peer_manager);
|
||||
let peer_manager = self.peer_manager.clone();
|
||||
let net = self.net.clone();
|
||||
self.tasks.lock().unwrap().spawn(async move {
|
||||
loop {
|
||||
@@ -714,7 +717,10 @@ impl Socks5Server {
|
||||
let cfgs = self.global_ctx.config.get_port_forwards();
|
||||
self.reload_port_forwards(&cfgs).await?;
|
||||
|
||||
self.peer_manager
|
||||
let Some(peer_manager) = self.peer_manager.upgrade() else {
|
||||
return Err(anyhow::anyhow!("peer manager is gone").into());
|
||||
};
|
||||
peer_manager
|
||||
.add_packet_process_pipeline(Box::new(self.clone()))
|
||||
.await;
|
||||
|
||||
@@ -806,7 +812,7 @@ impl Socks5Server {
|
||||
join_joinset_background(tasks.clone(), "tcp port forward".to_string());
|
||||
let forward_tasks = tasks;
|
||||
let kcp_endpoint = self.kcp_endpoint.lock().await.clone();
|
||||
let peer_mgr = Arc::downgrade(&self.peer_manager.clone());
|
||||
let peer_mgr = self.peer_manager.clone();
|
||||
let cancel_token = CancellationToken::new();
|
||||
self.cancel_tokens
|
||||
.insert(cfg.clone(), cancel_token.clone().drop_guard());
|
||||
|
||||
Reference in New Issue
Block a user