#![cfg_attr(docsrs, feature(doc_cfg))]
#[cfg(all(not(feature = "simple"), not(feature = "namespaced")))]
compile_error!("Either \"simple\" or \"namespaced\" networking feature flags must be enabled");
use std::net::IpAddr;
use cidr::IpInet;
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FirecrackerNetwork {
#[cfg_attr(feature = "serde", serde(default))]
pub nft_path: Option<String>,
#[cfg_attr(feature = "serde", serde(default))]
pub ip_stack: FirecrackerIpStack,
pub iface_name: String,
pub tap_name: String,
pub tap_ip: IpInet,
pub guest_ip: IpInet,
pub network_type: FirecrackerNetworkType,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FirecrackerIpStack {
#[default]
V4,
V6,
Dual,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(tag = "type"))]
pub enum FirecrackerNetworkType {
#[cfg(feature = "simple")]
#[cfg_attr(docsrs, doc(cfg(feature = "simple")))]
Simple,
#[cfg(feature = "namespaced")]
#[cfg_attr(docsrs, doc(cfg(feature = "namespaced")))]
Namespaced {
netns_name: String,
veth1_name: String,
veth2_name: String,
veth1_ip: IpInet,
veth2_ip: IpInet,
#[cfg_attr(feature = "serde", serde(default))]
forwarded_guest_ip: Option<IpAddr>,
},
}
impl FirecrackerNetwork {
pub fn guest_ip_boot_arg(&self, guest_iface_name: impl AsRef<str>) -> String {
format!(
"ip={}::{}:{}::{}:off",
self.guest_ip.address().to_string(),
self.tap_ip.address().to_string(),
self.guest_ip.mask().to_string(),
guest_iface_name.as_ref()
)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum FirecrackerNetworkOperation {
Add,
Check,
Delete,
}