mirror of
https://github.com/tun2proxy/tun2proxy.git
synced 2025-06-18 15:15:22 +00:00
NamedPipe 2
This commit is contained in:
parent
a82721c056
commit
bdb7bec062
1 changed files with 37 additions and 30 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue