diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-06 14:26:22 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-06 14:26:22 +0200 |
commit | 3a1e7fe88407931fb2e7ffaaa9ceda2c1dd13557 (patch) | |
tree | 45052c76c1fe8a38fe96cbd68d0eabb848dfe4ac | |
parent | cc4251f22b0eb84fb3dcd3e95307c7520b3ebdde (diff) |
add support for byteorder expression
-rw-r--r-- | src/error.rs | 3 | ||||
-rw-r--r-- | src/expr/byteorder.rs | 40 | ||||
-rw-r--r-- | src/expr/mod.rs | 4 |
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], |