diff options
-rw-r--r-- | examples/add-rules.rs | 2 | ||||
-rw-r--r-- | src/lib.rs | 6 | ||||
-rw-r--r-- | tests/chain.rs | 40 | ||||
-rw-r--r-- | tests/lib.rs | 18 |
4 files changed, 59 insertions, 7 deletions
diff --git a/examples/add-rules.rs b/examples/add-rules.rs index 75fc63e..a9c3539 100644 --- a/examples/add-rules.rs +++ b/examples/add-rules.rs @@ -38,7 +38,7 @@ use ipnetwork::{IpNetwork, Ipv4Network}; use rustables::{ - chain::HookClass, list_chains_for_table, list_tables, Batch, Chain, ChainPolicy, Hook, MsgType, + list_chains_for_table, list_tables, Batch, Chain, ChainPolicy, Hook, HookClass, MsgType, ProtocolFamily, Table, }; //use rustables::{nft_expr, query::send_batch, sys::libc, Batch, Chain, Rule, Table}; @@ -97,13 +97,13 @@ pub use batch::{default_batch_page_size, Batch}; //pub mod expr; -pub mod table; +mod table; pub use table::list_tables; pub use table::Table; -pub mod chain; +mod chain; pub use chain::list_chains_for_table; -pub use chain::{Chain, ChainPolicy, ChainPriority, ChainType, Hook}; +pub use chain::{Chain, ChainPolicy, ChainPriority, ChainType, Hook, HookClass}; //mod chain_methods; //pub use chain_methods::ChainMethods; diff --git a/tests/chain.rs b/tests/chain.rs index c32959c..09594f1 100644 --- a/tests/chain.rs +++ b/tests/chain.rs @@ -1,5 +1,5 @@ mod sys; -use rustables::{parser::get_operation_from_nlmsghdr_type, MsgType}; +use rustables::{parser::get_operation_from_nlmsghdr_type, ChainType, Hook, HookClass, MsgType}; use sys::*; mod lib; @@ -28,6 +28,44 @@ fn new_empty_chain() { } #[test] +fn new_empty_chain_with_hook_and_type() { + let mut chain = get_test_chain() + .with_hook(Hook::new(HookClass::In, 0)) + .with_type(ChainType::Filter); + + let mut buf = Vec::new(); + let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut buf, &mut chain); + assert_eq!( + get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type), + NFT_MSG_NEWCHAIN as u8 + ); + assert_eq!(nlmsghdr.nlmsg_len, 84); + + assert_eq!( + raw_expr, + NetlinkExpr::List(vec![ + NetlinkExpr::Final(NFTA_CHAIN_TABLE, TABLE_NAME.as_bytes().to_vec()), + NetlinkExpr::Final(NFTA_CHAIN_NAME, CHAIN_NAME.as_bytes().to_vec()), + NetlinkExpr::Final(NFTA_CHAIN_TYPE, "filter".as_bytes().to_vec()), + NetlinkExpr::Nested( + NFTA_CHAIN_HOOK, + vec![ + NetlinkExpr::List(vec![NetlinkExpr::Final( + NFTA_HOOK_HOOKNUM, + vec![0, 0, 0, 1] + )]), + NetlinkExpr::List(vec![NetlinkExpr::Final( + NFTA_HOOK_PRIORITY, + vec![0, 0, 0, 0] + )]) + ] + ), + ]) + .to_raw() + ); +} + +#[test] fn new_empty_chain_with_userdata() { let mut chain = get_test_chain(); chain.set_userdata(CHAIN_USERDATA); diff --git a/tests/lib.rs b/tests/lib.rs index 0268b1a..4ca75ad 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -26,7 +26,7 @@ type NetLinkType = u16; #[error("empty data")] pub struct EmptyDataError; -#[derive(Debug, Clone, Eq, PartialOrd, Ord)] +#[derive(Debug, Clone, Eq, Ord)] pub enum NetlinkExpr { Nested(NetLinkType, Vec<NetlinkExpr>), Final(NetLinkType, Vec<u8>), @@ -35,7 +35,7 @@ pub enum NetlinkExpr { impl NetlinkExpr { pub fn to_raw(self) -> Vec<u8> { - match self { + match self.sort() { NetlinkExpr::Final(ty, val) => { let len = val.len() + 4; let mut res = Vec::with_capacity(len); @@ -109,6 +109,20 @@ impl PartialEq for NetlinkExpr { } } +impl PartialOrd for NetlinkExpr { + fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> { + match (self, other) { + ( + NetlinkExpr::Nested(k1, _) | NetlinkExpr::Final(k1, _), + NetlinkExpr::Nested(k2, _) | NetlinkExpr::Final(k2, _), + ) => k1.partial_cmp(k2), + (NetlinkExpr::List(v1), NetlinkExpr::List(v2)) => v1.partial_cmp(v2), + (_, NetlinkExpr::List(_)) => Some(std::cmp::Ordering::Less), + (NetlinkExpr::List(_), _) => Some(std::cmp::Ordering::Greater), + } + } +} + pub fn get_test_table() -> Table { Table::new(ProtocolFamily::Inet) .with_name(TABLE_NAME) |