mirror of
https://github.com/cloud-hypervisor/cloud-hypervisor.git
synced 2025-02-08 12:41:35 +00:00
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:
parent
684b47013a
commit
9d0ebf8d25
@ -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)?;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user