diff options
Diffstat (limited to 'src/router/device.rs')
-rw-r--r-- | src/router/device.rs | 27 |
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!(); } } |