diff --git a/vmm/src/vm_config.rs b/vmm/src/vm_config.rs index 27233fb05..826502ddf 100644 --- a/vmm/src/vm_config.rs +++ b/vmm/src/vm_config.rs @@ -268,7 +268,11 @@ pub struct NetConfig { pub vhost_mode: VhostMode, #[serde(default)] pub id: Option, - #[serde(default)] + #[serde( + default, + serialize_with = "serialize_netconfig_fds", + deserialize_with = "deserialize_netconfig_fds" + )] pub fds: Option>, #[serde(default)] pub rate_limiter_config: Option, @@ -314,6 +318,32 @@ pub fn default_netconfig_queue_size() -> u16 { DEFAULT_NET_QUEUE_SIZE } +fn serialize_netconfig_fds(x: &Option>, s: S) -> Result +where + S: serde::Serializer, +{ + if let Some(x) = x { + warn!("'NetConfig' contains FDs that can't be serialized correctly. Serializing them as invalid FDs."); + let invalid_fds = vec![-1; x.len()]; + s.serialize_some(&invalid_fds) + } else { + s.serialize_none() + } +} + +fn deserialize_netconfig_fds<'de, D>(d: D) -> Result>, D::Error> +where + D: serde::Deserializer<'de>, +{ + let invalid_fds: Option> = Option::deserialize(d)?; + if let Some(invalid_fds) = invalid_fds { + warn!("'NetConfig' contains FDs that can't be deserialized correctly. Deserializing them as invalid FDs."); + Ok(Some(vec![-1; invalid_fds.len()])) + } else { + Ok(None) + } +} + #[derive(Clone, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct RngConfig { pub src: PathBuf,