diff options
author | Jake McGinty <me@jake.su> | 2018-05-03 18:01:57 -0700 |
---|---|---|
committer | Jake McGinty <me@jake.su> | 2018-05-03 18:01:57 -0700 |
commit | db6bc2e8118b5f8d46a983e7d4bf3f0075cab356 (patch) | |
tree | b9fa5e3998ef547fa5ee5d9c60dc04889f650ab5 /src/interface/peer_server.rs | |
parent | timers: create Timers struct to store more detailed timer info (diff) | |
download | wireguard-rs-db6bc2e8118b5f8d46a983e7d4bf3f0075cab356.tar.xz wireguard-rs-db6bc2e8118b5f8d46a983e7d4bf3f0075cab356.zip |
timers: refactor out timers from Session struct
Diffstat (limited to 'src/interface/peer_server.rs')
-rw-r--r-- | src/interface/peer_server.rs | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/src/interface/peer_server.rs b/src/interface/peer_server.rs index 15268ff..2053a8c 100644 --- a/src/interface/peer_server.rs +++ b/src/interface/peer_server.rs @@ -338,9 +338,13 @@ impl PeerServer { } }, Some((_, SessionType::Current)) => { - let since_last_recv = peer.sessions.current.as_ref().unwrap().last_received.elapsed(); // TODO: gross - if since_last_recv <= *STALE_SESSION_TIMEOUT { - let wait = *STALE_SESSION_TIMEOUT - since_last_recv; + if *peer.timers.authenticated_received > *peer.timers.data_sent { + self.timer.send_after(*STALE_SESSION_TIMEOUT, Rekey(peer_ref.clone(), our_index)); + bail!("rekey tick (waiting STALE_SESSION_TIMEOUT since authenticated packet received more recently than sent)"); + } + let since_last_send = peer.timers.data_sent.elapsed(); + if since_last_send <= *STALE_SESSION_TIMEOUT { + let wait = *STALE_SESSION_TIMEOUT - since_last_send; self.timer.send_after(wait, Rekey(peer_ref.clone(), our_index)); bail!("rekey tick (waiting ~{}s due to stale session check)", wait.as_secs()); } @@ -355,11 +359,13 @@ impl PeerServer { PassiveKeepAlive(peer_ref, our_index) => { let mut peer = peer_ref.borrow_mut(); { - let (session, session_type) = peer.find_session(our_index).ok_or_else(|| err_msg("missing session for timer"))?; - ensure!(session_type == SessionType::Current, "expired session for passive keepalive timer"); + if peer.sessions.current.is_none() { + self.timer.send_after(*KEEPALIVE_TIMEOUT, PassiveKeepAlive(peer_ref.clone(), our_index)); + bail!("no active session. waiting until there is one."); + } - let since_last_recv = session.last_received.elapsed(); - let since_last_send = session.last_sent.elapsed(); + let since_last_recv = peer.timers.data_received.elapsed(); + let since_last_send = peer.timers.data_sent.elapsed(); if since_last_recv < *KEEPALIVE_TIMEOUT { let wait = *KEEPALIVE_TIMEOUT - since_last_recv; self.timer.send_after(wait, PassiveKeepAlive(peer_ref.clone(), our_index)); @@ -368,11 +374,11 @@ impl PeerServer { let wait = *KEEPALIVE_TIMEOUT - since_last_send; self.timer.send_after(wait, PassiveKeepAlive(peer_ref.clone(), our_index)); bail!("passive keepalive tick (waiting ~{}s due to last send time)", wait.as_secs()); - } else if session.keepalive_sent { + } else if peer.timers.keepalive_sent { self.timer.send_after(*KEEPALIVE_TIMEOUT, PassiveKeepAlive(peer_ref.clone(), our_index)); bail!("passive keepalive already sent (waiting ~{}s to see if session survives)", KEEPALIVE_TIMEOUT.as_secs()); } else { - session.keepalive_sent = true; + peer.timers.keepalive_sent = true; } } |