1#![doc = "Netfilter nftables configuration over netlink.\n"]
2#![allow(clippy::all)]
3#![allow(unused_imports)]
4#![allow(unused_assignments)]
5#![allow(non_snake_case)]
6#![allow(unused_variables)]
7#![allow(irrefutable_let_patterns)]
8#![allow(unreachable_code)]
9#![allow(unreachable_patterns)]
10use crate::builtin::{BuiltinBitfield32, BuiltinNfgenmsg, Nlmsghdr, PushDummy};
11use crate::{
12 consts,
13 traits::{NetlinkRequest, Protocol},
14 utils::*,
15};
16pub const PROTONAME: &str = "nftables";
17pub const PROTONAME_CSTR: &CStr = c"nftables";
18pub const PROTONUM: u16 = 12u16;
19#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
20#[derive(Debug, Clone, Copy)]
21pub enum MetaKeys {
22 Len = 0,
23 Protocol = 1,
24 Priority = 2,
25 Mark = 3,
26 Iif = 4,
27 Oif = 5,
28 Iifname = 6,
29 Oifname = 7,
30 Iftype = 8,
31 Oiftype = 9,
32 Skuid = 10,
33 Skgid = 11,
34 Nftrace = 12,
35 Rtclassid = 13,
36 Secmark = 14,
37 Nfproto = 15,
38 L4Proto = 16,
39 BriIifname = 17,
40 BriOifname = 18,
41 Pkttype = 19,
42 Cpu = 20,
43 Iifgroup = 21,
44 Oifgroup = 22,
45 Cgroup = 23,
46 Prandom = 24,
47 Secpath = 25,
48 Iifkind = 26,
49 Oifkind = 27,
50 BriIifpvid = 28,
51 BriIifvproto = 29,
52 TimeNs = 30,
53 TimeDay = 31,
54 TimeHour = 32,
55 Sdif = 33,
56 Sdifname = 34,
57 BriBroute = 35,
58}
59impl MetaKeys {
60 pub fn from_value(value: u64) -> Option<Self> {
61 Some(match value {
62 0 => Self::Len,
63 1 => Self::Protocol,
64 2 => Self::Priority,
65 3 => Self::Mark,
66 4 => Self::Iif,
67 5 => Self::Oif,
68 6 => Self::Iifname,
69 7 => Self::Oifname,
70 8 => Self::Iftype,
71 9 => Self::Oiftype,
72 10 => Self::Skuid,
73 11 => Self::Skgid,
74 12 => Self::Nftrace,
75 13 => Self::Rtclassid,
76 14 => Self::Secmark,
77 15 => Self::Nfproto,
78 16 => Self::L4Proto,
79 17 => Self::BriIifname,
80 18 => Self::BriOifname,
81 19 => Self::Pkttype,
82 20 => Self::Cpu,
83 21 => Self::Iifgroup,
84 22 => Self::Oifgroup,
85 23 => Self::Cgroup,
86 24 => Self::Prandom,
87 25 => Self::Secpath,
88 26 => Self::Iifkind,
89 27 => Self::Oifkind,
90 28 => Self::BriIifpvid,
91 29 => Self::BriIifvproto,
92 30 => Self::TimeNs,
93 31 => Self::TimeDay,
94 32 => Self::TimeHour,
95 33 => Self::Sdif,
96 34 => Self::Sdifname,
97 35 => Self::BriBroute,
98 _ => return None,
99 })
100 }
101}
102#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
103#[derive(Debug, Clone, Copy)]
104pub enum BitwiseOps {
105 #[doc = "mask-and-xor operation used to implement NOT, AND, OR and XOR boolean\noperations\n"]
106 MaskXor = 0,
107 Lshift = 1,
108 Rshift = 2,
109 And = 3,
110 Or = 4,
111 Xor = 5,
112}
113impl BitwiseOps {
114 pub fn from_value(value: u64) -> Option<Self> {
115 Some(match value {
116 0 => Self::MaskXor,
117 1 => Self::Lshift,
118 2 => Self::Rshift,
119 3 => Self::And,
120 4 => Self::Or,
121 5 => Self::Xor,
122 _ => return None,
123 })
124 }
125}
126#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
127#[derive(Debug, Clone, Copy)]
128pub enum CmpOps {
129 Eq = 0,
130 Neq = 1,
131 Lt = 2,
132 Lte = 3,
133 Gt = 4,
134 Gte = 5,
135}
136impl CmpOps {
137 pub fn from_value(value: u64) -> Option<Self> {
138 Some(match value {
139 0 => Self::Eq,
140 1 => Self::Neq,
141 2 => Self::Lt,
142 3 => Self::Lte,
143 4 => Self::Gt,
144 5 => Self::Gte,
145 _ => return None,
146 })
147 }
148}
149#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
150#[derive(Debug, Clone, Copy)]
151pub enum ObjectType {
152 Unspec = 0,
153 Counter = 1,
154 Quota = 2,
155 CtHelper = 3,
156 Limit = 4,
157 Connlimit = 5,
158 Tunnel = 6,
159 CtTimeout = 7,
160 Secmark = 8,
161 CtExpect = 9,
162 Synproxy = 10,
163}
164impl ObjectType {
165 pub fn from_value(value: u64) -> Option<Self> {
166 Some(match value {
167 0 => Self::Unspec,
168 1 => Self::Counter,
169 2 => Self::Quota,
170 3 => Self::CtHelper,
171 4 => Self::Limit,
172 5 => Self::Connlimit,
173 6 => Self::Tunnel,
174 7 => Self::CtTimeout,
175 8 => Self::Secmark,
176 9 => Self::CtExpect,
177 10 => Self::Synproxy,
178 _ => return None,
179 })
180 }
181}
182#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
183#[derive(Debug, Clone, Copy)]
184pub enum NatRangeFlags {
185 MapIps = 1 << 0,
186 ProtoSpecified = 1 << 1,
187 ProtoRandom = 1 << 2,
188 Persistent = 1 << 3,
189 ProtoRandomFully = 1 << 4,
190 ProtoOffset = 1 << 5,
191 Netmap = 1 << 6,
192}
193impl NatRangeFlags {
194 pub fn from_value(value: u64) -> Option<Self> {
195 Some(match value {
196 n if n == 1 << 0 => Self::MapIps,
197 n if n == 1 << 1 => Self::ProtoSpecified,
198 n if n == 1 << 2 => Self::ProtoRandom,
199 n if n == 1 << 3 => Self::Persistent,
200 n if n == 1 << 4 => Self::ProtoRandomFully,
201 n if n == 1 << 5 => Self::ProtoOffset,
202 n if n == 1 << 6 => Self::Netmap,
203 _ => return None,
204 })
205 }
206}
207#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
208#[derive(Debug, Clone, Copy)]
209pub enum TableFlags {
210 Dormant = 1 << 0,
211 Owner = 1 << 1,
212 Persist = 1 << 2,
213}
214impl TableFlags {
215 pub fn from_value(value: u64) -> Option<Self> {
216 Some(match value {
217 n if n == 1 << 0 => Self::Dormant,
218 n if n == 1 << 1 => Self::Owner,
219 n if n == 1 << 2 => Self::Persist,
220 _ => return None,
221 })
222 }
223}
224#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
225#[derive(Debug, Clone, Copy)]
226pub enum ChainFlags {
227 Base = 1 << 0,
228 HwOffload = 1 << 1,
229 Binding = 1 << 2,
230}
231impl ChainFlags {
232 pub fn from_value(value: u64) -> Option<Self> {
233 Some(match value {
234 n if n == 1 << 0 => Self::Base,
235 n if n == 1 << 1 => Self::HwOffload,
236 n if n == 1 << 2 => Self::Binding,
237 _ => return None,
238 })
239 }
240}
241#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
242#[derive(Debug, Clone, Copy)]
243pub enum SetFlags {
244 Anonymous = 1 << 0,
245 Constant = 1 << 1,
246 Interval = 1 << 2,
247 Map = 1 << 3,
248 Timeout = 1 << 4,
249 Eval = 1 << 5,
250 Object = 1 << 6,
251 Concat = 1 << 7,
252 Expr = 1 << 8,
253}
254impl SetFlags {
255 pub fn from_value(value: u64) -> Option<Self> {
256 Some(match value {
257 n if n == 1 << 0 => Self::Anonymous,
258 n if n == 1 << 1 => Self::Constant,
259 n if n == 1 << 2 => Self::Interval,
260 n if n == 1 << 3 => Self::Map,
261 n if n == 1 << 4 => Self::Timeout,
262 n if n == 1 << 5 => Self::Eval,
263 n if n == 1 << 6 => Self::Object,
264 n if n == 1 << 7 => Self::Concat,
265 n if n == 1 << 8 => Self::Expr,
266 _ => return None,
267 })
268 }
269}
270#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
271#[derive(Debug, Clone, Copy)]
272pub enum SetElemFlags {
273 IntervalEnd = 1 << 0,
274 Catchall = 1 << 1,
275}
276impl SetElemFlags {
277 pub fn from_value(value: u64) -> Option<Self> {
278 Some(match value {
279 n if n == 1 << 0 => Self::IntervalEnd,
280 n if n == 1 << 1 => Self::Catchall,
281 _ => return None,
282 })
283 }
284}
285#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
286#[derive(Debug, Clone, Copy)]
287pub enum LookupFlags {
288 Invert = 1 << 0,
289}
290impl LookupFlags {
291 pub fn from_value(value: u64) -> Option<Self> {
292 Some(match value {
293 n if n == 1 << 0 => Self::Invert,
294 _ => return None,
295 })
296 }
297}
298#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
299#[derive(Debug, Clone, Copy)]
300pub enum CtKeys {
301 State = 0,
302 Direction = 1,
303 Status = 2,
304 Mark = 3,
305 Secmark = 4,
306 Expiration = 5,
307 Helper = 6,
308 L3protocol = 7,
309 Src = 8,
310 Dst = 9,
311 Protocol = 10,
312 ProtoSrc = 11,
313 ProtoDst = 12,
314 Labels = 13,
315 Pkts = 14,
316 Bytes = 15,
317 Avgpkt = 16,
318 Zone = 17,
319 Eventmask = 18,
320 SrcIp = 19,
321 DstIp = 20,
322 SrcIp6 = 21,
323 DstIp6 = 22,
324 CtId = 23,
325}
326impl CtKeys {
327 pub fn from_value(value: u64) -> Option<Self> {
328 Some(match value {
329 0 => Self::State,
330 1 => Self::Direction,
331 2 => Self::Status,
332 3 => Self::Mark,
333 4 => Self::Secmark,
334 5 => Self::Expiration,
335 6 => Self::Helper,
336 7 => Self::L3protocol,
337 8 => Self::Src,
338 9 => Self::Dst,
339 10 => Self::Protocol,
340 11 => Self::ProtoSrc,
341 12 => Self::ProtoDst,
342 13 => Self::Labels,
343 14 => Self::Pkts,
344 15 => Self::Bytes,
345 16 => Self::Avgpkt,
346 17 => Self::Zone,
347 18 => Self::Eventmask,
348 19 => Self::SrcIp,
349 20 => Self::DstIp,
350 21 => Self::SrcIp6,
351 22 => Self::DstIp6,
352 23 => Self::CtId,
353 _ => return None,
354 })
355 }
356}
357#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
358#[derive(Debug, Clone, Copy)]
359pub enum CtDirection {
360 Original = 0,
361 Reply = 1,
362}
363impl CtDirection {
364 pub fn from_value(value: u64) -> Option<Self> {
365 Some(match value {
366 0 => Self::Original,
367 1 => Self::Reply,
368 _ => return None,
369 })
370 }
371}
372#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
373#[derive(Debug, Clone, Copy)]
374pub enum QuotaFlags {
375 Invert = 1 << 0,
376 Depleted = 1 << 1,
377}
378impl QuotaFlags {
379 pub fn from_value(value: u64) -> Option<Self> {
380 Some(match value {
381 n if n == 1 << 0 => Self::Invert,
382 n if n == 1 << 1 => Self::Depleted,
383 _ => return None,
384 })
385 }
386}
387#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
388#[derive(Debug, Clone, Copy)]
389pub enum VerdictCode {
390 Continue = 4294967295,
391 Break = 4294967294,
392 Jump = 4294967293,
393 Goto = 4294967292,
394 Return = 4294967291,
395 Drop = 0,
396 Accept = 1,
397 Stolen = 2,
398 Queue = 3,
399 Repeat = 4,
400}
401impl VerdictCode {
402 pub fn from_value(value: u64) -> Option<Self> {
403 Some(match value {
404 4294967295 => Self::Continue,
405 4294967294 => Self::Break,
406 4294967293 => Self::Jump,
407 4294967292 => Self::Goto,
408 4294967291 => Self::Return,
409 0 => Self::Drop,
410 1 => Self::Accept,
411 2 => Self::Stolen,
412 3 => Self::Queue,
413 4 => Self::Repeat,
414 _ => return None,
415 })
416 }
417}
418#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
419#[derive(Debug, Clone, Copy)]
420pub enum FibResult {
421 Oif = 0,
422 Oifname = 1,
423 Addrtype = 2,
424}
425impl FibResult {
426 pub fn from_value(value: u64) -> Option<Self> {
427 Some(match value {
428 0 => Self::Oif,
429 1 => Self::Oifname,
430 2 => Self::Addrtype,
431 _ => return None,
432 })
433 }
434}
435#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
436#[derive(Debug, Clone, Copy)]
437pub enum FibFlags {
438 Saddr = 1 << 0,
439 Daddr = 1 << 1,
440 Mark = 1 << 2,
441 Iif = 1 << 3,
442 Oif = 1 << 4,
443 Present = 1 << 5,
444}
445impl FibFlags {
446 pub fn from_value(value: u64) -> Option<Self> {
447 Some(match value {
448 n if n == 1 << 0 => Self::Saddr,
449 n if n == 1 << 1 => Self::Daddr,
450 n if n == 1 << 2 => Self::Mark,
451 n if n == 1 << 3 => Self::Iif,
452 n if n == 1 << 4 => Self::Oif,
453 n if n == 1 << 5 => Self::Present,
454 _ => return None,
455 })
456 }
457}
458#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
459#[derive(Debug, Clone, Copy)]
460pub enum RejectTypes {
461 IcmpUnreach = 0,
462 TcpRst = 1,
463 IcmpxUnreach = 2,
464}
465impl RejectTypes {
466 pub fn from_value(value: u64) -> Option<Self> {
467 Some(match value {
468 0 => Self::IcmpUnreach,
469 1 => Self::TcpRst,
470 2 => Self::IcmpxUnreach,
471 _ => return None,
472 })
473 }
474}
475#[doc = "These codes are mapped to real ICMP and ICMPv6 codes.\n"]
476#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
477#[derive(Debug, Clone, Copy)]
478pub enum RejectInetCode {
479 IcmpxNoRoute = 0,
480 IcmpxPortUnreach = 1,
481 IcmpxHostUnreach = 2,
482 IcmpxAdminProhibited = 3,
483}
484impl RejectInetCode {
485 pub fn from_value(value: u64) -> Option<Self> {
486 Some(match value {
487 0 => Self::IcmpxNoRoute,
488 1 => Self::IcmpxPortUnreach,
489 2 => Self::IcmpxHostUnreach,
490 3 => Self::IcmpxAdminProhibited,
491 _ => return None,
492 })
493 }
494}
495#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
496#[derive(Debug, Clone, Copy)]
497pub enum PayloadBase {
498 LinkLayerHeader = 0,
499 NetworkHeader = 1,
500 TransportHeader = 2,
501 InnerHeader = 3,
502 TunHeader = 4,
503}
504impl PayloadBase {
505 pub fn from_value(value: u64) -> Option<Self> {
506 Some(match value {
507 0 => Self::LinkLayerHeader,
508 1 => Self::NetworkHeader,
509 2 => Self::TransportHeader,
510 3 => Self::InnerHeader,
511 4 => Self::TunHeader,
512 _ => return None,
513 })
514 }
515}
516#[doc = "Range operator\n"]
517#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
518#[derive(Debug, Clone, Copy)]
519pub enum RangeOps {
520 Eq = 0,
521 Neq = 1,
522}
523impl RangeOps {
524 pub fn from_value(value: u64) -> Option<Self> {
525 Some(match value {
526 0 => Self::Eq,
527 1 => Self::Neq,
528 _ => return None,
529 })
530 }
531}
532#[doc = "nf_tables registers. nf_tables used to have five registers: a verdict\nregister and four data registers of size 16. The data registers have\nbeen changed to 16 registers of size 4. For compatibility reasons, the\n[NFT_REG]()\\[1-4\\] registers still map to areas of size 16, the 4 byte\nregisters are addressed using NFT_REG32_00 - NFT_REG32_15.\n"]
533#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
534#[derive(Debug, Clone, Copy)]
535pub enum Registers {
536 RegVerdict = 0,
537 Reg1 = 1,
538 Reg2 = 2,
539 Reg3 = 3,
540 Reg4 = 4,
541 Reg3200 = 8,
542 Reg3201 = 9,
543 Reg3202 = 10,
544 Reg3203 = 11,
545 Reg3204 = 12,
546 Reg3205 = 13,
547 Reg3206 = 14,
548 Reg3207 = 15,
549 Reg3208 = 16,
550 Reg3209 = 17,
551 Reg3210 = 18,
552 Reg3211 = 19,
553 Reg3212 = 20,
554 Reg3213 = 21,
555 Reg3214 = 22,
556 Reg3215 = 23,
557}
558impl Registers {
559 pub fn from_value(value: u64) -> Option<Self> {
560 Some(match value {
561 0 => Self::RegVerdict,
562 1 => Self::Reg1,
563 2 => Self::Reg2,
564 3 => Self::Reg3,
565 4 => Self::Reg4,
566 8 => Self::Reg3200,
567 9 => Self::Reg3201,
568 10 => Self::Reg3202,
569 11 => Self::Reg3203,
570 12 => Self::Reg3204,
571 13 => Self::Reg3205,
572 14 => Self::Reg3206,
573 15 => Self::Reg3207,
574 16 => Self::Reg3208,
575 17 => Self::Reg3209,
576 18 => Self::Reg3210,
577 19 => Self::Reg3211,
578 20 => Self::Reg3212,
579 21 => Self::Reg3213,
580 22 => Self::Reg3214,
581 23 => Self::Reg3215,
582 _ => return None,
583 })
584 }
585}
586#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
587#[derive(Debug, Clone, Copy)]
588pub enum NumgenTypes {
589 Incremental = 0,
590 Random = 1,
591}
592impl NumgenTypes {
593 pub fn from_value(value: u64) -> Option<Self> {
594 Some(match value {
595 0 => Self::Incremental,
596 1 => Self::Random,
597 _ => return None,
598 })
599 }
600}
601#[doc = "nf_tables log levels\n"]
602#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
603#[derive(Debug, Clone, Copy)]
604pub enum LogLevel {
605 #[doc = "system is unusable\n"]
606 Emerg = 0,
607 #[doc = "action must be taken immediately\n"]
608 Alert = 1,
609 #[doc = "critical conditions\n"]
610 Crit = 2,
611 #[doc = "error conditions\n"]
612 Err = 3,
613 #[doc = "warning conditions\n"]
614 Warning = 4,
615 #[doc = "normal but significant condition\n"]
616 Notice = 5,
617 #[doc = "informational\n"]
618 Info = 6,
619 #[doc = "debug-level messages\n"]
620 Debug = 7,
621 #[doc = "enabling audit logging\n"]
622 Audit = 8,
623}
624impl LogLevel {
625 pub fn from_value(value: u64) -> Option<Self> {
626 Some(match value {
627 0 => Self::Emerg,
628 1 => Self::Alert,
629 2 => Self::Crit,
630 3 => Self::Err,
631 4 => Self::Warning,
632 5 => Self::Notice,
633 6 => Self::Info,
634 7 => Self::Debug,
635 8 => Self::Audit,
636 _ => return None,
637 })
638 }
639}
640#[doc = "nf_tables log flags\n"]
641#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
642#[derive(Debug, Clone, Copy)]
643pub enum LogFlags {
644 #[doc = "Log TCP sequence numbers\n"]
645 Tcpseq = 1 << 0,
646 #[doc = "Log TCP options\n"]
647 Tcpopt = 1 << 1,
648 #[doc = "Log IP options\n"]
649 Ipopt = 1 << 2,
650 #[doc = "Log UID owning local socket\n"]
651 Uid = 1 << 3,
652 #[doc = "Unsupported, don\\'t reuse\n"]
653 Nflog = 1 << 4,
654 #[doc = "Decode MAC header\n"]
655 Macdecode = 1 << 5,
656}
657impl LogFlags {
658 pub fn from_value(value: u64) -> Option<Self> {
659 Some(match value {
660 n if n == 1 << 0 => Self::Tcpseq,
661 n if n == 1 << 1 => Self::Tcpopt,
662 n if n == 1 << 2 => Self::Ipopt,
663 n if n == 1 << 3 => Self::Uid,
664 n if n == 1 << 4 => Self::Nflog,
665 n if n == 1 << 5 => Self::Macdecode,
666 _ => return None,
667 })
668 }
669}
670#[repr(C, packed(4))]
671pub struct Nfgenmsg {
672 pub nfgen_family: u8,
673 pub version: u8,
674 pub _res_id_be: u16,
675}
676impl Clone for Nfgenmsg {
677 fn clone(&self) -> Self {
678 Self::new_from_array(*self.as_array())
679 }
680}
681#[doc = "Create zero-initialized struct"]
682impl Default for Nfgenmsg {
683 fn default() -> Self {
684 Self::new()
685 }
686}
687impl Nfgenmsg {
688 #[doc = "Create zero-initialized struct"]
689 pub fn new() -> Self {
690 Self::new_from_array([0u8; Self::len()])
691 }
692 #[doc = "Copy from contents from slice"]
693 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
694 if other.len() != Self::len() {
695 return None;
696 }
697 let mut buf = [0u8; Self::len()];
698 buf.clone_from_slice(other);
699 Some(Self::new_from_array(buf))
700 }
701 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
702 pub fn new_from_zeroed(other: &[u8]) -> Self {
703 let mut buf = [0u8; Self::len()];
704 let len = buf.len().min(other.len());
705 buf[..len].clone_from_slice(&other[..len]);
706 Self::new_from_array(buf)
707 }
708 pub fn new_from_array(buf: [u8; 4usize]) -> Self {
709 unsafe { std::mem::transmute(buf) }
710 }
711 pub fn as_slice(&self) -> &[u8] {
712 unsafe {
713 let ptr: *const u8 = std::mem::transmute(self as *const Self);
714 std::slice::from_raw_parts(ptr, Self::len())
715 }
716 }
717 pub fn from_slice(buf: &[u8]) -> &Self {
718 assert!(buf.len() >= Self::len());
719 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
720 unsafe { std::mem::transmute(buf.as_ptr()) }
721 }
722 pub fn as_array(&self) -> &[u8; 4usize] {
723 unsafe { std::mem::transmute(self) }
724 }
725 pub fn from_array(buf: &[u8; 4usize]) -> &Self {
726 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
727 unsafe { std::mem::transmute(buf) }
728 }
729 pub fn into_array(self) -> [u8; 4usize] {
730 unsafe { std::mem::transmute(self) }
731 }
732 pub const fn len() -> usize {
733 const _: () = assert!(std::mem::size_of::<Nfgenmsg>() == 4usize);
734 4usize
735 }
736 pub fn res_id(&self) -> u16 {
737 u16::from_be(self._res_id_be)
738 }
739 pub fn set_res_id(&mut self, value: u16) {
740 self._res_id_be = value.to_be();
741 }
742}
743impl std::fmt::Debug for Nfgenmsg {
744 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
745 fmt.debug_struct("Nfgenmsg")
746 .field("nfgen_family", &self.nfgen_family)
747 .field("version", &self.version)
748 .field("res_id", &self.res_id())
749 .finish()
750 }
751}
752#[repr(C, packed(4))]
753pub struct NatRange2 {
754 pub flags: u32,
755 pub min_addr: [u8; 16usize],
756 pub max_addr: [u8; 16usize],
757 pub _min_port_be: u16,
758 pub _max_port_be: u16,
759 pub _base_port_be: u16,
760 pub _pad_42: [u8; 2usize],
761}
762impl Clone for NatRange2 {
763 fn clone(&self) -> Self {
764 Self::new_from_array(*self.as_array())
765 }
766}
767#[doc = "Create zero-initialized struct"]
768impl Default for NatRange2 {
769 fn default() -> Self {
770 Self::new()
771 }
772}
773impl NatRange2 {
774 #[doc = "Create zero-initialized struct"]
775 pub fn new() -> Self {
776 Self::new_from_array([0u8; Self::len()])
777 }
778 #[doc = "Copy from contents from slice"]
779 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
780 if other.len() != Self::len() {
781 return None;
782 }
783 let mut buf = [0u8; Self::len()];
784 buf.clone_from_slice(other);
785 Some(Self::new_from_array(buf))
786 }
787 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
788 pub fn new_from_zeroed(other: &[u8]) -> Self {
789 let mut buf = [0u8; Self::len()];
790 let len = buf.len().min(other.len());
791 buf[..len].clone_from_slice(&other[..len]);
792 Self::new_from_array(buf)
793 }
794 pub fn new_from_array(buf: [u8; 44usize]) -> Self {
795 unsafe { std::mem::transmute(buf) }
796 }
797 pub fn as_slice(&self) -> &[u8] {
798 unsafe {
799 let ptr: *const u8 = std::mem::transmute(self as *const Self);
800 std::slice::from_raw_parts(ptr, Self::len())
801 }
802 }
803 pub fn from_slice(buf: &[u8]) -> &Self {
804 assert!(buf.len() >= Self::len());
805 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
806 unsafe { std::mem::transmute(buf.as_ptr()) }
807 }
808 pub fn as_array(&self) -> &[u8; 44usize] {
809 unsafe { std::mem::transmute(self) }
810 }
811 pub fn from_array(buf: &[u8; 44usize]) -> &Self {
812 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
813 unsafe { std::mem::transmute(buf) }
814 }
815 pub fn into_array(self) -> [u8; 44usize] {
816 unsafe { std::mem::transmute(self) }
817 }
818 pub const fn len() -> usize {
819 const _: () = assert!(std::mem::size_of::<NatRange2>() == 44usize);
820 44usize
821 }
822 pub fn min_port(&self) -> u16 {
823 u16::from_be(self._min_port_be)
824 }
825 pub fn set_min_port(&mut self, value: u16) {
826 self._min_port_be = value.to_be();
827 }
828 pub fn max_port(&self) -> u16 {
829 u16::from_be(self._max_port_be)
830 }
831 pub fn set_max_port(&mut self, value: u16) {
832 self._max_port_be = value.to_be();
833 }
834 pub fn base_port(&self) -> u16 {
835 u16::from_be(self._base_port_be)
836 }
837 pub fn set_base_port(&mut self, value: u16) {
838 self._base_port_be = value.to_be();
839 }
840}
841impl std::fmt::Debug for NatRange2 {
842 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
843 fmt.debug_struct("NatRange2")
844 .field("flags", &self.flags)
845 .field("min_addr", &self.min_addr)
846 .field("max_addr", &self.max_addr)
847 .field("min_port", &self.min_port())
848 .field("max_port", &self.max_port())
849 .field("base_port", &self.base_port())
850 .finish()
851 }
852}
853#[repr(C, packed(4))]
854pub struct NatIpv4MultiRange {
855 #[doc = "Always set to 1. Multiple ranges no longer supported.\n"]
856 pub range_size: u32,
857 pub range: NatIpv4Range,
858}
859impl Clone for NatIpv4MultiRange {
860 fn clone(&self) -> Self {
861 Self::new_from_array(*self.as_array())
862 }
863}
864#[doc = "Create zero-initialized struct"]
865impl Default for NatIpv4MultiRange {
866 fn default() -> Self {
867 Self::new()
868 }
869}
870impl NatIpv4MultiRange {
871 #[doc = "Create zero-initialized struct"]
872 pub fn new() -> Self {
873 Self::new_from_array([0u8; Self::len()])
874 }
875 #[doc = "Copy from contents from slice"]
876 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
877 if other.len() != Self::len() {
878 return None;
879 }
880 let mut buf = [0u8; Self::len()];
881 buf.clone_from_slice(other);
882 Some(Self::new_from_array(buf))
883 }
884 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
885 pub fn new_from_zeroed(other: &[u8]) -> Self {
886 let mut buf = [0u8; Self::len()];
887 let len = buf.len().min(other.len());
888 buf[..len].clone_from_slice(&other[..len]);
889 Self::new_from_array(buf)
890 }
891 pub fn new_from_array(buf: [u8; 20usize]) -> Self {
892 unsafe { std::mem::transmute(buf) }
893 }
894 pub fn as_slice(&self) -> &[u8] {
895 unsafe {
896 let ptr: *const u8 = std::mem::transmute(self as *const Self);
897 std::slice::from_raw_parts(ptr, Self::len())
898 }
899 }
900 pub fn from_slice(buf: &[u8]) -> &Self {
901 assert!(buf.len() >= Self::len());
902 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
903 unsafe { std::mem::transmute(buf.as_ptr()) }
904 }
905 pub fn as_array(&self) -> &[u8; 20usize] {
906 unsafe { std::mem::transmute(self) }
907 }
908 pub fn from_array(buf: &[u8; 20usize]) -> &Self {
909 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
910 unsafe { std::mem::transmute(buf) }
911 }
912 pub fn into_array(self) -> [u8; 20usize] {
913 unsafe { std::mem::transmute(self) }
914 }
915 pub const fn len() -> usize {
916 const _: () = assert!(std::mem::size_of::<NatIpv4MultiRange>() == 20usize);
917 20usize
918 }
919}
920impl std::fmt::Debug for NatIpv4MultiRange {
921 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
922 fmt.debug_struct("NatIpv4MultiRange")
923 .field("range_size", &self.range_size)
924 .field("range", &self.range)
925 .finish()
926 }
927}
928#[repr(C, packed(4))]
929pub struct NatIpv4Range {
930 #[doc = "Associated type: [`NatRangeFlags`] (enum)"]
931 pub flags: u32,
932 pub _min_ip_be: u32,
933 pub _max_ip_be: u32,
934 pub _min_port_be: u16,
935 pub _max_port_be: u16,
936}
937impl Clone for NatIpv4Range {
938 fn clone(&self) -> Self {
939 Self::new_from_array(*self.as_array())
940 }
941}
942#[doc = "Create zero-initialized struct"]
943impl Default for NatIpv4Range {
944 fn default() -> Self {
945 Self::new()
946 }
947}
948impl NatIpv4Range {
949 #[doc = "Create zero-initialized struct"]
950 pub fn new() -> Self {
951 Self::new_from_array([0u8; Self::len()])
952 }
953 #[doc = "Copy from contents from slice"]
954 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
955 if other.len() != Self::len() {
956 return None;
957 }
958 let mut buf = [0u8; Self::len()];
959 buf.clone_from_slice(other);
960 Some(Self::new_from_array(buf))
961 }
962 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
963 pub fn new_from_zeroed(other: &[u8]) -> Self {
964 let mut buf = [0u8; Self::len()];
965 let len = buf.len().min(other.len());
966 buf[..len].clone_from_slice(&other[..len]);
967 Self::new_from_array(buf)
968 }
969 pub fn new_from_array(buf: [u8; 16usize]) -> Self {
970 unsafe { std::mem::transmute(buf) }
971 }
972 pub fn as_slice(&self) -> &[u8] {
973 unsafe {
974 let ptr: *const u8 = std::mem::transmute(self as *const Self);
975 std::slice::from_raw_parts(ptr, Self::len())
976 }
977 }
978 pub fn from_slice(buf: &[u8]) -> &Self {
979 assert!(buf.len() >= Self::len());
980 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
981 unsafe { std::mem::transmute(buf.as_ptr()) }
982 }
983 pub fn as_array(&self) -> &[u8; 16usize] {
984 unsafe { std::mem::transmute(self) }
985 }
986 pub fn from_array(buf: &[u8; 16usize]) -> &Self {
987 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
988 unsafe { std::mem::transmute(buf) }
989 }
990 pub fn into_array(self) -> [u8; 16usize] {
991 unsafe { std::mem::transmute(self) }
992 }
993 pub const fn len() -> usize {
994 const _: () = assert!(std::mem::size_of::<NatIpv4Range>() == 16usize);
995 16usize
996 }
997 pub fn min_ip(&self) -> u32 {
998 u32::from_be(self._min_ip_be)
999 }
1000 pub fn set_min_ip(&mut self, value: u32) {
1001 self._min_ip_be = value.to_be();
1002 }
1003 pub fn max_ip(&self) -> u32 {
1004 u32::from_be(self._max_ip_be)
1005 }
1006 pub fn set_max_ip(&mut self, value: u32) {
1007 self._max_ip_be = value.to_be();
1008 }
1009 pub fn min_port(&self) -> u16 {
1010 u16::from_be(self._min_port_be)
1011 }
1012 pub fn set_min_port(&mut self, value: u16) {
1013 self._min_port_be = value.to_be();
1014 }
1015 pub fn max_port(&self) -> u16 {
1016 u16::from_be(self._max_port_be)
1017 }
1018 pub fn set_max_port(&mut self, value: u16) {
1019 self._max_port_be = value.to_be();
1020 }
1021}
1022impl std::fmt::Debug for NatIpv4Range {
1023 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1024 fmt.debug_struct("NatIpv4Range")
1025 .field(
1026 "flags",
1027 &FormatFlags(self.flags.into(), NatRangeFlags::from_value),
1028 )
1029 .field("min_ip", &self.min_ip())
1030 .field("max_ip", &self.max_ip())
1031 .field("min_port", &self.min_port())
1032 .field("max_port", &self.max_port())
1033 .finish()
1034 }
1035}
1036#[repr(C, packed(4))]
1037pub struct NatRange {
1038 pub flags: u32,
1039 pub min_addr: [u8; 16usize],
1040 pub max_addr: [u8; 16usize],
1041 pub _min_port_be: u16,
1042 pub _max_port_be: u16,
1043}
1044impl Clone for NatRange {
1045 fn clone(&self) -> Self {
1046 Self::new_from_array(*self.as_array())
1047 }
1048}
1049#[doc = "Create zero-initialized struct"]
1050impl Default for NatRange {
1051 fn default() -> Self {
1052 Self::new()
1053 }
1054}
1055impl NatRange {
1056 #[doc = "Create zero-initialized struct"]
1057 pub fn new() -> Self {
1058 Self::new_from_array([0u8; Self::len()])
1059 }
1060 #[doc = "Copy from contents from slice"]
1061 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1062 if other.len() != Self::len() {
1063 return None;
1064 }
1065 let mut buf = [0u8; Self::len()];
1066 buf.clone_from_slice(other);
1067 Some(Self::new_from_array(buf))
1068 }
1069 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1070 pub fn new_from_zeroed(other: &[u8]) -> Self {
1071 let mut buf = [0u8; Self::len()];
1072 let len = buf.len().min(other.len());
1073 buf[..len].clone_from_slice(&other[..len]);
1074 Self::new_from_array(buf)
1075 }
1076 pub fn new_from_array(buf: [u8; 40usize]) -> Self {
1077 unsafe { std::mem::transmute(buf) }
1078 }
1079 pub fn as_slice(&self) -> &[u8] {
1080 unsafe {
1081 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1082 std::slice::from_raw_parts(ptr, Self::len())
1083 }
1084 }
1085 pub fn from_slice(buf: &[u8]) -> &Self {
1086 assert!(buf.len() >= Self::len());
1087 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1088 unsafe { std::mem::transmute(buf.as_ptr()) }
1089 }
1090 pub fn as_array(&self) -> &[u8; 40usize] {
1091 unsafe { std::mem::transmute(self) }
1092 }
1093 pub fn from_array(buf: &[u8; 40usize]) -> &Self {
1094 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1095 unsafe { std::mem::transmute(buf) }
1096 }
1097 pub fn into_array(self) -> [u8; 40usize] {
1098 unsafe { std::mem::transmute(self) }
1099 }
1100 pub const fn len() -> usize {
1101 const _: () = assert!(std::mem::size_of::<NatRange>() == 40usize);
1102 40usize
1103 }
1104 pub fn min_port(&self) -> u16 {
1105 u16::from_be(self._min_port_be)
1106 }
1107 pub fn set_min_port(&mut self, value: u16) {
1108 self._min_port_be = value.to_be();
1109 }
1110 pub fn max_port(&self) -> u16 {
1111 u16::from_be(self._max_port_be)
1112 }
1113 pub fn set_max_port(&mut self, value: u16) {
1114 self._max_port_be = value.to_be();
1115 }
1116}
1117impl std::fmt::Debug for NatRange {
1118 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1119 fmt.debug_struct("NatRange")
1120 .field("flags", &self.flags)
1121 .field("min_addr", &self.min_addr)
1122 .field("max_addr", &self.max_addr)
1123 .field("min_port", &self.min_port())
1124 .field("max_port", &self.max_port())
1125 .finish()
1126 }
1127}
1128#[derive(Clone)]
1129pub enum LogAttrs<'a> {
1130 #[doc = "netlink group to send messages to\n"]
1131 Group(u16),
1132 #[doc = "prefix to prepend to log messages\n"]
1133 Prefix(&'a CStr),
1134 #[doc = "length of payload to include in netlink message\n"]
1135 Snaplen(u32),
1136 #[doc = "queue threshold\n"]
1137 Qthreshold(u16),
1138 #[doc = "log level\n\nAssociated type: [`LogLevel`] (enum)"]
1139 Level(u32),
1140 #[doc = "logging flags\n\nAssociated type: [`LogFlags`] (enum)"]
1141 Flags(u32),
1142}
1143impl<'a> IterableLogAttrs<'a> {
1144 #[doc = "netlink group to send messages to\n"]
1145 pub fn get_group(&self) -> Result<u16, ErrorContext> {
1146 let mut iter = self.clone();
1147 iter.pos = 0;
1148 for attr in iter {
1149 if let Ok(LogAttrs::Group(val)) = attr {
1150 return Ok(val);
1151 }
1152 }
1153 Err(ErrorContext::new_missing(
1154 "LogAttrs",
1155 "Group",
1156 self.orig_loc,
1157 self.buf.as_ptr() as usize,
1158 ))
1159 }
1160 #[doc = "prefix to prepend to log messages\n"]
1161 pub fn get_prefix(&self) -> Result<&'a CStr, ErrorContext> {
1162 let mut iter = self.clone();
1163 iter.pos = 0;
1164 for attr in iter {
1165 if let Ok(LogAttrs::Prefix(val)) = attr {
1166 return Ok(val);
1167 }
1168 }
1169 Err(ErrorContext::new_missing(
1170 "LogAttrs",
1171 "Prefix",
1172 self.orig_loc,
1173 self.buf.as_ptr() as usize,
1174 ))
1175 }
1176 #[doc = "length of payload to include in netlink message\n"]
1177 pub fn get_snaplen(&self) -> Result<u32, ErrorContext> {
1178 let mut iter = self.clone();
1179 iter.pos = 0;
1180 for attr in iter {
1181 if let Ok(LogAttrs::Snaplen(val)) = attr {
1182 return Ok(val);
1183 }
1184 }
1185 Err(ErrorContext::new_missing(
1186 "LogAttrs",
1187 "Snaplen",
1188 self.orig_loc,
1189 self.buf.as_ptr() as usize,
1190 ))
1191 }
1192 #[doc = "queue threshold\n"]
1193 pub fn get_qthreshold(&self) -> Result<u16, ErrorContext> {
1194 let mut iter = self.clone();
1195 iter.pos = 0;
1196 for attr in iter {
1197 if let Ok(LogAttrs::Qthreshold(val)) = attr {
1198 return Ok(val);
1199 }
1200 }
1201 Err(ErrorContext::new_missing(
1202 "LogAttrs",
1203 "Qthreshold",
1204 self.orig_loc,
1205 self.buf.as_ptr() as usize,
1206 ))
1207 }
1208 #[doc = "log level\n\nAssociated type: [`LogLevel`] (enum)"]
1209 pub fn get_level(&self) -> Result<u32, ErrorContext> {
1210 let mut iter = self.clone();
1211 iter.pos = 0;
1212 for attr in iter {
1213 if let Ok(LogAttrs::Level(val)) = attr {
1214 return Ok(val);
1215 }
1216 }
1217 Err(ErrorContext::new_missing(
1218 "LogAttrs",
1219 "Level",
1220 self.orig_loc,
1221 self.buf.as_ptr() as usize,
1222 ))
1223 }
1224 #[doc = "logging flags\n\nAssociated type: [`LogFlags`] (enum)"]
1225 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
1226 let mut iter = self.clone();
1227 iter.pos = 0;
1228 for attr in iter {
1229 if let Ok(LogAttrs::Flags(val)) = attr {
1230 return Ok(val);
1231 }
1232 }
1233 Err(ErrorContext::new_missing(
1234 "LogAttrs",
1235 "Flags",
1236 self.orig_loc,
1237 self.buf.as_ptr() as usize,
1238 ))
1239 }
1240}
1241impl LogAttrs<'_> {
1242 pub fn new<'a>(buf: &'a [u8]) -> IterableLogAttrs<'a> {
1243 IterableLogAttrs::with_loc(buf, buf.as_ptr() as usize)
1244 }
1245 fn attr_from_type(r#type: u16) -> Option<&'static str> {
1246 let res = match r#type {
1247 1u16 => "Group",
1248 2u16 => "Prefix",
1249 3u16 => "Snaplen",
1250 4u16 => "Qthreshold",
1251 5u16 => "Level",
1252 6u16 => "Flags",
1253 _ => return None,
1254 };
1255 Some(res)
1256 }
1257}
1258#[derive(Clone, Copy, Default)]
1259pub struct IterableLogAttrs<'a> {
1260 buf: &'a [u8],
1261 pos: usize,
1262 orig_loc: usize,
1263}
1264impl<'a> IterableLogAttrs<'a> {
1265 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1266 Self {
1267 buf,
1268 pos: 0,
1269 orig_loc,
1270 }
1271 }
1272 pub fn get_buf(&self) -> &'a [u8] {
1273 self.buf
1274 }
1275}
1276impl<'a> Iterator for IterableLogAttrs<'a> {
1277 type Item = Result<LogAttrs<'a>, ErrorContext>;
1278 fn next(&mut self) -> Option<Self::Item> {
1279 let mut pos;
1280 let mut r#type;
1281 loop {
1282 pos = self.pos;
1283 r#type = None;
1284 if self.buf.len() == self.pos {
1285 return None;
1286 }
1287 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1288 self.pos = self.buf.len();
1289 break;
1290 };
1291 r#type = Some(header.r#type);
1292 let res = match header.r#type {
1293 1u16 => LogAttrs::Group({
1294 let res = parse_be_u16(next);
1295 let Some(val) = res else { break };
1296 val
1297 }),
1298 2u16 => LogAttrs::Prefix({
1299 let res = CStr::from_bytes_with_nul(next).ok();
1300 let Some(val) = res else { break };
1301 val
1302 }),
1303 3u16 => LogAttrs::Snaplen({
1304 let res = parse_be_u32(next);
1305 let Some(val) = res else { break };
1306 val
1307 }),
1308 4u16 => LogAttrs::Qthreshold({
1309 let res = parse_be_u16(next);
1310 let Some(val) = res else { break };
1311 val
1312 }),
1313 5u16 => LogAttrs::Level({
1314 let res = parse_be_u32(next);
1315 let Some(val) = res else { break };
1316 val
1317 }),
1318 6u16 => LogAttrs::Flags({
1319 let res = parse_be_u32(next);
1320 let Some(val) = res else { break };
1321 val
1322 }),
1323 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1324 n => continue,
1325 };
1326 return Some(Ok(res));
1327 }
1328 Some(Err(ErrorContext::new(
1329 "LogAttrs",
1330 r#type.and_then(|t| LogAttrs::attr_from_type(t)),
1331 self.orig_loc,
1332 self.buf.as_ptr().wrapping_add(pos) as usize,
1333 )))
1334 }
1335}
1336impl<'a> std::fmt::Debug for IterableLogAttrs<'_> {
1337 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1338 let mut fmt = f.debug_struct("LogAttrs");
1339 for attr in self.clone() {
1340 let attr = match attr {
1341 Ok(a) => a,
1342 Err(err) => {
1343 fmt.finish()?;
1344 f.write_str("Err(")?;
1345 err.fmt(f)?;
1346 return f.write_str(")");
1347 }
1348 };
1349 match attr {
1350 LogAttrs::Group(val) => fmt.field("Group", &val),
1351 LogAttrs::Prefix(val) => fmt.field("Prefix", &val),
1352 LogAttrs::Snaplen(val) => fmt.field("Snaplen", &val),
1353 LogAttrs::Qthreshold(val) => fmt.field("Qthreshold", &val),
1354 LogAttrs::Level(val) => {
1355 fmt.field("Level", &FormatEnum(val.into(), LogLevel::from_value))
1356 }
1357 LogAttrs::Flags(val) => {
1358 fmt.field("Flags", &FormatFlags(val.into(), LogFlags::from_value))
1359 }
1360 };
1361 }
1362 fmt.finish()
1363 }
1364}
1365impl IterableLogAttrs<'_> {
1366 pub fn lookup_attr(
1367 &self,
1368 offset: usize,
1369 missing_type: Option<u16>,
1370 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1371 let mut stack = Vec::new();
1372 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1373 if missing_type.is_some() && cur == offset {
1374 stack.push(("LogAttrs", offset));
1375 return (
1376 stack,
1377 missing_type.and_then(|t| LogAttrs::attr_from_type(t)),
1378 );
1379 }
1380 if cur > offset || cur + self.buf.len() < offset {
1381 return (stack, None);
1382 }
1383 let mut attrs = self.clone();
1384 let mut last_off = cur + attrs.pos;
1385 while let Some(attr) = attrs.next() {
1386 let Ok(attr) = attr else { break };
1387 match attr {
1388 LogAttrs::Group(val) => {
1389 if last_off == offset {
1390 stack.push(("Group", last_off));
1391 break;
1392 }
1393 }
1394 LogAttrs::Prefix(val) => {
1395 if last_off == offset {
1396 stack.push(("Prefix", last_off));
1397 break;
1398 }
1399 }
1400 LogAttrs::Snaplen(val) => {
1401 if last_off == offset {
1402 stack.push(("Snaplen", last_off));
1403 break;
1404 }
1405 }
1406 LogAttrs::Qthreshold(val) => {
1407 if last_off == offset {
1408 stack.push(("Qthreshold", last_off));
1409 break;
1410 }
1411 }
1412 LogAttrs::Level(val) => {
1413 if last_off == offset {
1414 stack.push(("Level", last_off));
1415 break;
1416 }
1417 }
1418 LogAttrs::Flags(val) => {
1419 if last_off == offset {
1420 stack.push(("Flags", last_off));
1421 break;
1422 }
1423 }
1424 _ => {}
1425 };
1426 last_off = cur + attrs.pos;
1427 }
1428 if !stack.is_empty() {
1429 stack.push(("LogAttrs", cur));
1430 }
1431 (stack, None)
1432 }
1433}
1434#[derive(Clone)]
1435pub enum NumgenAttrs {
1436 #[doc = "destination register\n\nAssociated type: [`Registers`] (enum)"]
1437 Dreg(u32),
1438 #[doc = "maximum counter value\n"]
1439 Modulus(u32),
1440 #[doc = "operation type\n\nAssociated type: [`NumgenTypes`] (enum)"]
1441 Type(u32),
1442 #[doc = "offset to be added to the counter\n"]
1443 Offset(u32),
1444}
1445impl<'a> IterableNumgenAttrs<'a> {
1446 #[doc = "destination register\n\nAssociated type: [`Registers`] (enum)"]
1447 pub fn get_dreg(&self) -> Result<u32, ErrorContext> {
1448 let mut iter = self.clone();
1449 iter.pos = 0;
1450 for attr in iter {
1451 if let Ok(NumgenAttrs::Dreg(val)) = attr {
1452 return Ok(val);
1453 }
1454 }
1455 Err(ErrorContext::new_missing(
1456 "NumgenAttrs",
1457 "Dreg",
1458 self.orig_loc,
1459 self.buf.as_ptr() as usize,
1460 ))
1461 }
1462 #[doc = "maximum counter value\n"]
1463 pub fn get_modulus(&self) -> Result<u32, ErrorContext> {
1464 let mut iter = self.clone();
1465 iter.pos = 0;
1466 for attr in iter {
1467 if let Ok(NumgenAttrs::Modulus(val)) = attr {
1468 return Ok(val);
1469 }
1470 }
1471 Err(ErrorContext::new_missing(
1472 "NumgenAttrs",
1473 "Modulus",
1474 self.orig_loc,
1475 self.buf.as_ptr() as usize,
1476 ))
1477 }
1478 #[doc = "operation type\n\nAssociated type: [`NumgenTypes`] (enum)"]
1479 pub fn get_type(&self) -> Result<u32, ErrorContext> {
1480 let mut iter = self.clone();
1481 iter.pos = 0;
1482 for attr in iter {
1483 if let Ok(NumgenAttrs::Type(val)) = attr {
1484 return Ok(val);
1485 }
1486 }
1487 Err(ErrorContext::new_missing(
1488 "NumgenAttrs",
1489 "Type",
1490 self.orig_loc,
1491 self.buf.as_ptr() as usize,
1492 ))
1493 }
1494 #[doc = "offset to be added to the counter\n"]
1495 pub fn get_offset(&self) -> Result<u32, ErrorContext> {
1496 let mut iter = self.clone();
1497 iter.pos = 0;
1498 for attr in iter {
1499 if let Ok(NumgenAttrs::Offset(val)) = attr {
1500 return Ok(val);
1501 }
1502 }
1503 Err(ErrorContext::new_missing(
1504 "NumgenAttrs",
1505 "Offset",
1506 self.orig_loc,
1507 self.buf.as_ptr() as usize,
1508 ))
1509 }
1510}
1511impl NumgenAttrs {
1512 pub fn new<'a>(buf: &'a [u8]) -> IterableNumgenAttrs<'a> {
1513 IterableNumgenAttrs::with_loc(buf, buf.as_ptr() as usize)
1514 }
1515 fn attr_from_type(r#type: u16) -> Option<&'static str> {
1516 let res = match r#type {
1517 1u16 => "Dreg",
1518 2u16 => "Modulus",
1519 3u16 => "Type",
1520 4u16 => "Offset",
1521 _ => return None,
1522 };
1523 Some(res)
1524 }
1525}
1526#[derive(Clone, Copy, Default)]
1527pub struct IterableNumgenAttrs<'a> {
1528 buf: &'a [u8],
1529 pos: usize,
1530 orig_loc: usize,
1531}
1532impl<'a> IterableNumgenAttrs<'a> {
1533 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1534 Self {
1535 buf,
1536 pos: 0,
1537 orig_loc,
1538 }
1539 }
1540 pub fn get_buf(&self) -> &'a [u8] {
1541 self.buf
1542 }
1543}
1544impl<'a> Iterator for IterableNumgenAttrs<'a> {
1545 type Item = Result<NumgenAttrs, ErrorContext>;
1546 fn next(&mut self) -> Option<Self::Item> {
1547 let mut pos;
1548 let mut r#type;
1549 loop {
1550 pos = self.pos;
1551 r#type = None;
1552 if self.buf.len() == self.pos {
1553 return None;
1554 }
1555 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1556 self.pos = self.buf.len();
1557 break;
1558 };
1559 r#type = Some(header.r#type);
1560 let res = match header.r#type {
1561 1u16 => NumgenAttrs::Dreg({
1562 let res = parse_u32(next);
1563 let Some(val) = res else { break };
1564 val
1565 }),
1566 2u16 => NumgenAttrs::Modulus({
1567 let res = parse_be_u32(next);
1568 let Some(val) = res else { break };
1569 val
1570 }),
1571 3u16 => NumgenAttrs::Type({
1572 let res = parse_be_u32(next);
1573 let Some(val) = res else { break };
1574 val
1575 }),
1576 4u16 => NumgenAttrs::Offset({
1577 let res = parse_be_u32(next);
1578 let Some(val) = res else { break };
1579 val
1580 }),
1581 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1582 n => continue,
1583 };
1584 return Some(Ok(res));
1585 }
1586 Some(Err(ErrorContext::new(
1587 "NumgenAttrs",
1588 r#type.and_then(|t| NumgenAttrs::attr_from_type(t)),
1589 self.orig_loc,
1590 self.buf.as_ptr().wrapping_add(pos) as usize,
1591 )))
1592 }
1593}
1594impl std::fmt::Debug for IterableNumgenAttrs<'_> {
1595 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1596 let mut fmt = f.debug_struct("NumgenAttrs");
1597 for attr in self.clone() {
1598 let attr = match attr {
1599 Ok(a) => a,
1600 Err(err) => {
1601 fmt.finish()?;
1602 f.write_str("Err(")?;
1603 err.fmt(f)?;
1604 return f.write_str(")");
1605 }
1606 };
1607 match attr {
1608 NumgenAttrs::Dreg(val) => {
1609 fmt.field("Dreg", &FormatEnum(val.into(), Registers::from_value))
1610 }
1611 NumgenAttrs::Modulus(val) => fmt.field("Modulus", &val),
1612 NumgenAttrs::Type(val) => {
1613 fmt.field("Type", &FormatEnum(val.into(), NumgenTypes::from_value))
1614 }
1615 NumgenAttrs::Offset(val) => fmt.field("Offset", &val),
1616 };
1617 }
1618 fmt.finish()
1619 }
1620}
1621impl IterableNumgenAttrs<'_> {
1622 pub fn lookup_attr(
1623 &self,
1624 offset: usize,
1625 missing_type: Option<u16>,
1626 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1627 let mut stack = Vec::new();
1628 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1629 if missing_type.is_some() && cur == offset {
1630 stack.push(("NumgenAttrs", offset));
1631 return (
1632 stack,
1633 missing_type.and_then(|t| NumgenAttrs::attr_from_type(t)),
1634 );
1635 }
1636 if cur > offset || cur + self.buf.len() < offset {
1637 return (stack, None);
1638 }
1639 let mut attrs = self.clone();
1640 let mut last_off = cur + attrs.pos;
1641 while let Some(attr) = attrs.next() {
1642 let Ok(attr) = attr else { break };
1643 match attr {
1644 NumgenAttrs::Dreg(val) => {
1645 if last_off == offset {
1646 stack.push(("Dreg", last_off));
1647 break;
1648 }
1649 }
1650 NumgenAttrs::Modulus(val) => {
1651 if last_off == offset {
1652 stack.push(("Modulus", last_off));
1653 break;
1654 }
1655 }
1656 NumgenAttrs::Type(val) => {
1657 if last_off == offset {
1658 stack.push(("Type", last_off));
1659 break;
1660 }
1661 }
1662 NumgenAttrs::Offset(val) => {
1663 if last_off == offset {
1664 stack.push(("Offset", last_off));
1665 break;
1666 }
1667 }
1668 _ => {}
1669 };
1670 last_off = cur + attrs.pos;
1671 }
1672 if !stack.is_empty() {
1673 stack.push(("NumgenAttrs", cur));
1674 }
1675 (stack, None)
1676 }
1677}
1678#[derive(Clone)]
1679pub enum RangeAttrs<'a> {
1680 #[doc = "source register of data to compare\n\nAssociated type: [`Registers`] (enum)"]
1681 Sreg(u32),
1682 #[doc = "cmp operation\n\nAssociated type: [`RangeOps`] (enum)"]
1683 Op(u32),
1684 #[doc = "data range from\n"]
1685 FromData(IterableDataAttrs<'a>),
1686 #[doc = "data range to\n"]
1687 ToData(IterableDataAttrs<'a>),
1688}
1689impl<'a> IterableRangeAttrs<'a> {
1690 #[doc = "source register of data to compare\n\nAssociated type: [`Registers`] (enum)"]
1691 pub fn get_sreg(&self) -> Result<u32, ErrorContext> {
1692 let mut iter = self.clone();
1693 iter.pos = 0;
1694 for attr in iter {
1695 if let Ok(RangeAttrs::Sreg(val)) = attr {
1696 return Ok(val);
1697 }
1698 }
1699 Err(ErrorContext::new_missing(
1700 "RangeAttrs",
1701 "Sreg",
1702 self.orig_loc,
1703 self.buf.as_ptr() as usize,
1704 ))
1705 }
1706 #[doc = "cmp operation\n\nAssociated type: [`RangeOps`] (enum)"]
1707 pub fn get_op(&self) -> Result<u32, ErrorContext> {
1708 let mut iter = self.clone();
1709 iter.pos = 0;
1710 for attr in iter {
1711 if let Ok(RangeAttrs::Op(val)) = attr {
1712 return Ok(val);
1713 }
1714 }
1715 Err(ErrorContext::new_missing(
1716 "RangeAttrs",
1717 "Op",
1718 self.orig_loc,
1719 self.buf.as_ptr() as usize,
1720 ))
1721 }
1722 #[doc = "data range from\n"]
1723 pub fn get_from_data(&self) -> Result<IterableDataAttrs<'a>, ErrorContext> {
1724 let mut iter = self.clone();
1725 iter.pos = 0;
1726 for attr in iter {
1727 if let Ok(RangeAttrs::FromData(val)) = attr {
1728 return Ok(val);
1729 }
1730 }
1731 Err(ErrorContext::new_missing(
1732 "RangeAttrs",
1733 "FromData",
1734 self.orig_loc,
1735 self.buf.as_ptr() as usize,
1736 ))
1737 }
1738 #[doc = "data range to\n"]
1739 pub fn get_to_data(&self) -> Result<IterableDataAttrs<'a>, ErrorContext> {
1740 let mut iter = self.clone();
1741 iter.pos = 0;
1742 for attr in iter {
1743 if let Ok(RangeAttrs::ToData(val)) = attr {
1744 return Ok(val);
1745 }
1746 }
1747 Err(ErrorContext::new_missing(
1748 "RangeAttrs",
1749 "ToData",
1750 self.orig_loc,
1751 self.buf.as_ptr() as usize,
1752 ))
1753 }
1754}
1755impl RangeAttrs<'_> {
1756 pub fn new<'a>(buf: &'a [u8]) -> IterableRangeAttrs<'a> {
1757 IterableRangeAttrs::with_loc(buf, buf.as_ptr() as usize)
1758 }
1759 fn attr_from_type(r#type: u16) -> Option<&'static str> {
1760 let res = match r#type {
1761 1u16 => "Sreg",
1762 2u16 => "Op",
1763 3u16 => "FromData",
1764 4u16 => "ToData",
1765 _ => return None,
1766 };
1767 Some(res)
1768 }
1769}
1770#[derive(Clone, Copy, Default)]
1771pub struct IterableRangeAttrs<'a> {
1772 buf: &'a [u8],
1773 pos: usize,
1774 orig_loc: usize,
1775}
1776impl<'a> IterableRangeAttrs<'a> {
1777 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1778 Self {
1779 buf,
1780 pos: 0,
1781 orig_loc,
1782 }
1783 }
1784 pub fn get_buf(&self) -> &'a [u8] {
1785 self.buf
1786 }
1787}
1788impl<'a> Iterator for IterableRangeAttrs<'a> {
1789 type Item = Result<RangeAttrs<'a>, ErrorContext>;
1790 fn next(&mut self) -> Option<Self::Item> {
1791 let mut pos;
1792 let mut r#type;
1793 loop {
1794 pos = self.pos;
1795 r#type = None;
1796 if self.buf.len() == self.pos {
1797 return None;
1798 }
1799 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1800 self.pos = self.buf.len();
1801 break;
1802 };
1803 r#type = Some(header.r#type);
1804 let res = match header.r#type {
1805 1u16 => RangeAttrs::Sreg({
1806 let res = parse_be_u32(next);
1807 let Some(val) = res else { break };
1808 val
1809 }),
1810 2u16 => RangeAttrs::Op({
1811 let res = parse_be_u32(next);
1812 let Some(val) = res else { break };
1813 val
1814 }),
1815 3u16 => RangeAttrs::FromData({
1816 let res = Some(IterableDataAttrs::with_loc(next, self.orig_loc));
1817 let Some(val) = res else { break };
1818 val
1819 }),
1820 4u16 => RangeAttrs::ToData({
1821 let res = Some(IterableDataAttrs::with_loc(next, self.orig_loc));
1822 let Some(val) = res else { break };
1823 val
1824 }),
1825 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1826 n => continue,
1827 };
1828 return Some(Ok(res));
1829 }
1830 Some(Err(ErrorContext::new(
1831 "RangeAttrs",
1832 r#type.and_then(|t| RangeAttrs::attr_from_type(t)),
1833 self.orig_loc,
1834 self.buf.as_ptr().wrapping_add(pos) as usize,
1835 )))
1836 }
1837}
1838impl<'a> std::fmt::Debug for IterableRangeAttrs<'_> {
1839 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1840 let mut fmt = f.debug_struct("RangeAttrs");
1841 for attr in self.clone() {
1842 let attr = match attr {
1843 Ok(a) => a,
1844 Err(err) => {
1845 fmt.finish()?;
1846 f.write_str("Err(")?;
1847 err.fmt(f)?;
1848 return f.write_str(")");
1849 }
1850 };
1851 match attr {
1852 RangeAttrs::Sreg(val) => {
1853 fmt.field("Sreg", &FormatEnum(val.into(), Registers::from_value))
1854 }
1855 RangeAttrs::Op(val) => {
1856 fmt.field("Op", &FormatEnum(val.into(), RangeOps::from_value))
1857 }
1858 RangeAttrs::FromData(val) => fmt.field("FromData", &val),
1859 RangeAttrs::ToData(val) => fmt.field("ToData", &val),
1860 };
1861 }
1862 fmt.finish()
1863 }
1864}
1865impl IterableRangeAttrs<'_> {
1866 pub fn lookup_attr(
1867 &self,
1868 offset: usize,
1869 missing_type: Option<u16>,
1870 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1871 let mut stack = Vec::new();
1872 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1873 if missing_type.is_some() && cur == offset {
1874 stack.push(("RangeAttrs", offset));
1875 return (
1876 stack,
1877 missing_type.and_then(|t| RangeAttrs::attr_from_type(t)),
1878 );
1879 }
1880 if cur > offset || cur + self.buf.len() < offset {
1881 return (stack, None);
1882 }
1883 let mut attrs = self.clone();
1884 let mut last_off = cur + attrs.pos;
1885 let mut missing = None;
1886 while let Some(attr) = attrs.next() {
1887 let Ok(attr) = attr else { break };
1888 match attr {
1889 RangeAttrs::Sreg(val) => {
1890 if last_off == offset {
1891 stack.push(("Sreg", last_off));
1892 break;
1893 }
1894 }
1895 RangeAttrs::Op(val) => {
1896 if last_off == offset {
1897 stack.push(("Op", last_off));
1898 break;
1899 }
1900 }
1901 RangeAttrs::FromData(val) => {
1902 (stack, missing) = val.lookup_attr(offset, missing_type);
1903 if !stack.is_empty() {
1904 break;
1905 }
1906 }
1907 RangeAttrs::ToData(val) => {
1908 (stack, missing) = val.lookup_attr(offset, missing_type);
1909 if !stack.is_empty() {
1910 break;
1911 }
1912 }
1913 _ => {}
1914 };
1915 last_off = cur + attrs.pos;
1916 }
1917 if !stack.is_empty() {
1918 stack.push(("RangeAttrs", cur));
1919 }
1920 (stack, missing)
1921 }
1922}
1923#[derive(Clone)]
1924pub enum BatchAttrs {
1925 #[doc = "generation ID for this changeset\n"]
1926 Genid(u32),
1927}
1928impl<'a> IterableBatchAttrs<'a> {
1929 #[doc = "generation ID for this changeset\n"]
1930 pub fn get_genid(&self) -> Result<u32, ErrorContext> {
1931 let mut iter = self.clone();
1932 iter.pos = 0;
1933 for attr in iter {
1934 if let Ok(BatchAttrs::Genid(val)) = attr {
1935 return Ok(val);
1936 }
1937 }
1938 Err(ErrorContext::new_missing(
1939 "BatchAttrs",
1940 "Genid",
1941 self.orig_loc,
1942 self.buf.as_ptr() as usize,
1943 ))
1944 }
1945}
1946impl BatchAttrs {
1947 pub fn new<'a>(buf: &'a [u8]) -> IterableBatchAttrs<'a> {
1948 IterableBatchAttrs::with_loc(buf, buf.as_ptr() as usize)
1949 }
1950 fn attr_from_type(r#type: u16) -> Option<&'static str> {
1951 let res = match r#type {
1952 1u16 => "Genid",
1953 _ => return None,
1954 };
1955 Some(res)
1956 }
1957}
1958#[derive(Clone, Copy, Default)]
1959pub struct IterableBatchAttrs<'a> {
1960 buf: &'a [u8],
1961 pos: usize,
1962 orig_loc: usize,
1963}
1964impl<'a> IterableBatchAttrs<'a> {
1965 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1966 Self {
1967 buf,
1968 pos: 0,
1969 orig_loc,
1970 }
1971 }
1972 pub fn get_buf(&self) -> &'a [u8] {
1973 self.buf
1974 }
1975}
1976impl<'a> Iterator for IterableBatchAttrs<'a> {
1977 type Item = Result<BatchAttrs, ErrorContext>;
1978 fn next(&mut self) -> Option<Self::Item> {
1979 let mut pos;
1980 let mut r#type;
1981 loop {
1982 pos = self.pos;
1983 r#type = None;
1984 if self.buf.len() == self.pos {
1985 return None;
1986 }
1987 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1988 self.pos = self.buf.len();
1989 break;
1990 };
1991 r#type = Some(header.r#type);
1992 let res = match header.r#type {
1993 1u16 => BatchAttrs::Genid({
1994 let res = parse_be_u32(next);
1995 let Some(val) = res else { break };
1996 val
1997 }),
1998 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1999 n => continue,
2000 };
2001 return Some(Ok(res));
2002 }
2003 Some(Err(ErrorContext::new(
2004 "BatchAttrs",
2005 r#type.and_then(|t| BatchAttrs::attr_from_type(t)),
2006 self.orig_loc,
2007 self.buf.as_ptr().wrapping_add(pos) as usize,
2008 )))
2009 }
2010}
2011impl std::fmt::Debug for IterableBatchAttrs<'_> {
2012 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2013 let mut fmt = f.debug_struct("BatchAttrs");
2014 for attr in self.clone() {
2015 let attr = match attr {
2016 Ok(a) => a,
2017 Err(err) => {
2018 fmt.finish()?;
2019 f.write_str("Err(")?;
2020 err.fmt(f)?;
2021 return f.write_str(")");
2022 }
2023 };
2024 match attr {
2025 BatchAttrs::Genid(val) => fmt.field("Genid", &val),
2026 };
2027 }
2028 fmt.finish()
2029 }
2030}
2031impl IterableBatchAttrs<'_> {
2032 pub fn lookup_attr(
2033 &self,
2034 offset: usize,
2035 missing_type: Option<u16>,
2036 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2037 let mut stack = Vec::new();
2038 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
2039 if missing_type.is_some() && cur == offset {
2040 stack.push(("BatchAttrs", offset));
2041 return (
2042 stack,
2043 missing_type.and_then(|t| BatchAttrs::attr_from_type(t)),
2044 );
2045 }
2046 if cur > offset || cur + self.buf.len() < offset {
2047 return (stack, None);
2048 }
2049 let mut attrs = self.clone();
2050 let mut last_off = cur + attrs.pos;
2051 while let Some(attr) = attrs.next() {
2052 let Ok(attr) = attr else { break };
2053 match attr {
2054 BatchAttrs::Genid(val) => {
2055 if last_off == offset {
2056 stack.push(("Genid", last_off));
2057 break;
2058 }
2059 }
2060 _ => {}
2061 };
2062 last_off = cur + attrs.pos;
2063 }
2064 if !stack.is_empty() {
2065 stack.push(("BatchAttrs", cur));
2066 }
2067 (stack, None)
2068 }
2069}
2070#[derive(Clone)]
2071pub enum TableAttrs<'a> {
2072 #[doc = "name of the table\n"]
2073 Name(&'a CStr),
2074 #[doc = "bitmask of flags\n\nAssociated type: [`TableFlags`] (1 bit per enumeration)"]
2075 Flags(u32),
2076 #[doc = "number of chains in this table\n"]
2077 Use(u32),
2078 #[doc = "numeric handle of the table\n"]
2079 Handle(u64),
2080 Pad(&'a [u8]),
2081 #[doc = "user data\n"]
2082 Userdata(&'a [u8]),
2083 #[doc = "owner of this table through netlink portID\n"]
2084 Owner(u32),
2085}
2086impl<'a> IterableTableAttrs<'a> {
2087 #[doc = "name of the table\n"]
2088 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
2089 let mut iter = self.clone();
2090 iter.pos = 0;
2091 for attr in iter {
2092 if let Ok(TableAttrs::Name(val)) = attr {
2093 return Ok(val);
2094 }
2095 }
2096 Err(ErrorContext::new_missing(
2097 "TableAttrs",
2098 "Name",
2099 self.orig_loc,
2100 self.buf.as_ptr() as usize,
2101 ))
2102 }
2103 #[doc = "bitmask of flags\n\nAssociated type: [`TableFlags`] (1 bit per enumeration)"]
2104 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
2105 let mut iter = self.clone();
2106 iter.pos = 0;
2107 for attr in iter {
2108 if let Ok(TableAttrs::Flags(val)) = attr {
2109 return Ok(val);
2110 }
2111 }
2112 Err(ErrorContext::new_missing(
2113 "TableAttrs",
2114 "Flags",
2115 self.orig_loc,
2116 self.buf.as_ptr() as usize,
2117 ))
2118 }
2119 #[doc = "number of chains in this table\n"]
2120 pub fn get_use(&self) -> Result<u32, ErrorContext> {
2121 let mut iter = self.clone();
2122 iter.pos = 0;
2123 for attr in iter {
2124 if let Ok(TableAttrs::Use(val)) = attr {
2125 return Ok(val);
2126 }
2127 }
2128 Err(ErrorContext::new_missing(
2129 "TableAttrs",
2130 "Use",
2131 self.orig_loc,
2132 self.buf.as_ptr() as usize,
2133 ))
2134 }
2135 #[doc = "numeric handle of the table\n"]
2136 pub fn get_handle(&self) -> Result<u64, ErrorContext> {
2137 let mut iter = self.clone();
2138 iter.pos = 0;
2139 for attr in iter {
2140 if let Ok(TableAttrs::Handle(val)) = attr {
2141 return Ok(val);
2142 }
2143 }
2144 Err(ErrorContext::new_missing(
2145 "TableAttrs",
2146 "Handle",
2147 self.orig_loc,
2148 self.buf.as_ptr() as usize,
2149 ))
2150 }
2151 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
2152 let mut iter = self.clone();
2153 iter.pos = 0;
2154 for attr in iter {
2155 if let Ok(TableAttrs::Pad(val)) = attr {
2156 return Ok(val);
2157 }
2158 }
2159 Err(ErrorContext::new_missing(
2160 "TableAttrs",
2161 "Pad",
2162 self.orig_loc,
2163 self.buf.as_ptr() as usize,
2164 ))
2165 }
2166 #[doc = "user data\n"]
2167 pub fn get_userdata(&self) -> Result<&'a [u8], ErrorContext> {
2168 let mut iter = self.clone();
2169 iter.pos = 0;
2170 for attr in iter {
2171 if let Ok(TableAttrs::Userdata(val)) = attr {
2172 return Ok(val);
2173 }
2174 }
2175 Err(ErrorContext::new_missing(
2176 "TableAttrs",
2177 "Userdata",
2178 self.orig_loc,
2179 self.buf.as_ptr() as usize,
2180 ))
2181 }
2182 #[doc = "owner of this table through netlink portID\n"]
2183 pub fn get_owner(&self) -> Result<u32, ErrorContext> {
2184 let mut iter = self.clone();
2185 iter.pos = 0;
2186 for attr in iter {
2187 if let Ok(TableAttrs::Owner(val)) = attr {
2188 return Ok(val);
2189 }
2190 }
2191 Err(ErrorContext::new_missing(
2192 "TableAttrs",
2193 "Owner",
2194 self.orig_loc,
2195 self.buf.as_ptr() as usize,
2196 ))
2197 }
2198}
2199impl TableAttrs<'_> {
2200 pub fn new<'a>(buf: &'a [u8]) -> IterableTableAttrs<'a> {
2201 IterableTableAttrs::with_loc(buf, buf.as_ptr() as usize)
2202 }
2203 fn attr_from_type(r#type: u16) -> Option<&'static str> {
2204 let res = match r#type {
2205 1u16 => "Name",
2206 2u16 => "Flags",
2207 3u16 => "Use",
2208 4u16 => "Handle",
2209 5u16 => "Pad",
2210 6u16 => "Userdata",
2211 7u16 => "Owner",
2212 _ => return None,
2213 };
2214 Some(res)
2215 }
2216}
2217#[derive(Clone, Copy, Default)]
2218pub struct IterableTableAttrs<'a> {
2219 buf: &'a [u8],
2220 pos: usize,
2221 orig_loc: usize,
2222}
2223impl<'a> IterableTableAttrs<'a> {
2224 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
2225 Self {
2226 buf,
2227 pos: 0,
2228 orig_loc,
2229 }
2230 }
2231 pub fn get_buf(&self) -> &'a [u8] {
2232 self.buf
2233 }
2234}
2235impl<'a> Iterator for IterableTableAttrs<'a> {
2236 type Item = Result<TableAttrs<'a>, ErrorContext>;
2237 fn next(&mut self) -> Option<Self::Item> {
2238 let mut pos;
2239 let mut r#type;
2240 loop {
2241 pos = self.pos;
2242 r#type = None;
2243 if self.buf.len() == self.pos {
2244 return None;
2245 }
2246 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
2247 self.pos = self.buf.len();
2248 break;
2249 };
2250 r#type = Some(header.r#type);
2251 let res = match header.r#type {
2252 1u16 => TableAttrs::Name({
2253 let res = CStr::from_bytes_with_nul(next).ok();
2254 let Some(val) = res else { break };
2255 val
2256 }),
2257 2u16 => TableAttrs::Flags({
2258 let res = parse_be_u32(next);
2259 let Some(val) = res else { break };
2260 val
2261 }),
2262 3u16 => TableAttrs::Use({
2263 let res = parse_be_u32(next);
2264 let Some(val) = res else { break };
2265 val
2266 }),
2267 4u16 => TableAttrs::Handle({
2268 let res = parse_be_u64(next);
2269 let Some(val) = res else { break };
2270 val
2271 }),
2272 5u16 => TableAttrs::Pad({
2273 let res = Some(next);
2274 let Some(val) = res else { break };
2275 val
2276 }),
2277 6u16 => TableAttrs::Userdata({
2278 let res = Some(next);
2279 let Some(val) = res else { break };
2280 val
2281 }),
2282 7u16 => TableAttrs::Owner({
2283 let res = parse_be_u32(next);
2284 let Some(val) = res else { break };
2285 val
2286 }),
2287 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
2288 n => continue,
2289 };
2290 return Some(Ok(res));
2291 }
2292 Some(Err(ErrorContext::new(
2293 "TableAttrs",
2294 r#type.and_then(|t| TableAttrs::attr_from_type(t)),
2295 self.orig_loc,
2296 self.buf.as_ptr().wrapping_add(pos) as usize,
2297 )))
2298 }
2299}
2300impl<'a> std::fmt::Debug for IterableTableAttrs<'_> {
2301 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2302 let mut fmt = f.debug_struct("TableAttrs");
2303 for attr in self.clone() {
2304 let attr = match attr {
2305 Ok(a) => a,
2306 Err(err) => {
2307 fmt.finish()?;
2308 f.write_str("Err(")?;
2309 err.fmt(f)?;
2310 return f.write_str(")");
2311 }
2312 };
2313 match attr {
2314 TableAttrs::Name(val) => fmt.field("Name", &val),
2315 TableAttrs::Flags(val) => {
2316 fmt.field("Flags", &FormatFlags(val.into(), TableFlags::from_value))
2317 }
2318 TableAttrs::Use(val) => fmt.field("Use", &val),
2319 TableAttrs::Handle(val) => fmt.field("Handle", &val),
2320 TableAttrs::Pad(val) => fmt.field("Pad", &val),
2321 TableAttrs::Userdata(val) => fmt.field("Userdata", &val),
2322 TableAttrs::Owner(val) => fmt.field("Owner", &val),
2323 };
2324 }
2325 fmt.finish()
2326 }
2327}
2328impl IterableTableAttrs<'_> {
2329 pub fn lookup_attr(
2330 &self,
2331 offset: usize,
2332 missing_type: Option<u16>,
2333 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2334 let mut stack = Vec::new();
2335 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
2336 if missing_type.is_some() && cur == offset {
2337 stack.push(("TableAttrs", offset));
2338 return (
2339 stack,
2340 missing_type.and_then(|t| TableAttrs::attr_from_type(t)),
2341 );
2342 }
2343 if cur > offset || cur + self.buf.len() < offset {
2344 return (stack, None);
2345 }
2346 let mut attrs = self.clone();
2347 let mut last_off = cur + attrs.pos;
2348 while let Some(attr) = attrs.next() {
2349 let Ok(attr) = attr else { break };
2350 match attr {
2351 TableAttrs::Name(val) => {
2352 if last_off == offset {
2353 stack.push(("Name", last_off));
2354 break;
2355 }
2356 }
2357 TableAttrs::Flags(val) => {
2358 if last_off == offset {
2359 stack.push(("Flags", last_off));
2360 break;
2361 }
2362 }
2363 TableAttrs::Use(val) => {
2364 if last_off == offset {
2365 stack.push(("Use", last_off));
2366 break;
2367 }
2368 }
2369 TableAttrs::Handle(val) => {
2370 if last_off == offset {
2371 stack.push(("Handle", last_off));
2372 break;
2373 }
2374 }
2375 TableAttrs::Pad(val) => {
2376 if last_off == offset {
2377 stack.push(("Pad", last_off));
2378 break;
2379 }
2380 }
2381 TableAttrs::Userdata(val) => {
2382 if last_off == offset {
2383 stack.push(("Userdata", last_off));
2384 break;
2385 }
2386 }
2387 TableAttrs::Owner(val) => {
2388 if last_off == offset {
2389 stack.push(("Owner", last_off));
2390 break;
2391 }
2392 }
2393 _ => {}
2394 };
2395 last_off = cur + attrs.pos;
2396 }
2397 if !stack.is_empty() {
2398 stack.push(("TableAttrs", cur));
2399 }
2400 (stack, None)
2401 }
2402}
2403#[derive(Clone)]
2404pub enum ChainAttrs<'a> {
2405 #[doc = "name of the table containing the chain\n"]
2406 Table(&'a CStr),
2407 #[doc = "numeric handle of the chain\n"]
2408 Handle(u64),
2409 #[doc = "name of the chain\n"]
2410 Name(&'a CStr),
2411 #[doc = "hook specification for basechains\n"]
2412 Hook(IterableNftHookAttrs<'a>),
2413 #[doc = "numeric policy of the chain\n"]
2414 Policy(u32),
2415 #[doc = "number of references to this chain\n"]
2416 Use(u32),
2417 #[doc = "type name of the chain\n"]
2418 Type(&'a CStr),
2419 #[doc = "counter specification of the chain\n"]
2420 Counters(IterableNftCounterAttrs<'a>),
2421 #[doc = "chain flags\n\nAssociated type: [`ChainFlags`] (1 bit per enumeration)"]
2422 Flags(u32),
2423 #[doc = "uniquely identifies a chain in a transaction\n"]
2424 Id(u32),
2425 #[doc = "user data\n"]
2426 Userdata(&'a [u8]),
2427}
2428impl<'a> IterableChainAttrs<'a> {
2429 #[doc = "name of the table containing the chain\n"]
2430 pub fn get_table(&self) -> Result<&'a CStr, ErrorContext> {
2431 let mut iter = self.clone();
2432 iter.pos = 0;
2433 for attr in iter {
2434 if let Ok(ChainAttrs::Table(val)) = attr {
2435 return Ok(val);
2436 }
2437 }
2438 Err(ErrorContext::new_missing(
2439 "ChainAttrs",
2440 "Table",
2441 self.orig_loc,
2442 self.buf.as_ptr() as usize,
2443 ))
2444 }
2445 #[doc = "numeric handle of the chain\n"]
2446 pub fn get_handle(&self) -> Result<u64, ErrorContext> {
2447 let mut iter = self.clone();
2448 iter.pos = 0;
2449 for attr in iter {
2450 if let Ok(ChainAttrs::Handle(val)) = attr {
2451 return Ok(val);
2452 }
2453 }
2454 Err(ErrorContext::new_missing(
2455 "ChainAttrs",
2456 "Handle",
2457 self.orig_loc,
2458 self.buf.as_ptr() as usize,
2459 ))
2460 }
2461 #[doc = "name of the chain\n"]
2462 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
2463 let mut iter = self.clone();
2464 iter.pos = 0;
2465 for attr in iter {
2466 if let Ok(ChainAttrs::Name(val)) = attr {
2467 return Ok(val);
2468 }
2469 }
2470 Err(ErrorContext::new_missing(
2471 "ChainAttrs",
2472 "Name",
2473 self.orig_loc,
2474 self.buf.as_ptr() as usize,
2475 ))
2476 }
2477 #[doc = "hook specification for basechains\n"]
2478 pub fn get_hook(&self) -> Result<IterableNftHookAttrs<'a>, ErrorContext> {
2479 let mut iter = self.clone();
2480 iter.pos = 0;
2481 for attr in iter {
2482 if let Ok(ChainAttrs::Hook(val)) = attr {
2483 return Ok(val);
2484 }
2485 }
2486 Err(ErrorContext::new_missing(
2487 "ChainAttrs",
2488 "Hook",
2489 self.orig_loc,
2490 self.buf.as_ptr() as usize,
2491 ))
2492 }
2493 #[doc = "numeric policy of the chain\n"]
2494 pub fn get_policy(&self) -> Result<u32, ErrorContext> {
2495 let mut iter = self.clone();
2496 iter.pos = 0;
2497 for attr in iter {
2498 if let Ok(ChainAttrs::Policy(val)) = attr {
2499 return Ok(val);
2500 }
2501 }
2502 Err(ErrorContext::new_missing(
2503 "ChainAttrs",
2504 "Policy",
2505 self.orig_loc,
2506 self.buf.as_ptr() as usize,
2507 ))
2508 }
2509 #[doc = "number of references to this chain\n"]
2510 pub fn get_use(&self) -> Result<u32, ErrorContext> {
2511 let mut iter = self.clone();
2512 iter.pos = 0;
2513 for attr in iter {
2514 if let Ok(ChainAttrs::Use(val)) = attr {
2515 return Ok(val);
2516 }
2517 }
2518 Err(ErrorContext::new_missing(
2519 "ChainAttrs",
2520 "Use",
2521 self.orig_loc,
2522 self.buf.as_ptr() as usize,
2523 ))
2524 }
2525 #[doc = "type name of the chain\n"]
2526 pub fn get_type(&self) -> Result<&'a CStr, ErrorContext> {
2527 let mut iter = self.clone();
2528 iter.pos = 0;
2529 for attr in iter {
2530 if let Ok(ChainAttrs::Type(val)) = attr {
2531 return Ok(val);
2532 }
2533 }
2534 Err(ErrorContext::new_missing(
2535 "ChainAttrs",
2536 "Type",
2537 self.orig_loc,
2538 self.buf.as_ptr() as usize,
2539 ))
2540 }
2541 #[doc = "counter specification of the chain\n"]
2542 pub fn get_counters(&self) -> Result<IterableNftCounterAttrs<'a>, ErrorContext> {
2543 let mut iter = self.clone();
2544 iter.pos = 0;
2545 for attr in iter {
2546 if let Ok(ChainAttrs::Counters(val)) = attr {
2547 return Ok(val);
2548 }
2549 }
2550 Err(ErrorContext::new_missing(
2551 "ChainAttrs",
2552 "Counters",
2553 self.orig_loc,
2554 self.buf.as_ptr() as usize,
2555 ))
2556 }
2557 #[doc = "chain flags\n\nAssociated type: [`ChainFlags`] (1 bit per enumeration)"]
2558 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
2559 let mut iter = self.clone();
2560 iter.pos = 0;
2561 for attr in iter {
2562 if let Ok(ChainAttrs::Flags(val)) = attr {
2563 return Ok(val);
2564 }
2565 }
2566 Err(ErrorContext::new_missing(
2567 "ChainAttrs",
2568 "Flags",
2569 self.orig_loc,
2570 self.buf.as_ptr() as usize,
2571 ))
2572 }
2573 #[doc = "uniquely identifies a chain in a transaction\n"]
2574 pub fn get_id(&self) -> Result<u32, ErrorContext> {
2575 let mut iter = self.clone();
2576 iter.pos = 0;
2577 for attr in iter {
2578 if let Ok(ChainAttrs::Id(val)) = attr {
2579 return Ok(val);
2580 }
2581 }
2582 Err(ErrorContext::new_missing(
2583 "ChainAttrs",
2584 "Id",
2585 self.orig_loc,
2586 self.buf.as_ptr() as usize,
2587 ))
2588 }
2589 #[doc = "user data\n"]
2590 pub fn get_userdata(&self) -> Result<&'a [u8], ErrorContext> {
2591 let mut iter = self.clone();
2592 iter.pos = 0;
2593 for attr in iter {
2594 if let Ok(ChainAttrs::Userdata(val)) = attr {
2595 return Ok(val);
2596 }
2597 }
2598 Err(ErrorContext::new_missing(
2599 "ChainAttrs",
2600 "Userdata",
2601 self.orig_loc,
2602 self.buf.as_ptr() as usize,
2603 ))
2604 }
2605}
2606impl ChainAttrs<'_> {
2607 pub fn new<'a>(buf: &'a [u8]) -> IterableChainAttrs<'a> {
2608 IterableChainAttrs::with_loc(buf, buf.as_ptr() as usize)
2609 }
2610 fn attr_from_type(r#type: u16) -> Option<&'static str> {
2611 let res = match r#type {
2612 1u16 => "Table",
2613 2u16 => "Handle",
2614 3u16 => "Name",
2615 4u16 => "Hook",
2616 5u16 => "Policy",
2617 6u16 => "Use",
2618 7u16 => "Type",
2619 8u16 => "Counters",
2620 9u16 => "Flags",
2621 10u16 => "Id",
2622 11u16 => "Userdata",
2623 _ => return None,
2624 };
2625 Some(res)
2626 }
2627}
2628#[derive(Clone, Copy, Default)]
2629pub struct IterableChainAttrs<'a> {
2630 buf: &'a [u8],
2631 pos: usize,
2632 orig_loc: usize,
2633}
2634impl<'a> IterableChainAttrs<'a> {
2635 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
2636 Self {
2637 buf,
2638 pos: 0,
2639 orig_loc,
2640 }
2641 }
2642 pub fn get_buf(&self) -> &'a [u8] {
2643 self.buf
2644 }
2645}
2646impl<'a> Iterator for IterableChainAttrs<'a> {
2647 type Item = Result<ChainAttrs<'a>, ErrorContext>;
2648 fn next(&mut self) -> Option<Self::Item> {
2649 let mut pos;
2650 let mut r#type;
2651 loop {
2652 pos = self.pos;
2653 r#type = None;
2654 if self.buf.len() == self.pos {
2655 return None;
2656 }
2657 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
2658 self.pos = self.buf.len();
2659 break;
2660 };
2661 r#type = Some(header.r#type);
2662 let res = match header.r#type {
2663 1u16 => ChainAttrs::Table({
2664 let res = CStr::from_bytes_with_nul(next).ok();
2665 let Some(val) = res else { break };
2666 val
2667 }),
2668 2u16 => ChainAttrs::Handle({
2669 let res = parse_be_u64(next);
2670 let Some(val) = res else { break };
2671 val
2672 }),
2673 3u16 => ChainAttrs::Name({
2674 let res = CStr::from_bytes_with_nul(next).ok();
2675 let Some(val) = res else { break };
2676 val
2677 }),
2678 4u16 => ChainAttrs::Hook({
2679 let res = Some(IterableNftHookAttrs::with_loc(next, self.orig_loc));
2680 let Some(val) = res else { break };
2681 val
2682 }),
2683 5u16 => ChainAttrs::Policy({
2684 let res = parse_be_u32(next);
2685 let Some(val) = res else { break };
2686 val
2687 }),
2688 6u16 => ChainAttrs::Use({
2689 let res = parse_be_u32(next);
2690 let Some(val) = res else { break };
2691 val
2692 }),
2693 7u16 => ChainAttrs::Type({
2694 let res = CStr::from_bytes_with_nul(next).ok();
2695 let Some(val) = res else { break };
2696 val
2697 }),
2698 8u16 => ChainAttrs::Counters({
2699 let res = Some(IterableNftCounterAttrs::with_loc(next, self.orig_loc));
2700 let Some(val) = res else { break };
2701 val
2702 }),
2703 9u16 => ChainAttrs::Flags({
2704 let res = parse_be_u32(next);
2705 let Some(val) = res else { break };
2706 val
2707 }),
2708 10u16 => ChainAttrs::Id({
2709 let res = parse_be_u32(next);
2710 let Some(val) = res else { break };
2711 val
2712 }),
2713 11u16 => ChainAttrs::Userdata({
2714 let res = Some(next);
2715 let Some(val) = res else { break };
2716 val
2717 }),
2718 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
2719 n => continue,
2720 };
2721 return Some(Ok(res));
2722 }
2723 Some(Err(ErrorContext::new(
2724 "ChainAttrs",
2725 r#type.and_then(|t| ChainAttrs::attr_from_type(t)),
2726 self.orig_loc,
2727 self.buf.as_ptr().wrapping_add(pos) as usize,
2728 )))
2729 }
2730}
2731impl<'a> std::fmt::Debug for IterableChainAttrs<'_> {
2732 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2733 let mut fmt = f.debug_struct("ChainAttrs");
2734 for attr in self.clone() {
2735 let attr = match attr {
2736 Ok(a) => a,
2737 Err(err) => {
2738 fmt.finish()?;
2739 f.write_str("Err(")?;
2740 err.fmt(f)?;
2741 return f.write_str(")");
2742 }
2743 };
2744 match attr {
2745 ChainAttrs::Table(val) => fmt.field("Table", &val),
2746 ChainAttrs::Handle(val) => fmt.field("Handle", &val),
2747 ChainAttrs::Name(val) => fmt.field("Name", &val),
2748 ChainAttrs::Hook(val) => fmt.field("Hook", &val),
2749 ChainAttrs::Policy(val) => fmt.field("Policy", &val),
2750 ChainAttrs::Use(val) => fmt.field("Use", &val),
2751 ChainAttrs::Type(val) => fmt.field("Type", &val),
2752 ChainAttrs::Counters(val) => fmt.field("Counters", &val),
2753 ChainAttrs::Flags(val) => {
2754 fmt.field("Flags", &FormatFlags(val.into(), ChainFlags::from_value))
2755 }
2756 ChainAttrs::Id(val) => fmt.field("Id", &val),
2757 ChainAttrs::Userdata(val) => fmt.field("Userdata", &val),
2758 };
2759 }
2760 fmt.finish()
2761 }
2762}
2763impl IterableChainAttrs<'_> {
2764 pub fn lookup_attr(
2765 &self,
2766 offset: usize,
2767 missing_type: Option<u16>,
2768 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2769 let mut stack = Vec::new();
2770 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
2771 if missing_type.is_some() && cur == offset {
2772 stack.push(("ChainAttrs", offset));
2773 return (
2774 stack,
2775 missing_type.and_then(|t| ChainAttrs::attr_from_type(t)),
2776 );
2777 }
2778 if cur > offset || cur + self.buf.len() < offset {
2779 return (stack, None);
2780 }
2781 let mut attrs = self.clone();
2782 let mut last_off = cur + attrs.pos;
2783 let mut missing = None;
2784 while let Some(attr) = attrs.next() {
2785 let Ok(attr) = attr else { break };
2786 match attr {
2787 ChainAttrs::Table(val) => {
2788 if last_off == offset {
2789 stack.push(("Table", last_off));
2790 break;
2791 }
2792 }
2793 ChainAttrs::Handle(val) => {
2794 if last_off == offset {
2795 stack.push(("Handle", last_off));
2796 break;
2797 }
2798 }
2799 ChainAttrs::Name(val) => {
2800 if last_off == offset {
2801 stack.push(("Name", last_off));
2802 break;
2803 }
2804 }
2805 ChainAttrs::Hook(val) => {
2806 (stack, missing) = val.lookup_attr(offset, missing_type);
2807 if !stack.is_empty() {
2808 break;
2809 }
2810 }
2811 ChainAttrs::Policy(val) => {
2812 if last_off == offset {
2813 stack.push(("Policy", last_off));
2814 break;
2815 }
2816 }
2817 ChainAttrs::Use(val) => {
2818 if last_off == offset {
2819 stack.push(("Use", last_off));
2820 break;
2821 }
2822 }
2823 ChainAttrs::Type(val) => {
2824 if last_off == offset {
2825 stack.push(("Type", last_off));
2826 break;
2827 }
2828 }
2829 ChainAttrs::Counters(val) => {
2830 (stack, missing) = val.lookup_attr(offset, missing_type);
2831 if !stack.is_empty() {
2832 break;
2833 }
2834 }
2835 ChainAttrs::Flags(val) => {
2836 if last_off == offset {
2837 stack.push(("Flags", last_off));
2838 break;
2839 }
2840 }
2841 ChainAttrs::Id(val) => {
2842 if last_off == offset {
2843 stack.push(("Id", last_off));
2844 break;
2845 }
2846 }
2847 ChainAttrs::Userdata(val) => {
2848 if last_off == offset {
2849 stack.push(("Userdata", last_off));
2850 break;
2851 }
2852 }
2853 _ => {}
2854 };
2855 last_off = cur + attrs.pos;
2856 }
2857 if !stack.is_empty() {
2858 stack.push(("ChainAttrs", cur));
2859 }
2860 (stack, missing)
2861 }
2862}
2863#[derive(Clone)]
2864pub enum CounterAttrs<'a> {
2865 Bytes(u64),
2866 Packets(u64),
2867 Pad(&'a [u8]),
2868}
2869impl<'a> IterableCounterAttrs<'a> {
2870 pub fn get_bytes(&self) -> Result<u64, ErrorContext> {
2871 let mut iter = self.clone();
2872 iter.pos = 0;
2873 for attr in iter {
2874 if let Ok(CounterAttrs::Bytes(val)) = attr {
2875 return Ok(val);
2876 }
2877 }
2878 Err(ErrorContext::new_missing(
2879 "CounterAttrs",
2880 "Bytes",
2881 self.orig_loc,
2882 self.buf.as_ptr() as usize,
2883 ))
2884 }
2885 pub fn get_packets(&self) -> Result<u64, ErrorContext> {
2886 let mut iter = self.clone();
2887 iter.pos = 0;
2888 for attr in iter {
2889 if let Ok(CounterAttrs::Packets(val)) = attr {
2890 return Ok(val);
2891 }
2892 }
2893 Err(ErrorContext::new_missing(
2894 "CounterAttrs",
2895 "Packets",
2896 self.orig_loc,
2897 self.buf.as_ptr() as usize,
2898 ))
2899 }
2900 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
2901 let mut iter = self.clone();
2902 iter.pos = 0;
2903 for attr in iter {
2904 if let Ok(CounterAttrs::Pad(val)) = attr {
2905 return Ok(val);
2906 }
2907 }
2908 Err(ErrorContext::new_missing(
2909 "CounterAttrs",
2910 "Pad",
2911 self.orig_loc,
2912 self.buf.as_ptr() as usize,
2913 ))
2914 }
2915}
2916impl CounterAttrs<'_> {
2917 pub fn new<'a>(buf: &'a [u8]) -> IterableCounterAttrs<'a> {
2918 IterableCounterAttrs::with_loc(buf, buf.as_ptr() as usize)
2919 }
2920 fn attr_from_type(r#type: u16) -> Option<&'static str> {
2921 let res = match r#type {
2922 1u16 => "Bytes",
2923 2u16 => "Packets",
2924 3u16 => "Pad",
2925 _ => return None,
2926 };
2927 Some(res)
2928 }
2929}
2930#[derive(Clone, Copy, Default)]
2931pub struct IterableCounterAttrs<'a> {
2932 buf: &'a [u8],
2933 pos: usize,
2934 orig_loc: usize,
2935}
2936impl<'a> IterableCounterAttrs<'a> {
2937 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
2938 Self {
2939 buf,
2940 pos: 0,
2941 orig_loc,
2942 }
2943 }
2944 pub fn get_buf(&self) -> &'a [u8] {
2945 self.buf
2946 }
2947}
2948impl<'a> Iterator for IterableCounterAttrs<'a> {
2949 type Item = Result<CounterAttrs<'a>, ErrorContext>;
2950 fn next(&mut self) -> Option<Self::Item> {
2951 let mut pos;
2952 let mut r#type;
2953 loop {
2954 pos = self.pos;
2955 r#type = None;
2956 if self.buf.len() == self.pos {
2957 return None;
2958 }
2959 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
2960 self.pos = self.buf.len();
2961 break;
2962 };
2963 r#type = Some(header.r#type);
2964 let res = match header.r#type {
2965 1u16 => CounterAttrs::Bytes({
2966 let res = parse_be_u64(next);
2967 let Some(val) = res else { break };
2968 val
2969 }),
2970 2u16 => CounterAttrs::Packets({
2971 let res = parse_be_u64(next);
2972 let Some(val) = res else { break };
2973 val
2974 }),
2975 3u16 => CounterAttrs::Pad({
2976 let res = Some(next);
2977 let Some(val) = res else { break };
2978 val
2979 }),
2980 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
2981 n => continue,
2982 };
2983 return Some(Ok(res));
2984 }
2985 Some(Err(ErrorContext::new(
2986 "CounterAttrs",
2987 r#type.and_then(|t| CounterAttrs::attr_from_type(t)),
2988 self.orig_loc,
2989 self.buf.as_ptr().wrapping_add(pos) as usize,
2990 )))
2991 }
2992}
2993impl<'a> std::fmt::Debug for IterableCounterAttrs<'_> {
2994 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2995 let mut fmt = f.debug_struct("CounterAttrs");
2996 for attr in self.clone() {
2997 let attr = match attr {
2998 Ok(a) => a,
2999 Err(err) => {
3000 fmt.finish()?;
3001 f.write_str("Err(")?;
3002 err.fmt(f)?;
3003 return f.write_str(")");
3004 }
3005 };
3006 match attr {
3007 CounterAttrs::Bytes(val) => fmt.field("Bytes", &val),
3008 CounterAttrs::Packets(val) => fmt.field("Packets", &val),
3009 CounterAttrs::Pad(val) => fmt.field("Pad", &val),
3010 };
3011 }
3012 fmt.finish()
3013 }
3014}
3015impl IterableCounterAttrs<'_> {
3016 pub fn lookup_attr(
3017 &self,
3018 offset: usize,
3019 missing_type: Option<u16>,
3020 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
3021 let mut stack = Vec::new();
3022 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
3023 if missing_type.is_some() && cur == offset {
3024 stack.push(("CounterAttrs", offset));
3025 return (
3026 stack,
3027 missing_type.and_then(|t| CounterAttrs::attr_from_type(t)),
3028 );
3029 }
3030 if cur > offset || cur + self.buf.len() < offset {
3031 return (stack, None);
3032 }
3033 let mut attrs = self.clone();
3034 let mut last_off = cur + attrs.pos;
3035 while let Some(attr) = attrs.next() {
3036 let Ok(attr) = attr else { break };
3037 match attr {
3038 CounterAttrs::Bytes(val) => {
3039 if last_off == offset {
3040 stack.push(("Bytes", last_off));
3041 break;
3042 }
3043 }
3044 CounterAttrs::Packets(val) => {
3045 if last_off == offset {
3046 stack.push(("Packets", last_off));
3047 break;
3048 }
3049 }
3050 CounterAttrs::Pad(val) => {
3051 if last_off == offset {
3052 stack.push(("Pad", last_off));
3053 break;
3054 }
3055 }
3056 _ => {}
3057 };
3058 last_off = cur + attrs.pos;
3059 }
3060 if !stack.is_empty() {
3061 stack.push(("CounterAttrs", cur));
3062 }
3063 (stack, None)
3064 }
3065}
3066#[derive(Clone)]
3067pub enum NftHookAttrs<'a> {
3068 Num(u32),
3069 Priority(i32),
3070 #[doc = "net device name\n"]
3071 Dev(&'a CStr),
3072 #[doc = "list of net devices\n"]
3073 Devs(IterableHookDevAttrs<'a>),
3074}
3075impl<'a> IterableNftHookAttrs<'a> {
3076 pub fn get_num(&self) -> Result<u32, ErrorContext> {
3077 let mut iter = self.clone();
3078 iter.pos = 0;
3079 for attr in iter {
3080 if let Ok(NftHookAttrs::Num(val)) = attr {
3081 return Ok(val);
3082 }
3083 }
3084 Err(ErrorContext::new_missing(
3085 "NftHookAttrs",
3086 "Num",
3087 self.orig_loc,
3088 self.buf.as_ptr() as usize,
3089 ))
3090 }
3091 pub fn get_priority(&self) -> Result<i32, ErrorContext> {
3092 let mut iter = self.clone();
3093 iter.pos = 0;
3094 for attr in iter {
3095 if let Ok(NftHookAttrs::Priority(val)) = attr {
3096 return Ok(val);
3097 }
3098 }
3099 Err(ErrorContext::new_missing(
3100 "NftHookAttrs",
3101 "Priority",
3102 self.orig_loc,
3103 self.buf.as_ptr() as usize,
3104 ))
3105 }
3106 #[doc = "net device name\n"]
3107 pub fn get_dev(&self) -> Result<&'a CStr, ErrorContext> {
3108 let mut iter = self.clone();
3109 iter.pos = 0;
3110 for attr in iter {
3111 if let Ok(NftHookAttrs::Dev(val)) = attr {
3112 return Ok(val);
3113 }
3114 }
3115 Err(ErrorContext::new_missing(
3116 "NftHookAttrs",
3117 "Dev",
3118 self.orig_loc,
3119 self.buf.as_ptr() as usize,
3120 ))
3121 }
3122 #[doc = "list of net devices\n"]
3123 pub fn get_devs(&self) -> Result<IterableHookDevAttrs<'a>, ErrorContext> {
3124 let mut iter = self.clone();
3125 iter.pos = 0;
3126 for attr in iter {
3127 if let Ok(NftHookAttrs::Devs(val)) = attr {
3128 return Ok(val);
3129 }
3130 }
3131 Err(ErrorContext::new_missing(
3132 "NftHookAttrs",
3133 "Devs",
3134 self.orig_loc,
3135 self.buf.as_ptr() as usize,
3136 ))
3137 }
3138}
3139impl NftHookAttrs<'_> {
3140 pub fn new<'a>(buf: &'a [u8]) -> IterableNftHookAttrs<'a> {
3141 IterableNftHookAttrs::with_loc(buf, buf.as_ptr() as usize)
3142 }
3143 fn attr_from_type(r#type: u16) -> Option<&'static str> {
3144 let res = match r#type {
3145 1u16 => "Num",
3146 2u16 => "Priority",
3147 3u16 => "Dev",
3148 4u16 => "Devs",
3149 _ => return None,
3150 };
3151 Some(res)
3152 }
3153}
3154#[derive(Clone, Copy, Default)]
3155pub struct IterableNftHookAttrs<'a> {
3156 buf: &'a [u8],
3157 pos: usize,
3158 orig_loc: usize,
3159}
3160impl<'a> IterableNftHookAttrs<'a> {
3161 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
3162 Self {
3163 buf,
3164 pos: 0,
3165 orig_loc,
3166 }
3167 }
3168 pub fn get_buf(&self) -> &'a [u8] {
3169 self.buf
3170 }
3171}
3172impl<'a> Iterator for IterableNftHookAttrs<'a> {
3173 type Item = Result<NftHookAttrs<'a>, ErrorContext>;
3174 fn next(&mut self) -> Option<Self::Item> {
3175 let mut pos;
3176 let mut r#type;
3177 loop {
3178 pos = self.pos;
3179 r#type = None;
3180 if self.buf.len() == self.pos {
3181 return None;
3182 }
3183 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
3184 self.pos = self.buf.len();
3185 break;
3186 };
3187 r#type = Some(header.r#type);
3188 let res = match header.r#type {
3189 1u16 => NftHookAttrs::Num({
3190 let res = parse_be_u32(next);
3191 let Some(val) = res else { break };
3192 val
3193 }),
3194 2u16 => NftHookAttrs::Priority({
3195 let res = parse_be_i32(next);
3196 let Some(val) = res else { break };
3197 val
3198 }),
3199 3u16 => NftHookAttrs::Dev({
3200 let res = CStr::from_bytes_with_nul(next).ok();
3201 let Some(val) = res else { break };
3202 val
3203 }),
3204 4u16 => NftHookAttrs::Devs({
3205 let res = Some(IterableHookDevAttrs::with_loc(next, self.orig_loc));
3206 let Some(val) = res else { break };
3207 val
3208 }),
3209 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
3210 n => continue,
3211 };
3212 return Some(Ok(res));
3213 }
3214 Some(Err(ErrorContext::new(
3215 "NftHookAttrs",
3216 r#type.and_then(|t| NftHookAttrs::attr_from_type(t)),
3217 self.orig_loc,
3218 self.buf.as_ptr().wrapping_add(pos) as usize,
3219 )))
3220 }
3221}
3222impl<'a> std::fmt::Debug for IterableNftHookAttrs<'_> {
3223 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3224 let mut fmt = f.debug_struct("NftHookAttrs");
3225 for attr in self.clone() {
3226 let attr = match attr {
3227 Ok(a) => a,
3228 Err(err) => {
3229 fmt.finish()?;
3230 f.write_str("Err(")?;
3231 err.fmt(f)?;
3232 return f.write_str(")");
3233 }
3234 };
3235 match attr {
3236 NftHookAttrs::Num(val) => fmt.field("Num", &val),
3237 NftHookAttrs::Priority(val) => fmt.field("Priority", &val),
3238 NftHookAttrs::Dev(val) => fmt.field("Dev", &val),
3239 NftHookAttrs::Devs(val) => fmt.field("Devs", &val),
3240 };
3241 }
3242 fmt.finish()
3243 }
3244}
3245impl IterableNftHookAttrs<'_> {
3246 pub fn lookup_attr(
3247 &self,
3248 offset: usize,
3249 missing_type: Option<u16>,
3250 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
3251 let mut stack = Vec::new();
3252 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
3253 if missing_type.is_some() && cur == offset {
3254 stack.push(("NftHookAttrs", offset));
3255 return (
3256 stack,
3257 missing_type.and_then(|t| NftHookAttrs::attr_from_type(t)),
3258 );
3259 }
3260 if cur > offset || cur + self.buf.len() < offset {
3261 return (stack, None);
3262 }
3263 let mut attrs = self.clone();
3264 let mut last_off = cur + attrs.pos;
3265 let mut missing = None;
3266 while let Some(attr) = attrs.next() {
3267 let Ok(attr) = attr else { break };
3268 match attr {
3269 NftHookAttrs::Num(val) => {
3270 if last_off == offset {
3271 stack.push(("Num", last_off));
3272 break;
3273 }
3274 }
3275 NftHookAttrs::Priority(val) => {
3276 if last_off == offset {
3277 stack.push(("Priority", last_off));
3278 break;
3279 }
3280 }
3281 NftHookAttrs::Dev(val) => {
3282 if last_off == offset {
3283 stack.push(("Dev", last_off));
3284 break;
3285 }
3286 }
3287 NftHookAttrs::Devs(val) => {
3288 (stack, missing) = val.lookup_attr(offset, missing_type);
3289 if !stack.is_empty() {
3290 break;
3291 }
3292 }
3293 _ => {}
3294 };
3295 last_off = cur + attrs.pos;
3296 }
3297 if !stack.is_empty() {
3298 stack.push(("NftHookAttrs", cur));
3299 }
3300 (stack, missing)
3301 }
3302}
3303#[derive(Clone)]
3304pub enum HookDevAttrs<'a> {
3305 #[doc = "Attribute may repeat multiple times (treat it as array)"]
3306 Name(&'a CStr),
3307}
3308impl<'a> IterableHookDevAttrs<'a> {
3309 #[doc = "Attribute may repeat multiple times (treat it as array)"]
3310 pub fn get_name(&self) -> MultiAttrIterable<Self, HookDevAttrs<'a>, &'a CStr> {
3311 MultiAttrIterable::new(self.clone(), |variant| {
3312 if let HookDevAttrs::Name(val) = variant {
3313 Some(val)
3314 } else {
3315 None
3316 }
3317 })
3318 }
3319}
3320impl HookDevAttrs<'_> {
3321 pub fn new<'a>(buf: &'a [u8]) -> IterableHookDevAttrs<'a> {
3322 IterableHookDevAttrs::with_loc(buf, buf.as_ptr() as usize)
3323 }
3324 fn attr_from_type(r#type: u16) -> Option<&'static str> {
3325 let res = match r#type {
3326 1u16 => "Name",
3327 _ => return None,
3328 };
3329 Some(res)
3330 }
3331}
3332#[derive(Clone, Copy, Default)]
3333pub struct IterableHookDevAttrs<'a> {
3334 buf: &'a [u8],
3335 pos: usize,
3336 orig_loc: usize,
3337}
3338impl<'a> IterableHookDevAttrs<'a> {
3339 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
3340 Self {
3341 buf,
3342 pos: 0,
3343 orig_loc,
3344 }
3345 }
3346 pub fn get_buf(&self) -> &'a [u8] {
3347 self.buf
3348 }
3349}
3350impl<'a> Iterator for IterableHookDevAttrs<'a> {
3351 type Item = Result<HookDevAttrs<'a>, ErrorContext>;
3352 fn next(&mut self) -> Option<Self::Item> {
3353 let mut pos;
3354 let mut r#type;
3355 loop {
3356 pos = self.pos;
3357 r#type = None;
3358 if self.buf.len() == self.pos {
3359 return None;
3360 }
3361 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
3362 self.pos = self.buf.len();
3363 break;
3364 };
3365 r#type = Some(header.r#type);
3366 let res = match header.r#type {
3367 1u16 => HookDevAttrs::Name({
3368 let res = CStr::from_bytes_with_nul(next).ok();
3369 let Some(val) = res else { break };
3370 val
3371 }),
3372 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
3373 n => continue,
3374 };
3375 return Some(Ok(res));
3376 }
3377 Some(Err(ErrorContext::new(
3378 "HookDevAttrs",
3379 r#type.and_then(|t| HookDevAttrs::attr_from_type(t)),
3380 self.orig_loc,
3381 self.buf.as_ptr().wrapping_add(pos) as usize,
3382 )))
3383 }
3384}
3385impl<'a> std::fmt::Debug for IterableHookDevAttrs<'_> {
3386 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3387 let mut fmt = f.debug_struct("HookDevAttrs");
3388 for attr in self.clone() {
3389 let attr = match attr {
3390 Ok(a) => a,
3391 Err(err) => {
3392 fmt.finish()?;
3393 f.write_str("Err(")?;
3394 err.fmt(f)?;
3395 return f.write_str(")");
3396 }
3397 };
3398 match attr {
3399 HookDevAttrs::Name(val) => fmt.field("Name", &val),
3400 };
3401 }
3402 fmt.finish()
3403 }
3404}
3405impl IterableHookDevAttrs<'_> {
3406 pub fn lookup_attr(
3407 &self,
3408 offset: usize,
3409 missing_type: Option<u16>,
3410 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
3411 let mut stack = Vec::new();
3412 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
3413 if missing_type.is_some() && cur == offset {
3414 stack.push(("HookDevAttrs", offset));
3415 return (
3416 stack,
3417 missing_type.and_then(|t| HookDevAttrs::attr_from_type(t)),
3418 );
3419 }
3420 if cur > offset || cur + self.buf.len() < offset {
3421 return (stack, None);
3422 }
3423 let mut attrs = self.clone();
3424 let mut last_off = cur + attrs.pos;
3425 while let Some(attr) = attrs.next() {
3426 let Ok(attr) = attr else { break };
3427 match attr {
3428 HookDevAttrs::Name(val) => {
3429 if last_off == offset {
3430 stack.push(("Name", last_off));
3431 break;
3432 }
3433 }
3434 _ => {}
3435 };
3436 last_off = cur + attrs.pos;
3437 }
3438 if !stack.is_empty() {
3439 stack.push(("HookDevAttrs", cur));
3440 }
3441 (stack, None)
3442 }
3443}
3444#[derive(Clone)]
3445pub enum NftCounterAttrs {
3446 Bytes(u64),
3447 Packets(u64),
3448}
3449impl<'a> IterableNftCounterAttrs<'a> {
3450 pub fn get_bytes(&self) -> Result<u64, ErrorContext> {
3451 let mut iter = self.clone();
3452 iter.pos = 0;
3453 for attr in iter {
3454 if let Ok(NftCounterAttrs::Bytes(val)) = attr {
3455 return Ok(val);
3456 }
3457 }
3458 Err(ErrorContext::new_missing(
3459 "NftCounterAttrs",
3460 "Bytes",
3461 self.orig_loc,
3462 self.buf.as_ptr() as usize,
3463 ))
3464 }
3465 pub fn get_packets(&self) -> Result<u64, ErrorContext> {
3466 let mut iter = self.clone();
3467 iter.pos = 0;
3468 for attr in iter {
3469 if let Ok(NftCounterAttrs::Packets(val)) = attr {
3470 return Ok(val);
3471 }
3472 }
3473 Err(ErrorContext::new_missing(
3474 "NftCounterAttrs",
3475 "Packets",
3476 self.orig_loc,
3477 self.buf.as_ptr() as usize,
3478 ))
3479 }
3480}
3481impl NftCounterAttrs {
3482 pub fn new<'a>(buf: &'a [u8]) -> IterableNftCounterAttrs<'a> {
3483 IterableNftCounterAttrs::with_loc(buf, buf.as_ptr() as usize)
3484 }
3485 fn attr_from_type(r#type: u16) -> Option<&'static str> {
3486 let res = match r#type {
3487 1u16 => "Bytes",
3488 2u16 => "Packets",
3489 _ => return None,
3490 };
3491 Some(res)
3492 }
3493}
3494#[derive(Clone, Copy, Default)]
3495pub struct IterableNftCounterAttrs<'a> {
3496 buf: &'a [u8],
3497 pos: usize,
3498 orig_loc: usize,
3499}
3500impl<'a> IterableNftCounterAttrs<'a> {
3501 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
3502 Self {
3503 buf,
3504 pos: 0,
3505 orig_loc,
3506 }
3507 }
3508 pub fn get_buf(&self) -> &'a [u8] {
3509 self.buf
3510 }
3511}
3512impl<'a> Iterator for IterableNftCounterAttrs<'a> {
3513 type Item = Result<NftCounterAttrs, ErrorContext>;
3514 fn next(&mut self) -> Option<Self::Item> {
3515 let mut pos;
3516 let mut r#type;
3517 loop {
3518 pos = self.pos;
3519 r#type = None;
3520 if self.buf.len() == self.pos {
3521 return None;
3522 }
3523 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
3524 self.pos = self.buf.len();
3525 break;
3526 };
3527 r#type = Some(header.r#type);
3528 let res = match header.r#type {
3529 1u16 => NftCounterAttrs::Bytes({
3530 let res = parse_be_u64(next);
3531 let Some(val) = res else { break };
3532 val
3533 }),
3534 2u16 => NftCounterAttrs::Packets({
3535 let res = parse_be_u64(next);
3536 let Some(val) = res else { break };
3537 val
3538 }),
3539 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
3540 n => continue,
3541 };
3542 return Some(Ok(res));
3543 }
3544 Some(Err(ErrorContext::new(
3545 "NftCounterAttrs",
3546 r#type.and_then(|t| NftCounterAttrs::attr_from_type(t)),
3547 self.orig_loc,
3548 self.buf.as_ptr().wrapping_add(pos) as usize,
3549 )))
3550 }
3551}
3552impl std::fmt::Debug for IterableNftCounterAttrs<'_> {
3553 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3554 let mut fmt = f.debug_struct("NftCounterAttrs");
3555 for attr in self.clone() {
3556 let attr = match attr {
3557 Ok(a) => a,
3558 Err(err) => {
3559 fmt.finish()?;
3560 f.write_str("Err(")?;
3561 err.fmt(f)?;
3562 return f.write_str(")");
3563 }
3564 };
3565 match attr {
3566 NftCounterAttrs::Bytes(val) => fmt.field("Bytes", &val),
3567 NftCounterAttrs::Packets(val) => fmt.field("Packets", &val),
3568 };
3569 }
3570 fmt.finish()
3571 }
3572}
3573impl IterableNftCounterAttrs<'_> {
3574 pub fn lookup_attr(
3575 &self,
3576 offset: usize,
3577 missing_type: Option<u16>,
3578 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
3579 let mut stack = Vec::new();
3580 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
3581 if missing_type.is_some() && cur == offset {
3582 stack.push(("NftCounterAttrs", offset));
3583 return (
3584 stack,
3585 missing_type.and_then(|t| NftCounterAttrs::attr_from_type(t)),
3586 );
3587 }
3588 if cur > offset || cur + self.buf.len() < offset {
3589 return (stack, None);
3590 }
3591 let mut attrs = self.clone();
3592 let mut last_off = cur + attrs.pos;
3593 while let Some(attr) = attrs.next() {
3594 let Ok(attr) = attr else { break };
3595 match attr {
3596 NftCounterAttrs::Bytes(val) => {
3597 if last_off == offset {
3598 stack.push(("Bytes", last_off));
3599 break;
3600 }
3601 }
3602 NftCounterAttrs::Packets(val) => {
3603 if last_off == offset {
3604 stack.push(("Packets", last_off));
3605 break;
3606 }
3607 }
3608 _ => {}
3609 };
3610 last_off = cur + attrs.pos;
3611 }
3612 if !stack.is_empty() {
3613 stack.push(("NftCounterAttrs", cur));
3614 }
3615 (stack, None)
3616 }
3617}
3618#[derive(Clone)]
3619pub enum RuleAttrs<'a> {
3620 #[doc = "name of the table containing the rule\n"]
3621 Table(&'a CStr),
3622 #[doc = "name of the chain containing the rule\n"]
3623 Chain(&'a CStr),
3624 #[doc = "numeric handle of the rule\n"]
3625 Handle(u64),
3626 #[doc = "list of expressions\n"]
3627 Expressions(IterableExprListAttrs<'a>),
3628 #[doc = "compatibility specifications of the rule\n"]
3629 Compat(IterableRuleCompatAttrs<'a>),
3630 #[doc = "numeric handle of the previous rule\n"]
3631 Position(u64),
3632 #[doc = "user data\n"]
3633 Userdata(&'a [u8]),
3634 #[doc = "uniquely identifies a rule in a transaction\n"]
3635 Id(u32),
3636 #[doc = "transaction unique identifier of the previous rule\n"]
3637 PositionId(u32),
3638 #[doc = "add the rule to chain by ID, alternative to chain name\n"]
3639 ChainId(u32),
3640}
3641impl<'a> IterableRuleAttrs<'a> {
3642 #[doc = "name of the table containing the rule\n"]
3643 pub fn get_table(&self) -> Result<&'a CStr, ErrorContext> {
3644 let mut iter = self.clone();
3645 iter.pos = 0;
3646 for attr in iter {
3647 if let Ok(RuleAttrs::Table(val)) = attr {
3648 return Ok(val);
3649 }
3650 }
3651 Err(ErrorContext::new_missing(
3652 "RuleAttrs",
3653 "Table",
3654 self.orig_loc,
3655 self.buf.as_ptr() as usize,
3656 ))
3657 }
3658 #[doc = "name of the chain containing the rule\n"]
3659 pub fn get_chain(&self) -> Result<&'a CStr, ErrorContext> {
3660 let mut iter = self.clone();
3661 iter.pos = 0;
3662 for attr in iter {
3663 if let Ok(RuleAttrs::Chain(val)) = attr {
3664 return Ok(val);
3665 }
3666 }
3667 Err(ErrorContext::new_missing(
3668 "RuleAttrs",
3669 "Chain",
3670 self.orig_loc,
3671 self.buf.as_ptr() as usize,
3672 ))
3673 }
3674 #[doc = "numeric handle of the rule\n"]
3675 pub fn get_handle(&self) -> Result<u64, ErrorContext> {
3676 let mut iter = self.clone();
3677 iter.pos = 0;
3678 for attr in iter {
3679 if let Ok(RuleAttrs::Handle(val)) = attr {
3680 return Ok(val);
3681 }
3682 }
3683 Err(ErrorContext::new_missing(
3684 "RuleAttrs",
3685 "Handle",
3686 self.orig_loc,
3687 self.buf.as_ptr() as usize,
3688 ))
3689 }
3690 #[doc = "list of expressions\n"]
3691 pub fn get_expressions(&self) -> Result<IterableExprListAttrs<'a>, ErrorContext> {
3692 let mut iter = self.clone();
3693 iter.pos = 0;
3694 for attr in iter {
3695 if let Ok(RuleAttrs::Expressions(val)) = attr {
3696 return Ok(val);
3697 }
3698 }
3699 Err(ErrorContext::new_missing(
3700 "RuleAttrs",
3701 "Expressions",
3702 self.orig_loc,
3703 self.buf.as_ptr() as usize,
3704 ))
3705 }
3706 #[doc = "compatibility specifications of the rule\n"]
3707 pub fn get_compat(&self) -> Result<IterableRuleCompatAttrs<'a>, ErrorContext> {
3708 let mut iter = self.clone();
3709 iter.pos = 0;
3710 for attr in iter {
3711 if let Ok(RuleAttrs::Compat(val)) = attr {
3712 return Ok(val);
3713 }
3714 }
3715 Err(ErrorContext::new_missing(
3716 "RuleAttrs",
3717 "Compat",
3718 self.orig_loc,
3719 self.buf.as_ptr() as usize,
3720 ))
3721 }
3722 #[doc = "numeric handle of the previous rule\n"]
3723 pub fn get_position(&self) -> Result<u64, ErrorContext> {
3724 let mut iter = self.clone();
3725 iter.pos = 0;
3726 for attr in iter {
3727 if let Ok(RuleAttrs::Position(val)) = attr {
3728 return Ok(val);
3729 }
3730 }
3731 Err(ErrorContext::new_missing(
3732 "RuleAttrs",
3733 "Position",
3734 self.orig_loc,
3735 self.buf.as_ptr() as usize,
3736 ))
3737 }
3738 #[doc = "user data\n"]
3739 pub fn get_userdata(&self) -> Result<&'a [u8], ErrorContext> {
3740 let mut iter = self.clone();
3741 iter.pos = 0;
3742 for attr in iter {
3743 if let Ok(RuleAttrs::Userdata(val)) = attr {
3744 return Ok(val);
3745 }
3746 }
3747 Err(ErrorContext::new_missing(
3748 "RuleAttrs",
3749 "Userdata",
3750 self.orig_loc,
3751 self.buf.as_ptr() as usize,
3752 ))
3753 }
3754 #[doc = "uniquely identifies a rule in a transaction\n"]
3755 pub fn get_id(&self) -> Result<u32, ErrorContext> {
3756 let mut iter = self.clone();
3757 iter.pos = 0;
3758 for attr in iter {
3759 if let Ok(RuleAttrs::Id(val)) = attr {
3760 return Ok(val);
3761 }
3762 }
3763 Err(ErrorContext::new_missing(
3764 "RuleAttrs",
3765 "Id",
3766 self.orig_loc,
3767 self.buf.as_ptr() as usize,
3768 ))
3769 }
3770 #[doc = "transaction unique identifier of the previous rule\n"]
3771 pub fn get_position_id(&self) -> Result<u32, ErrorContext> {
3772 let mut iter = self.clone();
3773 iter.pos = 0;
3774 for attr in iter {
3775 if let Ok(RuleAttrs::PositionId(val)) = attr {
3776 return Ok(val);
3777 }
3778 }
3779 Err(ErrorContext::new_missing(
3780 "RuleAttrs",
3781 "PositionId",
3782 self.orig_loc,
3783 self.buf.as_ptr() as usize,
3784 ))
3785 }
3786 #[doc = "add the rule to chain by ID, alternative to chain name\n"]
3787 pub fn get_chain_id(&self) -> Result<u32, ErrorContext> {
3788 let mut iter = self.clone();
3789 iter.pos = 0;
3790 for attr in iter {
3791 if let Ok(RuleAttrs::ChainId(val)) = attr {
3792 return Ok(val);
3793 }
3794 }
3795 Err(ErrorContext::new_missing(
3796 "RuleAttrs",
3797 "ChainId",
3798 self.orig_loc,
3799 self.buf.as_ptr() as usize,
3800 ))
3801 }
3802}
3803impl RuleAttrs<'_> {
3804 pub fn new<'a>(buf: &'a [u8]) -> IterableRuleAttrs<'a> {
3805 IterableRuleAttrs::with_loc(buf, buf.as_ptr() as usize)
3806 }
3807 fn attr_from_type(r#type: u16) -> Option<&'static str> {
3808 let res = match r#type {
3809 1u16 => "Table",
3810 2u16 => "Chain",
3811 3u16 => "Handle",
3812 4u16 => "Expressions",
3813 5u16 => "Compat",
3814 6u16 => "Position",
3815 7u16 => "Userdata",
3816 8u16 => "Id",
3817 9u16 => "PositionId",
3818 10u16 => "ChainId",
3819 _ => return None,
3820 };
3821 Some(res)
3822 }
3823}
3824#[derive(Clone, Copy, Default)]
3825pub struct IterableRuleAttrs<'a> {
3826 buf: &'a [u8],
3827 pos: usize,
3828 orig_loc: usize,
3829}
3830impl<'a> IterableRuleAttrs<'a> {
3831 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
3832 Self {
3833 buf,
3834 pos: 0,
3835 orig_loc,
3836 }
3837 }
3838 pub fn get_buf(&self) -> &'a [u8] {
3839 self.buf
3840 }
3841}
3842impl<'a> Iterator for IterableRuleAttrs<'a> {
3843 type Item = Result<RuleAttrs<'a>, ErrorContext>;
3844 fn next(&mut self) -> Option<Self::Item> {
3845 let mut pos;
3846 let mut r#type;
3847 loop {
3848 pos = self.pos;
3849 r#type = None;
3850 if self.buf.len() == self.pos {
3851 return None;
3852 }
3853 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
3854 self.pos = self.buf.len();
3855 break;
3856 };
3857 r#type = Some(header.r#type);
3858 let res = match header.r#type {
3859 1u16 => RuleAttrs::Table({
3860 let res = CStr::from_bytes_with_nul(next).ok();
3861 let Some(val) = res else { break };
3862 val
3863 }),
3864 2u16 => RuleAttrs::Chain({
3865 let res = CStr::from_bytes_with_nul(next).ok();
3866 let Some(val) = res else { break };
3867 val
3868 }),
3869 3u16 => RuleAttrs::Handle({
3870 let res = parse_be_u64(next);
3871 let Some(val) = res else { break };
3872 val
3873 }),
3874 4u16 => RuleAttrs::Expressions({
3875 let res = Some(IterableExprListAttrs::with_loc(next, self.orig_loc));
3876 let Some(val) = res else { break };
3877 val
3878 }),
3879 5u16 => RuleAttrs::Compat({
3880 let res = Some(IterableRuleCompatAttrs::with_loc(next, self.orig_loc));
3881 let Some(val) = res else { break };
3882 val
3883 }),
3884 6u16 => RuleAttrs::Position({
3885 let res = parse_be_u64(next);
3886 let Some(val) = res else { break };
3887 val
3888 }),
3889 7u16 => RuleAttrs::Userdata({
3890 let res = Some(next);
3891 let Some(val) = res else { break };
3892 val
3893 }),
3894 8u16 => RuleAttrs::Id({
3895 let res = parse_u32(next);
3896 let Some(val) = res else { break };
3897 val
3898 }),
3899 9u16 => RuleAttrs::PositionId({
3900 let res = parse_u32(next);
3901 let Some(val) = res else { break };
3902 val
3903 }),
3904 10u16 => RuleAttrs::ChainId({
3905 let res = parse_u32(next);
3906 let Some(val) = res else { break };
3907 val
3908 }),
3909 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
3910 n => continue,
3911 };
3912 return Some(Ok(res));
3913 }
3914 Some(Err(ErrorContext::new(
3915 "RuleAttrs",
3916 r#type.and_then(|t| RuleAttrs::attr_from_type(t)),
3917 self.orig_loc,
3918 self.buf.as_ptr().wrapping_add(pos) as usize,
3919 )))
3920 }
3921}
3922impl<'a> std::fmt::Debug for IterableRuleAttrs<'_> {
3923 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3924 let mut fmt = f.debug_struct("RuleAttrs");
3925 for attr in self.clone() {
3926 let attr = match attr {
3927 Ok(a) => a,
3928 Err(err) => {
3929 fmt.finish()?;
3930 f.write_str("Err(")?;
3931 err.fmt(f)?;
3932 return f.write_str(")");
3933 }
3934 };
3935 match attr {
3936 RuleAttrs::Table(val) => fmt.field("Table", &val),
3937 RuleAttrs::Chain(val) => fmt.field("Chain", &val),
3938 RuleAttrs::Handle(val) => fmt.field("Handle", &val),
3939 RuleAttrs::Expressions(val) => fmt.field("Expressions", &val),
3940 RuleAttrs::Compat(val) => fmt.field("Compat", &val),
3941 RuleAttrs::Position(val) => fmt.field("Position", &val),
3942 RuleAttrs::Userdata(val) => fmt.field("Userdata", &val),
3943 RuleAttrs::Id(val) => fmt.field("Id", &val),
3944 RuleAttrs::PositionId(val) => fmt.field("PositionId", &val),
3945 RuleAttrs::ChainId(val) => fmt.field("ChainId", &val),
3946 };
3947 }
3948 fmt.finish()
3949 }
3950}
3951impl IterableRuleAttrs<'_> {
3952 pub fn lookup_attr(
3953 &self,
3954 offset: usize,
3955 missing_type: Option<u16>,
3956 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
3957 let mut stack = Vec::new();
3958 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
3959 if missing_type.is_some() && cur == offset {
3960 stack.push(("RuleAttrs", offset));
3961 return (
3962 stack,
3963 missing_type.and_then(|t| RuleAttrs::attr_from_type(t)),
3964 );
3965 }
3966 if cur > offset || cur + self.buf.len() < offset {
3967 return (stack, None);
3968 }
3969 let mut attrs = self.clone();
3970 let mut last_off = cur + attrs.pos;
3971 let mut missing = None;
3972 while let Some(attr) = attrs.next() {
3973 let Ok(attr) = attr else { break };
3974 match attr {
3975 RuleAttrs::Table(val) => {
3976 if last_off == offset {
3977 stack.push(("Table", last_off));
3978 break;
3979 }
3980 }
3981 RuleAttrs::Chain(val) => {
3982 if last_off == offset {
3983 stack.push(("Chain", last_off));
3984 break;
3985 }
3986 }
3987 RuleAttrs::Handle(val) => {
3988 if last_off == offset {
3989 stack.push(("Handle", last_off));
3990 break;
3991 }
3992 }
3993 RuleAttrs::Expressions(val) => {
3994 (stack, missing) = val.lookup_attr(offset, missing_type);
3995 if !stack.is_empty() {
3996 break;
3997 }
3998 }
3999 RuleAttrs::Compat(val) => {
4000 (stack, missing) = val.lookup_attr(offset, missing_type);
4001 if !stack.is_empty() {
4002 break;
4003 }
4004 }
4005 RuleAttrs::Position(val) => {
4006 if last_off == offset {
4007 stack.push(("Position", last_off));
4008 break;
4009 }
4010 }
4011 RuleAttrs::Userdata(val) => {
4012 if last_off == offset {
4013 stack.push(("Userdata", last_off));
4014 break;
4015 }
4016 }
4017 RuleAttrs::Id(val) => {
4018 if last_off == offset {
4019 stack.push(("Id", last_off));
4020 break;
4021 }
4022 }
4023 RuleAttrs::PositionId(val) => {
4024 if last_off == offset {
4025 stack.push(("PositionId", last_off));
4026 break;
4027 }
4028 }
4029 RuleAttrs::ChainId(val) => {
4030 if last_off == offset {
4031 stack.push(("ChainId", last_off));
4032 break;
4033 }
4034 }
4035 _ => {}
4036 };
4037 last_off = cur + attrs.pos;
4038 }
4039 if !stack.is_empty() {
4040 stack.push(("RuleAttrs", cur));
4041 }
4042 (stack, missing)
4043 }
4044}
4045#[derive(Clone)]
4046pub enum ExprListAttrs<'a> {
4047 #[doc = "Attribute may repeat multiple times (treat it as array)"]
4048 Elem(IterableExprAttrs<'a>),
4049}
4050impl<'a> IterableExprListAttrs<'a> {
4051 #[doc = "Attribute may repeat multiple times (treat it as array)"]
4052 pub fn get_elem(&self) -> MultiAttrIterable<Self, ExprListAttrs<'a>, IterableExprAttrs<'a>> {
4053 MultiAttrIterable::new(self.clone(), |variant| {
4054 if let ExprListAttrs::Elem(val) = variant {
4055 Some(val)
4056 } else {
4057 None
4058 }
4059 })
4060 }
4061}
4062impl ExprListAttrs<'_> {
4063 pub fn new<'a>(buf: &'a [u8]) -> IterableExprListAttrs<'a> {
4064 IterableExprListAttrs::with_loc(buf, buf.as_ptr() as usize)
4065 }
4066 fn attr_from_type(r#type: u16) -> Option<&'static str> {
4067 let res = match r#type {
4068 1u16 => "Elem",
4069 _ => return None,
4070 };
4071 Some(res)
4072 }
4073}
4074#[derive(Clone, Copy, Default)]
4075pub struct IterableExprListAttrs<'a> {
4076 buf: &'a [u8],
4077 pos: usize,
4078 orig_loc: usize,
4079}
4080impl<'a> IterableExprListAttrs<'a> {
4081 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4082 Self {
4083 buf,
4084 pos: 0,
4085 orig_loc,
4086 }
4087 }
4088 pub fn get_buf(&self) -> &'a [u8] {
4089 self.buf
4090 }
4091}
4092impl<'a> Iterator for IterableExprListAttrs<'a> {
4093 type Item = Result<ExprListAttrs<'a>, ErrorContext>;
4094 fn next(&mut self) -> Option<Self::Item> {
4095 let mut pos;
4096 let mut r#type;
4097 loop {
4098 pos = self.pos;
4099 r#type = None;
4100 if self.buf.len() == self.pos {
4101 return None;
4102 }
4103 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4104 self.pos = self.buf.len();
4105 break;
4106 };
4107 r#type = Some(header.r#type);
4108 let res = match header.r#type {
4109 1u16 => ExprListAttrs::Elem({
4110 let res = Some(IterableExprAttrs::with_loc(next, self.orig_loc));
4111 let Some(val) = res else { break };
4112 val
4113 }),
4114 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4115 n => continue,
4116 };
4117 return Some(Ok(res));
4118 }
4119 Some(Err(ErrorContext::new(
4120 "ExprListAttrs",
4121 r#type.and_then(|t| ExprListAttrs::attr_from_type(t)),
4122 self.orig_loc,
4123 self.buf.as_ptr().wrapping_add(pos) as usize,
4124 )))
4125 }
4126}
4127impl<'a> std::fmt::Debug for IterableExprListAttrs<'_> {
4128 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4129 let mut fmt = f.debug_struct("ExprListAttrs");
4130 for attr in self.clone() {
4131 let attr = match attr {
4132 Ok(a) => a,
4133 Err(err) => {
4134 fmt.finish()?;
4135 f.write_str("Err(")?;
4136 err.fmt(f)?;
4137 return f.write_str(")");
4138 }
4139 };
4140 match attr {
4141 ExprListAttrs::Elem(val) => fmt.field("Elem", &val),
4142 };
4143 }
4144 fmt.finish()
4145 }
4146}
4147impl IterableExprListAttrs<'_> {
4148 pub fn lookup_attr(
4149 &self,
4150 offset: usize,
4151 missing_type: Option<u16>,
4152 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4153 let mut stack = Vec::new();
4154 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4155 if missing_type.is_some() && cur == offset {
4156 stack.push(("ExprListAttrs", offset));
4157 return (
4158 stack,
4159 missing_type.and_then(|t| ExprListAttrs::attr_from_type(t)),
4160 );
4161 }
4162 if cur > offset || cur + self.buf.len() < offset {
4163 return (stack, None);
4164 }
4165 let mut attrs = self.clone();
4166 let mut last_off = cur + attrs.pos;
4167 let mut missing = None;
4168 while let Some(attr) = attrs.next() {
4169 let Ok(attr) = attr else { break };
4170 match attr {
4171 ExprListAttrs::Elem(val) => {
4172 (stack, missing) = val.lookup_attr(offset, missing_type);
4173 if !stack.is_empty() {
4174 break;
4175 }
4176 }
4177 _ => {}
4178 };
4179 last_off = cur + attrs.pos;
4180 }
4181 if !stack.is_empty() {
4182 stack.push(("ExprListAttrs", cur));
4183 }
4184 (stack, missing)
4185 }
4186}
4187#[derive(Clone)]
4188pub enum ExprAttrs<'a> {
4189 #[doc = "name of the expression type\n"]
4190 Name(&'a CStr),
4191 #[doc = "type specific data\n"]
4192 Data(ExprOps<'a>),
4193}
4194impl<'a> IterableExprAttrs<'a> {
4195 #[doc = "name of the expression type\n"]
4196 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
4197 let mut iter = self.clone();
4198 iter.pos = 0;
4199 for attr in iter {
4200 if let Ok(ExprAttrs::Name(val)) = attr {
4201 return Ok(val);
4202 }
4203 }
4204 Err(ErrorContext::new_missing(
4205 "ExprAttrs",
4206 "Name",
4207 self.orig_loc,
4208 self.buf.as_ptr() as usize,
4209 ))
4210 }
4211 #[doc = "type specific data\n"]
4212 pub fn get_data(&self) -> Result<ExprOps<'a>, ErrorContext> {
4213 let mut iter = self.clone();
4214 iter.pos = 0;
4215 for attr in iter {
4216 if let Ok(ExprAttrs::Data(val)) = attr {
4217 return Ok(val);
4218 }
4219 }
4220 Err(ErrorContext::new_missing(
4221 "ExprAttrs",
4222 "Data",
4223 self.orig_loc,
4224 self.buf.as_ptr() as usize,
4225 ))
4226 }
4227}
4228#[derive(Debug, Clone)]
4229pub enum ExprOps<'a> {
4230 Bitwise(IterableExprBitwiseAttrs<'a>),
4231 Cmp(IterableExprCmpAttrs<'a>),
4232 Counter(IterableExprCounterAttrs<'a>),
4233 Ct(IterableExprCtAttrs<'a>),
4234 Fib(IterableExprFibAttrs<'a>),
4235 FlowOffload(IterableExprFlowOffloadAttrs<'a>),
4236 Immediate(IterableExprImmediateAttrs<'a>),
4237 Log(IterableLogAttrs<'a>),
4238 Lookup(IterableExprLookupAttrs<'a>),
4239 Match(IterableCompatMatchAttrs<'a>),
4240 Meta(IterableExprMetaAttrs<'a>),
4241 Nat(IterableExprNatAttrs<'a>),
4242 Numgen(IterableNumgenAttrs<'a>),
4243 Objref(IterableExprObjrefAttrs<'a>),
4244 Payload(IterableExprPayloadAttrs<'a>),
4245 Quota(IterableQuotaAttrs<'a>),
4246 Range(IterableRangeAttrs<'a>),
4247 Reject(IterableExprRejectAttrs<'a>),
4248 Target(IterableExprTargetAttrs<'a>),
4249 Tproxy(IterableExprTproxyAttrs<'a>),
4250}
4251impl<'a> ExprOps<'a> {
4252 fn select_with_loc(selector: &'a CStr, buf: &'a [u8], loc: usize) -> Option<Self> {
4253 match selector.to_bytes() {
4254 b"bitwise" => Some(ExprOps::Bitwise(IterableExprBitwiseAttrs::with_loc(
4255 buf, loc,
4256 ))),
4257 b"cmp" => Some(ExprOps::Cmp(IterableExprCmpAttrs::with_loc(buf, loc))),
4258 b"counter" => Some(ExprOps::Counter(IterableExprCounterAttrs::with_loc(
4259 buf, loc,
4260 ))),
4261 b"ct" => Some(ExprOps::Ct(IterableExprCtAttrs::with_loc(buf, loc))),
4262 b"fib" => Some(ExprOps::Fib(IterableExprFibAttrs::with_loc(buf, loc))),
4263 b"flow_offload" => Some(ExprOps::FlowOffload(
4264 IterableExprFlowOffloadAttrs::with_loc(buf, loc),
4265 )),
4266 b"immediate" => Some(ExprOps::Immediate(IterableExprImmediateAttrs::with_loc(
4267 buf, loc,
4268 ))),
4269 b"log" => Some(ExprOps::Log(IterableLogAttrs::with_loc(buf, loc))),
4270 b"lookup" => Some(ExprOps::Lookup(IterableExprLookupAttrs::with_loc(buf, loc))),
4271 b"match" => Some(ExprOps::Match(IterableCompatMatchAttrs::with_loc(buf, loc))),
4272 b"meta" => Some(ExprOps::Meta(IterableExprMetaAttrs::with_loc(buf, loc))),
4273 b"nat" => Some(ExprOps::Nat(IterableExprNatAttrs::with_loc(buf, loc))),
4274 b"numgen" => Some(ExprOps::Numgen(IterableNumgenAttrs::with_loc(buf, loc))),
4275 b"objref" => Some(ExprOps::Objref(IterableExprObjrefAttrs::with_loc(buf, loc))),
4276 b"payload" => Some(ExprOps::Payload(IterableExprPayloadAttrs::with_loc(
4277 buf, loc,
4278 ))),
4279 b"quota" => Some(ExprOps::Quota(IterableQuotaAttrs::with_loc(buf, loc))),
4280 b"range" => Some(ExprOps::Range(IterableRangeAttrs::with_loc(buf, loc))),
4281 b"reject" => Some(ExprOps::Reject(IterableExprRejectAttrs::with_loc(buf, loc))),
4282 b"target" => Some(ExprOps::Target(IterableExprTargetAttrs::with_loc(buf, loc))),
4283 b"tproxy" => Some(ExprOps::Tproxy(IterableExprTproxyAttrs::with_loc(buf, loc))),
4284 _ => None,
4285 }
4286 }
4287}
4288impl ExprAttrs<'_> {
4289 pub fn new<'a>(buf: &'a [u8]) -> IterableExprAttrs<'a> {
4290 IterableExprAttrs::with_loc(buf, buf.as_ptr() as usize)
4291 }
4292 fn attr_from_type(r#type: u16) -> Option<&'static str> {
4293 let res = match r#type {
4294 1u16 => "Name",
4295 2u16 => "Data",
4296 _ => return None,
4297 };
4298 Some(res)
4299 }
4300}
4301#[derive(Clone, Copy, Default)]
4302pub struct IterableExprAttrs<'a> {
4303 buf: &'a [u8],
4304 pos: usize,
4305 orig_loc: usize,
4306}
4307impl<'a> IterableExprAttrs<'a> {
4308 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4309 Self {
4310 buf,
4311 pos: 0,
4312 orig_loc,
4313 }
4314 }
4315 pub fn get_buf(&self) -> &'a [u8] {
4316 self.buf
4317 }
4318}
4319impl<'a> Iterator for IterableExprAttrs<'a> {
4320 type Item = Result<ExprAttrs<'a>, ErrorContext>;
4321 fn next(&mut self) -> Option<Self::Item> {
4322 let mut pos;
4323 let mut r#type;
4324 loop {
4325 pos = self.pos;
4326 r#type = None;
4327 if self.buf.len() == self.pos {
4328 return None;
4329 }
4330 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4331 self.pos = self.buf.len();
4332 break;
4333 };
4334 r#type = Some(header.r#type);
4335 let res = match header.r#type {
4336 1u16 => ExprAttrs::Name({
4337 let res = CStr::from_bytes_with_nul(next).ok();
4338 let Some(val) = res else { break };
4339 val
4340 }),
4341 2u16 => ExprAttrs::Data({
4342 let res = {
4343 let Ok(selector) = self.get_name() else { break };
4344 match ExprOps::select_with_loc(selector, next, self.orig_loc) {
4345 Some(sub) => Some(sub),
4346 None if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4347 None => continue,
4348 }
4349 };
4350 let Some(val) = res else { break };
4351 val
4352 }),
4353 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4354 n => continue,
4355 };
4356 return Some(Ok(res));
4357 }
4358 Some(Err(ErrorContext::new(
4359 "ExprAttrs",
4360 r#type.and_then(|t| ExprAttrs::attr_from_type(t)),
4361 self.orig_loc,
4362 self.buf.as_ptr().wrapping_add(pos) as usize,
4363 )))
4364 }
4365}
4366impl<'a> std::fmt::Debug for IterableExprAttrs<'_> {
4367 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4368 let mut fmt = f.debug_struct("ExprAttrs");
4369 for attr in self.clone() {
4370 let attr = match attr {
4371 Ok(a) => a,
4372 Err(err) => {
4373 fmt.finish()?;
4374 f.write_str("Err(")?;
4375 err.fmt(f)?;
4376 return f.write_str(")");
4377 }
4378 };
4379 match attr {
4380 ExprAttrs::Name(val) => fmt.field("Name", &val),
4381 ExprAttrs::Data(val) => fmt.field("Data", &val),
4382 };
4383 }
4384 fmt.finish()
4385 }
4386}
4387impl IterableExprAttrs<'_> {
4388 pub fn lookup_attr(
4389 &self,
4390 offset: usize,
4391 missing_type: Option<u16>,
4392 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4393 let mut stack = Vec::new();
4394 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4395 if missing_type.is_some() && cur == offset {
4396 stack.push(("ExprAttrs", offset));
4397 return (
4398 stack,
4399 missing_type.and_then(|t| ExprAttrs::attr_from_type(t)),
4400 );
4401 }
4402 if cur > offset || cur + self.buf.len() < offset {
4403 return (stack, None);
4404 }
4405 let mut attrs = self.clone();
4406 let mut last_off = cur + attrs.pos;
4407 while let Some(attr) = attrs.next() {
4408 let Ok(attr) = attr else { break };
4409 match attr {
4410 ExprAttrs::Name(val) => {
4411 if last_off == offset {
4412 stack.push(("Name", last_off));
4413 break;
4414 }
4415 }
4416 ExprAttrs::Data(val) => {
4417 if last_off == offset {
4418 stack.push(("Data", last_off));
4419 break;
4420 }
4421 }
4422 _ => {}
4423 };
4424 last_off = cur + attrs.pos;
4425 }
4426 if !stack.is_empty() {
4427 stack.push(("ExprAttrs", cur));
4428 }
4429 (stack, None)
4430 }
4431}
4432#[derive(Clone)]
4433pub enum RuleCompatAttrs {
4434 #[doc = "numeric value of the handled protocol\n"]
4435 Proto(u32),
4436 #[doc = "bitmask of flags\n"]
4437 Flags(u32),
4438}
4439impl<'a> IterableRuleCompatAttrs<'a> {
4440 #[doc = "numeric value of the handled protocol\n"]
4441 pub fn get_proto(&self) -> Result<u32, ErrorContext> {
4442 let mut iter = self.clone();
4443 iter.pos = 0;
4444 for attr in iter {
4445 if let Ok(RuleCompatAttrs::Proto(val)) = attr {
4446 return Ok(val);
4447 }
4448 }
4449 Err(ErrorContext::new_missing(
4450 "RuleCompatAttrs",
4451 "Proto",
4452 self.orig_loc,
4453 self.buf.as_ptr() as usize,
4454 ))
4455 }
4456 #[doc = "bitmask of flags\n"]
4457 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
4458 let mut iter = self.clone();
4459 iter.pos = 0;
4460 for attr in iter {
4461 if let Ok(RuleCompatAttrs::Flags(val)) = attr {
4462 return Ok(val);
4463 }
4464 }
4465 Err(ErrorContext::new_missing(
4466 "RuleCompatAttrs",
4467 "Flags",
4468 self.orig_loc,
4469 self.buf.as_ptr() as usize,
4470 ))
4471 }
4472}
4473impl RuleCompatAttrs {
4474 pub fn new<'a>(buf: &'a [u8]) -> IterableRuleCompatAttrs<'a> {
4475 IterableRuleCompatAttrs::with_loc(buf, buf.as_ptr() as usize)
4476 }
4477 fn attr_from_type(r#type: u16) -> Option<&'static str> {
4478 let res = match r#type {
4479 1u16 => "Proto",
4480 2u16 => "Flags",
4481 _ => return None,
4482 };
4483 Some(res)
4484 }
4485}
4486#[derive(Clone, Copy, Default)]
4487pub struct IterableRuleCompatAttrs<'a> {
4488 buf: &'a [u8],
4489 pos: usize,
4490 orig_loc: usize,
4491}
4492impl<'a> IterableRuleCompatAttrs<'a> {
4493 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4494 Self {
4495 buf,
4496 pos: 0,
4497 orig_loc,
4498 }
4499 }
4500 pub fn get_buf(&self) -> &'a [u8] {
4501 self.buf
4502 }
4503}
4504impl<'a> Iterator for IterableRuleCompatAttrs<'a> {
4505 type Item = Result<RuleCompatAttrs, ErrorContext>;
4506 fn next(&mut self) -> Option<Self::Item> {
4507 let mut pos;
4508 let mut r#type;
4509 loop {
4510 pos = self.pos;
4511 r#type = None;
4512 if self.buf.len() == self.pos {
4513 return None;
4514 }
4515 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4516 self.pos = self.buf.len();
4517 break;
4518 };
4519 r#type = Some(header.r#type);
4520 let res = match header.r#type {
4521 1u16 => RuleCompatAttrs::Proto({
4522 let res = parse_be_u32(next);
4523 let Some(val) = res else { break };
4524 val
4525 }),
4526 2u16 => RuleCompatAttrs::Flags({
4527 let res = parse_be_u32(next);
4528 let Some(val) = res else { break };
4529 val
4530 }),
4531 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4532 n => continue,
4533 };
4534 return Some(Ok(res));
4535 }
4536 Some(Err(ErrorContext::new(
4537 "RuleCompatAttrs",
4538 r#type.and_then(|t| RuleCompatAttrs::attr_from_type(t)),
4539 self.orig_loc,
4540 self.buf.as_ptr().wrapping_add(pos) as usize,
4541 )))
4542 }
4543}
4544impl std::fmt::Debug for IterableRuleCompatAttrs<'_> {
4545 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4546 let mut fmt = f.debug_struct("RuleCompatAttrs");
4547 for attr in self.clone() {
4548 let attr = match attr {
4549 Ok(a) => a,
4550 Err(err) => {
4551 fmt.finish()?;
4552 f.write_str("Err(")?;
4553 err.fmt(f)?;
4554 return f.write_str(")");
4555 }
4556 };
4557 match attr {
4558 RuleCompatAttrs::Proto(val) => fmt.field("Proto", &val),
4559 RuleCompatAttrs::Flags(val) => fmt.field("Flags", &val),
4560 };
4561 }
4562 fmt.finish()
4563 }
4564}
4565impl IterableRuleCompatAttrs<'_> {
4566 pub fn lookup_attr(
4567 &self,
4568 offset: usize,
4569 missing_type: Option<u16>,
4570 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4571 let mut stack = Vec::new();
4572 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4573 if missing_type.is_some() && cur == offset {
4574 stack.push(("RuleCompatAttrs", offset));
4575 return (
4576 stack,
4577 missing_type.and_then(|t| RuleCompatAttrs::attr_from_type(t)),
4578 );
4579 }
4580 if cur > offset || cur + self.buf.len() < offset {
4581 return (stack, None);
4582 }
4583 let mut attrs = self.clone();
4584 let mut last_off = cur + attrs.pos;
4585 while let Some(attr) = attrs.next() {
4586 let Ok(attr) = attr else { break };
4587 match attr {
4588 RuleCompatAttrs::Proto(val) => {
4589 if last_off == offset {
4590 stack.push(("Proto", last_off));
4591 break;
4592 }
4593 }
4594 RuleCompatAttrs::Flags(val) => {
4595 if last_off == offset {
4596 stack.push(("Flags", last_off));
4597 break;
4598 }
4599 }
4600 _ => {}
4601 };
4602 last_off = cur + attrs.pos;
4603 }
4604 if !stack.is_empty() {
4605 stack.push(("RuleCompatAttrs", cur));
4606 }
4607 (stack, None)
4608 }
4609}
4610#[derive(Clone)]
4611pub enum SetAttrs<'a> {
4612 #[doc = "table name\n"]
4613 Table(&'a CStr),
4614 #[doc = "set name\n"]
4615 Name(&'a CStr),
4616 #[doc = "bitmask of enum nft_set_flags\n\nAssociated type: [`SetFlags`] (enum)"]
4617 Flags(u32),
4618 #[doc = "key data type, informational purpose only\n"]
4619 KeyType(u32),
4620 #[doc = "key data length\n"]
4621 KeyLen(u32),
4622 #[doc = "mapping data type\n"]
4623 DataType(u32),
4624 #[doc = "mapping data length\n"]
4625 DataLen(u32),
4626 #[doc = "selection policy\n"]
4627 Policy(u32),
4628 #[doc = "set description\n"]
4629 Desc(IterableSetDescAttrs<'a>),
4630 #[doc = "uniquely identifies a set in a transaction\n"]
4631 Id(u32),
4632 #[doc = "default timeout value\n"]
4633 Timeout(u64),
4634 #[doc = "garbage collection interval\n"]
4635 GcInterval(u32),
4636 #[doc = "user data\n"]
4637 Userdata(&'a [u8]),
4638 Pad(&'a [u8]),
4639 #[doc = "stateful object type\n"]
4640 ObjType(u32),
4641 #[doc = "set handle\n"]
4642 Handle(u64),
4643 #[doc = "set expression\n\nAttribute may repeat multiple times (treat it as array)"]
4644 Expr(IterableExprAttrs<'a>),
4645 #[doc = "list of expressions\n"]
4646 Expressions(IterableSetListAttrs<'a>),
4647 #[doc = "set backend type\n"]
4648 Type(&'a CStr),
4649 #[doc = "number of set elements\n"]
4650 Count(u32),
4651}
4652impl<'a> IterableSetAttrs<'a> {
4653 #[doc = "table name\n"]
4654 pub fn get_table(&self) -> Result<&'a CStr, ErrorContext> {
4655 let mut iter = self.clone();
4656 iter.pos = 0;
4657 for attr in iter {
4658 if let Ok(SetAttrs::Table(val)) = attr {
4659 return Ok(val);
4660 }
4661 }
4662 Err(ErrorContext::new_missing(
4663 "SetAttrs",
4664 "Table",
4665 self.orig_loc,
4666 self.buf.as_ptr() as usize,
4667 ))
4668 }
4669 #[doc = "set name\n"]
4670 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
4671 let mut iter = self.clone();
4672 iter.pos = 0;
4673 for attr in iter {
4674 if let Ok(SetAttrs::Name(val)) = attr {
4675 return Ok(val);
4676 }
4677 }
4678 Err(ErrorContext::new_missing(
4679 "SetAttrs",
4680 "Name",
4681 self.orig_loc,
4682 self.buf.as_ptr() as usize,
4683 ))
4684 }
4685 #[doc = "bitmask of enum nft_set_flags\n\nAssociated type: [`SetFlags`] (enum)"]
4686 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
4687 let mut iter = self.clone();
4688 iter.pos = 0;
4689 for attr in iter {
4690 if let Ok(SetAttrs::Flags(val)) = attr {
4691 return Ok(val);
4692 }
4693 }
4694 Err(ErrorContext::new_missing(
4695 "SetAttrs",
4696 "Flags",
4697 self.orig_loc,
4698 self.buf.as_ptr() as usize,
4699 ))
4700 }
4701 #[doc = "key data type, informational purpose only\n"]
4702 pub fn get_key_type(&self) -> Result<u32, ErrorContext> {
4703 let mut iter = self.clone();
4704 iter.pos = 0;
4705 for attr in iter {
4706 if let Ok(SetAttrs::KeyType(val)) = attr {
4707 return Ok(val);
4708 }
4709 }
4710 Err(ErrorContext::new_missing(
4711 "SetAttrs",
4712 "KeyType",
4713 self.orig_loc,
4714 self.buf.as_ptr() as usize,
4715 ))
4716 }
4717 #[doc = "key data length\n"]
4718 pub fn get_key_len(&self) -> Result<u32, ErrorContext> {
4719 let mut iter = self.clone();
4720 iter.pos = 0;
4721 for attr in iter {
4722 if let Ok(SetAttrs::KeyLen(val)) = attr {
4723 return Ok(val);
4724 }
4725 }
4726 Err(ErrorContext::new_missing(
4727 "SetAttrs",
4728 "KeyLen",
4729 self.orig_loc,
4730 self.buf.as_ptr() as usize,
4731 ))
4732 }
4733 #[doc = "mapping data type\n"]
4734 pub fn get_data_type(&self) -> Result<u32, ErrorContext> {
4735 let mut iter = self.clone();
4736 iter.pos = 0;
4737 for attr in iter {
4738 if let Ok(SetAttrs::DataType(val)) = attr {
4739 return Ok(val);
4740 }
4741 }
4742 Err(ErrorContext::new_missing(
4743 "SetAttrs",
4744 "DataType",
4745 self.orig_loc,
4746 self.buf.as_ptr() as usize,
4747 ))
4748 }
4749 #[doc = "mapping data length\n"]
4750 pub fn get_data_len(&self) -> Result<u32, ErrorContext> {
4751 let mut iter = self.clone();
4752 iter.pos = 0;
4753 for attr in iter {
4754 if let Ok(SetAttrs::DataLen(val)) = attr {
4755 return Ok(val);
4756 }
4757 }
4758 Err(ErrorContext::new_missing(
4759 "SetAttrs",
4760 "DataLen",
4761 self.orig_loc,
4762 self.buf.as_ptr() as usize,
4763 ))
4764 }
4765 #[doc = "selection policy\n"]
4766 pub fn get_policy(&self) -> Result<u32, ErrorContext> {
4767 let mut iter = self.clone();
4768 iter.pos = 0;
4769 for attr in iter {
4770 if let Ok(SetAttrs::Policy(val)) = attr {
4771 return Ok(val);
4772 }
4773 }
4774 Err(ErrorContext::new_missing(
4775 "SetAttrs",
4776 "Policy",
4777 self.orig_loc,
4778 self.buf.as_ptr() as usize,
4779 ))
4780 }
4781 #[doc = "set description\n"]
4782 pub fn get_desc(&self) -> Result<IterableSetDescAttrs<'a>, ErrorContext> {
4783 let mut iter = self.clone();
4784 iter.pos = 0;
4785 for attr in iter {
4786 if let Ok(SetAttrs::Desc(val)) = attr {
4787 return Ok(val);
4788 }
4789 }
4790 Err(ErrorContext::new_missing(
4791 "SetAttrs",
4792 "Desc",
4793 self.orig_loc,
4794 self.buf.as_ptr() as usize,
4795 ))
4796 }
4797 #[doc = "uniquely identifies a set in a transaction\n"]
4798 pub fn get_id(&self) -> Result<u32, ErrorContext> {
4799 let mut iter = self.clone();
4800 iter.pos = 0;
4801 for attr in iter {
4802 if let Ok(SetAttrs::Id(val)) = attr {
4803 return Ok(val);
4804 }
4805 }
4806 Err(ErrorContext::new_missing(
4807 "SetAttrs",
4808 "Id",
4809 self.orig_loc,
4810 self.buf.as_ptr() as usize,
4811 ))
4812 }
4813 #[doc = "default timeout value\n"]
4814 pub fn get_timeout(&self) -> Result<u64, ErrorContext> {
4815 let mut iter = self.clone();
4816 iter.pos = 0;
4817 for attr in iter {
4818 if let Ok(SetAttrs::Timeout(val)) = attr {
4819 return Ok(val);
4820 }
4821 }
4822 Err(ErrorContext::new_missing(
4823 "SetAttrs",
4824 "Timeout",
4825 self.orig_loc,
4826 self.buf.as_ptr() as usize,
4827 ))
4828 }
4829 #[doc = "garbage collection interval\n"]
4830 pub fn get_gc_interval(&self) -> Result<u32, ErrorContext> {
4831 let mut iter = self.clone();
4832 iter.pos = 0;
4833 for attr in iter {
4834 if let Ok(SetAttrs::GcInterval(val)) = attr {
4835 return Ok(val);
4836 }
4837 }
4838 Err(ErrorContext::new_missing(
4839 "SetAttrs",
4840 "GcInterval",
4841 self.orig_loc,
4842 self.buf.as_ptr() as usize,
4843 ))
4844 }
4845 #[doc = "user data\n"]
4846 pub fn get_userdata(&self) -> Result<&'a [u8], ErrorContext> {
4847 let mut iter = self.clone();
4848 iter.pos = 0;
4849 for attr in iter {
4850 if let Ok(SetAttrs::Userdata(val)) = attr {
4851 return Ok(val);
4852 }
4853 }
4854 Err(ErrorContext::new_missing(
4855 "SetAttrs",
4856 "Userdata",
4857 self.orig_loc,
4858 self.buf.as_ptr() as usize,
4859 ))
4860 }
4861 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
4862 let mut iter = self.clone();
4863 iter.pos = 0;
4864 for attr in iter {
4865 if let Ok(SetAttrs::Pad(val)) = attr {
4866 return Ok(val);
4867 }
4868 }
4869 Err(ErrorContext::new_missing(
4870 "SetAttrs",
4871 "Pad",
4872 self.orig_loc,
4873 self.buf.as_ptr() as usize,
4874 ))
4875 }
4876 #[doc = "stateful object type\n"]
4877 pub fn get_obj_type(&self) -> Result<u32, ErrorContext> {
4878 let mut iter = self.clone();
4879 iter.pos = 0;
4880 for attr in iter {
4881 if let Ok(SetAttrs::ObjType(val)) = attr {
4882 return Ok(val);
4883 }
4884 }
4885 Err(ErrorContext::new_missing(
4886 "SetAttrs",
4887 "ObjType",
4888 self.orig_loc,
4889 self.buf.as_ptr() as usize,
4890 ))
4891 }
4892 #[doc = "set handle\n"]
4893 pub fn get_handle(&self) -> Result<u64, ErrorContext> {
4894 let mut iter = self.clone();
4895 iter.pos = 0;
4896 for attr in iter {
4897 if let Ok(SetAttrs::Handle(val)) = attr {
4898 return Ok(val);
4899 }
4900 }
4901 Err(ErrorContext::new_missing(
4902 "SetAttrs",
4903 "Handle",
4904 self.orig_loc,
4905 self.buf.as_ptr() as usize,
4906 ))
4907 }
4908 #[doc = "set expression\n\nAttribute may repeat multiple times (treat it as array)"]
4909 pub fn get_expr(&self) -> MultiAttrIterable<Self, SetAttrs<'a>, IterableExprAttrs<'a>> {
4910 MultiAttrIterable::new(self.clone(), |variant| {
4911 if let SetAttrs::Expr(val) = variant {
4912 Some(val)
4913 } else {
4914 None
4915 }
4916 })
4917 }
4918 #[doc = "list of expressions\n"]
4919 pub fn get_expressions(&self) -> Result<IterableSetListAttrs<'a>, ErrorContext> {
4920 let mut iter = self.clone();
4921 iter.pos = 0;
4922 for attr in iter {
4923 if let Ok(SetAttrs::Expressions(val)) = attr {
4924 return Ok(val);
4925 }
4926 }
4927 Err(ErrorContext::new_missing(
4928 "SetAttrs",
4929 "Expressions",
4930 self.orig_loc,
4931 self.buf.as_ptr() as usize,
4932 ))
4933 }
4934 #[doc = "set backend type\n"]
4935 pub fn get_type(&self) -> Result<&'a CStr, ErrorContext> {
4936 let mut iter = self.clone();
4937 iter.pos = 0;
4938 for attr in iter {
4939 if let Ok(SetAttrs::Type(val)) = attr {
4940 return Ok(val);
4941 }
4942 }
4943 Err(ErrorContext::new_missing(
4944 "SetAttrs",
4945 "Type",
4946 self.orig_loc,
4947 self.buf.as_ptr() as usize,
4948 ))
4949 }
4950 #[doc = "number of set elements\n"]
4951 pub fn get_count(&self) -> Result<u32, ErrorContext> {
4952 let mut iter = self.clone();
4953 iter.pos = 0;
4954 for attr in iter {
4955 if let Ok(SetAttrs::Count(val)) = attr {
4956 return Ok(val);
4957 }
4958 }
4959 Err(ErrorContext::new_missing(
4960 "SetAttrs",
4961 "Count",
4962 self.orig_loc,
4963 self.buf.as_ptr() as usize,
4964 ))
4965 }
4966}
4967impl SetAttrs<'_> {
4968 pub fn new<'a>(buf: &'a [u8]) -> IterableSetAttrs<'a> {
4969 IterableSetAttrs::with_loc(buf, buf.as_ptr() as usize)
4970 }
4971 fn attr_from_type(r#type: u16) -> Option<&'static str> {
4972 let res = match r#type {
4973 1u16 => "Table",
4974 2u16 => "Name",
4975 3u16 => "Flags",
4976 4u16 => "KeyType",
4977 5u16 => "KeyLen",
4978 6u16 => "DataType",
4979 7u16 => "DataLen",
4980 8u16 => "Policy",
4981 9u16 => "Desc",
4982 10u16 => "Id",
4983 11u16 => "Timeout",
4984 12u16 => "GcInterval",
4985 13u16 => "Userdata",
4986 14u16 => "Pad",
4987 15u16 => "ObjType",
4988 16u16 => "Handle",
4989 17u16 => "Expr",
4990 18u16 => "Expressions",
4991 19u16 => "Type",
4992 20u16 => "Count",
4993 _ => return None,
4994 };
4995 Some(res)
4996 }
4997}
4998#[derive(Clone, Copy, Default)]
4999pub struct IterableSetAttrs<'a> {
5000 buf: &'a [u8],
5001 pos: usize,
5002 orig_loc: usize,
5003}
5004impl<'a> IterableSetAttrs<'a> {
5005 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5006 Self {
5007 buf,
5008 pos: 0,
5009 orig_loc,
5010 }
5011 }
5012 pub fn get_buf(&self) -> &'a [u8] {
5013 self.buf
5014 }
5015}
5016impl<'a> Iterator for IterableSetAttrs<'a> {
5017 type Item = Result<SetAttrs<'a>, ErrorContext>;
5018 fn next(&mut self) -> Option<Self::Item> {
5019 let mut pos;
5020 let mut r#type;
5021 loop {
5022 pos = self.pos;
5023 r#type = None;
5024 if self.buf.len() == self.pos {
5025 return None;
5026 }
5027 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5028 self.pos = self.buf.len();
5029 break;
5030 };
5031 r#type = Some(header.r#type);
5032 let res = match header.r#type {
5033 1u16 => SetAttrs::Table({
5034 let res = CStr::from_bytes_with_nul(next).ok();
5035 let Some(val) = res else { break };
5036 val
5037 }),
5038 2u16 => SetAttrs::Name({
5039 let res = CStr::from_bytes_with_nul(next).ok();
5040 let Some(val) = res else { break };
5041 val
5042 }),
5043 3u16 => SetAttrs::Flags({
5044 let res = parse_be_u32(next);
5045 let Some(val) = res else { break };
5046 val
5047 }),
5048 4u16 => SetAttrs::KeyType({
5049 let res = parse_be_u32(next);
5050 let Some(val) = res else { break };
5051 val
5052 }),
5053 5u16 => SetAttrs::KeyLen({
5054 let res = parse_be_u32(next);
5055 let Some(val) = res else { break };
5056 val
5057 }),
5058 6u16 => SetAttrs::DataType({
5059 let res = parse_be_u32(next);
5060 let Some(val) = res else { break };
5061 val
5062 }),
5063 7u16 => SetAttrs::DataLen({
5064 let res = parse_be_u32(next);
5065 let Some(val) = res else { break };
5066 val
5067 }),
5068 8u16 => SetAttrs::Policy({
5069 let res = parse_be_u32(next);
5070 let Some(val) = res else { break };
5071 val
5072 }),
5073 9u16 => SetAttrs::Desc({
5074 let res = Some(IterableSetDescAttrs::with_loc(next, self.orig_loc));
5075 let Some(val) = res else { break };
5076 val
5077 }),
5078 10u16 => SetAttrs::Id({
5079 let res = parse_u32(next);
5080 let Some(val) = res else { break };
5081 val
5082 }),
5083 11u16 => SetAttrs::Timeout({
5084 let res = parse_u64(next);
5085 let Some(val) = res else { break };
5086 val
5087 }),
5088 12u16 => SetAttrs::GcInterval({
5089 let res = parse_u32(next);
5090 let Some(val) = res else { break };
5091 val
5092 }),
5093 13u16 => SetAttrs::Userdata({
5094 let res = Some(next);
5095 let Some(val) = res else { break };
5096 val
5097 }),
5098 14u16 => SetAttrs::Pad({
5099 let res = Some(next);
5100 let Some(val) = res else { break };
5101 val
5102 }),
5103 15u16 => SetAttrs::ObjType({
5104 let res = parse_be_u32(next);
5105 let Some(val) = res else { break };
5106 val
5107 }),
5108 16u16 => SetAttrs::Handle({
5109 let res = parse_be_u64(next);
5110 let Some(val) = res else { break };
5111 val
5112 }),
5113 17u16 => SetAttrs::Expr({
5114 let res = Some(IterableExprAttrs::with_loc(next, self.orig_loc));
5115 let Some(val) = res else { break };
5116 val
5117 }),
5118 18u16 => SetAttrs::Expressions({
5119 let res = Some(IterableSetListAttrs::with_loc(next, self.orig_loc));
5120 let Some(val) = res else { break };
5121 val
5122 }),
5123 19u16 => SetAttrs::Type({
5124 let res = CStr::from_bytes_with_nul(next).ok();
5125 let Some(val) = res else { break };
5126 val
5127 }),
5128 20u16 => SetAttrs::Count({
5129 let res = parse_be_u32(next);
5130 let Some(val) = res else { break };
5131 val
5132 }),
5133 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5134 n => continue,
5135 };
5136 return Some(Ok(res));
5137 }
5138 Some(Err(ErrorContext::new(
5139 "SetAttrs",
5140 r#type.and_then(|t| SetAttrs::attr_from_type(t)),
5141 self.orig_loc,
5142 self.buf.as_ptr().wrapping_add(pos) as usize,
5143 )))
5144 }
5145}
5146impl<'a> std::fmt::Debug for IterableSetAttrs<'_> {
5147 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5148 let mut fmt = f.debug_struct("SetAttrs");
5149 for attr in self.clone() {
5150 let attr = match attr {
5151 Ok(a) => a,
5152 Err(err) => {
5153 fmt.finish()?;
5154 f.write_str("Err(")?;
5155 err.fmt(f)?;
5156 return f.write_str(")");
5157 }
5158 };
5159 match attr {
5160 SetAttrs::Table(val) => fmt.field("Table", &val),
5161 SetAttrs::Name(val) => fmt.field("Name", &val),
5162 SetAttrs::Flags(val) => {
5163 fmt.field("Flags", &FormatFlags(val.into(), SetFlags::from_value))
5164 }
5165 SetAttrs::KeyType(val) => fmt.field("KeyType", &val),
5166 SetAttrs::KeyLen(val) => fmt.field("KeyLen", &val),
5167 SetAttrs::DataType(val) => fmt.field("DataType", &val),
5168 SetAttrs::DataLen(val) => fmt.field("DataLen", &val),
5169 SetAttrs::Policy(val) => fmt.field("Policy", &val),
5170 SetAttrs::Desc(val) => fmt.field("Desc", &val),
5171 SetAttrs::Id(val) => fmt.field("Id", &val),
5172 SetAttrs::Timeout(val) => fmt.field("Timeout", &val),
5173 SetAttrs::GcInterval(val) => fmt.field("GcInterval", &val),
5174 SetAttrs::Userdata(val) => fmt.field("Userdata", &val),
5175 SetAttrs::Pad(val) => fmt.field("Pad", &val),
5176 SetAttrs::ObjType(val) => fmt.field("ObjType", &val),
5177 SetAttrs::Handle(val) => fmt.field("Handle", &val),
5178 SetAttrs::Expr(val) => fmt.field("Expr", &val),
5179 SetAttrs::Expressions(val) => fmt.field("Expressions", &val),
5180 SetAttrs::Type(val) => fmt.field("Type", &val),
5181 SetAttrs::Count(val) => fmt.field("Count", &val),
5182 };
5183 }
5184 fmt.finish()
5185 }
5186}
5187impl IterableSetAttrs<'_> {
5188 pub fn lookup_attr(
5189 &self,
5190 offset: usize,
5191 missing_type: Option<u16>,
5192 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5193 let mut stack = Vec::new();
5194 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5195 if missing_type.is_some() && cur == offset {
5196 stack.push(("SetAttrs", offset));
5197 return (
5198 stack,
5199 missing_type.and_then(|t| SetAttrs::attr_from_type(t)),
5200 );
5201 }
5202 if cur > offset || cur + self.buf.len() < offset {
5203 return (stack, None);
5204 }
5205 let mut attrs = self.clone();
5206 let mut last_off = cur + attrs.pos;
5207 let mut missing = None;
5208 while let Some(attr) = attrs.next() {
5209 let Ok(attr) = attr else { break };
5210 match attr {
5211 SetAttrs::Table(val) => {
5212 if last_off == offset {
5213 stack.push(("Table", last_off));
5214 break;
5215 }
5216 }
5217 SetAttrs::Name(val) => {
5218 if last_off == offset {
5219 stack.push(("Name", last_off));
5220 break;
5221 }
5222 }
5223 SetAttrs::Flags(val) => {
5224 if last_off == offset {
5225 stack.push(("Flags", last_off));
5226 break;
5227 }
5228 }
5229 SetAttrs::KeyType(val) => {
5230 if last_off == offset {
5231 stack.push(("KeyType", last_off));
5232 break;
5233 }
5234 }
5235 SetAttrs::KeyLen(val) => {
5236 if last_off == offset {
5237 stack.push(("KeyLen", last_off));
5238 break;
5239 }
5240 }
5241 SetAttrs::DataType(val) => {
5242 if last_off == offset {
5243 stack.push(("DataType", last_off));
5244 break;
5245 }
5246 }
5247 SetAttrs::DataLen(val) => {
5248 if last_off == offset {
5249 stack.push(("DataLen", last_off));
5250 break;
5251 }
5252 }
5253 SetAttrs::Policy(val) => {
5254 if last_off == offset {
5255 stack.push(("Policy", last_off));
5256 break;
5257 }
5258 }
5259 SetAttrs::Desc(val) => {
5260 (stack, missing) = val.lookup_attr(offset, missing_type);
5261 if !stack.is_empty() {
5262 break;
5263 }
5264 }
5265 SetAttrs::Id(val) => {
5266 if last_off == offset {
5267 stack.push(("Id", last_off));
5268 break;
5269 }
5270 }
5271 SetAttrs::Timeout(val) => {
5272 if last_off == offset {
5273 stack.push(("Timeout", last_off));
5274 break;
5275 }
5276 }
5277 SetAttrs::GcInterval(val) => {
5278 if last_off == offset {
5279 stack.push(("GcInterval", last_off));
5280 break;
5281 }
5282 }
5283 SetAttrs::Userdata(val) => {
5284 if last_off == offset {
5285 stack.push(("Userdata", last_off));
5286 break;
5287 }
5288 }
5289 SetAttrs::Pad(val) => {
5290 if last_off == offset {
5291 stack.push(("Pad", last_off));
5292 break;
5293 }
5294 }
5295 SetAttrs::ObjType(val) => {
5296 if last_off == offset {
5297 stack.push(("ObjType", last_off));
5298 break;
5299 }
5300 }
5301 SetAttrs::Handle(val) => {
5302 if last_off == offset {
5303 stack.push(("Handle", last_off));
5304 break;
5305 }
5306 }
5307 SetAttrs::Expr(val) => {
5308 (stack, missing) = val.lookup_attr(offset, missing_type);
5309 if !stack.is_empty() {
5310 break;
5311 }
5312 }
5313 SetAttrs::Expressions(val) => {
5314 (stack, missing) = val.lookup_attr(offset, missing_type);
5315 if !stack.is_empty() {
5316 break;
5317 }
5318 }
5319 SetAttrs::Type(val) => {
5320 if last_off == offset {
5321 stack.push(("Type", last_off));
5322 break;
5323 }
5324 }
5325 SetAttrs::Count(val) => {
5326 if last_off == offset {
5327 stack.push(("Count", last_off));
5328 break;
5329 }
5330 }
5331 _ => {}
5332 };
5333 last_off = cur + attrs.pos;
5334 }
5335 if !stack.is_empty() {
5336 stack.push(("SetAttrs", cur));
5337 }
5338 (stack, missing)
5339 }
5340}
5341#[derive(Clone)]
5342pub enum SetDescAttrs<'a> {
5343 #[doc = "number of elements in set\n"]
5344 Size(u32),
5345 #[doc = "description of field concatenation\n\nAttribute may repeat multiple times (treat it as array)"]
5346 Concat(IterableSetDescConcatAttrs<'a>),
5347}
5348impl<'a> IterableSetDescAttrs<'a> {
5349 #[doc = "number of elements in set\n"]
5350 pub fn get_size(&self) -> Result<u32, ErrorContext> {
5351 let mut iter = self.clone();
5352 iter.pos = 0;
5353 for attr in iter {
5354 if let Ok(SetDescAttrs::Size(val)) = attr {
5355 return Ok(val);
5356 }
5357 }
5358 Err(ErrorContext::new_missing(
5359 "SetDescAttrs",
5360 "Size",
5361 self.orig_loc,
5362 self.buf.as_ptr() as usize,
5363 ))
5364 }
5365 #[doc = "description of field concatenation\n\nAttribute may repeat multiple times (treat it as array)"]
5366 pub fn get_concat(
5367 &self,
5368 ) -> MultiAttrIterable<Self, SetDescAttrs<'a>, IterableSetDescConcatAttrs<'a>> {
5369 MultiAttrIterable::new(self.clone(), |variant| {
5370 if let SetDescAttrs::Concat(val) = variant {
5371 Some(val)
5372 } else {
5373 None
5374 }
5375 })
5376 }
5377}
5378impl SetDescAttrs<'_> {
5379 pub fn new<'a>(buf: &'a [u8]) -> IterableSetDescAttrs<'a> {
5380 IterableSetDescAttrs::with_loc(buf, buf.as_ptr() as usize)
5381 }
5382 fn attr_from_type(r#type: u16) -> Option<&'static str> {
5383 let res = match r#type {
5384 1u16 => "Size",
5385 2u16 => "Concat",
5386 _ => return None,
5387 };
5388 Some(res)
5389 }
5390}
5391#[derive(Clone, Copy, Default)]
5392pub struct IterableSetDescAttrs<'a> {
5393 buf: &'a [u8],
5394 pos: usize,
5395 orig_loc: usize,
5396}
5397impl<'a> IterableSetDescAttrs<'a> {
5398 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5399 Self {
5400 buf,
5401 pos: 0,
5402 orig_loc,
5403 }
5404 }
5405 pub fn get_buf(&self) -> &'a [u8] {
5406 self.buf
5407 }
5408}
5409impl<'a> Iterator for IterableSetDescAttrs<'a> {
5410 type Item = Result<SetDescAttrs<'a>, ErrorContext>;
5411 fn next(&mut self) -> Option<Self::Item> {
5412 let mut pos;
5413 let mut r#type;
5414 loop {
5415 pos = self.pos;
5416 r#type = None;
5417 if self.buf.len() == self.pos {
5418 return None;
5419 }
5420 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5421 self.pos = self.buf.len();
5422 break;
5423 };
5424 r#type = Some(header.r#type);
5425 let res = match header.r#type {
5426 1u16 => SetDescAttrs::Size({
5427 let res = parse_be_u32(next);
5428 let Some(val) = res else { break };
5429 val
5430 }),
5431 2u16 => SetDescAttrs::Concat({
5432 let res = Some(IterableSetDescConcatAttrs::with_loc(next, self.orig_loc));
5433 let Some(val) = res else { break };
5434 val
5435 }),
5436 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5437 n => continue,
5438 };
5439 return Some(Ok(res));
5440 }
5441 Some(Err(ErrorContext::new(
5442 "SetDescAttrs",
5443 r#type.and_then(|t| SetDescAttrs::attr_from_type(t)),
5444 self.orig_loc,
5445 self.buf.as_ptr().wrapping_add(pos) as usize,
5446 )))
5447 }
5448}
5449impl<'a> std::fmt::Debug for IterableSetDescAttrs<'_> {
5450 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5451 let mut fmt = f.debug_struct("SetDescAttrs");
5452 for attr in self.clone() {
5453 let attr = match attr {
5454 Ok(a) => a,
5455 Err(err) => {
5456 fmt.finish()?;
5457 f.write_str("Err(")?;
5458 err.fmt(f)?;
5459 return f.write_str(")");
5460 }
5461 };
5462 match attr {
5463 SetDescAttrs::Size(val) => fmt.field("Size", &val),
5464 SetDescAttrs::Concat(val) => fmt.field("Concat", &val),
5465 };
5466 }
5467 fmt.finish()
5468 }
5469}
5470impl IterableSetDescAttrs<'_> {
5471 pub fn lookup_attr(
5472 &self,
5473 offset: usize,
5474 missing_type: Option<u16>,
5475 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5476 let mut stack = Vec::new();
5477 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5478 if missing_type.is_some() && cur == offset {
5479 stack.push(("SetDescAttrs", offset));
5480 return (
5481 stack,
5482 missing_type.and_then(|t| SetDescAttrs::attr_from_type(t)),
5483 );
5484 }
5485 if cur > offset || cur + self.buf.len() < offset {
5486 return (stack, None);
5487 }
5488 let mut attrs = self.clone();
5489 let mut last_off = cur + attrs.pos;
5490 let mut missing = None;
5491 while let Some(attr) = attrs.next() {
5492 let Ok(attr) = attr else { break };
5493 match attr {
5494 SetDescAttrs::Size(val) => {
5495 if last_off == offset {
5496 stack.push(("Size", last_off));
5497 break;
5498 }
5499 }
5500 SetDescAttrs::Concat(val) => {
5501 (stack, missing) = val.lookup_attr(offset, missing_type);
5502 if !stack.is_empty() {
5503 break;
5504 }
5505 }
5506 _ => {}
5507 };
5508 last_off = cur + attrs.pos;
5509 }
5510 if !stack.is_empty() {
5511 stack.push(("SetDescAttrs", cur));
5512 }
5513 (stack, missing)
5514 }
5515}
5516#[derive(Clone)]
5517pub enum SetDescConcatAttrs<'a> {
5518 Elem(IterableSetFieldAttrs<'a>),
5519}
5520impl<'a> IterableSetDescConcatAttrs<'a> {
5521 pub fn get_elem(&self) -> Result<IterableSetFieldAttrs<'a>, ErrorContext> {
5522 let mut iter = self.clone();
5523 iter.pos = 0;
5524 for attr in iter {
5525 if let Ok(SetDescConcatAttrs::Elem(val)) = attr {
5526 return Ok(val);
5527 }
5528 }
5529 Err(ErrorContext::new_missing(
5530 "SetDescConcatAttrs",
5531 "Elem",
5532 self.orig_loc,
5533 self.buf.as_ptr() as usize,
5534 ))
5535 }
5536}
5537impl SetDescConcatAttrs<'_> {
5538 pub fn new<'a>(buf: &'a [u8]) -> IterableSetDescConcatAttrs<'a> {
5539 IterableSetDescConcatAttrs::with_loc(buf, buf.as_ptr() as usize)
5540 }
5541 fn attr_from_type(r#type: u16) -> Option<&'static str> {
5542 let res = match r#type {
5543 1u16 => "Elem",
5544 _ => return None,
5545 };
5546 Some(res)
5547 }
5548}
5549#[derive(Clone, Copy, Default)]
5550pub struct IterableSetDescConcatAttrs<'a> {
5551 buf: &'a [u8],
5552 pos: usize,
5553 orig_loc: usize,
5554}
5555impl<'a> IterableSetDescConcatAttrs<'a> {
5556 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5557 Self {
5558 buf,
5559 pos: 0,
5560 orig_loc,
5561 }
5562 }
5563 pub fn get_buf(&self) -> &'a [u8] {
5564 self.buf
5565 }
5566}
5567impl<'a> Iterator for IterableSetDescConcatAttrs<'a> {
5568 type Item = Result<SetDescConcatAttrs<'a>, ErrorContext>;
5569 fn next(&mut self) -> Option<Self::Item> {
5570 let mut pos;
5571 let mut r#type;
5572 loop {
5573 pos = self.pos;
5574 r#type = None;
5575 if self.buf.len() == self.pos {
5576 return None;
5577 }
5578 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5579 self.pos = self.buf.len();
5580 break;
5581 };
5582 r#type = Some(header.r#type);
5583 let res = match header.r#type {
5584 1u16 => SetDescConcatAttrs::Elem({
5585 let res = Some(IterableSetFieldAttrs::with_loc(next, self.orig_loc));
5586 let Some(val) = res else { break };
5587 val
5588 }),
5589 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5590 n => continue,
5591 };
5592 return Some(Ok(res));
5593 }
5594 Some(Err(ErrorContext::new(
5595 "SetDescConcatAttrs",
5596 r#type.and_then(|t| SetDescConcatAttrs::attr_from_type(t)),
5597 self.orig_loc,
5598 self.buf.as_ptr().wrapping_add(pos) as usize,
5599 )))
5600 }
5601}
5602impl<'a> std::fmt::Debug for IterableSetDescConcatAttrs<'_> {
5603 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5604 let mut fmt = f.debug_struct("SetDescConcatAttrs");
5605 for attr in self.clone() {
5606 let attr = match attr {
5607 Ok(a) => a,
5608 Err(err) => {
5609 fmt.finish()?;
5610 f.write_str("Err(")?;
5611 err.fmt(f)?;
5612 return f.write_str(")");
5613 }
5614 };
5615 match attr {
5616 SetDescConcatAttrs::Elem(val) => fmt.field("Elem", &val),
5617 };
5618 }
5619 fmt.finish()
5620 }
5621}
5622impl IterableSetDescConcatAttrs<'_> {
5623 pub fn lookup_attr(
5624 &self,
5625 offset: usize,
5626 missing_type: Option<u16>,
5627 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5628 let mut stack = Vec::new();
5629 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5630 if missing_type.is_some() && cur == offset {
5631 stack.push(("SetDescConcatAttrs", offset));
5632 return (
5633 stack,
5634 missing_type.and_then(|t| SetDescConcatAttrs::attr_from_type(t)),
5635 );
5636 }
5637 if cur > offset || cur + self.buf.len() < offset {
5638 return (stack, None);
5639 }
5640 let mut attrs = self.clone();
5641 let mut last_off = cur + attrs.pos;
5642 let mut missing = None;
5643 while let Some(attr) = attrs.next() {
5644 let Ok(attr) = attr else { break };
5645 match attr {
5646 SetDescConcatAttrs::Elem(val) => {
5647 (stack, missing) = val.lookup_attr(offset, missing_type);
5648 if !stack.is_empty() {
5649 break;
5650 }
5651 }
5652 _ => {}
5653 };
5654 last_off = cur + attrs.pos;
5655 }
5656 if !stack.is_empty() {
5657 stack.push(("SetDescConcatAttrs", cur));
5658 }
5659 (stack, missing)
5660 }
5661}
5662#[derive(Clone)]
5663pub enum SetFieldAttrs {
5664 Len(u32),
5665}
5666impl<'a> IterableSetFieldAttrs<'a> {
5667 pub fn get_len(&self) -> Result<u32, ErrorContext> {
5668 let mut iter = self.clone();
5669 iter.pos = 0;
5670 for attr in iter {
5671 if let Ok(SetFieldAttrs::Len(val)) = attr {
5672 return Ok(val);
5673 }
5674 }
5675 Err(ErrorContext::new_missing(
5676 "SetFieldAttrs",
5677 "Len",
5678 self.orig_loc,
5679 self.buf.as_ptr() as usize,
5680 ))
5681 }
5682}
5683impl SetFieldAttrs {
5684 pub fn new<'a>(buf: &'a [u8]) -> IterableSetFieldAttrs<'a> {
5685 IterableSetFieldAttrs::with_loc(buf, buf.as_ptr() as usize)
5686 }
5687 fn attr_from_type(r#type: u16) -> Option<&'static str> {
5688 let res = match r#type {
5689 1u16 => "Len",
5690 _ => return None,
5691 };
5692 Some(res)
5693 }
5694}
5695#[derive(Clone, Copy, Default)]
5696pub struct IterableSetFieldAttrs<'a> {
5697 buf: &'a [u8],
5698 pos: usize,
5699 orig_loc: usize,
5700}
5701impl<'a> IterableSetFieldAttrs<'a> {
5702 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5703 Self {
5704 buf,
5705 pos: 0,
5706 orig_loc,
5707 }
5708 }
5709 pub fn get_buf(&self) -> &'a [u8] {
5710 self.buf
5711 }
5712}
5713impl<'a> Iterator for IterableSetFieldAttrs<'a> {
5714 type Item = Result<SetFieldAttrs, ErrorContext>;
5715 fn next(&mut self) -> Option<Self::Item> {
5716 let mut pos;
5717 let mut r#type;
5718 loop {
5719 pos = self.pos;
5720 r#type = None;
5721 if self.buf.len() == self.pos {
5722 return None;
5723 }
5724 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5725 self.pos = self.buf.len();
5726 break;
5727 };
5728 r#type = Some(header.r#type);
5729 let res = match header.r#type {
5730 1u16 => SetFieldAttrs::Len({
5731 let res = parse_be_u32(next);
5732 let Some(val) = res else { break };
5733 val
5734 }),
5735 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5736 n => continue,
5737 };
5738 return Some(Ok(res));
5739 }
5740 Some(Err(ErrorContext::new(
5741 "SetFieldAttrs",
5742 r#type.and_then(|t| SetFieldAttrs::attr_from_type(t)),
5743 self.orig_loc,
5744 self.buf.as_ptr().wrapping_add(pos) as usize,
5745 )))
5746 }
5747}
5748impl std::fmt::Debug for IterableSetFieldAttrs<'_> {
5749 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5750 let mut fmt = f.debug_struct("SetFieldAttrs");
5751 for attr in self.clone() {
5752 let attr = match attr {
5753 Ok(a) => a,
5754 Err(err) => {
5755 fmt.finish()?;
5756 f.write_str("Err(")?;
5757 err.fmt(f)?;
5758 return f.write_str(")");
5759 }
5760 };
5761 match attr {
5762 SetFieldAttrs::Len(val) => fmt.field("Len", &val),
5763 };
5764 }
5765 fmt.finish()
5766 }
5767}
5768impl IterableSetFieldAttrs<'_> {
5769 pub fn lookup_attr(
5770 &self,
5771 offset: usize,
5772 missing_type: Option<u16>,
5773 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5774 let mut stack = Vec::new();
5775 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5776 if missing_type.is_some() && cur == offset {
5777 stack.push(("SetFieldAttrs", offset));
5778 return (
5779 stack,
5780 missing_type.and_then(|t| SetFieldAttrs::attr_from_type(t)),
5781 );
5782 }
5783 if cur > offset || cur + self.buf.len() < offset {
5784 return (stack, None);
5785 }
5786 let mut attrs = self.clone();
5787 let mut last_off = cur + attrs.pos;
5788 while let Some(attr) = attrs.next() {
5789 let Ok(attr) = attr else { break };
5790 match attr {
5791 SetFieldAttrs::Len(val) => {
5792 if last_off == offset {
5793 stack.push(("Len", last_off));
5794 break;
5795 }
5796 }
5797 _ => {}
5798 };
5799 last_off = cur + attrs.pos;
5800 }
5801 if !stack.is_empty() {
5802 stack.push(("SetFieldAttrs", cur));
5803 }
5804 (stack, None)
5805 }
5806}
5807#[derive(Clone)]
5808pub enum SetListAttrs<'a> {
5809 #[doc = "Attribute may repeat multiple times (treat it as array)"]
5810 Elem(IterableExprAttrs<'a>),
5811}
5812impl<'a> IterableSetListAttrs<'a> {
5813 #[doc = "Attribute may repeat multiple times (treat it as array)"]
5814 pub fn get_elem(&self) -> MultiAttrIterable<Self, SetListAttrs<'a>, IterableExprAttrs<'a>> {
5815 MultiAttrIterable::new(self.clone(), |variant| {
5816 if let SetListAttrs::Elem(val) = variant {
5817 Some(val)
5818 } else {
5819 None
5820 }
5821 })
5822 }
5823}
5824impl SetListAttrs<'_> {
5825 pub fn new<'a>(buf: &'a [u8]) -> IterableSetListAttrs<'a> {
5826 IterableSetListAttrs::with_loc(buf, buf.as_ptr() as usize)
5827 }
5828 fn attr_from_type(r#type: u16) -> Option<&'static str> {
5829 let res = match r#type {
5830 1u16 => "Elem",
5831 _ => return None,
5832 };
5833 Some(res)
5834 }
5835}
5836#[derive(Clone, Copy, Default)]
5837pub struct IterableSetListAttrs<'a> {
5838 buf: &'a [u8],
5839 pos: usize,
5840 orig_loc: usize,
5841}
5842impl<'a> IterableSetListAttrs<'a> {
5843 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5844 Self {
5845 buf,
5846 pos: 0,
5847 orig_loc,
5848 }
5849 }
5850 pub fn get_buf(&self) -> &'a [u8] {
5851 self.buf
5852 }
5853}
5854impl<'a> Iterator for IterableSetListAttrs<'a> {
5855 type Item = Result<SetListAttrs<'a>, ErrorContext>;
5856 fn next(&mut self) -> Option<Self::Item> {
5857 let mut pos;
5858 let mut r#type;
5859 loop {
5860 pos = self.pos;
5861 r#type = None;
5862 if self.buf.len() == self.pos {
5863 return None;
5864 }
5865 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5866 self.pos = self.buf.len();
5867 break;
5868 };
5869 r#type = Some(header.r#type);
5870 let res = match header.r#type {
5871 1u16 => SetListAttrs::Elem({
5872 let res = Some(IterableExprAttrs::with_loc(next, self.orig_loc));
5873 let Some(val) = res else { break };
5874 val
5875 }),
5876 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5877 n => continue,
5878 };
5879 return Some(Ok(res));
5880 }
5881 Some(Err(ErrorContext::new(
5882 "SetListAttrs",
5883 r#type.and_then(|t| SetListAttrs::attr_from_type(t)),
5884 self.orig_loc,
5885 self.buf.as_ptr().wrapping_add(pos) as usize,
5886 )))
5887 }
5888}
5889impl<'a> std::fmt::Debug for IterableSetListAttrs<'_> {
5890 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5891 let mut fmt = f.debug_struct("SetListAttrs");
5892 for attr in self.clone() {
5893 let attr = match attr {
5894 Ok(a) => a,
5895 Err(err) => {
5896 fmt.finish()?;
5897 f.write_str("Err(")?;
5898 err.fmt(f)?;
5899 return f.write_str(")");
5900 }
5901 };
5902 match attr {
5903 SetListAttrs::Elem(val) => fmt.field("Elem", &val),
5904 };
5905 }
5906 fmt.finish()
5907 }
5908}
5909impl IterableSetListAttrs<'_> {
5910 pub fn lookup_attr(
5911 &self,
5912 offset: usize,
5913 missing_type: Option<u16>,
5914 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5915 let mut stack = Vec::new();
5916 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5917 if missing_type.is_some() && cur == offset {
5918 stack.push(("SetListAttrs", offset));
5919 return (
5920 stack,
5921 missing_type.and_then(|t| SetListAttrs::attr_from_type(t)),
5922 );
5923 }
5924 if cur > offset || cur + self.buf.len() < offset {
5925 return (stack, None);
5926 }
5927 let mut attrs = self.clone();
5928 let mut last_off = cur + attrs.pos;
5929 let mut missing = None;
5930 while let Some(attr) = attrs.next() {
5931 let Ok(attr) = attr else { break };
5932 match attr {
5933 SetListAttrs::Elem(val) => {
5934 (stack, missing) = val.lookup_attr(offset, missing_type);
5935 if !stack.is_empty() {
5936 break;
5937 }
5938 }
5939 _ => {}
5940 };
5941 last_off = cur + attrs.pos;
5942 }
5943 if !stack.is_empty() {
5944 stack.push(("SetListAttrs", cur));
5945 }
5946 (stack, missing)
5947 }
5948}
5949#[derive(Clone)]
5950pub enum SetelemAttrs<'a> {
5951 #[doc = "key value\n"]
5952 Key(IterableDataAttrs<'a>),
5953 #[doc = "data value of mapping\n"]
5954 Data(IterableDataAttrs<'a>),
5955 #[doc = "bitmask of nft_set_elem_flags\n"]
5956 Flags(&'a [u8]),
5957 #[doc = "timeout value\n"]
5958 Timeout(u64),
5959 #[doc = "expiration time\n"]
5960 Expiration(u64),
5961 #[doc = "user data\n"]
5962 Userdata(&'a [u8]),
5963 #[doc = "expression\n"]
5964 Expr(IterableExprAttrs<'a>),
5965 #[doc = "stateful object reference\n"]
5966 Objref(&'a CStr),
5967 #[doc = "closing key value\n"]
5968 KeyEnd(IterableDataAttrs<'a>),
5969 #[doc = "list of expressions\n"]
5970 Expressions(IterableExprListAttrs<'a>),
5971}
5972impl<'a> IterableSetelemAttrs<'a> {
5973 #[doc = "key value\n"]
5974 pub fn get_key(&self) -> Result<IterableDataAttrs<'a>, ErrorContext> {
5975 let mut iter = self.clone();
5976 iter.pos = 0;
5977 for attr in iter {
5978 if let Ok(SetelemAttrs::Key(val)) = attr {
5979 return Ok(val);
5980 }
5981 }
5982 Err(ErrorContext::new_missing(
5983 "SetelemAttrs",
5984 "Key",
5985 self.orig_loc,
5986 self.buf.as_ptr() as usize,
5987 ))
5988 }
5989 #[doc = "data value of mapping\n"]
5990 pub fn get_data(&self) -> Result<IterableDataAttrs<'a>, ErrorContext> {
5991 let mut iter = self.clone();
5992 iter.pos = 0;
5993 for attr in iter {
5994 if let Ok(SetelemAttrs::Data(val)) = attr {
5995 return Ok(val);
5996 }
5997 }
5998 Err(ErrorContext::new_missing(
5999 "SetelemAttrs",
6000 "Data",
6001 self.orig_loc,
6002 self.buf.as_ptr() as usize,
6003 ))
6004 }
6005 #[doc = "bitmask of nft_set_elem_flags\n"]
6006 pub fn get_flags(&self) -> Result<&'a [u8], ErrorContext> {
6007 let mut iter = self.clone();
6008 iter.pos = 0;
6009 for attr in iter {
6010 if let Ok(SetelemAttrs::Flags(val)) = attr {
6011 return Ok(val);
6012 }
6013 }
6014 Err(ErrorContext::new_missing(
6015 "SetelemAttrs",
6016 "Flags",
6017 self.orig_loc,
6018 self.buf.as_ptr() as usize,
6019 ))
6020 }
6021 #[doc = "timeout value\n"]
6022 pub fn get_timeout(&self) -> Result<u64, ErrorContext> {
6023 let mut iter = self.clone();
6024 iter.pos = 0;
6025 for attr in iter {
6026 if let Ok(SetelemAttrs::Timeout(val)) = attr {
6027 return Ok(val);
6028 }
6029 }
6030 Err(ErrorContext::new_missing(
6031 "SetelemAttrs",
6032 "Timeout",
6033 self.orig_loc,
6034 self.buf.as_ptr() as usize,
6035 ))
6036 }
6037 #[doc = "expiration time\n"]
6038 pub fn get_expiration(&self) -> Result<u64, ErrorContext> {
6039 let mut iter = self.clone();
6040 iter.pos = 0;
6041 for attr in iter {
6042 if let Ok(SetelemAttrs::Expiration(val)) = attr {
6043 return Ok(val);
6044 }
6045 }
6046 Err(ErrorContext::new_missing(
6047 "SetelemAttrs",
6048 "Expiration",
6049 self.orig_loc,
6050 self.buf.as_ptr() as usize,
6051 ))
6052 }
6053 #[doc = "user data\n"]
6054 pub fn get_userdata(&self) -> Result<&'a [u8], ErrorContext> {
6055 let mut iter = self.clone();
6056 iter.pos = 0;
6057 for attr in iter {
6058 if let Ok(SetelemAttrs::Userdata(val)) = attr {
6059 return Ok(val);
6060 }
6061 }
6062 Err(ErrorContext::new_missing(
6063 "SetelemAttrs",
6064 "Userdata",
6065 self.orig_loc,
6066 self.buf.as_ptr() as usize,
6067 ))
6068 }
6069 #[doc = "expression\n"]
6070 pub fn get_expr(&self) -> Result<IterableExprAttrs<'a>, ErrorContext> {
6071 let mut iter = self.clone();
6072 iter.pos = 0;
6073 for attr in iter {
6074 if let Ok(SetelemAttrs::Expr(val)) = attr {
6075 return Ok(val);
6076 }
6077 }
6078 Err(ErrorContext::new_missing(
6079 "SetelemAttrs",
6080 "Expr",
6081 self.orig_loc,
6082 self.buf.as_ptr() as usize,
6083 ))
6084 }
6085 #[doc = "stateful object reference\n"]
6086 pub fn get_objref(&self) -> Result<&'a CStr, ErrorContext> {
6087 let mut iter = self.clone();
6088 iter.pos = 0;
6089 for attr in iter {
6090 if let Ok(SetelemAttrs::Objref(val)) = attr {
6091 return Ok(val);
6092 }
6093 }
6094 Err(ErrorContext::new_missing(
6095 "SetelemAttrs",
6096 "Objref",
6097 self.orig_loc,
6098 self.buf.as_ptr() as usize,
6099 ))
6100 }
6101 #[doc = "closing key value\n"]
6102 pub fn get_key_end(&self) -> Result<IterableDataAttrs<'a>, ErrorContext> {
6103 let mut iter = self.clone();
6104 iter.pos = 0;
6105 for attr in iter {
6106 if let Ok(SetelemAttrs::KeyEnd(val)) = attr {
6107 return Ok(val);
6108 }
6109 }
6110 Err(ErrorContext::new_missing(
6111 "SetelemAttrs",
6112 "KeyEnd",
6113 self.orig_loc,
6114 self.buf.as_ptr() as usize,
6115 ))
6116 }
6117 #[doc = "list of expressions\n"]
6118 pub fn get_expressions(&self) -> Result<IterableExprListAttrs<'a>, ErrorContext> {
6119 let mut iter = self.clone();
6120 iter.pos = 0;
6121 for attr in iter {
6122 if let Ok(SetelemAttrs::Expressions(val)) = attr {
6123 return Ok(val);
6124 }
6125 }
6126 Err(ErrorContext::new_missing(
6127 "SetelemAttrs",
6128 "Expressions",
6129 self.orig_loc,
6130 self.buf.as_ptr() as usize,
6131 ))
6132 }
6133}
6134impl SetelemAttrs<'_> {
6135 pub fn new<'a>(buf: &'a [u8]) -> IterableSetelemAttrs<'a> {
6136 IterableSetelemAttrs::with_loc(buf, buf.as_ptr() as usize)
6137 }
6138 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6139 let res = match r#type {
6140 1u16 => "Key",
6141 2u16 => "Data",
6142 3u16 => "Flags",
6143 4u16 => "Timeout",
6144 5u16 => "Expiration",
6145 6u16 => "Userdata",
6146 7u16 => "Expr",
6147 8u16 => "Objref",
6148 9u16 => "KeyEnd",
6149 10u16 => "Expressions",
6150 _ => return None,
6151 };
6152 Some(res)
6153 }
6154}
6155#[derive(Clone, Copy, Default)]
6156pub struct IterableSetelemAttrs<'a> {
6157 buf: &'a [u8],
6158 pos: usize,
6159 orig_loc: usize,
6160}
6161impl<'a> IterableSetelemAttrs<'a> {
6162 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6163 Self {
6164 buf,
6165 pos: 0,
6166 orig_loc,
6167 }
6168 }
6169 pub fn get_buf(&self) -> &'a [u8] {
6170 self.buf
6171 }
6172}
6173impl<'a> Iterator for IterableSetelemAttrs<'a> {
6174 type Item = Result<SetelemAttrs<'a>, ErrorContext>;
6175 fn next(&mut self) -> Option<Self::Item> {
6176 let mut pos;
6177 let mut r#type;
6178 loop {
6179 pos = self.pos;
6180 r#type = None;
6181 if self.buf.len() == self.pos {
6182 return None;
6183 }
6184 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6185 self.pos = self.buf.len();
6186 break;
6187 };
6188 r#type = Some(header.r#type);
6189 let res = match header.r#type {
6190 1u16 => SetelemAttrs::Key({
6191 let res = Some(IterableDataAttrs::with_loc(next, self.orig_loc));
6192 let Some(val) = res else { break };
6193 val
6194 }),
6195 2u16 => SetelemAttrs::Data({
6196 let res = Some(IterableDataAttrs::with_loc(next, self.orig_loc));
6197 let Some(val) = res else { break };
6198 val
6199 }),
6200 3u16 => SetelemAttrs::Flags({
6201 let res = Some(next);
6202 let Some(val) = res else { break };
6203 val
6204 }),
6205 4u16 => SetelemAttrs::Timeout({
6206 let res = parse_u64(next);
6207 let Some(val) = res else { break };
6208 val
6209 }),
6210 5u16 => SetelemAttrs::Expiration({
6211 let res = parse_u64(next);
6212 let Some(val) = res else { break };
6213 val
6214 }),
6215 6u16 => SetelemAttrs::Userdata({
6216 let res = Some(next);
6217 let Some(val) = res else { break };
6218 val
6219 }),
6220 7u16 => SetelemAttrs::Expr({
6221 let res = Some(IterableExprAttrs::with_loc(next, self.orig_loc));
6222 let Some(val) = res else { break };
6223 val
6224 }),
6225 8u16 => SetelemAttrs::Objref({
6226 let res = CStr::from_bytes_with_nul(next).ok();
6227 let Some(val) = res else { break };
6228 val
6229 }),
6230 9u16 => SetelemAttrs::KeyEnd({
6231 let res = Some(IterableDataAttrs::with_loc(next, self.orig_loc));
6232 let Some(val) = res else { break };
6233 val
6234 }),
6235 10u16 => SetelemAttrs::Expressions({
6236 let res = Some(IterableExprListAttrs::with_loc(next, self.orig_loc));
6237 let Some(val) = res else { break };
6238 val
6239 }),
6240 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6241 n => continue,
6242 };
6243 return Some(Ok(res));
6244 }
6245 Some(Err(ErrorContext::new(
6246 "SetelemAttrs",
6247 r#type.and_then(|t| SetelemAttrs::attr_from_type(t)),
6248 self.orig_loc,
6249 self.buf.as_ptr().wrapping_add(pos) as usize,
6250 )))
6251 }
6252}
6253impl<'a> std::fmt::Debug for IterableSetelemAttrs<'_> {
6254 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6255 let mut fmt = f.debug_struct("SetelemAttrs");
6256 for attr in self.clone() {
6257 let attr = match attr {
6258 Ok(a) => a,
6259 Err(err) => {
6260 fmt.finish()?;
6261 f.write_str("Err(")?;
6262 err.fmt(f)?;
6263 return f.write_str(")");
6264 }
6265 };
6266 match attr {
6267 SetelemAttrs::Key(val) => fmt.field("Key", &val),
6268 SetelemAttrs::Data(val) => fmt.field("Data", &val),
6269 SetelemAttrs::Flags(val) => fmt.field("Flags", &val),
6270 SetelemAttrs::Timeout(val) => fmt.field("Timeout", &val),
6271 SetelemAttrs::Expiration(val) => fmt.field("Expiration", &val),
6272 SetelemAttrs::Userdata(val) => fmt.field("Userdata", &val),
6273 SetelemAttrs::Expr(val) => fmt.field("Expr", &val),
6274 SetelemAttrs::Objref(val) => fmt.field("Objref", &val),
6275 SetelemAttrs::KeyEnd(val) => fmt.field("KeyEnd", &val),
6276 SetelemAttrs::Expressions(val) => fmt.field("Expressions", &val),
6277 };
6278 }
6279 fmt.finish()
6280 }
6281}
6282impl IterableSetelemAttrs<'_> {
6283 pub fn lookup_attr(
6284 &self,
6285 offset: usize,
6286 missing_type: Option<u16>,
6287 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6288 let mut stack = Vec::new();
6289 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6290 if missing_type.is_some() && cur == offset {
6291 stack.push(("SetelemAttrs", offset));
6292 return (
6293 stack,
6294 missing_type.and_then(|t| SetelemAttrs::attr_from_type(t)),
6295 );
6296 }
6297 if cur > offset || cur + self.buf.len() < offset {
6298 return (stack, None);
6299 }
6300 let mut attrs = self.clone();
6301 let mut last_off = cur + attrs.pos;
6302 let mut missing = None;
6303 while let Some(attr) = attrs.next() {
6304 let Ok(attr) = attr else { break };
6305 match attr {
6306 SetelemAttrs::Key(val) => {
6307 (stack, missing) = val.lookup_attr(offset, missing_type);
6308 if !stack.is_empty() {
6309 break;
6310 }
6311 }
6312 SetelemAttrs::Data(val) => {
6313 (stack, missing) = val.lookup_attr(offset, missing_type);
6314 if !stack.is_empty() {
6315 break;
6316 }
6317 }
6318 SetelemAttrs::Flags(val) => {
6319 if last_off == offset {
6320 stack.push(("Flags", last_off));
6321 break;
6322 }
6323 }
6324 SetelemAttrs::Timeout(val) => {
6325 if last_off == offset {
6326 stack.push(("Timeout", last_off));
6327 break;
6328 }
6329 }
6330 SetelemAttrs::Expiration(val) => {
6331 if last_off == offset {
6332 stack.push(("Expiration", last_off));
6333 break;
6334 }
6335 }
6336 SetelemAttrs::Userdata(val) => {
6337 if last_off == offset {
6338 stack.push(("Userdata", last_off));
6339 break;
6340 }
6341 }
6342 SetelemAttrs::Expr(val) => {
6343 (stack, missing) = val.lookup_attr(offset, missing_type);
6344 if !stack.is_empty() {
6345 break;
6346 }
6347 }
6348 SetelemAttrs::Objref(val) => {
6349 if last_off == offset {
6350 stack.push(("Objref", last_off));
6351 break;
6352 }
6353 }
6354 SetelemAttrs::KeyEnd(val) => {
6355 (stack, missing) = val.lookup_attr(offset, missing_type);
6356 if !stack.is_empty() {
6357 break;
6358 }
6359 }
6360 SetelemAttrs::Expressions(val) => {
6361 (stack, missing) = val.lookup_attr(offset, missing_type);
6362 if !stack.is_empty() {
6363 break;
6364 }
6365 }
6366 _ => {}
6367 };
6368 last_off = cur + attrs.pos;
6369 }
6370 if !stack.is_empty() {
6371 stack.push(("SetelemAttrs", cur));
6372 }
6373 (stack, missing)
6374 }
6375}
6376#[derive(Clone)]
6377pub enum SetelemListElemAttrs<'a> {
6378 #[doc = "Attribute may repeat multiple times (treat it as array)"]
6379 Elem(IterableSetelemAttrs<'a>),
6380}
6381impl<'a> IterableSetelemListElemAttrs<'a> {
6382 #[doc = "Attribute may repeat multiple times (treat it as array)"]
6383 pub fn get_elem(
6384 &self,
6385 ) -> MultiAttrIterable<Self, SetelemListElemAttrs<'a>, IterableSetelemAttrs<'a>> {
6386 MultiAttrIterable::new(self.clone(), |variant| {
6387 if let SetelemListElemAttrs::Elem(val) = variant {
6388 Some(val)
6389 } else {
6390 None
6391 }
6392 })
6393 }
6394}
6395impl SetelemListElemAttrs<'_> {
6396 pub fn new<'a>(buf: &'a [u8]) -> IterableSetelemListElemAttrs<'a> {
6397 IterableSetelemListElemAttrs::with_loc(buf, buf.as_ptr() as usize)
6398 }
6399 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6400 let res = match r#type {
6401 1u16 => "Elem",
6402 _ => return None,
6403 };
6404 Some(res)
6405 }
6406}
6407#[derive(Clone, Copy, Default)]
6408pub struct IterableSetelemListElemAttrs<'a> {
6409 buf: &'a [u8],
6410 pos: usize,
6411 orig_loc: usize,
6412}
6413impl<'a> IterableSetelemListElemAttrs<'a> {
6414 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6415 Self {
6416 buf,
6417 pos: 0,
6418 orig_loc,
6419 }
6420 }
6421 pub fn get_buf(&self) -> &'a [u8] {
6422 self.buf
6423 }
6424}
6425impl<'a> Iterator for IterableSetelemListElemAttrs<'a> {
6426 type Item = Result<SetelemListElemAttrs<'a>, ErrorContext>;
6427 fn next(&mut self) -> Option<Self::Item> {
6428 let mut pos;
6429 let mut r#type;
6430 loop {
6431 pos = self.pos;
6432 r#type = None;
6433 if self.buf.len() == self.pos {
6434 return None;
6435 }
6436 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6437 self.pos = self.buf.len();
6438 break;
6439 };
6440 r#type = Some(header.r#type);
6441 let res = match header.r#type {
6442 1u16 => SetelemListElemAttrs::Elem({
6443 let res = Some(IterableSetelemAttrs::with_loc(next, self.orig_loc));
6444 let Some(val) = res else { break };
6445 val
6446 }),
6447 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6448 n => continue,
6449 };
6450 return Some(Ok(res));
6451 }
6452 Some(Err(ErrorContext::new(
6453 "SetelemListElemAttrs",
6454 r#type.and_then(|t| SetelemListElemAttrs::attr_from_type(t)),
6455 self.orig_loc,
6456 self.buf.as_ptr().wrapping_add(pos) as usize,
6457 )))
6458 }
6459}
6460impl<'a> std::fmt::Debug for IterableSetelemListElemAttrs<'_> {
6461 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6462 let mut fmt = f.debug_struct("SetelemListElemAttrs");
6463 for attr in self.clone() {
6464 let attr = match attr {
6465 Ok(a) => a,
6466 Err(err) => {
6467 fmt.finish()?;
6468 f.write_str("Err(")?;
6469 err.fmt(f)?;
6470 return f.write_str(")");
6471 }
6472 };
6473 match attr {
6474 SetelemListElemAttrs::Elem(val) => fmt.field("Elem", &val),
6475 };
6476 }
6477 fmt.finish()
6478 }
6479}
6480impl IterableSetelemListElemAttrs<'_> {
6481 pub fn lookup_attr(
6482 &self,
6483 offset: usize,
6484 missing_type: Option<u16>,
6485 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6486 let mut stack = Vec::new();
6487 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6488 if missing_type.is_some() && cur == offset {
6489 stack.push(("SetelemListElemAttrs", offset));
6490 return (
6491 stack,
6492 missing_type.and_then(|t| SetelemListElemAttrs::attr_from_type(t)),
6493 );
6494 }
6495 if cur > offset || cur + self.buf.len() < offset {
6496 return (stack, None);
6497 }
6498 let mut attrs = self.clone();
6499 let mut last_off = cur + attrs.pos;
6500 let mut missing = None;
6501 while let Some(attr) = attrs.next() {
6502 let Ok(attr) = attr else { break };
6503 match attr {
6504 SetelemListElemAttrs::Elem(val) => {
6505 (stack, missing) = val.lookup_attr(offset, missing_type);
6506 if !stack.is_empty() {
6507 break;
6508 }
6509 }
6510 _ => {}
6511 };
6512 last_off = cur + attrs.pos;
6513 }
6514 if !stack.is_empty() {
6515 stack.push(("SetelemListElemAttrs", cur));
6516 }
6517 (stack, missing)
6518 }
6519}
6520#[derive(Clone)]
6521pub enum SetelemListAttrs<'a> {
6522 Table(&'a CStr),
6523 Set(&'a CStr),
6524 Elements(IterableSetelemListElemAttrs<'a>),
6525 SetId(u32),
6526}
6527impl<'a> IterableSetelemListAttrs<'a> {
6528 pub fn get_table(&self) -> Result<&'a CStr, ErrorContext> {
6529 let mut iter = self.clone();
6530 iter.pos = 0;
6531 for attr in iter {
6532 if let Ok(SetelemListAttrs::Table(val)) = attr {
6533 return Ok(val);
6534 }
6535 }
6536 Err(ErrorContext::new_missing(
6537 "SetelemListAttrs",
6538 "Table",
6539 self.orig_loc,
6540 self.buf.as_ptr() as usize,
6541 ))
6542 }
6543 pub fn get_set(&self) -> Result<&'a CStr, ErrorContext> {
6544 let mut iter = self.clone();
6545 iter.pos = 0;
6546 for attr in iter {
6547 if let Ok(SetelemListAttrs::Set(val)) = attr {
6548 return Ok(val);
6549 }
6550 }
6551 Err(ErrorContext::new_missing(
6552 "SetelemListAttrs",
6553 "Set",
6554 self.orig_loc,
6555 self.buf.as_ptr() as usize,
6556 ))
6557 }
6558 pub fn get_elements(&self) -> Result<IterableSetelemListElemAttrs<'a>, ErrorContext> {
6559 let mut iter = self.clone();
6560 iter.pos = 0;
6561 for attr in iter {
6562 if let Ok(SetelemListAttrs::Elements(val)) = attr {
6563 return Ok(val);
6564 }
6565 }
6566 Err(ErrorContext::new_missing(
6567 "SetelemListAttrs",
6568 "Elements",
6569 self.orig_loc,
6570 self.buf.as_ptr() as usize,
6571 ))
6572 }
6573 pub fn get_set_id(&self) -> Result<u32, ErrorContext> {
6574 let mut iter = self.clone();
6575 iter.pos = 0;
6576 for attr in iter {
6577 if let Ok(SetelemListAttrs::SetId(val)) = attr {
6578 return Ok(val);
6579 }
6580 }
6581 Err(ErrorContext::new_missing(
6582 "SetelemListAttrs",
6583 "SetId",
6584 self.orig_loc,
6585 self.buf.as_ptr() as usize,
6586 ))
6587 }
6588}
6589impl SetelemListAttrs<'_> {
6590 pub fn new<'a>(buf: &'a [u8]) -> IterableSetelemListAttrs<'a> {
6591 IterableSetelemListAttrs::with_loc(buf, buf.as_ptr() as usize)
6592 }
6593 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6594 let res = match r#type {
6595 1u16 => "Table",
6596 2u16 => "Set",
6597 3u16 => "Elements",
6598 4u16 => "SetId",
6599 _ => return None,
6600 };
6601 Some(res)
6602 }
6603}
6604#[derive(Clone, Copy, Default)]
6605pub struct IterableSetelemListAttrs<'a> {
6606 buf: &'a [u8],
6607 pos: usize,
6608 orig_loc: usize,
6609}
6610impl<'a> IterableSetelemListAttrs<'a> {
6611 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6612 Self {
6613 buf,
6614 pos: 0,
6615 orig_loc,
6616 }
6617 }
6618 pub fn get_buf(&self) -> &'a [u8] {
6619 self.buf
6620 }
6621}
6622impl<'a> Iterator for IterableSetelemListAttrs<'a> {
6623 type Item = Result<SetelemListAttrs<'a>, ErrorContext>;
6624 fn next(&mut self) -> Option<Self::Item> {
6625 let mut pos;
6626 let mut r#type;
6627 loop {
6628 pos = self.pos;
6629 r#type = None;
6630 if self.buf.len() == self.pos {
6631 return None;
6632 }
6633 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6634 self.pos = self.buf.len();
6635 break;
6636 };
6637 r#type = Some(header.r#type);
6638 let res = match header.r#type {
6639 1u16 => SetelemListAttrs::Table({
6640 let res = CStr::from_bytes_with_nul(next).ok();
6641 let Some(val) = res else { break };
6642 val
6643 }),
6644 2u16 => SetelemListAttrs::Set({
6645 let res = CStr::from_bytes_with_nul(next).ok();
6646 let Some(val) = res else { break };
6647 val
6648 }),
6649 3u16 => SetelemListAttrs::Elements({
6650 let res = Some(IterableSetelemListElemAttrs::with_loc(next, self.orig_loc));
6651 let Some(val) = res else { break };
6652 val
6653 }),
6654 4u16 => SetelemListAttrs::SetId({
6655 let res = parse_u32(next);
6656 let Some(val) = res else { break };
6657 val
6658 }),
6659 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6660 n => continue,
6661 };
6662 return Some(Ok(res));
6663 }
6664 Some(Err(ErrorContext::new(
6665 "SetelemListAttrs",
6666 r#type.and_then(|t| SetelemListAttrs::attr_from_type(t)),
6667 self.orig_loc,
6668 self.buf.as_ptr().wrapping_add(pos) as usize,
6669 )))
6670 }
6671}
6672impl<'a> std::fmt::Debug for IterableSetelemListAttrs<'_> {
6673 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6674 let mut fmt = f.debug_struct("SetelemListAttrs");
6675 for attr in self.clone() {
6676 let attr = match attr {
6677 Ok(a) => a,
6678 Err(err) => {
6679 fmt.finish()?;
6680 f.write_str("Err(")?;
6681 err.fmt(f)?;
6682 return f.write_str(")");
6683 }
6684 };
6685 match attr {
6686 SetelemListAttrs::Table(val) => fmt.field("Table", &val),
6687 SetelemListAttrs::Set(val) => fmt.field("Set", &val),
6688 SetelemListAttrs::Elements(val) => fmt.field("Elements", &val),
6689 SetelemListAttrs::SetId(val) => fmt.field("SetId", &val),
6690 };
6691 }
6692 fmt.finish()
6693 }
6694}
6695impl IterableSetelemListAttrs<'_> {
6696 pub fn lookup_attr(
6697 &self,
6698 offset: usize,
6699 missing_type: Option<u16>,
6700 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6701 let mut stack = Vec::new();
6702 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6703 if missing_type.is_some() && cur == offset {
6704 stack.push(("SetelemListAttrs", offset));
6705 return (
6706 stack,
6707 missing_type.and_then(|t| SetelemListAttrs::attr_from_type(t)),
6708 );
6709 }
6710 if cur > offset || cur + self.buf.len() < offset {
6711 return (stack, None);
6712 }
6713 let mut attrs = self.clone();
6714 let mut last_off = cur + attrs.pos;
6715 let mut missing = None;
6716 while let Some(attr) = attrs.next() {
6717 let Ok(attr) = attr else { break };
6718 match attr {
6719 SetelemListAttrs::Table(val) => {
6720 if last_off == offset {
6721 stack.push(("Table", last_off));
6722 break;
6723 }
6724 }
6725 SetelemListAttrs::Set(val) => {
6726 if last_off == offset {
6727 stack.push(("Set", last_off));
6728 break;
6729 }
6730 }
6731 SetelemListAttrs::Elements(val) => {
6732 (stack, missing) = val.lookup_attr(offset, missing_type);
6733 if !stack.is_empty() {
6734 break;
6735 }
6736 }
6737 SetelemListAttrs::SetId(val) => {
6738 if last_off == offset {
6739 stack.push(("SetId", last_off));
6740 break;
6741 }
6742 }
6743 _ => {}
6744 };
6745 last_off = cur + attrs.pos;
6746 }
6747 if !stack.is_empty() {
6748 stack.push(("SetelemListAttrs", cur));
6749 }
6750 (stack, missing)
6751 }
6752}
6753#[derive(Clone)]
6754pub enum GenAttrs<'a> {
6755 #[doc = "ruleset generation id\n"]
6756 Id(u32),
6757 ProcPid(u32),
6758 ProcName(&'a CStr),
6759}
6760impl<'a> IterableGenAttrs<'a> {
6761 #[doc = "ruleset generation id\n"]
6762 pub fn get_id(&self) -> Result<u32, ErrorContext> {
6763 let mut iter = self.clone();
6764 iter.pos = 0;
6765 for attr in iter {
6766 if let Ok(GenAttrs::Id(val)) = attr {
6767 return Ok(val);
6768 }
6769 }
6770 Err(ErrorContext::new_missing(
6771 "GenAttrs",
6772 "Id",
6773 self.orig_loc,
6774 self.buf.as_ptr() as usize,
6775 ))
6776 }
6777 pub fn get_proc_pid(&self) -> Result<u32, ErrorContext> {
6778 let mut iter = self.clone();
6779 iter.pos = 0;
6780 for attr in iter {
6781 if let Ok(GenAttrs::ProcPid(val)) = attr {
6782 return Ok(val);
6783 }
6784 }
6785 Err(ErrorContext::new_missing(
6786 "GenAttrs",
6787 "ProcPid",
6788 self.orig_loc,
6789 self.buf.as_ptr() as usize,
6790 ))
6791 }
6792 pub fn get_proc_name(&self) -> Result<&'a CStr, ErrorContext> {
6793 let mut iter = self.clone();
6794 iter.pos = 0;
6795 for attr in iter {
6796 if let Ok(GenAttrs::ProcName(val)) = attr {
6797 return Ok(val);
6798 }
6799 }
6800 Err(ErrorContext::new_missing(
6801 "GenAttrs",
6802 "ProcName",
6803 self.orig_loc,
6804 self.buf.as_ptr() as usize,
6805 ))
6806 }
6807}
6808impl GenAttrs<'_> {
6809 pub fn new<'a>(buf: &'a [u8]) -> IterableGenAttrs<'a> {
6810 IterableGenAttrs::with_loc(buf, buf.as_ptr() as usize)
6811 }
6812 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6813 let res = match r#type {
6814 1u16 => "Id",
6815 2u16 => "ProcPid",
6816 3u16 => "ProcName",
6817 _ => return None,
6818 };
6819 Some(res)
6820 }
6821}
6822#[derive(Clone, Copy, Default)]
6823pub struct IterableGenAttrs<'a> {
6824 buf: &'a [u8],
6825 pos: usize,
6826 orig_loc: usize,
6827}
6828impl<'a> IterableGenAttrs<'a> {
6829 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6830 Self {
6831 buf,
6832 pos: 0,
6833 orig_loc,
6834 }
6835 }
6836 pub fn get_buf(&self) -> &'a [u8] {
6837 self.buf
6838 }
6839}
6840impl<'a> Iterator for IterableGenAttrs<'a> {
6841 type Item = Result<GenAttrs<'a>, ErrorContext>;
6842 fn next(&mut self) -> Option<Self::Item> {
6843 let mut pos;
6844 let mut r#type;
6845 loop {
6846 pos = self.pos;
6847 r#type = None;
6848 if self.buf.len() == self.pos {
6849 return None;
6850 }
6851 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6852 self.pos = self.buf.len();
6853 break;
6854 };
6855 r#type = Some(header.r#type);
6856 let res = match header.r#type {
6857 1u16 => GenAttrs::Id({
6858 let res = parse_be_u32(next);
6859 let Some(val) = res else { break };
6860 val
6861 }),
6862 2u16 => GenAttrs::ProcPid({
6863 let res = parse_be_u32(next);
6864 let Some(val) = res else { break };
6865 val
6866 }),
6867 3u16 => GenAttrs::ProcName({
6868 let res = CStr::from_bytes_with_nul(next).ok();
6869 let Some(val) = res else { break };
6870 val
6871 }),
6872 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6873 n => continue,
6874 };
6875 return Some(Ok(res));
6876 }
6877 Some(Err(ErrorContext::new(
6878 "GenAttrs",
6879 r#type.and_then(|t| GenAttrs::attr_from_type(t)),
6880 self.orig_loc,
6881 self.buf.as_ptr().wrapping_add(pos) as usize,
6882 )))
6883 }
6884}
6885impl<'a> std::fmt::Debug for IterableGenAttrs<'_> {
6886 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6887 let mut fmt = f.debug_struct("GenAttrs");
6888 for attr in self.clone() {
6889 let attr = match attr {
6890 Ok(a) => a,
6891 Err(err) => {
6892 fmt.finish()?;
6893 f.write_str("Err(")?;
6894 err.fmt(f)?;
6895 return f.write_str(")");
6896 }
6897 };
6898 match attr {
6899 GenAttrs::Id(val) => fmt.field("Id", &val),
6900 GenAttrs::ProcPid(val) => fmt.field("ProcPid", &val),
6901 GenAttrs::ProcName(val) => fmt.field("ProcName", &val),
6902 };
6903 }
6904 fmt.finish()
6905 }
6906}
6907impl IterableGenAttrs<'_> {
6908 pub fn lookup_attr(
6909 &self,
6910 offset: usize,
6911 missing_type: Option<u16>,
6912 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6913 let mut stack = Vec::new();
6914 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6915 if missing_type.is_some() && cur == offset {
6916 stack.push(("GenAttrs", offset));
6917 return (
6918 stack,
6919 missing_type.and_then(|t| GenAttrs::attr_from_type(t)),
6920 );
6921 }
6922 if cur > offset || cur + self.buf.len() < offset {
6923 return (stack, None);
6924 }
6925 let mut attrs = self.clone();
6926 let mut last_off = cur + attrs.pos;
6927 while let Some(attr) = attrs.next() {
6928 let Ok(attr) = attr else { break };
6929 match attr {
6930 GenAttrs::Id(val) => {
6931 if last_off == offset {
6932 stack.push(("Id", last_off));
6933 break;
6934 }
6935 }
6936 GenAttrs::ProcPid(val) => {
6937 if last_off == offset {
6938 stack.push(("ProcPid", last_off));
6939 break;
6940 }
6941 }
6942 GenAttrs::ProcName(val) => {
6943 if last_off == offset {
6944 stack.push(("ProcName", last_off));
6945 break;
6946 }
6947 }
6948 _ => {}
6949 };
6950 last_off = cur + attrs.pos;
6951 }
6952 if !stack.is_empty() {
6953 stack.push(("GenAttrs", cur));
6954 }
6955 (stack, None)
6956 }
6957}
6958#[derive(Clone)]
6959pub enum ObjAttrs<'a> {
6960 #[doc = "name of the table containing the expression\n"]
6961 Table(&'a CStr),
6962 #[doc = "name of this expression type\n"]
6963 Name(&'a CStr),
6964 #[doc = "stateful object type\n\nAssociated type: [`ObjectType`] (enum)"]
6965 Type(u32),
6966 #[doc = "stateful object data\n"]
6967 Data(ObjData<'a>),
6968 #[doc = "number of references to this expression\n"]
6969 Use(u32),
6970 #[doc = "object handle\n"]
6971 Handle(u64),
6972 Pad(&'a [u8]),
6973 #[doc = "user data\n"]
6974 Userdata(&'a [u8]),
6975}
6976impl<'a> IterableObjAttrs<'a> {
6977 #[doc = "name of the table containing the expression\n"]
6978 pub fn get_table(&self) -> Result<&'a CStr, ErrorContext> {
6979 let mut iter = self.clone();
6980 iter.pos = 0;
6981 for attr in iter {
6982 if let Ok(ObjAttrs::Table(val)) = attr {
6983 return Ok(val);
6984 }
6985 }
6986 Err(ErrorContext::new_missing(
6987 "ObjAttrs",
6988 "Table",
6989 self.orig_loc,
6990 self.buf.as_ptr() as usize,
6991 ))
6992 }
6993 #[doc = "name of this expression type\n"]
6994 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
6995 let mut iter = self.clone();
6996 iter.pos = 0;
6997 for attr in iter {
6998 if let Ok(ObjAttrs::Name(val)) = attr {
6999 return Ok(val);
7000 }
7001 }
7002 Err(ErrorContext::new_missing(
7003 "ObjAttrs",
7004 "Name",
7005 self.orig_loc,
7006 self.buf.as_ptr() as usize,
7007 ))
7008 }
7009 #[doc = "stateful object type\n\nAssociated type: [`ObjectType`] (enum)"]
7010 pub fn get_type(&self) -> Result<u32, ErrorContext> {
7011 let mut iter = self.clone();
7012 iter.pos = 0;
7013 for attr in iter {
7014 if let Ok(ObjAttrs::Type(val)) = attr {
7015 return Ok(val);
7016 }
7017 }
7018 Err(ErrorContext::new_missing(
7019 "ObjAttrs",
7020 "Type",
7021 self.orig_loc,
7022 self.buf.as_ptr() as usize,
7023 ))
7024 }
7025 #[doc = "stateful object data\n"]
7026 pub fn get_data(&self) -> Result<ObjData<'a>, ErrorContext> {
7027 let mut iter = self.clone();
7028 iter.pos = 0;
7029 for attr in iter {
7030 if let Ok(ObjAttrs::Data(val)) = attr {
7031 return Ok(val);
7032 }
7033 }
7034 Err(ErrorContext::new_missing(
7035 "ObjAttrs",
7036 "Data",
7037 self.orig_loc,
7038 self.buf.as_ptr() as usize,
7039 ))
7040 }
7041 #[doc = "number of references to this expression\n"]
7042 pub fn get_use(&self) -> Result<u32, ErrorContext> {
7043 let mut iter = self.clone();
7044 iter.pos = 0;
7045 for attr in iter {
7046 if let Ok(ObjAttrs::Use(val)) = attr {
7047 return Ok(val);
7048 }
7049 }
7050 Err(ErrorContext::new_missing(
7051 "ObjAttrs",
7052 "Use",
7053 self.orig_loc,
7054 self.buf.as_ptr() as usize,
7055 ))
7056 }
7057 #[doc = "object handle\n"]
7058 pub fn get_handle(&self) -> Result<u64, ErrorContext> {
7059 let mut iter = self.clone();
7060 iter.pos = 0;
7061 for attr in iter {
7062 if let Ok(ObjAttrs::Handle(val)) = attr {
7063 return Ok(val);
7064 }
7065 }
7066 Err(ErrorContext::new_missing(
7067 "ObjAttrs",
7068 "Handle",
7069 self.orig_loc,
7070 self.buf.as_ptr() as usize,
7071 ))
7072 }
7073 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
7074 let mut iter = self.clone();
7075 iter.pos = 0;
7076 for attr in iter {
7077 if let Ok(ObjAttrs::Pad(val)) = attr {
7078 return Ok(val);
7079 }
7080 }
7081 Err(ErrorContext::new_missing(
7082 "ObjAttrs",
7083 "Pad",
7084 self.orig_loc,
7085 self.buf.as_ptr() as usize,
7086 ))
7087 }
7088 #[doc = "user data\n"]
7089 pub fn get_userdata(&self) -> Result<&'a [u8], ErrorContext> {
7090 let mut iter = self.clone();
7091 iter.pos = 0;
7092 for attr in iter {
7093 if let Ok(ObjAttrs::Userdata(val)) = attr {
7094 return Ok(val);
7095 }
7096 }
7097 Err(ErrorContext::new_missing(
7098 "ObjAttrs",
7099 "Userdata",
7100 self.orig_loc,
7101 self.buf.as_ptr() as usize,
7102 ))
7103 }
7104}
7105#[derive(Debug, Clone)]
7106pub enum ObjData<'a> {
7107 Counter(IterableCounterAttrs<'a>),
7108 Quota(IterableQuotaAttrs<'a>),
7109}
7110impl<'a> ObjData<'a> {
7111 fn select_with_loc(selector: u32, buf: &'a [u8], loc: usize) -> Option<Self> {
7112 match selector {
7113 val if val == ObjectType::Counter as u32 => {
7114 Some(ObjData::Counter(IterableCounterAttrs::with_loc(buf, loc)))
7115 }
7116 val if val == ObjectType::Quota as u32 => {
7117 Some(ObjData::Quota(IterableQuotaAttrs::with_loc(buf, loc)))
7118 }
7119 _ => None,
7120 }
7121 }
7122}
7123impl ObjAttrs<'_> {
7124 pub fn new<'a>(buf: &'a [u8]) -> IterableObjAttrs<'a> {
7125 IterableObjAttrs::with_loc(buf, buf.as_ptr() as usize)
7126 }
7127 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7128 let res = match r#type {
7129 1u16 => "Table",
7130 2u16 => "Name",
7131 3u16 => "Type",
7132 4u16 => "Data",
7133 5u16 => "Use",
7134 6u16 => "Handle",
7135 7u16 => "Pad",
7136 8u16 => "Userdata",
7137 _ => return None,
7138 };
7139 Some(res)
7140 }
7141}
7142#[derive(Clone, Copy, Default)]
7143pub struct IterableObjAttrs<'a> {
7144 buf: &'a [u8],
7145 pos: usize,
7146 orig_loc: usize,
7147}
7148impl<'a> IterableObjAttrs<'a> {
7149 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7150 Self {
7151 buf,
7152 pos: 0,
7153 orig_loc,
7154 }
7155 }
7156 pub fn get_buf(&self) -> &'a [u8] {
7157 self.buf
7158 }
7159}
7160impl<'a> Iterator for IterableObjAttrs<'a> {
7161 type Item = Result<ObjAttrs<'a>, ErrorContext>;
7162 fn next(&mut self) -> Option<Self::Item> {
7163 let mut pos;
7164 let mut r#type;
7165 loop {
7166 pos = self.pos;
7167 r#type = None;
7168 if self.buf.len() == self.pos {
7169 return None;
7170 }
7171 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7172 self.pos = self.buf.len();
7173 break;
7174 };
7175 r#type = Some(header.r#type);
7176 let res = match header.r#type {
7177 1u16 => ObjAttrs::Table({
7178 let res = CStr::from_bytes_with_nul(next).ok();
7179 let Some(val) = res else { break };
7180 val
7181 }),
7182 2u16 => ObjAttrs::Name({
7183 let res = CStr::from_bytes_with_nul(next).ok();
7184 let Some(val) = res else { break };
7185 val
7186 }),
7187 3u16 => ObjAttrs::Type({
7188 let res = parse_be_u32(next);
7189 let Some(val) = res else { break };
7190 val
7191 }),
7192 4u16 => ObjAttrs::Data({
7193 let res = {
7194 let Ok(selector) = self.get_type() else { break };
7195 match ObjData::select_with_loc(selector, next, self.orig_loc) {
7196 Some(sub) => Some(sub),
7197 None if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7198 None => continue,
7199 }
7200 };
7201 let Some(val) = res else { break };
7202 val
7203 }),
7204 5u16 => ObjAttrs::Use({
7205 let res = parse_be_u32(next);
7206 let Some(val) = res else { break };
7207 val
7208 }),
7209 6u16 => ObjAttrs::Handle({
7210 let res = parse_be_u64(next);
7211 let Some(val) = res else { break };
7212 val
7213 }),
7214 7u16 => ObjAttrs::Pad({
7215 let res = Some(next);
7216 let Some(val) = res else { break };
7217 val
7218 }),
7219 8u16 => ObjAttrs::Userdata({
7220 let res = Some(next);
7221 let Some(val) = res else { break };
7222 val
7223 }),
7224 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7225 n => continue,
7226 };
7227 return Some(Ok(res));
7228 }
7229 Some(Err(ErrorContext::new(
7230 "ObjAttrs",
7231 r#type.and_then(|t| ObjAttrs::attr_from_type(t)),
7232 self.orig_loc,
7233 self.buf.as_ptr().wrapping_add(pos) as usize,
7234 )))
7235 }
7236}
7237impl<'a> std::fmt::Debug for IterableObjAttrs<'_> {
7238 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7239 let mut fmt = f.debug_struct("ObjAttrs");
7240 for attr in self.clone() {
7241 let attr = match attr {
7242 Ok(a) => a,
7243 Err(err) => {
7244 fmt.finish()?;
7245 f.write_str("Err(")?;
7246 err.fmt(f)?;
7247 return f.write_str(")");
7248 }
7249 };
7250 match attr {
7251 ObjAttrs::Table(val) => fmt.field("Table", &val),
7252 ObjAttrs::Name(val) => fmt.field("Name", &val),
7253 ObjAttrs::Type(val) => {
7254 fmt.field("Type", &FormatEnum(val.into(), ObjectType::from_value))
7255 }
7256 ObjAttrs::Data(val) => fmt.field("Data", &val),
7257 ObjAttrs::Use(val) => fmt.field("Use", &val),
7258 ObjAttrs::Handle(val) => fmt.field("Handle", &val),
7259 ObjAttrs::Pad(val) => fmt.field("Pad", &val),
7260 ObjAttrs::Userdata(val) => fmt.field("Userdata", &val),
7261 };
7262 }
7263 fmt.finish()
7264 }
7265}
7266impl IterableObjAttrs<'_> {
7267 pub fn lookup_attr(
7268 &self,
7269 offset: usize,
7270 missing_type: Option<u16>,
7271 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7272 let mut stack = Vec::new();
7273 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7274 if missing_type.is_some() && cur == offset {
7275 stack.push(("ObjAttrs", offset));
7276 return (
7277 stack,
7278 missing_type.and_then(|t| ObjAttrs::attr_from_type(t)),
7279 );
7280 }
7281 if cur > offset || cur + self.buf.len() < offset {
7282 return (stack, None);
7283 }
7284 let mut attrs = self.clone();
7285 let mut last_off = cur + attrs.pos;
7286 while let Some(attr) = attrs.next() {
7287 let Ok(attr) = attr else { break };
7288 match attr {
7289 ObjAttrs::Table(val) => {
7290 if last_off == offset {
7291 stack.push(("Table", last_off));
7292 break;
7293 }
7294 }
7295 ObjAttrs::Name(val) => {
7296 if last_off == offset {
7297 stack.push(("Name", last_off));
7298 break;
7299 }
7300 }
7301 ObjAttrs::Type(val) => {
7302 if last_off == offset {
7303 stack.push(("Type", last_off));
7304 break;
7305 }
7306 }
7307 ObjAttrs::Data(val) => {
7308 if last_off == offset {
7309 stack.push(("Data", last_off));
7310 break;
7311 }
7312 }
7313 ObjAttrs::Use(val) => {
7314 if last_off == offset {
7315 stack.push(("Use", last_off));
7316 break;
7317 }
7318 }
7319 ObjAttrs::Handle(val) => {
7320 if last_off == offset {
7321 stack.push(("Handle", last_off));
7322 break;
7323 }
7324 }
7325 ObjAttrs::Pad(val) => {
7326 if last_off == offset {
7327 stack.push(("Pad", last_off));
7328 break;
7329 }
7330 }
7331 ObjAttrs::Userdata(val) => {
7332 if last_off == offset {
7333 stack.push(("Userdata", last_off));
7334 break;
7335 }
7336 }
7337 _ => {}
7338 };
7339 last_off = cur + attrs.pos;
7340 }
7341 if !stack.is_empty() {
7342 stack.push(("ObjAttrs", cur));
7343 }
7344 (stack, None)
7345 }
7346}
7347#[derive(Clone)]
7348pub enum QuotaAttrs<'a> {
7349 Bytes(u64),
7350 #[doc = "Associated type: [`QuotaFlags`] (enum)"]
7351 Flags(u32),
7352 Pad(&'a [u8]),
7353 Consumed(u64),
7354}
7355impl<'a> IterableQuotaAttrs<'a> {
7356 pub fn get_bytes(&self) -> Result<u64, ErrorContext> {
7357 let mut iter = self.clone();
7358 iter.pos = 0;
7359 for attr in iter {
7360 if let Ok(QuotaAttrs::Bytes(val)) = attr {
7361 return Ok(val);
7362 }
7363 }
7364 Err(ErrorContext::new_missing(
7365 "QuotaAttrs",
7366 "Bytes",
7367 self.orig_loc,
7368 self.buf.as_ptr() as usize,
7369 ))
7370 }
7371 #[doc = "Associated type: [`QuotaFlags`] (enum)"]
7372 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
7373 let mut iter = self.clone();
7374 iter.pos = 0;
7375 for attr in iter {
7376 if let Ok(QuotaAttrs::Flags(val)) = attr {
7377 return Ok(val);
7378 }
7379 }
7380 Err(ErrorContext::new_missing(
7381 "QuotaAttrs",
7382 "Flags",
7383 self.orig_loc,
7384 self.buf.as_ptr() as usize,
7385 ))
7386 }
7387 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
7388 let mut iter = self.clone();
7389 iter.pos = 0;
7390 for attr in iter {
7391 if let Ok(QuotaAttrs::Pad(val)) = attr {
7392 return Ok(val);
7393 }
7394 }
7395 Err(ErrorContext::new_missing(
7396 "QuotaAttrs",
7397 "Pad",
7398 self.orig_loc,
7399 self.buf.as_ptr() as usize,
7400 ))
7401 }
7402 pub fn get_consumed(&self) -> Result<u64, ErrorContext> {
7403 let mut iter = self.clone();
7404 iter.pos = 0;
7405 for attr in iter {
7406 if let Ok(QuotaAttrs::Consumed(val)) = attr {
7407 return Ok(val);
7408 }
7409 }
7410 Err(ErrorContext::new_missing(
7411 "QuotaAttrs",
7412 "Consumed",
7413 self.orig_loc,
7414 self.buf.as_ptr() as usize,
7415 ))
7416 }
7417}
7418impl QuotaAttrs<'_> {
7419 pub fn new<'a>(buf: &'a [u8]) -> IterableQuotaAttrs<'a> {
7420 IterableQuotaAttrs::with_loc(buf, buf.as_ptr() as usize)
7421 }
7422 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7423 let res = match r#type {
7424 1u16 => "Bytes",
7425 2u16 => "Flags",
7426 3u16 => "Pad",
7427 4u16 => "Consumed",
7428 _ => return None,
7429 };
7430 Some(res)
7431 }
7432}
7433#[derive(Clone, Copy, Default)]
7434pub struct IterableQuotaAttrs<'a> {
7435 buf: &'a [u8],
7436 pos: usize,
7437 orig_loc: usize,
7438}
7439impl<'a> IterableQuotaAttrs<'a> {
7440 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7441 Self {
7442 buf,
7443 pos: 0,
7444 orig_loc,
7445 }
7446 }
7447 pub fn get_buf(&self) -> &'a [u8] {
7448 self.buf
7449 }
7450}
7451impl<'a> Iterator for IterableQuotaAttrs<'a> {
7452 type Item = Result<QuotaAttrs<'a>, ErrorContext>;
7453 fn next(&mut self) -> Option<Self::Item> {
7454 let mut pos;
7455 let mut r#type;
7456 loop {
7457 pos = self.pos;
7458 r#type = None;
7459 if self.buf.len() == self.pos {
7460 return None;
7461 }
7462 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7463 self.pos = self.buf.len();
7464 break;
7465 };
7466 r#type = Some(header.r#type);
7467 let res = match header.r#type {
7468 1u16 => QuotaAttrs::Bytes({
7469 let res = parse_be_u64(next);
7470 let Some(val) = res else { break };
7471 val
7472 }),
7473 2u16 => QuotaAttrs::Flags({
7474 let res = parse_be_u32(next);
7475 let Some(val) = res else { break };
7476 val
7477 }),
7478 3u16 => QuotaAttrs::Pad({
7479 let res = Some(next);
7480 let Some(val) = res else { break };
7481 val
7482 }),
7483 4u16 => QuotaAttrs::Consumed({
7484 let res = parse_be_u64(next);
7485 let Some(val) = res else { break };
7486 val
7487 }),
7488 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7489 n => continue,
7490 };
7491 return Some(Ok(res));
7492 }
7493 Some(Err(ErrorContext::new(
7494 "QuotaAttrs",
7495 r#type.and_then(|t| QuotaAttrs::attr_from_type(t)),
7496 self.orig_loc,
7497 self.buf.as_ptr().wrapping_add(pos) as usize,
7498 )))
7499 }
7500}
7501impl<'a> std::fmt::Debug for IterableQuotaAttrs<'_> {
7502 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7503 let mut fmt = f.debug_struct("QuotaAttrs");
7504 for attr in self.clone() {
7505 let attr = match attr {
7506 Ok(a) => a,
7507 Err(err) => {
7508 fmt.finish()?;
7509 f.write_str("Err(")?;
7510 err.fmt(f)?;
7511 return f.write_str(")");
7512 }
7513 };
7514 match attr {
7515 QuotaAttrs::Bytes(val) => fmt.field("Bytes", &val),
7516 QuotaAttrs::Flags(val) => {
7517 fmt.field("Flags", &FormatFlags(val.into(), QuotaFlags::from_value))
7518 }
7519 QuotaAttrs::Pad(val) => fmt.field("Pad", &val),
7520 QuotaAttrs::Consumed(val) => fmt.field("Consumed", &val),
7521 };
7522 }
7523 fmt.finish()
7524 }
7525}
7526impl IterableQuotaAttrs<'_> {
7527 pub fn lookup_attr(
7528 &self,
7529 offset: usize,
7530 missing_type: Option<u16>,
7531 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7532 let mut stack = Vec::new();
7533 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7534 if missing_type.is_some() && cur == offset {
7535 stack.push(("QuotaAttrs", offset));
7536 return (
7537 stack,
7538 missing_type.and_then(|t| QuotaAttrs::attr_from_type(t)),
7539 );
7540 }
7541 if cur > offset || cur + self.buf.len() < offset {
7542 return (stack, None);
7543 }
7544 let mut attrs = self.clone();
7545 let mut last_off = cur + attrs.pos;
7546 while let Some(attr) = attrs.next() {
7547 let Ok(attr) = attr else { break };
7548 match attr {
7549 QuotaAttrs::Bytes(val) => {
7550 if last_off == offset {
7551 stack.push(("Bytes", last_off));
7552 break;
7553 }
7554 }
7555 QuotaAttrs::Flags(val) => {
7556 if last_off == offset {
7557 stack.push(("Flags", last_off));
7558 break;
7559 }
7560 }
7561 QuotaAttrs::Pad(val) => {
7562 if last_off == offset {
7563 stack.push(("Pad", last_off));
7564 break;
7565 }
7566 }
7567 QuotaAttrs::Consumed(val) => {
7568 if last_off == offset {
7569 stack.push(("Consumed", last_off));
7570 break;
7571 }
7572 }
7573 _ => {}
7574 };
7575 last_off = cur + attrs.pos;
7576 }
7577 if !stack.is_empty() {
7578 stack.push(("QuotaAttrs", cur));
7579 }
7580 (stack, None)
7581 }
7582}
7583#[derive(Clone)]
7584pub enum FlowtableAttrs<'a> {
7585 Table(&'a CStr),
7586 Name(&'a CStr),
7587 Hook(IterableFlowtableHookAttrs<'a>),
7588 Use(u32),
7589 Handle(u64),
7590 Pad(&'a [u8]),
7591 Flags(u32),
7592}
7593impl<'a> IterableFlowtableAttrs<'a> {
7594 pub fn get_table(&self) -> Result<&'a CStr, ErrorContext> {
7595 let mut iter = self.clone();
7596 iter.pos = 0;
7597 for attr in iter {
7598 if let Ok(FlowtableAttrs::Table(val)) = attr {
7599 return Ok(val);
7600 }
7601 }
7602 Err(ErrorContext::new_missing(
7603 "FlowtableAttrs",
7604 "Table",
7605 self.orig_loc,
7606 self.buf.as_ptr() as usize,
7607 ))
7608 }
7609 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
7610 let mut iter = self.clone();
7611 iter.pos = 0;
7612 for attr in iter {
7613 if let Ok(FlowtableAttrs::Name(val)) = attr {
7614 return Ok(val);
7615 }
7616 }
7617 Err(ErrorContext::new_missing(
7618 "FlowtableAttrs",
7619 "Name",
7620 self.orig_loc,
7621 self.buf.as_ptr() as usize,
7622 ))
7623 }
7624 pub fn get_hook(&self) -> Result<IterableFlowtableHookAttrs<'a>, ErrorContext> {
7625 let mut iter = self.clone();
7626 iter.pos = 0;
7627 for attr in iter {
7628 if let Ok(FlowtableAttrs::Hook(val)) = attr {
7629 return Ok(val);
7630 }
7631 }
7632 Err(ErrorContext::new_missing(
7633 "FlowtableAttrs",
7634 "Hook",
7635 self.orig_loc,
7636 self.buf.as_ptr() as usize,
7637 ))
7638 }
7639 pub fn get_use(&self) -> Result<u32, ErrorContext> {
7640 let mut iter = self.clone();
7641 iter.pos = 0;
7642 for attr in iter {
7643 if let Ok(FlowtableAttrs::Use(val)) = attr {
7644 return Ok(val);
7645 }
7646 }
7647 Err(ErrorContext::new_missing(
7648 "FlowtableAttrs",
7649 "Use",
7650 self.orig_loc,
7651 self.buf.as_ptr() as usize,
7652 ))
7653 }
7654 pub fn get_handle(&self) -> Result<u64, ErrorContext> {
7655 let mut iter = self.clone();
7656 iter.pos = 0;
7657 for attr in iter {
7658 if let Ok(FlowtableAttrs::Handle(val)) = attr {
7659 return Ok(val);
7660 }
7661 }
7662 Err(ErrorContext::new_missing(
7663 "FlowtableAttrs",
7664 "Handle",
7665 self.orig_loc,
7666 self.buf.as_ptr() as usize,
7667 ))
7668 }
7669 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
7670 let mut iter = self.clone();
7671 iter.pos = 0;
7672 for attr in iter {
7673 if let Ok(FlowtableAttrs::Pad(val)) = attr {
7674 return Ok(val);
7675 }
7676 }
7677 Err(ErrorContext::new_missing(
7678 "FlowtableAttrs",
7679 "Pad",
7680 self.orig_loc,
7681 self.buf.as_ptr() as usize,
7682 ))
7683 }
7684 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
7685 let mut iter = self.clone();
7686 iter.pos = 0;
7687 for attr in iter {
7688 if let Ok(FlowtableAttrs::Flags(val)) = attr {
7689 return Ok(val);
7690 }
7691 }
7692 Err(ErrorContext::new_missing(
7693 "FlowtableAttrs",
7694 "Flags",
7695 self.orig_loc,
7696 self.buf.as_ptr() as usize,
7697 ))
7698 }
7699}
7700impl FlowtableAttrs<'_> {
7701 pub fn new<'a>(buf: &'a [u8]) -> IterableFlowtableAttrs<'a> {
7702 IterableFlowtableAttrs::with_loc(buf, buf.as_ptr() as usize)
7703 }
7704 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7705 let res = match r#type {
7706 1u16 => "Table",
7707 2u16 => "Name",
7708 3u16 => "Hook",
7709 4u16 => "Use",
7710 5u16 => "Handle",
7711 6u16 => "Pad",
7712 7u16 => "Flags",
7713 _ => return None,
7714 };
7715 Some(res)
7716 }
7717}
7718#[derive(Clone, Copy, Default)]
7719pub struct IterableFlowtableAttrs<'a> {
7720 buf: &'a [u8],
7721 pos: usize,
7722 orig_loc: usize,
7723}
7724impl<'a> IterableFlowtableAttrs<'a> {
7725 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7726 Self {
7727 buf,
7728 pos: 0,
7729 orig_loc,
7730 }
7731 }
7732 pub fn get_buf(&self) -> &'a [u8] {
7733 self.buf
7734 }
7735}
7736impl<'a> Iterator for IterableFlowtableAttrs<'a> {
7737 type Item = Result<FlowtableAttrs<'a>, ErrorContext>;
7738 fn next(&mut self) -> Option<Self::Item> {
7739 let mut pos;
7740 let mut r#type;
7741 loop {
7742 pos = self.pos;
7743 r#type = None;
7744 if self.buf.len() == self.pos {
7745 return None;
7746 }
7747 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7748 self.pos = self.buf.len();
7749 break;
7750 };
7751 r#type = Some(header.r#type);
7752 let res = match header.r#type {
7753 1u16 => FlowtableAttrs::Table({
7754 let res = CStr::from_bytes_with_nul(next).ok();
7755 let Some(val) = res else { break };
7756 val
7757 }),
7758 2u16 => FlowtableAttrs::Name({
7759 let res = CStr::from_bytes_with_nul(next).ok();
7760 let Some(val) = res else { break };
7761 val
7762 }),
7763 3u16 => FlowtableAttrs::Hook({
7764 let res = Some(IterableFlowtableHookAttrs::with_loc(next, self.orig_loc));
7765 let Some(val) = res else { break };
7766 val
7767 }),
7768 4u16 => FlowtableAttrs::Use({
7769 let res = parse_be_u32(next);
7770 let Some(val) = res else { break };
7771 val
7772 }),
7773 5u16 => FlowtableAttrs::Handle({
7774 let res = parse_be_u64(next);
7775 let Some(val) = res else { break };
7776 val
7777 }),
7778 6u16 => FlowtableAttrs::Pad({
7779 let res = Some(next);
7780 let Some(val) = res else { break };
7781 val
7782 }),
7783 7u16 => FlowtableAttrs::Flags({
7784 let res = parse_be_u32(next);
7785 let Some(val) = res else { break };
7786 val
7787 }),
7788 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7789 n => continue,
7790 };
7791 return Some(Ok(res));
7792 }
7793 Some(Err(ErrorContext::new(
7794 "FlowtableAttrs",
7795 r#type.and_then(|t| FlowtableAttrs::attr_from_type(t)),
7796 self.orig_loc,
7797 self.buf.as_ptr().wrapping_add(pos) as usize,
7798 )))
7799 }
7800}
7801impl<'a> std::fmt::Debug for IterableFlowtableAttrs<'_> {
7802 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7803 let mut fmt = f.debug_struct("FlowtableAttrs");
7804 for attr in self.clone() {
7805 let attr = match attr {
7806 Ok(a) => a,
7807 Err(err) => {
7808 fmt.finish()?;
7809 f.write_str("Err(")?;
7810 err.fmt(f)?;
7811 return f.write_str(")");
7812 }
7813 };
7814 match attr {
7815 FlowtableAttrs::Table(val) => fmt.field("Table", &val),
7816 FlowtableAttrs::Name(val) => fmt.field("Name", &val),
7817 FlowtableAttrs::Hook(val) => fmt.field("Hook", &val),
7818 FlowtableAttrs::Use(val) => fmt.field("Use", &val),
7819 FlowtableAttrs::Handle(val) => fmt.field("Handle", &val),
7820 FlowtableAttrs::Pad(val) => fmt.field("Pad", &val),
7821 FlowtableAttrs::Flags(val) => fmt.field("Flags", &val),
7822 };
7823 }
7824 fmt.finish()
7825 }
7826}
7827impl IterableFlowtableAttrs<'_> {
7828 pub fn lookup_attr(
7829 &self,
7830 offset: usize,
7831 missing_type: Option<u16>,
7832 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7833 let mut stack = Vec::new();
7834 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7835 if missing_type.is_some() && cur == offset {
7836 stack.push(("FlowtableAttrs", offset));
7837 return (
7838 stack,
7839 missing_type.and_then(|t| FlowtableAttrs::attr_from_type(t)),
7840 );
7841 }
7842 if cur > offset || cur + self.buf.len() < offset {
7843 return (stack, None);
7844 }
7845 let mut attrs = self.clone();
7846 let mut last_off = cur + attrs.pos;
7847 let mut missing = None;
7848 while let Some(attr) = attrs.next() {
7849 let Ok(attr) = attr else { break };
7850 match attr {
7851 FlowtableAttrs::Table(val) => {
7852 if last_off == offset {
7853 stack.push(("Table", last_off));
7854 break;
7855 }
7856 }
7857 FlowtableAttrs::Name(val) => {
7858 if last_off == offset {
7859 stack.push(("Name", last_off));
7860 break;
7861 }
7862 }
7863 FlowtableAttrs::Hook(val) => {
7864 (stack, missing) = val.lookup_attr(offset, missing_type);
7865 if !stack.is_empty() {
7866 break;
7867 }
7868 }
7869 FlowtableAttrs::Use(val) => {
7870 if last_off == offset {
7871 stack.push(("Use", last_off));
7872 break;
7873 }
7874 }
7875 FlowtableAttrs::Handle(val) => {
7876 if last_off == offset {
7877 stack.push(("Handle", last_off));
7878 break;
7879 }
7880 }
7881 FlowtableAttrs::Pad(val) => {
7882 if last_off == offset {
7883 stack.push(("Pad", last_off));
7884 break;
7885 }
7886 }
7887 FlowtableAttrs::Flags(val) => {
7888 if last_off == offset {
7889 stack.push(("Flags", last_off));
7890 break;
7891 }
7892 }
7893 _ => {}
7894 };
7895 last_off = cur + attrs.pos;
7896 }
7897 if !stack.is_empty() {
7898 stack.push(("FlowtableAttrs", cur));
7899 }
7900 (stack, missing)
7901 }
7902}
7903#[derive(Clone)]
7904pub enum FlowtableHookAttrs<'a> {
7905 Num(u32),
7906 Priority(u32),
7907 Devs(IterableHookDevAttrs<'a>),
7908}
7909impl<'a> IterableFlowtableHookAttrs<'a> {
7910 pub fn get_num(&self) -> Result<u32, ErrorContext> {
7911 let mut iter = self.clone();
7912 iter.pos = 0;
7913 for attr in iter {
7914 if let Ok(FlowtableHookAttrs::Num(val)) = attr {
7915 return Ok(val);
7916 }
7917 }
7918 Err(ErrorContext::new_missing(
7919 "FlowtableHookAttrs",
7920 "Num",
7921 self.orig_loc,
7922 self.buf.as_ptr() as usize,
7923 ))
7924 }
7925 pub fn get_priority(&self) -> Result<u32, ErrorContext> {
7926 let mut iter = self.clone();
7927 iter.pos = 0;
7928 for attr in iter {
7929 if let Ok(FlowtableHookAttrs::Priority(val)) = attr {
7930 return Ok(val);
7931 }
7932 }
7933 Err(ErrorContext::new_missing(
7934 "FlowtableHookAttrs",
7935 "Priority",
7936 self.orig_loc,
7937 self.buf.as_ptr() as usize,
7938 ))
7939 }
7940 pub fn get_devs(&self) -> Result<IterableHookDevAttrs<'a>, ErrorContext> {
7941 let mut iter = self.clone();
7942 iter.pos = 0;
7943 for attr in iter {
7944 if let Ok(FlowtableHookAttrs::Devs(val)) = attr {
7945 return Ok(val);
7946 }
7947 }
7948 Err(ErrorContext::new_missing(
7949 "FlowtableHookAttrs",
7950 "Devs",
7951 self.orig_loc,
7952 self.buf.as_ptr() as usize,
7953 ))
7954 }
7955}
7956impl FlowtableHookAttrs<'_> {
7957 pub fn new<'a>(buf: &'a [u8]) -> IterableFlowtableHookAttrs<'a> {
7958 IterableFlowtableHookAttrs::with_loc(buf, buf.as_ptr() as usize)
7959 }
7960 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7961 let res = match r#type {
7962 1u16 => "Num",
7963 2u16 => "Priority",
7964 3u16 => "Devs",
7965 _ => return None,
7966 };
7967 Some(res)
7968 }
7969}
7970#[derive(Clone, Copy, Default)]
7971pub struct IterableFlowtableHookAttrs<'a> {
7972 buf: &'a [u8],
7973 pos: usize,
7974 orig_loc: usize,
7975}
7976impl<'a> IterableFlowtableHookAttrs<'a> {
7977 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7978 Self {
7979 buf,
7980 pos: 0,
7981 orig_loc,
7982 }
7983 }
7984 pub fn get_buf(&self) -> &'a [u8] {
7985 self.buf
7986 }
7987}
7988impl<'a> Iterator for IterableFlowtableHookAttrs<'a> {
7989 type Item = Result<FlowtableHookAttrs<'a>, ErrorContext>;
7990 fn next(&mut self) -> Option<Self::Item> {
7991 let mut pos;
7992 let mut r#type;
7993 loop {
7994 pos = self.pos;
7995 r#type = None;
7996 if self.buf.len() == self.pos {
7997 return None;
7998 }
7999 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8000 self.pos = self.buf.len();
8001 break;
8002 };
8003 r#type = Some(header.r#type);
8004 let res = match header.r#type {
8005 1u16 => FlowtableHookAttrs::Num({
8006 let res = parse_be_u32(next);
8007 let Some(val) = res else { break };
8008 val
8009 }),
8010 2u16 => FlowtableHookAttrs::Priority({
8011 let res = parse_be_u32(next);
8012 let Some(val) = res else { break };
8013 val
8014 }),
8015 3u16 => FlowtableHookAttrs::Devs({
8016 let res = Some(IterableHookDevAttrs::with_loc(next, self.orig_loc));
8017 let Some(val) = res else { break };
8018 val
8019 }),
8020 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8021 n => continue,
8022 };
8023 return Some(Ok(res));
8024 }
8025 Some(Err(ErrorContext::new(
8026 "FlowtableHookAttrs",
8027 r#type.and_then(|t| FlowtableHookAttrs::attr_from_type(t)),
8028 self.orig_loc,
8029 self.buf.as_ptr().wrapping_add(pos) as usize,
8030 )))
8031 }
8032}
8033impl<'a> std::fmt::Debug for IterableFlowtableHookAttrs<'_> {
8034 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8035 let mut fmt = f.debug_struct("FlowtableHookAttrs");
8036 for attr in self.clone() {
8037 let attr = match attr {
8038 Ok(a) => a,
8039 Err(err) => {
8040 fmt.finish()?;
8041 f.write_str("Err(")?;
8042 err.fmt(f)?;
8043 return f.write_str(")");
8044 }
8045 };
8046 match attr {
8047 FlowtableHookAttrs::Num(val) => fmt.field("Num", &val),
8048 FlowtableHookAttrs::Priority(val) => fmt.field("Priority", &val),
8049 FlowtableHookAttrs::Devs(val) => fmt.field("Devs", &val),
8050 };
8051 }
8052 fmt.finish()
8053 }
8054}
8055impl IterableFlowtableHookAttrs<'_> {
8056 pub fn lookup_attr(
8057 &self,
8058 offset: usize,
8059 missing_type: Option<u16>,
8060 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8061 let mut stack = Vec::new();
8062 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8063 if missing_type.is_some() && cur == offset {
8064 stack.push(("FlowtableHookAttrs", offset));
8065 return (
8066 stack,
8067 missing_type.and_then(|t| FlowtableHookAttrs::attr_from_type(t)),
8068 );
8069 }
8070 if cur > offset || cur + self.buf.len() < offset {
8071 return (stack, None);
8072 }
8073 let mut attrs = self.clone();
8074 let mut last_off = cur + attrs.pos;
8075 let mut missing = None;
8076 while let Some(attr) = attrs.next() {
8077 let Ok(attr) = attr else { break };
8078 match attr {
8079 FlowtableHookAttrs::Num(val) => {
8080 if last_off == offset {
8081 stack.push(("Num", last_off));
8082 break;
8083 }
8084 }
8085 FlowtableHookAttrs::Priority(val) => {
8086 if last_off == offset {
8087 stack.push(("Priority", last_off));
8088 break;
8089 }
8090 }
8091 FlowtableHookAttrs::Devs(val) => {
8092 (stack, missing) = val.lookup_attr(offset, missing_type);
8093 if !stack.is_empty() {
8094 break;
8095 }
8096 }
8097 _ => {}
8098 };
8099 last_off = cur + attrs.pos;
8100 }
8101 if !stack.is_empty() {
8102 stack.push(("FlowtableHookAttrs", cur));
8103 }
8104 (stack, missing)
8105 }
8106}
8107#[derive(Clone)]
8108pub enum ExprBitwiseAttrs<'a> {
8109 Sreg(u32),
8110 Dreg(u32),
8111 Len(u32),
8112 Mask(IterableDataAttrs<'a>),
8113 Xor(IterableDataAttrs<'a>),
8114 #[doc = "Associated type: [`BitwiseOps`] (enum)"]
8115 Op(u32),
8116 Data(IterableDataAttrs<'a>),
8117}
8118impl<'a> IterableExprBitwiseAttrs<'a> {
8119 pub fn get_sreg(&self) -> Result<u32, ErrorContext> {
8120 let mut iter = self.clone();
8121 iter.pos = 0;
8122 for attr in iter {
8123 if let Ok(ExprBitwiseAttrs::Sreg(val)) = attr {
8124 return Ok(val);
8125 }
8126 }
8127 Err(ErrorContext::new_missing(
8128 "ExprBitwiseAttrs",
8129 "Sreg",
8130 self.orig_loc,
8131 self.buf.as_ptr() as usize,
8132 ))
8133 }
8134 pub fn get_dreg(&self) -> Result<u32, ErrorContext> {
8135 let mut iter = self.clone();
8136 iter.pos = 0;
8137 for attr in iter {
8138 if let Ok(ExprBitwiseAttrs::Dreg(val)) = attr {
8139 return Ok(val);
8140 }
8141 }
8142 Err(ErrorContext::new_missing(
8143 "ExprBitwiseAttrs",
8144 "Dreg",
8145 self.orig_loc,
8146 self.buf.as_ptr() as usize,
8147 ))
8148 }
8149 pub fn get_len(&self) -> Result<u32, ErrorContext> {
8150 let mut iter = self.clone();
8151 iter.pos = 0;
8152 for attr in iter {
8153 if let Ok(ExprBitwiseAttrs::Len(val)) = attr {
8154 return Ok(val);
8155 }
8156 }
8157 Err(ErrorContext::new_missing(
8158 "ExprBitwiseAttrs",
8159 "Len",
8160 self.orig_loc,
8161 self.buf.as_ptr() as usize,
8162 ))
8163 }
8164 pub fn get_mask(&self) -> Result<IterableDataAttrs<'a>, ErrorContext> {
8165 let mut iter = self.clone();
8166 iter.pos = 0;
8167 for attr in iter {
8168 if let Ok(ExprBitwiseAttrs::Mask(val)) = attr {
8169 return Ok(val);
8170 }
8171 }
8172 Err(ErrorContext::new_missing(
8173 "ExprBitwiseAttrs",
8174 "Mask",
8175 self.orig_loc,
8176 self.buf.as_ptr() as usize,
8177 ))
8178 }
8179 pub fn get_xor(&self) -> Result<IterableDataAttrs<'a>, ErrorContext> {
8180 let mut iter = self.clone();
8181 iter.pos = 0;
8182 for attr in iter {
8183 if let Ok(ExprBitwiseAttrs::Xor(val)) = attr {
8184 return Ok(val);
8185 }
8186 }
8187 Err(ErrorContext::new_missing(
8188 "ExprBitwiseAttrs",
8189 "Xor",
8190 self.orig_loc,
8191 self.buf.as_ptr() as usize,
8192 ))
8193 }
8194 #[doc = "Associated type: [`BitwiseOps`] (enum)"]
8195 pub fn get_op(&self) -> Result<u32, ErrorContext> {
8196 let mut iter = self.clone();
8197 iter.pos = 0;
8198 for attr in iter {
8199 if let Ok(ExprBitwiseAttrs::Op(val)) = attr {
8200 return Ok(val);
8201 }
8202 }
8203 Err(ErrorContext::new_missing(
8204 "ExprBitwiseAttrs",
8205 "Op",
8206 self.orig_loc,
8207 self.buf.as_ptr() as usize,
8208 ))
8209 }
8210 pub fn get_data(&self) -> Result<IterableDataAttrs<'a>, ErrorContext> {
8211 let mut iter = self.clone();
8212 iter.pos = 0;
8213 for attr in iter {
8214 if let Ok(ExprBitwiseAttrs::Data(val)) = attr {
8215 return Ok(val);
8216 }
8217 }
8218 Err(ErrorContext::new_missing(
8219 "ExprBitwiseAttrs",
8220 "Data",
8221 self.orig_loc,
8222 self.buf.as_ptr() as usize,
8223 ))
8224 }
8225}
8226impl ExprBitwiseAttrs<'_> {
8227 pub fn new<'a>(buf: &'a [u8]) -> IterableExprBitwiseAttrs<'a> {
8228 IterableExprBitwiseAttrs::with_loc(buf, buf.as_ptr() as usize)
8229 }
8230 fn attr_from_type(r#type: u16) -> Option<&'static str> {
8231 let res = match r#type {
8232 1u16 => "Sreg",
8233 2u16 => "Dreg",
8234 3u16 => "Len",
8235 4u16 => "Mask",
8236 5u16 => "Xor",
8237 6u16 => "Op",
8238 7u16 => "Data",
8239 _ => return None,
8240 };
8241 Some(res)
8242 }
8243}
8244#[derive(Clone, Copy, Default)]
8245pub struct IterableExprBitwiseAttrs<'a> {
8246 buf: &'a [u8],
8247 pos: usize,
8248 orig_loc: usize,
8249}
8250impl<'a> IterableExprBitwiseAttrs<'a> {
8251 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8252 Self {
8253 buf,
8254 pos: 0,
8255 orig_loc,
8256 }
8257 }
8258 pub fn get_buf(&self) -> &'a [u8] {
8259 self.buf
8260 }
8261}
8262impl<'a> Iterator for IterableExprBitwiseAttrs<'a> {
8263 type Item = Result<ExprBitwiseAttrs<'a>, ErrorContext>;
8264 fn next(&mut self) -> Option<Self::Item> {
8265 let mut pos;
8266 let mut r#type;
8267 loop {
8268 pos = self.pos;
8269 r#type = None;
8270 if self.buf.len() == self.pos {
8271 return None;
8272 }
8273 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8274 self.pos = self.buf.len();
8275 break;
8276 };
8277 r#type = Some(header.r#type);
8278 let res = match header.r#type {
8279 1u16 => ExprBitwiseAttrs::Sreg({
8280 let res = parse_be_u32(next);
8281 let Some(val) = res else { break };
8282 val
8283 }),
8284 2u16 => ExprBitwiseAttrs::Dreg({
8285 let res = parse_be_u32(next);
8286 let Some(val) = res else { break };
8287 val
8288 }),
8289 3u16 => ExprBitwiseAttrs::Len({
8290 let res = parse_be_u32(next);
8291 let Some(val) = res else { break };
8292 val
8293 }),
8294 4u16 => ExprBitwiseAttrs::Mask({
8295 let res = Some(IterableDataAttrs::with_loc(next, self.orig_loc));
8296 let Some(val) = res else { break };
8297 val
8298 }),
8299 5u16 => ExprBitwiseAttrs::Xor({
8300 let res = Some(IterableDataAttrs::with_loc(next, self.orig_loc));
8301 let Some(val) = res else { break };
8302 val
8303 }),
8304 6u16 => ExprBitwiseAttrs::Op({
8305 let res = parse_be_u32(next);
8306 let Some(val) = res else { break };
8307 val
8308 }),
8309 7u16 => ExprBitwiseAttrs::Data({
8310 let res = Some(IterableDataAttrs::with_loc(next, self.orig_loc));
8311 let Some(val) = res else { break };
8312 val
8313 }),
8314 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8315 n => continue,
8316 };
8317 return Some(Ok(res));
8318 }
8319 Some(Err(ErrorContext::new(
8320 "ExprBitwiseAttrs",
8321 r#type.and_then(|t| ExprBitwiseAttrs::attr_from_type(t)),
8322 self.orig_loc,
8323 self.buf.as_ptr().wrapping_add(pos) as usize,
8324 )))
8325 }
8326}
8327impl<'a> std::fmt::Debug for IterableExprBitwiseAttrs<'_> {
8328 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8329 let mut fmt = f.debug_struct("ExprBitwiseAttrs");
8330 for attr in self.clone() {
8331 let attr = match attr {
8332 Ok(a) => a,
8333 Err(err) => {
8334 fmt.finish()?;
8335 f.write_str("Err(")?;
8336 err.fmt(f)?;
8337 return f.write_str(")");
8338 }
8339 };
8340 match attr {
8341 ExprBitwiseAttrs::Sreg(val) => fmt.field("Sreg", &val),
8342 ExprBitwiseAttrs::Dreg(val) => fmt.field("Dreg", &val),
8343 ExprBitwiseAttrs::Len(val) => fmt.field("Len", &val),
8344 ExprBitwiseAttrs::Mask(val) => fmt.field("Mask", &val),
8345 ExprBitwiseAttrs::Xor(val) => fmt.field("Xor", &val),
8346 ExprBitwiseAttrs::Op(val) => {
8347 fmt.field("Op", &FormatEnum(val.into(), BitwiseOps::from_value))
8348 }
8349 ExprBitwiseAttrs::Data(val) => fmt.field("Data", &val),
8350 };
8351 }
8352 fmt.finish()
8353 }
8354}
8355impl IterableExprBitwiseAttrs<'_> {
8356 pub fn lookup_attr(
8357 &self,
8358 offset: usize,
8359 missing_type: Option<u16>,
8360 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8361 let mut stack = Vec::new();
8362 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8363 if missing_type.is_some() && cur == offset {
8364 stack.push(("ExprBitwiseAttrs", offset));
8365 return (
8366 stack,
8367 missing_type.and_then(|t| ExprBitwiseAttrs::attr_from_type(t)),
8368 );
8369 }
8370 if cur > offset || cur + self.buf.len() < offset {
8371 return (stack, None);
8372 }
8373 let mut attrs = self.clone();
8374 let mut last_off = cur + attrs.pos;
8375 let mut missing = None;
8376 while let Some(attr) = attrs.next() {
8377 let Ok(attr) = attr else { break };
8378 match attr {
8379 ExprBitwiseAttrs::Sreg(val) => {
8380 if last_off == offset {
8381 stack.push(("Sreg", last_off));
8382 break;
8383 }
8384 }
8385 ExprBitwiseAttrs::Dreg(val) => {
8386 if last_off == offset {
8387 stack.push(("Dreg", last_off));
8388 break;
8389 }
8390 }
8391 ExprBitwiseAttrs::Len(val) => {
8392 if last_off == offset {
8393 stack.push(("Len", last_off));
8394 break;
8395 }
8396 }
8397 ExprBitwiseAttrs::Mask(val) => {
8398 (stack, missing) = val.lookup_attr(offset, missing_type);
8399 if !stack.is_empty() {
8400 break;
8401 }
8402 }
8403 ExprBitwiseAttrs::Xor(val) => {
8404 (stack, missing) = val.lookup_attr(offset, missing_type);
8405 if !stack.is_empty() {
8406 break;
8407 }
8408 }
8409 ExprBitwiseAttrs::Op(val) => {
8410 if last_off == offset {
8411 stack.push(("Op", last_off));
8412 break;
8413 }
8414 }
8415 ExprBitwiseAttrs::Data(val) => {
8416 (stack, missing) = val.lookup_attr(offset, missing_type);
8417 if !stack.is_empty() {
8418 break;
8419 }
8420 }
8421 _ => {}
8422 };
8423 last_off = cur + attrs.pos;
8424 }
8425 if !stack.is_empty() {
8426 stack.push(("ExprBitwiseAttrs", cur));
8427 }
8428 (stack, missing)
8429 }
8430}
8431#[derive(Clone)]
8432pub enum ExprCmpAttrs<'a> {
8433 Sreg(u32),
8434 #[doc = "Associated type: [`CmpOps`] (enum)"]
8435 Op(u32),
8436 Data(IterableDataAttrs<'a>),
8437}
8438impl<'a> IterableExprCmpAttrs<'a> {
8439 pub fn get_sreg(&self) -> Result<u32, ErrorContext> {
8440 let mut iter = self.clone();
8441 iter.pos = 0;
8442 for attr in iter {
8443 if let Ok(ExprCmpAttrs::Sreg(val)) = attr {
8444 return Ok(val);
8445 }
8446 }
8447 Err(ErrorContext::new_missing(
8448 "ExprCmpAttrs",
8449 "Sreg",
8450 self.orig_loc,
8451 self.buf.as_ptr() as usize,
8452 ))
8453 }
8454 #[doc = "Associated type: [`CmpOps`] (enum)"]
8455 pub fn get_op(&self) -> Result<u32, ErrorContext> {
8456 let mut iter = self.clone();
8457 iter.pos = 0;
8458 for attr in iter {
8459 if let Ok(ExprCmpAttrs::Op(val)) = attr {
8460 return Ok(val);
8461 }
8462 }
8463 Err(ErrorContext::new_missing(
8464 "ExprCmpAttrs",
8465 "Op",
8466 self.orig_loc,
8467 self.buf.as_ptr() as usize,
8468 ))
8469 }
8470 pub fn get_data(&self) -> Result<IterableDataAttrs<'a>, ErrorContext> {
8471 let mut iter = self.clone();
8472 iter.pos = 0;
8473 for attr in iter {
8474 if let Ok(ExprCmpAttrs::Data(val)) = attr {
8475 return Ok(val);
8476 }
8477 }
8478 Err(ErrorContext::new_missing(
8479 "ExprCmpAttrs",
8480 "Data",
8481 self.orig_loc,
8482 self.buf.as_ptr() as usize,
8483 ))
8484 }
8485}
8486impl ExprCmpAttrs<'_> {
8487 pub fn new<'a>(buf: &'a [u8]) -> IterableExprCmpAttrs<'a> {
8488 IterableExprCmpAttrs::with_loc(buf, buf.as_ptr() as usize)
8489 }
8490 fn attr_from_type(r#type: u16) -> Option<&'static str> {
8491 let res = match r#type {
8492 1u16 => "Sreg",
8493 2u16 => "Op",
8494 3u16 => "Data",
8495 _ => return None,
8496 };
8497 Some(res)
8498 }
8499}
8500#[derive(Clone, Copy, Default)]
8501pub struct IterableExprCmpAttrs<'a> {
8502 buf: &'a [u8],
8503 pos: usize,
8504 orig_loc: usize,
8505}
8506impl<'a> IterableExprCmpAttrs<'a> {
8507 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8508 Self {
8509 buf,
8510 pos: 0,
8511 orig_loc,
8512 }
8513 }
8514 pub fn get_buf(&self) -> &'a [u8] {
8515 self.buf
8516 }
8517}
8518impl<'a> Iterator for IterableExprCmpAttrs<'a> {
8519 type Item = Result<ExprCmpAttrs<'a>, ErrorContext>;
8520 fn next(&mut self) -> Option<Self::Item> {
8521 let mut pos;
8522 let mut r#type;
8523 loop {
8524 pos = self.pos;
8525 r#type = None;
8526 if self.buf.len() == self.pos {
8527 return None;
8528 }
8529 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8530 self.pos = self.buf.len();
8531 break;
8532 };
8533 r#type = Some(header.r#type);
8534 let res = match header.r#type {
8535 1u16 => ExprCmpAttrs::Sreg({
8536 let res = parse_be_u32(next);
8537 let Some(val) = res else { break };
8538 val
8539 }),
8540 2u16 => ExprCmpAttrs::Op({
8541 let res = parse_be_u32(next);
8542 let Some(val) = res else { break };
8543 val
8544 }),
8545 3u16 => ExprCmpAttrs::Data({
8546 let res = Some(IterableDataAttrs::with_loc(next, self.orig_loc));
8547 let Some(val) = res else { break };
8548 val
8549 }),
8550 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8551 n => continue,
8552 };
8553 return Some(Ok(res));
8554 }
8555 Some(Err(ErrorContext::new(
8556 "ExprCmpAttrs",
8557 r#type.and_then(|t| ExprCmpAttrs::attr_from_type(t)),
8558 self.orig_loc,
8559 self.buf.as_ptr().wrapping_add(pos) as usize,
8560 )))
8561 }
8562}
8563impl<'a> std::fmt::Debug for IterableExprCmpAttrs<'_> {
8564 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8565 let mut fmt = f.debug_struct("ExprCmpAttrs");
8566 for attr in self.clone() {
8567 let attr = match attr {
8568 Ok(a) => a,
8569 Err(err) => {
8570 fmt.finish()?;
8571 f.write_str("Err(")?;
8572 err.fmt(f)?;
8573 return f.write_str(")");
8574 }
8575 };
8576 match attr {
8577 ExprCmpAttrs::Sreg(val) => fmt.field("Sreg", &val),
8578 ExprCmpAttrs::Op(val) => {
8579 fmt.field("Op", &FormatEnum(val.into(), CmpOps::from_value))
8580 }
8581 ExprCmpAttrs::Data(val) => fmt.field("Data", &val),
8582 };
8583 }
8584 fmt.finish()
8585 }
8586}
8587impl IterableExprCmpAttrs<'_> {
8588 pub fn lookup_attr(
8589 &self,
8590 offset: usize,
8591 missing_type: Option<u16>,
8592 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8593 let mut stack = Vec::new();
8594 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8595 if missing_type.is_some() && cur == offset {
8596 stack.push(("ExprCmpAttrs", offset));
8597 return (
8598 stack,
8599 missing_type.and_then(|t| ExprCmpAttrs::attr_from_type(t)),
8600 );
8601 }
8602 if cur > offset || cur + self.buf.len() < offset {
8603 return (stack, None);
8604 }
8605 let mut attrs = self.clone();
8606 let mut last_off = cur + attrs.pos;
8607 let mut missing = None;
8608 while let Some(attr) = attrs.next() {
8609 let Ok(attr) = attr else { break };
8610 match attr {
8611 ExprCmpAttrs::Sreg(val) => {
8612 if last_off == offset {
8613 stack.push(("Sreg", last_off));
8614 break;
8615 }
8616 }
8617 ExprCmpAttrs::Op(val) => {
8618 if last_off == offset {
8619 stack.push(("Op", last_off));
8620 break;
8621 }
8622 }
8623 ExprCmpAttrs::Data(val) => {
8624 (stack, missing) = val.lookup_attr(offset, missing_type);
8625 if !stack.is_empty() {
8626 break;
8627 }
8628 }
8629 _ => {}
8630 };
8631 last_off = cur + attrs.pos;
8632 }
8633 if !stack.is_empty() {
8634 stack.push(("ExprCmpAttrs", cur));
8635 }
8636 (stack, missing)
8637 }
8638}
8639#[derive(Clone)]
8640pub enum DataAttrs<'a> {
8641 Value(&'a [u8]),
8642 Verdict(IterableVerdictAttrs<'a>),
8643}
8644impl<'a> IterableDataAttrs<'a> {
8645 pub fn get_value(&self) -> Result<&'a [u8], ErrorContext> {
8646 let mut iter = self.clone();
8647 iter.pos = 0;
8648 for attr in iter {
8649 if let Ok(DataAttrs::Value(val)) = attr {
8650 return Ok(val);
8651 }
8652 }
8653 Err(ErrorContext::new_missing(
8654 "DataAttrs",
8655 "Value",
8656 self.orig_loc,
8657 self.buf.as_ptr() as usize,
8658 ))
8659 }
8660 pub fn get_verdict(&self) -> Result<IterableVerdictAttrs<'a>, ErrorContext> {
8661 let mut iter = self.clone();
8662 iter.pos = 0;
8663 for attr in iter {
8664 if let Ok(DataAttrs::Verdict(val)) = attr {
8665 return Ok(val);
8666 }
8667 }
8668 Err(ErrorContext::new_missing(
8669 "DataAttrs",
8670 "Verdict",
8671 self.orig_loc,
8672 self.buf.as_ptr() as usize,
8673 ))
8674 }
8675}
8676impl DataAttrs<'_> {
8677 pub fn new<'a>(buf: &'a [u8]) -> IterableDataAttrs<'a> {
8678 IterableDataAttrs::with_loc(buf, buf.as_ptr() as usize)
8679 }
8680 fn attr_from_type(r#type: u16) -> Option<&'static str> {
8681 let res = match r#type {
8682 1u16 => "Value",
8683 2u16 => "Verdict",
8684 _ => return None,
8685 };
8686 Some(res)
8687 }
8688}
8689#[derive(Clone, Copy, Default)]
8690pub struct IterableDataAttrs<'a> {
8691 buf: &'a [u8],
8692 pos: usize,
8693 orig_loc: usize,
8694}
8695impl<'a> IterableDataAttrs<'a> {
8696 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8697 Self {
8698 buf,
8699 pos: 0,
8700 orig_loc,
8701 }
8702 }
8703 pub fn get_buf(&self) -> &'a [u8] {
8704 self.buf
8705 }
8706}
8707impl<'a> Iterator for IterableDataAttrs<'a> {
8708 type Item = Result<DataAttrs<'a>, ErrorContext>;
8709 fn next(&mut self) -> Option<Self::Item> {
8710 let mut pos;
8711 let mut r#type;
8712 loop {
8713 pos = self.pos;
8714 r#type = None;
8715 if self.buf.len() == self.pos {
8716 return None;
8717 }
8718 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8719 self.pos = self.buf.len();
8720 break;
8721 };
8722 r#type = Some(header.r#type);
8723 let res = match header.r#type {
8724 1u16 => DataAttrs::Value({
8725 let res = Some(next);
8726 let Some(val) = res else { break };
8727 val
8728 }),
8729 2u16 => DataAttrs::Verdict({
8730 let res = Some(IterableVerdictAttrs::with_loc(next, self.orig_loc));
8731 let Some(val) = res else { break };
8732 val
8733 }),
8734 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8735 n => continue,
8736 };
8737 return Some(Ok(res));
8738 }
8739 Some(Err(ErrorContext::new(
8740 "DataAttrs",
8741 r#type.and_then(|t| DataAttrs::attr_from_type(t)),
8742 self.orig_loc,
8743 self.buf.as_ptr().wrapping_add(pos) as usize,
8744 )))
8745 }
8746}
8747impl<'a> std::fmt::Debug for IterableDataAttrs<'_> {
8748 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8749 let mut fmt = f.debug_struct("DataAttrs");
8750 for attr in self.clone() {
8751 let attr = match attr {
8752 Ok(a) => a,
8753 Err(err) => {
8754 fmt.finish()?;
8755 f.write_str("Err(")?;
8756 err.fmt(f)?;
8757 return f.write_str(")");
8758 }
8759 };
8760 match attr {
8761 DataAttrs::Value(val) => fmt.field("Value", &val),
8762 DataAttrs::Verdict(val) => fmt.field("Verdict", &val),
8763 };
8764 }
8765 fmt.finish()
8766 }
8767}
8768impl IterableDataAttrs<'_> {
8769 pub fn lookup_attr(
8770 &self,
8771 offset: usize,
8772 missing_type: Option<u16>,
8773 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8774 let mut stack = Vec::new();
8775 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8776 if missing_type.is_some() && cur == offset {
8777 stack.push(("DataAttrs", offset));
8778 return (
8779 stack,
8780 missing_type.and_then(|t| DataAttrs::attr_from_type(t)),
8781 );
8782 }
8783 if cur > offset || cur + self.buf.len() < offset {
8784 return (stack, None);
8785 }
8786 let mut attrs = self.clone();
8787 let mut last_off = cur + attrs.pos;
8788 let mut missing = None;
8789 while let Some(attr) = attrs.next() {
8790 let Ok(attr) = attr else { break };
8791 match attr {
8792 DataAttrs::Value(val) => {
8793 if last_off == offset {
8794 stack.push(("Value", last_off));
8795 break;
8796 }
8797 }
8798 DataAttrs::Verdict(val) => {
8799 (stack, missing) = val.lookup_attr(offset, missing_type);
8800 if !stack.is_empty() {
8801 break;
8802 }
8803 }
8804 _ => {}
8805 };
8806 last_off = cur + attrs.pos;
8807 }
8808 if !stack.is_empty() {
8809 stack.push(("DataAttrs", cur));
8810 }
8811 (stack, missing)
8812 }
8813}
8814#[derive(Clone)]
8815pub enum VerdictAttrs<'a> {
8816 #[doc = "nf_tables verdict\n\nAssociated type: [`VerdictCode`] (enum)"]
8817 Code(u32),
8818 #[doc = "jump target chain name\n"]
8819 Chain(&'a CStr),
8820 #[doc = "jump target chain ID\n"]
8821 ChainId(u32),
8822}
8823impl<'a> IterableVerdictAttrs<'a> {
8824 #[doc = "nf_tables verdict\n\nAssociated type: [`VerdictCode`] (enum)"]
8825 pub fn get_code(&self) -> Result<u32, ErrorContext> {
8826 let mut iter = self.clone();
8827 iter.pos = 0;
8828 for attr in iter {
8829 if let Ok(VerdictAttrs::Code(val)) = attr {
8830 return Ok(val);
8831 }
8832 }
8833 Err(ErrorContext::new_missing(
8834 "VerdictAttrs",
8835 "Code",
8836 self.orig_loc,
8837 self.buf.as_ptr() as usize,
8838 ))
8839 }
8840 #[doc = "jump target chain name\n"]
8841 pub fn get_chain(&self) -> Result<&'a CStr, ErrorContext> {
8842 let mut iter = self.clone();
8843 iter.pos = 0;
8844 for attr in iter {
8845 if let Ok(VerdictAttrs::Chain(val)) = attr {
8846 return Ok(val);
8847 }
8848 }
8849 Err(ErrorContext::new_missing(
8850 "VerdictAttrs",
8851 "Chain",
8852 self.orig_loc,
8853 self.buf.as_ptr() as usize,
8854 ))
8855 }
8856 #[doc = "jump target chain ID\n"]
8857 pub fn get_chain_id(&self) -> Result<u32, ErrorContext> {
8858 let mut iter = self.clone();
8859 iter.pos = 0;
8860 for attr in iter {
8861 if let Ok(VerdictAttrs::ChainId(val)) = attr {
8862 return Ok(val);
8863 }
8864 }
8865 Err(ErrorContext::new_missing(
8866 "VerdictAttrs",
8867 "ChainId",
8868 self.orig_loc,
8869 self.buf.as_ptr() as usize,
8870 ))
8871 }
8872}
8873impl VerdictAttrs<'_> {
8874 pub fn new<'a>(buf: &'a [u8]) -> IterableVerdictAttrs<'a> {
8875 IterableVerdictAttrs::with_loc(buf, buf.as_ptr() as usize)
8876 }
8877 fn attr_from_type(r#type: u16) -> Option<&'static str> {
8878 let res = match r#type {
8879 1u16 => "Code",
8880 2u16 => "Chain",
8881 3u16 => "ChainId",
8882 _ => return None,
8883 };
8884 Some(res)
8885 }
8886}
8887#[derive(Clone, Copy, Default)]
8888pub struct IterableVerdictAttrs<'a> {
8889 buf: &'a [u8],
8890 pos: usize,
8891 orig_loc: usize,
8892}
8893impl<'a> IterableVerdictAttrs<'a> {
8894 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8895 Self {
8896 buf,
8897 pos: 0,
8898 orig_loc,
8899 }
8900 }
8901 pub fn get_buf(&self) -> &'a [u8] {
8902 self.buf
8903 }
8904}
8905impl<'a> Iterator for IterableVerdictAttrs<'a> {
8906 type Item = Result<VerdictAttrs<'a>, ErrorContext>;
8907 fn next(&mut self) -> Option<Self::Item> {
8908 let mut pos;
8909 let mut r#type;
8910 loop {
8911 pos = self.pos;
8912 r#type = None;
8913 if self.buf.len() == self.pos {
8914 return None;
8915 }
8916 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8917 self.pos = self.buf.len();
8918 break;
8919 };
8920 r#type = Some(header.r#type);
8921 let res = match header.r#type {
8922 1u16 => VerdictAttrs::Code({
8923 let res = parse_be_u32(next);
8924 let Some(val) = res else { break };
8925 val
8926 }),
8927 2u16 => VerdictAttrs::Chain({
8928 let res = CStr::from_bytes_with_nul(next).ok();
8929 let Some(val) = res else { break };
8930 val
8931 }),
8932 3u16 => VerdictAttrs::ChainId({
8933 let res = parse_be_u32(next);
8934 let Some(val) = res else { break };
8935 val
8936 }),
8937 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8938 n => continue,
8939 };
8940 return Some(Ok(res));
8941 }
8942 Some(Err(ErrorContext::new(
8943 "VerdictAttrs",
8944 r#type.and_then(|t| VerdictAttrs::attr_from_type(t)),
8945 self.orig_loc,
8946 self.buf.as_ptr().wrapping_add(pos) as usize,
8947 )))
8948 }
8949}
8950impl<'a> std::fmt::Debug for IterableVerdictAttrs<'_> {
8951 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8952 let mut fmt = f.debug_struct("VerdictAttrs");
8953 for attr in self.clone() {
8954 let attr = match attr {
8955 Ok(a) => a,
8956 Err(err) => {
8957 fmt.finish()?;
8958 f.write_str("Err(")?;
8959 err.fmt(f)?;
8960 return f.write_str(")");
8961 }
8962 };
8963 match attr {
8964 VerdictAttrs::Code(val) => {
8965 fmt.field("Code", &FormatEnum(val.into(), VerdictCode::from_value))
8966 }
8967 VerdictAttrs::Chain(val) => fmt.field("Chain", &val),
8968 VerdictAttrs::ChainId(val) => fmt.field("ChainId", &val),
8969 };
8970 }
8971 fmt.finish()
8972 }
8973}
8974impl IterableVerdictAttrs<'_> {
8975 pub fn lookup_attr(
8976 &self,
8977 offset: usize,
8978 missing_type: Option<u16>,
8979 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8980 let mut stack = Vec::new();
8981 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8982 if missing_type.is_some() && cur == offset {
8983 stack.push(("VerdictAttrs", offset));
8984 return (
8985 stack,
8986 missing_type.and_then(|t| VerdictAttrs::attr_from_type(t)),
8987 );
8988 }
8989 if cur > offset || cur + self.buf.len() < offset {
8990 return (stack, None);
8991 }
8992 let mut attrs = self.clone();
8993 let mut last_off = cur + attrs.pos;
8994 while let Some(attr) = attrs.next() {
8995 let Ok(attr) = attr else { break };
8996 match attr {
8997 VerdictAttrs::Code(val) => {
8998 if last_off == offset {
8999 stack.push(("Code", last_off));
9000 break;
9001 }
9002 }
9003 VerdictAttrs::Chain(val) => {
9004 if last_off == offset {
9005 stack.push(("Chain", last_off));
9006 break;
9007 }
9008 }
9009 VerdictAttrs::ChainId(val) => {
9010 if last_off == offset {
9011 stack.push(("ChainId", last_off));
9012 break;
9013 }
9014 }
9015 _ => {}
9016 };
9017 last_off = cur + attrs.pos;
9018 }
9019 if !stack.is_empty() {
9020 stack.push(("VerdictAttrs", cur));
9021 }
9022 (stack, None)
9023 }
9024}
9025#[derive(Clone)]
9026pub enum ExprCounterAttrs<'a> {
9027 #[doc = "Number of bytes\n"]
9028 Bytes(u64),
9029 #[doc = "Number of packets\n"]
9030 Packets(u64),
9031 Pad(&'a [u8]),
9032}
9033impl<'a> IterableExprCounterAttrs<'a> {
9034 #[doc = "Number of bytes\n"]
9035 pub fn get_bytes(&self) -> Result<u64, ErrorContext> {
9036 let mut iter = self.clone();
9037 iter.pos = 0;
9038 for attr in iter {
9039 if let Ok(ExprCounterAttrs::Bytes(val)) = attr {
9040 return Ok(val);
9041 }
9042 }
9043 Err(ErrorContext::new_missing(
9044 "ExprCounterAttrs",
9045 "Bytes",
9046 self.orig_loc,
9047 self.buf.as_ptr() as usize,
9048 ))
9049 }
9050 #[doc = "Number of packets\n"]
9051 pub fn get_packets(&self) -> Result<u64, ErrorContext> {
9052 let mut iter = self.clone();
9053 iter.pos = 0;
9054 for attr in iter {
9055 if let Ok(ExprCounterAttrs::Packets(val)) = attr {
9056 return Ok(val);
9057 }
9058 }
9059 Err(ErrorContext::new_missing(
9060 "ExprCounterAttrs",
9061 "Packets",
9062 self.orig_loc,
9063 self.buf.as_ptr() as usize,
9064 ))
9065 }
9066 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
9067 let mut iter = self.clone();
9068 iter.pos = 0;
9069 for attr in iter {
9070 if let Ok(ExprCounterAttrs::Pad(val)) = attr {
9071 return Ok(val);
9072 }
9073 }
9074 Err(ErrorContext::new_missing(
9075 "ExprCounterAttrs",
9076 "Pad",
9077 self.orig_loc,
9078 self.buf.as_ptr() as usize,
9079 ))
9080 }
9081}
9082impl ExprCounterAttrs<'_> {
9083 pub fn new<'a>(buf: &'a [u8]) -> IterableExprCounterAttrs<'a> {
9084 IterableExprCounterAttrs::with_loc(buf, buf.as_ptr() as usize)
9085 }
9086 fn attr_from_type(r#type: u16) -> Option<&'static str> {
9087 let res = match r#type {
9088 1u16 => "Bytes",
9089 2u16 => "Packets",
9090 3u16 => "Pad",
9091 _ => return None,
9092 };
9093 Some(res)
9094 }
9095}
9096#[derive(Clone, Copy, Default)]
9097pub struct IterableExprCounterAttrs<'a> {
9098 buf: &'a [u8],
9099 pos: usize,
9100 orig_loc: usize,
9101}
9102impl<'a> IterableExprCounterAttrs<'a> {
9103 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9104 Self {
9105 buf,
9106 pos: 0,
9107 orig_loc,
9108 }
9109 }
9110 pub fn get_buf(&self) -> &'a [u8] {
9111 self.buf
9112 }
9113}
9114impl<'a> Iterator for IterableExprCounterAttrs<'a> {
9115 type Item = Result<ExprCounterAttrs<'a>, ErrorContext>;
9116 fn next(&mut self) -> Option<Self::Item> {
9117 let mut pos;
9118 let mut r#type;
9119 loop {
9120 pos = self.pos;
9121 r#type = None;
9122 if self.buf.len() == self.pos {
9123 return None;
9124 }
9125 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9126 self.pos = self.buf.len();
9127 break;
9128 };
9129 r#type = Some(header.r#type);
9130 let res = match header.r#type {
9131 1u16 => ExprCounterAttrs::Bytes({
9132 let res = parse_be_u64(next);
9133 let Some(val) = res else { break };
9134 val
9135 }),
9136 2u16 => ExprCounterAttrs::Packets({
9137 let res = parse_be_u64(next);
9138 let Some(val) = res else { break };
9139 val
9140 }),
9141 3u16 => ExprCounterAttrs::Pad({
9142 let res = Some(next);
9143 let Some(val) = res else { break };
9144 val
9145 }),
9146 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9147 n => continue,
9148 };
9149 return Some(Ok(res));
9150 }
9151 Some(Err(ErrorContext::new(
9152 "ExprCounterAttrs",
9153 r#type.and_then(|t| ExprCounterAttrs::attr_from_type(t)),
9154 self.orig_loc,
9155 self.buf.as_ptr().wrapping_add(pos) as usize,
9156 )))
9157 }
9158}
9159impl<'a> std::fmt::Debug for IterableExprCounterAttrs<'_> {
9160 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9161 let mut fmt = f.debug_struct("ExprCounterAttrs");
9162 for attr in self.clone() {
9163 let attr = match attr {
9164 Ok(a) => a,
9165 Err(err) => {
9166 fmt.finish()?;
9167 f.write_str("Err(")?;
9168 err.fmt(f)?;
9169 return f.write_str(")");
9170 }
9171 };
9172 match attr {
9173 ExprCounterAttrs::Bytes(val) => fmt.field("Bytes", &val),
9174 ExprCounterAttrs::Packets(val) => fmt.field("Packets", &val),
9175 ExprCounterAttrs::Pad(val) => fmt.field("Pad", &val),
9176 };
9177 }
9178 fmt.finish()
9179 }
9180}
9181impl IterableExprCounterAttrs<'_> {
9182 pub fn lookup_attr(
9183 &self,
9184 offset: usize,
9185 missing_type: Option<u16>,
9186 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9187 let mut stack = Vec::new();
9188 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9189 if missing_type.is_some() && cur == offset {
9190 stack.push(("ExprCounterAttrs", offset));
9191 return (
9192 stack,
9193 missing_type.and_then(|t| ExprCounterAttrs::attr_from_type(t)),
9194 );
9195 }
9196 if cur > offset || cur + self.buf.len() < offset {
9197 return (stack, None);
9198 }
9199 let mut attrs = self.clone();
9200 let mut last_off = cur + attrs.pos;
9201 while let Some(attr) = attrs.next() {
9202 let Ok(attr) = attr else { break };
9203 match attr {
9204 ExprCounterAttrs::Bytes(val) => {
9205 if last_off == offset {
9206 stack.push(("Bytes", last_off));
9207 break;
9208 }
9209 }
9210 ExprCounterAttrs::Packets(val) => {
9211 if last_off == offset {
9212 stack.push(("Packets", last_off));
9213 break;
9214 }
9215 }
9216 ExprCounterAttrs::Pad(val) => {
9217 if last_off == offset {
9218 stack.push(("Pad", last_off));
9219 break;
9220 }
9221 }
9222 _ => {}
9223 };
9224 last_off = cur + attrs.pos;
9225 }
9226 if !stack.is_empty() {
9227 stack.push(("ExprCounterAttrs", cur));
9228 }
9229 (stack, None)
9230 }
9231}
9232#[derive(Clone)]
9233pub enum ExprFibAttrs {
9234 Dreg(u32),
9235 #[doc = "Associated type: [`FibResult`] (enum)"]
9236 Result(u32),
9237 #[doc = "Associated type: [`FibFlags`] (enum)"]
9238 Flags(u32),
9239}
9240impl<'a> IterableExprFibAttrs<'a> {
9241 pub fn get_dreg(&self) -> Result<u32, ErrorContext> {
9242 let mut iter = self.clone();
9243 iter.pos = 0;
9244 for attr in iter {
9245 if let Ok(ExprFibAttrs::Dreg(val)) = attr {
9246 return Ok(val);
9247 }
9248 }
9249 Err(ErrorContext::new_missing(
9250 "ExprFibAttrs",
9251 "Dreg",
9252 self.orig_loc,
9253 self.buf.as_ptr() as usize,
9254 ))
9255 }
9256 #[doc = "Associated type: [`FibResult`] (enum)"]
9257 pub fn get_result(&self) -> Result<u32, ErrorContext> {
9258 let mut iter = self.clone();
9259 iter.pos = 0;
9260 for attr in iter {
9261 if let Ok(ExprFibAttrs::Result(val)) = attr {
9262 return Ok(val);
9263 }
9264 }
9265 Err(ErrorContext::new_missing(
9266 "ExprFibAttrs",
9267 "Result",
9268 self.orig_loc,
9269 self.buf.as_ptr() as usize,
9270 ))
9271 }
9272 #[doc = "Associated type: [`FibFlags`] (enum)"]
9273 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
9274 let mut iter = self.clone();
9275 iter.pos = 0;
9276 for attr in iter {
9277 if let Ok(ExprFibAttrs::Flags(val)) = attr {
9278 return Ok(val);
9279 }
9280 }
9281 Err(ErrorContext::new_missing(
9282 "ExprFibAttrs",
9283 "Flags",
9284 self.orig_loc,
9285 self.buf.as_ptr() as usize,
9286 ))
9287 }
9288}
9289impl ExprFibAttrs {
9290 pub fn new<'a>(buf: &'a [u8]) -> IterableExprFibAttrs<'a> {
9291 IterableExprFibAttrs::with_loc(buf, buf.as_ptr() as usize)
9292 }
9293 fn attr_from_type(r#type: u16) -> Option<&'static str> {
9294 let res = match r#type {
9295 1u16 => "Dreg",
9296 2u16 => "Result",
9297 3u16 => "Flags",
9298 _ => return None,
9299 };
9300 Some(res)
9301 }
9302}
9303#[derive(Clone, Copy, Default)]
9304pub struct IterableExprFibAttrs<'a> {
9305 buf: &'a [u8],
9306 pos: usize,
9307 orig_loc: usize,
9308}
9309impl<'a> IterableExprFibAttrs<'a> {
9310 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9311 Self {
9312 buf,
9313 pos: 0,
9314 orig_loc,
9315 }
9316 }
9317 pub fn get_buf(&self) -> &'a [u8] {
9318 self.buf
9319 }
9320}
9321impl<'a> Iterator for IterableExprFibAttrs<'a> {
9322 type Item = Result<ExprFibAttrs, ErrorContext>;
9323 fn next(&mut self) -> Option<Self::Item> {
9324 let mut pos;
9325 let mut r#type;
9326 loop {
9327 pos = self.pos;
9328 r#type = None;
9329 if self.buf.len() == self.pos {
9330 return None;
9331 }
9332 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9333 self.pos = self.buf.len();
9334 break;
9335 };
9336 r#type = Some(header.r#type);
9337 let res = match header.r#type {
9338 1u16 => ExprFibAttrs::Dreg({
9339 let res = parse_be_u32(next);
9340 let Some(val) = res else { break };
9341 val
9342 }),
9343 2u16 => ExprFibAttrs::Result({
9344 let res = parse_be_u32(next);
9345 let Some(val) = res else { break };
9346 val
9347 }),
9348 3u16 => ExprFibAttrs::Flags({
9349 let res = parse_be_u32(next);
9350 let Some(val) = res else { break };
9351 val
9352 }),
9353 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9354 n => continue,
9355 };
9356 return Some(Ok(res));
9357 }
9358 Some(Err(ErrorContext::new(
9359 "ExprFibAttrs",
9360 r#type.and_then(|t| ExprFibAttrs::attr_from_type(t)),
9361 self.orig_loc,
9362 self.buf.as_ptr().wrapping_add(pos) as usize,
9363 )))
9364 }
9365}
9366impl std::fmt::Debug for IterableExprFibAttrs<'_> {
9367 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9368 let mut fmt = f.debug_struct("ExprFibAttrs");
9369 for attr in self.clone() {
9370 let attr = match attr {
9371 Ok(a) => a,
9372 Err(err) => {
9373 fmt.finish()?;
9374 f.write_str("Err(")?;
9375 err.fmt(f)?;
9376 return f.write_str(")");
9377 }
9378 };
9379 match attr {
9380 ExprFibAttrs::Dreg(val) => fmt.field("Dreg", &val),
9381 ExprFibAttrs::Result(val) => {
9382 fmt.field("Result", &FormatEnum(val.into(), FibResult::from_value))
9383 }
9384 ExprFibAttrs::Flags(val) => {
9385 fmt.field("Flags", &FormatFlags(val.into(), FibFlags::from_value))
9386 }
9387 };
9388 }
9389 fmt.finish()
9390 }
9391}
9392impl IterableExprFibAttrs<'_> {
9393 pub fn lookup_attr(
9394 &self,
9395 offset: usize,
9396 missing_type: Option<u16>,
9397 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9398 let mut stack = Vec::new();
9399 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9400 if missing_type.is_some() && cur == offset {
9401 stack.push(("ExprFibAttrs", offset));
9402 return (
9403 stack,
9404 missing_type.and_then(|t| ExprFibAttrs::attr_from_type(t)),
9405 );
9406 }
9407 if cur > offset || cur + self.buf.len() < offset {
9408 return (stack, None);
9409 }
9410 let mut attrs = self.clone();
9411 let mut last_off = cur + attrs.pos;
9412 while let Some(attr) = attrs.next() {
9413 let Ok(attr) = attr else { break };
9414 match attr {
9415 ExprFibAttrs::Dreg(val) => {
9416 if last_off == offset {
9417 stack.push(("Dreg", last_off));
9418 break;
9419 }
9420 }
9421 ExprFibAttrs::Result(val) => {
9422 if last_off == offset {
9423 stack.push(("Result", last_off));
9424 break;
9425 }
9426 }
9427 ExprFibAttrs::Flags(val) => {
9428 if last_off == offset {
9429 stack.push(("Flags", last_off));
9430 break;
9431 }
9432 }
9433 _ => {}
9434 };
9435 last_off = cur + attrs.pos;
9436 }
9437 if !stack.is_empty() {
9438 stack.push(("ExprFibAttrs", cur));
9439 }
9440 (stack, None)
9441 }
9442}
9443#[derive(Clone)]
9444pub enum ExprCtAttrs {
9445 Dreg(u32),
9446 #[doc = "Associated type: [`CtKeys`] (enum)"]
9447 Key(u32),
9448 #[doc = "Associated type: [`CtDirection`] (enum)"]
9449 Direction(u8),
9450 Sreg(u32),
9451}
9452impl<'a> IterableExprCtAttrs<'a> {
9453 pub fn get_dreg(&self) -> Result<u32, ErrorContext> {
9454 let mut iter = self.clone();
9455 iter.pos = 0;
9456 for attr in iter {
9457 if let Ok(ExprCtAttrs::Dreg(val)) = attr {
9458 return Ok(val);
9459 }
9460 }
9461 Err(ErrorContext::new_missing(
9462 "ExprCtAttrs",
9463 "Dreg",
9464 self.orig_loc,
9465 self.buf.as_ptr() as usize,
9466 ))
9467 }
9468 #[doc = "Associated type: [`CtKeys`] (enum)"]
9469 pub fn get_key(&self) -> Result<u32, ErrorContext> {
9470 let mut iter = self.clone();
9471 iter.pos = 0;
9472 for attr in iter {
9473 if let Ok(ExprCtAttrs::Key(val)) = attr {
9474 return Ok(val);
9475 }
9476 }
9477 Err(ErrorContext::new_missing(
9478 "ExprCtAttrs",
9479 "Key",
9480 self.orig_loc,
9481 self.buf.as_ptr() as usize,
9482 ))
9483 }
9484 #[doc = "Associated type: [`CtDirection`] (enum)"]
9485 pub fn get_direction(&self) -> Result<u8, ErrorContext> {
9486 let mut iter = self.clone();
9487 iter.pos = 0;
9488 for attr in iter {
9489 if let Ok(ExprCtAttrs::Direction(val)) = attr {
9490 return Ok(val);
9491 }
9492 }
9493 Err(ErrorContext::new_missing(
9494 "ExprCtAttrs",
9495 "Direction",
9496 self.orig_loc,
9497 self.buf.as_ptr() as usize,
9498 ))
9499 }
9500 pub fn get_sreg(&self) -> Result<u32, ErrorContext> {
9501 let mut iter = self.clone();
9502 iter.pos = 0;
9503 for attr in iter {
9504 if let Ok(ExprCtAttrs::Sreg(val)) = attr {
9505 return Ok(val);
9506 }
9507 }
9508 Err(ErrorContext::new_missing(
9509 "ExprCtAttrs",
9510 "Sreg",
9511 self.orig_loc,
9512 self.buf.as_ptr() as usize,
9513 ))
9514 }
9515}
9516impl ExprCtAttrs {
9517 pub fn new<'a>(buf: &'a [u8]) -> IterableExprCtAttrs<'a> {
9518 IterableExprCtAttrs::with_loc(buf, buf.as_ptr() as usize)
9519 }
9520 fn attr_from_type(r#type: u16) -> Option<&'static str> {
9521 let res = match r#type {
9522 1u16 => "Dreg",
9523 2u16 => "Key",
9524 3u16 => "Direction",
9525 4u16 => "Sreg",
9526 _ => return None,
9527 };
9528 Some(res)
9529 }
9530}
9531#[derive(Clone, Copy, Default)]
9532pub struct IterableExprCtAttrs<'a> {
9533 buf: &'a [u8],
9534 pos: usize,
9535 orig_loc: usize,
9536}
9537impl<'a> IterableExprCtAttrs<'a> {
9538 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9539 Self {
9540 buf,
9541 pos: 0,
9542 orig_loc,
9543 }
9544 }
9545 pub fn get_buf(&self) -> &'a [u8] {
9546 self.buf
9547 }
9548}
9549impl<'a> Iterator for IterableExprCtAttrs<'a> {
9550 type Item = Result<ExprCtAttrs, ErrorContext>;
9551 fn next(&mut self) -> Option<Self::Item> {
9552 let mut pos;
9553 let mut r#type;
9554 loop {
9555 pos = self.pos;
9556 r#type = None;
9557 if self.buf.len() == self.pos {
9558 return None;
9559 }
9560 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9561 self.pos = self.buf.len();
9562 break;
9563 };
9564 r#type = Some(header.r#type);
9565 let res = match header.r#type {
9566 1u16 => ExprCtAttrs::Dreg({
9567 let res = parse_be_u32(next);
9568 let Some(val) = res else { break };
9569 val
9570 }),
9571 2u16 => ExprCtAttrs::Key({
9572 let res = parse_be_u32(next);
9573 let Some(val) = res else { break };
9574 val
9575 }),
9576 3u16 => ExprCtAttrs::Direction({
9577 let res = parse_u8(next);
9578 let Some(val) = res else { break };
9579 val
9580 }),
9581 4u16 => ExprCtAttrs::Sreg({
9582 let res = parse_be_u32(next);
9583 let Some(val) = res else { break };
9584 val
9585 }),
9586 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9587 n => continue,
9588 };
9589 return Some(Ok(res));
9590 }
9591 Some(Err(ErrorContext::new(
9592 "ExprCtAttrs",
9593 r#type.and_then(|t| ExprCtAttrs::attr_from_type(t)),
9594 self.orig_loc,
9595 self.buf.as_ptr().wrapping_add(pos) as usize,
9596 )))
9597 }
9598}
9599impl std::fmt::Debug for IterableExprCtAttrs<'_> {
9600 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9601 let mut fmt = f.debug_struct("ExprCtAttrs");
9602 for attr in self.clone() {
9603 let attr = match attr {
9604 Ok(a) => a,
9605 Err(err) => {
9606 fmt.finish()?;
9607 f.write_str("Err(")?;
9608 err.fmt(f)?;
9609 return f.write_str(")");
9610 }
9611 };
9612 match attr {
9613 ExprCtAttrs::Dreg(val) => fmt.field("Dreg", &val),
9614 ExprCtAttrs::Key(val) => {
9615 fmt.field("Key", &FormatEnum(val.into(), CtKeys::from_value))
9616 }
9617 ExprCtAttrs::Direction(val) => fmt.field(
9618 "Direction",
9619 &FormatEnum(val.into(), CtDirection::from_value),
9620 ),
9621 ExprCtAttrs::Sreg(val) => fmt.field("Sreg", &val),
9622 };
9623 }
9624 fmt.finish()
9625 }
9626}
9627impl IterableExprCtAttrs<'_> {
9628 pub fn lookup_attr(
9629 &self,
9630 offset: usize,
9631 missing_type: Option<u16>,
9632 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9633 let mut stack = Vec::new();
9634 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9635 if missing_type.is_some() && cur == offset {
9636 stack.push(("ExprCtAttrs", offset));
9637 return (
9638 stack,
9639 missing_type.and_then(|t| ExprCtAttrs::attr_from_type(t)),
9640 );
9641 }
9642 if cur > offset || cur + self.buf.len() < offset {
9643 return (stack, None);
9644 }
9645 let mut attrs = self.clone();
9646 let mut last_off = cur + attrs.pos;
9647 while let Some(attr) = attrs.next() {
9648 let Ok(attr) = attr else { break };
9649 match attr {
9650 ExprCtAttrs::Dreg(val) => {
9651 if last_off == offset {
9652 stack.push(("Dreg", last_off));
9653 break;
9654 }
9655 }
9656 ExprCtAttrs::Key(val) => {
9657 if last_off == offset {
9658 stack.push(("Key", last_off));
9659 break;
9660 }
9661 }
9662 ExprCtAttrs::Direction(val) => {
9663 if last_off == offset {
9664 stack.push(("Direction", last_off));
9665 break;
9666 }
9667 }
9668 ExprCtAttrs::Sreg(val) => {
9669 if last_off == offset {
9670 stack.push(("Sreg", last_off));
9671 break;
9672 }
9673 }
9674 _ => {}
9675 };
9676 last_off = cur + attrs.pos;
9677 }
9678 if !stack.is_empty() {
9679 stack.push(("ExprCtAttrs", cur));
9680 }
9681 (stack, None)
9682 }
9683}
9684#[derive(Clone)]
9685pub enum ExprFlowOffloadAttrs<'a> {
9686 #[doc = "Flow offload table name\n"]
9687 Name(&'a CStr),
9688}
9689impl<'a> IterableExprFlowOffloadAttrs<'a> {
9690 #[doc = "Flow offload table name\n"]
9691 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
9692 let mut iter = self.clone();
9693 iter.pos = 0;
9694 for attr in iter {
9695 if let Ok(ExprFlowOffloadAttrs::Name(val)) = attr {
9696 return Ok(val);
9697 }
9698 }
9699 Err(ErrorContext::new_missing(
9700 "ExprFlowOffloadAttrs",
9701 "Name",
9702 self.orig_loc,
9703 self.buf.as_ptr() as usize,
9704 ))
9705 }
9706}
9707impl ExprFlowOffloadAttrs<'_> {
9708 pub fn new<'a>(buf: &'a [u8]) -> IterableExprFlowOffloadAttrs<'a> {
9709 IterableExprFlowOffloadAttrs::with_loc(buf, buf.as_ptr() as usize)
9710 }
9711 fn attr_from_type(r#type: u16) -> Option<&'static str> {
9712 let res = match r#type {
9713 1u16 => "Name",
9714 _ => return None,
9715 };
9716 Some(res)
9717 }
9718}
9719#[derive(Clone, Copy, Default)]
9720pub struct IterableExprFlowOffloadAttrs<'a> {
9721 buf: &'a [u8],
9722 pos: usize,
9723 orig_loc: usize,
9724}
9725impl<'a> IterableExprFlowOffloadAttrs<'a> {
9726 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9727 Self {
9728 buf,
9729 pos: 0,
9730 orig_loc,
9731 }
9732 }
9733 pub fn get_buf(&self) -> &'a [u8] {
9734 self.buf
9735 }
9736}
9737impl<'a> Iterator for IterableExprFlowOffloadAttrs<'a> {
9738 type Item = Result<ExprFlowOffloadAttrs<'a>, ErrorContext>;
9739 fn next(&mut self) -> Option<Self::Item> {
9740 let mut pos;
9741 let mut r#type;
9742 loop {
9743 pos = self.pos;
9744 r#type = None;
9745 if self.buf.len() == self.pos {
9746 return None;
9747 }
9748 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9749 self.pos = self.buf.len();
9750 break;
9751 };
9752 r#type = Some(header.r#type);
9753 let res = match header.r#type {
9754 1u16 => ExprFlowOffloadAttrs::Name({
9755 let res = CStr::from_bytes_with_nul(next).ok();
9756 let Some(val) = res else { break };
9757 val
9758 }),
9759 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9760 n => continue,
9761 };
9762 return Some(Ok(res));
9763 }
9764 Some(Err(ErrorContext::new(
9765 "ExprFlowOffloadAttrs",
9766 r#type.and_then(|t| ExprFlowOffloadAttrs::attr_from_type(t)),
9767 self.orig_loc,
9768 self.buf.as_ptr().wrapping_add(pos) as usize,
9769 )))
9770 }
9771}
9772impl<'a> std::fmt::Debug for IterableExprFlowOffloadAttrs<'_> {
9773 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9774 let mut fmt = f.debug_struct("ExprFlowOffloadAttrs");
9775 for attr in self.clone() {
9776 let attr = match attr {
9777 Ok(a) => a,
9778 Err(err) => {
9779 fmt.finish()?;
9780 f.write_str("Err(")?;
9781 err.fmt(f)?;
9782 return f.write_str(")");
9783 }
9784 };
9785 match attr {
9786 ExprFlowOffloadAttrs::Name(val) => fmt.field("Name", &val),
9787 };
9788 }
9789 fmt.finish()
9790 }
9791}
9792impl IterableExprFlowOffloadAttrs<'_> {
9793 pub fn lookup_attr(
9794 &self,
9795 offset: usize,
9796 missing_type: Option<u16>,
9797 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9798 let mut stack = Vec::new();
9799 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9800 if missing_type.is_some() && cur == offset {
9801 stack.push(("ExprFlowOffloadAttrs", offset));
9802 return (
9803 stack,
9804 missing_type.and_then(|t| ExprFlowOffloadAttrs::attr_from_type(t)),
9805 );
9806 }
9807 if cur > offset || cur + self.buf.len() < offset {
9808 return (stack, None);
9809 }
9810 let mut attrs = self.clone();
9811 let mut last_off = cur + attrs.pos;
9812 while let Some(attr) = attrs.next() {
9813 let Ok(attr) = attr else { break };
9814 match attr {
9815 ExprFlowOffloadAttrs::Name(val) => {
9816 if last_off == offset {
9817 stack.push(("Name", last_off));
9818 break;
9819 }
9820 }
9821 _ => {}
9822 };
9823 last_off = cur + attrs.pos;
9824 }
9825 if !stack.is_empty() {
9826 stack.push(("ExprFlowOffloadAttrs", cur));
9827 }
9828 (stack, None)
9829 }
9830}
9831#[derive(Clone)]
9832pub enum ExprImmediateAttrs<'a> {
9833 Dreg(u32),
9834 Data(IterableDataAttrs<'a>),
9835}
9836impl<'a> IterableExprImmediateAttrs<'a> {
9837 pub fn get_dreg(&self) -> Result<u32, ErrorContext> {
9838 let mut iter = self.clone();
9839 iter.pos = 0;
9840 for attr in iter {
9841 if let Ok(ExprImmediateAttrs::Dreg(val)) = attr {
9842 return Ok(val);
9843 }
9844 }
9845 Err(ErrorContext::new_missing(
9846 "ExprImmediateAttrs",
9847 "Dreg",
9848 self.orig_loc,
9849 self.buf.as_ptr() as usize,
9850 ))
9851 }
9852 pub fn get_data(&self) -> Result<IterableDataAttrs<'a>, ErrorContext> {
9853 let mut iter = self.clone();
9854 iter.pos = 0;
9855 for attr in iter {
9856 if let Ok(ExprImmediateAttrs::Data(val)) = attr {
9857 return Ok(val);
9858 }
9859 }
9860 Err(ErrorContext::new_missing(
9861 "ExprImmediateAttrs",
9862 "Data",
9863 self.orig_loc,
9864 self.buf.as_ptr() as usize,
9865 ))
9866 }
9867}
9868impl ExprImmediateAttrs<'_> {
9869 pub fn new<'a>(buf: &'a [u8]) -> IterableExprImmediateAttrs<'a> {
9870 IterableExprImmediateAttrs::with_loc(buf, buf.as_ptr() as usize)
9871 }
9872 fn attr_from_type(r#type: u16) -> Option<&'static str> {
9873 let res = match r#type {
9874 1u16 => "Dreg",
9875 2u16 => "Data",
9876 _ => return None,
9877 };
9878 Some(res)
9879 }
9880}
9881#[derive(Clone, Copy, Default)]
9882pub struct IterableExprImmediateAttrs<'a> {
9883 buf: &'a [u8],
9884 pos: usize,
9885 orig_loc: usize,
9886}
9887impl<'a> IterableExprImmediateAttrs<'a> {
9888 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9889 Self {
9890 buf,
9891 pos: 0,
9892 orig_loc,
9893 }
9894 }
9895 pub fn get_buf(&self) -> &'a [u8] {
9896 self.buf
9897 }
9898}
9899impl<'a> Iterator for IterableExprImmediateAttrs<'a> {
9900 type Item = Result<ExprImmediateAttrs<'a>, ErrorContext>;
9901 fn next(&mut self) -> Option<Self::Item> {
9902 let mut pos;
9903 let mut r#type;
9904 loop {
9905 pos = self.pos;
9906 r#type = None;
9907 if self.buf.len() == self.pos {
9908 return None;
9909 }
9910 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9911 self.pos = self.buf.len();
9912 break;
9913 };
9914 r#type = Some(header.r#type);
9915 let res = match header.r#type {
9916 1u16 => ExprImmediateAttrs::Dreg({
9917 let res = parse_be_u32(next);
9918 let Some(val) = res else { break };
9919 val
9920 }),
9921 2u16 => ExprImmediateAttrs::Data({
9922 let res = Some(IterableDataAttrs::with_loc(next, self.orig_loc));
9923 let Some(val) = res else { break };
9924 val
9925 }),
9926 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9927 n => continue,
9928 };
9929 return Some(Ok(res));
9930 }
9931 Some(Err(ErrorContext::new(
9932 "ExprImmediateAttrs",
9933 r#type.and_then(|t| ExprImmediateAttrs::attr_from_type(t)),
9934 self.orig_loc,
9935 self.buf.as_ptr().wrapping_add(pos) as usize,
9936 )))
9937 }
9938}
9939impl<'a> std::fmt::Debug for IterableExprImmediateAttrs<'_> {
9940 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9941 let mut fmt = f.debug_struct("ExprImmediateAttrs");
9942 for attr in self.clone() {
9943 let attr = match attr {
9944 Ok(a) => a,
9945 Err(err) => {
9946 fmt.finish()?;
9947 f.write_str("Err(")?;
9948 err.fmt(f)?;
9949 return f.write_str(")");
9950 }
9951 };
9952 match attr {
9953 ExprImmediateAttrs::Dreg(val) => fmt.field("Dreg", &val),
9954 ExprImmediateAttrs::Data(val) => fmt.field("Data", &val),
9955 };
9956 }
9957 fmt.finish()
9958 }
9959}
9960impl IterableExprImmediateAttrs<'_> {
9961 pub fn lookup_attr(
9962 &self,
9963 offset: usize,
9964 missing_type: Option<u16>,
9965 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9966 let mut stack = Vec::new();
9967 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9968 if missing_type.is_some() && cur == offset {
9969 stack.push(("ExprImmediateAttrs", offset));
9970 return (
9971 stack,
9972 missing_type.and_then(|t| ExprImmediateAttrs::attr_from_type(t)),
9973 );
9974 }
9975 if cur > offset || cur + self.buf.len() < offset {
9976 return (stack, None);
9977 }
9978 let mut attrs = self.clone();
9979 let mut last_off = cur + attrs.pos;
9980 let mut missing = None;
9981 while let Some(attr) = attrs.next() {
9982 let Ok(attr) = attr else { break };
9983 match attr {
9984 ExprImmediateAttrs::Dreg(val) => {
9985 if last_off == offset {
9986 stack.push(("Dreg", last_off));
9987 break;
9988 }
9989 }
9990 ExprImmediateAttrs::Data(val) => {
9991 (stack, missing) = val.lookup_attr(offset, missing_type);
9992 if !stack.is_empty() {
9993 break;
9994 }
9995 }
9996 _ => {}
9997 };
9998 last_off = cur + attrs.pos;
9999 }
10000 if !stack.is_empty() {
10001 stack.push(("ExprImmediateAttrs", cur));
10002 }
10003 (stack, missing)
10004 }
10005}
10006#[derive(Clone)]
10007pub enum ExprLookupAttrs<'a> {
10008 #[doc = "Name of set to use\n"]
10009 Set(&'a CStr),
10010 #[doc = "ID of set to use\n"]
10011 SetId(u32),
10012 Sreg(u32),
10013 Dreg(u32),
10014 #[doc = "Associated type: [`LookupFlags`] (enum)"]
10015 Flags(u32),
10016}
10017impl<'a> IterableExprLookupAttrs<'a> {
10018 #[doc = "Name of set to use\n"]
10019 pub fn get_set(&self) -> Result<&'a CStr, ErrorContext> {
10020 let mut iter = self.clone();
10021 iter.pos = 0;
10022 for attr in iter {
10023 if let Ok(ExprLookupAttrs::Set(val)) = attr {
10024 return Ok(val);
10025 }
10026 }
10027 Err(ErrorContext::new_missing(
10028 "ExprLookupAttrs",
10029 "Set",
10030 self.orig_loc,
10031 self.buf.as_ptr() as usize,
10032 ))
10033 }
10034 #[doc = "ID of set to use\n"]
10035 pub fn get_set_id(&self) -> Result<u32, ErrorContext> {
10036 let mut iter = self.clone();
10037 iter.pos = 0;
10038 for attr in iter {
10039 if let Ok(ExprLookupAttrs::SetId(val)) = attr {
10040 return Ok(val);
10041 }
10042 }
10043 Err(ErrorContext::new_missing(
10044 "ExprLookupAttrs",
10045 "SetId",
10046 self.orig_loc,
10047 self.buf.as_ptr() as usize,
10048 ))
10049 }
10050 pub fn get_sreg(&self) -> Result<u32, ErrorContext> {
10051 let mut iter = self.clone();
10052 iter.pos = 0;
10053 for attr in iter {
10054 if let Ok(ExprLookupAttrs::Sreg(val)) = attr {
10055 return Ok(val);
10056 }
10057 }
10058 Err(ErrorContext::new_missing(
10059 "ExprLookupAttrs",
10060 "Sreg",
10061 self.orig_loc,
10062 self.buf.as_ptr() as usize,
10063 ))
10064 }
10065 pub fn get_dreg(&self) -> Result<u32, ErrorContext> {
10066 let mut iter = self.clone();
10067 iter.pos = 0;
10068 for attr in iter {
10069 if let Ok(ExprLookupAttrs::Dreg(val)) = attr {
10070 return Ok(val);
10071 }
10072 }
10073 Err(ErrorContext::new_missing(
10074 "ExprLookupAttrs",
10075 "Dreg",
10076 self.orig_loc,
10077 self.buf.as_ptr() as usize,
10078 ))
10079 }
10080 #[doc = "Associated type: [`LookupFlags`] (enum)"]
10081 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
10082 let mut iter = self.clone();
10083 iter.pos = 0;
10084 for attr in iter {
10085 if let Ok(ExprLookupAttrs::Flags(val)) = attr {
10086 return Ok(val);
10087 }
10088 }
10089 Err(ErrorContext::new_missing(
10090 "ExprLookupAttrs",
10091 "Flags",
10092 self.orig_loc,
10093 self.buf.as_ptr() as usize,
10094 ))
10095 }
10096}
10097impl ExprLookupAttrs<'_> {
10098 pub fn new<'a>(buf: &'a [u8]) -> IterableExprLookupAttrs<'a> {
10099 IterableExprLookupAttrs::with_loc(buf, buf.as_ptr() as usize)
10100 }
10101 fn attr_from_type(r#type: u16) -> Option<&'static str> {
10102 let res = match r#type {
10103 1u16 => "Set",
10104 2u16 => "SetId",
10105 3u16 => "Sreg",
10106 4u16 => "Dreg",
10107 5u16 => "Flags",
10108 _ => return None,
10109 };
10110 Some(res)
10111 }
10112}
10113#[derive(Clone, Copy, Default)]
10114pub struct IterableExprLookupAttrs<'a> {
10115 buf: &'a [u8],
10116 pos: usize,
10117 orig_loc: usize,
10118}
10119impl<'a> IterableExprLookupAttrs<'a> {
10120 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10121 Self {
10122 buf,
10123 pos: 0,
10124 orig_loc,
10125 }
10126 }
10127 pub fn get_buf(&self) -> &'a [u8] {
10128 self.buf
10129 }
10130}
10131impl<'a> Iterator for IterableExprLookupAttrs<'a> {
10132 type Item = Result<ExprLookupAttrs<'a>, ErrorContext>;
10133 fn next(&mut self) -> Option<Self::Item> {
10134 let mut pos;
10135 let mut r#type;
10136 loop {
10137 pos = self.pos;
10138 r#type = None;
10139 if self.buf.len() == self.pos {
10140 return None;
10141 }
10142 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10143 self.pos = self.buf.len();
10144 break;
10145 };
10146 r#type = Some(header.r#type);
10147 let res = match header.r#type {
10148 1u16 => ExprLookupAttrs::Set({
10149 let res = CStr::from_bytes_with_nul(next).ok();
10150 let Some(val) = res else { break };
10151 val
10152 }),
10153 2u16 => ExprLookupAttrs::SetId({
10154 let res = parse_be_u32(next);
10155 let Some(val) = res else { break };
10156 val
10157 }),
10158 3u16 => ExprLookupAttrs::Sreg({
10159 let res = parse_be_u32(next);
10160 let Some(val) = res else { break };
10161 val
10162 }),
10163 4u16 => ExprLookupAttrs::Dreg({
10164 let res = parse_be_u32(next);
10165 let Some(val) = res else { break };
10166 val
10167 }),
10168 5u16 => ExprLookupAttrs::Flags({
10169 let res = parse_be_u32(next);
10170 let Some(val) = res else { break };
10171 val
10172 }),
10173 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10174 n => continue,
10175 };
10176 return Some(Ok(res));
10177 }
10178 Some(Err(ErrorContext::new(
10179 "ExprLookupAttrs",
10180 r#type.and_then(|t| ExprLookupAttrs::attr_from_type(t)),
10181 self.orig_loc,
10182 self.buf.as_ptr().wrapping_add(pos) as usize,
10183 )))
10184 }
10185}
10186impl<'a> std::fmt::Debug for IterableExprLookupAttrs<'_> {
10187 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10188 let mut fmt = f.debug_struct("ExprLookupAttrs");
10189 for attr in self.clone() {
10190 let attr = match attr {
10191 Ok(a) => a,
10192 Err(err) => {
10193 fmt.finish()?;
10194 f.write_str("Err(")?;
10195 err.fmt(f)?;
10196 return f.write_str(")");
10197 }
10198 };
10199 match attr {
10200 ExprLookupAttrs::Set(val) => fmt.field("Set", &val),
10201 ExprLookupAttrs::SetId(val) => fmt.field("SetId", &val),
10202 ExprLookupAttrs::Sreg(val) => fmt.field("Sreg", &val),
10203 ExprLookupAttrs::Dreg(val) => fmt.field("Dreg", &val),
10204 ExprLookupAttrs::Flags(val) => {
10205 fmt.field("Flags", &FormatFlags(val.into(), LookupFlags::from_value))
10206 }
10207 };
10208 }
10209 fmt.finish()
10210 }
10211}
10212impl IterableExprLookupAttrs<'_> {
10213 pub fn lookup_attr(
10214 &self,
10215 offset: usize,
10216 missing_type: Option<u16>,
10217 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10218 let mut stack = Vec::new();
10219 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10220 if missing_type.is_some() && cur == offset {
10221 stack.push(("ExprLookupAttrs", offset));
10222 return (
10223 stack,
10224 missing_type.and_then(|t| ExprLookupAttrs::attr_from_type(t)),
10225 );
10226 }
10227 if cur > offset || cur + self.buf.len() < offset {
10228 return (stack, None);
10229 }
10230 let mut attrs = self.clone();
10231 let mut last_off = cur + attrs.pos;
10232 while let Some(attr) = attrs.next() {
10233 let Ok(attr) = attr else { break };
10234 match attr {
10235 ExprLookupAttrs::Set(val) => {
10236 if last_off == offset {
10237 stack.push(("Set", last_off));
10238 break;
10239 }
10240 }
10241 ExprLookupAttrs::SetId(val) => {
10242 if last_off == offset {
10243 stack.push(("SetId", last_off));
10244 break;
10245 }
10246 }
10247 ExprLookupAttrs::Sreg(val) => {
10248 if last_off == offset {
10249 stack.push(("Sreg", last_off));
10250 break;
10251 }
10252 }
10253 ExprLookupAttrs::Dreg(val) => {
10254 if last_off == offset {
10255 stack.push(("Dreg", last_off));
10256 break;
10257 }
10258 }
10259 ExprLookupAttrs::Flags(val) => {
10260 if last_off == offset {
10261 stack.push(("Flags", last_off));
10262 break;
10263 }
10264 }
10265 _ => {}
10266 };
10267 last_off = cur + attrs.pos;
10268 }
10269 if !stack.is_empty() {
10270 stack.push(("ExprLookupAttrs", cur));
10271 }
10272 (stack, None)
10273 }
10274}
10275#[derive(Clone)]
10276pub enum ExprMasqAttrs {
10277 #[doc = "Associated type: [`NatRangeFlags`] (1 bit per enumeration)"]
10278 Flags(u32),
10279 #[doc = "Associated type: [`Registers`] (enum)"]
10280 RegProtoMin(u32),
10281 #[doc = "Associated type: [`Registers`] (enum)"]
10282 RegProtoMax(u32),
10283}
10284impl<'a> IterableExprMasqAttrs<'a> {
10285 #[doc = "Associated type: [`NatRangeFlags`] (1 bit per enumeration)"]
10286 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
10287 let mut iter = self.clone();
10288 iter.pos = 0;
10289 for attr in iter {
10290 if let Ok(ExprMasqAttrs::Flags(val)) = attr {
10291 return Ok(val);
10292 }
10293 }
10294 Err(ErrorContext::new_missing(
10295 "ExprMasqAttrs",
10296 "Flags",
10297 self.orig_loc,
10298 self.buf.as_ptr() as usize,
10299 ))
10300 }
10301 #[doc = "Associated type: [`Registers`] (enum)"]
10302 pub fn get_reg_proto_min(&self) -> Result<u32, ErrorContext> {
10303 let mut iter = self.clone();
10304 iter.pos = 0;
10305 for attr in iter {
10306 if let Ok(ExprMasqAttrs::RegProtoMin(val)) = attr {
10307 return Ok(val);
10308 }
10309 }
10310 Err(ErrorContext::new_missing(
10311 "ExprMasqAttrs",
10312 "RegProtoMin",
10313 self.orig_loc,
10314 self.buf.as_ptr() as usize,
10315 ))
10316 }
10317 #[doc = "Associated type: [`Registers`] (enum)"]
10318 pub fn get_reg_proto_max(&self) -> Result<u32, ErrorContext> {
10319 let mut iter = self.clone();
10320 iter.pos = 0;
10321 for attr in iter {
10322 if let Ok(ExprMasqAttrs::RegProtoMax(val)) = attr {
10323 return Ok(val);
10324 }
10325 }
10326 Err(ErrorContext::new_missing(
10327 "ExprMasqAttrs",
10328 "RegProtoMax",
10329 self.orig_loc,
10330 self.buf.as_ptr() as usize,
10331 ))
10332 }
10333}
10334impl ExprMasqAttrs {
10335 pub fn new<'a>(buf: &'a [u8]) -> IterableExprMasqAttrs<'a> {
10336 IterableExprMasqAttrs::with_loc(buf, buf.as_ptr() as usize)
10337 }
10338 fn attr_from_type(r#type: u16) -> Option<&'static str> {
10339 let res = match r#type {
10340 1u16 => "Flags",
10341 2u16 => "RegProtoMin",
10342 3u16 => "RegProtoMax",
10343 _ => return None,
10344 };
10345 Some(res)
10346 }
10347}
10348#[derive(Clone, Copy, Default)]
10349pub struct IterableExprMasqAttrs<'a> {
10350 buf: &'a [u8],
10351 pos: usize,
10352 orig_loc: usize,
10353}
10354impl<'a> IterableExprMasqAttrs<'a> {
10355 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10356 Self {
10357 buf,
10358 pos: 0,
10359 orig_loc,
10360 }
10361 }
10362 pub fn get_buf(&self) -> &'a [u8] {
10363 self.buf
10364 }
10365}
10366impl<'a> Iterator for IterableExprMasqAttrs<'a> {
10367 type Item = Result<ExprMasqAttrs, ErrorContext>;
10368 fn next(&mut self) -> Option<Self::Item> {
10369 let mut pos;
10370 let mut r#type;
10371 loop {
10372 pos = self.pos;
10373 r#type = None;
10374 if self.buf.len() == self.pos {
10375 return None;
10376 }
10377 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10378 self.pos = self.buf.len();
10379 break;
10380 };
10381 r#type = Some(header.r#type);
10382 let res = match header.r#type {
10383 1u16 => ExprMasqAttrs::Flags({
10384 let res = parse_be_u32(next);
10385 let Some(val) = res else { break };
10386 val
10387 }),
10388 2u16 => ExprMasqAttrs::RegProtoMin({
10389 let res = parse_be_u32(next);
10390 let Some(val) = res else { break };
10391 val
10392 }),
10393 3u16 => ExprMasqAttrs::RegProtoMax({
10394 let res = parse_be_u32(next);
10395 let Some(val) = res else { break };
10396 val
10397 }),
10398 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10399 n => continue,
10400 };
10401 return Some(Ok(res));
10402 }
10403 Some(Err(ErrorContext::new(
10404 "ExprMasqAttrs",
10405 r#type.and_then(|t| ExprMasqAttrs::attr_from_type(t)),
10406 self.orig_loc,
10407 self.buf.as_ptr().wrapping_add(pos) as usize,
10408 )))
10409 }
10410}
10411impl std::fmt::Debug for IterableExprMasqAttrs<'_> {
10412 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10413 let mut fmt = f.debug_struct("ExprMasqAttrs");
10414 for attr in self.clone() {
10415 let attr = match attr {
10416 Ok(a) => a,
10417 Err(err) => {
10418 fmt.finish()?;
10419 f.write_str("Err(")?;
10420 err.fmt(f)?;
10421 return f.write_str(")");
10422 }
10423 };
10424 match attr {
10425 ExprMasqAttrs::Flags(val) => {
10426 fmt.field("Flags", &FormatFlags(val.into(), NatRangeFlags::from_value))
10427 }
10428 ExprMasqAttrs::RegProtoMin(val) => fmt.field(
10429 "RegProtoMin",
10430 &FormatEnum(val.into(), Registers::from_value),
10431 ),
10432 ExprMasqAttrs::RegProtoMax(val) => fmt.field(
10433 "RegProtoMax",
10434 &FormatEnum(val.into(), Registers::from_value),
10435 ),
10436 };
10437 }
10438 fmt.finish()
10439 }
10440}
10441impl IterableExprMasqAttrs<'_> {
10442 pub fn lookup_attr(
10443 &self,
10444 offset: usize,
10445 missing_type: Option<u16>,
10446 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10447 let mut stack = Vec::new();
10448 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10449 if missing_type.is_some() && cur == offset {
10450 stack.push(("ExprMasqAttrs", offset));
10451 return (
10452 stack,
10453 missing_type.and_then(|t| ExprMasqAttrs::attr_from_type(t)),
10454 );
10455 }
10456 if cur > offset || cur + self.buf.len() < offset {
10457 return (stack, None);
10458 }
10459 let mut attrs = self.clone();
10460 let mut last_off = cur + attrs.pos;
10461 while let Some(attr) = attrs.next() {
10462 let Ok(attr) = attr else { break };
10463 match attr {
10464 ExprMasqAttrs::Flags(val) => {
10465 if last_off == offset {
10466 stack.push(("Flags", last_off));
10467 break;
10468 }
10469 }
10470 ExprMasqAttrs::RegProtoMin(val) => {
10471 if last_off == offset {
10472 stack.push(("RegProtoMin", last_off));
10473 break;
10474 }
10475 }
10476 ExprMasqAttrs::RegProtoMax(val) => {
10477 if last_off == offset {
10478 stack.push(("RegProtoMax", last_off));
10479 break;
10480 }
10481 }
10482 _ => {}
10483 };
10484 last_off = cur + attrs.pos;
10485 }
10486 if !stack.is_empty() {
10487 stack.push(("ExprMasqAttrs", cur));
10488 }
10489 (stack, None)
10490 }
10491}
10492#[derive(Clone)]
10493pub enum ExprMetaAttrs {
10494 Dreg(u32),
10495 #[doc = "Associated type: [`MetaKeys`] (enum)"]
10496 Key(u32),
10497 Sreg(u32),
10498}
10499impl<'a> IterableExprMetaAttrs<'a> {
10500 pub fn get_dreg(&self) -> Result<u32, ErrorContext> {
10501 let mut iter = self.clone();
10502 iter.pos = 0;
10503 for attr in iter {
10504 if let Ok(ExprMetaAttrs::Dreg(val)) = attr {
10505 return Ok(val);
10506 }
10507 }
10508 Err(ErrorContext::new_missing(
10509 "ExprMetaAttrs",
10510 "Dreg",
10511 self.orig_loc,
10512 self.buf.as_ptr() as usize,
10513 ))
10514 }
10515 #[doc = "Associated type: [`MetaKeys`] (enum)"]
10516 pub fn get_key(&self) -> Result<u32, ErrorContext> {
10517 let mut iter = self.clone();
10518 iter.pos = 0;
10519 for attr in iter {
10520 if let Ok(ExprMetaAttrs::Key(val)) = attr {
10521 return Ok(val);
10522 }
10523 }
10524 Err(ErrorContext::new_missing(
10525 "ExprMetaAttrs",
10526 "Key",
10527 self.orig_loc,
10528 self.buf.as_ptr() as usize,
10529 ))
10530 }
10531 pub fn get_sreg(&self) -> Result<u32, ErrorContext> {
10532 let mut iter = self.clone();
10533 iter.pos = 0;
10534 for attr in iter {
10535 if let Ok(ExprMetaAttrs::Sreg(val)) = attr {
10536 return Ok(val);
10537 }
10538 }
10539 Err(ErrorContext::new_missing(
10540 "ExprMetaAttrs",
10541 "Sreg",
10542 self.orig_loc,
10543 self.buf.as_ptr() as usize,
10544 ))
10545 }
10546}
10547impl ExprMetaAttrs {
10548 pub fn new<'a>(buf: &'a [u8]) -> IterableExprMetaAttrs<'a> {
10549 IterableExprMetaAttrs::with_loc(buf, buf.as_ptr() as usize)
10550 }
10551 fn attr_from_type(r#type: u16) -> Option<&'static str> {
10552 let res = match r#type {
10553 1u16 => "Dreg",
10554 2u16 => "Key",
10555 3u16 => "Sreg",
10556 _ => return None,
10557 };
10558 Some(res)
10559 }
10560}
10561#[derive(Clone, Copy, Default)]
10562pub struct IterableExprMetaAttrs<'a> {
10563 buf: &'a [u8],
10564 pos: usize,
10565 orig_loc: usize,
10566}
10567impl<'a> IterableExprMetaAttrs<'a> {
10568 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10569 Self {
10570 buf,
10571 pos: 0,
10572 orig_loc,
10573 }
10574 }
10575 pub fn get_buf(&self) -> &'a [u8] {
10576 self.buf
10577 }
10578}
10579impl<'a> Iterator for IterableExprMetaAttrs<'a> {
10580 type Item = Result<ExprMetaAttrs, ErrorContext>;
10581 fn next(&mut self) -> Option<Self::Item> {
10582 let mut pos;
10583 let mut r#type;
10584 loop {
10585 pos = self.pos;
10586 r#type = None;
10587 if self.buf.len() == self.pos {
10588 return None;
10589 }
10590 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10591 self.pos = self.buf.len();
10592 break;
10593 };
10594 r#type = Some(header.r#type);
10595 let res = match header.r#type {
10596 1u16 => ExprMetaAttrs::Dreg({
10597 let res = parse_be_u32(next);
10598 let Some(val) = res else { break };
10599 val
10600 }),
10601 2u16 => ExprMetaAttrs::Key({
10602 let res = parse_be_u32(next);
10603 let Some(val) = res else { break };
10604 val
10605 }),
10606 3u16 => ExprMetaAttrs::Sreg({
10607 let res = parse_be_u32(next);
10608 let Some(val) = res else { break };
10609 val
10610 }),
10611 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10612 n => continue,
10613 };
10614 return Some(Ok(res));
10615 }
10616 Some(Err(ErrorContext::new(
10617 "ExprMetaAttrs",
10618 r#type.and_then(|t| ExprMetaAttrs::attr_from_type(t)),
10619 self.orig_loc,
10620 self.buf.as_ptr().wrapping_add(pos) as usize,
10621 )))
10622 }
10623}
10624impl std::fmt::Debug for IterableExprMetaAttrs<'_> {
10625 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10626 let mut fmt = f.debug_struct("ExprMetaAttrs");
10627 for attr in self.clone() {
10628 let attr = match attr {
10629 Ok(a) => a,
10630 Err(err) => {
10631 fmt.finish()?;
10632 f.write_str("Err(")?;
10633 err.fmt(f)?;
10634 return f.write_str(")");
10635 }
10636 };
10637 match attr {
10638 ExprMetaAttrs::Dreg(val) => fmt.field("Dreg", &val),
10639 ExprMetaAttrs::Key(val) => {
10640 fmt.field("Key", &FormatEnum(val.into(), MetaKeys::from_value))
10641 }
10642 ExprMetaAttrs::Sreg(val) => fmt.field("Sreg", &val),
10643 };
10644 }
10645 fmt.finish()
10646 }
10647}
10648impl IterableExprMetaAttrs<'_> {
10649 pub fn lookup_attr(
10650 &self,
10651 offset: usize,
10652 missing_type: Option<u16>,
10653 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10654 let mut stack = Vec::new();
10655 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10656 if missing_type.is_some() && cur == offset {
10657 stack.push(("ExprMetaAttrs", offset));
10658 return (
10659 stack,
10660 missing_type.and_then(|t| ExprMetaAttrs::attr_from_type(t)),
10661 );
10662 }
10663 if cur > offset || cur + self.buf.len() < offset {
10664 return (stack, None);
10665 }
10666 let mut attrs = self.clone();
10667 let mut last_off = cur + attrs.pos;
10668 while let Some(attr) = attrs.next() {
10669 let Ok(attr) = attr else { break };
10670 match attr {
10671 ExprMetaAttrs::Dreg(val) => {
10672 if last_off == offset {
10673 stack.push(("Dreg", last_off));
10674 break;
10675 }
10676 }
10677 ExprMetaAttrs::Key(val) => {
10678 if last_off == offset {
10679 stack.push(("Key", last_off));
10680 break;
10681 }
10682 }
10683 ExprMetaAttrs::Sreg(val) => {
10684 if last_off == offset {
10685 stack.push(("Sreg", last_off));
10686 break;
10687 }
10688 }
10689 _ => {}
10690 };
10691 last_off = cur + attrs.pos;
10692 }
10693 if !stack.is_empty() {
10694 stack.push(("ExprMetaAttrs", cur));
10695 }
10696 (stack, None)
10697 }
10698}
10699#[derive(Clone)]
10700pub enum ExprNatAttrs {
10701 Type(u32),
10702 Family(u32),
10703 RegAddrMin(u32),
10704 RegAddrMax(u32),
10705 RegProtoMin(u32),
10706 RegProtoMax(u32),
10707 #[doc = "Associated type: [`NatRangeFlags`] (1 bit per enumeration)"]
10708 Flags(u32),
10709}
10710impl<'a> IterableExprNatAttrs<'a> {
10711 pub fn get_type(&self) -> Result<u32, ErrorContext> {
10712 let mut iter = self.clone();
10713 iter.pos = 0;
10714 for attr in iter {
10715 if let Ok(ExprNatAttrs::Type(val)) = attr {
10716 return Ok(val);
10717 }
10718 }
10719 Err(ErrorContext::new_missing(
10720 "ExprNatAttrs",
10721 "Type",
10722 self.orig_loc,
10723 self.buf.as_ptr() as usize,
10724 ))
10725 }
10726 pub fn get_family(&self) -> Result<u32, ErrorContext> {
10727 let mut iter = self.clone();
10728 iter.pos = 0;
10729 for attr in iter {
10730 if let Ok(ExprNatAttrs::Family(val)) = attr {
10731 return Ok(val);
10732 }
10733 }
10734 Err(ErrorContext::new_missing(
10735 "ExprNatAttrs",
10736 "Family",
10737 self.orig_loc,
10738 self.buf.as_ptr() as usize,
10739 ))
10740 }
10741 pub fn get_reg_addr_min(&self) -> Result<u32, ErrorContext> {
10742 let mut iter = self.clone();
10743 iter.pos = 0;
10744 for attr in iter {
10745 if let Ok(ExprNatAttrs::RegAddrMin(val)) = attr {
10746 return Ok(val);
10747 }
10748 }
10749 Err(ErrorContext::new_missing(
10750 "ExprNatAttrs",
10751 "RegAddrMin",
10752 self.orig_loc,
10753 self.buf.as_ptr() as usize,
10754 ))
10755 }
10756 pub fn get_reg_addr_max(&self) -> Result<u32, ErrorContext> {
10757 let mut iter = self.clone();
10758 iter.pos = 0;
10759 for attr in iter {
10760 if let Ok(ExprNatAttrs::RegAddrMax(val)) = attr {
10761 return Ok(val);
10762 }
10763 }
10764 Err(ErrorContext::new_missing(
10765 "ExprNatAttrs",
10766 "RegAddrMax",
10767 self.orig_loc,
10768 self.buf.as_ptr() as usize,
10769 ))
10770 }
10771 pub fn get_reg_proto_min(&self) -> Result<u32, ErrorContext> {
10772 let mut iter = self.clone();
10773 iter.pos = 0;
10774 for attr in iter {
10775 if let Ok(ExprNatAttrs::RegProtoMin(val)) = attr {
10776 return Ok(val);
10777 }
10778 }
10779 Err(ErrorContext::new_missing(
10780 "ExprNatAttrs",
10781 "RegProtoMin",
10782 self.orig_loc,
10783 self.buf.as_ptr() as usize,
10784 ))
10785 }
10786 pub fn get_reg_proto_max(&self) -> Result<u32, ErrorContext> {
10787 let mut iter = self.clone();
10788 iter.pos = 0;
10789 for attr in iter {
10790 if let Ok(ExprNatAttrs::RegProtoMax(val)) = attr {
10791 return Ok(val);
10792 }
10793 }
10794 Err(ErrorContext::new_missing(
10795 "ExprNatAttrs",
10796 "RegProtoMax",
10797 self.orig_loc,
10798 self.buf.as_ptr() as usize,
10799 ))
10800 }
10801 #[doc = "Associated type: [`NatRangeFlags`] (1 bit per enumeration)"]
10802 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
10803 let mut iter = self.clone();
10804 iter.pos = 0;
10805 for attr in iter {
10806 if let Ok(ExprNatAttrs::Flags(val)) = attr {
10807 return Ok(val);
10808 }
10809 }
10810 Err(ErrorContext::new_missing(
10811 "ExprNatAttrs",
10812 "Flags",
10813 self.orig_loc,
10814 self.buf.as_ptr() as usize,
10815 ))
10816 }
10817}
10818impl ExprNatAttrs {
10819 pub fn new<'a>(buf: &'a [u8]) -> IterableExprNatAttrs<'a> {
10820 IterableExprNatAttrs::with_loc(buf, buf.as_ptr() as usize)
10821 }
10822 fn attr_from_type(r#type: u16) -> Option<&'static str> {
10823 let res = match r#type {
10824 1u16 => "Type",
10825 2u16 => "Family",
10826 3u16 => "RegAddrMin",
10827 4u16 => "RegAddrMax",
10828 5u16 => "RegProtoMin",
10829 6u16 => "RegProtoMax",
10830 7u16 => "Flags",
10831 _ => return None,
10832 };
10833 Some(res)
10834 }
10835}
10836#[derive(Clone, Copy, Default)]
10837pub struct IterableExprNatAttrs<'a> {
10838 buf: &'a [u8],
10839 pos: usize,
10840 orig_loc: usize,
10841}
10842impl<'a> IterableExprNatAttrs<'a> {
10843 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10844 Self {
10845 buf,
10846 pos: 0,
10847 orig_loc,
10848 }
10849 }
10850 pub fn get_buf(&self) -> &'a [u8] {
10851 self.buf
10852 }
10853}
10854impl<'a> Iterator for IterableExprNatAttrs<'a> {
10855 type Item = Result<ExprNatAttrs, ErrorContext>;
10856 fn next(&mut self) -> Option<Self::Item> {
10857 let mut pos;
10858 let mut r#type;
10859 loop {
10860 pos = self.pos;
10861 r#type = None;
10862 if self.buf.len() == self.pos {
10863 return None;
10864 }
10865 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10866 self.pos = self.buf.len();
10867 break;
10868 };
10869 r#type = Some(header.r#type);
10870 let res = match header.r#type {
10871 1u16 => ExprNatAttrs::Type({
10872 let res = parse_be_u32(next);
10873 let Some(val) = res else { break };
10874 val
10875 }),
10876 2u16 => ExprNatAttrs::Family({
10877 let res = parse_be_u32(next);
10878 let Some(val) = res else { break };
10879 val
10880 }),
10881 3u16 => ExprNatAttrs::RegAddrMin({
10882 let res = parse_be_u32(next);
10883 let Some(val) = res else { break };
10884 val
10885 }),
10886 4u16 => ExprNatAttrs::RegAddrMax({
10887 let res = parse_be_u32(next);
10888 let Some(val) = res else { break };
10889 val
10890 }),
10891 5u16 => ExprNatAttrs::RegProtoMin({
10892 let res = parse_be_u32(next);
10893 let Some(val) = res else { break };
10894 val
10895 }),
10896 6u16 => ExprNatAttrs::RegProtoMax({
10897 let res = parse_be_u32(next);
10898 let Some(val) = res else { break };
10899 val
10900 }),
10901 7u16 => ExprNatAttrs::Flags({
10902 let res = parse_be_u32(next);
10903 let Some(val) = res else { break };
10904 val
10905 }),
10906 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10907 n => continue,
10908 };
10909 return Some(Ok(res));
10910 }
10911 Some(Err(ErrorContext::new(
10912 "ExprNatAttrs",
10913 r#type.and_then(|t| ExprNatAttrs::attr_from_type(t)),
10914 self.orig_loc,
10915 self.buf.as_ptr().wrapping_add(pos) as usize,
10916 )))
10917 }
10918}
10919impl std::fmt::Debug for IterableExprNatAttrs<'_> {
10920 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10921 let mut fmt = f.debug_struct("ExprNatAttrs");
10922 for attr in self.clone() {
10923 let attr = match attr {
10924 Ok(a) => a,
10925 Err(err) => {
10926 fmt.finish()?;
10927 f.write_str("Err(")?;
10928 err.fmt(f)?;
10929 return f.write_str(")");
10930 }
10931 };
10932 match attr {
10933 ExprNatAttrs::Type(val) => fmt.field("Type", &val),
10934 ExprNatAttrs::Family(val) => fmt.field("Family", &val),
10935 ExprNatAttrs::RegAddrMin(val) => fmt.field("RegAddrMin", &val),
10936 ExprNatAttrs::RegAddrMax(val) => fmt.field("RegAddrMax", &val),
10937 ExprNatAttrs::RegProtoMin(val) => fmt.field("RegProtoMin", &val),
10938 ExprNatAttrs::RegProtoMax(val) => fmt.field("RegProtoMax", &val),
10939 ExprNatAttrs::Flags(val) => {
10940 fmt.field("Flags", &FormatFlags(val.into(), NatRangeFlags::from_value))
10941 }
10942 };
10943 }
10944 fmt.finish()
10945 }
10946}
10947impl IterableExprNatAttrs<'_> {
10948 pub fn lookup_attr(
10949 &self,
10950 offset: usize,
10951 missing_type: Option<u16>,
10952 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10953 let mut stack = Vec::new();
10954 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10955 if missing_type.is_some() && cur == offset {
10956 stack.push(("ExprNatAttrs", offset));
10957 return (
10958 stack,
10959 missing_type.and_then(|t| ExprNatAttrs::attr_from_type(t)),
10960 );
10961 }
10962 if cur > offset || cur + self.buf.len() < offset {
10963 return (stack, None);
10964 }
10965 let mut attrs = self.clone();
10966 let mut last_off = cur + attrs.pos;
10967 while let Some(attr) = attrs.next() {
10968 let Ok(attr) = attr else { break };
10969 match attr {
10970 ExprNatAttrs::Type(val) => {
10971 if last_off == offset {
10972 stack.push(("Type", last_off));
10973 break;
10974 }
10975 }
10976 ExprNatAttrs::Family(val) => {
10977 if last_off == offset {
10978 stack.push(("Family", last_off));
10979 break;
10980 }
10981 }
10982 ExprNatAttrs::RegAddrMin(val) => {
10983 if last_off == offset {
10984 stack.push(("RegAddrMin", last_off));
10985 break;
10986 }
10987 }
10988 ExprNatAttrs::RegAddrMax(val) => {
10989 if last_off == offset {
10990 stack.push(("RegAddrMax", last_off));
10991 break;
10992 }
10993 }
10994 ExprNatAttrs::RegProtoMin(val) => {
10995 if last_off == offset {
10996 stack.push(("RegProtoMin", last_off));
10997 break;
10998 }
10999 }
11000 ExprNatAttrs::RegProtoMax(val) => {
11001 if last_off == offset {
11002 stack.push(("RegProtoMax", last_off));
11003 break;
11004 }
11005 }
11006 ExprNatAttrs::Flags(val) => {
11007 if last_off == offset {
11008 stack.push(("Flags", last_off));
11009 break;
11010 }
11011 }
11012 _ => {}
11013 };
11014 last_off = cur + attrs.pos;
11015 }
11016 if !stack.is_empty() {
11017 stack.push(("ExprNatAttrs", cur));
11018 }
11019 (stack, None)
11020 }
11021}
11022#[derive(Clone)]
11023pub enum ExprPayloadAttrs {
11024 #[doc = "destination register to load data into\n\nAssociated type: [`Registers`] (enum)"]
11025 Dreg(u32),
11026 #[doc = "payload base\n\nAssociated type: [`PayloadBase`] (enum)"]
11027 Base(u32),
11028 #[doc = "payload offset relative to base\n"]
11029 Offset(u32),
11030 #[doc = "payload length\n"]
11031 Len(u32),
11032 #[doc = "source register to load data from\n\nAssociated type: [`Registers`] (enum)"]
11033 Sreg(u32),
11034 #[doc = "checksum type\n"]
11035 CsumType(u32),
11036 #[doc = "checksum offset relative to base\n"]
11037 CsumOffset(u32),
11038 #[doc = "checksum flags\n"]
11039 CsumFlags(u32),
11040}
11041impl<'a> IterableExprPayloadAttrs<'a> {
11042 #[doc = "destination register to load data into\n\nAssociated type: [`Registers`] (enum)"]
11043 pub fn get_dreg(&self) -> Result<u32, ErrorContext> {
11044 let mut iter = self.clone();
11045 iter.pos = 0;
11046 for attr in iter {
11047 if let Ok(ExprPayloadAttrs::Dreg(val)) = attr {
11048 return Ok(val);
11049 }
11050 }
11051 Err(ErrorContext::new_missing(
11052 "ExprPayloadAttrs",
11053 "Dreg",
11054 self.orig_loc,
11055 self.buf.as_ptr() as usize,
11056 ))
11057 }
11058 #[doc = "payload base\n\nAssociated type: [`PayloadBase`] (enum)"]
11059 pub fn get_base(&self) -> Result<u32, ErrorContext> {
11060 let mut iter = self.clone();
11061 iter.pos = 0;
11062 for attr in iter {
11063 if let Ok(ExprPayloadAttrs::Base(val)) = attr {
11064 return Ok(val);
11065 }
11066 }
11067 Err(ErrorContext::new_missing(
11068 "ExprPayloadAttrs",
11069 "Base",
11070 self.orig_loc,
11071 self.buf.as_ptr() as usize,
11072 ))
11073 }
11074 #[doc = "payload offset relative to base\n"]
11075 pub fn get_offset(&self) -> Result<u32, ErrorContext> {
11076 let mut iter = self.clone();
11077 iter.pos = 0;
11078 for attr in iter {
11079 if let Ok(ExprPayloadAttrs::Offset(val)) = attr {
11080 return Ok(val);
11081 }
11082 }
11083 Err(ErrorContext::new_missing(
11084 "ExprPayloadAttrs",
11085 "Offset",
11086 self.orig_loc,
11087 self.buf.as_ptr() as usize,
11088 ))
11089 }
11090 #[doc = "payload length\n"]
11091 pub fn get_len(&self) -> Result<u32, ErrorContext> {
11092 let mut iter = self.clone();
11093 iter.pos = 0;
11094 for attr in iter {
11095 if let Ok(ExprPayloadAttrs::Len(val)) = attr {
11096 return Ok(val);
11097 }
11098 }
11099 Err(ErrorContext::new_missing(
11100 "ExprPayloadAttrs",
11101 "Len",
11102 self.orig_loc,
11103 self.buf.as_ptr() as usize,
11104 ))
11105 }
11106 #[doc = "source register to load data from\n\nAssociated type: [`Registers`] (enum)"]
11107 pub fn get_sreg(&self) -> Result<u32, ErrorContext> {
11108 let mut iter = self.clone();
11109 iter.pos = 0;
11110 for attr in iter {
11111 if let Ok(ExprPayloadAttrs::Sreg(val)) = attr {
11112 return Ok(val);
11113 }
11114 }
11115 Err(ErrorContext::new_missing(
11116 "ExprPayloadAttrs",
11117 "Sreg",
11118 self.orig_loc,
11119 self.buf.as_ptr() as usize,
11120 ))
11121 }
11122 #[doc = "checksum type\n"]
11123 pub fn get_csum_type(&self) -> Result<u32, ErrorContext> {
11124 let mut iter = self.clone();
11125 iter.pos = 0;
11126 for attr in iter {
11127 if let Ok(ExprPayloadAttrs::CsumType(val)) = attr {
11128 return Ok(val);
11129 }
11130 }
11131 Err(ErrorContext::new_missing(
11132 "ExprPayloadAttrs",
11133 "CsumType",
11134 self.orig_loc,
11135 self.buf.as_ptr() as usize,
11136 ))
11137 }
11138 #[doc = "checksum offset relative to base\n"]
11139 pub fn get_csum_offset(&self) -> Result<u32, ErrorContext> {
11140 let mut iter = self.clone();
11141 iter.pos = 0;
11142 for attr in iter {
11143 if let Ok(ExprPayloadAttrs::CsumOffset(val)) = attr {
11144 return Ok(val);
11145 }
11146 }
11147 Err(ErrorContext::new_missing(
11148 "ExprPayloadAttrs",
11149 "CsumOffset",
11150 self.orig_loc,
11151 self.buf.as_ptr() as usize,
11152 ))
11153 }
11154 #[doc = "checksum flags\n"]
11155 pub fn get_csum_flags(&self) -> Result<u32, ErrorContext> {
11156 let mut iter = self.clone();
11157 iter.pos = 0;
11158 for attr in iter {
11159 if let Ok(ExprPayloadAttrs::CsumFlags(val)) = attr {
11160 return Ok(val);
11161 }
11162 }
11163 Err(ErrorContext::new_missing(
11164 "ExprPayloadAttrs",
11165 "CsumFlags",
11166 self.orig_loc,
11167 self.buf.as_ptr() as usize,
11168 ))
11169 }
11170}
11171impl ExprPayloadAttrs {
11172 pub fn new<'a>(buf: &'a [u8]) -> IterableExprPayloadAttrs<'a> {
11173 IterableExprPayloadAttrs::with_loc(buf, buf.as_ptr() as usize)
11174 }
11175 fn attr_from_type(r#type: u16) -> Option<&'static str> {
11176 let res = match r#type {
11177 1u16 => "Dreg",
11178 2u16 => "Base",
11179 3u16 => "Offset",
11180 4u16 => "Len",
11181 5u16 => "Sreg",
11182 6u16 => "CsumType",
11183 7u16 => "CsumOffset",
11184 8u16 => "CsumFlags",
11185 _ => return None,
11186 };
11187 Some(res)
11188 }
11189}
11190#[derive(Clone, Copy, Default)]
11191pub struct IterableExprPayloadAttrs<'a> {
11192 buf: &'a [u8],
11193 pos: usize,
11194 orig_loc: usize,
11195}
11196impl<'a> IterableExprPayloadAttrs<'a> {
11197 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11198 Self {
11199 buf,
11200 pos: 0,
11201 orig_loc,
11202 }
11203 }
11204 pub fn get_buf(&self) -> &'a [u8] {
11205 self.buf
11206 }
11207}
11208impl<'a> Iterator for IterableExprPayloadAttrs<'a> {
11209 type Item = Result<ExprPayloadAttrs, ErrorContext>;
11210 fn next(&mut self) -> Option<Self::Item> {
11211 let mut pos;
11212 let mut r#type;
11213 loop {
11214 pos = self.pos;
11215 r#type = None;
11216 if self.buf.len() == self.pos {
11217 return None;
11218 }
11219 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11220 self.pos = self.buf.len();
11221 break;
11222 };
11223 r#type = Some(header.r#type);
11224 let res = match header.r#type {
11225 1u16 => ExprPayloadAttrs::Dreg({
11226 let res = parse_be_u32(next);
11227 let Some(val) = res else { break };
11228 val
11229 }),
11230 2u16 => ExprPayloadAttrs::Base({
11231 let res = parse_be_u32(next);
11232 let Some(val) = res else { break };
11233 val
11234 }),
11235 3u16 => ExprPayloadAttrs::Offset({
11236 let res = parse_be_u32(next);
11237 let Some(val) = res else { break };
11238 val
11239 }),
11240 4u16 => ExprPayloadAttrs::Len({
11241 let res = parse_be_u32(next);
11242 let Some(val) = res else { break };
11243 val
11244 }),
11245 5u16 => ExprPayloadAttrs::Sreg({
11246 let res = parse_be_u32(next);
11247 let Some(val) = res else { break };
11248 val
11249 }),
11250 6u16 => ExprPayloadAttrs::CsumType({
11251 let res = parse_be_u32(next);
11252 let Some(val) = res else { break };
11253 val
11254 }),
11255 7u16 => ExprPayloadAttrs::CsumOffset({
11256 let res = parse_be_u32(next);
11257 let Some(val) = res else { break };
11258 val
11259 }),
11260 8u16 => ExprPayloadAttrs::CsumFlags({
11261 let res = parse_be_u32(next);
11262 let Some(val) = res else { break };
11263 val
11264 }),
11265 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11266 n => continue,
11267 };
11268 return Some(Ok(res));
11269 }
11270 Some(Err(ErrorContext::new(
11271 "ExprPayloadAttrs",
11272 r#type.and_then(|t| ExprPayloadAttrs::attr_from_type(t)),
11273 self.orig_loc,
11274 self.buf.as_ptr().wrapping_add(pos) as usize,
11275 )))
11276 }
11277}
11278impl std::fmt::Debug for IterableExprPayloadAttrs<'_> {
11279 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11280 let mut fmt = f.debug_struct("ExprPayloadAttrs");
11281 for attr in self.clone() {
11282 let attr = match attr {
11283 Ok(a) => a,
11284 Err(err) => {
11285 fmt.finish()?;
11286 f.write_str("Err(")?;
11287 err.fmt(f)?;
11288 return f.write_str(")");
11289 }
11290 };
11291 match attr {
11292 ExprPayloadAttrs::Dreg(val) => {
11293 fmt.field("Dreg", &FormatEnum(val.into(), Registers::from_value))
11294 }
11295 ExprPayloadAttrs::Base(val) => {
11296 fmt.field("Base", &FormatEnum(val.into(), PayloadBase::from_value))
11297 }
11298 ExprPayloadAttrs::Offset(val) => fmt.field("Offset", &val),
11299 ExprPayloadAttrs::Len(val) => fmt.field("Len", &val),
11300 ExprPayloadAttrs::Sreg(val) => {
11301 fmt.field("Sreg", &FormatEnum(val.into(), Registers::from_value))
11302 }
11303 ExprPayloadAttrs::CsumType(val) => fmt.field("CsumType", &val),
11304 ExprPayloadAttrs::CsumOffset(val) => fmt.field("CsumOffset", &val),
11305 ExprPayloadAttrs::CsumFlags(val) => fmt.field("CsumFlags", &val),
11306 };
11307 }
11308 fmt.finish()
11309 }
11310}
11311impl IterableExprPayloadAttrs<'_> {
11312 pub fn lookup_attr(
11313 &self,
11314 offset: usize,
11315 missing_type: Option<u16>,
11316 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11317 let mut stack = Vec::new();
11318 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11319 if missing_type.is_some() && cur == offset {
11320 stack.push(("ExprPayloadAttrs", offset));
11321 return (
11322 stack,
11323 missing_type.and_then(|t| ExprPayloadAttrs::attr_from_type(t)),
11324 );
11325 }
11326 if cur > offset || cur + self.buf.len() < offset {
11327 return (stack, None);
11328 }
11329 let mut attrs = self.clone();
11330 let mut last_off = cur + attrs.pos;
11331 while let Some(attr) = attrs.next() {
11332 let Ok(attr) = attr else { break };
11333 match attr {
11334 ExprPayloadAttrs::Dreg(val) => {
11335 if last_off == offset {
11336 stack.push(("Dreg", last_off));
11337 break;
11338 }
11339 }
11340 ExprPayloadAttrs::Base(val) => {
11341 if last_off == offset {
11342 stack.push(("Base", last_off));
11343 break;
11344 }
11345 }
11346 ExprPayloadAttrs::Offset(val) => {
11347 if last_off == offset {
11348 stack.push(("Offset", last_off));
11349 break;
11350 }
11351 }
11352 ExprPayloadAttrs::Len(val) => {
11353 if last_off == offset {
11354 stack.push(("Len", last_off));
11355 break;
11356 }
11357 }
11358 ExprPayloadAttrs::Sreg(val) => {
11359 if last_off == offset {
11360 stack.push(("Sreg", last_off));
11361 break;
11362 }
11363 }
11364 ExprPayloadAttrs::CsumType(val) => {
11365 if last_off == offset {
11366 stack.push(("CsumType", last_off));
11367 break;
11368 }
11369 }
11370 ExprPayloadAttrs::CsumOffset(val) => {
11371 if last_off == offset {
11372 stack.push(("CsumOffset", last_off));
11373 break;
11374 }
11375 }
11376 ExprPayloadAttrs::CsumFlags(val) => {
11377 if last_off == offset {
11378 stack.push(("CsumFlags", last_off));
11379 break;
11380 }
11381 }
11382 _ => {}
11383 };
11384 last_off = cur + attrs.pos;
11385 }
11386 if !stack.is_empty() {
11387 stack.push(("ExprPayloadAttrs", cur));
11388 }
11389 (stack, None)
11390 }
11391}
11392#[derive(Clone)]
11393pub enum ExprRejectAttrs {
11394 #[doc = "Associated type: [`RejectTypes`] (enum)"]
11395 Type(u32),
11396 IcmpCode(u8),
11397}
11398impl<'a> IterableExprRejectAttrs<'a> {
11399 #[doc = "Associated type: [`RejectTypes`] (enum)"]
11400 pub fn get_type(&self) -> Result<u32, ErrorContext> {
11401 let mut iter = self.clone();
11402 iter.pos = 0;
11403 for attr in iter {
11404 if let Ok(ExprRejectAttrs::Type(val)) = attr {
11405 return Ok(val);
11406 }
11407 }
11408 Err(ErrorContext::new_missing(
11409 "ExprRejectAttrs",
11410 "Type",
11411 self.orig_loc,
11412 self.buf.as_ptr() as usize,
11413 ))
11414 }
11415 pub fn get_icmp_code(&self) -> Result<u8, ErrorContext> {
11416 let mut iter = self.clone();
11417 iter.pos = 0;
11418 for attr in iter {
11419 if let Ok(ExprRejectAttrs::IcmpCode(val)) = attr {
11420 return Ok(val);
11421 }
11422 }
11423 Err(ErrorContext::new_missing(
11424 "ExprRejectAttrs",
11425 "IcmpCode",
11426 self.orig_loc,
11427 self.buf.as_ptr() as usize,
11428 ))
11429 }
11430}
11431impl ExprRejectAttrs {
11432 pub fn new<'a>(buf: &'a [u8]) -> IterableExprRejectAttrs<'a> {
11433 IterableExprRejectAttrs::with_loc(buf, buf.as_ptr() as usize)
11434 }
11435 fn attr_from_type(r#type: u16) -> Option<&'static str> {
11436 let res = match r#type {
11437 1u16 => "Type",
11438 2u16 => "IcmpCode",
11439 _ => return None,
11440 };
11441 Some(res)
11442 }
11443}
11444#[derive(Clone, Copy, Default)]
11445pub struct IterableExprRejectAttrs<'a> {
11446 buf: &'a [u8],
11447 pos: usize,
11448 orig_loc: usize,
11449}
11450impl<'a> IterableExprRejectAttrs<'a> {
11451 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11452 Self {
11453 buf,
11454 pos: 0,
11455 orig_loc,
11456 }
11457 }
11458 pub fn get_buf(&self) -> &'a [u8] {
11459 self.buf
11460 }
11461}
11462impl<'a> Iterator for IterableExprRejectAttrs<'a> {
11463 type Item = Result<ExprRejectAttrs, ErrorContext>;
11464 fn next(&mut self) -> Option<Self::Item> {
11465 let mut pos;
11466 let mut r#type;
11467 loop {
11468 pos = self.pos;
11469 r#type = None;
11470 if self.buf.len() == self.pos {
11471 return None;
11472 }
11473 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11474 self.pos = self.buf.len();
11475 break;
11476 };
11477 r#type = Some(header.r#type);
11478 let res = match header.r#type {
11479 1u16 => ExprRejectAttrs::Type({
11480 let res = parse_be_u32(next);
11481 let Some(val) = res else { break };
11482 val
11483 }),
11484 2u16 => ExprRejectAttrs::IcmpCode({
11485 let res = parse_u8(next);
11486 let Some(val) = res else { break };
11487 val
11488 }),
11489 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11490 n => continue,
11491 };
11492 return Some(Ok(res));
11493 }
11494 Some(Err(ErrorContext::new(
11495 "ExprRejectAttrs",
11496 r#type.and_then(|t| ExprRejectAttrs::attr_from_type(t)),
11497 self.orig_loc,
11498 self.buf.as_ptr().wrapping_add(pos) as usize,
11499 )))
11500 }
11501}
11502impl std::fmt::Debug for IterableExprRejectAttrs<'_> {
11503 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11504 let mut fmt = f.debug_struct("ExprRejectAttrs");
11505 for attr in self.clone() {
11506 let attr = match attr {
11507 Ok(a) => a,
11508 Err(err) => {
11509 fmt.finish()?;
11510 f.write_str("Err(")?;
11511 err.fmt(f)?;
11512 return f.write_str(")");
11513 }
11514 };
11515 match attr {
11516 ExprRejectAttrs::Type(val) => {
11517 fmt.field("Type", &FormatEnum(val.into(), RejectTypes::from_value))
11518 }
11519 ExprRejectAttrs::IcmpCode(val) => fmt.field("IcmpCode", &val),
11520 };
11521 }
11522 fmt.finish()
11523 }
11524}
11525impl IterableExprRejectAttrs<'_> {
11526 pub fn lookup_attr(
11527 &self,
11528 offset: usize,
11529 missing_type: Option<u16>,
11530 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11531 let mut stack = Vec::new();
11532 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11533 if missing_type.is_some() && cur == offset {
11534 stack.push(("ExprRejectAttrs", offset));
11535 return (
11536 stack,
11537 missing_type.and_then(|t| ExprRejectAttrs::attr_from_type(t)),
11538 );
11539 }
11540 if cur > offset || cur + self.buf.len() < offset {
11541 return (stack, None);
11542 }
11543 let mut attrs = self.clone();
11544 let mut last_off = cur + attrs.pos;
11545 while let Some(attr) = attrs.next() {
11546 let Ok(attr) = attr else { break };
11547 match attr {
11548 ExprRejectAttrs::Type(val) => {
11549 if last_off == offset {
11550 stack.push(("Type", last_off));
11551 break;
11552 }
11553 }
11554 ExprRejectAttrs::IcmpCode(val) => {
11555 if last_off == offset {
11556 stack.push(("IcmpCode", last_off));
11557 break;
11558 }
11559 }
11560 _ => {}
11561 };
11562 last_off = cur + attrs.pos;
11563 }
11564 if !stack.is_empty() {
11565 stack.push(("ExprRejectAttrs", cur));
11566 }
11567 (stack, None)
11568 }
11569}
11570#[derive(Clone)]
11571pub enum ExprTargetAttrs<'a> {
11572 Name(&'a CStr),
11573 Rev(u32),
11574 #[doc = "Grep for `static struct xt_target` in `linux/net/nftables`. This field\nis usually a struct:\n\n- Name\n- Revision number\n- IP version (4/6)\n- Size of provided struct\n"]
11575 Info(&'a [u8]),
11576}
11577impl<'a> IterableExprTargetAttrs<'a> {
11578 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
11579 let mut iter = self.clone();
11580 iter.pos = 0;
11581 for attr in iter {
11582 if let Ok(ExprTargetAttrs::Name(val)) = attr {
11583 return Ok(val);
11584 }
11585 }
11586 Err(ErrorContext::new_missing(
11587 "ExprTargetAttrs",
11588 "Name",
11589 self.orig_loc,
11590 self.buf.as_ptr() as usize,
11591 ))
11592 }
11593 pub fn get_rev(&self) -> Result<u32, ErrorContext> {
11594 let mut iter = self.clone();
11595 iter.pos = 0;
11596 for attr in iter {
11597 if let Ok(ExprTargetAttrs::Rev(val)) = attr {
11598 return Ok(val);
11599 }
11600 }
11601 Err(ErrorContext::new_missing(
11602 "ExprTargetAttrs",
11603 "Rev",
11604 self.orig_loc,
11605 self.buf.as_ptr() as usize,
11606 ))
11607 }
11608 #[doc = "Grep for `static struct xt_target` in `linux/net/nftables`. This field\nis usually a struct:\n\n- Name\n- Revision number\n- IP version (4/6)\n- Size of provided struct\n"]
11609 pub fn get_info(&self) -> Result<&'a [u8], ErrorContext> {
11610 let mut iter = self.clone();
11611 iter.pos = 0;
11612 for attr in iter {
11613 if let Ok(ExprTargetAttrs::Info(val)) = attr {
11614 return Ok(val);
11615 }
11616 }
11617 Err(ErrorContext::new_missing(
11618 "ExprTargetAttrs",
11619 "Info",
11620 self.orig_loc,
11621 self.buf.as_ptr() as usize,
11622 ))
11623 }
11624}
11625impl ExprTargetAttrs<'_> {
11626 pub fn new<'a>(buf: &'a [u8]) -> IterableExprTargetAttrs<'a> {
11627 IterableExprTargetAttrs::with_loc(buf, buf.as_ptr() as usize)
11628 }
11629 fn attr_from_type(r#type: u16) -> Option<&'static str> {
11630 let res = match r#type {
11631 1u16 => "Name",
11632 2u16 => "Rev",
11633 3u16 => "Info",
11634 _ => return None,
11635 };
11636 Some(res)
11637 }
11638}
11639#[derive(Clone, Copy, Default)]
11640pub struct IterableExprTargetAttrs<'a> {
11641 buf: &'a [u8],
11642 pos: usize,
11643 orig_loc: usize,
11644}
11645impl<'a> IterableExprTargetAttrs<'a> {
11646 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11647 Self {
11648 buf,
11649 pos: 0,
11650 orig_loc,
11651 }
11652 }
11653 pub fn get_buf(&self) -> &'a [u8] {
11654 self.buf
11655 }
11656}
11657impl<'a> Iterator for IterableExprTargetAttrs<'a> {
11658 type Item = Result<ExprTargetAttrs<'a>, ErrorContext>;
11659 fn next(&mut self) -> Option<Self::Item> {
11660 let mut pos;
11661 let mut r#type;
11662 loop {
11663 pos = self.pos;
11664 r#type = None;
11665 if self.buf.len() == self.pos {
11666 return None;
11667 }
11668 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11669 self.pos = self.buf.len();
11670 break;
11671 };
11672 r#type = Some(header.r#type);
11673 let res = match header.r#type {
11674 1u16 => ExprTargetAttrs::Name({
11675 let res = CStr::from_bytes_with_nul(next).ok();
11676 let Some(val) = res else { break };
11677 val
11678 }),
11679 2u16 => ExprTargetAttrs::Rev({
11680 let res = parse_be_u32(next);
11681 let Some(val) = res else { break };
11682 val
11683 }),
11684 3u16 => ExprTargetAttrs::Info({
11685 let res = Some(next);
11686 let Some(val) = res else { break };
11687 val
11688 }),
11689 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11690 n => continue,
11691 };
11692 return Some(Ok(res));
11693 }
11694 Some(Err(ErrorContext::new(
11695 "ExprTargetAttrs",
11696 r#type.and_then(|t| ExprTargetAttrs::attr_from_type(t)),
11697 self.orig_loc,
11698 self.buf.as_ptr().wrapping_add(pos) as usize,
11699 )))
11700 }
11701}
11702impl<'a> std::fmt::Debug for IterableExprTargetAttrs<'_> {
11703 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11704 let mut fmt = f.debug_struct("ExprTargetAttrs");
11705 for attr in self.clone() {
11706 let attr = match attr {
11707 Ok(a) => a,
11708 Err(err) => {
11709 fmt.finish()?;
11710 f.write_str("Err(")?;
11711 err.fmt(f)?;
11712 return f.write_str(")");
11713 }
11714 };
11715 match attr {
11716 ExprTargetAttrs::Name(val) => fmt.field("Name", &val),
11717 ExprTargetAttrs::Rev(val) => fmt.field("Rev", &val),
11718 ExprTargetAttrs::Info(val) => fmt.field("Info", &val),
11719 };
11720 }
11721 fmt.finish()
11722 }
11723}
11724impl IterableExprTargetAttrs<'_> {
11725 pub fn lookup_attr(
11726 &self,
11727 offset: usize,
11728 missing_type: Option<u16>,
11729 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11730 let mut stack = Vec::new();
11731 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11732 if missing_type.is_some() && cur == offset {
11733 stack.push(("ExprTargetAttrs", offset));
11734 return (
11735 stack,
11736 missing_type.and_then(|t| ExprTargetAttrs::attr_from_type(t)),
11737 );
11738 }
11739 if cur > offset || cur + self.buf.len() < offset {
11740 return (stack, None);
11741 }
11742 let mut attrs = self.clone();
11743 let mut last_off = cur + attrs.pos;
11744 while let Some(attr) = attrs.next() {
11745 let Ok(attr) = attr else { break };
11746 match attr {
11747 ExprTargetAttrs::Name(val) => {
11748 if last_off == offset {
11749 stack.push(("Name", last_off));
11750 break;
11751 }
11752 }
11753 ExprTargetAttrs::Rev(val) => {
11754 if last_off == offset {
11755 stack.push(("Rev", last_off));
11756 break;
11757 }
11758 }
11759 ExprTargetAttrs::Info(val) => {
11760 if last_off == offset {
11761 stack.push(("Info", last_off));
11762 break;
11763 }
11764 }
11765 _ => {}
11766 };
11767 last_off = cur + attrs.pos;
11768 }
11769 if !stack.is_empty() {
11770 stack.push(("ExprTargetAttrs", cur));
11771 }
11772 (stack, None)
11773 }
11774}
11775#[derive(Clone)]
11776pub enum ExprTproxyAttrs {
11777 Family(u32),
11778 RegAddr(u32),
11779 RegPort(u32),
11780}
11781impl<'a> IterableExprTproxyAttrs<'a> {
11782 pub fn get_family(&self) -> Result<u32, ErrorContext> {
11783 let mut iter = self.clone();
11784 iter.pos = 0;
11785 for attr in iter {
11786 if let Ok(ExprTproxyAttrs::Family(val)) = attr {
11787 return Ok(val);
11788 }
11789 }
11790 Err(ErrorContext::new_missing(
11791 "ExprTproxyAttrs",
11792 "Family",
11793 self.orig_loc,
11794 self.buf.as_ptr() as usize,
11795 ))
11796 }
11797 pub fn get_reg_addr(&self) -> Result<u32, ErrorContext> {
11798 let mut iter = self.clone();
11799 iter.pos = 0;
11800 for attr in iter {
11801 if let Ok(ExprTproxyAttrs::RegAddr(val)) = attr {
11802 return Ok(val);
11803 }
11804 }
11805 Err(ErrorContext::new_missing(
11806 "ExprTproxyAttrs",
11807 "RegAddr",
11808 self.orig_loc,
11809 self.buf.as_ptr() as usize,
11810 ))
11811 }
11812 pub fn get_reg_port(&self) -> Result<u32, ErrorContext> {
11813 let mut iter = self.clone();
11814 iter.pos = 0;
11815 for attr in iter {
11816 if let Ok(ExprTproxyAttrs::RegPort(val)) = attr {
11817 return Ok(val);
11818 }
11819 }
11820 Err(ErrorContext::new_missing(
11821 "ExprTproxyAttrs",
11822 "RegPort",
11823 self.orig_loc,
11824 self.buf.as_ptr() as usize,
11825 ))
11826 }
11827}
11828impl ExprTproxyAttrs {
11829 pub fn new<'a>(buf: &'a [u8]) -> IterableExprTproxyAttrs<'a> {
11830 IterableExprTproxyAttrs::with_loc(buf, buf.as_ptr() as usize)
11831 }
11832 fn attr_from_type(r#type: u16) -> Option<&'static str> {
11833 let res = match r#type {
11834 1u16 => "Family",
11835 2u16 => "RegAddr",
11836 3u16 => "RegPort",
11837 _ => return None,
11838 };
11839 Some(res)
11840 }
11841}
11842#[derive(Clone, Copy, Default)]
11843pub struct IterableExprTproxyAttrs<'a> {
11844 buf: &'a [u8],
11845 pos: usize,
11846 orig_loc: usize,
11847}
11848impl<'a> IterableExprTproxyAttrs<'a> {
11849 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11850 Self {
11851 buf,
11852 pos: 0,
11853 orig_loc,
11854 }
11855 }
11856 pub fn get_buf(&self) -> &'a [u8] {
11857 self.buf
11858 }
11859}
11860impl<'a> Iterator for IterableExprTproxyAttrs<'a> {
11861 type Item = Result<ExprTproxyAttrs, ErrorContext>;
11862 fn next(&mut self) -> Option<Self::Item> {
11863 let mut pos;
11864 let mut r#type;
11865 loop {
11866 pos = self.pos;
11867 r#type = None;
11868 if self.buf.len() == self.pos {
11869 return None;
11870 }
11871 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11872 self.pos = self.buf.len();
11873 break;
11874 };
11875 r#type = Some(header.r#type);
11876 let res = match header.r#type {
11877 1u16 => ExprTproxyAttrs::Family({
11878 let res = parse_be_u32(next);
11879 let Some(val) = res else { break };
11880 val
11881 }),
11882 2u16 => ExprTproxyAttrs::RegAddr({
11883 let res = parse_be_u32(next);
11884 let Some(val) = res else { break };
11885 val
11886 }),
11887 3u16 => ExprTproxyAttrs::RegPort({
11888 let res = parse_be_u32(next);
11889 let Some(val) = res else { break };
11890 val
11891 }),
11892 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11893 n => continue,
11894 };
11895 return Some(Ok(res));
11896 }
11897 Some(Err(ErrorContext::new(
11898 "ExprTproxyAttrs",
11899 r#type.and_then(|t| ExprTproxyAttrs::attr_from_type(t)),
11900 self.orig_loc,
11901 self.buf.as_ptr().wrapping_add(pos) as usize,
11902 )))
11903 }
11904}
11905impl std::fmt::Debug for IterableExprTproxyAttrs<'_> {
11906 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11907 let mut fmt = f.debug_struct("ExprTproxyAttrs");
11908 for attr in self.clone() {
11909 let attr = match attr {
11910 Ok(a) => a,
11911 Err(err) => {
11912 fmt.finish()?;
11913 f.write_str("Err(")?;
11914 err.fmt(f)?;
11915 return f.write_str(")");
11916 }
11917 };
11918 match attr {
11919 ExprTproxyAttrs::Family(val) => fmt.field("Family", &val),
11920 ExprTproxyAttrs::RegAddr(val) => fmt.field("RegAddr", &val),
11921 ExprTproxyAttrs::RegPort(val) => fmt.field("RegPort", &val),
11922 };
11923 }
11924 fmt.finish()
11925 }
11926}
11927impl IterableExprTproxyAttrs<'_> {
11928 pub fn lookup_attr(
11929 &self,
11930 offset: usize,
11931 missing_type: Option<u16>,
11932 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11933 let mut stack = Vec::new();
11934 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11935 if missing_type.is_some() && cur == offset {
11936 stack.push(("ExprTproxyAttrs", offset));
11937 return (
11938 stack,
11939 missing_type.and_then(|t| ExprTproxyAttrs::attr_from_type(t)),
11940 );
11941 }
11942 if cur > offset || cur + self.buf.len() < offset {
11943 return (stack, None);
11944 }
11945 let mut attrs = self.clone();
11946 let mut last_off = cur + attrs.pos;
11947 while let Some(attr) = attrs.next() {
11948 let Ok(attr) = attr else { break };
11949 match attr {
11950 ExprTproxyAttrs::Family(val) => {
11951 if last_off == offset {
11952 stack.push(("Family", last_off));
11953 break;
11954 }
11955 }
11956 ExprTproxyAttrs::RegAddr(val) => {
11957 if last_off == offset {
11958 stack.push(("RegAddr", last_off));
11959 break;
11960 }
11961 }
11962 ExprTproxyAttrs::RegPort(val) => {
11963 if last_off == offset {
11964 stack.push(("RegPort", last_off));
11965 break;
11966 }
11967 }
11968 _ => {}
11969 };
11970 last_off = cur + attrs.pos;
11971 }
11972 if !stack.is_empty() {
11973 stack.push(("ExprTproxyAttrs", cur));
11974 }
11975 (stack, None)
11976 }
11977}
11978#[derive(Clone)]
11979pub enum ExprObjrefAttrs<'a> {
11980 ImmType(u32),
11981 #[doc = "object name\n"]
11982 ImmName(&'a CStr),
11983 SetSreg(u32),
11984 #[doc = "name of object map\n"]
11985 SetName(&'a CStr),
11986 #[doc = "id of object map\n"]
11987 SetId(u32),
11988}
11989impl<'a> IterableExprObjrefAttrs<'a> {
11990 pub fn get_imm_type(&self) -> Result<u32, ErrorContext> {
11991 let mut iter = self.clone();
11992 iter.pos = 0;
11993 for attr in iter {
11994 if let Ok(ExprObjrefAttrs::ImmType(val)) = attr {
11995 return Ok(val);
11996 }
11997 }
11998 Err(ErrorContext::new_missing(
11999 "ExprObjrefAttrs",
12000 "ImmType",
12001 self.orig_loc,
12002 self.buf.as_ptr() as usize,
12003 ))
12004 }
12005 #[doc = "object name\n"]
12006 pub fn get_imm_name(&self) -> Result<&'a CStr, ErrorContext> {
12007 let mut iter = self.clone();
12008 iter.pos = 0;
12009 for attr in iter {
12010 if let Ok(ExprObjrefAttrs::ImmName(val)) = attr {
12011 return Ok(val);
12012 }
12013 }
12014 Err(ErrorContext::new_missing(
12015 "ExprObjrefAttrs",
12016 "ImmName",
12017 self.orig_loc,
12018 self.buf.as_ptr() as usize,
12019 ))
12020 }
12021 pub fn get_set_sreg(&self) -> Result<u32, ErrorContext> {
12022 let mut iter = self.clone();
12023 iter.pos = 0;
12024 for attr in iter {
12025 if let Ok(ExprObjrefAttrs::SetSreg(val)) = attr {
12026 return Ok(val);
12027 }
12028 }
12029 Err(ErrorContext::new_missing(
12030 "ExprObjrefAttrs",
12031 "SetSreg",
12032 self.orig_loc,
12033 self.buf.as_ptr() as usize,
12034 ))
12035 }
12036 #[doc = "name of object map\n"]
12037 pub fn get_set_name(&self) -> Result<&'a CStr, ErrorContext> {
12038 let mut iter = self.clone();
12039 iter.pos = 0;
12040 for attr in iter {
12041 if let Ok(ExprObjrefAttrs::SetName(val)) = attr {
12042 return Ok(val);
12043 }
12044 }
12045 Err(ErrorContext::new_missing(
12046 "ExprObjrefAttrs",
12047 "SetName",
12048 self.orig_loc,
12049 self.buf.as_ptr() as usize,
12050 ))
12051 }
12052 #[doc = "id of object map\n"]
12053 pub fn get_set_id(&self) -> Result<u32, ErrorContext> {
12054 let mut iter = self.clone();
12055 iter.pos = 0;
12056 for attr in iter {
12057 if let Ok(ExprObjrefAttrs::SetId(val)) = attr {
12058 return Ok(val);
12059 }
12060 }
12061 Err(ErrorContext::new_missing(
12062 "ExprObjrefAttrs",
12063 "SetId",
12064 self.orig_loc,
12065 self.buf.as_ptr() as usize,
12066 ))
12067 }
12068}
12069impl ExprObjrefAttrs<'_> {
12070 pub fn new<'a>(buf: &'a [u8]) -> IterableExprObjrefAttrs<'a> {
12071 IterableExprObjrefAttrs::with_loc(buf, buf.as_ptr() as usize)
12072 }
12073 fn attr_from_type(r#type: u16) -> Option<&'static str> {
12074 let res = match r#type {
12075 1u16 => "ImmType",
12076 2u16 => "ImmName",
12077 3u16 => "SetSreg",
12078 4u16 => "SetName",
12079 5u16 => "SetId",
12080 _ => return None,
12081 };
12082 Some(res)
12083 }
12084}
12085#[derive(Clone, Copy, Default)]
12086pub struct IterableExprObjrefAttrs<'a> {
12087 buf: &'a [u8],
12088 pos: usize,
12089 orig_loc: usize,
12090}
12091impl<'a> IterableExprObjrefAttrs<'a> {
12092 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12093 Self {
12094 buf,
12095 pos: 0,
12096 orig_loc,
12097 }
12098 }
12099 pub fn get_buf(&self) -> &'a [u8] {
12100 self.buf
12101 }
12102}
12103impl<'a> Iterator for IterableExprObjrefAttrs<'a> {
12104 type Item = Result<ExprObjrefAttrs<'a>, ErrorContext>;
12105 fn next(&mut self) -> Option<Self::Item> {
12106 let mut pos;
12107 let mut r#type;
12108 loop {
12109 pos = self.pos;
12110 r#type = None;
12111 if self.buf.len() == self.pos {
12112 return None;
12113 }
12114 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12115 self.pos = self.buf.len();
12116 break;
12117 };
12118 r#type = Some(header.r#type);
12119 let res = match header.r#type {
12120 1u16 => ExprObjrefAttrs::ImmType({
12121 let res = parse_be_u32(next);
12122 let Some(val) = res else { break };
12123 val
12124 }),
12125 2u16 => ExprObjrefAttrs::ImmName({
12126 let res = CStr::from_bytes_with_nul(next).ok();
12127 let Some(val) = res else { break };
12128 val
12129 }),
12130 3u16 => ExprObjrefAttrs::SetSreg({
12131 let res = parse_be_u32(next);
12132 let Some(val) = res else { break };
12133 val
12134 }),
12135 4u16 => ExprObjrefAttrs::SetName({
12136 let res = CStr::from_bytes_with_nul(next).ok();
12137 let Some(val) = res else { break };
12138 val
12139 }),
12140 5u16 => ExprObjrefAttrs::SetId({
12141 let res = parse_be_u32(next);
12142 let Some(val) = res else { break };
12143 val
12144 }),
12145 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12146 n => continue,
12147 };
12148 return Some(Ok(res));
12149 }
12150 Some(Err(ErrorContext::new(
12151 "ExprObjrefAttrs",
12152 r#type.and_then(|t| ExprObjrefAttrs::attr_from_type(t)),
12153 self.orig_loc,
12154 self.buf.as_ptr().wrapping_add(pos) as usize,
12155 )))
12156 }
12157}
12158impl<'a> std::fmt::Debug for IterableExprObjrefAttrs<'_> {
12159 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12160 let mut fmt = f.debug_struct("ExprObjrefAttrs");
12161 for attr in self.clone() {
12162 let attr = match attr {
12163 Ok(a) => a,
12164 Err(err) => {
12165 fmt.finish()?;
12166 f.write_str("Err(")?;
12167 err.fmt(f)?;
12168 return f.write_str(")");
12169 }
12170 };
12171 match attr {
12172 ExprObjrefAttrs::ImmType(val) => fmt.field("ImmType", &val),
12173 ExprObjrefAttrs::ImmName(val) => fmt.field("ImmName", &val),
12174 ExprObjrefAttrs::SetSreg(val) => fmt.field("SetSreg", &val),
12175 ExprObjrefAttrs::SetName(val) => fmt.field("SetName", &val),
12176 ExprObjrefAttrs::SetId(val) => fmt.field("SetId", &val),
12177 };
12178 }
12179 fmt.finish()
12180 }
12181}
12182impl IterableExprObjrefAttrs<'_> {
12183 pub fn lookup_attr(
12184 &self,
12185 offset: usize,
12186 missing_type: Option<u16>,
12187 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12188 let mut stack = Vec::new();
12189 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12190 if missing_type.is_some() && cur == offset {
12191 stack.push(("ExprObjrefAttrs", offset));
12192 return (
12193 stack,
12194 missing_type.and_then(|t| ExprObjrefAttrs::attr_from_type(t)),
12195 );
12196 }
12197 if cur > offset || cur + self.buf.len() < offset {
12198 return (stack, None);
12199 }
12200 let mut attrs = self.clone();
12201 let mut last_off = cur + attrs.pos;
12202 while let Some(attr) = attrs.next() {
12203 let Ok(attr) = attr else { break };
12204 match attr {
12205 ExprObjrefAttrs::ImmType(val) => {
12206 if last_off == offset {
12207 stack.push(("ImmType", last_off));
12208 break;
12209 }
12210 }
12211 ExprObjrefAttrs::ImmName(val) => {
12212 if last_off == offset {
12213 stack.push(("ImmName", last_off));
12214 break;
12215 }
12216 }
12217 ExprObjrefAttrs::SetSreg(val) => {
12218 if last_off == offset {
12219 stack.push(("SetSreg", last_off));
12220 break;
12221 }
12222 }
12223 ExprObjrefAttrs::SetName(val) => {
12224 if last_off == offset {
12225 stack.push(("SetName", last_off));
12226 break;
12227 }
12228 }
12229 ExprObjrefAttrs::SetId(val) => {
12230 if last_off == offset {
12231 stack.push(("SetId", last_off));
12232 break;
12233 }
12234 }
12235 _ => {}
12236 };
12237 last_off = cur + attrs.pos;
12238 }
12239 if !stack.is_empty() {
12240 stack.push(("ExprObjrefAttrs", cur));
12241 }
12242 (stack, None)
12243 }
12244}
12245#[derive(Clone)]
12246pub enum CompatTargetAttrs<'a> {
12247 Name(&'a CStr),
12248 Rev(u32),
12249 Info(&'a [u8]),
12250}
12251impl<'a> IterableCompatTargetAttrs<'a> {
12252 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
12253 let mut iter = self.clone();
12254 iter.pos = 0;
12255 for attr in iter {
12256 if let Ok(CompatTargetAttrs::Name(val)) = attr {
12257 return Ok(val);
12258 }
12259 }
12260 Err(ErrorContext::new_missing(
12261 "CompatTargetAttrs",
12262 "Name",
12263 self.orig_loc,
12264 self.buf.as_ptr() as usize,
12265 ))
12266 }
12267 pub fn get_rev(&self) -> Result<u32, ErrorContext> {
12268 let mut iter = self.clone();
12269 iter.pos = 0;
12270 for attr in iter {
12271 if let Ok(CompatTargetAttrs::Rev(val)) = attr {
12272 return Ok(val);
12273 }
12274 }
12275 Err(ErrorContext::new_missing(
12276 "CompatTargetAttrs",
12277 "Rev",
12278 self.orig_loc,
12279 self.buf.as_ptr() as usize,
12280 ))
12281 }
12282 pub fn get_info(&self) -> Result<&'a [u8], ErrorContext> {
12283 let mut iter = self.clone();
12284 iter.pos = 0;
12285 for attr in iter {
12286 if let Ok(CompatTargetAttrs::Info(val)) = attr {
12287 return Ok(val);
12288 }
12289 }
12290 Err(ErrorContext::new_missing(
12291 "CompatTargetAttrs",
12292 "Info",
12293 self.orig_loc,
12294 self.buf.as_ptr() as usize,
12295 ))
12296 }
12297}
12298impl CompatTargetAttrs<'_> {
12299 pub fn new<'a>(buf: &'a [u8]) -> IterableCompatTargetAttrs<'a> {
12300 IterableCompatTargetAttrs::with_loc(buf, buf.as_ptr() as usize)
12301 }
12302 fn attr_from_type(r#type: u16) -> Option<&'static str> {
12303 let res = match r#type {
12304 1u16 => "Name",
12305 2u16 => "Rev",
12306 3u16 => "Info",
12307 _ => return None,
12308 };
12309 Some(res)
12310 }
12311}
12312#[derive(Clone, Copy, Default)]
12313pub struct IterableCompatTargetAttrs<'a> {
12314 buf: &'a [u8],
12315 pos: usize,
12316 orig_loc: usize,
12317}
12318impl<'a> IterableCompatTargetAttrs<'a> {
12319 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12320 Self {
12321 buf,
12322 pos: 0,
12323 orig_loc,
12324 }
12325 }
12326 pub fn get_buf(&self) -> &'a [u8] {
12327 self.buf
12328 }
12329}
12330impl<'a> Iterator for IterableCompatTargetAttrs<'a> {
12331 type Item = Result<CompatTargetAttrs<'a>, ErrorContext>;
12332 fn next(&mut self) -> Option<Self::Item> {
12333 let mut pos;
12334 let mut r#type;
12335 loop {
12336 pos = self.pos;
12337 r#type = None;
12338 if self.buf.len() == self.pos {
12339 return None;
12340 }
12341 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12342 self.pos = self.buf.len();
12343 break;
12344 };
12345 r#type = Some(header.r#type);
12346 let res = match header.r#type {
12347 1u16 => CompatTargetAttrs::Name({
12348 let res = CStr::from_bytes_with_nul(next).ok();
12349 let Some(val) = res else { break };
12350 val
12351 }),
12352 2u16 => CompatTargetAttrs::Rev({
12353 let res = parse_be_u32(next);
12354 let Some(val) = res else { break };
12355 val
12356 }),
12357 3u16 => CompatTargetAttrs::Info({
12358 let res = Some(next);
12359 let Some(val) = res else { break };
12360 val
12361 }),
12362 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12363 n => continue,
12364 };
12365 return Some(Ok(res));
12366 }
12367 Some(Err(ErrorContext::new(
12368 "CompatTargetAttrs",
12369 r#type.and_then(|t| CompatTargetAttrs::attr_from_type(t)),
12370 self.orig_loc,
12371 self.buf.as_ptr().wrapping_add(pos) as usize,
12372 )))
12373 }
12374}
12375impl<'a> std::fmt::Debug for IterableCompatTargetAttrs<'_> {
12376 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12377 let mut fmt = f.debug_struct("CompatTargetAttrs");
12378 for attr in self.clone() {
12379 let attr = match attr {
12380 Ok(a) => a,
12381 Err(err) => {
12382 fmt.finish()?;
12383 f.write_str("Err(")?;
12384 err.fmt(f)?;
12385 return f.write_str(")");
12386 }
12387 };
12388 match attr {
12389 CompatTargetAttrs::Name(val) => fmt.field("Name", &val),
12390 CompatTargetAttrs::Rev(val) => fmt.field("Rev", &val),
12391 CompatTargetAttrs::Info(val) => fmt.field("Info", &val),
12392 };
12393 }
12394 fmt.finish()
12395 }
12396}
12397impl IterableCompatTargetAttrs<'_> {
12398 pub fn lookup_attr(
12399 &self,
12400 offset: usize,
12401 missing_type: Option<u16>,
12402 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12403 let mut stack = Vec::new();
12404 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12405 if missing_type.is_some() && cur == offset {
12406 stack.push(("CompatTargetAttrs", offset));
12407 return (
12408 stack,
12409 missing_type.and_then(|t| CompatTargetAttrs::attr_from_type(t)),
12410 );
12411 }
12412 if cur > offset || cur + self.buf.len() < offset {
12413 return (stack, None);
12414 }
12415 let mut attrs = self.clone();
12416 let mut last_off = cur + attrs.pos;
12417 while let Some(attr) = attrs.next() {
12418 let Ok(attr) = attr else { break };
12419 match attr {
12420 CompatTargetAttrs::Name(val) => {
12421 if last_off == offset {
12422 stack.push(("Name", last_off));
12423 break;
12424 }
12425 }
12426 CompatTargetAttrs::Rev(val) => {
12427 if last_off == offset {
12428 stack.push(("Rev", last_off));
12429 break;
12430 }
12431 }
12432 CompatTargetAttrs::Info(val) => {
12433 if last_off == offset {
12434 stack.push(("Info", last_off));
12435 break;
12436 }
12437 }
12438 _ => {}
12439 };
12440 last_off = cur + attrs.pos;
12441 }
12442 if !stack.is_empty() {
12443 stack.push(("CompatTargetAttrs", cur));
12444 }
12445 (stack, None)
12446 }
12447}
12448#[derive(Clone)]
12449pub enum CompatMatchAttrs<'a> {
12450 Name(&'a CStr),
12451 Rev(u32),
12452 Info(&'a [u8]),
12453}
12454impl<'a> IterableCompatMatchAttrs<'a> {
12455 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
12456 let mut iter = self.clone();
12457 iter.pos = 0;
12458 for attr in iter {
12459 if let Ok(CompatMatchAttrs::Name(val)) = attr {
12460 return Ok(val);
12461 }
12462 }
12463 Err(ErrorContext::new_missing(
12464 "CompatMatchAttrs",
12465 "Name",
12466 self.orig_loc,
12467 self.buf.as_ptr() as usize,
12468 ))
12469 }
12470 pub fn get_rev(&self) -> Result<u32, ErrorContext> {
12471 let mut iter = self.clone();
12472 iter.pos = 0;
12473 for attr in iter {
12474 if let Ok(CompatMatchAttrs::Rev(val)) = attr {
12475 return Ok(val);
12476 }
12477 }
12478 Err(ErrorContext::new_missing(
12479 "CompatMatchAttrs",
12480 "Rev",
12481 self.orig_loc,
12482 self.buf.as_ptr() as usize,
12483 ))
12484 }
12485 pub fn get_info(&self) -> Result<&'a [u8], ErrorContext> {
12486 let mut iter = self.clone();
12487 iter.pos = 0;
12488 for attr in iter {
12489 if let Ok(CompatMatchAttrs::Info(val)) = attr {
12490 return Ok(val);
12491 }
12492 }
12493 Err(ErrorContext::new_missing(
12494 "CompatMatchAttrs",
12495 "Info",
12496 self.orig_loc,
12497 self.buf.as_ptr() as usize,
12498 ))
12499 }
12500}
12501impl CompatMatchAttrs<'_> {
12502 pub fn new<'a>(buf: &'a [u8]) -> IterableCompatMatchAttrs<'a> {
12503 IterableCompatMatchAttrs::with_loc(buf, buf.as_ptr() as usize)
12504 }
12505 fn attr_from_type(r#type: u16) -> Option<&'static str> {
12506 let res = match r#type {
12507 1u16 => "Name",
12508 2u16 => "Rev",
12509 3u16 => "Info",
12510 _ => return None,
12511 };
12512 Some(res)
12513 }
12514}
12515#[derive(Clone, Copy, Default)]
12516pub struct IterableCompatMatchAttrs<'a> {
12517 buf: &'a [u8],
12518 pos: usize,
12519 orig_loc: usize,
12520}
12521impl<'a> IterableCompatMatchAttrs<'a> {
12522 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12523 Self {
12524 buf,
12525 pos: 0,
12526 orig_loc,
12527 }
12528 }
12529 pub fn get_buf(&self) -> &'a [u8] {
12530 self.buf
12531 }
12532}
12533impl<'a> Iterator for IterableCompatMatchAttrs<'a> {
12534 type Item = Result<CompatMatchAttrs<'a>, ErrorContext>;
12535 fn next(&mut self) -> Option<Self::Item> {
12536 let mut pos;
12537 let mut r#type;
12538 loop {
12539 pos = self.pos;
12540 r#type = None;
12541 if self.buf.len() == self.pos {
12542 return None;
12543 }
12544 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12545 self.pos = self.buf.len();
12546 break;
12547 };
12548 r#type = Some(header.r#type);
12549 let res = match header.r#type {
12550 1u16 => CompatMatchAttrs::Name({
12551 let res = CStr::from_bytes_with_nul(next).ok();
12552 let Some(val) = res else { break };
12553 val
12554 }),
12555 2u16 => CompatMatchAttrs::Rev({
12556 let res = parse_be_u32(next);
12557 let Some(val) = res else { break };
12558 val
12559 }),
12560 3u16 => CompatMatchAttrs::Info({
12561 let res = Some(next);
12562 let Some(val) = res else { break };
12563 val
12564 }),
12565 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12566 n => continue,
12567 };
12568 return Some(Ok(res));
12569 }
12570 Some(Err(ErrorContext::new(
12571 "CompatMatchAttrs",
12572 r#type.and_then(|t| CompatMatchAttrs::attr_from_type(t)),
12573 self.orig_loc,
12574 self.buf.as_ptr().wrapping_add(pos) as usize,
12575 )))
12576 }
12577}
12578impl<'a> std::fmt::Debug for IterableCompatMatchAttrs<'_> {
12579 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12580 let mut fmt = f.debug_struct("CompatMatchAttrs");
12581 for attr in self.clone() {
12582 let attr = match attr {
12583 Ok(a) => a,
12584 Err(err) => {
12585 fmt.finish()?;
12586 f.write_str("Err(")?;
12587 err.fmt(f)?;
12588 return f.write_str(")");
12589 }
12590 };
12591 match attr {
12592 CompatMatchAttrs::Name(val) => fmt.field("Name", &val),
12593 CompatMatchAttrs::Rev(val) => fmt.field("Rev", &val),
12594 CompatMatchAttrs::Info(val) => fmt.field("Info", &val),
12595 };
12596 }
12597 fmt.finish()
12598 }
12599}
12600impl IterableCompatMatchAttrs<'_> {
12601 pub fn lookup_attr(
12602 &self,
12603 offset: usize,
12604 missing_type: Option<u16>,
12605 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12606 let mut stack = Vec::new();
12607 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12608 if missing_type.is_some() && cur == offset {
12609 stack.push(("CompatMatchAttrs", offset));
12610 return (
12611 stack,
12612 missing_type.and_then(|t| CompatMatchAttrs::attr_from_type(t)),
12613 );
12614 }
12615 if cur > offset || cur + self.buf.len() < offset {
12616 return (stack, None);
12617 }
12618 let mut attrs = self.clone();
12619 let mut last_off = cur + attrs.pos;
12620 while let Some(attr) = attrs.next() {
12621 let Ok(attr) = attr else { break };
12622 match attr {
12623 CompatMatchAttrs::Name(val) => {
12624 if last_off == offset {
12625 stack.push(("Name", last_off));
12626 break;
12627 }
12628 }
12629 CompatMatchAttrs::Rev(val) => {
12630 if last_off == offset {
12631 stack.push(("Rev", last_off));
12632 break;
12633 }
12634 }
12635 CompatMatchAttrs::Info(val) => {
12636 if last_off == offset {
12637 stack.push(("Info", last_off));
12638 break;
12639 }
12640 }
12641 _ => {}
12642 };
12643 last_off = cur + attrs.pos;
12644 }
12645 if !stack.is_empty() {
12646 stack.push(("CompatMatchAttrs", cur));
12647 }
12648 (stack, None)
12649 }
12650}
12651#[derive(Clone)]
12652pub enum CompatAttrs<'a> {
12653 Name(&'a CStr),
12654 Rev(u32),
12655 Type(u32),
12656}
12657impl<'a> IterableCompatAttrs<'a> {
12658 pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
12659 let mut iter = self.clone();
12660 iter.pos = 0;
12661 for attr in iter {
12662 if let Ok(CompatAttrs::Name(val)) = attr {
12663 return Ok(val);
12664 }
12665 }
12666 Err(ErrorContext::new_missing(
12667 "CompatAttrs",
12668 "Name",
12669 self.orig_loc,
12670 self.buf.as_ptr() as usize,
12671 ))
12672 }
12673 pub fn get_rev(&self) -> Result<u32, ErrorContext> {
12674 let mut iter = self.clone();
12675 iter.pos = 0;
12676 for attr in iter {
12677 if let Ok(CompatAttrs::Rev(val)) = attr {
12678 return Ok(val);
12679 }
12680 }
12681 Err(ErrorContext::new_missing(
12682 "CompatAttrs",
12683 "Rev",
12684 self.orig_loc,
12685 self.buf.as_ptr() as usize,
12686 ))
12687 }
12688 pub fn get_type(&self) -> Result<u32, ErrorContext> {
12689 let mut iter = self.clone();
12690 iter.pos = 0;
12691 for attr in iter {
12692 if let Ok(CompatAttrs::Type(val)) = attr {
12693 return Ok(val);
12694 }
12695 }
12696 Err(ErrorContext::new_missing(
12697 "CompatAttrs",
12698 "Type",
12699 self.orig_loc,
12700 self.buf.as_ptr() as usize,
12701 ))
12702 }
12703}
12704impl CompatAttrs<'_> {
12705 pub fn new<'a>(buf: &'a [u8]) -> IterableCompatAttrs<'a> {
12706 IterableCompatAttrs::with_loc(buf, buf.as_ptr() as usize)
12707 }
12708 fn attr_from_type(r#type: u16) -> Option<&'static str> {
12709 let res = match r#type {
12710 1u16 => "Name",
12711 2u16 => "Rev",
12712 3u16 => "Type",
12713 _ => return None,
12714 };
12715 Some(res)
12716 }
12717}
12718#[derive(Clone, Copy, Default)]
12719pub struct IterableCompatAttrs<'a> {
12720 buf: &'a [u8],
12721 pos: usize,
12722 orig_loc: usize,
12723}
12724impl<'a> IterableCompatAttrs<'a> {
12725 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12726 Self {
12727 buf,
12728 pos: 0,
12729 orig_loc,
12730 }
12731 }
12732 pub fn get_buf(&self) -> &'a [u8] {
12733 self.buf
12734 }
12735}
12736impl<'a> Iterator for IterableCompatAttrs<'a> {
12737 type Item = Result<CompatAttrs<'a>, ErrorContext>;
12738 fn next(&mut self) -> Option<Self::Item> {
12739 let mut pos;
12740 let mut r#type;
12741 loop {
12742 pos = self.pos;
12743 r#type = None;
12744 if self.buf.len() == self.pos {
12745 return None;
12746 }
12747 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12748 self.pos = self.buf.len();
12749 break;
12750 };
12751 r#type = Some(header.r#type);
12752 let res = match header.r#type {
12753 1u16 => CompatAttrs::Name({
12754 let res = CStr::from_bytes_with_nul(next).ok();
12755 let Some(val) = res else { break };
12756 val
12757 }),
12758 2u16 => CompatAttrs::Rev({
12759 let res = parse_be_u32(next);
12760 let Some(val) = res else { break };
12761 val
12762 }),
12763 3u16 => CompatAttrs::Type({
12764 let res = parse_be_u32(next);
12765 let Some(val) = res else { break };
12766 val
12767 }),
12768 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12769 n => continue,
12770 };
12771 return Some(Ok(res));
12772 }
12773 Some(Err(ErrorContext::new(
12774 "CompatAttrs",
12775 r#type.and_then(|t| CompatAttrs::attr_from_type(t)),
12776 self.orig_loc,
12777 self.buf.as_ptr().wrapping_add(pos) as usize,
12778 )))
12779 }
12780}
12781impl<'a> std::fmt::Debug for IterableCompatAttrs<'_> {
12782 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12783 let mut fmt = f.debug_struct("CompatAttrs");
12784 for attr in self.clone() {
12785 let attr = match attr {
12786 Ok(a) => a,
12787 Err(err) => {
12788 fmt.finish()?;
12789 f.write_str("Err(")?;
12790 err.fmt(f)?;
12791 return f.write_str(")");
12792 }
12793 };
12794 match attr {
12795 CompatAttrs::Name(val) => fmt.field("Name", &val),
12796 CompatAttrs::Rev(val) => fmt.field("Rev", &val),
12797 CompatAttrs::Type(val) => fmt.field("Type", &val),
12798 };
12799 }
12800 fmt.finish()
12801 }
12802}
12803impl IterableCompatAttrs<'_> {
12804 pub fn lookup_attr(
12805 &self,
12806 offset: usize,
12807 missing_type: Option<u16>,
12808 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12809 let mut stack = Vec::new();
12810 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12811 if missing_type.is_some() && cur == offset {
12812 stack.push(("CompatAttrs", offset));
12813 return (
12814 stack,
12815 missing_type.and_then(|t| CompatAttrs::attr_from_type(t)),
12816 );
12817 }
12818 if cur > offset || cur + self.buf.len() < offset {
12819 return (stack, None);
12820 }
12821 let mut attrs = self.clone();
12822 let mut last_off = cur + attrs.pos;
12823 while let Some(attr) = attrs.next() {
12824 let Ok(attr) = attr else { break };
12825 match attr {
12826 CompatAttrs::Name(val) => {
12827 if last_off == offset {
12828 stack.push(("Name", last_off));
12829 break;
12830 }
12831 }
12832 CompatAttrs::Rev(val) => {
12833 if last_off == offset {
12834 stack.push(("Rev", last_off));
12835 break;
12836 }
12837 }
12838 CompatAttrs::Type(val) => {
12839 if last_off == offset {
12840 stack.push(("Type", last_off));
12841 break;
12842 }
12843 }
12844 _ => {}
12845 };
12846 last_off = cur + attrs.pos;
12847 }
12848 if !stack.is_empty() {
12849 stack.push(("CompatAttrs", cur));
12850 }
12851 (stack, None)
12852 }
12853}
12854pub struct PushLogAttrs<Prev: Pusher> {
12855 pub(crate) prev: Option<Prev>,
12856 pub(crate) header_offset: Option<usize>,
12857}
12858impl<Prev: Pusher> Pusher for PushLogAttrs<Prev> {
12859 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
12860 self.prev.as_mut().unwrap().as_vec_mut()
12861 }
12862 fn as_vec(&self) -> &Vec<u8> {
12863 self.prev.as_ref().unwrap().as_vec()
12864 }
12865}
12866impl<Prev: Pusher> PushLogAttrs<Prev> {
12867 pub fn new(prev: Prev) -> Self {
12868 Self {
12869 prev: Some(prev),
12870 header_offset: None,
12871 }
12872 }
12873 pub fn end_nested(mut self) -> Prev {
12874 let mut prev = self.prev.take().unwrap();
12875 if let Some(header_offset) = &self.header_offset {
12876 finalize_nested_header(prev.as_vec_mut(), *header_offset);
12877 }
12878 prev
12879 }
12880 #[doc = "netlink group to send messages to\n"]
12881 pub fn push_group(mut self, value: u16) -> Self {
12882 push_header(self.as_vec_mut(), 1u16, 2 as u16);
12883 self.as_vec_mut().extend(value.to_be_bytes());
12884 self
12885 }
12886 #[doc = "prefix to prepend to log messages\n"]
12887 pub fn push_prefix(mut self, value: &CStr) -> Self {
12888 push_header(
12889 self.as_vec_mut(),
12890 2u16,
12891 value.to_bytes_with_nul().len() as u16,
12892 );
12893 self.as_vec_mut().extend(value.to_bytes_with_nul());
12894 self
12895 }
12896 #[doc = "prefix to prepend to log messages\n"]
12897 pub fn push_prefix_bytes(mut self, value: &[u8]) -> Self {
12898 push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
12899 self.as_vec_mut().extend(value);
12900 self.as_vec_mut().push(0);
12901 self
12902 }
12903 #[doc = "length of payload to include in netlink message\n"]
12904 pub fn push_snaplen(mut self, value: u32) -> Self {
12905 push_header(self.as_vec_mut(), 3u16, 4 as u16);
12906 self.as_vec_mut().extend(value.to_be_bytes());
12907 self
12908 }
12909 #[doc = "queue threshold\n"]
12910 pub fn push_qthreshold(mut self, value: u16) -> Self {
12911 push_header(self.as_vec_mut(), 4u16, 2 as u16);
12912 self.as_vec_mut().extend(value.to_be_bytes());
12913 self
12914 }
12915 #[doc = "log level\n\nAssociated type: [`LogLevel`] (enum)"]
12916 pub fn push_level(mut self, value: u32) -> Self {
12917 push_header(self.as_vec_mut(), 5u16, 4 as u16);
12918 self.as_vec_mut().extend(value.to_be_bytes());
12919 self
12920 }
12921 #[doc = "logging flags\n\nAssociated type: [`LogFlags`] (enum)"]
12922 pub fn push_flags(mut self, value: u32) -> Self {
12923 push_header(self.as_vec_mut(), 6u16, 4 as u16);
12924 self.as_vec_mut().extend(value.to_be_bytes());
12925 self
12926 }
12927}
12928impl<Prev: Pusher> Drop for PushLogAttrs<Prev> {
12929 fn drop(&mut self) {
12930 if let Some(prev) = &mut self.prev {
12931 if let Some(header_offset) = &self.header_offset {
12932 finalize_nested_header(prev.as_vec_mut(), *header_offset);
12933 }
12934 }
12935 }
12936}
12937pub struct PushNumgenAttrs<Prev: Pusher> {
12938 pub(crate) prev: Option<Prev>,
12939 pub(crate) header_offset: Option<usize>,
12940}
12941impl<Prev: Pusher> Pusher for PushNumgenAttrs<Prev> {
12942 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
12943 self.prev.as_mut().unwrap().as_vec_mut()
12944 }
12945 fn as_vec(&self) -> &Vec<u8> {
12946 self.prev.as_ref().unwrap().as_vec()
12947 }
12948}
12949impl<Prev: Pusher> PushNumgenAttrs<Prev> {
12950 pub fn new(prev: Prev) -> Self {
12951 Self {
12952 prev: Some(prev),
12953 header_offset: None,
12954 }
12955 }
12956 pub fn end_nested(mut self) -> Prev {
12957 let mut prev = self.prev.take().unwrap();
12958 if let Some(header_offset) = &self.header_offset {
12959 finalize_nested_header(prev.as_vec_mut(), *header_offset);
12960 }
12961 prev
12962 }
12963 #[doc = "destination register\n\nAssociated type: [`Registers`] (enum)"]
12964 pub fn push_dreg(mut self, value: u32) -> Self {
12965 push_header(self.as_vec_mut(), 1u16, 4 as u16);
12966 self.as_vec_mut().extend(value.to_ne_bytes());
12967 self
12968 }
12969 #[doc = "maximum counter value\n"]
12970 pub fn push_modulus(mut self, value: u32) -> Self {
12971 push_header(self.as_vec_mut(), 2u16, 4 as u16);
12972 self.as_vec_mut().extend(value.to_be_bytes());
12973 self
12974 }
12975 #[doc = "operation type\n\nAssociated type: [`NumgenTypes`] (enum)"]
12976 pub fn push_type(mut self, value: u32) -> Self {
12977 push_header(self.as_vec_mut(), 3u16, 4 as u16);
12978 self.as_vec_mut().extend(value.to_be_bytes());
12979 self
12980 }
12981 #[doc = "offset to be added to the counter\n"]
12982 pub fn push_offset(mut self, value: u32) -> Self {
12983 push_header(self.as_vec_mut(), 4u16, 4 as u16);
12984 self.as_vec_mut().extend(value.to_be_bytes());
12985 self
12986 }
12987}
12988impl<Prev: Pusher> Drop for PushNumgenAttrs<Prev> {
12989 fn drop(&mut self) {
12990 if let Some(prev) = &mut self.prev {
12991 if let Some(header_offset) = &self.header_offset {
12992 finalize_nested_header(prev.as_vec_mut(), *header_offset);
12993 }
12994 }
12995 }
12996}
12997pub struct PushRangeAttrs<Prev: Pusher> {
12998 pub(crate) prev: Option<Prev>,
12999 pub(crate) header_offset: Option<usize>,
13000}
13001impl<Prev: Pusher> Pusher for PushRangeAttrs<Prev> {
13002 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13003 self.prev.as_mut().unwrap().as_vec_mut()
13004 }
13005 fn as_vec(&self) -> &Vec<u8> {
13006 self.prev.as_ref().unwrap().as_vec()
13007 }
13008}
13009impl<Prev: Pusher> PushRangeAttrs<Prev> {
13010 pub fn new(prev: Prev) -> Self {
13011 Self {
13012 prev: Some(prev),
13013 header_offset: None,
13014 }
13015 }
13016 pub fn end_nested(mut self) -> Prev {
13017 let mut prev = self.prev.take().unwrap();
13018 if let Some(header_offset) = &self.header_offset {
13019 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13020 }
13021 prev
13022 }
13023 #[doc = "source register of data to compare\n\nAssociated type: [`Registers`] (enum)"]
13024 pub fn push_sreg(mut self, value: u32) -> Self {
13025 push_header(self.as_vec_mut(), 1u16, 4 as u16);
13026 self.as_vec_mut().extend(value.to_be_bytes());
13027 self
13028 }
13029 #[doc = "cmp operation\n\nAssociated type: [`RangeOps`] (enum)"]
13030 pub fn push_op(mut self, value: u32) -> Self {
13031 push_header(self.as_vec_mut(), 2u16, 4 as u16);
13032 self.as_vec_mut().extend(value.to_be_bytes());
13033 self
13034 }
13035 #[doc = "data range from\n"]
13036 pub fn nested_from_data(mut self) -> PushDataAttrs<Self> {
13037 let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
13038 PushDataAttrs {
13039 prev: Some(self),
13040 header_offset: Some(header_offset),
13041 }
13042 }
13043 #[doc = "data range to\n"]
13044 pub fn nested_to_data(mut self) -> PushDataAttrs<Self> {
13045 let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
13046 PushDataAttrs {
13047 prev: Some(self),
13048 header_offset: Some(header_offset),
13049 }
13050 }
13051}
13052impl<Prev: Pusher> Drop for PushRangeAttrs<Prev> {
13053 fn drop(&mut self) {
13054 if let Some(prev) = &mut self.prev {
13055 if let Some(header_offset) = &self.header_offset {
13056 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13057 }
13058 }
13059 }
13060}
13061pub struct PushBatchAttrs<Prev: Pusher> {
13062 pub(crate) prev: Option<Prev>,
13063 pub(crate) header_offset: Option<usize>,
13064}
13065impl<Prev: Pusher> Pusher for PushBatchAttrs<Prev> {
13066 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13067 self.prev.as_mut().unwrap().as_vec_mut()
13068 }
13069 fn as_vec(&self) -> &Vec<u8> {
13070 self.prev.as_ref().unwrap().as_vec()
13071 }
13072}
13073impl<Prev: Pusher> PushBatchAttrs<Prev> {
13074 pub fn new(prev: Prev) -> Self {
13075 Self {
13076 prev: Some(prev),
13077 header_offset: None,
13078 }
13079 }
13080 pub fn end_nested(mut self) -> Prev {
13081 let mut prev = self.prev.take().unwrap();
13082 if let Some(header_offset) = &self.header_offset {
13083 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13084 }
13085 prev
13086 }
13087 #[doc = "generation ID for this changeset\n"]
13088 pub fn push_genid(mut self, value: u32) -> Self {
13089 push_header(self.as_vec_mut(), 1u16, 4 as u16);
13090 self.as_vec_mut().extend(value.to_be_bytes());
13091 self
13092 }
13093}
13094impl<Prev: Pusher> Drop for PushBatchAttrs<Prev> {
13095 fn drop(&mut self) {
13096 if let Some(prev) = &mut self.prev {
13097 if let Some(header_offset) = &self.header_offset {
13098 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13099 }
13100 }
13101 }
13102}
13103pub struct PushTableAttrs<Prev: Pusher> {
13104 pub(crate) prev: Option<Prev>,
13105 pub(crate) header_offset: Option<usize>,
13106}
13107impl<Prev: Pusher> Pusher for PushTableAttrs<Prev> {
13108 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13109 self.prev.as_mut().unwrap().as_vec_mut()
13110 }
13111 fn as_vec(&self) -> &Vec<u8> {
13112 self.prev.as_ref().unwrap().as_vec()
13113 }
13114}
13115impl<Prev: Pusher> PushTableAttrs<Prev> {
13116 pub fn new(prev: Prev) -> Self {
13117 Self {
13118 prev: Some(prev),
13119 header_offset: None,
13120 }
13121 }
13122 pub fn end_nested(mut self) -> Prev {
13123 let mut prev = self.prev.take().unwrap();
13124 if let Some(header_offset) = &self.header_offset {
13125 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13126 }
13127 prev
13128 }
13129 #[doc = "name of the table\n"]
13130 pub fn push_name(mut self, value: &CStr) -> Self {
13131 push_header(
13132 self.as_vec_mut(),
13133 1u16,
13134 value.to_bytes_with_nul().len() as u16,
13135 );
13136 self.as_vec_mut().extend(value.to_bytes_with_nul());
13137 self
13138 }
13139 #[doc = "name of the table\n"]
13140 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
13141 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
13142 self.as_vec_mut().extend(value);
13143 self.as_vec_mut().push(0);
13144 self
13145 }
13146 #[doc = "bitmask of flags\n\nAssociated type: [`TableFlags`] (1 bit per enumeration)"]
13147 pub fn push_flags(mut self, value: u32) -> Self {
13148 push_header(self.as_vec_mut(), 2u16, 4 as u16);
13149 self.as_vec_mut().extend(value.to_be_bytes());
13150 self
13151 }
13152 #[doc = "number of chains in this table\n"]
13153 pub fn push_use(mut self, value: u32) -> Self {
13154 push_header(self.as_vec_mut(), 3u16, 4 as u16);
13155 self.as_vec_mut().extend(value.to_be_bytes());
13156 self
13157 }
13158 #[doc = "numeric handle of the table\n"]
13159 pub fn push_handle(mut self, value: u64) -> Self {
13160 push_header(self.as_vec_mut(), 4u16, 8 as u16);
13161 self.as_vec_mut().extend(value.to_be_bytes());
13162 self
13163 }
13164 pub fn push_pad(mut self, value: &[u8]) -> Self {
13165 push_header(self.as_vec_mut(), 5u16, value.len() as u16);
13166 self.as_vec_mut().extend(value);
13167 self
13168 }
13169 #[doc = "user data\n"]
13170 pub fn push_userdata(mut self, value: &[u8]) -> Self {
13171 push_header(self.as_vec_mut(), 6u16, value.len() as u16);
13172 self.as_vec_mut().extend(value);
13173 self
13174 }
13175 #[doc = "owner of this table through netlink portID\n"]
13176 pub fn push_owner(mut self, value: u32) -> Self {
13177 push_header(self.as_vec_mut(), 7u16, 4 as u16);
13178 self.as_vec_mut().extend(value.to_be_bytes());
13179 self
13180 }
13181}
13182impl<Prev: Pusher> Drop for PushTableAttrs<Prev> {
13183 fn drop(&mut self) {
13184 if let Some(prev) = &mut self.prev {
13185 if let Some(header_offset) = &self.header_offset {
13186 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13187 }
13188 }
13189 }
13190}
13191pub struct PushChainAttrs<Prev: Pusher> {
13192 pub(crate) prev: Option<Prev>,
13193 pub(crate) header_offset: Option<usize>,
13194}
13195impl<Prev: Pusher> Pusher for PushChainAttrs<Prev> {
13196 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13197 self.prev.as_mut().unwrap().as_vec_mut()
13198 }
13199 fn as_vec(&self) -> &Vec<u8> {
13200 self.prev.as_ref().unwrap().as_vec()
13201 }
13202}
13203impl<Prev: Pusher> PushChainAttrs<Prev> {
13204 pub fn new(prev: Prev) -> Self {
13205 Self {
13206 prev: Some(prev),
13207 header_offset: None,
13208 }
13209 }
13210 pub fn end_nested(mut self) -> Prev {
13211 let mut prev = self.prev.take().unwrap();
13212 if let Some(header_offset) = &self.header_offset {
13213 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13214 }
13215 prev
13216 }
13217 #[doc = "name of the table containing the chain\n"]
13218 pub fn push_table(mut self, value: &CStr) -> Self {
13219 push_header(
13220 self.as_vec_mut(),
13221 1u16,
13222 value.to_bytes_with_nul().len() as u16,
13223 );
13224 self.as_vec_mut().extend(value.to_bytes_with_nul());
13225 self
13226 }
13227 #[doc = "name of the table containing the chain\n"]
13228 pub fn push_table_bytes(mut self, value: &[u8]) -> Self {
13229 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
13230 self.as_vec_mut().extend(value);
13231 self.as_vec_mut().push(0);
13232 self
13233 }
13234 #[doc = "numeric handle of the chain\n"]
13235 pub fn push_handle(mut self, value: u64) -> Self {
13236 push_header(self.as_vec_mut(), 2u16, 8 as u16);
13237 self.as_vec_mut().extend(value.to_be_bytes());
13238 self
13239 }
13240 #[doc = "name of the chain\n"]
13241 pub fn push_name(mut self, value: &CStr) -> Self {
13242 push_header(
13243 self.as_vec_mut(),
13244 3u16,
13245 value.to_bytes_with_nul().len() as u16,
13246 );
13247 self.as_vec_mut().extend(value.to_bytes_with_nul());
13248 self
13249 }
13250 #[doc = "name of the chain\n"]
13251 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
13252 push_header(self.as_vec_mut(), 3u16, (value.len() + 1) as u16);
13253 self.as_vec_mut().extend(value);
13254 self.as_vec_mut().push(0);
13255 self
13256 }
13257 #[doc = "hook specification for basechains\n"]
13258 pub fn nested_hook(mut self) -> PushNftHookAttrs<Self> {
13259 let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
13260 PushNftHookAttrs {
13261 prev: Some(self),
13262 header_offset: Some(header_offset),
13263 }
13264 }
13265 #[doc = "numeric policy of the chain\n"]
13266 pub fn push_policy(mut self, value: u32) -> Self {
13267 push_header(self.as_vec_mut(), 5u16, 4 as u16);
13268 self.as_vec_mut().extend(value.to_be_bytes());
13269 self
13270 }
13271 #[doc = "number of references to this chain\n"]
13272 pub fn push_use(mut self, value: u32) -> Self {
13273 push_header(self.as_vec_mut(), 6u16, 4 as u16);
13274 self.as_vec_mut().extend(value.to_be_bytes());
13275 self
13276 }
13277 #[doc = "type name of the chain\n"]
13278 pub fn push_type(mut self, value: &CStr) -> Self {
13279 push_header(
13280 self.as_vec_mut(),
13281 7u16,
13282 value.to_bytes_with_nul().len() as u16,
13283 );
13284 self.as_vec_mut().extend(value.to_bytes_with_nul());
13285 self
13286 }
13287 #[doc = "type name of the chain\n"]
13288 pub fn push_type_bytes(mut self, value: &[u8]) -> Self {
13289 push_header(self.as_vec_mut(), 7u16, (value.len() + 1) as u16);
13290 self.as_vec_mut().extend(value);
13291 self.as_vec_mut().push(0);
13292 self
13293 }
13294 #[doc = "counter specification of the chain\n"]
13295 pub fn nested_counters(mut self) -> PushNftCounterAttrs<Self> {
13296 let header_offset = push_nested_header(self.as_vec_mut(), 8u16);
13297 PushNftCounterAttrs {
13298 prev: Some(self),
13299 header_offset: Some(header_offset),
13300 }
13301 }
13302 #[doc = "chain flags\n\nAssociated type: [`ChainFlags`] (1 bit per enumeration)"]
13303 pub fn push_flags(mut self, value: u32) -> Self {
13304 push_header(self.as_vec_mut(), 9u16, 4 as u16);
13305 self.as_vec_mut().extend(value.to_be_bytes());
13306 self
13307 }
13308 #[doc = "uniquely identifies a chain in a transaction\n"]
13309 pub fn push_id(mut self, value: u32) -> Self {
13310 push_header(self.as_vec_mut(), 10u16, 4 as u16);
13311 self.as_vec_mut().extend(value.to_be_bytes());
13312 self
13313 }
13314 #[doc = "user data\n"]
13315 pub fn push_userdata(mut self, value: &[u8]) -> Self {
13316 push_header(self.as_vec_mut(), 11u16, value.len() as u16);
13317 self.as_vec_mut().extend(value);
13318 self
13319 }
13320}
13321impl<Prev: Pusher> Drop for PushChainAttrs<Prev> {
13322 fn drop(&mut self) {
13323 if let Some(prev) = &mut self.prev {
13324 if let Some(header_offset) = &self.header_offset {
13325 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13326 }
13327 }
13328 }
13329}
13330pub struct PushCounterAttrs<Prev: Pusher> {
13331 pub(crate) prev: Option<Prev>,
13332 pub(crate) header_offset: Option<usize>,
13333}
13334impl<Prev: Pusher> Pusher for PushCounterAttrs<Prev> {
13335 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13336 self.prev.as_mut().unwrap().as_vec_mut()
13337 }
13338 fn as_vec(&self) -> &Vec<u8> {
13339 self.prev.as_ref().unwrap().as_vec()
13340 }
13341}
13342impl<Prev: Pusher> PushCounterAttrs<Prev> {
13343 pub fn new(prev: Prev) -> Self {
13344 Self {
13345 prev: Some(prev),
13346 header_offset: None,
13347 }
13348 }
13349 pub fn end_nested(mut self) -> Prev {
13350 let mut prev = self.prev.take().unwrap();
13351 if let Some(header_offset) = &self.header_offset {
13352 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13353 }
13354 prev
13355 }
13356 pub fn push_bytes(mut self, value: u64) -> Self {
13357 push_header(self.as_vec_mut(), 1u16, 8 as u16);
13358 self.as_vec_mut().extend(value.to_be_bytes());
13359 self
13360 }
13361 pub fn push_packets(mut self, value: u64) -> Self {
13362 push_header(self.as_vec_mut(), 2u16, 8 as u16);
13363 self.as_vec_mut().extend(value.to_be_bytes());
13364 self
13365 }
13366 pub fn push_pad(mut self, value: &[u8]) -> Self {
13367 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
13368 self.as_vec_mut().extend(value);
13369 self
13370 }
13371}
13372impl<Prev: Pusher> Drop for PushCounterAttrs<Prev> {
13373 fn drop(&mut self) {
13374 if let Some(prev) = &mut self.prev {
13375 if let Some(header_offset) = &self.header_offset {
13376 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13377 }
13378 }
13379 }
13380}
13381pub struct PushNftHookAttrs<Prev: Pusher> {
13382 pub(crate) prev: Option<Prev>,
13383 pub(crate) header_offset: Option<usize>,
13384}
13385impl<Prev: Pusher> Pusher for PushNftHookAttrs<Prev> {
13386 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13387 self.prev.as_mut().unwrap().as_vec_mut()
13388 }
13389 fn as_vec(&self) -> &Vec<u8> {
13390 self.prev.as_ref().unwrap().as_vec()
13391 }
13392}
13393impl<Prev: Pusher> PushNftHookAttrs<Prev> {
13394 pub fn new(prev: Prev) -> Self {
13395 Self {
13396 prev: Some(prev),
13397 header_offset: None,
13398 }
13399 }
13400 pub fn end_nested(mut self) -> Prev {
13401 let mut prev = self.prev.take().unwrap();
13402 if let Some(header_offset) = &self.header_offset {
13403 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13404 }
13405 prev
13406 }
13407 pub fn push_num(mut self, value: u32) -> Self {
13408 push_header(self.as_vec_mut(), 1u16, 4 as u16);
13409 self.as_vec_mut().extend(value.to_be_bytes());
13410 self
13411 }
13412 pub fn push_priority(mut self, value: i32) -> Self {
13413 push_header(self.as_vec_mut(), 2u16, 4 as u16);
13414 self.as_vec_mut().extend(value.to_be_bytes());
13415 self
13416 }
13417 #[doc = "net device name\n"]
13418 pub fn push_dev(mut self, value: &CStr) -> Self {
13419 push_header(
13420 self.as_vec_mut(),
13421 3u16,
13422 value.to_bytes_with_nul().len() as u16,
13423 );
13424 self.as_vec_mut().extend(value.to_bytes_with_nul());
13425 self
13426 }
13427 #[doc = "net device name\n"]
13428 pub fn push_dev_bytes(mut self, value: &[u8]) -> Self {
13429 push_header(self.as_vec_mut(), 3u16, (value.len() + 1) as u16);
13430 self.as_vec_mut().extend(value);
13431 self.as_vec_mut().push(0);
13432 self
13433 }
13434 #[doc = "list of net devices\n"]
13435 pub fn nested_devs(mut self) -> PushHookDevAttrs<Self> {
13436 let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
13437 PushHookDevAttrs {
13438 prev: Some(self),
13439 header_offset: Some(header_offset),
13440 }
13441 }
13442}
13443impl<Prev: Pusher> Drop for PushNftHookAttrs<Prev> {
13444 fn drop(&mut self) {
13445 if let Some(prev) = &mut self.prev {
13446 if let Some(header_offset) = &self.header_offset {
13447 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13448 }
13449 }
13450 }
13451}
13452pub struct PushHookDevAttrs<Prev: Pusher> {
13453 pub(crate) prev: Option<Prev>,
13454 pub(crate) header_offset: Option<usize>,
13455}
13456impl<Prev: Pusher> Pusher for PushHookDevAttrs<Prev> {
13457 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13458 self.prev.as_mut().unwrap().as_vec_mut()
13459 }
13460 fn as_vec(&self) -> &Vec<u8> {
13461 self.prev.as_ref().unwrap().as_vec()
13462 }
13463}
13464impl<Prev: Pusher> PushHookDevAttrs<Prev> {
13465 pub fn new(prev: Prev) -> Self {
13466 Self {
13467 prev: Some(prev),
13468 header_offset: None,
13469 }
13470 }
13471 pub fn end_nested(mut self) -> Prev {
13472 let mut prev = self.prev.take().unwrap();
13473 if let Some(header_offset) = &self.header_offset {
13474 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13475 }
13476 prev
13477 }
13478 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13479 pub fn push_name(mut self, value: &CStr) -> Self {
13480 push_header(
13481 self.as_vec_mut(),
13482 1u16,
13483 value.to_bytes_with_nul().len() as u16,
13484 );
13485 self.as_vec_mut().extend(value.to_bytes_with_nul());
13486 self
13487 }
13488 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13489 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
13490 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
13491 self.as_vec_mut().extend(value);
13492 self.as_vec_mut().push(0);
13493 self
13494 }
13495}
13496impl<Prev: Pusher> Drop for PushHookDevAttrs<Prev> {
13497 fn drop(&mut self) {
13498 if let Some(prev) = &mut self.prev {
13499 if let Some(header_offset) = &self.header_offset {
13500 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13501 }
13502 }
13503 }
13504}
13505pub struct PushNftCounterAttrs<Prev: Pusher> {
13506 pub(crate) prev: Option<Prev>,
13507 pub(crate) header_offset: Option<usize>,
13508}
13509impl<Prev: Pusher> Pusher for PushNftCounterAttrs<Prev> {
13510 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13511 self.prev.as_mut().unwrap().as_vec_mut()
13512 }
13513 fn as_vec(&self) -> &Vec<u8> {
13514 self.prev.as_ref().unwrap().as_vec()
13515 }
13516}
13517impl<Prev: Pusher> PushNftCounterAttrs<Prev> {
13518 pub fn new(prev: Prev) -> Self {
13519 Self {
13520 prev: Some(prev),
13521 header_offset: None,
13522 }
13523 }
13524 pub fn end_nested(mut self) -> Prev {
13525 let mut prev = self.prev.take().unwrap();
13526 if let Some(header_offset) = &self.header_offset {
13527 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13528 }
13529 prev
13530 }
13531 pub fn push_bytes(mut self, value: u64) -> Self {
13532 push_header(self.as_vec_mut(), 1u16, 8 as u16);
13533 self.as_vec_mut().extend(value.to_be_bytes());
13534 self
13535 }
13536 pub fn push_packets(mut self, value: u64) -> Self {
13537 push_header(self.as_vec_mut(), 2u16, 8 as u16);
13538 self.as_vec_mut().extend(value.to_be_bytes());
13539 self
13540 }
13541}
13542impl<Prev: Pusher> Drop for PushNftCounterAttrs<Prev> {
13543 fn drop(&mut self) {
13544 if let Some(prev) = &mut self.prev {
13545 if let Some(header_offset) = &self.header_offset {
13546 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13547 }
13548 }
13549 }
13550}
13551pub struct PushRuleAttrs<Prev: Pusher> {
13552 pub(crate) prev: Option<Prev>,
13553 pub(crate) header_offset: Option<usize>,
13554}
13555impl<Prev: Pusher> Pusher for PushRuleAttrs<Prev> {
13556 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13557 self.prev.as_mut().unwrap().as_vec_mut()
13558 }
13559 fn as_vec(&self) -> &Vec<u8> {
13560 self.prev.as_ref().unwrap().as_vec()
13561 }
13562}
13563impl<Prev: Pusher> PushRuleAttrs<Prev> {
13564 pub fn new(prev: Prev) -> Self {
13565 Self {
13566 prev: Some(prev),
13567 header_offset: None,
13568 }
13569 }
13570 pub fn end_nested(mut self) -> Prev {
13571 let mut prev = self.prev.take().unwrap();
13572 if let Some(header_offset) = &self.header_offset {
13573 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13574 }
13575 prev
13576 }
13577 #[doc = "name of the table containing the rule\n"]
13578 pub fn push_table(mut self, value: &CStr) -> Self {
13579 push_header(
13580 self.as_vec_mut(),
13581 1u16,
13582 value.to_bytes_with_nul().len() as u16,
13583 );
13584 self.as_vec_mut().extend(value.to_bytes_with_nul());
13585 self
13586 }
13587 #[doc = "name of the table containing the rule\n"]
13588 pub fn push_table_bytes(mut self, value: &[u8]) -> Self {
13589 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
13590 self.as_vec_mut().extend(value);
13591 self.as_vec_mut().push(0);
13592 self
13593 }
13594 #[doc = "name of the chain containing the rule\n"]
13595 pub fn push_chain(mut self, value: &CStr) -> Self {
13596 push_header(
13597 self.as_vec_mut(),
13598 2u16,
13599 value.to_bytes_with_nul().len() as u16,
13600 );
13601 self.as_vec_mut().extend(value.to_bytes_with_nul());
13602 self
13603 }
13604 #[doc = "name of the chain containing the rule\n"]
13605 pub fn push_chain_bytes(mut self, value: &[u8]) -> Self {
13606 push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
13607 self.as_vec_mut().extend(value);
13608 self.as_vec_mut().push(0);
13609 self
13610 }
13611 #[doc = "numeric handle of the rule\n"]
13612 pub fn push_handle(mut self, value: u64) -> Self {
13613 push_header(self.as_vec_mut(), 3u16, 8 as u16);
13614 self.as_vec_mut().extend(value.to_be_bytes());
13615 self
13616 }
13617 #[doc = "list of expressions\n"]
13618 pub fn nested_expressions(mut self) -> PushExprListAttrs<Self> {
13619 let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
13620 PushExprListAttrs {
13621 prev: Some(self),
13622 header_offset: Some(header_offset),
13623 }
13624 }
13625 #[doc = "compatibility specifications of the rule\n"]
13626 pub fn nested_compat(mut self) -> PushRuleCompatAttrs<Self> {
13627 let header_offset = push_nested_header(self.as_vec_mut(), 5u16);
13628 PushRuleCompatAttrs {
13629 prev: Some(self),
13630 header_offset: Some(header_offset),
13631 }
13632 }
13633 #[doc = "numeric handle of the previous rule\n"]
13634 pub fn push_position(mut self, value: u64) -> Self {
13635 push_header(self.as_vec_mut(), 6u16, 8 as u16);
13636 self.as_vec_mut().extend(value.to_be_bytes());
13637 self
13638 }
13639 #[doc = "user data\n"]
13640 pub fn push_userdata(mut self, value: &[u8]) -> Self {
13641 push_header(self.as_vec_mut(), 7u16, value.len() as u16);
13642 self.as_vec_mut().extend(value);
13643 self
13644 }
13645 #[doc = "uniquely identifies a rule in a transaction\n"]
13646 pub fn push_id(mut self, value: u32) -> Self {
13647 push_header(self.as_vec_mut(), 8u16, 4 as u16);
13648 self.as_vec_mut().extend(value.to_ne_bytes());
13649 self
13650 }
13651 #[doc = "transaction unique identifier of the previous rule\n"]
13652 pub fn push_position_id(mut self, value: u32) -> Self {
13653 push_header(self.as_vec_mut(), 9u16, 4 as u16);
13654 self.as_vec_mut().extend(value.to_ne_bytes());
13655 self
13656 }
13657 #[doc = "add the rule to chain by ID, alternative to chain name\n"]
13658 pub fn push_chain_id(mut self, value: u32) -> Self {
13659 push_header(self.as_vec_mut(), 10u16, 4 as u16);
13660 self.as_vec_mut().extend(value.to_ne_bytes());
13661 self
13662 }
13663}
13664impl<Prev: Pusher> Drop for PushRuleAttrs<Prev> {
13665 fn drop(&mut self) {
13666 if let Some(prev) = &mut self.prev {
13667 if let Some(header_offset) = &self.header_offset {
13668 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13669 }
13670 }
13671 }
13672}
13673pub struct PushExprListAttrs<Prev: Pusher> {
13674 pub(crate) prev: Option<Prev>,
13675 pub(crate) header_offset: Option<usize>,
13676}
13677impl<Prev: Pusher> Pusher for PushExprListAttrs<Prev> {
13678 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13679 self.prev.as_mut().unwrap().as_vec_mut()
13680 }
13681 fn as_vec(&self) -> &Vec<u8> {
13682 self.prev.as_ref().unwrap().as_vec()
13683 }
13684}
13685impl<Prev: Pusher> PushExprListAttrs<Prev> {
13686 pub fn new(prev: Prev) -> Self {
13687 Self {
13688 prev: Some(prev),
13689 header_offset: None,
13690 }
13691 }
13692 pub fn end_nested(mut self) -> Prev {
13693 let mut prev = self.prev.take().unwrap();
13694 if let Some(header_offset) = &self.header_offset {
13695 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13696 }
13697 prev
13698 }
13699 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13700 pub fn nested_elem(mut self) -> PushExprAttrs<Self> {
13701 let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
13702 PushExprAttrs {
13703 prev: Some(self),
13704 header_offset: Some(header_offset),
13705 }
13706 }
13707}
13708impl<Prev: Pusher> Drop for PushExprListAttrs<Prev> {
13709 fn drop(&mut self) {
13710 if let Some(prev) = &mut self.prev {
13711 if let Some(header_offset) = &self.header_offset {
13712 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13713 }
13714 }
13715 }
13716}
13717pub struct PushExprAttrs<Prev: Pusher> {
13718 pub(crate) prev: Option<Prev>,
13719 pub(crate) header_offset: Option<usize>,
13720}
13721impl<Prev: Pusher> Pusher for PushExprAttrs<Prev> {
13722 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
13723 self.prev.as_mut().unwrap().as_vec_mut()
13724 }
13725 fn as_vec(&self) -> &Vec<u8> {
13726 self.prev.as_ref().unwrap().as_vec()
13727 }
13728}
13729impl<Prev: Pusher> PushExprAttrs<Prev> {
13730 pub fn new(prev: Prev) -> Self {
13731 Self {
13732 prev: Some(prev),
13733 header_offset: None,
13734 }
13735 }
13736 pub fn end_nested(mut self) -> Prev {
13737 let mut prev = self.prev.take().unwrap();
13738 if let Some(header_offset) = &self.header_offset {
13739 finalize_nested_header(prev.as_vec_mut(), *header_offset);
13740 }
13741 prev
13742 }
13743 #[doc = "name of the expression type\n"]
13744 pub fn push_name(mut self, value: &CStr) -> Self {
13745 push_header(
13746 self.as_vec_mut(),
13747 1u16,
13748 value.to_bytes_with_nul().len() as u16,
13749 );
13750 self.as_vec_mut().extend(value.to_bytes_with_nul());
13751 self
13752 }
13753 #[doc = "name of the expression type\n"]
13754 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
13755 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
13756 self.as_vec_mut().extend(value);
13757 self.as_vec_mut().push(0);
13758 self
13759 }
13760 #[doc = "type specific data\n"]
13761 #[doc = "Selector attribute `name` is inserted automatically."]
13762 #[doc = "At most one sub-message attribute is expected per attribute set."]
13763 pub fn nested_data_bitwise(mut self) -> PushExprBitwiseAttrs<PushDummy<Prev>> {
13764 self = self.push_name(c"bitwise");
13765 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13766 let dummy = PushDummy {
13767 prev: self.prev.take(),
13768 header_offset: self.header_offset.take(),
13769 };
13770 PushExprBitwiseAttrs {
13771 prev: Some(dummy),
13772 header_offset: Some(new_header_offset),
13773 }
13774 }
13775 #[doc = "Selector attribute `name` is inserted automatically."]
13776 #[doc = "At most one sub-message attribute is expected per attribute set."]
13777 pub fn nested_data_cmp(mut self) -> PushExprCmpAttrs<PushDummy<Prev>> {
13778 self = self.push_name(c"cmp");
13779 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13780 let dummy = PushDummy {
13781 prev: self.prev.take(),
13782 header_offset: self.header_offset.take(),
13783 };
13784 PushExprCmpAttrs {
13785 prev: Some(dummy),
13786 header_offset: Some(new_header_offset),
13787 }
13788 }
13789 #[doc = "Selector attribute `name` is inserted automatically."]
13790 #[doc = "At most one sub-message attribute is expected per attribute set."]
13791 pub fn nested_data_counter(mut self) -> PushExprCounterAttrs<PushDummy<Prev>> {
13792 self = self.push_name(c"counter");
13793 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13794 let dummy = PushDummy {
13795 prev: self.prev.take(),
13796 header_offset: self.header_offset.take(),
13797 };
13798 PushExprCounterAttrs {
13799 prev: Some(dummy),
13800 header_offset: Some(new_header_offset),
13801 }
13802 }
13803 #[doc = "Selector attribute `name` is inserted automatically."]
13804 #[doc = "At most one sub-message attribute is expected per attribute set."]
13805 pub fn nested_data_ct(mut self) -> PushExprCtAttrs<PushDummy<Prev>> {
13806 self = self.push_name(c"ct");
13807 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13808 let dummy = PushDummy {
13809 prev: self.prev.take(),
13810 header_offset: self.header_offset.take(),
13811 };
13812 PushExprCtAttrs {
13813 prev: Some(dummy),
13814 header_offset: Some(new_header_offset),
13815 }
13816 }
13817 #[doc = "Selector attribute `name` is inserted automatically."]
13818 #[doc = "At most one sub-message attribute is expected per attribute set."]
13819 pub fn nested_data_fib(mut self) -> PushExprFibAttrs<PushDummy<Prev>> {
13820 self = self.push_name(c"fib");
13821 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13822 let dummy = PushDummy {
13823 prev: self.prev.take(),
13824 header_offset: self.header_offset.take(),
13825 };
13826 PushExprFibAttrs {
13827 prev: Some(dummy),
13828 header_offset: Some(new_header_offset),
13829 }
13830 }
13831 #[doc = "Selector attribute `name` is inserted automatically."]
13832 #[doc = "At most one sub-message attribute is expected per attribute set."]
13833 pub fn nested_data_flow_offload(mut self) -> PushExprFlowOffloadAttrs<PushDummy<Prev>> {
13834 self = self.push_name(c"flow_offload");
13835 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13836 let dummy = PushDummy {
13837 prev: self.prev.take(),
13838 header_offset: self.header_offset.take(),
13839 };
13840 PushExprFlowOffloadAttrs {
13841 prev: Some(dummy),
13842 header_offset: Some(new_header_offset),
13843 }
13844 }
13845 #[doc = "Selector attribute `name` is inserted automatically."]
13846 #[doc = "At most one sub-message attribute is expected per attribute set."]
13847 pub fn nested_data_immediate(mut self) -> PushExprImmediateAttrs<PushDummy<Prev>> {
13848 self = self.push_name(c"immediate");
13849 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13850 let dummy = PushDummy {
13851 prev: self.prev.take(),
13852 header_offset: self.header_offset.take(),
13853 };
13854 PushExprImmediateAttrs {
13855 prev: Some(dummy),
13856 header_offset: Some(new_header_offset),
13857 }
13858 }
13859 #[doc = "Selector attribute `name` is inserted automatically."]
13860 #[doc = "At most one sub-message attribute is expected per attribute set."]
13861 pub fn nested_data_log(mut self) -> PushLogAttrs<PushDummy<Prev>> {
13862 self = self.push_name(c"log");
13863 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13864 let dummy = PushDummy {
13865 prev: self.prev.take(),
13866 header_offset: self.header_offset.take(),
13867 };
13868 PushLogAttrs {
13869 prev: Some(dummy),
13870 header_offset: Some(new_header_offset),
13871 }
13872 }
13873 #[doc = "Selector attribute `name` is inserted automatically."]
13874 #[doc = "At most one sub-message attribute is expected per attribute set."]
13875 pub fn nested_data_lookup(mut self) -> PushExprLookupAttrs<PushDummy<Prev>> {
13876 self = self.push_name(c"lookup");
13877 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13878 let dummy = PushDummy {
13879 prev: self.prev.take(),
13880 header_offset: self.header_offset.take(),
13881 };
13882 PushExprLookupAttrs {
13883 prev: Some(dummy),
13884 header_offset: Some(new_header_offset),
13885 }
13886 }
13887 #[doc = "Selector attribute `name` is inserted automatically."]
13888 #[doc = "At most one sub-message attribute is expected per attribute set."]
13889 pub fn nested_data_match(mut self) -> PushCompatMatchAttrs<PushDummy<Prev>> {
13890 self = self.push_name(c"match");
13891 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13892 let dummy = PushDummy {
13893 prev: self.prev.take(),
13894 header_offset: self.header_offset.take(),
13895 };
13896 PushCompatMatchAttrs {
13897 prev: Some(dummy),
13898 header_offset: Some(new_header_offset),
13899 }
13900 }
13901 #[doc = "Selector attribute `name` is inserted automatically."]
13902 #[doc = "At most one sub-message attribute is expected per attribute set."]
13903 pub fn nested_data_meta(mut self) -> PushExprMetaAttrs<PushDummy<Prev>> {
13904 self = self.push_name(c"meta");
13905 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13906 let dummy = PushDummy {
13907 prev: self.prev.take(),
13908 header_offset: self.header_offset.take(),
13909 };
13910 PushExprMetaAttrs {
13911 prev: Some(dummy),
13912 header_offset: Some(new_header_offset),
13913 }
13914 }
13915 #[doc = "Selector attribute `name` is inserted automatically."]
13916 #[doc = "At most one sub-message attribute is expected per attribute set."]
13917 pub fn nested_data_nat(mut self) -> PushExprNatAttrs<PushDummy<Prev>> {
13918 self = self.push_name(c"nat");
13919 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13920 let dummy = PushDummy {
13921 prev: self.prev.take(),
13922 header_offset: self.header_offset.take(),
13923 };
13924 PushExprNatAttrs {
13925 prev: Some(dummy),
13926 header_offset: Some(new_header_offset),
13927 }
13928 }
13929 #[doc = "Selector attribute `name` is inserted automatically."]
13930 #[doc = "At most one sub-message attribute is expected per attribute set."]
13931 pub fn nested_data_numgen(mut self) -> PushNumgenAttrs<PushDummy<Prev>> {
13932 self = self.push_name(c"numgen");
13933 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13934 let dummy = PushDummy {
13935 prev: self.prev.take(),
13936 header_offset: self.header_offset.take(),
13937 };
13938 PushNumgenAttrs {
13939 prev: Some(dummy),
13940 header_offset: Some(new_header_offset),
13941 }
13942 }
13943 #[doc = "Selector attribute `name` is inserted automatically."]
13944 #[doc = "At most one sub-message attribute is expected per attribute set."]
13945 pub fn nested_data_objref(mut self) -> PushExprObjrefAttrs<PushDummy<Prev>> {
13946 self = self.push_name(c"objref");
13947 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13948 let dummy = PushDummy {
13949 prev: self.prev.take(),
13950 header_offset: self.header_offset.take(),
13951 };
13952 PushExprObjrefAttrs {
13953 prev: Some(dummy),
13954 header_offset: Some(new_header_offset),
13955 }
13956 }
13957 #[doc = "Selector attribute `name` is inserted automatically."]
13958 #[doc = "At most one sub-message attribute is expected per attribute set."]
13959 pub fn nested_data_payload(mut self) -> PushExprPayloadAttrs<PushDummy<Prev>> {
13960 self = self.push_name(c"payload");
13961 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13962 let dummy = PushDummy {
13963 prev: self.prev.take(),
13964 header_offset: self.header_offset.take(),
13965 };
13966 PushExprPayloadAttrs {
13967 prev: Some(dummy),
13968 header_offset: Some(new_header_offset),
13969 }
13970 }
13971 #[doc = "Selector attribute `name` is inserted automatically."]
13972 #[doc = "At most one sub-message attribute is expected per attribute set."]
13973 pub fn nested_data_quota(mut self) -> PushQuotaAttrs<PushDummy<Prev>> {
13974 self = self.push_name(c"quota");
13975 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13976 let dummy = PushDummy {
13977 prev: self.prev.take(),
13978 header_offset: self.header_offset.take(),
13979 };
13980 PushQuotaAttrs {
13981 prev: Some(dummy),
13982 header_offset: Some(new_header_offset),
13983 }
13984 }
13985 #[doc = "Selector attribute `name` is inserted automatically."]
13986 #[doc = "At most one sub-message attribute is expected per attribute set."]
13987 pub fn nested_data_range(mut self) -> PushRangeAttrs<PushDummy<Prev>> {
13988 self = self.push_name(c"range");
13989 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
13990 let dummy = PushDummy {
13991 prev: self.prev.take(),
13992 header_offset: self.header_offset.take(),
13993 };
13994 PushRangeAttrs {
13995 prev: Some(dummy),
13996 header_offset: Some(new_header_offset),
13997 }
13998 }
13999 #[doc = "Selector attribute `name` is inserted automatically."]
14000 #[doc = "At most one sub-message attribute is expected per attribute set."]
14001 pub fn nested_data_reject(mut self) -> PushExprRejectAttrs<PushDummy<Prev>> {
14002 self = self.push_name(c"reject");
14003 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
14004 let dummy = PushDummy {
14005 prev: self.prev.take(),
14006 header_offset: self.header_offset.take(),
14007 };
14008 PushExprRejectAttrs {
14009 prev: Some(dummy),
14010 header_offset: Some(new_header_offset),
14011 }
14012 }
14013 #[doc = "Selector attribute `name` is inserted automatically."]
14014 #[doc = "At most one sub-message attribute is expected per attribute set."]
14015 pub fn nested_data_target(mut self) -> PushExprTargetAttrs<PushDummy<Prev>> {
14016 self = self.push_name(c"target");
14017 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
14018 let dummy = PushDummy {
14019 prev: self.prev.take(),
14020 header_offset: self.header_offset.take(),
14021 };
14022 PushExprTargetAttrs {
14023 prev: Some(dummy),
14024 header_offset: Some(new_header_offset),
14025 }
14026 }
14027 #[doc = "Selector attribute `name` is inserted automatically."]
14028 #[doc = "At most one sub-message attribute is expected per attribute set."]
14029 pub fn nested_data_tproxy(mut self) -> PushExprTproxyAttrs<PushDummy<Prev>> {
14030 self = self.push_name(c"tproxy");
14031 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
14032 let dummy = PushDummy {
14033 prev: self.prev.take(),
14034 header_offset: self.header_offset.take(),
14035 };
14036 PushExprTproxyAttrs {
14037 prev: Some(dummy),
14038 header_offset: Some(new_header_offset),
14039 }
14040 }
14041}
14042impl<Prev: Pusher> Drop for PushExprAttrs<Prev> {
14043 fn drop(&mut self) {
14044 if let Some(prev) = &mut self.prev {
14045 if let Some(header_offset) = &self.header_offset {
14046 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14047 }
14048 }
14049 }
14050}
14051pub struct PushRuleCompatAttrs<Prev: Pusher> {
14052 pub(crate) prev: Option<Prev>,
14053 pub(crate) header_offset: Option<usize>,
14054}
14055impl<Prev: Pusher> Pusher for PushRuleCompatAttrs<Prev> {
14056 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14057 self.prev.as_mut().unwrap().as_vec_mut()
14058 }
14059 fn as_vec(&self) -> &Vec<u8> {
14060 self.prev.as_ref().unwrap().as_vec()
14061 }
14062}
14063impl<Prev: Pusher> PushRuleCompatAttrs<Prev> {
14064 pub fn new(prev: Prev) -> Self {
14065 Self {
14066 prev: Some(prev),
14067 header_offset: None,
14068 }
14069 }
14070 pub fn end_nested(mut self) -> Prev {
14071 let mut prev = self.prev.take().unwrap();
14072 if let Some(header_offset) = &self.header_offset {
14073 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14074 }
14075 prev
14076 }
14077 #[doc = "numeric value of the handled protocol\n"]
14078 pub fn push_proto(mut self, value: u32) -> Self {
14079 push_header(self.as_vec_mut(), 1u16, 4 as u16);
14080 self.as_vec_mut().extend(value.to_be_bytes());
14081 self
14082 }
14083 #[doc = "bitmask of flags\n"]
14084 pub fn push_flags(mut self, value: u32) -> Self {
14085 push_header(self.as_vec_mut(), 2u16, 4 as u16);
14086 self.as_vec_mut().extend(value.to_be_bytes());
14087 self
14088 }
14089}
14090impl<Prev: Pusher> Drop for PushRuleCompatAttrs<Prev> {
14091 fn drop(&mut self) {
14092 if let Some(prev) = &mut self.prev {
14093 if let Some(header_offset) = &self.header_offset {
14094 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14095 }
14096 }
14097 }
14098}
14099pub struct PushSetAttrs<Prev: Pusher> {
14100 pub(crate) prev: Option<Prev>,
14101 pub(crate) header_offset: Option<usize>,
14102}
14103impl<Prev: Pusher> Pusher for PushSetAttrs<Prev> {
14104 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14105 self.prev.as_mut().unwrap().as_vec_mut()
14106 }
14107 fn as_vec(&self) -> &Vec<u8> {
14108 self.prev.as_ref().unwrap().as_vec()
14109 }
14110}
14111impl<Prev: Pusher> PushSetAttrs<Prev> {
14112 pub fn new(prev: Prev) -> Self {
14113 Self {
14114 prev: Some(prev),
14115 header_offset: None,
14116 }
14117 }
14118 pub fn end_nested(mut self) -> Prev {
14119 let mut prev = self.prev.take().unwrap();
14120 if let Some(header_offset) = &self.header_offset {
14121 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14122 }
14123 prev
14124 }
14125 #[doc = "table name\n"]
14126 pub fn push_table(mut self, value: &CStr) -> Self {
14127 push_header(
14128 self.as_vec_mut(),
14129 1u16,
14130 value.to_bytes_with_nul().len() as u16,
14131 );
14132 self.as_vec_mut().extend(value.to_bytes_with_nul());
14133 self
14134 }
14135 #[doc = "table name\n"]
14136 pub fn push_table_bytes(mut self, value: &[u8]) -> Self {
14137 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
14138 self.as_vec_mut().extend(value);
14139 self.as_vec_mut().push(0);
14140 self
14141 }
14142 #[doc = "set name\n"]
14143 pub fn push_name(mut self, value: &CStr) -> Self {
14144 push_header(
14145 self.as_vec_mut(),
14146 2u16,
14147 value.to_bytes_with_nul().len() as u16,
14148 );
14149 self.as_vec_mut().extend(value.to_bytes_with_nul());
14150 self
14151 }
14152 #[doc = "set name\n"]
14153 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
14154 push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
14155 self.as_vec_mut().extend(value);
14156 self.as_vec_mut().push(0);
14157 self
14158 }
14159 #[doc = "bitmask of enum nft_set_flags\n\nAssociated type: [`SetFlags`] (enum)"]
14160 pub fn push_flags(mut self, value: u32) -> Self {
14161 push_header(self.as_vec_mut(), 3u16, 4 as u16);
14162 self.as_vec_mut().extend(value.to_be_bytes());
14163 self
14164 }
14165 #[doc = "key data type, informational purpose only\n"]
14166 pub fn push_key_type(mut self, value: u32) -> Self {
14167 push_header(self.as_vec_mut(), 4u16, 4 as u16);
14168 self.as_vec_mut().extend(value.to_be_bytes());
14169 self
14170 }
14171 #[doc = "key data length\n"]
14172 pub fn push_key_len(mut self, value: u32) -> Self {
14173 push_header(self.as_vec_mut(), 5u16, 4 as u16);
14174 self.as_vec_mut().extend(value.to_be_bytes());
14175 self
14176 }
14177 #[doc = "mapping data type\n"]
14178 pub fn push_data_type(mut self, value: u32) -> Self {
14179 push_header(self.as_vec_mut(), 6u16, 4 as u16);
14180 self.as_vec_mut().extend(value.to_be_bytes());
14181 self
14182 }
14183 #[doc = "mapping data length\n"]
14184 pub fn push_data_len(mut self, value: u32) -> Self {
14185 push_header(self.as_vec_mut(), 7u16, 4 as u16);
14186 self.as_vec_mut().extend(value.to_be_bytes());
14187 self
14188 }
14189 #[doc = "selection policy\n"]
14190 pub fn push_policy(mut self, value: u32) -> Self {
14191 push_header(self.as_vec_mut(), 8u16, 4 as u16);
14192 self.as_vec_mut().extend(value.to_be_bytes());
14193 self
14194 }
14195 #[doc = "set description\n"]
14196 pub fn nested_desc(mut self) -> PushSetDescAttrs<Self> {
14197 let header_offset = push_nested_header(self.as_vec_mut(), 9u16);
14198 PushSetDescAttrs {
14199 prev: Some(self),
14200 header_offset: Some(header_offset),
14201 }
14202 }
14203 #[doc = "uniquely identifies a set in a transaction\n"]
14204 pub fn push_id(mut self, value: u32) -> Self {
14205 push_header(self.as_vec_mut(), 10u16, 4 as u16);
14206 self.as_vec_mut().extend(value.to_ne_bytes());
14207 self
14208 }
14209 #[doc = "default timeout value\n"]
14210 pub fn push_timeout(mut self, value: u64) -> Self {
14211 push_header(self.as_vec_mut(), 11u16, 8 as u16);
14212 self.as_vec_mut().extend(value.to_ne_bytes());
14213 self
14214 }
14215 #[doc = "garbage collection interval\n"]
14216 pub fn push_gc_interval(mut self, value: u32) -> Self {
14217 push_header(self.as_vec_mut(), 12u16, 4 as u16);
14218 self.as_vec_mut().extend(value.to_ne_bytes());
14219 self
14220 }
14221 #[doc = "user data\n"]
14222 pub fn push_userdata(mut self, value: &[u8]) -> Self {
14223 push_header(self.as_vec_mut(), 13u16, value.len() as u16);
14224 self.as_vec_mut().extend(value);
14225 self
14226 }
14227 pub fn push_pad(mut self, value: &[u8]) -> Self {
14228 push_header(self.as_vec_mut(), 14u16, value.len() as u16);
14229 self.as_vec_mut().extend(value);
14230 self
14231 }
14232 #[doc = "stateful object type\n"]
14233 pub fn push_obj_type(mut self, value: u32) -> Self {
14234 push_header(self.as_vec_mut(), 15u16, 4 as u16);
14235 self.as_vec_mut().extend(value.to_be_bytes());
14236 self
14237 }
14238 #[doc = "set handle\n"]
14239 pub fn push_handle(mut self, value: u64) -> Self {
14240 push_header(self.as_vec_mut(), 16u16, 8 as u16);
14241 self.as_vec_mut().extend(value.to_be_bytes());
14242 self
14243 }
14244 #[doc = "set expression\n\nAttribute may repeat multiple times (treat it as array)"]
14245 pub fn nested_expr(mut self) -> PushExprAttrs<Self> {
14246 let header_offset = push_nested_header(self.as_vec_mut(), 17u16);
14247 PushExprAttrs {
14248 prev: Some(self),
14249 header_offset: Some(header_offset),
14250 }
14251 }
14252 #[doc = "list of expressions\n"]
14253 pub fn nested_expressions(mut self) -> PushSetListAttrs<Self> {
14254 let header_offset = push_nested_header(self.as_vec_mut(), 18u16);
14255 PushSetListAttrs {
14256 prev: Some(self),
14257 header_offset: Some(header_offset),
14258 }
14259 }
14260 #[doc = "set backend type\n"]
14261 pub fn push_type(mut self, value: &CStr) -> Self {
14262 push_header(
14263 self.as_vec_mut(),
14264 19u16,
14265 value.to_bytes_with_nul().len() as u16,
14266 );
14267 self.as_vec_mut().extend(value.to_bytes_with_nul());
14268 self
14269 }
14270 #[doc = "set backend type\n"]
14271 pub fn push_type_bytes(mut self, value: &[u8]) -> Self {
14272 push_header(self.as_vec_mut(), 19u16, (value.len() + 1) as u16);
14273 self.as_vec_mut().extend(value);
14274 self.as_vec_mut().push(0);
14275 self
14276 }
14277 #[doc = "number of set elements\n"]
14278 pub fn push_count(mut self, value: u32) -> Self {
14279 push_header(self.as_vec_mut(), 20u16, 4 as u16);
14280 self.as_vec_mut().extend(value.to_be_bytes());
14281 self
14282 }
14283}
14284impl<Prev: Pusher> Drop for PushSetAttrs<Prev> {
14285 fn drop(&mut self) {
14286 if let Some(prev) = &mut self.prev {
14287 if let Some(header_offset) = &self.header_offset {
14288 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14289 }
14290 }
14291 }
14292}
14293pub struct PushSetDescAttrs<Prev: Pusher> {
14294 pub(crate) prev: Option<Prev>,
14295 pub(crate) header_offset: Option<usize>,
14296}
14297impl<Prev: Pusher> Pusher for PushSetDescAttrs<Prev> {
14298 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14299 self.prev.as_mut().unwrap().as_vec_mut()
14300 }
14301 fn as_vec(&self) -> &Vec<u8> {
14302 self.prev.as_ref().unwrap().as_vec()
14303 }
14304}
14305impl<Prev: Pusher> PushSetDescAttrs<Prev> {
14306 pub fn new(prev: Prev) -> Self {
14307 Self {
14308 prev: Some(prev),
14309 header_offset: None,
14310 }
14311 }
14312 pub fn end_nested(mut self) -> Prev {
14313 let mut prev = self.prev.take().unwrap();
14314 if let Some(header_offset) = &self.header_offset {
14315 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14316 }
14317 prev
14318 }
14319 #[doc = "number of elements in set\n"]
14320 pub fn push_size(mut self, value: u32) -> Self {
14321 push_header(self.as_vec_mut(), 1u16, 4 as u16);
14322 self.as_vec_mut().extend(value.to_be_bytes());
14323 self
14324 }
14325 #[doc = "description of field concatenation\n\nAttribute may repeat multiple times (treat it as array)"]
14326 pub fn nested_concat(mut self) -> PushSetDescConcatAttrs<Self> {
14327 let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
14328 PushSetDescConcatAttrs {
14329 prev: Some(self),
14330 header_offset: Some(header_offset),
14331 }
14332 }
14333}
14334impl<Prev: Pusher> Drop for PushSetDescAttrs<Prev> {
14335 fn drop(&mut self) {
14336 if let Some(prev) = &mut self.prev {
14337 if let Some(header_offset) = &self.header_offset {
14338 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14339 }
14340 }
14341 }
14342}
14343pub struct PushSetDescConcatAttrs<Prev: Pusher> {
14344 pub(crate) prev: Option<Prev>,
14345 pub(crate) header_offset: Option<usize>,
14346}
14347impl<Prev: Pusher> Pusher for PushSetDescConcatAttrs<Prev> {
14348 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14349 self.prev.as_mut().unwrap().as_vec_mut()
14350 }
14351 fn as_vec(&self) -> &Vec<u8> {
14352 self.prev.as_ref().unwrap().as_vec()
14353 }
14354}
14355impl<Prev: Pusher> PushSetDescConcatAttrs<Prev> {
14356 pub fn new(prev: Prev) -> Self {
14357 Self {
14358 prev: Some(prev),
14359 header_offset: None,
14360 }
14361 }
14362 pub fn end_nested(mut self) -> Prev {
14363 let mut prev = self.prev.take().unwrap();
14364 if let Some(header_offset) = &self.header_offset {
14365 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14366 }
14367 prev
14368 }
14369 pub fn nested_elem(mut self) -> PushSetFieldAttrs<Self> {
14370 let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
14371 PushSetFieldAttrs {
14372 prev: Some(self),
14373 header_offset: Some(header_offset),
14374 }
14375 }
14376}
14377impl<Prev: Pusher> Drop for PushSetDescConcatAttrs<Prev> {
14378 fn drop(&mut self) {
14379 if let Some(prev) = &mut self.prev {
14380 if let Some(header_offset) = &self.header_offset {
14381 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14382 }
14383 }
14384 }
14385}
14386pub struct PushSetFieldAttrs<Prev: Pusher> {
14387 pub(crate) prev: Option<Prev>,
14388 pub(crate) header_offset: Option<usize>,
14389}
14390impl<Prev: Pusher> Pusher for PushSetFieldAttrs<Prev> {
14391 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14392 self.prev.as_mut().unwrap().as_vec_mut()
14393 }
14394 fn as_vec(&self) -> &Vec<u8> {
14395 self.prev.as_ref().unwrap().as_vec()
14396 }
14397}
14398impl<Prev: Pusher> PushSetFieldAttrs<Prev> {
14399 pub fn new(prev: Prev) -> Self {
14400 Self {
14401 prev: Some(prev),
14402 header_offset: None,
14403 }
14404 }
14405 pub fn end_nested(mut self) -> Prev {
14406 let mut prev = self.prev.take().unwrap();
14407 if let Some(header_offset) = &self.header_offset {
14408 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14409 }
14410 prev
14411 }
14412 pub fn push_len(mut self, value: u32) -> Self {
14413 push_header(self.as_vec_mut(), 1u16, 4 as u16);
14414 self.as_vec_mut().extend(value.to_be_bytes());
14415 self
14416 }
14417}
14418impl<Prev: Pusher> Drop for PushSetFieldAttrs<Prev> {
14419 fn drop(&mut self) {
14420 if let Some(prev) = &mut self.prev {
14421 if let Some(header_offset) = &self.header_offset {
14422 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14423 }
14424 }
14425 }
14426}
14427pub struct PushSetListAttrs<Prev: Pusher> {
14428 pub(crate) prev: Option<Prev>,
14429 pub(crate) header_offset: Option<usize>,
14430}
14431impl<Prev: Pusher> Pusher for PushSetListAttrs<Prev> {
14432 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14433 self.prev.as_mut().unwrap().as_vec_mut()
14434 }
14435 fn as_vec(&self) -> &Vec<u8> {
14436 self.prev.as_ref().unwrap().as_vec()
14437 }
14438}
14439impl<Prev: Pusher> PushSetListAttrs<Prev> {
14440 pub fn new(prev: Prev) -> Self {
14441 Self {
14442 prev: Some(prev),
14443 header_offset: None,
14444 }
14445 }
14446 pub fn end_nested(mut self) -> Prev {
14447 let mut prev = self.prev.take().unwrap();
14448 if let Some(header_offset) = &self.header_offset {
14449 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14450 }
14451 prev
14452 }
14453 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14454 pub fn nested_elem(mut self) -> PushExprAttrs<Self> {
14455 let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
14456 PushExprAttrs {
14457 prev: Some(self),
14458 header_offset: Some(header_offset),
14459 }
14460 }
14461}
14462impl<Prev: Pusher> Drop for PushSetListAttrs<Prev> {
14463 fn drop(&mut self) {
14464 if let Some(prev) = &mut self.prev {
14465 if let Some(header_offset) = &self.header_offset {
14466 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14467 }
14468 }
14469 }
14470}
14471pub struct PushSetelemAttrs<Prev: Pusher> {
14472 pub(crate) prev: Option<Prev>,
14473 pub(crate) header_offset: Option<usize>,
14474}
14475impl<Prev: Pusher> Pusher for PushSetelemAttrs<Prev> {
14476 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14477 self.prev.as_mut().unwrap().as_vec_mut()
14478 }
14479 fn as_vec(&self) -> &Vec<u8> {
14480 self.prev.as_ref().unwrap().as_vec()
14481 }
14482}
14483impl<Prev: Pusher> PushSetelemAttrs<Prev> {
14484 pub fn new(prev: Prev) -> Self {
14485 Self {
14486 prev: Some(prev),
14487 header_offset: None,
14488 }
14489 }
14490 pub fn end_nested(mut self) -> Prev {
14491 let mut prev = self.prev.take().unwrap();
14492 if let Some(header_offset) = &self.header_offset {
14493 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14494 }
14495 prev
14496 }
14497 #[doc = "key value\n"]
14498 pub fn nested_key(mut self) -> PushDataAttrs<Self> {
14499 let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
14500 PushDataAttrs {
14501 prev: Some(self),
14502 header_offset: Some(header_offset),
14503 }
14504 }
14505 #[doc = "data value of mapping\n"]
14506 pub fn nested_data(mut self) -> PushDataAttrs<Self> {
14507 let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
14508 PushDataAttrs {
14509 prev: Some(self),
14510 header_offset: Some(header_offset),
14511 }
14512 }
14513 #[doc = "bitmask of nft_set_elem_flags\n"]
14514 pub fn push_flags(mut self, value: &[u8]) -> Self {
14515 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
14516 self.as_vec_mut().extend(value);
14517 self
14518 }
14519 #[doc = "timeout value\n"]
14520 pub fn push_timeout(mut self, value: u64) -> Self {
14521 push_header(self.as_vec_mut(), 4u16, 8 as u16);
14522 self.as_vec_mut().extend(value.to_ne_bytes());
14523 self
14524 }
14525 #[doc = "expiration time\n"]
14526 pub fn push_expiration(mut self, value: u64) -> Self {
14527 push_header(self.as_vec_mut(), 5u16, 8 as u16);
14528 self.as_vec_mut().extend(value.to_ne_bytes());
14529 self
14530 }
14531 #[doc = "user data\n"]
14532 pub fn push_userdata(mut self, value: &[u8]) -> Self {
14533 push_header(self.as_vec_mut(), 6u16, value.len() as u16);
14534 self.as_vec_mut().extend(value);
14535 self
14536 }
14537 #[doc = "expression\n"]
14538 pub fn nested_expr(mut self) -> PushExprAttrs<Self> {
14539 let header_offset = push_nested_header(self.as_vec_mut(), 7u16);
14540 PushExprAttrs {
14541 prev: Some(self),
14542 header_offset: Some(header_offset),
14543 }
14544 }
14545 #[doc = "stateful object reference\n"]
14546 pub fn push_objref(mut self, value: &CStr) -> Self {
14547 push_header(
14548 self.as_vec_mut(),
14549 8u16,
14550 value.to_bytes_with_nul().len() as u16,
14551 );
14552 self.as_vec_mut().extend(value.to_bytes_with_nul());
14553 self
14554 }
14555 #[doc = "stateful object reference\n"]
14556 pub fn push_objref_bytes(mut self, value: &[u8]) -> Self {
14557 push_header(self.as_vec_mut(), 8u16, (value.len() + 1) as u16);
14558 self.as_vec_mut().extend(value);
14559 self.as_vec_mut().push(0);
14560 self
14561 }
14562 #[doc = "closing key value\n"]
14563 pub fn nested_key_end(mut self) -> PushDataAttrs<Self> {
14564 let header_offset = push_nested_header(self.as_vec_mut(), 9u16);
14565 PushDataAttrs {
14566 prev: Some(self),
14567 header_offset: Some(header_offset),
14568 }
14569 }
14570 #[doc = "list of expressions\n"]
14571 pub fn nested_expressions(mut self) -> PushExprListAttrs<Self> {
14572 let header_offset = push_nested_header(self.as_vec_mut(), 10u16);
14573 PushExprListAttrs {
14574 prev: Some(self),
14575 header_offset: Some(header_offset),
14576 }
14577 }
14578}
14579impl<Prev: Pusher> Drop for PushSetelemAttrs<Prev> {
14580 fn drop(&mut self) {
14581 if let Some(prev) = &mut self.prev {
14582 if let Some(header_offset) = &self.header_offset {
14583 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14584 }
14585 }
14586 }
14587}
14588pub struct PushSetelemListElemAttrs<Prev: Pusher> {
14589 pub(crate) prev: Option<Prev>,
14590 pub(crate) header_offset: Option<usize>,
14591}
14592impl<Prev: Pusher> Pusher for PushSetelemListElemAttrs<Prev> {
14593 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14594 self.prev.as_mut().unwrap().as_vec_mut()
14595 }
14596 fn as_vec(&self) -> &Vec<u8> {
14597 self.prev.as_ref().unwrap().as_vec()
14598 }
14599}
14600impl<Prev: Pusher> PushSetelemListElemAttrs<Prev> {
14601 pub fn new(prev: Prev) -> Self {
14602 Self {
14603 prev: Some(prev),
14604 header_offset: None,
14605 }
14606 }
14607 pub fn end_nested(mut self) -> Prev {
14608 let mut prev = self.prev.take().unwrap();
14609 if let Some(header_offset) = &self.header_offset {
14610 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14611 }
14612 prev
14613 }
14614 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14615 pub fn nested_elem(mut self) -> PushSetelemAttrs<Self> {
14616 let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
14617 PushSetelemAttrs {
14618 prev: Some(self),
14619 header_offset: Some(header_offset),
14620 }
14621 }
14622}
14623impl<Prev: Pusher> Drop for PushSetelemListElemAttrs<Prev> {
14624 fn drop(&mut self) {
14625 if let Some(prev) = &mut self.prev {
14626 if let Some(header_offset) = &self.header_offset {
14627 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14628 }
14629 }
14630 }
14631}
14632pub struct PushSetelemListAttrs<Prev: Pusher> {
14633 pub(crate) prev: Option<Prev>,
14634 pub(crate) header_offset: Option<usize>,
14635}
14636impl<Prev: Pusher> Pusher for PushSetelemListAttrs<Prev> {
14637 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14638 self.prev.as_mut().unwrap().as_vec_mut()
14639 }
14640 fn as_vec(&self) -> &Vec<u8> {
14641 self.prev.as_ref().unwrap().as_vec()
14642 }
14643}
14644impl<Prev: Pusher> PushSetelemListAttrs<Prev> {
14645 pub fn new(prev: Prev) -> Self {
14646 Self {
14647 prev: Some(prev),
14648 header_offset: None,
14649 }
14650 }
14651 pub fn end_nested(mut self) -> Prev {
14652 let mut prev = self.prev.take().unwrap();
14653 if let Some(header_offset) = &self.header_offset {
14654 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14655 }
14656 prev
14657 }
14658 pub fn push_table(mut self, value: &CStr) -> Self {
14659 push_header(
14660 self.as_vec_mut(),
14661 1u16,
14662 value.to_bytes_with_nul().len() as u16,
14663 );
14664 self.as_vec_mut().extend(value.to_bytes_with_nul());
14665 self
14666 }
14667 pub fn push_table_bytes(mut self, value: &[u8]) -> Self {
14668 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
14669 self.as_vec_mut().extend(value);
14670 self.as_vec_mut().push(0);
14671 self
14672 }
14673 pub fn push_set(mut self, value: &CStr) -> Self {
14674 push_header(
14675 self.as_vec_mut(),
14676 2u16,
14677 value.to_bytes_with_nul().len() as u16,
14678 );
14679 self.as_vec_mut().extend(value.to_bytes_with_nul());
14680 self
14681 }
14682 pub fn push_set_bytes(mut self, value: &[u8]) -> Self {
14683 push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
14684 self.as_vec_mut().extend(value);
14685 self.as_vec_mut().push(0);
14686 self
14687 }
14688 pub fn nested_elements(mut self) -> PushSetelemListElemAttrs<Self> {
14689 let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
14690 PushSetelemListElemAttrs {
14691 prev: Some(self),
14692 header_offset: Some(header_offset),
14693 }
14694 }
14695 pub fn push_set_id(mut self, value: u32) -> Self {
14696 push_header(self.as_vec_mut(), 4u16, 4 as u16);
14697 self.as_vec_mut().extend(value.to_ne_bytes());
14698 self
14699 }
14700}
14701impl<Prev: Pusher> Drop for PushSetelemListAttrs<Prev> {
14702 fn drop(&mut self) {
14703 if let Some(prev) = &mut self.prev {
14704 if let Some(header_offset) = &self.header_offset {
14705 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14706 }
14707 }
14708 }
14709}
14710pub struct PushGenAttrs<Prev: Pusher> {
14711 pub(crate) prev: Option<Prev>,
14712 pub(crate) header_offset: Option<usize>,
14713}
14714impl<Prev: Pusher> Pusher for PushGenAttrs<Prev> {
14715 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14716 self.prev.as_mut().unwrap().as_vec_mut()
14717 }
14718 fn as_vec(&self) -> &Vec<u8> {
14719 self.prev.as_ref().unwrap().as_vec()
14720 }
14721}
14722impl<Prev: Pusher> PushGenAttrs<Prev> {
14723 pub fn new(prev: Prev) -> Self {
14724 Self {
14725 prev: Some(prev),
14726 header_offset: None,
14727 }
14728 }
14729 pub fn end_nested(mut self) -> Prev {
14730 let mut prev = self.prev.take().unwrap();
14731 if let Some(header_offset) = &self.header_offset {
14732 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14733 }
14734 prev
14735 }
14736 #[doc = "ruleset generation id\n"]
14737 pub fn push_id(mut self, value: u32) -> Self {
14738 push_header(self.as_vec_mut(), 1u16, 4 as u16);
14739 self.as_vec_mut().extend(value.to_be_bytes());
14740 self
14741 }
14742 pub fn push_proc_pid(mut self, value: u32) -> Self {
14743 push_header(self.as_vec_mut(), 2u16, 4 as u16);
14744 self.as_vec_mut().extend(value.to_be_bytes());
14745 self
14746 }
14747 pub fn push_proc_name(mut self, value: &CStr) -> Self {
14748 push_header(
14749 self.as_vec_mut(),
14750 3u16,
14751 value.to_bytes_with_nul().len() as u16,
14752 );
14753 self.as_vec_mut().extend(value.to_bytes_with_nul());
14754 self
14755 }
14756 pub fn push_proc_name_bytes(mut self, value: &[u8]) -> Self {
14757 push_header(self.as_vec_mut(), 3u16, (value.len() + 1) as u16);
14758 self.as_vec_mut().extend(value);
14759 self.as_vec_mut().push(0);
14760 self
14761 }
14762}
14763impl<Prev: Pusher> Drop for PushGenAttrs<Prev> {
14764 fn drop(&mut self) {
14765 if let Some(prev) = &mut self.prev {
14766 if let Some(header_offset) = &self.header_offset {
14767 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14768 }
14769 }
14770 }
14771}
14772pub struct PushObjAttrs<Prev: Pusher> {
14773 pub(crate) prev: Option<Prev>,
14774 pub(crate) header_offset: Option<usize>,
14775}
14776impl<Prev: Pusher> Pusher for PushObjAttrs<Prev> {
14777 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14778 self.prev.as_mut().unwrap().as_vec_mut()
14779 }
14780 fn as_vec(&self) -> &Vec<u8> {
14781 self.prev.as_ref().unwrap().as_vec()
14782 }
14783}
14784impl<Prev: Pusher> PushObjAttrs<Prev> {
14785 pub fn new(prev: Prev) -> Self {
14786 Self {
14787 prev: Some(prev),
14788 header_offset: None,
14789 }
14790 }
14791 pub fn end_nested(mut self) -> Prev {
14792 let mut prev = self.prev.take().unwrap();
14793 if let Some(header_offset) = &self.header_offset {
14794 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14795 }
14796 prev
14797 }
14798 #[doc = "name of the table containing the expression\n"]
14799 pub fn push_table(mut self, value: &CStr) -> Self {
14800 push_header(
14801 self.as_vec_mut(),
14802 1u16,
14803 value.to_bytes_with_nul().len() as u16,
14804 );
14805 self.as_vec_mut().extend(value.to_bytes_with_nul());
14806 self
14807 }
14808 #[doc = "name of the table containing the expression\n"]
14809 pub fn push_table_bytes(mut self, value: &[u8]) -> Self {
14810 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
14811 self.as_vec_mut().extend(value);
14812 self.as_vec_mut().push(0);
14813 self
14814 }
14815 #[doc = "name of this expression type\n"]
14816 pub fn push_name(mut self, value: &CStr) -> Self {
14817 push_header(
14818 self.as_vec_mut(),
14819 2u16,
14820 value.to_bytes_with_nul().len() as u16,
14821 );
14822 self.as_vec_mut().extend(value.to_bytes_with_nul());
14823 self
14824 }
14825 #[doc = "name of this expression type\n"]
14826 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
14827 push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
14828 self.as_vec_mut().extend(value);
14829 self.as_vec_mut().push(0);
14830 self
14831 }
14832 #[doc = "stateful object type\n\nAssociated type: [`ObjectType`] (enum)"]
14833 pub fn push_type(mut self, value: u32) -> Self {
14834 push_header(self.as_vec_mut(), 3u16, 4 as u16);
14835 self.as_vec_mut().extend(value.to_be_bytes());
14836 self
14837 }
14838 #[doc = "stateful object data\n"]
14839 #[doc = "Selector attribute `type` is inserted automatically."]
14840 #[doc = "At most one sub-message attribute is expected per attribute set."]
14841 pub fn nested_data_counter(mut self) -> PushCounterAttrs<PushDummy<Prev>> {
14842 self = self.push_type(ObjectType::Counter as u32);
14843 let new_header_offset = push_nested_header(self.as_vec_mut(), 4u16);
14844 let dummy = PushDummy {
14845 prev: self.prev.take(),
14846 header_offset: self.header_offset.take(),
14847 };
14848 PushCounterAttrs {
14849 prev: Some(dummy),
14850 header_offset: Some(new_header_offset),
14851 }
14852 }
14853 #[doc = "Selector attribute `type` is inserted automatically."]
14854 #[doc = "At most one sub-message attribute is expected per attribute set."]
14855 pub fn nested_data_quota(mut self) -> PushQuotaAttrs<PushDummy<Prev>> {
14856 self = self.push_type(ObjectType::Quota as u32);
14857 let new_header_offset = push_nested_header(self.as_vec_mut(), 4u16);
14858 let dummy = PushDummy {
14859 prev: self.prev.take(),
14860 header_offset: self.header_offset.take(),
14861 };
14862 PushQuotaAttrs {
14863 prev: Some(dummy),
14864 header_offset: Some(new_header_offset),
14865 }
14866 }
14867 #[doc = "number of references to this expression\n"]
14868 pub fn push_use(mut self, value: u32) -> Self {
14869 push_header(self.as_vec_mut(), 5u16, 4 as u16);
14870 self.as_vec_mut().extend(value.to_be_bytes());
14871 self
14872 }
14873 #[doc = "object handle\n"]
14874 pub fn push_handle(mut self, value: u64) -> Self {
14875 push_header(self.as_vec_mut(), 6u16, 8 as u16);
14876 self.as_vec_mut().extend(value.to_be_bytes());
14877 self
14878 }
14879 pub fn push_pad(mut self, value: &[u8]) -> Self {
14880 push_header(self.as_vec_mut(), 7u16, value.len() as u16);
14881 self.as_vec_mut().extend(value);
14882 self
14883 }
14884 #[doc = "user data\n"]
14885 pub fn push_userdata(mut self, value: &[u8]) -> Self {
14886 push_header(self.as_vec_mut(), 8u16, value.len() as u16);
14887 self.as_vec_mut().extend(value);
14888 self
14889 }
14890}
14891impl<Prev: Pusher> Drop for PushObjAttrs<Prev> {
14892 fn drop(&mut self) {
14893 if let Some(prev) = &mut self.prev {
14894 if let Some(header_offset) = &self.header_offset {
14895 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14896 }
14897 }
14898 }
14899}
14900pub struct PushQuotaAttrs<Prev: Pusher> {
14901 pub(crate) prev: Option<Prev>,
14902 pub(crate) header_offset: Option<usize>,
14903}
14904impl<Prev: Pusher> Pusher for PushQuotaAttrs<Prev> {
14905 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14906 self.prev.as_mut().unwrap().as_vec_mut()
14907 }
14908 fn as_vec(&self) -> &Vec<u8> {
14909 self.prev.as_ref().unwrap().as_vec()
14910 }
14911}
14912impl<Prev: Pusher> PushQuotaAttrs<Prev> {
14913 pub fn new(prev: Prev) -> Self {
14914 Self {
14915 prev: Some(prev),
14916 header_offset: None,
14917 }
14918 }
14919 pub fn end_nested(mut self) -> Prev {
14920 let mut prev = self.prev.take().unwrap();
14921 if let Some(header_offset) = &self.header_offset {
14922 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14923 }
14924 prev
14925 }
14926 pub fn push_bytes(mut self, value: u64) -> Self {
14927 push_header(self.as_vec_mut(), 1u16, 8 as u16);
14928 self.as_vec_mut().extend(value.to_be_bytes());
14929 self
14930 }
14931 #[doc = "Associated type: [`QuotaFlags`] (enum)"]
14932 pub fn push_flags(mut self, value: u32) -> Self {
14933 push_header(self.as_vec_mut(), 2u16, 4 as u16);
14934 self.as_vec_mut().extend(value.to_be_bytes());
14935 self
14936 }
14937 pub fn push_pad(mut self, value: &[u8]) -> Self {
14938 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
14939 self.as_vec_mut().extend(value);
14940 self
14941 }
14942 pub fn push_consumed(mut self, value: u64) -> Self {
14943 push_header(self.as_vec_mut(), 4u16, 8 as u16);
14944 self.as_vec_mut().extend(value.to_be_bytes());
14945 self
14946 }
14947}
14948impl<Prev: Pusher> Drop for PushQuotaAttrs<Prev> {
14949 fn drop(&mut self) {
14950 if let Some(prev) = &mut self.prev {
14951 if let Some(header_offset) = &self.header_offset {
14952 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14953 }
14954 }
14955 }
14956}
14957pub struct PushFlowtableAttrs<Prev: Pusher> {
14958 pub(crate) prev: Option<Prev>,
14959 pub(crate) header_offset: Option<usize>,
14960}
14961impl<Prev: Pusher> Pusher for PushFlowtableAttrs<Prev> {
14962 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
14963 self.prev.as_mut().unwrap().as_vec_mut()
14964 }
14965 fn as_vec(&self) -> &Vec<u8> {
14966 self.prev.as_ref().unwrap().as_vec()
14967 }
14968}
14969impl<Prev: Pusher> PushFlowtableAttrs<Prev> {
14970 pub fn new(prev: Prev) -> Self {
14971 Self {
14972 prev: Some(prev),
14973 header_offset: None,
14974 }
14975 }
14976 pub fn end_nested(mut self) -> Prev {
14977 let mut prev = self.prev.take().unwrap();
14978 if let Some(header_offset) = &self.header_offset {
14979 finalize_nested_header(prev.as_vec_mut(), *header_offset);
14980 }
14981 prev
14982 }
14983 pub fn push_table(mut self, value: &CStr) -> Self {
14984 push_header(
14985 self.as_vec_mut(),
14986 1u16,
14987 value.to_bytes_with_nul().len() as u16,
14988 );
14989 self.as_vec_mut().extend(value.to_bytes_with_nul());
14990 self
14991 }
14992 pub fn push_table_bytes(mut self, value: &[u8]) -> Self {
14993 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
14994 self.as_vec_mut().extend(value);
14995 self.as_vec_mut().push(0);
14996 self
14997 }
14998 pub fn push_name(mut self, value: &CStr) -> Self {
14999 push_header(
15000 self.as_vec_mut(),
15001 2u16,
15002 value.to_bytes_with_nul().len() as u16,
15003 );
15004 self.as_vec_mut().extend(value.to_bytes_with_nul());
15005 self
15006 }
15007 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
15008 push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
15009 self.as_vec_mut().extend(value);
15010 self.as_vec_mut().push(0);
15011 self
15012 }
15013 pub fn nested_hook(mut self) -> PushFlowtableHookAttrs<Self> {
15014 let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
15015 PushFlowtableHookAttrs {
15016 prev: Some(self),
15017 header_offset: Some(header_offset),
15018 }
15019 }
15020 pub fn push_use(mut self, value: u32) -> Self {
15021 push_header(self.as_vec_mut(), 4u16, 4 as u16);
15022 self.as_vec_mut().extend(value.to_be_bytes());
15023 self
15024 }
15025 pub fn push_handle(mut self, value: u64) -> Self {
15026 push_header(self.as_vec_mut(), 5u16, 8 as u16);
15027 self.as_vec_mut().extend(value.to_be_bytes());
15028 self
15029 }
15030 pub fn push_pad(mut self, value: &[u8]) -> Self {
15031 push_header(self.as_vec_mut(), 6u16, value.len() as u16);
15032 self.as_vec_mut().extend(value);
15033 self
15034 }
15035 pub fn push_flags(mut self, value: u32) -> Self {
15036 push_header(self.as_vec_mut(), 7u16, 4 as u16);
15037 self.as_vec_mut().extend(value.to_be_bytes());
15038 self
15039 }
15040}
15041impl<Prev: Pusher> Drop for PushFlowtableAttrs<Prev> {
15042 fn drop(&mut self) {
15043 if let Some(prev) = &mut self.prev {
15044 if let Some(header_offset) = &self.header_offset {
15045 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15046 }
15047 }
15048 }
15049}
15050pub struct PushFlowtableHookAttrs<Prev: Pusher> {
15051 pub(crate) prev: Option<Prev>,
15052 pub(crate) header_offset: Option<usize>,
15053}
15054impl<Prev: Pusher> Pusher for PushFlowtableHookAttrs<Prev> {
15055 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15056 self.prev.as_mut().unwrap().as_vec_mut()
15057 }
15058 fn as_vec(&self) -> &Vec<u8> {
15059 self.prev.as_ref().unwrap().as_vec()
15060 }
15061}
15062impl<Prev: Pusher> PushFlowtableHookAttrs<Prev> {
15063 pub fn new(prev: Prev) -> Self {
15064 Self {
15065 prev: Some(prev),
15066 header_offset: None,
15067 }
15068 }
15069 pub fn end_nested(mut self) -> Prev {
15070 let mut prev = self.prev.take().unwrap();
15071 if let Some(header_offset) = &self.header_offset {
15072 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15073 }
15074 prev
15075 }
15076 pub fn push_num(mut self, value: u32) -> Self {
15077 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15078 self.as_vec_mut().extend(value.to_be_bytes());
15079 self
15080 }
15081 pub fn push_priority(mut self, value: u32) -> Self {
15082 push_header(self.as_vec_mut(), 2u16, 4 as u16);
15083 self.as_vec_mut().extend(value.to_be_bytes());
15084 self
15085 }
15086 pub fn nested_devs(mut self) -> PushHookDevAttrs<Self> {
15087 let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
15088 PushHookDevAttrs {
15089 prev: Some(self),
15090 header_offset: Some(header_offset),
15091 }
15092 }
15093}
15094impl<Prev: Pusher> Drop for PushFlowtableHookAttrs<Prev> {
15095 fn drop(&mut self) {
15096 if let Some(prev) = &mut self.prev {
15097 if let Some(header_offset) = &self.header_offset {
15098 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15099 }
15100 }
15101 }
15102}
15103pub struct PushExprBitwiseAttrs<Prev: Pusher> {
15104 pub(crate) prev: Option<Prev>,
15105 pub(crate) header_offset: Option<usize>,
15106}
15107impl<Prev: Pusher> Pusher for PushExprBitwiseAttrs<Prev> {
15108 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15109 self.prev.as_mut().unwrap().as_vec_mut()
15110 }
15111 fn as_vec(&self) -> &Vec<u8> {
15112 self.prev.as_ref().unwrap().as_vec()
15113 }
15114}
15115impl<Prev: Pusher> PushExprBitwiseAttrs<Prev> {
15116 pub fn new(prev: Prev) -> Self {
15117 Self {
15118 prev: Some(prev),
15119 header_offset: None,
15120 }
15121 }
15122 pub fn end_nested(mut self) -> Prev {
15123 let mut prev = self.prev.take().unwrap();
15124 if let Some(header_offset) = &self.header_offset {
15125 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15126 }
15127 prev
15128 }
15129 pub fn push_sreg(mut self, value: u32) -> Self {
15130 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15131 self.as_vec_mut().extend(value.to_be_bytes());
15132 self
15133 }
15134 pub fn push_dreg(mut self, value: u32) -> Self {
15135 push_header(self.as_vec_mut(), 2u16, 4 as u16);
15136 self.as_vec_mut().extend(value.to_be_bytes());
15137 self
15138 }
15139 pub fn push_len(mut self, value: u32) -> Self {
15140 push_header(self.as_vec_mut(), 3u16, 4 as u16);
15141 self.as_vec_mut().extend(value.to_be_bytes());
15142 self
15143 }
15144 pub fn nested_mask(mut self) -> PushDataAttrs<Self> {
15145 let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
15146 PushDataAttrs {
15147 prev: Some(self),
15148 header_offset: Some(header_offset),
15149 }
15150 }
15151 pub fn nested_xor(mut self) -> PushDataAttrs<Self> {
15152 let header_offset = push_nested_header(self.as_vec_mut(), 5u16);
15153 PushDataAttrs {
15154 prev: Some(self),
15155 header_offset: Some(header_offset),
15156 }
15157 }
15158 #[doc = "Associated type: [`BitwiseOps`] (enum)"]
15159 pub fn push_op(mut self, value: u32) -> Self {
15160 push_header(self.as_vec_mut(), 6u16, 4 as u16);
15161 self.as_vec_mut().extend(value.to_be_bytes());
15162 self
15163 }
15164 pub fn nested_data(mut self) -> PushDataAttrs<Self> {
15165 let header_offset = push_nested_header(self.as_vec_mut(), 7u16);
15166 PushDataAttrs {
15167 prev: Some(self),
15168 header_offset: Some(header_offset),
15169 }
15170 }
15171}
15172impl<Prev: Pusher> Drop for PushExprBitwiseAttrs<Prev> {
15173 fn drop(&mut self) {
15174 if let Some(prev) = &mut self.prev {
15175 if let Some(header_offset) = &self.header_offset {
15176 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15177 }
15178 }
15179 }
15180}
15181pub struct PushExprCmpAttrs<Prev: Pusher> {
15182 pub(crate) prev: Option<Prev>,
15183 pub(crate) header_offset: Option<usize>,
15184}
15185impl<Prev: Pusher> Pusher for PushExprCmpAttrs<Prev> {
15186 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15187 self.prev.as_mut().unwrap().as_vec_mut()
15188 }
15189 fn as_vec(&self) -> &Vec<u8> {
15190 self.prev.as_ref().unwrap().as_vec()
15191 }
15192}
15193impl<Prev: Pusher> PushExprCmpAttrs<Prev> {
15194 pub fn new(prev: Prev) -> Self {
15195 Self {
15196 prev: Some(prev),
15197 header_offset: None,
15198 }
15199 }
15200 pub fn end_nested(mut self) -> Prev {
15201 let mut prev = self.prev.take().unwrap();
15202 if let Some(header_offset) = &self.header_offset {
15203 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15204 }
15205 prev
15206 }
15207 pub fn push_sreg(mut self, value: u32) -> Self {
15208 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15209 self.as_vec_mut().extend(value.to_be_bytes());
15210 self
15211 }
15212 #[doc = "Associated type: [`CmpOps`] (enum)"]
15213 pub fn push_op(mut self, value: u32) -> Self {
15214 push_header(self.as_vec_mut(), 2u16, 4 as u16);
15215 self.as_vec_mut().extend(value.to_be_bytes());
15216 self
15217 }
15218 pub fn nested_data(mut self) -> PushDataAttrs<Self> {
15219 let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
15220 PushDataAttrs {
15221 prev: Some(self),
15222 header_offset: Some(header_offset),
15223 }
15224 }
15225}
15226impl<Prev: Pusher> Drop for PushExprCmpAttrs<Prev> {
15227 fn drop(&mut self) {
15228 if let Some(prev) = &mut self.prev {
15229 if let Some(header_offset) = &self.header_offset {
15230 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15231 }
15232 }
15233 }
15234}
15235pub struct PushDataAttrs<Prev: Pusher> {
15236 pub(crate) prev: Option<Prev>,
15237 pub(crate) header_offset: Option<usize>,
15238}
15239impl<Prev: Pusher> Pusher for PushDataAttrs<Prev> {
15240 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15241 self.prev.as_mut().unwrap().as_vec_mut()
15242 }
15243 fn as_vec(&self) -> &Vec<u8> {
15244 self.prev.as_ref().unwrap().as_vec()
15245 }
15246}
15247impl<Prev: Pusher> PushDataAttrs<Prev> {
15248 pub fn new(prev: Prev) -> Self {
15249 Self {
15250 prev: Some(prev),
15251 header_offset: None,
15252 }
15253 }
15254 pub fn end_nested(mut self) -> Prev {
15255 let mut prev = self.prev.take().unwrap();
15256 if let Some(header_offset) = &self.header_offset {
15257 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15258 }
15259 prev
15260 }
15261 pub fn push_value(mut self, value: &[u8]) -> Self {
15262 push_header(self.as_vec_mut(), 1u16, value.len() as u16);
15263 self.as_vec_mut().extend(value);
15264 self
15265 }
15266 pub fn nested_verdict(mut self) -> PushVerdictAttrs<Self> {
15267 let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
15268 PushVerdictAttrs {
15269 prev: Some(self),
15270 header_offset: Some(header_offset),
15271 }
15272 }
15273}
15274impl<Prev: Pusher> Drop for PushDataAttrs<Prev> {
15275 fn drop(&mut self) {
15276 if let Some(prev) = &mut self.prev {
15277 if let Some(header_offset) = &self.header_offset {
15278 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15279 }
15280 }
15281 }
15282}
15283pub struct PushVerdictAttrs<Prev: Pusher> {
15284 pub(crate) prev: Option<Prev>,
15285 pub(crate) header_offset: Option<usize>,
15286}
15287impl<Prev: Pusher> Pusher for PushVerdictAttrs<Prev> {
15288 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15289 self.prev.as_mut().unwrap().as_vec_mut()
15290 }
15291 fn as_vec(&self) -> &Vec<u8> {
15292 self.prev.as_ref().unwrap().as_vec()
15293 }
15294}
15295impl<Prev: Pusher> PushVerdictAttrs<Prev> {
15296 pub fn new(prev: Prev) -> Self {
15297 Self {
15298 prev: Some(prev),
15299 header_offset: None,
15300 }
15301 }
15302 pub fn end_nested(mut self) -> Prev {
15303 let mut prev = self.prev.take().unwrap();
15304 if let Some(header_offset) = &self.header_offset {
15305 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15306 }
15307 prev
15308 }
15309 #[doc = "nf_tables verdict\n\nAssociated type: [`VerdictCode`] (enum)"]
15310 pub fn push_code(mut self, value: u32) -> Self {
15311 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15312 self.as_vec_mut().extend(value.to_be_bytes());
15313 self
15314 }
15315 #[doc = "jump target chain name\n"]
15316 pub fn push_chain(mut self, value: &CStr) -> Self {
15317 push_header(
15318 self.as_vec_mut(),
15319 2u16,
15320 value.to_bytes_with_nul().len() as u16,
15321 );
15322 self.as_vec_mut().extend(value.to_bytes_with_nul());
15323 self
15324 }
15325 #[doc = "jump target chain name\n"]
15326 pub fn push_chain_bytes(mut self, value: &[u8]) -> Self {
15327 push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
15328 self.as_vec_mut().extend(value);
15329 self.as_vec_mut().push(0);
15330 self
15331 }
15332 #[doc = "jump target chain ID\n"]
15333 pub fn push_chain_id(mut self, value: u32) -> Self {
15334 push_header(self.as_vec_mut(), 3u16, 4 as u16);
15335 self.as_vec_mut().extend(value.to_be_bytes());
15336 self
15337 }
15338}
15339impl<Prev: Pusher> Drop for PushVerdictAttrs<Prev> {
15340 fn drop(&mut self) {
15341 if let Some(prev) = &mut self.prev {
15342 if let Some(header_offset) = &self.header_offset {
15343 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15344 }
15345 }
15346 }
15347}
15348pub struct PushExprCounterAttrs<Prev: Pusher> {
15349 pub(crate) prev: Option<Prev>,
15350 pub(crate) header_offset: Option<usize>,
15351}
15352impl<Prev: Pusher> Pusher for PushExprCounterAttrs<Prev> {
15353 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15354 self.prev.as_mut().unwrap().as_vec_mut()
15355 }
15356 fn as_vec(&self) -> &Vec<u8> {
15357 self.prev.as_ref().unwrap().as_vec()
15358 }
15359}
15360impl<Prev: Pusher> PushExprCounterAttrs<Prev> {
15361 pub fn new(prev: Prev) -> Self {
15362 Self {
15363 prev: Some(prev),
15364 header_offset: None,
15365 }
15366 }
15367 pub fn end_nested(mut self) -> Prev {
15368 let mut prev = self.prev.take().unwrap();
15369 if let Some(header_offset) = &self.header_offset {
15370 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15371 }
15372 prev
15373 }
15374 #[doc = "Number of bytes\n"]
15375 pub fn push_bytes(mut self, value: u64) -> Self {
15376 push_header(self.as_vec_mut(), 1u16, 8 as u16);
15377 self.as_vec_mut().extend(value.to_be_bytes());
15378 self
15379 }
15380 #[doc = "Number of packets\n"]
15381 pub fn push_packets(mut self, value: u64) -> Self {
15382 push_header(self.as_vec_mut(), 2u16, 8 as u16);
15383 self.as_vec_mut().extend(value.to_be_bytes());
15384 self
15385 }
15386 pub fn push_pad(mut self, value: &[u8]) -> Self {
15387 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
15388 self.as_vec_mut().extend(value);
15389 self
15390 }
15391}
15392impl<Prev: Pusher> Drop for PushExprCounterAttrs<Prev> {
15393 fn drop(&mut self) {
15394 if let Some(prev) = &mut self.prev {
15395 if let Some(header_offset) = &self.header_offset {
15396 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15397 }
15398 }
15399 }
15400}
15401pub struct PushExprFibAttrs<Prev: Pusher> {
15402 pub(crate) prev: Option<Prev>,
15403 pub(crate) header_offset: Option<usize>,
15404}
15405impl<Prev: Pusher> Pusher for PushExprFibAttrs<Prev> {
15406 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15407 self.prev.as_mut().unwrap().as_vec_mut()
15408 }
15409 fn as_vec(&self) -> &Vec<u8> {
15410 self.prev.as_ref().unwrap().as_vec()
15411 }
15412}
15413impl<Prev: Pusher> PushExprFibAttrs<Prev> {
15414 pub fn new(prev: Prev) -> Self {
15415 Self {
15416 prev: Some(prev),
15417 header_offset: None,
15418 }
15419 }
15420 pub fn end_nested(mut self) -> Prev {
15421 let mut prev = self.prev.take().unwrap();
15422 if let Some(header_offset) = &self.header_offset {
15423 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15424 }
15425 prev
15426 }
15427 pub fn push_dreg(mut self, value: u32) -> Self {
15428 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15429 self.as_vec_mut().extend(value.to_be_bytes());
15430 self
15431 }
15432 #[doc = "Associated type: [`FibResult`] (enum)"]
15433 pub fn push_result(mut self, value: u32) -> Self {
15434 push_header(self.as_vec_mut(), 2u16, 4 as u16);
15435 self.as_vec_mut().extend(value.to_be_bytes());
15436 self
15437 }
15438 #[doc = "Associated type: [`FibFlags`] (enum)"]
15439 pub fn push_flags(mut self, value: u32) -> Self {
15440 push_header(self.as_vec_mut(), 3u16, 4 as u16);
15441 self.as_vec_mut().extend(value.to_be_bytes());
15442 self
15443 }
15444}
15445impl<Prev: Pusher> Drop for PushExprFibAttrs<Prev> {
15446 fn drop(&mut self) {
15447 if let Some(prev) = &mut self.prev {
15448 if let Some(header_offset) = &self.header_offset {
15449 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15450 }
15451 }
15452 }
15453}
15454pub struct PushExprCtAttrs<Prev: Pusher> {
15455 pub(crate) prev: Option<Prev>,
15456 pub(crate) header_offset: Option<usize>,
15457}
15458impl<Prev: Pusher> Pusher for PushExprCtAttrs<Prev> {
15459 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15460 self.prev.as_mut().unwrap().as_vec_mut()
15461 }
15462 fn as_vec(&self) -> &Vec<u8> {
15463 self.prev.as_ref().unwrap().as_vec()
15464 }
15465}
15466impl<Prev: Pusher> PushExprCtAttrs<Prev> {
15467 pub fn new(prev: Prev) -> Self {
15468 Self {
15469 prev: Some(prev),
15470 header_offset: None,
15471 }
15472 }
15473 pub fn end_nested(mut self) -> Prev {
15474 let mut prev = self.prev.take().unwrap();
15475 if let Some(header_offset) = &self.header_offset {
15476 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15477 }
15478 prev
15479 }
15480 pub fn push_dreg(mut self, value: u32) -> Self {
15481 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15482 self.as_vec_mut().extend(value.to_be_bytes());
15483 self
15484 }
15485 #[doc = "Associated type: [`CtKeys`] (enum)"]
15486 pub fn push_key(mut self, value: u32) -> Self {
15487 push_header(self.as_vec_mut(), 2u16, 4 as u16);
15488 self.as_vec_mut().extend(value.to_be_bytes());
15489 self
15490 }
15491 #[doc = "Associated type: [`CtDirection`] (enum)"]
15492 pub fn push_direction(mut self, value: u8) -> Self {
15493 push_header(self.as_vec_mut(), 3u16, 1 as u16);
15494 self.as_vec_mut().extend(value.to_ne_bytes());
15495 self
15496 }
15497 pub fn push_sreg(mut self, value: u32) -> Self {
15498 push_header(self.as_vec_mut(), 4u16, 4 as u16);
15499 self.as_vec_mut().extend(value.to_be_bytes());
15500 self
15501 }
15502}
15503impl<Prev: Pusher> Drop for PushExprCtAttrs<Prev> {
15504 fn drop(&mut self) {
15505 if let Some(prev) = &mut self.prev {
15506 if let Some(header_offset) = &self.header_offset {
15507 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15508 }
15509 }
15510 }
15511}
15512pub struct PushExprFlowOffloadAttrs<Prev: Pusher> {
15513 pub(crate) prev: Option<Prev>,
15514 pub(crate) header_offset: Option<usize>,
15515}
15516impl<Prev: Pusher> Pusher for PushExprFlowOffloadAttrs<Prev> {
15517 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15518 self.prev.as_mut().unwrap().as_vec_mut()
15519 }
15520 fn as_vec(&self) -> &Vec<u8> {
15521 self.prev.as_ref().unwrap().as_vec()
15522 }
15523}
15524impl<Prev: Pusher> PushExprFlowOffloadAttrs<Prev> {
15525 pub fn new(prev: Prev) -> Self {
15526 Self {
15527 prev: Some(prev),
15528 header_offset: None,
15529 }
15530 }
15531 pub fn end_nested(mut self) -> Prev {
15532 let mut prev = self.prev.take().unwrap();
15533 if let Some(header_offset) = &self.header_offset {
15534 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15535 }
15536 prev
15537 }
15538 #[doc = "Flow offload table name\n"]
15539 pub fn push_name(mut self, value: &CStr) -> Self {
15540 push_header(
15541 self.as_vec_mut(),
15542 1u16,
15543 value.to_bytes_with_nul().len() as u16,
15544 );
15545 self.as_vec_mut().extend(value.to_bytes_with_nul());
15546 self
15547 }
15548 #[doc = "Flow offload table name\n"]
15549 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
15550 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
15551 self.as_vec_mut().extend(value);
15552 self.as_vec_mut().push(0);
15553 self
15554 }
15555}
15556impl<Prev: Pusher> Drop for PushExprFlowOffloadAttrs<Prev> {
15557 fn drop(&mut self) {
15558 if let Some(prev) = &mut self.prev {
15559 if let Some(header_offset) = &self.header_offset {
15560 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15561 }
15562 }
15563 }
15564}
15565pub struct PushExprImmediateAttrs<Prev: Pusher> {
15566 pub(crate) prev: Option<Prev>,
15567 pub(crate) header_offset: Option<usize>,
15568}
15569impl<Prev: Pusher> Pusher for PushExprImmediateAttrs<Prev> {
15570 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15571 self.prev.as_mut().unwrap().as_vec_mut()
15572 }
15573 fn as_vec(&self) -> &Vec<u8> {
15574 self.prev.as_ref().unwrap().as_vec()
15575 }
15576}
15577impl<Prev: Pusher> PushExprImmediateAttrs<Prev> {
15578 pub fn new(prev: Prev) -> Self {
15579 Self {
15580 prev: Some(prev),
15581 header_offset: None,
15582 }
15583 }
15584 pub fn end_nested(mut self) -> Prev {
15585 let mut prev = self.prev.take().unwrap();
15586 if let Some(header_offset) = &self.header_offset {
15587 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15588 }
15589 prev
15590 }
15591 pub fn push_dreg(mut self, value: u32) -> Self {
15592 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15593 self.as_vec_mut().extend(value.to_be_bytes());
15594 self
15595 }
15596 pub fn nested_data(mut self) -> PushDataAttrs<Self> {
15597 let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
15598 PushDataAttrs {
15599 prev: Some(self),
15600 header_offset: Some(header_offset),
15601 }
15602 }
15603}
15604impl<Prev: Pusher> Drop for PushExprImmediateAttrs<Prev> {
15605 fn drop(&mut self) {
15606 if let Some(prev) = &mut self.prev {
15607 if let Some(header_offset) = &self.header_offset {
15608 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15609 }
15610 }
15611 }
15612}
15613pub struct PushExprLookupAttrs<Prev: Pusher> {
15614 pub(crate) prev: Option<Prev>,
15615 pub(crate) header_offset: Option<usize>,
15616}
15617impl<Prev: Pusher> Pusher for PushExprLookupAttrs<Prev> {
15618 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15619 self.prev.as_mut().unwrap().as_vec_mut()
15620 }
15621 fn as_vec(&self) -> &Vec<u8> {
15622 self.prev.as_ref().unwrap().as_vec()
15623 }
15624}
15625impl<Prev: Pusher> PushExprLookupAttrs<Prev> {
15626 pub fn new(prev: Prev) -> Self {
15627 Self {
15628 prev: Some(prev),
15629 header_offset: None,
15630 }
15631 }
15632 pub fn end_nested(mut self) -> Prev {
15633 let mut prev = self.prev.take().unwrap();
15634 if let Some(header_offset) = &self.header_offset {
15635 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15636 }
15637 prev
15638 }
15639 #[doc = "Name of set to use\n"]
15640 pub fn push_set(mut self, value: &CStr) -> Self {
15641 push_header(
15642 self.as_vec_mut(),
15643 1u16,
15644 value.to_bytes_with_nul().len() as u16,
15645 );
15646 self.as_vec_mut().extend(value.to_bytes_with_nul());
15647 self
15648 }
15649 #[doc = "Name of set to use\n"]
15650 pub fn push_set_bytes(mut self, value: &[u8]) -> Self {
15651 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
15652 self.as_vec_mut().extend(value);
15653 self.as_vec_mut().push(0);
15654 self
15655 }
15656 #[doc = "ID of set to use\n"]
15657 pub fn push_set_id(mut self, value: u32) -> Self {
15658 push_header(self.as_vec_mut(), 2u16, 4 as u16);
15659 self.as_vec_mut().extend(value.to_be_bytes());
15660 self
15661 }
15662 pub fn push_sreg(mut self, value: u32) -> Self {
15663 push_header(self.as_vec_mut(), 3u16, 4 as u16);
15664 self.as_vec_mut().extend(value.to_be_bytes());
15665 self
15666 }
15667 pub fn push_dreg(mut self, value: u32) -> Self {
15668 push_header(self.as_vec_mut(), 4u16, 4 as u16);
15669 self.as_vec_mut().extend(value.to_be_bytes());
15670 self
15671 }
15672 #[doc = "Associated type: [`LookupFlags`] (enum)"]
15673 pub fn push_flags(mut self, value: u32) -> Self {
15674 push_header(self.as_vec_mut(), 5u16, 4 as u16);
15675 self.as_vec_mut().extend(value.to_be_bytes());
15676 self
15677 }
15678}
15679impl<Prev: Pusher> Drop for PushExprLookupAttrs<Prev> {
15680 fn drop(&mut self) {
15681 if let Some(prev) = &mut self.prev {
15682 if let Some(header_offset) = &self.header_offset {
15683 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15684 }
15685 }
15686 }
15687}
15688pub struct PushExprMasqAttrs<Prev: Pusher> {
15689 pub(crate) prev: Option<Prev>,
15690 pub(crate) header_offset: Option<usize>,
15691}
15692impl<Prev: Pusher> Pusher for PushExprMasqAttrs<Prev> {
15693 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15694 self.prev.as_mut().unwrap().as_vec_mut()
15695 }
15696 fn as_vec(&self) -> &Vec<u8> {
15697 self.prev.as_ref().unwrap().as_vec()
15698 }
15699}
15700impl<Prev: Pusher> PushExprMasqAttrs<Prev> {
15701 pub fn new(prev: Prev) -> Self {
15702 Self {
15703 prev: Some(prev),
15704 header_offset: None,
15705 }
15706 }
15707 pub fn end_nested(mut self) -> Prev {
15708 let mut prev = self.prev.take().unwrap();
15709 if let Some(header_offset) = &self.header_offset {
15710 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15711 }
15712 prev
15713 }
15714 #[doc = "Associated type: [`NatRangeFlags`] (1 bit per enumeration)"]
15715 pub fn push_flags(mut self, value: u32) -> Self {
15716 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15717 self.as_vec_mut().extend(value.to_be_bytes());
15718 self
15719 }
15720 #[doc = "Associated type: [`Registers`] (enum)"]
15721 pub fn push_reg_proto_min(mut self, value: u32) -> Self {
15722 push_header(self.as_vec_mut(), 2u16, 4 as u16);
15723 self.as_vec_mut().extend(value.to_be_bytes());
15724 self
15725 }
15726 #[doc = "Associated type: [`Registers`] (enum)"]
15727 pub fn push_reg_proto_max(mut self, value: u32) -> Self {
15728 push_header(self.as_vec_mut(), 3u16, 4 as u16);
15729 self.as_vec_mut().extend(value.to_be_bytes());
15730 self
15731 }
15732}
15733impl<Prev: Pusher> Drop for PushExprMasqAttrs<Prev> {
15734 fn drop(&mut self) {
15735 if let Some(prev) = &mut self.prev {
15736 if let Some(header_offset) = &self.header_offset {
15737 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15738 }
15739 }
15740 }
15741}
15742pub struct PushExprMetaAttrs<Prev: Pusher> {
15743 pub(crate) prev: Option<Prev>,
15744 pub(crate) header_offset: Option<usize>,
15745}
15746impl<Prev: Pusher> Pusher for PushExprMetaAttrs<Prev> {
15747 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15748 self.prev.as_mut().unwrap().as_vec_mut()
15749 }
15750 fn as_vec(&self) -> &Vec<u8> {
15751 self.prev.as_ref().unwrap().as_vec()
15752 }
15753}
15754impl<Prev: Pusher> PushExprMetaAttrs<Prev> {
15755 pub fn new(prev: Prev) -> Self {
15756 Self {
15757 prev: Some(prev),
15758 header_offset: None,
15759 }
15760 }
15761 pub fn end_nested(mut self) -> Prev {
15762 let mut prev = self.prev.take().unwrap();
15763 if let Some(header_offset) = &self.header_offset {
15764 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15765 }
15766 prev
15767 }
15768 pub fn push_dreg(mut self, value: u32) -> Self {
15769 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15770 self.as_vec_mut().extend(value.to_be_bytes());
15771 self
15772 }
15773 #[doc = "Associated type: [`MetaKeys`] (enum)"]
15774 pub fn push_key(mut self, value: u32) -> Self {
15775 push_header(self.as_vec_mut(), 2u16, 4 as u16);
15776 self.as_vec_mut().extend(value.to_be_bytes());
15777 self
15778 }
15779 pub fn push_sreg(mut self, value: u32) -> Self {
15780 push_header(self.as_vec_mut(), 3u16, 4 as u16);
15781 self.as_vec_mut().extend(value.to_be_bytes());
15782 self
15783 }
15784}
15785impl<Prev: Pusher> Drop for PushExprMetaAttrs<Prev> {
15786 fn drop(&mut self) {
15787 if let Some(prev) = &mut self.prev {
15788 if let Some(header_offset) = &self.header_offset {
15789 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15790 }
15791 }
15792 }
15793}
15794pub struct PushExprNatAttrs<Prev: Pusher> {
15795 pub(crate) prev: Option<Prev>,
15796 pub(crate) header_offset: Option<usize>,
15797}
15798impl<Prev: Pusher> Pusher for PushExprNatAttrs<Prev> {
15799 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15800 self.prev.as_mut().unwrap().as_vec_mut()
15801 }
15802 fn as_vec(&self) -> &Vec<u8> {
15803 self.prev.as_ref().unwrap().as_vec()
15804 }
15805}
15806impl<Prev: Pusher> PushExprNatAttrs<Prev> {
15807 pub fn new(prev: Prev) -> Self {
15808 Self {
15809 prev: Some(prev),
15810 header_offset: None,
15811 }
15812 }
15813 pub fn end_nested(mut self) -> Prev {
15814 let mut prev = self.prev.take().unwrap();
15815 if let Some(header_offset) = &self.header_offset {
15816 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15817 }
15818 prev
15819 }
15820 pub fn push_type(mut self, value: u32) -> Self {
15821 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15822 self.as_vec_mut().extend(value.to_be_bytes());
15823 self
15824 }
15825 pub fn push_family(mut self, value: u32) -> Self {
15826 push_header(self.as_vec_mut(), 2u16, 4 as u16);
15827 self.as_vec_mut().extend(value.to_be_bytes());
15828 self
15829 }
15830 pub fn push_reg_addr_min(mut self, value: u32) -> Self {
15831 push_header(self.as_vec_mut(), 3u16, 4 as u16);
15832 self.as_vec_mut().extend(value.to_be_bytes());
15833 self
15834 }
15835 pub fn push_reg_addr_max(mut self, value: u32) -> Self {
15836 push_header(self.as_vec_mut(), 4u16, 4 as u16);
15837 self.as_vec_mut().extend(value.to_be_bytes());
15838 self
15839 }
15840 pub fn push_reg_proto_min(mut self, value: u32) -> Self {
15841 push_header(self.as_vec_mut(), 5u16, 4 as u16);
15842 self.as_vec_mut().extend(value.to_be_bytes());
15843 self
15844 }
15845 pub fn push_reg_proto_max(mut self, value: u32) -> Self {
15846 push_header(self.as_vec_mut(), 6u16, 4 as u16);
15847 self.as_vec_mut().extend(value.to_be_bytes());
15848 self
15849 }
15850 #[doc = "Associated type: [`NatRangeFlags`] (1 bit per enumeration)"]
15851 pub fn push_flags(mut self, value: u32) -> Self {
15852 push_header(self.as_vec_mut(), 7u16, 4 as u16);
15853 self.as_vec_mut().extend(value.to_be_bytes());
15854 self
15855 }
15856}
15857impl<Prev: Pusher> Drop for PushExprNatAttrs<Prev> {
15858 fn drop(&mut self) {
15859 if let Some(prev) = &mut self.prev {
15860 if let Some(header_offset) = &self.header_offset {
15861 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15862 }
15863 }
15864 }
15865}
15866pub struct PushExprPayloadAttrs<Prev: Pusher> {
15867 pub(crate) prev: Option<Prev>,
15868 pub(crate) header_offset: Option<usize>,
15869}
15870impl<Prev: Pusher> Pusher for PushExprPayloadAttrs<Prev> {
15871 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15872 self.prev.as_mut().unwrap().as_vec_mut()
15873 }
15874 fn as_vec(&self) -> &Vec<u8> {
15875 self.prev.as_ref().unwrap().as_vec()
15876 }
15877}
15878impl<Prev: Pusher> PushExprPayloadAttrs<Prev> {
15879 pub fn new(prev: Prev) -> Self {
15880 Self {
15881 prev: Some(prev),
15882 header_offset: None,
15883 }
15884 }
15885 pub fn end_nested(mut self) -> Prev {
15886 let mut prev = self.prev.take().unwrap();
15887 if let Some(header_offset) = &self.header_offset {
15888 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15889 }
15890 prev
15891 }
15892 #[doc = "destination register to load data into\n\nAssociated type: [`Registers`] (enum)"]
15893 pub fn push_dreg(mut self, value: u32) -> Self {
15894 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15895 self.as_vec_mut().extend(value.to_be_bytes());
15896 self
15897 }
15898 #[doc = "payload base\n\nAssociated type: [`PayloadBase`] (enum)"]
15899 pub fn push_base(mut self, value: u32) -> Self {
15900 push_header(self.as_vec_mut(), 2u16, 4 as u16);
15901 self.as_vec_mut().extend(value.to_be_bytes());
15902 self
15903 }
15904 #[doc = "payload offset relative to base\n"]
15905 pub fn push_offset(mut self, value: u32) -> Self {
15906 push_header(self.as_vec_mut(), 3u16, 4 as u16);
15907 self.as_vec_mut().extend(value.to_be_bytes());
15908 self
15909 }
15910 #[doc = "payload length\n"]
15911 pub fn push_len(mut self, value: u32) -> Self {
15912 push_header(self.as_vec_mut(), 4u16, 4 as u16);
15913 self.as_vec_mut().extend(value.to_be_bytes());
15914 self
15915 }
15916 #[doc = "source register to load data from\n\nAssociated type: [`Registers`] (enum)"]
15917 pub fn push_sreg(mut self, value: u32) -> Self {
15918 push_header(self.as_vec_mut(), 5u16, 4 as u16);
15919 self.as_vec_mut().extend(value.to_be_bytes());
15920 self
15921 }
15922 #[doc = "checksum type\n"]
15923 pub fn push_csum_type(mut self, value: u32) -> Self {
15924 push_header(self.as_vec_mut(), 6u16, 4 as u16);
15925 self.as_vec_mut().extend(value.to_be_bytes());
15926 self
15927 }
15928 #[doc = "checksum offset relative to base\n"]
15929 pub fn push_csum_offset(mut self, value: u32) -> Self {
15930 push_header(self.as_vec_mut(), 7u16, 4 as u16);
15931 self.as_vec_mut().extend(value.to_be_bytes());
15932 self
15933 }
15934 #[doc = "checksum flags\n"]
15935 pub fn push_csum_flags(mut self, value: u32) -> Self {
15936 push_header(self.as_vec_mut(), 8u16, 4 as u16);
15937 self.as_vec_mut().extend(value.to_be_bytes());
15938 self
15939 }
15940}
15941impl<Prev: Pusher> Drop for PushExprPayloadAttrs<Prev> {
15942 fn drop(&mut self) {
15943 if let Some(prev) = &mut self.prev {
15944 if let Some(header_offset) = &self.header_offset {
15945 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15946 }
15947 }
15948 }
15949}
15950pub struct PushExprRejectAttrs<Prev: Pusher> {
15951 pub(crate) prev: Option<Prev>,
15952 pub(crate) header_offset: Option<usize>,
15953}
15954impl<Prev: Pusher> Pusher for PushExprRejectAttrs<Prev> {
15955 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
15956 self.prev.as_mut().unwrap().as_vec_mut()
15957 }
15958 fn as_vec(&self) -> &Vec<u8> {
15959 self.prev.as_ref().unwrap().as_vec()
15960 }
15961}
15962impl<Prev: Pusher> PushExprRejectAttrs<Prev> {
15963 pub fn new(prev: Prev) -> Self {
15964 Self {
15965 prev: Some(prev),
15966 header_offset: None,
15967 }
15968 }
15969 pub fn end_nested(mut self) -> Prev {
15970 let mut prev = self.prev.take().unwrap();
15971 if let Some(header_offset) = &self.header_offset {
15972 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15973 }
15974 prev
15975 }
15976 #[doc = "Associated type: [`RejectTypes`] (enum)"]
15977 pub fn push_type(mut self, value: u32) -> Self {
15978 push_header(self.as_vec_mut(), 1u16, 4 as u16);
15979 self.as_vec_mut().extend(value.to_be_bytes());
15980 self
15981 }
15982 pub fn push_icmp_code(mut self, value: u8) -> Self {
15983 push_header(self.as_vec_mut(), 2u16, 1 as u16);
15984 self.as_vec_mut().extend(value.to_ne_bytes());
15985 self
15986 }
15987}
15988impl<Prev: Pusher> Drop for PushExprRejectAttrs<Prev> {
15989 fn drop(&mut self) {
15990 if let Some(prev) = &mut self.prev {
15991 if let Some(header_offset) = &self.header_offset {
15992 finalize_nested_header(prev.as_vec_mut(), *header_offset);
15993 }
15994 }
15995 }
15996}
15997pub struct PushExprTargetAttrs<Prev: Pusher> {
15998 pub(crate) prev: Option<Prev>,
15999 pub(crate) header_offset: Option<usize>,
16000}
16001impl<Prev: Pusher> Pusher for PushExprTargetAttrs<Prev> {
16002 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
16003 self.prev.as_mut().unwrap().as_vec_mut()
16004 }
16005 fn as_vec(&self) -> &Vec<u8> {
16006 self.prev.as_ref().unwrap().as_vec()
16007 }
16008}
16009impl<Prev: Pusher> PushExprTargetAttrs<Prev> {
16010 pub fn new(prev: Prev) -> Self {
16011 Self {
16012 prev: Some(prev),
16013 header_offset: None,
16014 }
16015 }
16016 pub fn end_nested(mut self) -> Prev {
16017 let mut prev = self.prev.take().unwrap();
16018 if let Some(header_offset) = &self.header_offset {
16019 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16020 }
16021 prev
16022 }
16023 pub fn push_name(mut self, value: &CStr) -> Self {
16024 push_header(
16025 self.as_vec_mut(),
16026 1u16,
16027 value.to_bytes_with_nul().len() as u16,
16028 );
16029 self.as_vec_mut().extend(value.to_bytes_with_nul());
16030 self
16031 }
16032 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
16033 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
16034 self.as_vec_mut().extend(value);
16035 self.as_vec_mut().push(0);
16036 self
16037 }
16038 pub fn push_rev(mut self, value: u32) -> Self {
16039 push_header(self.as_vec_mut(), 2u16, 4 as u16);
16040 self.as_vec_mut().extend(value.to_be_bytes());
16041 self
16042 }
16043 #[doc = "Grep for `static struct xt_target` in `linux/net/nftables`. This field\nis usually a struct:\n\n- Name\n- Revision number\n- IP version (4/6)\n- Size of provided struct\n"]
16044 pub fn push_info(mut self, value: &[u8]) -> Self {
16045 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
16046 self.as_vec_mut().extend(value);
16047 self
16048 }
16049}
16050impl<Prev: Pusher> Drop for PushExprTargetAttrs<Prev> {
16051 fn drop(&mut self) {
16052 if let Some(prev) = &mut self.prev {
16053 if let Some(header_offset) = &self.header_offset {
16054 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16055 }
16056 }
16057 }
16058}
16059pub struct PushExprTproxyAttrs<Prev: Pusher> {
16060 pub(crate) prev: Option<Prev>,
16061 pub(crate) header_offset: Option<usize>,
16062}
16063impl<Prev: Pusher> Pusher for PushExprTproxyAttrs<Prev> {
16064 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
16065 self.prev.as_mut().unwrap().as_vec_mut()
16066 }
16067 fn as_vec(&self) -> &Vec<u8> {
16068 self.prev.as_ref().unwrap().as_vec()
16069 }
16070}
16071impl<Prev: Pusher> PushExprTproxyAttrs<Prev> {
16072 pub fn new(prev: Prev) -> Self {
16073 Self {
16074 prev: Some(prev),
16075 header_offset: None,
16076 }
16077 }
16078 pub fn end_nested(mut self) -> Prev {
16079 let mut prev = self.prev.take().unwrap();
16080 if let Some(header_offset) = &self.header_offset {
16081 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16082 }
16083 prev
16084 }
16085 pub fn push_family(mut self, value: u32) -> Self {
16086 push_header(self.as_vec_mut(), 1u16, 4 as u16);
16087 self.as_vec_mut().extend(value.to_be_bytes());
16088 self
16089 }
16090 pub fn push_reg_addr(mut self, value: u32) -> Self {
16091 push_header(self.as_vec_mut(), 2u16, 4 as u16);
16092 self.as_vec_mut().extend(value.to_be_bytes());
16093 self
16094 }
16095 pub fn push_reg_port(mut self, value: u32) -> Self {
16096 push_header(self.as_vec_mut(), 3u16, 4 as u16);
16097 self.as_vec_mut().extend(value.to_be_bytes());
16098 self
16099 }
16100}
16101impl<Prev: Pusher> Drop for PushExprTproxyAttrs<Prev> {
16102 fn drop(&mut self) {
16103 if let Some(prev) = &mut self.prev {
16104 if let Some(header_offset) = &self.header_offset {
16105 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16106 }
16107 }
16108 }
16109}
16110pub struct PushExprObjrefAttrs<Prev: Pusher> {
16111 pub(crate) prev: Option<Prev>,
16112 pub(crate) header_offset: Option<usize>,
16113}
16114impl<Prev: Pusher> Pusher for PushExprObjrefAttrs<Prev> {
16115 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
16116 self.prev.as_mut().unwrap().as_vec_mut()
16117 }
16118 fn as_vec(&self) -> &Vec<u8> {
16119 self.prev.as_ref().unwrap().as_vec()
16120 }
16121}
16122impl<Prev: Pusher> PushExprObjrefAttrs<Prev> {
16123 pub fn new(prev: Prev) -> Self {
16124 Self {
16125 prev: Some(prev),
16126 header_offset: None,
16127 }
16128 }
16129 pub fn end_nested(mut self) -> Prev {
16130 let mut prev = self.prev.take().unwrap();
16131 if let Some(header_offset) = &self.header_offset {
16132 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16133 }
16134 prev
16135 }
16136 pub fn push_imm_type(mut self, value: u32) -> Self {
16137 push_header(self.as_vec_mut(), 1u16, 4 as u16);
16138 self.as_vec_mut().extend(value.to_be_bytes());
16139 self
16140 }
16141 #[doc = "object name\n"]
16142 pub fn push_imm_name(mut self, value: &CStr) -> Self {
16143 push_header(
16144 self.as_vec_mut(),
16145 2u16,
16146 value.to_bytes_with_nul().len() as u16,
16147 );
16148 self.as_vec_mut().extend(value.to_bytes_with_nul());
16149 self
16150 }
16151 #[doc = "object name\n"]
16152 pub fn push_imm_name_bytes(mut self, value: &[u8]) -> Self {
16153 push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
16154 self.as_vec_mut().extend(value);
16155 self.as_vec_mut().push(0);
16156 self
16157 }
16158 pub fn push_set_sreg(mut self, value: u32) -> Self {
16159 push_header(self.as_vec_mut(), 3u16, 4 as u16);
16160 self.as_vec_mut().extend(value.to_be_bytes());
16161 self
16162 }
16163 #[doc = "name of object map\n"]
16164 pub fn push_set_name(mut self, value: &CStr) -> Self {
16165 push_header(
16166 self.as_vec_mut(),
16167 4u16,
16168 value.to_bytes_with_nul().len() as u16,
16169 );
16170 self.as_vec_mut().extend(value.to_bytes_with_nul());
16171 self
16172 }
16173 #[doc = "name of object map\n"]
16174 pub fn push_set_name_bytes(mut self, value: &[u8]) -> Self {
16175 push_header(self.as_vec_mut(), 4u16, (value.len() + 1) as u16);
16176 self.as_vec_mut().extend(value);
16177 self.as_vec_mut().push(0);
16178 self
16179 }
16180 #[doc = "id of object map\n"]
16181 pub fn push_set_id(mut self, value: u32) -> Self {
16182 push_header(self.as_vec_mut(), 5u16, 4 as u16);
16183 self.as_vec_mut().extend(value.to_be_bytes());
16184 self
16185 }
16186}
16187impl<Prev: Pusher> Drop for PushExprObjrefAttrs<Prev> {
16188 fn drop(&mut self) {
16189 if let Some(prev) = &mut self.prev {
16190 if let Some(header_offset) = &self.header_offset {
16191 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16192 }
16193 }
16194 }
16195}
16196pub struct PushCompatTargetAttrs<Prev: Pusher> {
16197 pub(crate) prev: Option<Prev>,
16198 pub(crate) header_offset: Option<usize>,
16199}
16200impl<Prev: Pusher> Pusher for PushCompatTargetAttrs<Prev> {
16201 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
16202 self.prev.as_mut().unwrap().as_vec_mut()
16203 }
16204 fn as_vec(&self) -> &Vec<u8> {
16205 self.prev.as_ref().unwrap().as_vec()
16206 }
16207}
16208impl<Prev: Pusher> PushCompatTargetAttrs<Prev> {
16209 pub fn new(prev: Prev) -> Self {
16210 Self {
16211 prev: Some(prev),
16212 header_offset: None,
16213 }
16214 }
16215 pub fn end_nested(mut self) -> Prev {
16216 let mut prev = self.prev.take().unwrap();
16217 if let Some(header_offset) = &self.header_offset {
16218 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16219 }
16220 prev
16221 }
16222 pub fn push_name(mut self, value: &CStr) -> Self {
16223 push_header(
16224 self.as_vec_mut(),
16225 1u16,
16226 value.to_bytes_with_nul().len() as u16,
16227 );
16228 self.as_vec_mut().extend(value.to_bytes_with_nul());
16229 self
16230 }
16231 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
16232 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
16233 self.as_vec_mut().extend(value);
16234 self.as_vec_mut().push(0);
16235 self
16236 }
16237 pub fn push_rev(mut self, value: u32) -> Self {
16238 push_header(self.as_vec_mut(), 2u16, 4 as u16);
16239 self.as_vec_mut().extend(value.to_be_bytes());
16240 self
16241 }
16242 pub fn push_info(mut self, value: &[u8]) -> Self {
16243 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
16244 self.as_vec_mut().extend(value);
16245 self
16246 }
16247}
16248impl<Prev: Pusher> Drop for PushCompatTargetAttrs<Prev> {
16249 fn drop(&mut self) {
16250 if let Some(prev) = &mut self.prev {
16251 if let Some(header_offset) = &self.header_offset {
16252 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16253 }
16254 }
16255 }
16256}
16257pub struct PushCompatMatchAttrs<Prev: Pusher> {
16258 pub(crate) prev: Option<Prev>,
16259 pub(crate) header_offset: Option<usize>,
16260}
16261impl<Prev: Pusher> Pusher for PushCompatMatchAttrs<Prev> {
16262 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
16263 self.prev.as_mut().unwrap().as_vec_mut()
16264 }
16265 fn as_vec(&self) -> &Vec<u8> {
16266 self.prev.as_ref().unwrap().as_vec()
16267 }
16268}
16269impl<Prev: Pusher> PushCompatMatchAttrs<Prev> {
16270 pub fn new(prev: Prev) -> Self {
16271 Self {
16272 prev: Some(prev),
16273 header_offset: None,
16274 }
16275 }
16276 pub fn end_nested(mut self) -> Prev {
16277 let mut prev = self.prev.take().unwrap();
16278 if let Some(header_offset) = &self.header_offset {
16279 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16280 }
16281 prev
16282 }
16283 pub fn push_name(mut self, value: &CStr) -> Self {
16284 push_header(
16285 self.as_vec_mut(),
16286 1u16,
16287 value.to_bytes_with_nul().len() as u16,
16288 );
16289 self.as_vec_mut().extend(value.to_bytes_with_nul());
16290 self
16291 }
16292 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
16293 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
16294 self.as_vec_mut().extend(value);
16295 self.as_vec_mut().push(0);
16296 self
16297 }
16298 pub fn push_rev(mut self, value: u32) -> Self {
16299 push_header(self.as_vec_mut(), 2u16, 4 as u16);
16300 self.as_vec_mut().extend(value.to_be_bytes());
16301 self
16302 }
16303 pub fn push_info(mut self, value: &[u8]) -> Self {
16304 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
16305 self.as_vec_mut().extend(value);
16306 self
16307 }
16308}
16309impl<Prev: Pusher> Drop for PushCompatMatchAttrs<Prev> {
16310 fn drop(&mut self) {
16311 if let Some(prev) = &mut self.prev {
16312 if let Some(header_offset) = &self.header_offset {
16313 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16314 }
16315 }
16316 }
16317}
16318pub struct PushCompatAttrs<Prev: Pusher> {
16319 pub(crate) prev: Option<Prev>,
16320 pub(crate) header_offset: Option<usize>,
16321}
16322impl<Prev: Pusher> Pusher for PushCompatAttrs<Prev> {
16323 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
16324 self.prev.as_mut().unwrap().as_vec_mut()
16325 }
16326 fn as_vec(&self) -> &Vec<u8> {
16327 self.prev.as_ref().unwrap().as_vec()
16328 }
16329}
16330impl<Prev: Pusher> PushCompatAttrs<Prev> {
16331 pub fn new(prev: Prev) -> Self {
16332 Self {
16333 prev: Some(prev),
16334 header_offset: None,
16335 }
16336 }
16337 pub fn end_nested(mut self) -> Prev {
16338 let mut prev = self.prev.take().unwrap();
16339 if let Some(header_offset) = &self.header_offset {
16340 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16341 }
16342 prev
16343 }
16344 pub fn push_name(mut self, value: &CStr) -> Self {
16345 push_header(
16346 self.as_vec_mut(),
16347 1u16,
16348 value.to_bytes_with_nul().len() as u16,
16349 );
16350 self.as_vec_mut().extend(value.to_bytes_with_nul());
16351 self
16352 }
16353 pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
16354 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
16355 self.as_vec_mut().extend(value);
16356 self.as_vec_mut().push(0);
16357 self
16358 }
16359 pub fn push_rev(mut self, value: u32) -> Self {
16360 push_header(self.as_vec_mut(), 2u16, 4 as u16);
16361 self.as_vec_mut().extend(value.to_be_bytes());
16362 self
16363 }
16364 pub fn push_type(mut self, value: u32) -> Self {
16365 push_header(self.as_vec_mut(), 3u16, 4 as u16);
16366 self.as_vec_mut().extend(value.to_be_bytes());
16367 self
16368 }
16369}
16370impl<Prev: Pusher> Drop for PushCompatAttrs<Prev> {
16371 fn drop(&mut self) {
16372 if let Some(prev) = &mut self.prev {
16373 if let Some(header_offset) = &self.header_offset {
16374 finalize_nested_header(prev.as_vec_mut(), *header_offset);
16375 }
16376 }
16377 }
16378}
16379#[doc = "Start a batch of operations\n\nRequest attributes:\n- [.push_genid()](PushBatchAttrs::push_genid)\n\nReply attributes:\n- [.get_genid()](IterableBatchAttrs::get_genid)\n\n"]
16380#[derive(Debug)]
16381pub struct OpBatchBeginDo<'r> {
16382 request: Request<'r>,
16383}
16384impl<'r> OpBatchBeginDo<'r> {
16385 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
16386 Self::write_header(request.buf_mut(), header);
16387 Self { request: request }
16388 }
16389 pub fn encode_request<'buf>(
16390 buf: &'buf mut Vec<u8>,
16391 header: &Nfgenmsg,
16392 ) -> PushBatchAttrs<&'buf mut Vec<u8>> {
16393 Self::write_header(buf, header);
16394 PushBatchAttrs::new(buf)
16395 }
16396 pub fn encode(&mut self) -> PushBatchAttrs<&mut Vec<u8>> {
16397 PushBatchAttrs::new(self.request.buf_mut())
16398 }
16399 pub fn into_encoder(self) -> PushBatchAttrs<RequestBuf<'r>> {
16400 PushBatchAttrs::new(self.request.buf)
16401 }
16402 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableBatchAttrs<'a>) {
16403 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
16404 (
16405 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
16406 IterableBatchAttrs::with_loc(attrs, buf.as_ptr() as usize),
16407 )
16408 }
16409 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
16410 prev.as_vec_mut().extend(header.as_slice());
16411 }
16412}
16413impl NetlinkRequest for OpBatchBeginDo<'_> {
16414 fn protocol(&self) -> Protocol {
16415 Protocol::Raw {
16416 protonum: 12u16,
16417 request_type: 16u16,
16418 }
16419 }
16420 fn flags(&self) -> u16 {
16421 self.request.flags
16422 }
16423 fn payload(&self) -> &[u8] {
16424 self.request.buf()
16425 }
16426 type ReplyType<'buf> = (Nfgenmsg, IterableBatchAttrs<'buf>);
16427 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16428 Self::decode_request(buf)
16429 }
16430 fn lookup(
16431 buf: &[u8],
16432 offset: usize,
16433 missing_type: Option<u16>,
16434 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16435 Self::decode_request(buf)
16436 .1
16437 .lookup_attr(offset, missing_type)
16438 }
16439}
16440#[doc = "Finish a batch of operations\n\nRequest attributes:\n- [.push_genid()](PushBatchAttrs::push_genid)\n\n"]
16441#[derive(Debug)]
16442pub struct OpBatchEndDo<'r> {
16443 request: Request<'r>,
16444}
16445impl<'r> OpBatchEndDo<'r> {
16446 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
16447 Self::write_header(request.buf_mut(), header);
16448 Self { request: request }
16449 }
16450 pub fn encode_request<'buf>(
16451 buf: &'buf mut Vec<u8>,
16452 header: &Nfgenmsg,
16453 ) -> PushBatchAttrs<&'buf mut Vec<u8>> {
16454 Self::write_header(buf, header);
16455 PushBatchAttrs::new(buf)
16456 }
16457 pub fn encode(&mut self) -> PushBatchAttrs<&mut Vec<u8>> {
16458 PushBatchAttrs::new(self.request.buf_mut())
16459 }
16460 pub fn into_encoder(self) -> PushBatchAttrs<RequestBuf<'r>> {
16461 PushBatchAttrs::new(self.request.buf)
16462 }
16463 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableBatchAttrs<'a>) {
16464 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
16465 (
16466 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
16467 IterableBatchAttrs::with_loc(attrs, buf.as_ptr() as usize),
16468 )
16469 }
16470 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
16471 prev.as_vec_mut().extend(header.as_slice());
16472 }
16473}
16474impl NetlinkRequest for OpBatchEndDo<'_> {
16475 fn protocol(&self) -> Protocol {
16476 Protocol::Raw {
16477 protonum: 12u16,
16478 request_type: 17u16,
16479 }
16480 }
16481 fn flags(&self) -> u16 {
16482 self.request.flags
16483 }
16484 fn payload(&self) -> &[u8] {
16485 self.request.buf()
16486 }
16487 type ReplyType<'buf> = (Nfgenmsg, IterableBatchAttrs<'buf>);
16488 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16489 Self::decode_request(buf)
16490 }
16491 fn lookup(
16492 buf: &[u8],
16493 offset: usize,
16494 missing_type: Option<u16>,
16495 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16496 Self::decode_request(buf)
16497 .1
16498 .lookup_attr(offset, missing_type)
16499 }
16500}
16501#[doc = "Create a new table.\n\nRequest attributes:\n- [.push_name()](PushTableAttrs::push_name)\n- [.push_flags()](PushTableAttrs::push_flags)\n- [.push_userdata()](PushTableAttrs::push_userdata)\n\n"]
16502#[derive(Debug)]
16503pub struct OpNewtableDo<'r> {
16504 request: Request<'r>,
16505}
16506impl<'r> OpNewtableDo<'r> {
16507 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
16508 Self::write_header(request.buf_mut(), header);
16509 Self { request: request }
16510 }
16511 pub fn encode_request<'buf>(
16512 buf: &'buf mut Vec<u8>,
16513 header: &Nfgenmsg,
16514 ) -> PushTableAttrs<&'buf mut Vec<u8>> {
16515 Self::write_header(buf, header);
16516 PushTableAttrs::new(buf)
16517 }
16518 pub fn encode(&mut self) -> PushTableAttrs<&mut Vec<u8>> {
16519 PushTableAttrs::new(self.request.buf_mut())
16520 }
16521 pub fn into_encoder(self) -> PushTableAttrs<RequestBuf<'r>> {
16522 PushTableAttrs::new(self.request.buf)
16523 }
16524 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableTableAttrs<'a>) {
16525 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
16526 (
16527 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
16528 IterableTableAttrs::with_loc(attrs, buf.as_ptr() as usize),
16529 )
16530 }
16531 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
16532 prev.as_vec_mut().extend(header.as_slice());
16533 }
16534}
16535impl NetlinkRequest for OpNewtableDo<'_> {
16536 fn protocol(&self) -> Protocol {
16537 Protocol::Raw {
16538 protonum: 12u16,
16539 request_type: 2560u16,
16540 }
16541 }
16542 fn flags(&self) -> u16 {
16543 self.request.flags
16544 }
16545 fn payload(&self) -> &[u8] {
16546 self.request.buf()
16547 }
16548 type ReplyType<'buf> = (Nfgenmsg, IterableTableAttrs<'buf>);
16549 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16550 Self::decode_request(buf)
16551 }
16552 fn lookup(
16553 buf: &[u8],
16554 offset: usize,
16555 missing_type: Option<u16>,
16556 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16557 Self::decode_request(buf)
16558 .1
16559 .lookup_attr(offset, missing_type)
16560 }
16561}
16562#[doc = "Get / dump tables.\n\nReply attributes:\n- [.get_name()](IterableTableAttrs::get_name)\n- [.get_flags()](IterableTableAttrs::get_flags)\n- [.get_use()](IterableTableAttrs::get_use)\n- [.get_handle()](IterableTableAttrs::get_handle)\n- [.get_userdata()](IterableTableAttrs::get_userdata)\n- [.get_owner()](IterableTableAttrs::get_owner)\n\n"]
16563#[derive(Debug)]
16564pub struct OpGettableDump<'r> {
16565 request: Request<'r>,
16566}
16567impl<'r> OpGettableDump<'r> {
16568 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
16569 Self::write_header(request.buf_mut(), header);
16570 Self {
16571 request: request.set_dump(),
16572 }
16573 }
16574 pub fn encode_request<'buf>(
16575 buf: &'buf mut Vec<u8>,
16576 header: &Nfgenmsg,
16577 ) -> PushTableAttrs<&'buf mut Vec<u8>> {
16578 Self::write_header(buf, header);
16579 PushTableAttrs::new(buf)
16580 }
16581 pub fn encode(&mut self) -> PushTableAttrs<&mut Vec<u8>> {
16582 PushTableAttrs::new(self.request.buf_mut())
16583 }
16584 pub fn into_encoder(self) -> PushTableAttrs<RequestBuf<'r>> {
16585 PushTableAttrs::new(self.request.buf)
16586 }
16587 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableTableAttrs<'a>) {
16588 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
16589 (
16590 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
16591 IterableTableAttrs::with_loc(attrs, buf.as_ptr() as usize),
16592 )
16593 }
16594 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
16595 prev.as_vec_mut().extend(header.as_slice());
16596 }
16597}
16598impl NetlinkRequest for OpGettableDump<'_> {
16599 fn protocol(&self) -> Protocol {
16600 Protocol::Raw {
16601 protonum: 12u16,
16602 request_type: 2561u16,
16603 }
16604 }
16605 fn flags(&self) -> u16 {
16606 self.request.flags
16607 }
16608 fn payload(&self) -> &[u8] {
16609 self.request.buf()
16610 }
16611 type ReplyType<'buf> = (Nfgenmsg, IterableTableAttrs<'buf>);
16612 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16613 Self::decode_request(buf)
16614 }
16615 fn lookup(
16616 buf: &[u8],
16617 offset: usize,
16618 missing_type: Option<u16>,
16619 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16620 Self::decode_request(buf)
16621 .1
16622 .lookup_attr(offset, missing_type)
16623 }
16624}
16625#[doc = "Get / dump tables.\n\nRequest attributes:\n- [.push_name()](PushTableAttrs::push_name)\n\nReply attributes:\n- [.get_name()](IterableTableAttrs::get_name)\n- [.get_flags()](IterableTableAttrs::get_flags)\n- [.get_use()](IterableTableAttrs::get_use)\n- [.get_handle()](IterableTableAttrs::get_handle)\n- [.get_userdata()](IterableTableAttrs::get_userdata)\n- [.get_owner()](IterableTableAttrs::get_owner)\n\n"]
16626#[derive(Debug)]
16627pub struct OpGettableDo<'r> {
16628 request: Request<'r>,
16629}
16630impl<'r> OpGettableDo<'r> {
16631 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
16632 Self::write_header(request.buf_mut(), header);
16633 Self { request: request }
16634 }
16635 pub fn encode_request<'buf>(
16636 buf: &'buf mut Vec<u8>,
16637 header: &Nfgenmsg,
16638 ) -> PushTableAttrs<&'buf mut Vec<u8>> {
16639 Self::write_header(buf, header);
16640 PushTableAttrs::new(buf)
16641 }
16642 pub fn encode(&mut self) -> PushTableAttrs<&mut Vec<u8>> {
16643 PushTableAttrs::new(self.request.buf_mut())
16644 }
16645 pub fn into_encoder(self) -> PushTableAttrs<RequestBuf<'r>> {
16646 PushTableAttrs::new(self.request.buf)
16647 }
16648 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableTableAttrs<'a>) {
16649 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
16650 (
16651 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
16652 IterableTableAttrs::with_loc(attrs, buf.as_ptr() as usize),
16653 )
16654 }
16655 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
16656 prev.as_vec_mut().extend(header.as_slice());
16657 }
16658}
16659impl NetlinkRequest for OpGettableDo<'_> {
16660 fn protocol(&self) -> Protocol {
16661 Protocol::Raw {
16662 protonum: 12u16,
16663 request_type: 2561u16,
16664 }
16665 }
16666 fn flags(&self) -> u16 {
16667 self.request.flags
16668 }
16669 fn payload(&self) -> &[u8] {
16670 self.request.buf()
16671 }
16672 type ReplyType<'buf> = (Nfgenmsg, IterableTableAttrs<'buf>);
16673 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16674 Self::decode_request(buf)
16675 }
16676 fn lookup(
16677 buf: &[u8],
16678 offset: usize,
16679 missing_type: Option<u16>,
16680 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16681 Self::decode_request(buf)
16682 .1
16683 .lookup_attr(offset, missing_type)
16684 }
16685}
16686#[doc = "Delete an existing table.\n\nRequest attributes:\n- [.push_name()](PushTableAttrs::push_name)\n- [.push_handle()](PushTableAttrs::push_handle)\n\n"]
16687#[derive(Debug)]
16688pub struct OpDeltableDo<'r> {
16689 request: Request<'r>,
16690}
16691impl<'r> OpDeltableDo<'r> {
16692 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
16693 Self::write_header(request.buf_mut(), header);
16694 Self { request: request }
16695 }
16696 pub fn encode_request<'buf>(
16697 buf: &'buf mut Vec<u8>,
16698 header: &Nfgenmsg,
16699 ) -> PushTableAttrs<&'buf mut Vec<u8>> {
16700 Self::write_header(buf, header);
16701 PushTableAttrs::new(buf)
16702 }
16703 pub fn encode(&mut self) -> PushTableAttrs<&mut Vec<u8>> {
16704 PushTableAttrs::new(self.request.buf_mut())
16705 }
16706 pub fn into_encoder(self) -> PushTableAttrs<RequestBuf<'r>> {
16707 PushTableAttrs::new(self.request.buf)
16708 }
16709 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableTableAttrs<'a>) {
16710 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
16711 (
16712 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
16713 IterableTableAttrs::with_loc(attrs, buf.as_ptr() as usize),
16714 )
16715 }
16716 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
16717 prev.as_vec_mut().extend(header.as_slice());
16718 }
16719}
16720impl NetlinkRequest for OpDeltableDo<'_> {
16721 fn protocol(&self) -> Protocol {
16722 Protocol::Raw {
16723 protonum: 12u16,
16724 request_type: 2562u16,
16725 }
16726 }
16727 fn flags(&self) -> u16 {
16728 self.request.flags
16729 }
16730 fn payload(&self) -> &[u8] {
16731 self.request.buf()
16732 }
16733 type ReplyType<'buf> = (Nfgenmsg, IterableTableAttrs<'buf>);
16734 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16735 Self::decode_request(buf)
16736 }
16737 fn lookup(
16738 buf: &[u8],
16739 offset: usize,
16740 missing_type: Option<u16>,
16741 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16742 Self::decode_request(buf)
16743 .1
16744 .lookup_attr(offset, missing_type)
16745 }
16746}
16747#[doc = "Delete an existing table with destroy semantics (ignoring ENOENT\nerrors).\n\nRequest attributes:\n- [.push_name()](PushTableAttrs::push_name)\n- [.push_handle()](PushTableAttrs::push_handle)\n\n"]
16748#[derive(Debug)]
16749pub struct OpDestroytableDo<'r> {
16750 request: Request<'r>,
16751}
16752impl<'r> OpDestroytableDo<'r> {
16753 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
16754 Self::write_header(request.buf_mut(), header);
16755 Self { request: request }
16756 }
16757 pub fn encode_request<'buf>(
16758 buf: &'buf mut Vec<u8>,
16759 header: &Nfgenmsg,
16760 ) -> PushTableAttrs<&'buf mut Vec<u8>> {
16761 Self::write_header(buf, header);
16762 PushTableAttrs::new(buf)
16763 }
16764 pub fn encode(&mut self) -> PushTableAttrs<&mut Vec<u8>> {
16765 PushTableAttrs::new(self.request.buf_mut())
16766 }
16767 pub fn into_encoder(self) -> PushTableAttrs<RequestBuf<'r>> {
16768 PushTableAttrs::new(self.request.buf)
16769 }
16770 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableTableAttrs<'a>) {
16771 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
16772 (
16773 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
16774 IterableTableAttrs::with_loc(attrs, buf.as_ptr() as usize),
16775 )
16776 }
16777 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
16778 prev.as_vec_mut().extend(header.as_slice());
16779 }
16780}
16781impl NetlinkRequest for OpDestroytableDo<'_> {
16782 fn protocol(&self) -> Protocol {
16783 Protocol::Raw {
16784 protonum: 12u16,
16785 request_type: 2586u16,
16786 }
16787 }
16788 fn flags(&self) -> u16 {
16789 self.request.flags
16790 }
16791 fn payload(&self) -> &[u8] {
16792 self.request.buf()
16793 }
16794 type ReplyType<'buf> = (Nfgenmsg, IterableTableAttrs<'buf>);
16795 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16796 Self::decode_request(buf)
16797 }
16798 fn lookup(
16799 buf: &[u8],
16800 offset: usize,
16801 missing_type: Option<u16>,
16802 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16803 Self::decode_request(buf)
16804 .1
16805 .lookup_attr(offset, missing_type)
16806 }
16807}
16808#[doc = "Create a new chain.\n\nRequest attributes:\n- [.push_table()](PushChainAttrs::push_table)\n- [.push_handle()](PushChainAttrs::push_handle)\n- [.push_name()](PushChainAttrs::push_name)\n- [.nested_hook()](PushChainAttrs::nested_hook)\n- [.push_policy()](PushChainAttrs::push_policy)\n- [.push_type()](PushChainAttrs::push_type)\n- [.nested_counters()](PushChainAttrs::nested_counters)\n- [.push_flags()](PushChainAttrs::push_flags)\n- [.push_userdata()](PushChainAttrs::push_userdata)\n\n"]
16809#[derive(Debug)]
16810pub struct OpNewchainDo<'r> {
16811 request: Request<'r>,
16812}
16813impl<'r> OpNewchainDo<'r> {
16814 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
16815 Self::write_header(request.buf_mut(), header);
16816 Self { request: request }
16817 }
16818 pub fn encode_request<'buf>(
16819 buf: &'buf mut Vec<u8>,
16820 header: &Nfgenmsg,
16821 ) -> PushChainAttrs<&'buf mut Vec<u8>> {
16822 Self::write_header(buf, header);
16823 PushChainAttrs::new(buf)
16824 }
16825 pub fn encode(&mut self) -> PushChainAttrs<&mut Vec<u8>> {
16826 PushChainAttrs::new(self.request.buf_mut())
16827 }
16828 pub fn into_encoder(self) -> PushChainAttrs<RequestBuf<'r>> {
16829 PushChainAttrs::new(self.request.buf)
16830 }
16831 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableChainAttrs<'a>) {
16832 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
16833 (
16834 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
16835 IterableChainAttrs::with_loc(attrs, buf.as_ptr() as usize),
16836 )
16837 }
16838 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
16839 prev.as_vec_mut().extend(header.as_slice());
16840 }
16841}
16842impl NetlinkRequest for OpNewchainDo<'_> {
16843 fn protocol(&self) -> Protocol {
16844 Protocol::Raw {
16845 protonum: 12u16,
16846 request_type: 2563u16,
16847 }
16848 }
16849 fn flags(&self) -> u16 {
16850 self.request.flags
16851 }
16852 fn payload(&self) -> &[u8] {
16853 self.request.buf()
16854 }
16855 type ReplyType<'buf> = (Nfgenmsg, IterableChainAttrs<'buf>);
16856 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16857 Self::decode_request(buf)
16858 }
16859 fn lookup(
16860 buf: &[u8],
16861 offset: usize,
16862 missing_type: Option<u16>,
16863 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16864 Self::decode_request(buf)
16865 .1
16866 .lookup_attr(offset, missing_type)
16867 }
16868}
16869#[doc = "Get / dump chains.\n\nReply attributes:\n- [.get_table()](IterableChainAttrs::get_table)\n- [.get_handle()](IterableChainAttrs::get_handle)\n- [.get_name()](IterableChainAttrs::get_name)\n- [.get_hook()](IterableChainAttrs::get_hook)\n- [.get_policy()](IterableChainAttrs::get_policy)\n- [.get_use()](IterableChainAttrs::get_use)\n- [.get_type()](IterableChainAttrs::get_type)\n- [.get_counters()](IterableChainAttrs::get_counters)\n- [.get_flags()](IterableChainAttrs::get_flags)\n- [.get_id()](IterableChainAttrs::get_id)\n- [.get_userdata()](IterableChainAttrs::get_userdata)\n\n"]
16870#[derive(Debug)]
16871pub struct OpGetchainDump<'r> {
16872 request: Request<'r>,
16873}
16874impl<'r> OpGetchainDump<'r> {
16875 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
16876 Self::write_header(request.buf_mut(), header);
16877 Self {
16878 request: request.set_dump(),
16879 }
16880 }
16881 pub fn encode_request<'buf>(
16882 buf: &'buf mut Vec<u8>,
16883 header: &Nfgenmsg,
16884 ) -> PushChainAttrs<&'buf mut Vec<u8>> {
16885 Self::write_header(buf, header);
16886 PushChainAttrs::new(buf)
16887 }
16888 pub fn encode(&mut self) -> PushChainAttrs<&mut Vec<u8>> {
16889 PushChainAttrs::new(self.request.buf_mut())
16890 }
16891 pub fn into_encoder(self) -> PushChainAttrs<RequestBuf<'r>> {
16892 PushChainAttrs::new(self.request.buf)
16893 }
16894 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableChainAttrs<'a>) {
16895 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
16896 (
16897 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
16898 IterableChainAttrs::with_loc(attrs, buf.as_ptr() as usize),
16899 )
16900 }
16901 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
16902 prev.as_vec_mut().extend(header.as_slice());
16903 }
16904}
16905impl NetlinkRequest for OpGetchainDump<'_> {
16906 fn protocol(&self) -> Protocol {
16907 Protocol::Raw {
16908 protonum: 12u16,
16909 request_type: 2564u16,
16910 }
16911 }
16912 fn flags(&self) -> u16 {
16913 self.request.flags
16914 }
16915 fn payload(&self) -> &[u8] {
16916 self.request.buf()
16917 }
16918 type ReplyType<'buf> = (Nfgenmsg, IterableChainAttrs<'buf>);
16919 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16920 Self::decode_request(buf)
16921 }
16922 fn lookup(
16923 buf: &[u8],
16924 offset: usize,
16925 missing_type: Option<u16>,
16926 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16927 Self::decode_request(buf)
16928 .1
16929 .lookup_attr(offset, missing_type)
16930 }
16931}
16932#[doc = "Get / dump chains.\n\nRequest attributes:\n- [.push_table()](PushChainAttrs::push_table)\n- [.push_name()](PushChainAttrs::push_name)\n\nReply attributes:\n- [.get_table()](IterableChainAttrs::get_table)\n- [.get_handle()](IterableChainAttrs::get_handle)\n- [.get_name()](IterableChainAttrs::get_name)\n- [.get_hook()](IterableChainAttrs::get_hook)\n- [.get_policy()](IterableChainAttrs::get_policy)\n- [.get_use()](IterableChainAttrs::get_use)\n- [.get_type()](IterableChainAttrs::get_type)\n- [.get_counters()](IterableChainAttrs::get_counters)\n- [.get_flags()](IterableChainAttrs::get_flags)\n- [.get_id()](IterableChainAttrs::get_id)\n- [.get_userdata()](IterableChainAttrs::get_userdata)\n\n"]
16933#[derive(Debug)]
16934pub struct OpGetchainDo<'r> {
16935 request: Request<'r>,
16936}
16937impl<'r> OpGetchainDo<'r> {
16938 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
16939 Self::write_header(request.buf_mut(), header);
16940 Self { request: request }
16941 }
16942 pub fn encode_request<'buf>(
16943 buf: &'buf mut Vec<u8>,
16944 header: &Nfgenmsg,
16945 ) -> PushChainAttrs<&'buf mut Vec<u8>> {
16946 Self::write_header(buf, header);
16947 PushChainAttrs::new(buf)
16948 }
16949 pub fn encode(&mut self) -> PushChainAttrs<&mut Vec<u8>> {
16950 PushChainAttrs::new(self.request.buf_mut())
16951 }
16952 pub fn into_encoder(self) -> PushChainAttrs<RequestBuf<'r>> {
16953 PushChainAttrs::new(self.request.buf)
16954 }
16955 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableChainAttrs<'a>) {
16956 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
16957 (
16958 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
16959 IterableChainAttrs::with_loc(attrs, buf.as_ptr() as usize),
16960 )
16961 }
16962 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
16963 prev.as_vec_mut().extend(header.as_slice());
16964 }
16965}
16966impl NetlinkRequest for OpGetchainDo<'_> {
16967 fn protocol(&self) -> Protocol {
16968 Protocol::Raw {
16969 protonum: 12u16,
16970 request_type: 2564u16,
16971 }
16972 }
16973 fn flags(&self) -> u16 {
16974 self.request.flags
16975 }
16976 fn payload(&self) -> &[u8] {
16977 self.request.buf()
16978 }
16979 type ReplyType<'buf> = (Nfgenmsg, IterableChainAttrs<'buf>);
16980 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16981 Self::decode_request(buf)
16982 }
16983 fn lookup(
16984 buf: &[u8],
16985 offset: usize,
16986 missing_type: Option<u16>,
16987 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16988 Self::decode_request(buf)
16989 .1
16990 .lookup_attr(offset, missing_type)
16991 }
16992}
16993#[doc = "Delete an existing chain.\n\nRequest attributes:\n- [.push_table()](PushChainAttrs::push_table)\n- [.push_handle()](PushChainAttrs::push_handle)\n- [.push_name()](PushChainAttrs::push_name)\n- [.nested_hook()](PushChainAttrs::nested_hook)\n\n"]
16994#[derive(Debug)]
16995pub struct OpDelchainDo<'r> {
16996 request: Request<'r>,
16997}
16998impl<'r> OpDelchainDo<'r> {
16999 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17000 Self::write_header(request.buf_mut(), header);
17001 Self { request: request }
17002 }
17003 pub fn encode_request<'buf>(
17004 buf: &'buf mut Vec<u8>,
17005 header: &Nfgenmsg,
17006 ) -> PushChainAttrs<&'buf mut Vec<u8>> {
17007 Self::write_header(buf, header);
17008 PushChainAttrs::new(buf)
17009 }
17010 pub fn encode(&mut self) -> PushChainAttrs<&mut Vec<u8>> {
17011 PushChainAttrs::new(self.request.buf_mut())
17012 }
17013 pub fn into_encoder(self) -> PushChainAttrs<RequestBuf<'r>> {
17014 PushChainAttrs::new(self.request.buf)
17015 }
17016 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableChainAttrs<'a>) {
17017 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17018 (
17019 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17020 IterableChainAttrs::with_loc(attrs, buf.as_ptr() as usize),
17021 )
17022 }
17023 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17024 prev.as_vec_mut().extend(header.as_slice());
17025 }
17026}
17027impl NetlinkRequest for OpDelchainDo<'_> {
17028 fn protocol(&self) -> Protocol {
17029 Protocol::Raw {
17030 protonum: 12u16,
17031 request_type: 2565u16,
17032 }
17033 }
17034 fn flags(&self) -> u16 {
17035 self.request.flags
17036 }
17037 fn payload(&self) -> &[u8] {
17038 self.request.buf()
17039 }
17040 type ReplyType<'buf> = (Nfgenmsg, IterableChainAttrs<'buf>);
17041 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17042 Self::decode_request(buf)
17043 }
17044 fn lookup(
17045 buf: &[u8],
17046 offset: usize,
17047 missing_type: Option<u16>,
17048 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17049 Self::decode_request(buf)
17050 .1
17051 .lookup_attr(offset, missing_type)
17052 }
17053}
17054#[doc = "Delete an existing chain with destroy semantics (ignoring ENOENT\nerrors).\n\nRequest attributes:\n- [.push_table()](PushChainAttrs::push_table)\n- [.push_handle()](PushChainAttrs::push_handle)\n- [.push_name()](PushChainAttrs::push_name)\n- [.nested_hook()](PushChainAttrs::nested_hook)\n\n"]
17055#[derive(Debug)]
17056pub struct OpDestroychainDo<'r> {
17057 request: Request<'r>,
17058}
17059impl<'r> OpDestroychainDo<'r> {
17060 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17061 Self::write_header(request.buf_mut(), header);
17062 Self { request: request }
17063 }
17064 pub fn encode_request<'buf>(
17065 buf: &'buf mut Vec<u8>,
17066 header: &Nfgenmsg,
17067 ) -> PushChainAttrs<&'buf mut Vec<u8>> {
17068 Self::write_header(buf, header);
17069 PushChainAttrs::new(buf)
17070 }
17071 pub fn encode(&mut self) -> PushChainAttrs<&mut Vec<u8>> {
17072 PushChainAttrs::new(self.request.buf_mut())
17073 }
17074 pub fn into_encoder(self) -> PushChainAttrs<RequestBuf<'r>> {
17075 PushChainAttrs::new(self.request.buf)
17076 }
17077 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableChainAttrs<'a>) {
17078 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17079 (
17080 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17081 IterableChainAttrs::with_loc(attrs, buf.as_ptr() as usize),
17082 )
17083 }
17084 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17085 prev.as_vec_mut().extend(header.as_slice());
17086 }
17087}
17088impl NetlinkRequest for OpDestroychainDo<'_> {
17089 fn protocol(&self) -> Protocol {
17090 Protocol::Raw {
17091 protonum: 12u16,
17092 request_type: 2587u16,
17093 }
17094 }
17095 fn flags(&self) -> u16 {
17096 self.request.flags
17097 }
17098 fn payload(&self) -> &[u8] {
17099 self.request.buf()
17100 }
17101 type ReplyType<'buf> = (Nfgenmsg, IterableChainAttrs<'buf>);
17102 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17103 Self::decode_request(buf)
17104 }
17105 fn lookup(
17106 buf: &[u8],
17107 offset: usize,
17108 missing_type: Option<u16>,
17109 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17110 Self::decode_request(buf)
17111 .1
17112 .lookup_attr(offset, missing_type)
17113 }
17114}
17115#[doc = "Create a new rule.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n- [.nested_expressions()](PushRuleAttrs::nested_expressions)\n- [.nested_compat()](PushRuleAttrs::nested_compat)\n- [.push_position()](PushRuleAttrs::push_position)\n- [.push_userdata()](PushRuleAttrs::push_userdata)\n- [.push_position_id()](PushRuleAttrs::push_position_id)\n- [.push_chain_id()](PushRuleAttrs::push_chain_id)\n\n"]
17116#[derive(Debug)]
17117pub struct OpNewruleDo<'r> {
17118 request: Request<'r>,
17119}
17120impl<'r> OpNewruleDo<'r> {
17121 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17122 Self::write_header(request.buf_mut(), header);
17123 Self { request: request }
17124 }
17125 pub fn encode_request<'buf>(
17126 buf: &'buf mut Vec<u8>,
17127 header: &Nfgenmsg,
17128 ) -> PushRuleAttrs<&'buf mut Vec<u8>> {
17129 Self::write_header(buf, header);
17130 PushRuleAttrs::new(buf)
17131 }
17132 pub fn encode(&mut self) -> PushRuleAttrs<&mut Vec<u8>> {
17133 PushRuleAttrs::new(self.request.buf_mut())
17134 }
17135 pub fn into_encoder(self) -> PushRuleAttrs<RequestBuf<'r>> {
17136 PushRuleAttrs::new(self.request.buf)
17137 }
17138 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableRuleAttrs<'a>) {
17139 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17140 (
17141 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17142 IterableRuleAttrs::with_loc(attrs, buf.as_ptr() as usize),
17143 )
17144 }
17145 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17146 prev.as_vec_mut().extend(header.as_slice());
17147 }
17148}
17149impl NetlinkRequest for OpNewruleDo<'_> {
17150 fn protocol(&self) -> Protocol {
17151 Protocol::Raw {
17152 protonum: 12u16,
17153 request_type: 2566u16,
17154 }
17155 }
17156 fn flags(&self) -> u16 {
17157 self.request.flags
17158 }
17159 fn payload(&self) -> &[u8] {
17160 self.request.buf()
17161 }
17162 type ReplyType<'buf> = (Nfgenmsg, IterableRuleAttrs<'buf>);
17163 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17164 Self::decode_request(buf)
17165 }
17166 fn lookup(
17167 buf: &[u8],
17168 offset: usize,
17169 missing_type: Option<u16>,
17170 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17171 Self::decode_request(buf)
17172 .1
17173 .lookup_attr(offset, missing_type)
17174 }
17175}
17176#[doc = "Get / dump rules.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n\nReply attributes:\n- [.get_table()](IterableRuleAttrs::get_table)\n- [.get_chain()](IterableRuleAttrs::get_chain)\n- [.get_handle()](IterableRuleAttrs::get_handle)\n- [.get_expressions()](IterableRuleAttrs::get_expressions)\n- [.get_position()](IterableRuleAttrs::get_position)\n- [.get_userdata()](IterableRuleAttrs::get_userdata)\n\n"]
17177#[derive(Debug)]
17178pub struct OpGetruleDump<'r> {
17179 request: Request<'r>,
17180}
17181impl<'r> OpGetruleDump<'r> {
17182 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17183 Self::write_header(request.buf_mut(), header);
17184 Self {
17185 request: request.set_dump(),
17186 }
17187 }
17188 pub fn encode_request<'buf>(
17189 buf: &'buf mut Vec<u8>,
17190 header: &Nfgenmsg,
17191 ) -> PushRuleAttrs<&'buf mut Vec<u8>> {
17192 Self::write_header(buf, header);
17193 PushRuleAttrs::new(buf)
17194 }
17195 pub fn encode(&mut self) -> PushRuleAttrs<&mut Vec<u8>> {
17196 PushRuleAttrs::new(self.request.buf_mut())
17197 }
17198 pub fn into_encoder(self) -> PushRuleAttrs<RequestBuf<'r>> {
17199 PushRuleAttrs::new(self.request.buf)
17200 }
17201 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableRuleAttrs<'a>) {
17202 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17203 (
17204 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17205 IterableRuleAttrs::with_loc(attrs, buf.as_ptr() as usize),
17206 )
17207 }
17208 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17209 prev.as_vec_mut().extend(header.as_slice());
17210 }
17211}
17212impl NetlinkRequest for OpGetruleDump<'_> {
17213 fn protocol(&self) -> Protocol {
17214 Protocol::Raw {
17215 protonum: 12u16,
17216 request_type: 2567u16,
17217 }
17218 }
17219 fn flags(&self) -> u16 {
17220 self.request.flags
17221 }
17222 fn payload(&self) -> &[u8] {
17223 self.request.buf()
17224 }
17225 type ReplyType<'buf> = (Nfgenmsg, IterableRuleAttrs<'buf>);
17226 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17227 Self::decode_request(buf)
17228 }
17229 fn lookup(
17230 buf: &[u8],
17231 offset: usize,
17232 missing_type: Option<u16>,
17233 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17234 Self::decode_request(buf)
17235 .1
17236 .lookup_attr(offset, missing_type)
17237 }
17238}
17239#[doc = "Get / dump rules.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n\nReply attributes:\n- [.get_table()](IterableRuleAttrs::get_table)\n- [.get_chain()](IterableRuleAttrs::get_chain)\n- [.get_handle()](IterableRuleAttrs::get_handle)\n- [.get_expressions()](IterableRuleAttrs::get_expressions)\n- [.get_position()](IterableRuleAttrs::get_position)\n- [.get_userdata()](IterableRuleAttrs::get_userdata)\n\n"]
17240#[derive(Debug)]
17241pub struct OpGetruleDo<'r> {
17242 request: Request<'r>,
17243}
17244impl<'r> OpGetruleDo<'r> {
17245 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17246 Self::write_header(request.buf_mut(), header);
17247 Self { request: request }
17248 }
17249 pub fn encode_request<'buf>(
17250 buf: &'buf mut Vec<u8>,
17251 header: &Nfgenmsg,
17252 ) -> PushRuleAttrs<&'buf mut Vec<u8>> {
17253 Self::write_header(buf, header);
17254 PushRuleAttrs::new(buf)
17255 }
17256 pub fn encode(&mut self) -> PushRuleAttrs<&mut Vec<u8>> {
17257 PushRuleAttrs::new(self.request.buf_mut())
17258 }
17259 pub fn into_encoder(self) -> PushRuleAttrs<RequestBuf<'r>> {
17260 PushRuleAttrs::new(self.request.buf)
17261 }
17262 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableRuleAttrs<'a>) {
17263 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17264 (
17265 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17266 IterableRuleAttrs::with_loc(attrs, buf.as_ptr() as usize),
17267 )
17268 }
17269 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17270 prev.as_vec_mut().extend(header.as_slice());
17271 }
17272}
17273impl NetlinkRequest for OpGetruleDo<'_> {
17274 fn protocol(&self) -> Protocol {
17275 Protocol::Raw {
17276 protonum: 12u16,
17277 request_type: 2567u16,
17278 }
17279 }
17280 fn flags(&self) -> u16 {
17281 self.request.flags
17282 }
17283 fn payload(&self) -> &[u8] {
17284 self.request.buf()
17285 }
17286 type ReplyType<'buf> = (Nfgenmsg, IterableRuleAttrs<'buf>);
17287 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17288 Self::decode_request(buf)
17289 }
17290 fn lookup(
17291 buf: &[u8],
17292 offset: usize,
17293 missing_type: Option<u16>,
17294 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17295 Self::decode_request(buf)
17296 .1
17297 .lookup_attr(offset, missing_type)
17298 }
17299}
17300#[doc = "Get / dump rules and reset stateful expressions.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n\nReply attributes:\n- [.get_table()](IterableRuleAttrs::get_table)\n- [.get_chain()](IterableRuleAttrs::get_chain)\n- [.get_handle()](IterableRuleAttrs::get_handle)\n- [.get_expressions()](IterableRuleAttrs::get_expressions)\n- [.get_position()](IterableRuleAttrs::get_position)\n- [.get_userdata()](IterableRuleAttrs::get_userdata)\n\n"]
17301#[derive(Debug)]
17302pub struct OpGetruleResetDump<'r> {
17303 request: Request<'r>,
17304}
17305impl<'r> OpGetruleResetDump<'r> {
17306 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17307 Self::write_header(request.buf_mut(), header);
17308 Self {
17309 request: request.set_dump(),
17310 }
17311 }
17312 pub fn encode_request<'buf>(
17313 buf: &'buf mut Vec<u8>,
17314 header: &Nfgenmsg,
17315 ) -> PushRuleAttrs<&'buf mut Vec<u8>> {
17316 Self::write_header(buf, header);
17317 PushRuleAttrs::new(buf)
17318 }
17319 pub fn encode(&mut self) -> PushRuleAttrs<&mut Vec<u8>> {
17320 PushRuleAttrs::new(self.request.buf_mut())
17321 }
17322 pub fn into_encoder(self) -> PushRuleAttrs<RequestBuf<'r>> {
17323 PushRuleAttrs::new(self.request.buf)
17324 }
17325 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableRuleAttrs<'a>) {
17326 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17327 (
17328 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17329 IterableRuleAttrs::with_loc(attrs, buf.as_ptr() as usize),
17330 )
17331 }
17332 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17333 prev.as_vec_mut().extend(header.as_slice());
17334 }
17335}
17336impl NetlinkRequest for OpGetruleResetDump<'_> {
17337 fn protocol(&self) -> Protocol {
17338 Protocol::Raw {
17339 protonum: 12u16,
17340 request_type: 2585u16,
17341 }
17342 }
17343 fn flags(&self) -> u16 {
17344 self.request.flags
17345 }
17346 fn payload(&self) -> &[u8] {
17347 self.request.buf()
17348 }
17349 type ReplyType<'buf> = (Nfgenmsg, IterableRuleAttrs<'buf>);
17350 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17351 Self::decode_request(buf)
17352 }
17353 fn lookup(
17354 buf: &[u8],
17355 offset: usize,
17356 missing_type: Option<u16>,
17357 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17358 Self::decode_request(buf)
17359 .1
17360 .lookup_attr(offset, missing_type)
17361 }
17362}
17363#[doc = "Get / dump rules and reset stateful expressions.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n\nReply attributes:\n- [.get_table()](IterableRuleAttrs::get_table)\n- [.get_chain()](IterableRuleAttrs::get_chain)\n- [.get_handle()](IterableRuleAttrs::get_handle)\n- [.get_expressions()](IterableRuleAttrs::get_expressions)\n- [.get_position()](IterableRuleAttrs::get_position)\n- [.get_userdata()](IterableRuleAttrs::get_userdata)\n\n"]
17364#[derive(Debug)]
17365pub struct OpGetruleResetDo<'r> {
17366 request: Request<'r>,
17367}
17368impl<'r> OpGetruleResetDo<'r> {
17369 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17370 Self::write_header(request.buf_mut(), header);
17371 Self { request: request }
17372 }
17373 pub fn encode_request<'buf>(
17374 buf: &'buf mut Vec<u8>,
17375 header: &Nfgenmsg,
17376 ) -> PushRuleAttrs<&'buf mut Vec<u8>> {
17377 Self::write_header(buf, header);
17378 PushRuleAttrs::new(buf)
17379 }
17380 pub fn encode(&mut self) -> PushRuleAttrs<&mut Vec<u8>> {
17381 PushRuleAttrs::new(self.request.buf_mut())
17382 }
17383 pub fn into_encoder(self) -> PushRuleAttrs<RequestBuf<'r>> {
17384 PushRuleAttrs::new(self.request.buf)
17385 }
17386 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableRuleAttrs<'a>) {
17387 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17388 (
17389 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17390 IterableRuleAttrs::with_loc(attrs, buf.as_ptr() as usize),
17391 )
17392 }
17393 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17394 prev.as_vec_mut().extend(header.as_slice());
17395 }
17396}
17397impl NetlinkRequest for OpGetruleResetDo<'_> {
17398 fn protocol(&self) -> Protocol {
17399 Protocol::Raw {
17400 protonum: 12u16,
17401 request_type: 2585u16,
17402 }
17403 }
17404 fn flags(&self) -> u16 {
17405 self.request.flags
17406 }
17407 fn payload(&self) -> &[u8] {
17408 self.request.buf()
17409 }
17410 type ReplyType<'buf> = (Nfgenmsg, IterableRuleAttrs<'buf>);
17411 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17412 Self::decode_request(buf)
17413 }
17414 fn lookup(
17415 buf: &[u8],
17416 offset: usize,
17417 missing_type: Option<u16>,
17418 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17419 Self::decode_request(buf)
17420 .1
17421 .lookup_attr(offset, missing_type)
17422 }
17423}
17424#[doc = "Delete an existing rule.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n- [.push_id()](PushRuleAttrs::push_id)\n\n"]
17425#[derive(Debug)]
17426pub struct OpDelruleDo<'r> {
17427 request: Request<'r>,
17428}
17429impl<'r> OpDelruleDo<'r> {
17430 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17431 Self::write_header(request.buf_mut(), header);
17432 Self { request: request }
17433 }
17434 pub fn encode_request<'buf>(
17435 buf: &'buf mut Vec<u8>,
17436 header: &Nfgenmsg,
17437 ) -> PushRuleAttrs<&'buf mut Vec<u8>> {
17438 Self::write_header(buf, header);
17439 PushRuleAttrs::new(buf)
17440 }
17441 pub fn encode(&mut self) -> PushRuleAttrs<&mut Vec<u8>> {
17442 PushRuleAttrs::new(self.request.buf_mut())
17443 }
17444 pub fn into_encoder(self) -> PushRuleAttrs<RequestBuf<'r>> {
17445 PushRuleAttrs::new(self.request.buf)
17446 }
17447 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableRuleAttrs<'a>) {
17448 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17449 (
17450 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17451 IterableRuleAttrs::with_loc(attrs, buf.as_ptr() as usize),
17452 )
17453 }
17454 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17455 prev.as_vec_mut().extend(header.as_slice());
17456 }
17457}
17458impl NetlinkRequest for OpDelruleDo<'_> {
17459 fn protocol(&self) -> Protocol {
17460 Protocol::Raw {
17461 protonum: 12u16,
17462 request_type: 2568u16,
17463 }
17464 }
17465 fn flags(&self) -> u16 {
17466 self.request.flags
17467 }
17468 fn payload(&self) -> &[u8] {
17469 self.request.buf()
17470 }
17471 type ReplyType<'buf> = (Nfgenmsg, IterableRuleAttrs<'buf>);
17472 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17473 Self::decode_request(buf)
17474 }
17475 fn lookup(
17476 buf: &[u8],
17477 offset: usize,
17478 missing_type: Option<u16>,
17479 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17480 Self::decode_request(buf)
17481 .1
17482 .lookup_attr(offset, missing_type)
17483 }
17484}
17485#[doc = "Delete an existing rule with destroy semantics (ignoring ENOENT errors).\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n- [.push_id()](PushRuleAttrs::push_id)\n\n"]
17486#[derive(Debug)]
17487pub struct OpDestroyruleDo<'r> {
17488 request: Request<'r>,
17489}
17490impl<'r> OpDestroyruleDo<'r> {
17491 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17492 Self::write_header(request.buf_mut(), header);
17493 Self { request: request }
17494 }
17495 pub fn encode_request<'buf>(
17496 buf: &'buf mut Vec<u8>,
17497 header: &Nfgenmsg,
17498 ) -> PushRuleAttrs<&'buf mut Vec<u8>> {
17499 Self::write_header(buf, header);
17500 PushRuleAttrs::new(buf)
17501 }
17502 pub fn encode(&mut self) -> PushRuleAttrs<&mut Vec<u8>> {
17503 PushRuleAttrs::new(self.request.buf_mut())
17504 }
17505 pub fn into_encoder(self) -> PushRuleAttrs<RequestBuf<'r>> {
17506 PushRuleAttrs::new(self.request.buf)
17507 }
17508 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableRuleAttrs<'a>) {
17509 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17510 (
17511 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17512 IterableRuleAttrs::with_loc(attrs, buf.as_ptr() as usize),
17513 )
17514 }
17515 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17516 prev.as_vec_mut().extend(header.as_slice());
17517 }
17518}
17519impl NetlinkRequest for OpDestroyruleDo<'_> {
17520 fn protocol(&self) -> Protocol {
17521 Protocol::Raw {
17522 protonum: 12u16,
17523 request_type: 2588u16,
17524 }
17525 }
17526 fn flags(&self) -> u16 {
17527 self.request.flags
17528 }
17529 fn payload(&self) -> &[u8] {
17530 self.request.buf()
17531 }
17532 type ReplyType<'buf> = (Nfgenmsg, IterableRuleAttrs<'buf>);
17533 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17534 Self::decode_request(buf)
17535 }
17536 fn lookup(
17537 buf: &[u8],
17538 offset: usize,
17539 missing_type: Option<u16>,
17540 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17541 Self::decode_request(buf)
17542 .1
17543 .lookup_attr(offset, missing_type)
17544 }
17545}
17546#[doc = "Create a new set.\n\nRequest attributes:\n- [.push_table()](PushSetAttrs::push_table)\n- [.push_name()](PushSetAttrs::push_name)\n- [.push_flags()](PushSetAttrs::push_flags)\n- [.push_key_type()](PushSetAttrs::push_key_type)\n- [.push_key_len()](PushSetAttrs::push_key_len)\n- [.push_data_type()](PushSetAttrs::push_data_type)\n- [.push_data_len()](PushSetAttrs::push_data_len)\n- [.push_policy()](PushSetAttrs::push_policy)\n- [.nested_desc()](PushSetAttrs::nested_desc)\n- [.push_id()](PushSetAttrs::push_id)\n- [.push_timeout()](PushSetAttrs::push_timeout)\n- [.push_gc_interval()](PushSetAttrs::push_gc_interval)\n- [.push_userdata()](PushSetAttrs::push_userdata)\n- [.push_obj_type()](PushSetAttrs::push_obj_type)\n\n"]
17547#[derive(Debug)]
17548pub struct OpNewsetDo<'r> {
17549 request: Request<'r>,
17550}
17551impl<'r> OpNewsetDo<'r> {
17552 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17553 Self::write_header(request.buf_mut(), header);
17554 Self { request: request }
17555 }
17556 pub fn encode_request<'buf>(
17557 buf: &'buf mut Vec<u8>,
17558 header: &Nfgenmsg,
17559 ) -> PushSetAttrs<&'buf mut Vec<u8>> {
17560 Self::write_header(buf, header);
17561 PushSetAttrs::new(buf)
17562 }
17563 pub fn encode(&mut self) -> PushSetAttrs<&mut Vec<u8>> {
17564 PushSetAttrs::new(self.request.buf_mut())
17565 }
17566 pub fn into_encoder(self) -> PushSetAttrs<RequestBuf<'r>> {
17567 PushSetAttrs::new(self.request.buf)
17568 }
17569 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetAttrs<'a>) {
17570 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17571 (
17572 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17573 IterableSetAttrs::with_loc(attrs, buf.as_ptr() as usize),
17574 )
17575 }
17576 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17577 prev.as_vec_mut().extend(header.as_slice());
17578 }
17579}
17580impl NetlinkRequest for OpNewsetDo<'_> {
17581 fn protocol(&self) -> Protocol {
17582 Protocol::Raw {
17583 protonum: 12u16,
17584 request_type: 2569u16,
17585 }
17586 }
17587 fn flags(&self) -> u16 {
17588 self.request.flags
17589 }
17590 fn payload(&self) -> &[u8] {
17591 self.request.buf()
17592 }
17593 type ReplyType<'buf> = (Nfgenmsg, IterableSetAttrs<'buf>);
17594 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17595 Self::decode_request(buf)
17596 }
17597 fn lookup(
17598 buf: &[u8],
17599 offset: usize,
17600 missing_type: Option<u16>,
17601 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17602 Self::decode_request(buf)
17603 .1
17604 .lookup_attr(offset, missing_type)
17605 }
17606}
17607#[doc = "Get / dump sets.\n\nRequest attributes:\n- [.push_table()](PushSetAttrs::push_table)\n\nReply attributes:\n- [.get_table()](IterableSetAttrs::get_table)\n- [.get_name()](IterableSetAttrs::get_name)\n- [.get_flags()](IterableSetAttrs::get_flags)\n- [.get_key_type()](IterableSetAttrs::get_key_type)\n- [.get_key_len()](IterableSetAttrs::get_key_len)\n- [.get_data_type()](IterableSetAttrs::get_data_type)\n- [.get_data_len()](IterableSetAttrs::get_data_len)\n- [.get_policy()](IterableSetAttrs::get_policy)\n- [.get_desc()](IterableSetAttrs::get_desc)\n- [.get_gc_interval()](IterableSetAttrs::get_gc_interval)\n- [.get_userdata()](IterableSetAttrs::get_userdata)\n- [.get_obj_type()](IterableSetAttrs::get_obj_type)\n- [.get_handle()](IterableSetAttrs::get_handle)\n- [.get_expr()](IterableSetAttrs::get_expr)\n- [.get_expressions()](IterableSetAttrs::get_expressions)\n\n"]
17608#[derive(Debug)]
17609pub struct OpGetsetDump<'r> {
17610 request: Request<'r>,
17611}
17612impl<'r> OpGetsetDump<'r> {
17613 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17614 Self::write_header(request.buf_mut(), header);
17615 Self {
17616 request: request.set_dump(),
17617 }
17618 }
17619 pub fn encode_request<'buf>(
17620 buf: &'buf mut Vec<u8>,
17621 header: &Nfgenmsg,
17622 ) -> PushSetAttrs<&'buf mut Vec<u8>> {
17623 Self::write_header(buf, header);
17624 PushSetAttrs::new(buf)
17625 }
17626 pub fn encode(&mut self) -> PushSetAttrs<&mut Vec<u8>> {
17627 PushSetAttrs::new(self.request.buf_mut())
17628 }
17629 pub fn into_encoder(self) -> PushSetAttrs<RequestBuf<'r>> {
17630 PushSetAttrs::new(self.request.buf)
17631 }
17632 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetAttrs<'a>) {
17633 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17634 (
17635 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17636 IterableSetAttrs::with_loc(attrs, buf.as_ptr() as usize),
17637 )
17638 }
17639 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17640 prev.as_vec_mut().extend(header.as_slice());
17641 }
17642}
17643impl NetlinkRequest for OpGetsetDump<'_> {
17644 fn protocol(&self) -> Protocol {
17645 Protocol::Raw {
17646 protonum: 12u16,
17647 request_type: 2570u16,
17648 }
17649 }
17650 fn flags(&self) -> u16 {
17651 self.request.flags
17652 }
17653 fn payload(&self) -> &[u8] {
17654 self.request.buf()
17655 }
17656 type ReplyType<'buf> = (Nfgenmsg, IterableSetAttrs<'buf>);
17657 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17658 Self::decode_request(buf)
17659 }
17660 fn lookup(
17661 buf: &[u8],
17662 offset: usize,
17663 missing_type: Option<u16>,
17664 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17665 Self::decode_request(buf)
17666 .1
17667 .lookup_attr(offset, missing_type)
17668 }
17669}
17670#[doc = "Get / dump sets.\n\nRequest attributes:\n- [.push_table()](PushSetAttrs::push_table)\n- [.push_name()](PushSetAttrs::push_name)\n\nReply attributes:\n- [.get_table()](IterableSetAttrs::get_table)\n- [.get_name()](IterableSetAttrs::get_name)\n- [.get_flags()](IterableSetAttrs::get_flags)\n- [.get_key_type()](IterableSetAttrs::get_key_type)\n- [.get_key_len()](IterableSetAttrs::get_key_len)\n- [.get_data_type()](IterableSetAttrs::get_data_type)\n- [.get_data_len()](IterableSetAttrs::get_data_len)\n- [.get_policy()](IterableSetAttrs::get_policy)\n- [.get_desc()](IterableSetAttrs::get_desc)\n- [.get_gc_interval()](IterableSetAttrs::get_gc_interval)\n- [.get_userdata()](IterableSetAttrs::get_userdata)\n- [.get_obj_type()](IterableSetAttrs::get_obj_type)\n- [.get_handle()](IterableSetAttrs::get_handle)\n- [.get_expr()](IterableSetAttrs::get_expr)\n- [.get_expressions()](IterableSetAttrs::get_expressions)\n\n"]
17671#[derive(Debug)]
17672pub struct OpGetsetDo<'r> {
17673 request: Request<'r>,
17674}
17675impl<'r> OpGetsetDo<'r> {
17676 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17677 Self::write_header(request.buf_mut(), header);
17678 Self { request: request }
17679 }
17680 pub fn encode_request<'buf>(
17681 buf: &'buf mut Vec<u8>,
17682 header: &Nfgenmsg,
17683 ) -> PushSetAttrs<&'buf mut Vec<u8>> {
17684 Self::write_header(buf, header);
17685 PushSetAttrs::new(buf)
17686 }
17687 pub fn encode(&mut self) -> PushSetAttrs<&mut Vec<u8>> {
17688 PushSetAttrs::new(self.request.buf_mut())
17689 }
17690 pub fn into_encoder(self) -> PushSetAttrs<RequestBuf<'r>> {
17691 PushSetAttrs::new(self.request.buf)
17692 }
17693 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetAttrs<'a>) {
17694 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17695 (
17696 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17697 IterableSetAttrs::with_loc(attrs, buf.as_ptr() as usize),
17698 )
17699 }
17700 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17701 prev.as_vec_mut().extend(header.as_slice());
17702 }
17703}
17704impl NetlinkRequest for OpGetsetDo<'_> {
17705 fn protocol(&self) -> Protocol {
17706 Protocol::Raw {
17707 protonum: 12u16,
17708 request_type: 2570u16,
17709 }
17710 }
17711 fn flags(&self) -> u16 {
17712 self.request.flags
17713 }
17714 fn payload(&self) -> &[u8] {
17715 self.request.buf()
17716 }
17717 type ReplyType<'buf> = (Nfgenmsg, IterableSetAttrs<'buf>);
17718 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17719 Self::decode_request(buf)
17720 }
17721 fn lookup(
17722 buf: &[u8],
17723 offset: usize,
17724 missing_type: Option<u16>,
17725 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17726 Self::decode_request(buf)
17727 .1
17728 .lookup_attr(offset, missing_type)
17729 }
17730}
17731#[doc = "Delete an existing set.\n\nRequest attributes:\n- [.push_table()](PushSetAttrs::push_table)\n- [.push_name()](PushSetAttrs::push_name)\n- [.push_handle()](PushSetAttrs::push_handle)\n\n"]
17732#[derive(Debug)]
17733pub struct OpDelsetDo<'r> {
17734 request: Request<'r>,
17735}
17736impl<'r> OpDelsetDo<'r> {
17737 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17738 Self::write_header(request.buf_mut(), header);
17739 Self { request: request }
17740 }
17741 pub fn encode_request<'buf>(
17742 buf: &'buf mut Vec<u8>,
17743 header: &Nfgenmsg,
17744 ) -> PushSetAttrs<&'buf mut Vec<u8>> {
17745 Self::write_header(buf, header);
17746 PushSetAttrs::new(buf)
17747 }
17748 pub fn encode(&mut self) -> PushSetAttrs<&mut Vec<u8>> {
17749 PushSetAttrs::new(self.request.buf_mut())
17750 }
17751 pub fn into_encoder(self) -> PushSetAttrs<RequestBuf<'r>> {
17752 PushSetAttrs::new(self.request.buf)
17753 }
17754 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetAttrs<'a>) {
17755 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17756 (
17757 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17758 IterableSetAttrs::with_loc(attrs, buf.as_ptr() as usize),
17759 )
17760 }
17761 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17762 prev.as_vec_mut().extend(header.as_slice());
17763 }
17764}
17765impl NetlinkRequest for OpDelsetDo<'_> {
17766 fn protocol(&self) -> Protocol {
17767 Protocol::Raw {
17768 protonum: 12u16,
17769 request_type: 2571u16,
17770 }
17771 }
17772 fn flags(&self) -> u16 {
17773 self.request.flags
17774 }
17775 fn payload(&self) -> &[u8] {
17776 self.request.buf()
17777 }
17778 type ReplyType<'buf> = (Nfgenmsg, IterableSetAttrs<'buf>);
17779 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17780 Self::decode_request(buf)
17781 }
17782 fn lookup(
17783 buf: &[u8],
17784 offset: usize,
17785 missing_type: Option<u16>,
17786 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17787 Self::decode_request(buf)
17788 .1
17789 .lookup_attr(offset, missing_type)
17790 }
17791}
17792#[doc = "Delete an existing set with destroy semantics (ignoring ENOENT errors).\n\nRequest attributes:\n- [.push_table()](PushSetAttrs::push_table)\n- [.push_name()](PushSetAttrs::push_name)\n- [.push_handle()](PushSetAttrs::push_handle)\n\n"]
17793#[derive(Debug)]
17794pub struct OpDestroysetDo<'r> {
17795 request: Request<'r>,
17796}
17797impl<'r> OpDestroysetDo<'r> {
17798 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17799 Self::write_header(request.buf_mut(), header);
17800 Self { request: request }
17801 }
17802 pub fn encode_request<'buf>(
17803 buf: &'buf mut Vec<u8>,
17804 header: &Nfgenmsg,
17805 ) -> PushSetAttrs<&'buf mut Vec<u8>> {
17806 Self::write_header(buf, header);
17807 PushSetAttrs::new(buf)
17808 }
17809 pub fn encode(&mut self) -> PushSetAttrs<&mut Vec<u8>> {
17810 PushSetAttrs::new(self.request.buf_mut())
17811 }
17812 pub fn into_encoder(self) -> PushSetAttrs<RequestBuf<'r>> {
17813 PushSetAttrs::new(self.request.buf)
17814 }
17815 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetAttrs<'a>) {
17816 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17817 (
17818 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17819 IterableSetAttrs::with_loc(attrs, buf.as_ptr() as usize),
17820 )
17821 }
17822 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17823 prev.as_vec_mut().extend(header.as_slice());
17824 }
17825}
17826impl NetlinkRequest for OpDestroysetDo<'_> {
17827 fn protocol(&self) -> Protocol {
17828 Protocol::Raw {
17829 protonum: 12u16,
17830 request_type: 2589u16,
17831 }
17832 }
17833 fn flags(&self) -> u16 {
17834 self.request.flags
17835 }
17836 fn payload(&self) -> &[u8] {
17837 self.request.buf()
17838 }
17839 type ReplyType<'buf> = (Nfgenmsg, IterableSetAttrs<'buf>);
17840 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17841 Self::decode_request(buf)
17842 }
17843 fn lookup(
17844 buf: &[u8],
17845 offset: usize,
17846 missing_type: Option<u16>,
17847 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17848 Self::decode_request(buf)
17849 .1
17850 .lookup_attr(offset, missing_type)
17851 }
17852}
17853#[doc = "Create a new set element.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n- [.nested_elements()](PushSetelemListAttrs::nested_elements)\n- [.push_set_id()](PushSetelemListAttrs::push_set_id)\n\n"]
17854#[derive(Debug)]
17855pub struct OpNewsetelemDo<'r> {
17856 request: Request<'r>,
17857}
17858impl<'r> OpNewsetelemDo<'r> {
17859 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17860 Self::write_header(request.buf_mut(), header);
17861 Self { request: request }
17862 }
17863 pub fn encode_request<'buf>(
17864 buf: &'buf mut Vec<u8>,
17865 header: &Nfgenmsg,
17866 ) -> PushSetelemListAttrs<&'buf mut Vec<u8>> {
17867 Self::write_header(buf, header);
17868 PushSetelemListAttrs::new(buf)
17869 }
17870 pub fn encode(&mut self) -> PushSetelemListAttrs<&mut Vec<u8>> {
17871 PushSetelemListAttrs::new(self.request.buf_mut())
17872 }
17873 pub fn into_encoder(self) -> PushSetelemListAttrs<RequestBuf<'r>> {
17874 PushSetelemListAttrs::new(self.request.buf)
17875 }
17876 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetelemListAttrs<'a>) {
17877 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17878 (
17879 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17880 IterableSetelemListAttrs::with_loc(attrs, buf.as_ptr() as usize),
17881 )
17882 }
17883 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17884 prev.as_vec_mut().extend(header.as_slice());
17885 }
17886}
17887impl NetlinkRequest for OpNewsetelemDo<'_> {
17888 fn protocol(&self) -> Protocol {
17889 Protocol::Raw {
17890 protonum: 12u16,
17891 request_type: 2572u16,
17892 }
17893 }
17894 fn flags(&self) -> u16 {
17895 self.request.flags
17896 }
17897 fn payload(&self) -> &[u8] {
17898 self.request.buf()
17899 }
17900 type ReplyType<'buf> = (Nfgenmsg, IterableSetelemListAttrs<'buf>);
17901 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17902 Self::decode_request(buf)
17903 }
17904 fn lookup(
17905 buf: &[u8],
17906 offset: usize,
17907 missing_type: Option<u16>,
17908 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17909 Self::decode_request(buf)
17910 .1
17911 .lookup_attr(offset, missing_type)
17912 }
17913}
17914#[doc = "Get / dump set elements.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n\nReply attributes:\n- [.get_table()](IterableSetelemListAttrs::get_table)\n- [.get_set()](IterableSetelemListAttrs::get_set)\n- [.get_elements()](IterableSetelemListAttrs::get_elements)\n\n"]
17915#[derive(Debug)]
17916pub struct OpGetsetelemDump<'r> {
17917 request: Request<'r>,
17918}
17919impl<'r> OpGetsetelemDump<'r> {
17920 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17921 Self::write_header(request.buf_mut(), header);
17922 Self {
17923 request: request.set_dump(),
17924 }
17925 }
17926 pub fn encode_request<'buf>(
17927 buf: &'buf mut Vec<u8>,
17928 header: &Nfgenmsg,
17929 ) -> PushSetelemListAttrs<&'buf mut Vec<u8>> {
17930 Self::write_header(buf, header);
17931 PushSetelemListAttrs::new(buf)
17932 }
17933 pub fn encode(&mut self) -> PushSetelemListAttrs<&mut Vec<u8>> {
17934 PushSetelemListAttrs::new(self.request.buf_mut())
17935 }
17936 pub fn into_encoder(self) -> PushSetelemListAttrs<RequestBuf<'r>> {
17937 PushSetelemListAttrs::new(self.request.buf)
17938 }
17939 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetelemListAttrs<'a>) {
17940 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
17941 (
17942 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
17943 IterableSetelemListAttrs::with_loc(attrs, buf.as_ptr() as usize),
17944 )
17945 }
17946 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
17947 prev.as_vec_mut().extend(header.as_slice());
17948 }
17949}
17950impl NetlinkRequest for OpGetsetelemDump<'_> {
17951 fn protocol(&self) -> Protocol {
17952 Protocol::Raw {
17953 protonum: 12u16,
17954 request_type: 2573u16,
17955 }
17956 }
17957 fn flags(&self) -> u16 {
17958 self.request.flags
17959 }
17960 fn payload(&self) -> &[u8] {
17961 self.request.buf()
17962 }
17963 type ReplyType<'buf> = (Nfgenmsg, IterableSetelemListAttrs<'buf>);
17964 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17965 Self::decode_request(buf)
17966 }
17967 fn lookup(
17968 buf: &[u8],
17969 offset: usize,
17970 missing_type: Option<u16>,
17971 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17972 Self::decode_request(buf)
17973 .1
17974 .lookup_attr(offset, missing_type)
17975 }
17976}
17977#[doc = "Get / dump set elements.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n- [.nested_elements()](PushSetelemListAttrs::nested_elements)\n\nReply attributes:\n- [.get_elements()](IterableSetelemListAttrs::get_elements)\n\n"]
17978#[derive(Debug)]
17979pub struct OpGetsetelemDo<'r> {
17980 request: Request<'r>,
17981}
17982impl<'r> OpGetsetelemDo<'r> {
17983 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
17984 Self::write_header(request.buf_mut(), header);
17985 Self { request: request }
17986 }
17987 pub fn encode_request<'buf>(
17988 buf: &'buf mut Vec<u8>,
17989 header: &Nfgenmsg,
17990 ) -> PushSetelemListAttrs<&'buf mut Vec<u8>> {
17991 Self::write_header(buf, header);
17992 PushSetelemListAttrs::new(buf)
17993 }
17994 pub fn encode(&mut self) -> PushSetelemListAttrs<&mut Vec<u8>> {
17995 PushSetelemListAttrs::new(self.request.buf_mut())
17996 }
17997 pub fn into_encoder(self) -> PushSetelemListAttrs<RequestBuf<'r>> {
17998 PushSetelemListAttrs::new(self.request.buf)
17999 }
18000 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetelemListAttrs<'a>) {
18001 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18002 (
18003 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18004 IterableSetelemListAttrs::with_loc(attrs, buf.as_ptr() as usize),
18005 )
18006 }
18007 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18008 prev.as_vec_mut().extend(header.as_slice());
18009 }
18010}
18011impl NetlinkRequest for OpGetsetelemDo<'_> {
18012 fn protocol(&self) -> Protocol {
18013 Protocol::Raw {
18014 protonum: 12u16,
18015 request_type: 2573u16,
18016 }
18017 }
18018 fn flags(&self) -> u16 {
18019 self.request.flags
18020 }
18021 fn payload(&self) -> &[u8] {
18022 self.request.buf()
18023 }
18024 type ReplyType<'buf> = (Nfgenmsg, IterableSetelemListAttrs<'buf>);
18025 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18026 Self::decode_request(buf)
18027 }
18028 fn lookup(
18029 buf: &[u8],
18030 offset: usize,
18031 missing_type: Option<u16>,
18032 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18033 Self::decode_request(buf)
18034 .1
18035 .lookup_attr(offset, missing_type)
18036 }
18037}
18038#[doc = "Get / dump set elements and reset stateful expressions.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n\nReply attributes:\n- [.get_table()](IterableSetelemListAttrs::get_table)\n- [.get_set()](IterableSetelemListAttrs::get_set)\n- [.get_elements()](IterableSetelemListAttrs::get_elements)\n\n"]
18039#[derive(Debug)]
18040pub struct OpGetsetelemResetDump<'r> {
18041 request: Request<'r>,
18042}
18043impl<'r> OpGetsetelemResetDump<'r> {
18044 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18045 Self::write_header(request.buf_mut(), header);
18046 Self {
18047 request: request.set_dump(),
18048 }
18049 }
18050 pub fn encode_request<'buf>(
18051 buf: &'buf mut Vec<u8>,
18052 header: &Nfgenmsg,
18053 ) -> PushSetelemListAttrs<&'buf mut Vec<u8>> {
18054 Self::write_header(buf, header);
18055 PushSetelemListAttrs::new(buf)
18056 }
18057 pub fn encode(&mut self) -> PushSetelemListAttrs<&mut Vec<u8>> {
18058 PushSetelemListAttrs::new(self.request.buf_mut())
18059 }
18060 pub fn into_encoder(self) -> PushSetelemListAttrs<RequestBuf<'r>> {
18061 PushSetelemListAttrs::new(self.request.buf)
18062 }
18063 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetelemListAttrs<'a>) {
18064 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18065 (
18066 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18067 IterableSetelemListAttrs::with_loc(attrs, buf.as_ptr() as usize),
18068 )
18069 }
18070 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18071 prev.as_vec_mut().extend(header.as_slice());
18072 }
18073}
18074impl NetlinkRequest for OpGetsetelemResetDump<'_> {
18075 fn protocol(&self) -> Protocol {
18076 Protocol::Raw {
18077 protonum: 12u16,
18078 request_type: 2593u16,
18079 }
18080 }
18081 fn flags(&self) -> u16 {
18082 self.request.flags
18083 }
18084 fn payload(&self) -> &[u8] {
18085 self.request.buf()
18086 }
18087 type ReplyType<'buf> = (Nfgenmsg, IterableSetelemListAttrs<'buf>);
18088 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18089 Self::decode_request(buf)
18090 }
18091 fn lookup(
18092 buf: &[u8],
18093 offset: usize,
18094 missing_type: Option<u16>,
18095 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18096 Self::decode_request(buf)
18097 .1
18098 .lookup_attr(offset, missing_type)
18099 }
18100}
18101#[doc = "Get / dump set elements and reset stateful expressions.\n\nRequest attributes:\n- [.nested_elements()](PushSetelemListAttrs::nested_elements)\n\nReply attributes:\n- [.get_table()](IterableSetelemListAttrs::get_table)\n- [.get_set()](IterableSetelemListAttrs::get_set)\n- [.get_elements()](IterableSetelemListAttrs::get_elements)\n\n"]
18102#[derive(Debug)]
18103pub struct OpGetsetelemResetDo<'r> {
18104 request: Request<'r>,
18105}
18106impl<'r> OpGetsetelemResetDo<'r> {
18107 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18108 Self::write_header(request.buf_mut(), header);
18109 Self { request: request }
18110 }
18111 pub fn encode_request<'buf>(
18112 buf: &'buf mut Vec<u8>,
18113 header: &Nfgenmsg,
18114 ) -> PushSetelemListAttrs<&'buf mut Vec<u8>> {
18115 Self::write_header(buf, header);
18116 PushSetelemListAttrs::new(buf)
18117 }
18118 pub fn encode(&mut self) -> PushSetelemListAttrs<&mut Vec<u8>> {
18119 PushSetelemListAttrs::new(self.request.buf_mut())
18120 }
18121 pub fn into_encoder(self) -> PushSetelemListAttrs<RequestBuf<'r>> {
18122 PushSetelemListAttrs::new(self.request.buf)
18123 }
18124 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetelemListAttrs<'a>) {
18125 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18126 (
18127 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18128 IterableSetelemListAttrs::with_loc(attrs, buf.as_ptr() as usize),
18129 )
18130 }
18131 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18132 prev.as_vec_mut().extend(header.as_slice());
18133 }
18134}
18135impl NetlinkRequest for OpGetsetelemResetDo<'_> {
18136 fn protocol(&self) -> Protocol {
18137 Protocol::Raw {
18138 protonum: 12u16,
18139 request_type: 2593u16,
18140 }
18141 }
18142 fn flags(&self) -> u16 {
18143 self.request.flags
18144 }
18145 fn payload(&self) -> &[u8] {
18146 self.request.buf()
18147 }
18148 type ReplyType<'buf> = (Nfgenmsg, IterableSetelemListAttrs<'buf>);
18149 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18150 Self::decode_request(buf)
18151 }
18152 fn lookup(
18153 buf: &[u8],
18154 offset: usize,
18155 missing_type: Option<u16>,
18156 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18157 Self::decode_request(buf)
18158 .1
18159 .lookup_attr(offset, missing_type)
18160 }
18161}
18162#[doc = "Delete an existing set element.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n- [.nested_elements()](PushSetelemListAttrs::nested_elements)\n\n"]
18163#[derive(Debug)]
18164pub struct OpDelsetelemDo<'r> {
18165 request: Request<'r>,
18166}
18167impl<'r> OpDelsetelemDo<'r> {
18168 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18169 Self::write_header(request.buf_mut(), header);
18170 Self { request: request }
18171 }
18172 pub fn encode_request<'buf>(
18173 buf: &'buf mut Vec<u8>,
18174 header: &Nfgenmsg,
18175 ) -> PushSetelemListAttrs<&'buf mut Vec<u8>> {
18176 Self::write_header(buf, header);
18177 PushSetelemListAttrs::new(buf)
18178 }
18179 pub fn encode(&mut self) -> PushSetelemListAttrs<&mut Vec<u8>> {
18180 PushSetelemListAttrs::new(self.request.buf_mut())
18181 }
18182 pub fn into_encoder(self) -> PushSetelemListAttrs<RequestBuf<'r>> {
18183 PushSetelemListAttrs::new(self.request.buf)
18184 }
18185 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetelemListAttrs<'a>) {
18186 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18187 (
18188 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18189 IterableSetelemListAttrs::with_loc(attrs, buf.as_ptr() as usize),
18190 )
18191 }
18192 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18193 prev.as_vec_mut().extend(header.as_slice());
18194 }
18195}
18196impl NetlinkRequest for OpDelsetelemDo<'_> {
18197 fn protocol(&self) -> Protocol {
18198 Protocol::Raw {
18199 protonum: 12u16,
18200 request_type: 2574u16,
18201 }
18202 }
18203 fn flags(&self) -> u16 {
18204 self.request.flags
18205 }
18206 fn payload(&self) -> &[u8] {
18207 self.request.buf()
18208 }
18209 type ReplyType<'buf> = (Nfgenmsg, IterableSetelemListAttrs<'buf>);
18210 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18211 Self::decode_request(buf)
18212 }
18213 fn lookup(
18214 buf: &[u8],
18215 offset: usize,
18216 missing_type: Option<u16>,
18217 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18218 Self::decode_request(buf)
18219 .1
18220 .lookup_attr(offset, missing_type)
18221 }
18222}
18223#[doc = "Delete an existing set element with destroy semantics.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n- [.nested_elements()](PushSetelemListAttrs::nested_elements)\n\n"]
18224#[derive(Debug)]
18225pub struct OpDestroysetelemDo<'r> {
18226 request: Request<'r>,
18227}
18228impl<'r> OpDestroysetelemDo<'r> {
18229 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18230 Self::write_header(request.buf_mut(), header);
18231 Self { request: request }
18232 }
18233 pub fn encode_request<'buf>(
18234 buf: &'buf mut Vec<u8>,
18235 header: &Nfgenmsg,
18236 ) -> PushSetelemListAttrs<&'buf mut Vec<u8>> {
18237 Self::write_header(buf, header);
18238 PushSetelemListAttrs::new(buf)
18239 }
18240 pub fn encode(&mut self) -> PushSetelemListAttrs<&mut Vec<u8>> {
18241 PushSetelemListAttrs::new(self.request.buf_mut())
18242 }
18243 pub fn into_encoder(self) -> PushSetelemListAttrs<RequestBuf<'r>> {
18244 PushSetelemListAttrs::new(self.request.buf)
18245 }
18246 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableSetelemListAttrs<'a>) {
18247 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18248 (
18249 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18250 IterableSetelemListAttrs::with_loc(attrs, buf.as_ptr() as usize),
18251 )
18252 }
18253 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18254 prev.as_vec_mut().extend(header.as_slice());
18255 }
18256}
18257impl NetlinkRequest for OpDestroysetelemDo<'_> {
18258 fn protocol(&self) -> Protocol {
18259 Protocol::Raw {
18260 protonum: 12u16,
18261 request_type: 2590u16,
18262 }
18263 }
18264 fn flags(&self) -> u16 {
18265 self.request.flags
18266 }
18267 fn payload(&self) -> &[u8] {
18268 self.request.buf()
18269 }
18270 type ReplyType<'buf> = (Nfgenmsg, IterableSetelemListAttrs<'buf>);
18271 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18272 Self::decode_request(buf)
18273 }
18274 fn lookup(
18275 buf: &[u8],
18276 offset: usize,
18277 missing_type: Option<u16>,
18278 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18279 Self::decode_request(buf)
18280 .1
18281 .lookup_attr(offset, missing_type)
18282 }
18283}
18284#[doc = "Get / dump rule-set generation.\n\nReply attributes:\n- [.get_id()](IterableGenAttrs::get_id)\n- [.get_proc_pid()](IterableGenAttrs::get_proc_pid)\n- [.get_proc_name()](IterableGenAttrs::get_proc_name)\n\n"]
18285#[derive(Debug)]
18286pub struct OpGetgenDump<'r> {
18287 request: Request<'r>,
18288}
18289impl<'r> OpGetgenDump<'r> {
18290 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18291 Self::write_header(request.buf_mut(), header);
18292 Self {
18293 request: request.set_dump(),
18294 }
18295 }
18296 pub fn encode_request<'buf>(
18297 buf: &'buf mut Vec<u8>,
18298 header: &Nfgenmsg,
18299 ) -> PushGenAttrs<&'buf mut Vec<u8>> {
18300 Self::write_header(buf, header);
18301 PushGenAttrs::new(buf)
18302 }
18303 pub fn encode(&mut self) -> PushGenAttrs<&mut Vec<u8>> {
18304 PushGenAttrs::new(self.request.buf_mut())
18305 }
18306 pub fn into_encoder(self) -> PushGenAttrs<RequestBuf<'r>> {
18307 PushGenAttrs::new(self.request.buf)
18308 }
18309 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableGenAttrs<'a>) {
18310 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18311 (
18312 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18313 IterableGenAttrs::with_loc(attrs, buf.as_ptr() as usize),
18314 )
18315 }
18316 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18317 prev.as_vec_mut().extend(header.as_slice());
18318 }
18319}
18320impl NetlinkRequest for OpGetgenDump<'_> {
18321 fn protocol(&self) -> Protocol {
18322 Protocol::Raw {
18323 protonum: 12u16,
18324 request_type: 2576u16,
18325 }
18326 }
18327 fn flags(&self) -> u16 {
18328 self.request.flags
18329 }
18330 fn payload(&self) -> &[u8] {
18331 self.request.buf()
18332 }
18333 type ReplyType<'buf> = (Nfgenmsg, IterableGenAttrs<'buf>);
18334 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18335 Self::decode_request(buf)
18336 }
18337 fn lookup(
18338 buf: &[u8],
18339 offset: usize,
18340 missing_type: Option<u16>,
18341 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18342 Self::decode_request(buf)
18343 .1
18344 .lookup_attr(offset, missing_type)
18345 }
18346}
18347#[doc = "Get / dump rule-set generation.\n\nReply attributes:\n- [.get_id()](IterableGenAttrs::get_id)\n- [.get_proc_pid()](IterableGenAttrs::get_proc_pid)\n- [.get_proc_name()](IterableGenAttrs::get_proc_name)\n\n"]
18348#[derive(Debug)]
18349pub struct OpGetgenDo<'r> {
18350 request: Request<'r>,
18351}
18352impl<'r> OpGetgenDo<'r> {
18353 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18354 Self::write_header(request.buf_mut(), header);
18355 Self { request: request }
18356 }
18357 pub fn encode_request<'buf>(
18358 buf: &'buf mut Vec<u8>,
18359 header: &Nfgenmsg,
18360 ) -> PushGenAttrs<&'buf mut Vec<u8>> {
18361 Self::write_header(buf, header);
18362 PushGenAttrs::new(buf)
18363 }
18364 pub fn encode(&mut self) -> PushGenAttrs<&mut Vec<u8>> {
18365 PushGenAttrs::new(self.request.buf_mut())
18366 }
18367 pub fn into_encoder(self) -> PushGenAttrs<RequestBuf<'r>> {
18368 PushGenAttrs::new(self.request.buf)
18369 }
18370 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableGenAttrs<'a>) {
18371 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18372 (
18373 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18374 IterableGenAttrs::with_loc(attrs, buf.as_ptr() as usize),
18375 )
18376 }
18377 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18378 prev.as_vec_mut().extend(header.as_slice());
18379 }
18380}
18381impl NetlinkRequest for OpGetgenDo<'_> {
18382 fn protocol(&self) -> Protocol {
18383 Protocol::Raw {
18384 protonum: 12u16,
18385 request_type: 2576u16,
18386 }
18387 }
18388 fn flags(&self) -> u16 {
18389 self.request.flags
18390 }
18391 fn payload(&self) -> &[u8] {
18392 self.request.buf()
18393 }
18394 type ReplyType<'buf> = (Nfgenmsg, IterableGenAttrs<'buf>);
18395 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18396 Self::decode_request(buf)
18397 }
18398 fn lookup(
18399 buf: &[u8],
18400 offset: usize,
18401 missing_type: Option<u16>,
18402 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18403 Self::decode_request(buf)
18404 .1
18405 .lookup_attr(offset, missing_type)
18406 }
18407}
18408#[doc = "Create a new stateful object.\n\nRequest attributes:\n- [.push_table()](PushObjAttrs::push_table)\n- [.push_name()](PushObjAttrs::push_name)\n- [.push_type()](PushObjAttrs::push_type)\n- [.nested_data_counter()](PushObjAttrs::nested_data_counter)\n- [.nested_data_quota()](PushObjAttrs::nested_data_quota)\n- [.push_userdata()](PushObjAttrs::push_userdata)\n\n"]
18409#[derive(Debug)]
18410pub struct OpNewobjDo<'r> {
18411 request: Request<'r>,
18412}
18413impl<'r> OpNewobjDo<'r> {
18414 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18415 Self::write_header(request.buf_mut(), header);
18416 Self { request: request }
18417 }
18418 pub fn encode_request<'buf>(
18419 buf: &'buf mut Vec<u8>,
18420 header: &Nfgenmsg,
18421 ) -> PushObjAttrs<&'buf mut Vec<u8>> {
18422 Self::write_header(buf, header);
18423 PushObjAttrs::new(buf)
18424 }
18425 pub fn encode(&mut self) -> PushObjAttrs<&mut Vec<u8>> {
18426 PushObjAttrs::new(self.request.buf_mut())
18427 }
18428 pub fn into_encoder(self) -> PushObjAttrs<RequestBuf<'r>> {
18429 PushObjAttrs::new(self.request.buf)
18430 }
18431 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableObjAttrs<'a>) {
18432 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18433 (
18434 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18435 IterableObjAttrs::with_loc(attrs, buf.as_ptr() as usize),
18436 )
18437 }
18438 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18439 prev.as_vec_mut().extend(header.as_slice());
18440 }
18441}
18442impl NetlinkRequest for OpNewobjDo<'_> {
18443 fn protocol(&self) -> Protocol {
18444 Protocol::Raw {
18445 protonum: 12u16,
18446 request_type: 2578u16,
18447 }
18448 }
18449 fn flags(&self) -> u16 {
18450 self.request.flags
18451 }
18452 fn payload(&self) -> &[u8] {
18453 self.request.buf()
18454 }
18455 type ReplyType<'buf> = (Nfgenmsg, IterableObjAttrs<'buf>);
18456 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18457 Self::decode_request(buf)
18458 }
18459 fn lookup(
18460 buf: &[u8],
18461 offset: usize,
18462 missing_type: Option<u16>,
18463 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18464 Self::decode_request(buf)
18465 .1
18466 .lookup_attr(offset, missing_type)
18467 }
18468}
18469#[doc = "Get / dump stateful objects.\n\nRequest attributes:\n- [.push_table()](PushObjAttrs::push_table)\n- [.push_type()](PushObjAttrs::push_type)\n\nReply attributes:\n- [.get_table()](IterableObjAttrs::get_table)\n- [.get_name()](IterableObjAttrs::get_name)\n- [.get_type()](IterableObjAttrs::get_type)\n- [.get_data()](IterableObjAttrs::get_data)\n- [.get_use()](IterableObjAttrs::get_use)\n- [.get_handle()](IterableObjAttrs::get_handle)\n- [.get_userdata()](IterableObjAttrs::get_userdata)\n\n"]
18470#[derive(Debug)]
18471pub struct OpGetobjDump<'r> {
18472 request: Request<'r>,
18473}
18474impl<'r> OpGetobjDump<'r> {
18475 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18476 Self::write_header(request.buf_mut(), header);
18477 Self {
18478 request: request.set_dump(),
18479 }
18480 }
18481 pub fn encode_request<'buf>(
18482 buf: &'buf mut Vec<u8>,
18483 header: &Nfgenmsg,
18484 ) -> PushObjAttrs<&'buf mut Vec<u8>> {
18485 Self::write_header(buf, header);
18486 PushObjAttrs::new(buf)
18487 }
18488 pub fn encode(&mut self) -> PushObjAttrs<&mut Vec<u8>> {
18489 PushObjAttrs::new(self.request.buf_mut())
18490 }
18491 pub fn into_encoder(self) -> PushObjAttrs<RequestBuf<'r>> {
18492 PushObjAttrs::new(self.request.buf)
18493 }
18494 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableObjAttrs<'a>) {
18495 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18496 (
18497 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18498 IterableObjAttrs::with_loc(attrs, buf.as_ptr() as usize),
18499 )
18500 }
18501 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18502 prev.as_vec_mut().extend(header.as_slice());
18503 }
18504}
18505impl NetlinkRequest for OpGetobjDump<'_> {
18506 fn protocol(&self) -> Protocol {
18507 Protocol::Raw {
18508 protonum: 12u16,
18509 request_type: 2579u16,
18510 }
18511 }
18512 fn flags(&self) -> u16 {
18513 self.request.flags
18514 }
18515 fn payload(&self) -> &[u8] {
18516 self.request.buf()
18517 }
18518 type ReplyType<'buf> = (Nfgenmsg, IterableObjAttrs<'buf>);
18519 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18520 Self::decode_request(buf)
18521 }
18522 fn lookup(
18523 buf: &[u8],
18524 offset: usize,
18525 missing_type: Option<u16>,
18526 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18527 Self::decode_request(buf)
18528 .1
18529 .lookup_attr(offset, missing_type)
18530 }
18531}
18532#[doc = "Get / dump stateful objects.\n\nRequest attributes:\n- [.push_table()](PushObjAttrs::push_table)\n- [.push_name()](PushObjAttrs::push_name)\n- [.push_type()](PushObjAttrs::push_type)\n\nReply attributes:\n- [.get_table()](IterableObjAttrs::get_table)\n- [.get_name()](IterableObjAttrs::get_name)\n- [.get_type()](IterableObjAttrs::get_type)\n- [.get_data()](IterableObjAttrs::get_data)\n- [.get_use()](IterableObjAttrs::get_use)\n- [.get_handle()](IterableObjAttrs::get_handle)\n- [.get_userdata()](IterableObjAttrs::get_userdata)\n\n"]
18533#[derive(Debug)]
18534pub struct OpGetobjDo<'r> {
18535 request: Request<'r>,
18536}
18537impl<'r> OpGetobjDo<'r> {
18538 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18539 Self::write_header(request.buf_mut(), header);
18540 Self { request: request }
18541 }
18542 pub fn encode_request<'buf>(
18543 buf: &'buf mut Vec<u8>,
18544 header: &Nfgenmsg,
18545 ) -> PushObjAttrs<&'buf mut Vec<u8>> {
18546 Self::write_header(buf, header);
18547 PushObjAttrs::new(buf)
18548 }
18549 pub fn encode(&mut self) -> PushObjAttrs<&mut Vec<u8>> {
18550 PushObjAttrs::new(self.request.buf_mut())
18551 }
18552 pub fn into_encoder(self) -> PushObjAttrs<RequestBuf<'r>> {
18553 PushObjAttrs::new(self.request.buf)
18554 }
18555 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableObjAttrs<'a>) {
18556 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18557 (
18558 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18559 IterableObjAttrs::with_loc(attrs, buf.as_ptr() as usize),
18560 )
18561 }
18562 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18563 prev.as_vec_mut().extend(header.as_slice());
18564 }
18565}
18566impl NetlinkRequest for OpGetobjDo<'_> {
18567 fn protocol(&self) -> Protocol {
18568 Protocol::Raw {
18569 protonum: 12u16,
18570 request_type: 2579u16,
18571 }
18572 }
18573 fn flags(&self) -> u16 {
18574 self.request.flags
18575 }
18576 fn payload(&self) -> &[u8] {
18577 self.request.buf()
18578 }
18579 type ReplyType<'buf> = (Nfgenmsg, IterableObjAttrs<'buf>);
18580 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18581 Self::decode_request(buf)
18582 }
18583 fn lookup(
18584 buf: &[u8],
18585 offset: usize,
18586 missing_type: Option<u16>,
18587 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18588 Self::decode_request(buf)
18589 .1
18590 .lookup_attr(offset, missing_type)
18591 }
18592}
18593#[doc = "Delete an existing stateful object.\n\nRequest attributes:\n- [.push_table()](PushObjAttrs::push_table)\n- [.push_name()](PushObjAttrs::push_name)\n- [.push_type()](PushObjAttrs::push_type)\n- [.push_handle()](PushObjAttrs::push_handle)\n\n"]
18594#[derive(Debug)]
18595pub struct OpDelobjDo<'r> {
18596 request: Request<'r>,
18597}
18598impl<'r> OpDelobjDo<'r> {
18599 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18600 Self::write_header(request.buf_mut(), header);
18601 Self { request: request }
18602 }
18603 pub fn encode_request<'buf>(
18604 buf: &'buf mut Vec<u8>,
18605 header: &Nfgenmsg,
18606 ) -> PushObjAttrs<&'buf mut Vec<u8>> {
18607 Self::write_header(buf, header);
18608 PushObjAttrs::new(buf)
18609 }
18610 pub fn encode(&mut self) -> PushObjAttrs<&mut Vec<u8>> {
18611 PushObjAttrs::new(self.request.buf_mut())
18612 }
18613 pub fn into_encoder(self) -> PushObjAttrs<RequestBuf<'r>> {
18614 PushObjAttrs::new(self.request.buf)
18615 }
18616 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableObjAttrs<'a>) {
18617 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18618 (
18619 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18620 IterableObjAttrs::with_loc(attrs, buf.as_ptr() as usize),
18621 )
18622 }
18623 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18624 prev.as_vec_mut().extend(header.as_slice());
18625 }
18626}
18627impl NetlinkRequest for OpDelobjDo<'_> {
18628 fn protocol(&self) -> Protocol {
18629 Protocol::Raw {
18630 protonum: 12u16,
18631 request_type: 2580u16,
18632 }
18633 }
18634 fn flags(&self) -> u16 {
18635 self.request.flags
18636 }
18637 fn payload(&self) -> &[u8] {
18638 self.request.buf()
18639 }
18640 type ReplyType<'buf> = (Nfgenmsg, IterableObjAttrs<'buf>);
18641 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18642 Self::decode_request(buf)
18643 }
18644 fn lookup(
18645 buf: &[u8],
18646 offset: usize,
18647 missing_type: Option<u16>,
18648 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18649 Self::decode_request(buf)
18650 .1
18651 .lookup_attr(offset, missing_type)
18652 }
18653}
18654#[doc = "Delete an existing stateful object with destroy semantics.\n\nRequest attributes:\n- [.push_table()](PushObjAttrs::push_table)\n- [.push_name()](PushObjAttrs::push_name)\n- [.push_type()](PushObjAttrs::push_type)\n- [.push_handle()](PushObjAttrs::push_handle)\n\n"]
18655#[derive(Debug)]
18656pub struct OpDestroyobjDo<'r> {
18657 request: Request<'r>,
18658}
18659impl<'r> OpDestroyobjDo<'r> {
18660 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18661 Self::write_header(request.buf_mut(), header);
18662 Self { request: request }
18663 }
18664 pub fn encode_request<'buf>(
18665 buf: &'buf mut Vec<u8>,
18666 header: &Nfgenmsg,
18667 ) -> PushObjAttrs<&'buf mut Vec<u8>> {
18668 Self::write_header(buf, header);
18669 PushObjAttrs::new(buf)
18670 }
18671 pub fn encode(&mut self) -> PushObjAttrs<&mut Vec<u8>> {
18672 PushObjAttrs::new(self.request.buf_mut())
18673 }
18674 pub fn into_encoder(self) -> PushObjAttrs<RequestBuf<'r>> {
18675 PushObjAttrs::new(self.request.buf)
18676 }
18677 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableObjAttrs<'a>) {
18678 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18679 (
18680 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18681 IterableObjAttrs::with_loc(attrs, buf.as_ptr() as usize),
18682 )
18683 }
18684 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18685 prev.as_vec_mut().extend(header.as_slice());
18686 }
18687}
18688impl NetlinkRequest for OpDestroyobjDo<'_> {
18689 fn protocol(&self) -> Protocol {
18690 Protocol::Raw {
18691 protonum: 12u16,
18692 request_type: 2591u16,
18693 }
18694 }
18695 fn flags(&self) -> u16 {
18696 self.request.flags
18697 }
18698 fn payload(&self) -> &[u8] {
18699 self.request.buf()
18700 }
18701 type ReplyType<'buf> = (Nfgenmsg, IterableObjAttrs<'buf>);
18702 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18703 Self::decode_request(buf)
18704 }
18705 fn lookup(
18706 buf: &[u8],
18707 offset: usize,
18708 missing_type: Option<u16>,
18709 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18710 Self::decode_request(buf)
18711 .1
18712 .lookup_attr(offset, missing_type)
18713 }
18714}
18715#[doc = "Create a new flow table.\n\nRequest attributes:\n- [.push_table()](PushFlowtableAttrs::push_table)\n- [.push_name()](PushFlowtableAttrs::push_name)\n- [.nested_hook()](PushFlowtableAttrs::nested_hook)\n- [.push_flags()](PushFlowtableAttrs::push_flags)\n\n"]
18716#[derive(Debug)]
18717pub struct OpNewflowtableDo<'r> {
18718 request: Request<'r>,
18719}
18720impl<'r> OpNewflowtableDo<'r> {
18721 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18722 Self::write_header(request.buf_mut(), header);
18723 Self { request: request }
18724 }
18725 pub fn encode_request<'buf>(
18726 buf: &'buf mut Vec<u8>,
18727 header: &Nfgenmsg,
18728 ) -> PushFlowtableAttrs<&'buf mut Vec<u8>> {
18729 Self::write_header(buf, header);
18730 PushFlowtableAttrs::new(buf)
18731 }
18732 pub fn encode(&mut self) -> PushFlowtableAttrs<&mut Vec<u8>> {
18733 PushFlowtableAttrs::new(self.request.buf_mut())
18734 }
18735 pub fn into_encoder(self) -> PushFlowtableAttrs<RequestBuf<'r>> {
18736 PushFlowtableAttrs::new(self.request.buf)
18737 }
18738 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableFlowtableAttrs<'a>) {
18739 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18740 (
18741 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18742 IterableFlowtableAttrs::with_loc(attrs, buf.as_ptr() as usize),
18743 )
18744 }
18745 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18746 prev.as_vec_mut().extend(header.as_slice());
18747 }
18748}
18749impl NetlinkRequest for OpNewflowtableDo<'_> {
18750 fn protocol(&self) -> Protocol {
18751 Protocol::Raw {
18752 protonum: 12u16,
18753 request_type: 2582u16,
18754 }
18755 }
18756 fn flags(&self) -> u16 {
18757 self.request.flags
18758 }
18759 fn payload(&self) -> &[u8] {
18760 self.request.buf()
18761 }
18762 type ReplyType<'buf> = (Nfgenmsg, IterableFlowtableAttrs<'buf>);
18763 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18764 Self::decode_request(buf)
18765 }
18766 fn lookup(
18767 buf: &[u8],
18768 offset: usize,
18769 missing_type: Option<u16>,
18770 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18771 Self::decode_request(buf)
18772 .1
18773 .lookup_attr(offset, missing_type)
18774 }
18775}
18776#[doc = "Get / dump flow tables.\n\nReply attributes:\n- [.get_table()](IterableFlowtableAttrs::get_table)\n- [.get_name()](IterableFlowtableAttrs::get_name)\n- [.get_hook()](IterableFlowtableAttrs::get_hook)\n- [.get_use()](IterableFlowtableAttrs::get_use)\n- [.get_handle()](IterableFlowtableAttrs::get_handle)\n- [.get_flags()](IterableFlowtableAttrs::get_flags)\n\n"]
18777#[derive(Debug)]
18778pub struct OpGetflowtableDump<'r> {
18779 request: Request<'r>,
18780}
18781impl<'r> OpGetflowtableDump<'r> {
18782 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18783 Self::write_header(request.buf_mut(), header);
18784 Self {
18785 request: request.set_dump(),
18786 }
18787 }
18788 pub fn encode_request<'buf>(
18789 buf: &'buf mut Vec<u8>,
18790 header: &Nfgenmsg,
18791 ) -> PushFlowtableAttrs<&'buf mut Vec<u8>> {
18792 Self::write_header(buf, header);
18793 PushFlowtableAttrs::new(buf)
18794 }
18795 pub fn encode(&mut self) -> PushFlowtableAttrs<&mut Vec<u8>> {
18796 PushFlowtableAttrs::new(self.request.buf_mut())
18797 }
18798 pub fn into_encoder(self) -> PushFlowtableAttrs<RequestBuf<'r>> {
18799 PushFlowtableAttrs::new(self.request.buf)
18800 }
18801 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableFlowtableAttrs<'a>) {
18802 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18803 (
18804 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18805 IterableFlowtableAttrs::with_loc(attrs, buf.as_ptr() as usize),
18806 )
18807 }
18808 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18809 prev.as_vec_mut().extend(header.as_slice());
18810 }
18811}
18812impl NetlinkRequest for OpGetflowtableDump<'_> {
18813 fn protocol(&self) -> Protocol {
18814 Protocol::Raw {
18815 protonum: 12u16,
18816 request_type: 2583u16,
18817 }
18818 }
18819 fn flags(&self) -> u16 {
18820 self.request.flags
18821 }
18822 fn payload(&self) -> &[u8] {
18823 self.request.buf()
18824 }
18825 type ReplyType<'buf> = (Nfgenmsg, IterableFlowtableAttrs<'buf>);
18826 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18827 Self::decode_request(buf)
18828 }
18829 fn lookup(
18830 buf: &[u8],
18831 offset: usize,
18832 missing_type: Option<u16>,
18833 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18834 Self::decode_request(buf)
18835 .1
18836 .lookup_attr(offset, missing_type)
18837 }
18838}
18839#[doc = "Get / dump flow tables.\n\nRequest attributes:\n- [.push_table()](PushFlowtableAttrs::push_table)\n- [.push_name()](PushFlowtableAttrs::push_name)\n\nReply attributes:\n- [.get_table()](IterableFlowtableAttrs::get_table)\n- [.get_name()](IterableFlowtableAttrs::get_name)\n- [.get_hook()](IterableFlowtableAttrs::get_hook)\n- [.get_use()](IterableFlowtableAttrs::get_use)\n- [.get_handle()](IterableFlowtableAttrs::get_handle)\n- [.get_flags()](IterableFlowtableAttrs::get_flags)\n\n"]
18840#[derive(Debug)]
18841pub struct OpGetflowtableDo<'r> {
18842 request: Request<'r>,
18843}
18844impl<'r> OpGetflowtableDo<'r> {
18845 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18846 Self::write_header(request.buf_mut(), header);
18847 Self { request: request }
18848 }
18849 pub fn encode_request<'buf>(
18850 buf: &'buf mut Vec<u8>,
18851 header: &Nfgenmsg,
18852 ) -> PushFlowtableAttrs<&'buf mut Vec<u8>> {
18853 Self::write_header(buf, header);
18854 PushFlowtableAttrs::new(buf)
18855 }
18856 pub fn encode(&mut self) -> PushFlowtableAttrs<&mut Vec<u8>> {
18857 PushFlowtableAttrs::new(self.request.buf_mut())
18858 }
18859 pub fn into_encoder(self) -> PushFlowtableAttrs<RequestBuf<'r>> {
18860 PushFlowtableAttrs::new(self.request.buf)
18861 }
18862 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableFlowtableAttrs<'a>) {
18863 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18864 (
18865 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18866 IterableFlowtableAttrs::with_loc(attrs, buf.as_ptr() as usize),
18867 )
18868 }
18869 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18870 prev.as_vec_mut().extend(header.as_slice());
18871 }
18872}
18873impl NetlinkRequest for OpGetflowtableDo<'_> {
18874 fn protocol(&self) -> Protocol {
18875 Protocol::Raw {
18876 protonum: 12u16,
18877 request_type: 2583u16,
18878 }
18879 }
18880 fn flags(&self) -> u16 {
18881 self.request.flags
18882 }
18883 fn payload(&self) -> &[u8] {
18884 self.request.buf()
18885 }
18886 type ReplyType<'buf> = (Nfgenmsg, IterableFlowtableAttrs<'buf>);
18887 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18888 Self::decode_request(buf)
18889 }
18890 fn lookup(
18891 buf: &[u8],
18892 offset: usize,
18893 missing_type: Option<u16>,
18894 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18895 Self::decode_request(buf)
18896 .1
18897 .lookup_attr(offset, missing_type)
18898 }
18899}
18900#[doc = "Delete an existing flow table.\n\nRequest attributes:\n- [.push_table()](PushFlowtableAttrs::push_table)\n- [.push_name()](PushFlowtableAttrs::push_name)\n- [.nested_hook()](PushFlowtableAttrs::nested_hook)\n- [.push_handle()](PushFlowtableAttrs::push_handle)\n\n"]
18901#[derive(Debug)]
18902pub struct OpDelflowtableDo<'r> {
18903 request: Request<'r>,
18904}
18905impl<'r> OpDelflowtableDo<'r> {
18906 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18907 Self::write_header(request.buf_mut(), header);
18908 Self { request: request }
18909 }
18910 pub fn encode_request<'buf>(
18911 buf: &'buf mut Vec<u8>,
18912 header: &Nfgenmsg,
18913 ) -> PushFlowtableAttrs<&'buf mut Vec<u8>> {
18914 Self::write_header(buf, header);
18915 PushFlowtableAttrs::new(buf)
18916 }
18917 pub fn encode(&mut self) -> PushFlowtableAttrs<&mut Vec<u8>> {
18918 PushFlowtableAttrs::new(self.request.buf_mut())
18919 }
18920 pub fn into_encoder(self) -> PushFlowtableAttrs<RequestBuf<'r>> {
18921 PushFlowtableAttrs::new(self.request.buf)
18922 }
18923 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableFlowtableAttrs<'a>) {
18924 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18925 (
18926 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18927 IterableFlowtableAttrs::with_loc(attrs, buf.as_ptr() as usize),
18928 )
18929 }
18930 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18931 prev.as_vec_mut().extend(header.as_slice());
18932 }
18933}
18934impl NetlinkRequest for OpDelflowtableDo<'_> {
18935 fn protocol(&self) -> Protocol {
18936 Protocol::Raw {
18937 protonum: 12u16,
18938 request_type: 2584u16,
18939 }
18940 }
18941 fn flags(&self) -> u16 {
18942 self.request.flags
18943 }
18944 fn payload(&self) -> &[u8] {
18945 self.request.buf()
18946 }
18947 type ReplyType<'buf> = (Nfgenmsg, IterableFlowtableAttrs<'buf>);
18948 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18949 Self::decode_request(buf)
18950 }
18951 fn lookup(
18952 buf: &[u8],
18953 offset: usize,
18954 missing_type: Option<u16>,
18955 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18956 Self::decode_request(buf)
18957 .1
18958 .lookup_attr(offset, missing_type)
18959 }
18960}
18961#[doc = "Delete an existing flow table with destroy semantics.\n\nRequest attributes:\n- [.push_table()](PushFlowtableAttrs::push_table)\n- [.push_name()](PushFlowtableAttrs::push_name)\n- [.nested_hook()](PushFlowtableAttrs::nested_hook)\n- [.push_handle()](PushFlowtableAttrs::push_handle)\n\n"]
18962#[derive(Debug)]
18963pub struct OpDestroyflowtableDo<'r> {
18964 request: Request<'r>,
18965}
18966impl<'r> OpDestroyflowtableDo<'r> {
18967 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
18968 Self::write_header(request.buf_mut(), header);
18969 Self { request: request }
18970 }
18971 pub fn encode_request<'buf>(
18972 buf: &'buf mut Vec<u8>,
18973 header: &Nfgenmsg,
18974 ) -> PushFlowtableAttrs<&'buf mut Vec<u8>> {
18975 Self::write_header(buf, header);
18976 PushFlowtableAttrs::new(buf)
18977 }
18978 pub fn encode(&mut self) -> PushFlowtableAttrs<&mut Vec<u8>> {
18979 PushFlowtableAttrs::new(self.request.buf_mut())
18980 }
18981 pub fn into_encoder(self) -> PushFlowtableAttrs<RequestBuf<'r>> {
18982 PushFlowtableAttrs::new(self.request.buf)
18983 }
18984 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableFlowtableAttrs<'a>) {
18985 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
18986 (
18987 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
18988 IterableFlowtableAttrs::with_loc(attrs, buf.as_ptr() as usize),
18989 )
18990 }
18991 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
18992 prev.as_vec_mut().extend(header.as_slice());
18993 }
18994}
18995impl NetlinkRequest for OpDestroyflowtableDo<'_> {
18996 fn protocol(&self) -> Protocol {
18997 Protocol::Raw {
18998 protonum: 12u16,
18999 request_type: 2592u16,
19000 }
19001 }
19002 fn flags(&self) -> u16 {
19003 self.request.flags
19004 }
19005 fn payload(&self) -> &[u8] {
19006 self.request.buf()
19007 }
19008 type ReplyType<'buf> = (Nfgenmsg, IterableFlowtableAttrs<'buf>);
19009 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19010 Self::decode_request(buf)
19011 }
19012 fn lookup(
19013 buf: &[u8],
19014 offset: usize,
19015 missing_type: Option<u16>,
19016 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19017 Self::decode_request(buf)
19018 .1
19019 .lookup_attr(offset, missing_type)
19020 }
19021}
19022#[doc = "Get / dump nft_compat info\n\nReply attributes:\n- [.get_name()](IterableCompatAttrs::get_name)\n- [.get_rev()](IterableCompatAttrs::get_rev)\n- [.get_type()](IterableCompatAttrs::get_type)\n\n"]
19023#[derive(Debug)]
19024pub struct OpGetcompatDump<'r> {
19025 request: Request<'r>,
19026}
19027impl<'r> OpGetcompatDump<'r> {
19028 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
19029 Self::write_header(request.buf_mut(), header);
19030 Self {
19031 request: request.set_dump(),
19032 }
19033 }
19034 pub fn encode_request<'buf>(
19035 buf: &'buf mut Vec<u8>,
19036 header: &Nfgenmsg,
19037 ) -> PushCompatAttrs<&'buf mut Vec<u8>> {
19038 Self::write_header(buf, header);
19039 PushCompatAttrs::new(buf)
19040 }
19041 pub fn encode(&mut self) -> PushCompatAttrs<&mut Vec<u8>> {
19042 PushCompatAttrs::new(self.request.buf_mut())
19043 }
19044 pub fn into_encoder(self) -> PushCompatAttrs<RequestBuf<'r>> {
19045 PushCompatAttrs::new(self.request.buf)
19046 }
19047 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableCompatAttrs<'a>) {
19048 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
19049 (
19050 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
19051 IterableCompatAttrs::with_loc(attrs, buf.as_ptr() as usize),
19052 )
19053 }
19054 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
19055 prev.as_vec_mut().extend(header.as_slice());
19056 }
19057}
19058impl NetlinkRequest for OpGetcompatDump<'_> {
19059 fn protocol(&self) -> Protocol {
19060 Protocol::Raw {
19061 protonum: 12u16,
19062 request_type: 2816u16,
19063 }
19064 }
19065 fn flags(&self) -> u16 {
19066 self.request.flags
19067 }
19068 fn payload(&self) -> &[u8] {
19069 self.request.buf()
19070 }
19071 type ReplyType<'buf> = (Nfgenmsg, IterableCompatAttrs<'buf>);
19072 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19073 Self::decode_request(buf)
19074 }
19075 fn lookup(
19076 buf: &[u8],
19077 offset: usize,
19078 missing_type: Option<u16>,
19079 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19080 Self::decode_request(buf)
19081 .1
19082 .lookup_attr(offset, missing_type)
19083 }
19084}
19085#[doc = "Get / dump nft_compat info\n\nRequest attributes:\n- [.push_name()](PushCompatAttrs::push_name)\n- [.push_rev()](PushCompatAttrs::push_rev)\n- [.push_type()](PushCompatAttrs::push_type)\n\nReply attributes:\n- [.get_name()](IterableCompatAttrs::get_name)\n- [.get_rev()](IterableCompatAttrs::get_rev)\n- [.get_type()](IterableCompatAttrs::get_type)\n\n"]
19086#[derive(Debug)]
19087pub struct OpGetcompatDo<'r> {
19088 request: Request<'r>,
19089}
19090impl<'r> OpGetcompatDo<'r> {
19091 pub fn new(mut request: Request<'r>, header: &Nfgenmsg) -> Self {
19092 Self::write_header(request.buf_mut(), header);
19093 Self { request: request }
19094 }
19095 pub fn encode_request<'buf>(
19096 buf: &'buf mut Vec<u8>,
19097 header: &Nfgenmsg,
19098 ) -> PushCompatAttrs<&'buf mut Vec<u8>> {
19099 Self::write_header(buf, header);
19100 PushCompatAttrs::new(buf)
19101 }
19102 pub fn encode(&mut self) -> PushCompatAttrs<&mut Vec<u8>> {
19103 PushCompatAttrs::new(self.request.buf_mut())
19104 }
19105 pub fn into_encoder(self) -> PushCompatAttrs<RequestBuf<'r>> {
19106 PushCompatAttrs::new(self.request.buf)
19107 }
19108 pub fn decode_request<'a>(buf: &'a [u8]) -> (Nfgenmsg, IterableCompatAttrs<'a>) {
19109 let (header, attrs) = buf.split_at(buf.len().min(Nfgenmsg::len()));
19110 (
19111 Nfgenmsg::new_from_slice(header).unwrap_or_default(),
19112 IterableCompatAttrs::with_loc(attrs, buf.as_ptr() as usize),
19113 )
19114 }
19115 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Nfgenmsg) {
19116 prev.as_vec_mut().extend(header.as_slice());
19117 }
19118}
19119impl NetlinkRequest for OpGetcompatDo<'_> {
19120 fn protocol(&self) -> Protocol {
19121 Protocol::Raw {
19122 protonum: 12u16,
19123 request_type: 2816u16,
19124 }
19125 }
19126 fn flags(&self) -> u16 {
19127 self.request.flags
19128 }
19129 fn payload(&self) -> &[u8] {
19130 self.request.buf()
19131 }
19132 type ReplyType<'buf> = (Nfgenmsg, IterableCompatAttrs<'buf>);
19133 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19134 Self::decode_request(buf)
19135 }
19136 fn lookup(
19137 buf: &[u8],
19138 offset: usize,
19139 missing_type: Option<u16>,
19140 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19141 Self::decode_request(buf)
19142 .1
19143 .lookup_attr(offset, missing_type)
19144 }
19145}
19146#[derive(Debug)]
19147pub struct ChainedFinal<'a> {
19148 inner: Chained<'a>,
19149}
19150#[derive(Debug)]
19151pub struct Chained<'a> {
19152 buf: RequestBuf<'a>,
19153 first_seq: u32,
19154 lookups: Vec<(&'static str, LookupFn)>,
19155 last_header_offset: usize,
19156 last_kind: Option<RequestInfo>,
19157}
19158impl<'a> ChainedFinal<'a> {
19159 pub fn into_chained(self) -> Chained<'a> {
19160 self.inner
19161 }
19162 pub fn buf(&self) -> &Vec<u8> {
19163 self.inner.buf()
19164 }
19165 pub fn buf_mut(&mut self) -> &mut Vec<u8> {
19166 self.inner.buf_mut()
19167 }
19168 fn get_index(&self, seq: u32) -> Option<u32> {
19169 let min = self.inner.first_seq;
19170 let max = min.wrapping_add(self.inner.lookups.len() as u32);
19171 return if min <= max {
19172 (min..max).contains(&seq).then(|| seq - min)
19173 } else if min <= seq {
19174 Some(seq - min)
19175 } else if seq < max {
19176 Some(u32::MAX - min + seq)
19177 } else {
19178 None
19179 };
19180 }
19181}
19182impl crate::traits::NetlinkChained for ChainedFinal<'_> {
19183 fn protonum(&self) -> u16 {
19184 PROTONUM
19185 }
19186 fn payload(&self) -> &[u8] {
19187 self.buf()
19188 }
19189 fn chain_len(&self) -> usize {
19190 self.inner.lookups.len()
19191 }
19192 fn get_index(&self, seq: u32) -> Option<usize> {
19193 self.get_index(seq).map(|n| n as usize)
19194 }
19195 fn name(&self, index: usize) -> &'static str {
19196 self.inner.lookups[index].0
19197 }
19198 fn lookup(&self, index: usize) -> LookupFn {
19199 self.inner.lookups[index].1
19200 }
19201 fn supports_ack(&self, index: usize) -> Option<bool> {
19202 Some(match self.inner.lookups.get(index)?.1 as *const LookupFn {
19203 f if f == OpBatchBeginDo::lookup as *const LookupFn => false,
19204 f if f == OpBatchEndDo::lookup as *const LookupFn => false,
19205 _ => true,
19206 })
19207 }
19208}
19209impl Chained<'static> {
19210 pub fn new(first_seq: u32) -> Self {
19211 Self::new_from_buf(Vec::new(), first_seq)
19212 }
19213 pub fn new_from_buf(buf: Vec<u8>, first_seq: u32) -> Self {
19214 Self {
19215 buf: RequestBuf::Own(buf),
19216 first_seq,
19217 lookups: Vec::new(),
19218 last_header_offset: 0,
19219 last_kind: None,
19220 }
19221 }
19222 pub fn into_buf(self) -> Vec<u8> {
19223 match self.buf {
19224 RequestBuf::Own(buf) => buf,
19225 _ => unreachable!(),
19226 }
19227 }
19228}
19229impl<'a> Chained<'a> {
19230 pub fn new_with_buf(buf: &'a mut Vec<u8>, first_seq: u32) -> Self {
19231 Self {
19232 buf: RequestBuf::Ref(buf),
19233 first_seq,
19234 lookups: Vec::new(),
19235 last_header_offset: 0,
19236 last_kind: None,
19237 }
19238 }
19239 pub fn finalize(mut self) -> ChainedFinal<'a> {
19240 self.update_header();
19241 ChainedFinal { inner: self }
19242 }
19243 pub fn request(&mut self) -> Request<'_> {
19244 self.update_header();
19245 self.last_header_offset = self.buf().len();
19246 self.buf_mut().extend_from_slice(Nlmsghdr::new().as_slice());
19247 let mut request = Request::new_extend(self.buf.buf_mut());
19248 self.last_kind = None;
19249 request.writeback = Some(&mut self.last_kind);
19250 request
19251 }
19252 pub fn buf(&self) -> &Vec<u8> {
19253 self.buf.buf()
19254 }
19255 pub fn buf_mut(&mut self) -> &mut Vec<u8> {
19256 self.buf.buf_mut()
19257 }
19258 fn update_header(&mut self) {
19259 let Some(RequestInfo {
19260 protocol,
19261 flags,
19262 name,
19263 lookup,
19264 }) = self.last_kind
19265 else {
19266 if !self.buf().is_empty() {
19267 assert_eq!(self.last_header_offset + Nlmsghdr::len(), self.buf().len());
19268 self.buf.buf_mut().truncate(self.last_header_offset);
19269 }
19270 return;
19271 };
19272 let header_offset = self.last_header_offset;
19273 let request_type = match protocol {
19274 Protocol::Raw { request_type, .. } => request_type,
19275 Protocol::Generic(_) => unreachable!(),
19276 };
19277 let index = self.lookups.len();
19278 let seq = self.first_seq.wrapping_add(index as u32);
19279 self.lookups.push((name, lookup));
19280 let buf = self.buf_mut();
19281 align(buf);
19282 let header = Nlmsghdr {
19283 len: (buf.len() - header_offset) as u32,
19284 r#type: request_type,
19285 flags: flags | consts::NLM_F_REQUEST as u16 | consts::NLM_F_ACK as u16,
19286 seq,
19287 pid: 0,
19288 };
19289 buf[header_offset..(header_offset + 16)].clone_from_slice(header.as_slice());
19290 }
19291}
19292use crate::traits::LookupFn;
19293use crate::utils::RequestBuf;
19294#[derive(Debug)]
19295pub struct Request<'buf> {
19296 buf: RequestBuf<'buf>,
19297 flags: u16,
19298 writeback: Option<&'buf mut Option<RequestInfo>>,
19299}
19300#[allow(unused)]
19301#[derive(Debug, Clone)]
19302pub struct RequestInfo {
19303 protocol: Protocol,
19304 flags: u16,
19305 name: &'static str,
19306 lookup: LookupFn,
19307}
19308impl Request<'static> {
19309 pub fn new() -> Self {
19310 Self::new_from_buf(Vec::new())
19311 }
19312 pub fn new_from_buf(buf: Vec<u8>) -> Self {
19313 Self {
19314 flags: 0,
19315 buf: RequestBuf::Own(buf),
19316 writeback: None,
19317 }
19318 }
19319 pub fn into_buf(self) -> Vec<u8> {
19320 match self.buf {
19321 RequestBuf::Own(buf) => buf,
19322 _ => unreachable!(),
19323 }
19324 }
19325}
19326impl<'buf> Request<'buf> {
19327 pub fn new_with_buf(buf: &'buf mut Vec<u8>) -> Self {
19328 buf.clear();
19329 Self::new_extend(buf)
19330 }
19331 pub fn new_extend(buf: &'buf mut Vec<u8>) -> Self {
19332 Self {
19333 flags: 0,
19334 buf: RequestBuf::Ref(buf),
19335 writeback: None,
19336 }
19337 }
19338 fn do_writeback(&mut self, protocol: Protocol, name: &'static str, lookup: LookupFn) {
19339 let Some(writeback) = &mut self.writeback else {
19340 return;
19341 };
19342 **writeback = Some(RequestInfo {
19343 protocol,
19344 flags: self.flags,
19345 name,
19346 lookup,
19347 })
19348 }
19349 pub fn buf(&self) -> &Vec<u8> {
19350 self.buf.buf()
19351 }
19352 pub fn buf_mut(&mut self) -> &mut Vec<u8> {
19353 self.buf.buf_mut()
19354 }
19355 #[doc = "Set `NLM_F_CREATE` flag"]
19356 pub fn set_create(mut self) -> Self {
19357 self.flags |= consts::NLM_F_CREATE as u16;
19358 self
19359 }
19360 #[doc = "Set `NLM_F_EXCL` flag"]
19361 pub fn set_excl(mut self) -> Self {
19362 self.flags |= consts::NLM_F_EXCL as u16;
19363 self
19364 }
19365 #[doc = "Set `NLM_F_REPLACE` flag"]
19366 pub fn set_replace(mut self) -> Self {
19367 self.flags |= consts::NLM_F_REPLACE as u16;
19368 self
19369 }
19370 #[doc = "Set `NLM_F_CREATE` and `NLM_F_REPLACE` flag"]
19371 pub fn set_change(self) -> Self {
19372 self.set_create().set_replace()
19373 }
19374 #[doc = "Set `NLM_F_APPEND` flag"]
19375 pub fn set_append(mut self) -> Self {
19376 self.flags |= consts::NLM_F_APPEND as u16;
19377 self
19378 }
19379 #[doc = "Set `self.flags |= flags`"]
19380 pub fn set_flags(mut self, flags: u16) -> Self {
19381 self.flags |= flags;
19382 self
19383 }
19384 #[doc = "Set `self.flags ^= self.flags & flags`"]
19385 pub fn unset_flags(mut self, flags: u16) -> Self {
19386 self.flags ^= self.flags & flags;
19387 self
19388 }
19389 #[doc = "Set `NLM_F_DUMP` flag"]
19390 fn set_dump(mut self) -> Self {
19391 self.flags |= consts::NLM_F_DUMP as u16;
19392 self
19393 }
19394 #[doc = "Start a batch of operations\n\nRequest attributes:\n- [.push_genid()](PushBatchAttrs::push_genid)\n\nReply attributes:\n- [.get_genid()](IterableBatchAttrs::get_genid)\n\n"]
19395 pub fn op_batch_begin_do(self, header: &Nfgenmsg) -> OpBatchBeginDo<'buf> {
19396 let mut res = OpBatchBeginDo::new(self, header);
19397 res.request
19398 .do_writeback(res.protocol(), "op-batch-begin-do", OpBatchBeginDo::lookup);
19399 res
19400 }
19401 #[doc = "Finish a batch of operations\n\nRequest attributes:\n- [.push_genid()](PushBatchAttrs::push_genid)\n\n"]
19402 pub fn op_batch_end_do(self, header: &Nfgenmsg) -> OpBatchEndDo<'buf> {
19403 let mut res = OpBatchEndDo::new(self, header);
19404 res.request
19405 .do_writeback(res.protocol(), "op-batch-end-do", OpBatchEndDo::lookup);
19406 res
19407 }
19408 #[doc = "Create a new table.\n\nRequest attributes:\n- [.push_name()](PushTableAttrs::push_name)\n- [.push_flags()](PushTableAttrs::push_flags)\n- [.push_userdata()](PushTableAttrs::push_userdata)\n\n"]
19409 pub fn op_newtable_do(self, header: &Nfgenmsg) -> OpNewtableDo<'buf> {
19410 let mut res = OpNewtableDo::new(self, header);
19411 res.request
19412 .do_writeback(res.protocol(), "op-newtable-do", OpNewtableDo::lookup);
19413 res
19414 }
19415 #[doc = "Get / dump tables.\n\nReply attributes:\n- [.get_name()](IterableTableAttrs::get_name)\n- [.get_flags()](IterableTableAttrs::get_flags)\n- [.get_use()](IterableTableAttrs::get_use)\n- [.get_handle()](IterableTableAttrs::get_handle)\n- [.get_userdata()](IterableTableAttrs::get_userdata)\n- [.get_owner()](IterableTableAttrs::get_owner)\n\n"]
19416 pub fn op_gettable_dump(self, header: &Nfgenmsg) -> OpGettableDump<'buf> {
19417 let mut res = OpGettableDump::new(self, header);
19418 res.request
19419 .do_writeback(res.protocol(), "op-gettable-dump", OpGettableDump::lookup);
19420 res
19421 }
19422 #[doc = "Get / dump tables.\n\nRequest attributes:\n- [.push_name()](PushTableAttrs::push_name)\n\nReply attributes:\n- [.get_name()](IterableTableAttrs::get_name)\n- [.get_flags()](IterableTableAttrs::get_flags)\n- [.get_use()](IterableTableAttrs::get_use)\n- [.get_handle()](IterableTableAttrs::get_handle)\n- [.get_userdata()](IterableTableAttrs::get_userdata)\n- [.get_owner()](IterableTableAttrs::get_owner)\n\n"]
19423 pub fn op_gettable_do(self, header: &Nfgenmsg) -> OpGettableDo<'buf> {
19424 let mut res = OpGettableDo::new(self, header);
19425 res.request
19426 .do_writeback(res.protocol(), "op-gettable-do", OpGettableDo::lookup);
19427 res
19428 }
19429 #[doc = "Delete an existing table.\n\nRequest attributes:\n- [.push_name()](PushTableAttrs::push_name)\n- [.push_handle()](PushTableAttrs::push_handle)\n\n"]
19430 pub fn op_deltable_do(self, header: &Nfgenmsg) -> OpDeltableDo<'buf> {
19431 let mut res = OpDeltableDo::new(self, header);
19432 res.request
19433 .do_writeback(res.protocol(), "op-deltable-do", OpDeltableDo::lookup);
19434 res
19435 }
19436 #[doc = "Delete an existing table with destroy semantics (ignoring ENOENT\nerrors).\n\nRequest attributes:\n- [.push_name()](PushTableAttrs::push_name)\n- [.push_handle()](PushTableAttrs::push_handle)\n\n"]
19437 pub fn op_destroytable_do(self, header: &Nfgenmsg) -> OpDestroytableDo<'buf> {
19438 let mut res = OpDestroytableDo::new(self, header);
19439 res.request.do_writeback(
19440 res.protocol(),
19441 "op-destroytable-do",
19442 OpDestroytableDo::lookup,
19443 );
19444 res
19445 }
19446 #[doc = "Create a new chain.\n\nRequest attributes:\n- [.push_table()](PushChainAttrs::push_table)\n- [.push_handle()](PushChainAttrs::push_handle)\n- [.push_name()](PushChainAttrs::push_name)\n- [.nested_hook()](PushChainAttrs::nested_hook)\n- [.push_policy()](PushChainAttrs::push_policy)\n- [.push_type()](PushChainAttrs::push_type)\n- [.nested_counters()](PushChainAttrs::nested_counters)\n- [.push_flags()](PushChainAttrs::push_flags)\n- [.push_userdata()](PushChainAttrs::push_userdata)\n\n"]
19447 pub fn op_newchain_do(self, header: &Nfgenmsg) -> OpNewchainDo<'buf> {
19448 let mut res = OpNewchainDo::new(self, header);
19449 res.request
19450 .do_writeback(res.protocol(), "op-newchain-do", OpNewchainDo::lookup);
19451 res
19452 }
19453 #[doc = "Get / dump chains.\n\nReply attributes:\n- [.get_table()](IterableChainAttrs::get_table)\n- [.get_handle()](IterableChainAttrs::get_handle)\n- [.get_name()](IterableChainAttrs::get_name)\n- [.get_hook()](IterableChainAttrs::get_hook)\n- [.get_policy()](IterableChainAttrs::get_policy)\n- [.get_use()](IterableChainAttrs::get_use)\n- [.get_type()](IterableChainAttrs::get_type)\n- [.get_counters()](IterableChainAttrs::get_counters)\n- [.get_flags()](IterableChainAttrs::get_flags)\n- [.get_id()](IterableChainAttrs::get_id)\n- [.get_userdata()](IterableChainAttrs::get_userdata)\n\n"]
19454 pub fn op_getchain_dump(self, header: &Nfgenmsg) -> OpGetchainDump<'buf> {
19455 let mut res = OpGetchainDump::new(self, header);
19456 res.request
19457 .do_writeback(res.protocol(), "op-getchain-dump", OpGetchainDump::lookup);
19458 res
19459 }
19460 #[doc = "Get / dump chains.\n\nRequest attributes:\n- [.push_table()](PushChainAttrs::push_table)\n- [.push_name()](PushChainAttrs::push_name)\n\nReply attributes:\n- [.get_table()](IterableChainAttrs::get_table)\n- [.get_handle()](IterableChainAttrs::get_handle)\n- [.get_name()](IterableChainAttrs::get_name)\n- [.get_hook()](IterableChainAttrs::get_hook)\n- [.get_policy()](IterableChainAttrs::get_policy)\n- [.get_use()](IterableChainAttrs::get_use)\n- [.get_type()](IterableChainAttrs::get_type)\n- [.get_counters()](IterableChainAttrs::get_counters)\n- [.get_flags()](IterableChainAttrs::get_flags)\n- [.get_id()](IterableChainAttrs::get_id)\n- [.get_userdata()](IterableChainAttrs::get_userdata)\n\n"]
19461 pub fn op_getchain_do(self, header: &Nfgenmsg) -> OpGetchainDo<'buf> {
19462 let mut res = OpGetchainDo::new(self, header);
19463 res.request
19464 .do_writeback(res.protocol(), "op-getchain-do", OpGetchainDo::lookup);
19465 res
19466 }
19467 #[doc = "Delete an existing chain.\n\nRequest attributes:\n- [.push_table()](PushChainAttrs::push_table)\n- [.push_handle()](PushChainAttrs::push_handle)\n- [.push_name()](PushChainAttrs::push_name)\n- [.nested_hook()](PushChainAttrs::nested_hook)\n\n"]
19468 pub fn op_delchain_do(self, header: &Nfgenmsg) -> OpDelchainDo<'buf> {
19469 let mut res = OpDelchainDo::new(self, header);
19470 res.request
19471 .do_writeback(res.protocol(), "op-delchain-do", OpDelchainDo::lookup);
19472 res
19473 }
19474 #[doc = "Delete an existing chain with destroy semantics (ignoring ENOENT\nerrors).\n\nRequest attributes:\n- [.push_table()](PushChainAttrs::push_table)\n- [.push_handle()](PushChainAttrs::push_handle)\n- [.push_name()](PushChainAttrs::push_name)\n- [.nested_hook()](PushChainAttrs::nested_hook)\n\n"]
19475 pub fn op_destroychain_do(self, header: &Nfgenmsg) -> OpDestroychainDo<'buf> {
19476 let mut res = OpDestroychainDo::new(self, header);
19477 res.request.do_writeback(
19478 res.protocol(),
19479 "op-destroychain-do",
19480 OpDestroychainDo::lookup,
19481 );
19482 res
19483 }
19484 #[doc = "Create a new rule.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n- [.nested_expressions()](PushRuleAttrs::nested_expressions)\n- [.nested_compat()](PushRuleAttrs::nested_compat)\n- [.push_position()](PushRuleAttrs::push_position)\n- [.push_userdata()](PushRuleAttrs::push_userdata)\n- [.push_position_id()](PushRuleAttrs::push_position_id)\n- [.push_chain_id()](PushRuleAttrs::push_chain_id)\n\n"]
19485 pub fn op_newrule_do(self, header: &Nfgenmsg) -> OpNewruleDo<'buf> {
19486 let mut res = OpNewruleDo::new(self, header);
19487 res.request
19488 .do_writeback(res.protocol(), "op-newrule-do", OpNewruleDo::lookup);
19489 res
19490 }
19491 #[doc = "Get / dump rules.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n\nReply attributes:\n- [.get_table()](IterableRuleAttrs::get_table)\n- [.get_chain()](IterableRuleAttrs::get_chain)\n- [.get_handle()](IterableRuleAttrs::get_handle)\n- [.get_expressions()](IterableRuleAttrs::get_expressions)\n- [.get_position()](IterableRuleAttrs::get_position)\n- [.get_userdata()](IterableRuleAttrs::get_userdata)\n\n"]
19492 pub fn op_getrule_dump(self, header: &Nfgenmsg) -> OpGetruleDump<'buf> {
19493 let mut res = OpGetruleDump::new(self, header);
19494 res.request
19495 .do_writeback(res.protocol(), "op-getrule-dump", OpGetruleDump::lookup);
19496 res
19497 }
19498 #[doc = "Get / dump rules.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n\nReply attributes:\n- [.get_table()](IterableRuleAttrs::get_table)\n- [.get_chain()](IterableRuleAttrs::get_chain)\n- [.get_handle()](IterableRuleAttrs::get_handle)\n- [.get_expressions()](IterableRuleAttrs::get_expressions)\n- [.get_position()](IterableRuleAttrs::get_position)\n- [.get_userdata()](IterableRuleAttrs::get_userdata)\n\n"]
19499 pub fn op_getrule_do(self, header: &Nfgenmsg) -> OpGetruleDo<'buf> {
19500 let mut res = OpGetruleDo::new(self, header);
19501 res.request
19502 .do_writeback(res.protocol(), "op-getrule-do", OpGetruleDo::lookup);
19503 res
19504 }
19505 #[doc = "Get / dump rules and reset stateful expressions.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n\nReply attributes:\n- [.get_table()](IterableRuleAttrs::get_table)\n- [.get_chain()](IterableRuleAttrs::get_chain)\n- [.get_handle()](IterableRuleAttrs::get_handle)\n- [.get_expressions()](IterableRuleAttrs::get_expressions)\n- [.get_position()](IterableRuleAttrs::get_position)\n- [.get_userdata()](IterableRuleAttrs::get_userdata)\n\n"]
19506 pub fn op_getrule_reset_dump(self, header: &Nfgenmsg) -> OpGetruleResetDump<'buf> {
19507 let mut res = OpGetruleResetDump::new(self, header);
19508 res.request.do_writeback(
19509 res.protocol(),
19510 "op-getrule-reset-dump",
19511 OpGetruleResetDump::lookup,
19512 );
19513 res
19514 }
19515 #[doc = "Get / dump rules and reset stateful expressions.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n\nReply attributes:\n- [.get_table()](IterableRuleAttrs::get_table)\n- [.get_chain()](IterableRuleAttrs::get_chain)\n- [.get_handle()](IterableRuleAttrs::get_handle)\n- [.get_expressions()](IterableRuleAttrs::get_expressions)\n- [.get_position()](IterableRuleAttrs::get_position)\n- [.get_userdata()](IterableRuleAttrs::get_userdata)\n\n"]
19516 pub fn op_getrule_reset_do(self, header: &Nfgenmsg) -> OpGetruleResetDo<'buf> {
19517 let mut res = OpGetruleResetDo::new(self, header);
19518 res.request.do_writeback(
19519 res.protocol(),
19520 "op-getrule-reset-do",
19521 OpGetruleResetDo::lookup,
19522 );
19523 res
19524 }
19525 #[doc = "Delete an existing rule.\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n- [.push_id()](PushRuleAttrs::push_id)\n\n"]
19526 pub fn op_delrule_do(self, header: &Nfgenmsg) -> OpDelruleDo<'buf> {
19527 let mut res = OpDelruleDo::new(self, header);
19528 res.request
19529 .do_writeback(res.protocol(), "op-delrule-do", OpDelruleDo::lookup);
19530 res
19531 }
19532 #[doc = "Delete an existing rule with destroy semantics (ignoring ENOENT errors).\n\nRequest attributes:\n- [.push_table()](PushRuleAttrs::push_table)\n- [.push_chain()](PushRuleAttrs::push_chain)\n- [.push_handle()](PushRuleAttrs::push_handle)\n- [.push_id()](PushRuleAttrs::push_id)\n\n"]
19533 pub fn op_destroyrule_do(self, header: &Nfgenmsg) -> OpDestroyruleDo<'buf> {
19534 let mut res = OpDestroyruleDo::new(self, header);
19535 res.request
19536 .do_writeback(res.protocol(), "op-destroyrule-do", OpDestroyruleDo::lookup);
19537 res
19538 }
19539 #[doc = "Create a new set.\n\nRequest attributes:\n- [.push_table()](PushSetAttrs::push_table)\n- [.push_name()](PushSetAttrs::push_name)\n- [.push_flags()](PushSetAttrs::push_flags)\n- [.push_key_type()](PushSetAttrs::push_key_type)\n- [.push_key_len()](PushSetAttrs::push_key_len)\n- [.push_data_type()](PushSetAttrs::push_data_type)\n- [.push_data_len()](PushSetAttrs::push_data_len)\n- [.push_policy()](PushSetAttrs::push_policy)\n- [.nested_desc()](PushSetAttrs::nested_desc)\n- [.push_id()](PushSetAttrs::push_id)\n- [.push_timeout()](PushSetAttrs::push_timeout)\n- [.push_gc_interval()](PushSetAttrs::push_gc_interval)\n- [.push_userdata()](PushSetAttrs::push_userdata)\n- [.push_obj_type()](PushSetAttrs::push_obj_type)\n\n"]
19540 pub fn op_newset_do(self, header: &Nfgenmsg) -> OpNewsetDo<'buf> {
19541 let mut res = OpNewsetDo::new(self, header);
19542 res.request
19543 .do_writeback(res.protocol(), "op-newset-do", OpNewsetDo::lookup);
19544 res
19545 }
19546 #[doc = "Get / dump sets.\n\nRequest attributes:\n- [.push_table()](PushSetAttrs::push_table)\n\nReply attributes:\n- [.get_table()](IterableSetAttrs::get_table)\n- [.get_name()](IterableSetAttrs::get_name)\n- [.get_flags()](IterableSetAttrs::get_flags)\n- [.get_key_type()](IterableSetAttrs::get_key_type)\n- [.get_key_len()](IterableSetAttrs::get_key_len)\n- [.get_data_type()](IterableSetAttrs::get_data_type)\n- [.get_data_len()](IterableSetAttrs::get_data_len)\n- [.get_policy()](IterableSetAttrs::get_policy)\n- [.get_desc()](IterableSetAttrs::get_desc)\n- [.get_gc_interval()](IterableSetAttrs::get_gc_interval)\n- [.get_userdata()](IterableSetAttrs::get_userdata)\n- [.get_obj_type()](IterableSetAttrs::get_obj_type)\n- [.get_handle()](IterableSetAttrs::get_handle)\n- [.get_expr()](IterableSetAttrs::get_expr)\n- [.get_expressions()](IterableSetAttrs::get_expressions)\n\n"]
19547 pub fn op_getset_dump(self, header: &Nfgenmsg) -> OpGetsetDump<'buf> {
19548 let mut res = OpGetsetDump::new(self, header);
19549 res.request
19550 .do_writeback(res.protocol(), "op-getset-dump", OpGetsetDump::lookup);
19551 res
19552 }
19553 #[doc = "Get / dump sets.\n\nRequest attributes:\n- [.push_table()](PushSetAttrs::push_table)\n- [.push_name()](PushSetAttrs::push_name)\n\nReply attributes:\n- [.get_table()](IterableSetAttrs::get_table)\n- [.get_name()](IterableSetAttrs::get_name)\n- [.get_flags()](IterableSetAttrs::get_flags)\n- [.get_key_type()](IterableSetAttrs::get_key_type)\n- [.get_key_len()](IterableSetAttrs::get_key_len)\n- [.get_data_type()](IterableSetAttrs::get_data_type)\n- [.get_data_len()](IterableSetAttrs::get_data_len)\n- [.get_policy()](IterableSetAttrs::get_policy)\n- [.get_desc()](IterableSetAttrs::get_desc)\n- [.get_gc_interval()](IterableSetAttrs::get_gc_interval)\n- [.get_userdata()](IterableSetAttrs::get_userdata)\n- [.get_obj_type()](IterableSetAttrs::get_obj_type)\n- [.get_handle()](IterableSetAttrs::get_handle)\n- [.get_expr()](IterableSetAttrs::get_expr)\n- [.get_expressions()](IterableSetAttrs::get_expressions)\n\n"]
19554 pub fn op_getset_do(self, header: &Nfgenmsg) -> OpGetsetDo<'buf> {
19555 let mut res = OpGetsetDo::new(self, header);
19556 res.request
19557 .do_writeback(res.protocol(), "op-getset-do", OpGetsetDo::lookup);
19558 res
19559 }
19560 #[doc = "Delete an existing set.\n\nRequest attributes:\n- [.push_table()](PushSetAttrs::push_table)\n- [.push_name()](PushSetAttrs::push_name)\n- [.push_handle()](PushSetAttrs::push_handle)\n\n"]
19561 pub fn op_delset_do(self, header: &Nfgenmsg) -> OpDelsetDo<'buf> {
19562 let mut res = OpDelsetDo::new(self, header);
19563 res.request
19564 .do_writeback(res.protocol(), "op-delset-do", OpDelsetDo::lookup);
19565 res
19566 }
19567 #[doc = "Delete an existing set with destroy semantics (ignoring ENOENT errors).\n\nRequest attributes:\n- [.push_table()](PushSetAttrs::push_table)\n- [.push_name()](PushSetAttrs::push_name)\n- [.push_handle()](PushSetAttrs::push_handle)\n\n"]
19568 pub fn op_destroyset_do(self, header: &Nfgenmsg) -> OpDestroysetDo<'buf> {
19569 let mut res = OpDestroysetDo::new(self, header);
19570 res.request
19571 .do_writeback(res.protocol(), "op-destroyset-do", OpDestroysetDo::lookup);
19572 res
19573 }
19574 #[doc = "Create a new set element.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n- [.nested_elements()](PushSetelemListAttrs::nested_elements)\n- [.push_set_id()](PushSetelemListAttrs::push_set_id)\n\n"]
19575 pub fn op_newsetelem_do(self, header: &Nfgenmsg) -> OpNewsetelemDo<'buf> {
19576 let mut res = OpNewsetelemDo::new(self, header);
19577 res.request
19578 .do_writeback(res.protocol(), "op-newsetelem-do", OpNewsetelemDo::lookup);
19579 res
19580 }
19581 #[doc = "Get / dump set elements.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n\nReply attributes:\n- [.get_table()](IterableSetelemListAttrs::get_table)\n- [.get_set()](IterableSetelemListAttrs::get_set)\n- [.get_elements()](IterableSetelemListAttrs::get_elements)\n\n"]
19582 pub fn op_getsetelem_dump(self, header: &Nfgenmsg) -> OpGetsetelemDump<'buf> {
19583 let mut res = OpGetsetelemDump::new(self, header);
19584 res.request.do_writeback(
19585 res.protocol(),
19586 "op-getsetelem-dump",
19587 OpGetsetelemDump::lookup,
19588 );
19589 res
19590 }
19591 #[doc = "Get / dump set elements.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n- [.nested_elements()](PushSetelemListAttrs::nested_elements)\n\nReply attributes:\n- [.get_elements()](IterableSetelemListAttrs::get_elements)\n\n"]
19592 pub fn op_getsetelem_do(self, header: &Nfgenmsg) -> OpGetsetelemDo<'buf> {
19593 let mut res = OpGetsetelemDo::new(self, header);
19594 res.request
19595 .do_writeback(res.protocol(), "op-getsetelem-do", OpGetsetelemDo::lookup);
19596 res
19597 }
19598 #[doc = "Get / dump set elements and reset stateful expressions.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n\nReply attributes:\n- [.get_table()](IterableSetelemListAttrs::get_table)\n- [.get_set()](IterableSetelemListAttrs::get_set)\n- [.get_elements()](IterableSetelemListAttrs::get_elements)\n\n"]
19599 pub fn op_getsetelem_reset_dump(self, header: &Nfgenmsg) -> OpGetsetelemResetDump<'buf> {
19600 let mut res = OpGetsetelemResetDump::new(self, header);
19601 res.request.do_writeback(
19602 res.protocol(),
19603 "op-getsetelem-reset-dump",
19604 OpGetsetelemResetDump::lookup,
19605 );
19606 res
19607 }
19608 #[doc = "Get / dump set elements and reset stateful expressions.\n\nRequest attributes:\n- [.nested_elements()](PushSetelemListAttrs::nested_elements)\n\nReply attributes:\n- [.get_table()](IterableSetelemListAttrs::get_table)\n- [.get_set()](IterableSetelemListAttrs::get_set)\n- [.get_elements()](IterableSetelemListAttrs::get_elements)\n\n"]
19609 pub fn op_getsetelem_reset_do(self, header: &Nfgenmsg) -> OpGetsetelemResetDo<'buf> {
19610 let mut res = OpGetsetelemResetDo::new(self, header);
19611 res.request.do_writeback(
19612 res.protocol(),
19613 "op-getsetelem-reset-do",
19614 OpGetsetelemResetDo::lookup,
19615 );
19616 res
19617 }
19618 #[doc = "Delete an existing set element.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n- [.nested_elements()](PushSetelemListAttrs::nested_elements)\n\n"]
19619 pub fn op_delsetelem_do(self, header: &Nfgenmsg) -> OpDelsetelemDo<'buf> {
19620 let mut res = OpDelsetelemDo::new(self, header);
19621 res.request
19622 .do_writeback(res.protocol(), "op-delsetelem-do", OpDelsetelemDo::lookup);
19623 res
19624 }
19625 #[doc = "Delete an existing set element with destroy semantics.\n\nRequest attributes:\n- [.push_table()](PushSetelemListAttrs::push_table)\n- [.push_set()](PushSetelemListAttrs::push_set)\n- [.nested_elements()](PushSetelemListAttrs::nested_elements)\n\n"]
19626 pub fn op_destroysetelem_do(self, header: &Nfgenmsg) -> OpDestroysetelemDo<'buf> {
19627 let mut res = OpDestroysetelemDo::new(self, header);
19628 res.request.do_writeback(
19629 res.protocol(),
19630 "op-destroysetelem-do",
19631 OpDestroysetelemDo::lookup,
19632 );
19633 res
19634 }
19635 #[doc = "Get / dump rule-set generation.\n\nReply attributes:\n- [.get_id()](IterableGenAttrs::get_id)\n- [.get_proc_pid()](IterableGenAttrs::get_proc_pid)\n- [.get_proc_name()](IterableGenAttrs::get_proc_name)\n\n"]
19636 pub fn op_getgen_dump(self, header: &Nfgenmsg) -> OpGetgenDump<'buf> {
19637 let mut res = OpGetgenDump::new(self, header);
19638 res.request
19639 .do_writeback(res.protocol(), "op-getgen-dump", OpGetgenDump::lookup);
19640 res
19641 }
19642 #[doc = "Get / dump rule-set generation.\n\nReply attributes:\n- [.get_id()](IterableGenAttrs::get_id)\n- [.get_proc_pid()](IterableGenAttrs::get_proc_pid)\n- [.get_proc_name()](IterableGenAttrs::get_proc_name)\n\n"]
19643 pub fn op_getgen_do(self, header: &Nfgenmsg) -> OpGetgenDo<'buf> {
19644 let mut res = OpGetgenDo::new(self, header);
19645 res.request
19646 .do_writeback(res.protocol(), "op-getgen-do", OpGetgenDo::lookup);
19647 res
19648 }
19649 #[doc = "Create a new stateful object.\n\nRequest attributes:\n- [.push_table()](PushObjAttrs::push_table)\n- [.push_name()](PushObjAttrs::push_name)\n- [.push_type()](PushObjAttrs::push_type)\n- [.nested_data_counter()](PushObjAttrs::nested_data_counter)\n- [.nested_data_quota()](PushObjAttrs::nested_data_quota)\n- [.push_userdata()](PushObjAttrs::push_userdata)\n\n"]
19650 pub fn op_newobj_do(self, header: &Nfgenmsg) -> OpNewobjDo<'buf> {
19651 let mut res = OpNewobjDo::new(self, header);
19652 res.request
19653 .do_writeback(res.protocol(), "op-newobj-do", OpNewobjDo::lookup);
19654 res
19655 }
19656 #[doc = "Get / dump stateful objects.\n\nRequest attributes:\n- [.push_table()](PushObjAttrs::push_table)\n- [.push_type()](PushObjAttrs::push_type)\n\nReply attributes:\n- [.get_table()](IterableObjAttrs::get_table)\n- [.get_name()](IterableObjAttrs::get_name)\n- [.get_type()](IterableObjAttrs::get_type)\n- [.get_data()](IterableObjAttrs::get_data)\n- [.get_use()](IterableObjAttrs::get_use)\n- [.get_handle()](IterableObjAttrs::get_handle)\n- [.get_userdata()](IterableObjAttrs::get_userdata)\n\n"]
19657 pub fn op_getobj_dump(self, header: &Nfgenmsg) -> OpGetobjDump<'buf> {
19658 let mut res = OpGetobjDump::new(self, header);
19659 res.request
19660 .do_writeback(res.protocol(), "op-getobj-dump", OpGetobjDump::lookup);
19661 res
19662 }
19663 #[doc = "Get / dump stateful objects.\n\nRequest attributes:\n- [.push_table()](PushObjAttrs::push_table)\n- [.push_name()](PushObjAttrs::push_name)\n- [.push_type()](PushObjAttrs::push_type)\n\nReply attributes:\n- [.get_table()](IterableObjAttrs::get_table)\n- [.get_name()](IterableObjAttrs::get_name)\n- [.get_type()](IterableObjAttrs::get_type)\n- [.get_data()](IterableObjAttrs::get_data)\n- [.get_use()](IterableObjAttrs::get_use)\n- [.get_handle()](IterableObjAttrs::get_handle)\n- [.get_userdata()](IterableObjAttrs::get_userdata)\n\n"]
19664 pub fn op_getobj_do(self, header: &Nfgenmsg) -> OpGetobjDo<'buf> {
19665 let mut res = OpGetobjDo::new(self, header);
19666 res.request
19667 .do_writeback(res.protocol(), "op-getobj-do", OpGetobjDo::lookup);
19668 res
19669 }
19670 #[doc = "Delete an existing stateful object.\n\nRequest attributes:\n- [.push_table()](PushObjAttrs::push_table)\n- [.push_name()](PushObjAttrs::push_name)\n- [.push_type()](PushObjAttrs::push_type)\n- [.push_handle()](PushObjAttrs::push_handle)\n\n"]
19671 pub fn op_delobj_do(self, header: &Nfgenmsg) -> OpDelobjDo<'buf> {
19672 let mut res = OpDelobjDo::new(self, header);
19673 res.request
19674 .do_writeback(res.protocol(), "op-delobj-do", OpDelobjDo::lookup);
19675 res
19676 }
19677 #[doc = "Delete an existing stateful object with destroy semantics.\n\nRequest attributes:\n- [.push_table()](PushObjAttrs::push_table)\n- [.push_name()](PushObjAttrs::push_name)\n- [.push_type()](PushObjAttrs::push_type)\n- [.push_handle()](PushObjAttrs::push_handle)\n\n"]
19678 pub fn op_destroyobj_do(self, header: &Nfgenmsg) -> OpDestroyobjDo<'buf> {
19679 let mut res = OpDestroyobjDo::new(self, header);
19680 res.request
19681 .do_writeback(res.protocol(), "op-destroyobj-do", OpDestroyobjDo::lookup);
19682 res
19683 }
19684 #[doc = "Create a new flow table.\n\nRequest attributes:\n- [.push_table()](PushFlowtableAttrs::push_table)\n- [.push_name()](PushFlowtableAttrs::push_name)\n- [.nested_hook()](PushFlowtableAttrs::nested_hook)\n- [.push_flags()](PushFlowtableAttrs::push_flags)\n\n"]
19685 pub fn op_newflowtable_do(self, header: &Nfgenmsg) -> OpNewflowtableDo<'buf> {
19686 let mut res = OpNewflowtableDo::new(self, header);
19687 res.request.do_writeback(
19688 res.protocol(),
19689 "op-newflowtable-do",
19690 OpNewflowtableDo::lookup,
19691 );
19692 res
19693 }
19694 #[doc = "Get / dump flow tables.\n\nReply attributes:\n- [.get_table()](IterableFlowtableAttrs::get_table)\n- [.get_name()](IterableFlowtableAttrs::get_name)\n- [.get_hook()](IterableFlowtableAttrs::get_hook)\n- [.get_use()](IterableFlowtableAttrs::get_use)\n- [.get_handle()](IterableFlowtableAttrs::get_handle)\n- [.get_flags()](IterableFlowtableAttrs::get_flags)\n\n"]
19695 pub fn op_getflowtable_dump(self, header: &Nfgenmsg) -> OpGetflowtableDump<'buf> {
19696 let mut res = OpGetflowtableDump::new(self, header);
19697 res.request.do_writeback(
19698 res.protocol(),
19699 "op-getflowtable-dump",
19700 OpGetflowtableDump::lookup,
19701 );
19702 res
19703 }
19704 #[doc = "Get / dump flow tables.\n\nRequest attributes:\n- [.push_table()](PushFlowtableAttrs::push_table)\n- [.push_name()](PushFlowtableAttrs::push_name)\n\nReply attributes:\n- [.get_table()](IterableFlowtableAttrs::get_table)\n- [.get_name()](IterableFlowtableAttrs::get_name)\n- [.get_hook()](IterableFlowtableAttrs::get_hook)\n- [.get_use()](IterableFlowtableAttrs::get_use)\n- [.get_handle()](IterableFlowtableAttrs::get_handle)\n- [.get_flags()](IterableFlowtableAttrs::get_flags)\n\n"]
19705 pub fn op_getflowtable_do(self, header: &Nfgenmsg) -> OpGetflowtableDo<'buf> {
19706 let mut res = OpGetflowtableDo::new(self, header);
19707 res.request.do_writeback(
19708 res.protocol(),
19709 "op-getflowtable-do",
19710 OpGetflowtableDo::lookup,
19711 );
19712 res
19713 }
19714 #[doc = "Delete an existing flow table.\n\nRequest attributes:\n- [.push_table()](PushFlowtableAttrs::push_table)\n- [.push_name()](PushFlowtableAttrs::push_name)\n- [.nested_hook()](PushFlowtableAttrs::nested_hook)\n- [.push_handle()](PushFlowtableAttrs::push_handle)\n\n"]
19715 pub fn op_delflowtable_do(self, header: &Nfgenmsg) -> OpDelflowtableDo<'buf> {
19716 let mut res = OpDelflowtableDo::new(self, header);
19717 res.request.do_writeback(
19718 res.protocol(),
19719 "op-delflowtable-do",
19720 OpDelflowtableDo::lookup,
19721 );
19722 res
19723 }
19724 #[doc = "Delete an existing flow table with destroy semantics.\n\nRequest attributes:\n- [.push_table()](PushFlowtableAttrs::push_table)\n- [.push_name()](PushFlowtableAttrs::push_name)\n- [.nested_hook()](PushFlowtableAttrs::nested_hook)\n- [.push_handle()](PushFlowtableAttrs::push_handle)\n\n"]
19725 pub fn op_destroyflowtable_do(self, header: &Nfgenmsg) -> OpDestroyflowtableDo<'buf> {
19726 let mut res = OpDestroyflowtableDo::new(self, header);
19727 res.request.do_writeback(
19728 res.protocol(),
19729 "op-destroyflowtable-do",
19730 OpDestroyflowtableDo::lookup,
19731 );
19732 res
19733 }
19734 #[doc = "Get / dump nft_compat info\n\nReply attributes:\n- [.get_name()](IterableCompatAttrs::get_name)\n- [.get_rev()](IterableCompatAttrs::get_rev)\n- [.get_type()](IterableCompatAttrs::get_type)\n\n"]
19735 pub fn op_getcompat_dump(self, header: &Nfgenmsg) -> OpGetcompatDump<'buf> {
19736 let mut res = OpGetcompatDump::new(self, header);
19737 res.request
19738 .do_writeback(res.protocol(), "op-getcompat-dump", OpGetcompatDump::lookup);
19739 res
19740 }
19741 #[doc = "Get / dump nft_compat info\n\nRequest attributes:\n- [.push_name()](PushCompatAttrs::push_name)\n- [.push_rev()](PushCompatAttrs::push_rev)\n- [.push_type()](PushCompatAttrs::push_type)\n\nReply attributes:\n- [.get_name()](IterableCompatAttrs::get_name)\n- [.get_rev()](IterableCompatAttrs::get_rev)\n- [.get_type()](IterableCompatAttrs::get_type)\n\n"]
19742 pub fn op_getcompat_do(self, header: &Nfgenmsg) -> OpGetcompatDo<'buf> {
19743 let mut res = OpGetcompatDo::new(self, header);
19744 res.request
19745 .do_writeback(res.protocol(), "op-getcompat-do", OpGetcompatDo::lookup);
19746 res
19747 }
19748}
19749#[cfg(test)]
19750mod generated_tests {
19751 use super::*;
19752 #[test]
19753 fn tests() {
19754 let _ = IterableBatchAttrs::get_genid;
19755 let _ = IterableChainAttrs::get_counters;
19756 let _ = IterableChainAttrs::get_flags;
19757 let _ = IterableChainAttrs::get_handle;
19758 let _ = IterableChainAttrs::get_hook;
19759 let _ = IterableChainAttrs::get_id;
19760 let _ = IterableChainAttrs::get_name;
19761 let _ = IterableChainAttrs::get_policy;
19762 let _ = IterableChainAttrs::get_table;
19763 let _ = IterableChainAttrs::get_type;
19764 let _ = IterableChainAttrs::get_use;
19765 let _ = IterableChainAttrs::get_userdata;
19766 let _ = IterableCompatAttrs::get_name;
19767 let _ = IterableCompatAttrs::get_rev;
19768 let _ = IterableCompatAttrs::get_type;
19769 let _ = IterableFlowtableAttrs::get_flags;
19770 let _ = IterableFlowtableAttrs::get_handle;
19771 let _ = IterableFlowtableAttrs::get_hook;
19772 let _ = IterableFlowtableAttrs::get_name;
19773 let _ = IterableFlowtableAttrs::get_table;
19774 let _ = IterableFlowtableAttrs::get_use;
19775 let _ = IterableGenAttrs::get_id;
19776 let _ = IterableGenAttrs::get_proc_name;
19777 let _ = IterableGenAttrs::get_proc_pid;
19778 let _ = IterableObjAttrs::get_data;
19779 let _ = IterableObjAttrs::get_handle;
19780 let _ = IterableObjAttrs::get_name;
19781 let _ = IterableObjAttrs::get_table;
19782 let _ = IterableObjAttrs::get_type;
19783 let _ = IterableObjAttrs::get_use;
19784 let _ = IterableObjAttrs::get_userdata;
19785 let _ = IterableRuleAttrs::get_chain;
19786 let _ = IterableRuleAttrs::get_expressions;
19787 let _ = IterableRuleAttrs::get_handle;
19788 let _ = IterableRuleAttrs::get_position;
19789 let _ = IterableRuleAttrs::get_table;
19790 let _ = IterableRuleAttrs::get_userdata;
19791 let _ = IterableSetAttrs::get_data_len;
19792 let _ = IterableSetAttrs::get_data_type;
19793 let _ = IterableSetAttrs::get_desc;
19794 let _ = IterableSetAttrs::get_expr;
19795 let _ = IterableSetAttrs::get_expressions;
19796 let _ = IterableSetAttrs::get_flags;
19797 let _ = IterableSetAttrs::get_gc_interval;
19798 let _ = IterableSetAttrs::get_handle;
19799 let _ = IterableSetAttrs::get_key_len;
19800 let _ = IterableSetAttrs::get_key_type;
19801 let _ = IterableSetAttrs::get_name;
19802 let _ = IterableSetAttrs::get_obj_type;
19803 let _ = IterableSetAttrs::get_policy;
19804 let _ = IterableSetAttrs::get_table;
19805 let _ = IterableSetAttrs::get_userdata;
19806 let _ = IterableSetelemListAttrs::get_elements;
19807 let _ = IterableSetelemListAttrs::get_set;
19808 let _ = IterableSetelemListAttrs::get_table;
19809 let _ = IterableTableAttrs::get_flags;
19810 let _ = IterableTableAttrs::get_handle;
19811 let _ = IterableTableAttrs::get_name;
19812 let _ = IterableTableAttrs::get_owner;
19813 let _ = IterableTableAttrs::get_use;
19814 let _ = IterableTableAttrs::get_userdata;
19815 let _ = PushBatchAttrs::<&mut Vec<u8>>::push_genid;
19816 let _ = PushChainAttrs::<&mut Vec<u8>>::nested_counters;
19817 let _ = PushChainAttrs::<&mut Vec<u8>>::nested_hook;
19818 let _ = PushChainAttrs::<&mut Vec<u8>>::push_flags;
19819 let _ = PushChainAttrs::<&mut Vec<u8>>::push_handle;
19820 let _ = PushChainAttrs::<&mut Vec<u8>>::push_name;
19821 let _ = PushChainAttrs::<&mut Vec<u8>>::push_policy;
19822 let _ = PushChainAttrs::<&mut Vec<u8>>::push_table;
19823 let _ = PushChainAttrs::<&mut Vec<u8>>::push_type;
19824 let _ = PushChainAttrs::<&mut Vec<u8>>::push_userdata;
19825 let _ = PushCompatAttrs::<&mut Vec<u8>>::push_name;
19826 let _ = PushCompatAttrs::<&mut Vec<u8>>::push_rev;
19827 let _ = PushCompatAttrs::<&mut Vec<u8>>::push_type;
19828 let _ = PushFlowtableAttrs::<&mut Vec<u8>>::nested_hook;
19829 let _ = PushFlowtableAttrs::<&mut Vec<u8>>::push_flags;
19830 let _ = PushFlowtableAttrs::<&mut Vec<u8>>::push_handle;
19831 let _ = PushFlowtableAttrs::<&mut Vec<u8>>::push_name;
19832 let _ = PushFlowtableAttrs::<&mut Vec<u8>>::push_table;
19833 let _ = PushObjAttrs::<&mut Vec<u8>>::nested_data_counter;
19834 let _ = PushObjAttrs::<&mut Vec<u8>>::nested_data_quota;
19835 let _ = PushObjAttrs::<&mut Vec<u8>>::push_handle;
19836 let _ = PushObjAttrs::<&mut Vec<u8>>::push_name;
19837 let _ = PushObjAttrs::<&mut Vec<u8>>::push_table;
19838 let _ = PushObjAttrs::<&mut Vec<u8>>::push_type;
19839 let _ = PushObjAttrs::<&mut Vec<u8>>::push_userdata;
19840 let _ = PushRuleAttrs::<&mut Vec<u8>>::nested_compat;
19841 let _ = PushRuleAttrs::<&mut Vec<u8>>::nested_expressions;
19842 let _ = PushRuleAttrs::<&mut Vec<u8>>::push_chain;
19843 let _ = PushRuleAttrs::<&mut Vec<u8>>::push_chain_id;
19844 let _ = PushRuleAttrs::<&mut Vec<u8>>::push_handle;
19845 let _ = PushRuleAttrs::<&mut Vec<u8>>::push_id;
19846 let _ = PushRuleAttrs::<&mut Vec<u8>>::push_position;
19847 let _ = PushRuleAttrs::<&mut Vec<u8>>::push_position_id;
19848 let _ = PushRuleAttrs::<&mut Vec<u8>>::push_table;
19849 let _ = PushRuleAttrs::<&mut Vec<u8>>::push_userdata;
19850 let _ = PushSetAttrs::<&mut Vec<u8>>::nested_desc;
19851 let _ = PushSetAttrs::<&mut Vec<u8>>::push_data_len;
19852 let _ = PushSetAttrs::<&mut Vec<u8>>::push_data_type;
19853 let _ = PushSetAttrs::<&mut Vec<u8>>::push_flags;
19854 let _ = PushSetAttrs::<&mut Vec<u8>>::push_gc_interval;
19855 let _ = PushSetAttrs::<&mut Vec<u8>>::push_handle;
19856 let _ = PushSetAttrs::<&mut Vec<u8>>::push_id;
19857 let _ = PushSetAttrs::<&mut Vec<u8>>::push_key_len;
19858 let _ = PushSetAttrs::<&mut Vec<u8>>::push_key_type;
19859 let _ = PushSetAttrs::<&mut Vec<u8>>::push_name;
19860 let _ = PushSetAttrs::<&mut Vec<u8>>::push_obj_type;
19861 let _ = PushSetAttrs::<&mut Vec<u8>>::push_policy;
19862 let _ = PushSetAttrs::<&mut Vec<u8>>::push_table;
19863 let _ = PushSetAttrs::<&mut Vec<u8>>::push_timeout;
19864 let _ = PushSetAttrs::<&mut Vec<u8>>::push_userdata;
19865 let _ = PushSetelemListAttrs::<&mut Vec<u8>>::nested_elements;
19866 let _ = PushSetelemListAttrs::<&mut Vec<u8>>::push_set;
19867 let _ = PushSetelemListAttrs::<&mut Vec<u8>>::push_set_id;
19868 let _ = PushSetelemListAttrs::<&mut Vec<u8>>::push_table;
19869 let _ = PushTableAttrs::<&mut Vec<u8>>::push_flags;
19870 let _ = PushTableAttrs::<&mut Vec<u8>>::push_handle;
19871 let _ = PushTableAttrs::<&mut Vec<u8>>::push_name;
19872 let _ = PushTableAttrs::<&mut Vec<u8>>::push_userdata;
19873 }
19874}