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:
Sijie.Sun
2024-03-06 20:59:17 +08:00
committed by GitHub
parent 9261d0d32d
commit d8d1c64df7
13 changed files with 868 additions and 57 deletions
+31 -12
View File
@@ -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) {