This commit is contained in:
2026-03-08 17:07:15 +07:00
parent 676683d29c
commit 2069f1a62c
9 changed files with 179 additions and 95 deletions
+26 -15
View File
@@ -1,9 +1,11 @@
use smoltcp::iface::PollResult;
use smoltcp::time::Instant;
use smoltcp::wire::{IpAddress, IpCidr};
use smoltcp::{
iface::{Config, Interface, SocketSet},
phy::DeviceCapabilities,
};
use std::sync::atomic::Ordering;
use std::{
mem,
sync::{Arc, LazyLock, atomic::AtomicBool},
@@ -37,7 +39,7 @@ impl Engine {
let (mut device, bridge_rx, bridge_tx, avail) = VirtTunDevice::new(caps);
let interface = Interface::new(config, &mut device, now);
let socket_set = ConnectionManager::setup_sockets(16, 4, 1);
let socket_set = ConnectionManager::setup_sockets(128, 8, 4);
let manager = ConnectionManager::new(ip);
Self {
interface,
@@ -52,32 +54,41 @@ impl Engine {
pub async fn run(&mut self, tun: Tun) {
info!("Current routes: {:?}", self.interface.routes());
//Bridge from tun to stack and stack to tun
let (writer, reader) = tun.split().expect("Failed to split TUN");
// Забираем bridge_rx, так как он нам нужен только в одной задаче
let from_engine = mem::replace(&mut self.bridge_rx, mpsc::unbounded_channel().1);
Self::spawn_tun_to_engine(reader, self.bridge_tx.clone(), self.avail.clone());
Self::spawn_engine_to_tun(writer, from_engine);
let mut last_log = StdInstant::now();
loop {
loop {
self.poll();
let result = self.poll();
self.manager.process_sockets(&mut self.socket_set);
self.manager.process_sockets(&mut self.socket_set);
if self.avail.load(std::sync::atomic::Ordering::Acquire) {
tokio::task::yield_now().await;
continue;
}
self.poll_delay().await;
if last_log.elapsed() >= Duration::from_secs(5) {
self.manager.log_status(&self.socket_set);
last_log = StdInstant::now();
}
if matches!(result, PollResult::SocketStateChanged) {
continue;
}
if self.avail.load(Ordering::Acquire) {
tokio::task::yield_now().await;
continue;
}
self.poll_delay().await;
}
}
fn poll(&mut self) {
fn poll(&mut self) -> PollResult {
let now = Self::current_time();
self.interface
.poll(now, &mut self.device, &mut self.socket_set);
.poll(now, &mut self.device, &mut self.socket_set)
}
async fn poll_delay(&mut self) {
@@ -97,7 +108,7 @@ impl Engine {
) {
tokio::spawn(async move {
debug!("TUN-to-Engine bridge task started");
let mut buf = [0u8; 4096];
let mut buf = [0u8; 65536];
while let Ok(n) = reader.read(&mut buf).await {
if n == 0 {
break;