From 13275aae994a42a22824e9f682c2de9215177838 Mon Sep 17 00:00:00 2001 From: Luna Yao <40349250+ZnqbuZ@users.noreply.github.com> Date: Sun, 22 Feb 2026 19:35:57 +0100 Subject: [PATCH] move bind_tcp_socket and bind_udp_socket to common --- easytier/src/gateway/socks5.rs | 47 ++++------------------------ easytier/src/tunnel/common.rs | 56 ++++++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 43 deletions(-) diff --git a/easytier/src/gateway/socks5.rs b/easytier/src/gateway/socks5.rs index ff31c4e9..ba9e6194 100644 --- a/easytier/src/gateway/socks5.rs +++ b/easytier/src/gateway/socks5.rs @@ -18,7 +18,7 @@ use crate::gateway::kcp_proxy::NatDstKcpConnector; use crate::{ common::{ config::PortForwardConfig, global_ctx::GlobalCtxEvent, join_joinset_background, - netns::NetNS, scoped_task::ScopedTask, + scoped_task::ScopedTask, }, gateway::{ fast_socks5::{ @@ -30,10 +30,7 @@ use crate::{ ip_reassembler::IpReassembler, tokio_smoltcp::{channel_device, BufferSize, Net, NetConfig}, }, - tunnel::{ - common::setup_sokcet2, - packet_def::{PacketType, ZCPacket}, - }, + tunnel::packet_def::{PacketType, ZCPacket}, }; use anyhow::Context; use dashmap::DashMap; @@ -42,21 +39,21 @@ use pnet::packet::{ }; use tokio::{ io::{AsyncRead, AsyncWrite}, - net::{TcpListener, TcpSocket, UdpSocket}, + net::{TcpListener, UdpSocket}, select, sync::{mpsc, Mutex, Notify}, task::JoinSet, time::timeout, }; +#[cfg(feature = "kcp")] +use super::tcp_proxy::NatDstConnector as _; +use crate::tunnel::common::{bind_tcp_socket, bind_udp_socket}; use crate::{ common::{error::Error, global_ctx::GlobalCtx}, peers::{peer_manager::PeerManager, PeerPacketFilter}, }; -#[cfg(feature = "kcp")] -use super::tcp_proxy::NatDstConnector as _; - enum SocksUdpSocket { UdpSocket(Arc), SmolUdpSocket(super::tokio_smoltcp::UdpSocket), @@ -332,38 +329,6 @@ impl AsyncTcpConnector for Socks5AutoConnector { } } -fn bind_tcp_socket(addr: SocketAddr, net_ns: NetNS) -> Result { - let _g = net_ns.guard(); - let socket2_socket = socket2::Socket::new( - socket2::Domain::for_address(addr), - socket2::Type::STREAM, - Some(socket2::Protocol::TCP), - )?; - - setup_sokcet2(&socket2_socket, &addr)?; - - let socket = TcpSocket::from_std_stream(socket2_socket.into()); - - if let Err(e) = socket.set_nodelay(true) { - tracing::warn!(?e, "set_nodelay fail in listen"); - } - - Ok(socket.listen(1024)?) -} - -fn bind_udp_socket(addr: SocketAddr, net_ns: NetNS) -> Result { - let _g = net_ns.guard(); - let socket2_socket = socket2::Socket::new( - socket2::Domain::for_address(addr), - socket2::Type::DGRAM, - Some(socket2::Protocol::UDP), - )?; - - setup_sokcet2(&socket2_socket, &addr)?; - - Ok(UdpSocket::from_std(socket2_socket.into())?) -} - struct Socks5ServerNet { ipv4_addr: cidr::Ipv4Inet, auth: Option, diff --git a/easytier/src/tunnel/common.rs b/easytier/src/tunnel/common.rs index b4c05ff5..fc0363ca 100644 --- a/easytier/src/tunnel/common.rs +++ b/easytier/src/tunnel/common.rs @@ -11,13 +11,15 @@ use network_interface::NetworkInterfaceConfig as _; use pin_project_lite::pin_project; use tokio::io::{AsyncRead, AsyncWrite, ReadBuf}; +use super::TunnelInfo; +use crate::common::error::Error; +use crate::common::netns::NetNS; use bytes::{Buf, BufMut, Bytes, BytesMut}; +use tokio::net::{TcpListener, TcpSocket, UdpSocket}; use tokio_stream::StreamExt; use tokio_util::io::poll_write_buf; use zerocopy::FromBytes as _; -use super::TunnelInfo; - use crate::tunnel::packet_def::{ZCPacket, PEER_MANAGER_HEADER_SIZE}; use super::{ @@ -439,6 +441,56 @@ pub(crate) fn setup_sokcet2( ) } +pub trait Bindable: Sized { + const TY: socket2::Type; + const PROTOCOL: Option; + + fn finalize(socket: socket2::Socket) -> Result; +} + +impl Bindable for TcpListener { + const TY: socket2::Type = socket2::Type::STREAM; + const PROTOCOL: Option = Some(socket2::Protocol::TCP); + + fn finalize(socket: socket2::Socket) -> Result { + let tcp_socket = TcpSocket::from_std_stream(socket.into()); + + if let Err(e) = tcp_socket.set_nodelay(true) { + tracing::warn!(?e, "set_nodelay fail in listen"); + } + + Ok(tcp_socket.listen(1024)?) + } +} + +impl Bindable for UdpSocket { + const TY: socket2::Type = socket2::Type::DGRAM; + const PROTOCOL: Option = Some(socket2::Protocol::UDP); + + fn finalize(socket: socket2::Socket) -> Result { + Ok(UdpSocket::from_std(socket.into())?) + } +} + +pub fn bind_socket(addr: SocketAddr, net_ns: Option) -> Result { + let _g = net_ns.map(|n| n.guard()); + + let socket2_socket = + socket2::Socket::new(socket2::Domain::for_address(addr), B::TY, B::PROTOCOL)?; + + setup_sokcet2(&socket2_socket, &addr)?; + + B::finalize(socket2_socket) +} + +pub fn bind_tcp_socket(addr: SocketAddr, net_ns: NetNS) -> Result { + bind_socket(addr, Some(net_ns)) +} + +pub fn bind_udp_socket(addr: SocketAddr, net_ns: NetNS) -> Result { + bind_socket(addr, Some(net_ns)) +} + pub fn reserve_buf(buf: &mut BytesMut, min_size: usize, max_size: usize) { if buf.capacity() < min_size { buf.reserve(max_size);