From 6a95272dcf4ad7bba2f70d45b587aa7206ca56e7 Mon Sep 17 00:00:00 2001 From: Nikolay Edigaryev Date: Wed, 14 Jan 2026 18:24:41 +0100 Subject: [PATCH] Use coarsetime::Updater to update time even when deep inside event loop --- lib/poller.rs | 11 +++-------- lib/proxy/mod.rs | 10 +++++++--- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/lib/poller.rs b/lib/poller.rs index 27e38f4..24a657d 100644 --- a/lib/poller.rs +++ b/lib/poller.rs @@ -9,7 +9,6 @@ use std::time::Duration; pub struct Poller<'poller> { poller: polling::Poller, events: polling::Events, - timeout: Duration, vm_fd: BorrowedFd<'poller>, host_fd: BorrowedFd<'poller>, } @@ -23,17 +22,12 @@ enum EventKey { } impl Poller<'_> { - pub fn new<'poller>( - vm_fd: RawFd, - host_fd: RawFd, - timeout: Duration, - ) -> Result> { + pub fn new<'poller>(vm_fd: RawFd, host_fd: RawFd) -> Result> { let poller = polling::Poller::new()?; Ok(Poller { poller, events: polling::Events::new(), - timeout, vm_fd: unsafe { BorrowedFd::borrow_raw(vm_fd) }, host_fd: unsafe { BorrowedFd::borrow_raw(host_fd) }, }) @@ -65,7 +59,8 @@ impl Poller<'_> { } pub fn wait(&mut self) -> Result<(bool, bool, bool)> { - self.poller.wait(&mut self.events, Some(self.timeout))?; + self.poller + .wait(&mut self.events, Some(Duration::from_millis(100)))?; let vm_readable = self .events diff --git a/lib/proxy/mod.rs b/lib/proxy/mod.rs index 62099d4..e3a44eb 100644 --- a/lib/proxy/mod.rs +++ b/lib/proxy/mod.rs @@ -49,8 +49,7 @@ impl Proxy<'_> { ) -> Result> { let vm = VM::new(vm_fd)?; let host = Host::new(vm_net_type, !allow.contains(&Ipv4Net::zero()))?; - let poller_timeout = Duration::from_millis(100); - let poller = Poller::new(vm.as_raw_fd(), host.as_raw_fd(), poller_timeout)?; + let poller = Poller::new(vm.as_raw_fd(), host.as_raw_fd())?; // Craft packet filter rules // @@ -66,12 +65,17 @@ impl Proxy<'_> { rules.insert(block_net, Action::Block); } + let coarsetime_update_interval_millis = 100; + coarsetime::Updater::new(coarsetime_update_interval_millis).start()?; + Ok(Proxy { vm, host, poller, vm_mac_address: smoltcp::wire::EthernetAddress(vm_mac_address.bytes()), - dhcp_snooper: DhcpSnooper::new(poller_timeout), + dhcp_snooper: DhcpSnooper::new(Duration::from_millis( + coarsetime_update_interval_millis, + )), rules, enobufs_encountered: false, port_forwarder: PortForwarder::new(exposed_ports),