aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-05-03 21:08:28 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-05-03 21:08:28 +0200
commitc3a35c157a73e6841de28788650f71016c5be1a1 (patch)
tree36feffc06c609c16484e50a9f454a7e90e78685c
parent8f8eb7c1c6870e38fd1dcc694c8b74dbc0ef95dd (diff)
add exthdr expressions
-rw-r--r--src/error.rs3
-rw-r--r--src/expr/exthdr.rs44
-rw-r--r--src/expr/mod.rs3
3 files changed, 50 insertions, 0 deletions
diff --git a/src/error.rs b/src/error.rs
index 80f06d7..fa0e26f 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -70,6 +70,9 @@ pub enum DecodeError {
#[error("Invalid type for a conntrack key")]
UnknownConntrackKey(u32),
+ #[error("Invalid type for an extension header expression")]
+ UnknownExtHdrOp(u32),
+
#[error("Unsupported value for a link layer header field")]
UnknownLinkLayerHeaderField(u32, u32),
diff --git a/src/expr/exthdr.rs b/src/expr/exthdr.rs
new file mode 100644
index 0000000..954b394
--- /dev/null
+++ b/src/expr/exthdr.rs
@@ -0,0 +1,44 @@
+use rustables_macros::{nfnetlink_enum, nfnetlink_struct};
+
+use crate::sys::{
+ NFTA_EXTHDR_DREG, NFTA_EXTHDR_FLAGS, NFTA_EXTHDR_LEN, NFTA_EXTHDR_OFFSET, NFTA_EXTHDR_OP,
+ NFTA_EXTHDR_SREG, NFTA_EXTHDR_TYPE, NFT_EXTHDR_OP_IPV6, NFT_EXTHDR_OP_TCPOPT,
+};
+
+use super::{Expression, Register};
+
+/// Header operation.
+#[derive(Debug, Copy, Clone, Eq, PartialEq)]
+#[nfnetlink_enum(u32, nested = true)]
+pub enum ExtHdrOp {
+ /// IPv6.
+ Ipv6 = NFT_EXTHDR_OP_IPV6,
+ /// TCP options.
+ TcpOpt = NFT_EXTHDR_OP_TCPOPT,
+}
+
+/// Interacts with layer 4 header options.
+#[derive(Default, Debug, Clone, PartialEq, Eq)]
+#[nfnetlink_struct(nested = true)]
+pub struct ExtHdr {
+ #[field(NFTA_EXTHDR_DREG)]
+ dreg: Register,
+ #[field(NFTA_EXTHDR_TYPE)]
+ typ: u8,
+ #[field(NFTA_EXTHDR_OFFSET)]
+ offset: u32,
+ #[field(NFTA_EXTHDR_LEN)]
+ len: u32,
+ #[field(NFTA_EXTHDR_FLAGS)]
+ flags: u32,
+ #[field(NFTA_EXTHDR_OP)]
+ op: ExtHdrOp,
+ #[field(NFTA_EXTHDR_SREG)]
+ sreg: Register,
+}
+
+impl Expression for ExtHdr {
+ fn get_name() -> &'static str {
+ "exthdr"
+ }
+}
diff --git a/src/expr/mod.rs b/src/expr/mod.rs
index af29460..b0d9d51 100644
--- a/src/expr/mod.rs
+++ b/src/expr/mod.rs
@@ -24,6 +24,9 @@ pub use self::counter::*;
pub mod ct;
pub use self::ct::*;
+pub mod exthdr;
+pub use self::exthdr::*;
+
mod immediate;
pub use self::immediate::*;