aboutsummaryrefslogtreecommitdiff
path: root/rustables/src/expr/immediate.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rustables/src/expr/immediate.rs')
-rw-r--r--rustables/src/expr/immediate.rs54
1 files changed, 54 insertions, 0 deletions
diff --git a/rustables/src/expr/immediate.rs b/rustables/src/expr/immediate.rs
new file mode 100644
index 0000000..e5ccc2a
--- /dev/null
+++ b/rustables/src/expr/immediate.rs
@@ -0,0 +1,54 @@
+use super::{Expression, Register, Rule};
+use rustables_sys as sys;
+use std::ffi::c_void;
+use std::mem::size_of_val;
+use std::os::raw::c_char;
+
+/// An immediate expression. Used to set immediate data.
+/// Verdicts are handled separately by [Verdict].
+#[derive(Debug, Clone, Eq, PartialEq, Hash)]
+pub struct Immediate<T> {
+ pub data: T,
+ pub register: Register,
+}
+
+impl<T> Immediate<T> {
+ pub fn new(data: T, register: Register) -> Self {
+ Self { data, register }
+ }
+}
+
+impl<T> Expression for Immediate<T> {
+ fn to_expr(&self, _rule: &Rule) -> *mut sys::nftnl_expr {
+ unsafe {
+ let expr = try_alloc!(sys::nftnl_expr_alloc(
+ b"immediate\0" as *const _ as *const c_char
+ ));
+
+ sys::nftnl_expr_set_u32(
+ expr,
+ sys::NFTNL_EXPR_IMM_DREG as u16,
+ self.register.to_raw(),
+ );
+
+ sys::nftnl_expr_set(
+ expr,
+ sys::NFTNL_EXPR_IMM_DATA as u16,
+ &self.data as *const _ as *const c_void,
+ size_of_val(&self.data) as u32,
+ );
+
+ expr
+ }
+ }
+}
+
+#[macro_export]
+macro_rules! nft_expr_immediate {
+ (data $value:expr) => {
+ $crate::expr::Immediate {
+ data: $value,
+ register: $crate::expr::Register::Reg1,
+ }
+ };
+}