NamedPipe 2

This commit is contained in:
ssrlive 2023-09-23 21:43:40 +08:00
parent a82721c056
commit bdb7bec062

View file

@ -4,10 +4,12 @@ use smoltcp::{
time::Instant, time::Instant,
}; };
use std::{ use std::{
cell::RefCell,
fs::OpenOptions, fs::OpenOptions,
io, io::{self, Read, Write},
net::{IpAddr, Ipv4Addr}, net::{IpAddr, Ipv4Addr},
os::windows::prelude::{FromRawHandle, IntoRawHandle, OpenOptionsExt}, os::windows::prelude::{FromRawHandle, IntoRawHandle, OpenOptionsExt},
rc::Rc,
sync::Arc, sync::Arc,
vec::Vec, vec::Vec,
}; };
@ -56,8 +58,8 @@ pub struct WinTunInterface {
inner: Arc<wintun::Session>, inner: Arc<wintun::Session>,
mtu: usize, mtu: usize,
medium: Medium, medium: Medium,
pipe_server: NamedPipe, pipe_server: Rc<RefCell<NamedPipe>>,
pipe_client: NamedPipe, _pipe_client: Rc<RefCell<NamedPipe>>,
} }
// impl AsRawFd for WinTunInterface { // impl AsRawFd for WinTunInterface {
@ -68,17 +70,17 @@ pub struct WinTunInterface {
impl event::Source for WinTunInterface { impl event::Source for WinTunInterface {
fn register(&mut self, registry: &Registry, token: Token, interests: Interest) -> io::Result<()> { fn register(&mut self, registry: &Registry, token: Token, interests: Interest) -> io::Result<()> {
registry.register(&mut self.pipe_server, token, interests)?; self.pipe_server.borrow_mut().register(registry, token, interests)?;
Ok(()) Ok(())
} }
fn reregister(&mut self, registry: &Registry, token: Token, interests: Interest) -> io::Result<()> { fn reregister(&mut self, registry: &Registry, token: Token, interests: Interest) -> io::Result<()> {
registry.reregister(&mut self.pipe_server, token, interests)?; self.pipe_server.borrow_mut().reregister(registry, token, interests)?;
Ok(()) Ok(())
} }
fn deregister(&mut self, registry: &Registry) -> io::Result<()> { fn deregister(&mut self, registry: &Registry) -> io::Result<()> {
registry.deregister(&mut self.pipe_server)?; self.pipe_server.borrow_mut().deregister(registry)?;
Ok(()) Ok(())
} }
} }
@ -114,8 +116,8 @@ impl WinTunInterface {
inner, inner,
mtu, mtu,
medium, medium,
pipe_server, pipe_server: Rc::new(RefCell::new(pipe_server)),
pipe_client, _pipe_client: Rc::new(RefCell::new(pipe_client)),
}) })
} }
} }
@ -140,6 +142,7 @@ impl Device for WinTunInterface {
} }
fn receive(&mut self, _timestamp: Instant) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> { fn receive(&mut self, _timestamp: Instant) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
/*
let inner = self.inner.clone(); let inner = self.inner.clone();
match inner.receive_blocking() { match inner.receive_blocking() {
Ok(read_pack) => Some(( Ok(read_pack) => Some((
@ -153,24 +156,26 @@ impl Device for WinTunInterface {
None None
} }
} }
*/
// match inner.recv(&mut buffer[..]) { let mut buffer = vec![0; self.mtu];
// Ok(size) => { match self.pipe_server.borrow_mut().read(&mut buffer[..]) {
// buffer.resize(size, 0); Ok(size) => {
// let rx = RxToken { buffer }; buffer.resize(size, 0);
// let tx = TxToken { let rx = RxToken { buffer };
// inner: self.inner.clone(), let tx = TxToken {
// }; pipe_server: self.pipe_server.clone(),
// Some((rx, tx)) };
// } Some((rx, tx))
// Err(err) if err.kind() == io::ErrorKind::WouldBlock => None, }
// Err(err) => panic!("{}", err), Err(err) if err.kind() == io::ErrorKind::WouldBlock => None,
// } Err(err) => panic!("{}", err),
}
} }
fn transmit(&mut self, _timestamp: Instant) -> Option<Self::TxToken<'_>> { fn transmit(&mut self, _timestamp: Instant) -> Option<Self::TxToken<'_>> {
Some(TxToken { Some(TxToken {
inner: self.inner.clone(), pipe_server: self.pipe_server.clone(),
}) })
} }
} }
@ -191,7 +196,7 @@ impl phy::RxToken for RxToken {
#[doc(hidden)] #[doc(hidden)]
pub struct TxToken { pub struct TxToken {
inner: Arc<wintun::Session>, pipe_server: Rc<RefCell<NamedPipe>>,
} }
impl phy::TxToken for TxToken { impl phy::TxToken for TxToken {
@ -199,10 +204,11 @@ impl phy::TxToken for TxToken {
where where
F: FnOnce(&mut [u8]) -> R, F: FnOnce(&mut [u8]) -> R,
{ {
let inner = self.inner.clone();
let mut buffer = vec![0; len]; let mut buffer = vec![0; len];
let result = f(&mut buffer); let result = f(&mut buffer);
/*
let inner = self.inner.clone();
let write_pack = inner.allocate_send_packet(len as u16); let write_pack = inner.allocate_send_packet(len as u16);
if let Ok(mut write_pack) = write_pack { if let Ok(mut write_pack) = write_pack {
write_pack.bytes_mut().copy_from_slice(&buffer[..]); write_pack.bytes_mut().copy_from_slice(&buffer[..]);
@ -210,14 +216,15 @@ impl phy::TxToken for TxToken {
} else if let Err(err) = write_pack { } else if let Err(err) = write_pack {
log::error!("phy: failed to allocate send packet: {}", err); log::error!("phy: failed to allocate send packet: {}", err);
} }
*/
// match lower.send(&buffer[..]) { match self.pipe_server.borrow_mut().write(&buffer[..]) {
// Ok(_) => {} Ok(_) => {}
// Err(err) if err.kind() == io::ErrorKind::WouldBlock => { Err(err) if err.kind() == io::ErrorKind::WouldBlock => {
// log::error!("phy: tx failed due to WouldBlock") log::error!("phy: tx failed due to WouldBlock")
// } }
// Err(err) => panic!("{}", err), Err(err) => panic!("{}", err),
// } }
result result
} }
} }