aboutsummaryrefslogtreecommitdiff
path: root/src/expr/immediate.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/expr/immediate.rs')
-rw-r--r--src/expr/immediate.rs31
1 files changed, 27 insertions, 4 deletions
diff --git a/src/expr/immediate.rs b/src/expr/immediate.rs
index 134f7e1..2fd9bd5 100644
--- a/src/expr/immediate.rs
+++ b/src/expr/immediate.rs
@@ -1,7 +1,10 @@
use rustables_macros::nfnetlink_struct;
-use super::{Expression, ExpressionData, Register};
-use crate::sys::{NFTA_IMMEDIATE_DATA, NFTA_IMMEDIATE_DREG};
+use super::{Expression, Register, Verdict, VerdictKind, VerdictType};
+use crate::{
+ parser_impls::NfNetlinkData,
+ sys::{NFTA_IMMEDIATE_DATA, NFTA_IMMEDIATE_DREG},
+};
#[derive(Clone, PartialEq, Eq, Default, Debug)]
#[nfnetlink_struct]
@@ -9,14 +12,34 @@ pub struct Immediate {
#[field(NFTA_IMMEDIATE_DREG)]
dreg: Register,
#[field(NFTA_IMMEDIATE_DATA)]
- data: ExpressionData,
+ data: NfNetlinkData,
}
impl Immediate {
pub fn new_data(data: Vec<u8>, register: Register) -> Self {
Immediate::default()
.with_dreg(register)
- .with_data(ExpressionData::default().with_value(data))
+ .with_data(NfNetlinkData::default().with_value(data))
+ }
+
+ pub fn new_verdict(kind: VerdictKind) -> Self {
+ let code = match kind {
+ VerdictKind::Drop => VerdictType::Drop,
+ VerdictKind::Accept => VerdictType::Accept,
+ VerdictKind::Queue => VerdictType::Queue,
+ VerdictKind::Continue => VerdictType::Continue,
+ VerdictKind::Break => VerdictType::Break,
+ VerdictKind::Jump { .. } => VerdictType::Jump,
+ VerdictKind::Goto { .. } => VerdictType::Goto,
+ VerdictKind::Return => VerdictType::Return,
+ };
+ let mut data = Verdict::default().with_code(code);
+ if let VerdictKind::Jump { chain } | VerdictKind::Goto { chain } = kind {
+ data.set_chain(chain);
+ }
+ Immediate::default()
+ .with_dreg(Register::Verdict)
+ .with_data(NfNetlinkData::default().with_verdict(data))
}
}