diff options
author | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2020-02-20 13:21:37 +0100 |
---|---|---|
committer | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2020-02-20 13:21:37 +0100 |
commit | db02609334482cf391dbf665559ca60654ed4398 (patch) | |
tree | 331adb172b17ccbf5916078ca02968ba5eab0262 /src/wireguard/router/send.rs | |
parent | Simplified router code (diff) | |
download | wireguard-rs-db02609334482cf391dbf665559ca60654ed4398.tar.xz wireguard-rs-db02609334482cf391dbf665559ca60654ed4398.zip |
More comprehensive unit tests for router
Diffstat (limited to 'src/wireguard/router/send.rs')
-rw-r--r-- | src/wireguard/router/send.rs | 89 |
1 files changed, 42 insertions, 47 deletions
diff --git a/src/wireguard/router/send.rs b/src/wireguard/router/send.rs index 8e41796..db6b079 100644 --- a/src/wireguard/router/send.rs +++ b/src/wireguard/router/send.rs @@ -1,9 +1,9 @@ -use super::queue::{SequentialJob, ParallelJob, Queue}; -use super::KeyPair; -use super::types::Callbacks; +use super::messages::{TransportHeader, TYPE_TRANSPORT}; use super::peer::Peer; +use super::queue::{ParallelJob, Queue, SequentialJob}; +use super::types::Callbacks; +use super::KeyPair; use super::{REJECT_AFTER_MESSAGES, SIZE_TAG}; -use super::messages::{TransportHeader, TYPE_TRANSPORT}; use super::super::{tun, udp, Endpoint}; @@ -11,8 +11,8 @@ use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use ring::aead::{Aad, LessSafeKey, Nonce, UnboundKey, CHACHA20_POLY1305}; -use zerocopy::{AsBytes, LayoutVerified}; use spin::Mutex; +use zerocopy::{AsBytes, LayoutVerified}; struct Inner<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> { ready: AtomicBool, @@ -22,67 +22,36 @@ struct Inner<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> { peer: Peer<E, C, T, B>, } -pub struct SendJob<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> ( - Arc<Inner<E, C, T, B>> +pub struct SendJob<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>( + Arc<Inner<E, C, T, B>>, ); -impl <E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> Clone for SendJob<E, C, T, B> { +impl<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> Clone for SendJob<E, C, T, B> { fn clone(&self) -> SendJob<E, C, T, B> { SendJob(self.0.clone()) } } -impl <E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> SendJob<E, C, T, B> { +impl<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> SendJob<E, C, T, B> { pub fn new( buffer: Vec<u8>, counter: u64, keypair: Arc<KeyPair>, - peer: Peer<E, C, T, B> + peer: Peer<E, C, T, B>, ) -> SendJob<E, C, T, B> { - SendJob(Arc::new(Inner{ + SendJob(Arc::new(Inner { buffer: Mutex::new(buffer), counter, keypair, peer, - ready: AtomicBool::new(false) + ready: AtomicBool::new(false), })) } } -impl <E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> SequentialJob for SendJob<E, C, T, B> { - - fn is_ready(&self) -> bool { - self.0.ready.load(Ordering::Acquire) - } - - fn sequential_work(self) { - debug_assert_eq!( - self.is_ready(), - true, - "doing sequential work - on an incomplete job" - ); - log::trace!("processing sequential send job"); - - // send to peer - let job = &self.0; - let msg = job.buffer.lock(); - let xmit = job.peer.send_raw(&msg[..]).is_ok(); - - // trigger callback (for timers) - C::send( - &job.peer.opaque, - msg.len(), - xmit, - &job.keypair, - job.counter, - ); - } -} - - -impl <E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> ParallelJob for SendJob<E, C, T, B> { - +impl<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> ParallelJob + for SendJob<E, C, T, B> +{ fn queue(&self) -> &Queue<Self> { &self.0.peer.outbound } @@ -140,4 +109,30 @@ impl <E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> ParallelJob // mark ready self.0.ready.store(true, Ordering::Release); } -}
\ No newline at end of file +} + +impl<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> SequentialJob + for SendJob<E, C, T, B> +{ + fn is_ready(&self) -> bool { + self.0.ready.load(Ordering::Acquire) + } + + fn sequential_work(self) { + debug_assert_eq!( + self.is_ready(), + true, + "doing sequential work + on an incomplete job" + ); + log::trace!("processing sequential send job"); + + // send to peer + let job = &self.0; + let msg = job.buffer.lock(); + let xmit = job.peer.send_raw(&msg[..]).is_ok(); + + // trigger callback (for timers) + C::send(&job.peer.opaque, msg.len(), xmit, &job.keypair, job.counter); + } +} |