mirror of
https://github.com/cirruslabs/softnet.git
synced 2026-09-29 19:41:10 +02:00
Service port forwarding and is_connected() periodically during traffic (#198)
This commit is contained in:
@@ -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
@@ -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());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user