mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-07 02:09:06 +00:00
some improvements (#939)
1. ospf route conn map should also use version 2. treat nopat as cone
This commit is contained in:
@@ -56,8 +56,8 @@ impl From<NatType> for UdpNatType {
|
|||||||
fn from(nat_type: NatType) -> Self {
|
fn from(nat_type: NatType) -> Self {
|
||||||
match nat_type {
|
match nat_type {
|
||||||
NatType::Unknown => UdpNatType::Unknown,
|
NatType::Unknown => UdpNatType::Unknown,
|
||||||
NatType::NoPat | NatType::OpenInternet => UdpNatType::Open(nat_type),
|
NatType::OpenInternet => UdpNatType::Open(nat_type),
|
||||||
NatType::FullCone | NatType::Restricted | NatType::PortRestricted => {
|
NatType::NoPat | NatType::FullCone | NatType::Restricted | NatType::PortRestricted => {
|
||||||
UdpNatType::Cone(nat_type)
|
UdpNatType::Cone(nat_type)
|
||||||
}
|
}
|
||||||
NatType::Symmetric | NatType::SymUdpFirewall => UdpNatType::HardSymmetric(nat_type),
|
NatType::Symmetric | NatType::SymUdpFirewall => UdpNatType::HardSymmetric(nat_type),
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ use easytier::{
|
|||||||
scoped_task::ScopedTask,
|
scoped_task::ScopedTask,
|
||||||
stun::MockStunInfoCollector,
|
stun::MockStunInfoCollector,
|
||||||
},
|
},
|
||||||
connector::{create_connector_by_url, dns_connector::DNSTunnelConnector},
|
connector::create_connector_by_url,
|
||||||
launcher,
|
launcher,
|
||||||
proto::{
|
proto::{
|
||||||
self,
|
self,
|
||||||
@@ -1087,7 +1087,6 @@ async fn run_main(cli: Cli) -> anyhow::Result<()> {
|
|||||||
hostname,
|
hostname,
|
||||||
);
|
);
|
||||||
tokio::signal::ctrl_c().await.unwrap();
|
tokio::signal::ctrl_c().await.unwrap();
|
||||||
DNSTunnelConnector::new("".parse().unwrap(), global_ctx);
|
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ use std::sync::Arc;
|
|||||||
use crossbeam::atomic::AtomicCell;
|
use crossbeam::atomic::AtomicCell;
|
||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
|
|
||||||
use tokio::{select, sync::mpsc, task::JoinHandle};
|
use tokio::{select, sync::mpsc};
|
||||||
|
|
||||||
use tracing::Instrument;
|
use tracing::Instrument;
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ pub struct Peer {
|
|||||||
packet_recv_chan: PacketRecvChan,
|
packet_recv_chan: PacketRecvChan,
|
||||||
|
|
||||||
close_event_sender: mpsc::Sender<PeerConnId>,
|
close_event_sender: mpsc::Sender<PeerConnId>,
|
||||||
close_event_listener: JoinHandle<()>,
|
close_event_listener: ScopedTask<()>,
|
||||||
|
|
||||||
shutdown_notifier: Arc<tokio::sync::Notify>,
|
shutdown_notifier: Arc<tokio::sync::Notify>,
|
||||||
|
|
||||||
@@ -87,7 +87,8 @@ impl Peer {
|
|||||||
"peer_close_event_listener",
|
"peer_close_event_listener",
|
||||||
?peer_node_id,
|
?peer_node_id,
|
||||||
)),
|
)),
|
||||||
);
|
)
|
||||||
|
.into();
|
||||||
|
|
||||||
let default_conn_id = Arc::new(AtomicCell::new(PeerConnId::default()));
|
let default_conn_id = Arc::new(AtomicCell::new(PeerConnId::default()));
|
||||||
|
|
||||||
@@ -188,7 +189,13 @@ impl Peer {
|
|||||||
|
|
||||||
let mut ret = Vec::new();
|
let mut ret = Vec::new();
|
||||||
for conn in conns {
|
for conn in conns {
|
||||||
ret.push(conn.get_conn_info());
|
let info = conn.get_conn_info();
|
||||||
|
if !info.is_closed {
|
||||||
|
ret.push(info);
|
||||||
|
} else {
|
||||||
|
let conn_id = info.conn_id.parse().unwrap();
|
||||||
|
let _ = self.close_peer_conn(&conn_id).await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -432,6 +432,7 @@ impl PeerConn {
|
|||||||
loss_rate: (f64::from(self.loss_rate_stats.load(Ordering::Relaxed)) / 100.0) as f32,
|
loss_rate: (f64::from(self.loss_rate_stats.load(Ordering::Relaxed)) / 100.0) as f32,
|
||||||
is_client: self.is_client.unwrap_or_default(),
|
is_client: self.is_client.unwrap_or_default(),
|
||||||
network_name: info.network_name.clone(),
|
network_name: info.network_name.clone(),
|
||||||
|
is_closed: self.close_event_notifier.is_closed(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,8 +86,9 @@ impl AtomicVersion {
|
|||||||
self.0.fetch_add(1, Ordering::Relaxed) + 1
|
self.0.fetch_add(1, Ordering::Relaxed) + 1
|
||||||
}
|
}
|
||||||
|
|
||||||
fn set_if_larger(&self, version: Version) {
|
fn set_if_larger(&self, version: Version) -> bool {
|
||||||
self.0.fetch_max(version, Ordering::Relaxed);
|
// return true if the version is set.
|
||||||
|
self.0.fetch_max(version, Ordering::Relaxed) < version
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -452,7 +453,6 @@ impl SyncedRouteInfo {
|
|||||||
let mut need_inc_version = false;
|
let mut need_inc_version = false;
|
||||||
|
|
||||||
for (peer_idx, (peer_id, version)) in conn_bitmap.peer_ids.iter().enumerate() {
|
for (peer_idx, (peer_id, version)) in conn_bitmap.peer_ids.iter().enumerate() {
|
||||||
assert!(self.peer_infos.contains_key(peer_id));
|
|
||||||
let connceted_peers = conn_bitmap.get_connected_peers(peer_idx);
|
let connceted_peers = conn_bitmap.get_connected_peers(peer_idx);
|
||||||
self.fill_empty_peer_info(&connceted_peers);
|
self.fill_empty_peer_info(&connceted_peers);
|
||||||
|
|
||||||
@@ -460,17 +460,14 @@ impl SyncedRouteInfo {
|
|||||||
.entry(*peer_id)
|
.entry(*peer_id)
|
||||||
.and_modify(|(old_conn_bitmap, old_version)| {
|
.and_modify(|(old_conn_bitmap, old_version)| {
|
||||||
if *version > old_version.get() {
|
if *version > old_version.get() {
|
||||||
*old_conn_bitmap = conn_bitmap.get_connected_peers(peer_idx);
|
*old_conn_bitmap = connceted_peers.clone();
|
||||||
need_inc_version = true;
|
need_inc_version = true;
|
||||||
old_version.set(*version);
|
old_version.set(*version);
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.or_insert_with(|| {
|
.or_insert_with(|| {
|
||||||
need_inc_version = true;
|
need_inc_version = true;
|
||||||
(
|
(connceted_peers, version.clone().into())
|
||||||
conn_bitmap.get_connected_peers(peer_idx),
|
|
||||||
version.clone().into(),
|
|
||||||
)
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if need_inc_version {
|
if need_inc_version {
|
||||||
@@ -479,7 +476,6 @@ impl SyncedRouteInfo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn update_foreign_network(&self, foreign_network: &RouteForeignNetworkInfos) {
|
fn update_foreign_network(&self, foreign_network: &RouteForeignNetworkInfos) {
|
||||||
let mut need_inc_version = false;
|
|
||||||
for item in foreign_network.infos.iter().map(Clone::clone) {
|
for item in foreign_network.infos.iter().map(Clone::clone) {
|
||||||
let Some(key) = item.key else {
|
let Some(key) = item.key else {
|
||||||
continue;
|
continue;
|
||||||
@@ -494,14 +490,10 @@ impl SyncedRouteInfo {
|
|||||||
.entry(key.clone())
|
.entry(key.clone())
|
||||||
.and_modify(|old_entry| {
|
.and_modify(|old_entry| {
|
||||||
if entry.version > old_entry.version {
|
if entry.version > old_entry.version {
|
||||||
need_inc_version = true;
|
|
||||||
*old_entry = entry.clone();
|
*old_entry = entry.clone();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.or_insert_with(|| {
|
.or_insert_with(|| entry.clone());
|
||||||
need_inc_version = true;
|
|
||||||
entry.clone()
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1069,6 +1061,7 @@ struct PeerRouteServiceImpl {
|
|||||||
foreign_network_owner_map: DashMap<NetworkIdentity, Vec<PeerId>>,
|
foreign_network_owner_map: DashMap<NetworkIdentity, Vec<PeerId>>,
|
||||||
synced_route_info: SyncedRouteInfo,
|
synced_route_info: SyncedRouteInfo,
|
||||||
cached_local_conn_map: std::sync::Mutex<RouteConnBitmap>,
|
cached_local_conn_map: std::sync::Mutex<RouteConnBitmap>,
|
||||||
|
cached_local_conn_map_version: AtomicVersion,
|
||||||
|
|
||||||
last_update_my_foreign_network: AtomicCell<Option<std::time::Instant>>,
|
last_update_my_foreign_network: AtomicCell<Option<std::time::Instant>>,
|
||||||
|
|
||||||
@@ -1118,6 +1111,7 @@ impl PeerRouteServiceImpl {
|
|||||||
version: AtomicVersion::new(),
|
version: AtomicVersion::new(),
|
||||||
},
|
},
|
||||||
cached_local_conn_map: std::sync::Mutex::new(RouteConnBitmap::new()),
|
cached_local_conn_map: std::sync::Mutex::new(RouteConnBitmap::new()),
|
||||||
|
cached_local_conn_map_version: AtomicVersion::new(),
|
||||||
|
|
||||||
last_update_my_foreign_network: AtomicCell::new(None),
|
last_update_my_foreign_network: AtomicCell::new(None),
|
||||||
|
|
||||||
@@ -1290,6 +1284,8 @@ impl PeerRouteServiceImpl {
|
|||||||
// update route table first because we want to filter out unreachable peers.
|
// update route table first because we want to filter out unreachable peers.
|
||||||
self.update_route_table();
|
self.update_route_table();
|
||||||
|
|
||||||
|
let synced_version = self.synced_route_info.version.get();
|
||||||
|
|
||||||
// the conn_bitmap should contain complete list of directly connected peers.
|
// the conn_bitmap should contain complete list of directly connected peers.
|
||||||
// use union of dst peers can preserve this property.
|
// use union of dst peers can preserve this property.
|
||||||
let all_dst_peer_ids = self
|
let all_dst_peer_ids = self
|
||||||
@@ -1327,7 +1323,13 @@ impl PeerRouteServiceImpl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*self.cached_local_conn_map.lock().unwrap() = conn_bitmap;
|
let mut locked = self.cached_local_conn_map.lock().unwrap();
|
||||||
|
if self
|
||||||
|
.cached_local_conn_map_version
|
||||||
|
.set_if_larger(synced_version)
|
||||||
|
{
|
||||||
|
*locked = conn_bitmap;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn build_route_info(&self, session: &SyncRouteSession) -> Option<Vec<RoutePeerInfo>> {
|
fn build_route_info(&self, session: &SyncRouteSession) -> Option<Vec<RoutePeerInfo>> {
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ message PeerConnInfo {
|
|||||||
float loss_rate = 7;
|
float loss_rate = 7;
|
||||||
bool is_client = 8;
|
bool is_client = 8;
|
||||||
string network_name = 9;
|
string network_name = 9;
|
||||||
|
bool is_closed = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
message PeerInfo {
|
message PeerInfo {
|
||||||
|
|||||||
@@ -183,8 +183,6 @@ impl WSTunnelConnector {
|
|||||||
) -> Result<Box<dyn Tunnel>, TunnelError> {
|
) -> Result<Box<dyn Tunnel>, TunnelError> {
|
||||||
let is_wss = is_wss(&addr)?;
|
let is_wss = is_wss(&addr)?;
|
||||||
let socket_addr = SocketAddr::from_url(addr.clone(), ip_version).await?;
|
let socket_addr = SocketAddr::from_url(addr.clone(), ip_version).await?;
|
||||||
let domain = addr.domain();
|
|
||||||
let host = socket_addr.ip();
|
|
||||||
let stream = tcp_socket.connect(socket_addr).await?;
|
let stream = tcp_socket.connect(socket_addr).await?;
|
||||||
|
|
||||||
let info = TunnelInfo {
|
let info = TunnelInfo {
|
||||||
@@ -208,9 +206,7 @@ impl WSTunnelConnector {
|
|||||||
let sni = "localhost";
|
let sni = "localhost";
|
||||||
let server_name = rustls::pki_types::ServerName::try_from(sni)
|
let server_name = rustls::pki_types::ServerName::try_from(sni)
|
||||||
.map_err(|_| TunnelError::InvalidProtocol("Invalid SNI".to_string()))?;
|
.map_err(|_| TunnelError::InvalidProtocol("Invalid SNI".to_string()))?;
|
||||||
let stream = tls_conn
|
let stream = tls_conn.connect(server_name, stream).await?;
|
||||||
.connect(server_name, stream)
|
|
||||||
.await?;
|
|
||||||
MaybeTlsStream::Rustls(stream)
|
MaybeTlsStream::Rustls(stream)
|
||||||
} else {
|
} else {
|
||||||
MaybeTlsStream::Plain(stream)
|
MaybeTlsStream::Plain(stream)
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ pub fn setup_panic_handler() {
|
|||||||
|
|
||||||
// backtrace is risky, so use it last
|
// backtrace is risky, so use it last
|
||||||
let backtrace = backtrace::Backtrace::force_capture();
|
let backtrace = backtrace::Backtrace::force_capture();
|
||||||
write_err(format!("backtrace: {:?}", backtrace));
|
write_err(format!("backtrace: {:#?}", backtrace));
|
||||||
|
|
||||||
std::process::exit(1);
|
std::process::exit(1);
|
||||||
}));
|
}));
|
||||||
|
|||||||
Reference in New Issue
Block a user