summaryrefslogtreecommitdiffstats
path: root/src/types/dummy.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/types/dummy.rs')
-rw-r--r--src/types/dummy.rs172
1 files changed, 113 insertions, 59 deletions
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<usize, Self::Error> {
+ Ok(0)
+ }
+}
+
+impl tun::MTU for TunTest {
fn mtu(&self) -> usize {
1500
}
+}
- fn read(&self, _buf: &mut [u8], _offset: usize) -> Result<usize, Self::Error> {
- 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<UnitEndpoint> 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<u16> {
- 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<Mutex<SyncSender<Vec<u8>>>>,
- recv: Arc<Mutex<Receiver<Vec<u8>>>>,
-}
+impl bind::Writer<UnitEndpoint> 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<u16> {
- 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<E> {
+ recv: Arc<Mutex<Receiver<Vec<u8>>>>,
+ _marker: marker::PhantomData<E>,
+}
+
+impl bind::Reader<UnitEndpoint> for PairReader<UnitEndpoint> {
+ 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<UnitEndpoint> for PairWriter<UnitEndpoint> {
+ 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<E> {
+ send: Arc<Mutex<SyncSender<Vec<u8>>>>,
+ _marker: marker::PhantomData<E>,
+}
+
+#[derive(Clone)]
+pub struct PairBind {}
+
+impl PairBind {
+ pub fn pair<E>() -> ((PairReader<E>, PairWriter<E>), (PairReader<E>, PairWriter<E>)) {
+ 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<Self::Endpoint>;
+ type Writer = PairWriter<Self::Endpoint>;
+
+ 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],