diff options
Diffstat (limited to 'rustables/src')
-rw-r--r-- | rustables/src/batch.rs | 4 | ||||
-rw-r--r-- | rustables/src/chain.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/bitwise.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/cmp.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/counter.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/ct.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/immediate.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/log.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/lookup.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/masquerade.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/meta.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/mod.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/nat.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/payload.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/register.rs | 2 | ||||
-rw-r--r-- | rustables/src/expr/reject.rs | 5 | ||||
-rw-r--r-- | rustables/src/expr/verdict.rs | 5 | ||||
-rw-r--r-- | rustables/src/expr/wrapper.rs | 6 | ||||
-rw-r--r-- | rustables/src/lib.rs | 7 | ||||
-rw-r--r-- | rustables/src/query.rs | 2 | ||||
-rw-r--r-- | rustables/src/rule.rs | 2 | ||||
-rw-r--r-- | rustables/src/set.rs | 2 | ||||
-rw-r--r-- | rustables/src/table.rs | 2 | ||||
-rw-r--r-- | rustables/src/tests/mod.rs | 702 |
24 files changed, 26 insertions, 739 deletions
diff --git a/rustables/src/batch.rs b/rustables/src/batch.rs index 3cdd52b..c8ec5aa 100644 --- a/rustables/src/batch.rs +++ b/rustables/src/batch.rs @@ -1,5 +1,5 @@ use crate::{MsgType, NlMsg}; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self as sys, libc}; use std::ffi::c_void; use std::os::raw::c_char; use std::ptr; @@ -157,7 +157,7 @@ impl FinalizedBatch { }; num_pages ]; - let iovecs_ptr = iovecs.as_mut_ptr() as *mut [u8; 0]; + let iovecs_ptr = iovecs.as_mut_ptr(); unsafe { sys::nftnl_batch_iovec(self.batch.batch, iovecs_ptr, num_pages as u32); } diff --git a/rustables/src/chain.rs b/rustables/src/chain.rs index ac9c57d..20043ac 100644 --- a/rustables/src/chain.rs +++ b/rustables/src/chain.rs @@ -1,5 +1,5 @@ use crate::{MsgType, Table}; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self as sys, libc}; #[cfg(feature = "query")] use std::convert::TryFrom; use std::{ diff --git a/rustables/src/expr/bitwise.rs b/rustables/src/expr/bitwise.rs index a5d9343..59ef41b 100644 --- a/rustables/src/expr/bitwise.rs +++ b/rustables/src/expr/bitwise.rs @@ -1,5 +1,5 @@ use super::{Expression, Rule, ToSlice}; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; use std::ffi::c_void; use std::os::raw::c_char; diff --git a/rustables/src/expr/cmp.rs b/rustables/src/expr/cmp.rs index 747974d..384f0b4 100644 --- a/rustables/src/expr/cmp.rs +++ b/rustables/src/expr/cmp.rs @@ -1,5 +1,5 @@ use super::{DeserializationError, Expression, Rule, ToSlice}; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; use std::{ borrow::Cow, ffi::{c_void, CString}, diff --git a/rustables/src/expr/counter.rs b/rustables/src/expr/counter.rs index 099e7fa..71064df 100644 --- a/rustables/src/expr/counter.rs +++ b/rustables/src/expr/counter.rs @@ -1,5 +1,5 @@ use super::{DeserializationError, Expression, Rule}; -use rustables_sys as sys; +use crate::sys; use std::os::raw::c_char; /// A counter expression adds a counter to the rule that is incremented to count number of packets diff --git a/rustables/src/expr/ct.rs b/rustables/src/expr/ct.rs index 001aef8..7d6614c 100644 --- a/rustables/src/expr/ct.rs +++ b/rustables/src/expr/ct.rs @@ -1,5 +1,5 @@ use super::{DeserializationError, Expression, Rule}; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; use std::os::raw::c_char; bitflags::bitflags! { diff --git a/rustables/src/expr/immediate.rs b/rustables/src/expr/immediate.rs index ff4ad04..0787e06 100644 --- a/rustables/src/expr/immediate.rs +++ b/rustables/src/expr/immediate.rs @@ -1,5 +1,5 @@ use super::{DeserializationError, Expression, Register, Rule, ToSlice}; -use rustables_sys as sys; +use crate::sys; use std::ffi::c_void; use std::os::raw::c_char; diff --git a/rustables/src/expr/log.rs b/rustables/src/expr/log.rs index db96ba9..5c06897 100644 --- a/rustables/src/expr/log.rs +++ b/rustables/src/expr/log.rs @@ -1,5 +1,5 @@ use super::{DeserializationError, Expression, Rule}; -use rustables_sys as sys; +use crate::sys; use std::ffi::{CStr, CString}; use std::os::raw::c_char; use thiserror::Error; diff --git a/rustables/src/expr/lookup.rs b/rustables/src/expr/lookup.rs index 7796b29..8e288a0 100644 --- a/rustables/src/expr/lookup.rs +++ b/rustables/src/expr/lookup.rs @@ -1,6 +1,6 @@ use super::{DeserializationError, Expression, Rule}; use crate::set::Set; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; use std::ffi::{CStr, CString}; use std::os::raw::c_char; diff --git a/rustables/src/expr/masquerade.rs b/rustables/src/expr/masquerade.rs index 40565d5..c1a06de 100644 --- a/rustables/src/expr/masquerade.rs +++ b/rustables/src/expr/masquerade.rs @@ -1,5 +1,5 @@ use super::{DeserializationError, Expression, Rule}; -use rustables_sys as sys; +use crate::sys; use std::os::raw::c_char; /// Sets the source IP to that of the output interface. diff --git a/rustables/src/expr/meta.rs b/rustables/src/expr/meta.rs index 199f3d3..bf77774 100644 --- a/rustables/src/expr/meta.rs +++ b/rustables/src/expr/meta.rs @@ -1,5 +1,5 @@ use super::{DeserializationError, Expression, Rule}; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; use std::os::raw::c_char; /// A meta expression refers to meta data associated with a packet. diff --git a/rustables/src/expr/mod.rs b/rustables/src/expr/mod.rs index b20a752..fbf49d6 100644 --- a/rustables/src/expr/mod.rs +++ b/rustables/src/expr/mod.rs @@ -9,7 +9,7 @@ use std::net::Ipv4Addr; use std::net::Ipv6Addr; use super::rule::Rule; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; use thiserror::Error; mod bitwise; diff --git a/rustables/src/expr/nat.rs b/rustables/src/expr/nat.rs index 51f439f..8beaa30 100644 --- a/rustables/src/expr/nat.rs +++ b/rustables/src/expr/nat.rs @@ -1,6 +1,6 @@ use super::{DeserializationError, Expression, Register, Rule}; use crate::ProtoFamily; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; use std::{convert::TryFrom, os::raw::c_char}; #[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)] diff --git a/rustables/src/expr/payload.rs b/rustables/src/expr/payload.rs index 334c939..7612fd9 100644 --- a/rustables/src/expr/payload.rs +++ b/rustables/src/expr/payload.rs @@ -1,5 +1,5 @@ use super::{DeserializationError, Expression, Rule}; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; use std::os::raw::c_char; pub trait HeaderField { diff --git a/rustables/src/expr/register.rs b/rustables/src/expr/register.rs index 2cfcc3b..f0aed94 100644 --- a/rustables/src/expr/register.rs +++ b/rustables/src/expr/register.rs @@ -1,6 +1,6 @@ use std::fmt::Debug; -use rustables_sys::libc; +use crate::sys::libc; use super::DeserializationError; diff --git a/rustables/src/expr/reject.rs b/rustables/src/expr/reject.rs index 550a287..2ea0cbf 100644 --- a/rustables/src/expr/reject.rs +++ b/rustables/src/expr/reject.rs @@ -1,9 +1,6 @@ use super::{DeserializationError, Expression, Rule}; use crate::ProtoFamily; -use rustables_sys::{ - self as sys, - libc::{self, c_char}, -}; +use crate::sys::{self, libc::{self, c_char}}; /// A reject expression that defines the type of rejection message sent /// when discarding a packet. diff --git a/rustables/src/expr/verdict.rs b/rustables/src/expr/verdict.rs index 6a6b802..3c4c374 100644 --- a/rustables/src/expr/verdict.rs +++ b/rustables/src/expr/verdict.rs @@ -1,8 +1,5 @@ use super::{DeserializationError, Expression, Rule}; -use rustables_sys::{ - self as sys, - libc::{self, c_char}, -}; +use crate::sys::{self, libc::{self, c_char}}; use std::ffi::{CStr, CString}; /// A verdict expression. In the background, this is usually an "Immediate" expression in nftnl diff --git a/rustables/src/expr/wrapper.rs b/rustables/src/expr/wrapper.rs index 5162c21..1bcc520 100644 --- a/rustables/src/expr/wrapper.rs +++ b/rustables/src/expr/wrapper.rs @@ -3,10 +3,8 @@ use std::ffi::CString; use std::fmt::Debug; use std::rc::Rc; -use super::DeserializationError; -use super::Expression; -use crate::Rule; -use rustables_sys as sys; +use super::{DeserializationError, Expression}; +use crate::{sys, Rule}; pub struct ExpressionWrapper { pub(crate) expr: *const sys::nftnl_expr, diff --git a/rustables/src/lib.rs b/rustables/src/lib.rs index d94c753..6eedf9f 100644 --- a/rustables/src/lib.rs +++ b/rustables/src/lib.rs @@ -76,8 +76,8 @@ use thiserror::Error; #[macro_use] extern crate log; -pub use rustables_sys; -use rustables_sys::libc; +pub mod sys; +use sys::libc; use std::{convert::TryFrom, ffi::c_void, ops::Deref}; macro_rules! try_alloc { @@ -118,9 +118,6 @@ pub use rule::{get_rules_cb, list_rules_for_chain}; pub mod set; -#[cfg(test)] -mod tests; - /// The type of the message as it's sent to netfilter. A message consists of an object, such as a /// [`Table`], [`Chain`] or [`Rule`] for example, and a [`MsgType`] to describe what to do with /// that object. If a [`Table`] object is sent with `MsgType::Add` then that table will be added diff --git a/rustables/src/query.rs b/rustables/src/query.rs index 8d2c281..02c4082 100644 --- a/rustables/src/query.rs +++ b/rustables/src/query.rs @@ -1,4 +1,4 @@ -use crate::{nft_nlmsg_maxsize, rustables_sys as sys, ProtoFamily}; +use crate::{nft_nlmsg_maxsize, sys, ProtoFamily}; use sys::libc; /// Returns a buffer containing a netlink message which requests a list of all the netfilter diff --git a/rustables/src/rule.rs b/rustables/src/rule.rs index b315daf..c8cb90d 100644 --- a/rustables/src/rule.rs +++ b/rustables/src/rule.rs @@ -1,6 +1,6 @@ use crate::expr::ExpressionWrapper; use crate::{chain::Chain, expr::Expression, MsgType}; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; use std::ffi::{c_void, CStr, CString}; use std::fmt::Debug; use std::os::raw::c_char; diff --git a/rustables/src/set.rs b/rustables/src/set.rs index aef74db..d6b9514 100644 --- a/rustables/src/set.rs +++ b/rustables/src/set.rs @@ -1,5 +1,5 @@ use crate::{table::Table, MsgType, ProtoFamily}; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; use std::{ cell::Cell, ffi::{c_void, CStr, CString}, diff --git a/rustables/src/table.rs b/rustables/src/table.rs index 7cc475f..2f21453 100644 --- a/rustables/src/table.rs +++ b/rustables/src/table.rs @@ -1,5 +1,5 @@ use crate::{MsgType, ProtoFamily}; -use rustables_sys::{self as sys, libc}; +use crate::sys::{self, libc}; #[cfg(feature = "query")] use std::convert::TryFrom; use std::{ diff --git a/rustables/src/tests/mod.rs b/rustables/src/tests/mod.rs deleted file mode 100644 index 9a76606..0000000 --- a/rustables/src/tests/mod.rs +++ /dev/null @@ -1,702 +0,0 @@ -use crate::expr::{ - Bitwise, Cmp, CmpOp, Conntrack, Counter, Expression, HeaderField, IcmpCode, Immediate, Log, - LogGroup, LogPrefix, Lookup, Meta, Nat, NatType, Payload, Register, Reject, TcpHeaderField, - TransportHeaderField, -}; -use crate::set::Set; -use crate::{nft_nlmsg_maxsize, Chain, MsgType, NlMsg, ProtoFamily, Rule, Table}; -use rustables_sys::libc::{nlmsghdr, AF_UNIX, NFNETLINK_V0, NFNL_SUBSYS_NFTABLES}; -use std::ffi::{c_void, CStr}; -use std::mem::size_of; -use std::net::Ipv4Addr; -use std::rc::Rc; -use thiserror::Error; - -mod bindings; -use bindings::*; - -fn get_subsystem_from_nlmsghdr_type(x: u16) -> u8 { - ((x & 0xff00) >> 8) as u8 -} -fn get_operation_from_nlmsghdr_type(x: u16) -> u8 { - (x & 0x00ff) as u8 -} - -const TABLE_NAME: &[u8; 10] = b"mocktable\0"; -const CHAIN_NAME: &[u8; 10] = b"mockchain\0"; - -type NetLinkType = u16; - -#[derive(Debug, PartialEq)] -enum NetlinkExpr { - Nested(NetLinkType, Vec<NetlinkExpr>), - Final(NetLinkType, Vec<u8>), - List(Vec<NetlinkExpr>), -} - -#[derive(Debug, Error)] -#[error("empty data")] -struct EmptyDataError; - -impl NetlinkExpr { - fn to_raw(self) -> Vec<u8> { - match self { - NetlinkExpr::Final(ty, val) => { - let len = val.len() + 4; - let mut res = Vec::with_capacity(len); - - res.extend(&(len as u16).to_le_bytes()); - res.extend(&ty.to_le_bytes()); - res.extend(val); - // alignment - while res.len() % 4 != 0 { - res.push(0); - } - - res - } - NetlinkExpr::Nested(ty, exprs) => { - // some heuristic to decrease allocations (even though this is - // only useful for testing so performance is not an objective) - let mut sub = Vec::with_capacity(exprs.len() * 50); - - for expr in exprs { - sub.append(&mut expr.to_raw()); - } - - let len = sub.len() + 4; - let mut res = Vec::with_capacity(len); - - // set the "NESTED" flag - res.extend(&(len as u16).to_le_bytes()); - res.extend(&(ty | 0x8000).to_le_bytes()); - res.extend(sub); - - res - } - NetlinkExpr::List(exprs) => { - // some heuristic to decrease allocations (even though this is - // only useful for testing so performance is not an objective) - let mut list = Vec::with_capacity(exprs.len() * 50); - - for expr in exprs { - list.append(&mut expr.to_raw()); - } - - list - } - } - } -} - -#[repr(C)] -#[derive(Clone, Copy)] -struct Nfgenmsg { - family: u8, /* AF_xxx */ - version: u8, /* nfnetlink version */ - res_id: u16, /* resource id */ -} - -fn get_test_rule() -> Rule { - let table = Rc::new(Table::new( - &CStr::from_bytes_with_nul(TABLE_NAME).unwrap(), - ProtoFamily::Inet, - )); - let chain = Rc::new(Chain::new( - &CStr::from_bytes_with_nul(CHAIN_NAME).unwrap(), - Rc::clone(&table), - )); - let rule = Rule::new(Rc::clone(&chain)); - rule -} - -fn get_test_nlmsg_from_expr( - rule: &mut Rule, - expr: &impl Expression, -) -> (nlmsghdr, Nfgenmsg, Vec<u8>) { - rule.add_expr(expr); - - let mut buf = vec![0u8; nft_nlmsg_maxsize() as usize]; - unsafe { - rule.write(buf.as_mut_ptr() as *mut c_void, 0, MsgType::Add); - - // right now the message is composed of the following parts: - // - nlmsghdr (contains the message size and type) - // - nfgenmsg (nftables header that describes the message family) - // - the raw expression that we want to validate - - let size_of_hdr = size_of::<nlmsghdr>(); - let size_of_nfgenmsg = size_of::<Nfgenmsg>(); - let nlmsghdr = *(buf[0..size_of_hdr].as_ptr() as *const nlmsghdr); - let nfgenmsg = - *(buf[size_of_hdr..size_of_hdr + size_of_nfgenmsg].as_ptr() as *const Nfgenmsg); - let raw_expr = buf[size_of_hdr + size_of_nfgenmsg..nlmsghdr.nlmsg_len as usize] - .iter() - .map(|x| *x) - .collect(); - - // sanity checks on the global message (this should be very similar/factorisable for the - // most part in other tests) - // TODO: check the messages flags - assert_eq!( - get_subsystem_from_nlmsghdr_type(nlmsghdr.nlmsg_type), - NFNL_SUBSYS_NFTABLES as u8 - ); - assert_eq!( - get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), - NFT_MSG_NEWRULE as u8 - ); - assert_eq!(nlmsghdr.nlmsg_seq, 0); - assert_eq!(nlmsghdr.nlmsg_pid, 0); - assert_eq!(nfgenmsg.family, AF_UNIX as u8); - assert_eq!(nfgenmsg.version, NFNETLINK_V0 as u8); - assert_eq!(nfgenmsg.res_id.to_be(), 0); - - (nlmsghdr, nfgenmsg, raw_expr) - } -} - -#[test] -fn bitwise_expr_is_valid() { - let netmask = Ipv4Addr::new(255, 255, 255, 0); - let bitwise = Bitwise::new(netmask, 0); - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &bitwise); - assert_eq!(nlmsghdr.nlmsg_len, 124); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"bitwise\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_BITWISE_SREG, - NFT_REG_1.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_BITWISE_DREG, - NFT_REG_1.to_be_bytes().to_vec() - ), - NetlinkExpr::Final(NFTA_BITWISE_LEN, 4u32.to_be_bytes().to_vec()), - NetlinkExpr::Nested( - NFTA_BITWISE_MASK, - vec![NetlinkExpr::Final( - NFTA_DATA_VALUE, - vec![255, 255, 255, 0] - )] - ), - NetlinkExpr::Nested( - NFTA_BITWISE_XOR, - vec![NetlinkExpr::Final( - NFTA_DATA_VALUE, - 0u32.to_be_bytes().to_vec() - )] - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn cmp_expr_is_valid() { - let cmp = Cmp::new(CmpOp::Eq, 0); - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &cmp); - assert_eq!(nlmsghdr.nlmsg_len, 100); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"cmp\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final(NFTA_CMP_SREG, NFT_REG_1.to_be_bytes().to_vec()), - NetlinkExpr::Final(NFTA_CMP_OP, NFT_CMP_EQ.to_be_bytes().to_vec()), - NetlinkExpr::Nested( - NFTA_CMP_DATA, - vec![NetlinkExpr::Final(1u16, 0u32.to_be_bytes().to_vec())] - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn counter_expr_is_valid() { - let nb_bytes = 123456u64; - let nb_packets = 987u64; - let mut counter = Counter::new(); - counter.nb_bytes = nb_bytes; - counter.nb_packets = nb_packets; - - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &counter); - assert_eq!(nlmsghdr.nlmsg_len, 100); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"counter\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_COUNTER_BYTES, - nb_bytes.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_COUNTER_PACKETS, - nb_packets.to_be_bytes().to_vec() - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn ct_expr_is_valid() { - let ct = Conntrack::State; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &ct); - assert_eq!(nlmsghdr.nlmsg_len, 88); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"ct\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_CT_KEY, - NFT_CT_STATE.to_be_bytes().to_vec() - ), - NetlinkExpr::Final(NFTA_CT_DREG, NFT_REG_1.to_be_bytes().to_vec()) - ] - ) - ] - )] - ) - ]) - .to_raw() - ) -} - -#[test] -fn immediate_expr_is_valid() { - let immediate = Immediate::new(42u8, Register::Reg1); - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &immediate); - assert_eq!(nlmsghdr.nlmsg_len, 100); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"immediate\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_IMMEDIATE_DREG, - NFT_REG_1.to_be_bytes().to_vec() - ), - NetlinkExpr::Nested( - NFTA_IMMEDIATE_DATA, - vec![NetlinkExpr::Final(1u16, 42u8.to_be_bytes().to_vec())] - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn log_expr_is_valid() { - let log = Log { - group: Some(LogGroup(1)), - prefix: Some(LogPrefix::new("mockprefix").unwrap()), - }; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &log); - assert_eq!(nlmsghdr.nlmsg_len, 96); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"log\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final(NFTA_LOG_PREFIX, b"mockprefix\0".to_vec()), - NetlinkExpr::Final(NFTA_LOG_GROUP, 1u16.to_be_bytes().to_vec()) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn lookup_expr_is_valid() { - let set_name = &CStr::from_bytes_with_nul(b"mockset\0").unwrap(); - let mut rule = get_test_rule(); - let table = rule.get_chain().get_table(); - let mut set = Set::new(set_name, 0, &table, ProtoFamily::Inet); - let address: Ipv4Addr = [8, 8, 8, 8].into(); - set.add(&address); - let lookup = Lookup::new(&set).unwrap(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &lookup); - assert_eq!(nlmsghdr.nlmsg_len, 104); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"lookup\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_LOOKUP_SREG, - NFT_REG_1.to_be_bytes().to_vec() - ), - NetlinkExpr::Final(NFTA_LOOKUP_SET, b"mockset\0".to_vec()), - NetlinkExpr::Final(NFTA_LOOKUP_SET_ID, 0u32.to_be_bytes().to_vec()), - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -use crate::expr::Masquerade; -#[test] -fn masquerade_expr_is_valid() { - let masquerade = Masquerade; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &masquerade); - assert_eq!(nlmsghdr.nlmsg_len, 76); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"masq\0".to_vec()), - NetlinkExpr::Nested(NFTA_EXPR_DATA, vec![]), - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn meta_expr_is_valid() { - let meta = Meta::Protocol; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &meta); - assert_eq!(nlmsghdr.nlmsg_len, 92); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"meta\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_META_KEY, - NFT_META_PROTOCOL.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_META_DREG, - NFT_REG_1.to_be_bytes().to_vec() - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn nat_expr_is_valid() { - let nat = Nat { - nat_type: NatType::SNat, - family: ProtoFamily::Ipv4, - ip_register: Register::Reg1, - port_register: None, - }; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &nat); - assert_eq!(nlmsghdr.nlmsg_len, 96); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"nat\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_NAT_TYPE, - NFT_NAT_SNAT.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_NAT_FAMILY, - // TODO find the right value to substitute here. - //(ProtoFamily::Ipv4 as u16).to_le_bytes().to_vec() - 2u32.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_NAT_REG_ADDR_MIN, - NFT_REG_1.to_be_bytes().to_vec() - ) - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn payload_expr_is_valid() { - // TODO test loaded payload ? - let tcp_header_field = TcpHeaderField::Sport; - let transport_header_field = TransportHeaderField::Tcp(tcp_header_field); - let payload = Payload::Transport(transport_header_field); - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &payload); - assert_eq!(nlmsghdr.nlmsg_len, 108); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"payload\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_PAYLOAD_DREG, - NFT_REG_1.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_PAYLOAD_BASE, - NFT_PAYLOAD_TRANSPORT_HEADER.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_PAYLOAD_OFFSET, - tcp_header_field.offset().to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_PAYLOAD_LEN, - //tcp_header_field.len().to_be_bytes().to_vec() - 0u32.to_be_bytes().to_vec() - ), - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -#[test] -fn reject_expr_is_valid() { - let code = IcmpCode::NoRoute; - let reject = Reject::Icmp(code); - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &reject); - assert_eq!(nlmsghdr.nlmsg_len, 92); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"reject\0".to_vec()), - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_REJECT_TYPE, - NFT_REJECT_ICMPX_UNREACH.to_be_bytes().to_vec() - ), - NetlinkExpr::Final( - NFTA_REJECT_ICMP_CODE, - (code as u8).to_be_bytes().to_vec() - ), - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} - -use crate::expr::Verdict; -use rustables_sys::libc::NF_DROP; -#[test] -fn verdict_expr_is_valid() { - let verdict = Verdict::Drop; - let mut rule = get_test_rule(); - let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_from_expr(&mut rule, &verdict); - assert_eq!(nlmsghdr.nlmsg_len, 104); - - assert_eq!( - raw_expr, - NetlinkExpr::List(vec![ - NetlinkExpr::Final(NFTA_RULE_TABLE, TABLE_NAME.to_vec()), - NetlinkExpr::Final(NFTA_RULE_CHAIN, CHAIN_NAME.to_vec()), - NetlinkExpr::Nested( - NFTA_RULE_EXPRESSIONS, - vec![NetlinkExpr::Nested( - NFTA_LIST_ELEM, - vec![ - NetlinkExpr::Final(NFTA_EXPR_NAME, b"immediate\0".to_vec()), - // TODO find the right arrangement for Verdict's data. - NetlinkExpr::Nested( - NFTA_EXPR_DATA, - vec![ - NetlinkExpr::Final( - NFTA_IMMEDIATE_DREG, - NFT_REG_VERDICT.to_be_bytes().to_vec() - ), - NetlinkExpr::Nested( - NFTA_IMMEDIATE_DATA, - vec![NetlinkExpr::Nested( - NFTA_DATA_VERDICT, - vec![NetlinkExpr::Final( - NFTA_VERDICT_CODE, - NF_DROP.to_be_bytes().to_vec() //0u32.to_be_bytes().to_vec() - ),] - )], - ), - ] - ) - ] - )] - ) - ]) - .to_raw() - ); -} |