summaryrefslogtreecommitdiffstats
path: root/src/router/device.rs
diff options
context:
space:
mode:
authorMathias Hall-Andersen <mathias@hall-andersen.dk>2019-09-02 20:22:47 +0200
committerMathias Hall-Andersen <mathias@hall-andersen.dk>2019-09-02 20:22:47 +0200
commit62d71a7a67e2f4e32a8fc48d3e483fecea2c352e (patch)
tree3fd87e5878d4ca533e65b65351ed7a7a05b84ef5 /src/router/device.rs
parentOutbound cryptkey routing (diff)
downloadwireguard-rs-62d71a7a67e2f4e32a8fc48d3e483fecea2c352e.tar.xz
wireguard-rs-62d71a7a67e2f4e32a8fc48d3e483fecea2c352e.zip
Reconsider inorder queueing
Diffstat (limited to 'src/router/device.rs')
-rw-r--r--src/router/device.rs27
1 files changed, 23 insertions, 4 deletions
diff --git a/src/router/device.rs b/src/router/device.rs
index 4fb0334..f1cbb70 100644
--- a/src/router/device.rs
+++ b/src/router/device.rs
@@ -17,6 +17,7 @@ use super::peer;
use super::peer::{Peer, PeerInner};
use super::SIZE_MESSAGE_PREFIX;
+use super::messages::TYPE_TRANSPORT;
use super::types::{Callback, Callbacks, KeyCallback, Opaque, PhantomCallbacks, RouterError};
use super::workers::{worker_parallel, JobParallel};
@@ -66,8 +67,8 @@ pub struct DecryptionState<C: Callbacks, T: Tun, B: Bind> {
}
pub struct Device<C: Callbacks, T: Tun, B: Bind>(
- Arc<DeviceInner<C, T, B>>,
- Vec<thread::JoinHandle<()>>,
+ Arc<DeviceInner<C, T, B>>, // reference to device state
+ Vec<thread::JoinHandle<()>>, // join handles for workers
);
impl<C: Callbacks, T: Tun, B: Bind> Drop for Device<C, T, B> {
@@ -207,8 +208,17 @@ impl<C: Callbacks, T: Tun, B: Bind> Device<C, T, B> {
// schedule for encryption and transmission to peer
if let Some(job) = peer.send_job(msg) {
+ println!("made job!");
self.0.injector.push((peer.clone(), job));
}
+
+ // ensure workers running
+ if self.0.parked.load(Ordering::Acquire) {
+ for handle in &self.1 {
+ handle.thread().unpark();
+ }
+ }
+
Ok(())
}
@@ -216,8 +226,17 @@ impl<C: Callbacks, T: Tun, B: Bind> Device<C, T, B> {
///
/// # Arguments
///
- /// - ct_msg: Encrypted transport message
- pub fn recv(&self, ct_msg: &mut [u8]) {
+ /// - msg: Encrypted transport message
+ pub fn recv(&self, msg: Vec<u8>) -> Result<(), RouterError> {
+ // ensure that the type field access is within bounds
+ if msg.len() < SIZE_MESSAGE_PREFIX || msg[0] != TYPE_TRANSPORT {
+ return Err(RouterError::MalformedTransportMessage);
+ }
+
+ // parse / cast
+
+ // lookup peer based on receiver id
+
unimplemented!();
}
}