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