fixed dedadlocks and buffer changes

This commit is contained in:
2026-03-31 10:34:15 +07:00
parent 71acb52386
commit dadf165da6
10 changed files with 145 additions and 107 deletions
+6 -10
View File
@@ -129,8 +129,6 @@ impl TcpConnection {
}
fn poll_and_process(&mut self, socket: &mut tcp::Socket) {
let max_pending = NetworkConfig::global().tcp_max_pending;
// 1. Вычитываем данные из smoltcp и шлем в Muxer
while socket.can_recv() {
let mut full = false;
@@ -166,19 +164,17 @@ impl TcpConnection {
// 2. Читаем данные из Muxer'а
if !self.server_eof {
loop {
if self.pending_data.len() >= socket.send_capacity() {
break;
}
match self.core.rx.try_recv() {
Ok(data) => {
self.pending_data.extend_from_slice(&data);
if self.pending_data.len() >= max_pending {
break;
}
}
Err(mpsc::error::TryRecvError::Empty) => {
break;
}
Err(mpsc::error::TryRecvError::Empty) => break,
Err(mpsc::error::TryRecvError::Disconnected) => {
// ВАЖНО: Удаленный сервер прислал EOF!
debug!(%self.core.handle, "Server sent EOF (channel disconnected).");
debug!(%self.core.handle, "Server sent EOF");
self.server_eof = true;
break;
}
+2 -4
View File
@@ -144,7 +144,7 @@ impl SocketFactory {
443 | 80 | 8080 => max_buf,
22 => 32 * 1024,
53 => 16 * 1024,
_ => max_buf / 4,
_ => max_buf,
};
let mut socket = tcp::Socket::new(
@@ -240,9 +240,7 @@ impl ConnectionManager {
}
}
} else {
// Если это происходит во время Connecting - значит сервер шлет ответы,
// а клиент уже забыл про этот ID или еще не создал его.
error!(
trace!(
"👻 [Stream {}] ORPHAN packet from tunnel. ID mismatch?",
frame.socket_id
);
+3 -5
View File
@@ -99,19 +99,17 @@ impl Engine {
}
}
// 3. Если затора нет, читаем новые кадры из VPN-туннеля
if stuck_frame.is_none() {
while let Ok(frame) = self.rx_from_tunnel.try_recv() {
if let Err(returned_frame) = self.manager.try_inject_inbound(frame) {
stuck_frame = Some(returned_frame);
break; // СТОП! Локальный сокет переполнен, давим на тормоза!
stuck_frame = Some(returned_frame); // Возвращаем пакет в "заначку"
break; // ТОРМОЗИМ чтение туннеля, пока канал не освободится
}
}
}
// 4. Двигаем стейт-машину smoltcp
let result = self.poll();
self.manager.process_sockets(&mut self.socket_set);
let result = self.poll();
if last_log.elapsed() >= Duration::from_secs(5) {
self.manager.log_status(&self.socket_set);