ME Probe + STUN Legacy

This commit is contained in:
Alexey 2026-02-26 18:41:11 +03:00
parent 9d2ff25bf5
commit 1f255d0aa4
No known key found for this signature in database
2 changed files with 43 additions and 23 deletions

View File

@ -131,6 +131,9 @@ impl ProxyConfig {
let general_table = parsed_toml let general_table = parsed_toml
.get("general") .get("general")
.and_then(|value| value.as_table()); .and_then(|value| value.as_table());
let network_table = parsed_toml
.get("network")
.and_then(|value| value.as_table());
let update_every_is_explicit = general_table let update_every_is_explicit = general_table
.map(|table| table.contains_key("update_every")) .map(|table| table.contains_key("update_every"))
.unwrap_or(false); .unwrap_or(false);
@ -140,6 +143,9 @@ impl ProxyConfig {
let legacy_config_is_explicit = general_table let legacy_config_is_explicit = general_table
.map(|table| table.contains_key("proxy_config_auto_reload_secs")) .map(|table| table.contains_key("proxy_config_auto_reload_secs"))
.unwrap_or(false); .unwrap_or(false);
let stun_servers_is_explicit = network_table
.map(|table| table.contains_key("stun_servers"))
.unwrap_or(false);
let mut config: ProxyConfig = let mut config: ProxyConfig =
parsed_toml.try_into().map_err(|e| ProxyError::Config(e.to_string()))?; parsed_toml.try_into().map_err(|e| ProxyError::Config(e.to_string()))?;
@ -151,11 +157,19 @@ impl ProxyConfig {
let legacy_nat_stun = config.general.middle_proxy_nat_stun.take(); let legacy_nat_stun = config.general.middle_proxy_nat_stun.take();
let legacy_nat_stun_servers = std::mem::take(&mut config.general.middle_proxy_nat_stun_servers); let legacy_nat_stun_servers = std::mem::take(&mut config.general.middle_proxy_nat_stun_servers);
let legacy_nat_stun_used = legacy_nat_stun.is_some() || !legacy_nat_stun_servers.is_empty(); let legacy_nat_stun_used = legacy_nat_stun.is_some() || !legacy_nat_stun_servers.is_empty();
if stun_servers_is_explicit {
let mut unified_stun_servers = Vec::new(); let mut explicit_stun_servers = Vec::new();
for stun in std::mem::take(&mut config.network.stun_servers) { for stun in std::mem::take(&mut config.network.stun_servers) {
push_unique_nonempty(&mut unified_stun_servers, stun); push_unique_nonempty(&mut explicit_stun_servers, stun);
} }
config.network.stun_servers = explicit_stun_servers;
if legacy_nat_stun_used {
warn!("general.middle_proxy_nat_stun and general.middle_proxy_nat_stun_servers are ignored because network.stun_servers is explicitly set");
}
} else {
// Keep the default STUN pool unless network.stun_servers is explicitly overridden.
let mut unified_stun_servers = default_stun_servers();
if let Some(stun) = legacy_nat_stun { if let Some(stun) = legacy_nat_stun {
push_unique_nonempty(&mut unified_stun_servers, stun); push_unique_nonempty(&mut unified_stun_servers, stun);
} }
@ -163,14 +177,12 @@ impl ProxyConfig {
push_unique_nonempty(&mut unified_stun_servers, stun); push_unique_nonempty(&mut unified_stun_servers, stun);
} }
if unified_stun_servers.is_empty() {
unified_stun_servers = default_stun_servers();
}
config.network.stun_servers = unified_stun_servers; config.network.stun_servers = unified_stun_servers;
if legacy_nat_stun_used { if legacy_nat_stun_used {
warn!("general.middle_proxy_nat_stun and general.middle_proxy_nat_stun_servers are deprecated; use network.stun_servers"); warn!("general.middle_proxy_nat_stun and general.middle_proxy_nat_stun_servers are deprecated; use network.stun_servers");
} }
}
if let Some(update_every) = config.general.update_every { if let Some(update_every) = config.general.update_every {
if update_every == 0 { if update_every == 0 {

View File

@ -1200,15 +1200,23 @@ impl MePool {
} }
addrs.shuffle(&mut rand::rng()); addrs.shuffle(&mut rand::rng());
if addrs.len() > 1 { if addrs.len() > 1 {
let concurrency = 2usize;
let mut join = tokio::task::JoinSet::new(); let mut join = tokio::task::JoinSet::new();
for (ip, port) in addrs { let mut next_idx = 0usize;
while next_idx < addrs.len() || !join.is_empty() {
while next_idx < addrs.len() && join.len() < concurrency {
let (ip, port) = addrs[next_idx];
next_idx += 1;
let addr = SocketAddr::new(ip, port); let addr = SocketAddr::new(ip, port);
let pool = Arc::clone(&self); let pool = Arc::clone(&self);
let rng_clone = Arc::clone(&rng); let rng_clone = Arc::clone(&rng);
join.spawn(async move { (addr, pool.connect_one(addr, rng_clone.as_ref()).await) }); join.spawn(async move { (addr, pool.connect_one(addr, rng_clone.as_ref()).await) });
} }
while let Some(res) = join.join_next().await { let Some(res) = join.join_next().await else {
break;
};
match res { match res {
Ok((addr, Ok(()))) => { Ok((addr, Ok(()))) => {
info!(%addr, dc = %dc, "ME connected"); info!(%addr, dc = %dc, "ME connected");