mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-07 10:14:35 +00:00
Support custom STUN servers configuration (#1212)
* Support custom STUN servers Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -199,6 +199,9 @@ pub trait ConfigLoader: Send + Sync {
|
||||
fn get_udp_whitelist(&self) -> Vec<String>;
|
||||
fn set_udp_whitelist(&self, whitelist: Vec<String>);
|
||||
|
||||
fn get_stun_servers(&self) -> Vec<String>;
|
||||
fn set_stun_servers(&self, servers: Vec<String>);
|
||||
|
||||
fn dump(&self) -> String;
|
||||
}
|
||||
|
||||
@@ -407,6 +410,7 @@ struct Config {
|
||||
|
||||
tcp_whitelist: Option<Vec<String>>,
|
||||
udp_whitelist: Option<Vec<String>>,
|
||||
stun_servers: Option<Vec<String>>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
@@ -786,6 +790,19 @@ impl ConfigLoader for TomlConfigLoader {
|
||||
self.config.lock().unwrap().udp_whitelist = Some(whitelist);
|
||||
}
|
||||
|
||||
fn get_stun_servers(&self) -> Vec<String> {
|
||||
self.config
|
||||
.lock()
|
||||
.unwrap()
|
||||
.stun_servers
|
||||
.clone()
|
||||
.unwrap_or_default()
|
||||
}
|
||||
|
||||
fn set_stun_servers(&self, servers: Vec<String>) {
|
||||
self.config.lock().unwrap().stun_servers = Some(servers);
|
||||
}
|
||||
|
||||
fn dump(&self) -> String {
|
||||
let default_flags_json = serde_json::to_string(&gen_default_flags()).unwrap();
|
||||
let default_flags_hashmap =
|
||||
@@ -816,6 +833,39 @@ impl ConfigLoader for TomlConfigLoader {
|
||||
pub mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_stun_servers_config() {
|
||||
let config = TomlConfigLoader::default();
|
||||
let stun_servers = config.get_stun_servers();
|
||||
assert!(stun_servers.is_empty());
|
||||
|
||||
// Test setting custom stun servers
|
||||
let custom_servers = vec!["txt:stun.easytier.cn".to_string()];
|
||||
config.set_stun_servers(custom_servers.clone());
|
||||
|
||||
let retrieved_servers = config.get_stun_servers();
|
||||
assert_eq!(retrieved_servers, custom_servers);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_stun_servers_toml_parsing() {
|
||||
let config_str = r#"
|
||||
instance_name = "test"
|
||||
stun_servers = [
|
||||
"stun.l.google.com:19302",
|
||||
"stun1.l.google.com:19302",
|
||||
"txt:stun.easytier.cn"
|
||||
]"#;
|
||||
|
||||
let config = TomlConfigLoader::new_from_str(config_str).unwrap();
|
||||
let stun_servers = config.get_stun_servers();
|
||||
|
||||
assert_eq!(stun_servers.len(), 3);
|
||||
assert_eq!(stun_servers[0], "stun.l.google.com:19302");
|
||||
assert_eq!(stun_servers[1], "stun1.l.google.com:19302");
|
||||
assert_eq!(stun_servers[2], "txt:stun.easytier.cn");
|
||||
}
|
||||
|
||||
#[tokio::test]
|
||||
async fn full_example_test() {
|
||||
let config_str = r#"
|
||||
|
||||
@@ -112,7 +112,12 @@ impl GlobalCtx {
|
||||
|
||||
let (event_bus, _) = tokio::sync::broadcast::channel(8);
|
||||
|
||||
let stun_info_collection = Arc::new(StunInfoCollector::new_with_default_servers());
|
||||
let stun_servers = config_fs.get_stun_servers();
|
||||
let stun_info_collection = Arc::new(if stun_servers.is_empty() {
|
||||
StunInfoCollector::new_with_default_servers()
|
||||
} else {
|
||||
StunInfoCollector::new(stun_servers)
|
||||
});
|
||||
|
||||
let enable_exit_node = config_fs.get_flags().enable_exit_node || cfg!(target_env = "ohos");
|
||||
let proxy_forward_by_system = config_fs.get_flags().proxy_forward_by_system;
|
||||
|
||||
@@ -43,10 +43,9 @@ pub fn convert_ipv4addr_to_inaddr(ip: &Ipv4Addr) -> winapi::shared::inaddr::in_a
|
||||
pub fn convert_ipv6addr_to_inaddr(ip: &Ipv6Addr) -> winapi::shared::in6addr::in6_addr {
|
||||
let mut winaddr = winapi::shared::in6addr::in6_addr::default();
|
||||
let octets = ip.octets();
|
||||
for i in 0..octets.len() {
|
||||
unsafe { winaddr.u.Byte_mut()[i] = octets[i] };
|
||||
for (i, &octet) in octets.iter().enumerate() {
|
||||
unsafe { winaddr.u.Byte_mut()[i] = octet };
|
||||
}
|
||||
|
||||
winaddr
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ fn format_win_error(error: u32) -> String {
|
||||
null_mut(),
|
||||
error,
|
||||
0,
|
||||
buffer.as_mut_ptr() as *mut u16,
|
||||
buffer.as_mut_ptr(),
|
||||
size,
|
||||
null_mut(),
|
||||
);
|
||||
@@ -43,9 +43,7 @@ fn format_win_error(error: u32) -> String {
|
||||
let str_end = buffer.iter().position(|&b| b == 0).unwrap_or(buffer.len());
|
||||
format!(
|
||||
"{} (code: {})",
|
||||
String::from_utf16_lossy(&buffer[..str_end])
|
||||
.trim()
|
||||
.to_string(),
|
||||
String::from_utf16_lossy(&buffer[..str_end]).trim(),
|
||||
error
|
||||
)
|
||||
}
|
||||
|
||||
@@ -736,8 +736,8 @@ impl StunInfoCollector {
|
||||
}
|
||||
|
||||
pub fn get_default_servers() -> Vec<String> {
|
||||
// NOTICE: we may need to choose stun stun server based on geo location
|
||||
// stun server cross nation may return a external ip address with high latency and loss rate
|
||||
// NOTICE: we may need to choose stun server based on geolocation
|
||||
// stun server cross nation may return an external ip address with high latency and loss rate
|
||||
[
|
||||
"txt:stun.easytier.cn",
|
||||
"stun.miwifi.com",
|
||||
|
||||
Reference in New Issue
Block a user