make tun dependency optional (#142)

* remove log crates
* remove udp/raw of smoltcp
* make tun as optional dependancy, compile for freebsd works
This commit is contained in:
Sijie.Sun
2024-06-11 09:09:32 +08:00
committed by GitHub
parent 8aa57ebc22
commit 34f832bbad
26 changed files with 310 additions and 488 deletions
Generated
-3
View File
@@ -1271,7 +1271,6 @@ dependencies = [
"http 1.1.0", "http 1.1.0",
"humansize", "humansize",
"indexmap 1.9.3", "indexmap 1.9.3",
"log",
"mimalloc-rust", "mimalloc-rust",
"network-interface", "network-interface",
"nix 0.27.1", "nix 0.27.1",
@@ -4561,8 +4560,6 @@ dependencies = [
"cfg-if", "cfg-if",
"defmt", "defmt",
"heapless 0.8.0", "heapless 0.8.0",
"libc",
"log",
"managed", "managed",
] ]
+23 -5
View File
@@ -36,7 +36,6 @@ tracing-subscriber = { version = "0.3", features = [
"time", "time",
] } ] }
tracing-appender = "0.2.3" tracing-appender = "0.2.3"
log = "0.4"
thiserror = "1.0" thiserror = "1.0"
auto_impl = "1.1.0" auto_impl = "1.1.0"
crossbeam = "0.8.4" crossbeam = "0.8.4"
@@ -85,7 +84,9 @@ http = { version = "1", default-features = false, features = [
tokio-rustls = { version = "0.26", default-features = false, optional = true } tokio-rustls = { version = "0.26", default-features = false, optional = true }
# for tap device # for tap device
tun = { package = "tun-easytier", version = "0.6.1", features = ["async"] } tun = { package = "tun-easytier", version = "0.6.1", features = [
"async",
], optional = true }
# for net ns # for net ns
nix = { version = "0.27", features = ["sched", "socket", "ioctl"] } nix = { version = "0.27", features = ["sched", "socket", "ioctl"] }
@@ -155,7 +156,14 @@ indexmap = { version = "~1.9.3", optional = false, features = ["std"] }
atomic-shim = "0.2.0" atomic-shim = "0.2.0"
smoltcp = { version = "0.11.0", optional = true } smoltcp = { version = "0.11.0", optional = true, default-features = false, features = [
"std",
"medium-ip",
"proto-ipv4",
"proto-ipv6",
"socket-tcp",
"async",
] }
parking_lot = { version = "0.12.0", optional = true } parking_lot = { version = "0.12.0", optional = true }
[target.'cfg(windows)'.dependencies] [target.'cfg(windows)'.dependencies]
@@ -182,13 +190,23 @@ defguard_wireguard_rs = "0.4.2"
[features] [features]
default = ["wireguard", "mimalloc", "websocket", "smoltcp"] default = ["wireguard", "mimalloc", "websocket", "smoltcp", "tun"]
full = ["quic", "websocket", "wireguard", "mimalloc", "aes-gcm", "smoltcp"] full = [
"quic",
"websocket",
"wireguard",
"mimalloc",
"aes-gcm",
"smoltcp",
"tun",
]
mips = ["aes-gcm", "mimalloc", "wireguard"] mips = ["aes-gcm", "mimalloc", "wireguard"]
bsd = ["aes-gcm", "mimalloc", "smoltcp"]
wireguard = ["dep:boringtun", "dep:ring"] wireguard = ["dep:boringtun", "dep:ring"]
quic = ["dep:quinn", "dep:rustls", "dep:rcgen"] quic = ["dep:quinn", "dep:rustls", "dep:rcgen"]
mimalloc = ["dep:mimalloc-rust"] mimalloc = ["dep:mimalloc-rust"]
aes-gcm = ["dep:aes-gcm"] aes-gcm = ["dep:aes-gcm"]
tun = ["dep:tun"]
websocket = [ websocket = [
"dep:tokio-websockets", "dep:tokio-websockets",
"dep:http", "dep:http",
+3
View File
@@ -10,8 +10,11 @@ use super::PeerId;
pub enum Error { pub enum Error {
#[error("io error")] #[error("io error")]
IOError(#[from] io::Error), IOError(#[from] io::Error),
#[cfg(feature = "tun")]
#[error("rust tun error {0}")] #[error("rust tun error {0}")]
TunError(#[from] tun::Error), TunError(#[from] tun::Error),
#[error("tunnel error {0}")] #[error("tunnel error {0}")]
TunnelError(#[from] tunnel::TunnelError), TunnelError(#[from] tunnel::TunnelError),
#[error("Peer has no conn, PeerId: {0}")] #[error("Peer has no conn, PeerId: {0}")]
+1 -1
View File
@@ -128,7 +128,7 @@ impl GlobalCtx {
if self.event_bus.receiver_count() != 0 { if self.event_bus.receiver_count() != 0 {
self.event_bus.send(event).unwrap(); self.event_bus.send(event).unwrap();
} else { } else {
log::warn!("No subscriber for event: {:?}", event); tracing::warn!("No subscriber for event: {:?}", event);
} }
} }
+2 -2
View File
@@ -43,7 +43,7 @@ impl NetNSGuard {
} }
let ns = std::fs::File::open(ns_path).unwrap(); let ns = std::fs::File::open(ns_path).unwrap();
log::info!( tracing::info!(
"[INIT NS] switching to new ns_name: {:?}, ns_file: {:?}", "[INIT NS] switching to new ns_name: {:?}, ns_file: {:?}",
name, name,
ns ns
@@ -59,7 +59,7 @@ impl Drop for NetNSGuard {
if self.old_ns.is_none() { if self.old_ns.is_none() {
return; return;
} }
log::info!("[INIT NS] switching back to old ns, ns: {:?}", self.old_ns); tracing::info!("[INIT NS] switching back to old ns, ns: {:?}", self.old_ns);
setns( setns(
self.old_ns.as_ref().unwrap().as_fd(), self.old_ns.as_ref().unwrap().as_fd(),
CloneFlags::CLONE_NEWNET, CloneFlags::CLONE_NEWNET,
+1 -1
View File
@@ -51,7 +51,7 @@ impl InterfaceFilter {
} }
} }
#[cfg(target_os = "macos")] #[cfg(any(target_os = "macos", target_os = "freebsd"))]
impl InterfaceFilter { impl InterfaceFilter {
async fn is_interface_physical(interface_name: &str) -> bool { async fn is_interface_physical(interface_name: &str) -> bool {
let output = tokio::process::Command::new("networksetup") let output = tokio::process::Command::new("networksetup")
+3 -3
View File
@@ -220,7 +220,7 @@ impl DirectConnectorManager {
} }
return Err(e); return Err(e);
} else { } else {
log::info!("try_connect_to_ip success, peer_id: {}", dst_peer_id); tracing::info!("try_connect_to_ip success, peer_id: {}", dst_peer_id);
return Ok(()); return Ok(());
} }
} }
@@ -314,7 +314,7 @@ impl DirectConnectorManager {
let mut has_succ = false; let mut has_succ = false;
while let Some(ret) = tasks.join_next().await { while let Some(ret) = tasks.join_next().await {
if let Err(e) = ret { if let Err(e) = ret {
log::error!("join direct connect task failed: {:?}", e); tracing::error!("join direct connect task failed: {:?}", e);
} else if let Ok(Ok(_)) = ret { } else if let Ok(Ok(_)) = ret {
has_succ = true; has_succ = true;
} }
@@ -345,7 +345,7 @@ impl DirectConnectorManager {
} }
} }
log::trace!("try direct connect to peer: {}", dst_peer_id); tracing::trace!("try direct connect to peer: {}", dst_peer_id);
let ip_list = peer_manager let ip_list = peer_manager
.get_peer_rpc_mgr() .get_peer_rpc_mgr()
+15 -15
View File
@@ -89,7 +89,7 @@ impl ManualConnectorManager {
where where
T: TunnelConnector + 'static, T: TunnelConnector + 'static,
{ {
log::info!("add_connector: {}", connector.remote_url()); tracing::info!("add_connector: {}", connector.remote_url());
self.data.connectors.insert( self.data.connectors.insert(
connector.remote_url().into(), connector.remote_url().into(),
Arc::new(Mutex::new(Box::new(connector))), Arc::new(Mutex::new(Box::new(connector))),
@@ -102,7 +102,7 @@ impl ManualConnectorManager {
} }
pub async fn remove_connector(&self, url: &str) -> Result<(), Error> { pub async fn remove_connector(&self, url: &str) -> Result<(), Error> {
log::info!("remove_connector: {}", url); tracing::info!("remove_connector: {}", url);
if !self.list_connectors().await.iter().any(|x| x.url == url) { if !self.list_connectors().await.iter().any(|x| x.url == url) {
return Err(Error::NotFound); return Err(Error::NotFound);
} }
@@ -163,7 +163,7 @@ impl ManualConnectorManager {
data: Arc<ConnectorManagerData>, data: Arc<ConnectorManagerData>,
mut event_recv: Receiver<GlobalCtxEvent>, mut event_recv: Receiver<GlobalCtxEvent>,
) { ) {
log::warn!("conn_mgr_routine started"); tracing::warn!("conn_mgr_routine started");
let mut reconn_interval = tokio::time::interval(std::time::Duration::from_millis( let mut reconn_interval = tokio::time::interval(std::time::Duration::from_millis(
use_global_var!(MANUAL_CONNECTOR_RECONNECT_INTERVAL_MS), use_global_var!(MANUAL_CONNECTOR_RECONNECT_INTERVAL_MS),
)); ));
@@ -200,11 +200,11 @@ impl ManualConnectorManager {
data_clone.connectors.insert(dead_url.clone(), connector); data_clone.connectors.insert(dead_url.clone(), connector);
}); });
} }
log::info!("reconn_interval tick, done"); tracing::info!("reconn_interval tick, done");
} }
ret = reconn_result_recv.recv() => { ret = reconn_result_recv.recv() => {
log::warn!("reconn_tasks done, reconn result: {:?}", ret); tracing::warn!("reconn_tasks done, reconn result: {:?}", ret);
} }
} }
} }
@@ -215,13 +215,13 @@ impl ManualConnectorManager {
GlobalCtxEvent::PeerConnAdded(conn_info) => { GlobalCtxEvent::PeerConnAdded(conn_info) => {
let addr = conn_info.tunnel.as_ref().unwrap().remote_addr.clone(); let addr = conn_info.tunnel.as_ref().unwrap().remote_addr.clone();
data.alive_conn_urls.lock().await.insert(addr); data.alive_conn_urls.lock().await.insert(addr);
log::warn!("peer conn added: {:?}", conn_info); tracing::warn!("peer conn added: {:?}", conn_info);
} }
GlobalCtxEvent::PeerConnRemoved(conn_info) => { GlobalCtxEvent::PeerConnRemoved(conn_info) => {
let addr = conn_info.tunnel.as_ref().unwrap().remote_addr.clone(); let addr = conn_info.tunnel.as_ref().unwrap().remote_addr.clone();
data.alive_conn_urls.lock().await.remove(&addr); data.alive_conn_urls.lock().await.remove(&addr);
log::warn!("peer conn removed: {:?}", conn_info); tracing::warn!("peer conn removed: {:?}", conn_info);
} }
_ => {} _ => {}
@@ -233,14 +233,14 @@ impl ManualConnectorManager {
for it in data.removed_conn_urls.iter() { for it in data.removed_conn_urls.iter() {
let url = it.key(); let url = it.key();
if let Some(_) = data.connectors.remove(url) { if let Some(_) = data.connectors.remove(url) {
log::warn!("connector: {}, removed", url); tracing::warn!("connector: {}, removed", url);
continue; continue;
} else if data.reconnecting.contains(url) { } else if data.reconnecting.contains(url) {
log::warn!("connector: {}, reconnecting, remove later.", url); tracing::warn!("connector: {}, reconnecting, remove later.", url);
remove_later.insert(url.clone()); remove_later.insert(url.clone());
continue; continue;
} else { } else {
log::warn!("connector: {}, not found", url); tracing::warn!("connector: {}, not found", url);
} }
} }
data.removed_conn_urls.clear(); data.removed_conn_urls.clear();
@@ -284,9 +284,9 @@ impl ManualConnectorManager {
)); ));
let _g = net_ns.guard(); let _g = net_ns.guard();
log::info!("reconnect try connect... conn: {:?}", connector); tracing::info!("reconnect try connect... conn: {:?}", connector);
let tunnel = connector.lock().await.connect().await?; let tunnel = connector.lock().await.connect().await?;
log::info!("reconnect get tunnel succ: {:?}", tunnel); tracing::info!("reconnect get tunnel succ: {:?}", tunnel);
assert_eq!( assert_eq!(
dead_url, dead_url,
tunnel.info().unwrap().remote_addr, tunnel.info().unwrap().remote_addr,
@@ -294,7 +294,7 @@ impl ManualConnectorManager {
tunnel.info() tunnel.info()
); );
let (peer_id, conn_id) = data.peer_manager.add_client_tunnel(tunnel).await?; let (peer_id, conn_id) = data.peer_manager.add_client_tunnel(tunnel).await?;
log::info!("reconnect succ: {} {} {}", peer_id, conn_id, dead_url); tracing::info!("reconnect succ: {} {} {}", peer_id, conn_id, dead_url);
Ok(ReconnResult { Ok(ReconnResult {
dead_url, dead_url,
peer_id, peer_id,
@@ -307,7 +307,7 @@ impl ManualConnectorManager {
dead_url: String, dead_url: String,
connector: MutexConnector, connector: MutexConnector,
) -> Result<ReconnResult, Error> { ) -> Result<ReconnResult, Error> {
log::info!("reconnect: {}", dead_url); tracing::info!("reconnect: {}", dead_url);
let mut ip_versions = vec![]; let mut ip_versions = vec![];
let u = url::Url::parse(&dead_url) let u = url::Url::parse(&dead_url)
@@ -347,7 +347,7 @@ impl ManualConnectorManager {
), ),
) )
.await; .await;
log::info!("reconnect: {} done, ret: {:?}", dead_url, ret); tracing::info!("reconnect: {} done, ret: {:?}", dead_url, ret);
if ret.is_ok() && ret.as_ref().unwrap().is_ok() { if ret.is_ok() && ret.as_ref().unwrap().is_ok() {
reconn_ret = ret.unwrap(); reconn_ret = ret.unwrap();
+1 -1
View File
@@ -428,7 +428,7 @@ impl From<Cli> for TomlConfigLoader {
f.mtu = mtu; f.mtu = mtu;
} }
f.enable_exit_node = cli.enable_exit_node; f.enable_exit_node = cli.enable_exit_node;
f.no_tun = cli.no_tun; f.no_tun = cli.no_tun || cfg!(not(feature = "tun"));
f.use_smoltcp = cli.use_smoltcp; f.use_smoltcp = cli.use_smoltcp;
cfg.set_flags(f); cfg.set_flags(f);
+2 -15
View File
@@ -18,9 +18,9 @@ pub use smoltcp;
use smoltcp::{ use smoltcp::{
iface::{Config, Interface, Routes}, iface::{Config, Interface, Routes},
time::{Duration, Instant}, time::{Duration, Instant},
wire::{HardwareAddress, IpAddress, IpCidr, IpProtocol, IpVersion}, wire::{HardwareAddress, IpAddress, IpCidr},
}; };
pub use socket::{RawSocket, TcpListener, TcpStream, UdpSocket}; pub use socket::{TcpListener, TcpStream};
pub use socket_allocator::BufferSize; pub use socket_allocator::BufferSize;
use tokio::sync::Notify; use tokio::sync::Notify;
@@ -155,19 +155,6 @@ impl Net {
) )
.await .await
} }
/// This function will create a new UDP socket and attempt to bind it to the `addr` provided.
pub async fn udp_bind(&self, addr: SocketAddr) -> io::Result<UdpSocket> {
let addr = self.set_address(addr);
UdpSocket::new(self.reactor.clone(), addr.into()).await
}
/// Creates a new raw socket.
pub async fn raw_socket(
&self,
ip_version: IpVersion,
ip_protocol: IpProtocol,
) -> io::Result<RawSocket> {
RawSocket::new(self.reactor.clone(), ip_version, ip_protocol).await
}
fn set_address(&self, mut addr: SocketAddr) -> SocketAddr { fn set_address(&self, mut addr: SocketAddr) -> SocketAddr {
if addr.ip().is_unspecified() { if addr.ip().is_unspecified() {
addr.set_ip(match self.ip_addr.address() { addr.set_ip(match self.ip_addr.address() {
@@ -153,8 +153,6 @@ impl Drop for Reactor {
for (_, socket) in self.socket_allocator.sockets().lock().iter_mut() { for (_, socket) in self.socket_allocator.sockets().lock().iter_mut() {
match socket { match socket {
Socket::Tcp(tcp) => tcp.close(), Socket::Tcp(tcp) => tcp.close(),
Socket::Raw(_) => {}
Socket::Udp(udp) => udp.close(),
#[allow(unreachable_patterns)] #[allow(unreachable_patterns)]
_ => {} _ => {}
} }
+2 -146
View File
@@ -1,8 +1,8 @@
use super::{reactor::Reactor, socket_allocator::SocketHandle}; use super::{reactor::Reactor, socket_allocator::SocketHandle};
use futures::future::{self, poll_fn}; use futures::future::{self, poll_fn};
use futures::{ready, Stream}; use futures::{ready, Stream};
pub use smoltcp::socket::{raw, tcp, udp}; pub use smoltcp::socket::tcp;
use smoltcp::wire::{IpAddress, IpEndpoint, IpProtocol, IpVersion}; use smoltcp::wire::{IpAddress, IpEndpoint};
use std::mem::replace; use std::mem::replace;
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use std::{ use std::{
@@ -231,147 +231,3 @@ impl AsyncWrite for TcpStream {
Poll::Pending Poll::Pending
} }
} }
/// A UDP socket.
pub struct UdpSocket {
handle: SocketHandle,
reactor: Arc<Reactor>,
local_addr: SocketAddr,
}
impl UdpSocket {
pub(super) async fn new(
reactor: Arc<Reactor>,
local_endpoint: IpEndpoint,
) -> io::Result<UdpSocket> {
let handle = reactor.socket_allocator().new_udp_socket();
{
let mut socket = reactor.get_socket::<udp::Socket>(*handle);
socket.bind(local_endpoint).map_err(map_err)?;
}
let local_addr = ep2sa(&local_endpoint);
Ok(UdpSocket {
handle,
reactor,
local_addr,
})
}
/// Note that on multiple calls to a poll_* method in the send direction, only the Waker from the Context passed to the most recent call will be scheduled to receive a wakeup.
pub fn poll_send_to(
&self,
cx: &mut Context<'_>,
buf: &[u8],
target: SocketAddr,
) -> Poll<io::Result<usize>> {
let mut socket = self.reactor.get_socket::<udp::Socket>(*self.handle);
let target_ip: IpEndpoint = target.into();
match socket.send_slice(buf, target_ip) {
// the buffer is full
Err(udp::SendError::BufferFull) => {}
r => {
r.map_err(map_err)?;
self.reactor.notify();
return Poll::Ready(Ok(buf.len()));
}
}
socket.register_send_waker(cx.waker());
Poll::Pending
}
/// See note on `poll_send_to`
pub async fn send_to(&self, buf: &[u8], target: SocketAddr) -> io::Result<usize> {
poll_fn(|cx| self.poll_send_to(cx, buf, target)).await
}
/// Note that on multiple calls to a poll_* method in the recv direction, only the Waker from the Context passed to the most recent call will be scheduled to receive a wakeup.
pub fn poll_recv_from(
&self,
cx: &mut Context<'_>,
buf: &mut [u8],
) -> Poll<io::Result<(usize, SocketAddr)>> {
let mut socket = self.reactor.get_socket::<udp::Socket>(*self.handle);
match socket.recv_slice(buf) {
// the buffer is empty
Err(udp::RecvError::Exhausted) => {}
r => {
let (size, metadata) = r.map_err(map_err)?;
self.reactor.notify();
return Poll::Ready(Ok((size, ep2sa(&metadata.endpoint))));
}
}
socket.register_recv_waker(cx.waker());
Poll::Pending
}
/// See note on `poll_recv_from`
pub async fn recv_from(&self, buf: &mut [u8]) -> io::Result<(usize, SocketAddr)> {
poll_fn(|cx| self.poll_recv_from(cx, buf)).await
}
pub fn local_addr(&self) -> io::Result<SocketAddr> {
Ok(self.local_addr)
}
}
/// A raw socket.
pub struct RawSocket {
handle: SocketHandle,
reactor: Arc<Reactor>,
}
impl RawSocket {
pub(super) async fn new(
reactor: Arc<Reactor>,
ip_version: IpVersion,
ip_protocol: IpProtocol,
) -> io::Result<RawSocket> {
let handle = reactor
.socket_allocator()
.new_raw_socket(ip_version, ip_protocol);
Ok(RawSocket { handle, reactor })
}
/// Note that on multiple calls to a poll_* method in the send direction, only the Waker from the Context passed to the most recent call will be scheduled to receive a wakeup.
pub fn poll_send(&self, cx: &mut Context<'_>, buf: &[u8]) -> Poll<io::Result<usize>> {
let mut socket = self.reactor.get_socket::<raw::Socket>(*self.handle);
match socket.send_slice(buf) {
// the buffer is full
Err(raw::SendError::BufferFull) => {}
r => {
r.map_err(map_err)?;
self.reactor.notify();
return Poll::Ready(Ok(buf.len()));
}
}
socket.register_send_waker(cx.waker());
Poll::Pending
}
/// See note on `poll_send`
pub async fn send(&self, buf: &[u8]) -> io::Result<usize> {
poll_fn(|cx| self.poll_send(cx, buf)).await
}
/// Note that on multiple calls to a poll_* method in the recv direction, only the Waker from the Context passed to the most recent call will be scheduled to receive a wakeup.
pub fn poll_recv(&self, cx: &mut Context<'_>, buf: &mut [u8]) -> Poll<io::Result<usize>> {
let mut socket = self.reactor.get_socket::<raw::Socket>(*self.handle);
match socket.recv_slice(buf) {
// the buffer is empty
Err(raw::RecvError::Exhausted) => {}
r => {
let size = r.map_err(map_err)?;
return Poll::Ready(Ok(size));
}
}
socket.register_recv_waker(cx.waker());
Poll::Pending
}
/// See note on `poll_recv`
pub async fn recv(&self, buf: &mut [u8]) -> io::Result<usize> {
poll_fn(|cx| self.poll_recv(cx, buf)).await
}
}
@@ -1,8 +1,7 @@
use parking_lot::Mutex; use parking_lot::Mutex;
use smoltcp::{ use smoltcp::{
iface::{SocketHandle as InnerSocketHandle, SocketSet}, iface::{SocketHandle as InnerSocketHandle, SocketSet},
socket::{raw, tcp, udp}, socket::tcp,
wire::{IpProtocol, IpVersion},
}; };
use std::{ use std::{
ops::{Deref, DerefMut}, ops::{Deref, DerefMut},
@@ -14,14 +13,6 @@ use std::{
pub struct BufferSize { pub struct BufferSize {
pub tcp_rx_size: usize, pub tcp_rx_size: usize,
pub tcp_tx_size: usize, pub tcp_tx_size: usize,
pub udp_rx_size: usize,
pub udp_tx_size: usize,
pub udp_rx_meta_size: usize,
pub udp_tx_meta_size: usize,
pub raw_rx_size: usize,
pub raw_tx_size: usize,
pub raw_rx_meta_size: usize,
pub raw_tx_meta_size: usize,
} }
impl Default for BufferSize { impl Default for BufferSize {
@@ -29,14 +20,6 @@ impl Default for BufferSize {
BufferSize { BufferSize {
tcp_rx_size: 8192, tcp_rx_size: 8192,
tcp_tx_size: 8192, tcp_tx_size: 8192,
udp_rx_size: 8192,
udp_tx_size: 8192,
udp_rx_meta_size: 32,
udp_tx_meta_size: 32,
raw_rx_size: 8192,
raw_tx_size: 8192,
raw_rx_meta_size: 32,
raw_tx_meta_size: 32,
} }
} }
} }
@@ -65,16 +48,6 @@ impl SocketAlloctor {
let handle = set.add(self.alloc_tcp_socket()); let handle = set.add(self.alloc_tcp_socket());
SocketHandle::new(handle, self.sockets.clone()) SocketHandle::new(handle, self.sockets.clone())
} }
pub fn new_udp_socket(&self) -> SocketHandle {
let mut set = self.sockets.lock();
let handle = set.add(self.alloc_udp_socket());
SocketHandle::new(handle, self.sockets.clone())
}
pub fn new_raw_socket(&self, ip_version: IpVersion, ip_protocol: IpProtocol) -> SocketHandle {
let mut set = self.sockets.lock();
let handle = set.add(self.alloc_raw_socket(ip_version, ip_protocol));
SocketHandle::new(handle, self.sockets.clone())
}
fn alloc_tcp_socket(&self) -> tcp::Socket<'static> { fn alloc_tcp_socket(&self) -> tcp::Socket<'static> {
let rx_buffer = tcp::SocketBuffer::new(vec![0; self.buffer_size.tcp_rx_size]); let rx_buffer = tcp::SocketBuffer::new(vec![0; self.buffer_size.tcp_rx_size]);
let tx_buffer = tcp::SocketBuffer::new(vec![0; self.buffer_size.tcp_tx_size]); let tx_buffer = tcp::SocketBuffer::new(vec![0; self.buffer_size.tcp_tx_size]);
@@ -83,36 +56,6 @@ impl SocketAlloctor {
tcp tcp
} }
fn alloc_udp_socket(&self) -> udp::Socket<'static> {
let rx_buffer = udp::PacketBuffer::new(
vec![udp::PacketMetadata::EMPTY; self.buffer_size.udp_rx_meta_size],
vec![0; self.buffer_size.udp_rx_size],
);
let tx_buffer = udp::PacketBuffer::new(
vec![udp::PacketMetadata::EMPTY; self.buffer_size.udp_tx_meta_size],
vec![0; self.buffer_size.udp_tx_size],
);
let udp = udp::Socket::new(rx_buffer, tx_buffer);
udp
}
fn alloc_raw_socket(
&self,
ip_version: IpVersion,
ip_protocol: IpProtocol,
) -> raw::Socket<'static> {
let rx_buffer = raw::PacketBuffer::new(
vec![raw::PacketMetadata::EMPTY; self.buffer_size.raw_rx_meta_size],
vec![0; self.buffer_size.raw_rx_size],
);
let tx_buffer = raw::PacketBuffer::new(
vec![raw::PacketMetadata::EMPTY; self.buffer_size.raw_tx_meta_size],
vec![0; self.buffer_size.raw_tx_size],
);
let raw = raw::Socket::new(ip_version, ip_protocol, rx_buffer, tx_buffer);
raw
}
} }
pub struct SocketHandle(InnerSocketHandle, SharedSocketSet); pub struct SocketHandle(InnerSocketHandle, SharedSocketSet);
+13 -202
View File
@@ -1,14 +1,10 @@
use std::collections::HashSet; use std::collections::HashSet;
use std::net::Ipv4Addr; use std::net::Ipv4Addr;
use std::pin::Pin;
use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::{Arc, Weak}; use std::sync::{Arc, Weak};
use anyhow::Context; use anyhow::Context;
use cidr::Ipv4Inet; use cidr::Ipv4Inet;
use futures::{SinkExt, StreamExt};
use pnet::packet::ipv4::Ipv4Packet;
use tokio::{sync::Mutex, task::JoinSet}; use tokio::{sync::Mutex, task::JoinSet};
use tonic::transport::server::TcpIncoming; use tonic::transport::server::TcpIncoming;
@@ -31,15 +27,9 @@ use crate::peers::rpc_service::PeerManagerRpcService;
use crate::peers::PacketRecvChanReceiver; use crate::peers::PacketRecvChanReceiver;
use crate::rpc::vpn_portal_rpc_server::VpnPortalRpc; use crate::rpc::vpn_portal_rpc_server::VpnPortalRpc;
use crate::rpc::{GetVpnPortalInfoRequest, GetVpnPortalInfoResponse, VpnPortalInfo}; use crate::rpc::{GetVpnPortalInfoRequest, GetVpnPortalInfoResponse, VpnPortalInfo};
use crate::tunnel::packet_def::ZCPacket;
use crate::tunnel::{ZCPacketSink, ZCPacketStream};
use crate::vpn_portal::{self, VpnPortal}; use crate::vpn_portal::{self, VpnPortal};
use super::listeners::ListenerManager; use super::listeners::ListenerManager;
use super::virtual_nic;
use crate::common::ifcfg::IfConfiguerTrait;
#[derive(Clone)] #[derive(Clone)]
struct IpProxy { struct IpProxy {
@@ -82,200 +72,21 @@ impl IpProxy {
} }
} }
struct NicCtx { #[cfg(feature = "tun")]
global_ctx: ArcGlobalCtx, type NicCtx = super::virtual_nic::NicCtx;
peer_mgr: Weak<PeerManager>, #[cfg(not(feature = "tun"))]
peer_packet_receiver: Arc<Mutex<PacketRecvChanReceiver>>, struct NicCtx;
#[cfg(not(feature = "tun"))]
nic: Arc<Mutex<virtual_nic::VirtualNic>>,
tasks: JoinSet<()>,
}
impl NicCtx { impl NicCtx {
fn new( pub fn new(
global_ctx: ArcGlobalCtx, _global_ctx: ArcGlobalCtx,
peer_manager: &Arc<PeerManager>, _peer_manager: &Arc<PeerManager>,
peer_packet_receiver: Arc<Mutex<PacketRecvChanReceiver>>, _peer_packet_receiver: Arc<Mutex<PacketRecvChanReceiver>>,
) -> Self { ) -> Self {
NicCtx { Self
global_ctx: global_ctx.clone(),
peer_mgr: Arc::downgrade(&peer_manager),
peer_packet_receiver,
nic: Arc::new(Mutex::new(virtual_nic::VirtualNic::new(global_ctx))),
tasks: JoinSet::new(),
}
} }
async fn assign_ipv4_to_tun_device(&self, ipv4_addr: Ipv4Addr) -> Result<(), Error> { pub async fn run(&mut self, _ipv4_addr: Ipv4Addr) -> Result<(), Error> {
let nic = self.nic.lock().await;
nic.link_up().await?;
nic.remove_ip(None).await?;
nic.add_ip(ipv4_addr, 24).await?;
if cfg!(target_os = "macos") {
nic.add_route(ipv4_addr, 24).await?;
}
Ok(())
}
async fn do_forward_nic_to_peers_ipv4(ret: ZCPacket, mgr: &PeerManager) {
if let Some(ipv4) = Ipv4Packet::new(ret.payload()) {
if ipv4.get_version() != 4 {
tracing::info!("[USER_PACKET] not ipv4 packet: {:?}", ipv4);
return;
}
let dst_ipv4 = ipv4.get_destination();
tracing::trace!(
?ret,
"[USER_PACKET] recv new packet from tun device and forward to peers."
);
// TODO: use zero-copy
let send_ret = mgr.send_msg_ipv4(ret, dst_ipv4).await;
if send_ret.is_err() {
tracing::trace!(?send_ret, "[USER_PACKET] send_msg_ipv4 failed")
}
} else {
tracing::warn!(?ret, "[USER_PACKET] not ipv4 packet");
}
}
fn do_forward_nic_to_peers(
&mut self,
mut stream: Pin<Box<dyn ZCPacketStream>>,
) -> Result<(), Error> {
// read from nic and write to corresponding tunnel
let Some(mgr) = self.peer_mgr.upgrade() else {
return Err(anyhow::anyhow!("peer manager not available").into());
};
self.tasks.spawn(async move {
while let Some(ret) = stream.next().await {
if ret.is_err() {
log::error!("read from nic failed: {:?}", ret);
break;
}
Self::do_forward_nic_to_peers_ipv4(ret.unwrap(), mgr.as_ref()).await;
}
});
Ok(())
}
fn do_forward_peers_to_nic(&mut self, mut sink: Pin<Box<dyn ZCPacketSink>>) {
let channel = self.peer_packet_receiver.clone();
self.tasks.spawn(async move {
// unlock until coroutine finished
let mut channel = channel.lock().await;
while let Some(packet) = channel.recv().await {
tracing::trace!(
"[USER_PACKET] forward packet from peers to nic. packet: {:?}",
packet
);
let ret = sink.send(packet).await;
if ret.is_err() {
tracing::error!(?ret, "do_forward_tunnel_to_nic sink error");
}
}
});
}
async fn run_proxy_cidrs_route_updater(&mut self) -> Result<(), Error> {
let Some(peer_mgr) = self.peer_mgr.upgrade() else {
return Err(anyhow::anyhow!("peer manager not available").into());
};
let global_ctx = self.global_ctx.clone();
let net_ns = self.global_ctx.net_ns.clone();
let nic = self.nic.lock().await;
let ifcfg = nic.get_ifcfg();
let ifname = nic.ifname().to_owned();
self.tasks.spawn(async move {
let mut cur_proxy_cidrs = vec![];
loop {
let mut proxy_cidrs = vec![];
let routes = peer_mgr.list_routes().await;
for r in routes {
for cidr in r.proxy_cidrs {
let Ok(cidr) = cidr.parse::<cidr::Ipv4Cidr>() else {
continue;
};
proxy_cidrs.push(cidr);
}
}
// add vpn portal cidr to proxy_cidrs
if let Some(vpn_cfg) = global_ctx.config.get_vpn_portal_config() {
proxy_cidrs.push(vpn_cfg.client_cidr);
}
// if route is in cur_proxy_cidrs but not in proxy_cidrs, delete it.
for cidr in cur_proxy_cidrs.iter() {
if proxy_cidrs.contains(cidr) {
continue;
}
let _g = net_ns.guard();
let ret = ifcfg
.remove_ipv4_route(
ifname.as_str(),
cidr.first_address(),
cidr.network_length(),
)
.await;
if ret.is_err() {
tracing::trace!(
cidr = ?cidr,
err = ?ret,
"remove route failed.",
);
}
}
for cidr in proxy_cidrs.iter() {
if cur_proxy_cidrs.contains(cidr) {
continue;
}
let _g = net_ns.guard();
let ret = ifcfg
.add_ipv4_route(
ifname.as_str(),
cidr.first_address(),
cidr.network_length(),
)
.await;
if ret.is_err() {
tracing::trace!(
cidr = ?cidr,
err = ?ret,
"add route failed.",
);
}
}
cur_proxy_cidrs = proxy_cidrs;
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
}
});
Ok(())
}
async fn run(&mut self, ipv4_addr: Ipv4Addr) -> Result<(), Error> {
let tunnel = {
let mut nic = self.nic.lock().await;
let ret = nic.create_dev().await?;
self.global_ctx
.issue_event(GlobalCtxEvent::TunDeviceReady(nic.ifname().to_string()));
ret
};
let (stream, sink) = tunnel.split();
self.do_forward_nic_to_peers(stream)?;
self.do_forward_peers_to_nic(sink);
self.assign_ipv4_to_tun_device(ipv4_addr).await?;
self.run_proxy_cidrs_route_updater().await?;
Ok(()) Ok(())
} }
} }
@@ -311,7 +122,7 @@ impl Instance {
pub fn new(config: impl ConfigLoader + Send + Sync + 'static) -> Self { pub fn new(config: impl ConfigLoader + Send + Sync + 'static) -> Self {
let global_ctx = Arc::new(GlobalCtx::new(config)); let global_ctx = Arc::new(GlobalCtx::new(config));
log::info!( tracing::info!(
"[INIT] instance creating. config: {}", "[INIT] instance creating. config: {}",
global_ctx.config.dump() global_ctx.config.dump()
); );
@@ -584,7 +395,7 @@ impl Instance {
pub async fn wait(&mut self) { pub async fn wait(&mut self) {
while let Some(ret) = self.tasks.join_next().await { while let Some(ret) = self.tasks.join_next().await {
log::info!("task finished: {:?}", ret); tracing::info!("task finished: {:?}", ret);
ret.unwrap(); ret.unwrap();
} }
} }
+1 -1
View File
@@ -171,7 +171,7 @@ impl<H: TunnelHandlerForListener + Send + Sync + 'static + Debug> ListenerManage
for listener in &self.listeners { for listener in &self.listeners {
let _guard = self.net_ns.guard(); let _guard = self.net_ns.guard();
let addr = listener.inner.lock().await.local_url(); let addr = listener.inner.lock().await.local_url();
log::warn!("run listener: {:?}", listener); tracing::warn!("run listener: {:?}", listener);
listener listener
.inner .inner
.lock() .lock()
+3
View File
@@ -1,4 +1,7 @@
pub mod instance; pub mod instance;
pub mod listeners; pub mod listeners;
#[cfg(feature = "tun")]
pub mod tun_codec; pub mod tun_codec;
#[cfg(feature = "tun")]
pub mod virtual_nic; pub mod virtual_nic;
+211 -4
View File
@@ -2,27 +2,34 @@ use std::{
io, io,
net::Ipv4Addr, net::Ipv4Addr,
pin::Pin, pin::Pin,
sync::{Arc, Weak},
task::{Context, Poll}, task::{Context, Poll},
}; };
use crate::{ use crate::{
common::{ common::{
error::Error, error::Error,
global_ctx::ArcGlobalCtx, global_ctx::{ArcGlobalCtx, GlobalCtxEvent},
ifcfg::{IfConfiger, IfConfiguerTrait}, ifcfg::{IfConfiger, IfConfiguerTrait},
}, },
peers::{peer_manager::PeerManager, PacketRecvChanReceiver},
tunnel::{ tunnel::{
common::{reserve_buf, FramedWriter, TunnelWrapper, ZCPacketToBytes}, common::{reserve_buf, FramedWriter, TunnelWrapper, ZCPacketToBytes},
packet_def::{ZCPacket, ZCPacketType, TAIL_RESERVED_SIZE}, packet_def::{ZCPacket, ZCPacketType, TAIL_RESERVED_SIZE},
StreamItem, Tunnel, TunnelError, StreamItem, Tunnel, TunnelError, ZCPacketSink, ZCPacketStream,
}, },
}; };
use byteorder::WriteBytesExt as _; use byteorder::WriteBytesExt as _;
use bytes::{BufMut, BytesMut}; use bytes::{BufMut, BytesMut};
use futures::{lock::BiLock, ready, Stream}; use futures::{lock::BiLock, ready, SinkExt, Stream, StreamExt};
use pin_project_lite::pin_project; use pin_project_lite::pin_project;
use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; use pnet::packet::ipv4::Ipv4Packet;
use tokio::{
io::{AsyncRead, AsyncWrite, ReadBuf},
sync::Mutex,
task::JoinSet,
};
use tokio_util::bytes::Bytes; use tokio_util::bytes::Bytes;
use tun::{create_as_async, AsyncDevice, Configuration, Device as _, Layer}; use tun::{create_as_async, AsyncDevice, Configuration, Device as _, Layer};
use zerocopy::{NativeEndian, NetworkEndian}; use zerocopy::{NativeEndian, NetworkEndian};
@@ -382,6 +389,206 @@ impl VirtualNic {
IfConfiger {} IfConfiger {}
} }
} }
pub struct NicCtx {
global_ctx: ArcGlobalCtx,
peer_mgr: Weak<PeerManager>,
peer_packet_receiver: Arc<Mutex<PacketRecvChanReceiver>>,
nic: Arc<Mutex<VirtualNic>>,
tasks: JoinSet<()>,
}
impl NicCtx {
pub fn new(
global_ctx: ArcGlobalCtx,
peer_manager: &Arc<PeerManager>,
peer_packet_receiver: Arc<Mutex<PacketRecvChanReceiver>>,
) -> Self {
NicCtx {
global_ctx: global_ctx.clone(),
peer_mgr: Arc::downgrade(&peer_manager),
peer_packet_receiver,
nic: Arc::new(Mutex::new(VirtualNic::new(global_ctx))),
tasks: JoinSet::new(),
}
}
async fn assign_ipv4_to_tun_device(&self, ipv4_addr: Ipv4Addr) -> Result<(), Error> {
let nic = self.nic.lock().await;
nic.link_up().await?;
nic.remove_ip(None).await?;
nic.add_ip(ipv4_addr, 24).await?;
if cfg!(target_os = "macos") {
nic.add_route(ipv4_addr, 24).await?;
}
Ok(())
}
async fn do_forward_nic_to_peers_ipv4(ret: ZCPacket, mgr: &PeerManager) {
if let Some(ipv4) = Ipv4Packet::new(ret.payload()) {
if ipv4.get_version() != 4 {
tracing::info!("[USER_PACKET] not ipv4 packet: {:?}", ipv4);
return;
}
let dst_ipv4 = ipv4.get_destination();
tracing::trace!(
?ret,
"[USER_PACKET] recv new packet from tun device and forward to peers."
);
// TODO: use zero-copy
let send_ret = mgr.send_msg_ipv4(ret, dst_ipv4).await;
if send_ret.is_err() {
tracing::trace!(?send_ret, "[USER_PACKET] send_msg_ipv4 failed")
}
} else {
tracing::warn!(?ret, "[USER_PACKET] not ipv4 packet");
}
}
fn do_forward_nic_to_peers(
&mut self,
mut stream: Pin<Box<dyn ZCPacketStream>>,
) -> Result<(), Error> {
// read from nic and write to corresponding tunnel
let Some(mgr) = self.peer_mgr.upgrade() else {
return Err(anyhow::anyhow!("peer manager not available").into());
};
self.tasks.spawn(async move {
while let Some(ret) = stream.next().await {
if ret.is_err() {
tracing::error!("read from nic failed: {:?}", ret);
break;
}
Self::do_forward_nic_to_peers_ipv4(ret.unwrap(), mgr.as_ref()).await;
}
});
Ok(())
}
fn do_forward_peers_to_nic(&mut self, mut sink: Pin<Box<dyn ZCPacketSink>>) {
let channel = self.peer_packet_receiver.clone();
self.tasks.spawn(async move {
// unlock until coroutine finished
let mut channel = channel.lock().await;
while let Some(packet) = channel.recv().await {
tracing::trace!(
"[USER_PACKET] forward packet from peers to nic. packet: {:?}",
packet
);
let ret = sink.send(packet).await;
if ret.is_err() {
tracing::error!(?ret, "do_forward_tunnel_to_nic sink error");
}
}
});
}
async fn run_proxy_cidrs_route_updater(&mut self) -> Result<(), Error> {
let Some(peer_mgr) = self.peer_mgr.upgrade() else {
return Err(anyhow::anyhow!("peer manager not available").into());
};
let global_ctx = self.global_ctx.clone();
let net_ns = self.global_ctx.net_ns.clone();
let nic = self.nic.lock().await;
let ifcfg = nic.get_ifcfg();
let ifname = nic.ifname().to_owned();
self.tasks.spawn(async move {
let mut cur_proxy_cidrs = vec![];
loop {
let mut proxy_cidrs = vec![];
let routes = peer_mgr.list_routes().await;
for r in routes {
for cidr in r.proxy_cidrs {
let Ok(cidr) = cidr.parse::<cidr::Ipv4Cidr>() else {
continue;
};
proxy_cidrs.push(cidr);
}
}
// add vpn portal cidr to proxy_cidrs
if let Some(vpn_cfg) = global_ctx.config.get_vpn_portal_config() {
proxy_cidrs.push(vpn_cfg.client_cidr);
}
// if route is in cur_proxy_cidrs but not in proxy_cidrs, delete it.
for cidr in cur_proxy_cidrs.iter() {
if proxy_cidrs.contains(cidr) {
continue;
}
let _g = net_ns.guard();
let ret = ifcfg
.remove_ipv4_route(
ifname.as_str(),
cidr.first_address(),
cidr.network_length(),
)
.await;
if ret.is_err() {
tracing::trace!(
cidr = ?cidr,
err = ?ret,
"remove route failed.",
);
}
}
for cidr in proxy_cidrs.iter() {
if cur_proxy_cidrs.contains(cidr) {
continue;
}
let _g = net_ns.guard();
let ret = ifcfg
.add_ipv4_route(
ifname.as_str(),
cidr.first_address(),
cidr.network_length(),
)
.await;
if ret.is_err() {
tracing::trace!(
cidr = ?cidr,
err = ?ret,
"add route failed.",
);
}
}
cur_proxy_cidrs = proxy_cidrs;
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
}
});
Ok(())
}
pub async fn run(&mut self, ipv4_addr: Ipv4Addr) -> Result<(), Error> {
let tunnel = {
let mut nic = self.nic.lock().await;
let ret = nic.create_dev().await?;
self.global_ctx
.issue_event(GlobalCtxEvent::TunDeviceReady(nic.ifname().to_string()));
ret
};
let (stream, sink) = tunnel.split();
self.do_forward_nic_to_peers(stream)?;
self.do_forward_peers_to_nic(sink);
self.assign_ipv4_to_tun_device(ipv4_addr).await?;
self.run_proxy_cidrs_route_updater().await?;
Ok(())
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::common::{error::Error, global_ctx::tests::get_mock_global_ctx}; use crate::common::{error::Error, global_ctx::tests::get_mock_global_ctx};
+2 -2
View File
@@ -169,7 +169,7 @@ impl PeerConn {
match self.wait_handshake(&mut need_retry).await { match self.wait_handshake(&mut need_retry).await {
Ok(rsp) => return Ok(rsp), Ok(rsp) => return Ok(rsp),
Err(e) => { Err(e) => {
log::warn!("wait handshake error: {:?}", e); tracing::warn!("wait handshake error: {:?}", e);
if !need_retry { if !need_retry {
return Err(e); return Err(e);
} }
@@ -313,7 +313,7 @@ impl PeerConn {
tracing::warn!(?pingpong, "pingpong task exit"); tracing::warn!(?pingpong, "pingpong task exit");
if let Err(e) = close_event_sender.send(conn_id).await { if let Err(e) = close_event_sender.send(conn_id).await {
log::warn!("close event sender error: {:?}", e); tracing::warn!("close event sender error: {:?}", e);
} }
Ok(()) Ok(())
+2 -2
View File
@@ -333,7 +333,7 @@ impl PeerManager {
let foreign_client = self.foreign_network_client.clone(); let foreign_client = self.foreign_network_client.clone();
let encryptor = self.encryptor.clone(); let encryptor = self.encryptor.clone();
self.tasks.lock().await.spawn(async move { self.tasks.lock().await.spawn(async move {
log::trace!("start_peer_recv"); tracing::trace!("start_peer_recv");
while let Some(mut ret) = recv.next().await { while let Some(mut ret) = recv.next().await {
let Some(hdr) = ret.mut_peer_manager_header() else { let Some(hdr) = ret.mut_peer_manager_header() else {
tracing::warn!(?ret, "invalid packet, skip"); tracing::warn!(?ret, "invalid packet, skip");
@@ -572,7 +572,7 @@ impl PeerManager {
} }
pub async fn send_msg_ipv4(&self, mut msg: ZCPacket, ipv4_addr: Ipv4Addr) -> Result<(), Error> { pub async fn send_msg_ipv4(&self, mut msg: ZCPacket, ipv4_addr: Ipv4Addr) -> Result<(), Error> {
log::trace!( tracing::trace!(
"do send_msg in peer manager, msg: {:?}, ipv4_addr: {}", "do send_msg in peer manager, msg: {:?}, ipv4_addr: {}",
msg, msg,
ipv4_addr ipv4_addr
+1 -1
View File
@@ -83,7 +83,7 @@ impl PeerMap {
peer.send_msg(msg).await?; peer.send_msg(msg).await?;
} }
None => { None => {
log::error!("no peer for dst_peer_id: {}", dst_peer_id); tracing::error!("no peer for dst_peer_id: {}", dst_peer_id);
return Err(Error::RouteError(Some(format!( return Err(Error::RouteError(Some(format!(
"peer map sengmsg directly no connected dst_peer_id: {}", "peer map sengmsg directly no connected dst_peer_id: {}",
dst_peer_id dst_peer_id
+12 -12
View File
@@ -258,14 +258,14 @@ impl BasicRoute {
.clone(); .clone();
if ret.cost > 6 { if ret.cost > 6 {
log::error!( tracing::error!(
"cost too large: {}, may lost connection, remove it", "cost too large: {}, may lost connection, remove it",
ret.cost ret.cost
); );
route_table.route_info.remove(&node_id); route_table.route_info.remove(&node_id);
} }
log::trace!( tracing::trace!(
"update route info, to: {:?}, gateway: {:?}, cost: {}, peer: {:?}", "update route info, to: {:?}, gateway: {:?}, cost: {}, peer: {:?}",
node_id, node_id,
peer_id, peer_id,
@@ -292,13 +292,13 @@ impl BasicRoute {
continue; continue;
} }
update(neighbor.cost + 1, &neighbor); update(neighbor.cost + 1, &neighbor);
log::trace!("route info: {:?}", neighbor); tracing::trace!("route info: {:?}", neighbor);
} }
// add the sender peer to route info // add the sender peer to route info
update(1, &packet.myself); update(1, &packet.myself);
log::trace!("my_id: {:?}, current route table: {:?}", my_id, route_table); tracing::trace!("my_id: {:?}, current route table: {:?}", my_id, route_table);
} }
async fn send_sync_peer_request( async fn send_sync_peer_request(
@@ -393,13 +393,13 @@ impl BasicRoute {
match &ret { match &ret {
Ok(_) => { Ok(_) => {
log::trace!("send sync peer request to peer: {}", peer); tracing::trace!("send sync peer request to peer: {}", peer);
} }
Err(Error::PeerNoConnectionError(_)) => { Err(Error::PeerNoConnectionError(_)) => {
log::trace!("peer {} no connection", peer); tracing::trace!("peer {} no connection", peer);
} }
Err(e) => { Err(e) => {
log::error!( tracing::error!(
"send sync peer request to peer: {} error: {:?}", "send sync peer request to peer: {} error: {:?}",
peer, peer,
e e
@@ -416,10 +416,10 @@ impl BasicRoute {
tokio::select! { tokio::select! {
_ = notifier.notified() => { _ = notifier.notified() => {
log::trace!("sync peer request triggered by notifier"); tracing::trace!("sync peer request triggered by notifier");
} }
_ = tokio::time::sleep(Duration::from_secs(1)) => { _ = tokio::time::sleep(Duration::from_secs(1)) => {
log::trace!("sync peer request triggered by timeout"); tracing::trace!("sync peer request triggered by timeout");
} }
} }
} }
@@ -454,7 +454,7 @@ impl BasicRoute {
} }
for k in need_remove.iter() { for k in need_remove.iter() {
log::warn!("remove expired sync peer: {:?}", k); tracing::warn!("remove expired sync peer: {:?}", k);
sync_peer_from_remote.remove(k); sync_peer_from_remote.remove(k);
} }
@@ -565,7 +565,7 @@ impl Route for BasicRoute {
return Some(info.peer_id.clone().into()); return Some(info.peer_id.clone().into());
} }
None => { None => {
log::error!("no route info for dst_peer_id: {}", dst_peer_id); tracing::error!("no route info for dst_peer_id: {}", dst_peer_id);
return None; return None;
} }
} }
@@ -612,7 +612,7 @@ impl Route for BasicRoute {
return Some(peer_id); return Some(peer_id);
} }
log::info!("no peer id for ipv4: {}", ipv4_addr); tracing::info!("no peer id for ipv4: {}", ipv4_addr);
return None; return None;
} }
} }
+3 -3
View File
@@ -302,7 +302,7 @@ impl PeerRpcManager {
); );
} }
log::info!( tracing::info!(
"[PEER RPC MGR] register service {} succeed, my_node_id {}", "[PEER RPC MGR] register service {} succeed, my_node_id {}",
service_id, service_id,
self.tspt.my_peer_id() self.tspt.my_peer_id()
@@ -374,7 +374,7 @@ impl PeerRpcManager {
if info.is_req { if info.is_req {
if !service_registry.contains_key(&info.service_id) { if !service_registry.contains_key(&info.service_id) {
log::warn!( tracing::warn!(
"service {} not found, my_node_id: {}", "service {} not found, my_node_id: {}",
info.service_id, info.service_id,
tspt.my_peer_id() tspt.my_peer_id()
@@ -407,7 +407,7 @@ impl PeerRpcManager {
tracing::error!(error = ?e, "send resp to client failed"); tracing::error!(error = ?e, "send resp to client failed");
} }
} else { } else {
log::warn!("client resp receiver not found, info: {:?}", info); tracing::warn!("client resp receiver not found, info: {:?}", info);
} }
} }
} }
+1 -2
View File
@@ -67,7 +67,6 @@ pub async fn init_three_node_ex<F: Fn(TomlConfigLoader) -> TomlConfigLoader>(
proto: &str, proto: &str,
cfg_cb: F, cfg_cb: F,
) -> Vec<Instance> { ) -> Vec<Instance> {
log::set_max_level(log::LevelFilter::Info);
prepare_linux_namespaces(); prepare_linux_namespaces();
let mut inst1 = Instance::new(cfg_cb(get_inst_config( let mut inst1 = Instance::new(cfg_cb(get_inst_config(
@@ -559,7 +558,7 @@ fn run_wireguard_client(
// Peer secret key // Peer secret key
let mut peer = Peer::new(peer_public_key.clone()); let mut peer = Peer::new(peer_public_key.clone());
log::info!("endpoint"); tracing::info!("endpoint");
// Peer endpoint and interval // Peer endpoint and interval
peer.endpoint = Some(endpoint); peer.endpoint = Some(endpoint);
peer.persistent_keepalive_interval = Some(1); peer.persistent_keepalive_interval = Some(1);
+1 -1
View File
@@ -343,7 +343,7 @@ pub(crate) fn get_interface_name_by_ip(local_ip: &IpAddr) -> Option<String> {
pub(crate) fn setup_sokcet2_ext( pub(crate) fn setup_sokcet2_ext(
socket2_socket: &socket2::Socket, socket2_socket: &socket2::Socket,
bind_addr: &SocketAddr, bind_addr: &SocketAddr,
bind_dev: Option<String>, #[allow(unused_variables)] bind_dev: Option<String>,
) -> Result<(), TunnelError> { ) -> Result<(), TunnelError> {
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
{ {
+4 -4
View File
@@ -288,7 +288,7 @@ impl RingTunnelListener {
#[async_trait] #[async_trait]
impl TunnelListener for RingTunnelListener { impl TunnelListener for RingTunnelListener {
async fn listen(&mut self) -> Result<(), TunnelError> { async fn listen(&mut self) -> Result<(), TunnelError> {
log::info!("listen new conn of key: {}", self.listerner_addr); tracing::info!("listen new conn of key: {}", self.listerner_addr);
CONNECTION_MAP CONNECTION_MAP
.lock() .lock()
.await .await
@@ -297,11 +297,11 @@ impl TunnelListener for RingTunnelListener {
} }
async fn accept(&mut self) -> Result<Box<dyn Tunnel>, TunnelError> { async fn accept(&mut self) -> Result<Box<dyn Tunnel>, TunnelError> {
log::info!("waiting accept new conn of key: {}", self.listerner_addr); tracing::info!("waiting accept new conn of key: {}", self.listerner_addr);
let my_addr = self.get_addr()?; let my_addr = self.get_addr()?;
if let Some(conn) = self.conn_receiver.recv().await { if let Some(conn) = self.conn_receiver.recv().await {
if conn.server.id == my_addr { if conn.server.id == my_addr {
log::info!("accept new conn of key: {}", self.listerner_addr); tracing::info!("accept new conn of key: {}", self.listerner_addr);
return Ok(Box::new(get_tunnel_for_server(conn))); return Ok(Box::new(get_tunnel_for_server(conn)));
} else { } else {
tracing::error!(?conn.server.id, ?my_addr, "got new conn with wrong id"); tracing::error!(?conn.server.id, ?my_addr, "got new conn with wrong id");
@@ -341,7 +341,7 @@ impl TunnelConnector for RingTunnelConnector {
.get(&remote_addr) .get(&remote_addr)
.unwrap() .unwrap()
.clone(); .clone();
log::info!("connecting"); tracing::info!("connecting");
let conn = Arc::new(Connection { let conn = Arc::new(Connection {
client: Arc::new(RingTunnel::new(RING_TUNNEL_CAP)), client: Arc::new(RingTunnel::new(RING_TUNNEL_CAP)),
server: Arc::new(RingTunnel::new_with_id( server: Arc::new(RingTunnel::new_with_id(
+2 -2
View File
@@ -429,7 +429,7 @@ impl TunnelListener for UdpTunnelListener {
} }
async fn accept(&mut self) -> Result<Box<dyn super::Tunnel>, super::TunnelError> { async fn accept(&mut self) -> Result<Box<dyn super::Tunnel>, super::TunnelError> {
log::info!("start udp accept: {:?}", self.addr); tracing::info!("start udp accept: {:?}", self.addr);
while let Some(conn) = self.conn_recv.recv().await { while let Some(conn) = self.conn_recv.recv().await {
return Ok(conn); return Ok(conn);
} }
@@ -619,7 +619,7 @@ impl UdpTunnelConnector {
socket: Arc<UdpSocket>, socket: Arc<UdpSocket>,
addr: SocketAddr, addr: SocketAddr,
) -> Result<Box<dyn super::Tunnel>, super::TunnelError> { ) -> Result<Box<dyn super::Tunnel>, super::TunnelError> {
log::warn!("udp connect: {:?}", self.addr); tracing::warn!("udp connect: {:?}", self.addr);
#[cfg(target_os = "windows")] #[cfg(target_os = "windows")]
crate::arch::windows::disable_connection_reset(socket.as_ref())?; crate::arch::windows::disable_connection_reset(socket.as_ref())?;