virtio-devices: vhost-user-net: Port to VirtioCommon for feature handling

Signed-off-by: Rob Bradford <robert.bradford@intel.com>
This commit is contained in:
Rob Bradford 2020-09-03 10:37:36 +01:00 committed by Sebastien Boeuf
parent 684b47013a
commit 9d0ebf8d25

View File

@ -4,7 +4,9 @@
use super::super::net_util::{ use super::super::net_util::{
build_net_config_space, CtrlVirtio, NetCtrlEpollHandler, VirtioNetConfig, 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::handler::*;
use super::vu_common_ctrl::*; use super::vu_common_ctrl::*;
use super::{Error, Result}; use super::{Error, Result};
@ -34,12 +36,11 @@ struct SlaveReqHandler {}
impl VhostUserMasterReqHandler for SlaveReqHandler {} impl VhostUserMasterReqHandler for SlaveReqHandler {}
pub struct Net { pub struct Net {
common: VirtioCommon,
id: String, id: String,
vhost_user_net: Master, vhost_user_net: Master,
kill_evt: Option<EventFd>, kill_evt: Option<EventFd>,
pause_evt: Option<EventFd>, pause_evt: Option<EventFd>,
avail_features: u64,
acked_features: u64,
backend_features: u64, backend_features: u64,
config: VirtioNetConfig, config: VirtioNetConfig,
queue_sizes: Vec<u16>, queue_sizes: Vec<u16>,
@ -147,11 +148,13 @@ impl Net {
Ok(Net { Ok(Net {
id, id,
common: VirtioCommon {
avail_features,
acked_features,
},
vhost_user_net, vhost_user_net,
kill_evt: None, kill_evt: None,
pause_evt: None, pause_evt: None,
avail_features,
acked_features,
backend_features, backend_features,
config, config,
queue_sizes: vec![vu_cfg.queue_size; queue_num], queue_sizes: vec![vu_cfg.queue_size; queue_num],
@ -186,19 +189,11 @@ impl VirtioDevice for Net {
} }
fn features(&self) -> u64 { fn features(&self) -> u64 {
self.avail_features self.common.avail_features
} }
fn ack_features(&mut self, value: u64) { fn ack_features(&mut self, value: u64) {
let mut v = value; self.common.ack_features(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;
} }
fn read_config(&self, offset: u64, data: &mut [u8]) { fn read_config(&self, offset: u64, data: &mut [u8]) {
@ -254,7 +249,10 @@ impl VirtioDevice for Net {
let queue_num = queue_evts.len(); 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 = queues.remove(queue_num - 1);
let cvq_queue_evt = queue_evts.remove(queue_num - 1); let cvq_queue_evt = queue_evts.remove(queue_num - 1);
@ -298,7 +296,7 @@ impl VirtioDevice for Net {
queues, queues,
queue_evts, queue_evts,
&interrupt_cb, &interrupt_cb,
self.acked_features & self.backend_features, self.common.acked_features & self.backend_features,
) )
.map_err(ActivateError::VhostUserNetSetup)?; .map_err(ActivateError::VhostUserNetSetup)?;