Possible fix for Linux clients

modified:   src/client.rs
This commit is contained in:
Michael Wain 2024-11-25 18:15:50 +03:00
parent 92c29bb026
commit 668e704264

View File

@ -1,7 +1,9 @@
pub mod general { pub mod general {
use crate::config::ClientConfiguration; use crate::config::ClientConfiguration;
use tokio_util::sync::CancellationToken; use crossbeam_channel::{Receiver, Sender};
use futures::{stream::SplitSink, StreamExt};
use tokio_util::{codec::Framed, sync::CancellationToken};
use tokio::{net::UdpSocket, sync::{Mutex, mpsc}, io::{AsyncWriteExt, AsyncReadExt}, fs::File}; use tokio::{net::UdpSocket, sync::{Mutex, mpsc}, io::{AsyncWriteExt, AsyncReadExt}, fs::File};
use log::{error, info, warn}; use log::{error, info, warn};
use aes_gcm::{ use aes_gcm::{
@ -14,21 +16,22 @@ pub mod general {
use x25519_dalek::{PublicKey, StaticSecret}; use x25519_dalek::{PublicKey, StaticSecret};
use crate::udp::{UDPVpnPacket, UDPVpnHandshake, UDPSerializable}; use crate::udp::{UDPVpnPacket, UDPVpnHandshake, UDPSerializable};
use tun::{ DeviceReader, DeviceWriter }; use tun::{ AsyncDevice, DeviceReader, DeviceWriter, TunPacketCodec };
pub trait ReadWrapper { pub trait ReadWrapper {
async fn read(&mut self, buf: &mut [u8]) -> Result<usize, ()>; async fn read(&mut self, buf: &mut Vec<u8>) -> Result<usize, ()>;
} }
pub struct DevReader { pub struct DevReader {
pub dr: DeviceReader pub dr: Receiver<Vec<u8>>
} }
// TODO: implement custom Error // TODO: implement custom Error
impl ReadWrapper for DevReader { impl ReadWrapper for DevReader {
async fn read(&mut self, buf: &mut [u8]) -> Result<usize, ()> { async fn read(&mut self, buf: &mut Vec<u8>) -> Result<usize, ()> {
if let Ok(a) = self.dr.read(buf).await { if let Ok(tb) = self.dr.recv() {
return Ok(a); *buf = tb;
return Ok(buf.len());
} }
Err(()) Err(())
} }
@ -39,7 +42,7 @@ pub mod general {
} }
impl ReadWrapper for FdReader { impl ReadWrapper for FdReader {
async fn read(&mut self, buf: &mut [u8]) -> Result<usize, ()> { async fn read(&mut self, buf: &mut Vec<u8>) -> Result<usize, ()> {
let r = self.br.read(buf).await; let r = self.br.read(buf).await;
if let Ok(a) = r { if let Ok(a) = r {
return Ok(a); return Ok(a);
@ -58,8 +61,7 @@ pub mod general {
} }
pub struct DevWriter { pub struct DevWriter {
pub dr: DeviceWriter, pub dr: Sender<Vec<u8>>
//pub dev: AsyncDevice
} }
// TODO: implement custom Error // TODO: implement custom Error
@ -67,8 +69,9 @@ pub mod general {
async fn write(&mut self, msg: WriterMessage) -> Result<usize, ()> { async fn write(&mut self, msg: WriterMessage) -> Result<usize, ()> {
match msg { match msg {
WriterMessage::Plain(buf) => { WriterMessage::Plain(buf) => {
if let Ok(a) = self.dr.write(&buf).await { let l = buf.len();
return Ok(a); if let Ok(()) = self.dr.send(buf) {
return Ok(l);
} }
Err(()) Err(())
}, },
@ -272,8 +275,10 @@ pub mod android {
pub mod desktop { pub mod desktop {
use crate::client::general::{CoreVpnClient, DevReader, DevWriter, VpnClient}; use crate::client::general::{CoreVpnClient, DevReader, DevWriter, VpnClient};
use crate::config::ClientConfiguration; use crate::config::ClientConfiguration;
use futures::{SinkExt, StreamExt};
use log::info; use log::info;
use tokio::net::UdpSocket; use tokio::net::UdpSocket;
use crossbeam_channel::unbounded;
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
use network_interface::{NetworkInterface, NetworkInterfaceConfig}; use network_interface::{NetworkInterface, NetworkInterfaceConfig};
@ -363,13 +368,32 @@ pub mod desktop {
let sock = UdpSocket::bind(("0.0.0.0", 0)).await.unwrap(); let sock = UdpSocket::bind(("0.0.0.0", 0)).await.unwrap();
sock.connect(&self.client_config.server.endpoint).await.unwrap(); sock.connect(&self.client_config.server.endpoint).await.unwrap();
info!("AsyncDevice");
let dev = create_as_async(&config).unwrap(); let dev = create_as_async(&config).unwrap();
info!("Split device"); let (mut dev_writer , mut dev_reader) = dev.into_framed().split();
let dr = dev.split();
let (dev_writer, dev_reader) = dr.unwrap(); // dev_reader
info!("CoreVpnClient"); let (tx, rx) = unbounded();
let mut client = CoreVpnClient{ client_config: self.client_config.clone(), dev_reader: DevReader{ dr: dev_reader }, dev_writer: DevWriter{dr: dev_writer}, close_token: tokio_util::sync::CancellationToken::new()};
// dev_writer
let (wx, wrx) = unbounded();
tokio::spawn(async move {
loop {
if let Some(Ok(buf)) = dev_reader.next().await {
tx.send(buf);
}
}
});
tokio::spawn(async move {
loop {
if let Ok(buf) = wrx.recv() {
let _ = dev_writer.send(buf).await;
}
}
});
let mut client = CoreVpnClient{ client_config: self.client_config.clone(), dev_reader: DevReader{ dr: rx }, dev_writer: DevWriter{dr: wx}, close_token: tokio_util::sync::CancellationToken::new()};
info!("Platform specific code"); info!("Platform specific code");
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]