From 8551e03ee3a27492f8423db3eda7ddfd1135bd50 Mon Sep 17 00:00:00 2001 From: Mathias Hall-Andersen Date: Thu, 5 Sep 2019 19:55:10 +0200 Subject: Added outbound benchmark Decent performance (~1.5Gb/s on old XPS laptop from 2014), biggest bottleneck seems to be the heap allocator, swapping with jemalloc yields 2x performance. --- src/router/workers.rs | 107 ++++++++++++++++++++++++-------------------------- 1 file changed, 52 insertions(+), 55 deletions(-) (limited to 'src/router/workers.rs') diff --git a/src/router/workers.rs b/src/router/workers.rs index ec6db57..b18b038 100644 --- a/src/router/workers.rs +++ b/src/router/workers.rs @@ -8,6 +8,7 @@ use futures::*; use log::debug; use ring::aead::{Aad, LessSafeKey, Nonce, UnboundKey, CHACHA20_POLY1305}; +use std::sync::atomic::{AtomicBool, Ordering}; use zerocopy::{AsBytes, LayoutVerified}; use super::device::DecryptionState; @@ -40,67 +41,63 @@ pub fn worker_inbound( peer: Arc>, // related peer receiver: Receiver>, ) { - /* - fn inner( - device: &Arc>, - peer: &Arc>, - ) { - // wait for job to complete - loop { - match buf.try_lock() { - None => (), - Some(buf) => match buf.status { - Status::Fault => break (), - Status::Done => { - // parse / cast - let (header, packet) = match LayoutVerified::new_from_prefix(&buf.msg[..]) { - Some(v) => v, - None => continue, - }; - let header: LayoutVerified<&[u8], TransportHeader> = header; - - // obtain strong reference to decryption state - let state = if let Some(state) = state.upgrade() { - state - } else { - break; - }; - - // check for replay - if !state.protector.lock().update(header.f_counter.get()) { - break; - } + loop { + // fetch job + let (state, rx) = match receiver.recv() { + Ok(v) => v, + _ => { + return; + } + }; - // check for confirms key - if !state.confirmed.swap(true, Ordering::SeqCst) { - peer.confirm_key(state.keypair.clone()); + // wait for job to complete + let _ = rx + .map(|buf| { + if buf.okay { + // parse / cast + let (header, packet) = match LayoutVerified::new_from_prefix(&buf.msg[..]) { + Some(v) => v, + None => { + return; } + }; + let header: LayoutVerified<&[u8], TransportHeader> = header; + + // obtain strong reference to decryption state + let state = if let Some(state) = state.upgrade() { + state + } else { + return; + }; + + // check for replay + if !state.protector.lock().update(header.f_counter.get()) { + return; + } - // update endpoint, TODO - - // write packet to TUN device, TODO - - // trigger callback - debug_assert!( - packet.len() >= CHACHA20_POLY1305.nonce_len(), - "this should be checked earlier in the pipeline" - ); - (device.call_recv)( - &peer.opaque, - packet.len() > CHACHA20_POLY1305.nonce_len(), - true, - ); - break; + // check for confirms key + if !state.confirmed.swap(true, Ordering::SeqCst) { + peer.confirm_key(state.keypair.clone()); } - _ => (), - }, - }; - // default is to park - thread::park() - } + // update endpoint, TODO + + // write packet to TUN device, TODO + + // trigger callback + debug_assert!( + packet.len() >= CHACHA20_POLY1305.nonce_len(), + "this should be checked earlier in the pipeline" + ); + (device.call_recv)( + &peer.opaque, + packet.len() > CHACHA20_POLY1305.nonce_len(), + true, + ); + } + }) + .wait(); } - */ } pub fn worker_outbound( -- cgit v1.2.3-59-g8ed1b