aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMathias Hall-Andersen <mathias@hall-andersen.dk>2019-10-23 12:08:35 +0200
committerMathias Hall-Andersen <mathias@hall-andersen.dk>2019-10-23 12:08:35 +0200
commitee3599d5507ceee23ef3382dbda9de8e73c54a00 (patch)
treed681a3f8a5a2d5e7bea779acecd1fc0798285d9e
parentWork on platform specific code (Linux) (diff)
downloadwireguard-rs-ee3599d5507ceee23ef3382dbda9de8e73c54a00.tar.xz
wireguard-rs-ee3599d5507ceee23ef3382dbda9de8e73c54a00.zip
Moved IO traits into platform module
-rw-r--r--src/configuration/config.rs25
-rw-r--r--src/configuration/mod.rs6
-rw-r--r--src/main.rs19
-rw-r--r--src/platform/bind.rs43
-rw-r--r--src/platform/dummy.rs22
-rw-r--r--src/platform/dummy/bind.rs (renamed from src/wireguard/types/dummy.rs)170
-rw-r--r--src/platform/dummy/endpoint.rs1
-rw-r--r--src/platform/dummy/mod.rs13
-rw-r--r--src/platform/dummy/tun.rs172
-rw-r--r--src/platform/endpoint.rs (renamed from src/wireguard/types/endpoint.rs)0
-rw-r--r--src/platform/linux/tun.rs6
-rw-r--r--src/platform/linux/udp.rs3
-rw-r--r--src/platform/mod.rs32
-rw-r--r--src/platform/tun.rs (renamed from src/wireguard/types/tun.rs)5
-rw-r--r--src/tests.rs1
-rw-r--r--src/wireguard/mod.rs10
-rw-r--r--src/wireguard/router/device.rs2
-rw-r--r--src/wireguard/router/peer.rs2
-rw-r--r--src/wireguard/router/tests.rs14
-rw-r--r--src/wireguard/router/workers.rs2
-rw-r--r--src/wireguard/tests.rs3
-rw-r--r--src/wireguard/timers.rs2
-rw-r--r--src/wireguard/types.rs (renamed from src/wireguard/types/keys.rs)27
-rw-r--r--src/wireguard/types/bind.rs23
-rw-r--r--src/wireguard/types/mod.rs11
-rw-r--r--src/wireguard/wireguard.rs8
26 files changed, 352 insertions, 270 deletions
diff --git a/src/configuration/config.rs b/src/configuration/config.rs
index 24b1349..f42b53b 100644
--- a/src/configuration/config.rs
+++ b/src/configuration/config.rs
@@ -2,10 +2,8 @@ use spin::Mutex;
use std::net::{IpAddr, SocketAddr};
use x25519_dalek::{PublicKey, StaticSecret};
-use super::BindOwner;
-use super::PlatformBind;
-use super::Tun;
-use super::Wireguard;
+use super::*;
+use bind::Owner;
/// The goal of the configuration interface is, among others,
/// to hide the IO implementations (over which the WG device is generic),
@@ -21,17 +19,26 @@ pub struct PeerState {
allowed_ips: Vec<(IpAddr, u32)>,
}
-struct UDPState<O: BindOwner> {
+struct UDPState<O: bind::Owner> {
fwmark: Option<u32>,
owner: O,
port: u16,
}
-pub struct WireguardConfig<T: Tun, B: PlatformBind> {
+pub struct WireguardConfig<T: tun::Tun, B: bind::Platform> {
wireguard: Wireguard<T, B>,
network: Mutex<Option<UDPState<B::Owner>>>,
}
+impl<T: tun::Tun, B: bind::Platform> WireguardConfig<T, B> {
+ fn new(wg: Wireguard<T, B>) -> WireguardConfig<T, B> {
+ WireguardConfig {
+ wireguard: wg,
+ network: Mutex::new(None),
+ }
+ }
+}
+
pub enum ConfigError {
NoSuchPeer,
NotListening,
@@ -41,8 +48,8 @@ impl ConfigError {
fn errno(&self) -> i32 {
// TODO: obtain the correct error values
match self {
- NoSuchPeer => 1,
- NotListening => 2,
+ ConfigError::NoSuchPeer => 1,
+ ConfigError::NotListening => 2,
}
}
}
@@ -180,7 +187,7 @@ pub trait Configuration {
fn get_peers(&self) -> Vec<PeerState>;
}
-impl<T: Tun, B: PlatformBind> Configuration for WireguardConfig<T, B> {
+impl<T: tun::Tun, B: bind::Platform> Configuration for WireguardConfig<T, B> {
fn set_private_key(&self, sk: Option<StaticSecret>) {
self.wireguard.set_key(sk)
}
diff --git a/src/configuration/mod.rs b/src/configuration/mod.rs
index 56a83e2..520b397 100644
--- a/src/configuration/mod.rs
+++ b/src/configuration/mod.rs
@@ -1,5 +1,7 @@
mod config;
-use super::platform::{BindOwner, PlatformBind};
-use super::wireguard::tun::Tun;
+use super::platform::{bind, tun};
use super::wireguard::Wireguard;
+
+pub use config::Configuration;
+pub use config::WireguardConfig;
diff --git a/src/main.rs b/src/main.rs
index 4dac3cd..5aaeb25 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -10,8 +10,23 @@ mod configuration;
mod platform;
mod wireguard;
-use platform::PlatformTun;
+mod tests;
+
+use platform::tun;
+
+use configuration::WireguardConfig;
fn main() {
- let (readers, writer, mtu) = platform::TunInstance::create("test").unwrap();
+ /*
+ let (mut readers, writer, mtu) = platform::TunInstance::create("test").unwrap();
+ let wg = wireguard::Wireguard::new(readers, writer, mtu);
+ */
+}
+
+/*
+fn test_wg_configuration() {
+ let (mut readers, writer, mtu) = platform::dummy::
+
+ let wg = wireguard::Wireguard::new(readers, writer, mtu);
}
+*/
diff --git a/src/platform/bind.rs b/src/platform/bind.rs
new file mode 100644
index 0000000..f22a5d7
--- /dev/null
+++ b/src/platform/bind.rs
@@ -0,0 +1,43 @@
+use super::Endpoint;
+use std::error::Error;
+
+pub trait Reader<E: Endpoint>: Send + Sync {
+ type Error: Error;
+
+ fn read(&self, buf: &mut [u8]) -> Result<(usize, E), Self::Error>;
+}
+
+pub trait Writer<E: Endpoint>: Send + Sync + Clone + 'static {
+ type Error: Error;
+
+ fn write(&self, buf: &[u8], dst: &E) -> Result<(), Self::Error>;
+}
+
+pub trait Bind: Send + Sync + 'static {
+ type Error: Error;
+ type Endpoint: Endpoint;
+
+ /* Until Rust gets type equality constraints these have to be generic */
+ type Writer: Writer<Self::Endpoint>;
+ type Reader: Reader<Self::Endpoint>;
+}
+
+/// On platforms where fwmark can be set and the
+/// implementation can bind to a new port during later configuration (UAPI support),
+/// this type provides the ability to set the fwmark and close the socket (by dropping the instance)
+pub trait Owner: Send {
+ type Error: Error;
+
+ fn set_fwmark(&self, value: Option<u32>) -> Option<Self::Error>;
+}
+
+/// On some platforms the application can itself bind to a socket.
+/// This enables configuration using the UAPI interface.
+pub trait Platform: Bind {
+ type Owner: Owner;
+
+ /// Bind to a new port, returning the reader/writer and
+ /// an associated instance of the owner type, which closes the UDP socket upon "drop"
+ /// and enables configuration of the fwmark value.
+ fn bind(port: u16) -> Result<(Vec<Self::Reader>, Self::Writer, Self::Owner), Self::Error>;
+}
diff --git a/src/platform/dummy.rs b/src/platform/dummy.rs
deleted file mode 100644
index 208febe..0000000
--- a/src/platform/dummy.rs
+++ /dev/null
@@ -1,22 +0,0 @@
-#[cfg(test)]
-use super::super::wireguard::dummy;
-use super::BindOwner;
-use super::PlatformBind;
-
-pub struct VoidOwner {}
-
-impl BindOwner for VoidOwner {
- type Error = dummy::BindError;
-
- fn set_fwmark(&self, value: Option<u32>) -> Option<Self::Error> {
- None
- }
-}
-
-impl PlatformBind for dummy::PairBind {
- type Owner = VoidOwner;
-
- fn bind(_port: u16) -> Result<(Vec<Self::Reader>, Self::Writer, Self::Owner), Self::Error> {
- Err(dummy::BindError::Disconnected)
- }
-}
diff --git a/src/wireguard/types/dummy.rs b/src/platform/dummy/bind.rs
index 384f123..14143ae 100644
--- a/src/wireguard/types/dummy.rs
+++ b/src/platform/dummy/bind.rs
@@ -2,19 +2,14 @@ use std::error::Error;
use std::fmt;
use std::marker;
use std::net::SocketAddr;
-use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::mpsc::{sync_channel, Receiver, SyncSender};
use std::sync::Arc;
use std::sync::Mutex;
-use std::time::Instant;
-use super::*;
+use super::super::bind::*;
+use super::super::Endpoint;
-/* This submodule provides pure/dummy implementations of the IO interfaces
- * for use in unit tests thoughout the project.
- */
-
-/* Error implementation */
+pub struct VoidOwner {}
#[derive(Debug)]
pub enum BindError {
@@ -85,122 +80,10 @@ impl UnitEndpoint {
}
}
-/* */
-
-pub struct TunTest {}
-
-pub struct TunFakeIO {
- store: bool,
- tx: SyncSender<Vec<u8>>,
- rx: Receiver<Vec<u8>>,
-}
-
-pub struct TunReader {
- rx: Receiver<Vec<u8>>,
-}
-
-pub struct TunWriter {
- store: bool,
- tx: Mutex<SyncSender<Vec<u8>>>,
-}
-
-#[derive(Clone)]
-pub struct TunMTU {
- mtu: Arc<AtomicUsize>,
-}
-
-impl tun::Reader for TunReader {
- type Error = TunError;
-
- fn read(&self, buf: &mut [u8], offset: usize) -> Result<usize, Self::Error> {
- match self.rx.recv() {
- Ok(m) => {
- buf[offset..].copy_from_slice(&m[..]);
- Ok(m.len())
- }
- Err(_) => Err(TunError::Disconnected),
- }
- }
-}
-
-impl tun::Writer for TunWriter {
- type Error = TunError;
-
- fn write(&self, src: &[u8]) -> Result<(), Self::Error> {
- if self.store {
- let m = src.to_owned();
- match self.tx.lock().unwrap().send(m) {
- Ok(_) => Ok(()),
- Err(_) => Err(TunError::Disconnected),
- }
- } else {
- Ok(())
- }
- }
-}
-
-impl tun::MTU for TunMTU {
- fn mtu(&self) -> usize {
- self.mtu.load(Ordering::Acquire)
- }
-}
-
-impl tun::Tun for TunTest {
- type Writer = TunWriter;
- type Reader = TunReader;
- type MTU = TunMTU;
- type Error = TunError;
-}
-
-impl TunFakeIO {
- pub fn write(&self, msg: Vec<u8>) {
- if self.store {
- self.tx.send(msg).unwrap();
- }
- }
-
- pub fn read(&self) -> Vec<u8> {
- self.rx.recv().unwrap()
- }
-}
-
-impl TunTest {
- pub fn create(mtu: usize, store: bool) -> (TunFakeIO, TunReader, TunWriter, TunMTU) {
- let (tx1, rx1) = if store {
- sync_channel(32)
- } else {
- sync_channel(1)
- };
- let (tx2, rx2) = if store {
- sync_channel(32)
- } else {
- sync_channel(1)
- };
-
- let fake = TunFakeIO {
- tx: tx1,
- rx: rx2,
- store,
- };
- let reader = TunReader { rx: rx1 };
- let writer = TunWriter {
- tx: Mutex::new(tx2),
- store,
- };
- let mtu = TunMTU {
- mtu: Arc::new(AtomicUsize::new(mtu)),
- };
-
- (fake, reader, writer, mtu)
- }
-}
-
-/* Void Bind */
-
#[derive(Clone, Copy)]
pub struct VoidBind {}
-impl bind::Reader<UnitEndpoint> for VoidBind {
+impl Reader<UnitEndpoint> for VoidBind {
type Error = BindError;
fn read(&self, _buf: &mut [u8]) -> Result<(usize, UnitEndpoint), Self::Error> {
@@ -208,7 +91,7 @@ impl bind::Reader<UnitEndpoint> for VoidBind {
}
}
-impl bind::Writer<UnitEndpoint> for VoidBind {
+impl Writer<UnitEndpoint> for VoidBind {
type Error = BindError;
fn write(&self, _buf: &[u8], _dst: &UnitEndpoint) -> Result<(), Self::Error> {
@@ -216,7 +99,7 @@ impl bind::Writer<UnitEndpoint> for VoidBind {
}
}
-impl bind::Bind for VoidBind {
+impl Bind for VoidBind {
type Error = BindError;
type Endpoint = UnitEndpoint;
@@ -238,7 +121,7 @@ pub struct PairReader<E> {
_marker: marker::PhantomData<E>,
}
-impl bind::Reader<UnitEndpoint> for PairReader<UnitEndpoint> {
+impl Reader<UnitEndpoint> for PairReader<UnitEndpoint> {
type Error = BindError;
fn read(&self, buf: &mut [u8]) -> Result<(usize, UnitEndpoint), Self::Error> {
let vec = self
@@ -253,7 +136,7 @@ impl bind::Reader<UnitEndpoint> for PairReader<UnitEndpoint> {
}
}
-impl bind::Writer<UnitEndpoint> for PairWriter<UnitEndpoint> {
+impl Writer<UnitEndpoint> for PairWriter<UnitEndpoint> {
type Error = BindError;
fn write(&self, buf: &[u8], _dst: &UnitEndpoint) -> Result<(), Self::Error> {
let owned = buf.to_owned();
@@ -305,35 +188,24 @@ impl PairBind {
}
}
-impl bind::Bind for PairBind {
+impl Bind for PairBind {
type Error = BindError;
type Endpoint = UnitEndpoint;
type Reader = PairReader<Self::Endpoint>;
type Writer = PairWriter<Self::Endpoint>;
}
-pub fn keypair(initiator: bool) -> KeyPair {
- let k1 = Key {
- key: [0x53u8; 32],
- id: 0x646e6573,
- };
- let k2 = Key {
- key: [0x52u8; 32],
- id: 0x76636572,
- };
- if initiator {
- KeyPair {
- birth: Instant::now(),
- initiator: true,
- send: k1,
- recv: k2,
- }
- } else {
- KeyPair {
- birth: Instant::now(),
- initiator: false,
- send: k2,
- recv: k1,
- }
+impl Owner for VoidOwner {
+ type Error = BindError;
+
+ fn set_fwmark(&self, _value: Option<u32>) -> Option<Self::Error> {
+ None
+ }
+}
+
+impl Platform for PairBind {
+ type Owner = VoidOwner;
+ fn bind(_port: u16) -> Result<(Vec<Self::Reader>, Self::Writer, Self::Owner), Self::Error> {
+ Err(BindError::Disconnected)
}
}
diff --git a/src/platform/dummy/endpoint.rs b/src/platform/dummy/endpoint.rs
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/platform/dummy/endpoint.rs
@@ -0,0 +1 @@
+
diff --git a/src/platform/dummy/mod.rs b/src/platform/dummy/mod.rs
new file mode 100644
index 0000000..884bd7e
--- /dev/null
+++ b/src/platform/dummy/mod.rs
@@ -0,0 +1,13 @@
+mod bind;
+mod endpoint;
+mod tun;
+
+/* A pure dummy platform available during "test-time"
+ *
+ * The use of the dummy platform is to enable unit testing of full WireGuard,
+ * the configuration interface and the UAPI parser.
+ */
+
+pub use bind::*;
+pub use endpoint::*;
+pub use tun::*;
diff --git a/src/platform/dummy/tun.rs b/src/platform/dummy/tun.rs
new file mode 100644
index 0000000..9fe9480
--- /dev/null
+++ b/src/platform/dummy/tun.rs
@@ -0,0 +1,172 @@
+use std::error::Error;
+use std::fmt;
+use std::sync::atomic::{AtomicUsize, Ordering};
+use std::sync::mpsc::{sync_channel, Receiver, SyncSender};
+use std::sync::Arc;
+use std::sync::Mutex;
+
+use super::super::tun::*;
+
+/* This submodule provides pure/dummy implementations of the IO interfaces
+ * for use in unit tests thoughout the project.
+ */
+
+/* Error implementation */
+
+#[derive(Debug)]
+pub enum BindError {
+ Disconnected,
+}
+
+impl Error for BindError {
+ fn description(&self) -> &str {
+ "Generic Bind Error"
+ }
+
+ fn source(&self) -> Option<&(dyn Error + 'static)> {
+ None
+ }
+}
+
+impl fmt::Display for BindError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ match self {
+ BindError::Disconnected => write!(f, "PairBind disconnected"),
+ }
+ }
+}
+
+#[derive(Debug)]
+pub enum TunError {
+ Disconnected,
+}
+
+impl Error for TunError {
+ fn description(&self) -> &str {
+ "Generic Tun Error"
+ }
+
+ fn source(&self) -> Option<&(dyn Error + 'static)> {
+ None
+ }
+}
+
+impl fmt::Display for TunError {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "Not Possible")
+ }
+}
+
+pub struct TunTest {}
+
+pub struct TunFakeIO {
+ store: bool,
+ tx: SyncSender<Vec<u8>>,
+ rx: Receiver<Vec<u8>>,
+}
+
+pub struct TunReader {
+ rx: Receiver<Vec<u8>>,
+}
+
+pub struct TunWriter {
+ store: bool,
+ tx: Mutex<SyncSender<Vec<u8>>>,
+}
+
+#[derive(Clone)]
+pub struct TunMTU {
+ mtu: Arc<AtomicUsize>,
+}
+
+impl Reader for TunReader {
+ type Error = TunError;
+
+ fn read(&self, buf: &mut [u8], offset: usize) -> Result<usize, Self::Error> {
+ match self.rx.recv() {
+ Ok(m) => {
+ buf[offset..].copy_from_slice(&m[..]);
+ Ok(m.len())
+ }
+ Err(_) => Err(TunError::Disconnected),
+ }
+ }
+}
+
+impl Writer for TunWriter {
+ type Error = TunError;
+
+ fn write(&self, src: &[u8]) -> Result<(), Self::Error> {
+ if self.store {
+ let m = src.to_owned();
+ match self.tx.lock().unwrap().send(m) {
+ Ok(_) => Ok(()),
+ Err(_) => Err(TunError::Disconnected),
+ }
+ } else {
+ Ok(())
+ }
+ }
+}
+
+impl MTU for TunMTU {
+ fn mtu(&self) -> usize {
+ self.mtu.load(Ordering::Acquire)
+ }
+}
+
+impl Tun for TunTest {
+ type Writer = TunWriter;
+ type Reader = TunReader;
+ type MTU = TunMTU;
+ type Error = TunError;
+}
+
+impl TunFakeIO {
+ pub fn write(&self, msg: Vec<u8>) {
+ if self.store {
+ self.tx.send(msg).unwrap();
+ }
+ }
+
+ pub fn read(&self) -> Vec<u8> {
+ self.rx.recv().unwrap()
+ }
+}
+
+impl TunTest {
+ pub fn create(mtu: usize, store: bool) -> (TunFakeIO, TunReader, TunWriter, TunMTU) {
+ let (tx1, rx1) = if store {
+ sync_channel(32)
+ } else {
+ sync_channel(1)
+ };
+ let (tx2, rx2) = if store {
+ sync_channel(32)
+ } else {
+ sync_channel(1)
+ };
+
+ let fake = TunFakeIO {
+ tx: tx1,
+ rx: rx2,
+ store,
+ };
+ let reader = TunReader { rx: rx1 };
+ let writer = TunWriter {
+ tx: Mutex::new(tx2),
+ store,
+ };
+ let mtu = TunMTU {
+ mtu: Arc::new(AtomicUsize::new(mtu)),
+ };
+
+ (fake, reader, writer, mtu)
+ }
+}
+
+impl Platform for TunTest {
+ fn create(_name: &str) -> Result<(Vec<Self::Reader>, Self::Writer, Self::MTU), Self::Error> {
+ Err(TunError::Disconnected)
+ }
+}
diff --git a/src/wireguard/types/endpoint.rs b/src/platform/endpoint.rs
index 4702aab..4702aab 100644
--- a/src/wireguard/types/endpoint.rs
+++ b/src/platform/endpoint.rs
diff --git a/src/platform/linux/tun.rs b/src/platform/linux/tun.rs
index 5b7b105..090569a 100644
--- a/src/platform/linux/tun.rs
+++ b/src/platform/linux/tun.rs
@@ -1,6 +1,4 @@
-use super::super::super::wireguard::tun::*;
-use super::super::PlatformTun;
-use super::super::Tun;
+use super::super::tun::*;
use libc::*;
@@ -127,7 +125,7 @@ impl Tun for LinuxTun {
type MTU = LinuxTunMTU;
}
-impl PlatformTun for LinuxTun {
+impl Platform for LinuxTun {
fn create(name: &str) -> Result<(Vec<Self::Reader>, Self::Writer, Self::MTU), Self::Error> {
// construct request struct
let mut req = Ifreq {
diff --git a/src/platform/linux/udp.rs b/src/platform/linux/udp.rs
index 0a1a186..52e4c45 100644
--- a/src/platform/linux/udp.rs
+++ b/src/platform/linux/udp.rs
@@ -1,6 +1,5 @@
-use super::super::Bind;
+use super::super::bind::*;
use super::super::Endpoint;
-use super::super::PlatformBind;
use std::net::SocketAddr;
diff --git a/src/platform/mod.rs b/src/platform/mod.rs
index a0bbc13..ecd559a 100644
--- a/src/platform/mod.rs
+++ b/src/platform/mod.rs
@@ -1,33 +1,15 @@
-use std::error::Error;
+mod endpoint;
-use super::wireguard::bind::Bind;
-use super::wireguard::tun::Tun;
-use super::wireguard::Endpoint;
+pub mod bind;
+pub mod tun;
-#[cfg(test)]
-mod dummy;
+pub use endpoint::Endpoint;
#[cfg(target_os = "linux")]
mod linux;
+#[cfg(test)]
+pub mod dummy;
+
#[cfg(target_os = "linux")]
pub use linux::LinuxTun as TunInstance;
-
-pub trait BindOwner: Send {
- type Error: Error;
-
- fn set_fwmark(&self, value: Option<u32>) -> Option<Self::Error>;
-}
-
-pub trait PlatformBind: Bind {
- type Owner: BindOwner;
-
- /// Bind to a new port, returning the reader/writer and
- /// an associated instance of the owner type, which closes the UDP socket upon "drop"
- /// and enables configuration of the fwmark value.
- fn bind(port: u16) -> Result<(Vec<Self::Reader>, Self::Writer, Self::Owner), Self::Error>;
-}
-
-pub trait PlatformTun: Tun {
- fn create(name: &str) -> Result<(Vec<Self::Reader>, Self::Writer, Self::MTU), Self::Error>;
-}
diff --git a/src/wireguard/types/tun.rs b/src/platform/tun.rs
index 2ba16ff..f49d4af 100644
--- a/src/wireguard/types/tun.rs
+++ b/src/platform/tun.rs
@@ -54,3 +54,8 @@ pub trait Tun: Send + Sync + 'static {
type MTU: MTU;
type Error: Error;
}
+
+/// On some platforms the application can create the TUN device itself.
+pub trait Platform: Tun {
+ fn create(name: &str) -> Result<(Vec<Self::Reader>, Self::Writer, Self::MTU), Self::Error>;
+}
diff --git a/src/tests.rs b/src/tests.rs
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/tests.rs
@@ -0,0 +1 @@
+
diff --git a/src/wireguard/mod.rs b/src/wireguard/mod.rs
index 563a22f..c3e9c58 100644
--- a/src/wireguard/mod.rs
+++ b/src/wireguard/mod.rs
@@ -16,9 +16,11 @@ mod tests;
/// - Bind type, specifying how WireGuard messages are sent/received from the internet and what constitutes an "endpoint"
pub use wireguard::{Peer, Wireguard};
-pub use types::bind;
-pub use types::tun;
-pub use types::Endpoint;
+#[cfg(test)]
+pub use types::dummy_keypair;
#[cfg(test)]
-pub use types::dummy;
+use super::platform::dummy;
+
+use super::platform::{bind, tun, Endpoint};
+use types::{Key, KeyPair};
diff --git a/src/wireguard/router/device.rs b/src/wireguard/router/device.rs
index 455020c..b122bf4 100644
--- a/src/wireguard/router/device.rs
+++ b/src/wireguard/router/device.rs
@@ -21,7 +21,7 @@ use super::types::{Callbacks, RouterError};
use super::workers::{worker_parallel, JobParallel, Operation};
use super::SIZE_MESSAGE_PREFIX;
-use super::super::types::{bind, tun, Endpoint, KeyPair};
+use super::super::{bind, tun, Endpoint, KeyPair};
pub struct DeviceInner<E: Endpoint, C: Callbacks, T: tun::Writer, B: bind::Writer<E>> {
// inbound writer (TUN)
diff --git a/src/wireguard/router/peer.rs b/src/wireguard/router/peer.rs
index 4f47604..0b193a4 100644
--- a/src/wireguard/router/peer.rs
+++ b/src/wireguard/router/peer.rs
@@ -14,7 +14,7 @@ use treebitmap::IpLookupTable;
use zerocopy::LayoutVerified;
use super::super::constants::*;
-use super::super::types::{bind, tun, Endpoint, KeyPair};
+use super::super::{bind, tun, Endpoint, KeyPair};
use super::anti_replay::AntiReplay;
use super::device::DecryptionState;
diff --git a/src/wireguard/router/tests.rs b/src/wireguard/router/tests.rs
index 93c0773..d44a612 100644
--- a/src/wireguard/router/tests.rs
+++ b/src/wireguard/router/tests.rs
@@ -9,9 +9,9 @@ use num_cpus;
use pnet::packet::ipv4::MutableIpv4Packet;
use pnet::packet::ipv6::MutableIpv6Packet;
-use super::super::types::bind::*;
-use super::super::types::*;
-
+use super::super::bind::*;
+use super::super::dummy;
+use super::super::dummy_keypair;
use super::{Callbacks, Device, SIZE_MESSAGE_PREFIX};
extern crate test;
@@ -151,7 +151,7 @@ mod tests {
// add new peer
let opaque = Arc::new(AtomicUsize::new(0));
let peer = router.new_peer(opaque.clone());
- peer.add_keypair(dummy::keypair(true));
+ peer.add_keypair(dummy_keypair(true));
// add subnet to peer
let (mask, len, ip) = ("192.168.1.0", 24, "192.168.1.20");
@@ -211,7 +211,7 @@ mod tests {
let peer = router.new_peer(opaque.clone());
let mask: IpAddr = mask.parse().unwrap();
if set_key {
- peer.add_keypair(dummy::keypair(true));
+ peer.add_keypair(dummy_keypair(true));
}
// map subnet to peer
@@ -340,7 +340,7 @@ mod tests {
let peer1 = router1.new_peer(opaq1.clone());
let mask: IpAddr = mask.parse().unwrap();
peer1.add_subnet(mask, *len);
- peer1.add_keypair(dummy::keypair(false));
+ peer1.add_keypair(dummy_keypair(false));
let (mask, len, _ip, _okay) = p2;
let peer2 = router2.new_peer(opaq2.clone());
@@ -370,7 +370,7 @@ mod tests {
// this should cause a key-confirmation packet (keepalive or staged packet)
// this also causes peer1 to learn the "endpoint" for peer2
assert!(peer1.get_endpoint().is_none());
- peer2.add_keypair(dummy::keypair(true));
+ peer2.add_keypair(dummy_keypair(true));
wait();
assert!(opaq2.send().is_some());
diff --git a/src/wireguard/router/workers.rs b/src/wireguard/router/workers.rs
index 61a7620..8ebb246 100644
--- a/src/wireguard/router/workers.rs
+++ b/src/wireguard/router/workers.rs
@@ -17,7 +17,7 @@ use super::messages::{TransportHeader, TYPE_TRANSPORT};
use super::peer::PeerInner;
use super::types::Callbacks;
-use super::super::types::{bind, tun, Endpoint};
+use super::super::{bind, tun, Endpoint};
use super::ip::*;
pub const SIZE_TAG: usize = 16;
diff --git a/src/wireguard/tests.rs b/src/wireguard/tests.rs
index 0148d5d..4ecd43b 100644
--- a/src/wireguard/tests.rs
+++ b/src/wireguard/tests.rs
@@ -1,6 +1,5 @@
-use super::types::tun::Tun;
-use super::types::{bind, dummy, tun};
use super::wireguard::Wireguard;
+use super::{bind, dummy, tun};
use std::thread;
use std::time::Duration;
diff --git a/src/wireguard/timers.rs b/src/wireguard/timers.rs
index 1d9b8a0..40717f8 100644
--- a/src/wireguard/timers.rs
+++ b/src/wireguard/timers.rs
@@ -7,9 +7,9 @@ use log::info;
use hjul::{Runner, Timer};
+use super::{bind, tun};
use super::constants::*;
use super::router::{Callbacks, message_data_len};
-use super::types::{bind, tun};
use super::wireguard::{Peer, PeerInner};
pub struct Timers {
diff --git a/src/wireguard/types/keys.rs b/src/wireguard/types.rs
index 282c4ae..51898a0 100644
--- a/src/wireguard/types/keys.rs
+++ b/src/wireguard/types.rs
@@ -1,6 +1,33 @@
use clear_on_drop::clear::Clear;
use std::time::Instant;
+#[cfg(test)]
+pub fn dummy_keypair(initiator: bool) -> KeyPair {
+ let k1 = Key {
+ key: [0x53u8; 32],
+ id: 0x646e6573,
+ };
+ let k2 = Key {
+ key: [0x52u8; 32],
+ id: 0x76636572,
+ };
+ if initiator {
+ KeyPair {
+ birth: Instant::now(),
+ initiator: true,
+ send: k1,
+ recv: k2,
+ }
+ } else {
+ KeyPair {
+ birth: Instant::now(),
+ initiator: false,
+ send: k2,
+ recv: k1,
+ }
+ }
+}
+
#[derive(Debug, Clone)]
pub struct Key {
pub key: [u8; 32],
diff --git a/src/wireguard/types/bind.rs b/src/wireguard/types/bind.rs
deleted file mode 100644
index 3d3f187..0000000
--- a/src/wireguard/types/bind.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-use super::Endpoint;
-use std::error::Error;
-
-pub trait Reader<E: Endpoint>: Send + Sync {
- type Error: Error;
-
- fn read(&self, buf: &mut [u8]) -> Result<(usize, E), Self::Error>;
-}
-
-pub trait Writer<E: Endpoint>: Send + Sync + Clone + 'static {
- type Error: Error;
-
- fn write(&self, buf: &[u8], dst: &E) -> Result<(), Self::Error>;
-}
-
-pub trait Bind: Send + Sync + 'static {
- type Error: Error;
- type Endpoint: Endpoint;
-
- /* Until Rust gets type equality constraints these have to be generic */
- type Writer: Writer<Self::Endpoint>;
- type Reader: Reader<Self::Endpoint>;
-}
diff --git a/src/wireguard/types/mod.rs b/src/wireguard/types/mod.rs
deleted file mode 100644
index 20a1238..0000000
--- a/src/wireguard/types/mod.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-mod endpoint;
-mod keys;
-
-pub mod bind;
-pub mod tun;
-
-#[cfg(test)]
-pub mod dummy;
-
-pub use endpoint::Endpoint;
-pub use keys::{Key, KeyPair};
diff --git a/src/wireguard/wireguard.rs b/src/wireguard/wireguard.rs
index 9bcac0a..96a134c 100644
--- a/src/wireguard/wireguard.rs
+++ b/src/wireguard/wireguard.rs
@@ -3,10 +3,10 @@ use super::handshake;
use super::router;
use super::timers::{Events, Timers};
-use super::types::bind::Reader as BindReader;
-use super::types::bind::{Bind, Writer};
-use super::types::tun::{Reader, Tun, MTU};
-use super::types::Endpoint;
+use super::bind::Reader as BindReader;
+use super::bind::{Bind, Writer};
+use super::tun::{Reader, Tun, MTU};
+use super::Endpoint;
use hjul::Runner;