aboutsummaryrefslogtreecommitdiffstats
path: root/src/interface
diff options
context:
space:
mode:
authorJake McGinty <me@jake.su>2018-05-03 18:01:57 -0700
committerJake McGinty <me@jake.su>2018-05-03 18:01:57 -0700
commitdb6bc2e8118b5f8d46a983e7d4bf3f0075cab356 (patch)
treeb9fa5e3998ef547fa5ee5d9c60dc04889f650ab5 /src/interface
parenttimers: create Timers struct to store more detailed timer info (diff)
downloadwireguard-rs-db6bc2e8118b5f8d46a983e7d4bf3f0075cab356.tar.xz
wireguard-rs-db6bc2e8118b5f8d46a983e7d4bf3f0075cab356.zip
timers: refactor out timers from Session struct
Diffstat (limited to 'src/interface')
-rw-r--r--src/interface/peer_server.rs24
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;
}
}