nftables_json/
statement.rs

1// Copyright (c) nftables-json Developers
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4//! Provides types related to specifying a rule's construction
5
6use crate::expression::*;
7
8#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
9#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
10#[serde(deny_unknown_fields, untagged)]
11pub enum Counter {
12    Named(Box<Expression>),
13    Anonymous {
14        #[serde(default)]
15        packets: isize,
16        #[serde(default)]
17        bytes: isize,
18    },
19}
20
21#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
22#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
23#[serde(deny_unknown_fields)]
24pub struct CtCount {
25    pub val: isize,
26    pub inv: Option<bool>,
27}
28
29#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
30#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
31#[serde(deny_unknown_fields)]
32pub struct Dup {
33    pub addr: Box<Expression>,
34    pub dev: Option<Expression>,
35}
36
37#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
38#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
39#[serde(deny_unknown_fields)]
40pub struct Flow {
41    pub op: String,
42    pub flowtable: String,
43}
44
45#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
46#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
47#[serde(deny_unknown_fields)]
48pub struct Fwd {
49    pub dev: Box<Expression>,
50    pub family: Option<String>,
51    pub addr: Option<Expression>,
52}
53
54#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
55#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
56#[serde(deny_unknown_fields, untagged)]
57pub enum Limit {
58    Named(Box<Expression>),
59    Anonymous {
60        rate: isize,
61        rate_unit: Option<String>,
62        per: String,
63        burst: Option<isize>,
64        burst_unit: Option<String>,
65        inv: Option<bool>,
66    },
67}
68
69#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
70#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
71#[serde(deny_unknown_fields)]
72pub struct Log {
73    pub prefix: Option<String>,
74    pub group: Option<isize>,
75    pub snaplen: Option<isize>,
76    #[serde(rename = "queue-threshold")]
77    pub queue_threshold: Option<isize>,
78    pub level: Option<String>,
79    #[serde(with = "serde_with::As::<Option<serde_with::OneOrMany<serde_with::Same>>>")]
80    pub flags: Option<Vec<String>>,
81}
82
83#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
84#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
85#[serde(deny_unknown_fields)]
86pub struct Mangle {
87    pub key: Box<Expression>,
88    pub value: Box<Expression>,
89}
90
91#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
92#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
93#[serde(deny_unknown_fields)]
94pub struct Match {
95    pub left: Box<Expression>,
96    pub right: Box<Expression>,
97    pub op: String,
98}
99
100#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
101#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
102#[serde(deny_unknown_fields)]
103pub struct Meter {
104    pub name: String,
105    pub size: Option<isize>,
106    pub key: Box<Expression>,
107    pub stmt: Box<Statement>,
108}
109
110#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
111#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
112#[serde(deny_unknown_fields)]
113pub struct Nat {
114    pub addr: Option<Expression>,
115    pub family: Option<String>,
116    pub port: Option<Expression>,
117    #[serde(with = "serde_with::As::<Option<serde_with::OneOrMany<serde_with::Same>>>")]
118    pub flags: Option<Vec<String>>,
119    #[serde(with = "serde_with::As::<Option<serde_with::OneOrMany<serde_with::Same>>>")]
120    pub type_flags: Option<Vec<String>>,
121}
122
123#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
124#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
125#[serde(deny_unknown_fields)]
126pub struct Queue {
127    pub num: Option<Expression>,
128    #[serde(with = "serde_with::As::<Option<serde_with::OneOrMany<serde_with::Same>>>")]
129    pub flags: Option<Vec<String>>,
130}
131
132#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
133#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
134#[serde(deny_unknown_fields, untagged)]
135pub enum Quota {
136    Named(Box<Expression>),
137    Anonymous { val: isize, val_unit: Option<String>, used: Option<isize>, used_unit: Option<isize>, inv: Option<bool> },
138}
139
140#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
141#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
142#[serde(deny_unknown_fields)]
143pub struct Reject {
144    #[serde(rename = "type")]
145    pub r#type: Option<String>,
146    pub expr: Option<String>,
147}
148
149#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
150#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
151#[serde(deny_unknown_fields)]
152pub struct Set {
153    pub op: String,
154    pub set: String,
155    pub elem: Box<Expression>,
156    pub stmt: Option<Vec<Statement>>,
157}
158
159#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
160#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
161#[serde(deny_unknown_fields)]
162pub struct Synproxy {
163    pub mss: Option<isize>,
164    pub wscale: Option<isize>,
165    #[serde(with = "serde_with::As::<Option<serde_with::OneOrMany<serde_with::Same>>>")]
166    pub flags: Option<Vec<String>>,
167}
168
169#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
170#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
171#[serde(deny_unknown_fields)]
172pub struct Tproxy {
173    pub addr: Option<String>,
174    pub family: Option<String>,
175    pub port: Option<isize>,
176}
177
178#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
179#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
180#[serde(deny_unknown_fields)]
181pub struct Vmap {
182    pub key: Box<Expression>,
183    pub data: Box<Expression>,
184}
185
186/// Represents a rule instruction
187#[serde_with::apply(Option => #[serde(default, skip_serializing_if = "Option::is_none")])]
188#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
189#[serde(deny_unknown_fields, rename_all = "kebab-case")]
190#[non_exhaustive]
191pub enum Statement {
192    Accept(()),
193    Drop(()),
194    Continue(()),
195    Jump {
196        target: String,
197    },
198    Goto {
199        target: String,
200    },
201    Return(()),
202    Match(Match),
203    Counter(Option<Counter>),
204    Mangle(Mangle),
205    Quota(Quota),
206    Limit(Limit),
207    Flow(Flow),
208    Fwd(Fwd),
209    Notrack(Option<()>),
210    Dup(Dup),
211    Snat(Nat),
212    Dnat(Nat),
213    Masquerade(Option<Nat>),
214    Redirect(Option<Nat>),
215    Reject(Option<Reject>),
216    Set(Set),
217    Log(Option<Log>),
218    #[serde(rename = "ct helper")]
219    CtHelper(Box<Expression>),
220    #[serde(rename = "ct timeout")]
221    CtTimeout(Box<Expression>),
222    #[serde(rename = "ct expectation")]
223    CtExpectation(Box<Expression>),
224    Meter(Meter),
225    Queue(Option<Queue>),
226    #[serde(rename = "ct count")]
227    CtCount(CtCount),
228    Tproxy(Tproxy),
229    Synproxy(Option<Synproxy>),
230    Reset {
231        #[serde(rename = "tcp option")]
232        tcp_option: Box<TcpOption>,
233    },
234    Secmark(Box<Expression>),
235    Vmap(Vmap),
236    Xt(Option<String>),
237}