Skip to main content

netlink_bindings/nftables/
mod.rs

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}