diff options
author | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-06 14:03:45 +0200 |
---|---|---|
committer | HimbeerserverDE <himbeerserverde@gmail.com> | 2023-05-06 14:03:45 +0200 |
commit | cc4251f22b0eb84fb3dcd3e95307c7520b3ebdde (patch) | |
tree | f819d32066eb9ded64d61ae7c882ef176976ca81 | |
parent | a78962f91ae04da631de4908851d1d3e7983d032 (diff) |
add support for rt expression
-rw-r--r-- | src/error.rs | 3 | ||||
-rw-r--r-- | src/expr/mod.rs | 6 | ||||
-rw-r--r-- | src/expr/rt.rs | 37 |
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" + } +} |