aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--examples/add-rules.rs2
-rw-r--r--src/lib.rs6
-rw-r--r--tests/chain.rs40
-rw-r--r--tests/lib.rs18
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};
diff --git a/src/lib.rs b/src/lib.rs
index db23b28..4070bb1 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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)