Service port forwarding and is_connected() periodically during traffic (#198)

This commit is contained in:
edi-oai
2026-08-18 22:18:34 +01:00
committed by GitHub
parent e5fd48cf03
commit 3656e8b55e
2 changed files with 19 additions and 7 deletions
+12
View File
@@ -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<BorrowedFd<'poller>>,
@@ -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)?;
+7 -7
View File
@@ -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());
}