From 115fa574a807877594c3b8cf467798fc0524d007 Mon Sep 17 00:00:00 2001 From: Mathias Hall-Andersen Date: Mon, 9 Dec 2019 13:21:12 +0100 Subject: Move to run queue --- src/wireguard/router/outbound.rs | 138 +++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 69 deletions(-) (limited to 'src/wireguard/router/outbound.rs') diff --git a/src/wireguard/router/outbound.rs b/src/wireguard/router/outbound.rs index d08637b..6c42d8f 100644 --- a/src/wireguard/router/outbound.rs +++ b/src/wireguard/router/outbound.rs @@ -5,6 +5,7 @@ use super::types::Callbacks; use super::KeyPair; use super::REJECT_AFTER_MESSAGES; use super::{tun, udp, Endpoint}; +use super::device::Device; use std::sync::mpsc::Receiver; use std::sync::Arc; @@ -31,78 +32,77 @@ impl Outbound { } #[inline(always)] -fn parallel>( - _peer: &Peer, - body: &mut Outbound, +pub fn parallel>( + device: Device, + receiver: Receiver, Outbound>>, + ) { - log::trace!("worker, parallel section, obtained job"); - - // make space for the tag - body.msg.extend([0u8; SIZE_TAG].iter()); - - // cast to header (should never fail) - let (mut header, packet): (LayoutVerified<&mut [u8], TransportHeader>, &mut [u8]) = - LayoutVerified::new_from_prefix(&mut body.msg[..]) - .expect("earlier code should ensure that there is ample space"); - - // set header fields - debug_assert!( - body.counter < REJECT_AFTER_MESSAGES, - "should be checked when assigning counters" - ); - header.f_type.set(TYPE_TRANSPORT); - header.f_receiver.set(body.keypair.send.id); - header.f_counter.set(body.counter); - - // create a nonce object - let mut nonce = [0u8; 12]; - debug_assert_eq!(nonce.len(), CHACHA20_POLY1305.nonce_len()); - nonce[4..].copy_from_slice(header.f_counter.as_bytes()); - let nonce = Nonce::assume_unique_for_key(nonce); - - // do the weird ring AEAD dance - let key = - LessSafeKey::new(UnboundKey::new(&CHACHA20_POLY1305, &body.keypair.send.key[..]).unwrap()); - - // encrypt content of transport message in-place - let end = packet.len() - SIZE_TAG; - let tag = key - .seal_in_place_separate_tag(nonce, Aad::empty(), &mut packet[..end]) - .unwrap(); - - // append tag - packet[end..].copy_from_slice(tag.as_ref()); -} + fn work>( + _peer: &Peer, + body: &mut Outbound, + ) { + log::trace!("worker, parallel section, obtained job"); + + // make space for the tag + body.msg.extend([0u8; SIZE_TAG].iter()); + + // cast to header (should never fail) + let (mut header, packet): (LayoutVerified<&mut [u8], TransportHeader>, &mut [u8]) = + LayoutVerified::new_from_prefix(&mut body.msg[..]) + .expect("earlier code should ensure that there is ample space"); + + // set header fields + debug_assert!( + body.counter < REJECT_AFTER_MESSAGES, + "should be checked when assigning counters" + ); + header.f_type.set(TYPE_TRANSPORT); + header.f_receiver.set(body.keypair.send.id); + header.f_counter.set(body.counter); + + // create a nonce object + let mut nonce = [0u8; 12]; + debug_assert_eq!(nonce.len(), CHACHA20_POLY1305.nonce_len()); + nonce[4..].copy_from_slice(header.f_counter.as_bytes()); + let nonce = Nonce::assume_unique_for_key(nonce); + + // do the weird ring AEAD dance + let key = + LessSafeKey::new(UnboundKey::new(&CHACHA20_POLY1305, &body.keypair.send.key[..]).unwrap()); + + // encrypt content of transport message in-place + let end = packet.len() - SIZE_TAG; + let tag = key + .seal_in_place_separate_tag(nonce, Aad::empty(), &mut packet[..end]) + .unwrap(); + + // append tag + packet[end..].copy_from_slice(tag.as_ref()); + } -#[inline(always)] -fn sequential>( - peer: &Peer, - body: &mut Outbound, -) { - log::trace!("worker, sequential section, obtained job"); - - // send to peer - let xmit = peer.send(&body.msg[..]).is_ok(); - - // trigger callback - C::send( - &peer.opaque, - body.msg.len(), - xmit, - &body.keypair, - body.counter, - ); + worker_parallel(device, |dev| &dev.run_outbound, receiver, work); } -#[inline(always)] -pub fn queue>( - peer: &Peer, -) -> &InorderQueue, Outbound> { - &peer.outbound -} -pub fn worker>( - receiver: Receiver, Outbound>>, +#[inline(always)] +pub fn sequential>( + device: Device, ) { - worker_template(receiver, parallel, sequential, queue) -} + device.run_outbound.run(|peer| { + peer.outbound.handle(|body| { + log::trace!("worker, sequential section, obtained job"); + + // send to peer + let xmit = peer.send(&body.msg[..]).is_ok(); + + // trigger callback + C::send( + &peer.opaque, + body.msg.len(), + xmit, + &body.keypair, + body.counter, + ); + }); + }); +} \ No newline at end of file -- cgit v1.2.3-59-g8ed1b