mirror of
https://github.com/EasyTier/EasyTier.git
synced 2026-05-07 10:14:35 +00:00
Introduce foreigner network (#25)
* support network identity for instance * introduce foreign network foreign network allow a node serving as one public node. other nodes can connect to this node to discover peers and exchange route info.
This commit is contained in:
@@ -23,7 +23,7 @@ use tokio_util::{
|
||||
use tracing::Instrument;
|
||||
|
||||
use crate::{
|
||||
common::global_ctx::ArcGlobalCtx,
|
||||
common::global_ctx::{ArcGlobalCtx, NetworkIdentity},
|
||||
define_tunnel_filter_chain,
|
||||
rpc::{PeerConnInfo, PeerConnStats},
|
||||
tunnels::{
|
||||
@@ -82,6 +82,7 @@ pub struct PeerInfo {
|
||||
version: u32,
|
||||
pub features: Vec<String>,
|
||||
pub interfaces: Vec<NetworkInterface>,
|
||||
pub network_identity: NetworkIdentity,
|
||||
}
|
||||
|
||||
impl<'a> From<&ArchivedHandShake> for PeerInfo {
|
||||
@@ -92,6 +93,7 @@ impl<'a> From<&ArchivedHandShake> for PeerInfo {
|
||||
version: hs.version.into(),
|
||||
features: hs.features.iter().map(|x| x.to_string()).collect(),
|
||||
interfaces: Vec::new(),
|
||||
network_identity: (&hs.network_identity).into(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -380,7 +382,7 @@ impl PeerConn {
|
||||
let hs_req = self
|
||||
.global_ctx
|
||||
.net_ns
|
||||
.run(|| packet::Packet::new_handshake(self.my_node_id));
|
||||
.run(|| packet::Packet::new_handshake(self.my_node_id, &self.global_ctx.network));
|
||||
sink.send(hs_req.into()).await?;
|
||||
|
||||
Ok(())
|
||||
@@ -393,7 +395,7 @@ impl PeerConn {
|
||||
let hs_req = self
|
||||
.global_ctx
|
||||
.net_ns
|
||||
.run(|| packet::Packet::new_handshake(self.my_node_id));
|
||||
.run(|| packet::Packet::new_handshake(self.my_node_id, &self.global_ctx.network));
|
||||
sink.send(hs_req.into()).await?;
|
||||
|
||||
wait_response!(stream, hs_rsp, packet::ArchivedPacketBody::Ctrl(ArchivedCtrlPacketBody::HandShake(x)) => x);
|
||||
@@ -481,20 +483,20 @@ impl PeerConn {
|
||||
self.tasks.spawn(
|
||||
async move {
|
||||
tracing::info!("start recving peer conn packet");
|
||||
let mut task_ret = Ok(());
|
||||
while let Some(ret) = stream.next().await {
|
||||
if ret.is_err() {
|
||||
tracing::error!(error = ?ret, "peer conn recv error");
|
||||
if let Err(close_ret) = sink.close().await {
|
||||
tracing::error!(error = ?close_ret, "peer conn sink close error, ignore it");
|
||||
}
|
||||
if let Err(e) = close_event_sender.send(conn_id).await {
|
||||
tracing::error!(error = ?e, "peer conn close event send error");
|
||||
}
|
||||
return Err(ret.err().unwrap());
|
||||
task_ret = Err(ret.err().unwrap());
|
||||
break;
|
||||
}
|
||||
|
||||
match Self::get_packet_type(ret.unwrap().into()) {
|
||||
PeerConnPacketType::Data(item) => sender.send(item).await.unwrap(),
|
||||
PeerConnPacketType::Data(item) => {
|
||||
if sender.send(item).await.is_err() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
PeerConnPacketType::CtrlReq(item) => {
|
||||
let ret = Self::handle_ctrl_req_packet(item, &conn_info).unwrap();
|
||||
if let Err(e) = sink.send(ret).await {
|
||||
@@ -508,8 +510,17 @@ impl PeerConn {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
tracing::info!("end recving peer conn packet");
|
||||
Ok(())
|
||||
|
||||
if let Err(close_ret) = sink.close().await {
|
||||
tracing::error!(error = ?close_ret, "peer conn sink close error, ignore it");
|
||||
}
|
||||
if let Err(e) = close_event_sender.send(conn_id).await {
|
||||
tracing::error!(error = ?e, "peer conn close event send error");
|
||||
}
|
||||
|
||||
task_ret
|
||||
}
|
||||
.instrument(
|
||||
tracing::info_span!("peer conn recv loop", conn_info = ?conn_info_for_instrument),
|
||||
@@ -525,6 +536,10 @@ impl PeerConn {
|
||||
self.info.as_ref().unwrap().my_peer_id
|
||||
}
|
||||
|
||||
pub fn get_network_identity(&self) -> NetworkIdentity {
|
||||
self.info.as_ref().unwrap().network_identity.clone()
|
||||
}
|
||||
|
||||
pub fn set_close_event_sender(&mut self, sender: mpsc::Sender<uuid::Uuid>) {
|
||||
self.close_event_sender = Some(sender);
|
||||
}
|
||||
@@ -597,6 +612,7 @@ mod tests {
|
||||
"c",
|
||||
ConfigFs::new_with_dir("c", "/tmp"),
|
||||
NetNS::new(None),
|
||||
None,
|
||||
)),
|
||||
Box::new(c),
|
||||
);
|
||||
@@ -607,6 +623,7 @@ mod tests {
|
||||
"c",
|
||||
ConfigFs::new_with_dir("c", "/tmp"),
|
||||
NetNS::new(None),
|
||||
None,
|
||||
)),
|
||||
Box::new(s),
|
||||
);
|
||||
@@ -627,6 +644,8 @@ mod tests {
|
||||
|
||||
assert_eq!(c_peer.get_peer_id(), s_uuid);
|
||||
assert_eq!(s_peer.get_peer_id(), c_uuid);
|
||||
assert_eq!(c_peer.get_network_identity(), s_peer.get_network_identity());
|
||||
assert_eq!(c_peer.get_network_identity(), NetworkIdentity::default());
|
||||
}
|
||||
|
||||
async fn peer_conn_pingpong_test_common(drop_start: u32, drop_end: u32, conn_closed: bool) {
|
||||
|
||||
Reference in New Issue
Block a user