mirror of
https://github.com/tun2proxy/tun2proxy.git
synced 2025-06-20 16:10:52 +00:00
optimize and fix
This commit is contained in:
parent
b21d7a6c2c
commit
8d3533e327
3 changed files with 25 additions and 5 deletions
|
@ -178,7 +178,11 @@ pub fn parse_udp(udp_mtu: u16, data_len: usize, data: &[u8]) -> Result<(&[u8], u
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn process_udp(addr: SocketAddr, udp_timeout: u64, tx: Sender<Vec<u8>>, con: &mut UdpRequest) -> Result<()> {
|
async fn process_udp(addr: SocketAddr, udp_timeout: u64, tx: Sender<Vec<u8>>, con: &mut UdpRequest) -> Result<()> {
|
||||||
let std_sock = std::net::UdpSocket::bind("0.0.0.0:0")?;
|
let std_sock = if con.flags & UDPGW_FLAG_IPV6 != 0 {
|
||||||
|
std::net::UdpSocket::bind("[::]:0")?
|
||||||
|
} else {
|
||||||
|
std::net::UdpSocket::bind("0.0.0.0:0")?
|
||||||
|
};
|
||||||
std_sock.set_nonblocking(true)?;
|
std_sock.set_nonblocking(true)?;
|
||||||
#[cfg(target_os = "linux")]
|
#[cfg(target_os = "linux")]
|
||||||
nix::sys::socket::setsockopt(&std_sock, nix::sys::socket::sockopt::ReuseAddr, &true)?;
|
nix::sys::socket::setsockopt(&std_sock, nix::sys::socket::sockopt::ReuseAddr, &true)?;
|
||||||
|
|
|
@ -579,6 +579,11 @@ async fn handle_udp_gateway_session(
|
||||||
server_stream.update_activity();
|
server_stream.update_activity();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
UdpGwResponse::TcpClose => {
|
||||||
|
log::error!("Ending {} <- {} with tcp closed", udpinfo, &tcp_local_addr);
|
||||||
|
server_stream.close();
|
||||||
|
break;
|
||||||
|
}
|
||||||
UdpGwResponse::Data(data) => {
|
UdpGwResponse::Data(data) => {
|
||||||
let len = data.len();
|
let len = data.len();
|
||||||
log::debug!("{} <- {} receive udpgw len {}", udpinfo, &tcp_local_addr,len);
|
log::debug!("{} <- {} receive udpgw len {}", udpinfo, &tcp_local_addr,len);
|
||||||
|
|
19
src/udpgw.rs
19
src/udpgw.rs
|
@ -4,6 +4,7 @@ use std::collections::VecDeque;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
|
use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr, SocketAddrV4, SocketAddrV6};
|
||||||
|
use std::sync::atomic::Ordering::Relaxed;
|
||||||
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
use tokio::io::{AsyncReadExt, AsyncWriteExt};
|
||||||
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
|
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
|
||||||
use tokio::net::TcpStream;
|
use tokio::net::TcpStream;
|
||||||
|
@ -17,6 +18,8 @@ pub const UDPGW_FLAG_IPV6: u8 = 0x08;
|
||||||
pub const UDPGW_FLAG_DOMAIN: u8 = 0x10;
|
pub const UDPGW_FLAG_DOMAIN: u8 = 0x10;
|
||||||
pub const UDPGW_FLAG_ERR: u8 = 0x20;
|
pub const UDPGW_FLAG_ERR: u8 = 0x20;
|
||||||
|
|
||||||
|
static TCP_COUNTER: std::sync::atomic::AtomicU32 = std::sync::atomic::AtomicU32::new(0);
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[repr(packed(1))]
|
#[repr(packed(1))]
|
||||||
|
@ -103,6 +106,7 @@ impl<'a> UdpGwData<'a> {
|
||||||
pub(crate) enum UdpGwResponse<'a> {
|
pub(crate) enum UdpGwResponse<'a> {
|
||||||
KeepAlive,
|
KeepAlive,
|
||||||
Error,
|
Error,
|
||||||
|
TcpClose,
|
||||||
Data(UdpGwData<'a>),
|
Data(UdpGwData<'a>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,6 +133,12 @@ pub(crate) struct UdpGwClientStream {
|
||||||
last_activity: std::time::Instant,
|
last_activity: std::time::Instant,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Drop for UdpGwClientStream {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
TCP_COUNTER.fetch_sub(1, Relaxed);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl UdpGwClientStream {
|
impl UdpGwClientStream {
|
||||||
pub fn close(&mut self) {
|
pub fn close(&mut self) {
|
||||||
self.closed = true;
|
self.closed = true;
|
||||||
|
@ -184,6 +194,7 @@ impl UdpGwClientStream {
|
||||||
inner: rx,
|
inner: rx,
|
||||||
recv_buf: vec![0; udp_mtu.into()],
|
recv_buf: vec![0; udp_mtu.into()],
|
||||||
};
|
};
|
||||||
|
TCP_COUNTER.fetch_add(1, Relaxed);
|
||||||
UdpGwClientStream {
|
UdpGwClientStream {
|
||||||
local_addr,
|
local_addr,
|
||||||
reader: Some(reader),
|
reader: Some(reader),
|
||||||
|
@ -232,7 +243,7 @@ impl UdpGwClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn is_full(&self) -> bool {
|
pub(crate) async fn is_full(&self) -> bool {
|
||||||
self.server_connections.lock().await.len() >= self.max_connections as usize
|
TCP_COUNTER.load(Relaxed) >= self.max_connections as u32
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) async fn get_server_connection(&self) -> Option<UdpGwClientStream> {
|
pub(crate) async fn get_server_connection(&self) -> Option<UdpGwClientStream> {
|
||||||
|
@ -411,7 +422,7 @@ impl UdpGwClient {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
match result {
|
match result {
|
||||||
Ok(0) => Err(("tcp connection closed").into()),
|
Ok(0) => Ok(UdpGwResponse::TcpClose),
|
||||||
Ok(n) => {
|
Ok(n) => {
|
||||||
if n < std::mem::size_of::<PackLenHeader>() {
|
if n < std::mem::size_of::<PackLenHeader>() {
|
||||||
return Err("received PackLenHeader error".into());
|
return Err("received PackLenHeader error".into());
|
||||||
|
@ -425,12 +436,12 @@ impl UdpGwClient {
|
||||||
while left_len > 0 {
|
while left_len > 0 {
|
||||||
if let Ok(len) = stream.inner.read(&mut stream.recv_buf[recv_len..left_len]).await {
|
if let Ok(len) = stream.inner.read(&mut stream.recv_buf[recv_len..left_len]).await {
|
||||||
if len == 0 {
|
if len == 0 {
|
||||||
return Err("tcp connection closed".into());
|
return Ok(UdpGwResponse::TcpClose);
|
||||||
}
|
}
|
||||||
recv_len += len;
|
recv_len += len;
|
||||||
left_len -= len;
|
left_len -= len;
|
||||||
} else {
|
} else {
|
||||||
return Err("tcp connection closed".into());
|
return Ok(UdpGwResponse::TcpClose);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return UdpGwClient::parse_udp_response(udp_mtu, packet_len as usize, stream);
|
return UdpGwClient::parse_udp_response(udp_mtu, packet_len as usize, stream);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue