aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lib.rs3
-rw-r--r--tests/lib.rs19
-rw-r--r--tests/set.rs68
3 files changed, 86 insertions, 4 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 5cf9ca6..665f752 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -77,8 +77,8 @@ use thiserror::Error;
extern crate log;
pub mod sys;
-use sys::libc;
use std::{convert::TryFrom, ffi::c_void, ops::Deref};
+use sys::libc;
macro_rules! try_alloc {
($e:expr) => {{
@@ -123,6 +123,7 @@ mod rule_methods;
pub use rule_methods::{iface_index, Protocol, RuleMethods, Error as MatchError};
pub mod set;
+pub use set::Set;
/// 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
diff --git a/tests/lib.rs b/tests/lib.rs
index af599a5..c30f881 100644
--- a/tests/lib.rs
+++ b/tests/lib.rs
@@ -1,6 +1,7 @@
#![allow(dead_code)]
use libc::{nlmsghdr, AF_UNIX, NFNETLINK_V0, NFNL_SUBSYS_NFTABLES};
-use rustables::{nft_nlmsg_maxsize, Chain, MsgType, NlMsg, ProtoFamily, Rule, Table};
+use rustables::set::SetKey;
+use rustables::{nft_nlmsg_maxsize, Chain, MsgType, NlMsg, ProtoFamily, Rule, Set, Table};
use std::ffi::{c_void, CStr};
use std::mem::size_of;
use std::rc::Rc;
@@ -15,10 +16,14 @@ pub fn get_operation_from_nlmsghdr_type(x: u16) -> u8 {
pub const TABLE_NAME: &[u8; 10] = b"mocktable\0";
pub const CHAIN_NAME: &[u8; 10] = b"mockchain\0";
+pub const SET_NAME: &[u8; 8] = b"mockset\0";
pub const TABLE_USERDATA: &[u8; 14] = b"mocktabledata\0";
pub const CHAIN_USERDATA: &[u8; 14] = b"mockchaindata\0";
pub const RULE_USERDATA: &[u8; 13] = b"mockruledata\0";
+pub const SET_USERDATA: &[u8; 12] = b"mocksetdata\0";
+
+pub const SET_ID: u32 = 123456;
type NetLinkType = u16;
@@ -107,8 +112,16 @@ pub fn get_test_chain() -> Chain {
}
pub fn get_test_rule() -> Rule {
- let rule = Rule::new(Rc::new(get_test_chain()));
- rule
+ Rule::new(Rc::new(get_test_chain()))
+}
+
+pub fn get_test_set<'a, T: SetKey>(table: &'a Table) -> Set<'a, T> {
+ Set::new(
+ CStr::from_bytes_with_nul(SET_NAME).unwrap(),
+ SET_ID,
+ table,
+ ProtoFamily::Ipv4,
+ )
}
pub fn get_test_nlmsg_with_msg_type(
diff --git a/tests/set.rs b/tests/set.rs
new file mode 100644
index 0000000..a357a13
--- /dev/null
+++ b/tests/set.rs
@@ -0,0 +1,68 @@
+mod sys;
+use std::net::{Ipv4Addr, Ipv6Addr};
+
+use rustables::{set::SetKey, MsgType};
+use sys::*;
+
+mod lib;
+use lib::*;
+
+#[test]
+fn new_empty_set() {
+ let table = get_test_table();
+ let mut set = get_test_set::<Ipv4Addr>(&table);
+ let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg(&mut set);
+ assert_eq!(
+ get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type),
+ NFT_MSG_NEWSET as u8
+ );
+ assert_eq!(nlmsghdr.nlmsg_len, 80);
+
+ assert_eq!(
+ raw_expr,
+ NetlinkExpr::List(vec![
+ NetlinkExpr::Final(NFTA_SET_TABLE, TABLE_NAME.to_vec()),
+ NetlinkExpr::Final(NFTA_SET_NAME, SET_NAME.to_vec()),
+ NetlinkExpr::Final(
+ NFTA_SET_FLAGS,
+ ((libc::NFT_SET_ANONYMOUS | libc::NFT_SET_CONSTANT) as u32)
+ .to_be_bytes()
+ .to_vec()
+ ),
+ NetlinkExpr::Final(NFTA_SET_KEY_TYPE, Ipv4Addr::TYPE.to_be_bytes().to_vec()),
+ NetlinkExpr::Final(NFTA_SET_KEY_LEN, Ipv4Addr::LEN.to_be_bytes().to_vec()),
+ NetlinkExpr::Final(NFTA_SET_ID, SET_ID.to_be_bytes().to_vec()),
+ ])
+ .to_raw()
+ );
+}
+
+#[test]
+fn delete_empty_set() {
+ let table = get_test_table();
+ let mut set = get_test_set::<Ipv6Addr>(&table);
+ let (nlmsghdr, _nfgenmsg, raw_expr) = get_test_nlmsg_with_msg_type(&mut set, MsgType::Del);
+ assert_eq!(
+ get_operation_from_nlmsghdr_type(nlmsghdr.nlmsg_type),
+ NFT_MSG_DELSET as u8
+ );
+ assert_eq!(nlmsghdr.nlmsg_len, 80);
+
+ assert_eq!(
+ raw_expr,
+ NetlinkExpr::List(vec![
+ NetlinkExpr::Final(NFTA_SET_TABLE, TABLE_NAME.to_vec()),
+ NetlinkExpr::Final(NFTA_SET_NAME, SET_NAME.to_vec()),
+ NetlinkExpr::Final(
+ NFTA_SET_FLAGS,
+ ((libc::NFT_SET_ANONYMOUS | libc::NFT_SET_CONSTANT) as u32)
+ .to_be_bytes()
+ .to_vec()
+ ),
+ NetlinkExpr::Final(NFTA_SET_KEY_TYPE, Ipv6Addr::TYPE.to_be_bytes().to_vec()),
+ NetlinkExpr::Final(NFTA_SET_KEY_LEN, Ipv6Addr::LEN.to_be_bytes().to_vec()),
+ NetlinkExpr::Final(NFTA_SET_ID, SET_ID.to_be_bytes().to_vec()),
+ ])
+ .to_raw()
+ );
+}