From 02b988e898c605c2204968298491498ea94d6b88 Mon Sep 17 00:00:00 2001 From: lubeilin <1791778603@qq.com> Date: Thu, 29 Feb 2024 22:15:06 +0800 Subject: [PATCH] =?UTF-8?q?[mio]=20=E5=8E=BB=E9=99=A4Arc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vnt/src/external_route/mod.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/vnt/src/external_route/mod.rs b/vnt/src/external_route/mod.rs index 78667f3..0769546 100644 --- a/vnt/src/external_route/mod.rs +++ b/vnt/src/external_route/mod.rs @@ -5,16 +5,17 @@ use std::sync::Arc; #[derive(Clone)] pub struct ExternalRoute { - route_table: Arc>, + route_table: Vec<(u32, u32, Ipv4Addr)>, } impl ExternalRoute { pub fn new(route_table: Vec<(u32, u32, Ipv4Addr)>) -> Self { - Self { - route_table: Arc::new(route_table), - } + Self { route_table } } pub fn route(&self, ip: &Ipv4Addr) -> Option { + if self.route_table.is_empty() { + return None; + } let ip = u32::from_be_bytes(ip.octets()); for (dest, mask, gateway) in self.route_table.iter() { if *mask & ip == *mask & *dest { @@ -23,6 +24,12 @@ impl ExternalRoute { } None } + pub fn to_route(&self) -> Vec<(Ipv4Addr, Ipv4Addr)> { + self.route_table + .iter() + .map(|(dest, mask, _)| (Ipv4Addr::from(*dest & *mask), Ipv4Addr::from(*mask))) + .collect::>() + } } #[derive(Clone)]