rustables/expr/
immediate.rs1use rustables_macros::nfnetlink_struct;
2
3use super::{Expression, Register, Verdict, VerdictKind, VerdictType};
4use crate::{
5 parser_impls::NfNetlinkData,
6 sys::{NFTA_IMMEDIATE_DATA, NFTA_IMMEDIATE_DREG},
7};
8
9#[derive(Clone, PartialEq, Eq, Default, Debug)]
10#[nfnetlink_struct]
11pub struct Immediate {
12 #[field(NFTA_IMMEDIATE_DREG)]
13 dreg: Register,
14 #[field(NFTA_IMMEDIATE_DATA)]
15 data: NfNetlinkData,
16}
17
18impl Immediate {
19 pub fn new_data(data: Vec<u8>, register: Register) -> Self {
20 Immediate::default()
21 .with_dreg(register)
22 .with_data(NfNetlinkData::default().with_value(data))
23 }
24
25 pub fn new_verdict(kind: VerdictKind) -> Self {
26 let code = match kind {
27 VerdictKind::Drop => VerdictType::Drop,
28 VerdictKind::Accept => VerdictType::Accept,
29 VerdictKind::Queue => VerdictType::Queue,
30 VerdictKind::Continue => VerdictType::Continue,
31 VerdictKind::Break => VerdictType::Break,
32 VerdictKind::Jump { .. } => VerdictType::Jump,
33 VerdictKind::Goto { .. } => VerdictType::Goto,
34 VerdictKind::Return => VerdictType::Return,
35 };
36 let mut data = Verdict::default().with_code(code);
37 if let VerdictKind::Jump { chain } | VerdictKind::Goto { chain } = kind {
38 data.set_chain(chain);
39 }
40 Immediate::default()
41 .with_dreg(Register::Verdict)
42 .with_data(NfNetlinkData::default().with_verdict(data))
43 }
44}
45
46impl Expression for Immediate {
47 fn get_name() -> &'static str {
48 "immediate"
49 }
50}