aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeerserverDE <himbeerserverde@gmail.com>2023-05-06 14:03:45 +0200
committerHimbeerserverDE <himbeerserverde@gmail.com>2023-05-06 14:03:45 +0200
commitcc4251f22b0eb84fb3dcd3e95307c7520b3ebdde (patch)
treef819d32066eb9ded64d61ae7c882ef176976ca81
parenta78962f91ae04da631de4908851d1d3e7983d032 (diff)
add support for rt expression
-rw-r--r--src/error.rs3
-rw-r--r--src/expr/mod.rs6
-rw-r--r--src/expr/rt.rs37
3 files changed, 45 insertions, 1 deletions
diff --git a/src/error.rs b/src/error.rs
index fa0e26f..646b482 100644
--- a/src/error.rs
+++ b/src/error.rs
@@ -49,6 +49,9 @@ pub enum DecodeError {
#[error("Unsupported value for an icmp reject type")]
UnknownRejectType(u32),
+ #[error("Invalid type for a rt expression")]
+ UnknownRtKey(u32),
+
#[error("Unsupported value for an icmp code in a reject expression")]
UnknownIcmpCode(u8),
diff --git a/src/expr/mod.rs b/src/expr/mod.rs
index 9b8b9e6..6acc7c5 100644
--- a/src/expr/mod.rs
+++ b/src/expr/mod.rs
@@ -54,6 +54,9 @@ pub use self::reject::{IcmpCode, Reject, RejectType};
mod register;
pub use self::register::Register;
+mod rt;
+pub use self::rt::*;
+
mod verdict;
pub use self::verdict::*;
@@ -184,7 +187,8 @@ create_expr_variant!(
[Meta, Meta],
[Nat, Nat],
[Payload, Payload],
- [Reject, Reject]
+ [Reject, Reject],
+ [Rt, Rt]
);
pub type ExpressionList = NfNetlinkList<RawExpression>;
diff --git a/src/expr/rt.rs b/src/expr/rt.rs
new file mode 100644
index 0000000..5ed9272
--- /dev/null
+++ b/src/expr/rt.rs
@@ -0,0 +1,37 @@
+use rustables_macros::{nfnetlink_enum, nfnetlink_struct};
+
+use crate::sys::{
+ NFTA_RT_DREG, NFTA_RT_KEY, NFT_RT_CLASSID, NFT_RT_NEXTHOP4, NFT_RT_NEXTHOP6, NFT_RT_TCPMSS,
+};
+
+use super::{Expression, Register};
+
+/// Kind of routing information.
+#[derive(Debug, Copy, Clone, Eq, PartialEq)]
+#[nfnetlink_enum(u32, nested = true)]
+pub enum RtKey {
+ /// Class ID.
+ ClassID = NFT_RT_CLASSID,
+ /// Next IPv4 hop.
+ NextHop4 = NFT_RT_NEXTHOP4,
+ /// Next IPv6 hop.
+ NextHop6 = NFT_RT_NEXTHOP6,
+ /// TCP MSS.
+ TCPMSS = NFT_RT_TCPMSS,
+}
+
+/// Loads routing information into a register.
+#[derive(Default, Debug, Clone, PartialEq, Eq)]
+#[nfnetlink_struct(nested = true)]
+pub struct Rt {
+ #[field(NFTA_RT_DREG)]
+ dreg: Register,
+ #[field(NFTA_RT_KEY)]
+ key: RtKey,
+}
+
+impl Expression for Rt {
+ fn get_name() -> &'static str {
+ "rt"
+ }
+}