From 9d0ebf8d2574038414a70a62f5fe4e69aaa879bc Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Thu, 3 Sep 2020 10:37:36 +0100 Subject: [PATCH] virtio-devices: vhost-user-net: Port to VirtioCommon for feature handling Signed-off-by: Rob Bradford --- virtio-devices/src/vhost_user/net.rs | 32 +++++++++++++--------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/virtio-devices/src/vhost_user/net.rs b/virtio-devices/src/vhost_user/net.rs index 5f4db692f..359741db8 100644 --- a/virtio-devices/src/vhost_user/net.rs +++ b/virtio-devices/src/vhost_user/net.rs @@ -4,7 +4,9 @@ use super::super::net_util::{ build_net_config_space, CtrlVirtio, NetCtrlEpollHandler, VirtioNetConfig, }; -use super::super::{ActivateError, ActivateResult, Queue, VirtioDevice, VirtioDeviceType}; +use super::super::{ + ActivateError, ActivateResult, Queue, VirtioCommon, VirtioDevice, VirtioDeviceType, +}; use super::handler::*; use super::vu_common_ctrl::*; use super::{Error, Result}; @@ -34,12 +36,11 @@ struct SlaveReqHandler {} impl VhostUserMasterReqHandler for SlaveReqHandler {} pub struct Net { + common: VirtioCommon, id: String, vhost_user_net: Master, kill_evt: Option, pause_evt: Option, - avail_features: u64, - acked_features: u64, backend_features: u64, config: VirtioNetConfig, queue_sizes: Vec, @@ -147,11 +148,13 @@ impl Net { Ok(Net { id, + common: VirtioCommon { + avail_features, + acked_features, + }, vhost_user_net, kill_evt: None, pause_evt: None, - avail_features, - acked_features, backend_features, config, queue_sizes: vec![vu_cfg.queue_size; queue_num], @@ -186,19 +189,11 @@ impl VirtioDevice for Net { } 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: {:x}", v); - // Don't count these features as acked. - v &= !unrequested_features; - } - self.acked_features |= v; + self.common.ack_features(value) } fn read_config(&self, offset: u64, data: &mut [u8]) { @@ -254,7 +249,10 @@ impl VirtioDevice for Net { let queue_num = queue_evts.len(); - if (self.acked_features & 1 << virtio_net::VIRTIO_NET_F_CTRL_VQ) != 0 && queue_num % 2 != 0 + if self + .common + .feature_acked(virtio_net::VIRTIO_NET_F_CTRL_VQ.into()) + && queue_num % 2 != 0 { let cvq_queue = queues.remove(queue_num - 1); let cvq_queue_evt = queue_evts.remove(queue_num - 1); @@ -298,7 +296,7 @@ impl VirtioDevice for Net { queues, queue_evts, &interrupt_cb, - self.acked_features & self.backend_features, + self.common.acked_features & self.backend_features, ) .map_err(ActivateError::VhostUserNetSetup)?;