mirror of
https://mirror.suhoan.cn/https://github.com/EasyTier/EasyTier.git
synced 2025-12-16 22:57:24 +08:00
v6 hole punch (#873)
Some devices have ipv6 but don't allow input connection, this patch add hole punching for these devices. - **add v6 hole punch msg to udp tunnel** - **send hole punch packet when do ipv6 direct connect**
This commit is contained in:
@@ -61,11 +61,11 @@ pub struct GlobalCtx {
|
||||
cached_ipv4: AtomicCell<Option<cidr::Ipv4Inet>>,
|
||||
cached_proxy_cidrs: AtomicCell<Option<Vec<cidr::IpCidr>>>,
|
||||
|
||||
ip_collector: Arc<IPCollector>,
|
||||
ip_collector: Mutex<Option<Arc<IPCollector>>>,
|
||||
|
||||
hostname: Mutex<String>,
|
||||
|
||||
stun_info_collection: Box<dyn StunInfoCollectorTrait>,
|
||||
stun_info_collection: Mutex<Arc<dyn StunInfoCollectorTrait>>,
|
||||
|
||||
running_listeners: Mutex<Vec<url::Url>>,
|
||||
|
||||
@@ -120,11 +120,14 @@ impl GlobalCtx {
|
||||
cached_ipv4: AtomicCell::new(None),
|
||||
cached_proxy_cidrs: AtomicCell::new(None),
|
||||
|
||||
ip_collector: Arc::new(IPCollector::new(net_ns, stun_info_collection.clone())),
|
||||
ip_collector: Mutex::new(Some(Arc::new(IPCollector::new(
|
||||
net_ns,
|
||||
stun_info_collection.clone(),
|
||||
)))),
|
||||
|
||||
hostname: Mutex::new(hostname),
|
||||
|
||||
stun_info_collection: Box::new(stun_info_collection),
|
||||
stun_info_collection: Mutex::new(stun_info_collection),
|
||||
|
||||
running_listeners: Mutex::new(Vec::new()),
|
||||
|
||||
@@ -215,7 +218,7 @@ impl GlobalCtx {
|
||||
}
|
||||
|
||||
pub fn get_ip_collector(&self) -> Arc<IPCollector> {
|
||||
self.ip_collector.clone()
|
||||
self.ip_collector.lock().unwrap().as_ref().unwrap().clone()
|
||||
}
|
||||
|
||||
pub fn get_hostname(&self) -> String {
|
||||
@@ -226,19 +229,19 @@ impl GlobalCtx {
|
||||
*self.hostname.lock().unwrap() = hostname;
|
||||
}
|
||||
|
||||
pub fn get_stun_info_collector(&self) -> impl StunInfoCollectorTrait + '_ {
|
||||
self.stun_info_collection.as_ref()
|
||||
pub fn get_stun_info_collector(&self) -> Arc<dyn StunInfoCollectorTrait> {
|
||||
self.stun_info_collection.lock().unwrap().clone()
|
||||
}
|
||||
|
||||
pub fn replace_stun_info_collector(&self, collector: Box<dyn StunInfoCollectorTrait>) {
|
||||
// force replace the stun_info_collection without mut and drop the old one
|
||||
let ptr = &self.stun_info_collection as *const Box<dyn StunInfoCollectorTrait>;
|
||||
let ptr = ptr as *mut Box<dyn StunInfoCollectorTrait>;
|
||||
unsafe {
|
||||
std::ptr::drop_in_place(ptr);
|
||||
#[allow(invalid_reference_casting)]
|
||||
std::ptr::write(ptr, collector);
|
||||
}
|
||||
let arc_collector: Arc<dyn StunInfoCollectorTrait> = Arc::new(collector);
|
||||
*self.stun_info_collection.lock().unwrap() = arc_collector.clone();
|
||||
|
||||
// rebuild the ip collector
|
||||
*self.ip_collector.lock().unwrap() = Some(Arc::new(IPCollector::new(
|
||||
self.net_ns.clone(),
|
||||
arc_collector,
|
||||
)));
|
||||
}
|
||||
|
||||
pub fn get_running_listeners(&self) -> Vec<url::Url> {
|
||||
|
||||
Reference in New Issue
Block a user