allocation optimization and in place crypt

This commit is contained in:
2026-06-05 00:22:38 +07:00
parent 6cd4d001ad
commit 05696a836a
10 changed files with 234 additions and 183 deletions
+2 -2
View File
@@ -285,7 +285,7 @@ impl TcpConnection {
socket_id,
dst_ip,
dst_port,
data.to_vec(),
data
);
if tx_tunnel.send(data_frame).await.is_err() {
@@ -391,7 +391,7 @@ impl UdpConnection {
while let Some((data, ip, port)) = rx_smol.recv().await {
let data_frame =
RawCastFrame::data(LocalProtocol::Udp, socket_id, ip, port, data.to_vec());
RawCastFrame::data(LocalProtocol::Udp, socket_id, ip, port, data);
if tx_tunnel.send(data_frame).await.is_err() {
break;
}
+24 -11
View File
@@ -220,18 +220,31 @@ impl Engine {
) {
tokio::spawn(async move {
debug!("TUN Reader task started");
let mut buf = [0u8; 65536];
while let Ok(n) = reader.read(&mut buf).await {
if n == 0 {
break;
}
let mut token = TokenBuffer::with_capacity(n);
token.extend_from_slice(&buf[..n]);
if to_engine.send(token).is_ok() {
is_avail.store(true, Ordering::Release);
} else {
break;
loop {
// 1. Берем чистый буфер
let mut token = TokenBuffer::with_capacity(65536);
// 2. Используем временный срез для чтения
// Это гарантирует, что мы пишем в начало буфера
let mut temp_buf = [0u8; 65536];
match reader.read(&mut temp_buf).await {
Ok(n) if n > 0 => {
// 3. Копируем в наш TokenBuffer (это быстро, 64кБ - это L1 кэш)
token.extend_from_slice(&temp_buf[..n]);
if to_engine.send(token).is_ok() {
is_avail.store(true, Ordering::Release);
} else {
break;
}
}
Ok(_) => break, // EOF
Err(e) => {
error!("FATAL: TUN Reader task died with error: {}", e);
break;
}
}
}
});