Use coarsetime::Updater to update time even when deep inside event loop

This commit is contained in:
Nikolay Edigaryev 2026-01-14 18:24:41 +01:00
parent 3fa8c2be5c
commit 6a95272dcf
2 changed files with 10 additions and 11 deletions

View File

@ -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<Poller<'poller>> {
pub fn new<'poller>(vm_fd: RawFd, host_fd: RawFd) -> Result<Poller<'poller>> {
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

View File

@ -49,8 +49,7 @@ impl Proxy<'_> {
) -> Result<Proxy<'proxy>> {
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),