diff options
author | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2019-09-15 21:10:23 +0200 |
---|---|---|
committer | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2019-09-15 21:10:23 +0200 |
commit | 32c030367cb017f0318cb97ccf27f8788acadf72 (patch) | |
tree | 6641288107f77ee34bea82301927e9af85df8c17 /src/router/peer.rs | |
parent | Sent staged packets when key-pair confirmed (diff) | |
download | wireguard-rs-32c030367cb017f0318cb97ccf27f8788acadf72.tar.xz wireguard-rs-32c030367cb017f0318cb97ccf27f8788acadf72.zip |
WIP: Handshake queue and workers
Diffstat (limited to 'src/router/peer.rs')
-rw-r--r-- | src/router/peer.rs | 50 |
1 files changed, 31 insertions, 19 deletions
diff --git a/src/router/peer.rs b/src/router/peer.rs index 728be11..952e439 100644 --- a/src/router/peer.rs +++ b/src/router/peer.rs @@ -308,28 +308,40 @@ impl<C: Callbacks, T: Tun, B: Bind> PeerInner<C, T, B> { let mut header: LayoutVerified<&mut [u8], TransportHeader> = header; // check if has key - let key = match self.ekey.lock().as_mut() { - None => { - // add to staged packets (create no job) - debug!("execute callback: call_need_key"); - C::need_key(&self.opaque); + let key = { + let mut ekey = self.ekey.lock(); + let key = match ekey.as_mut() { + None => None, + Some(mut state) => { + // avoid integer overflow in nonce + if state.nonce >= REJECT_AFTER_MESSAGES - 1 { + *ekey = None; + None + } else { + // there should be no stacked packets lingering around + debug_assert_eq!(self.staged_packets.lock().len(), 0); + debug!("encryption state available, nonce = {}", state.nonce); + + // set transport message fields + header.f_counter.set(state.nonce); + header.f_receiver.set(state.id); + state.nonce += 1; + Some(state.key) + } + } + }; + + // If not suitable key was found: + // 1. Stage packet for later transmission + // 2. Request new key + if key.is_none() { self.staged_packets.lock().push_back(msg); + C::need_key(&self.opaque); return None; - } - Some(mut state) => { - // avoid integer overflow in nonce - if state.nonce >= REJECT_AFTER_MESSAGES - 1 { - return None; - } - debug!("encryption state available, nonce = {}", state.nonce); + }; - // set transport message fields - header.f_counter.set(state.nonce); - header.f_receiver.set(state.id); - state.nonce += 1; - state.key - } - }; + key + }?; // add job to in-order queue and return sendeer to device for inclusion in worker pool let (tx, rx) = oneshot(); |