Files
Easytier_lkddi/easytier/src/peers/foreign_network_client.rs
T

103 lines
3.0 KiB
Rust
Raw Normal View History

use std::sync::{Arc, Mutex};
2024-04-24 23:12:46 +08:00
use crate::{
common::{error::Error, global_ctx::ArcGlobalCtx, scoped_task::ScopedTask, PeerId},
2024-04-24 23:12:46 +08:00
tunnel::packet_def::ZCPacket,
2024-03-06 20:59:17 +08:00
};
use super::{peer_conn::PeerConn, peer_map::PeerMap, peer_rpc::PeerRpcManager, PacketRecvChan};
2024-03-06 20:59:17 +08:00
pub struct ForeignNetworkClient {
global_ctx: ArcGlobalCtx,
peer_rpc: Arc<PeerRpcManager>,
2024-03-13 00:15:22 +08:00
my_peer_id: PeerId,
2024-03-06 20:59:17 +08:00
peer_map: Arc<PeerMap>,
task: Mutex<Option<ScopedTask<()>>>,
2024-03-06 20:59:17 +08:00
}
impl ForeignNetworkClient {
pub fn new(
global_ctx: ArcGlobalCtx,
2024-04-24 23:12:46 +08:00
packet_sender_to_mgr: PacketRecvChan,
2024-03-06 20:59:17 +08:00
peer_rpc: Arc<PeerRpcManager>,
2024-03-13 00:15:22 +08:00
my_peer_id: PeerId,
2024-03-06 20:59:17 +08:00
) -> Self {
2024-03-13 00:15:22 +08:00
let peer_map = Arc::new(PeerMap::new(
packet_sender_to_mgr,
global_ctx.clone(),
my_peer_id,
));
2024-03-06 20:59:17 +08:00
Self {
global_ctx,
peer_rpc,
2024-03-13 00:15:22 +08:00
my_peer_id,
2024-03-06 20:59:17 +08:00
peer_map,
task: Mutex::new(None),
2024-03-06 20:59:17 +08:00
}
}
pub async fn add_new_peer_conn(&self, peer_conn: PeerConn) {
tracing::warn!(peer_conn = ?peer_conn.get_conn_info(), network = ?peer_conn.get_network_identity(), "add new peer conn in foreign network client");
self.peer_map.add_new_peer_conn(peer_conn).await
}
2024-03-13 00:15:22 +08:00
pub fn has_next_hop(&self, peer_id: PeerId) -> bool {
2024-03-06 20:59:17 +08:00
self.get_next_hop(peer_id).is_some()
}
pub async fn list_public_peers(&self) -> Vec<PeerId> {
self.peer_map.list_peers().await
2024-04-27 13:44:59 +08:00
}
2024-03-13 00:15:22 +08:00
pub fn get_next_hop(&self, peer_id: PeerId) -> Option<PeerId> {
2024-03-06 20:59:17 +08:00
if self.peer_map.has_peer(peer_id) {
return Some(peer_id.clone());
}
None
2024-03-06 20:59:17 +08:00
}
2024-04-24 23:12:46 +08:00
pub async fn send_msg(&self, msg: ZCPacket, peer_id: PeerId) -> Result<(), Error> {
2024-03-06 20:59:17 +08:00
if let Some(next_hop) = self.get_next_hop(peer_id) {
2024-03-23 22:20:19 +08:00
let ret = self.peer_map.send_msg_directly(msg, next_hop).await;
if ret.is_err() {
tracing::error!(
?ret,
?peer_id,
?next_hop,
"foreign network client send msg failed"
);
} else {
tracing::info!(
?peer_id,
?next_hop,
"foreign network client send msg success"
);
2024-03-23 22:20:19 +08:00
}
return ret;
2024-03-06 20:59:17 +08:00
}
2024-03-23 22:20:19 +08:00
Err(Error::RouteError(Some("no next hop".to_string())))
2024-03-06 20:59:17 +08:00
}
pub async fn run(&self) {
let peer_map = Arc::downgrade(&self.peer_map);
*self.task.lock().unwrap() = Some(
tokio::spawn(async move {
loop {
tokio::time::sleep(tokio::time::Duration::from_secs(1)).await;
let Some(peer_map) = peer_map.upgrade() else {
break;
};
peer_map.clean_peer_without_conn().await;
}
})
.into(),
);
2024-03-06 20:59:17 +08:00
}
pub fn get_peer_map(&self) -> Arc<PeerMap> {
self.peer_map.clone()
}
}