aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJake McGinty <me@jake.su>2017-12-30 13:04:15 -0800
committerJake McGinty <me@jake.su>2017-12-30 13:04:15 -0800
commit7cb2898e50d70571575505c416d5410f3d350393 (patch)
treed8dedfb826782b20d9592566f8d6f3f7271b7855 /src
parentPeerServer custom future refactor (diff)
downloadwireguard-rs-7cb2898e50d70571575505c416d5410f3d350393.tar.xz
wireguard-rs-7cb2898e50d70571575505c416d5410f3d350393.zip
fallback to previous noise hack
Diffstat (limited to 'src')
-rw-r--r--src/interface/peer_server.rs17
-rw-r--r--src/protocol/peer.rs8
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)