From 86871b14d5e8701c1ffcfe0a7c82487180f244a6 Mon Sep 17 00:00:00 2001 From: Luna Yao <40349250+ZnqbuZ@users.noreply.github.com> Date: Mon, 23 Feb 2026 03:29:00 +0100 Subject: [PATCH] store DnsServer in GlobalCtx, load routes from DnsServer in ProxyCidrsMonitor --- easytier/src/common/global_ctx.rs | 14 ++++++++++++++ easytier/src/dns/mod.rs | 2 +- easytier/src/dns/node.rs | 4 ++++ easytier/src/dns/server.rs | 4 ++-- easytier/src/instance/proxy_cidrs_monitor.rs | 8 ++++++++ 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/easytier/src/common/global_ctx.rs b/easytier/src/common/global_ctx.rs index 1cc589af..25e127bd 100644 --- a/easytier/src/common/global_ctx.rs +++ b/easytier/src/common/global_ctx.rs @@ -32,7 +32,9 @@ use crate::{ }; use crossbeam::atomic::AtomicCell; use hmac::{Hmac, Mac}; +use parking_lot::RwLock; use sha2::Sha256; +use crate::dns::server::DnsServer; use socket2::Protocol; pub type NetworkIdentity = crate::common::config::NetworkIdentity; @@ -202,6 +204,8 @@ pub struct GlobalCtx { hostname: Mutex, + dns: RwLock>>, + stun_info_collection: Mutex>, running_listeners: Mutex>, @@ -298,6 +302,8 @@ impl GlobalCtx { stun_info_collector.clone(), )))), + dns: RwLock::new(None), + hostname: Mutex::new(hostname), stun_info_collection: Mutex::new(stun_info_collector), @@ -416,6 +422,14 @@ impl GlobalCtx { self.ip_collector.lock().unwrap().as_ref().unwrap().clone() } + pub fn get_dns(&self) -> Option> { + self.dns.read().clone() + } + + pub fn set_dns(&self, dns: Option>) { + *self.dns.write() = dns; + } + pub fn get_hostname(&self) -> String { return self.hostname.lock().unwrap().clone(); } diff --git a/easytier/src/dns/mod.rs b/easytier/src/dns/mod.rs index e615c15e..29eb0710 100644 --- a/easytier/src/dns/mod.rs +++ b/easytier/src/dns/mod.rs @@ -2,6 +2,6 @@ mod node; mod node_mgr; pub mod config; mod peer_mgr; -mod server; +pub mod server; mod utils; pub mod zone; diff --git a/easytier/src/dns/node.rs b/easytier/src/dns/node.rs index 583bc357..7c8e3728 100644 --- a/easytier/src/dns/node.rs +++ b/easytier/src/dns/node.rs @@ -68,12 +68,16 @@ impl DnsNode { let server = Arc::new(DnsServer::new(self.peer_mgr.clone(), rpc)); + self.peer_mgr + .get_global_ctx_ref() + .set_dns(Some(server.clone())); tokio::join!( self.peer_mgr .add_nic_packet_process_pipeline(Box::new(server.clone())), server.run() ); + self.peer_mgr.get_global_ctx_ref().set_dns(None); let _ = self .peer_mgr .remove_nic_packet_process_pipeline(server.id()) diff --git a/easytier/src/dns/server.rs b/easytier/src/dns/server.rs index 8f17cac3..2f9ebbc9 100644 --- a/easytier/src/dns/server.rs +++ b/easytier/src/dns/server.rs @@ -177,8 +177,8 @@ impl DnsServer { } } - pub fn routes(&self) -> HashSet { - self.addresses.read().iter().map(|a| a.addr.ip()).collect() + pub fn addresses(&self) -> HashSet { + self.addresses.read().iter().map(|a| a.addr).collect() } async fn reload_listeners( diff --git a/easytier/src/instance/proxy_cidrs_monitor.rs b/easytier/src/instance/proxy_cidrs_monitor.rs index 2e03c138..9bc9f7bc 100644 --- a/easytier/src/instance/proxy_cidrs_monitor.rs +++ b/easytier/src/instance/proxy_cidrs_monitor.rs @@ -1,4 +1,5 @@ use std::collections::BTreeSet; +use std::net::IpAddr; use std::sync::{Arc, Weak}; use std::time::Instant; @@ -54,6 +55,13 @@ impl ProxyCidrsMonitor { proxy_cidrs = routes.into_iter().collect(); } + if let Some(dns) = global_ctx.get_dns() { + proxy_cidrs.extend(dns.addresses().into_iter().filter_map(|a| match a.ip() { + IpAddr::V4(ip) => Some(cidr::Ipv4Cidr::new_host(ip)), + _ => None, + })) + } + // Calculate diff if cur_proxy_cidrs == &proxy_cidrs { return (proxy_cidrs, Vec::new(), Vec::new());