diff options
author | Linus Färnstrand <linus@mullvad.net> | 2020-09-20 22:34:04 +0200 |
---|---|---|
committer | Linus Färnstrand <linus@mullvad.net> | 2020-09-20 23:10:17 +0200 |
commit | 59b26b2867ec829ce0d3336c0cc4565b58522f98 (patch) | |
tree | 675de21d660d4e14426321a31d717b5cc5118977 | |
parent | 8740ddd980a246f7c7e3555c183fd400e049595a (diff) |
Add Nat expression
-rw-r--r-- | nftnl/src/expr/mod.rs | 3 | ||||
-rw-r--r-- | nftnl/src/expr/nat.rs | 48 |
2 files changed, 51 insertions, 0 deletions
diff --git a/nftnl/src/expr/mod.rs b/nftnl/src/expr/mod.rs index 19a9d3f..b4695fb 100644 --- a/nftnl/src/expr/mod.rs +++ b/nftnl/src/expr/mod.rs @@ -54,6 +54,9 @@ pub use self::masquerade::*; mod meta; pub use self::meta::*; +mod nat; +pub use self::nat::*; + mod payload; pub use self::payload::*; diff --git a/nftnl/src/expr/nat.rs b/nftnl/src/expr/nat.rs new file mode 100644 index 0000000..82c6ecc --- /dev/null +++ b/nftnl/src/expr/nat.rs @@ -0,0 +1,48 @@ +use super::{Expression, Register, Rule}; +use crate::ProtoFamily; +use nftnl_sys::{self as sys, libc}; +use std::os::raw::c_char; + +#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] +#[repr(i32)] +pub enum NatType { + /// Source NAT. Changes the source address of a packet + SNat = libc::NFT_NAT_SNAT, + /// Destination NAT. Changeth the destination address of a packet + DNat = libc::NFT_NAT_DNAT, +} + +/// A source or destination NAT statement. Modifies the source or destination address +/// (and possibly port) of packets. +pub struct Nat { + pub nat_type: NatType, + pub family: ProtoFamily, + pub ip_reg: Register, + pub port_reg: Option<Register>, +} + +impl Expression for Nat { + fn to_expr(&self, _rule: &Rule) -> *mut sys::nftnl_expr { + let expr = + try_alloc!(unsafe { sys::nftnl_expr_alloc(b"nat\0" as *const _ as *const c_char) }); + + unsafe { + sys::nftnl_expr_set_u32(expr, sys::NFTNL_EXPR_NAT_TYPE as u16, self.nat_type as u32); + sys::nftnl_expr_set_u32(expr, sys::NFTNL_EXPR_NAT_FAMILY as u16, self.family as u32); + sys::nftnl_expr_set_u32( + expr, + sys::NFTNL_EXPR_NAT_REG_ADDR_MIN as u16, + self.ip_reg.to_raw(), + ); + if let Some(port_reg) = self.port_reg { + sys::nftnl_expr_set_u32( + expr, + sys::NFTNL_EXPR_NAT_REG_PROTO_MIN as u16, + port_reg.to_raw(), + ); + } + } + + expr + } +} |