support ip broadcast (#26)

This commit is contained in:
Sijie.Sun
2024-03-06 23:09:15 +08:00
committed by GitHub
parent d8d1c64df7
commit 278a4846f1
4 changed files with 107 additions and 16 deletions
+39 -14
View File
@@ -414,25 +414,50 @@ impl PeerManager {
ipv4_addr
);
let Some(peer_id) = self.peers.get_peer_id_by_ipv4(&ipv4_addr).await else {
log::trace!("no peer id for ipv4: {}", ipv4_addr);
let mut dst_peers = vec![];
// NOTE: currently we only support ipv4 and cidr is 24
if ipv4_addr.octets()[3] == 255 {
dst_peers.extend(
self.peers
.list_routes()
.await
.iter()
.map(|x| x.key().clone()),
);
} else if let Some(peer_id) = self.peers.get_peer_id_by_ipv4(&ipv4_addr).await {
dst_peers.push(peer_id);
}
if dst_peers.is_empty() {
log::error!("no peer id for ipv4: {}", ipv4_addr);
return Ok(());
};
}
let msg = self.run_nic_packet_process_pipeline(msg).await;
self.peers
.send_msg(
packet::Packet::new_data_packet(self.my_node_id, peer_id, &msg).into(),
&peer_id,
)
.await?;
let mut errs: Vec<Error> = vec![];
log::trace!(
"do send_msg in peer manager done, dst_peer_id: {:?}",
peer_id
);
for peer_id in dst_peers.iter() {
let send_ret = self
.peers
.send_msg(
packet::Packet::new_data_packet(self.my_node_id, peer_id.clone(), &msg).into(),
&peer_id,
)
.await;
Ok(())
if let Err(send_ret) = send_ret {
errs.push(send_ret);
}
}
tracing::trace!(?dst_peers, "do send_msg in peer manager done");
if errs.is_empty() {
Ok(())
} else {
tracing::error!(?errs, "send_msg has error");
Err(anyhow::anyhow!("send_msg has error: {:?}", errs).into())
}
}
async fn run_clean_peer_without_conn_routine(&self) {
+13
View File
@@ -202,4 +202,17 @@ impl PeerMap {
self.close_peer(&peer_id).await.unwrap();
}
}
pub async fn list_routes(&self) -> DashMap<PeerId, PeerId> {
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
}
}