From 37e99bbbb0e5630ca295ee50884b37dc3d54c5c9 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Thu, 3 Sep 2020 10:37:36 +0100 Subject: [PATCH] virtio-devices: rng: Port to VirtioCommon for feature handling Signed-off-by: Rob Bradford --- virtio-devices/src/rng.rs | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/virtio-devices/src/rng.rs b/virtio-devices/src/rng.rs index dca85337a..d18eb054a 100644 --- a/virtio-devices/src/rng.rs +++ b/virtio-devices/src/rng.rs @@ -5,7 +5,7 @@ use super::Error as DeviceError; use super::{ ActivateError, ActivateResult, EpollHelper, EpollHelperError, EpollHelperHandler, Queue, - VirtioDevice, VirtioDeviceType, EPOLL_HELPER_EVENT_LAST, VIRTIO_F_IOMMU_PLATFORM, + VirtioCommon, VirtioDevice, VirtioDeviceType, EPOLL_HELPER_EVENT_LAST, VIRTIO_F_IOMMU_PLATFORM, VIRTIO_F_VERSION_1, }; use crate::seccomp_filters::{get_seccomp_filter, Thread}; @@ -127,12 +127,11 @@ impl EpollHelperHandler for RngEpollHandler { /// Virtio device for exposing entropy to the guest OS through virtio. pub struct Rng { + common: VirtioCommon, id: String, kill_evt: Option, pause_evt: Option, random_file: Option, - avail_features: u64, - acked_features: u64, queue_evts: Option>, interrupt_cb: Option>, epoll_threads: Option>>, @@ -164,12 +163,14 @@ impl Rng { } Ok(Rng { + common: VirtioCommon { + avail_features, + acked_features: 0u64, + }, id, kill_evt: None, pause_evt: None, random_file: Some(random_file), - avail_features, - acked_features: 0u64, queue_evts: None, interrupt_cb: None, epoll_threads: None, @@ -181,15 +182,15 @@ impl Rng { fn state(&self) -> RngState { RngState { - avail_features: self.avail_features, - acked_features: self.acked_features, + avail_features: self.common.avail_features, + acked_features: self.common.acked_features, paused: self.paused.clone(), } } fn set_state(&mut self, state: &RngState) -> io::Result<()> { - self.avail_features = state.avail_features; - self.acked_features = state.acked_features; + self.common.avail_features = state.avail_features; + self.common.acked_features = state.acked_features; self.paused = state.paused.clone(); Ok(()) @@ -215,20 +216,11 @@ impl VirtioDevice for Rng { } fn features(&self) -> u64 { - self.avail_features + self.common.avail_features } fn ack_features(&mut self, value: u64) { - let mut v = value; - // Check if the guest is ACK'ing a feature that we didn't claim to have. - let unrequested_features = v & !self.avail_features; - if unrequested_features != 0 { - warn!("Received acknowledge request for unknown feature."); - - // Don't count these features as acked. - v &= !unrequested_features; - } - self.acked_features |= v; + self.common.ack_features(value) } fn activate(