From 4cccf58b2ede76509f950f5be520057e58d6cee5 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 13 Apr 2026 15:48:57 +0800 Subject: [PATCH] export structure and function, and fix the default --- src/lib.rs | 1 + src/network/route.rs | 17 +++++++++++++++++ src/network/tun_linux.rs | 4 ++-- src/network/tun_win.rs | 2 +- src/utils/system_action.rs | 4 ++-- 5 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 7805053..a0dcadd 100755 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,6 +14,7 @@ use std::net::{SocketAddr, ToSocketAddrs}; pub use network::get_edge; pub use network::get_install_channel; pub use network::{async_main, init_edge, NodeConfig, restore_dns}; +pub use network::{RouteInfo, set_route_from_net}; use sdlan_sn_rs::utils::{Mac, save_to_file}; use serde::{Deserialize, Serialize}; use tokio::net::UdpSocket; diff --git a/src/network/route.rs b/src/network/route.rs index 857998e..b4570ec 100755 --- a/src/network/route.rs +++ b/src/network/route.rs @@ -32,9 +32,26 @@ impl RouteTable2 { } } + pub fn lookup(&self, ip: u32) -> Option<(u8, Ipv4Addr)> { + let res = self.route_table.lookup(ip); + if res.is_some() { + res + } else { + if self.default_gw.load().is_some() { + Some((0, self.default_gw.load().unwrap())) + } else { + None + } + } + } + pub fn clear_and_add_routes(&self, routes: Vec) -> Result<()> { for route in self.cache_table.iter() { let (net, gw) = route.key(); + if net.addr().to_bits() == 0 { + // default gateway + self.default_gw.store(Arc::new(Some(gw.clone()))); + } if route.value().load(Ordering::Relaxed) { if let Err(e) = del_route(net, gw) { error!("failed to del route: {}", e.as_str()); diff --git a/src/network/tun_linux.rs b/src/network/tun_linux.rs index 70f6a89..e102a3f 100755 --- a/src/network/tun_linux.rs +++ b/src/network/tun_linux.rs @@ -260,7 +260,7 @@ impl TunTapPacketHandler for Iface { if edge.device_config.contains(&Ipv4Addr::from_bits(dest_ip)) { let _ = edge.send_arp_request(dest_ip, dest_ip).await; } else { - if let Some((_, real_ip)) = edge.route_table.route_table.lookup(dest_ip) { + if let Some((_, real_ip)) = edge.route_table.lookup(dest_ip) { let real_ip = u32::from_be_bytes(real_ip.octets()); let _ = edge.send_arp_request(dest_ip, real_ip).await; } @@ -669,7 +669,7 @@ impl TunTapPacketHandler for Iface { if eee.device_config.contains(&Ipv4Addr::from_bits(dstip)) { let _ = eee.send_arp_request(dstip, dstip).await; } else { - if let Some((_, real_ip)) = eee.route_table.route_table.lookup(dstip) { + if let Some((_, real_ip)) = eee.route_table.lookup(dstip) { let real_ip = u32::from_be_bytes(real_ip.octets()); let _ = eee.send_arp_request(dstip, real_ip).await; } diff --git a/src/network/tun_win.rs b/src/network/tun_win.rs index 64a2ee4..a4d813e 100755 --- a/src/network/tun_win.rs +++ b/src/network/tun_win.rs @@ -553,7 +553,7 @@ impl TunTapPacketHandler for Iface { if eee.device_config.contains(&Ipv4Addr::from_bits(dstip)) { let _ = eee.send_arp_request(dstip, dstip).await; } else { - if let Some((_, real_ip)) = eee.route_table.route_table.lookup(dstip) { + if let Some((_, real_ip)) = eee.route_table.lookup(dstip) { let real_ip = u32::from_be_bytes(real_ip.octets()); let _ = eee.send_arp_request(dstip, real_ip).await; } diff --git a/src/utils/system_action.rs b/src/utils/system_action.rs index 224ab00..8b46d97 100644 --- a/src/utils/system_action.rs +++ b/src/utils/system_action.rs @@ -78,12 +78,12 @@ impl RouteTableTrie { self.trie.store(Arc::new(IpTrie::default())); } - pub fn lookup(&self, ip: u32) -> Option<(u8, Ipv4Addr)> { + pub(crate) fn lookup(&self, ip: u32) -> Option<(u8, Ipv4Addr)> { let trie = self.trie.load(); trie.lookup(ip) } - pub fn insert(&self, prefix: u32, prefix_len: u8, nexthop: Ipv4Addr) { + pub(crate) fn insert(&self, prefix: u32, prefix_len: u8, nexthop: Ipv4Addr) { let old = self.trie.load(); let mut new_trie = (*(*old)).clone();