From f0139c68f701b1be021412c5ea11d432fd4c2883 Mon Sep 17 00:00:00 2001 From: lubeilin <1791778603@qq.com> Date: Sun, 3 Mar 2024 19:23:34 +0800 Subject: [PATCH] =?UTF-8?q?[mio]=20=E8=B7=AF=E7=94=B1=E4=B8=BA=E7=A9=BA?= =?UTF-8?q?=E5=88=99=E5=9B=9E=E6=94=B6=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vnt/src/channel/context.rs | 24 +++++++++++++++++++++--- vnt/src/handle/maintain/idle.rs | 2 +- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/vnt/src/channel/context.rs b/vnt/src/channel/context.rs index f2b2633..7195225 100644 --- a/vnt/src/channel/context.rs +++ b/vnt/src/channel/context.rs @@ -256,6 +256,17 @@ impl ContextInner { Ok(()) } } + pub fn remove_route(&self, ip: &Ipv4Addr, route_key: RouteKey) { + if self.route_table.remove_route(ip, route_key) { + if route_key.is_tcp { + if let Some(tcp) = self.tcp_map.write().remove(&route_key.addr) { + if let Err(e) = tcp.shutdown() { + log::warn!("{:?}", e); + } + } + } + } + } } pub struct RouteTable { @@ -428,11 +439,18 @@ impl RouteTable { } list } - pub fn remove_route(&self, id: &Ipv4Addr, route_key: RouteKey) { - if let Some((_, routes)) = self.route_table.write().get_mut(id) { + pub fn remove_route(&self, id: &Ipv4Addr, route_key: RouteKey) -> bool { + let mut write_guard = self.route_table.write(); + if let Some((_, routes)) = write_guard.get_mut(id) { routes.retain(|(x, _)| x.route_key() != route_key); + if routes.is_empty() { + write_guard.remove(id); + true + } else { + false + } } else { - return; + return true; } } /// 更新路由入栈包的时刻,长时间没有收到数据的路由将会被剔除 diff --git a/vnt/src/handle/maintain/idle.rs b/vnt/src/handle/maintain/idle.rs index a419a6f..4463414 100644 --- a/vnt/src/handle/maintain/idle.rs +++ b/vnt/src/handle/maintain/idle.rs @@ -83,7 +83,7 @@ fn idle_route0( let cur = current_device.load(); match idle.next_idle() { IdleType::Timeout(ip, route) => { - context.route_table.remove_route(&ip, route); + context.remove_route(&ip, route); if cur.is_gateway(&ip) { //网关路由过期,则需要改变状态 let cur = context.change_status(current_device);