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::{
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<EventFd>,
pause_evt: Option<EventFd>,
avail_features: u64,
acked_features: u64,
backend_features: u64,
config: VirtioNetConfig,
queue_sizes: Vec<u16>,
@ -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)?;