From 269146c9f87b23a7e2afcb9f185b41d065bf6984 Mon Sep 17 00:00:00 2001 From: "sijie.sun" Date: Sat, 23 Mar 2024 17:28:50 +0800 Subject: [PATCH] fix ipv4 map use old peer_id, fix direct connector use ring --- easytier-core/src/connector/direct.rs | 7 ++++- easytier-core/src/peers/peer_ospf_route.rs | 35 ++++++++++++++-------- 2 files changed, 29 insertions(+), 13 deletions(-) diff --git a/easytier-core/src/connector/direct.rs b/easytier-core/src/connector/direct.rs index 4c473b6b..e9843b50 100644 --- a/easytier-core/src/connector/direct.rs +++ b/easytier-core/src/connector/direct.rs @@ -240,8 +240,13 @@ impl DirectConnectorManager { }) .await?; - let listener = ip_list + let available_listeners = ip_list .listeners + .iter() + .filter_map(|l| if l.scheme() != "ring" { Some(l) } else { None }) + .collect::>(); + + let listener = available_listeners .get(0) .ok_or(anyhow::anyhow!("peer {} have no listener", dst_peer_id))?; diff --git a/easytier-core/src/peers/peer_ospf_route.rs b/easytier-core/src/peers/peer_ospf_route.rs index 7c245db8..40334cc0 100644 --- a/easytier-core/src/peers/peer_ospf_route.rs +++ b/easytier-core/src/peers/peer_ospf_route.rs @@ -392,10 +392,8 @@ impl RouteTable { } fn build_from_synced_info(&self, my_peer_id: PeerId, synced_info: &SyncedRouteInfo) { - // build ipv4_peer_id_map, cidr_peer_id_map and peer_infos + // build peer_infos self.peer_infos.clear(); - self.ipv4_peer_id_map.clear(); - self.cidr_peer_id_map.clear(); for item in synced_info.peer_infos.iter() { let peer_id = item.key(); let info = item.value(); @@ -405,15 +403,6 @@ impl RouteTable { } self.peer_infos.insert(*peer_id, info.clone()); - - if let Some(ipv4_addr) = info.ipv4_addr { - self.ipv4_peer_id_map.insert(ipv4_addr, *peer_id); - } - - for cidr in info.proxy_cidrs.iter() { - self.cidr_peer_id_map - .insert(cidr.parse().unwrap(), *peer_id); - } } // build next hop map @@ -441,6 +430,28 @@ impl RouteTable { .insert(peer_id, (path[1], (path.len() - 1) as i32)); } } + + // build ipv4_peer_id_map, cidr_peer_id_map + self.ipv4_peer_id_map.clear(); + self.cidr_peer_id_map.clear(); + for item in self.peer_infos.iter() { + // only set ipv4 map for peers we can reach. + if !self.next_hop_map.contains_key(item.key()) { + continue; + } + + let peer_id = item.key(); + let info = item.value(); + + if let Some(ipv4_addr) = info.ipv4_addr { + self.ipv4_peer_id_map.insert(ipv4_addr, *peer_id); + } + + for cidr in info.proxy_cidrs.iter() { + self.cidr_peer_id_map + .insert(cidr.parse().unwrap(), *peer_id); + } + } } fn get_peer_id_for_proxy(&self, ipv4: &Ipv4Addr) -> Option {