pub struct FStackConfig {
config_file: String,
eal_args: Vec<String>,
}
impl FStackConfig {
pub fn new(config_file: impl Into<String>) -> Self {
Self {
config_file: config_file.into(),
eal_args: Vec::new(),
}
}
pub fn with_eal_arg(mut self, arg: impl Into<String>) -> Self {
self.eal_args.push(arg.into());
self
}
pub fn for_docker() -> Self {
Self::new("config.ini")
.with_eal_arg("--vdev=net_tap0,iface=dtap0,mac=fixed")
.with_eal_arg("--no-pci")
.with_eal_arg("--iova-mode=va")
}
pub fn for_bare_metal() -> Self {
Self::new("config.ini")
}
pub fn config_args(&self) -> Vec<String> {
vec![
"teto".to_string(),
"--conf".to_string(),
self.config_file.clone(),
]
}
pub fn eal_args(&self) -> Vec<String> {
self.eal_args.clone()
}
}
#[derive(Clone, Debug, Default)]
pub struct TcpSocketOptions {
pub nodelay: Option<bool>,
pub keepalive: Option<bool>,
pub keepalive_idle_secs: Option<u32>,
pub keepalive_interval_secs: Option<u32>,
pub keepalive_count: Option<u32>,
pub recv_buf: Option<u32>,
pub send_buf: Option<u32>,
pub linger_secs: Option<u32>,
pub quickack: Option<bool>,
pub reuse_port: Option<bool>,
}
impl TcpSocketOptions {
pub fn nodelay(mut self, v: bool) -> Self { self.nodelay = Some(v); self }
pub fn keepalive(mut self, v: bool) -> Self { self.keepalive = Some(v); self }
pub fn keepalive_idle_secs(mut self, v: u32) -> Self { self.keepalive_idle_secs = Some(v); self }
pub fn keepalive_interval_secs(mut self, v: u32) -> Self { self.keepalive_interval_secs = Some(v); self }
pub fn keepalive_count(mut self, v: u32) -> Self { self.keepalive_count = Some(v); self }
pub fn recv_buf(mut self, v: u32) -> Self { self.recv_buf = Some(v); self }
pub fn send_buf(mut self, v: u32) -> Self { self.send_buf = Some(v); self }
pub fn linger_secs(mut self, v: u32) -> Self { self.linger_secs = Some(v); self }
pub fn quickack(mut self, v: bool) -> Self { self.quickack = Some(v); self }
pub fn reuse_port(mut self, v: bool) -> Self { self.reuse_port = Some(v); self }
pub fn to_ffi(&self) -> crate::fstack::ffi::TcpSocketOptionsFfi {
crate::fstack::ffi::TcpSocketOptionsFfi {
nodelay: self.nodelay.map_or(-1, |v| v as i32),
keepalive: self.keepalive.map_or(-1, |v| v as i32),
keepalive_idle_secs: self.keepalive_idle_secs.map_or(-1, |v| v as i32),
keepalive_interval_secs: self.keepalive_interval_secs.map_or(-1, |v| v as i32),
keepalive_count: self.keepalive_count.map_or(-1, |v| v as i32),
recv_buf: self.recv_buf.map_or(-1, |v| v as i32),
send_buf: self.send_buf.map_or(-1, |v| v as i32),
linger_secs: self.linger_secs.map_or(-1, |v| v as i32),
quickack: self.quickack.map_or(-1, |v| v as i32),
reuse_port: self.reuse_port.map_or(-1, |v| v as i32),
}
}
}