1use 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#[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}