Reconsider inorder queueing

This commit is contained in:
Mathias Hall-Andersen
2019-09-02 20:22:47 +02:00
parent 929eadb651
commit 62d71a7a67
6 changed files with 85 additions and 17 deletions

View File

@@ -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!();
}
}