diff options
Diffstat (limited to 'src/expr/immediate.rs')
-rw-r--r-- | src/expr/immediate.rs | 31 |
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)) } } |