aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-05-06 14:26:22 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-05-06 14:26:22 +0200
commit3a1e7fe88407931fb2e7ffaaa9ceda2c1dd13557 (patch)
tree45052c76c1fe8a38fe96cbd68d0eabb848dfe4ac
parentcc4251f22b0eb84fb3dcd3e95307c7520b3ebdde (diff)
add support for byteorder expression
-rw-r--r--src/error.rs3
-rw-r--r--src/expr/byteorder.rs40
-rw-r--r--src/expr/mod.rs4
3 files changed, 47 insertions, 0 deletions
diff --git a/src/error.rs b/src/error.rs
index 646b482..b7ae17b 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -67,6 +67,9 @@ pub enum DecodeError {
#[error("Invalid type for a payload expression")]
UnknownPayloadType(u32),
+ #[error("Invalid type for a byteorder expression")]
+ UnknownByteorderOp(u32),
+
#[error("Invalid type for a compare expression")]
UnknownCmpOp(u32),
diff --git a/src/expr/byteorder.rs b/src/expr/byteorder.rs
new file mode 100644
index 0000000..e45bc92
--- /dev/null
+++ b/src/expr/byteorder.rs
@@ -0,0 +1,40 @@
+use rustables_macros::{nfnetlink_enum, nfnetlink_struct};
+
+use crate::sys::{
+ NFTA_BYTEORDER_DREG, NFTA_BYTEORDER_LEN, NFTA_BYTEORDER_OP, NFTA_BYTEORDER_SIZE,
+ NFTA_BYTEORDER_SREG, NFT_BYTEORDER_HTON, NFT_BYTEORDER_NTOH,
+};
+
+use super::{Expression, Register};
+
+/// Byteorder operation.
+#[derive(Debug, Copy, Clone, Eq, PartialEq)]
+#[nfnetlink_enum(u32, nested = true)]
+pub enum ByteorderOp {
+ /// Network to host byte order.
+ NtoH = NFT_BYTEORDER_NTOH,
+ /// Host to network byte order.
+ HtoN = NFT_BYTEORDER_HTON,
+}
+
+/// Ensures a register is of the correct byte order.
+#[derive(Default, Debug, Clone, PartialEq, Eq)]
+#[nfnetlink_struct(nested = true)]
+pub struct Byteorder {
+ #[field(NFTA_BYTEORDER_SREG)]
+ sreg: Register,
+ #[field(NFTA_BYTEORDER_DREG)]
+ dreg: Register,
+ #[field(NFTA_BYTEORDER_OP)]
+ op: ByteorderOp,
+ #[field(NFTA_BYTEORDER_LEN)]
+ len: u32,
+ #[field(NFTA_BYTEORDER_SIZE)]
+ siz: u32,
+}
+
+impl Expression for Byteorder {
+ fn get_name() -> &'static str {
+ "byteorder"
+ }
+}
diff --git a/src/expr/mod.rs b/src/expr/mod.rs
index 6acc7c5..f8fd67d 100644
--- a/src/expr/mod.rs
+++ b/src/expr/mod.rs
@@ -15,6 +15,9 @@ use crate::sys::{self, NFTA_EXPR_DATA, NFTA_EXPR_NAME};
mod bitwise;
pub use self::bitwise::*;
+mod byteorder;
+pub use self::byteorder::*;
+
mod cmp;
pub use self::cmp::*;
@@ -175,6 +178,7 @@ macro_rules! create_expr_variant {
create_expr_variant!(
ExpressionVariant,
[Bitwise, Bitwise],
+ [Byteorder, Byteorder],
[Cmp, Cmp],
[Conntrack, Conntrack],
[Counter, Counter],