pub mod checksum;
pub mod conntrack;
pub mod translate;
pub use checksum::{checksum_fold, incremental_checksum_update};
pub use conntrack::{ConnState, ConnTrackEntry, ConnTrackKey, ConnTrackTable, FastCacheEntry};
pub use translate::{NatDirection, NatEngine, NatResult, TranslateError};
use std::net::Ipv4Addr;
#[derive(Debug, Clone)]
pub struct NatEngineConfig {
pub external_ip: Ipv4Addr,
pub port_range_start: u16,
pub port_range_end: u16,
pub conntrack_size: usize,
pub connection_timeout_secs: u32,
pub enable_fast_cache: bool,
pub fast_cache_size: usize,
}
impl Default for NatEngineConfig {
fn default() -> Self {
Self {
external_ip: Ipv4Addr::new(192, 168, 64, 1),
port_range_start: 49152,
port_range_end: 65535,
conntrack_size: 65536,
connection_timeout_secs: 300, enable_fast_cache: true,
fast_cache_size: 256,
}
}
}
impl NatEngineConfig {
#[must_use]
pub fn new(external_ip: Ipv4Addr) -> Self {
Self {
external_ip,
..Default::default()
}
}
#[must_use]
pub fn with_port_range(mut self, start: u16, end: u16) -> Self {
self.port_range_start = start;
self.port_range_end = end;
self
}
#[must_use]
pub fn with_timeout(mut self, secs: u32) -> Self {
self.connection_timeout_secs = secs;
self
}
#[must_use]
pub fn without_fast_cache(mut self) -> Self {
self.enable_fast_cache = false;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_default_config() {
let config = NatEngineConfig::default();
assert_eq!(config.external_ip, Ipv4Addr::new(192, 168, 64, 1));
assert_eq!(config.port_range_start, 49152);
assert_eq!(config.port_range_end, 65535);
assert!(config.enable_fast_cache);
}
#[test]
fn test_config_builder() {
let config = NatEngineConfig::new(Ipv4Addr::new(10, 0, 0, 1))
.with_port_range(10000, 20000)
.with_timeout(600)
.without_fast_cache();
assert_eq!(config.external_ip, Ipv4Addr::new(10, 0, 0, 1));
assert_eq!(config.port_range_start, 10000);
assert_eq!(config.port_range_end, 20000);
assert_eq!(config.connection_timeout_secs, 600);
assert!(!config.enable_fast_cache);
}
}