diff options
author | Jake McGinty <me@jake.su> | 2017-12-30 13:04:15 -0800 |
---|---|---|
committer | Jake McGinty <me@jake.su> | 2017-12-30 13:04:15 -0800 |
commit | 7cb2898e50d70571575505c416d5410f3d350393 (patch) | |
tree | d8dedfb826782b20d9592566f8d6f3f7271b7855 /src | |
parent | PeerServer custom future refactor (diff) | |
download | wireguard-rs-7cb2898e50d70571575505c416d5410f3d350393.tar.xz wireguard-rs-7cb2898e50d70571575505c416d5410f3d350393.zip |
fallback to previous noise hack
Diffstat (limited to 'src')
-rw-r--r-- | src/interface/peer_server.rs | 17 | ||||
-rw-r--r-- | src/protocol/peer.rs | 8 |
2 files changed, 22 insertions, 3 deletions
diff --git a/src/interface/peer_server.rs b/src/interface/peer_server.rs index b812677..e1af433 100644 --- a/src/interface/peer_server.rs +++ b/src/interface/peer_server.rs @@ -127,9 +127,20 @@ impl PeerServer { let mut peer = peer.borrow_mut(); peer.rx_bytes += packet.len(); - let noise = peer.current_noise().expect("current noise session"); - noise.set_receiving_nonce(nonce).unwrap(); - let payload_len = noise.read_message(&packet[16..], &mut raw_packet).unwrap(); + let res = { + let noise = peer.current_noise().expect("current noise session"); + noise.set_receiving_nonce(nonce).unwrap(); + noise.read_message(&packet[16..], &mut raw_packet) + }; + let payload_len = match res { + Ok(len) => len, + Err(_) => { + let noise = peer.past_noise().expect("no valid noise session"); + noise.set_receiving_nonce(nonce).unwrap(); + noise.read_message(&packet[16..], &mut raw_packet).expect("no valid noise session") + } + }; + debug_packet("received TRANSPORT: ", &raw_packet[..payload_len]); self.handle.spawn(self.tunnel_tx.clone().send(raw_packet[..payload_len].to_owned()) .map(|_| ()) diff --git a/src/protocol/peer.rs b/src/protocol/peer.rs index e26e1bf..47f860a 100644 --- a/src/protocol/peer.rs +++ b/src/protocol/peer.rs @@ -111,6 +111,14 @@ impl Peer { Ok(()) } + pub fn past_noise(&mut self) -> Option<&mut snow::Session> { + if let Some(ref mut session) = self.sessions.past { + Some(&mut session.noise) + } else { + None + } + } + pub fn current_noise(&mut self) -> Option<&mut snow::Session> { if let Some(ref mut session) = self.sessions.current { Some(&mut session.noise) |