From 34560af14148c9d47d27d74471c11ac48b9461ce Mon Sep 17 00:00:00 2001 From: fanyang Date: Fri, 22 Aug 2025 20:40:28 +0800 Subject: [PATCH] cli: put the local IP at the front (#1256) --- easytier/src/easytier-cli.rs | 27 ++++++++++++++++++- easytier/src/peers/foreign_network_manager.rs | 10 ++++--- easytier/src/peers/mod.rs | 2 ++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/easytier/src/easytier-cli.rs b/easytier/src/easytier-cli.rs index 471574d..db9ac31 100644 --- a/easytier/src/easytier-cli.rs +++ b/easytier/src/easytier-cli.rs @@ -25,6 +25,7 @@ use easytier::{ constants::EASYTIER_VERSION, stun::{StunInfoCollector, StunInfoCollectorTrait}, }, + peers, proto::{ cli::{ list_peer_route_pair, AclManageRpc, AclManageRpcClientFactory, AddPortForwardRequest, @@ -573,10 +574,34 @@ impl CommandHandler<'_> { items.push(p.into()); } - // Sort items by ipv4 (using IpAddr for proper numeric comparison) first, then by hostname + // Sort items: local IP first, then public servers, then other servers by IP items.sort_by(|a, b| { use std::net::{IpAddr, Ipv4Addr}; use std::str::FromStr; + + // Priority 1: Local IP (cost is "Local") + let a_is_local = a.cost == "Local"; + let b_is_local = b.cost == "Local"; + if a_is_local != b_is_local { + return if a_is_local { + std::cmp::Ordering::Less + } else { + std::cmp::Ordering::Greater + }; + } + + // Priority 2: Public servers + let a_is_public = a.hostname.starts_with(peers::PUBLIC_SERVER_HOSTNAME_PREFIX); + let b_is_public = b.hostname.starts_with(peers::PUBLIC_SERVER_HOSTNAME_PREFIX); + if a_is_public != b_is_public { + return if a_is_public { + std::cmp::Ordering::Less + } else { + std::cmp::Ordering::Greater + }; + } + + // Priority 3: Sort by IP address let a_ip = IpAddr::from_str(&a.ipv4).unwrap_or(IpAddr::V4(Ipv4Addr::UNSPECIFIED)); let b_ip = IpAddr::from_str(&b.ipv4).unwrap_or(IpAddr::V4(Ipv4Addr::UNSPECIFIED)); match a_ip.cmp(&b_ip) { diff --git a/easytier/src/peers/foreign_network_manager.rs b/easytier/src/peers/foreign_network_manager.rs index 5b4dc74..b556df3 100644 --- a/easytier/src/peers/foreign_network_manager.rs +++ b/easytier/src/peers/foreign_network_manager.rs @@ -2,7 +2,7 @@ foreign_network_manager is used to forward packets of other networks. currently only forward packets of peers that directly connected to this node. -in future, with the help wo peer center we can forward packets of peers that +in the future, with the help wo peer center we can forward packets of peers that connected to any node in the local network. */ use std::{ @@ -49,7 +49,7 @@ use super::{ peer_rpc_service::DirectConnectorManagerRpcServer, recv_packet_from_chan, route_trait::NextHopPolicy, - PacketRecvChan, PacketRecvChanReceiver, + PacketRecvChan, PacketRecvChanReceiver, PUBLIC_SERVER_HOSTNAME_PREFIX, }; #[async_trait::async_trait] @@ -161,7 +161,11 @@ impl ForeignNetworkEntry { ) -> ArcGlobalCtx { let config = TomlConfigLoader::default(); config.set_network_identity(network.clone()); - config.set_hostname(Some(format!("PublicServer_{}", global_ctx.get_hostname()))); + config.set_hostname(Some(format!( + "{}{}", + PUBLIC_SERVER_HOSTNAME_PREFIX, + global_ctx.get_hostname() + ))); let mut flags = config.get_flags(); flags.disable_relay_kcp = !global_ctx.get_flags().enable_relay_foreign_network_kcp; diff --git a/easytier/src/peers/mod.rs b/easytier/src/peers/mod.rs index fcccfe0..d9893dc 100644 --- a/easytier/src/peers/mod.rs +++ b/easytier/src/peers/mod.rs @@ -64,3 +64,5 @@ pub async fn recv_packet_from_chan( .await .ok_or(anyhow::anyhow!("recv_packet_from_chan failed")) } + +pub const PUBLIC_SERVER_HOSTNAME_PREFIX: &str = "PublicServer_";