Formatting
This commit is contained in:
@@ -20,8 +20,8 @@ use super::peer::{new_peer, Peer, PeerHandle};
|
|||||||
use super::types::{Callbacks, RouterError};
|
use super::types::{Callbacks, RouterError};
|
||||||
use super::SIZE_MESSAGE_PREFIX;
|
use super::SIZE_MESSAGE_PREFIX;
|
||||||
|
|
||||||
use super::runq::RunQueue;
|
|
||||||
use super::route::RoutingTable;
|
use super::route::RoutingTable;
|
||||||
|
use super::runq::RunQueue;
|
||||||
|
|
||||||
use super::super::{tun, udp, Endpoint, KeyPair};
|
use super::super::{tun, udp, Endpoint, KeyPair};
|
||||||
use super::queue::ParallelQueue;
|
use super::queue::ParallelQueue;
|
||||||
@@ -137,7 +137,7 @@ impl<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> DeviceHandle<
|
|||||||
run_outbound: RunQueue::new(),
|
run_outbound: RunQueue::new(),
|
||||||
recv: RwLock::new(HashMap::new()),
|
recv: RwLock::new(HashMap::new()),
|
||||||
table: RoutingTable::new(),
|
table: RoutingTable::new(),
|
||||||
})
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
// start worker threads
|
// start worker threads
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
use super::device::DecryptionState;
|
use super::device::DecryptionState;
|
||||||
|
use super::device::Device;
|
||||||
use super::messages::TransportHeader;
|
use super::messages::TransportHeader;
|
||||||
use super::peer::Peer;
|
use super::peer::Peer;
|
||||||
use super::pool::*;
|
use super::pool::*;
|
||||||
|
use super::runq::RunQueue;
|
||||||
use super::types::Callbacks;
|
use super::types::Callbacks;
|
||||||
use super::{tun, udp, Endpoint};
|
use super::{tun, udp, Endpoint};
|
||||||
use super::device::Device;
|
|
||||||
use super::runq::RunQueue;
|
|
||||||
|
|
||||||
use ring::aead::{Aad, LessSafeKey, Nonce, UnboundKey, CHACHA20_POLY1305};
|
use ring::aead::{Aad, LessSafeKey, Nonce, UnboundKey, CHACHA20_POLY1305};
|
||||||
use zerocopy::{AsBytes, LayoutVerified};
|
use zerocopy::{AsBytes, LayoutVerified};
|
||||||
@@ -47,10 +47,10 @@ pub fn parallel<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
|||||||
// run queue to schedule
|
// run queue to schedule
|
||||||
fn queue<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
fn queue<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
||||||
device: &Device<E, C, T, B>,
|
device: &Device<E, C, T, B>,
|
||||||
) -> &RunQueue<Peer<E, C, T, B>> {
|
) -> &RunQueue<Peer<E, C, T, B>> {
|
||||||
&device.run_inbound
|
&device.run_inbound
|
||||||
}
|
}
|
||||||
|
|
||||||
// parallel work to apply
|
// parallel work to apply
|
||||||
fn work<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
fn work<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
||||||
peer: &Peer<E, C, T, B>,
|
peer: &Peer<E, C, T, B>,
|
||||||
@@ -130,7 +130,7 @@ pub fn sequential<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
|||||||
// sequential work to apply
|
// sequential work to apply
|
||||||
fn work<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
fn work<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
||||||
peer: &Peer<E, C, T, B>,
|
peer: &Peer<E, C, T, B>,
|
||||||
body: &mut Inbound<E, C, T, B>
|
body: &mut Inbound<E, C, T, B>,
|
||||||
) {
|
) {
|
||||||
log::trace!("worker, sequential section, obtained job");
|
log::trace!("worker, sequential section, obtained job");
|
||||||
|
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ mod peer;
|
|||||||
mod pool;
|
mod pool;
|
||||||
mod queue;
|
mod queue;
|
||||||
mod route;
|
mod route;
|
||||||
mod types;
|
|
||||||
mod runq;
|
mod runq;
|
||||||
|
mod types;
|
||||||
|
|
||||||
// mod workers;
|
// mod workers;
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use super::device::Device;
|
||||||
use super::messages::{TransportHeader, TYPE_TRANSPORT};
|
use super::messages::{TransportHeader, TYPE_TRANSPORT};
|
||||||
use super::peer::Peer;
|
use super::peer::Peer;
|
||||||
use super::pool::*;
|
use super::pool::*;
|
||||||
@@ -5,7 +6,6 @@ use super::types::Callbacks;
|
|||||||
use super::KeyPair;
|
use super::KeyPair;
|
||||||
use super::REJECT_AFTER_MESSAGES;
|
use super::REJECT_AFTER_MESSAGES;
|
||||||
use super::{tun, udp, Endpoint};
|
use super::{tun, udp, Endpoint};
|
||||||
use super::device::Device;
|
|
||||||
|
|
||||||
use std::sync::mpsc::Receiver;
|
use std::sync::mpsc::Receiver;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@@ -35,7 +35,6 @@ impl Outbound {
|
|||||||
pub fn parallel<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
pub fn parallel<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
||||||
device: Device<E, C, T, B>,
|
device: Device<E, C, T, B>,
|
||||||
receiver: Receiver<Job<Peer<E, C, T, B>, Outbound>>,
|
receiver: Receiver<Job<Peer<E, C, T, B>, Outbound>>,
|
||||||
|
|
||||||
) {
|
) {
|
||||||
fn work<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
fn work<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
||||||
_peer: &Peer<E, C, T, B>,
|
_peer: &Peer<E, C, T, B>,
|
||||||
@@ -67,8 +66,9 @@ pub fn parallel<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
|||||||
let nonce = Nonce::assume_unique_for_key(nonce);
|
let nonce = Nonce::assume_unique_for_key(nonce);
|
||||||
|
|
||||||
// do the weird ring AEAD dance
|
// do the weird ring AEAD dance
|
||||||
let key =
|
let key = LessSafeKey::new(
|
||||||
LessSafeKey::new(UnboundKey::new(&CHACHA20_POLY1305, &body.keypair.send.key[..]).unwrap());
|
UnboundKey::new(&CHACHA20_POLY1305, &body.keypair.send.key[..]).unwrap(),
|
||||||
|
);
|
||||||
|
|
||||||
// encrypt content of transport message in-place
|
// encrypt content of transport message in-place
|
||||||
let end = packet.len() - SIZE_TAG;
|
let end = packet.len() - SIZE_TAG;
|
||||||
@@ -83,7 +83,6 @@ pub fn parallel<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
|||||||
worker_parallel(device, |dev| &dev.run_outbound, receiver, work);
|
worker_parallel(device, |dev| &dev.run_outbound, receiver, work);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn sequential<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
pub fn sequential<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
||||||
device: Device<E, C, T, B>,
|
device: Device<E, C, T, B>,
|
||||||
@@ -105,4 +104,4 @@ pub fn sequential<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>>(
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ use super::device::EncryptionState;
|
|||||||
use super::messages::TransportHeader;
|
use super::messages::TransportHeader;
|
||||||
|
|
||||||
use super::constants::*;
|
use super::constants::*;
|
||||||
|
use super::runq::ToKey;
|
||||||
use super::types::{Callbacks, RouterError};
|
use super::types::{Callbacks, RouterError};
|
||||||
use super::SIZE_MESSAGE_PREFIX;
|
use super::SIZE_MESSAGE_PREFIX;
|
||||||
use super::runq::ToKey;
|
|
||||||
|
|
||||||
// worker pool related
|
// worker pool related
|
||||||
use super::inbound::Inbound;
|
use super::inbound::Inbound;
|
||||||
@@ -86,8 +86,7 @@ impl<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> Deref for Pee
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* A peer handle is a specially designated peer pointer
|
||||||
/* A peer handle is a specially designated peer pointer
|
|
||||||
* which removes the peer from the device when dropped.
|
* which removes the peer from the device when dropped.
|
||||||
*/
|
*/
|
||||||
pub struct PeerHandle<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> {
|
pub struct PeerHandle<E: Endpoint, C: Callbacks, T: tun::Writer, B: udp::Writer<E>> {
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
use arraydeque::ArrayDeque;
|
use arraydeque::ArrayDeque;
|
||||||
use spin::{Mutex, MutexGuard};
|
use spin::{Mutex, MutexGuard};
|
||||||
|
use std::mem;
|
||||||
use std::sync::mpsc::Receiver;
|
use std::sync::mpsc::Receiver;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use std::mem;
|
|
||||||
|
|
||||||
use super::runq::{RunQueue, ToKey};
|
use super::runq::{RunQueue, ToKey};
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@ impl<P, B> InorderQueue<P, B> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// apply function if job complete
|
// apply function if job complete
|
||||||
let ret = if let Some(mut guard) = elem.complete() {
|
let ret = if let Some(mut guard) = elem.complete() {
|
||||||
mem::drop(queue);
|
mem::drop(queue);
|
||||||
@@ -100,9 +100,9 @@ impl<P, B> InorderQueue<P, B> {
|
|||||||
/// Applicable for both decryption and encryption workers.
|
/// Applicable for both decryption and encryption workers.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn worker_parallel<
|
pub fn worker_parallel<
|
||||||
P : ToKey, // represents a peer (atomic reference counted pointer)
|
P: ToKey, // represents a peer (atomic reference counted pointer)
|
||||||
B, // inner body type (message buffer, key material, ...)
|
B, // inner body type (message buffer, key material, ...)
|
||||||
D, // device
|
D, // device
|
||||||
W: Fn(&P, &mut B),
|
W: Fn(&P, &mut B),
|
||||||
Q: Fn(&D) -> &RunQueue<P>,
|
Q: Fn(&D) -> &RunQueue<P>,
|
||||||
>(
|
>(
|
||||||
@@ -131,8 +131,8 @@ pub fn worker_parallel<
|
|||||||
work(&peer, &mut job.body);
|
work(&peer, &mut job.body);
|
||||||
peer
|
peer
|
||||||
};
|
};
|
||||||
|
|
||||||
// process inorder jobs for peer
|
// process inorder jobs for peer
|
||||||
queue(&device).insert(peer);
|
queue(&device).insert(peer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ impl<T: Eq + Clone> RoutingTable<T> {
|
|||||||
v => {
|
v => {
|
||||||
log::trace!("router, invalid IP version {}", v);
|
log::trace!("router, invalid IP version {}", v);
|
||||||
None
|
None
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
|
use std::hash::Hash;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::sync::{Condvar, Mutex};
|
use std::sync::{Condvar, Mutex};
|
||||||
use std::hash::Hash;
|
|
||||||
|
|
||||||
use std::collections::hash_map::Entry;
|
use std::collections::hash_map::Entry;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
@@ -11,18 +11,18 @@ pub trait ToKey {
|
|||||||
fn to_key(&self) -> Self::Key;
|
fn to_key(&self) -> Self::Key;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct RunQueue<T : ToKey> {
|
pub struct RunQueue<T: ToKey> {
|
||||||
cvar: Condvar,
|
cvar: Condvar,
|
||||||
inner: Mutex<Inner<T>>,
|
inner: Mutex<Inner<T>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Inner<T : ToKey> {
|
struct Inner<T: ToKey> {
|
||||||
stop: bool,
|
stop: bool,
|
||||||
queue: VecDeque<T>,
|
queue: VecDeque<T>,
|
||||||
members: HashMap<T::Key, usize>,
|
members: HashMap<T::Key, usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T : ToKey> RunQueue<T> {
|
impl<T: ToKey> RunQueue<T> {
|
||||||
pub fn close(&self) {
|
pub fn close(&self) {
|
||||||
let mut inner = self.inner.lock().unwrap();
|
let mut inner = self.inner.lock().unwrap();
|
||||||
inner.stop = true;
|
inner.stop = true;
|
||||||
@@ -33,7 +33,7 @@ impl<T : ToKey> RunQueue<T> {
|
|||||||
RunQueue {
|
RunQueue {
|
||||||
cvar: Condvar::new(),
|
cvar: Condvar::new(),
|
||||||
inner: Mutex::new(Inner {
|
inner: Mutex::new(Inner {
|
||||||
stop:false,
|
stop: false,
|
||||||
queue: VecDeque::new(),
|
queue: VecDeque::new(),
|
||||||
members: HashMap::new(),
|
members: HashMap::new(),
|
||||||
}),
|
}),
|
||||||
@@ -111,8 +111,8 @@ impl<T : ToKey> RunQueue<T> {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
use std::thread;
|
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::thread;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -142,4 +142,4 @@ mod tests {
|
|||||||
|
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -157,7 +157,7 @@ mod tests {
|
|||||||
let dst = dst.parse().unwrap();
|
let dst = dst.parse().unwrap();
|
||||||
let src = match dst {
|
let src = match dst {
|
||||||
IpAddr::V4(_) => "127.0.0.1".parse().unwrap(),
|
IpAddr::V4(_) => "127.0.0.1".parse().unwrap(),
|
||||||
IpAddr::V6(_) => "::1".parse().unwrap()
|
IpAddr::V6(_) => "::1".parse().unwrap(),
|
||||||
};
|
};
|
||||||
let msg = make_packet_padded(1024, src, dst, 0);
|
let msg = make_packet_padded(1024, src, dst, 0);
|
||||||
|
|
||||||
@@ -204,7 +204,13 @@ mod tests {
|
|||||||
];
|
];
|
||||||
|
|
||||||
for (num, (mask, len, dst, okay)) in tests.iter().enumerate() {
|
for (num, (mask, len, dst, okay)) in tests.iter().enumerate() {
|
||||||
println!("Check: {} {} {}/{}", dst, if *okay { "\\in" } else { "\\notin" }, mask, len);
|
println!(
|
||||||
|
"Check: {} {} {}/{}",
|
||||||
|
dst,
|
||||||
|
if *okay { "\\in" } else { "\\notin" },
|
||||||
|
mask,
|
||||||
|
len
|
||||||
|
);
|
||||||
for set_key in vec![true, false] {
|
for set_key in vec![true, false] {
|
||||||
debug!("index = {}, set_key = {}", num, set_key);
|
debug!("index = {}, set_key = {}", num, set_key);
|
||||||
|
|
||||||
@@ -223,7 +229,7 @@ mod tests {
|
|||||||
let dst = dst.parse().unwrap();
|
let dst = dst.parse().unwrap();
|
||||||
let src = match dst {
|
let src = match dst {
|
||||||
IpAddr::V4(_) => "127.0.0.1".parse().unwrap(),
|
IpAddr::V4(_) => "127.0.0.1".parse().unwrap(),
|
||||||
IpAddr::V6(_) => "::1".parse().unwrap()
|
IpAddr::V6(_) => "::1".parse().unwrap(),
|
||||||
};
|
};
|
||||||
let msg = make_packet_padded(1024, src, dst, 0);
|
let msg = make_packet_padded(1024, src, dst, 0);
|
||||||
|
|
||||||
@@ -432,13 +438,12 @@ mod tests {
|
|||||||
// pass IP packet to router
|
// pass IP packet to router
|
||||||
let (_mask, _len, ip1, _okay) = p1;
|
let (_mask, _len, ip1, _okay) = p1;
|
||||||
let (_mask, _len, ip2, _okay) = p2;
|
let (_mask, _len, ip2, _okay) = p2;
|
||||||
let msg =
|
let msg = make_packet_padded(
|
||||||
make_packet_padded(
|
1024,
|
||||||
1024,
|
ip2.parse().unwrap(), // src
|
||||||
ip2.parse().unwrap(), // src
|
ip1.parse().unwrap(), // dst
|
||||||
ip1.parse().unwrap(), // dst
|
id,
|
||||||
id
|
);
|
||||||
);
|
|
||||||
router1.send(msg).unwrap();
|
router1.send(msg).unwrap();
|
||||||
|
|
||||||
wait();
|
wait();
|
||||||
|
|||||||
Reference in New Issue
Block a user