diff --git a/lib/poller.rs b/lib/poller.rs index 0785689..7c7dc1b 100644 --- a/lib/poller.rs +++ b/lib/poller.rs @@ -10,6 +10,7 @@ pub struct Poller<'poller> { poller: polling::Poller, events: polling::Events, timeout: Duration, + last_periodic_tick: coarsetime::Instant, vm_fd: BorrowedFd<'poller>, host_fd: BorrowedFd<'poller>, control_fd: Option>, @@ -37,6 +38,7 @@ impl Poller<'_> { poller, events: polling::Events::new(), timeout, + last_periodic_tick: coarsetime::Instant::recent(), vm_fd: unsafe { BorrowedFd::borrow_raw(vm_fd) }, host_fd: unsafe { BorrowedFd::borrow_raw(host_fd) }, control_fd: control_fd.map(|fd| unsafe { BorrowedFd::borrow_raw(fd) }), @@ -94,6 +96,16 @@ impl Poller<'_> { Ok((vm_readable, host_readable, interrupt)) } + pub fn periodic_tick_due(&mut self) -> bool { + let due = self.last_periodic_tick.elapsed_since_recent() >= self.timeout.into(); + + if due { + self.last_periodic_tick = coarsetime::Instant::recent(); + } + + due + } + pub fn remove_control(&mut self) -> Result<()> { if let Some(control_fd) = self.control_fd.take() { self.poller.delete(control_fd)?; diff --git a/lib/proxy/mod.rs b/lib/proxy/mod.rs index 5e0324e..c3ddd65 100644 --- a/lib/proxy/mod.rs +++ b/lib/proxy/mod.rs @@ -108,11 +108,6 @@ impl Proxy<'_> { loop { let (vm_readable, host_readable, interrupt) = self.poller.wait()?; - // kqueue does not report peer disconnects for Unix datagram sockets. - if !self.vm.is_connected()? { - return Ok(()); - } - // Update coarse time for DHCP snooping and flows coarsetime::Instant::update(); @@ -133,8 +128,13 @@ impl Proxy<'_> { return Ok(()); } - // Timeout - if !vm_readable && !host_readable && !interrupt { + // Periodic maintenance + if self.poller.periodic_tick_due() { + // kqueue(2) does not report peer disconnects for Unix datagram sockets + if !self.vm.is_connected()? { + return Ok(()); + } + self.port_forwarder .tick(&mut self.host, self.dhcp_snooper.lease()); }