mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-09-01 08:56:32 +00:00
Merge pull request #8744 from justxuewei/vhu-net-compile
dragonball: Fix compilation issue without all net features
This commit is contained in:
@@ -25,6 +25,8 @@ pub use self::machine_config::{VmConfigError, MAX_SUPPORTED_VCPUS};
|
|||||||
feature = "vhost-user-net"
|
feature = "vhost-user-net"
|
||||||
))]
|
))]
|
||||||
mod virtio_net;
|
mod virtio_net;
|
||||||
|
#[cfg(feature = "vhost-user-net")]
|
||||||
|
pub use virtio_net::VhostUserConfig;
|
||||||
#[cfg(any(feature = "virtio-net", feature = "vhost-net"))]
|
#[cfg(any(feature = "virtio-net", feature = "vhost-net"))]
|
||||||
pub use virtio_net::VirtioConfig;
|
pub use virtio_net::VirtioConfig;
|
||||||
#[cfg(any(
|
#[cfg(any(
|
||||||
@@ -32,6 +34,4 @@ pub use virtio_net::VirtioConfig;
|
|||||||
feature = "vhost-net",
|
feature = "vhost-net",
|
||||||
feature = "vhost-user-net"
|
feature = "vhost-user-net"
|
||||||
))]
|
))]
|
||||||
pub use virtio_net::{
|
pub use virtio_net::{Backend, NetworkInterfaceConfig, NetworkInterfaceUpdateConfig};
|
||||||
Backend, NetworkInterfaceConfig, NetworkInterfaceUpdateConfig, VhostUserConfig,
|
|
||||||
};
|
|
||||||
|
@@ -28,6 +28,18 @@ pub mod vsock;
|
|||||||
|
|
||||||
#[cfg(feature = "virtio-net")]
|
#[cfg(feature = "virtio-net")]
|
||||||
pub mod net;
|
pub mod net;
|
||||||
|
#[cfg(any(
|
||||||
|
feature = "virtio-net",
|
||||||
|
feature = "vhost-net",
|
||||||
|
feature = "vhost-user-net"
|
||||||
|
))]
|
||||||
|
mod net_common;
|
||||||
|
#[cfg(any(
|
||||||
|
feature = "virtio-net",
|
||||||
|
feature = "vhost-net",
|
||||||
|
feature = "vhost-user-net"
|
||||||
|
))]
|
||||||
|
pub use net_common::*;
|
||||||
|
|
||||||
#[cfg(feature = "virtio-blk")]
|
#[cfg(feature = "virtio-blk")]
|
||||||
pub mod block;
|
pub mod block;
|
||||||
|
@@ -18,7 +18,7 @@ use dbs_utils::epoll_manager::{
|
|||||||
EpollManager, EventOps, EventSet, Events, MutEventSubscriber, SubscriberId,
|
EpollManager, EventOps, EventSet, Events, MutEventSubscriber, SubscriberId,
|
||||||
};
|
};
|
||||||
use dbs_utils::metric::IncMetric;
|
use dbs_utils::metric::IncMetric;
|
||||||
use dbs_utils::net::{net_gen, MacAddr, Tap, MAC_ADDR_LEN};
|
use dbs_utils::net::{net_gen, MacAddr, Tap};
|
||||||
use dbs_utils::rate_limiter::{BucketUpdate, RateLimiter, TokenType};
|
use dbs_utils::rate_limiter::{BucketUpdate, RateLimiter, TokenType};
|
||||||
use libc;
|
use libc;
|
||||||
use log::{debug, error, info, trace, warn};
|
use log::{debug, error, info, trace, warn};
|
||||||
@@ -29,8 +29,9 @@ use vmm_sys_util::eventfd::EventFd;
|
|||||||
|
|
||||||
use crate::device::{VirtioDeviceConfig, VirtioDeviceInfo};
|
use crate::device::{VirtioDeviceConfig, VirtioDeviceInfo};
|
||||||
use crate::{
|
use crate::{
|
||||||
vnet_hdr_len, ActivateError, ActivateResult, ConfigResult, DbsGuestAddressSpace, Error,
|
setup_config_space, vnet_hdr_len, ActivateError, ActivateResult, ConfigResult,
|
||||||
NetDeviceMetrics, Result, TapError, VirtioDevice, VirtioQueueConfig, TYPE_NET,
|
DbsGuestAddressSpace, Error, NetDeviceMetrics, Result, TapError, VirtioDevice,
|
||||||
|
VirtioQueueConfig, DEFAULT_MTU, TYPE_NET,
|
||||||
};
|
};
|
||||||
|
|
||||||
const NET_DRIVER_NAME: &str = "virtio-net";
|
const NET_DRIVER_NAME: &str = "virtio-net";
|
||||||
@@ -55,73 +56,6 @@ const PATCH_RATE_LIMITER_EVENT: u32 = 5;
|
|||||||
// Number of DeviceEventT events supported by this implementation.
|
// Number of DeviceEventT events supported by this implementation.
|
||||||
pub const NET_EVENTS_COUNT: u32 = 6;
|
pub const NET_EVENTS_COUNT: u32 = 6;
|
||||||
|
|
||||||
// Config space of network config:
|
|
||||||
// https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html#x1-2000004
|
|
||||||
// MAC
|
|
||||||
const CONFIG_SPACE_MAC: usize = 0;
|
|
||||||
// Status
|
|
||||||
const CONFIG_SPACE_STATUS: usize = CONFIG_SPACE_MAC + MAC_ADDR_LEN;
|
|
||||||
const CONFIG_SPACE_STATUS_SIZE: usize = 2;
|
|
||||||
// Max virtqueue pairs
|
|
||||||
const CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS: usize = CONFIG_SPACE_STATUS + CONFIG_SPACE_STATUS_SIZE;
|
|
||||||
const CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE: usize = 2;
|
|
||||||
// MTU
|
|
||||||
const CONFIG_SPACE_MTU: usize =
|
|
||||||
CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS + CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE;
|
|
||||||
const CONFIG_SPACE_MTU_SIZE: usize = 2;
|
|
||||||
// Size of config space
|
|
||||||
const CONFIG_SPACE_SIZE: usize = MAC_ADDR_LEN
|
|
||||||
+ CONFIG_SPACE_STATUS_SIZE
|
|
||||||
+ CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE
|
|
||||||
+ CONFIG_SPACE_MTU_SIZE;
|
|
||||||
|
|
||||||
// Default MTU for network device
|
|
||||||
pub const DEFAULT_MTU: u16 = 1500;
|
|
||||||
|
|
||||||
/// Setup config space for network device.
|
|
||||||
pub fn setup_config_space(
|
|
||||||
device_name: &str,
|
|
||||||
guest_mac: &Option<&MacAddr>,
|
|
||||||
avail_features: &mut u64,
|
|
||||||
vq_pairs: u16,
|
|
||||||
mtu: u16,
|
|
||||||
) -> Result<Vec<u8>> {
|
|
||||||
let mut config_space = vec![0u8; CONFIG_SPACE_SIZE];
|
|
||||||
if let Some(mac) = guest_mac.as_ref() {
|
|
||||||
config_space[CONFIG_SPACE_MAC..CONFIG_SPACE_MAC + MAC_ADDR_LEN]
|
|
||||||
.copy_from_slice(mac.get_bytes());
|
|
||||||
// When this feature isn't available, the driver generates a random MAC address.
|
|
||||||
// Otherwise, it should attempt to read the device MAC address from the config space.
|
|
||||||
*avail_features |= 1u64 << VIRTIO_NET_F_MAC;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mark link as up: status only exists if VIRTIO_NET_F_STATUS is set.
|
|
||||||
if *avail_features & (1 << VIRTIO_NET_F_STATUS) != 0 {
|
|
||||||
config_space[CONFIG_SPACE_STATUS..CONFIG_SPACE_STATUS + CONFIG_SPACE_STATUS_SIZE]
|
|
||||||
.copy_from_slice(&(VIRTIO_NET_S_LINK_UP as u16).to_le_bytes());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set max virtqueue pairs, which only exists if VIRTIO_NET_F_MQ is set.
|
|
||||||
if *avail_features & (1 << VIRTIO_NET_F_MQ) != 0 {
|
|
||||||
if vq_pairs <= 1 {
|
|
||||||
return Err(Error::InvalidInput);
|
|
||||||
}
|
|
||||||
config_space[CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS
|
|
||||||
..CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS + CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE]
|
|
||||||
.copy_from_slice(&vq_pairs.to_le_bytes());
|
|
||||||
}
|
|
||||||
|
|
||||||
config_space[CONFIG_SPACE_MTU..CONFIG_SPACE_MTU + CONFIG_SPACE_MTU_SIZE]
|
|
||||||
.copy_from_slice(&mtu.to_le_bytes());
|
|
||||||
|
|
||||||
debug!(
|
|
||||||
"{}: config space is set to {:X?}, guest_mac: {:?}, avail_feature: 0x{:X}, vq_pairs: {}, mtu: {}",
|
|
||||||
device_name, config_space, guest_mac, avail_features, vq_pairs, mtu
|
|
||||||
);
|
|
||||||
|
|
||||||
Ok(config_space)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Error for virtio-net devices to handle requests from guests.
|
/// Error for virtio-net devices to handle requests from guests.
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum NetError {
|
pub enum NetError {
|
||||||
@@ -923,7 +857,7 @@ mod tests {
|
|||||||
|
|
||||||
use super::*;
|
use super::*;
|
||||||
use crate::tests::{create_address_space, VirtQueue, VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE};
|
use crate::tests::{create_address_space, VirtQueue, VIRTQ_DESC_F_NEXT, VIRTQ_DESC_F_WRITE};
|
||||||
use crate::ConfigError;
|
use crate::{ConfigError, CONFIG_SPACE_SIZE};
|
||||||
|
|
||||||
static NEXT_IP: AtomicUsize = AtomicUsize::new(1);
|
static NEXT_IP: AtomicUsize = AtomicUsize::new(1);
|
||||||
|
|
||||||
@@ -1471,109 +1405,4 @@ mod tests {
|
|||||||
assert!(!handler.rx.rate_limiter.is_blocked());
|
assert!(!handler.rx.rate_limiter.is_blocked());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn test_set_config_space() {
|
|
||||||
let mac = MacAddr::parse_str("bf:b7:72:50:82:00").unwrap();
|
|
||||||
let mut afeatures: u64;
|
|
||||||
let mut vq_pairs: u16;
|
|
||||||
// Avail features: VIRTIO_NET_F_STATUS + VIRTIO_NET_F_MQ
|
|
||||||
{
|
|
||||||
afeatures = 0;
|
|
||||||
vq_pairs = 2;
|
|
||||||
afeatures |= 1 << VIRTIO_NET_F_STATUS | 1 << VIRTIO_NET_F_MQ;
|
|
||||||
|
|
||||||
let cs = setup_config_space(
|
|
||||||
"virtio-net",
|
|
||||||
&Some(&mac),
|
|
||||||
&mut afeatures,
|
|
||||||
vq_pairs,
|
|
||||||
DEFAULT_MTU,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
// Mac
|
|
||||||
assert_eq!(
|
|
||||||
mac.get_bytes(),
|
|
||||||
&cs[CONFIG_SPACE_MAC..CONFIG_SPACE_MAC + MAC_ADDR_LEN]
|
|
||||||
);
|
|
||||||
// Status
|
|
||||||
assert_eq!(
|
|
||||||
VIRTIO_NET_S_LINK_UP as u16,
|
|
||||||
u16::from_le_bytes(
|
|
||||||
cs[CONFIG_SPACE_STATUS..CONFIG_SPACE_STATUS + CONFIG_SPACE_STATUS_SIZE]
|
|
||||||
.try_into()
|
|
||||||
.unwrap()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
// Max virtqueue pairs
|
|
||||||
assert_eq!(
|
|
||||||
vq_pairs,
|
|
||||||
u16::from_le_bytes(
|
|
||||||
cs[CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS
|
|
||||||
..CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS + CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE]
|
|
||||||
.try_into()
|
|
||||||
.unwrap()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
// MTU
|
|
||||||
assert_eq!(
|
|
||||||
DEFAULT_MTU,
|
|
||||||
u16::from_le_bytes(
|
|
||||||
cs[CONFIG_SPACE_MTU..CONFIG_SPACE_MTU + CONFIG_SPACE_MTU_SIZE]
|
|
||||||
.try_into()
|
|
||||||
.unwrap()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// No avail features
|
|
||||||
{
|
|
||||||
afeatures = 0;
|
|
||||||
vq_pairs = 1;
|
|
||||||
|
|
||||||
let cs = setup_config_space(
|
|
||||||
"virtio-net",
|
|
||||||
&Some(&mac),
|
|
||||||
&mut afeatures,
|
|
||||||
vq_pairs,
|
|
||||||
DEFAULT_MTU,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
// Status
|
|
||||||
assert_eq!(
|
|
||||||
0,
|
|
||||||
u16::from_le_bytes(
|
|
||||||
cs[CONFIG_SPACE_STATUS..CONFIG_SPACE_STATUS + CONFIG_SPACE_STATUS_SIZE]
|
|
||||||
.try_into()
|
|
||||||
.unwrap()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
// Max virtqueue pairs
|
|
||||||
assert_eq!(
|
|
||||||
0,
|
|
||||||
u16::from_le_bytes(
|
|
||||||
cs[CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS
|
|
||||||
..CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS + CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE]
|
|
||||||
.try_into()
|
|
||||||
.unwrap()
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
// Avail features: VIRTIO_NET_F_MQ and invalid value of vq_pairs
|
|
||||||
{
|
|
||||||
afeatures = 0;
|
|
||||||
vq_pairs = 1;
|
|
||||||
afeatures |= 1 << VIRTIO_NET_F_MQ;
|
|
||||||
|
|
||||||
let cs = setup_config_space(
|
|
||||||
"virtio-net",
|
|
||||||
&Some(&mac),
|
|
||||||
&mut afeatures,
|
|
||||||
vq_pairs,
|
|
||||||
DEFAULT_MTU,
|
|
||||||
);
|
|
||||||
assert!(cs.is_err());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
190
src/dragonball/src/dbs_virtio_devices/src/net_common.rs
Normal file
190
src/dragonball/src/dbs_virtio_devices/src/net_common.rs
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
// Copyright (C) 2019-2023 Ant Group. All rights reserved.
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
use dbs_utils::net::{MacAddr, MAC_ADDR_LEN};
|
||||||
|
use log::debug;
|
||||||
|
use virtio_bindings::bindings::virtio_net::{
|
||||||
|
VIRTIO_NET_F_MAC, VIRTIO_NET_F_MQ, VIRTIO_NET_F_STATUS, VIRTIO_NET_S_LINK_UP,
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::{Error, Result};
|
||||||
|
|
||||||
|
// Config space of network config:
|
||||||
|
// https://docs.oasis-open.org/virtio/virtio/v1.1/csprd01/virtio-v1.1-csprd01.html#x1-2000004
|
||||||
|
// MAC
|
||||||
|
pub const CONFIG_SPACE_MAC: usize = 0;
|
||||||
|
// Status
|
||||||
|
pub const CONFIG_SPACE_STATUS: usize = CONFIG_SPACE_MAC + MAC_ADDR_LEN;
|
||||||
|
pub const CONFIG_SPACE_STATUS_SIZE: usize = 2;
|
||||||
|
// Max virtqueue pairs
|
||||||
|
pub const CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS: usize = CONFIG_SPACE_STATUS + CONFIG_SPACE_STATUS_SIZE;
|
||||||
|
pub const CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE: usize = 2;
|
||||||
|
// MTU
|
||||||
|
pub const CONFIG_SPACE_MTU: usize =
|
||||||
|
CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS + CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE;
|
||||||
|
pub const CONFIG_SPACE_MTU_SIZE: usize = 2;
|
||||||
|
// Size of config space
|
||||||
|
pub const CONFIG_SPACE_SIZE: usize = MAC_ADDR_LEN
|
||||||
|
+ CONFIG_SPACE_STATUS_SIZE
|
||||||
|
+ CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE
|
||||||
|
+ CONFIG_SPACE_MTU_SIZE;
|
||||||
|
|
||||||
|
// Default MTU for network device
|
||||||
|
pub const DEFAULT_MTU: u16 = 1500;
|
||||||
|
|
||||||
|
/// Setup config space for network device.
|
||||||
|
pub fn setup_config_space(
|
||||||
|
device_name: &str,
|
||||||
|
guest_mac: &Option<&MacAddr>,
|
||||||
|
avail_features: &mut u64,
|
||||||
|
vq_pairs: u16,
|
||||||
|
mtu: u16,
|
||||||
|
) -> Result<Vec<u8>> {
|
||||||
|
let mut config_space = vec![0u8; CONFIG_SPACE_SIZE];
|
||||||
|
if let Some(mac) = guest_mac.as_ref() {
|
||||||
|
config_space[CONFIG_SPACE_MAC..CONFIG_SPACE_MAC + MAC_ADDR_LEN]
|
||||||
|
.copy_from_slice(mac.get_bytes());
|
||||||
|
// When this feature isn't available, the driver generates a random MAC address.
|
||||||
|
// Otherwise, it should attempt to read the device MAC address from the config space.
|
||||||
|
*avail_features |= 1u64 << VIRTIO_NET_F_MAC;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark link as up: status only exists if VIRTIO_NET_F_STATUS is set.
|
||||||
|
if *avail_features & (1 << VIRTIO_NET_F_STATUS) != 0 {
|
||||||
|
config_space[CONFIG_SPACE_STATUS..CONFIG_SPACE_STATUS + CONFIG_SPACE_STATUS_SIZE]
|
||||||
|
.copy_from_slice(&(VIRTIO_NET_S_LINK_UP as u16).to_le_bytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set max virtqueue pairs, which only exists if VIRTIO_NET_F_MQ is set.
|
||||||
|
if *avail_features & (1 << VIRTIO_NET_F_MQ) != 0 {
|
||||||
|
if vq_pairs <= 1 {
|
||||||
|
return Err(Error::InvalidInput);
|
||||||
|
}
|
||||||
|
config_space[CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS
|
||||||
|
..CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS + CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE]
|
||||||
|
.copy_from_slice(&vq_pairs.to_le_bytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
config_space[CONFIG_SPACE_MTU..CONFIG_SPACE_MTU + CONFIG_SPACE_MTU_SIZE]
|
||||||
|
.copy_from_slice(&mtu.to_le_bytes());
|
||||||
|
|
||||||
|
debug!(
|
||||||
|
"{}: config space is set to {:X?}, guest_mac: {:?}, avail_feature: 0x{:X}, vq_pairs: {}, mtu: {}",
|
||||||
|
device_name, config_space, guest_mac, avail_features, vq_pairs, mtu
|
||||||
|
);
|
||||||
|
|
||||||
|
Ok(config_space)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::convert::TryInto;
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_set_config_space() {
|
||||||
|
let mac = MacAddr::parse_str("bf:b7:72:50:82:00").unwrap();
|
||||||
|
let mut afeatures: u64;
|
||||||
|
let mut vq_pairs: u16;
|
||||||
|
// Avail features: VIRTIO_NET_F_STATUS + VIRTIO_NET_F_MQ
|
||||||
|
{
|
||||||
|
afeatures = 0;
|
||||||
|
vq_pairs = 2;
|
||||||
|
afeatures |= 1 << VIRTIO_NET_F_STATUS | 1 << VIRTIO_NET_F_MQ;
|
||||||
|
|
||||||
|
let cs = setup_config_space(
|
||||||
|
"virtio-net",
|
||||||
|
&Some(&mac),
|
||||||
|
&mut afeatures,
|
||||||
|
vq_pairs,
|
||||||
|
DEFAULT_MTU,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Mac
|
||||||
|
assert_eq!(
|
||||||
|
mac.get_bytes(),
|
||||||
|
&cs[CONFIG_SPACE_MAC..CONFIG_SPACE_MAC + MAC_ADDR_LEN]
|
||||||
|
);
|
||||||
|
// Status
|
||||||
|
assert_eq!(
|
||||||
|
VIRTIO_NET_S_LINK_UP as u16,
|
||||||
|
u16::from_le_bytes(
|
||||||
|
cs[CONFIG_SPACE_STATUS..CONFIG_SPACE_STATUS + CONFIG_SPACE_STATUS_SIZE]
|
||||||
|
.try_into()
|
||||||
|
.unwrap()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
// Max virtqueue pairs
|
||||||
|
assert_eq!(
|
||||||
|
vq_pairs,
|
||||||
|
u16::from_le_bytes(
|
||||||
|
cs[CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS
|
||||||
|
..CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS + CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE]
|
||||||
|
.try_into()
|
||||||
|
.unwrap()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
// MTU
|
||||||
|
assert_eq!(
|
||||||
|
DEFAULT_MTU,
|
||||||
|
u16::from_le_bytes(
|
||||||
|
cs[CONFIG_SPACE_MTU..CONFIG_SPACE_MTU + CONFIG_SPACE_MTU_SIZE]
|
||||||
|
.try_into()
|
||||||
|
.unwrap()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// No avail features
|
||||||
|
{
|
||||||
|
afeatures = 0;
|
||||||
|
vq_pairs = 1;
|
||||||
|
|
||||||
|
let cs = setup_config_space(
|
||||||
|
"virtio-net",
|
||||||
|
&Some(&mac),
|
||||||
|
&mut afeatures,
|
||||||
|
vq_pairs,
|
||||||
|
DEFAULT_MTU,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
// Status
|
||||||
|
assert_eq!(
|
||||||
|
0,
|
||||||
|
u16::from_le_bytes(
|
||||||
|
cs[CONFIG_SPACE_STATUS..CONFIG_SPACE_STATUS + CONFIG_SPACE_STATUS_SIZE]
|
||||||
|
.try_into()
|
||||||
|
.unwrap()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
// Max virtqueue pairs
|
||||||
|
assert_eq!(
|
||||||
|
0,
|
||||||
|
u16::from_le_bytes(
|
||||||
|
cs[CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS
|
||||||
|
..CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS + CONFIG_SPACE_MAX_VIRTQUEUE_PAIRS_SIZE]
|
||||||
|
.try_into()
|
||||||
|
.unwrap()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// Avail features: VIRTIO_NET_F_MQ and invalid value of vq_pairs
|
||||||
|
{
|
||||||
|
afeatures = 0;
|
||||||
|
vq_pairs = 1;
|
||||||
|
afeatures |= 1 << VIRTIO_NET_F_MQ;
|
||||||
|
|
||||||
|
let cs = setup_config_space(
|
||||||
|
"virtio-net",
|
||||||
|
&Some(&mac),
|
||||||
|
&mut afeatures,
|
||||||
|
vq_pairs,
|
||||||
|
DEFAULT_MTU,
|
||||||
|
);
|
||||||
|
assert!(cs.is_err());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -31,16 +31,15 @@ use virtio_bindings::bindings::virtio_ring::*;
|
|||||||
use virtio_queue::{DescriptorChain, QueueT};
|
use virtio_queue::{DescriptorChain, QueueT};
|
||||||
use vm_memory::{Address, GuestMemory, GuestMemoryRegion, MemoryRegionAddress};
|
use vm_memory::{Address, GuestMemory, GuestMemoryRegion, MemoryRegionAddress};
|
||||||
|
|
||||||
use crate::net::{setup_config_space, DEFAULT_MTU};
|
|
||||||
use crate::vhost::net::{virtio_handle_ctrl_mq, virtio_handle_ctrl_status, FromNetCtrl};
|
use crate::vhost::net::{virtio_handle_ctrl_mq, virtio_handle_ctrl_status, FromNetCtrl};
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
use crate::vhost::vhost_kern::test_utils::{
|
use crate::vhost::vhost_kern::test_utils::{
|
||||||
MockVhostBackend as VhostBackend, MockVhostNet as VhostNet,
|
MockVhostBackend as VhostBackend, MockVhostNet as VhostNet,
|
||||||
};
|
};
|
||||||
use crate::{
|
use crate::{
|
||||||
vnet_hdr_len, ActivateError, ConfigResult, DbsGuestAddressSpace, Error as VirtioError,
|
setup_config_space, vnet_hdr_len, ActivateError, ConfigResult, DbsGuestAddressSpace,
|
||||||
NetDeviceMetrics, Result as VirtioResult, TapError, VirtioDevice, VirtioDeviceConfig,
|
Error as VirtioError, NetDeviceMetrics, Result as VirtioResult, TapError, VirtioDevice,
|
||||||
VirtioDeviceInfo, TYPE_NET,
|
VirtioDeviceConfig, VirtioDeviceInfo, DEFAULT_MTU, TYPE_NET,
|
||||||
};
|
};
|
||||||
|
|
||||||
const NET_DRIVER_NAME: &str = "vhost-net";
|
const NET_DRIVER_NAME: &str = "vhost-net";
|
||||||
|
@@ -25,12 +25,12 @@ use vm_memory::GuestMemoryRegion;
|
|||||||
use vmm_sys_util::epoll::EventSet;
|
use vmm_sys_util::epoll::EventSet;
|
||||||
|
|
||||||
use super::connection::{Endpoint, Listener};
|
use super::connection::{Endpoint, Listener};
|
||||||
use crate::net::{setup_config_space, DEFAULT_MTU};
|
|
||||||
use crate::vhost::net::{virtio_handle_ctrl_mq, virtio_handle_ctrl_status, FromNetCtrl};
|
use crate::vhost::net::{virtio_handle_ctrl_mq, virtio_handle_ctrl_status, FromNetCtrl};
|
||||||
use crate::vhost::vhost_user::connection::EndpointParam;
|
use crate::vhost::vhost_user::connection::EndpointParam;
|
||||||
use crate::{
|
use crate::{
|
||||||
ActivateResult, ConfigResult, DbsGuestAddressSpace, Error as VirtioError,
|
setup_config_space, ActivateResult, ConfigResult, DbsGuestAddressSpace, Error as VirtioError,
|
||||||
Result as VirtioResult, VirtioDevice, VirtioDeviceConfig, VirtioDeviceInfo, TYPE_NET,
|
Result as VirtioResult, VirtioDevice, VirtioDeviceConfig, VirtioDeviceInfo, DEFAULT_MTU,
|
||||||
|
TYPE_NET,
|
||||||
};
|
};
|
||||||
|
|
||||||
const NET_DRIVER_NAME: &str = "vhost-user-net";
|
const NET_DRIVER_NAME: &str = "vhost-user-net";
|
||||||
|
Reference in New Issue
Block a user