use uint32 as peer id (#29)

This commit is contained in:
Sijie.Sun
2024-03-13 00:15:22 +08:00
committed by GitHub
parent cb0df51319
commit 0053666dfb
30 changed files with 431 additions and 406 deletions
+2 -2
View File
@@ -277,7 +277,7 @@ impl CommandHandler {
tx_bytes: format_size(p.get_tx_bytes().unwrap_or(0), humansize::DECIMAL), tx_bytes: format_size(p.get_tx_bytes().unwrap_or(0), humansize::DECIMAL),
tunnel_proto: p.get_conn_protos().unwrap_or(vec![]).join(",").to_string(), tunnel_proto: p.get_conn_protos().unwrap_or(vec![]).join(",").to_string(),
nat_type: p.get_udp_nat_type(), nat_type: p.get_udp_nat_type(),
id: p.route.peer_id.clone(), id: p.route.peer_id.to_string(),
} }
} }
} }
@@ -460,7 +460,7 @@ async fn main() -> Result<(), Error> {
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
table_rows.push(PeerCenterTableItem { table_rows.push(PeerCenterTableItem {
node_id: node_id.clone(), node_id: node_id.to_string(),
direct_peers: direct_peers.join("\n"), direct_peers: direct_peers.join("\n"),
}); });
} }
+7 -7
View File
@@ -24,8 +24,8 @@ message TunnelInfo {
message PeerConnInfo { message PeerConnInfo {
string conn_id = 1; string conn_id = 1;
string my_node_id = 2; uint32 my_peer_id = 2;
string peer_id = 3; uint32 peer_id = 3;
repeated string features = 4; repeated string features = 4;
TunnelInfo tunnel = 5; TunnelInfo tunnel = 5;
PeerConnStats stats = 6; PeerConnStats stats = 6;
@@ -33,7 +33,7 @@ message PeerConnInfo {
} }
message PeerInfo { message PeerInfo {
string peer_id = 1; uint32 peer_id = 1;
repeated PeerConnInfo conns = 2; repeated PeerConnInfo conns = 2;
} }
@@ -62,9 +62,9 @@ message StunInfo {
} }
message Route { message Route {
string peer_id = 1; uint32 peer_id = 1;
string ipv4_addr = 2; string ipv4_addr = 2;
string next_hop_peer_id = 3; uint32 next_hop_peer_id = 3;
int32 cost = 4; int32 cost = 4;
repeated string proxy_cidrs = 5; repeated string proxy_cidrs = 5;
string hostname = 6; string hostname = 6;
@@ -129,13 +129,13 @@ message DirectConnectedPeerInfo {
} }
message PeerInfoForGlobalMap { message PeerInfoForGlobalMap {
map<string, DirectConnectedPeerInfo> direct_peers = 1; map<uint32, DirectConnectedPeerInfo> direct_peers = 1;
} }
message GetGlobalPeerMapRequest {} message GetGlobalPeerMapRequest {}
message GetGlobalPeerMapResponse { message GetGlobalPeerMapResponse {
map<string, PeerInfoForGlobalMap> global_peer_map = 1; map<uint32, PeerInfoForGlobalMap> global_peer_map = 1;
} }
service PeerCenterRpc { service PeerCenterRpc {
+3 -1
View File
@@ -4,6 +4,8 @@ use thiserror::Error;
use crate::tunnels; use crate::tunnels;
use super::PeerId;
#[derive(Error, Debug)] #[derive(Error, Debug)]
pub enum Error { pub enum Error {
#[error("io error")] #[error("io error")]
@@ -13,7 +15,7 @@ pub enum Error {
#[error("tunnel error {0}")] #[error("tunnel error {0}")]
TunnelError(#[from] tunnels::TunnelError), TunnelError(#[from] tunnels::TunnelError),
#[error("Peer has no conn, PeerId: {0}")] #[error("Peer has no conn, PeerId: {0}")]
PeerNoConnectionError(uuid::Uuid), PeerNoConnectionError(PeerId),
#[error("RouteError: {0}")] #[error("RouteError: {0}")]
RouteError(String), RouteError(String),
#[error("Not found")] #[error("Not found")]
+10 -8
View File
@@ -3,19 +3,19 @@ use std::{io::Write, sync::Arc};
use crate::rpc::PeerConnInfo; use crate::rpc::PeerConnInfo;
use crossbeam::atomic::AtomicCell; use crossbeam::atomic::AtomicCell;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use uuid::Uuid;
use super::{ use super::{
config_fs::ConfigFs, config_fs::ConfigFs,
netns::NetNS, netns::NetNS,
network::IPCollector, network::IPCollector,
stun::{StunInfoCollector, StunInfoCollectorTrait}, stun::{StunInfoCollector, StunInfoCollectorTrait},
PeerId,
}; };
#[derive(Debug, Clone, PartialEq)] #[derive(Debug, Clone, PartialEq)]
pub enum GlobalCtxEvent { pub enum GlobalCtxEvent {
PeerAdded(Uuid), PeerAdded(PeerId),
PeerRemoved(Uuid), PeerRemoved(PeerId),
PeerConnAdded(PeerConnInfo), PeerConnAdded(PeerConnInfo),
PeerConnRemoved(PeerConnInfo), PeerConnRemoved(PeerConnInfo),
} }
@@ -231,6 +231,8 @@ impl GlobalCtx {
#[cfg(test)] #[cfg(test)]
pub mod tests { pub mod tests {
use crate::common::new_peer_id;
use super::*; use super::*;
#[tokio::test] #[tokio::test]
@@ -240,19 +242,19 @@ pub mod tests {
let global_ctx = GlobalCtx::new("test", config_fs, net_ns, None); let global_ctx = GlobalCtx::new("test", config_fs, net_ns, None);
let mut subscriber = global_ctx.subscribe(); let mut subscriber = global_ctx.subscribe();
let uuid = Uuid::new_v4(); let peer_id = new_peer_id();
global_ctx.issue_event(GlobalCtxEvent::PeerAdded(uuid.clone())); global_ctx.issue_event(GlobalCtxEvent::PeerAdded(peer_id.clone()));
global_ctx.issue_event(GlobalCtxEvent::PeerRemoved(uuid.clone())); global_ctx.issue_event(GlobalCtxEvent::PeerRemoved(peer_id.clone()));
global_ctx.issue_event(GlobalCtxEvent::PeerConnAdded(PeerConnInfo::default())); global_ctx.issue_event(GlobalCtxEvent::PeerConnAdded(PeerConnInfo::default()));
global_ctx.issue_event(GlobalCtxEvent::PeerConnRemoved(PeerConnInfo::default())); global_ctx.issue_event(GlobalCtxEvent::PeerConnRemoved(PeerConnInfo::default()));
assert_eq!( assert_eq!(
subscriber.recv().await.unwrap(), subscriber.recv().await.unwrap(),
GlobalCtxEvent::PeerAdded(uuid.clone()) GlobalCtxEvent::PeerAdded(peer_id.clone())
); );
assert_eq!( assert_eq!(
subscriber.recv().await.unwrap(), subscriber.recv().await.unwrap(),
GlobalCtxEvent::PeerRemoved(uuid.clone()) GlobalCtxEvent::PeerRemoved(peer_id.clone())
); );
assert_eq!( assert_eq!(
subscriber.recv().await.unwrap(), subscriber.recv().await.unwrap(),
+6
View File
@@ -23,3 +23,9 @@ pub fn get_logger_timer_rfc3339(
) -> tracing_subscriber::fmt::time::OffsetTime<time::format_description::well_known::Rfc3339> { ) -> tracing_subscriber::fmt::time::OffsetTime<time::format_description::well_known::Rfc3339> {
get_logger_timer(time::format_description::well_known::Rfc3339) get_logger_timer(time::format_description::well_known::Rfc3339)
} }
pub type PeerId = u32;
pub fn new_peer_id() -> PeerId {
rand::random()
}
+14 -19
View File
@@ -8,8 +8,9 @@ use crate::{
error::Error, error::Error,
global_ctx::ArcGlobalCtx, global_ctx::ArcGlobalCtx,
network::IPCollector, network::IPCollector,
PeerId,
}, },
peers::{peer_manager::PeerManager, peer_rpc::PeerRpcManager, PeerId}, peers::{peer_manager::PeerManager, peer_rpc::PeerRpcManager},
}; };
use crate::rpc::{peer::GetIpListResponse, PeerConnInfo}; use crate::rpc::{peer::GetIpListResponse, PeerConnInfo};
@@ -37,7 +38,7 @@ impl PeerManagerForDirectConnector for PeerManager {
let routes = self.list_routes().await; let routes = self.list_routes().await;
for r in routes.iter() { for r in routes.iter() {
ret.push(r.peer_id.parse().unwrap()); ret.push(r.peer_id);
} }
ret ret
@@ -91,7 +92,6 @@ impl std::fmt::Debug for DirectConnectorManagerData {
} }
pub struct DirectConnectorManager { pub struct DirectConnectorManager {
my_node_id: uuid::Uuid,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
data: Arc<DirectConnectorManagerData>, data: Arc<DirectConnectorManagerData>,
@@ -99,13 +99,8 @@ pub struct DirectConnectorManager {
} }
impl DirectConnectorManager { impl DirectConnectorManager {
pub fn new( pub fn new(global_ctx: ArcGlobalCtx, peer_manager: Arc<PeerManager>) -> Self {
my_node_id: uuid::Uuid,
global_ctx: ArcGlobalCtx,
peer_manager: Arc<PeerManager>,
) -> Self {
Self { Self {
my_node_id,
global_ctx: global_ctx.clone(), global_ctx: global_ctx.clone(),
data: Arc::new(DirectConnectorManagerData { data: Arc::new(DirectConnectorManagerData {
global_ctx, global_ctx,
@@ -130,14 +125,14 @@ impl DirectConnectorManager {
pub fn run_as_client(&mut self) { pub fn run_as_client(&mut self) {
let data = self.data.clone(); let data = self.data.clone();
let my_node_id = self.my_node_id.clone(); let my_peer_id = self.data.peer_manager.my_peer_id();
self.tasks.spawn( self.tasks.spawn(
async move { async move {
loop { loop {
let peers = data.peer_manager.list_peers().await; let peers = data.peer_manager.list_peers().await;
let mut tasks = JoinSet::new(); let mut tasks = JoinSet::new();
for peer_id in peers { for peer_id in peers {
if peer_id == my_node_id { if peer_id == my_peer_id {
continue; continue;
} }
tasks.spawn(Self::do_try_direct_connect(data.clone(), peer_id)); tasks.spawn(Self::do_try_direct_connect(data.clone(), peer_id));
@@ -149,7 +144,9 @@ impl DirectConnectorManager {
tokio::time::sleep(std::time::Duration::from_secs(5)).await; tokio::time::sleep(std::time::Duration::from_secs(5)).await;
} }
} }
.instrument(tracing::info_span!("direct_connector_client", my_id = ?self.my_node_id)), .instrument(
tracing::info_span!("direct_connector_client", my_id = ?self.global_ctx.id),
),
); );
} }
@@ -185,7 +182,7 @@ impl DirectConnectorManager {
); );
data.peer_manager data.peer_manager
.get_peer_map() .get_peer_map()
.close_peer_conn(&peer_id, &conn_id) .close_peer_conn(peer_id, &conn_id)
.await?; .await?;
return Err(Error::InvalidUrl(addr)); return Err(Error::InvalidUrl(addr));
} }
@@ -291,14 +288,12 @@ mod tests {
connect_peer_manager(p_a.clone(), p_b.clone()).await; connect_peer_manager(p_a.clone(), p_b.clone()).await;
connect_peer_manager(p_b.clone(), p_c.clone()).await; connect_peer_manager(p_b.clone(), p_c.clone()).await;
wait_route_appear(p_a.clone(), p_c.my_node_id()) wait_route_appear(p_a.clone(), p_c.my_peer_id())
.await .await
.unwrap(); .unwrap();
let mut dm_a = let mut dm_a = DirectConnectorManager::new(p_a.get_global_ctx(), p_a.clone());
DirectConnectorManager::new(p_a.my_node_id(), p_a.get_global_ctx(), p_a.clone()); let mut dm_c = DirectConnectorManager::new(p_c.get_global_ctx(), p_c.clone());
let mut dm_c =
DirectConnectorManager::new(p_c.my_node_id(), p_c.get_global_ctx(), p_c.clone());
dm_a.run_as_client(); dm_a.run_as_client();
dm_c.run_as_server(); dm_c.run_as_server();
@@ -318,7 +313,7 @@ mod tests {
lis_c.run().await.unwrap(); lis_c.run().await.unwrap();
wait_route_appear_with_cost(p_a.clone(), p_c.my_node_id(), Some(1)) wait_route_appear_with_cost(p_a.clone(), p_c.my_peer_id(), Some(1))
.await .await
.unwrap(); .unwrap();
} }
+5 -12
View File
@@ -7,7 +7,7 @@ use tokio::{
time::timeout, time::timeout,
}; };
use crate::rpc as easytier_rpc; use crate::{common::PeerId, peers::peer_conn::PeerConnId, rpc as easytier_rpc};
use crate::{ use crate::{
common::{ common::{
@@ -32,8 +32,8 @@ type ConnectorMap = Arc<DashMap<String, Box<dyn TunnelConnector + Send + Sync>>>
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
struct ReconnResult { struct ReconnResult {
dead_url: String, dead_url: String,
peer_id: uuid::Uuid, peer_id: PeerId,
conn_id: uuid::Uuid, conn_id: PeerConnId,
} }
struct ConnectorManagerData { struct ConnectorManagerData {
@@ -48,24 +48,18 @@ struct ConnectorManagerData {
} }
pub struct ManualConnectorManager { pub struct ManualConnectorManager {
my_node_id: uuid::Uuid,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
data: Arc<ConnectorManagerData>, data: Arc<ConnectorManagerData>,
tasks: JoinSet<()>, tasks: JoinSet<()>,
} }
impl ManualConnectorManager { impl ManualConnectorManager {
pub fn new( pub fn new(global_ctx: ArcGlobalCtx, peer_manager: Arc<PeerManager>) -> Self {
my_node_id: uuid::Uuid,
global_ctx: ArcGlobalCtx,
peer_manager: Arc<PeerManager>,
) -> Self {
let connectors = Arc::new(DashMap::new()); let connectors = Arc::new(DashMap::new());
let tasks = JoinSet::new(); let tasks = JoinSet::new();
let event_subscriber = global_ctx.subscribe(); let event_subscriber = global_ctx.subscribe();
let mut ret = Self { let mut ret = Self {
my_node_id,
global_ctx: global_ctx.clone(), global_ctx: global_ctx.clone(),
data: Arc::new(ConnectorManagerData { data: Arc::new(ConnectorManagerData {
connectors, connectors,
@@ -364,8 +358,7 @@ mod tests {
set_global_var!(MANUAL_CONNECTOR_RECONNECT_INTERVAL_MS, 1); set_global_var!(MANUAL_CONNECTOR_RECONNECT_INTERVAL_MS, 1);
let peer_mgr = create_mock_peer_manager().await; let peer_mgr = create_mock_peer_manager().await;
let my_node_id = uuid::Uuid::new_v4(); let mgr = ManualConnectorManager::new(peer_mgr.get_global_ctx(), peer_mgr);
let mgr = ManualConnectorManager::new(my_node_id, peer_mgr.get_global_ctx(), peer_mgr);
struct MockConnector {} struct MockConnector {}
#[async_trait::async_trait] #[async_trait::async_trait]
@@ -9,9 +9,9 @@ use tracing::Instrument;
use crate::{ use crate::{
common::{ common::{
constants, error::Error, global_ctx::ArcGlobalCtx, rkyv_util::encode_to_bytes, constants, error::Error, global_ctx::ArcGlobalCtx, rkyv_util::encode_to_bytes,
stun::StunInfoCollectorTrait, stun::StunInfoCollectorTrait, PeerId,
}, },
peers::{peer_manager::PeerManager, PeerId}, peers::peer_manager::PeerManager,
rpc::NatType, rpc::NatType,
tunnels::{ tunnels::{
common::setup_sokcet2, common::setup_sokcet2,
@@ -283,7 +283,7 @@ impl UdpHolePunchConnector {
continue; continue;
}; };
let peer_id: PeerId = route.peer_id.parse().unwrap(); let peer_id: PeerId = route.peer_id;
let conns = data.peer_mgr.list_peer_conns(&peer_id).await; let conns = data.peer_mgr.list_peer_conns(&peer_id).await;
if conns.is_some() && conns.unwrap().len() > 0 { if conns.is_some() && conns.unwrap().len() > 0 {
continue; continue;
@@ -310,7 +310,7 @@ impl UdpHolePunchConnector {
// if we have smae level of full cone, node with smaller peer_id will be the initiator // if we have smae level of full cone, node with smaller peer_id will be the initiator
if my_nat_type == peer_nat_type { if my_nat_type == peer_nat_type {
if data.global_ctx.id > peer_id { if data.peer_mgr.my_peer_id() > peer_id {
continue; continue;
} }
} else { } else {
@@ -522,7 +522,7 @@ pub mod tests {
connect_peer_manager(p_a.clone(), p_b.clone()).await; connect_peer_manager(p_a.clone(), p_b.clone()).await;
connect_peer_manager(p_b.clone(), p_c.clone()).await; connect_peer_manager(p_b.clone(), p_c.clone()).await;
wait_route_appear(p_a.clone(), p_c.my_node_id()) wait_route_appear(p_a.clone(), p_c.my_peer_id())
.await .await
.unwrap(); .unwrap();
@@ -534,7 +534,7 @@ pub mod tests {
hole_punching_a.run().await.unwrap(); hole_punching_a.run().await.unwrap();
hole_punching_c.run().await.unwrap(); hole_punching_c.run().await.unwrap();
wait_route_appear_with_cost(p_a.clone(), p_c.my_node_id(), Some(1)) wait_route_appear_with_cost(p_a.clone(), p_c.my_peer_id(), Some(1))
.await .await
.unwrap(); .unwrap();
println!("{:?}", p_a.list_routes().await); println!("{:?}", p_a.list_routes().await);
+5 -10
View File
@@ -20,11 +20,10 @@ use tokio_util::bytes::Bytes;
use tracing::Instrument; use tracing::Instrument;
use crate::{ use crate::{
common::{error::Error, global_ctx::ArcGlobalCtx}, common::{error::Error, global_ctx::ArcGlobalCtx, PeerId},
peers::{ peers::{
packet, packet,
peer_manager::{PeerManager, PeerPacketFilter}, peer_manager::{PeerManager, PeerPacketFilter},
PeerId,
}, },
}; };
@@ -184,13 +183,9 @@ impl PeerPacketFilter for IcmpProxy {
icmp_seq, icmp_seq,
}; };
if packet.to_peer.is_none() {
return None;
}
let value = IcmpNatEntry::new( let value = IcmpNatEntry::new(
packet.from_peer.to_uuid(), packet.from_peer.into(),
packet.to_peer.as_ref().unwrap().to_uuid(), packet.to_peer.into(),
ipv4.get_source().into(), ipv4.get_source().into(),
) )
.ok()?; .ok()?;
@@ -270,8 +265,8 @@ impl IcmpProxy {
self.tasks.lock().await.spawn( self.tasks.lock().await.spawn(
async move { async move {
while let Some(msg) = receiver.recv().await { while let Some(msg) = receiver.recv().await {
let to_peer_id: uuid::Uuid = msg.to_peer.as_ref().unwrap().clone().into(); let to_peer_id = msg.to_peer.into();
let ret = peer_manager.send_msg(msg.into(), &to_peer_id).await; let ret = peer_manager.send_msg(msg.into(), to_peer_id).await;
if ret.is_err() { if ret.is_err() {
tracing::error!("send icmp packet to peer failed: {:?}", ret); tracing::error!("send icmp packet to peer failed: {:?}", ret);
} }
+5 -6
View File
@@ -25,11 +25,10 @@ use tokio_util::bytes::Bytes;
use tracing::Level; use tracing::Level;
use crate::{ use crate::{
common::{error::Error, global_ctx::ArcGlobalCtx}, common::{error::Error, global_ctx::ArcGlobalCtx, PeerId},
peers::{ peers::{
packet, packet,
peer_manager::{PeerManager, PeerPacketFilter}, peer_manager::{PeerManager, PeerPacketFilter},
PeerId,
}, },
tunnels::common::setup_sokcet2, tunnels::common::setup_sokcet2,
}; };
@@ -276,8 +275,8 @@ impl PeerPacketFilter for UdpProxy {
tracing::info!(?packet, ?ipv4, ?udp_packet, "udp nat table entry created"); tracing::info!(?packet, ?ipv4, ?udp_packet, "udp nat table entry created");
let _g = self.global_ctx.net_ns.guard(); let _g = self.global_ctx.net_ns.guard();
Ok(Arc::new(UdpNatEntry::new( Ok(Arc::new(UdpNatEntry::new(
packet.from_peer.to_uuid(), packet.from_peer.into(),
packet.to_peer.as_ref().unwrap().to_uuid(), packet.to_peer.into(),
nat_key.src_socket, nat_key.src_socket,
)?)) )?))
}) })
@@ -366,9 +365,9 @@ impl UdpProxy {
let peer_manager = self.peer_manager.clone(); let peer_manager = self.peer_manager.clone();
self.tasks.lock().await.spawn(async move { self.tasks.lock().await.spawn(async move {
while let Some(msg) = receiver.recv().await { while let Some(msg) = receiver.recv().await {
let to_peer_id: uuid::Uuid = msg.to_peer.as_ref().unwrap().clone().into(); let to_peer_id: PeerId = msg.to_peer.into();
tracing::trace!(?msg, ?to_peer_id, "udp nat packet response send"); tracing::trace!(?msg, ?to_peer_id, "udp nat packet response send");
let ret = peer_manager.send_msg(msg.into(), &to_peer_id).await; let ret = peer_manager.send_msg(msg.into(), to_peer_id).await;
if ret.is_err() { if ret.is_err() {
tracing::error!("send icmp packet to peer failed: {:?}", ret); tracing::error!("send icmp packet to peer failed: {:?}", ret);
} }
+13 -5
View File
@@ -9,12 +9,12 @@ use pnet::packet::ipv4::Ipv4Packet;
use tokio::{sync::Mutex, task::JoinSet}; use tokio::{sync::Mutex, task::JoinSet};
use tokio_util::bytes::{Bytes, BytesMut}; use tokio_util::bytes::{Bytes, BytesMut};
use tonic::transport::Server; use tonic::transport::Server;
use uuid::Uuid;
use crate::common::config_fs::ConfigFs; use crate::common::config_fs::ConfigFs;
use crate::common::error::Error; use crate::common::error::Error;
use crate::common::global_ctx::{ArcGlobalCtx, GlobalCtx}; use crate::common::global_ctx::{ArcGlobalCtx, GlobalCtx};
use crate::common::netns::NetNS; use crate::common::netns::NetNS;
use crate::common::PeerId;
use crate::connector::direct::DirectConnectorManager; use crate::connector::direct::DirectConnectorManager;
use crate::connector::manual::{ConnectorManagerRpcService, ManualConnectorManager}; use crate::connector::manual::{ConnectorManagerRpcService, ManualConnectorManager};
use crate::connector::udp_hole_punch::UdpHolePunchConnector; use crate::connector::udp_hole_punch::UdpHolePunchConnector;
@@ -22,6 +22,7 @@ use crate::gateway::icmp_proxy::IcmpProxy;
use crate::gateway::tcp_proxy::TcpProxy; use crate::gateway::tcp_proxy::TcpProxy;
use crate::gateway::udp_proxy::UdpProxy; use crate::gateway::udp_proxy::UdpProxy;
use crate::peer_center::instance::PeerCenterInstance; use crate::peer_center::instance::PeerCenterInstance;
use crate::peers::peer_conn::PeerConnId;
use crate::peers::peer_manager::PeerManager; use crate::peers::peer_manager::PeerManager;
use crate::peers::rpc_service::PeerManagerRpcService; use crate::peers::rpc_service::PeerManagerRpcService;
use crate::tunnels::SinkItem; use crate::tunnels::SinkItem;
@@ -126,19 +127,18 @@ impl Instance {
)); ));
let listener_manager = Arc::new(Mutex::new(ListenerManager::new( let listener_manager = Arc::new(Mutex::new(ListenerManager::new(
id, peer_manager.my_node_id(),
net_ns.clone(), net_ns.clone(),
peer_manager.clone(), peer_manager.clone(),
))); )));
let conn_manager = Arc::new(ManualConnectorManager::new( let conn_manager = Arc::new(ManualConnectorManager::new(
id,
global_ctx.clone(), global_ctx.clone(),
peer_manager.clone(), peer_manager.clone(),
)); ));
let mut direct_conn_manager = let mut direct_conn_manager =
DirectConnectorManager::new(id, global_ctx.clone(), peer_manager.clone()); DirectConnectorManager::new(global_ctx.clone(), peer_manager.clone());
direct_conn_manager.run(); direct_conn_manager.run();
let udp_hole_puncher = UdpHolePunchConnector::new(global_ctx.clone(), peer_manager.clone()); let udp_hole_puncher = UdpHolePunchConnector::new(global_ctx.clone(), peer_manager.clone());
@@ -302,7 +302,11 @@ impl Instance {
self.peer_manager.clone() self.peer_manager.clone()
} }
pub async fn close_peer_conn(&mut self, peer_id: &Uuid, conn_id: &Uuid) -> Result<(), Error> { pub async fn close_peer_conn(
&mut self,
peer_id: PeerId,
conn_id: &PeerConnId,
) -> Result<(), Error> {
self.peer_manager self.peer_manager
.get_peer_map() .get_peer_map()
.close_peer_conn(peer_id, conn_id) .close_peer_conn(peer_id, conn_id)
@@ -321,6 +325,10 @@ impl Instance {
self.id self.id
} }
pub fn peer_id(&self) -> PeerId {
self.peer_manager.my_peer_id()
}
fn run_rpc_server(&mut self) -> Result<(), Box<dyn std::error::Error>> { fn run_rpc_server(&mut self) -> Result<(), Box<dyn std::error::Error>> {
let addr = "0.0.0.0:15888".parse()?; let addr = "0.0.0.0:15888".parse()?;
let peer_mgr = self.peer_manager.clone(); let peer_mgr = self.peer_manager.clone();
@@ -54,7 +54,6 @@ impl VirtualNic {
let mut config = tun::Configuration::default(); let mut config = tun::Configuration::default();
let has_packet_info = cfg!(target_os = "macos"); let has_packet_info = cfg!(target_os = "macos");
config.layer(tun::Layer::L3); config.layer(tun::Layer::L3);
config.name(format!("et_{}", self.global_ctx.inst_name));
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
{ {
@@ -62,7 +61,6 @@ impl VirtualNic {
// detect protocol by ourselves for cross platform // detect protocol by ourselves for cross platform
config.packet_information(false); config.packet_information(false);
}); });
config.name(self.dev_name.clone());
} }
if self.queue_num != 1 { if self.queue_num != 1 {
+13 -11
View File
@@ -16,7 +16,8 @@ use tokio::{
use tracing::Instrument; use tracing::Instrument;
use crate::{ use crate::{
peers::{peer_manager::PeerManager, rpc_service::PeerManagerRpcService, PeerId}, common::PeerId,
peers::{peer_manager::PeerManager, rpc_service::PeerManagerRpcService},
rpc::{GetGlobalPeerMapRequest, GetGlobalPeerMapResponse}, rpc::{GetGlobalPeerMapRequest, GetGlobalPeerMapResponse},
}; };
@@ -43,7 +44,7 @@ impl PeerCenterBase {
pub async fn init(&self) -> Result<(), Error> { pub async fn init(&self) -> Result<(), Error> {
self.peer_mgr.get_peer_rpc_mgr().run_service( self.peer_mgr.get_peer_rpc_mgr().run_service(
SERVICE_ID, SERVICE_ID,
PeerCenterServer::new(self.peer_mgr.my_node_id()).serve(), PeerCenterServer::new(self.peer_mgr.my_peer_id()).serve(),
); );
Ok(()) Ok(())
@@ -55,13 +56,14 @@ impl PeerCenterBase {
return None; return None;
} }
// find peer with alphabetical smallest id. // find peer with alphabetical smallest id.
let mut min_peer = peer_mgr.my_node_id().to_string(); let mut min_peer = peer_mgr.my_peer_id();
for peer in peers.iter() { for peer in peers.iter() {
if peer.peer_id < min_peer { let peer_id = peer.peer_id;
min_peer = peer.peer_id.clone(); if peer_id < min_peer {
min_peer = peer_id;
} }
} }
Some(min_peer.parse().unwrap()) Some(min_peer)
} }
async fn init_periodic_job< async fn init_periodic_job<
@@ -72,7 +74,7 @@ impl PeerCenterBase {
job_ctx: T, job_ctx: T,
job_fn: (impl Fn(PeerCenterServiceClient, Arc<PeridicJobCtx<T>>) -> Fut + Send + Sync + 'static), job_fn: (impl Fn(PeerCenterServiceClient, Arc<PeridicJobCtx<T>>) -> Fut + Send + Sync + 'static),
) -> () { ) -> () {
let my_node_id = self.peer_mgr.my_node_id(); let my_peer_id = self.peer_mgr.my_peer_id();
let peer_mgr = self.peer_mgr.clone(); let peer_mgr = self.peer_mgr.clone();
let lock = self.lock.clone(); let lock = self.lock.clone();
self.tasks.lock().await.spawn( self.tasks.lock().await.spawn(
@@ -111,7 +113,7 @@ impl PeerCenterBase {
} }
} }
} }
.instrument(tracing::info_span!("periodic_job", ?my_node_id)), .instrument(tracing::info_span!("periodic_job", ?my_peer_id)),
); );
} }
@@ -140,7 +142,7 @@ impl crate::rpc::cli::peer_center_rpc_server::PeerCenterRpc for PeerCenterInstan
global_peer_map: global_peer_map global_peer_map: global_peer_map
.map .map
.into_iter() .into_iter()
.map(|(k, v)| (k.to_string(), v)) .map(|(k, v)| (k, v))
.collect(), .collect(),
})) }))
} }
@@ -233,7 +235,7 @@ impl PeerCenterInstance {
self.client self.client
.init_periodic_job(ctx, |client, ctx| async move { .init_periodic_job(ctx, |client, ctx| async move {
let my_node_id = ctx.peer_mgr.my_node_id(); let my_node_id = ctx.peer_mgr.my_peer_id();
// if peers are not same in next 10 seconds, report peers to center server // if peers are not same in next 10 seconds, report peers to center server
let mut peers = PeerInfoForGlobalMap::default(); let mut peers = PeerInfoForGlobalMap::default();
@@ -317,7 +319,7 @@ mod tests {
connect_peer_manager(peer_mgr_a.clone(), peer_mgr_b.clone()).await; connect_peer_manager(peer_mgr_a.clone(), peer_mgr_b.clone()).await;
connect_peer_manager(peer_mgr_b.clone(), peer_mgr_c.clone()).await; connect_peer_manager(peer_mgr_b.clone(), peer_mgr_c.clone()).await;
wait_route_appear(peer_mgr_a.clone(), peer_mgr_c.my_node_id()) wait_route_appear(peer_mgr_a.clone(), peer_mgr_c.my_peer_id())
.await .await
.unwrap(); .unwrap();
+1 -1
View File
@@ -7,7 +7,7 @@ use dashmap::DashMap;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use tokio::{sync::RwLock, task::JoinSet}; use tokio::{sync::RwLock, task::JoinSet};
use crate::peers::PeerId; use crate::common::PeerId;
use super::{ use super::{
service::{GetGlobalPeerMapResponse, GlobalPeerMap, PeerCenterService, PeerInfoForGlobalMap}, service::{GetGlobalPeerMapResponse, GlobalPeerMap, PeerCenterService, PeerInfoForGlobalMap},
+1 -1
View File
@@ -1,6 +1,6 @@
use std::collections::BTreeMap; use std::collections::BTreeMap;
use crate::{peers::PeerId, rpc::DirectConnectedPeerInfo}; use crate::{common::PeerId, rpc::DirectConnectedPeerInfo};
use super::{Digest, Error}; use super::{Digest, Error};
use crate::rpc::PeerInfo; use crate::rpc::PeerInfo;
@@ -13,6 +13,7 @@ use tokio_util::bytes::Bytes;
use crate::common::{ use crate::common::{
error::Error, error::Error,
global_ctx::{ArcGlobalCtx, NetworkIdentity}, global_ctx::{ArcGlobalCtx, NetworkIdentity},
PeerId,
}; };
use super::{ use super::{
@@ -20,12 +21,12 @@ use super::{
peer_conn::PeerConn, peer_conn::PeerConn,
peer_map::PeerMap, peer_map::PeerMap,
peer_rpc::PeerRpcManager, peer_rpc::PeerRpcManager,
PeerId,
}; };
pub struct ForeignNetworkClient { pub struct ForeignNetworkClient {
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
peer_rpc: Arc<PeerRpcManager>, peer_rpc: Arc<PeerRpcManager>,
my_peer_id: PeerId,
peer_map: Arc<PeerMap>, peer_map: Arc<PeerMap>,
@@ -38,13 +39,19 @@ impl ForeignNetworkClient {
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
packet_sender_to_mgr: mpsc::Sender<Bytes>, packet_sender_to_mgr: mpsc::Sender<Bytes>,
peer_rpc: Arc<PeerRpcManager>, peer_rpc: Arc<PeerRpcManager>,
my_peer_id: PeerId,
) -> Self { ) -> Self {
let peer_map = Arc::new(PeerMap::new(packet_sender_to_mgr, global_ctx.clone())); let peer_map = Arc::new(PeerMap::new(
packet_sender_to_mgr,
global_ctx.clone(),
my_peer_id,
));
let next_hop = Arc::new(DashMap::new()); let next_hop = Arc::new(DashMap::new());
Self { Self {
global_ctx, global_ctx,
peer_rpc, peer_rpc,
my_peer_id,
peer_map, peer_map,
@@ -130,20 +137,20 @@ impl ForeignNetworkClient {
new_next_hop new_next_hop
} }
pub fn has_next_hop(&self, peer_id: &PeerId) -> bool { pub fn has_next_hop(&self, peer_id: PeerId) -> bool {
self.get_next_hop(peer_id).is_some() self.get_next_hop(peer_id).is_some()
} }
pub fn get_next_hop(&self, peer_id: &PeerId) -> Option<PeerId> { pub fn get_next_hop(&self, peer_id: PeerId) -> Option<PeerId> {
if self.peer_map.has_peer(peer_id) { if self.peer_map.has_peer(peer_id) {
return Some(peer_id.clone()); return Some(peer_id.clone());
} }
self.next_hop.get(peer_id).map(|v| v.clone()) self.next_hop.get(&peer_id).map(|v| v.clone())
} }
pub async fn send_msg(&self, msg: Bytes, peer_id: &PeerId) -> Result<(), Error> { pub async fn send_msg(&self, msg: Bytes, peer_id: PeerId) -> Result<(), Error> {
if let Some(next_hop) = self.get_next_hop(peer_id) { if let Some(next_hop) = self.get_next_hop(peer_id) {
return self.peer_map.send_msg_directly(msg, &next_hop).await; return self.peer_map.send_msg_directly(msg, next_hop).await;
} }
Err(Error::RouteError("no next hop".to_string())) Err(Error::RouteError("no next hop".to_string()))
} }
@@ -151,7 +158,7 @@ impl ForeignNetworkClient {
pub fn list_foreign_peers(&self) -> Vec<PeerId> { pub fn list_foreign_peers(&self) -> Vec<PeerId> {
let mut peers = vec![]; let mut peers = vec![];
for item in self.next_hop.iter() { for item in self.next_hop.iter() {
if item.key() != &self.global_ctx.get_id() { if item.key() != &self.my_peer_id {
peers.push(item.key().clone()); peers.push(item.key().clone());
} }
} }
@@ -16,11 +16,11 @@ use tokio::{
task::JoinSet, task::JoinSet,
}; };
use tokio_util::bytes::Bytes; use tokio_util::bytes::Bytes;
use uuid::Uuid;
use crate::common::{ use crate::common::{
error::Error, error::Error,
global_ctx::{ArcGlobalCtx, GlobalCtxEvent, NetworkIdentity}, global_ctx::{ArcGlobalCtx, GlobalCtxEvent, NetworkIdentity},
PeerId,
}; };
use super::{ use super::{
@@ -28,7 +28,6 @@ use super::{
peer_conn::PeerConn, peer_conn::PeerConn,
peer_map::PeerMap, peer_map::PeerMap,
peer_rpc::{PeerRpcManager, PeerRpcManagerTransport}, peer_rpc::{PeerRpcManager, PeerRpcManagerTransport},
PeerId,
}; };
struct ForeignNetworkEntry { struct ForeignNetworkEntry {
@@ -41,8 +40,9 @@ impl ForeignNetworkEntry {
network: NetworkIdentity, network: NetworkIdentity,
packet_sender: mpsc::Sender<Bytes>, packet_sender: mpsc::Sender<Bytes>,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
my_peer_id: PeerId,
) -> Self { ) -> Self {
let peer_map = Arc::new(PeerMap::new(packet_sender, global_ctx)); let peer_map = Arc::new(PeerMap::new(packet_sender, global_ctx, my_peer_id));
Self { network, peer_map } Self { network, peer_map }
} }
} }
@@ -53,10 +53,10 @@ struct ForeignNetworkManagerData {
} }
impl ForeignNetworkManagerData { impl ForeignNetworkManagerData {
async fn send_msg(&self, msg: Bytes, dst_peer_id: &uuid::Uuid) -> Result<(), Error> { async fn send_msg(&self, msg: Bytes, dst_peer_id: PeerId) -> Result<(), Error> {
let network_name = self let network_name = self
.peer_network_map .peer_network_map
.get(dst_peer_id) .get(&dst_peer_id)
.ok_or_else(|| Error::RouteError("network not found".to_string()))? .ok_or_else(|| Error::RouteError("network not found".to_string()))?
.clone(); .clone();
let entry = self let entry = self
@@ -67,16 +67,16 @@ impl ForeignNetworkManagerData {
entry.peer_map.send_msg(msg, dst_peer_id).await entry.peer_map.send_msg(msg, dst_peer_id).await
} }
fn get_peer_network(&self, peer_id: &uuid::Uuid) -> Option<String> { fn get_peer_network(&self, peer_id: PeerId) -> Option<String> {
self.peer_network_map.get(peer_id).map(|v| v.clone()) self.peer_network_map.get(&peer_id).map(|v| v.clone())
} }
fn get_network_entry(&self, network_name: &str) -> Option<Arc<ForeignNetworkEntry>> { fn get_network_entry(&self, network_name: &str) -> Option<Arc<ForeignNetworkEntry>> {
self.network_peer_maps.get(network_name).map(|v| v.clone()) self.network_peer_maps.get(network_name).map(|v| v.clone())
} }
fn remove_peer(&self, peer_id: &uuid::Uuid) { fn remove_peer(&self, peer_id: PeerId) {
self.peer_network_map.remove(peer_id); self.peer_network_map.remove(&peer_id);
self.network_peer_maps.retain(|_, v| !v.peer_map.is_empty()); self.network_peer_maps.retain(|_, v| !v.peer_map.is_empty());
} }
@@ -91,7 +91,7 @@ impl ForeignNetworkManagerData {
} }
struct RpcTransport { struct RpcTransport {
my_peer_id: uuid::Uuid, my_peer_id: PeerId,
data: Arc<ForeignNetworkManagerData>, data: Arc<ForeignNetworkManagerData>,
packet_recv: Mutex<UnboundedReceiver<Bytes>>, packet_recv: Mutex<UnboundedReceiver<Bytes>>,
@@ -99,11 +99,11 @@ struct RpcTransport {
#[async_trait::async_trait] #[async_trait::async_trait]
impl PeerRpcManagerTransport for RpcTransport { impl PeerRpcManagerTransport for RpcTransport {
fn my_peer_id(&self) -> Uuid { fn my_peer_id(&self) -> PeerId {
self.my_peer_id self.my_peer_id
} }
async fn send(&self, msg: Bytes, dst_peer_id: &uuid::Uuid) -> Result<(), Error> { async fn send(&self, msg: Bytes, dst_peer_id: PeerId) -> Result<(), Error> {
self.data.send_msg(msg, dst_peer_id).await self.data.send_msg(msg, dst_peer_id).await
} }
@@ -136,6 +136,7 @@ impl ForeignNetworkService for Arc<ForeignNetworkManagerData> {
} }
pub struct ForeignNetworkManager { pub struct ForeignNetworkManager {
my_peer_id: PeerId,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
packet_sender_to_mgr: mpsc::Sender<Bytes>, packet_sender_to_mgr: mpsc::Sender<Bytes>,
@@ -150,7 +151,11 @@ pub struct ForeignNetworkManager {
} }
impl ForeignNetworkManager { impl ForeignNetworkManager {
pub fn new(global_ctx: ArcGlobalCtx, packet_sender_to_mgr: mpsc::Sender<Bytes>) -> Self { pub fn new(
my_peer_id: PeerId,
global_ctx: ArcGlobalCtx,
packet_sender_to_mgr: mpsc::Sender<Bytes>,
) -> Self {
// recv packet from all foreign networks // recv packet from all foreign networks
let (packet_sender, packet_recv) = mpsc::channel(1000); let (packet_sender, packet_recv) = mpsc::channel(1000);
@@ -162,12 +167,13 @@ impl ForeignNetworkManager {
// handle rpc from foreign networks // handle rpc from foreign networks
let (rpc_transport_sender, peer_rpc_tspt_recv) = mpsc::unbounded_channel(); let (rpc_transport_sender, peer_rpc_tspt_recv) = mpsc::unbounded_channel();
let rpc_mgr = Arc::new(PeerRpcManager::new(RpcTransport { let rpc_mgr = Arc::new(PeerRpcManager::new(RpcTransport {
my_peer_id: global_ctx.get_id(), my_peer_id,
data: data.clone(), data: data.clone(),
packet_recv: Mutex::new(peer_rpc_tspt_recv), packet_recv: Mutex::new(peer_rpc_tspt_recv),
})); }));
Self { Self {
my_peer_id,
global_ctx, global_ctx,
packet_sender_to_mgr, packet_sender_to_mgr,
@@ -194,6 +200,7 @@ impl ForeignNetworkManager {
peer_conn.get_network_identity(), peer_conn.get_network_identity(),
self.packet_sender.clone(), self.packet_sender.clone(),
self.global_ctx.clone(), self.global_ctx.clone(),
self.my_peer_id,
)) ))
}) })
.clone(); .clone();
@@ -217,7 +224,7 @@ impl ForeignNetworkManager {
while let Ok(e) = s.recv().await { while let Ok(e) = s.recv().await {
tracing::warn!(?e, "global event"); tracing::warn!(?e, "global event");
if let GlobalCtxEvent::PeerRemoved(peer_id) = &e { if let GlobalCtxEvent::PeerRemoved(peer_id) = &e {
data.remove_peer(peer_id); data.remove_peer(*peer_id);
} else if let GlobalCtxEvent::PeerConnRemoved(..) = &e { } else if let GlobalCtxEvent::PeerConnRemoved(..) = &e {
data.clear_no_conn_peer(); data.clear_no_conn_peer();
} }
@@ -228,16 +235,16 @@ impl ForeignNetworkManager {
async fn start_packet_recv(&self) { async fn start_packet_recv(&self) {
let mut recv = self.packet_recv.lock().await.take().unwrap(); let mut recv = self.packet_recv.lock().await.take().unwrap();
let sender_to_mgr = self.packet_sender_to_mgr.clone(); let sender_to_mgr = self.packet_sender_to_mgr.clone();
let my_node_id = self.global_ctx.get_id(); let my_node_id = self.my_peer_id;
let rpc_sender = self.rpc_transport_sender.clone(); let rpc_sender = self.rpc_transport_sender.clone();
let data = self.data.clone(); let data = self.data.clone();
self.tasks.lock().await.spawn(async move { self.tasks.lock().await.spawn(async move {
while let Some(packet_bytes) = recv.recv().await { while let Some(packet_bytes) = recv.recv().await {
let packet = packet::Packet::decode(&packet_bytes); let packet = packet::Packet::decode(&packet_bytes);
let from_peer_uuid = packet.from_peer.to_uuid(); let from_peer_id = packet.from_peer.into();
let to_peer_uuid = packet.to_peer.as_ref().unwrap().to_uuid(); let to_peer_id = packet.to_peer.into();
if to_peer_uuid == my_node_id { if to_peer_id == my_node_id {
if let ArchivedPacketBody::Ctrl(packet::ArchivedCtrlPacketBody::TaRpc(..)) = if let ArchivedPacketBody::Ctrl(packet::ArchivedCtrlPacketBody::TaRpc(..)) =
&packet.body &packet.body
{ {
@@ -248,10 +255,10 @@ impl ForeignNetworkManager {
tracing::error!("send packet to mgr failed: {:?}", e); tracing::error!("send packet to mgr failed: {:?}", e);
} }
} else { } else {
let Some(from_network) = data.get_peer_network(&from_peer_uuid) else { let Some(from_network) = data.get_peer_network(from_peer_id) else {
continue; continue;
}; };
let Some(to_network) = data.get_peer_network(&to_peer_uuid) else { let Some(to_network) = data.get_peer_network(to_peer_id) else {
continue; continue;
}; };
if from_network != to_network { if from_network != to_network {
@@ -259,7 +266,7 @@ impl ForeignNetworkManager {
} }
if let Some(entry) = data.get_network_entry(&from_network) { if let Some(entry) = data.get_network_entry(&from_network) {
let ret = entry.peer_map.send_msg(packet_bytes, &to_peer_uuid).await; let ret = entry.peer_map.send_msg(packet_bytes, to_peer_id).await;
if ret.is_err() { if ret.is_err() {
tracing::error!("forward packet to peer failed: {:?}", ret.err()); tracing::error!("forward packet to peer failed: {:?}", ret.err());
} }
@@ -339,7 +346,7 @@ mod tests {
assert!(succ); assert!(succ);
assert_eq!( assert_eq!(
vec![pm_center.my_node_id()], vec![pm_center.my_peer_id()],
pma_net1 pma_net1
.get_foreign_network_client() .get_foreign_network_client()
.get_peer_map() .get_peer_map()
@@ -347,14 +354,14 @@ mod tests {
.await .await
); );
assert_eq!( assert_eq!(
vec![pm_center.my_node_id()], vec![pm_center.my_peer_id()],
pmb_net1 pmb_net1
.get_foreign_network_client() .get_foreign_network_client()
.get_peer_map() .get_peer_map()
.list_peers() .list_peers()
.await .await
); );
wait_route_appear(pma_net1.clone(), pmb_net1.my_node_id()) wait_route_appear(pma_net1.clone(), pmb_net1.my_peer_id())
.await .await
.unwrap(); .unwrap();
assert_eq!(1, pma_net1.list_routes().await.len()); assert_eq!(1, pma_net1.list_routes().await.len());
@@ -362,10 +369,10 @@ mod tests {
let pmc_net1 = create_mock_peer_manager_for_foreign_network("net1").await; let pmc_net1 = create_mock_peer_manager_for_foreign_network("net1").await;
connect_peer_manager(pmc_net1.clone(), pm_center.clone()).await; connect_peer_manager(pmc_net1.clone(), pm_center.clone()).await;
wait_route_appear(pma_net1.clone(), pmc_net1.my_node_id()) wait_route_appear(pma_net1.clone(), pmc_net1.my_peer_id())
.await .await
.unwrap(); .unwrap();
wait_route_appear(pmb_net1.clone(), pmc_net1.my_node_id()) wait_route_appear(pmb_net1.clone(), pmc_net1.my_peer_id())
.await .await
.unwrap(); .unwrap();
assert_eq!(2, pmc_net1.list_routes().await.len()); assert_eq!(2, pmc_net1.list_routes().await.len());
@@ -374,7 +381,7 @@ mod tests {
let pmb_net2 = create_mock_peer_manager_for_foreign_network("net2").await; let pmb_net2 = create_mock_peer_manager_for_foreign_network("net2").await;
connect_peer_manager(pma_net2.clone(), pm_center.clone()).await; connect_peer_manager(pma_net2.clone(), pm_center.clone()).await;
connect_peer_manager(pmb_net2.clone(), pm_center.clone()).await; connect_peer_manager(pmb_net2.clone(), pm_center.clone()).await;
wait_route_appear(pma_net2.clone(), pmb_net2.my_node_id()) wait_route_appear(pma_net2.clone(), pmb_net2.my_peer_id())
.await .await
.unwrap(); .unwrap();
assert_eq!(1, pma_net2.list_routes().await.len()); assert_eq!(1, pma_net2.list_routes().await.len());
-2
View File
@@ -13,5 +13,3 @@ pub mod foreign_network_manager;
#[cfg(test)] #[cfg(test)]
pub mod tests; pub mod tests;
pub type PeerId = uuid::Uuid;
+26 -28
View File
@@ -6,6 +6,7 @@ use tokio_util::bytes::Bytes;
use crate::common::{ use crate::common::{
global_ctx::NetworkIdentity, global_ctx::NetworkIdentity,
rkyv_util::{decode_from_bytes, encode_to_bytes}, rkyv_util::{decode_from_bytes, encode_to_bytes},
PeerId,
}; };
const MAGIC: u32 = 0xd1e1a5e1; const MAGIC: u32 = 0xd1e1a5e1;
@@ -92,7 +93,7 @@ impl Debug for ArchivedNetworkIdentityForPacket {
#[archive_attr(derive(Debug))] #[archive_attr(derive(Debug))]
pub struct HandShake { pub struct HandShake {
pub magic: u32, pub magic: u32,
pub my_peer_id: UUID, pub my_peer_id: PeerId,
pub version: u32, pub version: u32,
pub features: Vec<String>, pub features: Vec<String>,
pub network_identity: NetworkIdentityForPacket, pub network_identity: NetworkIdentityForPacket,
@@ -140,8 +141,8 @@ pub enum PacketBody {
// Derives can be passed through to the generated type: // Derives can be passed through to the generated type:
#[archive_attr(derive(Debug))] #[archive_attr(derive(Debug))]
pub struct Packet { pub struct Packet {
pub from_peer: UUID, pub from_peer: PeerId,
pub to_peer: Option<UUID>, pub to_peer: PeerId,
pub body: PacketBody, pub body: PacketBody,
} }
@@ -158,13 +159,13 @@ impl From<Packet> for Bytes {
} }
impl Packet { impl Packet {
pub fn new_handshake(from_peer: uuid::Uuid, network: &NetworkIdentity) -> Self { pub fn new_handshake(from_peer: PeerId, network: &NetworkIdentity) -> Self {
Packet { Packet {
from_peer: from_peer.into(), from_peer: from_peer.into(),
to_peer: None, to_peer: 0,
body: PacketBody::Ctrl(CtrlPacketBody::HandShake(HandShake { body: PacketBody::Ctrl(CtrlPacketBody::HandShake(HandShake {
magic: MAGIC, magic: MAGIC,
my_peer_id: from_peer.into(), my_peer_id: from_peer,
version: VERSION, version: VERSION,
features: Vec::new(), features: Vec::new(),
network_identity: network.clone().into(), network_identity: network.clone().into(),
@@ -172,25 +173,20 @@ impl Packet {
} }
} }
pub fn new_data_packet(from_peer: uuid::Uuid, to_peer: uuid::Uuid, data: &[u8]) -> Self { pub fn new_data_packet(from_peer: PeerId, to_peer: PeerId, data: &[u8]) -> Self {
Packet { Packet {
from_peer: from_peer.into(), from_peer,
to_peer: Some(to_peer.into()), to_peer,
body: PacketBody::Data(DataPacketBody { body: PacketBody::Data(DataPacketBody {
data: data.to_vec(), data: data.to_vec(),
}), }),
} }
} }
pub fn new_route_packet( pub fn new_route_packet(from_peer: PeerId, to_peer: PeerId, route_id: u8, data: &[u8]) -> Self {
from_peer: uuid::Uuid,
to_peer: uuid::Uuid,
route_id: u8,
data: &[u8],
) -> Self {
Packet { Packet {
from_peer: from_peer.into(), from_peer,
to_peer: Some(to_peer.into()), to_peer,
body: PacketBody::Ctrl(CtrlPacketBody::RoutePacket(RoutePacket { body: PacketBody::Ctrl(CtrlPacketBody::RoutePacket(RoutePacket {
route_id, route_id,
body: data.to_vec(), body: data.to_vec(),
@@ -198,32 +194,32 @@ impl Packet {
} }
} }
pub fn new_ping_packet(from_peer: uuid::Uuid, to_peer: uuid::Uuid, seq: u32) -> Self { pub fn new_ping_packet(from_peer: PeerId, to_peer: PeerId, seq: u32) -> Self {
Packet { Packet {
from_peer: from_peer.into(), from_peer,
to_peer: Some(to_peer.into()), to_peer,
body: PacketBody::Ctrl(CtrlPacketBody::Ping(seq)), body: PacketBody::Ctrl(CtrlPacketBody::Ping(seq)),
} }
} }
pub fn new_pong_packet(from_peer: uuid::Uuid, to_peer: uuid::Uuid, seq: u32) -> Self { pub fn new_pong_packet(from_peer: PeerId, to_peer: PeerId, seq: u32) -> Self {
Packet { Packet {
from_peer: from_peer.into(), from_peer,
to_peer: Some(to_peer.into()), to_peer,
body: PacketBody::Ctrl(CtrlPacketBody::Pong(seq)), body: PacketBody::Ctrl(CtrlPacketBody::Pong(seq)),
} }
} }
pub fn new_tarpc_packet( pub fn new_tarpc_packet(
from_peer: uuid::Uuid, from_peer: PeerId,
to_peer: uuid::Uuid, to_peer: PeerId,
service_id: u32, service_id: u32,
is_req: bool, is_req: bool,
body: Vec<u8>, body: Vec<u8>,
) -> Self { ) -> Self {
Packet { Packet {
from_peer: from_peer.into(), from_peer,
to_peer: Some(to_peer.into()), to_peer,
body: PacketBody::Ctrl(CtrlPacketBody::TaRpc(service_id, is_req, body)), body: PacketBody::Ctrl(CtrlPacketBody::TaRpc(service_id, is_req, body)),
} }
} }
@@ -231,12 +227,14 @@ impl Packet {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::common::new_peer_id;
use super::*; use super::*;
#[tokio::test] #[tokio::test]
async fn serialize() { async fn serialize() {
let a = "abcde"; let a = "abcde";
let out = Packet::new_data_packet(uuid::Uuid::new_v4(), uuid::Uuid::new_v4(), a.as_bytes()); let out = Packet::new_data_packet(new_peer_id(), new_peer_id(), a.as_bytes());
// let out = T::new(a.as_bytes()); // let out = T::new(a.as_bytes());
let out_bytes: Bytes = out.into(); let out_bytes: Bytes = out.into();
println!("out str: {:?}", a.as_bytes()); println!("out str: {:?}", a.as_bytes());
+10 -10
View File
@@ -9,26 +9,26 @@ use tokio::{
}; };
use tokio_util::bytes::Bytes; use tokio_util::bytes::Bytes;
use tracing::Instrument; use tracing::Instrument;
use uuid::Uuid;
use super::peer_conn::PeerConn; use super::peer_conn::{PeerConn, PeerConnId};
use crate::common::{ use crate::common::{
error::Error, error::Error,
global_ctx::{ArcGlobalCtx, GlobalCtxEvent}, global_ctx::{ArcGlobalCtx, GlobalCtxEvent},
PeerId,
}; };
use crate::rpc::PeerConnInfo; use crate::rpc::PeerConnInfo;
type ArcPeerConn = Arc<Mutex<PeerConn>>; type ArcPeerConn = Arc<Mutex<PeerConn>>;
type ConnMap = Arc<DashMap<Uuid, ArcPeerConn>>; type ConnMap = Arc<DashMap<PeerConnId, ArcPeerConn>>;
pub struct Peer { pub struct Peer {
pub peer_node_id: uuid::Uuid, pub peer_node_id: PeerId,
conns: ConnMap, conns: ConnMap,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
packet_recv_chan: mpsc::Sender<Bytes>, packet_recv_chan: mpsc::Sender<Bytes>,
close_event_sender: mpsc::Sender<Uuid>, close_event_sender: mpsc::Sender<PeerConnId>,
close_event_listener: JoinHandle<()>, close_event_listener: JoinHandle<()>,
shutdown_notifier: Arc<tokio::sync::Notify>, shutdown_notifier: Arc<tokio::sync::Notify>,
@@ -36,7 +36,7 @@ pub struct Peer {
impl Peer { impl Peer {
pub fn new( pub fn new(
peer_node_id: uuid::Uuid, peer_node_id: PeerId,
packet_recv_chan: mpsc::Sender<Bytes>, packet_recv_chan: mpsc::Sender<Bytes>,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
) -> Self { ) -> Self {
@@ -118,7 +118,7 @@ impl Peer {
Ok(()) Ok(())
} }
pub async fn close_peer_conn(&self, conn_id: &Uuid) -> Result<(), Error> { pub async fn close_peer_conn(&self, conn_id: &PeerConnId) -> Result<(), Error> {
let has_key = self.conns.contains_key(conn_id); let has_key = self.conns.contains_key(conn_id);
if !has_key { if !has_key {
return Err(Error::NotFound); return Err(Error::NotFound);
@@ -157,7 +157,7 @@ mod tests {
use tokio::{sync::mpsc, time::timeout}; use tokio::{sync::mpsc, time::timeout};
use crate::{ use crate::{
common::{config_fs::ConfigFs, global_ctx::GlobalCtx, netns::NetNS}, common::{config_fs::ConfigFs, global_ctx::GlobalCtx, netns::NetNS, new_peer_id},
peers::peer_conn::PeerConn, peers::peer_conn::PeerConn,
tunnels::ring_tunnel::create_ring_tunnel_pair, tunnels::ring_tunnel::create_ring_tunnel_pair,
}; };
@@ -174,8 +174,8 @@ mod tests {
NetNS::new(None), NetNS::new(None),
None, None,
)); ));
let local_peer = Peer::new(uuid::Uuid::new_v4(), local_packet_send, global_ctx.clone()); let local_peer = Peer::new(new_peer_id(), local_packet_send, global_ctx.clone());
let remote_peer = Peer::new(uuid::Uuid::new_v4(), remote_packet_send, global_ctx.clone()); let remote_peer = Peer::new(new_peer_id(), remote_packet_send, global_ctx.clone());
let (local_tunnel, remote_tunnel) = create_ring_tunnel_pair(); let (local_tunnel, remote_tunnel) = create_ring_tunnel_pair();
let mut local_peer_conn = let mut local_peer_conn =
+44 -45
View File
@@ -23,7 +23,10 @@ use tokio_util::{
use tracing::Instrument; use tracing::Instrument;
use crate::{ use crate::{
common::global_ctx::{ArcGlobalCtx, NetworkIdentity}, common::{
global_ctx::{ArcGlobalCtx, NetworkIdentity},
PeerId,
},
define_tunnel_filter_chain, define_tunnel_filter_chain,
rpc::{PeerConnInfo, PeerConnStats}, rpc::{PeerConnInfo, PeerConnStats},
tunnels::{ tunnels::{
@@ -37,6 +40,8 @@ use super::packet::{self, ArchivedCtrlPacketBody, ArchivedHandShake, Packet};
pub type PacketRecvChan = mpsc::Sender<Bytes>; pub type PacketRecvChan = mpsc::Sender<Bytes>;
pub type PeerConnId = uuid::Uuid;
macro_rules! wait_response { macro_rules! wait_response {
($stream: ident, $out_var:ident, $pattern:pat_param => $value:expr) => { ($stream: ident, $out_var:ident, $pattern:pat_param => $value:expr) => {
let rsp_vec = timeout(Duration::from_secs(1), $stream.next()).await; let rsp_vec = timeout(Duration::from_secs(1), $stream.next()).await;
@@ -78,7 +83,7 @@ fn build_ctrl_msg(msg: Bytes, is_req: bool) -> Bytes {
pub struct PeerInfo { pub struct PeerInfo {
magic: u32, magic: u32,
pub my_peer_id: uuid::Uuid, pub my_peer_id: PeerId,
version: u32, version: u32,
pub features: Vec<String>, pub features: Vec<String>,
pub interfaces: Vec<NetworkInterface>, pub interfaces: Vec<NetworkInterface>,
@@ -89,7 +94,7 @@ impl<'a> From<&ArchivedHandShake> for PeerInfo {
fn from(hs: &ArchivedHandShake) -> Self { fn from(hs: &ArchivedHandShake) -> Self {
PeerInfo { PeerInfo {
magic: hs.magic.into(), magic: hs.magic.into(),
my_peer_id: hs.my_peer_id.to_uuid(), my_peer_id: hs.my_peer_id.into(),
version: hs.version.into(), version: hs.version.into(),
features: hs.features.iter().map(|x| x.to_string()).collect(), features: hs.features.iter().map(|x| x.to_string()).collect(),
interfaces: Vec::new(), interfaces: Vec::new(),
@@ -99,8 +104,8 @@ impl<'a> From<&ArchivedHandShake> for PeerInfo {
} }
struct PeerConnPinger { struct PeerConnPinger {
my_node_id: uuid::Uuid, my_peer_id: PeerId,
peer_id: uuid::Uuid, peer_id: PeerId,
sink: Arc<Mutex<Pin<Box<dyn DatagramSink>>>>, sink: Arc<Mutex<Pin<Box<dyn DatagramSink>>>>,
ctrl_sender: broadcast::Sender<Bytes>, ctrl_sender: broadcast::Sender<Bytes>,
latency_stats: Arc<WindowLatency>, latency_stats: Arc<WindowLatency>,
@@ -111,7 +116,7 @@ struct PeerConnPinger {
impl Debug for PeerConnPinger { impl Debug for PeerConnPinger {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("PeerConnPinger") f.debug_struct("PeerConnPinger")
.field("my_node_id", &self.my_node_id) .field("my_peer_id", &self.my_peer_id)
.field("peer_id", &self.peer_id) .field("peer_id", &self.peer_id)
.finish() .finish()
} }
@@ -119,15 +124,15 @@ impl Debug for PeerConnPinger {
impl PeerConnPinger { impl PeerConnPinger {
pub fn new( pub fn new(
my_node_id: uuid::Uuid, my_peer_id: PeerId,
peer_id: uuid::Uuid, peer_id: PeerId,
sink: Pin<Box<dyn DatagramSink>>, sink: Pin<Box<dyn DatagramSink>>,
ctrl_sender: broadcast::Sender<Bytes>, ctrl_sender: broadcast::Sender<Bytes>,
latency_stats: Arc<WindowLatency>, latency_stats: Arc<WindowLatency>,
loss_rate_stats: Arc<AtomicU32>, loss_rate_stats: Arc<AtomicU32>,
) -> Self { ) -> Self {
Self { Self {
my_node_id, my_peer_id,
peer_id, peer_id,
sink: Arc::new(Mutex::new(sink)), sink: Arc::new(Mutex::new(sink)),
tasks: JoinSet::new(), tasks: JoinSet::new(),
@@ -137,16 +142,9 @@ impl PeerConnPinger {
} }
} }
pub async fn ping(&self) -> Result<(), TunnelError> {
let mut sink = self.sink.lock().await;
let ping_packet = Packet::new_ping_packet(uuid::Uuid::new_v4(), uuid::Uuid::new_v4(), 0);
sink.send(ping_packet.into()).await?;
Ok(())
}
async fn do_pingpong_once( async fn do_pingpong_once(
my_node_id: uuid::Uuid, my_node_id: PeerId,
peer_id: uuid::Uuid, peer_id: PeerId,
sink: Arc<Mutex<Pin<Box<dyn DatagramSink>>>>, sink: Arc<Mutex<Pin<Box<dyn DatagramSink>>>>,
receiver: &mut broadcast::Receiver<Bytes>, receiver: &mut broadcast::Receiver<Bytes>,
seq: u32, seq: u32,
@@ -207,7 +205,7 @@ impl PeerConnPinger {
async fn pingpong(&mut self) { async fn pingpong(&mut self) {
let sink = self.sink.clone(); let sink = self.sink.clone();
let my_node_id = self.my_node_id; let my_node_id = self.my_peer_id;
let peer_id = self.peer_id; let peer_id = self.peer_id;
let latency_stats = self.latency_stats.clone(); let latency_stats = self.latency_stats.clone();
@@ -309,9 +307,9 @@ impl PeerConnPinger {
define_tunnel_filter_chain!(PeerConnTunnel, stats = StatsRecorderTunnelFilter); define_tunnel_filter_chain!(PeerConnTunnel, stats = StatsRecorderTunnelFilter);
pub struct PeerConn { pub struct PeerConn {
conn_id: uuid::Uuid, conn_id: PeerConnId,
my_node_id: uuid::Uuid, my_peer_id: PeerId,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
sink: Pin<Box<dyn DatagramSink>>, sink: Pin<Box<dyn DatagramSink>>,
@@ -321,7 +319,7 @@ pub struct PeerConn {
info: Option<PeerInfo>, info: Option<PeerInfo>,
close_event_sender: Option<mpsc::Sender<uuid::Uuid>>, close_event_sender: Option<mpsc::Sender<PeerConnId>>,
ctrl_resp_sender: broadcast::Sender<Bytes>, ctrl_resp_sender: broadcast::Sender<Bytes>,
@@ -340,15 +338,15 @@ static CTRL_REQ_PACKET_PREFIX: &[u8] = &[0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xd
static CTRL_RESP_PACKET_PREFIX: &[u8] = &[0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf1]; static CTRL_RESP_PACKET_PREFIX: &[u8] = &[0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf1];
impl PeerConn { impl PeerConn {
pub fn new(node_id: uuid::Uuid, global_ctx: ArcGlobalCtx, tunnel: Box<dyn Tunnel>) -> Self { pub fn new(my_peer_id: PeerId, global_ctx: ArcGlobalCtx, tunnel: Box<dyn Tunnel>) -> Self {
let (ctrl_sender, _ctrl_receiver) = broadcast::channel(100); let (ctrl_sender, _ctrl_receiver) = broadcast::channel(100);
let peer_conn_tunnel = PeerConnTunnel::new(); let peer_conn_tunnel = PeerConnTunnel::new();
let tunnel = peer_conn_tunnel.wrap_tunnel(tunnel); let tunnel = peer_conn_tunnel.wrap_tunnel(tunnel);
PeerConn { PeerConn {
conn_id: uuid::Uuid::new_v4(), conn_id: PeerConnId::new_v4(),
my_node_id: node_id, my_peer_id,
global_ctx, global_ctx,
sink: tunnel.pin_sink(), sink: tunnel.pin_sink(),
@@ -367,7 +365,7 @@ impl PeerConn {
} }
} }
pub fn get_conn_id(&self) -> uuid::Uuid { pub fn get_conn_id(&self) -> PeerConnId {
self.conn_id self.conn_id
} }
@@ -382,7 +380,7 @@ impl PeerConn {
let hs_req = self let hs_req = self
.global_ctx .global_ctx
.net_ns .net_ns
.run(|| packet::Packet::new_handshake(self.my_node_id, &self.global_ctx.network)); .run(|| packet::Packet::new_handshake(self.my_peer_id, &self.global_ctx.network));
sink.send(hs_req.into()).await?; sink.send(hs_req.into()).await?;
Ok(()) Ok(())
@@ -395,7 +393,7 @@ impl PeerConn {
let hs_req = self let hs_req = self
.global_ctx .global_ctx
.net_ns .net_ns
.run(|| packet::Packet::new_handshake(self.my_node_id, &self.global_ctx.network)); .run(|| packet::Packet::new_handshake(self.my_peer_id, &self.global_ctx.network));
sink.send(hs_req.into()).await?; sink.send(hs_req.into()).await?;
wait_response!(stream, hs_rsp, packet::ArchivedPacketBody::Ctrl(ArchivedCtrlPacketBody::HandShake(x)) => x); wait_response!(stream, hs_rsp, packet::ArchivedPacketBody::Ctrl(ArchivedCtrlPacketBody::HandShake(x)) => x);
@@ -429,8 +427,8 @@ impl PeerConn {
log::trace!("recv ping packet: {:?}", packet); log::trace!("recv ping packet: {:?}", packet);
Ok(build_ctrl_msg( Ok(build_ctrl_msg(
packet::Packet::new_pong_packet( packet::Packet::new_pong_packet(
conn_info.my_node_id.parse().unwrap(), conn_info.my_peer_id,
conn_info.peer_id.parse().unwrap(), conn_info.peer_id,
seq.into(), seq.into(),
) )
.into(), .into(),
@@ -446,7 +444,7 @@ impl PeerConn {
pub fn start_pingpong(&mut self) { pub fn start_pingpong(&mut self) {
let mut pingpong = PeerConnPinger::new( let mut pingpong = PeerConnPinger::new(
self.my_node_id, self.my_peer_id,
self.get_peer_id(), self.get_peer_id(),
self.tunnel.pin_sink(), self.tunnel.pin_sink(),
self.ctrl_resp_sender.clone(), self.ctrl_resp_sender.clone(),
@@ -532,7 +530,7 @@ impl PeerConn {
self.sink.send(msg).await self.sink.send(msg).await
} }
pub fn get_peer_id(&self) -> uuid::Uuid { pub fn get_peer_id(&self) -> PeerId {
self.info.as_ref().unwrap().my_peer_id self.info.as_ref().unwrap().my_peer_id
} }
@@ -540,7 +538,7 @@ impl PeerConn {
self.info.as_ref().unwrap().network_identity.clone() self.info.as_ref().unwrap().network_identity.clone()
} }
pub fn set_close_event_sender(&mut self, sender: mpsc::Sender<uuid::Uuid>) { pub fn set_close_event_sender(&mut self, sender: mpsc::Sender<PeerConnId>) {
self.close_event_sender = Some(sender); self.close_event_sender = Some(sender);
} }
@@ -559,8 +557,8 @@ impl PeerConn {
pub fn get_conn_info(&self) -> PeerConnInfo { pub fn get_conn_info(&self) -> PeerConnInfo {
PeerConnInfo { PeerConnInfo {
conn_id: self.conn_id.to_string(), conn_id: self.conn_id.to_string(),
my_node_id: self.my_node_id.to_string(), my_peer_id: self.my_peer_id,
peer_id: self.get_peer_id().to_string(), peer_id: self.get_peer_id(),
features: self.info.as_ref().unwrap().features.clone(), features: self.info.as_ref().unwrap().features.clone(),
tunnel: self.tunnel.info(), tunnel: self.tunnel.info(),
stats: Some(self.get_stats()), stats: Some(self.get_stats()),
@@ -589,6 +587,7 @@ mod tests {
use crate::common::global_ctx::tests::get_mock_global_ctx; use crate::common::global_ctx::tests::get_mock_global_ctx;
use crate::common::global_ctx::GlobalCtx; use crate::common::global_ctx::GlobalCtx;
use crate::common::netns::NetNS; use crate::common::netns::NetNS;
use crate::common::new_peer_id;
use crate::tunnels::tunnel_filter::tests::DropSendTunnelFilter; use crate::tunnels::tunnel_filter::tests::DropSendTunnelFilter;
use crate::tunnels::tunnel_filter::{PacketRecorderTunnelFilter, TunnelWithFilter}; use crate::tunnels::tunnel_filter::{PacketRecorderTunnelFilter, TunnelWithFilter};
@@ -603,11 +602,11 @@ mod tests {
let c = TunnelWithFilter::new(c, c_recorder.clone()); let c = TunnelWithFilter::new(c, c_recorder.clone());
let s = TunnelWithFilter::new(s, s_recorder.clone()); let s = TunnelWithFilter::new(s, s_recorder.clone());
let c_uuid = uuid::Uuid::new_v4(); let c_peer_id = new_peer_id();
let s_uuid = uuid::Uuid::new_v4(); let s_peer_id = new_peer_id();
let mut c_peer = PeerConn::new( let mut c_peer = PeerConn::new(
c_uuid, c_peer_id,
Arc::new(GlobalCtx::new( Arc::new(GlobalCtx::new(
"c", "c",
ConfigFs::new_with_dir("c", "/tmp"), ConfigFs::new_with_dir("c", "/tmp"),
@@ -618,7 +617,7 @@ mod tests {
); );
let mut s_peer = PeerConn::new( let mut s_peer = PeerConn::new(
s_uuid, s_peer_id,
Arc::new(GlobalCtx::new( Arc::new(GlobalCtx::new(
"c", "c",
ConfigFs::new_with_dir("c", "/tmp"), ConfigFs::new_with_dir("c", "/tmp"),
@@ -642,8 +641,8 @@ mod tests {
assert_eq!(s_recorder.sent.lock().unwrap().len(), 1); assert_eq!(s_recorder.sent.lock().unwrap().len(), 1);
assert_eq!(s_recorder.received.lock().unwrap().len(), 1); assert_eq!(s_recorder.received.lock().unwrap().len(), 1);
assert_eq!(c_peer.get_peer_id(), s_uuid); assert_eq!(c_peer.get_peer_id(), s_peer_id);
assert_eq!(s_peer.get_peer_id(), c_uuid); assert_eq!(s_peer.get_peer_id(), c_peer_id);
assert_eq!(c_peer.get_network_identity(), s_peer.get_network_identity()); assert_eq!(c_peer.get_network_identity(), s_peer.get_network_identity());
assert_eq!(c_peer.get_network_identity(), NetworkIdentity::default()); assert_eq!(c_peer.get_network_identity(), NetworkIdentity::default());
} }
@@ -656,11 +655,11 @@ mod tests {
let c_recorder = Arc::new(DropSendTunnelFilter::new(drop_start, drop_end)); let c_recorder = Arc::new(DropSendTunnelFilter::new(drop_start, drop_end));
let c = TunnelWithFilter::new(c, c_recorder.clone()); let c = TunnelWithFilter::new(c, c_recorder.clone());
let c_uuid = uuid::Uuid::new_v4(); let c_peer_id = new_peer_id();
let s_uuid = uuid::Uuid::new_v4(); let s_peer_id = new_peer_id();
let mut c_peer = PeerConn::new(c_uuid, get_mock_global_ctx(), Box::new(c)); let mut c_peer = PeerConn::new(c_peer_id, get_mock_global_ctx(), Box::new(c));
let mut s_peer = PeerConn::new(s_uuid, get_mock_global_ctx(), Box::new(s)); let mut s_peer = PeerConn::new(s_peer_id, get_mock_global_ctx(), Box::new(s));
let (c_ret, s_ret) = tokio::join!( let (c_ret, s_ret) = tokio::join!(
c_peer.do_handshake_as_client(), c_peer.do_handshake_as_client(),
+58 -41
View File
@@ -13,15 +13,12 @@ use tokio::{
use tokio_stream::wrappers::ReceiverStream; use tokio_stream::wrappers::ReceiverStream;
use tokio_util::bytes::{Bytes, BytesMut}; use tokio_util::bytes::{Bytes, BytesMut};
use uuid::Uuid;
use crate::{ use crate::{
common::{error::Error, global_ctx::ArcGlobalCtx, rkyv_util::extract_bytes_from_archived_vec}, common::{
error::Error, global_ctx::ArcGlobalCtx, rkyv_util::extract_bytes_from_archived_vec, PeerId,
},
peers::{ peers::{
packet::{self}, packet, peer_conn::PeerConn, peer_rpc::PeerRpcManagerTransport, route_trait::RouteInterface,
peer_conn::PeerConn,
peer_rpc::PeerRpcManagerTransport,
route_trait::RouteInterface,
}, },
tunnels::{SinkItem, Tunnel, TunnelConnector}, tunnels::{SinkItem, Tunnel, TunnelConnector},
}; };
@@ -29,15 +26,15 @@ use crate::{
use super::{ use super::{
foreign_network_client::ForeignNetworkClient, foreign_network_client::ForeignNetworkClient,
foreign_network_manager::ForeignNetworkManager, foreign_network_manager::ForeignNetworkManager,
peer_conn::PeerConnId,
peer_map::PeerMap, peer_map::PeerMap,
peer_rip_route::BasicRoute, peer_rip_route::BasicRoute,
peer_rpc::PeerRpcManager, peer_rpc::PeerRpcManager,
route_trait::{ArcRoute, Route}, route_trait::{ArcRoute, Route},
PeerId,
}; };
struct RpcTransport { struct RpcTransport {
my_peer_id: uuid::Uuid, my_peer_id: PeerId,
peers: Arc<PeerMap>, peers: Arc<PeerMap>,
foreign_peers: Mutex<Option<Arc<PeerMap>>>, foreign_peers: Mutex<Option<Arc<PeerMap>>>,
@@ -47,11 +44,11 @@ struct RpcTransport {
#[async_trait::async_trait] #[async_trait::async_trait]
impl PeerRpcManagerTransport for RpcTransport { impl PeerRpcManagerTransport for RpcTransport {
fn my_peer_id(&self) -> Uuid { fn my_peer_id(&self) -> PeerId {
self.my_peer_id self.my_peer_id
} }
async fn send(&self, msg: Bytes, dst_peer_id: &uuid::Uuid) -> Result<(), Error> { async fn send(&self, msg: Bytes, dst_peer_id: PeerId) -> Result<(), Error> {
if let Some(foreign_peers) = self.foreign_peers.lock().await.as_ref() { if let Some(foreign_peers) = self.foreign_peers.lock().await.as_ref() {
if foreign_peers.has_peer(dst_peer_id) { if foreign_peers.has_peer(dst_peer_id) {
return foreign_peers.send_msg(msg, dst_peer_id).await; return foreign_peers.send_msg(msg, dst_peer_id).await;
@@ -92,7 +89,8 @@ type BoxPeerPacketFilter = Box<dyn PeerPacketFilter + Send + Sync>;
type BoxNicPacketFilter = Box<dyn NicPacketFilter + Send + Sync>; type BoxNicPacketFilter = Box<dyn NicPacketFilter + Send + Sync>;
pub struct PeerManager { pub struct PeerManager {
my_node_id: uuid::Uuid, my_peer_id: PeerId,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
nic_channel: mpsc::Sender<SinkItem>, nic_channel: mpsc::Sender<SinkItem>,
@@ -117,7 +115,7 @@ pub struct PeerManager {
impl Debug for PeerManager { impl Debug for PeerManager {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("PeerManager") f.debug_struct("PeerManager")
.field("my_node_id", &self.my_node_id) .field("my_peer_id", &self.my_peer_id())
.field("instance_name", &self.global_ctx.inst_name) .field("instance_name", &self.global_ctx.inst_name)
.field("net_ns", &self.global_ctx.net_ns.name()) .field("net_ns", &self.global_ctx.net_ns.name())
.finish() .finish()
@@ -126,13 +124,19 @@ impl Debug for PeerManager {
impl PeerManager { impl PeerManager {
pub fn new(global_ctx: ArcGlobalCtx, nic_channel: mpsc::Sender<SinkItem>) -> Self { pub fn new(global_ctx: ArcGlobalCtx, nic_channel: mpsc::Sender<SinkItem>) -> Self {
let my_peer_id = rand::random();
let (packet_send, packet_recv) = mpsc::channel(100); let (packet_send, packet_recv) = mpsc::channel(100);
let peers = Arc::new(PeerMap::new(packet_send.clone(), global_ctx.clone())); let peers = Arc::new(PeerMap::new(
packet_send.clone(),
global_ctx.clone(),
my_peer_id,
));
// TODO: remove these because we have impl pipeline processor. // TODO: remove these because we have impl pipeline processor.
let (peer_rpc_tspt_sender, peer_rpc_tspt_recv) = mpsc::unbounded_channel(); let (peer_rpc_tspt_sender, peer_rpc_tspt_recv) = mpsc::unbounded_channel();
let rpc_tspt = Arc::new(RpcTransport { let rpc_tspt = Arc::new(RpcTransport {
my_peer_id: global_ctx.get_id(), my_peer_id,
peers: peers.clone(), peers: peers.clone(),
foreign_peers: Mutex::new(None), foreign_peers: Mutex::new(None),
packet_recv: Mutex::new(peer_rpc_tspt_recv), packet_recv: Mutex::new(peer_rpc_tspt_recv),
@@ -140,9 +144,10 @@ impl PeerManager {
}); });
let peer_rpc_mgr = Arc::new(PeerRpcManager::new(rpc_tspt.clone())); let peer_rpc_mgr = Arc::new(PeerRpcManager::new(rpc_tspt.clone()));
let basic_route = Arc::new(BasicRoute::new(global_ctx.get_id(), global_ctx.clone())); let basic_route = Arc::new(BasicRoute::new(my_peer_id, global_ctx.clone()));
let foreign_network_manager = Arc::new(ForeignNetworkManager::new( let foreign_network_manager = Arc::new(ForeignNetworkManager::new(
my_peer_id,
global_ctx.clone(), global_ctx.clone(),
packet_send.clone(), packet_send.clone(),
)); ));
@@ -150,10 +155,12 @@ impl PeerManager {
global_ctx.clone(), global_ctx.clone(),
packet_send.clone(), packet_send.clone(),
peer_rpc_mgr.clone(), peer_rpc_mgr.clone(),
my_peer_id,
)); ));
PeerManager { PeerManager {
my_node_id: global_ctx.get_id(), my_peer_id,
global_ctx, global_ctx,
nic_channel, nic_channel,
@@ -176,8 +183,11 @@ impl PeerManager {
} }
} }
pub async fn add_client_tunnel(&self, tunnel: Box<dyn Tunnel>) -> Result<(Uuid, Uuid), Error> { pub async fn add_client_tunnel(
let mut peer = PeerConn::new(self.my_node_id, self.global_ctx.clone(), tunnel); &self,
tunnel: Box<dyn Tunnel>,
) -> Result<(PeerId, PeerConnId), Error> {
let mut peer = PeerConn::new(self.my_peer_id, self.global_ctx.clone(), tunnel);
peer.do_handshake_as_client().await?; peer.do_handshake_as_client().await?;
let conn_id = peer.get_conn_id(); let conn_id = peer.get_conn_id();
let peer_id = peer.get_peer_id(); let peer_id = peer.get_peer_id();
@@ -190,7 +200,7 @@ impl PeerManager {
} }
#[tracing::instrument] #[tracing::instrument]
pub async fn try_connect<C>(&self, mut connector: C) -> Result<(Uuid, Uuid), Error> pub async fn try_connect<C>(&self, mut connector: C) -> Result<(PeerId, PeerConnId), Error>
where where
C: TunnelConnector + Debug, C: TunnelConnector + Debug,
{ {
@@ -204,7 +214,7 @@ impl PeerManager {
#[tracing::instrument] #[tracing::instrument]
pub async fn add_tunnel_as_server(&self, tunnel: Box<dyn Tunnel>) -> Result<(), Error> { pub async fn add_tunnel_as_server(&self, tunnel: Box<dyn Tunnel>) -> Result<(), Error> {
tracing::info!("add tunnel as server start"); tracing::info!("add tunnel as server start");
let mut peer = PeerConn::new(self.my_node_id, self.global_ctx.clone(), tunnel); let mut peer = PeerConn::new(self.my_peer_id, self.global_ctx.clone(), tunnel);
peer.do_handshake_as_server().await?; peer.do_handshake_as_server().await?;
if peer.get_network_identity() == self.global_ctx.get_network_identity() { if peer.get_network_identity() == self.global_ctx.get_network_identity() {
self.peers.add_new_peer_conn(peer).await; self.peers.add_new_peer_conn(peer).await;
@@ -217,7 +227,7 @@ impl PeerManager {
async fn start_peer_recv(&self) { async fn start_peer_recv(&self) {
let mut recv = ReceiverStream::new(self.packet_recv.lock().await.take().unwrap()); let mut recv = ReceiverStream::new(self.packet_recv.lock().await.take().unwrap());
let my_node_id = self.my_node_id; let my_peer_id = self.my_peer_id;
let peers = self.peers.clone(); let peers = self.peers.clone();
let pipe_line = self.peer_packet_process_pipeline.clone(); let pipe_line = self.peer_packet_process_pipeline.clone();
self.tasks.lock().await.spawn(async move { self.tasks.lock().await.spawn(async move {
@@ -225,21 +235,21 @@ impl PeerManager {
while let Some(ret) = recv.next().await { while let Some(ret) = recv.next().await {
log::trace!("peer recv a packet...: {:?}", ret); log::trace!("peer recv a packet...: {:?}", ret);
let packet = packet::Packet::decode(&ret); let packet = packet::Packet::decode(&ret);
let from_peer_uuid = packet.from_peer.to_uuid(); let from_peer_id: PeerId = packet.from_peer.into();
let to_peer_uuid = packet.to_peer.as_ref().unwrap().to_uuid(); let to_peer_id: PeerId = packet.to_peer.into();
if to_peer_uuid != my_node_id { if to_peer_id != my_peer_id {
log::trace!( log::trace!(
"need forward: to_peer_uuid: {:?}, my_uuid: {:?}", "need forward: to_peer_id: {:?}, my_peer_id: {:?}",
to_peer_uuid, to_peer_id,
my_node_id my_peer_id
); );
let ret = peers.send_msg(ret.clone(), &to_peer_uuid).await; let ret = peers.send_msg(ret.clone(), to_peer_id).await;
if ret.is_err() { if ret.is_err() {
log::error!( log::error!(
"forward packet error: {:?}, dst: {:?}, from: {:?}", "forward packet error: {:?}, dst: {:?}, from: {:?}",
ret, ret,
to_peer_uuid, to_peer_id,
from_peer_uuid from_peer_id
); );
} }
} else { } else {
@@ -344,7 +354,7 @@ impl PeerManager {
T: Route + Send + Sync + 'static, T: Route + Send + Sync + 'static,
{ {
struct Interface { struct Interface {
my_node_id: uuid::Uuid, my_peer_id: PeerId,
peers: Arc<PeerMap>, peers: Arc<PeerMap>,
foreign_network_client: Arc<ForeignNetworkClient>, foreign_network_client: Arc<ForeignNetworkClient>,
} }
@@ -360,15 +370,15 @@ impl PeerManager {
&self, &self,
msg: Bytes, msg: Bytes,
route_id: u8, route_id: u8,
dst_peer_id: &PeerId, dst_peer_id: PeerId,
) -> Result<(), Error> { ) -> Result<(), Error> {
let packet_bytes: Bytes = let packet_bytes: Bytes =
packet::Packet::new_route_packet(self.my_node_id, *dst_peer_id, route_id, &msg) packet::Packet::new_route_packet(self.my_peer_id, dst_peer_id, route_id, &msg)
.into(); .into();
if self.foreign_network_client.has_next_hop(dst_peer_id) { if self.foreign_network_client.has_next_hop(dst_peer_id) {
return self return self
.foreign_network_client .foreign_network_client
.send_msg(packet_bytes, &dst_peer_id) .send_msg(packet_bytes, dst_peer_id)
.await; .await;
} }
@@ -376,12 +386,15 @@ impl PeerManager {
.send_msg_directly(packet_bytes, dst_peer_id) .send_msg_directly(packet_bytes, dst_peer_id)
.await .await
} }
fn my_peer_id(&self) -> PeerId {
self.my_peer_id
}
} }
let my_node_id = self.my_node_id; let my_peer_id = self.my_peer_id;
let _route_id = route let _route_id = route
.open(Box::new(Interface { .open(Box::new(Interface {
my_node_id, my_peer_id,
peers: self.peers.clone(), peers: self.peers.clone(),
foreign_network_client: self.foreign_network_client.clone(), foreign_network_client: self.foreign_network_client.clone(),
})) }))
@@ -403,7 +416,7 @@ impl PeerManager {
data data
} }
pub async fn send_msg(&self, msg: Bytes, dst_peer_id: &PeerId) -> Result<(), Error> { pub async fn send_msg(&self, msg: Bytes, dst_peer_id: PeerId) -> Result<(), Error> {
self.peers.send_msg(msg, dst_peer_id).await self.peers.send_msg(msg, dst_peer_id).await
} }
@@ -440,8 +453,8 @@ impl PeerManager {
let send_ret = self let send_ret = self
.peers .peers
.send_msg( .send_msg(
packet::Packet::new_data_packet(self.my_node_id, peer_id.clone(), &msg).into(), packet::Packet::new_data_packet(self.my_peer_id, peer_id.clone(), &msg).into(),
&peer_id, *peer_id,
) )
.await; .await;
@@ -502,7 +515,11 @@ impl PeerManager {
} }
pub fn my_node_id(&self) -> uuid::Uuid { pub fn my_node_id(&self) -> uuid::Uuid {
self.my_node_id self.global_ctx.get_id()
}
pub fn my_peer_id(&self) -> PeerId {
self.my_peer_id
} }
pub fn get_global_ctx(&self) -> ArcGlobalCtx { pub fn get_global_ctx(&self) -> ArcGlobalCtx {
+32 -29
View File
@@ -9,24 +9,35 @@ use crate::{
common::{ common::{
error::Error, error::Error,
global_ctx::{ArcGlobalCtx, GlobalCtxEvent}, global_ctx::{ArcGlobalCtx, GlobalCtxEvent},
PeerId,
}, },
rpc::PeerConnInfo, rpc::PeerConnInfo,
tunnels::TunnelError, tunnels::TunnelError,
}; };
use super::{peer::Peer, peer_conn::PeerConn, route_trait::ArcRoute, PeerId}; use super::{
peer::Peer,
peer_conn::{PeerConn, PeerConnId},
route_trait::ArcRoute,
};
pub struct PeerMap { pub struct PeerMap {
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
my_peer_id: PeerId,
peer_map: DashMap<PeerId, Arc<Peer>>, peer_map: DashMap<PeerId, Arc<Peer>>,
packet_send: mpsc::Sender<Bytes>, packet_send: mpsc::Sender<Bytes>,
routes: RwLock<Vec<ArcRoute>>, routes: RwLock<Vec<ArcRoute>>,
} }
impl PeerMap { impl PeerMap {
pub fn new(packet_send: mpsc::Sender<Bytes>, global_ctx: ArcGlobalCtx) -> Self { pub fn new(
packet_send: mpsc::Sender<Bytes>,
global_ctx: ArcGlobalCtx,
my_peer_id: PeerId,
) -> Self {
PeerMap { PeerMap {
global_ctx, global_ctx,
my_peer_id,
peer_map: DashMap::new(), peer_map: DashMap::new(),
packet_send, packet_send,
routes: RwLock::new(Vec::new()), routes: RwLock::new(Vec::new()),
@@ -53,20 +64,16 @@ impl PeerMap {
} }
} }
fn get_peer_by_id(&self, peer_id: &PeerId) -> Option<Arc<Peer>> { fn get_peer_by_id(&self, peer_id: PeerId) -> Option<Arc<Peer>> {
self.peer_map.get(peer_id).map(|v| v.clone()) self.peer_map.get(&peer_id).map(|v| v.clone())
} }
pub fn has_peer(&self, peer_id: &PeerId) -> bool { pub fn has_peer(&self, peer_id: PeerId) -> bool {
self.peer_map.contains_key(peer_id) self.peer_map.contains_key(&peer_id)
} }
pub async fn send_msg_directly( pub async fn send_msg_directly(&self, msg: Bytes, dst_peer_id: PeerId) -> Result<(), Error> {
&self, if dst_peer_id == self.my_peer_id {
msg: Bytes,
dst_peer_id: &uuid::Uuid,
) -> Result<(), Error> {
if *dst_peer_id == self.global_ctx.get_id() {
return Ok(self return Ok(self
.packet_send .packet_send
.send(msg) .send(msg)
@@ -87,8 +94,8 @@ impl PeerMap {
Ok(()) Ok(())
} }
pub async fn send_msg(&self, msg: Bytes, dst_peer_id: &uuid::Uuid) -> Result<(), Error> { pub async fn send_msg(&self, msg: Bytes, dst_peer_id: PeerId) -> Result<(), Error> {
if *dst_peer_id == self.global_ctx.get_id() { if dst_peer_id == self.my_peer_id {
return Ok(self return Ok(self
.packet_send .packet_send
.send(msg) .send(msg)
@@ -108,7 +115,7 @@ impl PeerMap {
} }
if gateway_peer_id.is_none() && self.has_peer(dst_peer_id) { if gateway_peer_id.is_none() && self.has_peer(dst_peer_id) {
gateway_peer_id = Some(*dst_peer_id); gateway_peer_id = Some(dst_peer_id);
} }
let Some(gateway_peer_id) = gateway_peer_id else { let Some(gateway_peer_id) = gateway_peer_id else {
@@ -116,8 +123,7 @@ impl PeerMap {
return Ok(()); return Ok(());
}; };
self.send_msg_directly(msg.clone(), &gateway_peer_id) self.send_msg_directly(msg.clone(), gateway_peer_id).await?;
.await?;
return Ok(()); return Ok(());
} }
@@ -148,7 +154,7 @@ impl PeerMap {
let mut ret = Vec::new(); let mut ret = Vec::new();
let peers = self.list_peers().await; let peers = self.list_peers().await;
for peer_id in peers.iter() { for peer_id in peers.iter() {
let Some(peer) = self.get_peer_by_id(peer_id) else { let Some(peer) = self.get_peer_by_id(*peer_id) else {
continue; continue;
}; };
if peer.list_peer_conns().await.len() > 0 { if peer.list_peer_conns().await.len() > 0 {
@@ -159,7 +165,7 @@ impl PeerMap {
} }
pub async fn list_peer_conns(&self, peer_id: &PeerId) -> Option<Vec<PeerConnInfo>> { pub async fn list_peer_conns(&self, peer_id: &PeerId) -> Option<Vec<PeerConnInfo>> {
if let Some(p) = self.get_peer_by_id(peer_id) { if let Some(p) = self.get_peer_by_id(*peer_id) {
Some(p.list_peer_conns().await) Some(p.list_peer_conns().await)
} else { } else {
return None; return None;
@@ -168,8 +174,8 @@ impl PeerMap {
pub async fn close_peer_conn( pub async fn close_peer_conn(
&self, &self,
peer_id: &PeerId, peer_id: PeerId,
conn_id: &uuid::Uuid, conn_id: &PeerConnId,
) -> Result<(), Error> { ) -> Result<(), Error> {
if let Some(p) = self.get_peer_by_id(peer_id) { if let Some(p) = self.get_peer_by_id(peer_id) {
p.close_peer_conn(conn_id).await p.close_peer_conn(conn_id).await
@@ -178,10 +184,10 @@ impl PeerMap {
} }
} }
pub async fn close_peer(&self, peer_id: &PeerId) -> Result<(), TunnelError> { pub async fn close_peer(&self, peer_id: PeerId) -> Result<(), TunnelError> {
let remove_ret = self.peer_map.remove(peer_id); let remove_ret = self.peer_map.remove(&peer_id);
self.global_ctx self.global_ctx
.issue_event(GlobalCtxEvent::PeerRemoved(peer_id.clone())); .issue_event(GlobalCtxEvent::PeerRemoved(peer_id));
tracing::info!( tracing::info!(
?peer_id, ?peer_id,
has_old_value = ?remove_ret.is_some(), has_old_value = ?remove_ret.is_some(),
@@ -207,7 +213,7 @@ impl PeerMap {
} }
for peer_id in to_remove { for peer_id in to_remove {
self.close_peer(&peer_id).await.unwrap(); self.close_peer(peer_id).await.unwrap();
} }
} }
@@ -215,10 +221,7 @@ impl PeerMap {
let route_map = DashMap::new(); let route_map = DashMap::new();
for route in self.routes.read().await.iter() { for route in self.routes.read().await.iter() {
for item in route.list_routes().await.iter() { for item in route.list_routes().await.iter() {
route_map.insert( route_map.insert(item.peer_id, item.next_hop_peer_id);
item.peer_id.parse().unwrap(),
item.next_hop_peer_id.parse().unwrap(),
);
} }
} }
route_map route_map
+55 -60
View File
@@ -13,7 +13,6 @@ use tokio::{
}; };
use tokio_util::bytes::Bytes; use tokio_util::bytes::Bytes;
use tracing::Instrument; use tracing::Instrument;
use uuid::Uuid;
use crate::{ use crate::{
common::{ common::{
@@ -21,11 +20,11 @@ use crate::{
global_ctx::ArcGlobalCtx, global_ctx::ArcGlobalCtx,
rkyv_util::{decode_from_bytes, encode_to_bytes, extract_bytes_from_archived_vec}, rkyv_util::{decode_from_bytes, encode_to_bytes, extract_bytes_from_archived_vec},
stun::StunInfoCollectorTrait, stun::StunInfoCollectorTrait,
PeerId,
}, },
peers::{ peers::{
packet::{self, UUID}, packet::{self},
route_trait::{Route, RouteInterfaceBox}, route_trait::{Route, RouteInterfaceBox},
PeerId,
}, },
rpc::{NatType, StunInfo}, rpc::{NatType, StunInfo},
}; };
@@ -44,7 +43,7 @@ type Version = u32;
#[archive_attr(derive(Debug))] #[archive_attr(derive(Debug))]
pub struct SyncPeerInfo { pub struct SyncPeerInfo {
// means next hop in route table. // means next hop in route table.
pub peer_id: UUID, pub peer_id: PeerId,
pub cost: u32, pub cost: u32,
pub ipv4_addr: Option<Ipv4Addr>, pub ipv4_addr: Option<Ipv4Addr>,
pub proxy_cidrs: Vec<String>, pub proxy_cidrs: Vec<String>,
@@ -53,7 +52,7 @@ pub struct SyncPeerInfo {
} }
impl SyncPeerInfo { impl SyncPeerInfo {
pub fn new_self(from_peer: UUID, global_ctx: &ArcGlobalCtx) -> Self { pub fn new_self(from_peer: PeerId, global_ctx: &ArcGlobalCtx) -> Self {
SyncPeerInfo { SyncPeerInfo {
peer_id: from_peer, peer_id: from_peer,
cost: 0, cost: 0,
@@ -71,9 +70,9 @@ impl SyncPeerInfo {
} }
} }
pub fn clone_for_route_table(&self, next_hop: &UUID, cost: u32, from: &Self) -> Self { pub fn clone_for_route_table(&self, next_hop: PeerId, cost: u32, from: &Self) -> Self {
SyncPeerInfo { SyncPeerInfo {
peer_id: next_hop.clone(), peer_id: next_hop,
cost, cost,
ipv4_addr: from.ipv4_addr.clone(), ipv4_addr: from.ipv4_addr.clone(),
proxy_cidrs: from.proxy_cidrs.clone(), proxy_cidrs: from.proxy_cidrs.clone(),
@@ -100,8 +99,8 @@ pub struct SyncPeer {
impl SyncPeer { impl SyncPeer {
pub fn new( pub fn new(
from_peer: UUID, from_peer: PeerId,
_to_peer: UUID, _to_peer: PeerId,
neighbors: Vec<SyncPeerInfo>, neighbors: Vec<SyncPeerInfo>,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
version: Version, version: Version,
@@ -124,13 +123,13 @@ struct SyncPeerFromRemote {
last_update: std::time::Instant, last_update: std::time::Instant,
} }
type SyncPeerFromRemoteMap = Arc<DashMap<uuid::Uuid, SyncPeerFromRemote>>; type SyncPeerFromRemoteMap = Arc<DashMap<PeerId, SyncPeerFromRemote>>;
#[derive(Debug)] #[derive(Debug)]
struct RouteTable { struct RouteTable {
route_info: DashMap<uuid::Uuid, SyncPeerInfo>, route_info: DashMap<PeerId, SyncPeerInfo>,
ipv4_peer_id_map: DashMap<Ipv4Addr, uuid::Uuid>, ipv4_peer_id_map: DashMap<Ipv4Addr, PeerId>,
cidr_peer_id_map: DashMap<cidr::IpCidr, uuid::Uuid>, cidr_peer_id_map: DashMap<cidr::IpCidr, PeerId>,
} }
impl RouteTable { impl RouteTable {
@@ -182,7 +181,7 @@ impl RouteVersion {
} }
pub struct BasicRoute { pub struct BasicRoute {
my_peer_id: packet::UUID, my_peer_id: PeerId,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
interface: Arc<Mutex<Option<RouteInterfaceBox>>>, interface: Arc<Mutex<Option<RouteInterfaceBox>>>,
@@ -200,9 +199,9 @@ pub struct BasicRoute {
} }
impl BasicRoute { impl BasicRoute {
pub fn new(my_peer_id: Uuid, global_ctx: ArcGlobalCtx) -> Self { pub fn new(my_peer_id: PeerId, global_ctx: ArcGlobalCtx) -> Self {
BasicRoute { BasicRoute {
my_peer_id: my_peer_id.into(), my_peer_id,
global_ctx: global_ctx.clone(), global_ctx: global_ctx.clone(),
interface: Arc::new(Mutex::new(None)), interface: Arc::new(Mutex::new(None)),
@@ -223,7 +222,7 @@ impl BasicRoute {
} }
fn update_route_table( fn update_route_table(
my_id: packet::UUID, my_id: PeerId,
sync_peer_reqs: SyncPeerFromRemoteMap, sync_peer_reqs: SyncPeerFromRemoteMap,
route_table: Arc<RouteTable>, route_table: Arc<RouteTable>,
) { ) {
@@ -231,18 +230,18 @@ impl BasicRoute {
let new_route_table = Arc::new(RouteTable::new()); let new_route_table = Arc::new(RouteTable::new());
for item in sync_peer_reqs.iter() { for item in sync_peer_reqs.iter() {
Self::update_route_table_with_req( Self::update_route_table_with_req(my_id, &item.value().packet, new_route_table.clone());
my_id.clone(),
&item.value().packet,
new_route_table.clone(),
);
} }
route_table.copy_from(&new_route_table); route_table.copy_from(&new_route_table);
} }
async fn update_myself(myself: &Arc<RwLock<SyncPeerInfo>>, global_ctx: &ArcGlobalCtx) -> bool { async fn update_myself(
let new_myself = SyncPeerInfo::new_self(global_ctx.get_id().into(), &global_ctx); my_peer_id: PeerId,
myself: &Arc<RwLock<SyncPeerInfo>>,
global_ctx: &ArcGlobalCtx,
) -> bool {
let new_myself = SyncPeerInfo::new_self(my_peer_id, &global_ctx);
if *myself.read().await != new_myself { if *myself.read().await != new_myself {
*myself.write().await = new_myself; *myself.write().await = new_myself;
true true
@@ -251,26 +250,22 @@ impl BasicRoute {
} }
} }
fn update_route_table_with_req( fn update_route_table_with_req(my_id: PeerId, packet: &SyncPeer, route_table: Arc<RouteTable>) {
my_id: packet::UUID,
packet: &SyncPeer,
route_table: Arc<RouteTable>,
) {
let peer_id = packet.myself.peer_id.clone(); let peer_id = packet.myself.peer_id.clone();
let update = |cost: u32, peer_info: &SyncPeerInfo| { let update = |cost: u32, peer_info: &SyncPeerInfo| {
let node_id: uuid::Uuid = peer_info.peer_id.clone().into(); let node_id: PeerId = peer_info.peer_id.into();
let ret = route_table let ret = route_table
.route_info .route_info
.entry(node_id.clone().into()) .entry(node_id.clone().into())
.and_modify(|info| { .and_modify(|info| {
if info.cost > cost { if info.cost > cost {
*info = info.clone_for_route_table(&peer_id, cost, &peer_info); *info = info.clone_for_route_table(peer_id, cost, &peer_info);
} }
}) })
.or_insert( .or_insert(
peer_info peer_info
.clone() .clone()
.clone_for_route_table(&peer_id, cost, &peer_info), .clone_for_route_table(peer_id, cost, &peer_info),
) )
.value() .value()
.clone(); .clone();
@@ -321,7 +316,7 @@ impl BasicRoute {
async fn send_sync_peer_request( async fn send_sync_peer_request(
interface: &RouteInterfaceBox, interface: &RouteInterfaceBox,
my_peer_id: packet::UUID, my_peer_id: PeerId,
global_ctx: ArcGlobalCtx, global_ctx: ArcGlobalCtx,
peer_id: PeerId, peer_id: PeerId,
route_table: Arc<RouteTable>, route_table: Arc<RouteTable>,
@@ -333,11 +328,11 @@ impl BasicRoute {
// copy the route info // copy the route info
for item in route_table.route_info.iter() { for item in route_table.route_info.iter() {
let (k, v) = item.pair(); let (k, v) = item.pair();
route_info_copy.push(v.clone().clone_for_route_table(&(*k).into(), v.cost, &v)); route_info_copy.push(v.clone().clone_for_route_table(*k, v.cost, &v));
} }
let msg = SyncPeer::new( let msg = SyncPeer::new(
my_peer_id, my_peer_id,
peer_id.into(), peer_id,
route_info_copy, route_info_copy,
global_ctx, global_ctx,
my_version, my_version,
@@ -346,7 +341,7 @@ impl BasicRoute {
); );
// TODO: this may exceed the MTU of the tunnel // TODO: this may exceed the MTU of the tunnel
interface interface
.send_route_packet(encode_to_bytes::<_, 4096>(&msg), 1, &peer_id) .send_route_packet(encode_to_bytes::<_, 4096>(&msg), 1, peer_id)
.await .await
} }
@@ -363,7 +358,7 @@ impl BasicRoute {
self.tasks.lock().await.spawn( self.tasks.lock().await.spawn(
async move { async move {
loop { loop {
if Self::update_myself(&myself, &global_ctx).await { if Self::update_myself(my_peer_id,&myself, &global_ctx).await {
version.inc(); version.inc();
tracing::info!( tracing::info!(
my_id = ?my_peer_id, my_id = ?my_peer_id,
@@ -378,7 +373,7 @@ impl BasicRoute {
let peers = interface.list_peers().await; let peers = interface.list_peers().await;
for peer in peers.iter() { for peer in peers.iter() {
let last_send_time = last_send_time_map.get(peer).map(|v| *v).unwrap_or((0, None, Instant::now() - Duration::from_secs(3600))); let last_send_time = last_send_time_map.get(peer).map(|v| *v).unwrap_or((0, None, Instant::now() - Duration::from_secs(3600)));
let my_version_peer_saved = sync_peer_from_remote.get(&peer).and_then(|v| v.packet.peer_version); let my_version_peer_saved = sync_peer_from_remote.get(peer).and_then(|v| v.packet.peer_version);
let peer_have_latest_version = my_version_peer_saved == Some(version.get()); let peer_have_latest_version = my_version_peer_saved == Some(version.get());
if peer_have_latest_version && last_send_time.2.elapsed().as_secs() < SEND_ROUTE_PERIOD_SEC { if peer_have_latest_version && last_send_time.2.elapsed().as_secs() < SEND_ROUTE_PERIOD_SEC {
last_send_time_map_new.insert(*peer, last_send_time); last_send_time_map_new.insert(*peer, last_send_time);
@@ -478,7 +473,7 @@ impl BasicRoute {
if need_update_route { if need_update_route {
Self::update_route_table( Self::update_route_table(
my_peer_id.clone(), my_peer_id,
sync_peer_from_remote.clone(), sync_peer_from_remote.clone(),
route_table.clone(), route_table.clone(),
); );
@@ -508,13 +503,13 @@ impl BasicRoute {
} }
#[tracing::instrument(skip(self, packet), fields(my_id = ?self.my_peer_id, ctx = ?self.global_ctx))] #[tracing::instrument(skip(self, packet), fields(my_id = ?self.my_peer_id, ctx = ?self.global_ctx))]
async fn handle_route_packet(&self, src_peer_id: uuid::Uuid, packet: Bytes) { async fn handle_route_packet(&self, src_peer_id: PeerId, packet: Bytes) {
let packet = decode_from_bytes::<SyncPeer>(&packet).unwrap(); let packet = decode_from_bytes::<SyncPeer>(&packet).unwrap();
let p: SyncPeer = packet.deserialize(&mut rkyv::Infallible).unwrap(); let p: SyncPeer = packet.deserialize(&mut rkyv::Infallible).unwrap();
let mut updated = true; let mut updated = true;
assert_eq!(packet.myself.peer_id.to_uuid(), src_peer_id); assert_eq!(packet.myself.peer_id, src_peer_id);
self.sync_peer_from_remote self.sync_peer_from_remote
.entry(packet.myself.peer_id.to_uuid()) .entry(packet.myself.peer_id.into())
.and_modify(|v| { .and_modify(|v| {
if v.packet.myself == p.myself && v.packet.neighbors == p.neighbors { if v.packet.myself == p.myself && v.packet.neighbors == p.neighbors {
updated = false; updated = false;
@@ -547,7 +542,7 @@ impl BasicRoute {
if packet.need_reply { if packet.need_reply {
self.last_send_time_map self.last_send_time_map
.entry(packet.myself.peer_id.to_uuid()) .entry(packet.myself.peer_id.into())
.and_modify(|v| { .and_modify(|v| {
const FAST_REPLY_DURATION: u64 = const FAST_REPLY_DURATION: u64 =
SEND_ROUTE_PERIOD_SEC - SEND_ROUTE_FAST_REPLY_SEC; SEND_ROUTE_PERIOD_SEC - SEND_ROUTE_FAST_REPLY_SEC;
@@ -577,8 +572,8 @@ impl Route for BasicRoute {
async fn close(&self) {} async fn close(&self) {}
async fn get_next_hop(&self, dst_peer_id: &PeerId) -> Option<PeerId> { async fn get_next_hop(&self, dst_peer_id: PeerId) -> Option<PeerId> {
match self.route_table.route_info.get(dst_peer_id) { match self.route_table.route_info.get(&dst_peer_id) {
Some(info) => { Some(info) => {
return Some(info.peer_id.clone().into()); return Some(info.peer_id.clone().into());
} }
@@ -592,15 +587,15 @@ impl Route for BasicRoute {
async fn list_routes(&self) -> Vec<crate::rpc::Route> { async fn list_routes(&self) -> Vec<crate::rpc::Route> {
let mut routes = Vec::new(); let mut routes = Vec::new();
let parse_route_info = |real_peer_id: &Uuid, route_info: &SyncPeerInfo| { let parse_route_info = |real_peer_id: PeerId, route_info: &SyncPeerInfo| {
let mut route = crate::rpc::Route::default(); let mut route = crate::rpc::Route::default();
route.ipv4_addr = if let Some(ipv4_addr) = route_info.ipv4_addr { route.ipv4_addr = if let Some(ipv4_addr) = route_info.ipv4_addr {
ipv4_addr.to_string() ipv4_addr.to_string()
} else { } else {
"".to_string() "".to_string()
}; };
route.peer_id = real_peer_id.to_string(); route.peer_id = real_peer_id;
route.next_hop_peer_id = Uuid::from(route_info.peer_id.clone()).to_string(); route.next_hop_peer_id = route_info.peer_id;
route.cost = route_info.cost as i32; route.cost = route_info.cost as i32;
route.proxy_cidrs = route_info.proxy_cidrs.clone(); route.proxy_cidrs = route_info.proxy_cidrs.clone();
route.hostname = if let Some(hostname) = &route_info.hostname { route.hostname = if let Some(hostname) = &route_info.hostname {
@@ -619,7 +614,7 @@ impl Route for BasicRoute {
}; };
self.route_table.route_info.iter().for_each(|item| { self.route_table.route_info.iter().for_each(|item| {
routes.push(parse_route_info(item.key(), item.value())); routes.push(parse_route_info(*item.key(), item.value()));
}); });
routes routes
@@ -650,7 +645,7 @@ impl PeerPacketFilter for BasicRoute {
&packet.body &packet.body
{ {
self.handle_route_packet( self.handle_route_packet(
packet.from_peer.to_uuid(), packet.from_peer.into(),
extract_bytes_from_archived_vec(&data, &route_packet.body), extract_bytes_from_archived_vec(&data, &route_packet.body),
) )
.await; .await;
@@ -666,12 +661,12 @@ mod tests {
use std::sync::Arc; use std::sync::Arc;
use crate::{ use crate::{
common::PeerId,
connector::udp_hole_punch::tests::create_mock_peer_manager_with_mock_stun, connector::udp_hole_punch::tests::create_mock_peer_manager_with_mock_stun,
peers::{ peers::{
peer_manager::PeerManager, peer_manager::PeerManager,
peer_rip_route::Version, peer_rip_route::Version,
tests::{connect_peer_manager, wait_route_appear}, tests::{connect_peer_manager, wait_route_appear},
PeerId,
}, },
rpc::NatType, rpc::NatType,
}; };
@@ -683,10 +678,10 @@ mod tests {
let peer_mgr_c = create_mock_peer_manager_with_mock_stun(NatType::Unknown).await; let peer_mgr_c = create_mock_peer_manager_with_mock_stun(NatType::Unknown).await;
connect_peer_manager(peer_mgr_a.clone(), peer_mgr_b.clone()).await; connect_peer_manager(peer_mgr_a.clone(), peer_mgr_b.clone()).await;
connect_peer_manager(peer_mgr_b.clone(), peer_mgr_c.clone()).await; connect_peer_manager(peer_mgr_b.clone(), peer_mgr_c.clone()).await;
wait_route_appear(peer_mgr_a.clone(), peer_mgr_b.my_node_id()) wait_route_appear(peer_mgr_a.clone(), peer_mgr_b.my_peer_id())
.await .await
.unwrap(); .unwrap();
wait_route_appear(peer_mgr_a.clone(), peer_mgr_c.my_node_id()) wait_route_appear(peer_mgr_a.clone(), peer_mgr_c.my_peer_id())
.await .await
.unwrap(); .unwrap();
@@ -694,12 +689,12 @@ mod tests {
tokio::time::sleep(tokio::time::Duration::from_secs(4)).await; tokio::time::sleep(tokio::time::Duration::from_secs(4)).await;
let check_version = |version: Version, uuid: PeerId, mgrs: &Vec<Arc<PeerManager>>| { let check_version = |version: Version, peer_id: PeerId, mgrs: &Vec<Arc<PeerManager>>| {
for mgr in mgrs.iter() { for mgr in mgrs.iter() {
tracing::warn!( tracing::warn!(
"check version: {:?}, {:?}, {:?}, {:?}", "check version: {:?}, {:?}, {:?}, {:?}",
version, version,
uuid, peer_id,
mgr, mgr,
mgr.get_basic_route().sync_peer_from_remote mgr.get_basic_route().sync_peer_from_remote
); );
@@ -707,7 +702,7 @@ mod tests {
version, version,
mgr.get_basic_route() mgr.get_basic_route()
.sync_peer_from_remote .sync_peer_from_remote
.get(&uuid) .get(&peer_id)
.unwrap() .unwrap()
.packet .packet
.version, .version,
@@ -715,7 +710,7 @@ mod tests {
assert_eq!( assert_eq!(
mgr.get_basic_route() mgr.get_basic_route()
.sync_peer_from_remote .sync_peer_from_remote
.get(&uuid) .get(&peer_id)
.unwrap() .unwrap()
.packet .packet
.peer_version .peer_version
@@ -729,19 +724,19 @@ mod tests {
// check peer version in other peer mgr are correct. // check peer version in other peer mgr are correct.
check_version( check_version(
peer_mgr_b.get_basic_route().version.get(), peer_mgr_b.get_basic_route().version.get(),
peer_mgr_b.my_node_id(), peer_mgr_b.my_peer_id(),
&vec![peer_mgr_a.clone(), peer_mgr_c.clone()], &vec![peer_mgr_a.clone(), peer_mgr_c.clone()],
); );
check_version( check_version(
peer_mgr_a.get_basic_route().version.get(), peer_mgr_a.get_basic_route().version.get(),
peer_mgr_a.my_node_id(), peer_mgr_a.my_peer_id(),
&vec![peer_mgr_b.clone()], &vec![peer_mgr_b.clone()],
); );
check_version( check_version(
peer_mgr_c.get_basic_route().version.get(), peer_mgr_c.get_basic_route().version.get(),
peer_mgr_c.my_node_id(), peer_mgr_c.my_peer_id(),
&vec![peer_mgr_b.clone()], &vec![peer_mgr_b.clone()],
); );
}; };
+40 -37
View File
@@ -11,7 +11,10 @@ use tokio::{
use tokio_util::bytes::Bytes; use tokio_util::bytes::Bytes;
use tracing::Instrument; use tracing::Instrument;
use crate::{common::error::Error, peers::packet::Packet}; use crate::{
common::{error::Error, PeerId},
peers::packet::Packet,
};
use super::packet::{CtrlPacketBody, PacketBody}; use super::packet::{CtrlPacketBody, PacketBody};
@@ -20,22 +23,22 @@ type PeerRpcServiceId = u32;
#[async_trait::async_trait] #[async_trait::async_trait]
#[auto_impl::auto_impl(Arc)] #[auto_impl::auto_impl(Arc)]
pub trait PeerRpcManagerTransport: Send + Sync + 'static { pub trait PeerRpcManagerTransport: Send + Sync + 'static {
fn my_peer_id(&self) -> uuid::Uuid; fn my_peer_id(&self) -> PeerId;
async fn send(&self, msg: Bytes, dst_peer_id: &uuid::Uuid) -> Result<(), Error>; async fn send(&self, msg: Bytes, dst_peer_id: PeerId) -> Result<(), Error>;
async fn recv(&self) -> Result<Bytes, Error>; async fn recv(&self) -> Result<Bytes, Error>;
} }
type PacketSender = UnboundedSender<Packet>; type PacketSender = UnboundedSender<Packet>;
struct PeerRpcEndPoint { struct PeerRpcEndPoint {
peer_id: uuid::Uuid, peer_id: PeerId,
packet_sender: PacketSender, packet_sender: PacketSender,
tasks: JoinSet<()>, tasks: JoinSet<()>,
} }
type PeerRpcEndPointCreator = Box<dyn Fn(uuid::Uuid) -> PeerRpcEndPoint + Send + Sync + 'static>; type PeerRpcEndPointCreator = Box<dyn Fn(PeerId) -> PeerRpcEndPoint + Send + Sync + 'static>;
#[derive(Hash, Eq, PartialEq, Clone)] #[derive(Hash, Eq, PartialEq, Clone)]
struct PeerRpcClientCtxKey(uuid::Uuid, PeerRpcServiceId); struct PeerRpcClientCtxKey(PeerId, PeerRpcServiceId);
// handle rpc request from one peer // handle rpc request from one peer
pub struct PeerRpcManager { pub struct PeerRpcManager {
@@ -44,7 +47,7 @@ pub struct PeerRpcManager {
tspt: Arc<Box<dyn PeerRpcManagerTransport>>, tspt: Arc<Box<dyn PeerRpcManagerTransport>>,
service_registry: Arc<DashMap<PeerRpcServiceId, PeerRpcEndPointCreator>>, service_registry: Arc<DashMap<PeerRpcServiceId, PeerRpcEndPointCreator>>,
peer_rpc_endpoints: Arc<DashMap<(uuid::Uuid, PeerRpcServiceId), PeerRpcEndPoint>>, peer_rpc_endpoints: Arc<DashMap<(PeerId, PeerRpcServiceId), PeerRpcEndPoint>>,
client_resp_receivers: Arc<DashMap<PeerRpcClientCtxKey, PacketSender>>, client_resp_receivers: Arc<DashMap<PeerRpcClientCtxKey, PacketSender>>,
} }
@@ -59,8 +62,8 @@ impl std::fmt::Debug for PeerRpcManager {
#[derive(Debug)] #[derive(Debug)]
struct TaRpcPacketInfo { struct TaRpcPacketInfo {
from_peer: uuid::Uuid, from_peer: PeerId,
to_peer: uuid::Uuid, to_peer: PeerId,
service_id: PeerRpcServiceId, service_id: PeerRpcServiceId,
is_req: bool, is_req: bool,
content: Vec<u8>, content: Vec<u8>,
@@ -89,7 +92,7 @@ impl PeerRpcManager {
S::Fut: Send + 'static, S::Fut: Send + 'static,
{ {
let tspt = self.tspt.clone(); let tspt = self.tspt.clone();
let creator = Box::new(move |peer_id: uuid::Uuid| { let creator = Box::new(move |peer_id: PeerId| {
let mut tasks = JoinSet::new(); let mut tasks = JoinSet::new();
let (packet_sender, mut packet_receiver) = mpsc::unbounded_channel::<Packet>(); let (packet_sender, mut packet_receiver) = mpsc::unbounded_channel::<Packet>();
let (mut client_transport, server_transport) = tarpc::transport::channel::unbounded(); let (mut client_transport, server_transport) = tarpc::transport::channel::unbounded();
@@ -103,7 +106,7 @@ impl PeerRpcManager {
let tspt = tspt.clone(); let tspt = tspt.clone();
tasks.spawn(async move { tasks.spawn(async move {
let mut cur_req_uuid = None; let mut cur_req_peer_id = None;
loop { loop {
tokio::select! { tokio::select! {
Some(resp) = client_transport.next() => { Some(resp) = client_transport.next() => {
@@ -115,8 +118,8 @@ impl PeerRpcManager {
} }
let resp = resp.unwrap(); let resp = resp.unwrap();
if cur_req_uuid.is_none() { if cur_req_peer_id.is_none() {
tracing::error!("[PEER RPC MGR] cur_req_uuid is none, ignore this resp"); tracing::error!("[PEER RPC MGR] cur_req_peer_id is none, ignore this resp");
continue; continue;
} }
@@ -128,13 +131,13 @@ impl PeerRpcManager {
let msg = Packet::new_tarpc_packet( let msg = Packet::new_tarpc_packet(
tspt.my_peer_id(), tspt.my_peer_id(),
cur_req_uuid.take().unwrap(), cur_req_peer_id.take().unwrap(),
service_id, service_id,
false, false,
serialized_resp.unwrap(), serialized_resp.unwrap(),
); );
if let Err(e) = tspt.send(msg.into(), &peer_id).await { if let Err(e) = tspt.send(msg.into(), peer_id).await {
tracing::error!(error = ?e, peer_id = ?peer_id, service_id = ?service_id, "send resp to peer failed"); tracing::error!(error = ?e, peer_id = ?peer_id, service_id = ?service_id, "send resp to peer failed");
} }
} }
@@ -152,7 +155,7 @@ impl PeerRpcManager {
} }
assert_eq!(info.service_id, service_id); assert_eq!(info.service_id, service_id);
cur_req_uuid = Some(packet.from_peer.clone().into()); cur_req_peer_id = Some(packet.from_peer.clone().into());
tracing::trace!("recv packet from peer, packet: {:?}", packet); tracing::trace!("recv packet from peer, packet: {:?}", packet);
@@ -205,8 +208,8 @@ impl PeerRpcManager {
fn parse_rpc_packet(packet: &Packet) -> Result<TaRpcPacketInfo, Error> { fn parse_rpc_packet(packet: &Packet) -> Result<TaRpcPacketInfo, Error> {
match &packet.body { match &packet.body {
PacketBody::Ctrl(CtrlPacketBody::TaRpc(id, is_req, body)) => Ok(TaRpcPacketInfo { PacketBody::Ctrl(CtrlPacketBody::TaRpc(id, is_req, body)) => Ok(TaRpcPacketInfo {
from_peer: packet.from_peer.clone().into(), from_peer: packet.from_peer.into(),
to_peer: packet.to_peer.clone().unwrap().into(), to_peer: packet.to_peer.into(),
service_id: *id, service_id: *id,
is_req: *is_req, is_req: *is_req,
content: body.clone(), content: body.clone(),
@@ -267,7 +270,7 @@ impl PeerRpcManager {
pub async fn do_client_rpc_scoped<CM, Req, RpcRet, Fut>( pub async fn do_client_rpc_scoped<CM, Req, RpcRet, Fut>(
&self, &self,
service_id: PeerRpcServiceId, service_id: PeerRpcServiceId,
dst_peer_id: uuid::Uuid, dst_peer_id: PeerId,
f: impl FnOnce(UnboundedChannel<CM, Req>) -> Fut, f: impl FnOnce(UnboundedChannel<CM, Req>) -> Fut,
) -> RpcRet ) -> RpcRet
where where
@@ -304,7 +307,7 @@ impl PeerRpcManager {
a.unwrap(), a.unwrap(),
); );
if let Err(e) = tspt.send(a.into(), &dst_peer_id).await { if let Err(e) = tspt.send(a.into(), dst_peer_id).await {
tracing::error!(error = ?e, dst_peer_id = ?dst_peer_id, "send to peer failed"); tracing::error!(error = ?e, dst_peer_id = ?dst_peer_id, "send to peer failed");
} }
} }
@@ -343,7 +346,7 @@ impl PeerRpcManager {
f(client_transport).await f(client_transport).await
} }
pub fn my_peer_id(&self) -> uuid::Uuid { pub fn my_peer_id(&self) -> PeerId {
self.tspt.my_peer_id() self.tspt.my_peer_id()
} }
} }
@@ -354,7 +357,7 @@ mod tests {
use tokio_util::bytes::Bytes; use tokio_util::bytes::Bytes;
use crate::{ use crate::{
common::error::Error, common::{error::Error, new_peer_id, PeerId},
peers::{ peers::{
peer_rpc::PeerRpcManager, peer_rpc::PeerRpcManager,
tests::{connect_peer_manager, create_mock_peer_manager, wait_route_appear}, tests::{connect_peer_manager, create_mock_peer_manager, wait_route_appear},
@@ -385,15 +388,15 @@ mod tests {
async fn peer_rpc_basic_test() { async fn peer_rpc_basic_test() {
struct MockTransport { struct MockTransport {
tunnel: Box<dyn tunnels::Tunnel>, tunnel: Box<dyn tunnels::Tunnel>,
my_peer_id: uuid::Uuid, my_peer_id: PeerId,
} }
#[async_trait::async_trait] #[async_trait::async_trait]
impl PeerRpcManagerTransport for MockTransport { impl PeerRpcManagerTransport for MockTransport {
fn my_peer_id(&self) -> uuid::Uuid { fn my_peer_id(&self) -> PeerId {
self.my_peer_id self.my_peer_id
} }
async fn send(&self, msg: Bytes, _dst_peer_id: &uuid::Uuid) -> Result<(), Error> { async fn send(&self, msg: Bytes, _dst_peer_id: PeerId) -> Result<(), Error> {
println!("rpc mgr send: {:?}", msg); println!("rpc mgr send: {:?}", msg);
self.tunnel.pin_sink().send(msg).await.unwrap(); self.tunnel.pin_sink().send(msg).await.unwrap();
Ok(()) Ok(())
@@ -409,7 +412,7 @@ mod tests {
let server_rpc_mgr = PeerRpcManager::new(MockTransport { let server_rpc_mgr = PeerRpcManager::new(MockTransport {
tunnel: st, tunnel: st,
my_peer_id: uuid::Uuid::new_v4(), my_peer_id: new_peer_id(),
}); });
server_rpc_mgr.run(); server_rpc_mgr.run();
let s = MockService { let s = MockService {
@@ -419,7 +422,7 @@ mod tests {
let client_rpc_mgr = PeerRpcManager::new(MockTransport { let client_rpc_mgr = PeerRpcManager::new(MockTransport {
tunnel: ct, tunnel: ct,
my_peer_id: uuid::Uuid::new_v4(), my_peer_id: new_peer_id(),
}); });
client_rpc_mgr.run(); client_rpc_mgr.run();
@@ -442,23 +445,23 @@ mod tests {
let peer_mgr_c = create_mock_peer_manager().await; let peer_mgr_c = create_mock_peer_manager().await;
connect_peer_manager(peer_mgr_a.clone(), peer_mgr_b.clone()).await; connect_peer_manager(peer_mgr_a.clone(), peer_mgr_b.clone()).await;
connect_peer_manager(peer_mgr_b.clone(), peer_mgr_c.clone()).await; connect_peer_manager(peer_mgr_b.clone(), peer_mgr_c.clone()).await;
wait_route_appear(peer_mgr_a.clone(), peer_mgr_b.my_node_id()) wait_route_appear(peer_mgr_a.clone(), peer_mgr_b.my_peer_id())
.await .await
.unwrap(); .unwrap();
wait_route_appear(peer_mgr_a.clone(), peer_mgr_c.my_node_id()) wait_route_appear(peer_mgr_a.clone(), peer_mgr_c.my_peer_id())
.await .await
.unwrap(); .unwrap();
assert_eq!(peer_mgr_a.get_peer_map().list_peers().await.len(), 1); assert_eq!(peer_mgr_a.get_peer_map().list_peers().await.len(), 1);
assert_eq!( assert_eq!(
peer_mgr_a.get_peer_map().list_peers().await[0], peer_mgr_a.get_peer_map().list_peers().await[0],
peer_mgr_b.my_node_id() peer_mgr_b.my_peer_id()
); );
assert_eq!(peer_mgr_c.get_peer_map().list_peers().await.len(), 1); assert_eq!(peer_mgr_c.get_peer_map().list_peers().await.len(), 1);
assert_eq!( assert_eq!(
peer_mgr_c.get_peer_map().list_peers().await[0], peer_mgr_c.get_peer_map().list_peers().await[0],
peer_mgr_b.my_node_id() peer_mgr_b.my_peer_id()
); );
let s = MockService { let s = MockService {
@@ -468,7 +471,7 @@ mod tests {
let ip_list = peer_mgr_a let ip_list = peer_mgr_a
.get_peer_rpc_mgr() .get_peer_rpc_mgr()
.do_client_rpc_scoped(1, peer_mgr_b.my_node_id(), |c| async { .do_client_rpc_scoped(1, peer_mgr_b.my_peer_id(), |c| async {
let c = TestRpcServiceClient::new(tarpc::client::Config::default(), c).spawn(); let c = TestRpcServiceClient::new(tarpc::client::Config::default(), c).spawn();
let ret = c.hello(tarpc::context::current(), "abc".to_owned()).await; let ret = c.hello(tarpc::context::current(), "abc".to_owned()).await;
ret ret
@@ -479,7 +482,7 @@ mod tests {
let ip_list = peer_mgr_c let ip_list = peer_mgr_c
.get_peer_rpc_mgr() .get_peer_rpc_mgr()
.do_client_rpc_scoped(1, peer_mgr_b.my_node_id(), |c| async { .do_client_rpc_scoped(1, peer_mgr_b.my_peer_id(), |c| async {
let c = TestRpcServiceClient::new(tarpc::client::Config::default(), c).spawn(); let c = TestRpcServiceClient::new(tarpc::client::Config::default(), c).spawn();
let ret = c.hello(tarpc::context::current(), "bcd".to_owned()).await; let ret = c.hello(tarpc::context::current(), "bcd".to_owned()).await;
ret ret
@@ -494,14 +497,14 @@ mod tests {
let peer_mgr_a = create_mock_peer_manager().await; let peer_mgr_a = create_mock_peer_manager().await;
let peer_mgr_b = create_mock_peer_manager().await; let peer_mgr_b = create_mock_peer_manager().await;
connect_peer_manager(peer_mgr_a.clone(), peer_mgr_b.clone()).await; connect_peer_manager(peer_mgr_a.clone(), peer_mgr_b.clone()).await;
wait_route_appear(peer_mgr_a.clone(), peer_mgr_b.my_node_id()) wait_route_appear(peer_mgr_a.clone(), peer_mgr_b.my_peer_id())
.await .await
.unwrap(); .unwrap();
assert_eq!(peer_mgr_a.get_peer_map().list_peers().await.len(), 1); assert_eq!(peer_mgr_a.get_peer_map().list_peers().await.len(), 1);
assert_eq!( assert_eq!(
peer_mgr_a.get_peer_map().list_peers().await[0], peer_mgr_a.get_peer_map().list_peers().await[0],
peer_mgr_b.my_node_id() peer_mgr_b.my_peer_id()
); );
let s = MockService { let s = MockService {
@@ -515,7 +518,7 @@ mod tests {
let ip_list = peer_mgr_a let ip_list = peer_mgr_a
.get_peer_rpc_mgr() .get_peer_rpc_mgr()
.do_client_rpc_scoped(1, peer_mgr_b.my_node_id(), |c| async { .do_client_rpc_scoped(1, peer_mgr_b.my_peer_id(), |c| async {
let c = TestRpcServiceClient::new(tarpc::client::Config::default(), c).spawn(); let c = TestRpcServiceClient::new(tarpc::client::Config::default(), c).spawn();
let ret = c.hello(tarpc::context::current(), "abc".to_owned()).await; let ret = c.hello(tarpc::context::current(), "abc".to_owned()).await;
ret ret
@@ -526,7 +529,7 @@ mod tests {
let ip_list = peer_mgr_a let ip_list = peer_mgr_a
.get_peer_rpc_mgr() .get_peer_rpc_mgr()
.do_client_rpc_scoped(2, peer_mgr_b.my_node_id(), |c| async { .do_client_rpc_scoped(2, peer_mgr_b.my_peer_id(), |c| async {
let c = TestRpcServiceClient::new(tarpc::client::Config::default(), c).spawn(); let c = TestRpcServiceClient::new(tarpc::client::Config::default(), c).spawn();
let ret = c.hello(tarpc::context::current(), "abc".to_owned()).await; let ret = c.hello(tarpc::context::current(), "abc".to_owned()).await;
ret ret
+4 -5
View File
@@ -3,9 +3,7 @@ use std::{net::Ipv4Addr, sync::Arc};
use async_trait::async_trait; use async_trait::async_trait;
use tokio_util::bytes::Bytes; use tokio_util::bytes::Bytes;
use crate::common::error::Error; use crate::common::{error::Error, PeerId};
use super::PeerId;
#[async_trait] #[async_trait]
pub trait RouteInterface { pub trait RouteInterface {
@@ -14,8 +12,9 @@ pub trait RouteInterface {
&self, &self,
msg: Bytes, msg: Bytes,
route_id: u8, route_id: u8,
dst_peer_id: &PeerId, dst_peer_id: PeerId,
) -> Result<(), Error>; ) -> Result<(), Error>;
fn my_peer_id(&self) -> PeerId;
} }
pub type RouteInterfaceBox = Box<dyn RouteInterface + Send + Sync>; pub type RouteInterfaceBox = Box<dyn RouteInterface + Send + Sync>;
@@ -26,7 +25,7 @@ pub trait Route {
async fn open(&self, interface: RouteInterfaceBox) -> Result<u8, ()>; async fn open(&self, interface: RouteInterfaceBox) -> Result<u8, ()>;
async fn close(&self); async fn close(&self);
async fn get_next_hop(&self, peer_id: &PeerId) -> Option<PeerId>; async fn get_next_hop(&self, peer_id: PeerId) -> Option<PeerId>;
async fn list_routes(&self) -> Vec<crate::rpc::Route>; async fn list_routes(&self) -> Vec<crate::rpc::Route>;
async fn get_peer_id_by_ipv4(&self, _ipv4: &Ipv4Addr) -> Option<PeerId> { async fn get_peer_id_by_ipv4(&self, _ipv4: &Ipv4Addr) -> Option<PeerId> {
+1 -1
View File
@@ -23,7 +23,7 @@ impl PeerManagerRpcService {
let mut peer_infos = Vec::new(); let mut peer_infos = Vec::new();
for peer in peers { for peer in peers {
let mut peer_info = PeerInfo::default(); let mut peer_info = PeerInfo::default();
peer_info.peer_id = peer.to_string(); peer_info.peer_id = peer;
if let Some(conns) = self if let Some(conns) = self
.peer_manager .peer_manager
+7 -10
View File
@@ -1,7 +1,7 @@
use std::sync::Arc; use std::sync::Arc;
use crate::{ use crate::{
common::{error::Error, global_ctx::tests::get_mock_global_ctx}, common::{error::Error, global_ctx::tests::get_mock_global_ctx, PeerId},
tunnels::ring_tunnel::create_ring_tunnel_pair, tunnels::ring_tunnel::create_ring_tunnel_pair,
}; };
@@ -28,16 +28,16 @@ pub async fn connect_peer_manager(client: Arc<PeerManager>, server: Arc<PeerMana
pub async fn wait_route_appear_with_cost( pub async fn wait_route_appear_with_cost(
peer_mgr: Arc<PeerManager>, peer_mgr: Arc<PeerManager>,
node_id: uuid::Uuid, node_id: PeerId,
cost: Option<i32>, cost: Option<i32>,
) -> Result<(), Error> { ) -> Result<(), Error> {
let now = std::time::Instant::now(); let now = std::time::Instant::now();
while now.elapsed().as_secs() < 5 { while now.elapsed().as_secs() < 5 {
let route = peer_mgr.list_routes().await; let route = peer_mgr.list_routes().await;
if route.iter().any(|r| { if route
r.peer_id.clone().parse::<uuid::Uuid>().unwrap() == node_id .iter()
&& (cost.is_none() || r.cost == cost.unwrap()) .any(|r| r.peer_id == node_id && (cost.is_none() || r.cost == cost.unwrap()))
}) { {
return Ok(()); return Ok(());
} }
tokio::time::sleep(std::time::Duration::from_millis(50)).await; tokio::time::sleep(std::time::Duration::from_millis(50)).await;
@@ -45,9 +45,6 @@ pub async fn wait_route_appear_with_cost(
return Err(Error::NotFound); return Err(Error::NotFound);
} }
pub async fn wait_route_appear( pub async fn wait_route_appear(peer_mgr: Arc<PeerManager>, node_id: PeerId) -> Result<(), Error> {
peer_mgr: Arc<PeerManager>,
node_id: uuid::Uuid,
) -> Result<(), Error> {
wait_route_appear_with_cost(peer_mgr, node_id, None).await wait_route_appear_with_cost(peer_mgr, node_id, None).await
} }
+6 -4
View File
@@ -1,3 +1,5 @@
use crate::common::PeerId;
mod three_node; mod three_node;
pub fn get_guest_veth_name(net_ns: &str) -> &str { pub fn get_guest_veth_name(net_ns: &str) -> &str {
@@ -124,12 +126,12 @@ pub fn enable_log() {
.init(); .init();
} }
fn check_route(ipv4: &str, dst_peer_id: uuid::Uuid, routes: Vec<crate::rpc::Route>) { fn check_route(ipv4: &str, dst_peer_id: PeerId, routes: Vec<crate::rpc::Route>) {
let mut found = false; let mut found = false;
for r in routes.iter() { for r in routes.iter() {
if r.ipv4_addr == ipv4.to_string() { if r.ipv4_addr == ipv4.to_string() {
found = true; found = true;
assert_eq!(r.peer_id, dst_peer_id.to_string(), "{:?}", routes); assert_eq!(r.peer_id, dst_peer_id, "{:?}", routes);
} }
} }
assert!(found); assert!(found);
@@ -138,7 +140,7 @@ fn check_route(ipv4: &str, dst_peer_id: uuid::Uuid, routes: Vec<crate::rpc::Rout
async fn wait_proxy_route_appear( async fn wait_proxy_route_appear(
mgr: &std::sync::Arc<crate::peers::peer_manager::PeerManager>, mgr: &std::sync::Arc<crate::peers::peer_manager::PeerManager>,
ipv4: &str, ipv4: &str,
dst_peer_id: uuid::Uuid, dst_peer_id: PeerId,
proxy_cidr: &str, proxy_cidr: &str,
) { ) {
let now = std::time::Instant::now(); let now = std::time::Instant::now();
@@ -146,7 +148,7 @@ async fn wait_proxy_route_appear(
for r in mgr.list_routes().await.iter() { for r in mgr.list_routes().await.iter() {
let r = r; let r = r;
if r.proxy_cidrs.contains(&proxy_cidr.to_owned()) { if r.proxy_cidrs.contains(&proxy_cidr.to_owned()) {
assert_eq!(r.peer_id, dst_peer_id.to_string()); assert_eq!(r.peer_id, dst_peer_id);
assert_eq!(r.ipv4_addr, ipv4); assert_eq!(r.ipv4_addr, ipv4);
return; return;
} }
+7 -7
View File
@@ -105,13 +105,13 @@ pub async fn basic_three_node_test_tcp() {
check_route( check_route(
"10.144.144.2", "10.144.144.2",
insts[1].id(), insts[1].peer_id(),
insts[0].get_peer_manager().list_routes().await, insts[0].get_peer_manager().list_routes().await,
); );
check_route( check_route(
"10.144.144.3", "10.144.144.3",
insts[2].id(), insts[2].peer_id(),
insts[0].get_peer_manager().list_routes().await, insts[0].get_peer_manager().list_routes().await,
); );
} }
@@ -123,13 +123,13 @@ pub async fn basic_three_node_test_udp() {
check_route( check_route(
"10.144.144.2", "10.144.144.2",
insts[1].id(), insts[1].peer_id(),
insts[0].get_peer_manager().list_routes().await, insts[0].get_peer_manager().list_routes().await,
); );
check_route( check_route(
"10.144.144.3", "10.144.144.3",
insts[2].id(), insts[2].peer_id(),
insts[0].get_peer_manager().list_routes().await, insts[0].get_peer_manager().list_routes().await,
); );
} }
@@ -148,7 +148,7 @@ pub async fn tcp_proxy_three_node_test() {
wait_proxy_route_appear( wait_proxy_route_appear(
&insts[0].get_peer_manager(), &insts[0].get_peer_manager(),
"10.144.144.3", "10.144.144.3",
insts[2].id(), insts[2].peer_id(),
"10.1.2.0/24", "10.1.2.0/24",
) )
.await; .await;
@@ -182,7 +182,7 @@ pub async fn icmp_proxy_three_node_test() {
wait_proxy_route_appear( wait_proxy_route_appear(
&insts[0].get_peer_manager(), &insts[0].get_peer_manager(),
"10.144.144.3", "10.144.144.3",
insts[2].id(), insts[2].peer_id(),
"10.1.2.0/24", "10.1.2.0/24",
) )
.await; .await;
@@ -244,7 +244,7 @@ pub async fn udp_proxy_three_node_test() {
wait_proxy_route_appear( wait_proxy_route_appear(
&insts[0].get_peer_manager(), &insts[0].get_peer_manager(),
"10.144.144.3", "10.144.144.3",
insts[2].id(), insts[2].peer_id(),
"10.1.2.0/24", "10.1.2.0/24",
) )
.await; .await;