From 761c46064d7510303f08cde27c9e13b07293f3af Mon Sep 17 00:00:00 2001 From: Mathias Hall-Andersen Date: Wed, 9 Oct 2019 15:08:26 +0200 Subject: Restructure IO traits. --- src/types/dummy.rs | 172 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 113 insertions(+), 59 deletions(-) (limited to 'src/types/dummy.rs') diff --git a/src/types/dummy.rs b/src/types/dummy.rs index e15abb0..40a3bdd 100644 --- a/src/types/dummy.rs +++ b/src/types/dummy.rs @@ -5,8 +5,9 @@ use std::sync::mpsc::{sync_channel, Receiver, SyncSender}; use std::sync::Arc; use std::sync::Mutex; use std::time::Instant; +use std::marker; -use super::{Bind, Endpoint, Key, KeyPair, Tun}; +use super::*; /* This submodule provides pure/dummy implementations of the IO interfaces * for use in unit tests thoughout the project. @@ -72,104 +73,103 @@ impl Endpoint for UnitEndpoint { } } +impl UnitEndpoint { + pub fn new() -> UnitEndpoint { + UnitEndpoint{} + } +} + +/* */ + #[derive(Clone, Copy)] pub struct TunTest {} -impl Tun for TunTest { +impl tun::Reader for TunTest { type Error = TunError; + fn read(&self, _buf: &mut [u8], _offset: usize) -> Result { + Ok(0) + } +} + +impl tun::MTU for TunTest { fn mtu(&self) -> usize { 1500 } +} - fn read(&self, _buf: &mut [u8], _offset: usize) -> Result { - Ok(0) - } +impl tun::Writer for TunTest { + type Error = TunError; fn write(&self, _src: &[u8]) -> Result<(), Self::Error> { Ok(()) } } +impl tun::Tun for TunTest { + type Writer = TunTest; + type Reader = TunTest; + type MTU = TunTest; + type Error = TunError; +} + impl TunTest { - pub fn new() -> TunTest { - TunTest {} + pub fn create(_name: &str) -> Result<(TunTest, TunTest, TunTest), TunError> { + Ok((TunTest {},TunTest {}, TunTest{})) } } -/* Bind implemenentations */ +/* Void Bind */ #[derive(Clone, Copy)] pub struct VoidBind {} -impl Bind for VoidBind { +impl bind::Reader for VoidBind { type Error = BindError; - type Endpoint = UnitEndpoint; - fn new() -> VoidBind { - VoidBind {} - } - - fn set_port(&self, _port: u16) -> Result<(), Self::Error> { - Ok(()) - } - - fn get_port(&self) -> Option { - None - } - - fn recv(&self, _buf: &mut [u8]) -> Result<(usize, Self::Endpoint), Self::Error> { + fn read(&self, _buf: &mut [u8]) -> Result<(usize, UnitEndpoint), Self::Error> { Ok((0, UnitEndpoint {})) } - - fn send(&self, _buf: &[u8], _dst: &Self::Endpoint) -> Result<(), Self::Error> { - Ok(()) - } } -#[derive(Clone)] -pub struct PairBind { - send: Arc>>>, - recv: Arc>>>, -} +impl bind::Writer for VoidBind { + type Error = BindError; -impl PairBind { - pub fn pair() -> (PairBind, PairBind) { - let (tx1, rx1) = sync_channel(128); - let (tx2, rx2) = sync_channel(128); - ( - PairBind { - send: Arc::new(Mutex::new(tx1)), - recv: Arc::new(Mutex::new(rx2)), - }, - PairBind { - send: Arc::new(Mutex::new(tx2)), - recv: Arc::new(Mutex::new(rx1)), - }, - ) + fn write(&self, _buf: &[u8], _dst: &UnitEndpoint) -> Result<(), Self::Error> { + Ok(()) } } -impl Bind for PairBind { +impl bind::Bind for VoidBind { type Error = BindError; type Endpoint = UnitEndpoint; - fn new() -> PairBind { - PairBind { - send: Arc::new(Mutex::new(sync_channel(0).0)), - recv: Arc::new(Mutex::new(sync_channel(0).1)), - } - } + type Reader = VoidBind; + type Writer = VoidBind; + type Closer = (); - fn set_port(&self, _port: u16) -> Result<(), Self::Error> { - Ok(()) + fn bind(_ : u16) -> Result<(Self::Reader, Self::Writer, Self::Closer, u16), Self::Error> { + Ok((VoidBind{}, VoidBind{}, (), 2600)) } +} - fn get_port(&self) -> Option { - None +impl VoidBind { + pub fn new() -> VoidBind { + VoidBind{} } +} - fn recv(&self, buf: &mut [u8]) -> Result<(usize, Self::Endpoint), Self::Error> { +/* Pair Bind */ + +#[derive(Clone)] +pub struct PairReader { + recv: Arc>>>, + _marker: marker::PhantomData, +} + +impl bind::Reader for PairReader { + type Error = BindError; + fn read(&self, buf: &mut [u8]) -> Result<(usize, UnitEndpoint), Self::Error> { let vec = self .recv .lock() @@ -180,8 +180,11 @@ impl Bind for PairBind { buf[..len].copy_from_slice(&vec[..]); Ok((vec.len(), UnitEndpoint {})) } +} - fn send(&self, buf: &[u8], _dst: &Self::Endpoint) -> Result<(), Self::Error> { +impl bind::Writer for PairWriter { + type Error = BindError; + fn write(&self, buf: &[u8], _dst: &UnitEndpoint) -> Result<(), Self::Error> { let owned = buf.to_owned(); match self.send.lock().unwrap().send(owned) { Err(_) => Err(BindError::Disconnected), @@ -190,6 +193,57 @@ impl Bind for PairBind { } } +#[derive(Clone)] +pub struct PairWriter { + send: Arc>>>, + _marker: marker::PhantomData, +} + +#[derive(Clone)] +pub struct PairBind {} + +impl PairBind { + pub fn pair() -> ((PairReader, PairWriter), (PairReader, PairWriter)) { + let (tx1, rx1) = sync_channel(128); + let (tx2, rx2) = sync_channel(128); + ( + ( + PairReader{ + + recv: Arc::new(Mutex::new(rx1)), + _marker: marker::PhantomData + }, + PairWriter{ + send: Arc::new(Mutex::new(tx2)), + _marker: marker::PhantomData + } + ), + ( + PairReader{ + recv: Arc::new(Mutex::new(rx2)), + _marker: marker::PhantomData + }, + PairWriter{ + send: Arc::new(Mutex::new(tx1)), + _marker: marker::PhantomData + } + ), + ) + } +} + +impl bind::Bind for PairBind { + type Closer = (); + type Error = BindError; + type Endpoint = UnitEndpoint; + type Reader = PairReader; + type Writer = PairWriter; + + fn bind(_port: u16) -> Result<(Self::Reader, Self::Writer, Self::Closer, u16), Self::Error> { + Err(BindError::Disconnected) + } +} + pub fn keypair(initiator: bool) -> KeyPair { let k1 = Key { key: [0x53u8; 32], -- cgit v1.2.3-59-g8ed1b