From 69a5e5b955f2843e03148c6ea67bcc1eb584a2eb Mon Sep 17 00:00:00 2001 From: Alex Lyn Date: Tue, 12 Mar 2024 22:18:01 +0800 Subject: [PATCH] runtime-rs: add network device handler in start_vm. Add network device handler in start_vm, which is sepcially for Qemu VM running with added net params to command line. Fixes: #8865 Signed-off-by: Alex Lyn --- .../hypervisor/src/qemu/cmdline_generator.rs | 17 +++++++++++++++-- .../crates/hypervisor/src/qemu/inner.rs | 14 ++++++++++++-- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/runtime-rs/crates/hypervisor/src/qemu/cmdline_generator.rs b/src/runtime-rs/crates/hypervisor/src/qemu/cmdline_generator.rs index 17b57c9322..9f79a096e4 100644 --- a/src/runtime-rs/crates/hypervisor/src/qemu/cmdline_generator.rs +++ b/src/runtime-rs/crates/hypervisor/src/qemu/cmdline_generator.rs @@ -4,11 +4,12 @@ // use crate::utils::clear_fd_flags; -use crate::{kernel_param::KernelParams, HypervisorConfig}; +use crate::{kernel_param::KernelParams, HypervisorConfig, NetworkConfig}; use anyhow::{anyhow, Context, Result}; use async_trait::async_trait; -use std::fs::read_to_string; +use kata_types::config::hypervisor::NetworkInfo; +use std::fs::{read_to_string, File}; use std::os::unix::io::RawFd; // These should have been called MiB and GiB for better readability but the @@ -846,6 +847,18 @@ impl<'a> QemuCmdLine<'a> { )); } + pub fn add_network_device( + &mut self, + _config: &NetworkConfig, + network_info: &NetworkInfo, + ) -> Result> { + let _disable_vhost_net = network_info.disable_vhost_net; + let _queues = network_info.network_queues; + let fds: Vec = Vec::new(); + + Ok(fds) + } + pub async fn build(&self) -> Result> { let mut result = Vec::new(); diff --git a/src/runtime-rs/crates/hypervisor/src/qemu/inner.rs b/src/runtime-rs/crates/hypervisor/src/qemu/inner.rs index b5614dd3c7..65bacc15c2 100644 --- a/src/runtime-rs/crates/hypervisor/src/qemu/inner.rs +++ b/src/runtime-rs/crates/hypervisor/src/qemu/inner.rs @@ -5,11 +5,12 @@ use super::cmdline_generator::QemuCmdLine; use crate::{ - hypervisor_persist::HypervisorState, HypervisorConfig, MemoryConfig, VcpuThreadIds, - VsockDevice, HYPERVISOR_QEMU, + hypervisor_persist::HypervisorState, utils::enter_netns, HypervisorConfig, MemoryConfig, + VcpuThreadIds, VsockDevice, HYPERVISOR_QEMU, }; use anyhow::{anyhow, Context, Result}; use async_trait::async_trait; +use kata_sys_util::netns::NetnsGuard; use kata_types::{ capabilities::{Capabilities, CapabilityBits}, config::KATA_PATH, @@ -68,6 +69,10 @@ impl QemuInner { // descriptor needs to stay open until the qemu process launches. // This is why we need to store it in a variable at this scope. let mut _vhost_fd = None; + // We need to keep the vhost-net/tuntap file descriptor open until the QEMU process launches. + // However, we're likely not interested in the specific type of file descriptor itself. We just + // want to ensure any fds associated with network devices remain open within the current scope. + let mut _fds_for_qemu: Vec = Vec::new(); for device in &mut self.devices { match device { @@ -102,6 +107,11 @@ impl QemuInner { } } } + DeviceType::Network(network) => { + let network_info = &self.config.network_info; + + _fds_for_qemu = cmdline.add_network_device(&network.config, network_info)?; + } _ => info!(sl!(), "qemu cmdline: unsupported device: {:?}", device), } }