1#![cfg_attr(docsrs, feature(doc_cfg))]
2
3#[cfg(all(not(feature = "simple"), not(feature = "namespaced")))]
4compile_error!("Either \"simple\" or \"namespaced\" networking feature flags must be enabled");
5
6use std::net::IpAddr;
7
8use cidr::IpInet;
9
10#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
12#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
13pub struct FirecrackerNetwork {
14 #[cfg_attr(feature = "serde", serde(default))]
16 pub nft_path: Option<String>,
17 #[cfg_attr(feature = "serde", serde(default))]
19 pub ip_stack: FirecrackerIpStack,
20 pub iface_name: String,
22 pub tap_name: String,
24 pub tap_ip: IpInet,
26 pub guest_ip: IpInet,
28 pub network_type: FirecrackerNetworkType,
30}
31
32#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
34#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
35pub enum FirecrackerIpStack {
36 #[default]
38 V4,
39 V6,
41 Dual,
43}
44
45#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
47#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
48#[cfg_attr(feature = "serde", serde(tag = "type"))]
49pub enum FirecrackerNetworkType {
50 #[cfg(feature = "simple")]
53 #[cfg_attr(docsrs, doc(cfg(feature = "simple")))]
54 Simple,
55 #[cfg(feature = "namespaced")]
59 #[cfg_attr(docsrs, doc(cfg(feature = "namespaced")))]
60 Namespaced {
61 netns_name: String,
62 veth1_name: String,
63 veth2_name: String,
64 veth1_ip: IpInet,
65 veth2_ip: IpInet,
66 #[cfg_attr(feature = "serde", serde(default))]
67 forwarded_guest_ip: Option<IpAddr>,
68 },
69}
70
71impl FirecrackerNetwork {
72 pub fn guest_ip_boot_arg(&self, guest_iface_name: impl AsRef<str>) -> String {
75 format!(
76 "ip={}::{}:{}::{}:off",
77 self.guest_ip.address().to_string(),
78 self.tap_ip.address().to_string(),
79 self.guest_ip.mask().to_string(),
80 guest_iface_name.as_ref()
81 )
82 }
83}
84
85#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
87#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
88pub enum FirecrackerNetworkOperation {
89 Add,
91 Check,
93 Delete,
95}