add cli command for global foreign network info
Some checks are pending
EasyTier Core / pre_job (push) Waiting to run
EasyTier Core / build (freebsd-13.2-x86_64, 13.2, ubuntu-latest, x86_64-unknown-freebsd) (push) Blocked by required conditions
EasyTier Core / build (linux-aarch64, ubuntu-latest, aarch64-unknown-linux-musl) (push) Blocked by required conditions
EasyTier Core / build (linux-arm, ubuntu-latest, arm-unknown-linux-musleabi) (push) Blocked by required conditions
EasyTier Core / build (linux-armhf, ubuntu-latest, arm-unknown-linux-musleabihf) (push) Blocked by required conditions
EasyTier Core / build (linux-armv7, ubuntu-latest, armv7-unknown-linux-musleabi) (push) Blocked by required conditions
EasyTier Core / build (linux-armv7hf, ubuntu-latest, armv7-unknown-linux-musleabihf) (push) Blocked by required conditions
EasyTier Core / build (linux-mips, ubuntu-latest, mips-unknown-linux-musl) (push) Blocked by required conditions
EasyTier Core / build (linux-mipsel, ubuntu-latest, mipsel-unknown-linux-musl) (push) Blocked by required conditions
EasyTier Core / build (linux-x86_64, ubuntu-latest, x86_64-unknown-linux-musl) (push) Blocked by required conditions
EasyTier Core / build (macos-aarch64, macos-latest, aarch64-apple-darwin) (push) Blocked by required conditions
EasyTier Core / build (macos-x86_64, macos-latest, x86_64-apple-darwin) (push) Blocked by required conditions
EasyTier Core / build (windows-x86_64, windows-latest, x86_64-pc-windows-msvc) (push) Blocked by required conditions
EasyTier Core / core-result (push) Blocked by required conditions
EasyTier GUI / pre_job (push) Waiting to run
EasyTier GUI / build-gui (linux-aarch64, aarch64-unknown-linux-gnu, ubuntu-latest, aarch64-unknown-linux-musl) (push) Blocked by required conditions
EasyTier GUI / build-gui (linux-x86_64, x86_64-unknown-linux-gnu, ubuntu-latest, x86_64-unknown-linux-musl) (push) Blocked by required conditions
EasyTier GUI / build-gui (macos-aarch64, aarch64-apple-darwin, macos-latest, aarch64-apple-darwin) (push) Blocked by required conditions
EasyTier GUI / build-gui (macos-x86_64, x86_64-apple-darwin, macos-latest, x86_64-apple-darwin) (push) Blocked by required conditions
EasyTier GUI / build-gui (windows-x86_64, x86_64-pc-windows-msvc, windows-latest, x86_64-pc-windows-msvc) (push) Blocked by required conditions
EasyTier GUI / gui-result (push) Blocked by required conditions
EasyTier Mobile / pre_job (push) Waiting to run
EasyTier Mobile / build-mobile (android, ubuntu-latest, android) (push) Blocked by required conditions
EasyTier Mobile / mobile-result (push) Blocked by required conditions
EasyTier Test / pre_job (push) Waiting to run
EasyTier Test / test (push) Blocked by required conditions

This commit is contained in:
sijie.sun 2024-09-22 22:18:13 +08:00 committed by Sijie.Sun
parent aca9a0e35b
commit 783ba50c9e
6 changed files with 142 additions and 7 deletions

View File

@ -72,6 +72,7 @@ enum PeerSubCommand {
Remove, Remove,
List(PeerListArgs), List(PeerListArgs),
ListForeign, ListForeign,
ListGlobalForeign,
} }
#[derive(Args, Debug)] #[derive(Args, Debug)]
@ -342,6 +343,30 @@ impl CommandHandler {
Ok(()) Ok(())
} }
async fn handle_global_foreign_network_list(&self) -> Result<(), Error> {
let client = self.get_peer_manager_client().await?;
let request = ListGlobalForeignNetworkRequest::default();
let response = client
.list_global_foreign_network(BaseController {}, request)
.await?;
if self.verbose {
println!("{:#?}", response);
return Ok(());
}
for (k, v) in response.foreign_networks.iter() {
println!("Peer ID: {}", k);
for n in v.foreign_networks.iter() {
println!(
" Network Name: {}, Last Updated: {}, Version: {}, PeerIds: {:?}",
n.network_name, n.last_updated, n.version, n.peer_ids
);
}
}
Ok(())
}
async fn handle_route_list(&self) -> Result<(), Error> { async fn handle_route_list(&self) -> Result<(), Error> {
#[derive(tabled::Tabled)] #[derive(tabled::Tabled)]
struct RouteTableItem { struct RouteTableItem {
@ -464,6 +489,9 @@ async fn main() -> Result<(), Error> {
Some(PeerSubCommand::ListForeign) => { Some(PeerSubCommand::ListForeign) => {
handler.handle_foreign_network_list().await?; handler.handle_foreign_network_list().await?;
} }
Some(PeerSubCommand::ListGlobalForeign) => {
handler.handle_global_foreign_network_list().await?;
}
None => { None => {
handler.handle_peer_list(&peer_args).await?; handler.handle_peer_list(&peer_args).await?;
} }

View File

@ -2,7 +2,7 @@ use std::{
fmt::Debug, fmt::Debug,
net::Ipv4Addr, net::Ipv4Addr,
sync::{Arc, Weak}, sync::{Arc, Weak},
time::{Instant, SystemTime}, time::SystemTime,
}; };
use anyhow::Context; use anyhow::Context;
@ -32,7 +32,10 @@ use crate::{
PeerPacketFilter, PeerPacketFilter,
}, },
proto::{ proto::{
cli, cli::{
self, list_global_foreign_network_response::OneForeignNetwork,
ListGlobalForeignNetworkResponse,
},
peer_rpc::{ForeignNetworkRouteInfoEntry, ForeignNetworkRouteInfoKey}, peer_rpc::{ForeignNetworkRouteInfoEntry, ForeignNetworkRouteInfoKey},
}, },
tunnel::{ tunnel::{
@ -499,6 +502,10 @@ impl PeerManager {
let networks = foreign_mgr.list_foreign_networks().await; let networks = foreign_mgr.list_foreign_networks().await;
for (network_name, info) in networks.foreign_networks.iter() { for (network_name, info) in networks.foreign_networks.iter() {
if info.peers.is_empty() {
continue;
}
let last_update = foreign_mgr let last_update = foreign_mgr
.get_foreign_network_last_update(network_name) .get_foreign_network_last_update(network_name)
.unwrap_or(SystemTime::now()); .unwrap_or(SystemTime::now());
@ -548,6 +555,28 @@ impl PeerManager {
self.get_route().dump().await self.get_route().dump().await
} }
pub async fn list_global_foreign_network(&self) -> ListGlobalForeignNetworkResponse {
let mut resp = ListGlobalForeignNetworkResponse::default();
let ret = self.get_route().list_foreign_network_info().await;
for info in ret.infos.iter() {
let entry = resp
.foreign_networks
.entry(info.key.as_ref().unwrap().peer_id)
.or_insert_with(|| Default::default());
let mut f = OneForeignNetwork::default();
f.network_name = info.key.as_ref().unwrap().network_name.clone();
f.peer_ids
.extend(info.value.as_ref().unwrap().foreign_peer_ids.iter());
f.last_updated = format!("{}", info.value.as_ref().unwrap().last_update.unwrap());
f.version = info.value.as_ref().unwrap().version;
entry.foreign_networks.push(f);
}
resp
}
async fn run_nic_packet_process_pipeline(&self, data: &mut ZCPacket) { async fn run_nic_packet_process_pipeline(&self, data: &mut ZCPacket) {
for pipeline in self.nic_packet_process_pipeline.read().await.iter().rev() { for pipeline in self.nic_packet_process_pipeline.read().await.iter().rev() {
pipeline.try_process_packet_from_nic(data).await; pipeline.try_process_packet_from_nic(data).await;

View File

@ -424,6 +424,7 @@ impl SyncedRouteInfo {
my_peer_id: PeerId, my_peer_id: PeerId,
foreign_networks: ForeignNetworkRouteInfoMap, foreign_networks: ForeignNetworkRouteInfoMap,
) -> bool { ) -> bool {
let now = SystemTime::now();
let mut updated = false; let mut updated = false;
for mut item in self for mut item in self
.foreign_network .foreign_network
@ -432,8 +433,14 @@ impl SyncedRouteInfo {
{ {
let (key, entry) = item.pair_mut(); let (key, entry) = item.pair_mut();
if let Some(mut new_entry) = foreign_networks.get_mut(key) { if let Some(mut new_entry) = foreign_networks.get_mut(key) {
assert!(!new_entry.foreign_peer_ids.is_empty());
if let Some(is_newer) = is_foreign_network_info_newer(&new_entry, entry) { if let Some(is_newer) = is_foreign_network_info_newer(&new_entry, entry) {
if is_newer { let need_renew = is_newer
|| now
.duration_since(entry.last_update.unwrap().try_into().unwrap())
.unwrap()
> UPDATE_PEER_INFO_PERIOD;
if need_renew {
new_entry.version = entry.version + 1; new_entry.version = entry.version + 1;
*entry = new_entry.clone(); *entry = new_entry.clone();
updated = true; updated = true;
@ -450,6 +457,7 @@ impl SyncedRouteInfo {
} }
for item in foreign_networks.iter() { for item in foreign_networks.iter() {
assert!(!item.value().foreign_peer_ids.is_empty());
self.foreign_network self.foreign_network
.entry(item.key().clone()) .entry(item.key().clone())
.and_modify(|v| panic!("key should not exist, {:?}", v)) .and_modify(|v| panic!("key should not exist, {:?}", v))
@ -1222,6 +1230,7 @@ impl PeerRouteServiceImpl {
if peer_infos.is_none() if peer_infos.is_none()
&& conn_bitmap.is_none() && conn_bitmap.is_none()
&& foreign_network.is_none()
&& !session.need_sync_initiator_info.load(Ordering::Relaxed) && !session.need_sync_initiator_info.load(Ordering::Relaxed)
{ {
return true; return true;
@ -1250,7 +1259,7 @@ impl PeerRouteServiceImpl {
is_initiator: session.we_are_initiator.load(Ordering::Relaxed), is_initiator: session.we_are_initiator.load(Ordering::Relaxed),
peer_infos: peer_infos.clone().map(|x| RoutePeerInfos { items: x }), peer_infos: peer_infos.clone().map(|x| RoutePeerInfos { items: x }),
conn_bitmap: conn_bitmap.clone().map(Into::into), conn_bitmap: conn_bitmap.clone().map(Into::into),
foreign_network_infos: foreign_network, foreign_network_infos: foreign_network.clone(),
}, },
) )
.await; .await;
@ -1294,6 +1303,10 @@ impl PeerRouteServiceImpl {
if let Some(conn_bitmap) = &conn_bitmap { if let Some(conn_bitmap) = &conn_bitmap {
session.update_dst_saved_conn_bitmap_version(&conn_bitmap); session.update_dst_saved_conn_bitmap_version(&conn_bitmap);
} }
if let Some(foreign_network) = &foreign_network {
session.update_dst_saved_foreign_network_version(&foreign_network);
}
} }
} }
return false; return false;
@ -1329,6 +1342,7 @@ impl OspfRouteRpc for RouteSessionManager {
let is_initiator = request.is_initiator; let is_initiator = request.is_initiator;
let peer_infos = request.peer_infos.map(|x| x.items); let peer_infos = request.peer_infos.map(|x| x.items);
let conn_bitmap = request.conn_bitmap.map(Into::into); let conn_bitmap = request.conn_bitmap.map(Into::into);
let foreign_network = request.foreign_network_infos;
let ret = self let ret = self
.do_sync_route_info( .do_sync_route_info(
@ -1337,6 +1351,7 @@ impl OspfRouteRpc for RouteSessionManager {
is_initiator, is_initiator,
peer_infos, peer_infos,
conn_bitmap, conn_bitmap,
foreign_network,
) )
.await; .await;
@ -1565,6 +1580,7 @@ impl RouteSessionManager {
is_initiator: bool, is_initiator: bool,
peer_infos: Option<Vec<RoutePeerInfo>>, peer_infos: Option<Vec<RoutePeerInfo>>,
conn_bitmap: Option<RouteConnBitmap>, conn_bitmap: Option<RouteConnBitmap>,
foreign_network: Option<RouteForeignNetworkInfos>,
) -> Result<SyncRouteInfoResponse, Error> { ) -> Result<SyncRouteInfoResponse, Error> {
let Some(service_impl) = self.service_impl.upgrade() else { let Some(service_impl) = self.service_impl.upgrade() else {
return Err(Error::Stopped); return Err(Error::Stopped);
@ -1591,6 +1607,13 @@ impl RouteSessionManager {
session.update_dst_saved_conn_bitmap_version(conn_bitmap); session.update_dst_saved_conn_bitmap_version(conn_bitmap);
} }
if let Some(foreign_network) = &foreign_network {
service_impl
.synced_route_info
.update_foreign_network(&foreign_network);
session.update_dst_saved_foreign_network_version(foreign_network);
}
service_impl.update_route_table_and_cached_local_conn_bitmap(); service_impl.update_route_table_and_cached_local_conn_bitmap();
tracing::info!( tracing::info!(
@ -1803,6 +1826,27 @@ impl Route for PeerRoute {
async fn dump(&self) -> String { async fn dump(&self) -> String {
format!("{:#?}", self) format!("{:#?}", self)
} }
async fn list_foreign_network_info(&self) -> RouteForeignNetworkInfos {
let route_table = &self.service_impl.route_table;
let mut foreign_networks = RouteForeignNetworkInfos::default();
for item in self
.service_impl
.synced_route_info
.foreign_network
.iter()
.filter(|x| !x.value().foreign_peer_ids.is_empty())
.filter(|x| route_table.peer_reachable(x.key().peer_id))
{
foreign_networks
.infos
.push(route_foreign_network_infos::Info {
key: Some(item.key().clone()),
value: Some(item.value().clone()),
});
}
foreign_networks
}
} }
impl PeerPacketFilter for Arc<PeerRoute> {} impl PeerPacketFilter for Arc<PeerRoute> {}

View File

@ -4,7 +4,9 @@ use dashmap::DashMap;
use crate::{ use crate::{
common::PeerId, common::PeerId,
proto::peer_rpc::{ForeignNetworkRouteInfoEntry, ForeignNetworkRouteInfoKey}, proto::peer_rpc::{
ForeignNetworkRouteInfoEntry, ForeignNetworkRouteInfoKey, RouteForeignNetworkInfos,
},
}; };
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
@ -79,6 +81,10 @@ pub trait Route {
None None
} }
async fn list_foreign_network_info(&self) -> RouteForeignNetworkInfos {
Default::default()
}
async fn set_route_cost_fn(&self, _cost_fn: RouteCostCalculator) {} async fn set_route_cost_fn(&self, _cost_fn: RouteCostCalculator) {}
async fn dump(&self) -> String { async fn dump(&self) -> String {

View File

@ -3,8 +3,9 @@ use std::sync::Arc;
use crate::proto::{ use crate::proto::{
cli::{ cli::{
DumpRouteRequest, DumpRouteResponse, ListForeignNetworkRequest, ListForeignNetworkResponse, DumpRouteRequest, DumpRouteResponse, ListForeignNetworkRequest, ListForeignNetworkResponse,
ListPeerRequest, ListPeerResponse, ListRouteRequest, ListRouteResponse, PeerInfo, ListGlobalForeignNetworkRequest, ListGlobalForeignNetworkResponse, ListPeerRequest,
PeerManageRpc, ShowNodeInfoRequest, ShowNodeInfoResponse, ListPeerResponse, ListRouteRequest, ListRouteResponse, PeerInfo, PeerManageRpc,
ShowNodeInfoRequest, ShowNodeInfoResponse,
}, },
rpc_types::{self, controller::BaseController}, rpc_types::{self, controller::BaseController},
}; };
@ -90,6 +91,14 @@ impl PeerManageRpc for PeerManagerRpcService {
Ok(reply) Ok(reply)
} }
async fn list_global_foreign_network(
&self,
_: BaseController,
_request: ListGlobalForeignNetworkRequest,
) -> Result<ListGlobalForeignNetworkResponse, rpc_types::error::Error> {
Ok(self.peer_manager.list_global_foreign_network().await)
}
async fn show_node_info( async fn show_node_info(
&self, &self,
_: BaseController, _: BaseController,

View File

@ -86,15 +86,34 @@ message ListForeignNetworkRequest {}
message ForeignNetworkEntryPb { repeated PeerInfo peers = 1; } message ForeignNetworkEntryPb { repeated PeerInfo peers = 1; }
message ListForeignNetworkResponse { message ListForeignNetworkResponse {
// foreign network in local
map<string, ForeignNetworkEntryPb> foreign_networks = 1; map<string, ForeignNetworkEntryPb> foreign_networks = 1;
} }
message ListGlobalForeignNetworkRequest {}
message ListGlobalForeignNetworkResponse {
// foreign network in the entire network
message OneForeignNetwork {
string network_name = 1;
repeated uint32 peer_ids = 2;
string last_updated = 3;
uint32 version = 4;
}
message ForeignNetworks { repeated OneForeignNetwork foreign_networks = 1; }
map<uint32, ForeignNetworks> foreign_networks = 1;
}
service PeerManageRpc { service PeerManageRpc {
rpc ListPeer(ListPeerRequest) returns (ListPeerResponse); rpc ListPeer(ListPeerRequest) returns (ListPeerResponse);
rpc ListRoute(ListRouteRequest) returns (ListRouteResponse); rpc ListRoute(ListRouteRequest) returns (ListRouteResponse);
rpc DumpRoute(DumpRouteRequest) returns (DumpRouteResponse); rpc DumpRoute(DumpRouteRequest) returns (DumpRouteResponse);
rpc ListForeignNetwork(ListForeignNetworkRequest) rpc ListForeignNetwork(ListForeignNetworkRequest)
returns (ListForeignNetworkResponse); returns (ListForeignNetworkResponse);
rpc ListGlobalForeignNetwork(ListGlobalForeignNetworkRequest)
returns (ListGlobalForeignNetworkResponse);
rpc ShowNodeInfo(ShowNodeInfoRequest) returns (ShowNodeInfoResponse); rpc ShowNodeInfo(ShowNodeInfoRequest) returns (ShowNodeInfoResponse);
} }