Skip to main content

netlink_bindings/rt-link/
mod.rs

1#![doc = "Link configuration over rtnetlink.\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 = "rt-link";
17pub const PROTONAME_CSTR: &CStr = c"rt-link";
18pub const PROTONUM: u16 = 0u16;
19#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
20#[derive(Debug, Clone, Copy)]
21pub enum IfinfoFlags {
22    Up = 1 << 0,
23    Broadcast = 1 << 1,
24    Debug = 1 << 2,
25    Loopback = 1 << 3,
26    PointToPoint = 1 << 4,
27    NoTrailers = 1 << 5,
28    Running = 1 << 6,
29    NoArp = 1 << 7,
30    Promisc = 1 << 8,
31    AllMulti = 1 << 9,
32    Master = 1 << 10,
33    Slave = 1 << 11,
34    Multicast = 1 << 12,
35    Portsel = 1 << 13,
36    AutoMedia = 1 << 14,
37    Dynamic = 1 << 15,
38    LowerUp = 1 << 16,
39    Dormant = 1 << 17,
40    Echo = 1 << 18,
41}
42impl IfinfoFlags {
43    pub fn from_value(value: u64) -> Option<Self> {
44        Some(match value {
45            n if n == 1 << 0 => Self::Up,
46            n if n == 1 << 1 => Self::Broadcast,
47            n if n == 1 << 2 => Self::Debug,
48            n if n == 1 << 3 => Self::Loopback,
49            n if n == 1 << 4 => Self::PointToPoint,
50            n if n == 1 << 5 => Self::NoTrailers,
51            n if n == 1 << 6 => Self::Running,
52            n if n == 1 << 7 => Self::NoArp,
53            n if n == 1 << 8 => Self::Promisc,
54            n if n == 1 << 9 => Self::AllMulti,
55            n if n == 1 << 10 => Self::Master,
56            n if n == 1 << 11 => Self::Slave,
57            n if n == 1 << 12 => Self::Multicast,
58            n if n == 1 << 13 => Self::Portsel,
59            n if n == 1 << 14 => Self::AutoMedia,
60            n if n == 1 << 15 => Self::Dynamic,
61            n if n == 1 << 16 => Self::LowerUp,
62            n if n == 1 << 17 => Self::Dormant,
63            n if n == 1 << 18 => Self::Echo,
64            _ => return None,
65        })
66    }
67}
68#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
69#[derive(Debug, Clone, Copy)]
70pub enum VlanProtocols {
71    _8021q = 33024,
72    _8021ad = 34984,
73}
74impl VlanProtocols {
75    pub fn from_value(value: u64) -> Option<Self> {
76        Some(match value {
77            33024 => Self::_8021q,
78            34984 => Self::_8021ad,
79            _ => return None,
80        })
81    }
82}
83#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
84#[derive(Debug, Clone, Copy)]
85pub enum Ipv4Devconf {
86    Forwarding = 0,
87    McForwarding = 1,
88    ProxyArp = 2,
89    AcceptRedirects = 3,
90    SecureRedirects = 4,
91    SendRedirects = 5,
92    SharedMedia = 6,
93    RpFilter = 7,
94    AcceptSourceRoute = 8,
95    BootpRelay = 9,
96    LogMartians = 10,
97    Tag = 11,
98    Arpfilter = 12,
99    MediumId = 13,
100    Noxfrm = 14,
101    Nopolicy = 15,
102    ForceIgmpVersion = 16,
103    ArpAnnounce = 17,
104    ArpIgnore = 18,
105    PromoteSecondaries = 19,
106    ArpAccept = 20,
107    ArpNotify = 21,
108    AcceptLocal = 22,
109    SrcVmark = 23,
110    ProxyArpPvlan = 24,
111    RouteLocalnet = 25,
112    Igmpv2UnsolicitedReportInterval = 26,
113    Igmpv3UnsolicitedReportInterval = 27,
114    IgnoreRoutesWithLinkdown = 28,
115    DropUnicastInL2Multicast = 29,
116    DropGratuitousArp = 30,
117    BcForwarding = 31,
118    ArpEvictNocarrier = 32,
119}
120impl Ipv4Devconf {
121    pub fn from_value(value: u64) -> Option<Self> {
122        Some(match value {
123            0 => Self::Forwarding,
124            1 => Self::McForwarding,
125            2 => Self::ProxyArp,
126            3 => Self::AcceptRedirects,
127            4 => Self::SecureRedirects,
128            5 => Self::SendRedirects,
129            6 => Self::SharedMedia,
130            7 => Self::RpFilter,
131            8 => Self::AcceptSourceRoute,
132            9 => Self::BootpRelay,
133            10 => Self::LogMartians,
134            11 => Self::Tag,
135            12 => Self::Arpfilter,
136            13 => Self::MediumId,
137            14 => Self::Noxfrm,
138            15 => Self::Nopolicy,
139            16 => Self::ForceIgmpVersion,
140            17 => Self::ArpAnnounce,
141            18 => Self::ArpIgnore,
142            19 => Self::PromoteSecondaries,
143            20 => Self::ArpAccept,
144            21 => Self::ArpNotify,
145            22 => Self::AcceptLocal,
146            23 => Self::SrcVmark,
147            24 => Self::ProxyArpPvlan,
148            25 => Self::RouteLocalnet,
149            26 => Self::Igmpv2UnsolicitedReportInterval,
150            27 => Self::Igmpv3UnsolicitedReportInterval,
151            28 => Self::IgnoreRoutesWithLinkdown,
152            29 => Self::DropUnicastInL2Multicast,
153            30 => Self::DropGratuitousArp,
154            31 => Self::BcForwarding,
155            32 => Self::ArpEvictNocarrier,
156            _ => return None,
157        })
158    }
159}
160#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
161#[derive(Debug, Clone, Copy)]
162pub enum Ipv6Devconf {
163    Forwarding = 0,
164    Hoplimit = 1,
165    Mtu6 = 2,
166    AcceptRa = 3,
167    AcceptRedirects = 4,
168    Autoconf = 5,
169    DadTransmits = 6,
170    RtrSolicits = 7,
171    RtrSolicitInterval = 8,
172    RtrSolicitDelay = 9,
173    UseTempaddr = 10,
174    TempValidLft = 11,
175    TempPreferedLft = 12,
176    RegenMaxRetry = 13,
177    MaxDesyncFactor = 14,
178    MaxAddresses = 15,
179    ForceMldVersion = 16,
180    AcceptRaDefrtr = 17,
181    AcceptRaPinfo = 18,
182    AcceptRaRtrPref = 19,
183    RtrProbeInterval = 20,
184    AcceptRaRtInfoMaxPlen = 21,
185    ProxyNdp = 22,
186    OptimisticDad = 23,
187    AcceptSourceRoute = 24,
188    McForwarding = 25,
189    DisableIpv6 = 26,
190    AcceptDad = 27,
191    ForceTllao = 28,
192    NdiscNotify = 29,
193    Mldv1UnsolicitedReportInterval = 30,
194    Mldv2UnsolicitedReportInterval = 31,
195    SuppressFragNdisc = 32,
196    AcceptRaFromLocal = 33,
197    UseOptimistic = 34,
198    AcceptRaMtu = 35,
199    StableSecret = 36,
200    UseOifAddrsOnly = 37,
201    AcceptRaMinHopLimit = 38,
202    IgnoreRoutesWithLinkdown = 39,
203    DropUnicastInL2Multicast = 40,
204    DropUnsolicitedNa = 41,
205    KeepAddrOnDown = 42,
206    RtrSolicitMaxInterval = 43,
207    Seg6Enabled = 44,
208    Seg6RequireHmac = 45,
209    EnhancedDad = 46,
210    AddrGenMode = 47,
211    DisablePolicy = 48,
212    AcceptRaRtInfoMinPlen = 49,
213    NdiscTclass = 50,
214    RplSegEnabled = 51,
215    RaDefrtrMetric = 52,
216    Ioam6Enabled = 53,
217    Ioam6Id = 54,
218    Ioam6IdWide = 55,
219    NdiscEvictNocarrier = 56,
220    AcceptUntrackedNa = 57,
221}
222impl Ipv6Devconf {
223    pub fn from_value(value: u64) -> Option<Self> {
224        Some(match value {
225            0 => Self::Forwarding,
226            1 => Self::Hoplimit,
227            2 => Self::Mtu6,
228            3 => Self::AcceptRa,
229            4 => Self::AcceptRedirects,
230            5 => Self::Autoconf,
231            6 => Self::DadTransmits,
232            7 => Self::RtrSolicits,
233            8 => Self::RtrSolicitInterval,
234            9 => Self::RtrSolicitDelay,
235            10 => Self::UseTempaddr,
236            11 => Self::TempValidLft,
237            12 => Self::TempPreferedLft,
238            13 => Self::RegenMaxRetry,
239            14 => Self::MaxDesyncFactor,
240            15 => Self::MaxAddresses,
241            16 => Self::ForceMldVersion,
242            17 => Self::AcceptRaDefrtr,
243            18 => Self::AcceptRaPinfo,
244            19 => Self::AcceptRaRtrPref,
245            20 => Self::RtrProbeInterval,
246            21 => Self::AcceptRaRtInfoMaxPlen,
247            22 => Self::ProxyNdp,
248            23 => Self::OptimisticDad,
249            24 => Self::AcceptSourceRoute,
250            25 => Self::McForwarding,
251            26 => Self::DisableIpv6,
252            27 => Self::AcceptDad,
253            28 => Self::ForceTllao,
254            29 => Self::NdiscNotify,
255            30 => Self::Mldv1UnsolicitedReportInterval,
256            31 => Self::Mldv2UnsolicitedReportInterval,
257            32 => Self::SuppressFragNdisc,
258            33 => Self::AcceptRaFromLocal,
259            34 => Self::UseOptimistic,
260            35 => Self::AcceptRaMtu,
261            36 => Self::StableSecret,
262            37 => Self::UseOifAddrsOnly,
263            38 => Self::AcceptRaMinHopLimit,
264            39 => Self::IgnoreRoutesWithLinkdown,
265            40 => Self::DropUnicastInL2Multicast,
266            41 => Self::DropUnsolicitedNa,
267            42 => Self::KeepAddrOnDown,
268            43 => Self::RtrSolicitMaxInterval,
269            44 => Self::Seg6Enabled,
270            45 => Self::Seg6RequireHmac,
271            46 => Self::EnhancedDad,
272            47 => Self::AddrGenMode,
273            48 => Self::DisablePolicy,
274            49 => Self::AcceptRaRtInfoMinPlen,
275            50 => Self::NdiscTclass,
276            51 => Self::RplSegEnabled,
277            52 => Self::RaDefrtrMetric,
278            53 => Self::Ioam6Enabled,
279            54 => Self::Ioam6Id,
280            55 => Self::Ioam6IdWide,
281            56 => Self::NdiscEvictNocarrier,
282            57 => Self::AcceptUntrackedNa,
283            _ => return None,
284        })
285    }
286}
287#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
288#[derive(Debug, Clone, Copy)]
289pub enum IflaIcmp6Stats {
290    Num = 0,
291    Inmsgs = 1,
292    Inerrors = 2,
293    Outmsgs = 3,
294    Outerrors = 4,
295    Csumerrors = 5,
296    Ratelimithost = 6,
297}
298impl IflaIcmp6Stats {
299    pub fn from_value(value: u64) -> Option<Self> {
300        Some(match value {
301            0 => Self::Num,
302            1 => Self::Inmsgs,
303            2 => Self::Inerrors,
304            3 => Self::Outmsgs,
305            4 => Self::Outerrors,
306            5 => Self::Csumerrors,
307            6 => Self::Ratelimithost,
308            _ => return None,
309        })
310    }
311}
312#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
313#[derive(Debug, Clone, Copy)]
314pub enum IflaInet6Stats {
315    Num = 0,
316    Inpkts = 1,
317    Inoctets = 2,
318    Indelivers = 3,
319    Outforwdatagrams = 4,
320    Outpkts = 5,
321    Outoctets = 6,
322    Inhdrerrors = 7,
323    Intoobigerrors = 8,
324    Innoroutes = 9,
325    Inaddrerrors = 10,
326    Inunknownprotos = 11,
327    Intruncatedpkts = 12,
328    Indiscards = 13,
329    Outdiscards = 14,
330    Outnoroutes = 15,
331    Reasmtimeout = 16,
332    Reasmreqds = 17,
333    Reasmoks = 18,
334    Reasmfails = 19,
335    Fragoks = 20,
336    Fragfails = 21,
337    Fragcreates = 22,
338    Inmcastpkts = 23,
339    Outmcastpkts = 24,
340    Inbcastpkts = 25,
341    Outbcastpkts = 26,
342    Inmcastoctets = 27,
343    Outmcastoctets = 28,
344    Inbcastoctets = 29,
345    Outbcastoctets = 30,
346    Csumerrors = 31,
347    Noectpkts = 32,
348    Ect1Pkts = 33,
349    Ect0Pkts = 34,
350    Cepkts = 35,
351    ReasmOverlaps = 36,
352}
353impl IflaInet6Stats {
354    pub fn from_value(value: u64) -> Option<Self> {
355        Some(match value {
356            0 => Self::Num,
357            1 => Self::Inpkts,
358            2 => Self::Inoctets,
359            3 => Self::Indelivers,
360            4 => Self::Outforwdatagrams,
361            5 => Self::Outpkts,
362            6 => Self::Outoctets,
363            7 => Self::Inhdrerrors,
364            8 => Self::Intoobigerrors,
365            9 => Self::Innoroutes,
366            10 => Self::Inaddrerrors,
367            11 => Self::Inunknownprotos,
368            12 => Self::Intruncatedpkts,
369            13 => Self::Indiscards,
370            14 => Self::Outdiscards,
371            15 => Self::Outnoroutes,
372            16 => Self::Reasmtimeout,
373            17 => Self::Reasmreqds,
374            18 => Self::Reasmoks,
375            19 => Self::Reasmfails,
376            20 => Self::Fragoks,
377            21 => Self::Fragfails,
378            22 => Self::Fragcreates,
379            23 => Self::Inmcastpkts,
380            24 => Self::Outmcastpkts,
381            25 => Self::Inbcastpkts,
382            26 => Self::Outbcastpkts,
383            27 => Self::Inmcastoctets,
384            28 => Self::Outmcastoctets,
385            29 => Self::Inbcastoctets,
386            30 => Self::Outbcastoctets,
387            31 => Self::Csumerrors,
388            32 => Self::Noectpkts,
389            33 => Self::Ect1Pkts,
390            34 => Self::Ect0Pkts,
391            35 => Self::Cepkts,
392            36 => Self::ReasmOverlaps,
393            _ => return None,
394        })
395    }
396}
397#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
398#[derive(Debug, Clone, Copy)]
399pub enum VlanFlags {
400    ReorderHdr = 1 << 0,
401    Gvrp = 1 << 1,
402    LooseBinding = 1 << 2,
403    Mvrp = 1 << 3,
404    BridgeBinding = 1 << 4,
405}
406impl VlanFlags {
407    pub fn from_value(value: u64) -> Option<Self> {
408        Some(match value {
409            n if n == 1 << 0 => Self::ReorderHdr,
410            n if n == 1 << 1 => Self::Gvrp,
411            n if n == 1 << 2 => Self::LooseBinding,
412            n if n == 1 << 3 => Self::Mvrp,
413            n if n == 1 << 4 => Self::BridgeBinding,
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 IflaVfLinkStateEnum {
421    Auto = 0,
422    Enable = 1,
423    Disable = 2,
424}
425impl IflaVfLinkStateEnum {
426    pub fn from_value(value: u64) -> Option<Self> {
427        Some(match value {
428            0 => Self::Auto,
429            1 => Self::Enable,
430            2 => Self::Disable,
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 RtextFilter {
438    Vf = 1 << 0,
439    Brvlan = 1 << 1,
440    BrvlanCompressed = 1 << 2,
441    SkipStats = 1 << 3,
442    Mrp = 1 << 4,
443    CfmConfig = 1 << 5,
444    CfmStatus = 1 << 6,
445    Mst = 1 << 7,
446}
447impl RtextFilter {
448    pub fn from_value(value: u64) -> Option<Self> {
449        Some(match value {
450            n if n == 1 << 0 => Self::Vf,
451            n if n == 1 << 1 => Self::Brvlan,
452            n if n == 1 << 2 => Self::BrvlanCompressed,
453            n if n == 1 << 3 => Self::SkipStats,
454            n if n == 1 << 4 => Self::Mrp,
455            n if n == 1 << 5 => Self::CfmConfig,
456            n if n == 1 << 6 => Self::CfmStatus,
457            n if n == 1 << 7 => Self::Mst,
458            _ => return None,
459        })
460    }
461}
462#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
463#[derive(Debug, Clone, Copy)]
464pub enum NetkitPolicy {
465    Forward = 0,
466    Blackhole = 2,
467}
468impl NetkitPolicy {
469    pub fn from_value(value: u64) -> Option<Self> {
470        Some(match value {
471            0 => Self::Forward,
472            2 => Self::Blackhole,
473            _ => return None,
474        })
475    }
476}
477#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
478#[derive(Debug, Clone, Copy)]
479pub enum NetkitMode {
480    L2 = 0,
481    L3 = 1,
482}
483impl NetkitMode {
484    pub fn from_value(value: u64) -> Option<Self> {
485        Some(match value {
486            0 => Self::L2,
487            1 => Self::L3,
488            _ => return None,
489        })
490    }
491}
492#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
493#[derive(Debug, Clone, Copy)]
494pub enum NetkitScrub {
495    None = 0,
496    Default = 1,
497}
498impl NetkitScrub {
499    pub fn from_value(value: u64) -> Option<Self> {
500        Some(match value {
501            0 => Self::None,
502            1 => Self::Default,
503            _ => return None,
504        })
505    }
506}
507#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
508#[derive(Debug, Clone, Copy)]
509pub enum NetkitPairing {
510    Pair = 0,
511    Single = 1,
512}
513impl NetkitPairing {
514    pub fn from_value(value: u64) -> Option<Self> {
515        Some(match value {
516            0 => Self::Pair,
517            1 => Self::Single,
518            _ => return None,
519        })
520    }
521}
522#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
523#[derive(Debug, Clone, Copy)]
524pub enum OvpnMode {
525    P2p = 0,
526    Mp = 1,
527}
528impl OvpnMode {
529    pub fn from_value(value: u64) -> Option<Self> {
530        Some(match value {
531            0 => Self::P2p,
532            1 => Self::Mp,
533            _ => return None,
534        })
535    }
536}
537#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
538#[derive(Debug, Clone, Copy)]
539pub enum BrStpMode {
540    Auto = 0,
541    User = 1,
542    Kernel = 2,
543}
544impl BrStpMode {
545    pub fn from_value(value: u64) -> Option<Self> {
546        Some(match value {
547            0 => Self::Auto,
548            1 => Self::User,
549            2 => Self::Kernel,
550            _ => return None,
551        })
552    }
553}
554#[derive(Debug)]
555#[repr(C, packed(4))]
556pub struct Rtgenmsg {
557    pub family: u8,
558}
559impl Clone for Rtgenmsg {
560    fn clone(&self) -> Self {
561        Self::new_from_array(*self.as_array())
562    }
563}
564#[doc = "Create zero-initialized struct"]
565impl Default for Rtgenmsg {
566    fn default() -> Self {
567        Self::new()
568    }
569}
570impl Rtgenmsg {
571    #[doc = "Create zero-initialized struct"]
572    pub fn new() -> Self {
573        Self::new_from_array([0u8; Self::len()])
574    }
575    #[doc = "Copy from contents from slice"]
576    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
577        if other.len() != Self::len() {
578            return None;
579        }
580        let mut buf = [0u8; Self::len()];
581        buf.clone_from_slice(other);
582        Some(Self::new_from_array(buf))
583    }
584    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
585    pub fn new_from_zeroed(other: &[u8]) -> Self {
586        let mut buf = [0u8; Self::len()];
587        let len = buf.len().min(other.len());
588        buf[..len].clone_from_slice(&other[..len]);
589        Self::new_from_array(buf)
590    }
591    pub fn new_from_array(buf: [u8; 1usize]) -> Self {
592        unsafe { std::mem::transmute(buf) }
593    }
594    pub fn as_slice(&self) -> &[u8] {
595        unsafe {
596            let ptr: *const u8 = std::mem::transmute(self as *const Self);
597            std::slice::from_raw_parts(ptr, Self::len())
598        }
599    }
600    pub fn from_slice(buf: &[u8]) -> &Self {
601        assert!(buf.len() >= Self::len());
602        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
603        unsafe { std::mem::transmute(buf.as_ptr()) }
604    }
605    pub fn as_array(&self) -> &[u8; 1usize] {
606        unsafe { std::mem::transmute(self) }
607    }
608    pub fn from_array(buf: &[u8; 1usize]) -> &Self {
609        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
610        unsafe { std::mem::transmute(buf) }
611    }
612    pub fn into_array(self) -> [u8; 1usize] {
613        unsafe { std::mem::transmute(self) }
614    }
615    pub const fn len() -> usize {
616        const _: () = assert!(std::mem::size_of::<Rtgenmsg>() == 1usize);
617        1usize
618    }
619}
620#[repr(C, packed(4))]
621pub struct Ifinfomsg {
622    pub ifi_family: u8,
623    pub _pad: [u8; 1usize],
624    pub ifi_type: u16,
625    pub ifi_index: i32,
626    #[doc = "Associated type: [`IfinfoFlags`] (1 bit per enumeration)"]
627    pub ifi_flags: u32,
628    pub ifi_change: u32,
629}
630impl Clone for Ifinfomsg {
631    fn clone(&self) -> Self {
632        Self::new_from_array(*self.as_array())
633    }
634}
635#[doc = "Create zero-initialized struct"]
636impl Default for Ifinfomsg {
637    fn default() -> Self {
638        Self::new()
639    }
640}
641impl Ifinfomsg {
642    #[doc = "Create zero-initialized struct"]
643    pub fn new() -> Self {
644        Self::new_from_array([0u8; Self::len()])
645    }
646    #[doc = "Copy from contents from slice"]
647    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
648        if other.len() != Self::len() {
649            return None;
650        }
651        let mut buf = [0u8; Self::len()];
652        buf.clone_from_slice(other);
653        Some(Self::new_from_array(buf))
654    }
655    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
656    pub fn new_from_zeroed(other: &[u8]) -> Self {
657        let mut buf = [0u8; Self::len()];
658        let len = buf.len().min(other.len());
659        buf[..len].clone_from_slice(&other[..len]);
660        Self::new_from_array(buf)
661    }
662    pub fn new_from_array(buf: [u8; 16usize]) -> Self {
663        unsafe { std::mem::transmute(buf) }
664    }
665    pub fn as_slice(&self) -> &[u8] {
666        unsafe {
667            let ptr: *const u8 = std::mem::transmute(self as *const Self);
668            std::slice::from_raw_parts(ptr, Self::len())
669        }
670    }
671    pub fn from_slice(buf: &[u8]) -> &Self {
672        assert!(buf.len() >= Self::len());
673        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
674        unsafe { std::mem::transmute(buf.as_ptr()) }
675    }
676    pub fn as_array(&self) -> &[u8; 16usize] {
677        unsafe { std::mem::transmute(self) }
678    }
679    pub fn from_array(buf: &[u8; 16usize]) -> &Self {
680        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
681        unsafe { std::mem::transmute(buf) }
682    }
683    pub fn into_array(self) -> [u8; 16usize] {
684        unsafe { std::mem::transmute(self) }
685    }
686    pub const fn len() -> usize {
687        const _: () = assert!(std::mem::size_of::<Ifinfomsg>() == 16usize);
688        16usize
689    }
690}
691impl std::fmt::Debug for Ifinfomsg {
692    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
693        fmt.debug_struct("Ifinfomsg")
694            .field("ifi_family", &self.ifi_family)
695            .field("ifi_type", &self.ifi_type)
696            .field("ifi_index", &self.ifi_index)
697            .field(
698                "ifi_flags",
699                &FormatFlags(self.ifi_flags.into(), IfinfoFlags::from_value),
700            )
701            .field("ifi_change", &self.ifi_change)
702            .finish()
703    }
704}
705#[derive(Debug)]
706#[repr(C, packed(4))]
707pub struct IflaBridgeId {
708    pub prio: u16,
709    pub addr: [u8; 6usize],
710}
711impl Clone for IflaBridgeId {
712    fn clone(&self) -> Self {
713        Self::new_from_array(*self.as_array())
714    }
715}
716#[doc = "Create zero-initialized struct"]
717impl Default for IflaBridgeId {
718    fn default() -> Self {
719        Self::new()
720    }
721}
722impl IflaBridgeId {
723    #[doc = "Create zero-initialized struct"]
724    pub fn new() -> Self {
725        Self::new_from_array([0u8; Self::len()])
726    }
727    #[doc = "Copy from contents from slice"]
728    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
729        if other.len() != Self::len() {
730            return None;
731        }
732        let mut buf = [0u8; Self::len()];
733        buf.clone_from_slice(other);
734        Some(Self::new_from_array(buf))
735    }
736    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
737    pub fn new_from_zeroed(other: &[u8]) -> Self {
738        let mut buf = [0u8; Self::len()];
739        let len = buf.len().min(other.len());
740        buf[..len].clone_from_slice(&other[..len]);
741        Self::new_from_array(buf)
742    }
743    pub fn new_from_array(buf: [u8; 8usize]) -> Self {
744        unsafe { std::mem::transmute(buf) }
745    }
746    pub fn as_slice(&self) -> &[u8] {
747        unsafe {
748            let ptr: *const u8 = std::mem::transmute(self as *const Self);
749            std::slice::from_raw_parts(ptr, Self::len())
750        }
751    }
752    pub fn from_slice(buf: &[u8]) -> &Self {
753        assert!(buf.len() >= Self::len());
754        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
755        unsafe { std::mem::transmute(buf.as_ptr()) }
756    }
757    pub fn as_array(&self) -> &[u8; 8usize] {
758        unsafe { std::mem::transmute(self) }
759    }
760    pub fn from_array(buf: &[u8; 8usize]) -> &Self {
761        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
762        unsafe { std::mem::transmute(buf) }
763    }
764    pub fn into_array(self) -> [u8; 8usize] {
765        unsafe { std::mem::transmute(self) }
766    }
767    pub const fn len() -> usize {
768        const _: () = assert!(std::mem::size_of::<IflaBridgeId>() == 8usize);
769        8usize
770    }
771}
772#[derive(Debug)]
773#[repr(C, packed(4))]
774pub struct IflaCacheinfo {
775    pub max_reasm_len: u32,
776    pub tstamp: u32,
777    pub reachable_time: i32,
778    pub retrans_time: u32,
779}
780impl Clone for IflaCacheinfo {
781    fn clone(&self) -> Self {
782        Self::new_from_array(*self.as_array())
783    }
784}
785#[doc = "Create zero-initialized struct"]
786impl Default for IflaCacheinfo {
787    fn default() -> Self {
788        Self::new()
789    }
790}
791impl IflaCacheinfo {
792    #[doc = "Create zero-initialized struct"]
793    pub fn new() -> Self {
794        Self::new_from_array([0u8; Self::len()])
795    }
796    #[doc = "Copy from contents from slice"]
797    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
798        if other.len() != Self::len() {
799            return None;
800        }
801        let mut buf = [0u8; Self::len()];
802        buf.clone_from_slice(other);
803        Some(Self::new_from_array(buf))
804    }
805    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
806    pub fn new_from_zeroed(other: &[u8]) -> Self {
807        let mut buf = [0u8; Self::len()];
808        let len = buf.len().min(other.len());
809        buf[..len].clone_from_slice(&other[..len]);
810        Self::new_from_array(buf)
811    }
812    pub fn new_from_array(buf: [u8; 16usize]) -> Self {
813        unsafe { std::mem::transmute(buf) }
814    }
815    pub fn as_slice(&self) -> &[u8] {
816        unsafe {
817            let ptr: *const u8 = std::mem::transmute(self as *const Self);
818            std::slice::from_raw_parts(ptr, Self::len())
819        }
820    }
821    pub fn from_slice(buf: &[u8]) -> &Self {
822        assert!(buf.len() >= Self::len());
823        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
824        unsafe { std::mem::transmute(buf.as_ptr()) }
825    }
826    pub fn as_array(&self) -> &[u8; 16usize] {
827        unsafe { std::mem::transmute(self) }
828    }
829    pub fn from_array(buf: &[u8; 16usize]) -> &Self {
830        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
831        unsafe { std::mem::transmute(buf) }
832    }
833    pub fn into_array(self) -> [u8; 16usize] {
834        unsafe { std::mem::transmute(self) }
835    }
836    pub const fn len() -> usize {
837        const _: () = assert!(std::mem::size_of::<IflaCacheinfo>() == 16usize);
838        16usize
839    }
840}
841#[derive(Debug)]
842#[repr(C, packed(4))]
843pub struct RtnlLinkStats {
844    pub rx_packets: u32,
845    pub tx_packets: u32,
846    pub rx_bytes: u32,
847    pub tx_bytes: u32,
848    pub rx_errors: u32,
849    pub tx_errors: u32,
850    pub rx_dropped: u32,
851    pub tx_dropped: u32,
852    pub multicast: u32,
853    pub collisions: u32,
854    pub rx_length_errors: u32,
855    pub rx_over_errors: u32,
856    pub rx_crc_errors: u32,
857    pub rx_frame_errors: u32,
858    pub rx_fifo_errors: u32,
859    pub rx_missed_errors: u32,
860    pub tx_aborted_errors: u32,
861    pub tx_carrier_errors: u32,
862    pub tx_fifo_errors: u32,
863    pub tx_heartbeat_errors: u32,
864    pub tx_window_errors: u32,
865    pub rx_compressed: u32,
866    pub tx_compressed: u32,
867    pub rx_nohandler: u32,
868}
869impl Clone for RtnlLinkStats {
870    fn clone(&self) -> Self {
871        Self::new_from_array(*self.as_array())
872    }
873}
874#[doc = "Create zero-initialized struct"]
875impl Default for RtnlLinkStats {
876    fn default() -> Self {
877        Self::new()
878    }
879}
880impl RtnlLinkStats {
881    #[doc = "Create zero-initialized struct"]
882    pub fn new() -> Self {
883        Self::new_from_array([0u8; Self::len()])
884    }
885    #[doc = "Copy from contents from slice"]
886    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
887        if other.len() != Self::len() {
888            return None;
889        }
890        let mut buf = [0u8; Self::len()];
891        buf.clone_from_slice(other);
892        Some(Self::new_from_array(buf))
893    }
894    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
895    pub fn new_from_zeroed(other: &[u8]) -> Self {
896        let mut buf = [0u8; Self::len()];
897        let len = buf.len().min(other.len());
898        buf[..len].clone_from_slice(&other[..len]);
899        Self::new_from_array(buf)
900    }
901    pub fn new_from_array(buf: [u8; 96usize]) -> Self {
902        unsafe { std::mem::transmute(buf) }
903    }
904    pub fn as_slice(&self) -> &[u8] {
905        unsafe {
906            let ptr: *const u8 = std::mem::transmute(self as *const Self);
907            std::slice::from_raw_parts(ptr, Self::len())
908        }
909    }
910    pub fn from_slice(buf: &[u8]) -> &Self {
911        assert!(buf.len() >= Self::len());
912        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
913        unsafe { std::mem::transmute(buf.as_ptr()) }
914    }
915    pub fn as_array(&self) -> &[u8; 96usize] {
916        unsafe { std::mem::transmute(self) }
917    }
918    pub fn from_array(buf: &[u8; 96usize]) -> &Self {
919        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
920        unsafe { std::mem::transmute(buf) }
921    }
922    pub fn into_array(self) -> [u8; 96usize] {
923        unsafe { std::mem::transmute(self) }
924    }
925    pub const fn len() -> usize {
926        const _: () = assert!(std::mem::size_of::<RtnlLinkStats>() == 96usize);
927        96usize
928    }
929}
930#[repr(C, packed(4))]
931pub struct RtnlLinkStats64 {
932    pub rx_packets: u64,
933    pub tx_packets: u64,
934    pub rx_bytes: u64,
935    pub tx_bytes: u64,
936    pub rx_errors: u64,
937    pub tx_errors: u64,
938    pub rx_dropped: u64,
939    pub tx_dropped: u64,
940    pub multicast: u64,
941    pub collisions: u64,
942    pub rx_length_errors: u64,
943    pub rx_over_errors: u64,
944    pub rx_crc_errors: u64,
945    pub rx_frame_errors: u64,
946    pub rx_fifo_errors: u64,
947    pub rx_missed_errors: u64,
948    pub tx_aborted_errors: u64,
949    pub tx_carrier_errors: u64,
950    pub tx_fifo_errors: u64,
951    pub tx_heartbeat_errors: u64,
952    pub tx_window_errors: u64,
953    pub rx_compressed: u64,
954    pub tx_compressed: u64,
955    pub rx_nohandler: u64,
956    pub rx_otherhost_dropped: u64,
957}
958impl Clone for RtnlLinkStats64 {
959    fn clone(&self) -> Self {
960        Self::new_from_array(*self.as_array())
961    }
962}
963#[doc = "Create zero-initialized struct"]
964impl Default for RtnlLinkStats64 {
965    fn default() -> Self {
966        Self::new()
967    }
968}
969impl RtnlLinkStats64 {
970    #[doc = "Create zero-initialized struct"]
971    pub fn new() -> Self {
972        Self::new_from_array([0u8; Self::len()])
973    }
974    #[doc = "Copy from contents from slice"]
975    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
976        if other.len() != Self::len() {
977            return None;
978        }
979        let mut buf = [0u8; Self::len()];
980        buf.clone_from_slice(other);
981        Some(Self::new_from_array(buf))
982    }
983    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
984    pub fn new_from_zeroed(other: &[u8]) -> Self {
985        let mut buf = [0u8; Self::len()];
986        let len = buf.len().min(other.len());
987        buf[..len].clone_from_slice(&other[..len]);
988        Self::new_from_array(buf)
989    }
990    pub fn new_from_array(buf: [u8; 200usize]) -> Self {
991        unsafe { std::mem::transmute(buf) }
992    }
993    pub fn as_slice(&self) -> &[u8] {
994        unsafe {
995            let ptr: *const u8 = std::mem::transmute(self as *const Self);
996            std::slice::from_raw_parts(ptr, Self::len())
997        }
998    }
999    pub fn from_slice(buf: &[u8]) -> &Self {
1000        assert!(buf.len() >= Self::len());
1001        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1002        unsafe { std::mem::transmute(buf.as_ptr()) }
1003    }
1004    pub fn as_array(&self) -> &[u8; 200usize] {
1005        unsafe { std::mem::transmute(self) }
1006    }
1007    pub fn from_array(buf: &[u8; 200usize]) -> &Self {
1008        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1009        unsafe { std::mem::transmute(buf) }
1010    }
1011    pub fn into_array(self) -> [u8; 200usize] {
1012        unsafe { std::mem::transmute(self) }
1013    }
1014    pub const fn len() -> usize {
1015        const _: () = assert!(std::mem::size_of::<RtnlLinkStats64>() == 200usize);
1016        200usize
1017    }
1018}
1019impl std::fmt::Debug for RtnlLinkStats64 {
1020    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1021        fmt.debug_struct("RtnlLinkStats64")
1022            .field("rx_packets", &{ self.rx_packets })
1023            .field("tx_packets", &{ self.tx_packets })
1024            .field("rx_bytes", &{ self.rx_bytes })
1025            .field("tx_bytes", &{ self.tx_bytes })
1026            .field("rx_errors", &{ self.rx_errors })
1027            .field("tx_errors", &{ self.tx_errors })
1028            .field("rx_dropped", &{ self.rx_dropped })
1029            .field("tx_dropped", &{ self.tx_dropped })
1030            .field("multicast", &{ self.multicast })
1031            .field("collisions", &{ self.collisions })
1032            .field("rx_length_errors", &{ self.rx_length_errors })
1033            .field("rx_over_errors", &{ self.rx_over_errors })
1034            .field("rx_crc_errors", &{ self.rx_crc_errors })
1035            .field("rx_frame_errors", &{ self.rx_frame_errors })
1036            .field("rx_fifo_errors", &{ self.rx_fifo_errors })
1037            .field("rx_missed_errors", &{ self.rx_missed_errors })
1038            .field("tx_aborted_errors", &{ self.tx_aborted_errors })
1039            .field("tx_carrier_errors", &{ self.tx_carrier_errors })
1040            .field("tx_fifo_errors", &{ self.tx_fifo_errors })
1041            .field("tx_heartbeat_errors", &{ self.tx_heartbeat_errors })
1042            .field("tx_window_errors", &{ self.tx_window_errors })
1043            .field("rx_compressed", &{ self.rx_compressed })
1044            .field("tx_compressed", &{ self.tx_compressed })
1045            .field("rx_nohandler", &{ self.rx_nohandler })
1046            .field("rx_otherhost_dropped", &{ self.rx_otherhost_dropped })
1047            .finish()
1048    }
1049}
1050#[repr(C, packed(4))]
1051pub struct RtnlLinkIfmap {
1052    pub mem_start: u64,
1053    pub mem_end: u64,
1054    pub base_addr: u64,
1055    pub irq: u16,
1056    pub dma: u8,
1057    pub port: u8,
1058    pub _pad_28: [u8; 4usize],
1059}
1060impl Clone for RtnlLinkIfmap {
1061    fn clone(&self) -> Self {
1062        Self::new_from_array(*self.as_array())
1063    }
1064}
1065#[doc = "Create zero-initialized struct"]
1066impl Default for RtnlLinkIfmap {
1067    fn default() -> Self {
1068        Self::new()
1069    }
1070}
1071impl RtnlLinkIfmap {
1072    #[doc = "Create zero-initialized struct"]
1073    pub fn new() -> Self {
1074        Self::new_from_array([0u8; Self::len()])
1075    }
1076    #[doc = "Copy from contents from slice"]
1077    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1078        if other.len() != Self::len() {
1079            return None;
1080        }
1081        let mut buf = [0u8; Self::len()];
1082        buf.clone_from_slice(other);
1083        Some(Self::new_from_array(buf))
1084    }
1085    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1086    pub fn new_from_zeroed(other: &[u8]) -> Self {
1087        let mut buf = [0u8; Self::len()];
1088        let len = buf.len().min(other.len());
1089        buf[..len].clone_from_slice(&other[..len]);
1090        Self::new_from_array(buf)
1091    }
1092    pub fn new_from_array(buf: [u8; 32usize]) -> Self {
1093        unsafe { std::mem::transmute(buf) }
1094    }
1095    pub fn as_slice(&self) -> &[u8] {
1096        unsafe {
1097            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1098            std::slice::from_raw_parts(ptr, Self::len())
1099        }
1100    }
1101    pub fn from_slice(buf: &[u8]) -> &Self {
1102        assert!(buf.len() >= Self::len());
1103        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1104        unsafe { std::mem::transmute(buf.as_ptr()) }
1105    }
1106    pub fn as_array(&self) -> &[u8; 32usize] {
1107        unsafe { std::mem::transmute(self) }
1108    }
1109    pub fn from_array(buf: &[u8; 32usize]) -> &Self {
1110        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1111        unsafe { std::mem::transmute(buf) }
1112    }
1113    pub fn into_array(self) -> [u8; 32usize] {
1114        unsafe { std::mem::transmute(self) }
1115    }
1116    pub const fn len() -> usize {
1117        const _: () = assert!(std::mem::size_of::<RtnlLinkIfmap>() == 32usize);
1118        32usize
1119    }
1120}
1121impl std::fmt::Debug for RtnlLinkIfmap {
1122    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1123        fmt.debug_struct("RtnlLinkIfmap")
1124            .field("mem_start", &{ self.mem_start })
1125            .field("mem_end", &{ self.mem_end })
1126            .field("base_addr", &{ self.base_addr })
1127            .field("irq", &self.irq)
1128            .field("dma", &self.dma)
1129            .field("port", &self.port)
1130            .finish()
1131    }
1132}
1133#[derive(Debug)]
1134#[repr(C, packed(4))]
1135pub struct BrBooloptMulti {
1136    pub optval: u32,
1137    pub optmask: u32,
1138}
1139impl Clone for BrBooloptMulti {
1140    fn clone(&self) -> Self {
1141        Self::new_from_array(*self.as_array())
1142    }
1143}
1144#[doc = "Create zero-initialized struct"]
1145impl Default for BrBooloptMulti {
1146    fn default() -> Self {
1147        Self::new()
1148    }
1149}
1150impl BrBooloptMulti {
1151    #[doc = "Create zero-initialized struct"]
1152    pub fn new() -> Self {
1153        Self::new_from_array([0u8; Self::len()])
1154    }
1155    #[doc = "Copy from contents from slice"]
1156    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1157        if other.len() != Self::len() {
1158            return None;
1159        }
1160        let mut buf = [0u8; Self::len()];
1161        buf.clone_from_slice(other);
1162        Some(Self::new_from_array(buf))
1163    }
1164    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1165    pub fn new_from_zeroed(other: &[u8]) -> Self {
1166        let mut buf = [0u8; Self::len()];
1167        let len = buf.len().min(other.len());
1168        buf[..len].clone_from_slice(&other[..len]);
1169        Self::new_from_array(buf)
1170    }
1171    pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1172        unsafe { std::mem::transmute(buf) }
1173    }
1174    pub fn as_slice(&self) -> &[u8] {
1175        unsafe {
1176            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1177            std::slice::from_raw_parts(ptr, Self::len())
1178        }
1179    }
1180    pub fn from_slice(buf: &[u8]) -> &Self {
1181        assert!(buf.len() >= Self::len());
1182        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1183        unsafe { std::mem::transmute(buf.as_ptr()) }
1184    }
1185    pub fn as_array(&self) -> &[u8; 8usize] {
1186        unsafe { std::mem::transmute(self) }
1187    }
1188    pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1189        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1190        unsafe { std::mem::transmute(buf) }
1191    }
1192    pub fn into_array(self) -> [u8; 8usize] {
1193        unsafe { std::mem::transmute(self) }
1194    }
1195    pub const fn len() -> usize {
1196        const _: () = assert!(std::mem::size_of::<BrBooloptMulti>() == 8usize);
1197        8usize
1198    }
1199}
1200#[repr(C, packed(4))]
1201pub struct IfStatsMsg {
1202    pub family: u8,
1203    pub _pad: [u8; 3usize],
1204    pub ifindex: u32,
1205    pub filter_mask: u32,
1206}
1207impl Clone for IfStatsMsg {
1208    fn clone(&self) -> Self {
1209        Self::new_from_array(*self.as_array())
1210    }
1211}
1212#[doc = "Create zero-initialized struct"]
1213impl Default for IfStatsMsg {
1214    fn default() -> Self {
1215        Self::new()
1216    }
1217}
1218impl IfStatsMsg {
1219    #[doc = "Create zero-initialized struct"]
1220    pub fn new() -> Self {
1221        Self::new_from_array([0u8; Self::len()])
1222    }
1223    #[doc = "Copy from contents from slice"]
1224    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1225        if other.len() != Self::len() {
1226            return None;
1227        }
1228        let mut buf = [0u8; Self::len()];
1229        buf.clone_from_slice(other);
1230        Some(Self::new_from_array(buf))
1231    }
1232    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1233    pub fn new_from_zeroed(other: &[u8]) -> Self {
1234        let mut buf = [0u8; Self::len()];
1235        let len = buf.len().min(other.len());
1236        buf[..len].clone_from_slice(&other[..len]);
1237        Self::new_from_array(buf)
1238    }
1239    pub fn new_from_array(buf: [u8; 12usize]) -> Self {
1240        unsafe { std::mem::transmute(buf) }
1241    }
1242    pub fn as_slice(&self) -> &[u8] {
1243        unsafe {
1244            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1245            std::slice::from_raw_parts(ptr, Self::len())
1246        }
1247    }
1248    pub fn from_slice(buf: &[u8]) -> &Self {
1249        assert!(buf.len() >= Self::len());
1250        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1251        unsafe { std::mem::transmute(buf.as_ptr()) }
1252    }
1253    pub fn as_array(&self) -> &[u8; 12usize] {
1254        unsafe { std::mem::transmute(self) }
1255    }
1256    pub fn from_array(buf: &[u8; 12usize]) -> &Self {
1257        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1258        unsafe { std::mem::transmute(buf) }
1259    }
1260    pub fn into_array(self) -> [u8; 12usize] {
1261        unsafe { std::mem::transmute(self) }
1262    }
1263    pub const fn len() -> usize {
1264        const _: () = assert!(std::mem::size_of::<IfStatsMsg>() == 12usize);
1265        12usize
1266    }
1267}
1268impl std::fmt::Debug for IfStatsMsg {
1269    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1270        fmt.debug_struct("IfStatsMsg")
1271            .field("family", &self.family)
1272            .field("ifindex", &self.ifindex)
1273            .field("filter_mask", &self.filter_mask)
1274            .finish()
1275    }
1276}
1277#[repr(C, packed(4))]
1278pub struct IflaVlanFlags {
1279    #[doc = "Associated type: [`VlanFlags`] (1 bit per enumeration)"]
1280    pub flags: u32,
1281    pub mask: u32,
1282}
1283impl Clone for IflaVlanFlags {
1284    fn clone(&self) -> Self {
1285        Self::new_from_array(*self.as_array())
1286    }
1287}
1288#[doc = "Create zero-initialized struct"]
1289impl Default for IflaVlanFlags {
1290    fn default() -> Self {
1291        Self::new()
1292    }
1293}
1294impl IflaVlanFlags {
1295    #[doc = "Create zero-initialized struct"]
1296    pub fn new() -> Self {
1297        Self::new_from_array([0u8; Self::len()])
1298    }
1299    #[doc = "Copy from contents from slice"]
1300    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1301        if other.len() != Self::len() {
1302            return None;
1303        }
1304        let mut buf = [0u8; Self::len()];
1305        buf.clone_from_slice(other);
1306        Some(Self::new_from_array(buf))
1307    }
1308    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1309    pub fn new_from_zeroed(other: &[u8]) -> Self {
1310        let mut buf = [0u8; Self::len()];
1311        let len = buf.len().min(other.len());
1312        buf[..len].clone_from_slice(&other[..len]);
1313        Self::new_from_array(buf)
1314    }
1315    pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1316        unsafe { std::mem::transmute(buf) }
1317    }
1318    pub fn as_slice(&self) -> &[u8] {
1319        unsafe {
1320            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1321            std::slice::from_raw_parts(ptr, Self::len())
1322        }
1323    }
1324    pub fn from_slice(buf: &[u8]) -> &Self {
1325        assert!(buf.len() >= Self::len());
1326        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1327        unsafe { std::mem::transmute(buf.as_ptr()) }
1328    }
1329    pub fn as_array(&self) -> &[u8; 8usize] {
1330        unsafe { std::mem::transmute(self) }
1331    }
1332    pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1333        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1334        unsafe { std::mem::transmute(buf) }
1335    }
1336    pub fn into_array(self) -> [u8; 8usize] {
1337        unsafe { std::mem::transmute(self) }
1338    }
1339    pub const fn len() -> usize {
1340        const _: () = assert!(std::mem::size_of::<IflaVlanFlags>() == 8usize);
1341        8usize
1342    }
1343}
1344impl std::fmt::Debug for IflaVlanFlags {
1345    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1346        fmt.debug_struct("IflaVlanFlags")
1347            .field(
1348                "flags",
1349                &FormatFlags(self.flags.into(), VlanFlags::from_value),
1350            )
1351            .field("mask", &FormatHex(self.mask.to_ne_bytes()))
1352            .finish()
1353    }
1354}
1355#[derive(Debug)]
1356#[repr(C, packed(4))]
1357pub struct IflaVlanQosMapping {
1358    pub from: u32,
1359    pub to: u32,
1360}
1361impl Clone for IflaVlanQosMapping {
1362    fn clone(&self) -> Self {
1363        Self::new_from_array(*self.as_array())
1364    }
1365}
1366#[doc = "Create zero-initialized struct"]
1367impl Default for IflaVlanQosMapping {
1368    fn default() -> Self {
1369        Self::new()
1370    }
1371}
1372impl IflaVlanQosMapping {
1373    #[doc = "Create zero-initialized struct"]
1374    pub fn new() -> Self {
1375        Self::new_from_array([0u8; Self::len()])
1376    }
1377    #[doc = "Copy from contents from slice"]
1378    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1379        if other.len() != Self::len() {
1380            return None;
1381        }
1382        let mut buf = [0u8; Self::len()];
1383        buf.clone_from_slice(other);
1384        Some(Self::new_from_array(buf))
1385    }
1386    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1387    pub fn new_from_zeroed(other: &[u8]) -> Self {
1388        let mut buf = [0u8; Self::len()];
1389        let len = buf.len().min(other.len());
1390        buf[..len].clone_from_slice(&other[..len]);
1391        Self::new_from_array(buf)
1392    }
1393    pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1394        unsafe { std::mem::transmute(buf) }
1395    }
1396    pub fn as_slice(&self) -> &[u8] {
1397        unsafe {
1398            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1399            std::slice::from_raw_parts(ptr, Self::len())
1400        }
1401    }
1402    pub fn from_slice(buf: &[u8]) -> &Self {
1403        assert!(buf.len() >= Self::len());
1404        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1405        unsafe { std::mem::transmute(buf.as_ptr()) }
1406    }
1407    pub fn as_array(&self) -> &[u8; 8usize] {
1408        unsafe { std::mem::transmute(self) }
1409    }
1410    pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1411        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1412        unsafe { std::mem::transmute(buf) }
1413    }
1414    pub fn into_array(self) -> [u8; 8usize] {
1415        unsafe { std::mem::transmute(self) }
1416    }
1417    pub const fn len() -> usize {
1418        const _: () = assert!(std::mem::size_of::<IflaVlanQosMapping>() == 8usize);
1419        8usize
1420    }
1421}
1422#[repr(C, packed(4))]
1423pub struct IflaGenevePortRange {
1424    pub _low_be: u16,
1425    pub _high_be: u16,
1426}
1427impl Clone for IflaGenevePortRange {
1428    fn clone(&self) -> Self {
1429        Self::new_from_array(*self.as_array())
1430    }
1431}
1432#[doc = "Create zero-initialized struct"]
1433impl Default for IflaGenevePortRange {
1434    fn default() -> Self {
1435        Self::new()
1436    }
1437}
1438impl IflaGenevePortRange {
1439    #[doc = "Create zero-initialized struct"]
1440    pub fn new() -> Self {
1441        Self::new_from_array([0u8; Self::len()])
1442    }
1443    #[doc = "Copy from contents from slice"]
1444    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1445        if other.len() != Self::len() {
1446            return None;
1447        }
1448        let mut buf = [0u8; Self::len()];
1449        buf.clone_from_slice(other);
1450        Some(Self::new_from_array(buf))
1451    }
1452    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1453    pub fn new_from_zeroed(other: &[u8]) -> Self {
1454        let mut buf = [0u8; Self::len()];
1455        let len = buf.len().min(other.len());
1456        buf[..len].clone_from_slice(&other[..len]);
1457        Self::new_from_array(buf)
1458    }
1459    pub fn new_from_array(buf: [u8; 4usize]) -> Self {
1460        unsafe { std::mem::transmute(buf) }
1461    }
1462    pub fn as_slice(&self) -> &[u8] {
1463        unsafe {
1464            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1465            std::slice::from_raw_parts(ptr, Self::len())
1466        }
1467    }
1468    pub fn from_slice(buf: &[u8]) -> &Self {
1469        assert!(buf.len() >= Self::len());
1470        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1471        unsafe { std::mem::transmute(buf.as_ptr()) }
1472    }
1473    pub fn as_array(&self) -> &[u8; 4usize] {
1474        unsafe { std::mem::transmute(self) }
1475    }
1476    pub fn from_array(buf: &[u8; 4usize]) -> &Self {
1477        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1478        unsafe { std::mem::transmute(buf) }
1479    }
1480    pub fn into_array(self) -> [u8; 4usize] {
1481        unsafe { std::mem::transmute(self) }
1482    }
1483    pub const fn len() -> usize {
1484        const _: () = assert!(std::mem::size_of::<IflaGenevePortRange>() == 4usize);
1485        4usize
1486    }
1487    pub fn low(&self) -> u16 {
1488        u16::from_be(self._low_be)
1489    }
1490    pub fn set_low(&mut self, value: u16) {
1491        self._low_be = value.to_be();
1492    }
1493    pub fn high(&self) -> u16 {
1494        u16::from_be(self._high_be)
1495    }
1496    pub fn set_high(&mut self, value: u16) {
1497        self._high_be = value.to_be();
1498    }
1499}
1500impl std::fmt::Debug for IflaGenevePortRange {
1501    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1502        fmt.debug_struct("IflaGenevePortRange")
1503            .field("low", &self.low())
1504            .field("high", &self.high())
1505            .finish()
1506    }
1507}
1508#[derive(Debug)]
1509#[repr(C, packed(4))]
1510pub struct IflaVfMac {
1511    pub vf: u32,
1512    pub mac: [u8; 32usize],
1513}
1514impl Clone for IflaVfMac {
1515    fn clone(&self) -> Self {
1516        Self::new_from_array(*self.as_array())
1517    }
1518}
1519#[doc = "Create zero-initialized struct"]
1520impl Default for IflaVfMac {
1521    fn default() -> Self {
1522        Self::new()
1523    }
1524}
1525impl IflaVfMac {
1526    #[doc = "Create zero-initialized struct"]
1527    pub fn new() -> Self {
1528        Self::new_from_array([0u8; Self::len()])
1529    }
1530    #[doc = "Copy from contents from slice"]
1531    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1532        if other.len() != Self::len() {
1533            return None;
1534        }
1535        let mut buf = [0u8; Self::len()];
1536        buf.clone_from_slice(other);
1537        Some(Self::new_from_array(buf))
1538    }
1539    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1540    pub fn new_from_zeroed(other: &[u8]) -> Self {
1541        let mut buf = [0u8; Self::len()];
1542        let len = buf.len().min(other.len());
1543        buf[..len].clone_from_slice(&other[..len]);
1544        Self::new_from_array(buf)
1545    }
1546    pub fn new_from_array(buf: [u8; 36usize]) -> Self {
1547        unsafe { std::mem::transmute(buf) }
1548    }
1549    pub fn as_slice(&self) -> &[u8] {
1550        unsafe {
1551            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1552            std::slice::from_raw_parts(ptr, Self::len())
1553        }
1554    }
1555    pub fn from_slice(buf: &[u8]) -> &Self {
1556        assert!(buf.len() >= Self::len());
1557        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1558        unsafe { std::mem::transmute(buf.as_ptr()) }
1559    }
1560    pub fn as_array(&self) -> &[u8; 36usize] {
1561        unsafe { std::mem::transmute(self) }
1562    }
1563    pub fn from_array(buf: &[u8; 36usize]) -> &Self {
1564        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1565        unsafe { std::mem::transmute(buf) }
1566    }
1567    pub fn into_array(self) -> [u8; 36usize] {
1568        unsafe { std::mem::transmute(self) }
1569    }
1570    pub const fn len() -> usize {
1571        const _: () = assert!(std::mem::size_of::<IflaVfMac>() == 36usize);
1572        36usize
1573    }
1574}
1575#[derive(Debug)]
1576#[repr(C, packed(4))]
1577pub struct IflaVfVlan {
1578    pub vf: u32,
1579    pub vlan: u32,
1580    pub qos: u32,
1581}
1582impl Clone for IflaVfVlan {
1583    fn clone(&self) -> Self {
1584        Self::new_from_array(*self.as_array())
1585    }
1586}
1587#[doc = "Create zero-initialized struct"]
1588impl Default for IflaVfVlan {
1589    fn default() -> Self {
1590        Self::new()
1591    }
1592}
1593impl IflaVfVlan {
1594    #[doc = "Create zero-initialized struct"]
1595    pub fn new() -> Self {
1596        Self::new_from_array([0u8; Self::len()])
1597    }
1598    #[doc = "Copy from contents from slice"]
1599    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1600        if other.len() != Self::len() {
1601            return None;
1602        }
1603        let mut buf = [0u8; Self::len()];
1604        buf.clone_from_slice(other);
1605        Some(Self::new_from_array(buf))
1606    }
1607    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1608    pub fn new_from_zeroed(other: &[u8]) -> Self {
1609        let mut buf = [0u8; Self::len()];
1610        let len = buf.len().min(other.len());
1611        buf[..len].clone_from_slice(&other[..len]);
1612        Self::new_from_array(buf)
1613    }
1614    pub fn new_from_array(buf: [u8; 12usize]) -> Self {
1615        unsafe { std::mem::transmute(buf) }
1616    }
1617    pub fn as_slice(&self) -> &[u8] {
1618        unsafe {
1619            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1620            std::slice::from_raw_parts(ptr, Self::len())
1621        }
1622    }
1623    pub fn from_slice(buf: &[u8]) -> &Self {
1624        assert!(buf.len() >= Self::len());
1625        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1626        unsafe { std::mem::transmute(buf.as_ptr()) }
1627    }
1628    pub fn as_array(&self) -> &[u8; 12usize] {
1629        unsafe { std::mem::transmute(self) }
1630    }
1631    pub fn from_array(buf: &[u8; 12usize]) -> &Self {
1632        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1633        unsafe { std::mem::transmute(buf) }
1634    }
1635    pub fn into_array(self) -> [u8; 12usize] {
1636        unsafe { std::mem::transmute(self) }
1637    }
1638    pub const fn len() -> usize {
1639        const _: () = assert!(std::mem::size_of::<IflaVfVlan>() == 12usize);
1640        12usize
1641    }
1642}
1643#[derive(Debug)]
1644#[repr(C, packed(4))]
1645pub struct IflaVfTxRate {
1646    pub vf: u32,
1647    pub rate: u32,
1648}
1649impl Clone for IflaVfTxRate {
1650    fn clone(&self) -> Self {
1651        Self::new_from_array(*self.as_array())
1652    }
1653}
1654#[doc = "Create zero-initialized struct"]
1655impl Default for IflaVfTxRate {
1656    fn default() -> Self {
1657        Self::new()
1658    }
1659}
1660impl IflaVfTxRate {
1661    #[doc = "Create zero-initialized struct"]
1662    pub fn new() -> Self {
1663        Self::new_from_array([0u8; Self::len()])
1664    }
1665    #[doc = "Copy from contents from slice"]
1666    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1667        if other.len() != Self::len() {
1668            return None;
1669        }
1670        let mut buf = [0u8; Self::len()];
1671        buf.clone_from_slice(other);
1672        Some(Self::new_from_array(buf))
1673    }
1674    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1675    pub fn new_from_zeroed(other: &[u8]) -> Self {
1676        let mut buf = [0u8; Self::len()];
1677        let len = buf.len().min(other.len());
1678        buf[..len].clone_from_slice(&other[..len]);
1679        Self::new_from_array(buf)
1680    }
1681    pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1682        unsafe { std::mem::transmute(buf) }
1683    }
1684    pub fn as_slice(&self) -> &[u8] {
1685        unsafe {
1686            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1687            std::slice::from_raw_parts(ptr, Self::len())
1688        }
1689    }
1690    pub fn from_slice(buf: &[u8]) -> &Self {
1691        assert!(buf.len() >= Self::len());
1692        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1693        unsafe { std::mem::transmute(buf.as_ptr()) }
1694    }
1695    pub fn as_array(&self) -> &[u8; 8usize] {
1696        unsafe { std::mem::transmute(self) }
1697    }
1698    pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1699        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1700        unsafe { std::mem::transmute(buf) }
1701    }
1702    pub fn into_array(self) -> [u8; 8usize] {
1703        unsafe { std::mem::transmute(self) }
1704    }
1705    pub const fn len() -> usize {
1706        const _: () = assert!(std::mem::size_of::<IflaVfTxRate>() == 8usize);
1707        8usize
1708    }
1709}
1710#[derive(Debug)]
1711#[repr(C, packed(4))]
1712pub struct IflaVfSpoofchk {
1713    pub vf: u32,
1714    pub setting: u32,
1715}
1716impl Clone for IflaVfSpoofchk {
1717    fn clone(&self) -> Self {
1718        Self::new_from_array(*self.as_array())
1719    }
1720}
1721#[doc = "Create zero-initialized struct"]
1722impl Default for IflaVfSpoofchk {
1723    fn default() -> Self {
1724        Self::new()
1725    }
1726}
1727impl IflaVfSpoofchk {
1728    #[doc = "Create zero-initialized struct"]
1729    pub fn new() -> Self {
1730        Self::new_from_array([0u8; Self::len()])
1731    }
1732    #[doc = "Copy from contents from slice"]
1733    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1734        if other.len() != Self::len() {
1735            return None;
1736        }
1737        let mut buf = [0u8; Self::len()];
1738        buf.clone_from_slice(other);
1739        Some(Self::new_from_array(buf))
1740    }
1741    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1742    pub fn new_from_zeroed(other: &[u8]) -> Self {
1743        let mut buf = [0u8; Self::len()];
1744        let len = buf.len().min(other.len());
1745        buf[..len].clone_from_slice(&other[..len]);
1746        Self::new_from_array(buf)
1747    }
1748    pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1749        unsafe { std::mem::transmute(buf) }
1750    }
1751    pub fn as_slice(&self) -> &[u8] {
1752        unsafe {
1753            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1754            std::slice::from_raw_parts(ptr, Self::len())
1755        }
1756    }
1757    pub fn from_slice(buf: &[u8]) -> &Self {
1758        assert!(buf.len() >= Self::len());
1759        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1760        unsafe { std::mem::transmute(buf.as_ptr()) }
1761    }
1762    pub fn as_array(&self) -> &[u8; 8usize] {
1763        unsafe { std::mem::transmute(self) }
1764    }
1765    pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1766        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1767        unsafe { std::mem::transmute(buf) }
1768    }
1769    pub fn into_array(self) -> [u8; 8usize] {
1770        unsafe { std::mem::transmute(self) }
1771    }
1772    pub const fn len() -> usize {
1773        const _: () = assert!(std::mem::size_of::<IflaVfSpoofchk>() == 8usize);
1774        8usize
1775    }
1776}
1777#[repr(C, packed(4))]
1778pub struct IflaVfLinkState {
1779    pub vf: u32,
1780    #[doc = "Associated type: [`IflaVfLinkStateEnum`] (enum)"]
1781    pub link_state: u32,
1782}
1783impl Clone for IflaVfLinkState {
1784    fn clone(&self) -> Self {
1785        Self::new_from_array(*self.as_array())
1786    }
1787}
1788#[doc = "Create zero-initialized struct"]
1789impl Default for IflaVfLinkState {
1790    fn default() -> Self {
1791        Self::new()
1792    }
1793}
1794impl IflaVfLinkState {
1795    #[doc = "Create zero-initialized struct"]
1796    pub fn new() -> Self {
1797        Self::new_from_array([0u8; Self::len()])
1798    }
1799    #[doc = "Copy from contents from slice"]
1800    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1801        if other.len() != Self::len() {
1802            return None;
1803        }
1804        let mut buf = [0u8; Self::len()];
1805        buf.clone_from_slice(other);
1806        Some(Self::new_from_array(buf))
1807    }
1808    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1809    pub fn new_from_zeroed(other: &[u8]) -> Self {
1810        let mut buf = [0u8; Self::len()];
1811        let len = buf.len().min(other.len());
1812        buf[..len].clone_from_slice(&other[..len]);
1813        Self::new_from_array(buf)
1814    }
1815    pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1816        unsafe { std::mem::transmute(buf) }
1817    }
1818    pub fn as_slice(&self) -> &[u8] {
1819        unsafe {
1820            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1821            std::slice::from_raw_parts(ptr, Self::len())
1822        }
1823    }
1824    pub fn from_slice(buf: &[u8]) -> &Self {
1825        assert!(buf.len() >= Self::len());
1826        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1827        unsafe { std::mem::transmute(buf.as_ptr()) }
1828    }
1829    pub fn as_array(&self) -> &[u8; 8usize] {
1830        unsafe { std::mem::transmute(self) }
1831    }
1832    pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1833        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1834        unsafe { std::mem::transmute(buf) }
1835    }
1836    pub fn into_array(self) -> [u8; 8usize] {
1837        unsafe { std::mem::transmute(self) }
1838    }
1839    pub const fn len() -> usize {
1840        const _: () = assert!(std::mem::size_of::<IflaVfLinkState>() == 8usize);
1841        8usize
1842    }
1843}
1844impl std::fmt::Debug for IflaVfLinkState {
1845    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1846        fmt.debug_struct("IflaVfLinkState")
1847            .field("vf", &self.vf)
1848            .field(
1849                "link_state",
1850                &FormatEnum(self.link_state.into(), IflaVfLinkStateEnum::from_value),
1851            )
1852            .finish()
1853    }
1854}
1855#[derive(Debug)]
1856#[repr(C, packed(4))]
1857pub struct IflaVfRate {
1858    pub vf: u32,
1859    pub min_tx_rate: u32,
1860    pub max_tx_rate: u32,
1861}
1862impl Clone for IflaVfRate {
1863    fn clone(&self) -> Self {
1864        Self::new_from_array(*self.as_array())
1865    }
1866}
1867#[doc = "Create zero-initialized struct"]
1868impl Default for IflaVfRate {
1869    fn default() -> Self {
1870        Self::new()
1871    }
1872}
1873impl IflaVfRate {
1874    #[doc = "Create zero-initialized struct"]
1875    pub fn new() -> Self {
1876        Self::new_from_array([0u8; Self::len()])
1877    }
1878    #[doc = "Copy from contents from slice"]
1879    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1880        if other.len() != Self::len() {
1881            return None;
1882        }
1883        let mut buf = [0u8; Self::len()];
1884        buf.clone_from_slice(other);
1885        Some(Self::new_from_array(buf))
1886    }
1887    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1888    pub fn new_from_zeroed(other: &[u8]) -> Self {
1889        let mut buf = [0u8; Self::len()];
1890        let len = buf.len().min(other.len());
1891        buf[..len].clone_from_slice(&other[..len]);
1892        Self::new_from_array(buf)
1893    }
1894    pub fn new_from_array(buf: [u8; 12usize]) -> Self {
1895        unsafe { std::mem::transmute(buf) }
1896    }
1897    pub fn as_slice(&self) -> &[u8] {
1898        unsafe {
1899            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1900            std::slice::from_raw_parts(ptr, Self::len())
1901        }
1902    }
1903    pub fn from_slice(buf: &[u8]) -> &Self {
1904        assert!(buf.len() >= Self::len());
1905        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1906        unsafe { std::mem::transmute(buf.as_ptr()) }
1907    }
1908    pub fn as_array(&self) -> &[u8; 12usize] {
1909        unsafe { std::mem::transmute(self) }
1910    }
1911    pub fn from_array(buf: &[u8; 12usize]) -> &Self {
1912        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1913        unsafe { std::mem::transmute(buf) }
1914    }
1915    pub fn into_array(self) -> [u8; 12usize] {
1916        unsafe { std::mem::transmute(self) }
1917    }
1918    pub const fn len() -> usize {
1919        const _: () = assert!(std::mem::size_of::<IflaVfRate>() == 12usize);
1920        12usize
1921    }
1922}
1923#[derive(Debug)]
1924#[repr(C, packed(4))]
1925pub struct IflaVfRssQueryEn {
1926    pub vf: u32,
1927    pub setting: u32,
1928}
1929impl Clone for IflaVfRssQueryEn {
1930    fn clone(&self) -> Self {
1931        Self::new_from_array(*self.as_array())
1932    }
1933}
1934#[doc = "Create zero-initialized struct"]
1935impl Default for IflaVfRssQueryEn {
1936    fn default() -> Self {
1937        Self::new()
1938    }
1939}
1940impl IflaVfRssQueryEn {
1941    #[doc = "Create zero-initialized struct"]
1942    pub fn new() -> Self {
1943        Self::new_from_array([0u8; Self::len()])
1944    }
1945    #[doc = "Copy from contents from slice"]
1946    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1947        if other.len() != Self::len() {
1948            return None;
1949        }
1950        let mut buf = [0u8; Self::len()];
1951        buf.clone_from_slice(other);
1952        Some(Self::new_from_array(buf))
1953    }
1954    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1955    pub fn new_from_zeroed(other: &[u8]) -> Self {
1956        let mut buf = [0u8; Self::len()];
1957        let len = buf.len().min(other.len());
1958        buf[..len].clone_from_slice(&other[..len]);
1959        Self::new_from_array(buf)
1960    }
1961    pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1962        unsafe { std::mem::transmute(buf) }
1963    }
1964    pub fn as_slice(&self) -> &[u8] {
1965        unsafe {
1966            let ptr: *const u8 = std::mem::transmute(self as *const Self);
1967            std::slice::from_raw_parts(ptr, Self::len())
1968        }
1969    }
1970    pub fn from_slice(buf: &[u8]) -> &Self {
1971        assert!(buf.len() >= Self::len());
1972        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1973        unsafe { std::mem::transmute(buf.as_ptr()) }
1974    }
1975    pub fn as_array(&self) -> &[u8; 8usize] {
1976        unsafe { std::mem::transmute(self) }
1977    }
1978    pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1979        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1980        unsafe { std::mem::transmute(buf) }
1981    }
1982    pub fn into_array(self) -> [u8; 8usize] {
1983        unsafe { std::mem::transmute(self) }
1984    }
1985    pub const fn len() -> usize {
1986        const _: () = assert!(std::mem::size_of::<IflaVfRssQueryEn>() == 8usize);
1987        8usize
1988    }
1989}
1990#[derive(Debug)]
1991#[repr(C, packed(4))]
1992pub struct IflaVfTrust {
1993    pub vf: u32,
1994    pub setting: u32,
1995}
1996impl Clone for IflaVfTrust {
1997    fn clone(&self) -> Self {
1998        Self::new_from_array(*self.as_array())
1999    }
2000}
2001#[doc = "Create zero-initialized struct"]
2002impl Default for IflaVfTrust {
2003    fn default() -> Self {
2004        Self::new()
2005    }
2006}
2007impl IflaVfTrust {
2008    #[doc = "Create zero-initialized struct"]
2009    pub fn new() -> Self {
2010        Self::new_from_array([0u8; Self::len()])
2011    }
2012    #[doc = "Copy from contents from slice"]
2013    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
2014        if other.len() != Self::len() {
2015            return None;
2016        }
2017        let mut buf = [0u8; Self::len()];
2018        buf.clone_from_slice(other);
2019        Some(Self::new_from_array(buf))
2020    }
2021    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
2022    pub fn new_from_zeroed(other: &[u8]) -> Self {
2023        let mut buf = [0u8; Self::len()];
2024        let len = buf.len().min(other.len());
2025        buf[..len].clone_from_slice(&other[..len]);
2026        Self::new_from_array(buf)
2027    }
2028    pub fn new_from_array(buf: [u8; 8usize]) -> Self {
2029        unsafe { std::mem::transmute(buf) }
2030    }
2031    pub fn as_slice(&self) -> &[u8] {
2032        unsafe {
2033            let ptr: *const u8 = std::mem::transmute(self as *const Self);
2034            std::slice::from_raw_parts(ptr, Self::len())
2035        }
2036    }
2037    pub fn from_slice(buf: &[u8]) -> &Self {
2038        assert!(buf.len() >= Self::len());
2039        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2040        unsafe { std::mem::transmute(buf.as_ptr()) }
2041    }
2042    pub fn as_array(&self) -> &[u8; 8usize] {
2043        unsafe { std::mem::transmute(self) }
2044    }
2045    pub fn from_array(buf: &[u8; 8usize]) -> &Self {
2046        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2047        unsafe { std::mem::transmute(buf) }
2048    }
2049    pub fn into_array(self) -> [u8; 8usize] {
2050        unsafe { std::mem::transmute(self) }
2051    }
2052    pub const fn len() -> usize {
2053        const _: () = assert!(std::mem::size_of::<IflaVfTrust>() == 8usize);
2054        8usize
2055    }
2056}
2057#[repr(C, packed(4))]
2058pub struct IflaVfGuid {
2059    pub vf: u32,
2060    pub _pad_4: [u8; 4usize],
2061    pub guid: u64,
2062}
2063impl Clone for IflaVfGuid {
2064    fn clone(&self) -> Self {
2065        Self::new_from_array(*self.as_array())
2066    }
2067}
2068#[doc = "Create zero-initialized struct"]
2069impl Default for IflaVfGuid {
2070    fn default() -> Self {
2071        Self::new()
2072    }
2073}
2074impl IflaVfGuid {
2075    #[doc = "Create zero-initialized struct"]
2076    pub fn new() -> Self {
2077        Self::new_from_array([0u8; Self::len()])
2078    }
2079    #[doc = "Copy from contents from slice"]
2080    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
2081        if other.len() != Self::len() {
2082            return None;
2083        }
2084        let mut buf = [0u8; Self::len()];
2085        buf.clone_from_slice(other);
2086        Some(Self::new_from_array(buf))
2087    }
2088    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
2089    pub fn new_from_zeroed(other: &[u8]) -> Self {
2090        let mut buf = [0u8; Self::len()];
2091        let len = buf.len().min(other.len());
2092        buf[..len].clone_from_slice(&other[..len]);
2093        Self::new_from_array(buf)
2094    }
2095    pub fn new_from_array(buf: [u8; 16usize]) -> Self {
2096        unsafe { std::mem::transmute(buf) }
2097    }
2098    pub fn as_slice(&self) -> &[u8] {
2099        unsafe {
2100            let ptr: *const u8 = std::mem::transmute(self as *const Self);
2101            std::slice::from_raw_parts(ptr, Self::len())
2102        }
2103    }
2104    pub fn from_slice(buf: &[u8]) -> &Self {
2105        assert!(buf.len() >= Self::len());
2106        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2107        unsafe { std::mem::transmute(buf.as_ptr()) }
2108    }
2109    pub fn as_array(&self) -> &[u8; 16usize] {
2110        unsafe { std::mem::transmute(self) }
2111    }
2112    pub fn from_array(buf: &[u8; 16usize]) -> &Self {
2113        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2114        unsafe { std::mem::transmute(buf) }
2115    }
2116    pub fn into_array(self) -> [u8; 16usize] {
2117        unsafe { std::mem::transmute(self) }
2118    }
2119    pub const fn len() -> usize {
2120        const _: () = assert!(std::mem::size_of::<IflaVfGuid>() == 16usize);
2121        16usize
2122    }
2123}
2124impl std::fmt::Debug for IflaVfGuid {
2125    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2126        fmt.debug_struct("IflaVfGuid")
2127            .field("vf", &self.vf)
2128            .field("guid", &{ self.guid })
2129            .finish()
2130    }
2131}
2132#[derive(Debug)]
2133#[repr(C, packed(4))]
2134pub struct IflaVfVlanInfo {
2135    pub vf: u32,
2136    pub vlan: u32,
2137    pub qos: u32,
2138    pub vlan_proto: u32,
2139}
2140impl Clone for IflaVfVlanInfo {
2141    fn clone(&self) -> Self {
2142        Self::new_from_array(*self.as_array())
2143    }
2144}
2145#[doc = "Create zero-initialized struct"]
2146impl Default for IflaVfVlanInfo {
2147    fn default() -> Self {
2148        Self::new()
2149    }
2150}
2151impl IflaVfVlanInfo {
2152    #[doc = "Create zero-initialized struct"]
2153    pub fn new() -> Self {
2154        Self::new_from_array([0u8; Self::len()])
2155    }
2156    #[doc = "Copy from contents from slice"]
2157    pub fn new_from_slice(other: &[u8]) -> Option<Self> {
2158        if other.len() != Self::len() {
2159            return None;
2160        }
2161        let mut buf = [0u8; Self::len()];
2162        buf.clone_from_slice(other);
2163        Some(Self::new_from_array(buf))
2164    }
2165    #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
2166    pub fn new_from_zeroed(other: &[u8]) -> Self {
2167        let mut buf = [0u8; Self::len()];
2168        let len = buf.len().min(other.len());
2169        buf[..len].clone_from_slice(&other[..len]);
2170        Self::new_from_array(buf)
2171    }
2172    pub fn new_from_array(buf: [u8; 16usize]) -> Self {
2173        unsafe { std::mem::transmute(buf) }
2174    }
2175    pub fn as_slice(&self) -> &[u8] {
2176        unsafe {
2177            let ptr: *const u8 = std::mem::transmute(self as *const Self);
2178            std::slice::from_raw_parts(ptr, Self::len())
2179        }
2180    }
2181    pub fn from_slice(buf: &[u8]) -> &Self {
2182        assert!(buf.len() >= Self::len());
2183        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2184        unsafe { std::mem::transmute(buf.as_ptr()) }
2185    }
2186    pub fn as_array(&self) -> &[u8; 16usize] {
2187        unsafe { std::mem::transmute(self) }
2188    }
2189    pub fn from_array(buf: &[u8; 16usize]) -> &Self {
2190        assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2191        unsafe { std::mem::transmute(buf) }
2192    }
2193    pub fn into_array(self) -> [u8; 16usize] {
2194        unsafe { std::mem::transmute(self) }
2195    }
2196    pub const fn len() -> usize {
2197        const _: () = assert!(std::mem::size_of::<IflaVfVlanInfo>() == 16usize);
2198        16usize
2199    }
2200}
2201#[derive(Clone)]
2202pub enum LinkAttrs<'a> {
2203    Address(&'a [u8]),
2204    Broadcast(&'a [u8]),
2205    Ifname(&'a CStr),
2206    Mtu(u32),
2207    Link(u32),
2208    Qdisc(&'a CStr),
2209    Stats(RtnlLinkStats),
2210    Master(u32),
2211    #[doc = "struct iw_event\n"]
2212    Wireless(&'a [u8]),
2213    #[doc = "A nest of ifla6-attrs or linkinfo-brport-attrs\n"]
2214    Protinfo(&'a [u8]),
2215    Txqlen(u32),
2216    Map(RtnlLinkIfmap),
2217    Weight(u32),
2218    Operstate(u8),
2219    Linkmode(u8),
2220    Linkinfo(IterableLinkinfoAttrs<'a>),
2221    NetNsPid(u32),
2222    Ifalias(&'a CStr),
2223    NumVf(u32),
2224    VfinfoList(IterableVfinfoListAttrs<'a>),
2225    Stats64(RtnlLinkStats64),
2226    VfPorts(IterableVfPortsAttrs<'a>),
2227    PortSelf(IterablePortSelfAttrs<'a>),
2228    AfSpec(IterableAfSpecAttrs<'a>),
2229    Group(u32),
2230    NetNsFd(u32),
2231    #[doc = "Associated type: [`RtextFilter`] (1 bit per enumeration)"]
2232    ExtMask(u32),
2233    Promiscuity(u32),
2234    NumTxQueues(u32),
2235    NumRxQueues(u32),
2236    Carrier(u8),
2237    PhysPortId(&'a [u8]),
2238    CarrierChanges(u32),
2239    PhysSwitchId(&'a [u8]),
2240    LinkNetnsid(i32),
2241    PhysPortName(&'a CStr),
2242    ProtoDown(u8),
2243    GsoMaxSegs(u32),
2244    GsoMaxSize(u32),
2245    Pad(&'a [u8]),
2246    Xdp(IterableXdpAttrs<'a>),
2247    Event(u32),
2248    NewNetnsid(i32),
2249    TargetNetnsid(i32),
2250    CarrierUpCount(u32),
2251    CarrierDownCount(u32),
2252    NewIfindex(i32),
2253    MinMtu(u32),
2254    MaxMtu(u32),
2255    PropList(IterablePropListLinkAttrs<'a>),
2256    AltIfname(&'a CStr),
2257    PermAddress(&'a [u8]),
2258    ProtoDownReason(&'a CStr),
2259    ParentDevName(&'a CStr),
2260    ParentDevBusName(&'a CStr),
2261    GroMaxSize(u32),
2262    TsoMaxSize(u32),
2263    TsoMaxSegs(u32),
2264    Allmulti(u32),
2265    DevlinkPort(&'a [u8]),
2266    GsoIpv4MaxSize(u32),
2267    GroIpv4MaxSize(u32),
2268    DpllPin(IterableLinkDpllPinAttrs<'a>),
2269    #[doc = "EDT offload horizon supported by the device (in nsec).\n"]
2270    MaxPacingOffloadHorizon(u32),
2271    NetnsImmutable(u8),
2272    Headroom(u16),
2273    Tailroom(u16),
2274}
2275impl<'a> IterableLinkAttrs<'a> {
2276    pub fn get_address(&self) -> Result<&'a [u8], ErrorContext> {
2277        let mut iter = self.clone();
2278        iter.pos = 0;
2279        for attr in iter {
2280            if let Ok(LinkAttrs::Address(val)) = attr {
2281                return Ok(val);
2282            }
2283        }
2284        Err(ErrorContext::new_missing(
2285            "LinkAttrs",
2286            "Address",
2287            self.orig_loc,
2288            self.buf.as_ptr() as usize,
2289        ))
2290    }
2291    pub fn get_broadcast(&self) -> Result<&'a [u8], ErrorContext> {
2292        let mut iter = self.clone();
2293        iter.pos = 0;
2294        for attr in iter {
2295            if let Ok(LinkAttrs::Broadcast(val)) = attr {
2296                return Ok(val);
2297            }
2298        }
2299        Err(ErrorContext::new_missing(
2300            "LinkAttrs",
2301            "Broadcast",
2302            self.orig_loc,
2303            self.buf.as_ptr() as usize,
2304        ))
2305    }
2306    pub fn get_ifname(&self) -> Result<&'a CStr, ErrorContext> {
2307        let mut iter = self.clone();
2308        iter.pos = 0;
2309        for attr in iter {
2310            if let Ok(LinkAttrs::Ifname(val)) = attr {
2311                return Ok(val);
2312            }
2313        }
2314        Err(ErrorContext::new_missing(
2315            "LinkAttrs",
2316            "Ifname",
2317            self.orig_loc,
2318            self.buf.as_ptr() as usize,
2319        ))
2320    }
2321    pub fn get_mtu(&self) -> Result<u32, ErrorContext> {
2322        let mut iter = self.clone();
2323        iter.pos = 0;
2324        for attr in iter {
2325            if let Ok(LinkAttrs::Mtu(val)) = attr {
2326                return Ok(val);
2327            }
2328        }
2329        Err(ErrorContext::new_missing(
2330            "LinkAttrs",
2331            "Mtu",
2332            self.orig_loc,
2333            self.buf.as_ptr() as usize,
2334        ))
2335    }
2336    pub fn get_link(&self) -> Result<u32, ErrorContext> {
2337        let mut iter = self.clone();
2338        iter.pos = 0;
2339        for attr in iter {
2340            if let Ok(LinkAttrs::Link(val)) = attr {
2341                return Ok(val);
2342            }
2343        }
2344        Err(ErrorContext::new_missing(
2345            "LinkAttrs",
2346            "Link",
2347            self.orig_loc,
2348            self.buf.as_ptr() as usize,
2349        ))
2350    }
2351    pub fn get_qdisc(&self) -> Result<&'a CStr, ErrorContext> {
2352        let mut iter = self.clone();
2353        iter.pos = 0;
2354        for attr in iter {
2355            if let Ok(LinkAttrs::Qdisc(val)) = attr {
2356                return Ok(val);
2357            }
2358        }
2359        Err(ErrorContext::new_missing(
2360            "LinkAttrs",
2361            "Qdisc",
2362            self.orig_loc,
2363            self.buf.as_ptr() as usize,
2364        ))
2365    }
2366    pub fn get_stats(&self) -> Result<RtnlLinkStats, ErrorContext> {
2367        let mut iter = self.clone();
2368        iter.pos = 0;
2369        for attr in iter {
2370            if let Ok(LinkAttrs::Stats(val)) = attr {
2371                return Ok(val);
2372            }
2373        }
2374        Err(ErrorContext::new_missing(
2375            "LinkAttrs",
2376            "Stats",
2377            self.orig_loc,
2378            self.buf.as_ptr() as usize,
2379        ))
2380    }
2381    pub fn get_master(&self) -> Result<u32, ErrorContext> {
2382        let mut iter = self.clone();
2383        iter.pos = 0;
2384        for attr in iter {
2385            if let Ok(LinkAttrs::Master(val)) = attr {
2386                return Ok(val);
2387            }
2388        }
2389        Err(ErrorContext::new_missing(
2390            "LinkAttrs",
2391            "Master",
2392            self.orig_loc,
2393            self.buf.as_ptr() as usize,
2394        ))
2395    }
2396    #[doc = "struct iw_event\n"]
2397    pub fn get_wireless(&self) -> Result<&'a [u8], ErrorContext> {
2398        let mut iter = self.clone();
2399        iter.pos = 0;
2400        for attr in iter {
2401            if let Ok(LinkAttrs::Wireless(val)) = attr {
2402                return Ok(val);
2403            }
2404        }
2405        Err(ErrorContext::new_missing(
2406            "LinkAttrs",
2407            "Wireless",
2408            self.orig_loc,
2409            self.buf.as_ptr() as usize,
2410        ))
2411    }
2412    #[doc = "A nest of ifla6-attrs or linkinfo-brport-attrs\n"]
2413    pub fn get_protinfo(&self) -> Result<&'a [u8], ErrorContext> {
2414        let mut iter = self.clone();
2415        iter.pos = 0;
2416        for attr in iter {
2417            if let Ok(LinkAttrs::Protinfo(val)) = attr {
2418                return Ok(val);
2419            }
2420        }
2421        Err(ErrorContext::new_missing(
2422            "LinkAttrs",
2423            "Protinfo",
2424            self.orig_loc,
2425            self.buf.as_ptr() as usize,
2426        ))
2427    }
2428    pub fn get_txqlen(&self) -> Result<u32, ErrorContext> {
2429        let mut iter = self.clone();
2430        iter.pos = 0;
2431        for attr in iter {
2432            if let Ok(LinkAttrs::Txqlen(val)) = attr {
2433                return Ok(val);
2434            }
2435        }
2436        Err(ErrorContext::new_missing(
2437            "LinkAttrs",
2438            "Txqlen",
2439            self.orig_loc,
2440            self.buf.as_ptr() as usize,
2441        ))
2442    }
2443    pub fn get_map(&self) -> Result<RtnlLinkIfmap, ErrorContext> {
2444        let mut iter = self.clone();
2445        iter.pos = 0;
2446        for attr in iter {
2447            if let Ok(LinkAttrs::Map(val)) = attr {
2448                return Ok(val);
2449            }
2450        }
2451        Err(ErrorContext::new_missing(
2452            "LinkAttrs",
2453            "Map",
2454            self.orig_loc,
2455            self.buf.as_ptr() as usize,
2456        ))
2457    }
2458    pub fn get_weight(&self) -> Result<u32, ErrorContext> {
2459        let mut iter = self.clone();
2460        iter.pos = 0;
2461        for attr in iter {
2462            if let Ok(LinkAttrs::Weight(val)) = attr {
2463                return Ok(val);
2464            }
2465        }
2466        Err(ErrorContext::new_missing(
2467            "LinkAttrs",
2468            "Weight",
2469            self.orig_loc,
2470            self.buf.as_ptr() as usize,
2471        ))
2472    }
2473    pub fn get_operstate(&self) -> Result<u8, ErrorContext> {
2474        let mut iter = self.clone();
2475        iter.pos = 0;
2476        for attr in iter {
2477            if let Ok(LinkAttrs::Operstate(val)) = attr {
2478                return Ok(val);
2479            }
2480        }
2481        Err(ErrorContext::new_missing(
2482            "LinkAttrs",
2483            "Operstate",
2484            self.orig_loc,
2485            self.buf.as_ptr() as usize,
2486        ))
2487    }
2488    pub fn get_linkmode(&self) -> Result<u8, ErrorContext> {
2489        let mut iter = self.clone();
2490        iter.pos = 0;
2491        for attr in iter {
2492            if let Ok(LinkAttrs::Linkmode(val)) = attr {
2493                return Ok(val);
2494            }
2495        }
2496        Err(ErrorContext::new_missing(
2497            "LinkAttrs",
2498            "Linkmode",
2499            self.orig_loc,
2500            self.buf.as_ptr() as usize,
2501        ))
2502    }
2503    pub fn get_linkinfo(&self) -> Result<IterableLinkinfoAttrs<'a>, ErrorContext> {
2504        let mut iter = self.clone();
2505        iter.pos = 0;
2506        for attr in iter {
2507            if let Ok(LinkAttrs::Linkinfo(val)) = attr {
2508                return Ok(val);
2509            }
2510        }
2511        Err(ErrorContext::new_missing(
2512            "LinkAttrs",
2513            "Linkinfo",
2514            self.orig_loc,
2515            self.buf.as_ptr() as usize,
2516        ))
2517    }
2518    pub fn get_net_ns_pid(&self) -> Result<u32, ErrorContext> {
2519        let mut iter = self.clone();
2520        iter.pos = 0;
2521        for attr in iter {
2522            if let Ok(LinkAttrs::NetNsPid(val)) = attr {
2523                return Ok(val);
2524            }
2525        }
2526        Err(ErrorContext::new_missing(
2527            "LinkAttrs",
2528            "NetNsPid",
2529            self.orig_loc,
2530            self.buf.as_ptr() as usize,
2531        ))
2532    }
2533    pub fn get_ifalias(&self) -> Result<&'a CStr, ErrorContext> {
2534        let mut iter = self.clone();
2535        iter.pos = 0;
2536        for attr in iter {
2537            if let Ok(LinkAttrs::Ifalias(val)) = attr {
2538                return Ok(val);
2539            }
2540        }
2541        Err(ErrorContext::new_missing(
2542            "LinkAttrs",
2543            "Ifalias",
2544            self.orig_loc,
2545            self.buf.as_ptr() as usize,
2546        ))
2547    }
2548    pub fn get_num_vf(&self) -> Result<u32, ErrorContext> {
2549        let mut iter = self.clone();
2550        iter.pos = 0;
2551        for attr in iter {
2552            if let Ok(LinkAttrs::NumVf(val)) = attr {
2553                return Ok(val);
2554            }
2555        }
2556        Err(ErrorContext::new_missing(
2557            "LinkAttrs",
2558            "NumVf",
2559            self.orig_loc,
2560            self.buf.as_ptr() as usize,
2561        ))
2562    }
2563    pub fn get_vfinfo_list(&self) -> Result<IterableVfinfoListAttrs<'a>, ErrorContext> {
2564        let mut iter = self.clone();
2565        iter.pos = 0;
2566        for attr in iter {
2567            if let Ok(LinkAttrs::VfinfoList(val)) = attr {
2568                return Ok(val);
2569            }
2570        }
2571        Err(ErrorContext::new_missing(
2572            "LinkAttrs",
2573            "VfinfoList",
2574            self.orig_loc,
2575            self.buf.as_ptr() as usize,
2576        ))
2577    }
2578    pub fn get_stats64(&self) -> Result<RtnlLinkStats64, ErrorContext> {
2579        let mut iter = self.clone();
2580        iter.pos = 0;
2581        for attr in iter {
2582            if let Ok(LinkAttrs::Stats64(val)) = attr {
2583                return Ok(val);
2584            }
2585        }
2586        Err(ErrorContext::new_missing(
2587            "LinkAttrs",
2588            "Stats64",
2589            self.orig_loc,
2590            self.buf.as_ptr() as usize,
2591        ))
2592    }
2593    pub fn get_vf_ports(&self) -> Result<IterableVfPortsAttrs<'a>, ErrorContext> {
2594        let mut iter = self.clone();
2595        iter.pos = 0;
2596        for attr in iter {
2597            if let Ok(LinkAttrs::VfPorts(val)) = attr {
2598                return Ok(val);
2599            }
2600        }
2601        Err(ErrorContext::new_missing(
2602            "LinkAttrs",
2603            "VfPorts",
2604            self.orig_loc,
2605            self.buf.as_ptr() as usize,
2606        ))
2607    }
2608    pub fn get_port_self(&self) -> Result<IterablePortSelfAttrs<'a>, ErrorContext> {
2609        let mut iter = self.clone();
2610        iter.pos = 0;
2611        for attr in iter {
2612            if let Ok(LinkAttrs::PortSelf(val)) = attr {
2613                return Ok(val);
2614            }
2615        }
2616        Err(ErrorContext::new_missing(
2617            "LinkAttrs",
2618            "PortSelf",
2619            self.orig_loc,
2620            self.buf.as_ptr() as usize,
2621        ))
2622    }
2623    pub fn get_af_spec(&self) -> Result<IterableAfSpecAttrs<'a>, ErrorContext> {
2624        let mut iter = self.clone();
2625        iter.pos = 0;
2626        for attr in iter {
2627            if let Ok(LinkAttrs::AfSpec(val)) = attr {
2628                return Ok(val);
2629            }
2630        }
2631        Err(ErrorContext::new_missing(
2632            "LinkAttrs",
2633            "AfSpec",
2634            self.orig_loc,
2635            self.buf.as_ptr() as usize,
2636        ))
2637    }
2638    pub fn get_group(&self) -> Result<u32, ErrorContext> {
2639        let mut iter = self.clone();
2640        iter.pos = 0;
2641        for attr in iter {
2642            if let Ok(LinkAttrs::Group(val)) = attr {
2643                return Ok(val);
2644            }
2645        }
2646        Err(ErrorContext::new_missing(
2647            "LinkAttrs",
2648            "Group",
2649            self.orig_loc,
2650            self.buf.as_ptr() as usize,
2651        ))
2652    }
2653    pub fn get_net_ns_fd(&self) -> Result<u32, ErrorContext> {
2654        let mut iter = self.clone();
2655        iter.pos = 0;
2656        for attr in iter {
2657            if let Ok(LinkAttrs::NetNsFd(val)) = attr {
2658                return Ok(val);
2659            }
2660        }
2661        Err(ErrorContext::new_missing(
2662            "LinkAttrs",
2663            "NetNsFd",
2664            self.orig_loc,
2665            self.buf.as_ptr() as usize,
2666        ))
2667    }
2668    #[doc = "Associated type: [`RtextFilter`] (1 bit per enumeration)"]
2669    pub fn get_ext_mask(&self) -> Result<u32, ErrorContext> {
2670        let mut iter = self.clone();
2671        iter.pos = 0;
2672        for attr in iter {
2673            if let Ok(LinkAttrs::ExtMask(val)) = attr {
2674                return Ok(val);
2675            }
2676        }
2677        Err(ErrorContext::new_missing(
2678            "LinkAttrs",
2679            "ExtMask",
2680            self.orig_loc,
2681            self.buf.as_ptr() as usize,
2682        ))
2683    }
2684    pub fn get_promiscuity(&self) -> Result<u32, ErrorContext> {
2685        let mut iter = self.clone();
2686        iter.pos = 0;
2687        for attr in iter {
2688            if let Ok(LinkAttrs::Promiscuity(val)) = attr {
2689                return Ok(val);
2690            }
2691        }
2692        Err(ErrorContext::new_missing(
2693            "LinkAttrs",
2694            "Promiscuity",
2695            self.orig_loc,
2696            self.buf.as_ptr() as usize,
2697        ))
2698    }
2699    pub fn get_num_tx_queues(&self) -> Result<u32, ErrorContext> {
2700        let mut iter = self.clone();
2701        iter.pos = 0;
2702        for attr in iter {
2703            if let Ok(LinkAttrs::NumTxQueues(val)) = attr {
2704                return Ok(val);
2705            }
2706        }
2707        Err(ErrorContext::new_missing(
2708            "LinkAttrs",
2709            "NumTxQueues",
2710            self.orig_loc,
2711            self.buf.as_ptr() as usize,
2712        ))
2713    }
2714    pub fn get_num_rx_queues(&self) -> Result<u32, ErrorContext> {
2715        let mut iter = self.clone();
2716        iter.pos = 0;
2717        for attr in iter {
2718            if let Ok(LinkAttrs::NumRxQueues(val)) = attr {
2719                return Ok(val);
2720            }
2721        }
2722        Err(ErrorContext::new_missing(
2723            "LinkAttrs",
2724            "NumRxQueues",
2725            self.orig_loc,
2726            self.buf.as_ptr() as usize,
2727        ))
2728    }
2729    pub fn get_carrier(&self) -> Result<u8, ErrorContext> {
2730        let mut iter = self.clone();
2731        iter.pos = 0;
2732        for attr in iter {
2733            if let Ok(LinkAttrs::Carrier(val)) = attr {
2734                return Ok(val);
2735            }
2736        }
2737        Err(ErrorContext::new_missing(
2738            "LinkAttrs",
2739            "Carrier",
2740            self.orig_loc,
2741            self.buf.as_ptr() as usize,
2742        ))
2743    }
2744    pub fn get_phys_port_id(&self) -> Result<&'a [u8], ErrorContext> {
2745        let mut iter = self.clone();
2746        iter.pos = 0;
2747        for attr in iter {
2748            if let Ok(LinkAttrs::PhysPortId(val)) = attr {
2749                return Ok(val);
2750            }
2751        }
2752        Err(ErrorContext::new_missing(
2753            "LinkAttrs",
2754            "PhysPortId",
2755            self.orig_loc,
2756            self.buf.as_ptr() as usize,
2757        ))
2758    }
2759    pub fn get_carrier_changes(&self) -> Result<u32, ErrorContext> {
2760        let mut iter = self.clone();
2761        iter.pos = 0;
2762        for attr in iter {
2763            if let Ok(LinkAttrs::CarrierChanges(val)) = attr {
2764                return Ok(val);
2765            }
2766        }
2767        Err(ErrorContext::new_missing(
2768            "LinkAttrs",
2769            "CarrierChanges",
2770            self.orig_loc,
2771            self.buf.as_ptr() as usize,
2772        ))
2773    }
2774    pub fn get_phys_switch_id(&self) -> Result<&'a [u8], ErrorContext> {
2775        let mut iter = self.clone();
2776        iter.pos = 0;
2777        for attr in iter {
2778            if let Ok(LinkAttrs::PhysSwitchId(val)) = attr {
2779                return Ok(val);
2780            }
2781        }
2782        Err(ErrorContext::new_missing(
2783            "LinkAttrs",
2784            "PhysSwitchId",
2785            self.orig_loc,
2786            self.buf.as_ptr() as usize,
2787        ))
2788    }
2789    pub fn get_link_netnsid(&self) -> Result<i32, ErrorContext> {
2790        let mut iter = self.clone();
2791        iter.pos = 0;
2792        for attr in iter {
2793            if let Ok(LinkAttrs::LinkNetnsid(val)) = attr {
2794                return Ok(val);
2795            }
2796        }
2797        Err(ErrorContext::new_missing(
2798            "LinkAttrs",
2799            "LinkNetnsid",
2800            self.orig_loc,
2801            self.buf.as_ptr() as usize,
2802        ))
2803    }
2804    pub fn get_phys_port_name(&self) -> Result<&'a CStr, ErrorContext> {
2805        let mut iter = self.clone();
2806        iter.pos = 0;
2807        for attr in iter {
2808            if let Ok(LinkAttrs::PhysPortName(val)) = attr {
2809                return Ok(val);
2810            }
2811        }
2812        Err(ErrorContext::new_missing(
2813            "LinkAttrs",
2814            "PhysPortName",
2815            self.orig_loc,
2816            self.buf.as_ptr() as usize,
2817        ))
2818    }
2819    pub fn get_proto_down(&self) -> Result<u8, ErrorContext> {
2820        let mut iter = self.clone();
2821        iter.pos = 0;
2822        for attr in iter {
2823            if let Ok(LinkAttrs::ProtoDown(val)) = attr {
2824                return Ok(val);
2825            }
2826        }
2827        Err(ErrorContext::new_missing(
2828            "LinkAttrs",
2829            "ProtoDown",
2830            self.orig_loc,
2831            self.buf.as_ptr() as usize,
2832        ))
2833    }
2834    pub fn get_gso_max_segs(&self) -> Result<u32, ErrorContext> {
2835        let mut iter = self.clone();
2836        iter.pos = 0;
2837        for attr in iter {
2838            if let Ok(LinkAttrs::GsoMaxSegs(val)) = attr {
2839                return Ok(val);
2840            }
2841        }
2842        Err(ErrorContext::new_missing(
2843            "LinkAttrs",
2844            "GsoMaxSegs",
2845            self.orig_loc,
2846            self.buf.as_ptr() as usize,
2847        ))
2848    }
2849    pub fn get_gso_max_size(&self) -> Result<u32, ErrorContext> {
2850        let mut iter = self.clone();
2851        iter.pos = 0;
2852        for attr in iter {
2853            if let Ok(LinkAttrs::GsoMaxSize(val)) = attr {
2854                return Ok(val);
2855            }
2856        }
2857        Err(ErrorContext::new_missing(
2858            "LinkAttrs",
2859            "GsoMaxSize",
2860            self.orig_loc,
2861            self.buf.as_ptr() as usize,
2862        ))
2863    }
2864    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
2865        let mut iter = self.clone();
2866        iter.pos = 0;
2867        for attr in iter {
2868            if let Ok(LinkAttrs::Pad(val)) = attr {
2869                return Ok(val);
2870            }
2871        }
2872        Err(ErrorContext::new_missing(
2873            "LinkAttrs",
2874            "Pad",
2875            self.orig_loc,
2876            self.buf.as_ptr() as usize,
2877        ))
2878    }
2879    pub fn get_xdp(&self) -> Result<IterableXdpAttrs<'a>, ErrorContext> {
2880        let mut iter = self.clone();
2881        iter.pos = 0;
2882        for attr in iter {
2883            if let Ok(LinkAttrs::Xdp(val)) = attr {
2884                return Ok(val);
2885            }
2886        }
2887        Err(ErrorContext::new_missing(
2888            "LinkAttrs",
2889            "Xdp",
2890            self.orig_loc,
2891            self.buf.as_ptr() as usize,
2892        ))
2893    }
2894    pub fn get_event(&self) -> Result<u32, ErrorContext> {
2895        let mut iter = self.clone();
2896        iter.pos = 0;
2897        for attr in iter {
2898            if let Ok(LinkAttrs::Event(val)) = attr {
2899                return Ok(val);
2900            }
2901        }
2902        Err(ErrorContext::new_missing(
2903            "LinkAttrs",
2904            "Event",
2905            self.orig_loc,
2906            self.buf.as_ptr() as usize,
2907        ))
2908    }
2909    pub fn get_new_netnsid(&self) -> Result<i32, ErrorContext> {
2910        let mut iter = self.clone();
2911        iter.pos = 0;
2912        for attr in iter {
2913            if let Ok(LinkAttrs::NewNetnsid(val)) = attr {
2914                return Ok(val);
2915            }
2916        }
2917        Err(ErrorContext::new_missing(
2918            "LinkAttrs",
2919            "NewNetnsid",
2920            self.orig_loc,
2921            self.buf.as_ptr() as usize,
2922        ))
2923    }
2924    pub fn get_target_netnsid(&self) -> Result<i32, ErrorContext> {
2925        let mut iter = self.clone();
2926        iter.pos = 0;
2927        for attr in iter {
2928            if let Ok(LinkAttrs::TargetNetnsid(val)) = attr {
2929                return Ok(val);
2930            }
2931        }
2932        Err(ErrorContext::new_missing(
2933            "LinkAttrs",
2934            "TargetNetnsid",
2935            self.orig_loc,
2936            self.buf.as_ptr() as usize,
2937        ))
2938    }
2939    pub fn get_carrier_up_count(&self) -> Result<u32, ErrorContext> {
2940        let mut iter = self.clone();
2941        iter.pos = 0;
2942        for attr in iter {
2943            if let Ok(LinkAttrs::CarrierUpCount(val)) = attr {
2944                return Ok(val);
2945            }
2946        }
2947        Err(ErrorContext::new_missing(
2948            "LinkAttrs",
2949            "CarrierUpCount",
2950            self.orig_loc,
2951            self.buf.as_ptr() as usize,
2952        ))
2953    }
2954    pub fn get_carrier_down_count(&self) -> Result<u32, ErrorContext> {
2955        let mut iter = self.clone();
2956        iter.pos = 0;
2957        for attr in iter {
2958            if let Ok(LinkAttrs::CarrierDownCount(val)) = attr {
2959                return Ok(val);
2960            }
2961        }
2962        Err(ErrorContext::new_missing(
2963            "LinkAttrs",
2964            "CarrierDownCount",
2965            self.orig_loc,
2966            self.buf.as_ptr() as usize,
2967        ))
2968    }
2969    pub fn get_new_ifindex(&self) -> Result<i32, ErrorContext> {
2970        let mut iter = self.clone();
2971        iter.pos = 0;
2972        for attr in iter {
2973            if let Ok(LinkAttrs::NewIfindex(val)) = attr {
2974                return Ok(val);
2975            }
2976        }
2977        Err(ErrorContext::new_missing(
2978            "LinkAttrs",
2979            "NewIfindex",
2980            self.orig_loc,
2981            self.buf.as_ptr() as usize,
2982        ))
2983    }
2984    pub fn get_min_mtu(&self) -> Result<u32, ErrorContext> {
2985        let mut iter = self.clone();
2986        iter.pos = 0;
2987        for attr in iter {
2988            if let Ok(LinkAttrs::MinMtu(val)) = attr {
2989                return Ok(val);
2990            }
2991        }
2992        Err(ErrorContext::new_missing(
2993            "LinkAttrs",
2994            "MinMtu",
2995            self.orig_loc,
2996            self.buf.as_ptr() as usize,
2997        ))
2998    }
2999    pub fn get_max_mtu(&self) -> Result<u32, ErrorContext> {
3000        let mut iter = self.clone();
3001        iter.pos = 0;
3002        for attr in iter {
3003            if let Ok(LinkAttrs::MaxMtu(val)) = attr {
3004                return Ok(val);
3005            }
3006        }
3007        Err(ErrorContext::new_missing(
3008            "LinkAttrs",
3009            "MaxMtu",
3010            self.orig_loc,
3011            self.buf.as_ptr() as usize,
3012        ))
3013    }
3014    pub fn get_prop_list(&self) -> Result<IterablePropListLinkAttrs<'a>, ErrorContext> {
3015        let mut iter = self.clone();
3016        iter.pos = 0;
3017        for attr in iter {
3018            if let Ok(LinkAttrs::PropList(val)) = attr {
3019                return Ok(val);
3020            }
3021        }
3022        Err(ErrorContext::new_missing(
3023            "LinkAttrs",
3024            "PropList",
3025            self.orig_loc,
3026            self.buf.as_ptr() as usize,
3027        ))
3028    }
3029    pub fn get_alt_ifname(&self) -> Result<&'a CStr, ErrorContext> {
3030        let mut iter = self.clone();
3031        iter.pos = 0;
3032        for attr in iter {
3033            if let Ok(LinkAttrs::AltIfname(val)) = attr {
3034                return Ok(val);
3035            }
3036        }
3037        Err(ErrorContext::new_missing(
3038            "LinkAttrs",
3039            "AltIfname",
3040            self.orig_loc,
3041            self.buf.as_ptr() as usize,
3042        ))
3043    }
3044    pub fn get_perm_address(&self) -> Result<&'a [u8], ErrorContext> {
3045        let mut iter = self.clone();
3046        iter.pos = 0;
3047        for attr in iter {
3048            if let Ok(LinkAttrs::PermAddress(val)) = attr {
3049                return Ok(val);
3050            }
3051        }
3052        Err(ErrorContext::new_missing(
3053            "LinkAttrs",
3054            "PermAddress",
3055            self.orig_loc,
3056            self.buf.as_ptr() as usize,
3057        ))
3058    }
3059    pub fn get_proto_down_reason(&self) -> Result<&'a CStr, ErrorContext> {
3060        let mut iter = self.clone();
3061        iter.pos = 0;
3062        for attr in iter {
3063            if let Ok(LinkAttrs::ProtoDownReason(val)) = attr {
3064                return Ok(val);
3065            }
3066        }
3067        Err(ErrorContext::new_missing(
3068            "LinkAttrs",
3069            "ProtoDownReason",
3070            self.orig_loc,
3071            self.buf.as_ptr() as usize,
3072        ))
3073    }
3074    pub fn get_parent_dev_name(&self) -> Result<&'a CStr, ErrorContext> {
3075        let mut iter = self.clone();
3076        iter.pos = 0;
3077        for attr in iter {
3078            if let Ok(LinkAttrs::ParentDevName(val)) = attr {
3079                return Ok(val);
3080            }
3081        }
3082        Err(ErrorContext::new_missing(
3083            "LinkAttrs",
3084            "ParentDevName",
3085            self.orig_loc,
3086            self.buf.as_ptr() as usize,
3087        ))
3088    }
3089    pub fn get_parent_dev_bus_name(&self) -> Result<&'a CStr, ErrorContext> {
3090        let mut iter = self.clone();
3091        iter.pos = 0;
3092        for attr in iter {
3093            if let Ok(LinkAttrs::ParentDevBusName(val)) = attr {
3094                return Ok(val);
3095            }
3096        }
3097        Err(ErrorContext::new_missing(
3098            "LinkAttrs",
3099            "ParentDevBusName",
3100            self.orig_loc,
3101            self.buf.as_ptr() as usize,
3102        ))
3103    }
3104    pub fn get_gro_max_size(&self) -> Result<u32, ErrorContext> {
3105        let mut iter = self.clone();
3106        iter.pos = 0;
3107        for attr in iter {
3108            if let Ok(LinkAttrs::GroMaxSize(val)) = attr {
3109                return Ok(val);
3110            }
3111        }
3112        Err(ErrorContext::new_missing(
3113            "LinkAttrs",
3114            "GroMaxSize",
3115            self.orig_loc,
3116            self.buf.as_ptr() as usize,
3117        ))
3118    }
3119    pub fn get_tso_max_size(&self) -> Result<u32, ErrorContext> {
3120        let mut iter = self.clone();
3121        iter.pos = 0;
3122        for attr in iter {
3123            if let Ok(LinkAttrs::TsoMaxSize(val)) = attr {
3124                return Ok(val);
3125            }
3126        }
3127        Err(ErrorContext::new_missing(
3128            "LinkAttrs",
3129            "TsoMaxSize",
3130            self.orig_loc,
3131            self.buf.as_ptr() as usize,
3132        ))
3133    }
3134    pub fn get_tso_max_segs(&self) -> Result<u32, ErrorContext> {
3135        let mut iter = self.clone();
3136        iter.pos = 0;
3137        for attr in iter {
3138            if let Ok(LinkAttrs::TsoMaxSegs(val)) = attr {
3139                return Ok(val);
3140            }
3141        }
3142        Err(ErrorContext::new_missing(
3143            "LinkAttrs",
3144            "TsoMaxSegs",
3145            self.orig_loc,
3146            self.buf.as_ptr() as usize,
3147        ))
3148    }
3149    pub fn get_allmulti(&self) -> Result<u32, ErrorContext> {
3150        let mut iter = self.clone();
3151        iter.pos = 0;
3152        for attr in iter {
3153            if let Ok(LinkAttrs::Allmulti(val)) = attr {
3154                return Ok(val);
3155            }
3156        }
3157        Err(ErrorContext::new_missing(
3158            "LinkAttrs",
3159            "Allmulti",
3160            self.orig_loc,
3161            self.buf.as_ptr() as usize,
3162        ))
3163    }
3164    pub fn get_devlink_port(&self) -> Result<&'a [u8], ErrorContext> {
3165        let mut iter = self.clone();
3166        iter.pos = 0;
3167        for attr in iter {
3168            if let Ok(LinkAttrs::DevlinkPort(val)) = attr {
3169                return Ok(val);
3170            }
3171        }
3172        Err(ErrorContext::new_missing(
3173            "LinkAttrs",
3174            "DevlinkPort",
3175            self.orig_loc,
3176            self.buf.as_ptr() as usize,
3177        ))
3178    }
3179    pub fn get_gso_ipv4_max_size(&self) -> Result<u32, ErrorContext> {
3180        let mut iter = self.clone();
3181        iter.pos = 0;
3182        for attr in iter {
3183            if let Ok(LinkAttrs::GsoIpv4MaxSize(val)) = attr {
3184                return Ok(val);
3185            }
3186        }
3187        Err(ErrorContext::new_missing(
3188            "LinkAttrs",
3189            "GsoIpv4MaxSize",
3190            self.orig_loc,
3191            self.buf.as_ptr() as usize,
3192        ))
3193    }
3194    pub fn get_gro_ipv4_max_size(&self) -> Result<u32, ErrorContext> {
3195        let mut iter = self.clone();
3196        iter.pos = 0;
3197        for attr in iter {
3198            if let Ok(LinkAttrs::GroIpv4MaxSize(val)) = attr {
3199                return Ok(val);
3200            }
3201        }
3202        Err(ErrorContext::new_missing(
3203            "LinkAttrs",
3204            "GroIpv4MaxSize",
3205            self.orig_loc,
3206            self.buf.as_ptr() as usize,
3207        ))
3208    }
3209    pub fn get_dpll_pin(&self) -> Result<IterableLinkDpllPinAttrs<'a>, ErrorContext> {
3210        let mut iter = self.clone();
3211        iter.pos = 0;
3212        for attr in iter {
3213            if let Ok(LinkAttrs::DpllPin(val)) = attr {
3214                return Ok(val);
3215            }
3216        }
3217        Err(ErrorContext::new_missing(
3218            "LinkAttrs",
3219            "DpllPin",
3220            self.orig_loc,
3221            self.buf.as_ptr() as usize,
3222        ))
3223    }
3224    #[doc = "EDT offload horizon supported by the device (in nsec).\n"]
3225    pub fn get_max_pacing_offload_horizon(&self) -> Result<u32, ErrorContext> {
3226        let mut iter = self.clone();
3227        iter.pos = 0;
3228        for attr in iter {
3229            if let Ok(LinkAttrs::MaxPacingOffloadHorizon(val)) = attr {
3230                return Ok(val);
3231            }
3232        }
3233        Err(ErrorContext::new_missing(
3234            "LinkAttrs",
3235            "MaxPacingOffloadHorizon",
3236            self.orig_loc,
3237            self.buf.as_ptr() as usize,
3238        ))
3239    }
3240    pub fn get_netns_immutable(&self) -> Result<u8, ErrorContext> {
3241        let mut iter = self.clone();
3242        iter.pos = 0;
3243        for attr in iter {
3244            if let Ok(LinkAttrs::NetnsImmutable(val)) = attr {
3245                return Ok(val);
3246            }
3247        }
3248        Err(ErrorContext::new_missing(
3249            "LinkAttrs",
3250            "NetnsImmutable",
3251            self.orig_loc,
3252            self.buf.as_ptr() as usize,
3253        ))
3254    }
3255    pub fn get_headroom(&self) -> Result<u16, ErrorContext> {
3256        let mut iter = self.clone();
3257        iter.pos = 0;
3258        for attr in iter {
3259            if let Ok(LinkAttrs::Headroom(val)) = attr {
3260                return Ok(val);
3261            }
3262        }
3263        Err(ErrorContext::new_missing(
3264            "LinkAttrs",
3265            "Headroom",
3266            self.orig_loc,
3267            self.buf.as_ptr() as usize,
3268        ))
3269    }
3270    pub fn get_tailroom(&self) -> Result<u16, ErrorContext> {
3271        let mut iter = self.clone();
3272        iter.pos = 0;
3273        for attr in iter {
3274            if let Ok(LinkAttrs::Tailroom(val)) = attr {
3275                return Ok(val);
3276            }
3277        }
3278        Err(ErrorContext::new_missing(
3279            "LinkAttrs",
3280            "Tailroom",
3281            self.orig_loc,
3282            self.buf.as_ptr() as usize,
3283        ))
3284    }
3285}
3286impl LinkAttrs<'_> {
3287    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkAttrs<'a> {
3288        IterableLinkAttrs::with_loc(buf, buf.as_ptr() as usize)
3289    }
3290    fn attr_from_type(r#type: u16) -> Option<&'static str> {
3291        let res = match r#type {
3292            1u16 => "Address",
3293            2u16 => "Broadcast",
3294            3u16 => "Ifname",
3295            4u16 => "Mtu",
3296            5u16 => "Link",
3297            6u16 => "Qdisc",
3298            7u16 => "Stats",
3299            8u16 => "Cost",
3300            9u16 => "Priority",
3301            10u16 => "Master",
3302            11u16 => "Wireless",
3303            12u16 => "Protinfo",
3304            13u16 => "Txqlen",
3305            14u16 => "Map",
3306            15u16 => "Weight",
3307            16u16 => "Operstate",
3308            17u16 => "Linkmode",
3309            18u16 => "Linkinfo",
3310            19u16 => "NetNsPid",
3311            20u16 => "Ifalias",
3312            21u16 => "NumVf",
3313            22u16 => "VfinfoList",
3314            23u16 => "Stats64",
3315            24u16 => "VfPorts",
3316            25u16 => "PortSelf",
3317            26u16 => "AfSpec",
3318            27u16 => "Group",
3319            28u16 => "NetNsFd",
3320            29u16 => "ExtMask",
3321            30u16 => "Promiscuity",
3322            31u16 => "NumTxQueues",
3323            32u16 => "NumRxQueues",
3324            33u16 => "Carrier",
3325            34u16 => "PhysPortId",
3326            35u16 => "CarrierChanges",
3327            36u16 => "PhysSwitchId",
3328            37u16 => "LinkNetnsid",
3329            38u16 => "PhysPortName",
3330            39u16 => "ProtoDown",
3331            40u16 => "GsoMaxSegs",
3332            41u16 => "GsoMaxSize",
3333            42u16 => "Pad",
3334            43u16 => "Xdp",
3335            44u16 => "Event",
3336            45u16 => "NewNetnsid",
3337            46u16 => "TargetNetnsid",
3338            47u16 => "CarrierUpCount",
3339            48u16 => "CarrierDownCount",
3340            49u16 => "NewIfindex",
3341            50u16 => "MinMtu",
3342            51u16 => "MaxMtu",
3343            52u16 => "PropList",
3344            53u16 => "AltIfname",
3345            54u16 => "PermAddress",
3346            55u16 => "ProtoDownReason",
3347            56u16 => "ParentDevName",
3348            57u16 => "ParentDevBusName",
3349            58u16 => "GroMaxSize",
3350            59u16 => "TsoMaxSize",
3351            60u16 => "TsoMaxSegs",
3352            61u16 => "Allmulti",
3353            62u16 => "DevlinkPort",
3354            63u16 => "GsoIpv4MaxSize",
3355            64u16 => "GroIpv4MaxSize",
3356            65u16 => "DpllPin",
3357            66u16 => "MaxPacingOffloadHorizon",
3358            67u16 => "NetnsImmutable",
3359            68u16 => "Headroom",
3360            69u16 => "Tailroom",
3361            _ => return None,
3362        };
3363        Some(res)
3364    }
3365}
3366#[derive(Clone, Copy, Default)]
3367pub struct IterableLinkAttrs<'a> {
3368    buf: &'a [u8],
3369    pos: usize,
3370    orig_loc: usize,
3371}
3372impl<'a> IterableLinkAttrs<'a> {
3373    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
3374        Self {
3375            buf,
3376            pos: 0,
3377            orig_loc,
3378        }
3379    }
3380    pub fn get_buf(&self) -> &'a [u8] {
3381        self.buf
3382    }
3383}
3384impl<'a> Iterator for IterableLinkAttrs<'a> {
3385    type Item = Result<LinkAttrs<'a>, ErrorContext>;
3386    fn next(&mut self) -> Option<Self::Item> {
3387        let mut pos;
3388        let mut r#type;
3389        loop {
3390            pos = self.pos;
3391            r#type = None;
3392            if self.buf.len() == self.pos {
3393                return None;
3394            }
3395            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
3396                self.pos = self.buf.len();
3397                break;
3398            };
3399            r#type = Some(header.r#type);
3400            let res = match header.r#type {
3401                1u16 => LinkAttrs::Address({
3402                    let res = Some(next);
3403                    let Some(val) = res else { break };
3404                    val
3405                }),
3406                2u16 => LinkAttrs::Broadcast({
3407                    let res = Some(next);
3408                    let Some(val) = res else { break };
3409                    val
3410                }),
3411                3u16 => LinkAttrs::Ifname({
3412                    let res = CStr::from_bytes_with_nul(next).ok();
3413                    let Some(val) = res else { break };
3414                    val
3415                }),
3416                4u16 => LinkAttrs::Mtu({
3417                    let res = parse_u32(next);
3418                    let Some(val) = res else { break };
3419                    val
3420                }),
3421                5u16 => LinkAttrs::Link({
3422                    let res = parse_u32(next);
3423                    let Some(val) = res else { break };
3424                    val
3425                }),
3426                6u16 => LinkAttrs::Qdisc({
3427                    let res = CStr::from_bytes_with_nul(next).ok();
3428                    let Some(val) = res else { break };
3429                    val
3430                }),
3431                7u16 => LinkAttrs::Stats({
3432                    let res = Some(RtnlLinkStats::new_from_zeroed(next));
3433                    let Some(val) = res else { break };
3434                    val
3435                }),
3436                10u16 => LinkAttrs::Master({
3437                    let res = parse_u32(next);
3438                    let Some(val) = res else { break };
3439                    val
3440                }),
3441                11u16 => LinkAttrs::Wireless({
3442                    let res = Some(next);
3443                    let Some(val) = res else { break };
3444                    val
3445                }),
3446                12u16 => LinkAttrs::Protinfo({
3447                    let res = Some(next);
3448                    let Some(val) = res else { break };
3449                    val
3450                }),
3451                13u16 => LinkAttrs::Txqlen({
3452                    let res = parse_u32(next);
3453                    let Some(val) = res else { break };
3454                    val
3455                }),
3456                14u16 => LinkAttrs::Map({
3457                    let res = Some(RtnlLinkIfmap::new_from_zeroed(next));
3458                    let Some(val) = res else { break };
3459                    val
3460                }),
3461                15u16 => LinkAttrs::Weight({
3462                    let res = parse_u32(next);
3463                    let Some(val) = res else { break };
3464                    val
3465                }),
3466                16u16 => LinkAttrs::Operstate({
3467                    let res = parse_u8(next);
3468                    let Some(val) = res else { break };
3469                    val
3470                }),
3471                17u16 => LinkAttrs::Linkmode({
3472                    let res = parse_u8(next);
3473                    let Some(val) = res else { break };
3474                    val
3475                }),
3476                18u16 => LinkAttrs::Linkinfo({
3477                    let res = Some(IterableLinkinfoAttrs::with_loc(next, self.orig_loc));
3478                    let Some(val) = res else { break };
3479                    val
3480                }),
3481                19u16 => LinkAttrs::NetNsPid({
3482                    let res = parse_u32(next);
3483                    let Some(val) = res else { break };
3484                    val
3485                }),
3486                20u16 => LinkAttrs::Ifalias({
3487                    let res = CStr::from_bytes_with_nul(next).ok();
3488                    let Some(val) = res else { break };
3489                    val
3490                }),
3491                21u16 => LinkAttrs::NumVf({
3492                    let res = parse_u32(next);
3493                    let Some(val) = res else { break };
3494                    val
3495                }),
3496                22u16 => LinkAttrs::VfinfoList({
3497                    let res = Some(IterableVfinfoListAttrs::with_loc(next, self.orig_loc));
3498                    let Some(val) = res else { break };
3499                    val
3500                }),
3501                23u16 => LinkAttrs::Stats64({
3502                    let res = Some(RtnlLinkStats64::new_from_zeroed(next));
3503                    let Some(val) = res else { break };
3504                    val
3505                }),
3506                24u16 => LinkAttrs::VfPorts({
3507                    let res = Some(IterableVfPortsAttrs::with_loc(next, self.orig_loc));
3508                    let Some(val) = res else { break };
3509                    val
3510                }),
3511                25u16 => LinkAttrs::PortSelf({
3512                    let res = Some(IterablePortSelfAttrs::with_loc(next, self.orig_loc));
3513                    let Some(val) = res else { break };
3514                    val
3515                }),
3516                26u16 => LinkAttrs::AfSpec({
3517                    let res = Some(IterableAfSpecAttrs::with_loc(next, self.orig_loc));
3518                    let Some(val) = res else { break };
3519                    val
3520                }),
3521                27u16 => LinkAttrs::Group({
3522                    let res = parse_u32(next);
3523                    let Some(val) = res else { break };
3524                    val
3525                }),
3526                28u16 => LinkAttrs::NetNsFd({
3527                    let res = parse_u32(next);
3528                    let Some(val) = res else { break };
3529                    val
3530                }),
3531                29u16 => LinkAttrs::ExtMask({
3532                    let res = parse_u32(next);
3533                    let Some(val) = res else { break };
3534                    val
3535                }),
3536                30u16 => LinkAttrs::Promiscuity({
3537                    let res = parse_u32(next);
3538                    let Some(val) = res else { break };
3539                    val
3540                }),
3541                31u16 => LinkAttrs::NumTxQueues({
3542                    let res = parse_u32(next);
3543                    let Some(val) = res else { break };
3544                    val
3545                }),
3546                32u16 => LinkAttrs::NumRxQueues({
3547                    let res = parse_u32(next);
3548                    let Some(val) = res else { break };
3549                    val
3550                }),
3551                33u16 => LinkAttrs::Carrier({
3552                    let res = parse_u8(next);
3553                    let Some(val) = res else { break };
3554                    val
3555                }),
3556                34u16 => LinkAttrs::PhysPortId({
3557                    let res = Some(next);
3558                    let Some(val) = res else { break };
3559                    val
3560                }),
3561                35u16 => LinkAttrs::CarrierChanges({
3562                    let res = parse_u32(next);
3563                    let Some(val) = res else { break };
3564                    val
3565                }),
3566                36u16 => LinkAttrs::PhysSwitchId({
3567                    let res = Some(next);
3568                    let Some(val) = res else { break };
3569                    val
3570                }),
3571                37u16 => LinkAttrs::LinkNetnsid({
3572                    let res = parse_i32(next);
3573                    let Some(val) = res else { break };
3574                    val
3575                }),
3576                38u16 => LinkAttrs::PhysPortName({
3577                    let res = CStr::from_bytes_with_nul(next).ok();
3578                    let Some(val) = res else { break };
3579                    val
3580                }),
3581                39u16 => LinkAttrs::ProtoDown({
3582                    let res = parse_u8(next);
3583                    let Some(val) = res else { break };
3584                    val
3585                }),
3586                40u16 => LinkAttrs::GsoMaxSegs({
3587                    let res = parse_u32(next);
3588                    let Some(val) = res else { break };
3589                    val
3590                }),
3591                41u16 => LinkAttrs::GsoMaxSize({
3592                    let res = parse_u32(next);
3593                    let Some(val) = res else { break };
3594                    val
3595                }),
3596                42u16 => LinkAttrs::Pad({
3597                    let res = Some(next);
3598                    let Some(val) = res else { break };
3599                    val
3600                }),
3601                43u16 => LinkAttrs::Xdp({
3602                    let res = Some(IterableXdpAttrs::with_loc(next, self.orig_loc));
3603                    let Some(val) = res else { break };
3604                    val
3605                }),
3606                44u16 => LinkAttrs::Event({
3607                    let res = parse_u32(next);
3608                    let Some(val) = res else { break };
3609                    val
3610                }),
3611                45u16 => LinkAttrs::NewNetnsid({
3612                    let res = parse_i32(next);
3613                    let Some(val) = res else { break };
3614                    val
3615                }),
3616                46u16 => LinkAttrs::TargetNetnsid({
3617                    let res = parse_i32(next);
3618                    let Some(val) = res else { break };
3619                    val
3620                }),
3621                47u16 => LinkAttrs::CarrierUpCount({
3622                    let res = parse_u32(next);
3623                    let Some(val) = res else { break };
3624                    val
3625                }),
3626                48u16 => LinkAttrs::CarrierDownCount({
3627                    let res = parse_u32(next);
3628                    let Some(val) = res else { break };
3629                    val
3630                }),
3631                49u16 => LinkAttrs::NewIfindex({
3632                    let res = parse_i32(next);
3633                    let Some(val) = res else { break };
3634                    val
3635                }),
3636                50u16 => LinkAttrs::MinMtu({
3637                    let res = parse_u32(next);
3638                    let Some(val) = res else { break };
3639                    val
3640                }),
3641                51u16 => LinkAttrs::MaxMtu({
3642                    let res = parse_u32(next);
3643                    let Some(val) = res else { break };
3644                    val
3645                }),
3646                52u16 => LinkAttrs::PropList({
3647                    let res = Some(IterablePropListLinkAttrs::with_loc(next, self.orig_loc));
3648                    let Some(val) = res else { break };
3649                    val
3650                }),
3651                53u16 => LinkAttrs::AltIfname({
3652                    let res = CStr::from_bytes_with_nul(next).ok();
3653                    let Some(val) = res else { break };
3654                    val
3655                }),
3656                54u16 => LinkAttrs::PermAddress({
3657                    let res = Some(next);
3658                    let Some(val) = res else { break };
3659                    val
3660                }),
3661                55u16 => LinkAttrs::ProtoDownReason({
3662                    let res = CStr::from_bytes_with_nul(next).ok();
3663                    let Some(val) = res else { break };
3664                    val
3665                }),
3666                56u16 => LinkAttrs::ParentDevName({
3667                    let res = CStr::from_bytes_with_nul(next).ok();
3668                    let Some(val) = res else { break };
3669                    val
3670                }),
3671                57u16 => LinkAttrs::ParentDevBusName({
3672                    let res = CStr::from_bytes_with_nul(next).ok();
3673                    let Some(val) = res else { break };
3674                    val
3675                }),
3676                58u16 => LinkAttrs::GroMaxSize({
3677                    let res = parse_u32(next);
3678                    let Some(val) = res else { break };
3679                    val
3680                }),
3681                59u16 => LinkAttrs::TsoMaxSize({
3682                    let res = parse_u32(next);
3683                    let Some(val) = res else { break };
3684                    val
3685                }),
3686                60u16 => LinkAttrs::TsoMaxSegs({
3687                    let res = parse_u32(next);
3688                    let Some(val) = res else { break };
3689                    val
3690                }),
3691                61u16 => LinkAttrs::Allmulti({
3692                    let res = parse_u32(next);
3693                    let Some(val) = res else { break };
3694                    val
3695                }),
3696                62u16 => LinkAttrs::DevlinkPort({
3697                    let res = Some(next);
3698                    let Some(val) = res else { break };
3699                    val
3700                }),
3701                63u16 => LinkAttrs::GsoIpv4MaxSize({
3702                    let res = parse_u32(next);
3703                    let Some(val) = res else { break };
3704                    val
3705                }),
3706                64u16 => LinkAttrs::GroIpv4MaxSize({
3707                    let res = parse_u32(next);
3708                    let Some(val) = res else { break };
3709                    val
3710                }),
3711                65u16 => LinkAttrs::DpllPin({
3712                    let res = Some(IterableLinkDpllPinAttrs::with_loc(next, self.orig_loc));
3713                    let Some(val) = res else { break };
3714                    val
3715                }),
3716                66u16 => LinkAttrs::MaxPacingOffloadHorizon({
3717                    let res = parse_u32(next);
3718                    let Some(val) = res else { break };
3719                    val
3720                }),
3721                67u16 => LinkAttrs::NetnsImmutable({
3722                    let res = parse_u8(next);
3723                    let Some(val) = res else { break };
3724                    val
3725                }),
3726                68u16 => LinkAttrs::Headroom({
3727                    let res = parse_u16(next);
3728                    let Some(val) = res else { break };
3729                    val
3730                }),
3731                69u16 => LinkAttrs::Tailroom({
3732                    let res = parse_u16(next);
3733                    let Some(val) = res else { break };
3734                    val
3735                }),
3736                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
3737                n => continue,
3738            };
3739            return Some(Ok(res));
3740        }
3741        Some(Err(ErrorContext::new(
3742            "LinkAttrs",
3743            r#type.and_then(|t| LinkAttrs::attr_from_type(t)),
3744            self.orig_loc,
3745            self.buf.as_ptr().wrapping_add(pos) as usize,
3746        )))
3747    }
3748}
3749impl<'a> std::fmt::Debug for IterableLinkAttrs<'_> {
3750    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3751        let mut fmt = f.debug_struct("LinkAttrs");
3752        for attr in self.clone() {
3753            let attr = match attr {
3754                Ok(a) => a,
3755                Err(err) => {
3756                    fmt.finish()?;
3757                    f.write_str("Err(")?;
3758                    err.fmt(f)?;
3759                    return f.write_str(")");
3760                }
3761            };
3762            match attr {
3763                LinkAttrs::Address(val) => fmt.field("Address", &FormatMac(val)),
3764                LinkAttrs::Broadcast(val) => fmt.field("Broadcast", &FormatMac(val)),
3765                LinkAttrs::Ifname(val) => fmt.field("Ifname", &val),
3766                LinkAttrs::Mtu(val) => fmt.field("Mtu", &val),
3767                LinkAttrs::Link(val) => fmt.field("Link", &val),
3768                LinkAttrs::Qdisc(val) => fmt.field("Qdisc", &val),
3769                LinkAttrs::Stats(val) => fmt.field("Stats", &val),
3770                LinkAttrs::Master(val) => fmt.field("Master", &val),
3771                LinkAttrs::Wireless(val) => fmt.field("Wireless", &val),
3772                LinkAttrs::Protinfo(val) => fmt.field("Protinfo", &val),
3773                LinkAttrs::Txqlen(val) => fmt.field("Txqlen", &val),
3774                LinkAttrs::Map(val) => fmt.field("Map", &val),
3775                LinkAttrs::Weight(val) => fmt.field("Weight", &val),
3776                LinkAttrs::Operstate(val) => fmt.field("Operstate", &val),
3777                LinkAttrs::Linkmode(val) => fmt.field("Linkmode", &val),
3778                LinkAttrs::Linkinfo(val) => fmt.field("Linkinfo", &val),
3779                LinkAttrs::NetNsPid(val) => fmt.field("NetNsPid", &val),
3780                LinkAttrs::Ifalias(val) => fmt.field("Ifalias", &val),
3781                LinkAttrs::NumVf(val) => fmt.field("NumVf", &val),
3782                LinkAttrs::VfinfoList(val) => fmt.field("VfinfoList", &val),
3783                LinkAttrs::Stats64(val) => fmt.field("Stats64", &val),
3784                LinkAttrs::VfPorts(val) => fmt.field("VfPorts", &val),
3785                LinkAttrs::PortSelf(val) => fmt.field("PortSelf", &val),
3786                LinkAttrs::AfSpec(val) => fmt.field("AfSpec", &val),
3787                LinkAttrs::Group(val) => fmt.field("Group", &val),
3788                LinkAttrs::NetNsFd(val) => fmt.field("NetNsFd", &val),
3789                LinkAttrs::ExtMask(val) => {
3790                    fmt.field("ExtMask", &FormatFlags(val.into(), RtextFilter::from_value))
3791                }
3792                LinkAttrs::Promiscuity(val) => fmt.field("Promiscuity", &val),
3793                LinkAttrs::NumTxQueues(val) => fmt.field("NumTxQueues", &val),
3794                LinkAttrs::NumRxQueues(val) => fmt.field("NumRxQueues", &val),
3795                LinkAttrs::Carrier(val) => fmt.field("Carrier", &val),
3796                LinkAttrs::PhysPortId(val) => fmt.field("PhysPortId", &val),
3797                LinkAttrs::CarrierChanges(val) => fmt.field("CarrierChanges", &val),
3798                LinkAttrs::PhysSwitchId(val) => fmt.field("PhysSwitchId", &val),
3799                LinkAttrs::LinkNetnsid(val) => fmt.field("LinkNetnsid", &val),
3800                LinkAttrs::PhysPortName(val) => fmt.field("PhysPortName", &val),
3801                LinkAttrs::ProtoDown(val) => fmt.field("ProtoDown", &val),
3802                LinkAttrs::GsoMaxSegs(val) => fmt.field("GsoMaxSegs", &val),
3803                LinkAttrs::GsoMaxSize(val) => fmt.field("GsoMaxSize", &val),
3804                LinkAttrs::Pad(val) => fmt.field("Pad", &val),
3805                LinkAttrs::Xdp(val) => fmt.field("Xdp", &val),
3806                LinkAttrs::Event(val) => fmt.field("Event", &val),
3807                LinkAttrs::NewNetnsid(val) => fmt.field("NewNetnsid", &val),
3808                LinkAttrs::TargetNetnsid(val) => fmt.field("TargetNetnsid", &val),
3809                LinkAttrs::CarrierUpCount(val) => fmt.field("CarrierUpCount", &val),
3810                LinkAttrs::CarrierDownCount(val) => fmt.field("CarrierDownCount", &val),
3811                LinkAttrs::NewIfindex(val) => fmt.field("NewIfindex", &val),
3812                LinkAttrs::MinMtu(val) => fmt.field("MinMtu", &val),
3813                LinkAttrs::MaxMtu(val) => fmt.field("MaxMtu", &val),
3814                LinkAttrs::PropList(val) => fmt.field("PropList", &val),
3815                LinkAttrs::AltIfname(val) => fmt.field("AltIfname", &val),
3816                LinkAttrs::PermAddress(val) => fmt.field("PermAddress", &FormatMac(val)),
3817                LinkAttrs::ProtoDownReason(val) => fmt.field("ProtoDownReason", &val),
3818                LinkAttrs::ParentDevName(val) => fmt.field("ParentDevName", &val),
3819                LinkAttrs::ParentDevBusName(val) => fmt.field("ParentDevBusName", &val),
3820                LinkAttrs::GroMaxSize(val) => fmt.field("GroMaxSize", &val),
3821                LinkAttrs::TsoMaxSize(val) => fmt.field("TsoMaxSize", &val),
3822                LinkAttrs::TsoMaxSegs(val) => fmt.field("TsoMaxSegs", &val),
3823                LinkAttrs::Allmulti(val) => fmt.field("Allmulti", &val),
3824                LinkAttrs::DevlinkPort(val) => fmt.field("DevlinkPort", &val),
3825                LinkAttrs::GsoIpv4MaxSize(val) => fmt.field("GsoIpv4MaxSize", &val),
3826                LinkAttrs::GroIpv4MaxSize(val) => fmt.field("GroIpv4MaxSize", &val),
3827                LinkAttrs::DpllPin(val) => fmt.field("DpllPin", &val),
3828                LinkAttrs::MaxPacingOffloadHorizon(val) => {
3829                    fmt.field("MaxPacingOffloadHorizon", &val)
3830                }
3831                LinkAttrs::NetnsImmutable(val) => fmt.field("NetnsImmutable", &val),
3832                LinkAttrs::Headroom(val) => fmt.field("Headroom", &val),
3833                LinkAttrs::Tailroom(val) => fmt.field("Tailroom", &val),
3834            };
3835        }
3836        fmt.finish()
3837    }
3838}
3839impl IterableLinkAttrs<'_> {
3840    pub fn lookup_attr(
3841        &self,
3842        offset: usize,
3843        missing_type: Option<u16>,
3844    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
3845        let mut stack = Vec::new();
3846        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
3847        if missing_type.is_some() && cur == offset {
3848            stack.push(("LinkAttrs", offset));
3849            return (
3850                stack,
3851                missing_type.and_then(|t| LinkAttrs::attr_from_type(t)),
3852            );
3853        }
3854        if cur > offset || cur + self.buf.len() < offset {
3855            return (stack, None);
3856        }
3857        let mut attrs = self.clone();
3858        let mut last_off = cur + attrs.pos;
3859        let mut missing = None;
3860        while let Some(attr) = attrs.next() {
3861            let Ok(attr) = attr else { break };
3862            match attr {
3863                LinkAttrs::Address(val) => {
3864                    if last_off == offset {
3865                        stack.push(("Address", last_off));
3866                        break;
3867                    }
3868                }
3869                LinkAttrs::Broadcast(val) => {
3870                    if last_off == offset {
3871                        stack.push(("Broadcast", last_off));
3872                        break;
3873                    }
3874                }
3875                LinkAttrs::Ifname(val) => {
3876                    if last_off == offset {
3877                        stack.push(("Ifname", last_off));
3878                        break;
3879                    }
3880                }
3881                LinkAttrs::Mtu(val) => {
3882                    if last_off == offset {
3883                        stack.push(("Mtu", last_off));
3884                        break;
3885                    }
3886                }
3887                LinkAttrs::Link(val) => {
3888                    if last_off == offset {
3889                        stack.push(("Link", last_off));
3890                        break;
3891                    }
3892                }
3893                LinkAttrs::Qdisc(val) => {
3894                    if last_off == offset {
3895                        stack.push(("Qdisc", last_off));
3896                        break;
3897                    }
3898                }
3899                LinkAttrs::Stats(val) => {
3900                    if last_off == offset {
3901                        stack.push(("Stats", last_off));
3902                        break;
3903                    }
3904                }
3905                LinkAttrs::Master(val) => {
3906                    if last_off == offset {
3907                        stack.push(("Master", last_off));
3908                        break;
3909                    }
3910                }
3911                LinkAttrs::Wireless(val) => {
3912                    if last_off == offset {
3913                        stack.push(("Wireless", last_off));
3914                        break;
3915                    }
3916                }
3917                LinkAttrs::Protinfo(val) => {
3918                    if last_off == offset {
3919                        stack.push(("Protinfo", last_off));
3920                        break;
3921                    }
3922                }
3923                LinkAttrs::Txqlen(val) => {
3924                    if last_off == offset {
3925                        stack.push(("Txqlen", last_off));
3926                        break;
3927                    }
3928                }
3929                LinkAttrs::Map(val) => {
3930                    if last_off == offset {
3931                        stack.push(("Map", last_off));
3932                        break;
3933                    }
3934                }
3935                LinkAttrs::Weight(val) => {
3936                    if last_off == offset {
3937                        stack.push(("Weight", last_off));
3938                        break;
3939                    }
3940                }
3941                LinkAttrs::Operstate(val) => {
3942                    if last_off == offset {
3943                        stack.push(("Operstate", last_off));
3944                        break;
3945                    }
3946                }
3947                LinkAttrs::Linkmode(val) => {
3948                    if last_off == offset {
3949                        stack.push(("Linkmode", last_off));
3950                        break;
3951                    }
3952                }
3953                LinkAttrs::Linkinfo(val) => {
3954                    (stack, missing) = val.lookup_attr(offset, missing_type);
3955                    if !stack.is_empty() {
3956                        break;
3957                    }
3958                }
3959                LinkAttrs::NetNsPid(val) => {
3960                    if last_off == offset {
3961                        stack.push(("NetNsPid", last_off));
3962                        break;
3963                    }
3964                }
3965                LinkAttrs::Ifalias(val) => {
3966                    if last_off == offset {
3967                        stack.push(("Ifalias", last_off));
3968                        break;
3969                    }
3970                }
3971                LinkAttrs::NumVf(val) => {
3972                    if last_off == offset {
3973                        stack.push(("NumVf", last_off));
3974                        break;
3975                    }
3976                }
3977                LinkAttrs::VfinfoList(val) => {
3978                    (stack, missing) = val.lookup_attr(offset, missing_type);
3979                    if !stack.is_empty() {
3980                        break;
3981                    }
3982                }
3983                LinkAttrs::Stats64(val) => {
3984                    if last_off == offset {
3985                        stack.push(("Stats64", last_off));
3986                        break;
3987                    }
3988                }
3989                LinkAttrs::VfPorts(val) => {
3990                    (stack, missing) = val.lookup_attr(offset, missing_type);
3991                    if !stack.is_empty() {
3992                        break;
3993                    }
3994                }
3995                LinkAttrs::PortSelf(val) => {
3996                    (stack, missing) = val.lookup_attr(offset, missing_type);
3997                    if !stack.is_empty() {
3998                        break;
3999                    }
4000                }
4001                LinkAttrs::AfSpec(val) => {
4002                    (stack, missing) = val.lookup_attr(offset, missing_type);
4003                    if !stack.is_empty() {
4004                        break;
4005                    }
4006                }
4007                LinkAttrs::Group(val) => {
4008                    if last_off == offset {
4009                        stack.push(("Group", last_off));
4010                        break;
4011                    }
4012                }
4013                LinkAttrs::NetNsFd(val) => {
4014                    if last_off == offset {
4015                        stack.push(("NetNsFd", last_off));
4016                        break;
4017                    }
4018                }
4019                LinkAttrs::ExtMask(val) => {
4020                    if last_off == offset {
4021                        stack.push(("ExtMask", last_off));
4022                        break;
4023                    }
4024                }
4025                LinkAttrs::Promiscuity(val) => {
4026                    if last_off == offset {
4027                        stack.push(("Promiscuity", last_off));
4028                        break;
4029                    }
4030                }
4031                LinkAttrs::NumTxQueues(val) => {
4032                    if last_off == offset {
4033                        stack.push(("NumTxQueues", last_off));
4034                        break;
4035                    }
4036                }
4037                LinkAttrs::NumRxQueues(val) => {
4038                    if last_off == offset {
4039                        stack.push(("NumRxQueues", last_off));
4040                        break;
4041                    }
4042                }
4043                LinkAttrs::Carrier(val) => {
4044                    if last_off == offset {
4045                        stack.push(("Carrier", last_off));
4046                        break;
4047                    }
4048                }
4049                LinkAttrs::PhysPortId(val) => {
4050                    if last_off == offset {
4051                        stack.push(("PhysPortId", last_off));
4052                        break;
4053                    }
4054                }
4055                LinkAttrs::CarrierChanges(val) => {
4056                    if last_off == offset {
4057                        stack.push(("CarrierChanges", last_off));
4058                        break;
4059                    }
4060                }
4061                LinkAttrs::PhysSwitchId(val) => {
4062                    if last_off == offset {
4063                        stack.push(("PhysSwitchId", last_off));
4064                        break;
4065                    }
4066                }
4067                LinkAttrs::LinkNetnsid(val) => {
4068                    if last_off == offset {
4069                        stack.push(("LinkNetnsid", last_off));
4070                        break;
4071                    }
4072                }
4073                LinkAttrs::PhysPortName(val) => {
4074                    if last_off == offset {
4075                        stack.push(("PhysPortName", last_off));
4076                        break;
4077                    }
4078                }
4079                LinkAttrs::ProtoDown(val) => {
4080                    if last_off == offset {
4081                        stack.push(("ProtoDown", last_off));
4082                        break;
4083                    }
4084                }
4085                LinkAttrs::GsoMaxSegs(val) => {
4086                    if last_off == offset {
4087                        stack.push(("GsoMaxSegs", last_off));
4088                        break;
4089                    }
4090                }
4091                LinkAttrs::GsoMaxSize(val) => {
4092                    if last_off == offset {
4093                        stack.push(("GsoMaxSize", last_off));
4094                        break;
4095                    }
4096                }
4097                LinkAttrs::Pad(val) => {
4098                    if last_off == offset {
4099                        stack.push(("Pad", last_off));
4100                        break;
4101                    }
4102                }
4103                LinkAttrs::Xdp(val) => {
4104                    (stack, missing) = val.lookup_attr(offset, missing_type);
4105                    if !stack.is_empty() {
4106                        break;
4107                    }
4108                }
4109                LinkAttrs::Event(val) => {
4110                    if last_off == offset {
4111                        stack.push(("Event", last_off));
4112                        break;
4113                    }
4114                }
4115                LinkAttrs::NewNetnsid(val) => {
4116                    if last_off == offset {
4117                        stack.push(("NewNetnsid", last_off));
4118                        break;
4119                    }
4120                }
4121                LinkAttrs::TargetNetnsid(val) => {
4122                    if last_off == offset {
4123                        stack.push(("TargetNetnsid", last_off));
4124                        break;
4125                    }
4126                }
4127                LinkAttrs::CarrierUpCount(val) => {
4128                    if last_off == offset {
4129                        stack.push(("CarrierUpCount", last_off));
4130                        break;
4131                    }
4132                }
4133                LinkAttrs::CarrierDownCount(val) => {
4134                    if last_off == offset {
4135                        stack.push(("CarrierDownCount", last_off));
4136                        break;
4137                    }
4138                }
4139                LinkAttrs::NewIfindex(val) => {
4140                    if last_off == offset {
4141                        stack.push(("NewIfindex", last_off));
4142                        break;
4143                    }
4144                }
4145                LinkAttrs::MinMtu(val) => {
4146                    if last_off == offset {
4147                        stack.push(("MinMtu", last_off));
4148                        break;
4149                    }
4150                }
4151                LinkAttrs::MaxMtu(val) => {
4152                    if last_off == offset {
4153                        stack.push(("MaxMtu", last_off));
4154                        break;
4155                    }
4156                }
4157                LinkAttrs::PropList(val) => {
4158                    (stack, missing) = val.lookup_attr(offset, missing_type);
4159                    if !stack.is_empty() {
4160                        break;
4161                    }
4162                }
4163                LinkAttrs::AltIfname(val) => {
4164                    if last_off == offset {
4165                        stack.push(("AltIfname", last_off));
4166                        break;
4167                    }
4168                }
4169                LinkAttrs::PermAddress(val) => {
4170                    if last_off == offset {
4171                        stack.push(("PermAddress", last_off));
4172                        break;
4173                    }
4174                }
4175                LinkAttrs::ProtoDownReason(val) => {
4176                    if last_off == offset {
4177                        stack.push(("ProtoDownReason", last_off));
4178                        break;
4179                    }
4180                }
4181                LinkAttrs::ParentDevName(val) => {
4182                    if last_off == offset {
4183                        stack.push(("ParentDevName", last_off));
4184                        break;
4185                    }
4186                }
4187                LinkAttrs::ParentDevBusName(val) => {
4188                    if last_off == offset {
4189                        stack.push(("ParentDevBusName", last_off));
4190                        break;
4191                    }
4192                }
4193                LinkAttrs::GroMaxSize(val) => {
4194                    if last_off == offset {
4195                        stack.push(("GroMaxSize", last_off));
4196                        break;
4197                    }
4198                }
4199                LinkAttrs::TsoMaxSize(val) => {
4200                    if last_off == offset {
4201                        stack.push(("TsoMaxSize", last_off));
4202                        break;
4203                    }
4204                }
4205                LinkAttrs::TsoMaxSegs(val) => {
4206                    if last_off == offset {
4207                        stack.push(("TsoMaxSegs", last_off));
4208                        break;
4209                    }
4210                }
4211                LinkAttrs::Allmulti(val) => {
4212                    if last_off == offset {
4213                        stack.push(("Allmulti", last_off));
4214                        break;
4215                    }
4216                }
4217                LinkAttrs::DevlinkPort(val) => {
4218                    if last_off == offset {
4219                        stack.push(("DevlinkPort", last_off));
4220                        break;
4221                    }
4222                }
4223                LinkAttrs::GsoIpv4MaxSize(val) => {
4224                    if last_off == offset {
4225                        stack.push(("GsoIpv4MaxSize", last_off));
4226                        break;
4227                    }
4228                }
4229                LinkAttrs::GroIpv4MaxSize(val) => {
4230                    if last_off == offset {
4231                        stack.push(("GroIpv4MaxSize", last_off));
4232                        break;
4233                    }
4234                }
4235                LinkAttrs::DpllPin(val) => {
4236                    (stack, missing) = val.lookup_attr(offset, missing_type);
4237                    if !stack.is_empty() {
4238                        break;
4239                    }
4240                }
4241                LinkAttrs::MaxPacingOffloadHorizon(val) => {
4242                    if last_off == offset {
4243                        stack.push(("MaxPacingOffloadHorizon", last_off));
4244                        break;
4245                    }
4246                }
4247                LinkAttrs::NetnsImmutable(val) => {
4248                    if last_off == offset {
4249                        stack.push(("NetnsImmutable", last_off));
4250                        break;
4251                    }
4252                }
4253                LinkAttrs::Headroom(val) => {
4254                    if last_off == offset {
4255                        stack.push(("Headroom", last_off));
4256                        break;
4257                    }
4258                }
4259                LinkAttrs::Tailroom(val) => {
4260                    if last_off == offset {
4261                        stack.push(("Tailroom", last_off));
4262                        break;
4263                    }
4264                }
4265                _ => {}
4266            };
4267            last_off = cur + attrs.pos;
4268        }
4269        if !stack.is_empty() {
4270            stack.push(("LinkAttrs", cur));
4271        }
4272        (stack, missing)
4273    }
4274}
4275#[derive(Clone)]
4276pub enum PropListLinkAttrs<'a> {
4277    #[doc = "Attribute may repeat multiple times (treat it as array)"]
4278    AltIfname(&'a CStr),
4279}
4280impl<'a> IterablePropListLinkAttrs<'a> {
4281    #[doc = "Attribute may repeat multiple times (treat it as array)"]
4282    pub fn get_alt_ifname(&self) -> MultiAttrIterable<Self, PropListLinkAttrs<'a>, &'a CStr> {
4283        MultiAttrIterable::new(self.clone(), |variant| {
4284            if let PropListLinkAttrs::AltIfname(val) = variant {
4285                Some(val)
4286            } else {
4287                None
4288            }
4289        })
4290    }
4291}
4292impl PropListLinkAttrs<'_> {
4293    pub fn new<'a>(buf: &'a [u8]) -> IterablePropListLinkAttrs<'a> {
4294        IterablePropListLinkAttrs::with_loc(buf, buf.as_ptr() as usize)
4295    }
4296    fn attr_from_type(r#type: u16) -> Option<&'static str> {
4297        LinkAttrs::attr_from_type(r#type)
4298    }
4299}
4300#[derive(Clone, Copy, Default)]
4301pub struct IterablePropListLinkAttrs<'a> {
4302    buf: &'a [u8],
4303    pos: usize,
4304    orig_loc: usize,
4305}
4306impl<'a> IterablePropListLinkAttrs<'a> {
4307    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4308        Self {
4309            buf,
4310            pos: 0,
4311            orig_loc,
4312        }
4313    }
4314    pub fn get_buf(&self) -> &'a [u8] {
4315        self.buf
4316    }
4317}
4318impl<'a> Iterator for IterablePropListLinkAttrs<'a> {
4319    type Item = Result<PropListLinkAttrs<'a>, ErrorContext>;
4320    fn next(&mut self) -> Option<Self::Item> {
4321        let mut pos;
4322        let mut r#type;
4323        loop {
4324            pos = self.pos;
4325            r#type = None;
4326            if self.buf.len() == self.pos {
4327                return None;
4328            }
4329            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4330                self.pos = self.buf.len();
4331                break;
4332            };
4333            r#type = Some(header.r#type);
4334            let res = match header.r#type {
4335                53u16 => PropListLinkAttrs::AltIfname({
4336                    let res = CStr::from_bytes_with_nul(next).ok();
4337                    let Some(val) = res else { break };
4338                    val
4339                }),
4340                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4341                n => continue,
4342            };
4343            return Some(Ok(res));
4344        }
4345        Some(Err(ErrorContext::new(
4346            "PropListLinkAttrs",
4347            r#type.and_then(|t| PropListLinkAttrs::attr_from_type(t)),
4348            self.orig_loc,
4349            self.buf.as_ptr().wrapping_add(pos) as usize,
4350        )))
4351    }
4352}
4353impl<'a> std::fmt::Debug for IterablePropListLinkAttrs<'_> {
4354    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4355        let mut fmt = f.debug_struct("PropListLinkAttrs");
4356        for attr in self.clone() {
4357            let attr = match attr {
4358                Ok(a) => a,
4359                Err(err) => {
4360                    fmt.finish()?;
4361                    f.write_str("Err(")?;
4362                    err.fmt(f)?;
4363                    return f.write_str(")");
4364                }
4365            };
4366            match attr {
4367                PropListLinkAttrs::AltIfname(val) => fmt.field("AltIfname", &val),
4368            };
4369        }
4370        fmt.finish()
4371    }
4372}
4373impl IterablePropListLinkAttrs<'_> {
4374    pub fn lookup_attr(
4375        &self,
4376        offset: usize,
4377        missing_type: Option<u16>,
4378    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4379        let mut stack = Vec::new();
4380        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4381        if missing_type.is_some() && cur == offset {
4382            stack.push(("PropListLinkAttrs", offset));
4383            return (
4384                stack,
4385                missing_type.and_then(|t| PropListLinkAttrs::attr_from_type(t)),
4386            );
4387        }
4388        if cur > offset || cur + self.buf.len() < offset {
4389            return (stack, None);
4390        }
4391        let mut attrs = self.clone();
4392        let mut last_off = cur + attrs.pos;
4393        while let Some(attr) = attrs.next() {
4394            let Ok(attr) = attr else { break };
4395            match attr {
4396                PropListLinkAttrs::AltIfname(val) => {
4397                    if last_off == offset {
4398                        stack.push(("AltIfname", last_off));
4399                        break;
4400                    }
4401                }
4402                _ => {}
4403            };
4404            last_off = cur + attrs.pos;
4405        }
4406        if !stack.is_empty() {
4407            stack.push(("PropListLinkAttrs", cur));
4408        }
4409        (stack, None)
4410    }
4411}
4412#[derive(Clone)]
4413pub enum AfSpecAttrs<'a> {
4414    Inet(IterableIflaAttrs<'a>),
4415    Inet6(IterableIfla6Attrs<'a>),
4416    Mctp(IterableMctpAttrs<'a>),
4417}
4418impl<'a> IterableAfSpecAttrs<'a> {
4419    pub fn get_inet(&self) -> Result<IterableIflaAttrs<'a>, ErrorContext> {
4420        let mut iter = self.clone();
4421        iter.pos = 0;
4422        for attr in iter {
4423            if let Ok(AfSpecAttrs::Inet(val)) = attr {
4424                return Ok(val);
4425            }
4426        }
4427        Err(ErrorContext::new_missing(
4428            "AfSpecAttrs",
4429            "Inet",
4430            self.orig_loc,
4431            self.buf.as_ptr() as usize,
4432        ))
4433    }
4434    pub fn get_inet6(&self) -> Result<IterableIfla6Attrs<'a>, ErrorContext> {
4435        let mut iter = self.clone();
4436        iter.pos = 0;
4437        for attr in iter {
4438            if let Ok(AfSpecAttrs::Inet6(val)) = attr {
4439                return Ok(val);
4440            }
4441        }
4442        Err(ErrorContext::new_missing(
4443            "AfSpecAttrs",
4444            "Inet6",
4445            self.orig_loc,
4446            self.buf.as_ptr() as usize,
4447        ))
4448    }
4449    pub fn get_mctp(&self) -> Result<IterableMctpAttrs<'a>, ErrorContext> {
4450        let mut iter = self.clone();
4451        iter.pos = 0;
4452        for attr in iter {
4453            if let Ok(AfSpecAttrs::Mctp(val)) = attr {
4454                return Ok(val);
4455            }
4456        }
4457        Err(ErrorContext::new_missing(
4458            "AfSpecAttrs",
4459            "Mctp",
4460            self.orig_loc,
4461            self.buf.as_ptr() as usize,
4462        ))
4463    }
4464}
4465impl AfSpecAttrs<'_> {
4466    pub fn new<'a>(buf: &'a [u8]) -> IterableAfSpecAttrs<'a> {
4467        IterableAfSpecAttrs::with_loc(buf, buf.as_ptr() as usize)
4468    }
4469    fn attr_from_type(r#type: u16) -> Option<&'static str> {
4470        let res = match r#type {
4471            2u16 => "Inet",
4472            10u16 => "Inet6",
4473            45u16 => "Mctp",
4474            _ => return None,
4475        };
4476        Some(res)
4477    }
4478}
4479#[derive(Clone, Copy, Default)]
4480pub struct IterableAfSpecAttrs<'a> {
4481    buf: &'a [u8],
4482    pos: usize,
4483    orig_loc: usize,
4484}
4485impl<'a> IterableAfSpecAttrs<'a> {
4486    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4487        Self {
4488            buf,
4489            pos: 0,
4490            orig_loc,
4491        }
4492    }
4493    pub fn get_buf(&self) -> &'a [u8] {
4494        self.buf
4495    }
4496}
4497impl<'a> Iterator for IterableAfSpecAttrs<'a> {
4498    type Item = Result<AfSpecAttrs<'a>, ErrorContext>;
4499    fn next(&mut self) -> Option<Self::Item> {
4500        let mut pos;
4501        let mut r#type;
4502        loop {
4503            pos = self.pos;
4504            r#type = None;
4505            if self.buf.len() == self.pos {
4506                return None;
4507            }
4508            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4509                self.pos = self.buf.len();
4510                break;
4511            };
4512            r#type = Some(header.r#type);
4513            let res = match header.r#type {
4514                2u16 => AfSpecAttrs::Inet({
4515                    let res = Some(IterableIflaAttrs::with_loc(next, self.orig_loc));
4516                    let Some(val) = res else { break };
4517                    val
4518                }),
4519                10u16 => AfSpecAttrs::Inet6({
4520                    let res = Some(IterableIfla6Attrs::with_loc(next, self.orig_loc));
4521                    let Some(val) = res else { break };
4522                    val
4523                }),
4524                45u16 => AfSpecAttrs::Mctp({
4525                    let res = Some(IterableMctpAttrs::with_loc(next, self.orig_loc));
4526                    let Some(val) = res else { break };
4527                    val
4528                }),
4529                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4530                n => continue,
4531            };
4532            return Some(Ok(res));
4533        }
4534        Some(Err(ErrorContext::new(
4535            "AfSpecAttrs",
4536            r#type.and_then(|t| AfSpecAttrs::attr_from_type(t)),
4537            self.orig_loc,
4538            self.buf.as_ptr().wrapping_add(pos) as usize,
4539        )))
4540    }
4541}
4542impl<'a> std::fmt::Debug for IterableAfSpecAttrs<'_> {
4543    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4544        let mut fmt = f.debug_struct("AfSpecAttrs");
4545        for attr in self.clone() {
4546            let attr = match attr {
4547                Ok(a) => a,
4548                Err(err) => {
4549                    fmt.finish()?;
4550                    f.write_str("Err(")?;
4551                    err.fmt(f)?;
4552                    return f.write_str(")");
4553                }
4554            };
4555            match attr {
4556                AfSpecAttrs::Inet(val) => fmt.field("Inet", &val),
4557                AfSpecAttrs::Inet6(val) => fmt.field("Inet6", &val),
4558                AfSpecAttrs::Mctp(val) => fmt.field("Mctp", &val),
4559            };
4560        }
4561        fmt.finish()
4562    }
4563}
4564impl IterableAfSpecAttrs<'_> {
4565    pub fn lookup_attr(
4566        &self,
4567        offset: usize,
4568        missing_type: Option<u16>,
4569    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4570        let mut stack = Vec::new();
4571        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4572        if missing_type.is_some() && cur == offset {
4573            stack.push(("AfSpecAttrs", offset));
4574            return (
4575                stack,
4576                missing_type.and_then(|t| AfSpecAttrs::attr_from_type(t)),
4577            );
4578        }
4579        if cur > offset || cur + self.buf.len() < offset {
4580            return (stack, None);
4581        }
4582        let mut attrs = self.clone();
4583        let mut last_off = cur + attrs.pos;
4584        let mut missing = None;
4585        while let Some(attr) = attrs.next() {
4586            let Ok(attr) = attr else { break };
4587            match attr {
4588                AfSpecAttrs::Inet(val) => {
4589                    (stack, missing) = val.lookup_attr(offset, missing_type);
4590                    if !stack.is_empty() {
4591                        break;
4592                    }
4593                }
4594                AfSpecAttrs::Inet6(val) => {
4595                    (stack, missing) = val.lookup_attr(offset, missing_type);
4596                    if !stack.is_empty() {
4597                        break;
4598                    }
4599                }
4600                AfSpecAttrs::Mctp(val) => {
4601                    (stack, missing) = val.lookup_attr(offset, missing_type);
4602                    if !stack.is_empty() {
4603                        break;
4604                    }
4605                }
4606                _ => {}
4607            };
4608            last_off = cur + attrs.pos;
4609        }
4610        if !stack.is_empty() {
4611            stack.push(("AfSpecAttrs", cur));
4612        }
4613        (stack, missing)
4614    }
4615}
4616#[derive(Clone)]
4617pub enum VfinfoListAttrs<'a> {
4618    #[doc = "Attribute may repeat multiple times (treat it as array)"]
4619    Info(IterableVfinfoAttrs<'a>),
4620}
4621impl<'a> IterableVfinfoListAttrs<'a> {
4622    #[doc = "Attribute may repeat multiple times (treat it as array)"]
4623    pub fn get_info(
4624        &self,
4625    ) -> MultiAttrIterable<Self, VfinfoListAttrs<'a>, IterableVfinfoAttrs<'a>> {
4626        MultiAttrIterable::new(self.clone(), |variant| {
4627            if let VfinfoListAttrs::Info(val) = variant {
4628                Some(val)
4629            } else {
4630                None
4631            }
4632        })
4633    }
4634}
4635impl VfinfoListAttrs<'_> {
4636    pub fn new<'a>(buf: &'a [u8]) -> IterableVfinfoListAttrs<'a> {
4637        IterableVfinfoListAttrs::with_loc(buf, buf.as_ptr() as usize)
4638    }
4639    fn attr_from_type(r#type: u16) -> Option<&'static str> {
4640        let res = match r#type {
4641            1u16 => "Info",
4642            _ => return None,
4643        };
4644        Some(res)
4645    }
4646}
4647#[derive(Clone, Copy, Default)]
4648pub struct IterableVfinfoListAttrs<'a> {
4649    buf: &'a [u8],
4650    pos: usize,
4651    orig_loc: usize,
4652}
4653impl<'a> IterableVfinfoListAttrs<'a> {
4654    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4655        Self {
4656            buf,
4657            pos: 0,
4658            orig_loc,
4659        }
4660    }
4661    pub fn get_buf(&self) -> &'a [u8] {
4662        self.buf
4663    }
4664}
4665impl<'a> Iterator for IterableVfinfoListAttrs<'a> {
4666    type Item = Result<VfinfoListAttrs<'a>, ErrorContext>;
4667    fn next(&mut self) -> Option<Self::Item> {
4668        let mut pos;
4669        let mut r#type;
4670        loop {
4671            pos = self.pos;
4672            r#type = None;
4673            if self.buf.len() == self.pos {
4674                return None;
4675            }
4676            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4677                self.pos = self.buf.len();
4678                break;
4679            };
4680            r#type = Some(header.r#type);
4681            let res = match header.r#type {
4682                1u16 => VfinfoListAttrs::Info({
4683                    let res = Some(IterableVfinfoAttrs::with_loc(next, self.orig_loc));
4684                    let Some(val) = res else { break };
4685                    val
4686                }),
4687                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4688                n => continue,
4689            };
4690            return Some(Ok(res));
4691        }
4692        Some(Err(ErrorContext::new(
4693            "VfinfoListAttrs",
4694            r#type.and_then(|t| VfinfoListAttrs::attr_from_type(t)),
4695            self.orig_loc,
4696            self.buf.as_ptr().wrapping_add(pos) as usize,
4697        )))
4698    }
4699}
4700impl<'a> std::fmt::Debug for IterableVfinfoListAttrs<'_> {
4701    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4702        let mut fmt = f.debug_struct("VfinfoListAttrs");
4703        for attr in self.clone() {
4704            let attr = match attr {
4705                Ok(a) => a,
4706                Err(err) => {
4707                    fmt.finish()?;
4708                    f.write_str("Err(")?;
4709                    err.fmt(f)?;
4710                    return f.write_str(")");
4711                }
4712            };
4713            match attr {
4714                VfinfoListAttrs::Info(val) => fmt.field("Info", &val),
4715            };
4716        }
4717        fmt.finish()
4718    }
4719}
4720impl IterableVfinfoListAttrs<'_> {
4721    pub fn lookup_attr(
4722        &self,
4723        offset: usize,
4724        missing_type: Option<u16>,
4725    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4726        let mut stack = Vec::new();
4727        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4728        if missing_type.is_some() && cur == offset {
4729            stack.push(("VfinfoListAttrs", offset));
4730            return (
4731                stack,
4732                missing_type.and_then(|t| VfinfoListAttrs::attr_from_type(t)),
4733            );
4734        }
4735        if cur > offset || cur + self.buf.len() < offset {
4736            return (stack, None);
4737        }
4738        let mut attrs = self.clone();
4739        let mut last_off = cur + attrs.pos;
4740        let mut missing = None;
4741        while let Some(attr) = attrs.next() {
4742            let Ok(attr) = attr else { break };
4743            match attr {
4744                VfinfoListAttrs::Info(val) => {
4745                    (stack, missing) = val.lookup_attr(offset, missing_type);
4746                    if !stack.is_empty() {
4747                        break;
4748                    }
4749                }
4750                _ => {}
4751            };
4752            last_off = cur + attrs.pos;
4753        }
4754        if !stack.is_empty() {
4755            stack.push(("VfinfoListAttrs", cur));
4756        }
4757        (stack, missing)
4758    }
4759}
4760#[derive(Clone)]
4761pub enum VfinfoAttrs<'a> {
4762    Mac(IflaVfMac),
4763    Vlan(IflaVfVlan),
4764    TxRate(IflaVfTxRate),
4765    Spoofchk(IflaVfSpoofchk),
4766    LinkState(IflaVfLinkState),
4767    Rate(IflaVfRate),
4768    RssQueryEn(IflaVfRssQueryEn),
4769    Stats(IterableVfStatsAttrs<'a>),
4770    Trust(IflaVfTrust),
4771    IbNodeGuid(IflaVfGuid),
4772    IbPortGuid(IflaVfGuid),
4773    VlanList(IterableVfVlanAttrs<'a>),
4774    Broadcast(&'a [u8]),
4775}
4776impl<'a> IterableVfinfoAttrs<'a> {
4777    pub fn get_mac(&self) -> Result<IflaVfMac, ErrorContext> {
4778        let mut iter = self.clone();
4779        iter.pos = 0;
4780        for attr in iter {
4781            if let Ok(VfinfoAttrs::Mac(val)) = attr {
4782                return Ok(val);
4783            }
4784        }
4785        Err(ErrorContext::new_missing(
4786            "VfinfoAttrs",
4787            "Mac",
4788            self.orig_loc,
4789            self.buf.as_ptr() as usize,
4790        ))
4791    }
4792    pub fn get_vlan(&self) -> Result<IflaVfVlan, ErrorContext> {
4793        let mut iter = self.clone();
4794        iter.pos = 0;
4795        for attr in iter {
4796            if let Ok(VfinfoAttrs::Vlan(val)) = attr {
4797                return Ok(val);
4798            }
4799        }
4800        Err(ErrorContext::new_missing(
4801            "VfinfoAttrs",
4802            "Vlan",
4803            self.orig_loc,
4804            self.buf.as_ptr() as usize,
4805        ))
4806    }
4807    pub fn get_tx_rate(&self) -> Result<IflaVfTxRate, ErrorContext> {
4808        let mut iter = self.clone();
4809        iter.pos = 0;
4810        for attr in iter {
4811            if let Ok(VfinfoAttrs::TxRate(val)) = attr {
4812                return Ok(val);
4813            }
4814        }
4815        Err(ErrorContext::new_missing(
4816            "VfinfoAttrs",
4817            "TxRate",
4818            self.orig_loc,
4819            self.buf.as_ptr() as usize,
4820        ))
4821    }
4822    pub fn get_spoofchk(&self) -> Result<IflaVfSpoofchk, ErrorContext> {
4823        let mut iter = self.clone();
4824        iter.pos = 0;
4825        for attr in iter {
4826            if let Ok(VfinfoAttrs::Spoofchk(val)) = attr {
4827                return Ok(val);
4828            }
4829        }
4830        Err(ErrorContext::new_missing(
4831            "VfinfoAttrs",
4832            "Spoofchk",
4833            self.orig_loc,
4834            self.buf.as_ptr() as usize,
4835        ))
4836    }
4837    pub fn get_link_state(&self) -> Result<IflaVfLinkState, ErrorContext> {
4838        let mut iter = self.clone();
4839        iter.pos = 0;
4840        for attr in iter {
4841            if let Ok(VfinfoAttrs::LinkState(val)) = attr {
4842                return Ok(val);
4843            }
4844        }
4845        Err(ErrorContext::new_missing(
4846            "VfinfoAttrs",
4847            "LinkState",
4848            self.orig_loc,
4849            self.buf.as_ptr() as usize,
4850        ))
4851    }
4852    pub fn get_rate(&self) -> Result<IflaVfRate, ErrorContext> {
4853        let mut iter = self.clone();
4854        iter.pos = 0;
4855        for attr in iter {
4856            if let Ok(VfinfoAttrs::Rate(val)) = attr {
4857                return Ok(val);
4858            }
4859        }
4860        Err(ErrorContext::new_missing(
4861            "VfinfoAttrs",
4862            "Rate",
4863            self.orig_loc,
4864            self.buf.as_ptr() as usize,
4865        ))
4866    }
4867    pub fn get_rss_query_en(&self) -> Result<IflaVfRssQueryEn, ErrorContext> {
4868        let mut iter = self.clone();
4869        iter.pos = 0;
4870        for attr in iter {
4871            if let Ok(VfinfoAttrs::RssQueryEn(val)) = attr {
4872                return Ok(val);
4873            }
4874        }
4875        Err(ErrorContext::new_missing(
4876            "VfinfoAttrs",
4877            "RssQueryEn",
4878            self.orig_loc,
4879            self.buf.as_ptr() as usize,
4880        ))
4881    }
4882    pub fn get_stats(&self) -> Result<IterableVfStatsAttrs<'a>, ErrorContext> {
4883        let mut iter = self.clone();
4884        iter.pos = 0;
4885        for attr in iter {
4886            if let Ok(VfinfoAttrs::Stats(val)) = attr {
4887                return Ok(val);
4888            }
4889        }
4890        Err(ErrorContext::new_missing(
4891            "VfinfoAttrs",
4892            "Stats",
4893            self.orig_loc,
4894            self.buf.as_ptr() as usize,
4895        ))
4896    }
4897    pub fn get_trust(&self) -> Result<IflaVfTrust, ErrorContext> {
4898        let mut iter = self.clone();
4899        iter.pos = 0;
4900        for attr in iter {
4901            if let Ok(VfinfoAttrs::Trust(val)) = attr {
4902                return Ok(val);
4903            }
4904        }
4905        Err(ErrorContext::new_missing(
4906            "VfinfoAttrs",
4907            "Trust",
4908            self.orig_loc,
4909            self.buf.as_ptr() as usize,
4910        ))
4911    }
4912    pub fn get_ib_node_guid(&self) -> Result<IflaVfGuid, ErrorContext> {
4913        let mut iter = self.clone();
4914        iter.pos = 0;
4915        for attr in iter {
4916            if let Ok(VfinfoAttrs::IbNodeGuid(val)) = attr {
4917                return Ok(val);
4918            }
4919        }
4920        Err(ErrorContext::new_missing(
4921            "VfinfoAttrs",
4922            "IbNodeGuid",
4923            self.orig_loc,
4924            self.buf.as_ptr() as usize,
4925        ))
4926    }
4927    pub fn get_ib_port_guid(&self) -> Result<IflaVfGuid, ErrorContext> {
4928        let mut iter = self.clone();
4929        iter.pos = 0;
4930        for attr in iter {
4931            if let Ok(VfinfoAttrs::IbPortGuid(val)) = attr {
4932                return Ok(val);
4933            }
4934        }
4935        Err(ErrorContext::new_missing(
4936            "VfinfoAttrs",
4937            "IbPortGuid",
4938            self.orig_loc,
4939            self.buf.as_ptr() as usize,
4940        ))
4941    }
4942    pub fn get_vlan_list(&self) -> Result<IterableVfVlanAttrs<'a>, ErrorContext> {
4943        let mut iter = self.clone();
4944        iter.pos = 0;
4945        for attr in iter {
4946            if let Ok(VfinfoAttrs::VlanList(val)) = attr {
4947                return Ok(val);
4948            }
4949        }
4950        Err(ErrorContext::new_missing(
4951            "VfinfoAttrs",
4952            "VlanList",
4953            self.orig_loc,
4954            self.buf.as_ptr() as usize,
4955        ))
4956    }
4957    pub fn get_broadcast(&self) -> Result<&'a [u8], ErrorContext> {
4958        let mut iter = self.clone();
4959        iter.pos = 0;
4960        for attr in iter {
4961            if let Ok(VfinfoAttrs::Broadcast(val)) = attr {
4962                return Ok(val);
4963            }
4964        }
4965        Err(ErrorContext::new_missing(
4966            "VfinfoAttrs",
4967            "Broadcast",
4968            self.orig_loc,
4969            self.buf.as_ptr() as usize,
4970        ))
4971    }
4972}
4973impl VfinfoAttrs<'_> {
4974    pub fn new<'a>(buf: &'a [u8]) -> IterableVfinfoAttrs<'a> {
4975        IterableVfinfoAttrs::with_loc(buf, buf.as_ptr() as usize)
4976    }
4977    fn attr_from_type(r#type: u16) -> Option<&'static str> {
4978        let res = match r#type {
4979            1u16 => "Mac",
4980            2u16 => "Vlan",
4981            3u16 => "TxRate",
4982            4u16 => "Spoofchk",
4983            5u16 => "LinkState",
4984            6u16 => "Rate",
4985            7u16 => "RssQueryEn",
4986            8u16 => "Stats",
4987            9u16 => "Trust",
4988            10u16 => "IbNodeGuid",
4989            11u16 => "IbPortGuid",
4990            12u16 => "VlanList",
4991            13u16 => "Broadcast",
4992            _ => return None,
4993        };
4994        Some(res)
4995    }
4996}
4997#[derive(Clone, Copy, Default)]
4998pub struct IterableVfinfoAttrs<'a> {
4999    buf: &'a [u8],
5000    pos: usize,
5001    orig_loc: usize,
5002}
5003impl<'a> IterableVfinfoAttrs<'a> {
5004    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5005        Self {
5006            buf,
5007            pos: 0,
5008            orig_loc,
5009        }
5010    }
5011    pub fn get_buf(&self) -> &'a [u8] {
5012        self.buf
5013    }
5014}
5015impl<'a> Iterator for IterableVfinfoAttrs<'a> {
5016    type Item = Result<VfinfoAttrs<'a>, ErrorContext>;
5017    fn next(&mut self) -> Option<Self::Item> {
5018        let mut pos;
5019        let mut r#type;
5020        loop {
5021            pos = self.pos;
5022            r#type = None;
5023            if self.buf.len() == self.pos {
5024                return None;
5025            }
5026            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5027                self.pos = self.buf.len();
5028                break;
5029            };
5030            r#type = Some(header.r#type);
5031            let res = match header.r#type {
5032                1u16 => VfinfoAttrs::Mac({
5033                    let res = Some(IflaVfMac::new_from_zeroed(next));
5034                    let Some(val) = res else { break };
5035                    val
5036                }),
5037                2u16 => VfinfoAttrs::Vlan({
5038                    let res = Some(IflaVfVlan::new_from_zeroed(next));
5039                    let Some(val) = res else { break };
5040                    val
5041                }),
5042                3u16 => VfinfoAttrs::TxRate({
5043                    let res = Some(IflaVfTxRate::new_from_zeroed(next));
5044                    let Some(val) = res else { break };
5045                    val
5046                }),
5047                4u16 => VfinfoAttrs::Spoofchk({
5048                    let res = Some(IflaVfSpoofchk::new_from_zeroed(next));
5049                    let Some(val) = res else { break };
5050                    val
5051                }),
5052                5u16 => VfinfoAttrs::LinkState({
5053                    let res = Some(IflaVfLinkState::new_from_zeroed(next));
5054                    let Some(val) = res else { break };
5055                    val
5056                }),
5057                6u16 => VfinfoAttrs::Rate({
5058                    let res = Some(IflaVfRate::new_from_zeroed(next));
5059                    let Some(val) = res else { break };
5060                    val
5061                }),
5062                7u16 => VfinfoAttrs::RssQueryEn({
5063                    let res = Some(IflaVfRssQueryEn::new_from_zeroed(next));
5064                    let Some(val) = res else { break };
5065                    val
5066                }),
5067                8u16 => VfinfoAttrs::Stats({
5068                    let res = Some(IterableVfStatsAttrs::with_loc(next, self.orig_loc));
5069                    let Some(val) = res else { break };
5070                    val
5071                }),
5072                9u16 => VfinfoAttrs::Trust({
5073                    let res = Some(IflaVfTrust::new_from_zeroed(next));
5074                    let Some(val) = res else { break };
5075                    val
5076                }),
5077                10u16 => VfinfoAttrs::IbNodeGuid({
5078                    let res = Some(IflaVfGuid::new_from_zeroed(next));
5079                    let Some(val) = res else { break };
5080                    val
5081                }),
5082                11u16 => VfinfoAttrs::IbPortGuid({
5083                    let res = Some(IflaVfGuid::new_from_zeroed(next));
5084                    let Some(val) = res else { break };
5085                    val
5086                }),
5087                12u16 => VfinfoAttrs::VlanList({
5088                    let res = Some(IterableVfVlanAttrs::with_loc(next, self.orig_loc));
5089                    let Some(val) = res else { break };
5090                    val
5091                }),
5092                13u16 => VfinfoAttrs::Broadcast({
5093                    let res = Some(next);
5094                    let Some(val) = res else { break };
5095                    val
5096                }),
5097                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5098                n => continue,
5099            };
5100            return Some(Ok(res));
5101        }
5102        Some(Err(ErrorContext::new(
5103            "VfinfoAttrs",
5104            r#type.and_then(|t| VfinfoAttrs::attr_from_type(t)),
5105            self.orig_loc,
5106            self.buf.as_ptr().wrapping_add(pos) as usize,
5107        )))
5108    }
5109}
5110impl<'a> std::fmt::Debug for IterableVfinfoAttrs<'_> {
5111    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5112        let mut fmt = f.debug_struct("VfinfoAttrs");
5113        for attr in self.clone() {
5114            let attr = match attr {
5115                Ok(a) => a,
5116                Err(err) => {
5117                    fmt.finish()?;
5118                    f.write_str("Err(")?;
5119                    err.fmt(f)?;
5120                    return f.write_str(")");
5121                }
5122            };
5123            match attr {
5124                VfinfoAttrs::Mac(val) => fmt.field("Mac", &val),
5125                VfinfoAttrs::Vlan(val) => fmt.field("Vlan", &val),
5126                VfinfoAttrs::TxRate(val) => fmt.field("TxRate", &val),
5127                VfinfoAttrs::Spoofchk(val) => fmt.field("Spoofchk", &val),
5128                VfinfoAttrs::LinkState(val) => fmt.field("LinkState", &val),
5129                VfinfoAttrs::Rate(val) => fmt.field("Rate", &val),
5130                VfinfoAttrs::RssQueryEn(val) => fmt.field("RssQueryEn", &val),
5131                VfinfoAttrs::Stats(val) => fmt.field("Stats", &val),
5132                VfinfoAttrs::Trust(val) => fmt.field("Trust", &val),
5133                VfinfoAttrs::IbNodeGuid(val) => fmt.field("IbNodeGuid", &val),
5134                VfinfoAttrs::IbPortGuid(val) => fmt.field("IbPortGuid", &val),
5135                VfinfoAttrs::VlanList(val) => fmt.field("VlanList", &val),
5136                VfinfoAttrs::Broadcast(val) => fmt.field("Broadcast", &val),
5137            };
5138        }
5139        fmt.finish()
5140    }
5141}
5142impl IterableVfinfoAttrs<'_> {
5143    pub fn lookup_attr(
5144        &self,
5145        offset: usize,
5146        missing_type: Option<u16>,
5147    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5148        let mut stack = Vec::new();
5149        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5150        if missing_type.is_some() && cur == offset {
5151            stack.push(("VfinfoAttrs", offset));
5152            return (
5153                stack,
5154                missing_type.and_then(|t| VfinfoAttrs::attr_from_type(t)),
5155            );
5156        }
5157        if cur > offset || cur + self.buf.len() < offset {
5158            return (stack, None);
5159        }
5160        let mut attrs = self.clone();
5161        let mut last_off = cur + attrs.pos;
5162        let mut missing = None;
5163        while let Some(attr) = attrs.next() {
5164            let Ok(attr) = attr else { break };
5165            match attr {
5166                VfinfoAttrs::Mac(val) => {
5167                    if last_off == offset {
5168                        stack.push(("Mac", last_off));
5169                        break;
5170                    }
5171                }
5172                VfinfoAttrs::Vlan(val) => {
5173                    if last_off == offset {
5174                        stack.push(("Vlan", last_off));
5175                        break;
5176                    }
5177                }
5178                VfinfoAttrs::TxRate(val) => {
5179                    if last_off == offset {
5180                        stack.push(("TxRate", last_off));
5181                        break;
5182                    }
5183                }
5184                VfinfoAttrs::Spoofchk(val) => {
5185                    if last_off == offset {
5186                        stack.push(("Spoofchk", last_off));
5187                        break;
5188                    }
5189                }
5190                VfinfoAttrs::LinkState(val) => {
5191                    if last_off == offset {
5192                        stack.push(("LinkState", last_off));
5193                        break;
5194                    }
5195                }
5196                VfinfoAttrs::Rate(val) => {
5197                    if last_off == offset {
5198                        stack.push(("Rate", last_off));
5199                        break;
5200                    }
5201                }
5202                VfinfoAttrs::RssQueryEn(val) => {
5203                    if last_off == offset {
5204                        stack.push(("RssQueryEn", last_off));
5205                        break;
5206                    }
5207                }
5208                VfinfoAttrs::Stats(val) => {
5209                    (stack, missing) = val.lookup_attr(offset, missing_type);
5210                    if !stack.is_empty() {
5211                        break;
5212                    }
5213                }
5214                VfinfoAttrs::Trust(val) => {
5215                    if last_off == offset {
5216                        stack.push(("Trust", last_off));
5217                        break;
5218                    }
5219                }
5220                VfinfoAttrs::IbNodeGuid(val) => {
5221                    if last_off == offset {
5222                        stack.push(("IbNodeGuid", last_off));
5223                        break;
5224                    }
5225                }
5226                VfinfoAttrs::IbPortGuid(val) => {
5227                    if last_off == offset {
5228                        stack.push(("IbPortGuid", last_off));
5229                        break;
5230                    }
5231                }
5232                VfinfoAttrs::VlanList(val) => {
5233                    (stack, missing) = val.lookup_attr(offset, missing_type);
5234                    if !stack.is_empty() {
5235                        break;
5236                    }
5237                }
5238                VfinfoAttrs::Broadcast(val) => {
5239                    if last_off == offset {
5240                        stack.push(("Broadcast", last_off));
5241                        break;
5242                    }
5243                }
5244                _ => {}
5245            };
5246            last_off = cur + attrs.pos;
5247        }
5248        if !stack.is_empty() {
5249            stack.push(("VfinfoAttrs", cur));
5250        }
5251        (stack, missing)
5252    }
5253}
5254#[derive(Clone)]
5255pub enum VfStatsAttrs<'a> {
5256    RxPackets(u64),
5257    TxPackets(u64),
5258    RxBytes(u64),
5259    TxBytes(u64),
5260    Broadcast(u64),
5261    Multicast(u64),
5262    Pad(&'a [u8]),
5263    RxDropped(u64),
5264    TxDropped(u64),
5265}
5266impl<'a> IterableVfStatsAttrs<'a> {
5267    pub fn get_rx_packets(&self) -> Result<u64, ErrorContext> {
5268        let mut iter = self.clone();
5269        iter.pos = 0;
5270        for attr in iter {
5271            if let Ok(VfStatsAttrs::RxPackets(val)) = attr {
5272                return Ok(val);
5273            }
5274        }
5275        Err(ErrorContext::new_missing(
5276            "VfStatsAttrs",
5277            "RxPackets",
5278            self.orig_loc,
5279            self.buf.as_ptr() as usize,
5280        ))
5281    }
5282    pub fn get_tx_packets(&self) -> Result<u64, ErrorContext> {
5283        let mut iter = self.clone();
5284        iter.pos = 0;
5285        for attr in iter {
5286            if let Ok(VfStatsAttrs::TxPackets(val)) = attr {
5287                return Ok(val);
5288            }
5289        }
5290        Err(ErrorContext::new_missing(
5291            "VfStatsAttrs",
5292            "TxPackets",
5293            self.orig_loc,
5294            self.buf.as_ptr() as usize,
5295        ))
5296    }
5297    pub fn get_rx_bytes(&self) -> Result<u64, ErrorContext> {
5298        let mut iter = self.clone();
5299        iter.pos = 0;
5300        for attr in iter {
5301            if let Ok(VfStatsAttrs::RxBytes(val)) = attr {
5302                return Ok(val);
5303            }
5304        }
5305        Err(ErrorContext::new_missing(
5306            "VfStatsAttrs",
5307            "RxBytes",
5308            self.orig_loc,
5309            self.buf.as_ptr() as usize,
5310        ))
5311    }
5312    pub fn get_tx_bytes(&self) -> Result<u64, ErrorContext> {
5313        let mut iter = self.clone();
5314        iter.pos = 0;
5315        for attr in iter {
5316            if let Ok(VfStatsAttrs::TxBytes(val)) = attr {
5317                return Ok(val);
5318            }
5319        }
5320        Err(ErrorContext::new_missing(
5321            "VfStatsAttrs",
5322            "TxBytes",
5323            self.orig_loc,
5324            self.buf.as_ptr() as usize,
5325        ))
5326    }
5327    pub fn get_broadcast(&self) -> Result<u64, ErrorContext> {
5328        let mut iter = self.clone();
5329        iter.pos = 0;
5330        for attr in iter {
5331            if let Ok(VfStatsAttrs::Broadcast(val)) = attr {
5332                return Ok(val);
5333            }
5334        }
5335        Err(ErrorContext::new_missing(
5336            "VfStatsAttrs",
5337            "Broadcast",
5338            self.orig_loc,
5339            self.buf.as_ptr() as usize,
5340        ))
5341    }
5342    pub fn get_multicast(&self) -> Result<u64, ErrorContext> {
5343        let mut iter = self.clone();
5344        iter.pos = 0;
5345        for attr in iter {
5346            if let Ok(VfStatsAttrs::Multicast(val)) = attr {
5347                return Ok(val);
5348            }
5349        }
5350        Err(ErrorContext::new_missing(
5351            "VfStatsAttrs",
5352            "Multicast",
5353            self.orig_loc,
5354            self.buf.as_ptr() as usize,
5355        ))
5356    }
5357    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
5358        let mut iter = self.clone();
5359        iter.pos = 0;
5360        for attr in iter {
5361            if let Ok(VfStatsAttrs::Pad(val)) = attr {
5362                return Ok(val);
5363            }
5364        }
5365        Err(ErrorContext::new_missing(
5366            "VfStatsAttrs",
5367            "Pad",
5368            self.orig_loc,
5369            self.buf.as_ptr() as usize,
5370        ))
5371    }
5372    pub fn get_rx_dropped(&self) -> Result<u64, ErrorContext> {
5373        let mut iter = self.clone();
5374        iter.pos = 0;
5375        for attr in iter {
5376            if let Ok(VfStatsAttrs::RxDropped(val)) = attr {
5377                return Ok(val);
5378            }
5379        }
5380        Err(ErrorContext::new_missing(
5381            "VfStatsAttrs",
5382            "RxDropped",
5383            self.orig_loc,
5384            self.buf.as_ptr() as usize,
5385        ))
5386    }
5387    pub fn get_tx_dropped(&self) -> Result<u64, ErrorContext> {
5388        let mut iter = self.clone();
5389        iter.pos = 0;
5390        for attr in iter {
5391            if let Ok(VfStatsAttrs::TxDropped(val)) = attr {
5392                return Ok(val);
5393            }
5394        }
5395        Err(ErrorContext::new_missing(
5396            "VfStatsAttrs",
5397            "TxDropped",
5398            self.orig_loc,
5399            self.buf.as_ptr() as usize,
5400        ))
5401    }
5402}
5403impl VfStatsAttrs<'_> {
5404    pub fn new<'a>(buf: &'a [u8]) -> IterableVfStatsAttrs<'a> {
5405        IterableVfStatsAttrs::with_loc(buf, buf.as_ptr() as usize)
5406    }
5407    fn attr_from_type(r#type: u16) -> Option<&'static str> {
5408        let res = match r#type {
5409            0u16 => "RxPackets",
5410            1u16 => "TxPackets",
5411            2u16 => "RxBytes",
5412            3u16 => "TxBytes",
5413            4u16 => "Broadcast",
5414            5u16 => "Multicast",
5415            6u16 => "Pad",
5416            7u16 => "RxDropped",
5417            8u16 => "TxDropped",
5418            _ => return None,
5419        };
5420        Some(res)
5421    }
5422}
5423#[derive(Clone, Copy, Default)]
5424pub struct IterableVfStatsAttrs<'a> {
5425    buf: &'a [u8],
5426    pos: usize,
5427    orig_loc: usize,
5428}
5429impl<'a> IterableVfStatsAttrs<'a> {
5430    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5431        Self {
5432            buf,
5433            pos: 0,
5434            orig_loc,
5435        }
5436    }
5437    pub fn get_buf(&self) -> &'a [u8] {
5438        self.buf
5439    }
5440}
5441impl<'a> Iterator for IterableVfStatsAttrs<'a> {
5442    type Item = Result<VfStatsAttrs<'a>, ErrorContext>;
5443    fn next(&mut self) -> Option<Self::Item> {
5444        let mut pos;
5445        let mut r#type;
5446        loop {
5447            pos = self.pos;
5448            r#type = None;
5449            if self.buf.len() == self.pos {
5450                return None;
5451            }
5452            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5453                self.pos = self.buf.len();
5454                break;
5455            };
5456            r#type = Some(header.r#type);
5457            let res = match header.r#type {
5458                0u16 => VfStatsAttrs::RxPackets({
5459                    let res = parse_u64(next);
5460                    let Some(val) = res else { break };
5461                    val
5462                }),
5463                1u16 => VfStatsAttrs::TxPackets({
5464                    let res = parse_u64(next);
5465                    let Some(val) = res else { break };
5466                    val
5467                }),
5468                2u16 => VfStatsAttrs::RxBytes({
5469                    let res = parse_u64(next);
5470                    let Some(val) = res else { break };
5471                    val
5472                }),
5473                3u16 => VfStatsAttrs::TxBytes({
5474                    let res = parse_u64(next);
5475                    let Some(val) = res else { break };
5476                    val
5477                }),
5478                4u16 => VfStatsAttrs::Broadcast({
5479                    let res = parse_u64(next);
5480                    let Some(val) = res else { break };
5481                    val
5482                }),
5483                5u16 => VfStatsAttrs::Multicast({
5484                    let res = parse_u64(next);
5485                    let Some(val) = res else { break };
5486                    val
5487                }),
5488                6u16 => VfStatsAttrs::Pad({
5489                    let res = Some(next);
5490                    let Some(val) = res else { break };
5491                    val
5492                }),
5493                7u16 => VfStatsAttrs::RxDropped({
5494                    let res = parse_u64(next);
5495                    let Some(val) = res else { break };
5496                    val
5497                }),
5498                8u16 => VfStatsAttrs::TxDropped({
5499                    let res = parse_u64(next);
5500                    let Some(val) = res else { break };
5501                    val
5502                }),
5503                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5504                n => continue,
5505            };
5506            return Some(Ok(res));
5507        }
5508        Some(Err(ErrorContext::new(
5509            "VfStatsAttrs",
5510            r#type.and_then(|t| VfStatsAttrs::attr_from_type(t)),
5511            self.orig_loc,
5512            self.buf.as_ptr().wrapping_add(pos) as usize,
5513        )))
5514    }
5515}
5516impl<'a> std::fmt::Debug for IterableVfStatsAttrs<'_> {
5517    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5518        let mut fmt = f.debug_struct("VfStatsAttrs");
5519        for attr in self.clone() {
5520            let attr = match attr {
5521                Ok(a) => a,
5522                Err(err) => {
5523                    fmt.finish()?;
5524                    f.write_str("Err(")?;
5525                    err.fmt(f)?;
5526                    return f.write_str(")");
5527                }
5528            };
5529            match attr {
5530                VfStatsAttrs::RxPackets(val) => fmt.field("RxPackets", &val),
5531                VfStatsAttrs::TxPackets(val) => fmt.field("TxPackets", &val),
5532                VfStatsAttrs::RxBytes(val) => fmt.field("RxBytes", &val),
5533                VfStatsAttrs::TxBytes(val) => fmt.field("TxBytes", &val),
5534                VfStatsAttrs::Broadcast(val) => fmt.field("Broadcast", &val),
5535                VfStatsAttrs::Multicast(val) => fmt.field("Multicast", &val),
5536                VfStatsAttrs::Pad(val) => fmt.field("Pad", &val),
5537                VfStatsAttrs::RxDropped(val) => fmt.field("RxDropped", &val),
5538                VfStatsAttrs::TxDropped(val) => fmt.field("TxDropped", &val),
5539            };
5540        }
5541        fmt.finish()
5542    }
5543}
5544impl IterableVfStatsAttrs<'_> {
5545    pub fn lookup_attr(
5546        &self,
5547        offset: usize,
5548        missing_type: Option<u16>,
5549    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5550        let mut stack = Vec::new();
5551        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5552        if missing_type.is_some() && cur == offset {
5553            stack.push(("VfStatsAttrs", offset));
5554            return (
5555                stack,
5556                missing_type.and_then(|t| VfStatsAttrs::attr_from_type(t)),
5557            );
5558        }
5559        if cur > offset || cur + self.buf.len() < offset {
5560            return (stack, None);
5561        }
5562        let mut attrs = self.clone();
5563        let mut last_off = cur + attrs.pos;
5564        while let Some(attr) = attrs.next() {
5565            let Ok(attr) = attr else { break };
5566            match attr {
5567                VfStatsAttrs::RxPackets(val) => {
5568                    if last_off == offset {
5569                        stack.push(("RxPackets", last_off));
5570                        break;
5571                    }
5572                }
5573                VfStatsAttrs::TxPackets(val) => {
5574                    if last_off == offset {
5575                        stack.push(("TxPackets", last_off));
5576                        break;
5577                    }
5578                }
5579                VfStatsAttrs::RxBytes(val) => {
5580                    if last_off == offset {
5581                        stack.push(("RxBytes", last_off));
5582                        break;
5583                    }
5584                }
5585                VfStatsAttrs::TxBytes(val) => {
5586                    if last_off == offset {
5587                        stack.push(("TxBytes", last_off));
5588                        break;
5589                    }
5590                }
5591                VfStatsAttrs::Broadcast(val) => {
5592                    if last_off == offset {
5593                        stack.push(("Broadcast", last_off));
5594                        break;
5595                    }
5596                }
5597                VfStatsAttrs::Multicast(val) => {
5598                    if last_off == offset {
5599                        stack.push(("Multicast", last_off));
5600                        break;
5601                    }
5602                }
5603                VfStatsAttrs::Pad(val) => {
5604                    if last_off == offset {
5605                        stack.push(("Pad", last_off));
5606                        break;
5607                    }
5608                }
5609                VfStatsAttrs::RxDropped(val) => {
5610                    if last_off == offset {
5611                        stack.push(("RxDropped", last_off));
5612                        break;
5613                    }
5614                }
5615                VfStatsAttrs::TxDropped(val) => {
5616                    if last_off == offset {
5617                        stack.push(("TxDropped", last_off));
5618                        break;
5619                    }
5620                }
5621                _ => {}
5622            };
5623            last_off = cur + attrs.pos;
5624        }
5625        if !stack.is_empty() {
5626            stack.push(("VfStatsAttrs", cur));
5627        }
5628        (stack, None)
5629    }
5630}
5631#[derive(Clone)]
5632pub enum VfVlanAttrs {
5633    #[doc = "Attribute may repeat multiple times (treat it as array)"]
5634    Info(IflaVfVlanInfo),
5635}
5636impl<'a> IterableVfVlanAttrs<'a> {
5637    #[doc = "Attribute may repeat multiple times (treat it as array)"]
5638    pub fn get_info(&self) -> MultiAttrIterable<Self, VfVlanAttrs, IflaVfVlanInfo> {
5639        MultiAttrIterable::new(self.clone(), |variant| {
5640            if let VfVlanAttrs::Info(val) = variant {
5641                Some(val)
5642            } else {
5643                None
5644            }
5645        })
5646    }
5647}
5648impl VfVlanAttrs {
5649    pub fn new<'a>(buf: &'a [u8]) -> IterableVfVlanAttrs<'a> {
5650        IterableVfVlanAttrs::with_loc(buf, buf.as_ptr() as usize)
5651    }
5652    fn attr_from_type(r#type: u16) -> Option<&'static str> {
5653        let res = match r#type {
5654            1u16 => "Info",
5655            _ => return None,
5656        };
5657        Some(res)
5658    }
5659}
5660#[derive(Clone, Copy, Default)]
5661pub struct IterableVfVlanAttrs<'a> {
5662    buf: &'a [u8],
5663    pos: usize,
5664    orig_loc: usize,
5665}
5666impl<'a> IterableVfVlanAttrs<'a> {
5667    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5668        Self {
5669            buf,
5670            pos: 0,
5671            orig_loc,
5672        }
5673    }
5674    pub fn get_buf(&self) -> &'a [u8] {
5675        self.buf
5676    }
5677}
5678impl<'a> Iterator for IterableVfVlanAttrs<'a> {
5679    type Item = Result<VfVlanAttrs, ErrorContext>;
5680    fn next(&mut self) -> Option<Self::Item> {
5681        let mut pos;
5682        let mut r#type;
5683        loop {
5684            pos = self.pos;
5685            r#type = None;
5686            if self.buf.len() == self.pos {
5687                return None;
5688            }
5689            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5690                self.pos = self.buf.len();
5691                break;
5692            };
5693            r#type = Some(header.r#type);
5694            let res = match header.r#type {
5695                1u16 => VfVlanAttrs::Info({
5696                    let res = Some(IflaVfVlanInfo::new_from_zeroed(next));
5697                    let Some(val) = res else { break };
5698                    val
5699                }),
5700                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5701                n => continue,
5702            };
5703            return Some(Ok(res));
5704        }
5705        Some(Err(ErrorContext::new(
5706            "VfVlanAttrs",
5707            r#type.and_then(|t| VfVlanAttrs::attr_from_type(t)),
5708            self.orig_loc,
5709            self.buf.as_ptr().wrapping_add(pos) as usize,
5710        )))
5711    }
5712}
5713impl std::fmt::Debug for IterableVfVlanAttrs<'_> {
5714    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5715        let mut fmt = f.debug_struct("VfVlanAttrs");
5716        for attr in self.clone() {
5717            let attr = match attr {
5718                Ok(a) => a,
5719                Err(err) => {
5720                    fmt.finish()?;
5721                    f.write_str("Err(")?;
5722                    err.fmt(f)?;
5723                    return f.write_str(")");
5724                }
5725            };
5726            match attr {
5727                VfVlanAttrs::Info(val) => fmt.field("Info", &val),
5728            };
5729        }
5730        fmt.finish()
5731    }
5732}
5733impl IterableVfVlanAttrs<'_> {
5734    pub fn lookup_attr(
5735        &self,
5736        offset: usize,
5737        missing_type: Option<u16>,
5738    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5739        let mut stack = Vec::new();
5740        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5741        if missing_type.is_some() && cur == offset {
5742            stack.push(("VfVlanAttrs", offset));
5743            return (
5744                stack,
5745                missing_type.and_then(|t| VfVlanAttrs::attr_from_type(t)),
5746            );
5747        }
5748        if cur > offset || cur + self.buf.len() < offset {
5749            return (stack, None);
5750        }
5751        let mut attrs = self.clone();
5752        let mut last_off = cur + attrs.pos;
5753        while let Some(attr) = attrs.next() {
5754            let Ok(attr) = attr else { break };
5755            match attr {
5756                VfVlanAttrs::Info(val) => {
5757                    if last_off == offset {
5758                        stack.push(("Info", last_off));
5759                        break;
5760                    }
5761                }
5762                _ => {}
5763            };
5764            last_off = cur + attrs.pos;
5765        }
5766        if !stack.is_empty() {
5767            stack.push(("VfVlanAttrs", cur));
5768        }
5769        (stack, None)
5770    }
5771}
5772#[derive(Clone)]
5773pub enum VfPortsAttrs {}
5774impl<'a> IterableVfPortsAttrs<'a> {}
5775impl VfPortsAttrs {
5776    pub fn new<'a>(buf: &'a [u8]) -> IterableVfPortsAttrs<'a> {
5777        IterableVfPortsAttrs::with_loc(buf, buf.as_ptr() as usize)
5778    }
5779    fn attr_from_type(r#type: u16) -> Option<&'static str> {
5780        None
5781    }
5782}
5783#[derive(Clone, Copy, Default)]
5784pub struct IterableVfPortsAttrs<'a> {
5785    buf: &'a [u8],
5786    pos: usize,
5787    orig_loc: usize,
5788}
5789impl<'a> IterableVfPortsAttrs<'a> {
5790    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5791        Self {
5792            buf,
5793            pos: 0,
5794            orig_loc,
5795        }
5796    }
5797    pub fn get_buf(&self) -> &'a [u8] {
5798        self.buf
5799    }
5800}
5801impl<'a> Iterator for IterableVfPortsAttrs<'a> {
5802    type Item = Result<VfPortsAttrs, ErrorContext>;
5803    fn next(&mut self) -> Option<Self::Item> {
5804        let mut pos;
5805        let mut r#type;
5806        loop {
5807            pos = self.pos;
5808            r#type = None;
5809            if self.buf.len() == self.pos {
5810                return None;
5811            }
5812            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5813                self.pos = self.buf.len();
5814                break;
5815            };
5816            r#type = Some(header.r#type);
5817            let res = match header.r#type {
5818                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5819                n => continue,
5820            };
5821            return Some(Ok(res));
5822        }
5823        Some(Err(ErrorContext::new(
5824            "VfPortsAttrs",
5825            r#type.and_then(|t| VfPortsAttrs::attr_from_type(t)),
5826            self.orig_loc,
5827            self.buf.as_ptr().wrapping_add(pos) as usize,
5828        )))
5829    }
5830}
5831impl std::fmt::Debug for IterableVfPortsAttrs<'_> {
5832    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5833        let mut fmt = f.debug_struct("VfPortsAttrs");
5834        for attr in self.clone() {
5835            let attr = match attr {
5836                Ok(a) => a,
5837                Err(err) => {
5838                    fmt.finish()?;
5839                    f.write_str("Err(")?;
5840                    err.fmt(f)?;
5841                    return f.write_str(")");
5842                }
5843            };
5844            match attr {};
5845        }
5846        fmt.finish()
5847    }
5848}
5849impl IterableVfPortsAttrs<'_> {
5850    pub fn lookup_attr(
5851        &self,
5852        offset: usize,
5853        missing_type: Option<u16>,
5854    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5855        let mut stack = Vec::new();
5856        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5857        if missing_type.is_some() && cur == offset {
5858            stack.push(("VfPortsAttrs", offset));
5859            return (
5860                stack,
5861                missing_type.and_then(|t| VfPortsAttrs::attr_from_type(t)),
5862            );
5863        }
5864        (stack, None)
5865    }
5866}
5867#[derive(Clone)]
5868pub enum PortSelfAttrs {}
5869impl<'a> IterablePortSelfAttrs<'a> {}
5870impl PortSelfAttrs {
5871    pub fn new<'a>(buf: &'a [u8]) -> IterablePortSelfAttrs<'a> {
5872        IterablePortSelfAttrs::with_loc(buf, buf.as_ptr() as usize)
5873    }
5874    fn attr_from_type(r#type: u16) -> Option<&'static str> {
5875        None
5876    }
5877}
5878#[derive(Clone, Copy, Default)]
5879pub struct IterablePortSelfAttrs<'a> {
5880    buf: &'a [u8],
5881    pos: usize,
5882    orig_loc: usize,
5883}
5884impl<'a> IterablePortSelfAttrs<'a> {
5885    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5886        Self {
5887            buf,
5888            pos: 0,
5889            orig_loc,
5890        }
5891    }
5892    pub fn get_buf(&self) -> &'a [u8] {
5893        self.buf
5894    }
5895}
5896impl<'a> Iterator for IterablePortSelfAttrs<'a> {
5897    type Item = Result<PortSelfAttrs, ErrorContext>;
5898    fn next(&mut self) -> Option<Self::Item> {
5899        let mut pos;
5900        let mut r#type;
5901        loop {
5902            pos = self.pos;
5903            r#type = None;
5904            if self.buf.len() == self.pos {
5905                return None;
5906            }
5907            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5908                self.pos = self.buf.len();
5909                break;
5910            };
5911            r#type = Some(header.r#type);
5912            let res = match header.r#type {
5913                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5914                n => continue,
5915            };
5916            return Some(Ok(res));
5917        }
5918        Some(Err(ErrorContext::new(
5919            "PortSelfAttrs",
5920            r#type.and_then(|t| PortSelfAttrs::attr_from_type(t)),
5921            self.orig_loc,
5922            self.buf.as_ptr().wrapping_add(pos) as usize,
5923        )))
5924    }
5925}
5926impl std::fmt::Debug for IterablePortSelfAttrs<'_> {
5927    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5928        let mut fmt = f.debug_struct("PortSelfAttrs");
5929        for attr in self.clone() {
5930            let attr = match attr {
5931                Ok(a) => a,
5932                Err(err) => {
5933                    fmt.finish()?;
5934                    f.write_str("Err(")?;
5935                    err.fmt(f)?;
5936                    return f.write_str(")");
5937                }
5938            };
5939            match attr {};
5940        }
5941        fmt.finish()
5942    }
5943}
5944impl IterablePortSelfAttrs<'_> {
5945    pub fn lookup_attr(
5946        &self,
5947        offset: usize,
5948        missing_type: Option<u16>,
5949    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5950        let mut stack = Vec::new();
5951        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5952        if missing_type.is_some() && cur == offset {
5953            stack.push(("PortSelfAttrs", offset));
5954            return (
5955                stack,
5956                missing_type.and_then(|t| PortSelfAttrs::attr_from_type(t)),
5957            );
5958        }
5959        (stack, None)
5960    }
5961}
5962#[derive(Clone)]
5963pub enum LinkinfoAttrs<'a> {
5964    Kind(&'a CStr),
5965    Data(LinkinfoDataMsg<'a>),
5966    Xstats(&'a [u8]),
5967    SlaveKind(&'a CStr),
5968    SlaveData(LinkinfoMemberDataMsg<'a>),
5969}
5970impl<'a> IterableLinkinfoAttrs<'a> {
5971    pub fn get_kind(&self) -> Result<&'a CStr, ErrorContext> {
5972        let mut iter = self.clone();
5973        iter.pos = 0;
5974        for attr in iter {
5975            if let Ok(LinkinfoAttrs::Kind(val)) = attr {
5976                return Ok(val);
5977            }
5978        }
5979        Err(ErrorContext::new_missing(
5980            "LinkinfoAttrs",
5981            "Kind",
5982            self.orig_loc,
5983            self.buf.as_ptr() as usize,
5984        ))
5985    }
5986    pub fn get_data(&self) -> Result<LinkinfoDataMsg<'a>, ErrorContext> {
5987        let mut iter = self.clone();
5988        iter.pos = 0;
5989        for attr in iter {
5990            if let Ok(LinkinfoAttrs::Data(val)) = attr {
5991                return Ok(val);
5992            }
5993        }
5994        Err(ErrorContext::new_missing(
5995            "LinkinfoAttrs",
5996            "Data",
5997            self.orig_loc,
5998            self.buf.as_ptr() as usize,
5999        ))
6000    }
6001    pub fn get_xstats(&self) -> Result<&'a [u8], ErrorContext> {
6002        let mut iter = self.clone();
6003        iter.pos = 0;
6004        for attr in iter {
6005            if let Ok(LinkinfoAttrs::Xstats(val)) = attr {
6006                return Ok(val);
6007            }
6008        }
6009        Err(ErrorContext::new_missing(
6010            "LinkinfoAttrs",
6011            "Xstats",
6012            self.orig_loc,
6013            self.buf.as_ptr() as usize,
6014        ))
6015    }
6016    pub fn get_slave_kind(&self) -> Result<&'a CStr, ErrorContext> {
6017        let mut iter = self.clone();
6018        iter.pos = 0;
6019        for attr in iter {
6020            if let Ok(LinkinfoAttrs::SlaveKind(val)) = attr {
6021                return Ok(val);
6022            }
6023        }
6024        Err(ErrorContext::new_missing(
6025            "LinkinfoAttrs",
6026            "SlaveKind",
6027            self.orig_loc,
6028            self.buf.as_ptr() as usize,
6029        ))
6030    }
6031    pub fn get_slave_data(&self) -> Result<LinkinfoMemberDataMsg<'a>, ErrorContext> {
6032        let mut iter = self.clone();
6033        iter.pos = 0;
6034        for attr in iter {
6035            if let Ok(LinkinfoAttrs::SlaveData(val)) = attr {
6036                return Ok(val);
6037            }
6038        }
6039        Err(ErrorContext::new_missing(
6040            "LinkinfoAttrs",
6041            "SlaveData",
6042            self.orig_loc,
6043            self.buf.as_ptr() as usize,
6044        ))
6045    }
6046}
6047#[derive(Debug, Clone)]
6048pub enum LinkinfoDataMsg<'a> {
6049    Bond(IterableLinkinfoBondAttrs<'a>),
6050    Bridge(IterableLinkinfoBridgeAttrs<'a>),
6051    Erspan(IterableLinkinfoGreAttrs<'a>),
6052    Gre(IterableLinkinfoGreAttrs<'a>),
6053    Gretap(IterableLinkinfoGreAttrs<'a>),
6054    Ip6gre(IterableLinkinfoGre6Attrs<'a>),
6055    Geneve(IterableLinkinfoGeneveAttrs<'a>),
6056    Hsr(IterableLinkinfoHsrAttrs<'a>),
6057    Ipip(IterableLinkinfoIptunAttrs<'a>),
6058    Ip6tnl(IterableLinkinfoIp6tnlAttrs<'a>),
6059    Sit(IterableLinkinfoIptunAttrs<'a>),
6060    Tun(IterableLinkinfoTunAttrs<'a>),
6061    Vlan(IterableLinkinfoVlanAttrs<'a>),
6062    Vrf(IterableLinkinfoVrfAttrs<'a>),
6063    Vti(IterableLinkinfoVtiAttrs<'a>),
6064    Vti6(IterableLinkinfoVti6Attrs<'a>),
6065    Netkit(IterableLinkinfoNetkitAttrs<'a>),
6066    Ovpn(IterableLinkinfoOvpnAttrs<'a>),
6067}
6068impl<'a> LinkinfoDataMsg<'a> {
6069    fn select_with_loc(selector: &'a CStr, buf: &'a [u8], loc: usize) -> Option<Self> {
6070        match selector.to_bytes() {
6071            b"bond" => Some(LinkinfoDataMsg::Bond(IterableLinkinfoBondAttrs::with_loc(
6072                buf, loc,
6073            ))),
6074            b"bridge" => Some(LinkinfoDataMsg::Bridge(
6075                IterableLinkinfoBridgeAttrs::with_loc(buf, loc),
6076            )),
6077            b"erspan" => Some(LinkinfoDataMsg::Erspan(IterableLinkinfoGreAttrs::with_loc(
6078                buf, loc,
6079            ))),
6080            b"gre" => Some(LinkinfoDataMsg::Gre(IterableLinkinfoGreAttrs::with_loc(
6081                buf, loc,
6082            ))),
6083            b"gretap" => Some(LinkinfoDataMsg::Gretap(IterableLinkinfoGreAttrs::with_loc(
6084                buf, loc,
6085            ))),
6086            b"ip6gre" => Some(LinkinfoDataMsg::Ip6gre(
6087                IterableLinkinfoGre6Attrs::with_loc(buf, loc),
6088            )),
6089            b"geneve" => Some(LinkinfoDataMsg::Geneve(
6090                IterableLinkinfoGeneveAttrs::with_loc(buf, loc),
6091            )),
6092            b"hsr" => Some(LinkinfoDataMsg::Hsr(IterableLinkinfoHsrAttrs::with_loc(
6093                buf, loc,
6094            ))),
6095            b"ipip" => Some(LinkinfoDataMsg::Ipip(IterableLinkinfoIptunAttrs::with_loc(
6096                buf, loc,
6097            ))),
6098            b"ip6tnl" => Some(LinkinfoDataMsg::Ip6tnl(
6099                IterableLinkinfoIp6tnlAttrs::with_loc(buf, loc),
6100            )),
6101            b"sit" => Some(LinkinfoDataMsg::Sit(IterableLinkinfoIptunAttrs::with_loc(
6102                buf, loc,
6103            ))),
6104            b"tun" => Some(LinkinfoDataMsg::Tun(IterableLinkinfoTunAttrs::with_loc(
6105                buf, loc,
6106            ))),
6107            b"vlan" => Some(LinkinfoDataMsg::Vlan(IterableLinkinfoVlanAttrs::with_loc(
6108                buf, loc,
6109            ))),
6110            b"vrf" => Some(LinkinfoDataMsg::Vrf(IterableLinkinfoVrfAttrs::with_loc(
6111                buf, loc,
6112            ))),
6113            b"vti" => Some(LinkinfoDataMsg::Vti(IterableLinkinfoVtiAttrs::with_loc(
6114                buf, loc,
6115            ))),
6116            b"vti6" => Some(LinkinfoDataMsg::Vti6(IterableLinkinfoVti6Attrs::with_loc(
6117                buf, loc,
6118            ))),
6119            b"netkit" => Some(LinkinfoDataMsg::Netkit(
6120                IterableLinkinfoNetkitAttrs::with_loc(buf, loc),
6121            )),
6122            b"ovpn" => Some(LinkinfoDataMsg::Ovpn(IterableLinkinfoOvpnAttrs::with_loc(
6123                buf, loc,
6124            ))),
6125            _ => None,
6126        }
6127    }
6128}
6129#[derive(Debug, Clone)]
6130pub enum LinkinfoMemberDataMsg<'a> {
6131    Bridge(IterableLinkinfoBrportAttrs<'a>),
6132    Bond(IterableBondSlaveAttrs<'a>),
6133}
6134impl<'a> LinkinfoMemberDataMsg<'a> {
6135    fn select_with_loc(selector: &'a CStr, buf: &'a [u8], loc: usize) -> Option<Self> {
6136        match selector.to_bytes() {
6137            b"bridge" => Some(LinkinfoMemberDataMsg::Bridge(
6138                IterableLinkinfoBrportAttrs::with_loc(buf, loc),
6139            )),
6140            b"bond" => Some(LinkinfoMemberDataMsg::Bond(
6141                IterableBondSlaveAttrs::with_loc(buf, loc),
6142            )),
6143            _ => None,
6144        }
6145    }
6146}
6147impl LinkinfoAttrs<'_> {
6148    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoAttrs<'a> {
6149        IterableLinkinfoAttrs::with_loc(buf, buf.as_ptr() as usize)
6150    }
6151    fn attr_from_type(r#type: u16) -> Option<&'static str> {
6152        let res = match r#type {
6153            1u16 => "Kind",
6154            2u16 => "Data",
6155            3u16 => "Xstats",
6156            4u16 => "SlaveKind",
6157            5u16 => "SlaveData",
6158            _ => return None,
6159        };
6160        Some(res)
6161    }
6162}
6163#[derive(Clone, Copy, Default)]
6164pub struct IterableLinkinfoAttrs<'a> {
6165    buf: &'a [u8],
6166    pos: usize,
6167    orig_loc: usize,
6168}
6169impl<'a> IterableLinkinfoAttrs<'a> {
6170    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6171        Self {
6172            buf,
6173            pos: 0,
6174            orig_loc,
6175        }
6176    }
6177    pub fn get_buf(&self) -> &'a [u8] {
6178        self.buf
6179    }
6180}
6181impl<'a> Iterator for IterableLinkinfoAttrs<'a> {
6182    type Item = Result<LinkinfoAttrs<'a>, ErrorContext>;
6183    fn next(&mut self) -> Option<Self::Item> {
6184        let mut pos;
6185        let mut r#type;
6186        loop {
6187            pos = self.pos;
6188            r#type = None;
6189            if self.buf.len() == self.pos {
6190                return None;
6191            }
6192            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6193                self.pos = self.buf.len();
6194                break;
6195            };
6196            r#type = Some(header.r#type);
6197            let res = match header.r#type {
6198                1u16 => LinkinfoAttrs::Kind({
6199                    let res = CStr::from_bytes_with_nul(next).ok();
6200                    let Some(val) = res else { break };
6201                    val
6202                }),
6203                2u16 => LinkinfoAttrs::Data({
6204                    let res = {
6205                        let Ok(selector) = self.get_kind() else { break };
6206                        match LinkinfoDataMsg::select_with_loc(selector, next, self.orig_loc) {
6207                            Some(sub) => Some(sub),
6208                            None if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6209                            None => continue,
6210                        }
6211                    };
6212                    let Some(val) = res else { break };
6213                    val
6214                }),
6215                3u16 => LinkinfoAttrs::Xstats({
6216                    let res = Some(next);
6217                    let Some(val) = res else { break };
6218                    val
6219                }),
6220                4u16 => LinkinfoAttrs::SlaveKind({
6221                    let res = CStr::from_bytes_with_nul(next).ok();
6222                    let Some(val) = res else { break };
6223                    val
6224                }),
6225                5u16 => LinkinfoAttrs::SlaveData({
6226                    let res = {
6227                        let Ok(selector) = self.get_slave_kind() else {
6228                            break;
6229                        };
6230                        match LinkinfoMemberDataMsg::select_with_loc(selector, next, self.orig_loc)
6231                        {
6232                            Some(sub) => Some(sub),
6233                            None if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6234                            None => continue,
6235                        }
6236                    };
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            "LinkinfoAttrs",
6247            r#type.and_then(|t| LinkinfoAttrs::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 IterableLinkinfoAttrs<'_> {
6254    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6255        let mut fmt = f.debug_struct("LinkinfoAttrs");
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                LinkinfoAttrs::Kind(val) => fmt.field("Kind", &val),
6268                LinkinfoAttrs::Data(val) => fmt.field("Data", &val),
6269                LinkinfoAttrs::Xstats(val) => fmt.field("Xstats", &val),
6270                LinkinfoAttrs::SlaveKind(val) => fmt.field("SlaveKind", &val),
6271                LinkinfoAttrs::SlaveData(val) => fmt.field("SlaveData", &val),
6272            };
6273        }
6274        fmt.finish()
6275    }
6276}
6277impl IterableLinkinfoAttrs<'_> {
6278    pub fn lookup_attr(
6279        &self,
6280        offset: usize,
6281        missing_type: Option<u16>,
6282    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6283        let mut stack = Vec::new();
6284        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6285        if missing_type.is_some() && cur == offset {
6286            stack.push(("LinkinfoAttrs", offset));
6287            return (
6288                stack,
6289                missing_type.and_then(|t| LinkinfoAttrs::attr_from_type(t)),
6290            );
6291        }
6292        if cur > offset || cur + self.buf.len() < offset {
6293            return (stack, None);
6294        }
6295        let mut attrs = self.clone();
6296        let mut last_off = cur + attrs.pos;
6297        while let Some(attr) = attrs.next() {
6298            let Ok(attr) = attr else { break };
6299            match attr {
6300                LinkinfoAttrs::Kind(val) => {
6301                    if last_off == offset {
6302                        stack.push(("Kind", last_off));
6303                        break;
6304                    }
6305                }
6306                LinkinfoAttrs::Data(val) => {
6307                    if last_off == offset {
6308                        stack.push(("Data", last_off));
6309                        break;
6310                    }
6311                }
6312                LinkinfoAttrs::Xstats(val) => {
6313                    if last_off == offset {
6314                        stack.push(("Xstats", last_off));
6315                        break;
6316                    }
6317                }
6318                LinkinfoAttrs::SlaveKind(val) => {
6319                    if last_off == offset {
6320                        stack.push(("SlaveKind", last_off));
6321                        break;
6322                    }
6323                }
6324                LinkinfoAttrs::SlaveData(val) => {
6325                    if last_off == offset {
6326                        stack.push(("SlaveData", last_off));
6327                        break;
6328                    }
6329                }
6330                _ => {}
6331            };
6332            last_off = cur + attrs.pos;
6333        }
6334        if !stack.is_empty() {
6335            stack.push(("LinkinfoAttrs", cur));
6336        }
6337        (stack, None)
6338    }
6339}
6340#[derive(Clone)]
6341pub enum LinkinfoBondAttrs<'a> {
6342    Mode(u8),
6343    ActiveSlave(u32),
6344    Miimon(u32),
6345    Updelay(u32),
6346    Downdelay(u32),
6347    UseCarrier(u8),
6348    ArpInterval(u32),
6349    ArpIpTarget(IterableArrayIpv4Addr<'a>),
6350    ArpValidate(u32),
6351    ArpAllTargets(u32),
6352    Primary(u32),
6353    PrimaryReselect(u8),
6354    FailOverMac(u8),
6355    XmitHashPolicy(u8),
6356    ResendIgmp(u32),
6357    NumPeerNotif(u8),
6358    AllSlavesActive(u8),
6359    MinLinks(u32),
6360    LpInterval(u32),
6361    PacketsPerSlave(u32),
6362    AdLacpRate(u8),
6363    AdSelect(u8),
6364    AdInfo(IterableBondAdInfoAttrs<'a>),
6365    AdActorSysPrio(u16),
6366    AdUserPortKey(u16),
6367    AdActorSystem(&'a [u8]),
6368    TlbDynamicLb(u8),
6369    PeerNotifDelay(u32),
6370    AdLacpActive(u8),
6371    MissedMax(u8),
6372    NsIp6Target(IterableArrayBinary<'a>),
6373    CoupledControl(u8),
6374    BroadcastNeigh(u8),
6375    LacpStrict(u8),
6376}
6377impl<'a> IterableLinkinfoBondAttrs<'a> {
6378    pub fn get_mode(&self) -> Result<u8, ErrorContext> {
6379        let mut iter = self.clone();
6380        iter.pos = 0;
6381        for attr in iter {
6382            if let Ok(LinkinfoBondAttrs::Mode(val)) = attr {
6383                return Ok(val);
6384            }
6385        }
6386        Err(ErrorContext::new_missing(
6387            "LinkinfoBondAttrs",
6388            "Mode",
6389            self.orig_loc,
6390            self.buf.as_ptr() as usize,
6391        ))
6392    }
6393    pub fn get_active_slave(&self) -> Result<u32, ErrorContext> {
6394        let mut iter = self.clone();
6395        iter.pos = 0;
6396        for attr in iter {
6397            if let Ok(LinkinfoBondAttrs::ActiveSlave(val)) = attr {
6398                return Ok(val);
6399            }
6400        }
6401        Err(ErrorContext::new_missing(
6402            "LinkinfoBondAttrs",
6403            "ActiveSlave",
6404            self.orig_loc,
6405            self.buf.as_ptr() as usize,
6406        ))
6407    }
6408    pub fn get_miimon(&self) -> Result<u32, ErrorContext> {
6409        let mut iter = self.clone();
6410        iter.pos = 0;
6411        for attr in iter {
6412            if let Ok(LinkinfoBondAttrs::Miimon(val)) = attr {
6413                return Ok(val);
6414            }
6415        }
6416        Err(ErrorContext::new_missing(
6417            "LinkinfoBondAttrs",
6418            "Miimon",
6419            self.orig_loc,
6420            self.buf.as_ptr() as usize,
6421        ))
6422    }
6423    pub fn get_updelay(&self) -> Result<u32, ErrorContext> {
6424        let mut iter = self.clone();
6425        iter.pos = 0;
6426        for attr in iter {
6427            if let Ok(LinkinfoBondAttrs::Updelay(val)) = attr {
6428                return Ok(val);
6429            }
6430        }
6431        Err(ErrorContext::new_missing(
6432            "LinkinfoBondAttrs",
6433            "Updelay",
6434            self.orig_loc,
6435            self.buf.as_ptr() as usize,
6436        ))
6437    }
6438    pub fn get_downdelay(&self) -> Result<u32, ErrorContext> {
6439        let mut iter = self.clone();
6440        iter.pos = 0;
6441        for attr in iter {
6442            if let Ok(LinkinfoBondAttrs::Downdelay(val)) = attr {
6443                return Ok(val);
6444            }
6445        }
6446        Err(ErrorContext::new_missing(
6447            "LinkinfoBondAttrs",
6448            "Downdelay",
6449            self.orig_loc,
6450            self.buf.as_ptr() as usize,
6451        ))
6452    }
6453    pub fn get_use_carrier(&self) -> Result<u8, ErrorContext> {
6454        let mut iter = self.clone();
6455        iter.pos = 0;
6456        for attr in iter {
6457            if let Ok(LinkinfoBondAttrs::UseCarrier(val)) = attr {
6458                return Ok(val);
6459            }
6460        }
6461        Err(ErrorContext::new_missing(
6462            "LinkinfoBondAttrs",
6463            "UseCarrier",
6464            self.orig_loc,
6465            self.buf.as_ptr() as usize,
6466        ))
6467    }
6468    pub fn get_arp_interval(&self) -> Result<u32, ErrorContext> {
6469        let mut iter = self.clone();
6470        iter.pos = 0;
6471        for attr in iter {
6472            if let Ok(LinkinfoBondAttrs::ArpInterval(val)) = attr {
6473                return Ok(val);
6474            }
6475        }
6476        Err(ErrorContext::new_missing(
6477            "LinkinfoBondAttrs",
6478            "ArpInterval",
6479            self.orig_loc,
6480            self.buf.as_ptr() as usize,
6481        ))
6482    }
6483    pub fn get_arp_ip_target(
6484        &self,
6485    ) -> Result<ArrayIterable<IterableArrayIpv4Addr<'a>, std::net::Ipv4Addr>, ErrorContext> {
6486        for attr in self.clone() {
6487            if let Ok(LinkinfoBondAttrs::ArpIpTarget(val)) = attr {
6488                return Ok(ArrayIterable::new(val));
6489            }
6490        }
6491        Err(ErrorContext::new_missing(
6492            "LinkinfoBondAttrs",
6493            "ArpIpTarget",
6494            self.orig_loc,
6495            self.buf.as_ptr() as usize,
6496        ))
6497    }
6498    pub fn get_arp_validate(&self) -> Result<u32, ErrorContext> {
6499        let mut iter = self.clone();
6500        iter.pos = 0;
6501        for attr in iter {
6502            if let Ok(LinkinfoBondAttrs::ArpValidate(val)) = attr {
6503                return Ok(val);
6504            }
6505        }
6506        Err(ErrorContext::new_missing(
6507            "LinkinfoBondAttrs",
6508            "ArpValidate",
6509            self.orig_loc,
6510            self.buf.as_ptr() as usize,
6511        ))
6512    }
6513    pub fn get_arp_all_targets(&self) -> Result<u32, ErrorContext> {
6514        let mut iter = self.clone();
6515        iter.pos = 0;
6516        for attr in iter {
6517            if let Ok(LinkinfoBondAttrs::ArpAllTargets(val)) = attr {
6518                return Ok(val);
6519            }
6520        }
6521        Err(ErrorContext::new_missing(
6522            "LinkinfoBondAttrs",
6523            "ArpAllTargets",
6524            self.orig_loc,
6525            self.buf.as_ptr() as usize,
6526        ))
6527    }
6528    pub fn get_primary(&self) -> Result<u32, ErrorContext> {
6529        let mut iter = self.clone();
6530        iter.pos = 0;
6531        for attr in iter {
6532            if let Ok(LinkinfoBondAttrs::Primary(val)) = attr {
6533                return Ok(val);
6534            }
6535        }
6536        Err(ErrorContext::new_missing(
6537            "LinkinfoBondAttrs",
6538            "Primary",
6539            self.orig_loc,
6540            self.buf.as_ptr() as usize,
6541        ))
6542    }
6543    pub fn get_primary_reselect(&self) -> Result<u8, ErrorContext> {
6544        let mut iter = self.clone();
6545        iter.pos = 0;
6546        for attr in iter {
6547            if let Ok(LinkinfoBondAttrs::PrimaryReselect(val)) = attr {
6548                return Ok(val);
6549            }
6550        }
6551        Err(ErrorContext::new_missing(
6552            "LinkinfoBondAttrs",
6553            "PrimaryReselect",
6554            self.orig_loc,
6555            self.buf.as_ptr() as usize,
6556        ))
6557    }
6558    pub fn get_fail_over_mac(&self) -> Result<u8, ErrorContext> {
6559        let mut iter = self.clone();
6560        iter.pos = 0;
6561        for attr in iter {
6562            if let Ok(LinkinfoBondAttrs::FailOverMac(val)) = attr {
6563                return Ok(val);
6564            }
6565        }
6566        Err(ErrorContext::new_missing(
6567            "LinkinfoBondAttrs",
6568            "FailOverMac",
6569            self.orig_loc,
6570            self.buf.as_ptr() as usize,
6571        ))
6572    }
6573    pub fn get_xmit_hash_policy(&self) -> Result<u8, ErrorContext> {
6574        let mut iter = self.clone();
6575        iter.pos = 0;
6576        for attr in iter {
6577            if let Ok(LinkinfoBondAttrs::XmitHashPolicy(val)) = attr {
6578                return Ok(val);
6579            }
6580        }
6581        Err(ErrorContext::new_missing(
6582            "LinkinfoBondAttrs",
6583            "XmitHashPolicy",
6584            self.orig_loc,
6585            self.buf.as_ptr() as usize,
6586        ))
6587    }
6588    pub fn get_resend_igmp(&self) -> Result<u32, ErrorContext> {
6589        let mut iter = self.clone();
6590        iter.pos = 0;
6591        for attr in iter {
6592            if let Ok(LinkinfoBondAttrs::ResendIgmp(val)) = attr {
6593                return Ok(val);
6594            }
6595        }
6596        Err(ErrorContext::new_missing(
6597            "LinkinfoBondAttrs",
6598            "ResendIgmp",
6599            self.orig_loc,
6600            self.buf.as_ptr() as usize,
6601        ))
6602    }
6603    pub fn get_num_peer_notif(&self) -> Result<u8, ErrorContext> {
6604        let mut iter = self.clone();
6605        iter.pos = 0;
6606        for attr in iter {
6607            if let Ok(LinkinfoBondAttrs::NumPeerNotif(val)) = attr {
6608                return Ok(val);
6609            }
6610        }
6611        Err(ErrorContext::new_missing(
6612            "LinkinfoBondAttrs",
6613            "NumPeerNotif",
6614            self.orig_loc,
6615            self.buf.as_ptr() as usize,
6616        ))
6617    }
6618    pub fn get_all_slaves_active(&self) -> Result<u8, ErrorContext> {
6619        let mut iter = self.clone();
6620        iter.pos = 0;
6621        for attr in iter {
6622            if let Ok(LinkinfoBondAttrs::AllSlavesActive(val)) = attr {
6623                return Ok(val);
6624            }
6625        }
6626        Err(ErrorContext::new_missing(
6627            "LinkinfoBondAttrs",
6628            "AllSlavesActive",
6629            self.orig_loc,
6630            self.buf.as_ptr() as usize,
6631        ))
6632    }
6633    pub fn get_min_links(&self) -> Result<u32, ErrorContext> {
6634        let mut iter = self.clone();
6635        iter.pos = 0;
6636        for attr in iter {
6637            if let Ok(LinkinfoBondAttrs::MinLinks(val)) = attr {
6638                return Ok(val);
6639            }
6640        }
6641        Err(ErrorContext::new_missing(
6642            "LinkinfoBondAttrs",
6643            "MinLinks",
6644            self.orig_loc,
6645            self.buf.as_ptr() as usize,
6646        ))
6647    }
6648    pub fn get_lp_interval(&self) -> Result<u32, ErrorContext> {
6649        let mut iter = self.clone();
6650        iter.pos = 0;
6651        for attr in iter {
6652            if let Ok(LinkinfoBondAttrs::LpInterval(val)) = attr {
6653                return Ok(val);
6654            }
6655        }
6656        Err(ErrorContext::new_missing(
6657            "LinkinfoBondAttrs",
6658            "LpInterval",
6659            self.orig_loc,
6660            self.buf.as_ptr() as usize,
6661        ))
6662    }
6663    pub fn get_packets_per_slave(&self) -> Result<u32, ErrorContext> {
6664        let mut iter = self.clone();
6665        iter.pos = 0;
6666        for attr in iter {
6667            if let Ok(LinkinfoBondAttrs::PacketsPerSlave(val)) = attr {
6668                return Ok(val);
6669            }
6670        }
6671        Err(ErrorContext::new_missing(
6672            "LinkinfoBondAttrs",
6673            "PacketsPerSlave",
6674            self.orig_loc,
6675            self.buf.as_ptr() as usize,
6676        ))
6677    }
6678    pub fn get_ad_lacp_rate(&self) -> Result<u8, ErrorContext> {
6679        let mut iter = self.clone();
6680        iter.pos = 0;
6681        for attr in iter {
6682            if let Ok(LinkinfoBondAttrs::AdLacpRate(val)) = attr {
6683                return Ok(val);
6684            }
6685        }
6686        Err(ErrorContext::new_missing(
6687            "LinkinfoBondAttrs",
6688            "AdLacpRate",
6689            self.orig_loc,
6690            self.buf.as_ptr() as usize,
6691        ))
6692    }
6693    pub fn get_ad_select(&self) -> Result<u8, ErrorContext> {
6694        let mut iter = self.clone();
6695        iter.pos = 0;
6696        for attr in iter {
6697            if let Ok(LinkinfoBondAttrs::AdSelect(val)) = attr {
6698                return Ok(val);
6699            }
6700        }
6701        Err(ErrorContext::new_missing(
6702            "LinkinfoBondAttrs",
6703            "AdSelect",
6704            self.orig_loc,
6705            self.buf.as_ptr() as usize,
6706        ))
6707    }
6708    pub fn get_ad_info(&self) -> Result<IterableBondAdInfoAttrs<'a>, ErrorContext> {
6709        let mut iter = self.clone();
6710        iter.pos = 0;
6711        for attr in iter {
6712            if let Ok(LinkinfoBondAttrs::AdInfo(val)) = attr {
6713                return Ok(val);
6714            }
6715        }
6716        Err(ErrorContext::new_missing(
6717            "LinkinfoBondAttrs",
6718            "AdInfo",
6719            self.orig_loc,
6720            self.buf.as_ptr() as usize,
6721        ))
6722    }
6723    pub fn get_ad_actor_sys_prio(&self) -> Result<u16, ErrorContext> {
6724        let mut iter = self.clone();
6725        iter.pos = 0;
6726        for attr in iter {
6727            if let Ok(LinkinfoBondAttrs::AdActorSysPrio(val)) = attr {
6728                return Ok(val);
6729            }
6730        }
6731        Err(ErrorContext::new_missing(
6732            "LinkinfoBondAttrs",
6733            "AdActorSysPrio",
6734            self.orig_loc,
6735            self.buf.as_ptr() as usize,
6736        ))
6737    }
6738    pub fn get_ad_user_port_key(&self) -> Result<u16, ErrorContext> {
6739        let mut iter = self.clone();
6740        iter.pos = 0;
6741        for attr in iter {
6742            if let Ok(LinkinfoBondAttrs::AdUserPortKey(val)) = attr {
6743                return Ok(val);
6744            }
6745        }
6746        Err(ErrorContext::new_missing(
6747            "LinkinfoBondAttrs",
6748            "AdUserPortKey",
6749            self.orig_loc,
6750            self.buf.as_ptr() as usize,
6751        ))
6752    }
6753    pub fn get_ad_actor_system(&self) -> Result<&'a [u8], ErrorContext> {
6754        let mut iter = self.clone();
6755        iter.pos = 0;
6756        for attr in iter {
6757            if let Ok(LinkinfoBondAttrs::AdActorSystem(val)) = attr {
6758                return Ok(val);
6759            }
6760        }
6761        Err(ErrorContext::new_missing(
6762            "LinkinfoBondAttrs",
6763            "AdActorSystem",
6764            self.orig_loc,
6765            self.buf.as_ptr() as usize,
6766        ))
6767    }
6768    pub fn get_tlb_dynamic_lb(&self) -> Result<u8, ErrorContext> {
6769        let mut iter = self.clone();
6770        iter.pos = 0;
6771        for attr in iter {
6772            if let Ok(LinkinfoBondAttrs::TlbDynamicLb(val)) = attr {
6773                return Ok(val);
6774            }
6775        }
6776        Err(ErrorContext::new_missing(
6777            "LinkinfoBondAttrs",
6778            "TlbDynamicLb",
6779            self.orig_loc,
6780            self.buf.as_ptr() as usize,
6781        ))
6782    }
6783    pub fn get_peer_notif_delay(&self) -> Result<u32, ErrorContext> {
6784        let mut iter = self.clone();
6785        iter.pos = 0;
6786        for attr in iter {
6787            if let Ok(LinkinfoBondAttrs::PeerNotifDelay(val)) = attr {
6788                return Ok(val);
6789            }
6790        }
6791        Err(ErrorContext::new_missing(
6792            "LinkinfoBondAttrs",
6793            "PeerNotifDelay",
6794            self.orig_loc,
6795            self.buf.as_ptr() as usize,
6796        ))
6797    }
6798    pub fn get_ad_lacp_active(&self) -> Result<u8, ErrorContext> {
6799        let mut iter = self.clone();
6800        iter.pos = 0;
6801        for attr in iter {
6802            if let Ok(LinkinfoBondAttrs::AdLacpActive(val)) = attr {
6803                return Ok(val);
6804            }
6805        }
6806        Err(ErrorContext::new_missing(
6807            "LinkinfoBondAttrs",
6808            "AdLacpActive",
6809            self.orig_loc,
6810            self.buf.as_ptr() as usize,
6811        ))
6812    }
6813    pub fn get_missed_max(&self) -> Result<u8, ErrorContext> {
6814        let mut iter = self.clone();
6815        iter.pos = 0;
6816        for attr in iter {
6817            if let Ok(LinkinfoBondAttrs::MissedMax(val)) = attr {
6818                return Ok(val);
6819            }
6820        }
6821        Err(ErrorContext::new_missing(
6822            "LinkinfoBondAttrs",
6823            "MissedMax",
6824            self.orig_loc,
6825            self.buf.as_ptr() as usize,
6826        ))
6827    }
6828    pub fn get_ns_ip6_target(
6829        &self,
6830    ) -> Result<ArrayIterable<IterableArrayBinary<'a>, &'a [u8]>, ErrorContext> {
6831        for attr in self.clone() {
6832            if let Ok(LinkinfoBondAttrs::NsIp6Target(val)) = attr {
6833                return Ok(ArrayIterable::new(val));
6834            }
6835        }
6836        Err(ErrorContext::new_missing(
6837            "LinkinfoBondAttrs",
6838            "NsIp6Target",
6839            self.orig_loc,
6840            self.buf.as_ptr() as usize,
6841        ))
6842    }
6843    pub fn get_coupled_control(&self) -> Result<u8, ErrorContext> {
6844        let mut iter = self.clone();
6845        iter.pos = 0;
6846        for attr in iter {
6847            if let Ok(LinkinfoBondAttrs::CoupledControl(val)) = attr {
6848                return Ok(val);
6849            }
6850        }
6851        Err(ErrorContext::new_missing(
6852            "LinkinfoBondAttrs",
6853            "CoupledControl",
6854            self.orig_loc,
6855            self.buf.as_ptr() as usize,
6856        ))
6857    }
6858    pub fn get_broadcast_neigh(&self) -> Result<u8, ErrorContext> {
6859        let mut iter = self.clone();
6860        iter.pos = 0;
6861        for attr in iter {
6862            if let Ok(LinkinfoBondAttrs::BroadcastNeigh(val)) = attr {
6863                return Ok(val);
6864            }
6865        }
6866        Err(ErrorContext::new_missing(
6867            "LinkinfoBondAttrs",
6868            "BroadcastNeigh",
6869            self.orig_loc,
6870            self.buf.as_ptr() as usize,
6871        ))
6872    }
6873    pub fn get_lacp_strict(&self) -> Result<u8, ErrorContext> {
6874        let mut iter = self.clone();
6875        iter.pos = 0;
6876        for attr in iter {
6877            if let Ok(LinkinfoBondAttrs::LacpStrict(val)) = attr {
6878                return Ok(val);
6879            }
6880        }
6881        Err(ErrorContext::new_missing(
6882            "LinkinfoBondAttrs",
6883            "LacpStrict",
6884            self.orig_loc,
6885            self.buf.as_ptr() as usize,
6886        ))
6887    }
6888}
6889#[derive(Clone, Copy, Default)]
6890pub struct IterableArrayIpv4Addr<'a> {
6891    buf: &'a [u8],
6892    pos: usize,
6893    orig_loc: usize,
6894}
6895impl<'a> IterableArrayIpv4Addr<'a> {
6896    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6897        Self {
6898            buf,
6899            pos: 0,
6900            orig_loc,
6901        }
6902    }
6903    pub fn get_buf(&self) -> &'a [u8] {
6904        self.buf
6905    }
6906}
6907impl<'a> Iterator for IterableArrayIpv4Addr<'a> {
6908    type Item = Result<std::net::Ipv4Addr, ErrorContext>;
6909    fn next(&mut self) -> Option<Self::Item> {
6910        if self.buf.len() == self.pos {
6911            return None;
6912        }
6913        while let Some((header, next)) = chop_header(self.buf, &mut self.pos) {
6914            {
6915                let Some(res) = parse_be_u32(next).map(Ipv4Addr::from_bits) else {
6916                    break;
6917                };
6918                return Some(Ok(res));
6919            }
6920        }
6921        let pos = self.pos;
6922        self.pos = self.buf.len();
6923        Some(Err(ErrorContext::new(
6924            "Ipv4Addr",
6925            None,
6926            self.orig_loc,
6927            self.buf.as_ptr().wrapping_add(pos) as usize,
6928        )))
6929    }
6930}
6931#[derive(Clone, Copy, Default)]
6932pub struct IterableArrayBinary<'a> {
6933    buf: &'a [u8],
6934    pos: usize,
6935    orig_loc: usize,
6936}
6937impl<'a> IterableArrayBinary<'a> {
6938    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6939        Self {
6940            buf,
6941            pos: 0,
6942            orig_loc,
6943        }
6944    }
6945    pub fn get_buf(&self) -> &'a [u8] {
6946        self.buf
6947    }
6948}
6949impl<'a> Iterator for IterableArrayBinary<'a> {
6950    type Item = Result<&'a [u8], ErrorContext>;
6951    fn next(&mut self) -> Option<Self::Item> {
6952        if self.buf.len() == self.pos {
6953            return None;
6954        }
6955        while let Some((header, next)) = chop_header(self.buf, &mut self.pos) {
6956            {
6957                let Some(res) = Some(next) else { break };
6958                return Some(Ok(res));
6959            }
6960        }
6961        let pos = self.pos;
6962        self.pos = self.buf.len();
6963        Some(Err(ErrorContext::new(
6964            "Binary",
6965            None,
6966            self.orig_loc,
6967            self.buf.as_ptr().wrapping_add(pos) as usize,
6968        )))
6969    }
6970}
6971impl LinkinfoBondAttrs<'_> {
6972    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoBondAttrs<'a> {
6973        IterableLinkinfoBondAttrs::with_loc(buf, buf.as_ptr() as usize)
6974    }
6975    fn attr_from_type(r#type: u16) -> Option<&'static str> {
6976        let res = match r#type {
6977            1u16 => "Mode",
6978            2u16 => "ActiveSlave",
6979            3u16 => "Miimon",
6980            4u16 => "Updelay",
6981            5u16 => "Downdelay",
6982            6u16 => "UseCarrier",
6983            7u16 => "ArpInterval",
6984            8u16 => "ArpIpTarget",
6985            9u16 => "ArpValidate",
6986            10u16 => "ArpAllTargets",
6987            11u16 => "Primary",
6988            12u16 => "PrimaryReselect",
6989            13u16 => "FailOverMac",
6990            14u16 => "XmitHashPolicy",
6991            15u16 => "ResendIgmp",
6992            16u16 => "NumPeerNotif",
6993            17u16 => "AllSlavesActive",
6994            18u16 => "MinLinks",
6995            19u16 => "LpInterval",
6996            20u16 => "PacketsPerSlave",
6997            21u16 => "AdLacpRate",
6998            22u16 => "AdSelect",
6999            23u16 => "AdInfo",
7000            24u16 => "AdActorSysPrio",
7001            25u16 => "AdUserPortKey",
7002            26u16 => "AdActorSystem",
7003            27u16 => "TlbDynamicLb",
7004            28u16 => "PeerNotifDelay",
7005            29u16 => "AdLacpActive",
7006            30u16 => "MissedMax",
7007            31u16 => "NsIp6Target",
7008            32u16 => "CoupledControl",
7009            33u16 => "BroadcastNeigh",
7010            34u16 => "LacpStrict",
7011            _ => return None,
7012        };
7013        Some(res)
7014    }
7015}
7016#[derive(Clone, Copy, Default)]
7017pub struct IterableLinkinfoBondAttrs<'a> {
7018    buf: &'a [u8],
7019    pos: usize,
7020    orig_loc: usize,
7021}
7022impl<'a> IterableLinkinfoBondAttrs<'a> {
7023    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7024        Self {
7025            buf,
7026            pos: 0,
7027            orig_loc,
7028        }
7029    }
7030    pub fn get_buf(&self) -> &'a [u8] {
7031        self.buf
7032    }
7033}
7034impl<'a> Iterator for IterableLinkinfoBondAttrs<'a> {
7035    type Item = Result<LinkinfoBondAttrs<'a>, ErrorContext>;
7036    fn next(&mut self) -> Option<Self::Item> {
7037        let mut pos;
7038        let mut r#type;
7039        loop {
7040            pos = self.pos;
7041            r#type = None;
7042            if self.buf.len() == self.pos {
7043                return None;
7044            }
7045            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7046                self.pos = self.buf.len();
7047                break;
7048            };
7049            r#type = Some(header.r#type);
7050            let res = match header.r#type {
7051                1u16 => LinkinfoBondAttrs::Mode({
7052                    let res = parse_u8(next);
7053                    let Some(val) = res else { break };
7054                    val
7055                }),
7056                2u16 => LinkinfoBondAttrs::ActiveSlave({
7057                    let res = parse_u32(next);
7058                    let Some(val) = res else { break };
7059                    val
7060                }),
7061                3u16 => LinkinfoBondAttrs::Miimon({
7062                    let res = parse_u32(next);
7063                    let Some(val) = res else { break };
7064                    val
7065                }),
7066                4u16 => LinkinfoBondAttrs::Updelay({
7067                    let res = parse_u32(next);
7068                    let Some(val) = res else { break };
7069                    val
7070                }),
7071                5u16 => LinkinfoBondAttrs::Downdelay({
7072                    let res = parse_u32(next);
7073                    let Some(val) = res else { break };
7074                    val
7075                }),
7076                6u16 => LinkinfoBondAttrs::UseCarrier({
7077                    let res = parse_u8(next);
7078                    let Some(val) = res else { break };
7079                    val
7080                }),
7081                7u16 => LinkinfoBondAttrs::ArpInterval({
7082                    let res = parse_u32(next);
7083                    let Some(val) = res else { break };
7084                    val
7085                }),
7086                8u16 => LinkinfoBondAttrs::ArpIpTarget({
7087                    let res = Some(IterableArrayIpv4Addr::with_loc(next, self.orig_loc));
7088                    let Some(val) = res else { break };
7089                    val
7090                }),
7091                9u16 => LinkinfoBondAttrs::ArpValidate({
7092                    let res = parse_u32(next);
7093                    let Some(val) = res else { break };
7094                    val
7095                }),
7096                10u16 => LinkinfoBondAttrs::ArpAllTargets({
7097                    let res = parse_u32(next);
7098                    let Some(val) = res else { break };
7099                    val
7100                }),
7101                11u16 => LinkinfoBondAttrs::Primary({
7102                    let res = parse_u32(next);
7103                    let Some(val) = res else { break };
7104                    val
7105                }),
7106                12u16 => LinkinfoBondAttrs::PrimaryReselect({
7107                    let res = parse_u8(next);
7108                    let Some(val) = res else { break };
7109                    val
7110                }),
7111                13u16 => LinkinfoBondAttrs::FailOverMac({
7112                    let res = parse_u8(next);
7113                    let Some(val) = res else { break };
7114                    val
7115                }),
7116                14u16 => LinkinfoBondAttrs::XmitHashPolicy({
7117                    let res = parse_u8(next);
7118                    let Some(val) = res else { break };
7119                    val
7120                }),
7121                15u16 => LinkinfoBondAttrs::ResendIgmp({
7122                    let res = parse_u32(next);
7123                    let Some(val) = res else { break };
7124                    val
7125                }),
7126                16u16 => LinkinfoBondAttrs::NumPeerNotif({
7127                    let res = parse_u8(next);
7128                    let Some(val) = res else { break };
7129                    val
7130                }),
7131                17u16 => LinkinfoBondAttrs::AllSlavesActive({
7132                    let res = parse_u8(next);
7133                    let Some(val) = res else { break };
7134                    val
7135                }),
7136                18u16 => LinkinfoBondAttrs::MinLinks({
7137                    let res = parse_u32(next);
7138                    let Some(val) = res else { break };
7139                    val
7140                }),
7141                19u16 => LinkinfoBondAttrs::LpInterval({
7142                    let res = parse_u32(next);
7143                    let Some(val) = res else { break };
7144                    val
7145                }),
7146                20u16 => LinkinfoBondAttrs::PacketsPerSlave({
7147                    let res = parse_u32(next);
7148                    let Some(val) = res else { break };
7149                    val
7150                }),
7151                21u16 => LinkinfoBondAttrs::AdLacpRate({
7152                    let res = parse_u8(next);
7153                    let Some(val) = res else { break };
7154                    val
7155                }),
7156                22u16 => LinkinfoBondAttrs::AdSelect({
7157                    let res = parse_u8(next);
7158                    let Some(val) = res else { break };
7159                    val
7160                }),
7161                23u16 => LinkinfoBondAttrs::AdInfo({
7162                    let res = Some(IterableBondAdInfoAttrs::with_loc(next, self.orig_loc));
7163                    let Some(val) = res else { break };
7164                    val
7165                }),
7166                24u16 => LinkinfoBondAttrs::AdActorSysPrio({
7167                    let res = parse_u16(next);
7168                    let Some(val) = res else { break };
7169                    val
7170                }),
7171                25u16 => LinkinfoBondAttrs::AdUserPortKey({
7172                    let res = parse_u16(next);
7173                    let Some(val) = res else { break };
7174                    val
7175                }),
7176                26u16 => LinkinfoBondAttrs::AdActorSystem({
7177                    let res = Some(next);
7178                    let Some(val) = res else { break };
7179                    val
7180                }),
7181                27u16 => LinkinfoBondAttrs::TlbDynamicLb({
7182                    let res = parse_u8(next);
7183                    let Some(val) = res else { break };
7184                    val
7185                }),
7186                28u16 => LinkinfoBondAttrs::PeerNotifDelay({
7187                    let res = parse_u32(next);
7188                    let Some(val) = res else { break };
7189                    val
7190                }),
7191                29u16 => LinkinfoBondAttrs::AdLacpActive({
7192                    let res = parse_u8(next);
7193                    let Some(val) = res else { break };
7194                    val
7195                }),
7196                30u16 => LinkinfoBondAttrs::MissedMax({
7197                    let res = parse_u8(next);
7198                    let Some(val) = res else { break };
7199                    val
7200                }),
7201                31u16 => LinkinfoBondAttrs::NsIp6Target({
7202                    let res = Some(IterableArrayBinary::with_loc(next, self.orig_loc));
7203                    let Some(val) = res else { break };
7204                    val
7205                }),
7206                32u16 => LinkinfoBondAttrs::CoupledControl({
7207                    let res = parse_u8(next);
7208                    let Some(val) = res else { break };
7209                    val
7210                }),
7211                33u16 => LinkinfoBondAttrs::BroadcastNeigh({
7212                    let res = parse_u8(next);
7213                    let Some(val) = res else { break };
7214                    val
7215                }),
7216                34u16 => LinkinfoBondAttrs::LacpStrict({
7217                    let res = parse_u8(next);
7218                    let Some(val) = res else { break };
7219                    val
7220                }),
7221                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7222                n => continue,
7223            };
7224            return Some(Ok(res));
7225        }
7226        Some(Err(ErrorContext::new(
7227            "LinkinfoBondAttrs",
7228            r#type.and_then(|t| LinkinfoBondAttrs::attr_from_type(t)),
7229            self.orig_loc,
7230            self.buf.as_ptr().wrapping_add(pos) as usize,
7231        )))
7232    }
7233}
7234impl std::fmt::Debug for IterableArrayIpv4Addr<'_> {
7235    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7236        fmt.debug_list()
7237            .entries(self.clone().map(FlattenErrorContext))
7238            .finish()
7239    }
7240}
7241impl std::fmt::Debug for IterableArrayBinary<'_> {
7242    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7243        fmt.debug_list()
7244            .entries(self.clone().map(FlattenErrorContext))
7245            .finish()
7246    }
7247}
7248impl<'a> std::fmt::Debug for IterableLinkinfoBondAttrs<'_> {
7249    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7250        let mut fmt = f.debug_struct("LinkinfoBondAttrs");
7251        for attr in self.clone() {
7252            let attr = match attr {
7253                Ok(a) => a,
7254                Err(err) => {
7255                    fmt.finish()?;
7256                    f.write_str("Err(")?;
7257                    err.fmt(f)?;
7258                    return f.write_str(")");
7259                }
7260            };
7261            match attr {
7262                LinkinfoBondAttrs::Mode(val) => fmt.field("Mode", &val),
7263                LinkinfoBondAttrs::ActiveSlave(val) => fmt.field("ActiveSlave", &val),
7264                LinkinfoBondAttrs::Miimon(val) => fmt.field("Miimon", &val),
7265                LinkinfoBondAttrs::Updelay(val) => fmt.field("Updelay", &val),
7266                LinkinfoBondAttrs::Downdelay(val) => fmt.field("Downdelay", &val),
7267                LinkinfoBondAttrs::UseCarrier(val) => fmt.field("UseCarrier", &val),
7268                LinkinfoBondAttrs::ArpInterval(val) => fmt.field("ArpInterval", &val),
7269                LinkinfoBondAttrs::ArpIpTarget(val) => fmt.field("ArpIpTarget", &val),
7270                LinkinfoBondAttrs::ArpValidate(val) => fmt.field("ArpValidate", &val),
7271                LinkinfoBondAttrs::ArpAllTargets(val) => fmt.field("ArpAllTargets", &val),
7272                LinkinfoBondAttrs::Primary(val) => fmt.field("Primary", &val),
7273                LinkinfoBondAttrs::PrimaryReselect(val) => fmt.field("PrimaryReselect", &val),
7274                LinkinfoBondAttrs::FailOverMac(val) => fmt.field("FailOverMac", &val),
7275                LinkinfoBondAttrs::XmitHashPolicy(val) => fmt.field("XmitHashPolicy", &val),
7276                LinkinfoBondAttrs::ResendIgmp(val) => fmt.field("ResendIgmp", &val),
7277                LinkinfoBondAttrs::NumPeerNotif(val) => fmt.field("NumPeerNotif", &val),
7278                LinkinfoBondAttrs::AllSlavesActive(val) => fmt.field("AllSlavesActive", &val),
7279                LinkinfoBondAttrs::MinLinks(val) => fmt.field("MinLinks", &val),
7280                LinkinfoBondAttrs::LpInterval(val) => fmt.field("LpInterval", &val),
7281                LinkinfoBondAttrs::PacketsPerSlave(val) => fmt.field("PacketsPerSlave", &val),
7282                LinkinfoBondAttrs::AdLacpRate(val) => fmt.field("AdLacpRate", &val),
7283                LinkinfoBondAttrs::AdSelect(val) => fmt.field("AdSelect", &val),
7284                LinkinfoBondAttrs::AdInfo(val) => fmt.field("AdInfo", &val),
7285                LinkinfoBondAttrs::AdActorSysPrio(val) => fmt.field("AdActorSysPrio", &val),
7286                LinkinfoBondAttrs::AdUserPortKey(val) => fmt.field("AdUserPortKey", &val),
7287                LinkinfoBondAttrs::AdActorSystem(val) => {
7288                    fmt.field("AdActorSystem", &FormatMac(val))
7289                }
7290                LinkinfoBondAttrs::TlbDynamicLb(val) => fmt.field("TlbDynamicLb", &val),
7291                LinkinfoBondAttrs::PeerNotifDelay(val) => fmt.field("PeerNotifDelay", &val),
7292                LinkinfoBondAttrs::AdLacpActive(val) => fmt.field("AdLacpActive", &val),
7293                LinkinfoBondAttrs::MissedMax(val) => fmt.field("MissedMax", &val),
7294                LinkinfoBondAttrs::NsIp6Target(val) => fmt.field("NsIp6Target", &val),
7295                LinkinfoBondAttrs::CoupledControl(val) => fmt.field("CoupledControl", &val),
7296                LinkinfoBondAttrs::BroadcastNeigh(val) => fmt.field("BroadcastNeigh", &val),
7297                LinkinfoBondAttrs::LacpStrict(val) => fmt.field("LacpStrict", &val),
7298            };
7299        }
7300        fmt.finish()
7301    }
7302}
7303impl IterableLinkinfoBondAttrs<'_> {
7304    pub fn lookup_attr(
7305        &self,
7306        offset: usize,
7307        missing_type: Option<u16>,
7308    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7309        let mut stack = Vec::new();
7310        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7311        if missing_type.is_some() && cur == offset {
7312            stack.push(("LinkinfoBondAttrs", offset));
7313            return (
7314                stack,
7315                missing_type.and_then(|t| LinkinfoBondAttrs::attr_from_type(t)),
7316            );
7317        }
7318        if cur > offset || cur + self.buf.len() < offset {
7319            return (stack, None);
7320        }
7321        let mut attrs = self.clone();
7322        let mut last_off = cur + attrs.pos;
7323        let mut missing = None;
7324        while let Some(attr) = attrs.next() {
7325            let Ok(attr) = attr else { break };
7326            match attr {
7327                LinkinfoBondAttrs::Mode(val) => {
7328                    if last_off == offset {
7329                        stack.push(("Mode", last_off));
7330                        break;
7331                    }
7332                }
7333                LinkinfoBondAttrs::ActiveSlave(val) => {
7334                    if last_off == offset {
7335                        stack.push(("ActiveSlave", last_off));
7336                        break;
7337                    }
7338                }
7339                LinkinfoBondAttrs::Miimon(val) => {
7340                    if last_off == offset {
7341                        stack.push(("Miimon", last_off));
7342                        break;
7343                    }
7344                }
7345                LinkinfoBondAttrs::Updelay(val) => {
7346                    if last_off == offset {
7347                        stack.push(("Updelay", last_off));
7348                        break;
7349                    }
7350                }
7351                LinkinfoBondAttrs::Downdelay(val) => {
7352                    if last_off == offset {
7353                        stack.push(("Downdelay", last_off));
7354                        break;
7355                    }
7356                }
7357                LinkinfoBondAttrs::UseCarrier(val) => {
7358                    if last_off == offset {
7359                        stack.push(("UseCarrier", last_off));
7360                        break;
7361                    }
7362                }
7363                LinkinfoBondAttrs::ArpInterval(val) => {
7364                    if last_off == offset {
7365                        stack.push(("ArpInterval", last_off));
7366                        break;
7367                    }
7368                }
7369                LinkinfoBondAttrs::ArpIpTarget(val) => {
7370                    if last_off == offset {
7371                        stack.push(("ArpIpTarget", last_off));
7372                        break;
7373                    }
7374                }
7375                LinkinfoBondAttrs::ArpValidate(val) => {
7376                    if last_off == offset {
7377                        stack.push(("ArpValidate", last_off));
7378                        break;
7379                    }
7380                }
7381                LinkinfoBondAttrs::ArpAllTargets(val) => {
7382                    if last_off == offset {
7383                        stack.push(("ArpAllTargets", last_off));
7384                        break;
7385                    }
7386                }
7387                LinkinfoBondAttrs::Primary(val) => {
7388                    if last_off == offset {
7389                        stack.push(("Primary", last_off));
7390                        break;
7391                    }
7392                }
7393                LinkinfoBondAttrs::PrimaryReselect(val) => {
7394                    if last_off == offset {
7395                        stack.push(("PrimaryReselect", last_off));
7396                        break;
7397                    }
7398                }
7399                LinkinfoBondAttrs::FailOverMac(val) => {
7400                    if last_off == offset {
7401                        stack.push(("FailOverMac", last_off));
7402                        break;
7403                    }
7404                }
7405                LinkinfoBondAttrs::XmitHashPolicy(val) => {
7406                    if last_off == offset {
7407                        stack.push(("XmitHashPolicy", last_off));
7408                        break;
7409                    }
7410                }
7411                LinkinfoBondAttrs::ResendIgmp(val) => {
7412                    if last_off == offset {
7413                        stack.push(("ResendIgmp", last_off));
7414                        break;
7415                    }
7416                }
7417                LinkinfoBondAttrs::NumPeerNotif(val) => {
7418                    if last_off == offset {
7419                        stack.push(("NumPeerNotif", last_off));
7420                        break;
7421                    }
7422                }
7423                LinkinfoBondAttrs::AllSlavesActive(val) => {
7424                    if last_off == offset {
7425                        stack.push(("AllSlavesActive", last_off));
7426                        break;
7427                    }
7428                }
7429                LinkinfoBondAttrs::MinLinks(val) => {
7430                    if last_off == offset {
7431                        stack.push(("MinLinks", last_off));
7432                        break;
7433                    }
7434                }
7435                LinkinfoBondAttrs::LpInterval(val) => {
7436                    if last_off == offset {
7437                        stack.push(("LpInterval", last_off));
7438                        break;
7439                    }
7440                }
7441                LinkinfoBondAttrs::PacketsPerSlave(val) => {
7442                    if last_off == offset {
7443                        stack.push(("PacketsPerSlave", last_off));
7444                        break;
7445                    }
7446                }
7447                LinkinfoBondAttrs::AdLacpRate(val) => {
7448                    if last_off == offset {
7449                        stack.push(("AdLacpRate", last_off));
7450                        break;
7451                    }
7452                }
7453                LinkinfoBondAttrs::AdSelect(val) => {
7454                    if last_off == offset {
7455                        stack.push(("AdSelect", last_off));
7456                        break;
7457                    }
7458                }
7459                LinkinfoBondAttrs::AdInfo(val) => {
7460                    (stack, missing) = val.lookup_attr(offset, missing_type);
7461                    if !stack.is_empty() {
7462                        break;
7463                    }
7464                }
7465                LinkinfoBondAttrs::AdActorSysPrio(val) => {
7466                    if last_off == offset {
7467                        stack.push(("AdActorSysPrio", last_off));
7468                        break;
7469                    }
7470                }
7471                LinkinfoBondAttrs::AdUserPortKey(val) => {
7472                    if last_off == offset {
7473                        stack.push(("AdUserPortKey", last_off));
7474                        break;
7475                    }
7476                }
7477                LinkinfoBondAttrs::AdActorSystem(val) => {
7478                    if last_off == offset {
7479                        stack.push(("AdActorSystem", last_off));
7480                        break;
7481                    }
7482                }
7483                LinkinfoBondAttrs::TlbDynamicLb(val) => {
7484                    if last_off == offset {
7485                        stack.push(("TlbDynamicLb", last_off));
7486                        break;
7487                    }
7488                }
7489                LinkinfoBondAttrs::PeerNotifDelay(val) => {
7490                    if last_off == offset {
7491                        stack.push(("PeerNotifDelay", last_off));
7492                        break;
7493                    }
7494                }
7495                LinkinfoBondAttrs::AdLacpActive(val) => {
7496                    if last_off == offset {
7497                        stack.push(("AdLacpActive", last_off));
7498                        break;
7499                    }
7500                }
7501                LinkinfoBondAttrs::MissedMax(val) => {
7502                    if last_off == offset {
7503                        stack.push(("MissedMax", last_off));
7504                        break;
7505                    }
7506                }
7507                LinkinfoBondAttrs::NsIp6Target(val) => {
7508                    if last_off == offset {
7509                        stack.push(("NsIp6Target", last_off));
7510                        break;
7511                    }
7512                }
7513                LinkinfoBondAttrs::CoupledControl(val) => {
7514                    if last_off == offset {
7515                        stack.push(("CoupledControl", last_off));
7516                        break;
7517                    }
7518                }
7519                LinkinfoBondAttrs::BroadcastNeigh(val) => {
7520                    if last_off == offset {
7521                        stack.push(("BroadcastNeigh", last_off));
7522                        break;
7523                    }
7524                }
7525                LinkinfoBondAttrs::LacpStrict(val) => {
7526                    if last_off == offset {
7527                        stack.push(("LacpStrict", last_off));
7528                        break;
7529                    }
7530                }
7531                _ => {}
7532            };
7533            last_off = cur + attrs.pos;
7534        }
7535        if !stack.is_empty() {
7536            stack.push(("LinkinfoBondAttrs", cur));
7537        }
7538        (stack, missing)
7539    }
7540}
7541#[derive(Clone)]
7542pub enum BondAdInfoAttrs<'a> {
7543    Aggregator(u16),
7544    NumPorts(u16),
7545    ActorKey(u16),
7546    PartnerKey(u16),
7547    PartnerMac(&'a [u8]),
7548}
7549impl<'a> IterableBondAdInfoAttrs<'a> {
7550    pub fn get_aggregator(&self) -> Result<u16, ErrorContext> {
7551        let mut iter = self.clone();
7552        iter.pos = 0;
7553        for attr in iter {
7554            if let Ok(BondAdInfoAttrs::Aggregator(val)) = attr {
7555                return Ok(val);
7556            }
7557        }
7558        Err(ErrorContext::new_missing(
7559            "BondAdInfoAttrs",
7560            "Aggregator",
7561            self.orig_loc,
7562            self.buf.as_ptr() as usize,
7563        ))
7564    }
7565    pub fn get_num_ports(&self) -> Result<u16, ErrorContext> {
7566        let mut iter = self.clone();
7567        iter.pos = 0;
7568        for attr in iter {
7569            if let Ok(BondAdInfoAttrs::NumPorts(val)) = attr {
7570                return Ok(val);
7571            }
7572        }
7573        Err(ErrorContext::new_missing(
7574            "BondAdInfoAttrs",
7575            "NumPorts",
7576            self.orig_loc,
7577            self.buf.as_ptr() as usize,
7578        ))
7579    }
7580    pub fn get_actor_key(&self) -> Result<u16, ErrorContext> {
7581        let mut iter = self.clone();
7582        iter.pos = 0;
7583        for attr in iter {
7584            if let Ok(BondAdInfoAttrs::ActorKey(val)) = attr {
7585                return Ok(val);
7586            }
7587        }
7588        Err(ErrorContext::new_missing(
7589            "BondAdInfoAttrs",
7590            "ActorKey",
7591            self.orig_loc,
7592            self.buf.as_ptr() as usize,
7593        ))
7594    }
7595    pub fn get_partner_key(&self) -> Result<u16, ErrorContext> {
7596        let mut iter = self.clone();
7597        iter.pos = 0;
7598        for attr in iter {
7599            if let Ok(BondAdInfoAttrs::PartnerKey(val)) = attr {
7600                return Ok(val);
7601            }
7602        }
7603        Err(ErrorContext::new_missing(
7604            "BondAdInfoAttrs",
7605            "PartnerKey",
7606            self.orig_loc,
7607            self.buf.as_ptr() as usize,
7608        ))
7609    }
7610    pub fn get_partner_mac(&self) -> Result<&'a [u8], ErrorContext> {
7611        let mut iter = self.clone();
7612        iter.pos = 0;
7613        for attr in iter {
7614            if let Ok(BondAdInfoAttrs::PartnerMac(val)) = attr {
7615                return Ok(val);
7616            }
7617        }
7618        Err(ErrorContext::new_missing(
7619            "BondAdInfoAttrs",
7620            "PartnerMac",
7621            self.orig_loc,
7622            self.buf.as_ptr() as usize,
7623        ))
7624    }
7625}
7626impl BondAdInfoAttrs<'_> {
7627    pub fn new<'a>(buf: &'a [u8]) -> IterableBondAdInfoAttrs<'a> {
7628        IterableBondAdInfoAttrs::with_loc(buf, buf.as_ptr() as usize)
7629    }
7630    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7631        let res = match r#type {
7632            1u16 => "Aggregator",
7633            2u16 => "NumPorts",
7634            3u16 => "ActorKey",
7635            4u16 => "PartnerKey",
7636            5u16 => "PartnerMac",
7637            _ => return None,
7638        };
7639        Some(res)
7640    }
7641}
7642#[derive(Clone, Copy, Default)]
7643pub struct IterableBondAdInfoAttrs<'a> {
7644    buf: &'a [u8],
7645    pos: usize,
7646    orig_loc: usize,
7647}
7648impl<'a> IterableBondAdInfoAttrs<'a> {
7649    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7650        Self {
7651            buf,
7652            pos: 0,
7653            orig_loc,
7654        }
7655    }
7656    pub fn get_buf(&self) -> &'a [u8] {
7657        self.buf
7658    }
7659}
7660impl<'a> Iterator for IterableBondAdInfoAttrs<'a> {
7661    type Item = Result<BondAdInfoAttrs<'a>, ErrorContext>;
7662    fn next(&mut self) -> Option<Self::Item> {
7663        let mut pos;
7664        let mut r#type;
7665        loop {
7666            pos = self.pos;
7667            r#type = None;
7668            if self.buf.len() == self.pos {
7669                return None;
7670            }
7671            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7672                self.pos = self.buf.len();
7673                break;
7674            };
7675            r#type = Some(header.r#type);
7676            let res = match header.r#type {
7677                1u16 => BondAdInfoAttrs::Aggregator({
7678                    let res = parse_u16(next);
7679                    let Some(val) = res else { break };
7680                    val
7681                }),
7682                2u16 => BondAdInfoAttrs::NumPorts({
7683                    let res = parse_u16(next);
7684                    let Some(val) = res else { break };
7685                    val
7686                }),
7687                3u16 => BondAdInfoAttrs::ActorKey({
7688                    let res = parse_u16(next);
7689                    let Some(val) = res else { break };
7690                    val
7691                }),
7692                4u16 => BondAdInfoAttrs::PartnerKey({
7693                    let res = parse_u16(next);
7694                    let Some(val) = res else { break };
7695                    val
7696                }),
7697                5u16 => BondAdInfoAttrs::PartnerMac({
7698                    let res = Some(next);
7699                    let Some(val) = res else { break };
7700                    val
7701                }),
7702                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7703                n => continue,
7704            };
7705            return Some(Ok(res));
7706        }
7707        Some(Err(ErrorContext::new(
7708            "BondAdInfoAttrs",
7709            r#type.and_then(|t| BondAdInfoAttrs::attr_from_type(t)),
7710            self.orig_loc,
7711            self.buf.as_ptr().wrapping_add(pos) as usize,
7712        )))
7713    }
7714}
7715impl<'a> std::fmt::Debug for IterableBondAdInfoAttrs<'_> {
7716    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7717        let mut fmt = f.debug_struct("BondAdInfoAttrs");
7718        for attr in self.clone() {
7719            let attr = match attr {
7720                Ok(a) => a,
7721                Err(err) => {
7722                    fmt.finish()?;
7723                    f.write_str("Err(")?;
7724                    err.fmt(f)?;
7725                    return f.write_str(")");
7726                }
7727            };
7728            match attr {
7729                BondAdInfoAttrs::Aggregator(val) => fmt.field("Aggregator", &val),
7730                BondAdInfoAttrs::NumPorts(val) => fmt.field("NumPorts", &val),
7731                BondAdInfoAttrs::ActorKey(val) => fmt.field("ActorKey", &val),
7732                BondAdInfoAttrs::PartnerKey(val) => fmt.field("PartnerKey", &val),
7733                BondAdInfoAttrs::PartnerMac(val) => fmt.field("PartnerMac", &FormatMac(val)),
7734            };
7735        }
7736        fmt.finish()
7737    }
7738}
7739impl IterableBondAdInfoAttrs<'_> {
7740    pub fn lookup_attr(
7741        &self,
7742        offset: usize,
7743        missing_type: Option<u16>,
7744    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7745        let mut stack = Vec::new();
7746        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7747        if missing_type.is_some() && cur == offset {
7748            stack.push(("BondAdInfoAttrs", offset));
7749            return (
7750                stack,
7751                missing_type.and_then(|t| BondAdInfoAttrs::attr_from_type(t)),
7752            );
7753        }
7754        if cur > offset || cur + self.buf.len() < offset {
7755            return (stack, None);
7756        }
7757        let mut attrs = self.clone();
7758        let mut last_off = cur + attrs.pos;
7759        while let Some(attr) = attrs.next() {
7760            let Ok(attr) = attr else { break };
7761            match attr {
7762                BondAdInfoAttrs::Aggregator(val) => {
7763                    if last_off == offset {
7764                        stack.push(("Aggregator", last_off));
7765                        break;
7766                    }
7767                }
7768                BondAdInfoAttrs::NumPorts(val) => {
7769                    if last_off == offset {
7770                        stack.push(("NumPorts", last_off));
7771                        break;
7772                    }
7773                }
7774                BondAdInfoAttrs::ActorKey(val) => {
7775                    if last_off == offset {
7776                        stack.push(("ActorKey", last_off));
7777                        break;
7778                    }
7779                }
7780                BondAdInfoAttrs::PartnerKey(val) => {
7781                    if last_off == offset {
7782                        stack.push(("PartnerKey", last_off));
7783                        break;
7784                    }
7785                }
7786                BondAdInfoAttrs::PartnerMac(val) => {
7787                    if last_off == offset {
7788                        stack.push(("PartnerMac", last_off));
7789                        break;
7790                    }
7791                }
7792                _ => {}
7793            };
7794            last_off = cur + attrs.pos;
7795        }
7796        if !stack.is_empty() {
7797            stack.push(("BondAdInfoAttrs", cur));
7798        }
7799        (stack, None)
7800    }
7801}
7802#[derive(Clone)]
7803pub enum BondSlaveAttrs<'a> {
7804    State(u8),
7805    MiiStatus(u8),
7806    LinkFailureCount(u32),
7807    PermHwaddr(&'a [u8]),
7808    QueueId(u16),
7809    AdAggregatorId(u16),
7810    AdActorOperPortState(u8),
7811    AdPartnerOperPortState(u16),
7812    Prio(u32),
7813}
7814impl<'a> IterableBondSlaveAttrs<'a> {
7815    pub fn get_state(&self) -> Result<u8, ErrorContext> {
7816        let mut iter = self.clone();
7817        iter.pos = 0;
7818        for attr in iter {
7819            if let Ok(BondSlaveAttrs::State(val)) = attr {
7820                return Ok(val);
7821            }
7822        }
7823        Err(ErrorContext::new_missing(
7824            "BondSlaveAttrs",
7825            "State",
7826            self.orig_loc,
7827            self.buf.as_ptr() as usize,
7828        ))
7829    }
7830    pub fn get_mii_status(&self) -> Result<u8, ErrorContext> {
7831        let mut iter = self.clone();
7832        iter.pos = 0;
7833        for attr in iter {
7834            if let Ok(BondSlaveAttrs::MiiStatus(val)) = attr {
7835                return Ok(val);
7836            }
7837        }
7838        Err(ErrorContext::new_missing(
7839            "BondSlaveAttrs",
7840            "MiiStatus",
7841            self.orig_loc,
7842            self.buf.as_ptr() as usize,
7843        ))
7844    }
7845    pub fn get_link_failure_count(&self) -> Result<u32, ErrorContext> {
7846        let mut iter = self.clone();
7847        iter.pos = 0;
7848        for attr in iter {
7849            if let Ok(BondSlaveAttrs::LinkFailureCount(val)) = attr {
7850                return Ok(val);
7851            }
7852        }
7853        Err(ErrorContext::new_missing(
7854            "BondSlaveAttrs",
7855            "LinkFailureCount",
7856            self.orig_loc,
7857            self.buf.as_ptr() as usize,
7858        ))
7859    }
7860    pub fn get_perm_hwaddr(&self) -> Result<&'a [u8], ErrorContext> {
7861        let mut iter = self.clone();
7862        iter.pos = 0;
7863        for attr in iter {
7864            if let Ok(BondSlaveAttrs::PermHwaddr(val)) = attr {
7865                return Ok(val);
7866            }
7867        }
7868        Err(ErrorContext::new_missing(
7869            "BondSlaveAttrs",
7870            "PermHwaddr",
7871            self.orig_loc,
7872            self.buf.as_ptr() as usize,
7873        ))
7874    }
7875    pub fn get_queue_id(&self) -> Result<u16, ErrorContext> {
7876        let mut iter = self.clone();
7877        iter.pos = 0;
7878        for attr in iter {
7879            if let Ok(BondSlaveAttrs::QueueId(val)) = attr {
7880                return Ok(val);
7881            }
7882        }
7883        Err(ErrorContext::new_missing(
7884            "BondSlaveAttrs",
7885            "QueueId",
7886            self.orig_loc,
7887            self.buf.as_ptr() as usize,
7888        ))
7889    }
7890    pub fn get_ad_aggregator_id(&self) -> Result<u16, ErrorContext> {
7891        let mut iter = self.clone();
7892        iter.pos = 0;
7893        for attr in iter {
7894            if let Ok(BondSlaveAttrs::AdAggregatorId(val)) = attr {
7895                return Ok(val);
7896            }
7897        }
7898        Err(ErrorContext::new_missing(
7899            "BondSlaveAttrs",
7900            "AdAggregatorId",
7901            self.orig_loc,
7902            self.buf.as_ptr() as usize,
7903        ))
7904    }
7905    pub fn get_ad_actor_oper_port_state(&self) -> Result<u8, ErrorContext> {
7906        let mut iter = self.clone();
7907        iter.pos = 0;
7908        for attr in iter {
7909            if let Ok(BondSlaveAttrs::AdActorOperPortState(val)) = attr {
7910                return Ok(val);
7911            }
7912        }
7913        Err(ErrorContext::new_missing(
7914            "BondSlaveAttrs",
7915            "AdActorOperPortState",
7916            self.orig_loc,
7917            self.buf.as_ptr() as usize,
7918        ))
7919    }
7920    pub fn get_ad_partner_oper_port_state(&self) -> Result<u16, ErrorContext> {
7921        let mut iter = self.clone();
7922        iter.pos = 0;
7923        for attr in iter {
7924            if let Ok(BondSlaveAttrs::AdPartnerOperPortState(val)) = attr {
7925                return Ok(val);
7926            }
7927        }
7928        Err(ErrorContext::new_missing(
7929            "BondSlaveAttrs",
7930            "AdPartnerOperPortState",
7931            self.orig_loc,
7932            self.buf.as_ptr() as usize,
7933        ))
7934    }
7935    pub fn get_prio(&self) -> Result<u32, ErrorContext> {
7936        let mut iter = self.clone();
7937        iter.pos = 0;
7938        for attr in iter {
7939            if let Ok(BondSlaveAttrs::Prio(val)) = attr {
7940                return Ok(val);
7941            }
7942        }
7943        Err(ErrorContext::new_missing(
7944            "BondSlaveAttrs",
7945            "Prio",
7946            self.orig_loc,
7947            self.buf.as_ptr() as usize,
7948        ))
7949    }
7950}
7951impl BondSlaveAttrs<'_> {
7952    pub fn new<'a>(buf: &'a [u8]) -> IterableBondSlaveAttrs<'a> {
7953        IterableBondSlaveAttrs::with_loc(buf, buf.as_ptr() as usize)
7954    }
7955    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7956        let res = match r#type {
7957            1u16 => "State",
7958            2u16 => "MiiStatus",
7959            3u16 => "LinkFailureCount",
7960            4u16 => "PermHwaddr",
7961            5u16 => "QueueId",
7962            6u16 => "AdAggregatorId",
7963            7u16 => "AdActorOperPortState",
7964            8u16 => "AdPartnerOperPortState",
7965            9u16 => "Prio",
7966            _ => return None,
7967        };
7968        Some(res)
7969    }
7970}
7971#[derive(Clone, Copy, Default)]
7972pub struct IterableBondSlaveAttrs<'a> {
7973    buf: &'a [u8],
7974    pos: usize,
7975    orig_loc: usize,
7976}
7977impl<'a> IterableBondSlaveAttrs<'a> {
7978    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7979        Self {
7980            buf,
7981            pos: 0,
7982            orig_loc,
7983        }
7984    }
7985    pub fn get_buf(&self) -> &'a [u8] {
7986        self.buf
7987    }
7988}
7989impl<'a> Iterator for IterableBondSlaveAttrs<'a> {
7990    type Item = Result<BondSlaveAttrs<'a>, ErrorContext>;
7991    fn next(&mut self) -> Option<Self::Item> {
7992        let mut pos;
7993        let mut r#type;
7994        loop {
7995            pos = self.pos;
7996            r#type = None;
7997            if self.buf.len() == self.pos {
7998                return None;
7999            }
8000            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8001                self.pos = self.buf.len();
8002                break;
8003            };
8004            r#type = Some(header.r#type);
8005            let res = match header.r#type {
8006                1u16 => BondSlaveAttrs::State({
8007                    let res = parse_u8(next);
8008                    let Some(val) = res else { break };
8009                    val
8010                }),
8011                2u16 => BondSlaveAttrs::MiiStatus({
8012                    let res = parse_u8(next);
8013                    let Some(val) = res else { break };
8014                    val
8015                }),
8016                3u16 => BondSlaveAttrs::LinkFailureCount({
8017                    let res = parse_u32(next);
8018                    let Some(val) = res else { break };
8019                    val
8020                }),
8021                4u16 => BondSlaveAttrs::PermHwaddr({
8022                    let res = Some(next);
8023                    let Some(val) = res else { break };
8024                    val
8025                }),
8026                5u16 => BondSlaveAttrs::QueueId({
8027                    let res = parse_u16(next);
8028                    let Some(val) = res else { break };
8029                    val
8030                }),
8031                6u16 => BondSlaveAttrs::AdAggregatorId({
8032                    let res = parse_u16(next);
8033                    let Some(val) = res else { break };
8034                    val
8035                }),
8036                7u16 => BondSlaveAttrs::AdActorOperPortState({
8037                    let res = parse_u8(next);
8038                    let Some(val) = res else { break };
8039                    val
8040                }),
8041                8u16 => BondSlaveAttrs::AdPartnerOperPortState({
8042                    let res = parse_u16(next);
8043                    let Some(val) = res else { break };
8044                    val
8045                }),
8046                9u16 => BondSlaveAttrs::Prio({
8047                    let res = parse_u32(next);
8048                    let Some(val) = res else { break };
8049                    val
8050                }),
8051                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8052                n => continue,
8053            };
8054            return Some(Ok(res));
8055        }
8056        Some(Err(ErrorContext::new(
8057            "BondSlaveAttrs",
8058            r#type.and_then(|t| BondSlaveAttrs::attr_from_type(t)),
8059            self.orig_loc,
8060            self.buf.as_ptr().wrapping_add(pos) as usize,
8061        )))
8062    }
8063}
8064impl<'a> std::fmt::Debug for IterableBondSlaveAttrs<'_> {
8065    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8066        let mut fmt = f.debug_struct("BondSlaveAttrs");
8067        for attr in self.clone() {
8068            let attr = match attr {
8069                Ok(a) => a,
8070                Err(err) => {
8071                    fmt.finish()?;
8072                    f.write_str("Err(")?;
8073                    err.fmt(f)?;
8074                    return f.write_str(")");
8075                }
8076            };
8077            match attr {
8078                BondSlaveAttrs::State(val) => fmt.field("State", &val),
8079                BondSlaveAttrs::MiiStatus(val) => fmt.field("MiiStatus", &val),
8080                BondSlaveAttrs::LinkFailureCount(val) => fmt.field("LinkFailureCount", &val),
8081                BondSlaveAttrs::PermHwaddr(val) => fmt.field("PermHwaddr", &FormatMac(val)),
8082                BondSlaveAttrs::QueueId(val) => fmt.field("QueueId", &val),
8083                BondSlaveAttrs::AdAggregatorId(val) => fmt.field("AdAggregatorId", &val),
8084                BondSlaveAttrs::AdActorOperPortState(val) => {
8085                    fmt.field("AdActorOperPortState", &val)
8086                }
8087                BondSlaveAttrs::AdPartnerOperPortState(val) => {
8088                    fmt.field("AdPartnerOperPortState", &val)
8089                }
8090                BondSlaveAttrs::Prio(val) => fmt.field("Prio", &val),
8091            };
8092        }
8093        fmt.finish()
8094    }
8095}
8096impl IterableBondSlaveAttrs<'_> {
8097    pub fn lookup_attr(
8098        &self,
8099        offset: usize,
8100        missing_type: Option<u16>,
8101    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8102        let mut stack = Vec::new();
8103        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8104        if missing_type.is_some() && cur == offset {
8105            stack.push(("BondSlaveAttrs", offset));
8106            return (
8107                stack,
8108                missing_type.and_then(|t| BondSlaveAttrs::attr_from_type(t)),
8109            );
8110        }
8111        if cur > offset || cur + self.buf.len() < offset {
8112            return (stack, None);
8113        }
8114        let mut attrs = self.clone();
8115        let mut last_off = cur + attrs.pos;
8116        while let Some(attr) = attrs.next() {
8117            let Ok(attr) = attr else { break };
8118            match attr {
8119                BondSlaveAttrs::State(val) => {
8120                    if last_off == offset {
8121                        stack.push(("State", last_off));
8122                        break;
8123                    }
8124                }
8125                BondSlaveAttrs::MiiStatus(val) => {
8126                    if last_off == offset {
8127                        stack.push(("MiiStatus", last_off));
8128                        break;
8129                    }
8130                }
8131                BondSlaveAttrs::LinkFailureCount(val) => {
8132                    if last_off == offset {
8133                        stack.push(("LinkFailureCount", last_off));
8134                        break;
8135                    }
8136                }
8137                BondSlaveAttrs::PermHwaddr(val) => {
8138                    if last_off == offset {
8139                        stack.push(("PermHwaddr", last_off));
8140                        break;
8141                    }
8142                }
8143                BondSlaveAttrs::QueueId(val) => {
8144                    if last_off == offset {
8145                        stack.push(("QueueId", last_off));
8146                        break;
8147                    }
8148                }
8149                BondSlaveAttrs::AdAggregatorId(val) => {
8150                    if last_off == offset {
8151                        stack.push(("AdAggregatorId", last_off));
8152                        break;
8153                    }
8154                }
8155                BondSlaveAttrs::AdActorOperPortState(val) => {
8156                    if last_off == offset {
8157                        stack.push(("AdActorOperPortState", last_off));
8158                        break;
8159                    }
8160                }
8161                BondSlaveAttrs::AdPartnerOperPortState(val) => {
8162                    if last_off == offset {
8163                        stack.push(("AdPartnerOperPortState", last_off));
8164                        break;
8165                    }
8166                }
8167                BondSlaveAttrs::Prio(val) => {
8168                    if last_off == offset {
8169                        stack.push(("Prio", last_off));
8170                        break;
8171                    }
8172                }
8173                _ => {}
8174            };
8175            last_off = cur + attrs.pos;
8176        }
8177        if !stack.is_empty() {
8178            stack.push(("BondSlaveAttrs", cur));
8179        }
8180        (stack, None)
8181    }
8182}
8183#[derive(Clone)]
8184pub enum LinkinfoBridgeAttrs<'a> {
8185    ForwardDelay(u32),
8186    HelloTime(u32),
8187    MaxAge(u32),
8188    AgeingTime(u32),
8189    StpState(u32),
8190    Priority(u16),
8191    VlanFiltering(u8),
8192    VlanProtocol(u16),
8193    GroupFwdMask(u16),
8194    RootId(IflaBridgeId),
8195    BridgeId(IflaBridgeId),
8196    RootPort(u16),
8197    RootPathCost(u32),
8198    TopologyChange(u8),
8199    TopologyChangeDetected(u8),
8200    HelloTimer(u64),
8201    TcnTimer(u64),
8202    TopologyChangeTimer(u64),
8203    GcTimer(u64),
8204    GroupAddr(&'a [u8]),
8205    FdbFlush(&'a [u8]),
8206    McastRouter(u8),
8207    McastSnooping(u8),
8208    McastQueryUseIfaddr(u8),
8209    McastQuerier(u8),
8210    McastHashElasticity(u32),
8211    McastHashMax(u32),
8212    McastLastMemberCnt(u32),
8213    McastStartupQueryCnt(u32),
8214    McastLastMemberIntvl(u64),
8215    McastMembershipIntvl(u64),
8216    McastQuerierIntvl(u64),
8217    McastQueryIntvl(u64),
8218    McastQueryResponseIntvl(u64),
8219    McastStartupQueryIntvl(u64),
8220    NfCallIptables(u8),
8221    NfCallIp6tables(u8),
8222    NfCallArptables(u8),
8223    VlanDefaultPvid(u16),
8224    Pad(&'a [u8]),
8225    VlanStatsEnabled(u8),
8226    McastStatsEnabled(u8),
8227    McastIgmpVersion(u8),
8228    McastMldVersion(u8),
8229    VlanStatsPerPort(u8),
8230    MultiBoolopt(BrBooloptMulti),
8231    McastQuerierState(&'a [u8]),
8232    FdbNLearned(u32),
8233    FdbMaxLearned(u32),
8234    #[doc = "Associated type: [`BrStpMode`] (enum)"]
8235    StpMode(u32),
8236}
8237impl<'a> IterableLinkinfoBridgeAttrs<'a> {
8238    pub fn get_forward_delay(&self) -> Result<u32, ErrorContext> {
8239        let mut iter = self.clone();
8240        iter.pos = 0;
8241        for attr in iter {
8242            if let Ok(LinkinfoBridgeAttrs::ForwardDelay(val)) = attr {
8243                return Ok(val);
8244            }
8245        }
8246        Err(ErrorContext::new_missing(
8247            "LinkinfoBridgeAttrs",
8248            "ForwardDelay",
8249            self.orig_loc,
8250            self.buf.as_ptr() as usize,
8251        ))
8252    }
8253    pub fn get_hello_time(&self) -> Result<u32, ErrorContext> {
8254        let mut iter = self.clone();
8255        iter.pos = 0;
8256        for attr in iter {
8257            if let Ok(LinkinfoBridgeAttrs::HelloTime(val)) = attr {
8258                return Ok(val);
8259            }
8260        }
8261        Err(ErrorContext::new_missing(
8262            "LinkinfoBridgeAttrs",
8263            "HelloTime",
8264            self.orig_loc,
8265            self.buf.as_ptr() as usize,
8266        ))
8267    }
8268    pub fn get_max_age(&self) -> Result<u32, ErrorContext> {
8269        let mut iter = self.clone();
8270        iter.pos = 0;
8271        for attr in iter {
8272            if let Ok(LinkinfoBridgeAttrs::MaxAge(val)) = attr {
8273                return Ok(val);
8274            }
8275        }
8276        Err(ErrorContext::new_missing(
8277            "LinkinfoBridgeAttrs",
8278            "MaxAge",
8279            self.orig_loc,
8280            self.buf.as_ptr() as usize,
8281        ))
8282    }
8283    pub fn get_ageing_time(&self) -> Result<u32, ErrorContext> {
8284        let mut iter = self.clone();
8285        iter.pos = 0;
8286        for attr in iter {
8287            if let Ok(LinkinfoBridgeAttrs::AgeingTime(val)) = attr {
8288                return Ok(val);
8289            }
8290        }
8291        Err(ErrorContext::new_missing(
8292            "LinkinfoBridgeAttrs",
8293            "AgeingTime",
8294            self.orig_loc,
8295            self.buf.as_ptr() as usize,
8296        ))
8297    }
8298    pub fn get_stp_state(&self) -> Result<u32, ErrorContext> {
8299        let mut iter = self.clone();
8300        iter.pos = 0;
8301        for attr in iter {
8302            if let Ok(LinkinfoBridgeAttrs::StpState(val)) = attr {
8303                return Ok(val);
8304            }
8305        }
8306        Err(ErrorContext::new_missing(
8307            "LinkinfoBridgeAttrs",
8308            "StpState",
8309            self.orig_loc,
8310            self.buf.as_ptr() as usize,
8311        ))
8312    }
8313    pub fn get_priority(&self) -> Result<u16, ErrorContext> {
8314        let mut iter = self.clone();
8315        iter.pos = 0;
8316        for attr in iter {
8317            if let Ok(LinkinfoBridgeAttrs::Priority(val)) = attr {
8318                return Ok(val);
8319            }
8320        }
8321        Err(ErrorContext::new_missing(
8322            "LinkinfoBridgeAttrs",
8323            "Priority",
8324            self.orig_loc,
8325            self.buf.as_ptr() as usize,
8326        ))
8327    }
8328    pub fn get_vlan_filtering(&self) -> Result<u8, ErrorContext> {
8329        let mut iter = self.clone();
8330        iter.pos = 0;
8331        for attr in iter {
8332            if let Ok(LinkinfoBridgeAttrs::VlanFiltering(val)) = attr {
8333                return Ok(val);
8334            }
8335        }
8336        Err(ErrorContext::new_missing(
8337            "LinkinfoBridgeAttrs",
8338            "VlanFiltering",
8339            self.orig_loc,
8340            self.buf.as_ptr() as usize,
8341        ))
8342    }
8343    pub fn get_vlan_protocol(&self) -> Result<u16, ErrorContext> {
8344        let mut iter = self.clone();
8345        iter.pos = 0;
8346        for attr in iter {
8347            if let Ok(LinkinfoBridgeAttrs::VlanProtocol(val)) = attr {
8348                return Ok(val);
8349            }
8350        }
8351        Err(ErrorContext::new_missing(
8352            "LinkinfoBridgeAttrs",
8353            "VlanProtocol",
8354            self.orig_loc,
8355            self.buf.as_ptr() as usize,
8356        ))
8357    }
8358    pub fn get_group_fwd_mask(&self) -> Result<u16, ErrorContext> {
8359        let mut iter = self.clone();
8360        iter.pos = 0;
8361        for attr in iter {
8362            if let Ok(LinkinfoBridgeAttrs::GroupFwdMask(val)) = attr {
8363                return Ok(val);
8364            }
8365        }
8366        Err(ErrorContext::new_missing(
8367            "LinkinfoBridgeAttrs",
8368            "GroupFwdMask",
8369            self.orig_loc,
8370            self.buf.as_ptr() as usize,
8371        ))
8372    }
8373    pub fn get_root_id(&self) -> Result<IflaBridgeId, ErrorContext> {
8374        let mut iter = self.clone();
8375        iter.pos = 0;
8376        for attr in iter {
8377            if let Ok(LinkinfoBridgeAttrs::RootId(val)) = attr {
8378                return Ok(val);
8379            }
8380        }
8381        Err(ErrorContext::new_missing(
8382            "LinkinfoBridgeAttrs",
8383            "RootId",
8384            self.orig_loc,
8385            self.buf.as_ptr() as usize,
8386        ))
8387    }
8388    pub fn get_bridge_id(&self) -> Result<IflaBridgeId, ErrorContext> {
8389        let mut iter = self.clone();
8390        iter.pos = 0;
8391        for attr in iter {
8392            if let Ok(LinkinfoBridgeAttrs::BridgeId(val)) = attr {
8393                return Ok(val);
8394            }
8395        }
8396        Err(ErrorContext::new_missing(
8397            "LinkinfoBridgeAttrs",
8398            "BridgeId",
8399            self.orig_loc,
8400            self.buf.as_ptr() as usize,
8401        ))
8402    }
8403    pub fn get_root_port(&self) -> Result<u16, ErrorContext> {
8404        let mut iter = self.clone();
8405        iter.pos = 0;
8406        for attr in iter {
8407            if let Ok(LinkinfoBridgeAttrs::RootPort(val)) = attr {
8408                return Ok(val);
8409            }
8410        }
8411        Err(ErrorContext::new_missing(
8412            "LinkinfoBridgeAttrs",
8413            "RootPort",
8414            self.orig_loc,
8415            self.buf.as_ptr() as usize,
8416        ))
8417    }
8418    pub fn get_root_path_cost(&self) -> Result<u32, ErrorContext> {
8419        let mut iter = self.clone();
8420        iter.pos = 0;
8421        for attr in iter {
8422            if let Ok(LinkinfoBridgeAttrs::RootPathCost(val)) = attr {
8423                return Ok(val);
8424            }
8425        }
8426        Err(ErrorContext::new_missing(
8427            "LinkinfoBridgeAttrs",
8428            "RootPathCost",
8429            self.orig_loc,
8430            self.buf.as_ptr() as usize,
8431        ))
8432    }
8433    pub fn get_topology_change(&self) -> Result<u8, ErrorContext> {
8434        let mut iter = self.clone();
8435        iter.pos = 0;
8436        for attr in iter {
8437            if let Ok(LinkinfoBridgeAttrs::TopologyChange(val)) = attr {
8438                return Ok(val);
8439            }
8440        }
8441        Err(ErrorContext::new_missing(
8442            "LinkinfoBridgeAttrs",
8443            "TopologyChange",
8444            self.orig_loc,
8445            self.buf.as_ptr() as usize,
8446        ))
8447    }
8448    pub fn get_topology_change_detected(&self) -> Result<u8, ErrorContext> {
8449        let mut iter = self.clone();
8450        iter.pos = 0;
8451        for attr in iter {
8452            if let Ok(LinkinfoBridgeAttrs::TopologyChangeDetected(val)) = attr {
8453                return Ok(val);
8454            }
8455        }
8456        Err(ErrorContext::new_missing(
8457            "LinkinfoBridgeAttrs",
8458            "TopologyChangeDetected",
8459            self.orig_loc,
8460            self.buf.as_ptr() as usize,
8461        ))
8462    }
8463    pub fn get_hello_timer(&self) -> Result<u64, ErrorContext> {
8464        let mut iter = self.clone();
8465        iter.pos = 0;
8466        for attr in iter {
8467            if let Ok(LinkinfoBridgeAttrs::HelloTimer(val)) = attr {
8468                return Ok(val);
8469            }
8470        }
8471        Err(ErrorContext::new_missing(
8472            "LinkinfoBridgeAttrs",
8473            "HelloTimer",
8474            self.orig_loc,
8475            self.buf.as_ptr() as usize,
8476        ))
8477    }
8478    pub fn get_tcn_timer(&self) -> Result<u64, ErrorContext> {
8479        let mut iter = self.clone();
8480        iter.pos = 0;
8481        for attr in iter {
8482            if let Ok(LinkinfoBridgeAttrs::TcnTimer(val)) = attr {
8483                return Ok(val);
8484            }
8485        }
8486        Err(ErrorContext::new_missing(
8487            "LinkinfoBridgeAttrs",
8488            "TcnTimer",
8489            self.orig_loc,
8490            self.buf.as_ptr() as usize,
8491        ))
8492    }
8493    pub fn get_topology_change_timer(&self) -> Result<u64, ErrorContext> {
8494        let mut iter = self.clone();
8495        iter.pos = 0;
8496        for attr in iter {
8497            if let Ok(LinkinfoBridgeAttrs::TopologyChangeTimer(val)) = attr {
8498                return Ok(val);
8499            }
8500        }
8501        Err(ErrorContext::new_missing(
8502            "LinkinfoBridgeAttrs",
8503            "TopologyChangeTimer",
8504            self.orig_loc,
8505            self.buf.as_ptr() as usize,
8506        ))
8507    }
8508    pub fn get_gc_timer(&self) -> Result<u64, ErrorContext> {
8509        let mut iter = self.clone();
8510        iter.pos = 0;
8511        for attr in iter {
8512            if let Ok(LinkinfoBridgeAttrs::GcTimer(val)) = attr {
8513                return Ok(val);
8514            }
8515        }
8516        Err(ErrorContext::new_missing(
8517            "LinkinfoBridgeAttrs",
8518            "GcTimer",
8519            self.orig_loc,
8520            self.buf.as_ptr() as usize,
8521        ))
8522    }
8523    pub fn get_group_addr(&self) -> Result<&'a [u8], ErrorContext> {
8524        let mut iter = self.clone();
8525        iter.pos = 0;
8526        for attr in iter {
8527            if let Ok(LinkinfoBridgeAttrs::GroupAddr(val)) = attr {
8528                return Ok(val);
8529            }
8530        }
8531        Err(ErrorContext::new_missing(
8532            "LinkinfoBridgeAttrs",
8533            "GroupAddr",
8534            self.orig_loc,
8535            self.buf.as_ptr() as usize,
8536        ))
8537    }
8538    pub fn get_fdb_flush(&self) -> Result<&'a [u8], ErrorContext> {
8539        let mut iter = self.clone();
8540        iter.pos = 0;
8541        for attr in iter {
8542            if let Ok(LinkinfoBridgeAttrs::FdbFlush(val)) = attr {
8543                return Ok(val);
8544            }
8545        }
8546        Err(ErrorContext::new_missing(
8547            "LinkinfoBridgeAttrs",
8548            "FdbFlush",
8549            self.orig_loc,
8550            self.buf.as_ptr() as usize,
8551        ))
8552    }
8553    pub fn get_mcast_router(&self) -> Result<u8, ErrorContext> {
8554        let mut iter = self.clone();
8555        iter.pos = 0;
8556        for attr in iter {
8557            if let Ok(LinkinfoBridgeAttrs::McastRouter(val)) = attr {
8558                return Ok(val);
8559            }
8560        }
8561        Err(ErrorContext::new_missing(
8562            "LinkinfoBridgeAttrs",
8563            "McastRouter",
8564            self.orig_loc,
8565            self.buf.as_ptr() as usize,
8566        ))
8567    }
8568    pub fn get_mcast_snooping(&self) -> Result<u8, ErrorContext> {
8569        let mut iter = self.clone();
8570        iter.pos = 0;
8571        for attr in iter {
8572            if let Ok(LinkinfoBridgeAttrs::McastSnooping(val)) = attr {
8573                return Ok(val);
8574            }
8575        }
8576        Err(ErrorContext::new_missing(
8577            "LinkinfoBridgeAttrs",
8578            "McastSnooping",
8579            self.orig_loc,
8580            self.buf.as_ptr() as usize,
8581        ))
8582    }
8583    pub fn get_mcast_query_use_ifaddr(&self) -> Result<u8, ErrorContext> {
8584        let mut iter = self.clone();
8585        iter.pos = 0;
8586        for attr in iter {
8587            if let Ok(LinkinfoBridgeAttrs::McastQueryUseIfaddr(val)) = attr {
8588                return Ok(val);
8589            }
8590        }
8591        Err(ErrorContext::new_missing(
8592            "LinkinfoBridgeAttrs",
8593            "McastQueryUseIfaddr",
8594            self.orig_loc,
8595            self.buf.as_ptr() as usize,
8596        ))
8597    }
8598    pub fn get_mcast_querier(&self) -> Result<u8, ErrorContext> {
8599        let mut iter = self.clone();
8600        iter.pos = 0;
8601        for attr in iter {
8602            if let Ok(LinkinfoBridgeAttrs::McastQuerier(val)) = attr {
8603                return Ok(val);
8604            }
8605        }
8606        Err(ErrorContext::new_missing(
8607            "LinkinfoBridgeAttrs",
8608            "McastQuerier",
8609            self.orig_loc,
8610            self.buf.as_ptr() as usize,
8611        ))
8612    }
8613    pub fn get_mcast_hash_elasticity(&self) -> Result<u32, ErrorContext> {
8614        let mut iter = self.clone();
8615        iter.pos = 0;
8616        for attr in iter {
8617            if let Ok(LinkinfoBridgeAttrs::McastHashElasticity(val)) = attr {
8618                return Ok(val);
8619            }
8620        }
8621        Err(ErrorContext::new_missing(
8622            "LinkinfoBridgeAttrs",
8623            "McastHashElasticity",
8624            self.orig_loc,
8625            self.buf.as_ptr() as usize,
8626        ))
8627    }
8628    pub fn get_mcast_hash_max(&self) -> Result<u32, ErrorContext> {
8629        let mut iter = self.clone();
8630        iter.pos = 0;
8631        for attr in iter {
8632            if let Ok(LinkinfoBridgeAttrs::McastHashMax(val)) = attr {
8633                return Ok(val);
8634            }
8635        }
8636        Err(ErrorContext::new_missing(
8637            "LinkinfoBridgeAttrs",
8638            "McastHashMax",
8639            self.orig_loc,
8640            self.buf.as_ptr() as usize,
8641        ))
8642    }
8643    pub fn get_mcast_last_member_cnt(&self) -> Result<u32, ErrorContext> {
8644        let mut iter = self.clone();
8645        iter.pos = 0;
8646        for attr in iter {
8647            if let Ok(LinkinfoBridgeAttrs::McastLastMemberCnt(val)) = attr {
8648                return Ok(val);
8649            }
8650        }
8651        Err(ErrorContext::new_missing(
8652            "LinkinfoBridgeAttrs",
8653            "McastLastMemberCnt",
8654            self.orig_loc,
8655            self.buf.as_ptr() as usize,
8656        ))
8657    }
8658    pub fn get_mcast_startup_query_cnt(&self) -> Result<u32, ErrorContext> {
8659        let mut iter = self.clone();
8660        iter.pos = 0;
8661        for attr in iter {
8662            if let Ok(LinkinfoBridgeAttrs::McastStartupQueryCnt(val)) = attr {
8663                return Ok(val);
8664            }
8665        }
8666        Err(ErrorContext::new_missing(
8667            "LinkinfoBridgeAttrs",
8668            "McastStartupQueryCnt",
8669            self.orig_loc,
8670            self.buf.as_ptr() as usize,
8671        ))
8672    }
8673    pub fn get_mcast_last_member_intvl(&self) -> Result<u64, ErrorContext> {
8674        let mut iter = self.clone();
8675        iter.pos = 0;
8676        for attr in iter {
8677            if let Ok(LinkinfoBridgeAttrs::McastLastMemberIntvl(val)) = attr {
8678                return Ok(val);
8679            }
8680        }
8681        Err(ErrorContext::new_missing(
8682            "LinkinfoBridgeAttrs",
8683            "McastLastMemberIntvl",
8684            self.orig_loc,
8685            self.buf.as_ptr() as usize,
8686        ))
8687    }
8688    pub fn get_mcast_membership_intvl(&self) -> Result<u64, ErrorContext> {
8689        let mut iter = self.clone();
8690        iter.pos = 0;
8691        for attr in iter {
8692            if let Ok(LinkinfoBridgeAttrs::McastMembershipIntvl(val)) = attr {
8693                return Ok(val);
8694            }
8695        }
8696        Err(ErrorContext::new_missing(
8697            "LinkinfoBridgeAttrs",
8698            "McastMembershipIntvl",
8699            self.orig_loc,
8700            self.buf.as_ptr() as usize,
8701        ))
8702    }
8703    pub fn get_mcast_querier_intvl(&self) -> Result<u64, ErrorContext> {
8704        let mut iter = self.clone();
8705        iter.pos = 0;
8706        for attr in iter {
8707            if let Ok(LinkinfoBridgeAttrs::McastQuerierIntvl(val)) = attr {
8708                return Ok(val);
8709            }
8710        }
8711        Err(ErrorContext::new_missing(
8712            "LinkinfoBridgeAttrs",
8713            "McastQuerierIntvl",
8714            self.orig_loc,
8715            self.buf.as_ptr() as usize,
8716        ))
8717    }
8718    pub fn get_mcast_query_intvl(&self) -> Result<u64, ErrorContext> {
8719        let mut iter = self.clone();
8720        iter.pos = 0;
8721        for attr in iter {
8722            if let Ok(LinkinfoBridgeAttrs::McastQueryIntvl(val)) = attr {
8723                return Ok(val);
8724            }
8725        }
8726        Err(ErrorContext::new_missing(
8727            "LinkinfoBridgeAttrs",
8728            "McastQueryIntvl",
8729            self.orig_loc,
8730            self.buf.as_ptr() as usize,
8731        ))
8732    }
8733    pub fn get_mcast_query_response_intvl(&self) -> Result<u64, ErrorContext> {
8734        let mut iter = self.clone();
8735        iter.pos = 0;
8736        for attr in iter {
8737            if let Ok(LinkinfoBridgeAttrs::McastQueryResponseIntvl(val)) = attr {
8738                return Ok(val);
8739            }
8740        }
8741        Err(ErrorContext::new_missing(
8742            "LinkinfoBridgeAttrs",
8743            "McastQueryResponseIntvl",
8744            self.orig_loc,
8745            self.buf.as_ptr() as usize,
8746        ))
8747    }
8748    pub fn get_mcast_startup_query_intvl(&self) -> Result<u64, ErrorContext> {
8749        let mut iter = self.clone();
8750        iter.pos = 0;
8751        for attr in iter {
8752            if let Ok(LinkinfoBridgeAttrs::McastStartupQueryIntvl(val)) = attr {
8753                return Ok(val);
8754            }
8755        }
8756        Err(ErrorContext::new_missing(
8757            "LinkinfoBridgeAttrs",
8758            "McastStartupQueryIntvl",
8759            self.orig_loc,
8760            self.buf.as_ptr() as usize,
8761        ))
8762    }
8763    pub fn get_nf_call_iptables(&self) -> Result<u8, ErrorContext> {
8764        let mut iter = self.clone();
8765        iter.pos = 0;
8766        for attr in iter {
8767            if let Ok(LinkinfoBridgeAttrs::NfCallIptables(val)) = attr {
8768                return Ok(val);
8769            }
8770        }
8771        Err(ErrorContext::new_missing(
8772            "LinkinfoBridgeAttrs",
8773            "NfCallIptables",
8774            self.orig_loc,
8775            self.buf.as_ptr() as usize,
8776        ))
8777    }
8778    pub fn get_nf_call_ip6tables(&self) -> Result<u8, ErrorContext> {
8779        let mut iter = self.clone();
8780        iter.pos = 0;
8781        for attr in iter {
8782            if let Ok(LinkinfoBridgeAttrs::NfCallIp6tables(val)) = attr {
8783                return Ok(val);
8784            }
8785        }
8786        Err(ErrorContext::new_missing(
8787            "LinkinfoBridgeAttrs",
8788            "NfCallIp6tables",
8789            self.orig_loc,
8790            self.buf.as_ptr() as usize,
8791        ))
8792    }
8793    pub fn get_nf_call_arptables(&self) -> Result<u8, ErrorContext> {
8794        let mut iter = self.clone();
8795        iter.pos = 0;
8796        for attr in iter {
8797            if let Ok(LinkinfoBridgeAttrs::NfCallArptables(val)) = attr {
8798                return Ok(val);
8799            }
8800        }
8801        Err(ErrorContext::new_missing(
8802            "LinkinfoBridgeAttrs",
8803            "NfCallArptables",
8804            self.orig_loc,
8805            self.buf.as_ptr() as usize,
8806        ))
8807    }
8808    pub fn get_vlan_default_pvid(&self) -> Result<u16, ErrorContext> {
8809        let mut iter = self.clone();
8810        iter.pos = 0;
8811        for attr in iter {
8812            if let Ok(LinkinfoBridgeAttrs::VlanDefaultPvid(val)) = attr {
8813                return Ok(val);
8814            }
8815        }
8816        Err(ErrorContext::new_missing(
8817            "LinkinfoBridgeAttrs",
8818            "VlanDefaultPvid",
8819            self.orig_loc,
8820            self.buf.as_ptr() as usize,
8821        ))
8822    }
8823    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
8824        let mut iter = self.clone();
8825        iter.pos = 0;
8826        for attr in iter {
8827            if let Ok(LinkinfoBridgeAttrs::Pad(val)) = attr {
8828                return Ok(val);
8829            }
8830        }
8831        Err(ErrorContext::new_missing(
8832            "LinkinfoBridgeAttrs",
8833            "Pad",
8834            self.orig_loc,
8835            self.buf.as_ptr() as usize,
8836        ))
8837    }
8838    pub fn get_vlan_stats_enabled(&self) -> Result<u8, ErrorContext> {
8839        let mut iter = self.clone();
8840        iter.pos = 0;
8841        for attr in iter {
8842            if let Ok(LinkinfoBridgeAttrs::VlanStatsEnabled(val)) = attr {
8843                return Ok(val);
8844            }
8845        }
8846        Err(ErrorContext::new_missing(
8847            "LinkinfoBridgeAttrs",
8848            "VlanStatsEnabled",
8849            self.orig_loc,
8850            self.buf.as_ptr() as usize,
8851        ))
8852    }
8853    pub fn get_mcast_stats_enabled(&self) -> Result<u8, ErrorContext> {
8854        let mut iter = self.clone();
8855        iter.pos = 0;
8856        for attr in iter {
8857            if let Ok(LinkinfoBridgeAttrs::McastStatsEnabled(val)) = attr {
8858                return Ok(val);
8859            }
8860        }
8861        Err(ErrorContext::new_missing(
8862            "LinkinfoBridgeAttrs",
8863            "McastStatsEnabled",
8864            self.orig_loc,
8865            self.buf.as_ptr() as usize,
8866        ))
8867    }
8868    pub fn get_mcast_igmp_version(&self) -> Result<u8, ErrorContext> {
8869        let mut iter = self.clone();
8870        iter.pos = 0;
8871        for attr in iter {
8872            if let Ok(LinkinfoBridgeAttrs::McastIgmpVersion(val)) = attr {
8873                return Ok(val);
8874            }
8875        }
8876        Err(ErrorContext::new_missing(
8877            "LinkinfoBridgeAttrs",
8878            "McastIgmpVersion",
8879            self.orig_loc,
8880            self.buf.as_ptr() as usize,
8881        ))
8882    }
8883    pub fn get_mcast_mld_version(&self) -> Result<u8, ErrorContext> {
8884        let mut iter = self.clone();
8885        iter.pos = 0;
8886        for attr in iter {
8887            if let Ok(LinkinfoBridgeAttrs::McastMldVersion(val)) = attr {
8888                return Ok(val);
8889            }
8890        }
8891        Err(ErrorContext::new_missing(
8892            "LinkinfoBridgeAttrs",
8893            "McastMldVersion",
8894            self.orig_loc,
8895            self.buf.as_ptr() as usize,
8896        ))
8897    }
8898    pub fn get_vlan_stats_per_port(&self) -> Result<u8, ErrorContext> {
8899        let mut iter = self.clone();
8900        iter.pos = 0;
8901        for attr in iter {
8902            if let Ok(LinkinfoBridgeAttrs::VlanStatsPerPort(val)) = attr {
8903                return Ok(val);
8904            }
8905        }
8906        Err(ErrorContext::new_missing(
8907            "LinkinfoBridgeAttrs",
8908            "VlanStatsPerPort",
8909            self.orig_loc,
8910            self.buf.as_ptr() as usize,
8911        ))
8912    }
8913    pub fn get_multi_boolopt(&self) -> Result<BrBooloptMulti, ErrorContext> {
8914        let mut iter = self.clone();
8915        iter.pos = 0;
8916        for attr in iter {
8917            if let Ok(LinkinfoBridgeAttrs::MultiBoolopt(val)) = attr {
8918                return Ok(val);
8919            }
8920        }
8921        Err(ErrorContext::new_missing(
8922            "LinkinfoBridgeAttrs",
8923            "MultiBoolopt",
8924            self.orig_loc,
8925            self.buf.as_ptr() as usize,
8926        ))
8927    }
8928    pub fn get_mcast_querier_state(&self) -> Result<&'a [u8], ErrorContext> {
8929        let mut iter = self.clone();
8930        iter.pos = 0;
8931        for attr in iter {
8932            if let Ok(LinkinfoBridgeAttrs::McastQuerierState(val)) = attr {
8933                return Ok(val);
8934            }
8935        }
8936        Err(ErrorContext::new_missing(
8937            "LinkinfoBridgeAttrs",
8938            "McastQuerierState",
8939            self.orig_loc,
8940            self.buf.as_ptr() as usize,
8941        ))
8942    }
8943    pub fn get_fdb_n_learned(&self) -> Result<u32, ErrorContext> {
8944        let mut iter = self.clone();
8945        iter.pos = 0;
8946        for attr in iter {
8947            if let Ok(LinkinfoBridgeAttrs::FdbNLearned(val)) = attr {
8948                return Ok(val);
8949            }
8950        }
8951        Err(ErrorContext::new_missing(
8952            "LinkinfoBridgeAttrs",
8953            "FdbNLearned",
8954            self.orig_loc,
8955            self.buf.as_ptr() as usize,
8956        ))
8957    }
8958    pub fn get_fdb_max_learned(&self) -> Result<u32, ErrorContext> {
8959        let mut iter = self.clone();
8960        iter.pos = 0;
8961        for attr in iter {
8962            if let Ok(LinkinfoBridgeAttrs::FdbMaxLearned(val)) = attr {
8963                return Ok(val);
8964            }
8965        }
8966        Err(ErrorContext::new_missing(
8967            "LinkinfoBridgeAttrs",
8968            "FdbMaxLearned",
8969            self.orig_loc,
8970            self.buf.as_ptr() as usize,
8971        ))
8972    }
8973    #[doc = "Associated type: [`BrStpMode`] (enum)"]
8974    pub fn get_stp_mode(&self) -> Result<u32, ErrorContext> {
8975        let mut iter = self.clone();
8976        iter.pos = 0;
8977        for attr in iter {
8978            if let Ok(LinkinfoBridgeAttrs::StpMode(val)) = attr {
8979                return Ok(val);
8980            }
8981        }
8982        Err(ErrorContext::new_missing(
8983            "LinkinfoBridgeAttrs",
8984            "StpMode",
8985            self.orig_loc,
8986            self.buf.as_ptr() as usize,
8987        ))
8988    }
8989}
8990impl LinkinfoBridgeAttrs<'_> {
8991    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoBridgeAttrs<'a> {
8992        IterableLinkinfoBridgeAttrs::with_loc(buf, buf.as_ptr() as usize)
8993    }
8994    fn attr_from_type(r#type: u16) -> Option<&'static str> {
8995        let res = match r#type {
8996            1u16 => "ForwardDelay",
8997            2u16 => "HelloTime",
8998            3u16 => "MaxAge",
8999            4u16 => "AgeingTime",
9000            5u16 => "StpState",
9001            6u16 => "Priority",
9002            7u16 => "VlanFiltering",
9003            8u16 => "VlanProtocol",
9004            9u16 => "GroupFwdMask",
9005            10u16 => "RootId",
9006            11u16 => "BridgeId",
9007            12u16 => "RootPort",
9008            13u16 => "RootPathCost",
9009            14u16 => "TopologyChange",
9010            15u16 => "TopologyChangeDetected",
9011            16u16 => "HelloTimer",
9012            17u16 => "TcnTimer",
9013            18u16 => "TopologyChangeTimer",
9014            19u16 => "GcTimer",
9015            20u16 => "GroupAddr",
9016            21u16 => "FdbFlush",
9017            22u16 => "McastRouter",
9018            23u16 => "McastSnooping",
9019            24u16 => "McastQueryUseIfaddr",
9020            25u16 => "McastQuerier",
9021            26u16 => "McastHashElasticity",
9022            27u16 => "McastHashMax",
9023            28u16 => "McastLastMemberCnt",
9024            29u16 => "McastStartupQueryCnt",
9025            30u16 => "McastLastMemberIntvl",
9026            31u16 => "McastMembershipIntvl",
9027            32u16 => "McastQuerierIntvl",
9028            33u16 => "McastQueryIntvl",
9029            34u16 => "McastQueryResponseIntvl",
9030            35u16 => "McastStartupQueryIntvl",
9031            36u16 => "NfCallIptables",
9032            37u16 => "NfCallIp6tables",
9033            38u16 => "NfCallArptables",
9034            39u16 => "VlanDefaultPvid",
9035            40u16 => "Pad",
9036            41u16 => "VlanStatsEnabled",
9037            42u16 => "McastStatsEnabled",
9038            43u16 => "McastIgmpVersion",
9039            44u16 => "McastMldVersion",
9040            45u16 => "VlanStatsPerPort",
9041            46u16 => "MultiBoolopt",
9042            47u16 => "McastQuerierState",
9043            48u16 => "FdbNLearned",
9044            49u16 => "FdbMaxLearned",
9045            50u16 => "StpMode",
9046            _ => return None,
9047        };
9048        Some(res)
9049    }
9050}
9051#[derive(Clone, Copy, Default)]
9052pub struct IterableLinkinfoBridgeAttrs<'a> {
9053    buf: &'a [u8],
9054    pos: usize,
9055    orig_loc: usize,
9056}
9057impl<'a> IterableLinkinfoBridgeAttrs<'a> {
9058    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9059        Self {
9060            buf,
9061            pos: 0,
9062            orig_loc,
9063        }
9064    }
9065    pub fn get_buf(&self) -> &'a [u8] {
9066        self.buf
9067    }
9068}
9069impl<'a> Iterator for IterableLinkinfoBridgeAttrs<'a> {
9070    type Item = Result<LinkinfoBridgeAttrs<'a>, ErrorContext>;
9071    fn next(&mut self) -> Option<Self::Item> {
9072        let mut pos;
9073        let mut r#type;
9074        loop {
9075            pos = self.pos;
9076            r#type = None;
9077            if self.buf.len() == self.pos {
9078                return None;
9079            }
9080            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9081                self.pos = self.buf.len();
9082                break;
9083            };
9084            r#type = Some(header.r#type);
9085            let res = match header.r#type {
9086                1u16 => LinkinfoBridgeAttrs::ForwardDelay({
9087                    let res = parse_u32(next);
9088                    let Some(val) = res else { break };
9089                    val
9090                }),
9091                2u16 => LinkinfoBridgeAttrs::HelloTime({
9092                    let res = parse_u32(next);
9093                    let Some(val) = res else { break };
9094                    val
9095                }),
9096                3u16 => LinkinfoBridgeAttrs::MaxAge({
9097                    let res = parse_u32(next);
9098                    let Some(val) = res else { break };
9099                    val
9100                }),
9101                4u16 => LinkinfoBridgeAttrs::AgeingTime({
9102                    let res = parse_u32(next);
9103                    let Some(val) = res else { break };
9104                    val
9105                }),
9106                5u16 => LinkinfoBridgeAttrs::StpState({
9107                    let res = parse_u32(next);
9108                    let Some(val) = res else { break };
9109                    val
9110                }),
9111                6u16 => LinkinfoBridgeAttrs::Priority({
9112                    let res = parse_u16(next);
9113                    let Some(val) = res else { break };
9114                    val
9115                }),
9116                7u16 => LinkinfoBridgeAttrs::VlanFiltering({
9117                    let res = parse_u8(next);
9118                    let Some(val) = res else { break };
9119                    val
9120                }),
9121                8u16 => LinkinfoBridgeAttrs::VlanProtocol({
9122                    let res = parse_u16(next);
9123                    let Some(val) = res else { break };
9124                    val
9125                }),
9126                9u16 => LinkinfoBridgeAttrs::GroupFwdMask({
9127                    let res = parse_u16(next);
9128                    let Some(val) = res else { break };
9129                    val
9130                }),
9131                10u16 => LinkinfoBridgeAttrs::RootId({
9132                    let res = Some(IflaBridgeId::new_from_zeroed(next));
9133                    let Some(val) = res else { break };
9134                    val
9135                }),
9136                11u16 => LinkinfoBridgeAttrs::BridgeId({
9137                    let res = Some(IflaBridgeId::new_from_zeroed(next));
9138                    let Some(val) = res else { break };
9139                    val
9140                }),
9141                12u16 => LinkinfoBridgeAttrs::RootPort({
9142                    let res = parse_u16(next);
9143                    let Some(val) = res else { break };
9144                    val
9145                }),
9146                13u16 => LinkinfoBridgeAttrs::RootPathCost({
9147                    let res = parse_u32(next);
9148                    let Some(val) = res else { break };
9149                    val
9150                }),
9151                14u16 => LinkinfoBridgeAttrs::TopologyChange({
9152                    let res = parse_u8(next);
9153                    let Some(val) = res else { break };
9154                    val
9155                }),
9156                15u16 => LinkinfoBridgeAttrs::TopologyChangeDetected({
9157                    let res = parse_u8(next);
9158                    let Some(val) = res else { break };
9159                    val
9160                }),
9161                16u16 => LinkinfoBridgeAttrs::HelloTimer({
9162                    let res = parse_u64(next);
9163                    let Some(val) = res else { break };
9164                    val
9165                }),
9166                17u16 => LinkinfoBridgeAttrs::TcnTimer({
9167                    let res = parse_u64(next);
9168                    let Some(val) = res else { break };
9169                    val
9170                }),
9171                18u16 => LinkinfoBridgeAttrs::TopologyChangeTimer({
9172                    let res = parse_u64(next);
9173                    let Some(val) = res else { break };
9174                    val
9175                }),
9176                19u16 => LinkinfoBridgeAttrs::GcTimer({
9177                    let res = parse_u64(next);
9178                    let Some(val) = res else { break };
9179                    val
9180                }),
9181                20u16 => LinkinfoBridgeAttrs::GroupAddr({
9182                    let res = Some(next);
9183                    let Some(val) = res else { break };
9184                    val
9185                }),
9186                21u16 => LinkinfoBridgeAttrs::FdbFlush({
9187                    let res = Some(next);
9188                    let Some(val) = res else { break };
9189                    val
9190                }),
9191                22u16 => LinkinfoBridgeAttrs::McastRouter({
9192                    let res = parse_u8(next);
9193                    let Some(val) = res else { break };
9194                    val
9195                }),
9196                23u16 => LinkinfoBridgeAttrs::McastSnooping({
9197                    let res = parse_u8(next);
9198                    let Some(val) = res else { break };
9199                    val
9200                }),
9201                24u16 => LinkinfoBridgeAttrs::McastQueryUseIfaddr({
9202                    let res = parse_u8(next);
9203                    let Some(val) = res else { break };
9204                    val
9205                }),
9206                25u16 => LinkinfoBridgeAttrs::McastQuerier({
9207                    let res = parse_u8(next);
9208                    let Some(val) = res else { break };
9209                    val
9210                }),
9211                26u16 => LinkinfoBridgeAttrs::McastHashElasticity({
9212                    let res = parse_u32(next);
9213                    let Some(val) = res else { break };
9214                    val
9215                }),
9216                27u16 => LinkinfoBridgeAttrs::McastHashMax({
9217                    let res = parse_u32(next);
9218                    let Some(val) = res else { break };
9219                    val
9220                }),
9221                28u16 => LinkinfoBridgeAttrs::McastLastMemberCnt({
9222                    let res = parse_u32(next);
9223                    let Some(val) = res else { break };
9224                    val
9225                }),
9226                29u16 => LinkinfoBridgeAttrs::McastStartupQueryCnt({
9227                    let res = parse_u32(next);
9228                    let Some(val) = res else { break };
9229                    val
9230                }),
9231                30u16 => LinkinfoBridgeAttrs::McastLastMemberIntvl({
9232                    let res = parse_u64(next);
9233                    let Some(val) = res else { break };
9234                    val
9235                }),
9236                31u16 => LinkinfoBridgeAttrs::McastMembershipIntvl({
9237                    let res = parse_u64(next);
9238                    let Some(val) = res else { break };
9239                    val
9240                }),
9241                32u16 => LinkinfoBridgeAttrs::McastQuerierIntvl({
9242                    let res = parse_u64(next);
9243                    let Some(val) = res else { break };
9244                    val
9245                }),
9246                33u16 => LinkinfoBridgeAttrs::McastQueryIntvl({
9247                    let res = parse_u64(next);
9248                    let Some(val) = res else { break };
9249                    val
9250                }),
9251                34u16 => LinkinfoBridgeAttrs::McastQueryResponseIntvl({
9252                    let res = parse_u64(next);
9253                    let Some(val) = res else { break };
9254                    val
9255                }),
9256                35u16 => LinkinfoBridgeAttrs::McastStartupQueryIntvl({
9257                    let res = parse_u64(next);
9258                    let Some(val) = res else { break };
9259                    val
9260                }),
9261                36u16 => LinkinfoBridgeAttrs::NfCallIptables({
9262                    let res = parse_u8(next);
9263                    let Some(val) = res else { break };
9264                    val
9265                }),
9266                37u16 => LinkinfoBridgeAttrs::NfCallIp6tables({
9267                    let res = parse_u8(next);
9268                    let Some(val) = res else { break };
9269                    val
9270                }),
9271                38u16 => LinkinfoBridgeAttrs::NfCallArptables({
9272                    let res = parse_u8(next);
9273                    let Some(val) = res else { break };
9274                    val
9275                }),
9276                39u16 => LinkinfoBridgeAttrs::VlanDefaultPvid({
9277                    let res = parse_u16(next);
9278                    let Some(val) = res else { break };
9279                    val
9280                }),
9281                40u16 => LinkinfoBridgeAttrs::Pad({
9282                    let res = Some(next);
9283                    let Some(val) = res else { break };
9284                    val
9285                }),
9286                41u16 => LinkinfoBridgeAttrs::VlanStatsEnabled({
9287                    let res = parse_u8(next);
9288                    let Some(val) = res else { break };
9289                    val
9290                }),
9291                42u16 => LinkinfoBridgeAttrs::McastStatsEnabled({
9292                    let res = parse_u8(next);
9293                    let Some(val) = res else { break };
9294                    val
9295                }),
9296                43u16 => LinkinfoBridgeAttrs::McastIgmpVersion({
9297                    let res = parse_u8(next);
9298                    let Some(val) = res else { break };
9299                    val
9300                }),
9301                44u16 => LinkinfoBridgeAttrs::McastMldVersion({
9302                    let res = parse_u8(next);
9303                    let Some(val) = res else { break };
9304                    val
9305                }),
9306                45u16 => LinkinfoBridgeAttrs::VlanStatsPerPort({
9307                    let res = parse_u8(next);
9308                    let Some(val) = res else { break };
9309                    val
9310                }),
9311                46u16 => LinkinfoBridgeAttrs::MultiBoolopt({
9312                    let res = Some(BrBooloptMulti::new_from_zeroed(next));
9313                    let Some(val) = res else { break };
9314                    val
9315                }),
9316                47u16 => LinkinfoBridgeAttrs::McastQuerierState({
9317                    let res = Some(next);
9318                    let Some(val) = res else { break };
9319                    val
9320                }),
9321                48u16 => LinkinfoBridgeAttrs::FdbNLearned({
9322                    let res = parse_u32(next);
9323                    let Some(val) = res else { break };
9324                    val
9325                }),
9326                49u16 => LinkinfoBridgeAttrs::FdbMaxLearned({
9327                    let res = parse_u32(next);
9328                    let Some(val) = res else { break };
9329                    val
9330                }),
9331                50u16 => LinkinfoBridgeAttrs::StpMode({
9332                    let res = parse_u32(next);
9333                    let Some(val) = res else { break };
9334                    val
9335                }),
9336                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9337                n => continue,
9338            };
9339            return Some(Ok(res));
9340        }
9341        Some(Err(ErrorContext::new(
9342            "LinkinfoBridgeAttrs",
9343            r#type.and_then(|t| LinkinfoBridgeAttrs::attr_from_type(t)),
9344            self.orig_loc,
9345            self.buf.as_ptr().wrapping_add(pos) as usize,
9346        )))
9347    }
9348}
9349impl<'a> std::fmt::Debug for IterableLinkinfoBridgeAttrs<'_> {
9350    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9351        let mut fmt = f.debug_struct("LinkinfoBridgeAttrs");
9352        for attr in self.clone() {
9353            let attr = match attr {
9354                Ok(a) => a,
9355                Err(err) => {
9356                    fmt.finish()?;
9357                    f.write_str("Err(")?;
9358                    err.fmt(f)?;
9359                    return f.write_str(")");
9360                }
9361            };
9362            match attr {
9363                LinkinfoBridgeAttrs::ForwardDelay(val) => fmt.field("ForwardDelay", &val),
9364                LinkinfoBridgeAttrs::HelloTime(val) => fmt.field("HelloTime", &val),
9365                LinkinfoBridgeAttrs::MaxAge(val) => fmt.field("MaxAge", &val),
9366                LinkinfoBridgeAttrs::AgeingTime(val) => fmt.field("AgeingTime", &val),
9367                LinkinfoBridgeAttrs::StpState(val) => fmt.field("StpState", &val),
9368                LinkinfoBridgeAttrs::Priority(val) => fmt.field("Priority", &val),
9369                LinkinfoBridgeAttrs::VlanFiltering(val) => fmt.field("VlanFiltering", &val),
9370                LinkinfoBridgeAttrs::VlanProtocol(val) => fmt.field("VlanProtocol", &val),
9371                LinkinfoBridgeAttrs::GroupFwdMask(val) => fmt.field("GroupFwdMask", &val),
9372                LinkinfoBridgeAttrs::RootId(val) => fmt.field("RootId", &val),
9373                LinkinfoBridgeAttrs::BridgeId(val) => fmt.field("BridgeId", &val),
9374                LinkinfoBridgeAttrs::RootPort(val) => fmt.field("RootPort", &val),
9375                LinkinfoBridgeAttrs::RootPathCost(val) => fmt.field("RootPathCost", &val),
9376                LinkinfoBridgeAttrs::TopologyChange(val) => fmt.field("TopologyChange", &val),
9377                LinkinfoBridgeAttrs::TopologyChangeDetected(val) => {
9378                    fmt.field("TopologyChangeDetected", &val)
9379                }
9380                LinkinfoBridgeAttrs::HelloTimer(val) => fmt.field("HelloTimer", &val),
9381                LinkinfoBridgeAttrs::TcnTimer(val) => fmt.field("TcnTimer", &val),
9382                LinkinfoBridgeAttrs::TopologyChangeTimer(val) => {
9383                    fmt.field("TopologyChangeTimer", &val)
9384                }
9385                LinkinfoBridgeAttrs::GcTimer(val) => fmt.field("GcTimer", &val),
9386                LinkinfoBridgeAttrs::GroupAddr(val) => fmt.field("GroupAddr", &FormatMac(val)),
9387                LinkinfoBridgeAttrs::FdbFlush(val) => fmt.field("FdbFlush", &val),
9388                LinkinfoBridgeAttrs::McastRouter(val) => fmt.field("McastRouter", &val),
9389                LinkinfoBridgeAttrs::McastSnooping(val) => fmt.field("McastSnooping", &val),
9390                LinkinfoBridgeAttrs::McastQueryUseIfaddr(val) => {
9391                    fmt.field("McastQueryUseIfaddr", &val)
9392                }
9393                LinkinfoBridgeAttrs::McastQuerier(val) => fmt.field("McastQuerier", &val),
9394                LinkinfoBridgeAttrs::McastHashElasticity(val) => {
9395                    fmt.field("McastHashElasticity", &val)
9396                }
9397                LinkinfoBridgeAttrs::McastHashMax(val) => fmt.field("McastHashMax", &val),
9398                LinkinfoBridgeAttrs::McastLastMemberCnt(val) => {
9399                    fmt.field("McastLastMemberCnt", &val)
9400                }
9401                LinkinfoBridgeAttrs::McastStartupQueryCnt(val) => {
9402                    fmt.field("McastStartupQueryCnt", &val)
9403                }
9404                LinkinfoBridgeAttrs::McastLastMemberIntvl(val) => {
9405                    fmt.field("McastLastMemberIntvl", &val)
9406                }
9407                LinkinfoBridgeAttrs::McastMembershipIntvl(val) => {
9408                    fmt.field("McastMembershipIntvl", &val)
9409                }
9410                LinkinfoBridgeAttrs::McastQuerierIntvl(val) => fmt.field("McastQuerierIntvl", &val),
9411                LinkinfoBridgeAttrs::McastQueryIntvl(val) => fmt.field("McastQueryIntvl", &val),
9412                LinkinfoBridgeAttrs::McastQueryResponseIntvl(val) => {
9413                    fmt.field("McastQueryResponseIntvl", &val)
9414                }
9415                LinkinfoBridgeAttrs::McastStartupQueryIntvl(val) => {
9416                    fmt.field("McastStartupQueryIntvl", &val)
9417                }
9418                LinkinfoBridgeAttrs::NfCallIptables(val) => fmt.field("NfCallIptables", &val),
9419                LinkinfoBridgeAttrs::NfCallIp6tables(val) => fmt.field("NfCallIp6tables", &val),
9420                LinkinfoBridgeAttrs::NfCallArptables(val) => fmt.field("NfCallArptables", &val),
9421                LinkinfoBridgeAttrs::VlanDefaultPvid(val) => fmt.field("VlanDefaultPvid", &val),
9422                LinkinfoBridgeAttrs::Pad(val) => fmt.field("Pad", &val),
9423                LinkinfoBridgeAttrs::VlanStatsEnabled(val) => fmt.field("VlanStatsEnabled", &val),
9424                LinkinfoBridgeAttrs::McastStatsEnabled(val) => fmt.field("McastStatsEnabled", &val),
9425                LinkinfoBridgeAttrs::McastIgmpVersion(val) => fmt.field("McastIgmpVersion", &val),
9426                LinkinfoBridgeAttrs::McastMldVersion(val) => fmt.field("McastMldVersion", &val),
9427                LinkinfoBridgeAttrs::VlanStatsPerPort(val) => fmt.field("VlanStatsPerPort", &val),
9428                LinkinfoBridgeAttrs::MultiBoolopt(val) => fmt.field("MultiBoolopt", &val),
9429                LinkinfoBridgeAttrs::McastQuerierState(val) => fmt.field("McastQuerierState", &val),
9430                LinkinfoBridgeAttrs::FdbNLearned(val) => fmt.field("FdbNLearned", &val),
9431                LinkinfoBridgeAttrs::FdbMaxLearned(val) => fmt.field("FdbMaxLearned", &val),
9432                LinkinfoBridgeAttrs::StpMode(val) => {
9433                    fmt.field("StpMode", &FormatEnum(val.into(), BrStpMode::from_value))
9434                }
9435            };
9436        }
9437        fmt.finish()
9438    }
9439}
9440impl IterableLinkinfoBridgeAttrs<'_> {
9441    pub fn lookup_attr(
9442        &self,
9443        offset: usize,
9444        missing_type: Option<u16>,
9445    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9446        let mut stack = Vec::new();
9447        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9448        if missing_type.is_some() && cur == offset {
9449            stack.push(("LinkinfoBridgeAttrs", offset));
9450            return (
9451                stack,
9452                missing_type.and_then(|t| LinkinfoBridgeAttrs::attr_from_type(t)),
9453            );
9454        }
9455        if cur > offset || cur + self.buf.len() < offset {
9456            return (stack, None);
9457        }
9458        let mut attrs = self.clone();
9459        let mut last_off = cur + attrs.pos;
9460        while let Some(attr) = attrs.next() {
9461            let Ok(attr) = attr else { break };
9462            match attr {
9463                LinkinfoBridgeAttrs::ForwardDelay(val) => {
9464                    if last_off == offset {
9465                        stack.push(("ForwardDelay", last_off));
9466                        break;
9467                    }
9468                }
9469                LinkinfoBridgeAttrs::HelloTime(val) => {
9470                    if last_off == offset {
9471                        stack.push(("HelloTime", last_off));
9472                        break;
9473                    }
9474                }
9475                LinkinfoBridgeAttrs::MaxAge(val) => {
9476                    if last_off == offset {
9477                        stack.push(("MaxAge", last_off));
9478                        break;
9479                    }
9480                }
9481                LinkinfoBridgeAttrs::AgeingTime(val) => {
9482                    if last_off == offset {
9483                        stack.push(("AgeingTime", last_off));
9484                        break;
9485                    }
9486                }
9487                LinkinfoBridgeAttrs::StpState(val) => {
9488                    if last_off == offset {
9489                        stack.push(("StpState", last_off));
9490                        break;
9491                    }
9492                }
9493                LinkinfoBridgeAttrs::Priority(val) => {
9494                    if last_off == offset {
9495                        stack.push(("Priority", last_off));
9496                        break;
9497                    }
9498                }
9499                LinkinfoBridgeAttrs::VlanFiltering(val) => {
9500                    if last_off == offset {
9501                        stack.push(("VlanFiltering", last_off));
9502                        break;
9503                    }
9504                }
9505                LinkinfoBridgeAttrs::VlanProtocol(val) => {
9506                    if last_off == offset {
9507                        stack.push(("VlanProtocol", last_off));
9508                        break;
9509                    }
9510                }
9511                LinkinfoBridgeAttrs::GroupFwdMask(val) => {
9512                    if last_off == offset {
9513                        stack.push(("GroupFwdMask", last_off));
9514                        break;
9515                    }
9516                }
9517                LinkinfoBridgeAttrs::RootId(val) => {
9518                    if last_off == offset {
9519                        stack.push(("RootId", last_off));
9520                        break;
9521                    }
9522                }
9523                LinkinfoBridgeAttrs::BridgeId(val) => {
9524                    if last_off == offset {
9525                        stack.push(("BridgeId", last_off));
9526                        break;
9527                    }
9528                }
9529                LinkinfoBridgeAttrs::RootPort(val) => {
9530                    if last_off == offset {
9531                        stack.push(("RootPort", last_off));
9532                        break;
9533                    }
9534                }
9535                LinkinfoBridgeAttrs::RootPathCost(val) => {
9536                    if last_off == offset {
9537                        stack.push(("RootPathCost", last_off));
9538                        break;
9539                    }
9540                }
9541                LinkinfoBridgeAttrs::TopologyChange(val) => {
9542                    if last_off == offset {
9543                        stack.push(("TopologyChange", last_off));
9544                        break;
9545                    }
9546                }
9547                LinkinfoBridgeAttrs::TopologyChangeDetected(val) => {
9548                    if last_off == offset {
9549                        stack.push(("TopologyChangeDetected", last_off));
9550                        break;
9551                    }
9552                }
9553                LinkinfoBridgeAttrs::HelloTimer(val) => {
9554                    if last_off == offset {
9555                        stack.push(("HelloTimer", last_off));
9556                        break;
9557                    }
9558                }
9559                LinkinfoBridgeAttrs::TcnTimer(val) => {
9560                    if last_off == offset {
9561                        stack.push(("TcnTimer", last_off));
9562                        break;
9563                    }
9564                }
9565                LinkinfoBridgeAttrs::TopologyChangeTimer(val) => {
9566                    if last_off == offset {
9567                        stack.push(("TopologyChangeTimer", last_off));
9568                        break;
9569                    }
9570                }
9571                LinkinfoBridgeAttrs::GcTimer(val) => {
9572                    if last_off == offset {
9573                        stack.push(("GcTimer", last_off));
9574                        break;
9575                    }
9576                }
9577                LinkinfoBridgeAttrs::GroupAddr(val) => {
9578                    if last_off == offset {
9579                        stack.push(("GroupAddr", last_off));
9580                        break;
9581                    }
9582                }
9583                LinkinfoBridgeAttrs::FdbFlush(val) => {
9584                    if last_off == offset {
9585                        stack.push(("FdbFlush", last_off));
9586                        break;
9587                    }
9588                }
9589                LinkinfoBridgeAttrs::McastRouter(val) => {
9590                    if last_off == offset {
9591                        stack.push(("McastRouter", last_off));
9592                        break;
9593                    }
9594                }
9595                LinkinfoBridgeAttrs::McastSnooping(val) => {
9596                    if last_off == offset {
9597                        stack.push(("McastSnooping", last_off));
9598                        break;
9599                    }
9600                }
9601                LinkinfoBridgeAttrs::McastQueryUseIfaddr(val) => {
9602                    if last_off == offset {
9603                        stack.push(("McastQueryUseIfaddr", last_off));
9604                        break;
9605                    }
9606                }
9607                LinkinfoBridgeAttrs::McastQuerier(val) => {
9608                    if last_off == offset {
9609                        stack.push(("McastQuerier", last_off));
9610                        break;
9611                    }
9612                }
9613                LinkinfoBridgeAttrs::McastHashElasticity(val) => {
9614                    if last_off == offset {
9615                        stack.push(("McastHashElasticity", last_off));
9616                        break;
9617                    }
9618                }
9619                LinkinfoBridgeAttrs::McastHashMax(val) => {
9620                    if last_off == offset {
9621                        stack.push(("McastHashMax", last_off));
9622                        break;
9623                    }
9624                }
9625                LinkinfoBridgeAttrs::McastLastMemberCnt(val) => {
9626                    if last_off == offset {
9627                        stack.push(("McastLastMemberCnt", last_off));
9628                        break;
9629                    }
9630                }
9631                LinkinfoBridgeAttrs::McastStartupQueryCnt(val) => {
9632                    if last_off == offset {
9633                        stack.push(("McastStartupQueryCnt", last_off));
9634                        break;
9635                    }
9636                }
9637                LinkinfoBridgeAttrs::McastLastMemberIntvl(val) => {
9638                    if last_off == offset {
9639                        stack.push(("McastLastMemberIntvl", last_off));
9640                        break;
9641                    }
9642                }
9643                LinkinfoBridgeAttrs::McastMembershipIntvl(val) => {
9644                    if last_off == offset {
9645                        stack.push(("McastMembershipIntvl", last_off));
9646                        break;
9647                    }
9648                }
9649                LinkinfoBridgeAttrs::McastQuerierIntvl(val) => {
9650                    if last_off == offset {
9651                        stack.push(("McastQuerierIntvl", last_off));
9652                        break;
9653                    }
9654                }
9655                LinkinfoBridgeAttrs::McastQueryIntvl(val) => {
9656                    if last_off == offset {
9657                        stack.push(("McastQueryIntvl", last_off));
9658                        break;
9659                    }
9660                }
9661                LinkinfoBridgeAttrs::McastQueryResponseIntvl(val) => {
9662                    if last_off == offset {
9663                        stack.push(("McastQueryResponseIntvl", last_off));
9664                        break;
9665                    }
9666                }
9667                LinkinfoBridgeAttrs::McastStartupQueryIntvl(val) => {
9668                    if last_off == offset {
9669                        stack.push(("McastStartupQueryIntvl", last_off));
9670                        break;
9671                    }
9672                }
9673                LinkinfoBridgeAttrs::NfCallIptables(val) => {
9674                    if last_off == offset {
9675                        stack.push(("NfCallIptables", last_off));
9676                        break;
9677                    }
9678                }
9679                LinkinfoBridgeAttrs::NfCallIp6tables(val) => {
9680                    if last_off == offset {
9681                        stack.push(("NfCallIp6tables", last_off));
9682                        break;
9683                    }
9684                }
9685                LinkinfoBridgeAttrs::NfCallArptables(val) => {
9686                    if last_off == offset {
9687                        stack.push(("NfCallArptables", last_off));
9688                        break;
9689                    }
9690                }
9691                LinkinfoBridgeAttrs::VlanDefaultPvid(val) => {
9692                    if last_off == offset {
9693                        stack.push(("VlanDefaultPvid", last_off));
9694                        break;
9695                    }
9696                }
9697                LinkinfoBridgeAttrs::Pad(val) => {
9698                    if last_off == offset {
9699                        stack.push(("Pad", last_off));
9700                        break;
9701                    }
9702                }
9703                LinkinfoBridgeAttrs::VlanStatsEnabled(val) => {
9704                    if last_off == offset {
9705                        stack.push(("VlanStatsEnabled", last_off));
9706                        break;
9707                    }
9708                }
9709                LinkinfoBridgeAttrs::McastStatsEnabled(val) => {
9710                    if last_off == offset {
9711                        stack.push(("McastStatsEnabled", last_off));
9712                        break;
9713                    }
9714                }
9715                LinkinfoBridgeAttrs::McastIgmpVersion(val) => {
9716                    if last_off == offset {
9717                        stack.push(("McastIgmpVersion", last_off));
9718                        break;
9719                    }
9720                }
9721                LinkinfoBridgeAttrs::McastMldVersion(val) => {
9722                    if last_off == offset {
9723                        stack.push(("McastMldVersion", last_off));
9724                        break;
9725                    }
9726                }
9727                LinkinfoBridgeAttrs::VlanStatsPerPort(val) => {
9728                    if last_off == offset {
9729                        stack.push(("VlanStatsPerPort", last_off));
9730                        break;
9731                    }
9732                }
9733                LinkinfoBridgeAttrs::MultiBoolopt(val) => {
9734                    if last_off == offset {
9735                        stack.push(("MultiBoolopt", last_off));
9736                        break;
9737                    }
9738                }
9739                LinkinfoBridgeAttrs::McastQuerierState(val) => {
9740                    if last_off == offset {
9741                        stack.push(("McastQuerierState", last_off));
9742                        break;
9743                    }
9744                }
9745                LinkinfoBridgeAttrs::FdbNLearned(val) => {
9746                    if last_off == offset {
9747                        stack.push(("FdbNLearned", last_off));
9748                        break;
9749                    }
9750                }
9751                LinkinfoBridgeAttrs::FdbMaxLearned(val) => {
9752                    if last_off == offset {
9753                        stack.push(("FdbMaxLearned", last_off));
9754                        break;
9755                    }
9756                }
9757                LinkinfoBridgeAttrs::StpMode(val) => {
9758                    if last_off == offset {
9759                        stack.push(("StpMode", last_off));
9760                        break;
9761                    }
9762                }
9763                _ => {}
9764            };
9765            last_off = cur + attrs.pos;
9766        }
9767        if !stack.is_empty() {
9768            stack.push(("LinkinfoBridgeAttrs", cur));
9769        }
9770        (stack, None)
9771    }
9772}
9773#[derive(Clone)]
9774pub enum LinkinfoBrportAttrs<'a> {
9775    State(u8),
9776    Priority(u16),
9777    Cost(u32),
9778    Mode(()),
9779    Guard(()),
9780    Protect(()),
9781    FastLeave(()),
9782    Learning(()),
9783    UnicastFlood(()),
9784    Proxyarp(()),
9785    LearningSync(()),
9786    ProxyarpWifi(()),
9787    RootId(IflaBridgeId),
9788    BridgeId(IflaBridgeId),
9789    DesignatedPort(u16),
9790    DesignatedCost(u16),
9791    Id(u16),
9792    No(u16),
9793    TopologyChangeAck(u8),
9794    ConfigPending(u8),
9795    MessageAgeTimer(u64),
9796    ForwardDelayTimer(u64),
9797    HoldTimer(u64),
9798    Flush(()),
9799    MulticastRouter(u8),
9800    Pad(&'a [u8]),
9801    McastFlood(()),
9802    McastToUcast(()),
9803    VlanTunnel(()),
9804    BcastFlood(()),
9805    GroupFwdMask(u16),
9806    NeighSuppress(()),
9807    Isolated(()),
9808    BackupPort(u32),
9809    MrpRingOpen(()),
9810    MrpInOpen(()),
9811    McastEhtHostsLimit(u32),
9812    McastEhtHostsCnt(u32),
9813    Locked(()),
9814    Mab(()),
9815    McastNGroups(u32),
9816    McastMaxGroups(u32),
9817    NeighVlanSuppress(()),
9818    BackupNhid(u32),
9819    NeighForwardGrat(u8),
9820}
9821impl<'a> IterableLinkinfoBrportAttrs<'a> {
9822    pub fn get_state(&self) -> Result<u8, ErrorContext> {
9823        let mut iter = self.clone();
9824        iter.pos = 0;
9825        for attr in iter {
9826            if let Ok(LinkinfoBrportAttrs::State(val)) = attr {
9827                return Ok(val);
9828            }
9829        }
9830        Err(ErrorContext::new_missing(
9831            "LinkinfoBrportAttrs",
9832            "State",
9833            self.orig_loc,
9834            self.buf.as_ptr() as usize,
9835        ))
9836    }
9837    pub fn get_priority(&self) -> Result<u16, ErrorContext> {
9838        let mut iter = self.clone();
9839        iter.pos = 0;
9840        for attr in iter {
9841            if let Ok(LinkinfoBrportAttrs::Priority(val)) = attr {
9842                return Ok(val);
9843            }
9844        }
9845        Err(ErrorContext::new_missing(
9846            "LinkinfoBrportAttrs",
9847            "Priority",
9848            self.orig_loc,
9849            self.buf.as_ptr() as usize,
9850        ))
9851    }
9852    pub fn get_cost(&self) -> Result<u32, ErrorContext> {
9853        let mut iter = self.clone();
9854        iter.pos = 0;
9855        for attr in iter {
9856            if let Ok(LinkinfoBrportAttrs::Cost(val)) = attr {
9857                return Ok(val);
9858            }
9859        }
9860        Err(ErrorContext::new_missing(
9861            "LinkinfoBrportAttrs",
9862            "Cost",
9863            self.orig_loc,
9864            self.buf.as_ptr() as usize,
9865        ))
9866    }
9867    pub fn get_mode(&self) -> Result<(), ErrorContext> {
9868        let mut iter = self.clone();
9869        iter.pos = 0;
9870        for attr in iter {
9871            if let Ok(LinkinfoBrportAttrs::Mode(val)) = attr {
9872                return Ok(val);
9873            }
9874        }
9875        Err(ErrorContext::new_missing(
9876            "LinkinfoBrportAttrs",
9877            "Mode",
9878            self.orig_loc,
9879            self.buf.as_ptr() as usize,
9880        ))
9881    }
9882    pub fn get_guard(&self) -> Result<(), ErrorContext> {
9883        let mut iter = self.clone();
9884        iter.pos = 0;
9885        for attr in iter {
9886            if let Ok(LinkinfoBrportAttrs::Guard(val)) = attr {
9887                return Ok(val);
9888            }
9889        }
9890        Err(ErrorContext::new_missing(
9891            "LinkinfoBrportAttrs",
9892            "Guard",
9893            self.orig_loc,
9894            self.buf.as_ptr() as usize,
9895        ))
9896    }
9897    pub fn get_protect(&self) -> Result<(), ErrorContext> {
9898        let mut iter = self.clone();
9899        iter.pos = 0;
9900        for attr in iter {
9901            if let Ok(LinkinfoBrportAttrs::Protect(val)) = attr {
9902                return Ok(val);
9903            }
9904        }
9905        Err(ErrorContext::new_missing(
9906            "LinkinfoBrportAttrs",
9907            "Protect",
9908            self.orig_loc,
9909            self.buf.as_ptr() as usize,
9910        ))
9911    }
9912    pub fn get_fast_leave(&self) -> Result<(), ErrorContext> {
9913        let mut iter = self.clone();
9914        iter.pos = 0;
9915        for attr in iter {
9916            if let Ok(LinkinfoBrportAttrs::FastLeave(val)) = attr {
9917                return Ok(val);
9918            }
9919        }
9920        Err(ErrorContext::new_missing(
9921            "LinkinfoBrportAttrs",
9922            "FastLeave",
9923            self.orig_loc,
9924            self.buf.as_ptr() as usize,
9925        ))
9926    }
9927    pub fn get_learning(&self) -> Result<(), ErrorContext> {
9928        let mut iter = self.clone();
9929        iter.pos = 0;
9930        for attr in iter {
9931            if let Ok(LinkinfoBrportAttrs::Learning(val)) = attr {
9932                return Ok(val);
9933            }
9934        }
9935        Err(ErrorContext::new_missing(
9936            "LinkinfoBrportAttrs",
9937            "Learning",
9938            self.orig_loc,
9939            self.buf.as_ptr() as usize,
9940        ))
9941    }
9942    pub fn get_unicast_flood(&self) -> Result<(), ErrorContext> {
9943        let mut iter = self.clone();
9944        iter.pos = 0;
9945        for attr in iter {
9946            if let Ok(LinkinfoBrportAttrs::UnicastFlood(val)) = attr {
9947                return Ok(val);
9948            }
9949        }
9950        Err(ErrorContext::new_missing(
9951            "LinkinfoBrportAttrs",
9952            "UnicastFlood",
9953            self.orig_loc,
9954            self.buf.as_ptr() as usize,
9955        ))
9956    }
9957    pub fn get_proxyarp(&self) -> Result<(), ErrorContext> {
9958        let mut iter = self.clone();
9959        iter.pos = 0;
9960        for attr in iter {
9961            if let Ok(LinkinfoBrportAttrs::Proxyarp(val)) = attr {
9962                return Ok(val);
9963            }
9964        }
9965        Err(ErrorContext::new_missing(
9966            "LinkinfoBrportAttrs",
9967            "Proxyarp",
9968            self.orig_loc,
9969            self.buf.as_ptr() as usize,
9970        ))
9971    }
9972    pub fn get_learning_sync(&self) -> Result<(), ErrorContext> {
9973        let mut iter = self.clone();
9974        iter.pos = 0;
9975        for attr in iter {
9976            if let Ok(LinkinfoBrportAttrs::LearningSync(val)) = attr {
9977                return Ok(val);
9978            }
9979        }
9980        Err(ErrorContext::new_missing(
9981            "LinkinfoBrportAttrs",
9982            "LearningSync",
9983            self.orig_loc,
9984            self.buf.as_ptr() as usize,
9985        ))
9986    }
9987    pub fn get_proxyarp_wifi(&self) -> Result<(), ErrorContext> {
9988        let mut iter = self.clone();
9989        iter.pos = 0;
9990        for attr in iter {
9991            if let Ok(LinkinfoBrportAttrs::ProxyarpWifi(val)) = attr {
9992                return Ok(val);
9993            }
9994        }
9995        Err(ErrorContext::new_missing(
9996            "LinkinfoBrportAttrs",
9997            "ProxyarpWifi",
9998            self.orig_loc,
9999            self.buf.as_ptr() as usize,
10000        ))
10001    }
10002    pub fn get_root_id(&self) -> Result<IflaBridgeId, ErrorContext> {
10003        let mut iter = self.clone();
10004        iter.pos = 0;
10005        for attr in iter {
10006            if let Ok(LinkinfoBrportAttrs::RootId(val)) = attr {
10007                return Ok(val);
10008            }
10009        }
10010        Err(ErrorContext::new_missing(
10011            "LinkinfoBrportAttrs",
10012            "RootId",
10013            self.orig_loc,
10014            self.buf.as_ptr() as usize,
10015        ))
10016    }
10017    pub fn get_bridge_id(&self) -> Result<IflaBridgeId, ErrorContext> {
10018        let mut iter = self.clone();
10019        iter.pos = 0;
10020        for attr in iter {
10021            if let Ok(LinkinfoBrportAttrs::BridgeId(val)) = attr {
10022                return Ok(val);
10023            }
10024        }
10025        Err(ErrorContext::new_missing(
10026            "LinkinfoBrportAttrs",
10027            "BridgeId",
10028            self.orig_loc,
10029            self.buf.as_ptr() as usize,
10030        ))
10031    }
10032    pub fn get_designated_port(&self) -> Result<u16, ErrorContext> {
10033        let mut iter = self.clone();
10034        iter.pos = 0;
10035        for attr in iter {
10036            if let Ok(LinkinfoBrportAttrs::DesignatedPort(val)) = attr {
10037                return Ok(val);
10038            }
10039        }
10040        Err(ErrorContext::new_missing(
10041            "LinkinfoBrportAttrs",
10042            "DesignatedPort",
10043            self.orig_loc,
10044            self.buf.as_ptr() as usize,
10045        ))
10046    }
10047    pub fn get_designated_cost(&self) -> Result<u16, ErrorContext> {
10048        let mut iter = self.clone();
10049        iter.pos = 0;
10050        for attr in iter {
10051            if let Ok(LinkinfoBrportAttrs::DesignatedCost(val)) = attr {
10052                return Ok(val);
10053            }
10054        }
10055        Err(ErrorContext::new_missing(
10056            "LinkinfoBrportAttrs",
10057            "DesignatedCost",
10058            self.orig_loc,
10059            self.buf.as_ptr() as usize,
10060        ))
10061    }
10062    pub fn get_id(&self) -> Result<u16, ErrorContext> {
10063        let mut iter = self.clone();
10064        iter.pos = 0;
10065        for attr in iter {
10066            if let Ok(LinkinfoBrportAttrs::Id(val)) = attr {
10067                return Ok(val);
10068            }
10069        }
10070        Err(ErrorContext::new_missing(
10071            "LinkinfoBrportAttrs",
10072            "Id",
10073            self.orig_loc,
10074            self.buf.as_ptr() as usize,
10075        ))
10076    }
10077    pub fn get_no(&self) -> Result<u16, ErrorContext> {
10078        let mut iter = self.clone();
10079        iter.pos = 0;
10080        for attr in iter {
10081            if let Ok(LinkinfoBrportAttrs::No(val)) = attr {
10082                return Ok(val);
10083            }
10084        }
10085        Err(ErrorContext::new_missing(
10086            "LinkinfoBrportAttrs",
10087            "No",
10088            self.orig_loc,
10089            self.buf.as_ptr() as usize,
10090        ))
10091    }
10092    pub fn get_topology_change_ack(&self) -> Result<u8, ErrorContext> {
10093        let mut iter = self.clone();
10094        iter.pos = 0;
10095        for attr in iter {
10096            if let Ok(LinkinfoBrportAttrs::TopologyChangeAck(val)) = attr {
10097                return Ok(val);
10098            }
10099        }
10100        Err(ErrorContext::new_missing(
10101            "LinkinfoBrportAttrs",
10102            "TopologyChangeAck",
10103            self.orig_loc,
10104            self.buf.as_ptr() as usize,
10105        ))
10106    }
10107    pub fn get_config_pending(&self) -> Result<u8, ErrorContext> {
10108        let mut iter = self.clone();
10109        iter.pos = 0;
10110        for attr in iter {
10111            if let Ok(LinkinfoBrportAttrs::ConfigPending(val)) = attr {
10112                return Ok(val);
10113            }
10114        }
10115        Err(ErrorContext::new_missing(
10116            "LinkinfoBrportAttrs",
10117            "ConfigPending",
10118            self.orig_loc,
10119            self.buf.as_ptr() as usize,
10120        ))
10121    }
10122    pub fn get_message_age_timer(&self) -> Result<u64, ErrorContext> {
10123        let mut iter = self.clone();
10124        iter.pos = 0;
10125        for attr in iter {
10126            if let Ok(LinkinfoBrportAttrs::MessageAgeTimer(val)) = attr {
10127                return Ok(val);
10128            }
10129        }
10130        Err(ErrorContext::new_missing(
10131            "LinkinfoBrportAttrs",
10132            "MessageAgeTimer",
10133            self.orig_loc,
10134            self.buf.as_ptr() as usize,
10135        ))
10136    }
10137    pub fn get_forward_delay_timer(&self) -> Result<u64, ErrorContext> {
10138        let mut iter = self.clone();
10139        iter.pos = 0;
10140        for attr in iter {
10141            if let Ok(LinkinfoBrportAttrs::ForwardDelayTimer(val)) = attr {
10142                return Ok(val);
10143            }
10144        }
10145        Err(ErrorContext::new_missing(
10146            "LinkinfoBrportAttrs",
10147            "ForwardDelayTimer",
10148            self.orig_loc,
10149            self.buf.as_ptr() as usize,
10150        ))
10151    }
10152    pub fn get_hold_timer(&self) -> Result<u64, ErrorContext> {
10153        let mut iter = self.clone();
10154        iter.pos = 0;
10155        for attr in iter {
10156            if let Ok(LinkinfoBrportAttrs::HoldTimer(val)) = attr {
10157                return Ok(val);
10158            }
10159        }
10160        Err(ErrorContext::new_missing(
10161            "LinkinfoBrportAttrs",
10162            "HoldTimer",
10163            self.orig_loc,
10164            self.buf.as_ptr() as usize,
10165        ))
10166    }
10167    pub fn get_flush(&self) -> Result<(), ErrorContext> {
10168        let mut iter = self.clone();
10169        iter.pos = 0;
10170        for attr in iter {
10171            if let Ok(LinkinfoBrportAttrs::Flush(val)) = attr {
10172                return Ok(val);
10173            }
10174        }
10175        Err(ErrorContext::new_missing(
10176            "LinkinfoBrportAttrs",
10177            "Flush",
10178            self.orig_loc,
10179            self.buf.as_ptr() as usize,
10180        ))
10181    }
10182    pub fn get_multicast_router(&self) -> Result<u8, ErrorContext> {
10183        let mut iter = self.clone();
10184        iter.pos = 0;
10185        for attr in iter {
10186            if let Ok(LinkinfoBrportAttrs::MulticastRouter(val)) = attr {
10187                return Ok(val);
10188            }
10189        }
10190        Err(ErrorContext::new_missing(
10191            "LinkinfoBrportAttrs",
10192            "MulticastRouter",
10193            self.orig_loc,
10194            self.buf.as_ptr() as usize,
10195        ))
10196    }
10197    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
10198        let mut iter = self.clone();
10199        iter.pos = 0;
10200        for attr in iter {
10201            if let Ok(LinkinfoBrportAttrs::Pad(val)) = attr {
10202                return Ok(val);
10203            }
10204        }
10205        Err(ErrorContext::new_missing(
10206            "LinkinfoBrportAttrs",
10207            "Pad",
10208            self.orig_loc,
10209            self.buf.as_ptr() as usize,
10210        ))
10211    }
10212    pub fn get_mcast_flood(&self) -> Result<(), ErrorContext> {
10213        let mut iter = self.clone();
10214        iter.pos = 0;
10215        for attr in iter {
10216            if let Ok(LinkinfoBrportAttrs::McastFlood(val)) = attr {
10217                return Ok(val);
10218            }
10219        }
10220        Err(ErrorContext::new_missing(
10221            "LinkinfoBrportAttrs",
10222            "McastFlood",
10223            self.orig_loc,
10224            self.buf.as_ptr() as usize,
10225        ))
10226    }
10227    pub fn get_mcast_to_ucast(&self) -> Result<(), ErrorContext> {
10228        let mut iter = self.clone();
10229        iter.pos = 0;
10230        for attr in iter {
10231            if let Ok(LinkinfoBrportAttrs::McastToUcast(val)) = attr {
10232                return Ok(val);
10233            }
10234        }
10235        Err(ErrorContext::new_missing(
10236            "LinkinfoBrportAttrs",
10237            "McastToUcast",
10238            self.orig_loc,
10239            self.buf.as_ptr() as usize,
10240        ))
10241    }
10242    pub fn get_vlan_tunnel(&self) -> Result<(), ErrorContext> {
10243        let mut iter = self.clone();
10244        iter.pos = 0;
10245        for attr in iter {
10246            if let Ok(LinkinfoBrportAttrs::VlanTunnel(val)) = attr {
10247                return Ok(val);
10248            }
10249        }
10250        Err(ErrorContext::new_missing(
10251            "LinkinfoBrportAttrs",
10252            "VlanTunnel",
10253            self.orig_loc,
10254            self.buf.as_ptr() as usize,
10255        ))
10256    }
10257    pub fn get_bcast_flood(&self) -> Result<(), ErrorContext> {
10258        let mut iter = self.clone();
10259        iter.pos = 0;
10260        for attr in iter {
10261            if let Ok(LinkinfoBrportAttrs::BcastFlood(val)) = attr {
10262                return Ok(val);
10263            }
10264        }
10265        Err(ErrorContext::new_missing(
10266            "LinkinfoBrportAttrs",
10267            "BcastFlood",
10268            self.orig_loc,
10269            self.buf.as_ptr() as usize,
10270        ))
10271    }
10272    pub fn get_group_fwd_mask(&self) -> Result<u16, ErrorContext> {
10273        let mut iter = self.clone();
10274        iter.pos = 0;
10275        for attr in iter {
10276            if let Ok(LinkinfoBrportAttrs::GroupFwdMask(val)) = attr {
10277                return Ok(val);
10278            }
10279        }
10280        Err(ErrorContext::new_missing(
10281            "LinkinfoBrportAttrs",
10282            "GroupFwdMask",
10283            self.orig_loc,
10284            self.buf.as_ptr() as usize,
10285        ))
10286    }
10287    pub fn get_neigh_suppress(&self) -> Result<(), ErrorContext> {
10288        let mut iter = self.clone();
10289        iter.pos = 0;
10290        for attr in iter {
10291            if let Ok(LinkinfoBrportAttrs::NeighSuppress(val)) = attr {
10292                return Ok(val);
10293            }
10294        }
10295        Err(ErrorContext::new_missing(
10296            "LinkinfoBrportAttrs",
10297            "NeighSuppress",
10298            self.orig_loc,
10299            self.buf.as_ptr() as usize,
10300        ))
10301    }
10302    pub fn get_isolated(&self) -> Result<(), ErrorContext> {
10303        let mut iter = self.clone();
10304        iter.pos = 0;
10305        for attr in iter {
10306            if let Ok(LinkinfoBrportAttrs::Isolated(val)) = attr {
10307                return Ok(val);
10308            }
10309        }
10310        Err(ErrorContext::new_missing(
10311            "LinkinfoBrportAttrs",
10312            "Isolated",
10313            self.orig_loc,
10314            self.buf.as_ptr() as usize,
10315        ))
10316    }
10317    pub fn get_backup_port(&self) -> Result<u32, ErrorContext> {
10318        let mut iter = self.clone();
10319        iter.pos = 0;
10320        for attr in iter {
10321            if let Ok(LinkinfoBrportAttrs::BackupPort(val)) = attr {
10322                return Ok(val);
10323            }
10324        }
10325        Err(ErrorContext::new_missing(
10326            "LinkinfoBrportAttrs",
10327            "BackupPort",
10328            self.orig_loc,
10329            self.buf.as_ptr() as usize,
10330        ))
10331    }
10332    pub fn get_mrp_ring_open(&self) -> Result<(), ErrorContext> {
10333        let mut iter = self.clone();
10334        iter.pos = 0;
10335        for attr in iter {
10336            if let Ok(LinkinfoBrportAttrs::MrpRingOpen(val)) = attr {
10337                return Ok(val);
10338            }
10339        }
10340        Err(ErrorContext::new_missing(
10341            "LinkinfoBrportAttrs",
10342            "MrpRingOpen",
10343            self.orig_loc,
10344            self.buf.as_ptr() as usize,
10345        ))
10346    }
10347    pub fn get_mrp_in_open(&self) -> Result<(), ErrorContext> {
10348        let mut iter = self.clone();
10349        iter.pos = 0;
10350        for attr in iter {
10351            if let Ok(LinkinfoBrportAttrs::MrpInOpen(val)) = attr {
10352                return Ok(val);
10353            }
10354        }
10355        Err(ErrorContext::new_missing(
10356            "LinkinfoBrportAttrs",
10357            "MrpInOpen",
10358            self.orig_loc,
10359            self.buf.as_ptr() as usize,
10360        ))
10361    }
10362    pub fn get_mcast_eht_hosts_limit(&self) -> Result<u32, ErrorContext> {
10363        let mut iter = self.clone();
10364        iter.pos = 0;
10365        for attr in iter {
10366            if let Ok(LinkinfoBrportAttrs::McastEhtHostsLimit(val)) = attr {
10367                return Ok(val);
10368            }
10369        }
10370        Err(ErrorContext::new_missing(
10371            "LinkinfoBrportAttrs",
10372            "McastEhtHostsLimit",
10373            self.orig_loc,
10374            self.buf.as_ptr() as usize,
10375        ))
10376    }
10377    pub fn get_mcast_eht_hosts_cnt(&self) -> Result<u32, ErrorContext> {
10378        let mut iter = self.clone();
10379        iter.pos = 0;
10380        for attr in iter {
10381            if let Ok(LinkinfoBrportAttrs::McastEhtHostsCnt(val)) = attr {
10382                return Ok(val);
10383            }
10384        }
10385        Err(ErrorContext::new_missing(
10386            "LinkinfoBrportAttrs",
10387            "McastEhtHostsCnt",
10388            self.orig_loc,
10389            self.buf.as_ptr() as usize,
10390        ))
10391    }
10392    pub fn get_locked(&self) -> Result<(), ErrorContext> {
10393        let mut iter = self.clone();
10394        iter.pos = 0;
10395        for attr in iter {
10396            if let Ok(LinkinfoBrportAttrs::Locked(val)) = attr {
10397                return Ok(val);
10398            }
10399        }
10400        Err(ErrorContext::new_missing(
10401            "LinkinfoBrportAttrs",
10402            "Locked",
10403            self.orig_loc,
10404            self.buf.as_ptr() as usize,
10405        ))
10406    }
10407    pub fn get_mab(&self) -> Result<(), ErrorContext> {
10408        let mut iter = self.clone();
10409        iter.pos = 0;
10410        for attr in iter {
10411            if let Ok(LinkinfoBrportAttrs::Mab(val)) = attr {
10412                return Ok(val);
10413            }
10414        }
10415        Err(ErrorContext::new_missing(
10416            "LinkinfoBrportAttrs",
10417            "Mab",
10418            self.orig_loc,
10419            self.buf.as_ptr() as usize,
10420        ))
10421    }
10422    pub fn get_mcast_n_groups(&self) -> Result<u32, ErrorContext> {
10423        let mut iter = self.clone();
10424        iter.pos = 0;
10425        for attr in iter {
10426            if let Ok(LinkinfoBrportAttrs::McastNGroups(val)) = attr {
10427                return Ok(val);
10428            }
10429        }
10430        Err(ErrorContext::new_missing(
10431            "LinkinfoBrportAttrs",
10432            "McastNGroups",
10433            self.orig_loc,
10434            self.buf.as_ptr() as usize,
10435        ))
10436    }
10437    pub fn get_mcast_max_groups(&self) -> Result<u32, ErrorContext> {
10438        let mut iter = self.clone();
10439        iter.pos = 0;
10440        for attr in iter {
10441            if let Ok(LinkinfoBrportAttrs::McastMaxGroups(val)) = attr {
10442                return Ok(val);
10443            }
10444        }
10445        Err(ErrorContext::new_missing(
10446            "LinkinfoBrportAttrs",
10447            "McastMaxGroups",
10448            self.orig_loc,
10449            self.buf.as_ptr() as usize,
10450        ))
10451    }
10452    pub fn get_neigh_vlan_suppress(&self) -> Result<(), ErrorContext> {
10453        let mut iter = self.clone();
10454        iter.pos = 0;
10455        for attr in iter {
10456            if let Ok(LinkinfoBrportAttrs::NeighVlanSuppress(val)) = attr {
10457                return Ok(val);
10458            }
10459        }
10460        Err(ErrorContext::new_missing(
10461            "LinkinfoBrportAttrs",
10462            "NeighVlanSuppress",
10463            self.orig_loc,
10464            self.buf.as_ptr() as usize,
10465        ))
10466    }
10467    pub fn get_backup_nhid(&self) -> Result<u32, ErrorContext> {
10468        let mut iter = self.clone();
10469        iter.pos = 0;
10470        for attr in iter {
10471            if let Ok(LinkinfoBrportAttrs::BackupNhid(val)) = attr {
10472                return Ok(val);
10473            }
10474        }
10475        Err(ErrorContext::new_missing(
10476            "LinkinfoBrportAttrs",
10477            "BackupNhid",
10478            self.orig_loc,
10479            self.buf.as_ptr() as usize,
10480        ))
10481    }
10482    pub fn get_neigh_forward_grat(&self) -> Result<u8, ErrorContext> {
10483        let mut iter = self.clone();
10484        iter.pos = 0;
10485        for attr in iter {
10486            if let Ok(LinkinfoBrportAttrs::NeighForwardGrat(val)) = attr {
10487                return Ok(val);
10488            }
10489        }
10490        Err(ErrorContext::new_missing(
10491            "LinkinfoBrportAttrs",
10492            "NeighForwardGrat",
10493            self.orig_loc,
10494            self.buf.as_ptr() as usize,
10495        ))
10496    }
10497}
10498impl LinkinfoBrportAttrs<'_> {
10499    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoBrportAttrs<'a> {
10500        IterableLinkinfoBrportAttrs::with_loc(buf, buf.as_ptr() as usize)
10501    }
10502    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10503        let res = match r#type {
10504            1u16 => "State",
10505            2u16 => "Priority",
10506            3u16 => "Cost",
10507            4u16 => "Mode",
10508            5u16 => "Guard",
10509            6u16 => "Protect",
10510            7u16 => "FastLeave",
10511            8u16 => "Learning",
10512            9u16 => "UnicastFlood",
10513            10u16 => "Proxyarp",
10514            11u16 => "LearningSync",
10515            12u16 => "ProxyarpWifi",
10516            13u16 => "RootId",
10517            14u16 => "BridgeId",
10518            15u16 => "DesignatedPort",
10519            16u16 => "DesignatedCost",
10520            17u16 => "Id",
10521            18u16 => "No",
10522            19u16 => "TopologyChangeAck",
10523            20u16 => "ConfigPending",
10524            21u16 => "MessageAgeTimer",
10525            22u16 => "ForwardDelayTimer",
10526            23u16 => "HoldTimer",
10527            24u16 => "Flush",
10528            25u16 => "MulticastRouter",
10529            26u16 => "Pad",
10530            27u16 => "McastFlood",
10531            28u16 => "McastToUcast",
10532            29u16 => "VlanTunnel",
10533            30u16 => "BcastFlood",
10534            31u16 => "GroupFwdMask",
10535            32u16 => "NeighSuppress",
10536            33u16 => "Isolated",
10537            34u16 => "BackupPort",
10538            35u16 => "MrpRingOpen",
10539            36u16 => "MrpInOpen",
10540            37u16 => "McastEhtHostsLimit",
10541            38u16 => "McastEhtHostsCnt",
10542            39u16 => "Locked",
10543            40u16 => "Mab",
10544            41u16 => "McastNGroups",
10545            42u16 => "McastMaxGroups",
10546            43u16 => "NeighVlanSuppress",
10547            44u16 => "BackupNhid",
10548            45u16 => "NeighForwardGrat",
10549            _ => return None,
10550        };
10551        Some(res)
10552    }
10553}
10554#[derive(Clone, Copy, Default)]
10555pub struct IterableLinkinfoBrportAttrs<'a> {
10556    buf: &'a [u8],
10557    pos: usize,
10558    orig_loc: usize,
10559}
10560impl<'a> IterableLinkinfoBrportAttrs<'a> {
10561    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10562        Self {
10563            buf,
10564            pos: 0,
10565            orig_loc,
10566        }
10567    }
10568    pub fn get_buf(&self) -> &'a [u8] {
10569        self.buf
10570    }
10571}
10572impl<'a> Iterator for IterableLinkinfoBrportAttrs<'a> {
10573    type Item = Result<LinkinfoBrportAttrs<'a>, ErrorContext>;
10574    fn next(&mut self) -> Option<Self::Item> {
10575        let mut pos;
10576        let mut r#type;
10577        loop {
10578            pos = self.pos;
10579            r#type = None;
10580            if self.buf.len() == self.pos {
10581                return None;
10582            }
10583            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10584                self.pos = self.buf.len();
10585                break;
10586            };
10587            r#type = Some(header.r#type);
10588            let res = match header.r#type {
10589                1u16 => LinkinfoBrportAttrs::State({
10590                    let res = parse_u8(next);
10591                    let Some(val) = res else { break };
10592                    val
10593                }),
10594                2u16 => LinkinfoBrportAttrs::Priority({
10595                    let res = parse_u16(next);
10596                    let Some(val) = res else { break };
10597                    val
10598                }),
10599                3u16 => LinkinfoBrportAttrs::Cost({
10600                    let res = parse_u32(next);
10601                    let Some(val) = res else { break };
10602                    val
10603                }),
10604                4u16 => LinkinfoBrportAttrs::Mode(()),
10605                5u16 => LinkinfoBrportAttrs::Guard(()),
10606                6u16 => LinkinfoBrportAttrs::Protect(()),
10607                7u16 => LinkinfoBrportAttrs::FastLeave(()),
10608                8u16 => LinkinfoBrportAttrs::Learning(()),
10609                9u16 => LinkinfoBrportAttrs::UnicastFlood(()),
10610                10u16 => LinkinfoBrportAttrs::Proxyarp(()),
10611                11u16 => LinkinfoBrportAttrs::LearningSync(()),
10612                12u16 => LinkinfoBrportAttrs::ProxyarpWifi(()),
10613                13u16 => LinkinfoBrportAttrs::RootId({
10614                    let res = Some(IflaBridgeId::new_from_zeroed(next));
10615                    let Some(val) = res else { break };
10616                    val
10617                }),
10618                14u16 => LinkinfoBrportAttrs::BridgeId({
10619                    let res = Some(IflaBridgeId::new_from_zeroed(next));
10620                    let Some(val) = res else { break };
10621                    val
10622                }),
10623                15u16 => LinkinfoBrportAttrs::DesignatedPort({
10624                    let res = parse_u16(next);
10625                    let Some(val) = res else { break };
10626                    val
10627                }),
10628                16u16 => LinkinfoBrportAttrs::DesignatedCost({
10629                    let res = parse_u16(next);
10630                    let Some(val) = res else { break };
10631                    val
10632                }),
10633                17u16 => LinkinfoBrportAttrs::Id({
10634                    let res = parse_u16(next);
10635                    let Some(val) = res else { break };
10636                    val
10637                }),
10638                18u16 => LinkinfoBrportAttrs::No({
10639                    let res = parse_u16(next);
10640                    let Some(val) = res else { break };
10641                    val
10642                }),
10643                19u16 => LinkinfoBrportAttrs::TopologyChangeAck({
10644                    let res = parse_u8(next);
10645                    let Some(val) = res else { break };
10646                    val
10647                }),
10648                20u16 => LinkinfoBrportAttrs::ConfigPending({
10649                    let res = parse_u8(next);
10650                    let Some(val) = res else { break };
10651                    val
10652                }),
10653                21u16 => LinkinfoBrportAttrs::MessageAgeTimer({
10654                    let res = parse_u64(next);
10655                    let Some(val) = res else { break };
10656                    val
10657                }),
10658                22u16 => LinkinfoBrportAttrs::ForwardDelayTimer({
10659                    let res = parse_u64(next);
10660                    let Some(val) = res else { break };
10661                    val
10662                }),
10663                23u16 => LinkinfoBrportAttrs::HoldTimer({
10664                    let res = parse_u64(next);
10665                    let Some(val) = res else { break };
10666                    val
10667                }),
10668                24u16 => LinkinfoBrportAttrs::Flush(()),
10669                25u16 => LinkinfoBrportAttrs::MulticastRouter({
10670                    let res = parse_u8(next);
10671                    let Some(val) = res else { break };
10672                    val
10673                }),
10674                26u16 => LinkinfoBrportAttrs::Pad({
10675                    let res = Some(next);
10676                    let Some(val) = res else { break };
10677                    val
10678                }),
10679                27u16 => LinkinfoBrportAttrs::McastFlood(()),
10680                28u16 => LinkinfoBrportAttrs::McastToUcast(()),
10681                29u16 => LinkinfoBrportAttrs::VlanTunnel(()),
10682                30u16 => LinkinfoBrportAttrs::BcastFlood(()),
10683                31u16 => LinkinfoBrportAttrs::GroupFwdMask({
10684                    let res = parse_u16(next);
10685                    let Some(val) = res else { break };
10686                    val
10687                }),
10688                32u16 => LinkinfoBrportAttrs::NeighSuppress(()),
10689                33u16 => LinkinfoBrportAttrs::Isolated(()),
10690                34u16 => LinkinfoBrportAttrs::BackupPort({
10691                    let res = parse_u32(next);
10692                    let Some(val) = res else { break };
10693                    val
10694                }),
10695                35u16 => LinkinfoBrportAttrs::MrpRingOpen(()),
10696                36u16 => LinkinfoBrportAttrs::MrpInOpen(()),
10697                37u16 => LinkinfoBrportAttrs::McastEhtHostsLimit({
10698                    let res = parse_u32(next);
10699                    let Some(val) = res else { break };
10700                    val
10701                }),
10702                38u16 => LinkinfoBrportAttrs::McastEhtHostsCnt({
10703                    let res = parse_u32(next);
10704                    let Some(val) = res else { break };
10705                    val
10706                }),
10707                39u16 => LinkinfoBrportAttrs::Locked(()),
10708                40u16 => LinkinfoBrportAttrs::Mab(()),
10709                41u16 => LinkinfoBrportAttrs::McastNGroups({
10710                    let res = parse_u32(next);
10711                    let Some(val) = res else { break };
10712                    val
10713                }),
10714                42u16 => LinkinfoBrportAttrs::McastMaxGroups({
10715                    let res = parse_u32(next);
10716                    let Some(val) = res else { break };
10717                    val
10718                }),
10719                43u16 => LinkinfoBrportAttrs::NeighVlanSuppress(()),
10720                44u16 => LinkinfoBrportAttrs::BackupNhid({
10721                    let res = parse_u32(next);
10722                    let Some(val) = res else { break };
10723                    val
10724                }),
10725                45u16 => LinkinfoBrportAttrs::NeighForwardGrat({
10726                    let res = parse_u8(next);
10727                    let Some(val) = res else { break };
10728                    val
10729                }),
10730                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10731                n => continue,
10732            };
10733            return Some(Ok(res));
10734        }
10735        Some(Err(ErrorContext::new(
10736            "LinkinfoBrportAttrs",
10737            r#type.and_then(|t| LinkinfoBrportAttrs::attr_from_type(t)),
10738            self.orig_loc,
10739            self.buf.as_ptr().wrapping_add(pos) as usize,
10740        )))
10741    }
10742}
10743impl<'a> std::fmt::Debug for IterableLinkinfoBrportAttrs<'_> {
10744    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10745        let mut fmt = f.debug_struct("LinkinfoBrportAttrs");
10746        for attr in self.clone() {
10747            let attr = match attr {
10748                Ok(a) => a,
10749                Err(err) => {
10750                    fmt.finish()?;
10751                    f.write_str("Err(")?;
10752                    err.fmt(f)?;
10753                    return f.write_str(")");
10754                }
10755            };
10756            match attr {
10757                LinkinfoBrportAttrs::State(val) => fmt.field("State", &val),
10758                LinkinfoBrportAttrs::Priority(val) => fmt.field("Priority", &val),
10759                LinkinfoBrportAttrs::Cost(val) => fmt.field("Cost", &val),
10760                LinkinfoBrportAttrs::Mode(val) => fmt.field("Mode", &val),
10761                LinkinfoBrportAttrs::Guard(val) => fmt.field("Guard", &val),
10762                LinkinfoBrportAttrs::Protect(val) => fmt.field("Protect", &val),
10763                LinkinfoBrportAttrs::FastLeave(val) => fmt.field("FastLeave", &val),
10764                LinkinfoBrportAttrs::Learning(val) => fmt.field("Learning", &val),
10765                LinkinfoBrportAttrs::UnicastFlood(val) => fmt.field("UnicastFlood", &val),
10766                LinkinfoBrportAttrs::Proxyarp(val) => fmt.field("Proxyarp", &val),
10767                LinkinfoBrportAttrs::LearningSync(val) => fmt.field("LearningSync", &val),
10768                LinkinfoBrportAttrs::ProxyarpWifi(val) => fmt.field("ProxyarpWifi", &val),
10769                LinkinfoBrportAttrs::RootId(val) => fmt.field("RootId", &val),
10770                LinkinfoBrportAttrs::BridgeId(val) => fmt.field("BridgeId", &val),
10771                LinkinfoBrportAttrs::DesignatedPort(val) => fmt.field("DesignatedPort", &val),
10772                LinkinfoBrportAttrs::DesignatedCost(val) => fmt.field("DesignatedCost", &val),
10773                LinkinfoBrportAttrs::Id(val) => fmt.field("Id", &val),
10774                LinkinfoBrportAttrs::No(val) => fmt.field("No", &val),
10775                LinkinfoBrportAttrs::TopologyChangeAck(val) => fmt.field("TopologyChangeAck", &val),
10776                LinkinfoBrportAttrs::ConfigPending(val) => fmt.field("ConfigPending", &val),
10777                LinkinfoBrportAttrs::MessageAgeTimer(val) => fmt.field("MessageAgeTimer", &val),
10778                LinkinfoBrportAttrs::ForwardDelayTimer(val) => fmt.field("ForwardDelayTimer", &val),
10779                LinkinfoBrportAttrs::HoldTimer(val) => fmt.field("HoldTimer", &val),
10780                LinkinfoBrportAttrs::Flush(val) => fmt.field("Flush", &val),
10781                LinkinfoBrportAttrs::MulticastRouter(val) => fmt.field("MulticastRouter", &val),
10782                LinkinfoBrportAttrs::Pad(val) => fmt.field("Pad", &val),
10783                LinkinfoBrportAttrs::McastFlood(val) => fmt.field("McastFlood", &val),
10784                LinkinfoBrportAttrs::McastToUcast(val) => fmt.field("McastToUcast", &val),
10785                LinkinfoBrportAttrs::VlanTunnel(val) => fmt.field("VlanTunnel", &val),
10786                LinkinfoBrportAttrs::BcastFlood(val) => fmt.field("BcastFlood", &val),
10787                LinkinfoBrportAttrs::GroupFwdMask(val) => fmt.field("GroupFwdMask", &val),
10788                LinkinfoBrportAttrs::NeighSuppress(val) => fmt.field("NeighSuppress", &val),
10789                LinkinfoBrportAttrs::Isolated(val) => fmt.field("Isolated", &val),
10790                LinkinfoBrportAttrs::BackupPort(val) => fmt.field("BackupPort", &val),
10791                LinkinfoBrportAttrs::MrpRingOpen(val) => fmt.field("MrpRingOpen", &val),
10792                LinkinfoBrportAttrs::MrpInOpen(val) => fmt.field("MrpInOpen", &val),
10793                LinkinfoBrportAttrs::McastEhtHostsLimit(val) => {
10794                    fmt.field("McastEhtHostsLimit", &val)
10795                }
10796                LinkinfoBrportAttrs::McastEhtHostsCnt(val) => fmt.field("McastEhtHostsCnt", &val),
10797                LinkinfoBrportAttrs::Locked(val) => fmt.field("Locked", &val),
10798                LinkinfoBrportAttrs::Mab(val) => fmt.field("Mab", &val),
10799                LinkinfoBrportAttrs::McastNGroups(val) => fmt.field("McastNGroups", &val),
10800                LinkinfoBrportAttrs::McastMaxGroups(val) => fmt.field("McastMaxGroups", &val),
10801                LinkinfoBrportAttrs::NeighVlanSuppress(val) => fmt.field("NeighVlanSuppress", &val),
10802                LinkinfoBrportAttrs::BackupNhid(val) => fmt.field("BackupNhid", &val),
10803                LinkinfoBrportAttrs::NeighForwardGrat(val) => fmt.field("NeighForwardGrat", &val),
10804            };
10805        }
10806        fmt.finish()
10807    }
10808}
10809impl IterableLinkinfoBrportAttrs<'_> {
10810    pub fn lookup_attr(
10811        &self,
10812        offset: usize,
10813        missing_type: Option<u16>,
10814    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10815        let mut stack = Vec::new();
10816        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10817        if missing_type.is_some() && cur == offset {
10818            stack.push(("LinkinfoBrportAttrs", offset));
10819            return (
10820                stack,
10821                missing_type.and_then(|t| LinkinfoBrportAttrs::attr_from_type(t)),
10822            );
10823        }
10824        if cur > offset || cur + self.buf.len() < offset {
10825            return (stack, None);
10826        }
10827        let mut attrs = self.clone();
10828        let mut last_off = cur + attrs.pos;
10829        while let Some(attr) = attrs.next() {
10830            let Ok(attr) = attr else { break };
10831            match attr {
10832                LinkinfoBrportAttrs::State(val) => {
10833                    if last_off == offset {
10834                        stack.push(("State", last_off));
10835                        break;
10836                    }
10837                }
10838                LinkinfoBrportAttrs::Priority(val) => {
10839                    if last_off == offset {
10840                        stack.push(("Priority", last_off));
10841                        break;
10842                    }
10843                }
10844                LinkinfoBrportAttrs::Cost(val) => {
10845                    if last_off == offset {
10846                        stack.push(("Cost", last_off));
10847                        break;
10848                    }
10849                }
10850                LinkinfoBrportAttrs::Mode(val) => {
10851                    if last_off == offset {
10852                        stack.push(("Mode", last_off));
10853                        break;
10854                    }
10855                }
10856                LinkinfoBrportAttrs::Guard(val) => {
10857                    if last_off == offset {
10858                        stack.push(("Guard", last_off));
10859                        break;
10860                    }
10861                }
10862                LinkinfoBrportAttrs::Protect(val) => {
10863                    if last_off == offset {
10864                        stack.push(("Protect", last_off));
10865                        break;
10866                    }
10867                }
10868                LinkinfoBrportAttrs::FastLeave(val) => {
10869                    if last_off == offset {
10870                        stack.push(("FastLeave", last_off));
10871                        break;
10872                    }
10873                }
10874                LinkinfoBrportAttrs::Learning(val) => {
10875                    if last_off == offset {
10876                        stack.push(("Learning", last_off));
10877                        break;
10878                    }
10879                }
10880                LinkinfoBrportAttrs::UnicastFlood(val) => {
10881                    if last_off == offset {
10882                        stack.push(("UnicastFlood", last_off));
10883                        break;
10884                    }
10885                }
10886                LinkinfoBrportAttrs::Proxyarp(val) => {
10887                    if last_off == offset {
10888                        stack.push(("Proxyarp", last_off));
10889                        break;
10890                    }
10891                }
10892                LinkinfoBrportAttrs::LearningSync(val) => {
10893                    if last_off == offset {
10894                        stack.push(("LearningSync", last_off));
10895                        break;
10896                    }
10897                }
10898                LinkinfoBrportAttrs::ProxyarpWifi(val) => {
10899                    if last_off == offset {
10900                        stack.push(("ProxyarpWifi", last_off));
10901                        break;
10902                    }
10903                }
10904                LinkinfoBrportAttrs::RootId(val) => {
10905                    if last_off == offset {
10906                        stack.push(("RootId", last_off));
10907                        break;
10908                    }
10909                }
10910                LinkinfoBrportAttrs::BridgeId(val) => {
10911                    if last_off == offset {
10912                        stack.push(("BridgeId", last_off));
10913                        break;
10914                    }
10915                }
10916                LinkinfoBrportAttrs::DesignatedPort(val) => {
10917                    if last_off == offset {
10918                        stack.push(("DesignatedPort", last_off));
10919                        break;
10920                    }
10921                }
10922                LinkinfoBrportAttrs::DesignatedCost(val) => {
10923                    if last_off == offset {
10924                        stack.push(("DesignatedCost", last_off));
10925                        break;
10926                    }
10927                }
10928                LinkinfoBrportAttrs::Id(val) => {
10929                    if last_off == offset {
10930                        stack.push(("Id", last_off));
10931                        break;
10932                    }
10933                }
10934                LinkinfoBrportAttrs::No(val) => {
10935                    if last_off == offset {
10936                        stack.push(("No", last_off));
10937                        break;
10938                    }
10939                }
10940                LinkinfoBrportAttrs::TopologyChangeAck(val) => {
10941                    if last_off == offset {
10942                        stack.push(("TopologyChangeAck", last_off));
10943                        break;
10944                    }
10945                }
10946                LinkinfoBrportAttrs::ConfigPending(val) => {
10947                    if last_off == offset {
10948                        stack.push(("ConfigPending", last_off));
10949                        break;
10950                    }
10951                }
10952                LinkinfoBrportAttrs::MessageAgeTimer(val) => {
10953                    if last_off == offset {
10954                        stack.push(("MessageAgeTimer", last_off));
10955                        break;
10956                    }
10957                }
10958                LinkinfoBrportAttrs::ForwardDelayTimer(val) => {
10959                    if last_off == offset {
10960                        stack.push(("ForwardDelayTimer", last_off));
10961                        break;
10962                    }
10963                }
10964                LinkinfoBrportAttrs::HoldTimer(val) => {
10965                    if last_off == offset {
10966                        stack.push(("HoldTimer", last_off));
10967                        break;
10968                    }
10969                }
10970                LinkinfoBrportAttrs::Flush(val) => {
10971                    if last_off == offset {
10972                        stack.push(("Flush", last_off));
10973                        break;
10974                    }
10975                }
10976                LinkinfoBrportAttrs::MulticastRouter(val) => {
10977                    if last_off == offset {
10978                        stack.push(("MulticastRouter", last_off));
10979                        break;
10980                    }
10981                }
10982                LinkinfoBrportAttrs::Pad(val) => {
10983                    if last_off == offset {
10984                        stack.push(("Pad", last_off));
10985                        break;
10986                    }
10987                }
10988                LinkinfoBrportAttrs::McastFlood(val) => {
10989                    if last_off == offset {
10990                        stack.push(("McastFlood", last_off));
10991                        break;
10992                    }
10993                }
10994                LinkinfoBrportAttrs::McastToUcast(val) => {
10995                    if last_off == offset {
10996                        stack.push(("McastToUcast", last_off));
10997                        break;
10998                    }
10999                }
11000                LinkinfoBrportAttrs::VlanTunnel(val) => {
11001                    if last_off == offset {
11002                        stack.push(("VlanTunnel", last_off));
11003                        break;
11004                    }
11005                }
11006                LinkinfoBrportAttrs::BcastFlood(val) => {
11007                    if last_off == offset {
11008                        stack.push(("BcastFlood", last_off));
11009                        break;
11010                    }
11011                }
11012                LinkinfoBrportAttrs::GroupFwdMask(val) => {
11013                    if last_off == offset {
11014                        stack.push(("GroupFwdMask", last_off));
11015                        break;
11016                    }
11017                }
11018                LinkinfoBrportAttrs::NeighSuppress(val) => {
11019                    if last_off == offset {
11020                        stack.push(("NeighSuppress", last_off));
11021                        break;
11022                    }
11023                }
11024                LinkinfoBrportAttrs::Isolated(val) => {
11025                    if last_off == offset {
11026                        stack.push(("Isolated", last_off));
11027                        break;
11028                    }
11029                }
11030                LinkinfoBrportAttrs::BackupPort(val) => {
11031                    if last_off == offset {
11032                        stack.push(("BackupPort", last_off));
11033                        break;
11034                    }
11035                }
11036                LinkinfoBrportAttrs::MrpRingOpen(val) => {
11037                    if last_off == offset {
11038                        stack.push(("MrpRingOpen", last_off));
11039                        break;
11040                    }
11041                }
11042                LinkinfoBrportAttrs::MrpInOpen(val) => {
11043                    if last_off == offset {
11044                        stack.push(("MrpInOpen", last_off));
11045                        break;
11046                    }
11047                }
11048                LinkinfoBrportAttrs::McastEhtHostsLimit(val) => {
11049                    if last_off == offset {
11050                        stack.push(("McastEhtHostsLimit", last_off));
11051                        break;
11052                    }
11053                }
11054                LinkinfoBrportAttrs::McastEhtHostsCnt(val) => {
11055                    if last_off == offset {
11056                        stack.push(("McastEhtHostsCnt", last_off));
11057                        break;
11058                    }
11059                }
11060                LinkinfoBrportAttrs::Locked(val) => {
11061                    if last_off == offset {
11062                        stack.push(("Locked", last_off));
11063                        break;
11064                    }
11065                }
11066                LinkinfoBrportAttrs::Mab(val) => {
11067                    if last_off == offset {
11068                        stack.push(("Mab", last_off));
11069                        break;
11070                    }
11071                }
11072                LinkinfoBrportAttrs::McastNGroups(val) => {
11073                    if last_off == offset {
11074                        stack.push(("McastNGroups", last_off));
11075                        break;
11076                    }
11077                }
11078                LinkinfoBrportAttrs::McastMaxGroups(val) => {
11079                    if last_off == offset {
11080                        stack.push(("McastMaxGroups", last_off));
11081                        break;
11082                    }
11083                }
11084                LinkinfoBrportAttrs::NeighVlanSuppress(val) => {
11085                    if last_off == offset {
11086                        stack.push(("NeighVlanSuppress", last_off));
11087                        break;
11088                    }
11089                }
11090                LinkinfoBrportAttrs::BackupNhid(val) => {
11091                    if last_off == offset {
11092                        stack.push(("BackupNhid", last_off));
11093                        break;
11094                    }
11095                }
11096                LinkinfoBrportAttrs::NeighForwardGrat(val) => {
11097                    if last_off == offset {
11098                        stack.push(("NeighForwardGrat", last_off));
11099                        break;
11100                    }
11101                }
11102                _ => {}
11103            };
11104            last_off = cur + attrs.pos;
11105        }
11106        if !stack.is_empty() {
11107            stack.push(("LinkinfoBrportAttrs", cur));
11108        }
11109        (stack, None)
11110    }
11111}
11112#[derive(Clone)]
11113pub enum LinkinfoGreAttrs {
11114    Link(u32),
11115    Iflags(u16),
11116    Oflags(u16),
11117    Ikey(u32),
11118    Okey(u32),
11119    Local(std::net::IpAddr),
11120    Remote(std::net::IpAddr),
11121    Ttl(u8),
11122    Tos(u8),
11123    Pmtudisc(u8),
11124    EncapLimit(u8),
11125    Flowinfo(u32),
11126    Flags(u32),
11127    EncapType(u16),
11128    EncapFlags(u16),
11129    EncapSport(u16),
11130    EncapDport(u16),
11131    CollectMetadata(()),
11132    IgnoreDf(u8),
11133    Fwmark(u32),
11134    ErspanIndex(u32),
11135    ErspanVer(u8),
11136    ErspanDir(u8),
11137    ErspanHwid(u16),
11138}
11139impl<'a> IterableLinkinfoGreAttrs<'a> {
11140    pub fn get_link(&self) -> Result<u32, ErrorContext> {
11141        let mut iter = self.clone();
11142        iter.pos = 0;
11143        for attr in iter {
11144            if let Ok(LinkinfoGreAttrs::Link(val)) = attr {
11145                return Ok(val);
11146            }
11147        }
11148        Err(ErrorContext::new_missing(
11149            "LinkinfoGreAttrs",
11150            "Link",
11151            self.orig_loc,
11152            self.buf.as_ptr() as usize,
11153        ))
11154    }
11155    pub fn get_iflags(&self) -> Result<u16, ErrorContext> {
11156        let mut iter = self.clone();
11157        iter.pos = 0;
11158        for attr in iter {
11159            if let Ok(LinkinfoGreAttrs::Iflags(val)) = attr {
11160                return Ok(val);
11161            }
11162        }
11163        Err(ErrorContext::new_missing(
11164            "LinkinfoGreAttrs",
11165            "Iflags",
11166            self.orig_loc,
11167            self.buf.as_ptr() as usize,
11168        ))
11169    }
11170    pub fn get_oflags(&self) -> Result<u16, ErrorContext> {
11171        let mut iter = self.clone();
11172        iter.pos = 0;
11173        for attr in iter {
11174            if let Ok(LinkinfoGreAttrs::Oflags(val)) = attr {
11175                return Ok(val);
11176            }
11177        }
11178        Err(ErrorContext::new_missing(
11179            "LinkinfoGreAttrs",
11180            "Oflags",
11181            self.orig_loc,
11182            self.buf.as_ptr() as usize,
11183        ))
11184    }
11185    pub fn get_ikey(&self) -> Result<u32, ErrorContext> {
11186        let mut iter = self.clone();
11187        iter.pos = 0;
11188        for attr in iter {
11189            if let Ok(LinkinfoGreAttrs::Ikey(val)) = attr {
11190                return Ok(val);
11191            }
11192        }
11193        Err(ErrorContext::new_missing(
11194            "LinkinfoGreAttrs",
11195            "Ikey",
11196            self.orig_loc,
11197            self.buf.as_ptr() as usize,
11198        ))
11199    }
11200    pub fn get_okey(&self) -> Result<u32, ErrorContext> {
11201        let mut iter = self.clone();
11202        iter.pos = 0;
11203        for attr in iter {
11204            if let Ok(LinkinfoGreAttrs::Okey(val)) = attr {
11205                return Ok(val);
11206            }
11207        }
11208        Err(ErrorContext::new_missing(
11209            "LinkinfoGreAttrs",
11210            "Okey",
11211            self.orig_loc,
11212            self.buf.as_ptr() as usize,
11213        ))
11214    }
11215    pub fn get_local(&self) -> Result<std::net::IpAddr, ErrorContext> {
11216        let mut iter = self.clone();
11217        iter.pos = 0;
11218        for attr in iter {
11219            if let Ok(LinkinfoGreAttrs::Local(val)) = attr {
11220                return Ok(val);
11221            }
11222        }
11223        Err(ErrorContext::new_missing(
11224            "LinkinfoGreAttrs",
11225            "Local",
11226            self.orig_loc,
11227            self.buf.as_ptr() as usize,
11228        ))
11229    }
11230    pub fn get_remote(&self) -> Result<std::net::IpAddr, ErrorContext> {
11231        let mut iter = self.clone();
11232        iter.pos = 0;
11233        for attr in iter {
11234            if let Ok(LinkinfoGreAttrs::Remote(val)) = attr {
11235                return Ok(val);
11236            }
11237        }
11238        Err(ErrorContext::new_missing(
11239            "LinkinfoGreAttrs",
11240            "Remote",
11241            self.orig_loc,
11242            self.buf.as_ptr() as usize,
11243        ))
11244    }
11245    pub fn get_ttl(&self) -> Result<u8, ErrorContext> {
11246        let mut iter = self.clone();
11247        iter.pos = 0;
11248        for attr in iter {
11249            if let Ok(LinkinfoGreAttrs::Ttl(val)) = attr {
11250                return Ok(val);
11251            }
11252        }
11253        Err(ErrorContext::new_missing(
11254            "LinkinfoGreAttrs",
11255            "Ttl",
11256            self.orig_loc,
11257            self.buf.as_ptr() as usize,
11258        ))
11259    }
11260    pub fn get_tos(&self) -> Result<u8, ErrorContext> {
11261        let mut iter = self.clone();
11262        iter.pos = 0;
11263        for attr in iter {
11264            if let Ok(LinkinfoGreAttrs::Tos(val)) = attr {
11265                return Ok(val);
11266            }
11267        }
11268        Err(ErrorContext::new_missing(
11269            "LinkinfoGreAttrs",
11270            "Tos",
11271            self.orig_loc,
11272            self.buf.as_ptr() as usize,
11273        ))
11274    }
11275    pub fn get_pmtudisc(&self) -> Result<u8, ErrorContext> {
11276        let mut iter = self.clone();
11277        iter.pos = 0;
11278        for attr in iter {
11279            if let Ok(LinkinfoGreAttrs::Pmtudisc(val)) = attr {
11280                return Ok(val);
11281            }
11282        }
11283        Err(ErrorContext::new_missing(
11284            "LinkinfoGreAttrs",
11285            "Pmtudisc",
11286            self.orig_loc,
11287            self.buf.as_ptr() as usize,
11288        ))
11289    }
11290    pub fn get_encap_limit(&self) -> Result<u8, ErrorContext> {
11291        let mut iter = self.clone();
11292        iter.pos = 0;
11293        for attr in iter {
11294            if let Ok(LinkinfoGreAttrs::EncapLimit(val)) = attr {
11295                return Ok(val);
11296            }
11297        }
11298        Err(ErrorContext::new_missing(
11299            "LinkinfoGreAttrs",
11300            "EncapLimit",
11301            self.orig_loc,
11302            self.buf.as_ptr() as usize,
11303        ))
11304    }
11305    pub fn get_flowinfo(&self) -> Result<u32, ErrorContext> {
11306        let mut iter = self.clone();
11307        iter.pos = 0;
11308        for attr in iter {
11309            if let Ok(LinkinfoGreAttrs::Flowinfo(val)) = attr {
11310                return Ok(val);
11311            }
11312        }
11313        Err(ErrorContext::new_missing(
11314            "LinkinfoGreAttrs",
11315            "Flowinfo",
11316            self.orig_loc,
11317            self.buf.as_ptr() as usize,
11318        ))
11319    }
11320    pub fn get_flags(&self) -> Result<u32, ErrorContext> {
11321        let mut iter = self.clone();
11322        iter.pos = 0;
11323        for attr in iter {
11324            if let Ok(LinkinfoGreAttrs::Flags(val)) = attr {
11325                return Ok(val);
11326            }
11327        }
11328        Err(ErrorContext::new_missing(
11329            "LinkinfoGreAttrs",
11330            "Flags",
11331            self.orig_loc,
11332            self.buf.as_ptr() as usize,
11333        ))
11334    }
11335    pub fn get_encap_type(&self) -> Result<u16, ErrorContext> {
11336        let mut iter = self.clone();
11337        iter.pos = 0;
11338        for attr in iter {
11339            if let Ok(LinkinfoGreAttrs::EncapType(val)) = attr {
11340                return Ok(val);
11341            }
11342        }
11343        Err(ErrorContext::new_missing(
11344            "LinkinfoGreAttrs",
11345            "EncapType",
11346            self.orig_loc,
11347            self.buf.as_ptr() as usize,
11348        ))
11349    }
11350    pub fn get_encap_flags(&self) -> Result<u16, ErrorContext> {
11351        let mut iter = self.clone();
11352        iter.pos = 0;
11353        for attr in iter {
11354            if let Ok(LinkinfoGreAttrs::EncapFlags(val)) = attr {
11355                return Ok(val);
11356            }
11357        }
11358        Err(ErrorContext::new_missing(
11359            "LinkinfoGreAttrs",
11360            "EncapFlags",
11361            self.orig_loc,
11362            self.buf.as_ptr() as usize,
11363        ))
11364    }
11365    pub fn get_encap_sport(&self) -> Result<u16, ErrorContext> {
11366        let mut iter = self.clone();
11367        iter.pos = 0;
11368        for attr in iter {
11369            if let Ok(LinkinfoGreAttrs::EncapSport(val)) = attr {
11370                return Ok(val);
11371            }
11372        }
11373        Err(ErrorContext::new_missing(
11374            "LinkinfoGreAttrs",
11375            "EncapSport",
11376            self.orig_loc,
11377            self.buf.as_ptr() as usize,
11378        ))
11379    }
11380    pub fn get_encap_dport(&self) -> Result<u16, ErrorContext> {
11381        let mut iter = self.clone();
11382        iter.pos = 0;
11383        for attr in iter {
11384            if let Ok(LinkinfoGreAttrs::EncapDport(val)) = attr {
11385                return Ok(val);
11386            }
11387        }
11388        Err(ErrorContext::new_missing(
11389            "LinkinfoGreAttrs",
11390            "EncapDport",
11391            self.orig_loc,
11392            self.buf.as_ptr() as usize,
11393        ))
11394    }
11395    pub fn get_collect_metadata(&self) -> Result<(), ErrorContext> {
11396        let mut iter = self.clone();
11397        iter.pos = 0;
11398        for attr in iter {
11399            if let Ok(LinkinfoGreAttrs::CollectMetadata(val)) = attr {
11400                return Ok(val);
11401            }
11402        }
11403        Err(ErrorContext::new_missing(
11404            "LinkinfoGreAttrs",
11405            "CollectMetadata",
11406            self.orig_loc,
11407            self.buf.as_ptr() as usize,
11408        ))
11409    }
11410    pub fn get_ignore_df(&self) -> Result<u8, ErrorContext> {
11411        let mut iter = self.clone();
11412        iter.pos = 0;
11413        for attr in iter {
11414            if let Ok(LinkinfoGreAttrs::IgnoreDf(val)) = attr {
11415                return Ok(val);
11416            }
11417        }
11418        Err(ErrorContext::new_missing(
11419            "LinkinfoGreAttrs",
11420            "IgnoreDf",
11421            self.orig_loc,
11422            self.buf.as_ptr() as usize,
11423        ))
11424    }
11425    pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
11426        let mut iter = self.clone();
11427        iter.pos = 0;
11428        for attr in iter {
11429            if let Ok(LinkinfoGreAttrs::Fwmark(val)) = attr {
11430                return Ok(val);
11431            }
11432        }
11433        Err(ErrorContext::new_missing(
11434            "LinkinfoGreAttrs",
11435            "Fwmark",
11436            self.orig_loc,
11437            self.buf.as_ptr() as usize,
11438        ))
11439    }
11440    pub fn get_erspan_index(&self) -> Result<u32, ErrorContext> {
11441        let mut iter = self.clone();
11442        iter.pos = 0;
11443        for attr in iter {
11444            if let Ok(LinkinfoGreAttrs::ErspanIndex(val)) = attr {
11445                return Ok(val);
11446            }
11447        }
11448        Err(ErrorContext::new_missing(
11449            "LinkinfoGreAttrs",
11450            "ErspanIndex",
11451            self.orig_loc,
11452            self.buf.as_ptr() as usize,
11453        ))
11454    }
11455    pub fn get_erspan_ver(&self) -> Result<u8, ErrorContext> {
11456        let mut iter = self.clone();
11457        iter.pos = 0;
11458        for attr in iter {
11459            if let Ok(LinkinfoGreAttrs::ErspanVer(val)) = attr {
11460                return Ok(val);
11461            }
11462        }
11463        Err(ErrorContext::new_missing(
11464            "LinkinfoGreAttrs",
11465            "ErspanVer",
11466            self.orig_loc,
11467            self.buf.as_ptr() as usize,
11468        ))
11469    }
11470    pub fn get_erspan_dir(&self) -> Result<u8, ErrorContext> {
11471        let mut iter = self.clone();
11472        iter.pos = 0;
11473        for attr in iter {
11474            if let Ok(LinkinfoGreAttrs::ErspanDir(val)) = attr {
11475                return Ok(val);
11476            }
11477        }
11478        Err(ErrorContext::new_missing(
11479            "LinkinfoGreAttrs",
11480            "ErspanDir",
11481            self.orig_loc,
11482            self.buf.as_ptr() as usize,
11483        ))
11484    }
11485    pub fn get_erspan_hwid(&self) -> Result<u16, ErrorContext> {
11486        let mut iter = self.clone();
11487        iter.pos = 0;
11488        for attr in iter {
11489            if let Ok(LinkinfoGreAttrs::ErspanHwid(val)) = attr {
11490                return Ok(val);
11491            }
11492        }
11493        Err(ErrorContext::new_missing(
11494            "LinkinfoGreAttrs",
11495            "ErspanHwid",
11496            self.orig_loc,
11497            self.buf.as_ptr() as usize,
11498        ))
11499    }
11500}
11501impl LinkinfoGreAttrs {
11502    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoGreAttrs<'a> {
11503        IterableLinkinfoGreAttrs::with_loc(buf, buf.as_ptr() as usize)
11504    }
11505    fn attr_from_type(r#type: u16) -> Option<&'static str> {
11506        let res = match r#type {
11507            1u16 => "Link",
11508            2u16 => "Iflags",
11509            3u16 => "Oflags",
11510            4u16 => "Ikey",
11511            5u16 => "Okey",
11512            6u16 => "Local",
11513            7u16 => "Remote",
11514            8u16 => "Ttl",
11515            9u16 => "Tos",
11516            10u16 => "Pmtudisc",
11517            11u16 => "EncapLimit",
11518            12u16 => "Flowinfo",
11519            13u16 => "Flags",
11520            14u16 => "EncapType",
11521            15u16 => "EncapFlags",
11522            16u16 => "EncapSport",
11523            17u16 => "EncapDport",
11524            18u16 => "CollectMetadata",
11525            19u16 => "IgnoreDf",
11526            20u16 => "Fwmark",
11527            21u16 => "ErspanIndex",
11528            22u16 => "ErspanVer",
11529            23u16 => "ErspanDir",
11530            24u16 => "ErspanHwid",
11531            _ => return None,
11532        };
11533        Some(res)
11534    }
11535}
11536#[derive(Clone, Copy, Default)]
11537pub struct IterableLinkinfoGreAttrs<'a> {
11538    buf: &'a [u8],
11539    pos: usize,
11540    orig_loc: usize,
11541}
11542impl<'a> IterableLinkinfoGreAttrs<'a> {
11543    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11544        Self {
11545            buf,
11546            pos: 0,
11547            orig_loc,
11548        }
11549    }
11550    pub fn get_buf(&self) -> &'a [u8] {
11551        self.buf
11552    }
11553}
11554impl<'a> Iterator for IterableLinkinfoGreAttrs<'a> {
11555    type Item = Result<LinkinfoGreAttrs, ErrorContext>;
11556    fn next(&mut self) -> Option<Self::Item> {
11557        let mut pos;
11558        let mut r#type;
11559        loop {
11560            pos = self.pos;
11561            r#type = None;
11562            if self.buf.len() == self.pos {
11563                return None;
11564            }
11565            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11566                self.pos = self.buf.len();
11567                break;
11568            };
11569            r#type = Some(header.r#type);
11570            let res = match header.r#type {
11571                1u16 => LinkinfoGreAttrs::Link({
11572                    let res = parse_u32(next);
11573                    let Some(val) = res else { break };
11574                    val
11575                }),
11576                2u16 => LinkinfoGreAttrs::Iflags({
11577                    let res = parse_be_u16(next);
11578                    let Some(val) = res else { break };
11579                    val
11580                }),
11581                3u16 => LinkinfoGreAttrs::Oflags({
11582                    let res = parse_be_u16(next);
11583                    let Some(val) = res else { break };
11584                    val
11585                }),
11586                4u16 => LinkinfoGreAttrs::Ikey({
11587                    let res = parse_be_u32(next);
11588                    let Some(val) = res else { break };
11589                    val
11590                }),
11591                5u16 => LinkinfoGreAttrs::Okey({
11592                    let res = parse_be_u32(next);
11593                    let Some(val) = res else { break };
11594                    val
11595                }),
11596                6u16 => LinkinfoGreAttrs::Local({
11597                    let res = parse_ip(next);
11598                    let Some(val) = res else { break };
11599                    val
11600                }),
11601                7u16 => LinkinfoGreAttrs::Remote({
11602                    let res = parse_ip(next);
11603                    let Some(val) = res else { break };
11604                    val
11605                }),
11606                8u16 => LinkinfoGreAttrs::Ttl({
11607                    let res = parse_u8(next);
11608                    let Some(val) = res else { break };
11609                    val
11610                }),
11611                9u16 => LinkinfoGreAttrs::Tos({
11612                    let res = parse_u8(next);
11613                    let Some(val) = res else { break };
11614                    val
11615                }),
11616                10u16 => LinkinfoGreAttrs::Pmtudisc({
11617                    let res = parse_u8(next);
11618                    let Some(val) = res else { break };
11619                    val
11620                }),
11621                11u16 => LinkinfoGreAttrs::EncapLimit({
11622                    let res = parse_u8(next);
11623                    let Some(val) = res else { break };
11624                    val
11625                }),
11626                12u16 => LinkinfoGreAttrs::Flowinfo({
11627                    let res = parse_be_u32(next);
11628                    let Some(val) = res else { break };
11629                    val
11630                }),
11631                13u16 => LinkinfoGreAttrs::Flags({
11632                    let res = parse_u32(next);
11633                    let Some(val) = res else { break };
11634                    val
11635                }),
11636                14u16 => LinkinfoGreAttrs::EncapType({
11637                    let res = parse_u16(next);
11638                    let Some(val) = res else { break };
11639                    val
11640                }),
11641                15u16 => LinkinfoGreAttrs::EncapFlags({
11642                    let res = parse_u16(next);
11643                    let Some(val) = res else { break };
11644                    val
11645                }),
11646                16u16 => LinkinfoGreAttrs::EncapSport({
11647                    let res = parse_be_u16(next);
11648                    let Some(val) = res else { break };
11649                    val
11650                }),
11651                17u16 => LinkinfoGreAttrs::EncapDport({
11652                    let res = parse_be_u16(next);
11653                    let Some(val) = res else { break };
11654                    val
11655                }),
11656                18u16 => LinkinfoGreAttrs::CollectMetadata(()),
11657                19u16 => LinkinfoGreAttrs::IgnoreDf({
11658                    let res = parse_u8(next);
11659                    let Some(val) = res else { break };
11660                    val
11661                }),
11662                20u16 => LinkinfoGreAttrs::Fwmark({
11663                    let res = parse_u32(next);
11664                    let Some(val) = res else { break };
11665                    val
11666                }),
11667                21u16 => LinkinfoGreAttrs::ErspanIndex({
11668                    let res = parse_u32(next);
11669                    let Some(val) = res else { break };
11670                    val
11671                }),
11672                22u16 => LinkinfoGreAttrs::ErspanVer({
11673                    let res = parse_u8(next);
11674                    let Some(val) = res else { break };
11675                    val
11676                }),
11677                23u16 => LinkinfoGreAttrs::ErspanDir({
11678                    let res = parse_u8(next);
11679                    let Some(val) = res else { break };
11680                    val
11681                }),
11682                24u16 => LinkinfoGreAttrs::ErspanHwid({
11683                    let res = parse_u16(next);
11684                    let Some(val) = res else { break };
11685                    val
11686                }),
11687                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11688                n => continue,
11689            };
11690            return Some(Ok(res));
11691        }
11692        Some(Err(ErrorContext::new(
11693            "LinkinfoGreAttrs",
11694            r#type.and_then(|t| LinkinfoGreAttrs::attr_from_type(t)),
11695            self.orig_loc,
11696            self.buf.as_ptr().wrapping_add(pos) as usize,
11697        )))
11698    }
11699}
11700impl std::fmt::Debug for IterableLinkinfoGreAttrs<'_> {
11701    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11702        let mut fmt = f.debug_struct("LinkinfoGreAttrs");
11703        for attr in self.clone() {
11704            let attr = match attr {
11705                Ok(a) => a,
11706                Err(err) => {
11707                    fmt.finish()?;
11708                    f.write_str("Err(")?;
11709                    err.fmt(f)?;
11710                    return f.write_str(")");
11711                }
11712            };
11713            match attr {
11714                LinkinfoGreAttrs::Link(val) => fmt.field("Link", &val),
11715                LinkinfoGreAttrs::Iflags(val) => fmt.field("Iflags", &val),
11716                LinkinfoGreAttrs::Oflags(val) => fmt.field("Oflags", &val),
11717                LinkinfoGreAttrs::Ikey(val) => fmt.field("Ikey", &val),
11718                LinkinfoGreAttrs::Okey(val) => fmt.field("Okey", &val),
11719                LinkinfoGreAttrs::Local(val) => fmt.field("Local", &val),
11720                LinkinfoGreAttrs::Remote(val) => fmt.field("Remote", &val),
11721                LinkinfoGreAttrs::Ttl(val) => fmt.field("Ttl", &val),
11722                LinkinfoGreAttrs::Tos(val) => fmt.field("Tos", &val),
11723                LinkinfoGreAttrs::Pmtudisc(val) => fmt.field("Pmtudisc", &val),
11724                LinkinfoGreAttrs::EncapLimit(val) => fmt.field("EncapLimit", &val),
11725                LinkinfoGreAttrs::Flowinfo(val) => fmt.field("Flowinfo", &val),
11726                LinkinfoGreAttrs::Flags(val) => fmt.field("Flags", &val),
11727                LinkinfoGreAttrs::EncapType(val) => fmt.field("EncapType", &val),
11728                LinkinfoGreAttrs::EncapFlags(val) => fmt.field("EncapFlags", &val),
11729                LinkinfoGreAttrs::EncapSport(val) => fmt.field("EncapSport", &val),
11730                LinkinfoGreAttrs::EncapDport(val) => fmt.field("EncapDport", &val),
11731                LinkinfoGreAttrs::CollectMetadata(val) => fmt.field("CollectMetadata", &val),
11732                LinkinfoGreAttrs::IgnoreDf(val) => fmt.field("IgnoreDf", &val),
11733                LinkinfoGreAttrs::Fwmark(val) => fmt.field("Fwmark", &val),
11734                LinkinfoGreAttrs::ErspanIndex(val) => fmt.field("ErspanIndex", &val),
11735                LinkinfoGreAttrs::ErspanVer(val) => fmt.field("ErspanVer", &val),
11736                LinkinfoGreAttrs::ErspanDir(val) => fmt.field("ErspanDir", &val),
11737                LinkinfoGreAttrs::ErspanHwid(val) => fmt.field("ErspanHwid", &val),
11738            };
11739        }
11740        fmt.finish()
11741    }
11742}
11743impl IterableLinkinfoGreAttrs<'_> {
11744    pub fn lookup_attr(
11745        &self,
11746        offset: usize,
11747        missing_type: Option<u16>,
11748    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11749        let mut stack = Vec::new();
11750        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11751        if missing_type.is_some() && cur == offset {
11752            stack.push(("LinkinfoGreAttrs", offset));
11753            return (
11754                stack,
11755                missing_type.and_then(|t| LinkinfoGreAttrs::attr_from_type(t)),
11756            );
11757        }
11758        if cur > offset || cur + self.buf.len() < offset {
11759            return (stack, None);
11760        }
11761        let mut attrs = self.clone();
11762        let mut last_off = cur + attrs.pos;
11763        while let Some(attr) = attrs.next() {
11764            let Ok(attr) = attr else { break };
11765            match attr {
11766                LinkinfoGreAttrs::Link(val) => {
11767                    if last_off == offset {
11768                        stack.push(("Link", last_off));
11769                        break;
11770                    }
11771                }
11772                LinkinfoGreAttrs::Iflags(val) => {
11773                    if last_off == offset {
11774                        stack.push(("Iflags", last_off));
11775                        break;
11776                    }
11777                }
11778                LinkinfoGreAttrs::Oflags(val) => {
11779                    if last_off == offset {
11780                        stack.push(("Oflags", last_off));
11781                        break;
11782                    }
11783                }
11784                LinkinfoGreAttrs::Ikey(val) => {
11785                    if last_off == offset {
11786                        stack.push(("Ikey", last_off));
11787                        break;
11788                    }
11789                }
11790                LinkinfoGreAttrs::Okey(val) => {
11791                    if last_off == offset {
11792                        stack.push(("Okey", last_off));
11793                        break;
11794                    }
11795                }
11796                LinkinfoGreAttrs::Local(val) => {
11797                    if last_off == offset {
11798                        stack.push(("Local", last_off));
11799                        break;
11800                    }
11801                }
11802                LinkinfoGreAttrs::Remote(val) => {
11803                    if last_off == offset {
11804                        stack.push(("Remote", last_off));
11805                        break;
11806                    }
11807                }
11808                LinkinfoGreAttrs::Ttl(val) => {
11809                    if last_off == offset {
11810                        stack.push(("Ttl", last_off));
11811                        break;
11812                    }
11813                }
11814                LinkinfoGreAttrs::Tos(val) => {
11815                    if last_off == offset {
11816                        stack.push(("Tos", last_off));
11817                        break;
11818                    }
11819                }
11820                LinkinfoGreAttrs::Pmtudisc(val) => {
11821                    if last_off == offset {
11822                        stack.push(("Pmtudisc", last_off));
11823                        break;
11824                    }
11825                }
11826                LinkinfoGreAttrs::EncapLimit(val) => {
11827                    if last_off == offset {
11828                        stack.push(("EncapLimit", last_off));
11829                        break;
11830                    }
11831                }
11832                LinkinfoGreAttrs::Flowinfo(val) => {
11833                    if last_off == offset {
11834                        stack.push(("Flowinfo", last_off));
11835                        break;
11836                    }
11837                }
11838                LinkinfoGreAttrs::Flags(val) => {
11839                    if last_off == offset {
11840                        stack.push(("Flags", last_off));
11841                        break;
11842                    }
11843                }
11844                LinkinfoGreAttrs::EncapType(val) => {
11845                    if last_off == offset {
11846                        stack.push(("EncapType", last_off));
11847                        break;
11848                    }
11849                }
11850                LinkinfoGreAttrs::EncapFlags(val) => {
11851                    if last_off == offset {
11852                        stack.push(("EncapFlags", last_off));
11853                        break;
11854                    }
11855                }
11856                LinkinfoGreAttrs::EncapSport(val) => {
11857                    if last_off == offset {
11858                        stack.push(("EncapSport", last_off));
11859                        break;
11860                    }
11861                }
11862                LinkinfoGreAttrs::EncapDport(val) => {
11863                    if last_off == offset {
11864                        stack.push(("EncapDport", last_off));
11865                        break;
11866                    }
11867                }
11868                LinkinfoGreAttrs::CollectMetadata(val) => {
11869                    if last_off == offset {
11870                        stack.push(("CollectMetadata", last_off));
11871                        break;
11872                    }
11873                }
11874                LinkinfoGreAttrs::IgnoreDf(val) => {
11875                    if last_off == offset {
11876                        stack.push(("IgnoreDf", last_off));
11877                        break;
11878                    }
11879                }
11880                LinkinfoGreAttrs::Fwmark(val) => {
11881                    if last_off == offset {
11882                        stack.push(("Fwmark", last_off));
11883                        break;
11884                    }
11885                }
11886                LinkinfoGreAttrs::ErspanIndex(val) => {
11887                    if last_off == offset {
11888                        stack.push(("ErspanIndex", last_off));
11889                        break;
11890                    }
11891                }
11892                LinkinfoGreAttrs::ErspanVer(val) => {
11893                    if last_off == offset {
11894                        stack.push(("ErspanVer", last_off));
11895                        break;
11896                    }
11897                }
11898                LinkinfoGreAttrs::ErspanDir(val) => {
11899                    if last_off == offset {
11900                        stack.push(("ErspanDir", last_off));
11901                        break;
11902                    }
11903                }
11904                LinkinfoGreAttrs::ErspanHwid(val) => {
11905                    if last_off == offset {
11906                        stack.push(("ErspanHwid", last_off));
11907                        break;
11908                    }
11909                }
11910                _ => {}
11911            };
11912            last_off = cur + attrs.pos;
11913        }
11914        if !stack.is_empty() {
11915            stack.push(("LinkinfoGreAttrs", cur));
11916        }
11917        (stack, None)
11918    }
11919}
11920#[derive(Clone)]
11921pub enum LinkinfoGre6Attrs<'a> {
11922    Link(u32),
11923    Iflags(u16),
11924    Oflags(u16),
11925    Ikey(u32),
11926    Okey(u32),
11927    Local(&'a [u8]),
11928    Remote(&'a [u8]),
11929    Ttl(u8),
11930    EncapLimit(u8),
11931    Flowinfo(u32),
11932    Flags(u32),
11933    EncapType(u16),
11934    EncapFlags(u16),
11935    EncapSport(u16),
11936    EncapDport(u16),
11937    CollectMetadata(()),
11938    Fwmark(u32),
11939    ErspanIndex(u32),
11940    ErspanVer(u8),
11941    ErspanDir(u8),
11942    ErspanHwid(u16),
11943}
11944impl<'a> IterableLinkinfoGre6Attrs<'a> {
11945    pub fn get_link(&self) -> Result<u32, ErrorContext> {
11946        let mut iter = self.clone();
11947        iter.pos = 0;
11948        for attr in iter {
11949            if let Ok(LinkinfoGre6Attrs::Link(val)) = attr {
11950                return Ok(val);
11951            }
11952        }
11953        Err(ErrorContext::new_missing(
11954            "LinkinfoGre6Attrs",
11955            "Link",
11956            self.orig_loc,
11957            self.buf.as_ptr() as usize,
11958        ))
11959    }
11960    pub fn get_iflags(&self) -> Result<u16, ErrorContext> {
11961        let mut iter = self.clone();
11962        iter.pos = 0;
11963        for attr in iter {
11964            if let Ok(LinkinfoGre6Attrs::Iflags(val)) = attr {
11965                return Ok(val);
11966            }
11967        }
11968        Err(ErrorContext::new_missing(
11969            "LinkinfoGre6Attrs",
11970            "Iflags",
11971            self.orig_loc,
11972            self.buf.as_ptr() as usize,
11973        ))
11974    }
11975    pub fn get_oflags(&self) -> Result<u16, ErrorContext> {
11976        let mut iter = self.clone();
11977        iter.pos = 0;
11978        for attr in iter {
11979            if let Ok(LinkinfoGre6Attrs::Oflags(val)) = attr {
11980                return Ok(val);
11981            }
11982        }
11983        Err(ErrorContext::new_missing(
11984            "LinkinfoGre6Attrs",
11985            "Oflags",
11986            self.orig_loc,
11987            self.buf.as_ptr() as usize,
11988        ))
11989    }
11990    pub fn get_ikey(&self) -> Result<u32, ErrorContext> {
11991        let mut iter = self.clone();
11992        iter.pos = 0;
11993        for attr in iter {
11994            if let Ok(LinkinfoGre6Attrs::Ikey(val)) = attr {
11995                return Ok(val);
11996            }
11997        }
11998        Err(ErrorContext::new_missing(
11999            "LinkinfoGre6Attrs",
12000            "Ikey",
12001            self.orig_loc,
12002            self.buf.as_ptr() as usize,
12003        ))
12004    }
12005    pub fn get_okey(&self) -> Result<u32, ErrorContext> {
12006        let mut iter = self.clone();
12007        iter.pos = 0;
12008        for attr in iter {
12009            if let Ok(LinkinfoGre6Attrs::Okey(val)) = attr {
12010                return Ok(val);
12011            }
12012        }
12013        Err(ErrorContext::new_missing(
12014            "LinkinfoGre6Attrs",
12015            "Okey",
12016            self.orig_loc,
12017            self.buf.as_ptr() as usize,
12018        ))
12019    }
12020    pub fn get_local(&self) -> Result<&'a [u8], ErrorContext> {
12021        let mut iter = self.clone();
12022        iter.pos = 0;
12023        for attr in iter {
12024            if let Ok(LinkinfoGre6Attrs::Local(val)) = attr {
12025                return Ok(val);
12026            }
12027        }
12028        Err(ErrorContext::new_missing(
12029            "LinkinfoGre6Attrs",
12030            "Local",
12031            self.orig_loc,
12032            self.buf.as_ptr() as usize,
12033        ))
12034    }
12035    pub fn get_remote(&self) -> Result<&'a [u8], ErrorContext> {
12036        let mut iter = self.clone();
12037        iter.pos = 0;
12038        for attr in iter {
12039            if let Ok(LinkinfoGre6Attrs::Remote(val)) = attr {
12040                return Ok(val);
12041            }
12042        }
12043        Err(ErrorContext::new_missing(
12044            "LinkinfoGre6Attrs",
12045            "Remote",
12046            self.orig_loc,
12047            self.buf.as_ptr() as usize,
12048        ))
12049    }
12050    pub fn get_ttl(&self) -> Result<u8, ErrorContext> {
12051        let mut iter = self.clone();
12052        iter.pos = 0;
12053        for attr in iter {
12054            if let Ok(LinkinfoGre6Attrs::Ttl(val)) = attr {
12055                return Ok(val);
12056            }
12057        }
12058        Err(ErrorContext::new_missing(
12059            "LinkinfoGre6Attrs",
12060            "Ttl",
12061            self.orig_loc,
12062            self.buf.as_ptr() as usize,
12063        ))
12064    }
12065    pub fn get_encap_limit(&self) -> Result<u8, ErrorContext> {
12066        let mut iter = self.clone();
12067        iter.pos = 0;
12068        for attr in iter {
12069            if let Ok(LinkinfoGre6Attrs::EncapLimit(val)) = attr {
12070                return Ok(val);
12071            }
12072        }
12073        Err(ErrorContext::new_missing(
12074            "LinkinfoGre6Attrs",
12075            "EncapLimit",
12076            self.orig_loc,
12077            self.buf.as_ptr() as usize,
12078        ))
12079    }
12080    pub fn get_flowinfo(&self) -> Result<u32, ErrorContext> {
12081        let mut iter = self.clone();
12082        iter.pos = 0;
12083        for attr in iter {
12084            if let Ok(LinkinfoGre6Attrs::Flowinfo(val)) = attr {
12085                return Ok(val);
12086            }
12087        }
12088        Err(ErrorContext::new_missing(
12089            "LinkinfoGre6Attrs",
12090            "Flowinfo",
12091            self.orig_loc,
12092            self.buf.as_ptr() as usize,
12093        ))
12094    }
12095    pub fn get_flags(&self) -> Result<u32, ErrorContext> {
12096        let mut iter = self.clone();
12097        iter.pos = 0;
12098        for attr in iter {
12099            if let Ok(LinkinfoGre6Attrs::Flags(val)) = attr {
12100                return Ok(val);
12101            }
12102        }
12103        Err(ErrorContext::new_missing(
12104            "LinkinfoGre6Attrs",
12105            "Flags",
12106            self.orig_loc,
12107            self.buf.as_ptr() as usize,
12108        ))
12109    }
12110    pub fn get_encap_type(&self) -> Result<u16, ErrorContext> {
12111        let mut iter = self.clone();
12112        iter.pos = 0;
12113        for attr in iter {
12114            if let Ok(LinkinfoGre6Attrs::EncapType(val)) = attr {
12115                return Ok(val);
12116            }
12117        }
12118        Err(ErrorContext::new_missing(
12119            "LinkinfoGre6Attrs",
12120            "EncapType",
12121            self.orig_loc,
12122            self.buf.as_ptr() as usize,
12123        ))
12124    }
12125    pub fn get_encap_flags(&self) -> Result<u16, ErrorContext> {
12126        let mut iter = self.clone();
12127        iter.pos = 0;
12128        for attr in iter {
12129            if let Ok(LinkinfoGre6Attrs::EncapFlags(val)) = attr {
12130                return Ok(val);
12131            }
12132        }
12133        Err(ErrorContext::new_missing(
12134            "LinkinfoGre6Attrs",
12135            "EncapFlags",
12136            self.orig_loc,
12137            self.buf.as_ptr() as usize,
12138        ))
12139    }
12140    pub fn get_encap_sport(&self) -> Result<u16, ErrorContext> {
12141        let mut iter = self.clone();
12142        iter.pos = 0;
12143        for attr in iter {
12144            if let Ok(LinkinfoGre6Attrs::EncapSport(val)) = attr {
12145                return Ok(val);
12146            }
12147        }
12148        Err(ErrorContext::new_missing(
12149            "LinkinfoGre6Attrs",
12150            "EncapSport",
12151            self.orig_loc,
12152            self.buf.as_ptr() as usize,
12153        ))
12154    }
12155    pub fn get_encap_dport(&self) -> Result<u16, ErrorContext> {
12156        let mut iter = self.clone();
12157        iter.pos = 0;
12158        for attr in iter {
12159            if let Ok(LinkinfoGre6Attrs::EncapDport(val)) = attr {
12160                return Ok(val);
12161            }
12162        }
12163        Err(ErrorContext::new_missing(
12164            "LinkinfoGre6Attrs",
12165            "EncapDport",
12166            self.orig_loc,
12167            self.buf.as_ptr() as usize,
12168        ))
12169    }
12170    pub fn get_collect_metadata(&self) -> Result<(), ErrorContext> {
12171        let mut iter = self.clone();
12172        iter.pos = 0;
12173        for attr in iter {
12174            if let Ok(LinkinfoGre6Attrs::CollectMetadata(val)) = attr {
12175                return Ok(val);
12176            }
12177        }
12178        Err(ErrorContext::new_missing(
12179            "LinkinfoGre6Attrs",
12180            "CollectMetadata",
12181            self.orig_loc,
12182            self.buf.as_ptr() as usize,
12183        ))
12184    }
12185    pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
12186        let mut iter = self.clone();
12187        iter.pos = 0;
12188        for attr in iter {
12189            if let Ok(LinkinfoGre6Attrs::Fwmark(val)) = attr {
12190                return Ok(val);
12191            }
12192        }
12193        Err(ErrorContext::new_missing(
12194            "LinkinfoGre6Attrs",
12195            "Fwmark",
12196            self.orig_loc,
12197            self.buf.as_ptr() as usize,
12198        ))
12199    }
12200    pub fn get_erspan_index(&self) -> Result<u32, ErrorContext> {
12201        let mut iter = self.clone();
12202        iter.pos = 0;
12203        for attr in iter {
12204            if let Ok(LinkinfoGre6Attrs::ErspanIndex(val)) = attr {
12205                return Ok(val);
12206            }
12207        }
12208        Err(ErrorContext::new_missing(
12209            "LinkinfoGre6Attrs",
12210            "ErspanIndex",
12211            self.orig_loc,
12212            self.buf.as_ptr() as usize,
12213        ))
12214    }
12215    pub fn get_erspan_ver(&self) -> Result<u8, ErrorContext> {
12216        let mut iter = self.clone();
12217        iter.pos = 0;
12218        for attr in iter {
12219            if let Ok(LinkinfoGre6Attrs::ErspanVer(val)) = attr {
12220                return Ok(val);
12221            }
12222        }
12223        Err(ErrorContext::new_missing(
12224            "LinkinfoGre6Attrs",
12225            "ErspanVer",
12226            self.orig_loc,
12227            self.buf.as_ptr() as usize,
12228        ))
12229    }
12230    pub fn get_erspan_dir(&self) -> Result<u8, ErrorContext> {
12231        let mut iter = self.clone();
12232        iter.pos = 0;
12233        for attr in iter {
12234            if let Ok(LinkinfoGre6Attrs::ErspanDir(val)) = attr {
12235                return Ok(val);
12236            }
12237        }
12238        Err(ErrorContext::new_missing(
12239            "LinkinfoGre6Attrs",
12240            "ErspanDir",
12241            self.orig_loc,
12242            self.buf.as_ptr() as usize,
12243        ))
12244    }
12245    pub fn get_erspan_hwid(&self) -> Result<u16, ErrorContext> {
12246        let mut iter = self.clone();
12247        iter.pos = 0;
12248        for attr in iter {
12249            if let Ok(LinkinfoGre6Attrs::ErspanHwid(val)) = attr {
12250                return Ok(val);
12251            }
12252        }
12253        Err(ErrorContext::new_missing(
12254            "LinkinfoGre6Attrs",
12255            "ErspanHwid",
12256            self.orig_loc,
12257            self.buf.as_ptr() as usize,
12258        ))
12259    }
12260}
12261impl LinkinfoGre6Attrs<'_> {
12262    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoGre6Attrs<'a> {
12263        IterableLinkinfoGre6Attrs::with_loc(buf, buf.as_ptr() as usize)
12264    }
12265    fn attr_from_type(r#type: u16) -> Option<&'static str> {
12266        LinkinfoGreAttrs::attr_from_type(r#type)
12267    }
12268}
12269#[derive(Clone, Copy, Default)]
12270pub struct IterableLinkinfoGre6Attrs<'a> {
12271    buf: &'a [u8],
12272    pos: usize,
12273    orig_loc: usize,
12274}
12275impl<'a> IterableLinkinfoGre6Attrs<'a> {
12276    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12277        Self {
12278            buf,
12279            pos: 0,
12280            orig_loc,
12281        }
12282    }
12283    pub fn get_buf(&self) -> &'a [u8] {
12284        self.buf
12285    }
12286}
12287impl<'a> Iterator for IterableLinkinfoGre6Attrs<'a> {
12288    type Item = Result<LinkinfoGre6Attrs<'a>, ErrorContext>;
12289    fn next(&mut self) -> Option<Self::Item> {
12290        let mut pos;
12291        let mut r#type;
12292        loop {
12293            pos = self.pos;
12294            r#type = None;
12295            if self.buf.len() == self.pos {
12296                return None;
12297            }
12298            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12299                self.pos = self.buf.len();
12300                break;
12301            };
12302            r#type = Some(header.r#type);
12303            let res = match header.r#type {
12304                1u16 => LinkinfoGre6Attrs::Link({
12305                    let res = parse_u32(next);
12306                    let Some(val) = res else { break };
12307                    val
12308                }),
12309                2u16 => LinkinfoGre6Attrs::Iflags({
12310                    let res = parse_be_u16(next);
12311                    let Some(val) = res else { break };
12312                    val
12313                }),
12314                3u16 => LinkinfoGre6Attrs::Oflags({
12315                    let res = parse_be_u16(next);
12316                    let Some(val) = res else { break };
12317                    val
12318                }),
12319                4u16 => LinkinfoGre6Attrs::Ikey({
12320                    let res = parse_be_u32(next);
12321                    let Some(val) = res else { break };
12322                    val
12323                }),
12324                5u16 => LinkinfoGre6Attrs::Okey({
12325                    let res = parse_be_u32(next);
12326                    let Some(val) = res else { break };
12327                    val
12328                }),
12329                6u16 => LinkinfoGre6Attrs::Local({
12330                    let res = Some(next);
12331                    let Some(val) = res else { break };
12332                    val
12333                }),
12334                7u16 => LinkinfoGre6Attrs::Remote({
12335                    let res = Some(next);
12336                    let Some(val) = res else { break };
12337                    val
12338                }),
12339                8u16 => LinkinfoGre6Attrs::Ttl({
12340                    let res = parse_u8(next);
12341                    let Some(val) = res else { break };
12342                    val
12343                }),
12344                11u16 => LinkinfoGre6Attrs::EncapLimit({
12345                    let res = parse_u8(next);
12346                    let Some(val) = res else { break };
12347                    val
12348                }),
12349                12u16 => LinkinfoGre6Attrs::Flowinfo({
12350                    let res = parse_be_u32(next);
12351                    let Some(val) = res else { break };
12352                    val
12353                }),
12354                13u16 => LinkinfoGre6Attrs::Flags({
12355                    let res = parse_u32(next);
12356                    let Some(val) = res else { break };
12357                    val
12358                }),
12359                14u16 => LinkinfoGre6Attrs::EncapType({
12360                    let res = parse_u16(next);
12361                    let Some(val) = res else { break };
12362                    val
12363                }),
12364                15u16 => LinkinfoGre6Attrs::EncapFlags({
12365                    let res = parse_u16(next);
12366                    let Some(val) = res else { break };
12367                    val
12368                }),
12369                16u16 => LinkinfoGre6Attrs::EncapSport({
12370                    let res = parse_be_u16(next);
12371                    let Some(val) = res else { break };
12372                    val
12373                }),
12374                17u16 => LinkinfoGre6Attrs::EncapDport({
12375                    let res = parse_be_u16(next);
12376                    let Some(val) = res else { break };
12377                    val
12378                }),
12379                18u16 => LinkinfoGre6Attrs::CollectMetadata(()),
12380                20u16 => LinkinfoGre6Attrs::Fwmark({
12381                    let res = parse_u32(next);
12382                    let Some(val) = res else { break };
12383                    val
12384                }),
12385                21u16 => LinkinfoGre6Attrs::ErspanIndex({
12386                    let res = parse_u32(next);
12387                    let Some(val) = res else { break };
12388                    val
12389                }),
12390                22u16 => LinkinfoGre6Attrs::ErspanVer({
12391                    let res = parse_u8(next);
12392                    let Some(val) = res else { break };
12393                    val
12394                }),
12395                23u16 => LinkinfoGre6Attrs::ErspanDir({
12396                    let res = parse_u8(next);
12397                    let Some(val) = res else { break };
12398                    val
12399                }),
12400                24u16 => LinkinfoGre6Attrs::ErspanHwid({
12401                    let res = parse_u16(next);
12402                    let Some(val) = res else { break };
12403                    val
12404                }),
12405                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12406                n => continue,
12407            };
12408            return Some(Ok(res));
12409        }
12410        Some(Err(ErrorContext::new(
12411            "LinkinfoGre6Attrs",
12412            r#type.and_then(|t| LinkinfoGre6Attrs::attr_from_type(t)),
12413            self.orig_loc,
12414            self.buf.as_ptr().wrapping_add(pos) as usize,
12415        )))
12416    }
12417}
12418impl<'a> std::fmt::Debug for IterableLinkinfoGre6Attrs<'_> {
12419    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12420        let mut fmt = f.debug_struct("LinkinfoGre6Attrs");
12421        for attr in self.clone() {
12422            let attr = match attr {
12423                Ok(a) => a,
12424                Err(err) => {
12425                    fmt.finish()?;
12426                    f.write_str("Err(")?;
12427                    err.fmt(f)?;
12428                    return f.write_str(")");
12429                }
12430            };
12431            match attr {
12432                LinkinfoGre6Attrs::Link(val) => fmt.field("Link", &val),
12433                LinkinfoGre6Attrs::Iflags(val) => fmt.field("Iflags", &val),
12434                LinkinfoGre6Attrs::Oflags(val) => fmt.field("Oflags", &val),
12435                LinkinfoGre6Attrs::Ikey(val) => fmt.field("Ikey", &val),
12436                LinkinfoGre6Attrs::Okey(val) => fmt.field("Okey", &val),
12437                LinkinfoGre6Attrs::Local(val) => fmt.field("Local", &val),
12438                LinkinfoGre6Attrs::Remote(val) => fmt.field("Remote", &val),
12439                LinkinfoGre6Attrs::Ttl(val) => fmt.field("Ttl", &val),
12440                LinkinfoGre6Attrs::EncapLimit(val) => fmt.field("EncapLimit", &val),
12441                LinkinfoGre6Attrs::Flowinfo(val) => fmt.field("Flowinfo", &val),
12442                LinkinfoGre6Attrs::Flags(val) => fmt.field("Flags", &val),
12443                LinkinfoGre6Attrs::EncapType(val) => fmt.field("EncapType", &val),
12444                LinkinfoGre6Attrs::EncapFlags(val) => fmt.field("EncapFlags", &val),
12445                LinkinfoGre6Attrs::EncapSport(val) => fmt.field("EncapSport", &val),
12446                LinkinfoGre6Attrs::EncapDport(val) => fmt.field("EncapDport", &val),
12447                LinkinfoGre6Attrs::CollectMetadata(val) => fmt.field("CollectMetadata", &val),
12448                LinkinfoGre6Attrs::Fwmark(val) => fmt.field("Fwmark", &val),
12449                LinkinfoGre6Attrs::ErspanIndex(val) => fmt.field("ErspanIndex", &val),
12450                LinkinfoGre6Attrs::ErspanVer(val) => fmt.field("ErspanVer", &val),
12451                LinkinfoGre6Attrs::ErspanDir(val) => fmt.field("ErspanDir", &val),
12452                LinkinfoGre6Attrs::ErspanHwid(val) => fmt.field("ErspanHwid", &val),
12453            };
12454        }
12455        fmt.finish()
12456    }
12457}
12458impl IterableLinkinfoGre6Attrs<'_> {
12459    pub fn lookup_attr(
12460        &self,
12461        offset: usize,
12462        missing_type: Option<u16>,
12463    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12464        let mut stack = Vec::new();
12465        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12466        if missing_type.is_some() && cur == offset {
12467            stack.push(("LinkinfoGre6Attrs", offset));
12468            return (
12469                stack,
12470                missing_type.and_then(|t| LinkinfoGre6Attrs::attr_from_type(t)),
12471            );
12472        }
12473        if cur > offset || cur + self.buf.len() < offset {
12474            return (stack, None);
12475        }
12476        let mut attrs = self.clone();
12477        let mut last_off = cur + attrs.pos;
12478        while let Some(attr) = attrs.next() {
12479            let Ok(attr) = attr else { break };
12480            match attr {
12481                LinkinfoGre6Attrs::Link(val) => {
12482                    if last_off == offset {
12483                        stack.push(("Link", last_off));
12484                        break;
12485                    }
12486                }
12487                LinkinfoGre6Attrs::Iflags(val) => {
12488                    if last_off == offset {
12489                        stack.push(("Iflags", last_off));
12490                        break;
12491                    }
12492                }
12493                LinkinfoGre6Attrs::Oflags(val) => {
12494                    if last_off == offset {
12495                        stack.push(("Oflags", last_off));
12496                        break;
12497                    }
12498                }
12499                LinkinfoGre6Attrs::Ikey(val) => {
12500                    if last_off == offset {
12501                        stack.push(("Ikey", last_off));
12502                        break;
12503                    }
12504                }
12505                LinkinfoGre6Attrs::Okey(val) => {
12506                    if last_off == offset {
12507                        stack.push(("Okey", last_off));
12508                        break;
12509                    }
12510                }
12511                LinkinfoGre6Attrs::Local(val) => {
12512                    if last_off == offset {
12513                        stack.push(("Local", last_off));
12514                        break;
12515                    }
12516                }
12517                LinkinfoGre6Attrs::Remote(val) => {
12518                    if last_off == offset {
12519                        stack.push(("Remote", last_off));
12520                        break;
12521                    }
12522                }
12523                LinkinfoGre6Attrs::Ttl(val) => {
12524                    if last_off == offset {
12525                        stack.push(("Ttl", last_off));
12526                        break;
12527                    }
12528                }
12529                LinkinfoGre6Attrs::EncapLimit(val) => {
12530                    if last_off == offset {
12531                        stack.push(("EncapLimit", last_off));
12532                        break;
12533                    }
12534                }
12535                LinkinfoGre6Attrs::Flowinfo(val) => {
12536                    if last_off == offset {
12537                        stack.push(("Flowinfo", last_off));
12538                        break;
12539                    }
12540                }
12541                LinkinfoGre6Attrs::Flags(val) => {
12542                    if last_off == offset {
12543                        stack.push(("Flags", last_off));
12544                        break;
12545                    }
12546                }
12547                LinkinfoGre6Attrs::EncapType(val) => {
12548                    if last_off == offset {
12549                        stack.push(("EncapType", last_off));
12550                        break;
12551                    }
12552                }
12553                LinkinfoGre6Attrs::EncapFlags(val) => {
12554                    if last_off == offset {
12555                        stack.push(("EncapFlags", last_off));
12556                        break;
12557                    }
12558                }
12559                LinkinfoGre6Attrs::EncapSport(val) => {
12560                    if last_off == offset {
12561                        stack.push(("EncapSport", last_off));
12562                        break;
12563                    }
12564                }
12565                LinkinfoGre6Attrs::EncapDport(val) => {
12566                    if last_off == offset {
12567                        stack.push(("EncapDport", last_off));
12568                        break;
12569                    }
12570                }
12571                LinkinfoGre6Attrs::CollectMetadata(val) => {
12572                    if last_off == offset {
12573                        stack.push(("CollectMetadata", last_off));
12574                        break;
12575                    }
12576                }
12577                LinkinfoGre6Attrs::Fwmark(val) => {
12578                    if last_off == offset {
12579                        stack.push(("Fwmark", last_off));
12580                        break;
12581                    }
12582                }
12583                LinkinfoGre6Attrs::ErspanIndex(val) => {
12584                    if last_off == offset {
12585                        stack.push(("ErspanIndex", last_off));
12586                        break;
12587                    }
12588                }
12589                LinkinfoGre6Attrs::ErspanVer(val) => {
12590                    if last_off == offset {
12591                        stack.push(("ErspanVer", last_off));
12592                        break;
12593                    }
12594                }
12595                LinkinfoGre6Attrs::ErspanDir(val) => {
12596                    if last_off == offset {
12597                        stack.push(("ErspanDir", last_off));
12598                        break;
12599                    }
12600                }
12601                LinkinfoGre6Attrs::ErspanHwid(val) => {
12602                    if last_off == offset {
12603                        stack.push(("ErspanHwid", last_off));
12604                        break;
12605                    }
12606                }
12607                _ => {}
12608            };
12609            last_off = cur + attrs.pos;
12610        }
12611        if !stack.is_empty() {
12612            stack.push(("LinkinfoGre6Attrs", cur));
12613        }
12614        (stack, None)
12615    }
12616}
12617#[derive(Clone)]
12618pub enum LinkinfoVtiAttrs {
12619    Link(u32),
12620    Ikey(u32),
12621    Okey(u32),
12622    Local(std::net::IpAddr),
12623    Remote(std::net::IpAddr),
12624    Fwmark(u32),
12625}
12626impl<'a> IterableLinkinfoVtiAttrs<'a> {
12627    pub fn get_link(&self) -> Result<u32, ErrorContext> {
12628        let mut iter = self.clone();
12629        iter.pos = 0;
12630        for attr in iter {
12631            if let Ok(LinkinfoVtiAttrs::Link(val)) = attr {
12632                return Ok(val);
12633            }
12634        }
12635        Err(ErrorContext::new_missing(
12636            "LinkinfoVtiAttrs",
12637            "Link",
12638            self.orig_loc,
12639            self.buf.as_ptr() as usize,
12640        ))
12641    }
12642    pub fn get_ikey(&self) -> Result<u32, ErrorContext> {
12643        let mut iter = self.clone();
12644        iter.pos = 0;
12645        for attr in iter {
12646            if let Ok(LinkinfoVtiAttrs::Ikey(val)) = attr {
12647                return Ok(val);
12648            }
12649        }
12650        Err(ErrorContext::new_missing(
12651            "LinkinfoVtiAttrs",
12652            "Ikey",
12653            self.orig_loc,
12654            self.buf.as_ptr() as usize,
12655        ))
12656    }
12657    pub fn get_okey(&self) -> Result<u32, ErrorContext> {
12658        let mut iter = self.clone();
12659        iter.pos = 0;
12660        for attr in iter {
12661            if let Ok(LinkinfoVtiAttrs::Okey(val)) = attr {
12662                return Ok(val);
12663            }
12664        }
12665        Err(ErrorContext::new_missing(
12666            "LinkinfoVtiAttrs",
12667            "Okey",
12668            self.orig_loc,
12669            self.buf.as_ptr() as usize,
12670        ))
12671    }
12672    pub fn get_local(&self) -> Result<std::net::IpAddr, ErrorContext> {
12673        let mut iter = self.clone();
12674        iter.pos = 0;
12675        for attr in iter {
12676            if let Ok(LinkinfoVtiAttrs::Local(val)) = attr {
12677                return Ok(val);
12678            }
12679        }
12680        Err(ErrorContext::new_missing(
12681            "LinkinfoVtiAttrs",
12682            "Local",
12683            self.orig_loc,
12684            self.buf.as_ptr() as usize,
12685        ))
12686    }
12687    pub fn get_remote(&self) -> Result<std::net::IpAddr, ErrorContext> {
12688        let mut iter = self.clone();
12689        iter.pos = 0;
12690        for attr in iter {
12691            if let Ok(LinkinfoVtiAttrs::Remote(val)) = attr {
12692                return Ok(val);
12693            }
12694        }
12695        Err(ErrorContext::new_missing(
12696            "LinkinfoVtiAttrs",
12697            "Remote",
12698            self.orig_loc,
12699            self.buf.as_ptr() as usize,
12700        ))
12701    }
12702    pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
12703        let mut iter = self.clone();
12704        iter.pos = 0;
12705        for attr in iter {
12706            if let Ok(LinkinfoVtiAttrs::Fwmark(val)) = attr {
12707                return Ok(val);
12708            }
12709        }
12710        Err(ErrorContext::new_missing(
12711            "LinkinfoVtiAttrs",
12712            "Fwmark",
12713            self.orig_loc,
12714            self.buf.as_ptr() as usize,
12715        ))
12716    }
12717}
12718impl LinkinfoVtiAttrs {
12719    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoVtiAttrs<'a> {
12720        IterableLinkinfoVtiAttrs::with_loc(buf, buf.as_ptr() as usize)
12721    }
12722    fn attr_from_type(r#type: u16) -> Option<&'static str> {
12723        let res = match r#type {
12724            1u16 => "Link",
12725            2u16 => "Ikey",
12726            3u16 => "Okey",
12727            4u16 => "Local",
12728            5u16 => "Remote",
12729            6u16 => "Fwmark",
12730            _ => return None,
12731        };
12732        Some(res)
12733    }
12734}
12735#[derive(Clone, Copy, Default)]
12736pub struct IterableLinkinfoVtiAttrs<'a> {
12737    buf: &'a [u8],
12738    pos: usize,
12739    orig_loc: usize,
12740}
12741impl<'a> IterableLinkinfoVtiAttrs<'a> {
12742    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12743        Self {
12744            buf,
12745            pos: 0,
12746            orig_loc,
12747        }
12748    }
12749    pub fn get_buf(&self) -> &'a [u8] {
12750        self.buf
12751    }
12752}
12753impl<'a> Iterator for IterableLinkinfoVtiAttrs<'a> {
12754    type Item = Result<LinkinfoVtiAttrs, ErrorContext>;
12755    fn next(&mut self) -> Option<Self::Item> {
12756        let mut pos;
12757        let mut r#type;
12758        loop {
12759            pos = self.pos;
12760            r#type = None;
12761            if self.buf.len() == self.pos {
12762                return None;
12763            }
12764            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12765                self.pos = self.buf.len();
12766                break;
12767            };
12768            r#type = Some(header.r#type);
12769            let res = match header.r#type {
12770                1u16 => LinkinfoVtiAttrs::Link({
12771                    let res = parse_u32(next);
12772                    let Some(val) = res else { break };
12773                    val
12774                }),
12775                2u16 => LinkinfoVtiAttrs::Ikey({
12776                    let res = parse_be_u32(next);
12777                    let Some(val) = res else { break };
12778                    val
12779                }),
12780                3u16 => LinkinfoVtiAttrs::Okey({
12781                    let res = parse_be_u32(next);
12782                    let Some(val) = res else { break };
12783                    val
12784                }),
12785                4u16 => LinkinfoVtiAttrs::Local({
12786                    let res = parse_ip(next);
12787                    let Some(val) = res else { break };
12788                    val
12789                }),
12790                5u16 => LinkinfoVtiAttrs::Remote({
12791                    let res = parse_ip(next);
12792                    let Some(val) = res else { break };
12793                    val
12794                }),
12795                6u16 => LinkinfoVtiAttrs::Fwmark({
12796                    let res = parse_u32(next);
12797                    let Some(val) = res else { break };
12798                    val
12799                }),
12800                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12801                n => continue,
12802            };
12803            return Some(Ok(res));
12804        }
12805        Some(Err(ErrorContext::new(
12806            "LinkinfoVtiAttrs",
12807            r#type.and_then(|t| LinkinfoVtiAttrs::attr_from_type(t)),
12808            self.orig_loc,
12809            self.buf.as_ptr().wrapping_add(pos) as usize,
12810        )))
12811    }
12812}
12813impl std::fmt::Debug for IterableLinkinfoVtiAttrs<'_> {
12814    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12815        let mut fmt = f.debug_struct("LinkinfoVtiAttrs");
12816        for attr in self.clone() {
12817            let attr = match attr {
12818                Ok(a) => a,
12819                Err(err) => {
12820                    fmt.finish()?;
12821                    f.write_str("Err(")?;
12822                    err.fmt(f)?;
12823                    return f.write_str(")");
12824                }
12825            };
12826            match attr {
12827                LinkinfoVtiAttrs::Link(val) => fmt.field("Link", &val),
12828                LinkinfoVtiAttrs::Ikey(val) => fmt.field("Ikey", &val),
12829                LinkinfoVtiAttrs::Okey(val) => fmt.field("Okey", &val),
12830                LinkinfoVtiAttrs::Local(val) => fmt.field("Local", &val),
12831                LinkinfoVtiAttrs::Remote(val) => fmt.field("Remote", &val),
12832                LinkinfoVtiAttrs::Fwmark(val) => fmt.field("Fwmark", &val),
12833            };
12834        }
12835        fmt.finish()
12836    }
12837}
12838impl IterableLinkinfoVtiAttrs<'_> {
12839    pub fn lookup_attr(
12840        &self,
12841        offset: usize,
12842        missing_type: Option<u16>,
12843    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12844        let mut stack = Vec::new();
12845        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12846        if missing_type.is_some() && cur == offset {
12847            stack.push(("LinkinfoVtiAttrs", offset));
12848            return (
12849                stack,
12850                missing_type.and_then(|t| LinkinfoVtiAttrs::attr_from_type(t)),
12851            );
12852        }
12853        if cur > offset || cur + self.buf.len() < offset {
12854            return (stack, None);
12855        }
12856        let mut attrs = self.clone();
12857        let mut last_off = cur + attrs.pos;
12858        while let Some(attr) = attrs.next() {
12859            let Ok(attr) = attr else { break };
12860            match attr {
12861                LinkinfoVtiAttrs::Link(val) => {
12862                    if last_off == offset {
12863                        stack.push(("Link", last_off));
12864                        break;
12865                    }
12866                }
12867                LinkinfoVtiAttrs::Ikey(val) => {
12868                    if last_off == offset {
12869                        stack.push(("Ikey", last_off));
12870                        break;
12871                    }
12872                }
12873                LinkinfoVtiAttrs::Okey(val) => {
12874                    if last_off == offset {
12875                        stack.push(("Okey", last_off));
12876                        break;
12877                    }
12878                }
12879                LinkinfoVtiAttrs::Local(val) => {
12880                    if last_off == offset {
12881                        stack.push(("Local", last_off));
12882                        break;
12883                    }
12884                }
12885                LinkinfoVtiAttrs::Remote(val) => {
12886                    if last_off == offset {
12887                        stack.push(("Remote", last_off));
12888                        break;
12889                    }
12890                }
12891                LinkinfoVtiAttrs::Fwmark(val) => {
12892                    if last_off == offset {
12893                        stack.push(("Fwmark", last_off));
12894                        break;
12895                    }
12896                }
12897                _ => {}
12898            };
12899            last_off = cur + attrs.pos;
12900        }
12901        if !stack.is_empty() {
12902            stack.push(("LinkinfoVtiAttrs", cur));
12903        }
12904        (stack, None)
12905    }
12906}
12907#[derive(Clone)]
12908pub enum LinkinfoVti6Attrs<'a> {
12909    Link(u32),
12910    Ikey(u32),
12911    Okey(u32),
12912    Local(&'a [u8]),
12913    Remote(&'a [u8]),
12914    Fwmark(u32),
12915}
12916impl<'a> IterableLinkinfoVti6Attrs<'a> {
12917    pub fn get_link(&self) -> Result<u32, ErrorContext> {
12918        let mut iter = self.clone();
12919        iter.pos = 0;
12920        for attr in iter {
12921            if let Ok(LinkinfoVti6Attrs::Link(val)) = attr {
12922                return Ok(val);
12923            }
12924        }
12925        Err(ErrorContext::new_missing(
12926            "LinkinfoVti6Attrs",
12927            "Link",
12928            self.orig_loc,
12929            self.buf.as_ptr() as usize,
12930        ))
12931    }
12932    pub fn get_ikey(&self) -> Result<u32, ErrorContext> {
12933        let mut iter = self.clone();
12934        iter.pos = 0;
12935        for attr in iter {
12936            if let Ok(LinkinfoVti6Attrs::Ikey(val)) = attr {
12937                return Ok(val);
12938            }
12939        }
12940        Err(ErrorContext::new_missing(
12941            "LinkinfoVti6Attrs",
12942            "Ikey",
12943            self.orig_loc,
12944            self.buf.as_ptr() as usize,
12945        ))
12946    }
12947    pub fn get_okey(&self) -> Result<u32, ErrorContext> {
12948        let mut iter = self.clone();
12949        iter.pos = 0;
12950        for attr in iter {
12951            if let Ok(LinkinfoVti6Attrs::Okey(val)) = attr {
12952                return Ok(val);
12953            }
12954        }
12955        Err(ErrorContext::new_missing(
12956            "LinkinfoVti6Attrs",
12957            "Okey",
12958            self.orig_loc,
12959            self.buf.as_ptr() as usize,
12960        ))
12961    }
12962    pub fn get_local(&self) -> Result<&'a [u8], ErrorContext> {
12963        let mut iter = self.clone();
12964        iter.pos = 0;
12965        for attr in iter {
12966            if let Ok(LinkinfoVti6Attrs::Local(val)) = attr {
12967                return Ok(val);
12968            }
12969        }
12970        Err(ErrorContext::new_missing(
12971            "LinkinfoVti6Attrs",
12972            "Local",
12973            self.orig_loc,
12974            self.buf.as_ptr() as usize,
12975        ))
12976    }
12977    pub fn get_remote(&self) -> Result<&'a [u8], ErrorContext> {
12978        let mut iter = self.clone();
12979        iter.pos = 0;
12980        for attr in iter {
12981            if let Ok(LinkinfoVti6Attrs::Remote(val)) = attr {
12982                return Ok(val);
12983            }
12984        }
12985        Err(ErrorContext::new_missing(
12986            "LinkinfoVti6Attrs",
12987            "Remote",
12988            self.orig_loc,
12989            self.buf.as_ptr() as usize,
12990        ))
12991    }
12992    pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
12993        let mut iter = self.clone();
12994        iter.pos = 0;
12995        for attr in iter {
12996            if let Ok(LinkinfoVti6Attrs::Fwmark(val)) = attr {
12997                return Ok(val);
12998            }
12999        }
13000        Err(ErrorContext::new_missing(
13001            "LinkinfoVti6Attrs",
13002            "Fwmark",
13003            self.orig_loc,
13004            self.buf.as_ptr() as usize,
13005        ))
13006    }
13007}
13008impl LinkinfoVti6Attrs<'_> {
13009    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoVti6Attrs<'a> {
13010        IterableLinkinfoVti6Attrs::with_loc(buf, buf.as_ptr() as usize)
13011    }
13012    fn attr_from_type(r#type: u16) -> Option<&'static str> {
13013        LinkinfoVtiAttrs::attr_from_type(r#type)
13014    }
13015}
13016#[derive(Clone, Copy, Default)]
13017pub struct IterableLinkinfoVti6Attrs<'a> {
13018    buf: &'a [u8],
13019    pos: usize,
13020    orig_loc: usize,
13021}
13022impl<'a> IterableLinkinfoVti6Attrs<'a> {
13023    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
13024        Self {
13025            buf,
13026            pos: 0,
13027            orig_loc,
13028        }
13029    }
13030    pub fn get_buf(&self) -> &'a [u8] {
13031        self.buf
13032    }
13033}
13034impl<'a> Iterator for IterableLinkinfoVti6Attrs<'a> {
13035    type Item = Result<LinkinfoVti6Attrs<'a>, ErrorContext>;
13036    fn next(&mut self) -> Option<Self::Item> {
13037        let mut pos;
13038        let mut r#type;
13039        loop {
13040            pos = self.pos;
13041            r#type = None;
13042            if self.buf.len() == self.pos {
13043                return None;
13044            }
13045            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
13046                self.pos = self.buf.len();
13047                break;
13048            };
13049            r#type = Some(header.r#type);
13050            let res = match header.r#type {
13051                1u16 => LinkinfoVti6Attrs::Link({
13052                    let res = parse_u32(next);
13053                    let Some(val) = res else { break };
13054                    val
13055                }),
13056                2u16 => LinkinfoVti6Attrs::Ikey({
13057                    let res = parse_be_u32(next);
13058                    let Some(val) = res else { break };
13059                    val
13060                }),
13061                3u16 => LinkinfoVti6Attrs::Okey({
13062                    let res = parse_be_u32(next);
13063                    let Some(val) = res else { break };
13064                    val
13065                }),
13066                4u16 => LinkinfoVti6Attrs::Local({
13067                    let res = Some(next);
13068                    let Some(val) = res else { break };
13069                    val
13070                }),
13071                5u16 => LinkinfoVti6Attrs::Remote({
13072                    let res = Some(next);
13073                    let Some(val) = res else { break };
13074                    val
13075                }),
13076                6u16 => LinkinfoVti6Attrs::Fwmark({
13077                    let res = parse_u32(next);
13078                    let Some(val) = res else { break };
13079                    val
13080                }),
13081                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
13082                n => continue,
13083            };
13084            return Some(Ok(res));
13085        }
13086        Some(Err(ErrorContext::new(
13087            "LinkinfoVti6Attrs",
13088            r#type.and_then(|t| LinkinfoVti6Attrs::attr_from_type(t)),
13089            self.orig_loc,
13090            self.buf.as_ptr().wrapping_add(pos) as usize,
13091        )))
13092    }
13093}
13094impl<'a> std::fmt::Debug for IterableLinkinfoVti6Attrs<'_> {
13095    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13096        let mut fmt = f.debug_struct("LinkinfoVti6Attrs");
13097        for attr in self.clone() {
13098            let attr = match attr {
13099                Ok(a) => a,
13100                Err(err) => {
13101                    fmt.finish()?;
13102                    f.write_str("Err(")?;
13103                    err.fmt(f)?;
13104                    return f.write_str(")");
13105                }
13106            };
13107            match attr {
13108                LinkinfoVti6Attrs::Link(val) => fmt.field("Link", &val),
13109                LinkinfoVti6Attrs::Ikey(val) => fmt.field("Ikey", &val),
13110                LinkinfoVti6Attrs::Okey(val) => fmt.field("Okey", &val),
13111                LinkinfoVti6Attrs::Local(val) => fmt.field("Local", &val),
13112                LinkinfoVti6Attrs::Remote(val) => fmt.field("Remote", &val),
13113                LinkinfoVti6Attrs::Fwmark(val) => fmt.field("Fwmark", &val),
13114            };
13115        }
13116        fmt.finish()
13117    }
13118}
13119impl IterableLinkinfoVti6Attrs<'_> {
13120    pub fn lookup_attr(
13121        &self,
13122        offset: usize,
13123        missing_type: Option<u16>,
13124    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
13125        let mut stack = Vec::new();
13126        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
13127        if missing_type.is_some() && cur == offset {
13128            stack.push(("LinkinfoVti6Attrs", offset));
13129            return (
13130                stack,
13131                missing_type.and_then(|t| LinkinfoVti6Attrs::attr_from_type(t)),
13132            );
13133        }
13134        if cur > offset || cur + self.buf.len() < offset {
13135            return (stack, None);
13136        }
13137        let mut attrs = self.clone();
13138        let mut last_off = cur + attrs.pos;
13139        while let Some(attr) = attrs.next() {
13140            let Ok(attr) = attr else { break };
13141            match attr {
13142                LinkinfoVti6Attrs::Link(val) => {
13143                    if last_off == offset {
13144                        stack.push(("Link", last_off));
13145                        break;
13146                    }
13147                }
13148                LinkinfoVti6Attrs::Ikey(val) => {
13149                    if last_off == offset {
13150                        stack.push(("Ikey", last_off));
13151                        break;
13152                    }
13153                }
13154                LinkinfoVti6Attrs::Okey(val) => {
13155                    if last_off == offset {
13156                        stack.push(("Okey", last_off));
13157                        break;
13158                    }
13159                }
13160                LinkinfoVti6Attrs::Local(val) => {
13161                    if last_off == offset {
13162                        stack.push(("Local", last_off));
13163                        break;
13164                    }
13165                }
13166                LinkinfoVti6Attrs::Remote(val) => {
13167                    if last_off == offset {
13168                        stack.push(("Remote", last_off));
13169                        break;
13170                    }
13171                }
13172                LinkinfoVti6Attrs::Fwmark(val) => {
13173                    if last_off == offset {
13174                        stack.push(("Fwmark", last_off));
13175                        break;
13176                    }
13177                }
13178                _ => {}
13179            };
13180            last_off = cur + attrs.pos;
13181        }
13182        if !stack.is_empty() {
13183            stack.push(("LinkinfoVti6Attrs", cur));
13184        }
13185        (stack, None)
13186    }
13187}
13188#[derive(Clone)]
13189pub enum LinkinfoGeneveAttrs<'a> {
13190    Id(u32),
13191    Remote(std::net::Ipv4Addr),
13192    Ttl(u8),
13193    Tos(u8),
13194    Port(u16),
13195    CollectMetadata(()),
13196    Remote6(&'a [u8]),
13197    UdpCsum(u8),
13198    UdpZeroCsum6Tx(u8),
13199    UdpZeroCsum6Rx(u8),
13200    Label(u32),
13201    TtlInherit(u8),
13202    Df(u8),
13203    InnerProtoInherit(()),
13204    PortRange(IflaGenevePortRange),
13205    GroHint(()),
13206    Local(std::net::Ipv4Addr),
13207    Local6(&'a [u8]),
13208}
13209impl<'a> IterableLinkinfoGeneveAttrs<'a> {
13210    pub fn get_id(&self) -> Result<u32, ErrorContext> {
13211        let mut iter = self.clone();
13212        iter.pos = 0;
13213        for attr in iter {
13214            if let Ok(LinkinfoGeneveAttrs::Id(val)) = attr {
13215                return Ok(val);
13216            }
13217        }
13218        Err(ErrorContext::new_missing(
13219            "LinkinfoGeneveAttrs",
13220            "Id",
13221            self.orig_loc,
13222            self.buf.as_ptr() as usize,
13223        ))
13224    }
13225    pub fn get_remote(&self) -> Result<std::net::Ipv4Addr, ErrorContext> {
13226        let mut iter = self.clone();
13227        iter.pos = 0;
13228        for attr in iter {
13229            if let Ok(LinkinfoGeneveAttrs::Remote(val)) = attr {
13230                return Ok(val);
13231            }
13232        }
13233        Err(ErrorContext::new_missing(
13234            "LinkinfoGeneveAttrs",
13235            "Remote",
13236            self.orig_loc,
13237            self.buf.as_ptr() as usize,
13238        ))
13239    }
13240    pub fn get_ttl(&self) -> Result<u8, ErrorContext> {
13241        let mut iter = self.clone();
13242        iter.pos = 0;
13243        for attr in iter {
13244            if let Ok(LinkinfoGeneveAttrs::Ttl(val)) = attr {
13245                return Ok(val);
13246            }
13247        }
13248        Err(ErrorContext::new_missing(
13249            "LinkinfoGeneveAttrs",
13250            "Ttl",
13251            self.orig_loc,
13252            self.buf.as_ptr() as usize,
13253        ))
13254    }
13255    pub fn get_tos(&self) -> Result<u8, ErrorContext> {
13256        let mut iter = self.clone();
13257        iter.pos = 0;
13258        for attr in iter {
13259            if let Ok(LinkinfoGeneveAttrs::Tos(val)) = attr {
13260                return Ok(val);
13261            }
13262        }
13263        Err(ErrorContext::new_missing(
13264            "LinkinfoGeneveAttrs",
13265            "Tos",
13266            self.orig_loc,
13267            self.buf.as_ptr() as usize,
13268        ))
13269    }
13270    pub fn get_port(&self) -> Result<u16, ErrorContext> {
13271        let mut iter = self.clone();
13272        iter.pos = 0;
13273        for attr in iter {
13274            if let Ok(LinkinfoGeneveAttrs::Port(val)) = attr {
13275                return Ok(val);
13276            }
13277        }
13278        Err(ErrorContext::new_missing(
13279            "LinkinfoGeneveAttrs",
13280            "Port",
13281            self.orig_loc,
13282            self.buf.as_ptr() as usize,
13283        ))
13284    }
13285    pub fn get_collect_metadata(&self) -> Result<(), ErrorContext> {
13286        let mut iter = self.clone();
13287        iter.pos = 0;
13288        for attr in iter {
13289            if let Ok(LinkinfoGeneveAttrs::CollectMetadata(val)) = attr {
13290                return Ok(val);
13291            }
13292        }
13293        Err(ErrorContext::new_missing(
13294            "LinkinfoGeneveAttrs",
13295            "CollectMetadata",
13296            self.orig_loc,
13297            self.buf.as_ptr() as usize,
13298        ))
13299    }
13300    pub fn get_remote6(&self) -> Result<&'a [u8], ErrorContext> {
13301        let mut iter = self.clone();
13302        iter.pos = 0;
13303        for attr in iter {
13304            if let Ok(LinkinfoGeneveAttrs::Remote6(val)) = attr {
13305                return Ok(val);
13306            }
13307        }
13308        Err(ErrorContext::new_missing(
13309            "LinkinfoGeneveAttrs",
13310            "Remote6",
13311            self.orig_loc,
13312            self.buf.as_ptr() as usize,
13313        ))
13314    }
13315    pub fn get_udp_csum(&self) -> Result<u8, ErrorContext> {
13316        let mut iter = self.clone();
13317        iter.pos = 0;
13318        for attr in iter {
13319            if let Ok(LinkinfoGeneveAttrs::UdpCsum(val)) = attr {
13320                return Ok(val);
13321            }
13322        }
13323        Err(ErrorContext::new_missing(
13324            "LinkinfoGeneveAttrs",
13325            "UdpCsum",
13326            self.orig_loc,
13327            self.buf.as_ptr() as usize,
13328        ))
13329    }
13330    pub fn get_udp_zero_csum6_tx(&self) -> Result<u8, ErrorContext> {
13331        let mut iter = self.clone();
13332        iter.pos = 0;
13333        for attr in iter {
13334            if let Ok(LinkinfoGeneveAttrs::UdpZeroCsum6Tx(val)) = attr {
13335                return Ok(val);
13336            }
13337        }
13338        Err(ErrorContext::new_missing(
13339            "LinkinfoGeneveAttrs",
13340            "UdpZeroCsum6Tx",
13341            self.orig_loc,
13342            self.buf.as_ptr() as usize,
13343        ))
13344    }
13345    pub fn get_udp_zero_csum6_rx(&self) -> Result<u8, ErrorContext> {
13346        let mut iter = self.clone();
13347        iter.pos = 0;
13348        for attr in iter {
13349            if let Ok(LinkinfoGeneveAttrs::UdpZeroCsum6Rx(val)) = attr {
13350                return Ok(val);
13351            }
13352        }
13353        Err(ErrorContext::new_missing(
13354            "LinkinfoGeneveAttrs",
13355            "UdpZeroCsum6Rx",
13356            self.orig_loc,
13357            self.buf.as_ptr() as usize,
13358        ))
13359    }
13360    pub fn get_label(&self) -> Result<u32, ErrorContext> {
13361        let mut iter = self.clone();
13362        iter.pos = 0;
13363        for attr in iter {
13364            if let Ok(LinkinfoGeneveAttrs::Label(val)) = attr {
13365                return Ok(val);
13366            }
13367        }
13368        Err(ErrorContext::new_missing(
13369            "LinkinfoGeneveAttrs",
13370            "Label",
13371            self.orig_loc,
13372            self.buf.as_ptr() as usize,
13373        ))
13374    }
13375    pub fn get_ttl_inherit(&self) -> Result<u8, ErrorContext> {
13376        let mut iter = self.clone();
13377        iter.pos = 0;
13378        for attr in iter {
13379            if let Ok(LinkinfoGeneveAttrs::TtlInherit(val)) = attr {
13380                return Ok(val);
13381            }
13382        }
13383        Err(ErrorContext::new_missing(
13384            "LinkinfoGeneveAttrs",
13385            "TtlInherit",
13386            self.orig_loc,
13387            self.buf.as_ptr() as usize,
13388        ))
13389    }
13390    pub fn get_df(&self) -> Result<u8, ErrorContext> {
13391        let mut iter = self.clone();
13392        iter.pos = 0;
13393        for attr in iter {
13394            if let Ok(LinkinfoGeneveAttrs::Df(val)) = attr {
13395                return Ok(val);
13396            }
13397        }
13398        Err(ErrorContext::new_missing(
13399            "LinkinfoGeneveAttrs",
13400            "Df",
13401            self.orig_loc,
13402            self.buf.as_ptr() as usize,
13403        ))
13404    }
13405    pub fn get_inner_proto_inherit(&self) -> Result<(), ErrorContext> {
13406        let mut iter = self.clone();
13407        iter.pos = 0;
13408        for attr in iter {
13409            if let Ok(LinkinfoGeneveAttrs::InnerProtoInherit(val)) = attr {
13410                return Ok(val);
13411            }
13412        }
13413        Err(ErrorContext::new_missing(
13414            "LinkinfoGeneveAttrs",
13415            "InnerProtoInherit",
13416            self.orig_loc,
13417            self.buf.as_ptr() as usize,
13418        ))
13419    }
13420    pub fn get_port_range(&self) -> Result<IflaGenevePortRange, ErrorContext> {
13421        let mut iter = self.clone();
13422        iter.pos = 0;
13423        for attr in iter {
13424            if let Ok(LinkinfoGeneveAttrs::PortRange(val)) = attr {
13425                return Ok(val);
13426            }
13427        }
13428        Err(ErrorContext::new_missing(
13429            "LinkinfoGeneveAttrs",
13430            "PortRange",
13431            self.orig_loc,
13432            self.buf.as_ptr() as usize,
13433        ))
13434    }
13435    pub fn get_gro_hint(&self) -> Result<(), ErrorContext> {
13436        let mut iter = self.clone();
13437        iter.pos = 0;
13438        for attr in iter {
13439            if let Ok(LinkinfoGeneveAttrs::GroHint(val)) = attr {
13440                return Ok(val);
13441            }
13442        }
13443        Err(ErrorContext::new_missing(
13444            "LinkinfoGeneveAttrs",
13445            "GroHint",
13446            self.orig_loc,
13447            self.buf.as_ptr() as usize,
13448        ))
13449    }
13450    pub fn get_local(&self) -> Result<std::net::Ipv4Addr, ErrorContext> {
13451        let mut iter = self.clone();
13452        iter.pos = 0;
13453        for attr in iter {
13454            if let Ok(LinkinfoGeneveAttrs::Local(val)) = attr {
13455                return Ok(val);
13456            }
13457        }
13458        Err(ErrorContext::new_missing(
13459            "LinkinfoGeneveAttrs",
13460            "Local",
13461            self.orig_loc,
13462            self.buf.as_ptr() as usize,
13463        ))
13464    }
13465    pub fn get_local6(&self) -> Result<&'a [u8], ErrorContext> {
13466        let mut iter = self.clone();
13467        iter.pos = 0;
13468        for attr in iter {
13469            if let Ok(LinkinfoGeneveAttrs::Local6(val)) = attr {
13470                return Ok(val);
13471            }
13472        }
13473        Err(ErrorContext::new_missing(
13474            "LinkinfoGeneveAttrs",
13475            "Local6",
13476            self.orig_loc,
13477            self.buf.as_ptr() as usize,
13478        ))
13479    }
13480}
13481impl LinkinfoGeneveAttrs<'_> {
13482    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoGeneveAttrs<'a> {
13483        IterableLinkinfoGeneveAttrs::with_loc(buf, buf.as_ptr() as usize)
13484    }
13485    fn attr_from_type(r#type: u16) -> Option<&'static str> {
13486        let res = match r#type {
13487            1u16 => "Id",
13488            2u16 => "Remote",
13489            3u16 => "Ttl",
13490            4u16 => "Tos",
13491            5u16 => "Port",
13492            6u16 => "CollectMetadata",
13493            7u16 => "Remote6",
13494            8u16 => "UdpCsum",
13495            9u16 => "UdpZeroCsum6Tx",
13496            10u16 => "UdpZeroCsum6Rx",
13497            11u16 => "Label",
13498            12u16 => "TtlInherit",
13499            13u16 => "Df",
13500            14u16 => "InnerProtoInherit",
13501            15u16 => "PortRange",
13502            16u16 => "GroHint",
13503            17u16 => "Local",
13504            18u16 => "Local6",
13505            _ => return None,
13506        };
13507        Some(res)
13508    }
13509}
13510#[derive(Clone, Copy, Default)]
13511pub struct IterableLinkinfoGeneveAttrs<'a> {
13512    buf: &'a [u8],
13513    pos: usize,
13514    orig_loc: usize,
13515}
13516impl<'a> IterableLinkinfoGeneveAttrs<'a> {
13517    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
13518        Self {
13519            buf,
13520            pos: 0,
13521            orig_loc,
13522        }
13523    }
13524    pub fn get_buf(&self) -> &'a [u8] {
13525        self.buf
13526    }
13527}
13528impl<'a> Iterator for IterableLinkinfoGeneveAttrs<'a> {
13529    type Item = Result<LinkinfoGeneveAttrs<'a>, ErrorContext>;
13530    fn next(&mut self) -> Option<Self::Item> {
13531        let mut pos;
13532        let mut r#type;
13533        loop {
13534            pos = self.pos;
13535            r#type = None;
13536            if self.buf.len() == self.pos {
13537                return None;
13538            }
13539            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
13540                self.pos = self.buf.len();
13541                break;
13542            };
13543            r#type = Some(header.r#type);
13544            let res = match header.r#type {
13545                1u16 => LinkinfoGeneveAttrs::Id({
13546                    let res = parse_u32(next);
13547                    let Some(val) = res else { break };
13548                    val
13549                }),
13550                2u16 => LinkinfoGeneveAttrs::Remote({
13551                    let res = parse_be_u32(next).map(Ipv4Addr::from_bits);
13552                    let Some(val) = res else { break };
13553                    val
13554                }),
13555                3u16 => LinkinfoGeneveAttrs::Ttl({
13556                    let res = parse_u8(next);
13557                    let Some(val) = res else { break };
13558                    val
13559                }),
13560                4u16 => LinkinfoGeneveAttrs::Tos({
13561                    let res = parse_u8(next);
13562                    let Some(val) = res else { break };
13563                    val
13564                }),
13565                5u16 => LinkinfoGeneveAttrs::Port({
13566                    let res = parse_be_u16(next);
13567                    let Some(val) = res else { break };
13568                    val
13569                }),
13570                6u16 => LinkinfoGeneveAttrs::CollectMetadata(()),
13571                7u16 => LinkinfoGeneveAttrs::Remote6({
13572                    let res = Some(next);
13573                    let Some(val) = res else { break };
13574                    val
13575                }),
13576                8u16 => LinkinfoGeneveAttrs::UdpCsum({
13577                    let res = parse_u8(next);
13578                    let Some(val) = res else { break };
13579                    val
13580                }),
13581                9u16 => LinkinfoGeneveAttrs::UdpZeroCsum6Tx({
13582                    let res = parse_u8(next);
13583                    let Some(val) = res else { break };
13584                    val
13585                }),
13586                10u16 => LinkinfoGeneveAttrs::UdpZeroCsum6Rx({
13587                    let res = parse_u8(next);
13588                    let Some(val) = res else { break };
13589                    val
13590                }),
13591                11u16 => LinkinfoGeneveAttrs::Label({
13592                    let res = parse_be_u32(next);
13593                    let Some(val) = res else { break };
13594                    val
13595                }),
13596                12u16 => LinkinfoGeneveAttrs::TtlInherit({
13597                    let res = parse_u8(next);
13598                    let Some(val) = res else { break };
13599                    val
13600                }),
13601                13u16 => LinkinfoGeneveAttrs::Df({
13602                    let res = parse_u8(next);
13603                    let Some(val) = res else { break };
13604                    val
13605                }),
13606                14u16 => LinkinfoGeneveAttrs::InnerProtoInherit(()),
13607                15u16 => LinkinfoGeneveAttrs::PortRange({
13608                    let res = Some(IflaGenevePortRange::new_from_zeroed(next));
13609                    let Some(val) = res else { break };
13610                    val
13611                }),
13612                16u16 => LinkinfoGeneveAttrs::GroHint(()),
13613                17u16 => LinkinfoGeneveAttrs::Local({
13614                    let res = parse_be_u32(next).map(Ipv4Addr::from_bits);
13615                    let Some(val) = res else { break };
13616                    val
13617                }),
13618                18u16 => LinkinfoGeneveAttrs::Local6({
13619                    let res = Some(next);
13620                    let Some(val) = res else { break };
13621                    val
13622                }),
13623                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
13624                n => continue,
13625            };
13626            return Some(Ok(res));
13627        }
13628        Some(Err(ErrorContext::new(
13629            "LinkinfoGeneveAttrs",
13630            r#type.and_then(|t| LinkinfoGeneveAttrs::attr_from_type(t)),
13631            self.orig_loc,
13632            self.buf.as_ptr().wrapping_add(pos) as usize,
13633        )))
13634    }
13635}
13636impl<'a> std::fmt::Debug for IterableLinkinfoGeneveAttrs<'_> {
13637    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13638        let mut fmt = f.debug_struct("LinkinfoGeneveAttrs");
13639        for attr in self.clone() {
13640            let attr = match attr {
13641                Ok(a) => a,
13642                Err(err) => {
13643                    fmt.finish()?;
13644                    f.write_str("Err(")?;
13645                    err.fmt(f)?;
13646                    return f.write_str(")");
13647                }
13648            };
13649            match attr {
13650                LinkinfoGeneveAttrs::Id(val) => fmt.field("Id", &val),
13651                LinkinfoGeneveAttrs::Remote(val) => fmt.field("Remote", &val),
13652                LinkinfoGeneveAttrs::Ttl(val) => fmt.field("Ttl", &val),
13653                LinkinfoGeneveAttrs::Tos(val) => fmt.field("Tos", &val),
13654                LinkinfoGeneveAttrs::Port(val) => fmt.field("Port", &val),
13655                LinkinfoGeneveAttrs::CollectMetadata(val) => fmt.field("CollectMetadata", &val),
13656                LinkinfoGeneveAttrs::Remote6(val) => fmt.field("Remote6", &val),
13657                LinkinfoGeneveAttrs::UdpCsum(val) => fmt.field("UdpCsum", &val),
13658                LinkinfoGeneveAttrs::UdpZeroCsum6Tx(val) => fmt.field("UdpZeroCsum6Tx", &val),
13659                LinkinfoGeneveAttrs::UdpZeroCsum6Rx(val) => fmt.field("UdpZeroCsum6Rx", &val),
13660                LinkinfoGeneveAttrs::Label(val) => fmt.field("Label", &val),
13661                LinkinfoGeneveAttrs::TtlInherit(val) => fmt.field("TtlInherit", &val),
13662                LinkinfoGeneveAttrs::Df(val) => fmt.field("Df", &val),
13663                LinkinfoGeneveAttrs::InnerProtoInherit(val) => fmt.field("InnerProtoInherit", &val),
13664                LinkinfoGeneveAttrs::PortRange(val) => fmt.field("PortRange", &val),
13665                LinkinfoGeneveAttrs::GroHint(val) => fmt.field("GroHint", &val),
13666                LinkinfoGeneveAttrs::Local(val) => fmt.field("Local", &val),
13667                LinkinfoGeneveAttrs::Local6(val) => fmt.field("Local6", &val),
13668            };
13669        }
13670        fmt.finish()
13671    }
13672}
13673impl IterableLinkinfoGeneveAttrs<'_> {
13674    pub fn lookup_attr(
13675        &self,
13676        offset: usize,
13677        missing_type: Option<u16>,
13678    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
13679        let mut stack = Vec::new();
13680        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
13681        if missing_type.is_some() && cur == offset {
13682            stack.push(("LinkinfoGeneveAttrs", offset));
13683            return (
13684                stack,
13685                missing_type.and_then(|t| LinkinfoGeneveAttrs::attr_from_type(t)),
13686            );
13687        }
13688        if cur > offset || cur + self.buf.len() < offset {
13689            return (stack, None);
13690        }
13691        let mut attrs = self.clone();
13692        let mut last_off = cur + attrs.pos;
13693        while let Some(attr) = attrs.next() {
13694            let Ok(attr) = attr else { break };
13695            match attr {
13696                LinkinfoGeneveAttrs::Id(val) => {
13697                    if last_off == offset {
13698                        stack.push(("Id", last_off));
13699                        break;
13700                    }
13701                }
13702                LinkinfoGeneveAttrs::Remote(val) => {
13703                    if last_off == offset {
13704                        stack.push(("Remote", last_off));
13705                        break;
13706                    }
13707                }
13708                LinkinfoGeneveAttrs::Ttl(val) => {
13709                    if last_off == offset {
13710                        stack.push(("Ttl", last_off));
13711                        break;
13712                    }
13713                }
13714                LinkinfoGeneveAttrs::Tos(val) => {
13715                    if last_off == offset {
13716                        stack.push(("Tos", last_off));
13717                        break;
13718                    }
13719                }
13720                LinkinfoGeneveAttrs::Port(val) => {
13721                    if last_off == offset {
13722                        stack.push(("Port", last_off));
13723                        break;
13724                    }
13725                }
13726                LinkinfoGeneveAttrs::CollectMetadata(val) => {
13727                    if last_off == offset {
13728                        stack.push(("CollectMetadata", last_off));
13729                        break;
13730                    }
13731                }
13732                LinkinfoGeneveAttrs::Remote6(val) => {
13733                    if last_off == offset {
13734                        stack.push(("Remote6", last_off));
13735                        break;
13736                    }
13737                }
13738                LinkinfoGeneveAttrs::UdpCsum(val) => {
13739                    if last_off == offset {
13740                        stack.push(("UdpCsum", last_off));
13741                        break;
13742                    }
13743                }
13744                LinkinfoGeneveAttrs::UdpZeroCsum6Tx(val) => {
13745                    if last_off == offset {
13746                        stack.push(("UdpZeroCsum6Tx", last_off));
13747                        break;
13748                    }
13749                }
13750                LinkinfoGeneveAttrs::UdpZeroCsum6Rx(val) => {
13751                    if last_off == offset {
13752                        stack.push(("UdpZeroCsum6Rx", last_off));
13753                        break;
13754                    }
13755                }
13756                LinkinfoGeneveAttrs::Label(val) => {
13757                    if last_off == offset {
13758                        stack.push(("Label", last_off));
13759                        break;
13760                    }
13761                }
13762                LinkinfoGeneveAttrs::TtlInherit(val) => {
13763                    if last_off == offset {
13764                        stack.push(("TtlInherit", last_off));
13765                        break;
13766                    }
13767                }
13768                LinkinfoGeneveAttrs::Df(val) => {
13769                    if last_off == offset {
13770                        stack.push(("Df", last_off));
13771                        break;
13772                    }
13773                }
13774                LinkinfoGeneveAttrs::InnerProtoInherit(val) => {
13775                    if last_off == offset {
13776                        stack.push(("InnerProtoInherit", last_off));
13777                        break;
13778                    }
13779                }
13780                LinkinfoGeneveAttrs::PortRange(val) => {
13781                    if last_off == offset {
13782                        stack.push(("PortRange", last_off));
13783                        break;
13784                    }
13785                }
13786                LinkinfoGeneveAttrs::GroHint(val) => {
13787                    if last_off == offset {
13788                        stack.push(("GroHint", last_off));
13789                        break;
13790                    }
13791                }
13792                LinkinfoGeneveAttrs::Local(val) => {
13793                    if last_off == offset {
13794                        stack.push(("Local", last_off));
13795                        break;
13796                    }
13797                }
13798                LinkinfoGeneveAttrs::Local6(val) => {
13799                    if last_off == offset {
13800                        stack.push(("Local6", last_off));
13801                        break;
13802                    }
13803                }
13804                _ => {}
13805            };
13806            last_off = cur + attrs.pos;
13807        }
13808        if !stack.is_empty() {
13809            stack.push(("LinkinfoGeneveAttrs", cur));
13810        }
13811        (stack, None)
13812    }
13813}
13814#[derive(Clone)]
13815pub enum LinkinfoHsrAttrs<'a> {
13816    Slave1(u32),
13817    Slave2(u32),
13818    MulticastSpec(u8),
13819    SupervisionAddr(&'a [u8]),
13820    SeqNr(u16),
13821    Version(u8),
13822    Protocol(u8),
13823    Interlink(u32),
13824}
13825impl<'a> IterableLinkinfoHsrAttrs<'a> {
13826    pub fn get_slave1(&self) -> Result<u32, ErrorContext> {
13827        let mut iter = self.clone();
13828        iter.pos = 0;
13829        for attr in iter {
13830            if let Ok(LinkinfoHsrAttrs::Slave1(val)) = attr {
13831                return Ok(val);
13832            }
13833        }
13834        Err(ErrorContext::new_missing(
13835            "LinkinfoHsrAttrs",
13836            "Slave1",
13837            self.orig_loc,
13838            self.buf.as_ptr() as usize,
13839        ))
13840    }
13841    pub fn get_slave2(&self) -> Result<u32, ErrorContext> {
13842        let mut iter = self.clone();
13843        iter.pos = 0;
13844        for attr in iter {
13845            if let Ok(LinkinfoHsrAttrs::Slave2(val)) = attr {
13846                return Ok(val);
13847            }
13848        }
13849        Err(ErrorContext::new_missing(
13850            "LinkinfoHsrAttrs",
13851            "Slave2",
13852            self.orig_loc,
13853            self.buf.as_ptr() as usize,
13854        ))
13855    }
13856    pub fn get_multicast_spec(&self) -> Result<u8, ErrorContext> {
13857        let mut iter = self.clone();
13858        iter.pos = 0;
13859        for attr in iter {
13860            if let Ok(LinkinfoHsrAttrs::MulticastSpec(val)) = attr {
13861                return Ok(val);
13862            }
13863        }
13864        Err(ErrorContext::new_missing(
13865            "LinkinfoHsrAttrs",
13866            "MulticastSpec",
13867            self.orig_loc,
13868            self.buf.as_ptr() as usize,
13869        ))
13870    }
13871    pub fn get_supervision_addr(&self) -> Result<&'a [u8], ErrorContext> {
13872        let mut iter = self.clone();
13873        iter.pos = 0;
13874        for attr in iter {
13875            if let Ok(LinkinfoHsrAttrs::SupervisionAddr(val)) = attr {
13876                return Ok(val);
13877            }
13878        }
13879        Err(ErrorContext::new_missing(
13880            "LinkinfoHsrAttrs",
13881            "SupervisionAddr",
13882            self.orig_loc,
13883            self.buf.as_ptr() as usize,
13884        ))
13885    }
13886    pub fn get_seq_nr(&self) -> Result<u16, ErrorContext> {
13887        let mut iter = self.clone();
13888        iter.pos = 0;
13889        for attr in iter {
13890            if let Ok(LinkinfoHsrAttrs::SeqNr(val)) = attr {
13891                return Ok(val);
13892            }
13893        }
13894        Err(ErrorContext::new_missing(
13895            "LinkinfoHsrAttrs",
13896            "SeqNr",
13897            self.orig_loc,
13898            self.buf.as_ptr() as usize,
13899        ))
13900    }
13901    pub fn get_version(&self) -> Result<u8, ErrorContext> {
13902        let mut iter = self.clone();
13903        iter.pos = 0;
13904        for attr in iter {
13905            if let Ok(LinkinfoHsrAttrs::Version(val)) = attr {
13906                return Ok(val);
13907            }
13908        }
13909        Err(ErrorContext::new_missing(
13910            "LinkinfoHsrAttrs",
13911            "Version",
13912            self.orig_loc,
13913            self.buf.as_ptr() as usize,
13914        ))
13915    }
13916    pub fn get_protocol(&self) -> Result<u8, ErrorContext> {
13917        let mut iter = self.clone();
13918        iter.pos = 0;
13919        for attr in iter {
13920            if let Ok(LinkinfoHsrAttrs::Protocol(val)) = attr {
13921                return Ok(val);
13922            }
13923        }
13924        Err(ErrorContext::new_missing(
13925            "LinkinfoHsrAttrs",
13926            "Protocol",
13927            self.orig_loc,
13928            self.buf.as_ptr() as usize,
13929        ))
13930    }
13931    pub fn get_interlink(&self) -> Result<u32, ErrorContext> {
13932        let mut iter = self.clone();
13933        iter.pos = 0;
13934        for attr in iter {
13935            if let Ok(LinkinfoHsrAttrs::Interlink(val)) = attr {
13936                return Ok(val);
13937            }
13938        }
13939        Err(ErrorContext::new_missing(
13940            "LinkinfoHsrAttrs",
13941            "Interlink",
13942            self.orig_loc,
13943            self.buf.as_ptr() as usize,
13944        ))
13945    }
13946}
13947impl LinkinfoHsrAttrs<'_> {
13948    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoHsrAttrs<'a> {
13949        IterableLinkinfoHsrAttrs::with_loc(buf, buf.as_ptr() as usize)
13950    }
13951    fn attr_from_type(r#type: u16) -> Option<&'static str> {
13952        let res = match r#type {
13953            1u16 => "Slave1",
13954            2u16 => "Slave2",
13955            3u16 => "MulticastSpec",
13956            4u16 => "SupervisionAddr",
13957            5u16 => "SeqNr",
13958            6u16 => "Version",
13959            7u16 => "Protocol",
13960            8u16 => "Interlink",
13961            _ => return None,
13962        };
13963        Some(res)
13964    }
13965}
13966#[derive(Clone, Copy, Default)]
13967pub struct IterableLinkinfoHsrAttrs<'a> {
13968    buf: &'a [u8],
13969    pos: usize,
13970    orig_loc: usize,
13971}
13972impl<'a> IterableLinkinfoHsrAttrs<'a> {
13973    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
13974        Self {
13975            buf,
13976            pos: 0,
13977            orig_loc,
13978        }
13979    }
13980    pub fn get_buf(&self) -> &'a [u8] {
13981        self.buf
13982    }
13983}
13984impl<'a> Iterator for IterableLinkinfoHsrAttrs<'a> {
13985    type Item = Result<LinkinfoHsrAttrs<'a>, ErrorContext>;
13986    fn next(&mut self) -> Option<Self::Item> {
13987        let mut pos;
13988        let mut r#type;
13989        loop {
13990            pos = self.pos;
13991            r#type = None;
13992            if self.buf.len() == self.pos {
13993                return None;
13994            }
13995            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
13996                self.pos = self.buf.len();
13997                break;
13998            };
13999            r#type = Some(header.r#type);
14000            let res = match header.r#type {
14001                1u16 => LinkinfoHsrAttrs::Slave1({
14002                    let res = parse_u32(next);
14003                    let Some(val) = res else { break };
14004                    val
14005                }),
14006                2u16 => LinkinfoHsrAttrs::Slave2({
14007                    let res = parse_u32(next);
14008                    let Some(val) = res else { break };
14009                    val
14010                }),
14011                3u16 => LinkinfoHsrAttrs::MulticastSpec({
14012                    let res = parse_u8(next);
14013                    let Some(val) = res else { break };
14014                    val
14015                }),
14016                4u16 => LinkinfoHsrAttrs::SupervisionAddr({
14017                    let res = Some(next);
14018                    let Some(val) = res else { break };
14019                    val
14020                }),
14021                5u16 => LinkinfoHsrAttrs::SeqNr({
14022                    let res = parse_u16(next);
14023                    let Some(val) = res else { break };
14024                    val
14025                }),
14026                6u16 => LinkinfoHsrAttrs::Version({
14027                    let res = parse_u8(next);
14028                    let Some(val) = res else { break };
14029                    val
14030                }),
14031                7u16 => LinkinfoHsrAttrs::Protocol({
14032                    let res = parse_u8(next);
14033                    let Some(val) = res else { break };
14034                    val
14035                }),
14036                8u16 => LinkinfoHsrAttrs::Interlink({
14037                    let res = parse_u32(next);
14038                    let Some(val) = res else { break };
14039                    val
14040                }),
14041                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
14042                n => continue,
14043            };
14044            return Some(Ok(res));
14045        }
14046        Some(Err(ErrorContext::new(
14047            "LinkinfoHsrAttrs",
14048            r#type.and_then(|t| LinkinfoHsrAttrs::attr_from_type(t)),
14049            self.orig_loc,
14050            self.buf.as_ptr().wrapping_add(pos) as usize,
14051        )))
14052    }
14053}
14054impl<'a> std::fmt::Debug for IterableLinkinfoHsrAttrs<'_> {
14055    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14056        let mut fmt = f.debug_struct("LinkinfoHsrAttrs");
14057        for attr in self.clone() {
14058            let attr = match attr {
14059                Ok(a) => a,
14060                Err(err) => {
14061                    fmt.finish()?;
14062                    f.write_str("Err(")?;
14063                    err.fmt(f)?;
14064                    return f.write_str(")");
14065                }
14066            };
14067            match attr {
14068                LinkinfoHsrAttrs::Slave1(val) => fmt.field("Slave1", &val),
14069                LinkinfoHsrAttrs::Slave2(val) => fmt.field("Slave2", &val),
14070                LinkinfoHsrAttrs::MulticastSpec(val) => fmt.field("MulticastSpec", &val),
14071                LinkinfoHsrAttrs::SupervisionAddr(val) => {
14072                    fmt.field("SupervisionAddr", &FormatMac(val))
14073                }
14074                LinkinfoHsrAttrs::SeqNr(val) => fmt.field("SeqNr", &val),
14075                LinkinfoHsrAttrs::Version(val) => fmt.field("Version", &val),
14076                LinkinfoHsrAttrs::Protocol(val) => fmt.field("Protocol", &val),
14077                LinkinfoHsrAttrs::Interlink(val) => fmt.field("Interlink", &val),
14078            };
14079        }
14080        fmt.finish()
14081    }
14082}
14083impl IterableLinkinfoHsrAttrs<'_> {
14084    pub fn lookup_attr(
14085        &self,
14086        offset: usize,
14087        missing_type: Option<u16>,
14088    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
14089        let mut stack = Vec::new();
14090        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
14091        if missing_type.is_some() && cur == offset {
14092            stack.push(("LinkinfoHsrAttrs", offset));
14093            return (
14094                stack,
14095                missing_type.and_then(|t| LinkinfoHsrAttrs::attr_from_type(t)),
14096            );
14097        }
14098        if cur > offset || cur + self.buf.len() < offset {
14099            return (stack, None);
14100        }
14101        let mut attrs = self.clone();
14102        let mut last_off = cur + attrs.pos;
14103        while let Some(attr) = attrs.next() {
14104            let Ok(attr) = attr else { break };
14105            match attr {
14106                LinkinfoHsrAttrs::Slave1(val) => {
14107                    if last_off == offset {
14108                        stack.push(("Slave1", last_off));
14109                        break;
14110                    }
14111                }
14112                LinkinfoHsrAttrs::Slave2(val) => {
14113                    if last_off == offset {
14114                        stack.push(("Slave2", last_off));
14115                        break;
14116                    }
14117                }
14118                LinkinfoHsrAttrs::MulticastSpec(val) => {
14119                    if last_off == offset {
14120                        stack.push(("MulticastSpec", last_off));
14121                        break;
14122                    }
14123                }
14124                LinkinfoHsrAttrs::SupervisionAddr(val) => {
14125                    if last_off == offset {
14126                        stack.push(("SupervisionAddr", last_off));
14127                        break;
14128                    }
14129                }
14130                LinkinfoHsrAttrs::SeqNr(val) => {
14131                    if last_off == offset {
14132                        stack.push(("SeqNr", last_off));
14133                        break;
14134                    }
14135                }
14136                LinkinfoHsrAttrs::Version(val) => {
14137                    if last_off == offset {
14138                        stack.push(("Version", last_off));
14139                        break;
14140                    }
14141                }
14142                LinkinfoHsrAttrs::Protocol(val) => {
14143                    if last_off == offset {
14144                        stack.push(("Protocol", last_off));
14145                        break;
14146                    }
14147                }
14148                LinkinfoHsrAttrs::Interlink(val) => {
14149                    if last_off == offset {
14150                        stack.push(("Interlink", last_off));
14151                        break;
14152                    }
14153                }
14154                _ => {}
14155            };
14156            last_off = cur + attrs.pos;
14157        }
14158        if !stack.is_empty() {
14159            stack.push(("LinkinfoHsrAttrs", cur));
14160        }
14161        (stack, None)
14162    }
14163}
14164#[derive(Clone)]
14165pub enum LinkinfoIptunAttrs<'a> {
14166    Link(u32),
14167    Local(std::net::IpAddr),
14168    Remote(std::net::IpAddr),
14169    Ttl(u8),
14170    Tos(u8),
14171    EncapLimit(u8),
14172    Flowinfo(u32),
14173    Flags(u16),
14174    Proto(u8),
14175    Pmtudisc(u8),
14176    _6rdPrefix(&'a [u8]),
14177    _6rdRelayPrefix(std::net::Ipv4Addr),
14178    _6rdPrefixlen(u16),
14179    _6rdRelayPrefixlen(u16),
14180    EncapType(u16),
14181    EncapFlags(u16),
14182    EncapSport(u16),
14183    EncapDport(u16),
14184    CollectMetadata(()),
14185    Fwmark(u32),
14186}
14187impl<'a> IterableLinkinfoIptunAttrs<'a> {
14188    pub fn get_link(&self) -> Result<u32, ErrorContext> {
14189        let mut iter = self.clone();
14190        iter.pos = 0;
14191        for attr in iter {
14192            if let Ok(LinkinfoIptunAttrs::Link(val)) = attr {
14193                return Ok(val);
14194            }
14195        }
14196        Err(ErrorContext::new_missing(
14197            "LinkinfoIptunAttrs",
14198            "Link",
14199            self.orig_loc,
14200            self.buf.as_ptr() as usize,
14201        ))
14202    }
14203    pub fn get_local(&self) -> Result<std::net::IpAddr, ErrorContext> {
14204        let mut iter = self.clone();
14205        iter.pos = 0;
14206        for attr in iter {
14207            if let Ok(LinkinfoIptunAttrs::Local(val)) = attr {
14208                return Ok(val);
14209            }
14210        }
14211        Err(ErrorContext::new_missing(
14212            "LinkinfoIptunAttrs",
14213            "Local",
14214            self.orig_loc,
14215            self.buf.as_ptr() as usize,
14216        ))
14217    }
14218    pub fn get_remote(&self) -> Result<std::net::IpAddr, ErrorContext> {
14219        let mut iter = self.clone();
14220        iter.pos = 0;
14221        for attr in iter {
14222            if let Ok(LinkinfoIptunAttrs::Remote(val)) = attr {
14223                return Ok(val);
14224            }
14225        }
14226        Err(ErrorContext::new_missing(
14227            "LinkinfoIptunAttrs",
14228            "Remote",
14229            self.orig_loc,
14230            self.buf.as_ptr() as usize,
14231        ))
14232    }
14233    pub fn get_ttl(&self) -> Result<u8, ErrorContext> {
14234        let mut iter = self.clone();
14235        iter.pos = 0;
14236        for attr in iter {
14237            if let Ok(LinkinfoIptunAttrs::Ttl(val)) = attr {
14238                return Ok(val);
14239            }
14240        }
14241        Err(ErrorContext::new_missing(
14242            "LinkinfoIptunAttrs",
14243            "Ttl",
14244            self.orig_loc,
14245            self.buf.as_ptr() as usize,
14246        ))
14247    }
14248    pub fn get_tos(&self) -> Result<u8, ErrorContext> {
14249        let mut iter = self.clone();
14250        iter.pos = 0;
14251        for attr in iter {
14252            if let Ok(LinkinfoIptunAttrs::Tos(val)) = attr {
14253                return Ok(val);
14254            }
14255        }
14256        Err(ErrorContext::new_missing(
14257            "LinkinfoIptunAttrs",
14258            "Tos",
14259            self.orig_loc,
14260            self.buf.as_ptr() as usize,
14261        ))
14262    }
14263    pub fn get_encap_limit(&self) -> Result<u8, ErrorContext> {
14264        let mut iter = self.clone();
14265        iter.pos = 0;
14266        for attr in iter {
14267            if let Ok(LinkinfoIptunAttrs::EncapLimit(val)) = attr {
14268                return Ok(val);
14269            }
14270        }
14271        Err(ErrorContext::new_missing(
14272            "LinkinfoIptunAttrs",
14273            "EncapLimit",
14274            self.orig_loc,
14275            self.buf.as_ptr() as usize,
14276        ))
14277    }
14278    pub fn get_flowinfo(&self) -> Result<u32, ErrorContext> {
14279        let mut iter = self.clone();
14280        iter.pos = 0;
14281        for attr in iter {
14282            if let Ok(LinkinfoIptunAttrs::Flowinfo(val)) = attr {
14283                return Ok(val);
14284            }
14285        }
14286        Err(ErrorContext::new_missing(
14287            "LinkinfoIptunAttrs",
14288            "Flowinfo",
14289            self.orig_loc,
14290            self.buf.as_ptr() as usize,
14291        ))
14292    }
14293    pub fn get_flags(&self) -> Result<u16, ErrorContext> {
14294        let mut iter = self.clone();
14295        iter.pos = 0;
14296        for attr in iter {
14297            if let Ok(LinkinfoIptunAttrs::Flags(val)) = attr {
14298                return Ok(val);
14299            }
14300        }
14301        Err(ErrorContext::new_missing(
14302            "LinkinfoIptunAttrs",
14303            "Flags",
14304            self.orig_loc,
14305            self.buf.as_ptr() as usize,
14306        ))
14307    }
14308    pub fn get_proto(&self) -> Result<u8, ErrorContext> {
14309        let mut iter = self.clone();
14310        iter.pos = 0;
14311        for attr in iter {
14312            if let Ok(LinkinfoIptunAttrs::Proto(val)) = attr {
14313                return Ok(val);
14314            }
14315        }
14316        Err(ErrorContext::new_missing(
14317            "LinkinfoIptunAttrs",
14318            "Proto",
14319            self.orig_loc,
14320            self.buf.as_ptr() as usize,
14321        ))
14322    }
14323    pub fn get_pmtudisc(&self) -> Result<u8, ErrorContext> {
14324        let mut iter = self.clone();
14325        iter.pos = 0;
14326        for attr in iter {
14327            if let Ok(LinkinfoIptunAttrs::Pmtudisc(val)) = attr {
14328                return Ok(val);
14329            }
14330        }
14331        Err(ErrorContext::new_missing(
14332            "LinkinfoIptunAttrs",
14333            "Pmtudisc",
14334            self.orig_loc,
14335            self.buf.as_ptr() as usize,
14336        ))
14337    }
14338    pub fn get_6rd_prefix(&self) -> Result<&'a [u8], ErrorContext> {
14339        let mut iter = self.clone();
14340        iter.pos = 0;
14341        for attr in iter {
14342            if let Ok(LinkinfoIptunAttrs::_6rdPrefix(val)) = attr {
14343                return Ok(val);
14344            }
14345        }
14346        Err(ErrorContext::new_missing(
14347            "LinkinfoIptunAttrs",
14348            "6rdPrefix",
14349            self.orig_loc,
14350            self.buf.as_ptr() as usize,
14351        ))
14352    }
14353    pub fn get_6rd_relay_prefix(&self) -> Result<std::net::Ipv4Addr, ErrorContext> {
14354        let mut iter = self.clone();
14355        iter.pos = 0;
14356        for attr in iter {
14357            if let Ok(LinkinfoIptunAttrs::_6rdRelayPrefix(val)) = attr {
14358                return Ok(val);
14359            }
14360        }
14361        Err(ErrorContext::new_missing(
14362            "LinkinfoIptunAttrs",
14363            "6rdRelayPrefix",
14364            self.orig_loc,
14365            self.buf.as_ptr() as usize,
14366        ))
14367    }
14368    pub fn get_6rd_prefixlen(&self) -> Result<u16, ErrorContext> {
14369        let mut iter = self.clone();
14370        iter.pos = 0;
14371        for attr in iter {
14372            if let Ok(LinkinfoIptunAttrs::_6rdPrefixlen(val)) = attr {
14373                return Ok(val);
14374            }
14375        }
14376        Err(ErrorContext::new_missing(
14377            "LinkinfoIptunAttrs",
14378            "6rdPrefixlen",
14379            self.orig_loc,
14380            self.buf.as_ptr() as usize,
14381        ))
14382    }
14383    pub fn get_6rd_relay_prefixlen(&self) -> Result<u16, ErrorContext> {
14384        let mut iter = self.clone();
14385        iter.pos = 0;
14386        for attr in iter {
14387            if let Ok(LinkinfoIptunAttrs::_6rdRelayPrefixlen(val)) = attr {
14388                return Ok(val);
14389            }
14390        }
14391        Err(ErrorContext::new_missing(
14392            "LinkinfoIptunAttrs",
14393            "6rdRelayPrefixlen",
14394            self.orig_loc,
14395            self.buf.as_ptr() as usize,
14396        ))
14397    }
14398    pub fn get_encap_type(&self) -> Result<u16, ErrorContext> {
14399        let mut iter = self.clone();
14400        iter.pos = 0;
14401        for attr in iter {
14402            if let Ok(LinkinfoIptunAttrs::EncapType(val)) = attr {
14403                return Ok(val);
14404            }
14405        }
14406        Err(ErrorContext::new_missing(
14407            "LinkinfoIptunAttrs",
14408            "EncapType",
14409            self.orig_loc,
14410            self.buf.as_ptr() as usize,
14411        ))
14412    }
14413    pub fn get_encap_flags(&self) -> Result<u16, ErrorContext> {
14414        let mut iter = self.clone();
14415        iter.pos = 0;
14416        for attr in iter {
14417            if let Ok(LinkinfoIptunAttrs::EncapFlags(val)) = attr {
14418                return Ok(val);
14419            }
14420        }
14421        Err(ErrorContext::new_missing(
14422            "LinkinfoIptunAttrs",
14423            "EncapFlags",
14424            self.orig_loc,
14425            self.buf.as_ptr() as usize,
14426        ))
14427    }
14428    pub fn get_encap_sport(&self) -> Result<u16, ErrorContext> {
14429        let mut iter = self.clone();
14430        iter.pos = 0;
14431        for attr in iter {
14432            if let Ok(LinkinfoIptunAttrs::EncapSport(val)) = attr {
14433                return Ok(val);
14434            }
14435        }
14436        Err(ErrorContext::new_missing(
14437            "LinkinfoIptunAttrs",
14438            "EncapSport",
14439            self.orig_loc,
14440            self.buf.as_ptr() as usize,
14441        ))
14442    }
14443    pub fn get_encap_dport(&self) -> Result<u16, ErrorContext> {
14444        let mut iter = self.clone();
14445        iter.pos = 0;
14446        for attr in iter {
14447            if let Ok(LinkinfoIptunAttrs::EncapDport(val)) = attr {
14448                return Ok(val);
14449            }
14450        }
14451        Err(ErrorContext::new_missing(
14452            "LinkinfoIptunAttrs",
14453            "EncapDport",
14454            self.orig_loc,
14455            self.buf.as_ptr() as usize,
14456        ))
14457    }
14458    pub fn get_collect_metadata(&self) -> Result<(), ErrorContext> {
14459        let mut iter = self.clone();
14460        iter.pos = 0;
14461        for attr in iter {
14462            if let Ok(LinkinfoIptunAttrs::CollectMetadata(val)) = attr {
14463                return Ok(val);
14464            }
14465        }
14466        Err(ErrorContext::new_missing(
14467            "LinkinfoIptunAttrs",
14468            "CollectMetadata",
14469            self.orig_loc,
14470            self.buf.as_ptr() as usize,
14471        ))
14472    }
14473    pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
14474        let mut iter = self.clone();
14475        iter.pos = 0;
14476        for attr in iter {
14477            if let Ok(LinkinfoIptunAttrs::Fwmark(val)) = attr {
14478                return Ok(val);
14479            }
14480        }
14481        Err(ErrorContext::new_missing(
14482            "LinkinfoIptunAttrs",
14483            "Fwmark",
14484            self.orig_loc,
14485            self.buf.as_ptr() as usize,
14486        ))
14487    }
14488}
14489impl LinkinfoIptunAttrs<'_> {
14490    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoIptunAttrs<'a> {
14491        IterableLinkinfoIptunAttrs::with_loc(buf, buf.as_ptr() as usize)
14492    }
14493    fn attr_from_type(r#type: u16) -> Option<&'static str> {
14494        let res = match r#type {
14495            1u16 => "Link",
14496            2u16 => "Local",
14497            3u16 => "Remote",
14498            4u16 => "Ttl",
14499            5u16 => "Tos",
14500            6u16 => "EncapLimit",
14501            7u16 => "Flowinfo",
14502            8u16 => "Flags",
14503            9u16 => "Proto",
14504            10u16 => "Pmtudisc",
14505            11u16 => "6rdPrefix",
14506            12u16 => "6rdRelayPrefix",
14507            13u16 => "6rdPrefixlen",
14508            14u16 => "6rdRelayPrefixlen",
14509            15u16 => "EncapType",
14510            16u16 => "EncapFlags",
14511            17u16 => "EncapSport",
14512            18u16 => "EncapDport",
14513            19u16 => "CollectMetadata",
14514            20u16 => "Fwmark",
14515            _ => return None,
14516        };
14517        Some(res)
14518    }
14519}
14520#[derive(Clone, Copy, Default)]
14521pub struct IterableLinkinfoIptunAttrs<'a> {
14522    buf: &'a [u8],
14523    pos: usize,
14524    orig_loc: usize,
14525}
14526impl<'a> IterableLinkinfoIptunAttrs<'a> {
14527    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
14528        Self {
14529            buf,
14530            pos: 0,
14531            orig_loc,
14532        }
14533    }
14534    pub fn get_buf(&self) -> &'a [u8] {
14535        self.buf
14536    }
14537}
14538impl<'a> Iterator for IterableLinkinfoIptunAttrs<'a> {
14539    type Item = Result<LinkinfoIptunAttrs<'a>, ErrorContext>;
14540    fn next(&mut self) -> Option<Self::Item> {
14541        let mut pos;
14542        let mut r#type;
14543        loop {
14544            pos = self.pos;
14545            r#type = None;
14546            if self.buf.len() == self.pos {
14547                return None;
14548            }
14549            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
14550                self.pos = self.buf.len();
14551                break;
14552            };
14553            r#type = Some(header.r#type);
14554            let res = match header.r#type {
14555                1u16 => LinkinfoIptunAttrs::Link({
14556                    let res = parse_u32(next);
14557                    let Some(val) = res else { break };
14558                    val
14559                }),
14560                2u16 => LinkinfoIptunAttrs::Local({
14561                    let res = parse_ip(next);
14562                    let Some(val) = res else { break };
14563                    val
14564                }),
14565                3u16 => LinkinfoIptunAttrs::Remote({
14566                    let res = parse_ip(next);
14567                    let Some(val) = res else { break };
14568                    val
14569                }),
14570                4u16 => LinkinfoIptunAttrs::Ttl({
14571                    let res = parse_u8(next);
14572                    let Some(val) = res else { break };
14573                    val
14574                }),
14575                5u16 => LinkinfoIptunAttrs::Tos({
14576                    let res = parse_u8(next);
14577                    let Some(val) = res else { break };
14578                    val
14579                }),
14580                6u16 => LinkinfoIptunAttrs::EncapLimit({
14581                    let res = parse_u8(next);
14582                    let Some(val) = res else { break };
14583                    val
14584                }),
14585                7u16 => LinkinfoIptunAttrs::Flowinfo({
14586                    let res = parse_be_u32(next);
14587                    let Some(val) = res else { break };
14588                    val
14589                }),
14590                8u16 => LinkinfoIptunAttrs::Flags({
14591                    let res = parse_be_u16(next);
14592                    let Some(val) = res else { break };
14593                    val
14594                }),
14595                9u16 => LinkinfoIptunAttrs::Proto({
14596                    let res = parse_u8(next);
14597                    let Some(val) = res else { break };
14598                    val
14599                }),
14600                10u16 => LinkinfoIptunAttrs::Pmtudisc({
14601                    let res = parse_u8(next);
14602                    let Some(val) = res else { break };
14603                    val
14604                }),
14605                11u16 => LinkinfoIptunAttrs::_6rdPrefix({
14606                    let res = Some(next);
14607                    let Some(val) = res else { break };
14608                    val
14609                }),
14610                12u16 => LinkinfoIptunAttrs::_6rdRelayPrefix({
14611                    let res = parse_be_u32(next).map(Ipv4Addr::from_bits);
14612                    let Some(val) = res else { break };
14613                    val
14614                }),
14615                13u16 => LinkinfoIptunAttrs::_6rdPrefixlen({
14616                    let res = parse_u16(next);
14617                    let Some(val) = res else { break };
14618                    val
14619                }),
14620                14u16 => LinkinfoIptunAttrs::_6rdRelayPrefixlen({
14621                    let res = parse_u16(next);
14622                    let Some(val) = res else { break };
14623                    val
14624                }),
14625                15u16 => LinkinfoIptunAttrs::EncapType({
14626                    let res = parse_u16(next);
14627                    let Some(val) = res else { break };
14628                    val
14629                }),
14630                16u16 => LinkinfoIptunAttrs::EncapFlags({
14631                    let res = parse_u16(next);
14632                    let Some(val) = res else { break };
14633                    val
14634                }),
14635                17u16 => LinkinfoIptunAttrs::EncapSport({
14636                    let res = parse_be_u16(next);
14637                    let Some(val) = res else { break };
14638                    val
14639                }),
14640                18u16 => LinkinfoIptunAttrs::EncapDport({
14641                    let res = parse_be_u16(next);
14642                    let Some(val) = res else { break };
14643                    val
14644                }),
14645                19u16 => LinkinfoIptunAttrs::CollectMetadata(()),
14646                20u16 => LinkinfoIptunAttrs::Fwmark({
14647                    let res = parse_u32(next);
14648                    let Some(val) = res else { break };
14649                    val
14650                }),
14651                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
14652                n => continue,
14653            };
14654            return Some(Ok(res));
14655        }
14656        Some(Err(ErrorContext::new(
14657            "LinkinfoIptunAttrs",
14658            r#type.and_then(|t| LinkinfoIptunAttrs::attr_from_type(t)),
14659            self.orig_loc,
14660            self.buf.as_ptr().wrapping_add(pos) as usize,
14661        )))
14662    }
14663}
14664impl<'a> std::fmt::Debug for IterableLinkinfoIptunAttrs<'_> {
14665    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14666        let mut fmt = f.debug_struct("LinkinfoIptunAttrs");
14667        for attr in self.clone() {
14668            let attr = match attr {
14669                Ok(a) => a,
14670                Err(err) => {
14671                    fmt.finish()?;
14672                    f.write_str("Err(")?;
14673                    err.fmt(f)?;
14674                    return f.write_str(")");
14675                }
14676            };
14677            match attr {
14678                LinkinfoIptunAttrs::Link(val) => fmt.field("Link", &val),
14679                LinkinfoIptunAttrs::Local(val) => fmt.field("Local", &val),
14680                LinkinfoIptunAttrs::Remote(val) => fmt.field("Remote", &val),
14681                LinkinfoIptunAttrs::Ttl(val) => fmt.field("Ttl", &val),
14682                LinkinfoIptunAttrs::Tos(val) => fmt.field("Tos", &val),
14683                LinkinfoIptunAttrs::EncapLimit(val) => fmt.field("EncapLimit", &val),
14684                LinkinfoIptunAttrs::Flowinfo(val) => fmt.field("Flowinfo", &val),
14685                LinkinfoIptunAttrs::Flags(val) => fmt.field("Flags", &val),
14686                LinkinfoIptunAttrs::Proto(val) => fmt.field("Proto", &val),
14687                LinkinfoIptunAttrs::Pmtudisc(val) => fmt.field("Pmtudisc", &val),
14688                LinkinfoIptunAttrs::_6rdPrefix(val) => fmt.field("_6rdPrefix", &val),
14689                LinkinfoIptunAttrs::_6rdRelayPrefix(val) => fmt.field("_6rdRelayPrefix", &val),
14690                LinkinfoIptunAttrs::_6rdPrefixlen(val) => fmt.field("_6rdPrefixlen", &val),
14691                LinkinfoIptunAttrs::_6rdRelayPrefixlen(val) => {
14692                    fmt.field("_6rdRelayPrefixlen", &val)
14693                }
14694                LinkinfoIptunAttrs::EncapType(val) => fmt.field("EncapType", &val),
14695                LinkinfoIptunAttrs::EncapFlags(val) => fmt.field("EncapFlags", &val),
14696                LinkinfoIptunAttrs::EncapSport(val) => fmt.field("EncapSport", &val),
14697                LinkinfoIptunAttrs::EncapDport(val) => fmt.field("EncapDport", &val),
14698                LinkinfoIptunAttrs::CollectMetadata(val) => fmt.field("CollectMetadata", &val),
14699                LinkinfoIptunAttrs::Fwmark(val) => fmt.field("Fwmark", &val),
14700            };
14701        }
14702        fmt.finish()
14703    }
14704}
14705impl IterableLinkinfoIptunAttrs<'_> {
14706    pub fn lookup_attr(
14707        &self,
14708        offset: usize,
14709        missing_type: Option<u16>,
14710    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
14711        let mut stack = Vec::new();
14712        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
14713        if missing_type.is_some() && cur == offset {
14714            stack.push(("LinkinfoIptunAttrs", offset));
14715            return (
14716                stack,
14717                missing_type.and_then(|t| LinkinfoIptunAttrs::attr_from_type(t)),
14718            );
14719        }
14720        if cur > offset || cur + self.buf.len() < offset {
14721            return (stack, None);
14722        }
14723        let mut attrs = self.clone();
14724        let mut last_off = cur + attrs.pos;
14725        while let Some(attr) = attrs.next() {
14726            let Ok(attr) = attr else { break };
14727            match attr {
14728                LinkinfoIptunAttrs::Link(val) => {
14729                    if last_off == offset {
14730                        stack.push(("Link", last_off));
14731                        break;
14732                    }
14733                }
14734                LinkinfoIptunAttrs::Local(val) => {
14735                    if last_off == offset {
14736                        stack.push(("Local", last_off));
14737                        break;
14738                    }
14739                }
14740                LinkinfoIptunAttrs::Remote(val) => {
14741                    if last_off == offset {
14742                        stack.push(("Remote", last_off));
14743                        break;
14744                    }
14745                }
14746                LinkinfoIptunAttrs::Ttl(val) => {
14747                    if last_off == offset {
14748                        stack.push(("Ttl", last_off));
14749                        break;
14750                    }
14751                }
14752                LinkinfoIptunAttrs::Tos(val) => {
14753                    if last_off == offset {
14754                        stack.push(("Tos", last_off));
14755                        break;
14756                    }
14757                }
14758                LinkinfoIptunAttrs::EncapLimit(val) => {
14759                    if last_off == offset {
14760                        stack.push(("EncapLimit", last_off));
14761                        break;
14762                    }
14763                }
14764                LinkinfoIptunAttrs::Flowinfo(val) => {
14765                    if last_off == offset {
14766                        stack.push(("Flowinfo", last_off));
14767                        break;
14768                    }
14769                }
14770                LinkinfoIptunAttrs::Flags(val) => {
14771                    if last_off == offset {
14772                        stack.push(("Flags", last_off));
14773                        break;
14774                    }
14775                }
14776                LinkinfoIptunAttrs::Proto(val) => {
14777                    if last_off == offset {
14778                        stack.push(("Proto", last_off));
14779                        break;
14780                    }
14781                }
14782                LinkinfoIptunAttrs::Pmtudisc(val) => {
14783                    if last_off == offset {
14784                        stack.push(("Pmtudisc", last_off));
14785                        break;
14786                    }
14787                }
14788                LinkinfoIptunAttrs::_6rdPrefix(val) => {
14789                    if last_off == offset {
14790                        stack.push(("6rdPrefix", last_off));
14791                        break;
14792                    }
14793                }
14794                LinkinfoIptunAttrs::_6rdRelayPrefix(val) => {
14795                    if last_off == offset {
14796                        stack.push(("6rdRelayPrefix", last_off));
14797                        break;
14798                    }
14799                }
14800                LinkinfoIptunAttrs::_6rdPrefixlen(val) => {
14801                    if last_off == offset {
14802                        stack.push(("6rdPrefixlen", last_off));
14803                        break;
14804                    }
14805                }
14806                LinkinfoIptunAttrs::_6rdRelayPrefixlen(val) => {
14807                    if last_off == offset {
14808                        stack.push(("6rdRelayPrefixlen", last_off));
14809                        break;
14810                    }
14811                }
14812                LinkinfoIptunAttrs::EncapType(val) => {
14813                    if last_off == offset {
14814                        stack.push(("EncapType", last_off));
14815                        break;
14816                    }
14817                }
14818                LinkinfoIptunAttrs::EncapFlags(val) => {
14819                    if last_off == offset {
14820                        stack.push(("EncapFlags", last_off));
14821                        break;
14822                    }
14823                }
14824                LinkinfoIptunAttrs::EncapSport(val) => {
14825                    if last_off == offset {
14826                        stack.push(("EncapSport", last_off));
14827                        break;
14828                    }
14829                }
14830                LinkinfoIptunAttrs::EncapDport(val) => {
14831                    if last_off == offset {
14832                        stack.push(("EncapDport", last_off));
14833                        break;
14834                    }
14835                }
14836                LinkinfoIptunAttrs::CollectMetadata(val) => {
14837                    if last_off == offset {
14838                        stack.push(("CollectMetadata", last_off));
14839                        break;
14840                    }
14841                }
14842                LinkinfoIptunAttrs::Fwmark(val) => {
14843                    if last_off == offset {
14844                        stack.push(("Fwmark", last_off));
14845                        break;
14846                    }
14847                }
14848                _ => {}
14849            };
14850            last_off = cur + attrs.pos;
14851        }
14852        if !stack.is_empty() {
14853            stack.push(("LinkinfoIptunAttrs", cur));
14854        }
14855        (stack, None)
14856    }
14857}
14858#[derive(Clone)]
14859pub enum LinkinfoIp6tnlAttrs<'a> {
14860    Link(u32),
14861    Local(&'a [u8]),
14862    Remote(&'a [u8]),
14863    Ttl(u8),
14864    EncapLimit(u8),
14865    Flowinfo(u32),
14866    Flags(u32),
14867    Proto(u8),
14868    EncapType(u16),
14869    EncapFlags(u16),
14870    EncapSport(u16),
14871    EncapDport(u16),
14872    CollectMetadata(()),
14873    Fwmark(u32),
14874}
14875impl<'a> IterableLinkinfoIp6tnlAttrs<'a> {
14876    pub fn get_link(&self) -> Result<u32, ErrorContext> {
14877        let mut iter = self.clone();
14878        iter.pos = 0;
14879        for attr in iter {
14880            if let Ok(LinkinfoIp6tnlAttrs::Link(val)) = attr {
14881                return Ok(val);
14882            }
14883        }
14884        Err(ErrorContext::new_missing(
14885            "LinkinfoIp6tnlAttrs",
14886            "Link",
14887            self.orig_loc,
14888            self.buf.as_ptr() as usize,
14889        ))
14890    }
14891    pub fn get_local(&self) -> Result<&'a [u8], ErrorContext> {
14892        let mut iter = self.clone();
14893        iter.pos = 0;
14894        for attr in iter {
14895            if let Ok(LinkinfoIp6tnlAttrs::Local(val)) = attr {
14896                return Ok(val);
14897            }
14898        }
14899        Err(ErrorContext::new_missing(
14900            "LinkinfoIp6tnlAttrs",
14901            "Local",
14902            self.orig_loc,
14903            self.buf.as_ptr() as usize,
14904        ))
14905    }
14906    pub fn get_remote(&self) -> Result<&'a [u8], ErrorContext> {
14907        let mut iter = self.clone();
14908        iter.pos = 0;
14909        for attr in iter {
14910            if let Ok(LinkinfoIp6tnlAttrs::Remote(val)) = attr {
14911                return Ok(val);
14912            }
14913        }
14914        Err(ErrorContext::new_missing(
14915            "LinkinfoIp6tnlAttrs",
14916            "Remote",
14917            self.orig_loc,
14918            self.buf.as_ptr() as usize,
14919        ))
14920    }
14921    pub fn get_ttl(&self) -> Result<u8, ErrorContext> {
14922        let mut iter = self.clone();
14923        iter.pos = 0;
14924        for attr in iter {
14925            if let Ok(LinkinfoIp6tnlAttrs::Ttl(val)) = attr {
14926                return Ok(val);
14927            }
14928        }
14929        Err(ErrorContext::new_missing(
14930            "LinkinfoIp6tnlAttrs",
14931            "Ttl",
14932            self.orig_loc,
14933            self.buf.as_ptr() as usize,
14934        ))
14935    }
14936    pub fn get_encap_limit(&self) -> Result<u8, ErrorContext> {
14937        let mut iter = self.clone();
14938        iter.pos = 0;
14939        for attr in iter {
14940            if let Ok(LinkinfoIp6tnlAttrs::EncapLimit(val)) = attr {
14941                return Ok(val);
14942            }
14943        }
14944        Err(ErrorContext::new_missing(
14945            "LinkinfoIp6tnlAttrs",
14946            "EncapLimit",
14947            self.orig_loc,
14948            self.buf.as_ptr() as usize,
14949        ))
14950    }
14951    pub fn get_flowinfo(&self) -> Result<u32, ErrorContext> {
14952        let mut iter = self.clone();
14953        iter.pos = 0;
14954        for attr in iter {
14955            if let Ok(LinkinfoIp6tnlAttrs::Flowinfo(val)) = attr {
14956                return Ok(val);
14957            }
14958        }
14959        Err(ErrorContext::new_missing(
14960            "LinkinfoIp6tnlAttrs",
14961            "Flowinfo",
14962            self.orig_loc,
14963            self.buf.as_ptr() as usize,
14964        ))
14965    }
14966    pub fn get_flags(&self) -> Result<u32, ErrorContext> {
14967        let mut iter = self.clone();
14968        iter.pos = 0;
14969        for attr in iter {
14970            if let Ok(LinkinfoIp6tnlAttrs::Flags(val)) = attr {
14971                return Ok(val);
14972            }
14973        }
14974        Err(ErrorContext::new_missing(
14975            "LinkinfoIp6tnlAttrs",
14976            "Flags",
14977            self.orig_loc,
14978            self.buf.as_ptr() as usize,
14979        ))
14980    }
14981    pub fn get_proto(&self) -> Result<u8, ErrorContext> {
14982        let mut iter = self.clone();
14983        iter.pos = 0;
14984        for attr in iter {
14985            if let Ok(LinkinfoIp6tnlAttrs::Proto(val)) = attr {
14986                return Ok(val);
14987            }
14988        }
14989        Err(ErrorContext::new_missing(
14990            "LinkinfoIp6tnlAttrs",
14991            "Proto",
14992            self.orig_loc,
14993            self.buf.as_ptr() as usize,
14994        ))
14995    }
14996    pub fn get_encap_type(&self) -> Result<u16, ErrorContext> {
14997        let mut iter = self.clone();
14998        iter.pos = 0;
14999        for attr in iter {
15000            if let Ok(LinkinfoIp6tnlAttrs::EncapType(val)) = attr {
15001                return Ok(val);
15002            }
15003        }
15004        Err(ErrorContext::new_missing(
15005            "LinkinfoIp6tnlAttrs",
15006            "EncapType",
15007            self.orig_loc,
15008            self.buf.as_ptr() as usize,
15009        ))
15010    }
15011    pub fn get_encap_flags(&self) -> Result<u16, ErrorContext> {
15012        let mut iter = self.clone();
15013        iter.pos = 0;
15014        for attr in iter {
15015            if let Ok(LinkinfoIp6tnlAttrs::EncapFlags(val)) = attr {
15016                return Ok(val);
15017            }
15018        }
15019        Err(ErrorContext::new_missing(
15020            "LinkinfoIp6tnlAttrs",
15021            "EncapFlags",
15022            self.orig_loc,
15023            self.buf.as_ptr() as usize,
15024        ))
15025    }
15026    pub fn get_encap_sport(&self) -> Result<u16, ErrorContext> {
15027        let mut iter = self.clone();
15028        iter.pos = 0;
15029        for attr in iter {
15030            if let Ok(LinkinfoIp6tnlAttrs::EncapSport(val)) = attr {
15031                return Ok(val);
15032            }
15033        }
15034        Err(ErrorContext::new_missing(
15035            "LinkinfoIp6tnlAttrs",
15036            "EncapSport",
15037            self.orig_loc,
15038            self.buf.as_ptr() as usize,
15039        ))
15040    }
15041    pub fn get_encap_dport(&self) -> Result<u16, ErrorContext> {
15042        let mut iter = self.clone();
15043        iter.pos = 0;
15044        for attr in iter {
15045            if let Ok(LinkinfoIp6tnlAttrs::EncapDport(val)) = attr {
15046                return Ok(val);
15047            }
15048        }
15049        Err(ErrorContext::new_missing(
15050            "LinkinfoIp6tnlAttrs",
15051            "EncapDport",
15052            self.orig_loc,
15053            self.buf.as_ptr() as usize,
15054        ))
15055    }
15056    pub fn get_collect_metadata(&self) -> Result<(), ErrorContext> {
15057        let mut iter = self.clone();
15058        iter.pos = 0;
15059        for attr in iter {
15060            if let Ok(LinkinfoIp6tnlAttrs::CollectMetadata(val)) = attr {
15061                return Ok(val);
15062            }
15063        }
15064        Err(ErrorContext::new_missing(
15065            "LinkinfoIp6tnlAttrs",
15066            "CollectMetadata",
15067            self.orig_loc,
15068            self.buf.as_ptr() as usize,
15069        ))
15070    }
15071    pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
15072        let mut iter = self.clone();
15073        iter.pos = 0;
15074        for attr in iter {
15075            if let Ok(LinkinfoIp6tnlAttrs::Fwmark(val)) = attr {
15076                return Ok(val);
15077            }
15078        }
15079        Err(ErrorContext::new_missing(
15080            "LinkinfoIp6tnlAttrs",
15081            "Fwmark",
15082            self.orig_loc,
15083            self.buf.as_ptr() as usize,
15084        ))
15085    }
15086}
15087impl LinkinfoIp6tnlAttrs<'_> {
15088    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoIp6tnlAttrs<'a> {
15089        IterableLinkinfoIp6tnlAttrs::with_loc(buf, buf.as_ptr() as usize)
15090    }
15091    fn attr_from_type(r#type: u16) -> Option<&'static str> {
15092        LinkinfoIptunAttrs::attr_from_type(r#type)
15093    }
15094}
15095#[derive(Clone, Copy, Default)]
15096pub struct IterableLinkinfoIp6tnlAttrs<'a> {
15097    buf: &'a [u8],
15098    pos: usize,
15099    orig_loc: usize,
15100}
15101impl<'a> IterableLinkinfoIp6tnlAttrs<'a> {
15102    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
15103        Self {
15104            buf,
15105            pos: 0,
15106            orig_loc,
15107        }
15108    }
15109    pub fn get_buf(&self) -> &'a [u8] {
15110        self.buf
15111    }
15112}
15113impl<'a> Iterator for IterableLinkinfoIp6tnlAttrs<'a> {
15114    type Item = Result<LinkinfoIp6tnlAttrs<'a>, ErrorContext>;
15115    fn next(&mut self) -> Option<Self::Item> {
15116        let mut pos;
15117        let mut r#type;
15118        loop {
15119            pos = self.pos;
15120            r#type = None;
15121            if self.buf.len() == self.pos {
15122                return None;
15123            }
15124            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
15125                self.pos = self.buf.len();
15126                break;
15127            };
15128            r#type = Some(header.r#type);
15129            let res = match header.r#type {
15130                1u16 => LinkinfoIp6tnlAttrs::Link({
15131                    let res = parse_u32(next);
15132                    let Some(val) = res else { break };
15133                    val
15134                }),
15135                2u16 => LinkinfoIp6tnlAttrs::Local({
15136                    let res = Some(next);
15137                    let Some(val) = res else { break };
15138                    val
15139                }),
15140                3u16 => LinkinfoIp6tnlAttrs::Remote({
15141                    let res = Some(next);
15142                    let Some(val) = res else { break };
15143                    val
15144                }),
15145                4u16 => LinkinfoIp6tnlAttrs::Ttl({
15146                    let res = parse_u8(next);
15147                    let Some(val) = res else { break };
15148                    val
15149                }),
15150                6u16 => LinkinfoIp6tnlAttrs::EncapLimit({
15151                    let res = parse_u8(next);
15152                    let Some(val) = res else { break };
15153                    val
15154                }),
15155                7u16 => LinkinfoIp6tnlAttrs::Flowinfo({
15156                    let res = parse_be_u32(next);
15157                    let Some(val) = res else { break };
15158                    val
15159                }),
15160                8u16 => LinkinfoIp6tnlAttrs::Flags({
15161                    let res = parse_be_u32(next);
15162                    let Some(val) = res else { break };
15163                    val
15164                }),
15165                9u16 => LinkinfoIp6tnlAttrs::Proto({
15166                    let res = parse_u8(next);
15167                    let Some(val) = res else { break };
15168                    val
15169                }),
15170                15u16 => LinkinfoIp6tnlAttrs::EncapType({
15171                    let res = parse_u16(next);
15172                    let Some(val) = res else { break };
15173                    val
15174                }),
15175                16u16 => LinkinfoIp6tnlAttrs::EncapFlags({
15176                    let res = parse_u16(next);
15177                    let Some(val) = res else { break };
15178                    val
15179                }),
15180                17u16 => LinkinfoIp6tnlAttrs::EncapSport({
15181                    let res = parse_be_u16(next);
15182                    let Some(val) = res else { break };
15183                    val
15184                }),
15185                18u16 => LinkinfoIp6tnlAttrs::EncapDport({
15186                    let res = parse_be_u16(next);
15187                    let Some(val) = res else { break };
15188                    val
15189                }),
15190                19u16 => LinkinfoIp6tnlAttrs::CollectMetadata(()),
15191                20u16 => LinkinfoIp6tnlAttrs::Fwmark({
15192                    let res = parse_u32(next);
15193                    let Some(val) = res else { break };
15194                    val
15195                }),
15196                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
15197                n => continue,
15198            };
15199            return Some(Ok(res));
15200        }
15201        Some(Err(ErrorContext::new(
15202            "LinkinfoIp6tnlAttrs",
15203            r#type.and_then(|t| LinkinfoIp6tnlAttrs::attr_from_type(t)),
15204            self.orig_loc,
15205            self.buf.as_ptr().wrapping_add(pos) as usize,
15206        )))
15207    }
15208}
15209impl<'a> std::fmt::Debug for IterableLinkinfoIp6tnlAttrs<'_> {
15210    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15211        let mut fmt = f.debug_struct("LinkinfoIp6tnlAttrs");
15212        for attr in self.clone() {
15213            let attr = match attr {
15214                Ok(a) => a,
15215                Err(err) => {
15216                    fmt.finish()?;
15217                    f.write_str("Err(")?;
15218                    err.fmt(f)?;
15219                    return f.write_str(")");
15220                }
15221            };
15222            match attr {
15223                LinkinfoIp6tnlAttrs::Link(val) => fmt.field("Link", &val),
15224                LinkinfoIp6tnlAttrs::Local(val) => fmt.field("Local", &val),
15225                LinkinfoIp6tnlAttrs::Remote(val) => fmt.field("Remote", &val),
15226                LinkinfoIp6tnlAttrs::Ttl(val) => fmt.field("Ttl", &val),
15227                LinkinfoIp6tnlAttrs::EncapLimit(val) => fmt.field("EncapLimit", &val),
15228                LinkinfoIp6tnlAttrs::Flowinfo(val) => fmt.field("Flowinfo", &val),
15229                LinkinfoIp6tnlAttrs::Flags(val) => fmt.field("Flags", &val),
15230                LinkinfoIp6tnlAttrs::Proto(val) => fmt.field("Proto", &val),
15231                LinkinfoIp6tnlAttrs::EncapType(val) => fmt.field("EncapType", &val),
15232                LinkinfoIp6tnlAttrs::EncapFlags(val) => fmt.field("EncapFlags", &val),
15233                LinkinfoIp6tnlAttrs::EncapSport(val) => fmt.field("EncapSport", &val),
15234                LinkinfoIp6tnlAttrs::EncapDport(val) => fmt.field("EncapDport", &val),
15235                LinkinfoIp6tnlAttrs::CollectMetadata(val) => fmt.field("CollectMetadata", &val),
15236                LinkinfoIp6tnlAttrs::Fwmark(val) => fmt.field("Fwmark", &val),
15237            };
15238        }
15239        fmt.finish()
15240    }
15241}
15242impl IterableLinkinfoIp6tnlAttrs<'_> {
15243    pub fn lookup_attr(
15244        &self,
15245        offset: usize,
15246        missing_type: Option<u16>,
15247    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
15248        let mut stack = Vec::new();
15249        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
15250        if missing_type.is_some() && cur == offset {
15251            stack.push(("LinkinfoIp6tnlAttrs", offset));
15252            return (
15253                stack,
15254                missing_type.and_then(|t| LinkinfoIp6tnlAttrs::attr_from_type(t)),
15255            );
15256        }
15257        if cur > offset || cur + self.buf.len() < offset {
15258            return (stack, None);
15259        }
15260        let mut attrs = self.clone();
15261        let mut last_off = cur + attrs.pos;
15262        while let Some(attr) = attrs.next() {
15263            let Ok(attr) = attr else { break };
15264            match attr {
15265                LinkinfoIp6tnlAttrs::Link(val) => {
15266                    if last_off == offset {
15267                        stack.push(("Link", last_off));
15268                        break;
15269                    }
15270                }
15271                LinkinfoIp6tnlAttrs::Local(val) => {
15272                    if last_off == offset {
15273                        stack.push(("Local", last_off));
15274                        break;
15275                    }
15276                }
15277                LinkinfoIp6tnlAttrs::Remote(val) => {
15278                    if last_off == offset {
15279                        stack.push(("Remote", last_off));
15280                        break;
15281                    }
15282                }
15283                LinkinfoIp6tnlAttrs::Ttl(val) => {
15284                    if last_off == offset {
15285                        stack.push(("Ttl", last_off));
15286                        break;
15287                    }
15288                }
15289                LinkinfoIp6tnlAttrs::EncapLimit(val) => {
15290                    if last_off == offset {
15291                        stack.push(("EncapLimit", last_off));
15292                        break;
15293                    }
15294                }
15295                LinkinfoIp6tnlAttrs::Flowinfo(val) => {
15296                    if last_off == offset {
15297                        stack.push(("Flowinfo", last_off));
15298                        break;
15299                    }
15300                }
15301                LinkinfoIp6tnlAttrs::Flags(val) => {
15302                    if last_off == offset {
15303                        stack.push(("Flags", last_off));
15304                        break;
15305                    }
15306                }
15307                LinkinfoIp6tnlAttrs::Proto(val) => {
15308                    if last_off == offset {
15309                        stack.push(("Proto", last_off));
15310                        break;
15311                    }
15312                }
15313                LinkinfoIp6tnlAttrs::EncapType(val) => {
15314                    if last_off == offset {
15315                        stack.push(("EncapType", last_off));
15316                        break;
15317                    }
15318                }
15319                LinkinfoIp6tnlAttrs::EncapFlags(val) => {
15320                    if last_off == offset {
15321                        stack.push(("EncapFlags", last_off));
15322                        break;
15323                    }
15324                }
15325                LinkinfoIp6tnlAttrs::EncapSport(val) => {
15326                    if last_off == offset {
15327                        stack.push(("EncapSport", last_off));
15328                        break;
15329                    }
15330                }
15331                LinkinfoIp6tnlAttrs::EncapDport(val) => {
15332                    if last_off == offset {
15333                        stack.push(("EncapDport", last_off));
15334                        break;
15335                    }
15336                }
15337                LinkinfoIp6tnlAttrs::CollectMetadata(val) => {
15338                    if last_off == offset {
15339                        stack.push(("CollectMetadata", last_off));
15340                        break;
15341                    }
15342                }
15343                LinkinfoIp6tnlAttrs::Fwmark(val) => {
15344                    if last_off == offset {
15345                        stack.push(("Fwmark", last_off));
15346                        break;
15347                    }
15348                }
15349                _ => {}
15350            };
15351            last_off = cur + attrs.pos;
15352        }
15353        if !stack.is_empty() {
15354            stack.push(("LinkinfoIp6tnlAttrs", cur));
15355        }
15356        (stack, None)
15357    }
15358}
15359#[derive(Clone)]
15360pub enum LinkinfoTunAttrs {
15361    Owner(u32),
15362    Group(u32),
15363    Type(u8),
15364    Pi(u8),
15365    VnetHdr(u8),
15366    Persist(u8),
15367    MultiQueue(u8),
15368    NumQueues(u32),
15369    NumDisabledQueues(u32),
15370}
15371impl<'a> IterableLinkinfoTunAttrs<'a> {
15372    pub fn get_owner(&self) -> Result<u32, ErrorContext> {
15373        let mut iter = self.clone();
15374        iter.pos = 0;
15375        for attr in iter {
15376            if let Ok(LinkinfoTunAttrs::Owner(val)) = attr {
15377                return Ok(val);
15378            }
15379        }
15380        Err(ErrorContext::new_missing(
15381            "LinkinfoTunAttrs",
15382            "Owner",
15383            self.orig_loc,
15384            self.buf.as_ptr() as usize,
15385        ))
15386    }
15387    pub fn get_group(&self) -> Result<u32, ErrorContext> {
15388        let mut iter = self.clone();
15389        iter.pos = 0;
15390        for attr in iter {
15391            if let Ok(LinkinfoTunAttrs::Group(val)) = attr {
15392                return Ok(val);
15393            }
15394        }
15395        Err(ErrorContext::new_missing(
15396            "LinkinfoTunAttrs",
15397            "Group",
15398            self.orig_loc,
15399            self.buf.as_ptr() as usize,
15400        ))
15401    }
15402    pub fn get_type(&self) -> Result<u8, ErrorContext> {
15403        let mut iter = self.clone();
15404        iter.pos = 0;
15405        for attr in iter {
15406            if let Ok(LinkinfoTunAttrs::Type(val)) = attr {
15407                return Ok(val);
15408            }
15409        }
15410        Err(ErrorContext::new_missing(
15411            "LinkinfoTunAttrs",
15412            "Type",
15413            self.orig_loc,
15414            self.buf.as_ptr() as usize,
15415        ))
15416    }
15417    pub fn get_pi(&self) -> Result<u8, ErrorContext> {
15418        let mut iter = self.clone();
15419        iter.pos = 0;
15420        for attr in iter {
15421            if let Ok(LinkinfoTunAttrs::Pi(val)) = attr {
15422                return Ok(val);
15423            }
15424        }
15425        Err(ErrorContext::new_missing(
15426            "LinkinfoTunAttrs",
15427            "Pi",
15428            self.orig_loc,
15429            self.buf.as_ptr() as usize,
15430        ))
15431    }
15432    pub fn get_vnet_hdr(&self) -> Result<u8, ErrorContext> {
15433        let mut iter = self.clone();
15434        iter.pos = 0;
15435        for attr in iter {
15436            if let Ok(LinkinfoTunAttrs::VnetHdr(val)) = attr {
15437                return Ok(val);
15438            }
15439        }
15440        Err(ErrorContext::new_missing(
15441            "LinkinfoTunAttrs",
15442            "VnetHdr",
15443            self.orig_loc,
15444            self.buf.as_ptr() as usize,
15445        ))
15446    }
15447    pub fn get_persist(&self) -> Result<u8, ErrorContext> {
15448        let mut iter = self.clone();
15449        iter.pos = 0;
15450        for attr in iter {
15451            if let Ok(LinkinfoTunAttrs::Persist(val)) = attr {
15452                return Ok(val);
15453            }
15454        }
15455        Err(ErrorContext::new_missing(
15456            "LinkinfoTunAttrs",
15457            "Persist",
15458            self.orig_loc,
15459            self.buf.as_ptr() as usize,
15460        ))
15461    }
15462    pub fn get_multi_queue(&self) -> Result<u8, ErrorContext> {
15463        let mut iter = self.clone();
15464        iter.pos = 0;
15465        for attr in iter {
15466            if let Ok(LinkinfoTunAttrs::MultiQueue(val)) = attr {
15467                return Ok(val);
15468            }
15469        }
15470        Err(ErrorContext::new_missing(
15471            "LinkinfoTunAttrs",
15472            "MultiQueue",
15473            self.orig_loc,
15474            self.buf.as_ptr() as usize,
15475        ))
15476    }
15477    pub fn get_num_queues(&self) -> Result<u32, ErrorContext> {
15478        let mut iter = self.clone();
15479        iter.pos = 0;
15480        for attr in iter {
15481            if let Ok(LinkinfoTunAttrs::NumQueues(val)) = attr {
15482                return Ok(val);
15483            }
15484        }
15485        Err(ErrorContext::new_missing(
15486            "LinkinfoTunAttrs",
15487            "NumQueues",
15488            self.orig_loc,
15489            self.buf.as_ptr() as usize,
15490        ))
15491    }
15492    pub fn get_num_disabled_queues(&self) -> Result<u32, ErrorContext> {
15493        let mut iter = self.clone();
15494        iter.pos = 0;
15495        for attr in iter {
15496            if let Ok(LinkinfoTunAttrs::NumDisabledQueues(val)) = attr {
15497                return Ok(val);
15498            }
15499        }
15500        Err(ErrorContext::new_missing(
15501            "LinkinfoTunAttrs",
15502            "NumDisabledQueues",
15503            self.orig_loc,
15504            self.buf.as_ptr() as usize,
15505        ))
15506    }
15507}
15508impl LinkinfoTunAttrs {
15509    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoTunAttrs<'a> {
15510        IterableLinkinfoTunAttrs::with_loc(buf, buf.as_ptr() as usize)
15511    }
15512    fn attr_from_type(r#type: u16) -> Option<&'static str> {
15513        let res = match r#type {
15514            1u16 => "Owner",
15515            2u16 => "Group",
15516            3u16 => "Type",
15517            4u16 => "Pi",
15518            5u16 => "VnetHdr",
15519            6u16 => "Persist",
15520            7u16 => "MultiQueue",
15521            8u16 => "NumQueues",
15522            9u16 => "NumDisabledQueues",
15523            _ => return None,
15524        };
15525        Some(res)
15526    }
15527}
15528#[derive(Clone, Copy, Default)]
15529pub struct IterableLinkinfoTunAttrs<'a> {
15530    buf: &'a [u8],
15531    pos: usize,
15532    orig_loc: usize,
15533}
15534impl<'a> IterableLinkinfoTunAttrs<'a> {
15535    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
15536        Self {
15537            buf,
15538            pos: 0,
15539            orig_loc,
15540        }
15541    }
15542    pub fn get_buf(&self) -> &'a [u8] {
15543        self.buf
15544    }
15545}
15546impl<'a> Iterator for IterableLinkinfoTunAttrs<'a> {
15547    type Item = Result<LinkinfoTunAttrs, ErrorContext>;
15548    fn next(&mut self) -> Option<Self::Item> {
15549        let mut pos;
15550        let mut r#type;
15551        loop {
15552            pos = self.pos;
15553            r#type = None;
15554            if self.buf.len() == self.pos {
15555                return None;
15556            }
15557            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
15558                self.pos = self.buf.len();
15559                break;
15560            };
15561            r#type = Some(header.r#type);
15562            let res = match header.r#type {
15563                1u16 => LinkinfoTunAttrs::Owner({
15564                    let res = parse_u32(next);
15565                    let Some(val) = res else { break };
15566                    val
15567                }),
15568                2u16 => LinkinfoTunAttrs::Group({
15569                    let res = parse_u32(next);
15570                    let Some(val) = res else { break };
15571                    val
15572                }),
15573                3u16 => LinkinfoTunAttrs::Type({
15574                    let res = parse_u8(next);
15575                    let Some(val) = res else { break };
15576                    val
15577                }),
15578                4u16 => LinkinfoTunAttrs::Pi({
15579                    let res = parse_u8(next);
15580                    let Some(val) = res else { break };
15581                    val
15582                }),
15583                5u16 => LinkinfoTunAttrs::VnetHdr({
15584                    let res = parse_u8(next);
15585                    let Some(val) = res else { break };
15586                    val
15587                }),
15588                6u16 => LinkinfoTunAttrs::Persist({
15589                    let res = parse_u8(next);
15590                    let Some(val) = res else { break };
15591                    val
15592                }),
15593                7u16 => LinkinfoTunAttrs::MultiQueue({
15594                    let res = parse_u8(next);
15595                    let Some(val) = res else { break };
15596                    val
15597                }),
15598                8u16 => LinkinfoTunAttrs::NumQueues({
15599                    let res = parse_u32(next);
15600                    let Some(val) = res else { break };
15601                    val
15602                }),
15603                9u16 => LinkinfoTunAttrs::NumDisabledQueues({
15604                    let res = parse_u32(next);
15605                    let Some(val) = res else { break };
15606                    val
15607                }),
15608                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
15609                n => continue,
15610            };
15611            return Some(Ok(res));
15612        }
15613        Some(Err(ErrorContext::new(
15614            "LinkinfoTunAttrs",
15615            r#type.and_then(|t| LinkinfoTunAttrs::attr_from_type(t)),
15616            self.orig_loc,
15617            self.buf.as_ptr().wrapping_add(pos) as usize,
15618        )))
15619    }
15620}
15621impl std::fmt::Debug for IterableLinkinfoTunAttrs<'_> {
15622    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15623        let mut fmt = f.debug_struct("LinkinfoTunAttrs");
15624        for attr in self.clone() {
15625            let attr = match attr {
15626                Ok(a) => a,
15627                Err(err) => {
15628                    fmt.finish()?;
15629                    f.write_str("Err(")?;
15630                    err.fmt(f)?;
15631                    return f.write_str(")");
15632                }
15633            };
15634            match attr {
15635                LinkinfoTunAttrs::Owner(val) => fmt.field("Owner", &val),
15636                LinkinfoTunAttrs::Group(val) => fmt.field("Group", &val),
15637                LinkinfoTunAttrs::Type(val) => fmt.field("Type", &val),
15638                LinkinfoTunAttrs::Pi(val) => fmt.field("Pi", &val),
15639                LinkinfoTunAttrs::VnetHdr(val) => fmt.field("VnetHdr", &val),
15640                LinkinfoTunAttrs::Persist(val) => fmt.field("Persist", &val),
15641                LinkinfoTunAttrs::MultiQueue(val) => fmt.field("MultiQueue", &val),
15642                LinkinfoTunAttrs::NumQueues(val) => fmt.field("NumQueues", &val),
15643                LinkinfoTunAttrs::NumDisabledQueues(val) => fmt.field("NumDisabledQueues", &val),
15644            };
15645        }
15646        fmt.finish()
15647    }
15648}
15649impl IterableLinkinfoTunAttrs<'_> {
15650    pub fn lookup_attr(
15651        &self,
15652        offset: usize,
15653        missing_type: Option<u16>,
15654    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
15655        let mut stack = Vec::new();
15656        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
15657        if missing_type.is_some() && cur == offset {
15658            stack.push(("LinkinfoTunAttrs", offset));
15659            return (
15660                stack,
15661                missing_type.and_then(|t| LinkinfoTunAttrs::attr_from_type(t)),
15662            );
15663        }
15664        if cur > offset || cur + self.buf.len() < offset {
15665            return (stack, None);
15666        }
15667        let mut attrs = self.clone();
15668        let mut last_off = cur + attrs.pos;
15669        while let Some(attr) = attrs.next() {
15670            let Ok(attr) = attr else { break };
15671            match attr {
15672                LinkinfoTunAttrs::Owner(val) => {
15673                    if last_off == offset {
15674                        stack.push(("Owner", last_off));
15675                        break;
15676                    }
15677                }
15678                LinkinfoTunAttrs::Group(val) => {
15679                    if last_off == offset {
15680                        stack.push(("Group", last_off));
15681                        break;
15682                    }
15683                }
15684                LinkinfoTunAttrs::Type(val) => {
15685                    if last_off == offset {
15686                        stack.push(("Type", last_off));
15687                        break;
15688                    }
15689                }
15690                LinkinfoTunAttrs::Pi(val) => {
15691                    if last_off == offset {
15692                        stack.push(("Pi", last_off));
15693                        break;
15694                    }
15695                }
15696                LinkinfoTunAttrs::VnetHdr(val) => {
15697                    if last_off == offset {
15698                        stack.push(("VnetHdr", last_off));
15699                        break;
15700                    }
15701                }
15702                LinkinfoTunAttrs::Persist(val) => {
15703                    if last_off == offset {
15704                        stack.push(("Persist", last_off));
15705                        break;
15706                    }
15707                }
15708                LinkinfoTunAttrs::MultiQueue(val) => {
15709                    if last_off == offset {
15710                        stack.push(("MultiQueue", last_off));
15711                        break;
15712                    }
15713                }
15714                LinkinfoTunAttrs::NumQueues(val) => {
15715                    if last_off == offset {
15716                        stack.push(("NumQueues", last_off));
15717                        break;
15718                    }
15719                }
15720                LinkinfoTunAttrs::NumDisabledQueues(val) => {
15721                    if last_off == offset {
15722                        stack.push(("NumDisabledQueues", last_off));
15723                        break;
15724                    }
15725                }
15726                _ => {}
15727            };
15728            last_off = cur + attrs.pos;
15729        }
15730        if !stack.is_empty() {
15731            stack.push(("LinkinfoTunAttrs", cur));
15732        }
15733        (stack, None)
15734    }
15735}
15736#[derive(Clone)]
15737pub enum LinkinfoVlanAttrs<'a> {
15738    Id(u16),
15739    Flags(IflaVlanFlags),
15740    EgressQos(IterableIflaVlanQos<'a>),
15741    IngressQos(IterableIflaVlanQos<'a>),
15742    #[doc = "Associated type: [`VlanProtocols`] (enum)"]
15743    Protocol(u16),
15744}
15745impl<'a> IterableLinkinfoVlanAttrs<'a> {
15746    pub fn get_id(&self) -> Result<u16, ErrorContext> {
15747        let mut iter = self.clone();
15748        iter.pos = 0;
15749        for attr in iter {
15750            if let Ok(LinkinfoVlanAttrs::Id(val)) = attr {
15751                return Ok(val);
15752            }
15753        }
15754        Err(ErrorContext::new_missing(
15755            "LinkinfoVlanAttrs",
15756            "Id",
15757            self.orig_loc,
15758            self.buf.as_ptr() as usize,
15759        ))
15760    }
15761    pub fn get_flags(&self) -> Result<IflaVlanFlags, ErrorContext> {
15762        let mut iter = self.clone();
15763        iter.pos = 0;
15764        for attr in iter {
15765            if let Ok(LinkinfoVlanAttrs::Flags(val)) = attr {
15766                return Ok(val);
15767            }
15768        }
15769        Err(ErrorContext::new_missing(
15770            "LinkinfoVlanAttrs",
15771            "Flags",
15772            self.orig_loc,
15773            self.buf.as_ptr() as usize,
15774        ))
15775    }
15776    pub fn get_egress_qos(&self) -> Result<IterableIflaVlanQos<'a>, ErrorContext> {
15777        let mut iter = self.clone();
15778        iter.pos = 0;
15779        for attr in iter {
15780            if let Ok(LinkinfoVlanAttrs::EgressQos(val)) = attr {
15781                return Ok(val);
15782            }
15783        }
15784        Err(ErrorContext::new_missing(
15785            "LinkinfoVlanAttrs",
15786            "EgressQos",
15787            self.orig_loc,
15788            self.buf.as_ptr() as usize,
15789        ))
15790    }
15791    pub fn get_ingress_qos(&self) -> Result<IterableIflaVlanQos<'a>, ErrorContext> {
15792        let mut iter = self.clone();
15793        iter.pos = 0;
15794        for attr in iter {
15795            if let Ok(LinkinfoVlanAttrs::IngressQos(val)) = attr {
15796                return Ok(val);
15797            }
15798        }
15799        Err(ErrorContext::new_missing(
15800            "LinkinfoVlanAttrs",
15801            "IngressQos",
15802            self.orig_loc,
15803            self.buf.as_ptr() as usize,
15804        ))
15805    }
15806    #[doc = "Associated type: [`VlanProtocols`] (enum)"]
15807    pub fn get_protocol(&self) -> Result<u16, ErrorContext> {
15808        let mut iter = self.clone();
15809        iter.pos = 0;
15810        for attr in iter {
15811            if let Ok(LinkinfoVlanAttrs::Protocol(val)) = attr {
15812                return Ok(val);
15813            }
15814        }
15815        Err(ErrorContext::new_missing(
15816            "LinkinfoVlanAttrs",
15817            "Protocol",
15818            self.orig_loc,
15819            self.buf.as_ptr() as usize,
15820        ))
15821    }
15822}
15823impl LinkinfoVlanAttrs<'_> {
15824    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoVlanAttrs<'a> {
15825        IterableLinkinfoVlanAttrs::with_loc(buf, buf.as_ptr() as usize)
15826    }
15827    fn attr_from_type(r#type: u16) -> Option<&'static str> {
15828        let res = match r#type {
15829            1u16 => "Id",
15830            2u16 => "Flags",
15831            3u16 => "EgressQos",
15832            4u16 => "IngressQos",
15833            5u16 => "Protocol",
15834            _ => return None,
15835        };
15836        Some(res)
15837    }
15838}
15839#[derive(Clone, Copy, Default)]
15840pub struct IterableLinkinfoVlanAttrs<'a> {
15841    buf: &'a [u8],
15842    pos: usize,
15843    orig_loc: usize,
15844}
15845impl<'a> IterableLinkinfoVlanAttrs<'a> {
15846    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
15847        Self {
15848            buf,
15849            pos: 0,
15850            orig_loc,
15851        }
15852    }
15853    pub fn get_buf(&self) -> &'a [u8] {
15854        self.buf
15855    }
15856}
15857impl<'a> Iterator for IterableLinkinfoVlanAttrs<'a> {
15858    type Item = Result<LinkinfoVlanAttrs<'a>, ErrorContext>;
15859    fn next(&mut self) -> Option<Self::Item> {
15860        let mut pos;
15861        let mut r#type;
15862        loop {
15863            pos = self.pos;
15864            r#type = None;
15865            if self.buf.len() == self.pos {
15866                return None;
15867            }
15868            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
15869                self.pos = self.buf.len();
15870                break;
15871            };
15872            r#type = Some(header.r#type);
15873            let res = match header.r#type {
15874                1u16 => LinkinfoVlanAttrs::Id({
15875                    let res = parse_u16(next);
15876                    let Some(val) = res else { break };
15877                    val
15878                }),
15879                2u16 => LinkinfoVlanAttrs::Flags({
15880                    let res = Some(IflaVlanFlags::new_from_zeroed(next));
15881                    let Some(val) = res else { break };
15882                    val
15883                }),
15884                3u16 => LinkinfoVlanAttrs::EgressQos({
15885                    let res = Some(IterableIflaVlanQos::with_loc(next, self.orig_loc));
15886                    let Some(val) = res else { break };
15887                    val
15888                }),
15889                4u16 => LinkinfoVlanAttrs::IngressQos({
15890                    let res = Some(IterableIflaVlanQos::with_loc(next, self.orig_loc));
15891                    let Some(val) = res else { break };
15892                    val
15893                }),
15894                5u16 => LinkinfoVlanAttrs::Protocol({
15895                    let res = parse_be_u16(next);
15896                    let Some(val) = res else { break };
15897                    val
15898                }),
15899                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
15900                n => continue,
15901            };
15902            return Some(Ok(res));
15903        }
15904        Some(Err(ErrorContext::new(
15905            "LinkinfoVlanAttrs",
15906            r#type.and_then(|t| LinkinfoVlanAttrs::attr_from_type(t)),
15907            self.orig_loc,
15908            self.buf.as_ptr().wrapping_add(pos) as usize,
15909        )))
15910    }
15911}
15912impl<'a> std::fmt::Debug for IterableLinkinfoVlanAttrs<'_> {
15913    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15914        let mut fmt = f.debug_struct("LinkinfoVlanAttrs");
15915        for attr in self.clone() {
15916            let attr = match attr {
15917                Ok(a) => a,
15918                Err(err) => {
15919                    fmt.finish()?;
15920                    f.write_str("Err(")?;
15921                    err.fmt(f)?;
15922                    return f.write_str(")");
15923                }
15924            };
15925            match attr {
15926                LinkinfoVlanAttrs::Id(val) => fmt.field("Id", &val),
15927                LinkinfoVlanAttrs::Flags(val) => fmt.field("Flags", &val),
15928                LinkinfoVlanAttrs::EgressQos(val) => fmt.field("EgressQos", &val),
15929                LinkinfoVlanAttrs::IngressQos(val) => fmt.field("IngressQos", &val),
15930                LinkinfoVlanAttrs::Protocol(val) => fmt.field(
15931                    "Protocol",
15932                    &FormatEnum(val.into(), VlanProtocols::from_value),
15933                ),
15934            };
15935        }
15936        fmt.finish()
15937    }
15938}
15939impl IterableLinkinfoVlanAttrs<'_> {
15940    pub fn lookup_attr(
15941        &self,
15942        offset: usize,
15943        missing_type: Option<u16>,
15944    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
15945        let mut stack = Vec::new();
15946        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
15947        if missing_type.is_some() && cur == offset {
15948            stack.push(("LinkinfoVlanAttrs", offset));
15949            return (
15950                stack,
15951                missing_type.and_then(|t| LinkinfoVlanAttrs::attr_from_type(t)),
15952            );
15953        }
15954        if cur > offset || cur + self.buf.len() < offset {
15955            return (stack, None);
15956        }
15957        let mut attrs = self.clone();
15958        let mut last_off = cur + attrs.pos;
15959        let mut missing = None;
15960        while let Some(attr) = attrs.next() {
15961            let Ok(attr) = attr else { break };
15962            match attr {
15963                LinkinfoVlanAttrs::Id(val) => {
15964                    if last_off == offset {
15965                        stack.push(("Id", last_off));
15966                        break;
15967                    }
15968                }
15969                LinkinfoVlanAttrs::Flags(val) => {
15970                    if last_off == offset {
15971                        stack.push(("Flags", last_off));
15972                        break;
15973                    }
15974                }
15975                LinkinfoVlanAttrs::EgressQos(val) => {
15976                    (stack, missing) = val.lookup_attr(offset, missing_type);
15977                    if !stack.is_empty() {
15978                        break;
15979                    }
15980                }
15981                LinkinfoVlanAttrs::IngressQos(val) => {
15982                    (stack, missing) = val.lookup_attr(offset, missing_type);
15983                    if !stack.is_empty() {
15984                        break;
15985                    }
15986                }
15987                LinkinfoVlanAttrs::Protocol(val) => {
15988                    if last_off == offset {
15989                        stack.push(("Protocol", last_off));
15990                        break;
15991                    }
15992                }
15993                _ => {}
15994            };
15995            last_off = cur + attrs.pos;
15996        }
15997        if !stack.is_empty() {
15998            stack.push(("LinkinfoVlanAttrs", cur));
15999        }
16000        (stack, missing)
16001    }
16002}
16003#[derive(Clone)]
16004pub enum IflaVlanQos {
16005    #[doc = "Attribute may repeat multiple times (treat it as array)"]
16006    Mapping(IflaVlanQosMapping),
16007}
16008impl<'a> IterableIflaVlanQos<'a> {
16009    #[doc = "Attribute may repeat multiple times (treat it as array)"]
16010    pub fn get_mapping(&self) -> MultiAttrIterable<Self, IflaVlanQos, IflaVlanQosMapping> {
16011        MultiAttrIterable::new(self.clone(), |variant| {
16012            if let IflaVlanQos::Mapping(val) = variant {
16013                Some(val)
16014            } else {
16015                None
16016            }
16017        })
16018    }
16019}
16020impl IflaVlanQos {
16021    pub fn new<'a>(buf: &'a [u8]) -> IterableIflaVlanQos<'a> {
16022        IterableIflaVlanQos::with_loc(buf, buf.as_ptr() as usize)
16023    }
16024    fn attr_from_type(r#type: u16) -> Option<&'static str> {
16025        let res = match r#type {
16026            1u16 => "Mapping",
16027            _ => return None,
16028        };
16029        Some(res)
16030    }
16031}
16032#[derive(Clone, Copy, Default)]
16033pub struct IterableIflaVlanQos<'a> {
16034    buf: &'a [u8],
16035    pos: usize,
16036    orig_loc: usize,
16037}
16038impl<'a> IterableIflaVlanQos<'a> {
16039    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16040        Self {
16041            buf,
16042            pos: 0,
16043            orig_loc,
16044        }
16045    }
16046    pub fn get_buf(&self) -> &'a [u8] {
16047        self.buf
16048    }
16049}
16050impl<'a> Iterator for IterableIflaVlanQos<'a> {
16051    type Item = Result<IflaVlanQos, ErrorContext>;
16052    fn next(&mut self) -> Option<Self::Item> {
16053        let mut pos;
16054        let mut r#type;
16055        loop {
16056            pos = self.pos;
16057            r#type = None;
16058            if self.buf.len() == self.pos {
16059                return None;
16060            }
16061            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16062                self.pos = self.buf.len();
16063                break;
16064            };
16065            r#type = Some(header.r#type);
16066            let res = match header.r#type {
16067                1u16 => IflaVlanQos::Mapping({
16068                    let res = Some(IflaVlanQosMapping::new_from_zeroed(next));
16069                    let Some(val) = res else { break };
16070                    val
16071                }),
16072                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16073                n => continue,
16074            };
16075            return Some(Ok(res));
16076        }
16077        Some(Err(ErrorContext::new(
16078            "IflaVlanQos",
16079            r#type.and_then(|t| IflaVlanQos::attr_from_type(t)),
16080            self.orig_loc,
16081            self.buf.as_ptr().wrapping_add(pos) as usize,
16082        )))
16083    }
16084}
16085impl std::fmt::Debug for IterableIflaVlanQos<'_> {
16086    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16087        let mut fmt = f.debug_struct("IflaVlanQos");
16088        for attr in self.clone() {
16089            let attr = match attr {
16090                Ok(a) => a,
16091                Err(err) => {
16092                    fmt.finish()?;
16093                    f.write_str("Err(")?;
16094                    err.fmt(f)?;
16095                    return f.write_str(")");
16096                }
16097            };
16098            match attr {
16099                IflaVlanQos::Mapping(val) => fmt.field("Mapping", &val),
16100            };
16101        }
16102        fmt.finish()
16103    }
16104}
16105impl IterableIflaVlanQos<'_> {
16106    pub fn lookup_attr(
16107        &self,
16108        offset: usize,
16109        missing_type: Option<u16>,
16110    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16111        let mut stack = Vec::new();
16112        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16113        if missing_type.is_some() && cur == offset {
16114            stack.push(("IflaVlanQos", offset));
16115            return (
16116                stack,
16117                missing_type.and_then(|t| IflaVlanQos::attr_from_type(t)),
16118            );
16119        }
16120        if cur > offset || cur + self.buf.len() < offset {
16121            return (stack, None);
16122        }
16123        let mut attrs = self.clone();
16124        let mut last_off = cur + attrs.pos;
16125        while let Some(attr) = attrs.next() {
16126            let Ok(attr) = attr else { break };
16127            match attr {
16128                IflaVlanQos::Mapping(val) => {
16129                    if last_off == offset {
16130                        stack.push(("Mapping", last_off));
16131                        break;
16132                    }
16133                }
16134                _ => {}
16135            };
16136            last_off = cur + attrs.pos;
16137        }
16138        if !stack.is_empty() {
16139            stack.push(("IflaVlanQos", cur));
16140        }
16141        (stack, None)
16142    }
16143}
16144#[derive(Clone)]
16145pub enum LinkinfoVrfAttrs {
16146    Table(u32),
16147}
16148impl<'a> IterableLinkinfoVrfAttrs<'a> {
16149    pub fn get_table(&self) -> Result<u32, ErrorContext> {
16150        let mut iter = self.clone();
16151        iter.pos = 0;
16152        for attr in iter {
16153            if let Ok(LinkinfoVrfAttrs::Table(val)) = attr {
16154                return Ok(val);
16155            }
16156        }
16157        Err(ErrorContext::new_missing(
16158            "LinkinfoVrfAttrs",
16159            "Table",
16160            self.orig_loc,
16161            self.buf.as_ptr() as usize,
16162        ))
16163    }
16164}
16165impl LinkinfoVrfAttrs {
16166    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoVrfAttrs<'a> {
16167        IterableLinkinfoVrfAttrs::with_loc(buf, buf.as_ptr() as usize)
16168    }
16169    fn attr_from_type(r#type: u16) -> Option<&'static str> {
16170        let res = match r#type {
16171            1u16 => "Table",
16172            _ => return None,
16173        };
16174        Some(res)
16175    }
16176}
16177#[derive(Clone, Copy, Default)]
16178pub struct IterableLinkinfoVrfAttrs<'a> {
16179    buf: &'a [u8],
16180    pos: usize,
16181    orig_loc: usize,
16182}
16183impl<'a> IterableLinkinfoVrfAttrs<'a> {
16184    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16185        Self {
16186            buf,
16187            pos: 0,
16188            orig_loc,
16189        }
16190    }
16191    pub fn get_buf(&self) -> &'a [u8] {
16192        self.buf
16193    }
16194}
16195impl<'a> Iterator for IterableLinkinfoVrfAttrs<'a> {
16196    type Item = Result<LinkinfoVrfAttrs, ErrorContext>;
16197    fn next(&mut self) -> Option<Self::Item> {
16198        let mut pos;
16199        let mut r#type;
16200        loop {
16201            pos = self.pos;
16202            r#type = None;
16203            if self.buf.len() == self.pos {
16204                return None;
16205            }
16206            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16207                self.pos = self.buf.len();
16208                break;
16209            };
16210            r#type = Some(header.r#type);
16211            let res = match header.r#type {
16212                1u16 => LinkinfoVrfAttrs::Table({
16213                    let res = parse_u32(next);
16214                    let Some(val) = res else { break };
16215                    val
16216                }),
16217                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16218                n => continue,
16219            };
16220            return Some(Ok(res));
16221        }
16222        Some(Err(ErrorContext::new(
16223            "LinkinfoVrfAttrs",
16224            r#type.and_then(|t| LinkinfoVrfAttrs::attr_from_type(t)),
16225            self.orig_loc,
16226            self.buf.as_ptr().wrapping_add(pos) as usize,
16227        )))
16228    }
16229}
16230impl std::fmt::Debug for IterableLinkinfoVrfAttrs<'_> {
16231    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16232        let mut fmt = f.debug_struct("LinkinfoVrfAttrs");
16233        for attr in self.clone() {
16234            let attr = match attr {
16235                Ok(a) => a,
16236                Err(err) => {
16237                    fmt.finish()?;
16238                    f.write_str("Err(")?;
16239                    err.fmt(f)?;
16240                    return f.write_str(")");
16241                }
16242            };
16243            match attr {
16244                LinkinfoVrfAttrs::Table(val) => fmt.field("Table", &val),
16245            };
16246        }
16247        fmt.finish()
16248    }
16249}
16250impl IterableLinkinfoVrfAttrs<'_> {
16251    pub fn lookup_attr(
16252        &self,
16253        offset: usize,
16254        missing_type: Option<u16>,
16255    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16256        let mut stack = Vec::new();
16257        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16258        if missing_type.is_some() && cur == offset {
16259            stack.push(("LinkinfoVrfAttrs", offset));
16260            return (
16261                stack,
16262                missing_type.and_then(|t| LinkinfoVrfAttrs::attr_from_type(t)),
16263            );
16264        }
16265        if cur > offset || cur + self.buf.len() < offset {
16266            return (stack, None);
16267        }
16268        let mut attrs = self.clone();
16269        let mut last_off = cur + attrs.pos;
16270        while let Some(attr) = attrs.next() {
16271            let Ok(attr) = attr else { break };
16272            match attr {
16273                LinkinfoVrfAttrs::Table(val) => {
16274                    if last_off == offset {
16275                        stack.push(("Table", last_off));
16276                        break;
16277                    }
16278                }
16279                _ => {}
16280            };
16281            last_off = cur + attrs.pos;
16282        }
16283        if !stack.is_empty() {
16284            stack.push(("LinkinfoVrfAttrs", cur));
16285        }
16286        (stack, None)
16287    }
16288}
16289#[derive(Clone)]
16290pub enum XdpAttrs {
16291    Fd(i32),
16292    Attached(u8),
16293    Flags(u32),
16294    ProgId(u32),
16295    DrvProgId(u32),
16296    SkbProgId(u32),
16297    HwProgId(u32),
16298    ExpectedFd(i32),
16299}
16300impl<'a> IterableXdpAttrs<'a> {
16301    pub fn get_fd(&self) -> Result<i32, ErrorContext> {
16302        let mut iter = self.clone();
16303        iter.pos = 0;
16304        for attr in iter {
16305            if let Ok(XdpAttrs::Fd(val)) = attr {
16306                return Ok(val);
16307            }
16308        }
16309        Err(ErrorContext::new_missing(
16310            "XdpAttrs",
16311            "Fd",
16312            self.orig_loc,
16313            self.buf.as_ptr() as usize,
16314        ))
16315    }
16316    pub fn get_attached(&self) -> Result<u8, ErrorContext> {
16317        let mut iter = self.clone();
16318        iter.pos = 0;
16319        for attr in iter {
16320            if let Ok(XdpAttrs::Attached(val)) = attr {
16321                return Ok(val);
16322            }
16323        }
16324        Err(ErrorContext::new_missing(
16325            "XdpAttrs",
16326            "Attached",
16327            self.orig_loc,
16328            self.buf.as_ptr() as usize,
16329        ))
16330    }
16331    pub fn get_flags(&self) -> Result<u32, ErrorContext> {
16332        let mut iter = self.clone();
16333        iter.pos = 0;
16334        for attr in iter {
16335            if let Ok(XdpAttrs::Flags(val)) = attr {
16336                return Ok(val);
16337            }
16338        }
16339        Err(ErrorContext::new_missing(
16340            "XdpAttrs",
16341            "Flags",
16342            self.orig_loc,
16343            self.buf.as_ptr() as usize,
16344        ))
16345    }
16346    pub fn get_prog_id(&self) -> Result<u32, ErrorContext> {
16347        let mut iter = self.clone();
16348        iter.pos = 0;
16349        for attr in iter {
16350            if let Ok(XdpAttrs::ProgId(val)) = attr {
16351                return Ok(val);
16352            }
16353        }
16354        Err(ErrorContext::new_missing(
16355            "XdpAttrs",
16356            "ProgId",
16357            self.orig_loc,
16358            self.buf.as_ptr() as usize,
16359        ))
16360    }
16361    pub fn get_drv_prog_id(&self) -> Result<u32, ErrorContext> {
16362        let mut iter = self.clone();
16363        iter.pos = 0;
16364        for attr in iter {
16365            if let Ok(XdpAttrs::DrvProgId(val)) = attr {
16366                return Ok(val);
16367            }
16368        }
16369        Err(ErrorContext::new_missing(
16370            "XdpAttrs",
16371            "DrvProgId",
16372            self.orig_loc,
16373            self.buf.as_ptr() as usize,
16374        ))
16375    }
16376    pub fn get_skb_prog_id(&self) -> Result<u32, ErrorContext> {
16377        let mut iter = self.clone();
16378        iter.pos = 0;
16379        for attr in iter {
16380            if let Ok(XdpAttrs::SkbProgId(val)) = attr {
16381                return Ok(val);
16382            }
16383        }
16384        Err(ErrorContext::new_missing(
16385            "XdpAttrs",
16386            "SkbProgId",
16387            self.orig_loc,
16388            self.buf.as_ptr() as usize,
16389        ))
16390    }
16391    pub fn get_hw_prog_id(&self) -> Result<u32, ErrorContext> {
16392        let mut iter = self.clone();
16393        iter.pos = 0;
16394        for attr in iter {
16395            if let Ok(XdpAttrs::HwProgId(val)) = attr {
16396                return Ok(val);
16397            }
16398        }
16399        Err(ErrorContext::new_missing(
16400            "XdpAttrs",
16401            "HwProgId",
16402            self.orig_loc,
16403            self.buf.as_ptr() as usize,
16404        ))
16405    }
16406    pub fn get_expected_fd(&self) -> Result<i32, ErrorContext> {
16407        let mut iter = self.clone();
16408        iter.pos = 0;
16409        for attr in iter {
16410            if let Ok(XdpAttrs::ExpectedFd(val)) = attr {
16411                return Ok(val);
16412            }
16413        }
16414        Err(ErrorContext::new_missing(
16415            "XdpAttrs",
16416            "ExpectedFd",
16417            self.orig_loc,
16418            self.buf.as_ptr() as usize,
16419        ))
16420    }
16421}
16422impl XdpAttrs {
16423    pub fn new<'a>(buf: &'a [u8]) -> IterableXdpAttrs<'a> {
16424        IterableXdpAttrs::with_loc(buf, buf.as_ptr() as usize)
16425    }
16426    fn attr_from_type(r#type: u16) -> Option<&'static str> {
16427        let res = match r#type {
16428            1u16 => "Fd",
16429            2u16 => "Attached",
16430            3u16 => "Flags",
16431            4u16 => "ProgId",
16432            5u16 => "DrvProgId",
16433            6u16 => "SkbProgId",
16434            7u16 => "HwProgId",
16435            8u16 => "ExpectedFd",
16436            _ => return None,
16437        };
16438        Some(res)
16439    }
16440}
16441#[derive(Clone, Copy, Default)]
16442pub struct IterableXdpAttrs<'a> {
16443    buf: &'a [u8],
16444    pos: usize,
16445    orig_loc: usize,
16446}
16447impl<'a> IterableXdpAttrs<'a> {
16448    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16449        Self {
16450            buf,
16451            pos: 0,
16452            orig_loc,
16453        }
16454    }
16455    pub fn get_buf(&self) -> &'a [u8] {
16456        self.buf
16457    }
16458}
16459impl<'a> Iterator for IterableXdpAttrs<'a> {
16460    type Item = Result<XdpAttrs, ErrorContext>;
16461    fn next(&mut self) -> Option<Self::Item> {
16462        let mut pos;
16463        let mut r#type;
16464        loop {
16465            pos = self.pos;
16466            r#type = None;
16467            if self.buf.len() == self.pos {
16468                return None;
16469            }
16470            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16471                self.pos = self.buf.len();
16472                break;
16473            };
16474            r#type = Some(header.r#type);
16475            let res = match header.r#type {
16476                1u16 => XdpAttrs::Fd({
16477                    let res = parse_i32(next);
16478                    let Some(val) = res else { break };
16479                    val
16480                }),
16481                2u16 => XdpAttrs::Attached({
16482                    let res = parse_u8(next);
16483                    let Some(val) = res else { break };
16484                    val
16485                }),
16486                3u16 => XdpAttrs::Flags({
16487                    let res = parse_u32(next);
16488                    let Some(val) = res else { break };
16489                    val
16490                }),
16491                4u16 => XdpAttrs::ProgId({
16492                    let res = parse_u32(next);
16493                    let Some(val) = res else { break };
16494                    val
16495                }),
16496                5u16 => XdpAttrs::DrvProgId({
16497                    let res = parse_u32(next);
16498                    let Some(val) = res else { break };
16499                    val
16500                }),
16501                6u16 => XdpAttrs::SkbProgId({
16502                    let res = parse_u32(next);
16503                    let Some(val) = res else { break };
16504                    val
16505                }),
16506                7u16 => XdpAttrs::HwProgId({
16507                    let res = parse_u32(next);
16508                    let Some(val) = res else { break };
16509                    val
16510                }),
16511                8u16 => XdpAttrs::ExpectedFd({
16512                    let res = parse_i32(next);
16513                    let Some(val) = res else { break };
16514                    val
16515                }),
16516                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16517                n => continue,
16518            };
16519            return Some(Ok(res));
16520        }
16521        Some(Err(ErrorContext::new(
16522            "XdpAttrs",
16523            r#type.and_then(|t| XdpAttrs::attr_from_type(t)),
16524            self.orig_loc,
16525            self.buf.as_ptr().wrapping_add(pos) as usize,
16526        )))
16527    }
16528}
16529impl std::fmt::Debug for IterableXdpAttrs<'_> {
16530    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16531        let mut fmt = f.debug_struct("XdpAttrs");
16532        for attr in self.clone() {
16533            let attr = match attr {
16534                Ok(a) => a,
16535                Err(err) => {
16536                    fmt.finish()?;
16537                    f.write_str("Err(")?;
16538                    err.fmt(f)?;
16539                    return f.write_str(")");
16540                }
16541            };
16542            match attr {
16543                XdpAttrs::Fd(val) => fmt.field("Fd", &val),
16544                XdpAttrs::Attached(val) => fmt.field("Attached", &val),
16545                XdpAttrs::Flags(val) => fmt.field("Flags", &val),
16546                XdpAttrs::ProgId(val) => fmt.field("ProgId", &val),
16547                XdpAttrs::DrvProgId(val) => fmt.field("DrvProgId", &val),
16548                XdpAttrs::SkbProgId(val) => fmt.field("SkbProgId", &val),
16549                XdpAttrs::HwProgId(val) => fmt.field("HwProgId", &val),
16550                XdpAttrs::ExpectedFd(val) => fmt.field("ExpectedFd", &val),
16551            };
16552        }
16553        fmt.finish()
16554    }
16555}
16556impl IterableXdpAttrs<'_> {
16557    pub fn lookup_attr(
16558        &self,
16559        offset: usize,
16560        missing_type: Option<u16>,
16561    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16562        let mut stack = Vec::new();
16563        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16564        if missing_type.is_some() && cur == offset {
16565            stack.push(("XdpAttrs", offset));
16566            return (
16567                stack,
16568                missing_type.and_then(|t| XdpAttrs::attr_from_type(t)),
16569            );
16570        }
16571        if cur > offset || cur + self.buf.len() < offset {
16572            return (stack, None);
16573        }
16574        let mut attrs = self.clone();
16575        let mut last_off = cur + attrs.pos;
16576        while let Some(attr) = attrs.next() {
16577            let Ok(attr) = attr else { break };
16578            match attr {
16579                XdpAttrs::Fd(val) => {
16580                    if last_off == offset {
16581                        stack.push(("Fd", last_off));
16582                        break;
16583                    }
16584                }
16585                XdpAttrs::Attached(val) => {
16586                    if last_off == offset {
16587                        stack.push(("Attached", last_off));
16588                        break;
16589                    }
16590                }
16591                XdpAttrs::Flags(val) => {
16592                    if last_off == offset {
16593                        stack.push(("Flags", last_off));
16594                        break;
16595                    }
16596                }
16597                XdpAttrs::ProgId(val) => {
16598                    if last_off == offset {
16599                        stack.push(("ProgId", last_off));
16600                        break;
16601                    }
16602                }
16603                XdpAttrs::DrvProgId(val) => {
16604                    if last_off == offset {
16605                        stack.push(("DrvProgId", last_off));
16606                        break;
16607                    }
16608                }
16609                XdpAttrs::SkbProgId(val) => {
16610                    if last_off == offset {
16611                        stack.push(("SkbProgId", last_off));
16612                        break;
16613                    }
16614                }
16615                XdpAttrs::HwProgId(val) => {
16616                    if last_off == offset {
16617                        stack.push(("HwProgId", last_off));
16618                        break;
16619                    }
16620                }
16621                XdpAttrs::ExpectedFd(val) => {
16622                    if last_off == offset {
16623                        stack.push(("ExpectedFd", last_off));
16624                        break;
16625                    }
16626                }
16627                _ => {}
16628            };
16629            last_off = cur + attrs.pos;
16630        }
16631        if !stack.is_empty() {
16632            stack.push(("XdpAttrs", cur));
16633        }
16634        (stack, None)
16635    }
16636}
16637#[derive(Clone)]
16638pub enum IflaAttrs<'a> {
16639    #[doc = "u32 indexed by ipv4-devconf - 1 on output, on input it\\'s a nest\n"]
16640    Conf(&'a [u8]),
16641}
16642impl<'a> IterableIflaAttrs<'a> {
16643    #[doc = "u32 indexed by ipv4-devconf - 1 on output, on input it\\'s a nest\n"]
16644    pub fn get_conf(&self) -> Result<&'a [u8], ErrorContext> {
16645        let mut iter = self.clone();
16646        iter.pos = 0;
16647        for attr in iter {
16648            if let Ok(IflaAttrs::Conf(val)) = attr {
16649                return Ok(val);
16650            }
16651        }
16652        Err(ErrorContext::new_missing(
16653            "IflaAttrs",
16654            "Conf",
16655            self.orig_loc,
16656            self.buf.as_ptr() as usize,
16657        ))
16658    }
16659}
16660impl IflaAttrs<'_> {
16661    pub fn new<'a>(buf: &'a [u8]) -> IterableIflaAttrs<'a> {
16662        IterableIflaAttrs::with_loc(buf, buf.as_ptr() as usize)
16663    }
16664    fn attr_from_type(r#type: u16) -> Option<&'static str> {
16665        let res = match r#type {
16666            1u16 => "Conf",
16667            _ => return None,
16668        };
16669        Some(res)
16670    }
16671}
16672#[derive(Clone, Copy, Default)]
16673pub struct IterableIflaAttrs<'a> {
16674    buf: &'a [u8],
16675    pos: usize,
16676    orig_loc: usize,
16677}
16678impl<'a> IterableIflaAttrs<'a> {
16679    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16680        Self {
16681            buf,
16682            pos: 0,
16683            orig_loc,
16684        }
16685    }
16686    pub fn get_buf(&self) -> &'a [u8] {
16687        self.buf
16688    }
16689}
16690impl<'a> Iterator for IterableIflaAttrs<'a> {
16691    type Item = Result<IflaAttrs<'a>, ErrorContext>;
16692    fn next(&mut self) -> Option<Self::Item> {
16693        let mut pos;
16694        let mut r#type;
16695        loop {
16696            pos = self.pos;
16697            r#type = None;
16698            if self.buf.len() == self.pos {
16699                return None;
16700            }
16701            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16702                self.pos = self.buf.len();
16703                break;
16704            };
16705            r#type = Some(header.r#type);
16706            let res = match header.r#type {
16707                1u16 => IflaAttrs::Conf({
16708                    let res = Some(next);
16709                    let Some(val) = res else { break };
16710                    val
16711                }),
16712                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16713                n => continue,
16714            };
16715            return Some(Ok(res));
16716        }
16717        Some(Err(ErrorContext::new(
16718            "IflaAttrs",
16719            r#type.and_then(|t| IflaAttrs::attr_from_type(t)),
16720            self.orig_loc,
16721            self.buf.as_ptr().wrapping_add(pos) as usize,
16722        )))
16723    }
16724}
16725impl<'a> std::fmt::Debug for IterableIflaAttrs<'_> {
16726    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16727        let mut fmt = f.debug_struct("IflaAttrs");
16728        for attr in self.clone() {
16729            let attr = match attr {
16730                Ok(a) => a,
16731                Err(err) => {
16732                    fmt.finish()?;
16733                    f.write_str("Err(")?;
16734                    err.fmt(f)?;
16735                    return f.write_str(")");
16736                }
16737            };
16738            match attr {
16739                IflaAttrs::Conf(val) => fmt.field("Conf", &val),
16740            };
16741        }
16742        fmt.finish()
16743    }
16744}
16745impl IterableIflaAttrs<'_> {
16746    pub fn lookup_attr(
16747        &self,
16748        offset: usize,
16749        missing_type: Option<u16>,
16750    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16751        let mut stack = Vec::new();
16752        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16753        if missing_type.is_some() && cur == offset {
16754            stack.push(("IflaAttrs", offset));
16755            return (
16756                stack,
16757                missing_type.and_then(|t| IflaAttrs::attr_from_type(t)),
16758            );
16759        }
16760        if cur > offset || cur + self.buf.len() < offset {
16761            return (stack, None);
16762        }
16763        let mut attrs = self.clone();
16764        let mut last_off = cur + attrs.pos;
16765        while let Some(attr) = attrs.next() {
16766            let Ok(attr) = attr else { break };
16767            match attr {
16768                IflaAttrs::Conf(val) => {
16769                    if last_off == offset {
16770                        stack.push(("Conf", last_off));
16771                        break;
16772                    }
16773                }
16774                _ => {}
16775            };
16776            last_off = cur + attrs.pos;
16777        }
16778        if !stack.is_empty() {
16779            stack.push(("IflaAttrs", cur));
16780        }
16781        (stack, None)
16782    }
16783}
16784#[derive(Clone)]
16785pub enum Ifla6Attrs<'a> {
16786    Flags(u32),
16787    #[doc = "u32 indexed by ipv6-devconf - 1 on output, on input it\\'s a nest\n"]
16788    Conf(&'a [u8]),
16789    Stats(&'a [u8]),
16790    Mcast(&'a [u8]),
16791    Cacheinfo(IflaCacheinfo),
16792    Icmp6stats(&'a [u8]),
16793    Token(&'a [u8]),
16794    AddrGenMode(u8),
16795    RaMtu(u32),
16796}
16797impl<'a> IterableIfla6Attrs<'a> {
16798    pub fn get_flags(&self) -> Result<u32, ErrorContext> {
16799        let mut iter = self.clone();
16800        iter.pos = 0;
16801        for attr in iter {
16802            if let Ok(Ifla6Attrs::Flags(val)) = attr {
16803                return Ok(val);
16804            }
16805        }
16806        Err(ErrorContext::new_missing(
16807            "Ifla6Attrs",
16808            "Flags",
16809            self.orig_loc,
16810            self.buf.as_ptr() as usize,
16811        ))
16812    }
16813    #[doc = "u32 indexed by ipv6-devconf - 1 on output, on input it\\'s a nest\n"]
16814    pub fn get_conf(&self) -> Result<&'a [u8], ErrorContext> {
16815        let mut iter = self.clone();
16816        iter.pos = 0;
16817        for attr in iter {
16818            if let Ok(Ifla6Attrs::Conf(val)) = attr {
16819                return Ok(val);
16820            }
16821        }
16822        Err(ErrorContext::new_missing(
16823            "Ifla6Attrs",
16824            "Conf",
16825            self.orig_loc,
16826            self.buf.as_ptr() as usize,
16827        ))
16828    }
16829    pub fn get_stats(&self) -> Result<&'a [u8], ErrorContext> {
16830        let mut iter = self.clone();
16831        iter.pos = 0;
16832        for attr in iter {
16833            if let Ok(Ifla6Attrs::Stats(val)) = attr {
16834                return Ok(val);
16835            }
16836        }
16837        Err(ErrorContext::new_missing(
16838            "Ifla6Attrs",
16839            "Stats",
16840            self.orig_loc,
16841            self.buf.as_ptr() as usize,
16842        ))
16843    }
16844    pub fn get_mcast(&self) -> Result<&'a [u8], ErrorContext> {
16845        let mut iter = self.clone();
16846        iter.pos = 0;
16847        for attr in iter {
16848            if let Ok(Ifla6Attrs::Mcast(val)) = attr {
16849                return Ok(val);
16850            }
16851        }
16852        Err(ErrorContext::new_missing(
16853            "Ifla6Attrs",
16854            "Mcast",
16855            self.orig_loc,
16856            self.buf.as_ptr() as usize,
16857        ))
16858    }
16859    pub fn get_cacheinfo(&self) -> Result<IflaCacheinfo, ErrorContext> {
16860        let mut iter = self.clone();
16861        iter.pos = 0;
16862        for attr in iter {
16863            if let Ok(Ifla6Attrs::Cacheinfo(val)) = attr {
16864                return Ok(val);
16865            }
16866        }
16867        Err(ErrorContext::new_missing(
16868            "Ifla6Attrs",
16869            "Cacheinfo",
16870            self.orig_loc,
16871            self.buf.as_ptr() as usize,
16872        ))
16873    }
16874    pub fn get_icmp6stats(&self) -> Result<&'a [u8], ErrorContext> {
16875        let mut iter = self.clone();
16876        iter.pos = 0;
16877        for attr in iter {
16878            if let Ok(Ifla6Attrs::Icmp6stats(val)) = attr {
16879                return Ok(val);
16880            }
16881        }
16882        Err(ErrorContext::new_missing(
16883            "Ifla6Attrs",
16884            "Icmp6stats",
16885            self.orig_loc,
16886            self.buf.as_ptr() as usize,
16887        ))
16888    }
16889    pub fn get_token(&self) -> Result<&'a [u8], ErrorContext> {
16890        let mut iter = self.clone();
16891        iter.pos = 0;
16892        for attr in iter {
16893            if let Ok(Ifla6Attrs::Token(val)) = attr {
16894                return Ok(val);
16895            }
16896        }
16897        Err(ErrorContext::new_missing(
16898            "Ifla6Attrs",
16899            "Token",
16900            self.orig_loc,
16901            self.buf.as_ptr() as usize,
16902        ))
16903    }
16904    pub fn get_addr_gen_mode(&self) -> Result<u8, ErrorContext> {
16905        let mut iter = self.clone();
16906        iter.pos = 0;
16907        for attr in iter {
16908            if let Ok(Ifla6Attrs::AddrGenMode(val)) = attr {
16909                return Ok(val);
16910            }
16911        }
16912        Err(ErrorContext::new_missing(
16913            "Ifla6Attrs",
16914            "AddrGenMode",
16915            self.orig_loc,
16916            self.buf.as_ptr() as usize,
16917        ))
16918    }
16919    pub fn get_ra_mtu(&self) -> Result<u32, ErrorContext> {
16920        let mut iter = self.clone();
16921        iter.pos = 0;
16922        for attr in iter {
16923            if let Ok(Ifla6Attrs::RaMtu(val)) = attr {
16924                return Ok(val);
16925            }
16926        }
16927        Err(ErrorContext::new_missing(
16928            "Ifla6Attrs",
16929            "RaMtu",
16930            self.orig_loc,
16931            self.buf.as_ptr() as usize,
16932        ))
16933    }
16934}
16935impl Ifla6Attrs<'_> {
16936    pub fn new<'a>(buf: &'a [u8]) -> IterableIfla6Attrs<'a> {
16937        IterableIfla6Attrs::with_loc(buf, buf.as_ptr() as usize)
16938    }
16939    fn attr_from_type(r#type: u16) -> Option<&'static str> {
16940        let res = match r#type {
16941            1u16 => "Flags",
16942            2u16 => "Conf",
16943            3u16 => "Stats",
16944            4u16 => "Mcast",
16945            5u16 => "Cacheinfo",
16946            6u16 => "Icmp6stats",
16947            7u16 => "Token",
16948            8u16 => "AddrGenMode",
16949            9u16 => "RaMtu",
16950            _ => return None,
16951        };
16952        Some(res)
16953    }
16954}
16955#[derive(Clone, Copy, Default)]
16956pub struct IterableIfla6Attrs<'a> {
16957    buf: &'a [u8],
16958    pos: usize,
16959    orig_loc: usize,
16960}
16961impl<'a> IterableIfla6Attrs<'a> {
16962    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16963        Self {
16964            buf,
16965            pos: 0,
16966            orig_loc,
16967        }
16968    }
16969    pub fn get_buf(&self) -> &'a [u8] {
16970        self.buf
16971    }
16972}
16973impl<'a> Iterator for IterableIfla6Attrs<'a> {
16974    type Item = Result<Ifla6Attrs<'a>, ErrorContext>;
16975    fn next(&mut self) -> Option<Self::Item> {
16976        let mut pos;
16977        let mut r#type;
16978        loop {
16979            pos = self.pos;
16980            r#type = None;
16981            if self.buf.len() == self.pos {
16982                return None;
16983            }
16984            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16985                self.pos = self.buf.len();
16986                break;
16987            };
16988            r#type = Some(header.r#type);
16989            let res = match header.r#type {
16990                1u16 => Ifla6Attrs::Flags({
16991                    let res = parse_u32(next);
16992                    let Some(val) = res else { break };
16993                    val
16994                }),
16995                2u16 => Ifla6Attrs::Conf({
16996                    let res = Some(next);
16997                    let Some(val) = res else { break };
16998                    val
16999                }),
17000                3u16 => Ifla6Attrs::Stats({
17001                    let res = Some(next);
17002                    let Some(val) = res else { break };
17003                    val
17004                }),
17005                4u16 => Ifla6Attrs::Mcast({
17006                    let res = Some(next);
17007                    let Some(val) = res else { break };
17008                    val
17009                }),
17010                5u16 => Ifla6Attrs::Cacheinfo({
17011                    let res = Some(IflaCacheinfo::new_from_zeroed(next));
17012                    let Some(val) = res else { break };
17013                    val
17014                }),
17015                6u16 => Ifla6Attrs::Icmp6stats({
17016                    let res = Some(next);
17017                    let Some(val) = res else { break };
17018                    val
17019                }),
17020                7u16 => Ifla6Attrs::Token({
17021                    let res = Some(next);
17022                    let Some(val) = res else { break };
17023                    val
17024                }),
17025                8u16 => Ifla6Attrs::AddrGenMode({
17026                    let res = parse_u8(next);
17027                    let Some(val) = res else { break };
17028                    val
17029                }),
17030                9u16 => Ifla6Attrs::RaMtu({
17031                    let res = parse_u32(next);
17032                    let Some(val) = res else { break };
17033                    val
17034                }),
17035                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17036                n => continue,
17037            };
17038            return Some(Ok(res));
17039        }
17040        Some(Err(ErrorContext::new(
17041            "Ifla6Attrs",
17042            r#type.and_then(|t| Ifla6Attrs::attr_from_type(t)),
17043            self.orig_loc,
17044            self.buf.as_ptr().wrapping_add(pos) as usize,
17045        )))
17046    }
17047}
17048impl<'a> std::fmt::Debug for IterableIfla6Attrs<'_> {
17049    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17050        let mut fmt = f.debug_struct("Ifla6Attrs");
17051        for attr in self.clone() {
17052            let attr = match attr {
17053                Ok(a) => a,
17054                Err(err) => {
17055                    fmt.finish()?;
17056                    f.write_str("Err(")?;
17057                    err.fmt(f)?;
17058                    return f.write_str(")");
17059                }
17060            };
17061            match attr {
17062                Ifla6Attrs::Flags(val) => fmt.field("Flags", &val),
17063                Ifla6Attrs::Conf(val) => fmt.field("Conf", &val),
17064                Ifla6Attrs::Stats(val) => fmt.field("Stats", &val),
17065                Ifla6Attrs::Mcast(val) => fmt.field("Mcast", &val),
17066                Ifla6Attrs::Cacheinfo(val) => fmt.field("Cacheinfo", &val),
17067                Ifla6Attrs::Icmp6stats(val) => fmt.field("Icmp6stats", &val),
17068                Ifla6Attrs::Token(val) => fmt.field("Token", &val),
17069                Ifla6Attrs::AddrGenMode(val) => fmt.field("AddrGenMode", &val),
17070                Ifla6Attrs::RaMtu(val) => fmt.field("RaMtu", &val),
17071            };
17072        }
17073        fmt.finish()
17074    }
17075}
17076impl IterableIfla6Attrs<'_> {
17077    pub fn lookup_attr(
17078        &self,
17079        offset: usize,
17080        missing_type: Option<u16>,
17081    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17082        let mut stack = Vec::new();
17083        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17084        if missing_type.is_some() && cur == offset {
17085            stack.push(("Ifla6Attrs", offset));
17086            return (
17087                stack,
17088                missing_type.and_then(|t| Ifla6Attrs::attr_from_type(t)),
17089            );
17090        }
17091        if cur > offset || cur + self.buf.len() < offset {
17092            return (stack, None);
17093        }
17094        let mut attrs = self.clone();
17095        let mut last_off = cur + attrs.pos;
17096        while let Some(attr) = attrs.next() {
17097            let Ok(attr) = attr else { break };
17098            match attr {
17099                Ifla6Attrs::Flags(val) => {
17100                    if last_off == offset {
17101                        stack.push(("Flags", last_off));
17102                        break;
17103                    }
17104                }
17105                Ifla6Attrs::Conf(val) => {
17106                    if last_off == offset {
17107                        stack.push(("Conf", last_off));
17108                        break;
17109                    }
17110                }
17111                Ifla6Attrs::Stats(val) => {
17112                    if last_off == offset {
17113                        stack.push(("Stats", last_off));
17114                        break;
17115                    }
17116                }
17117                Ifla6Attrs::Mcast(val) => {
17118                    if last_off == offset {
17119                        stack.push(("Mcast", last_off));
17120                        break;
17121                    }
17122                }
17123                Ifla6Attrs::Cacheinfo(val) => {
17124                    if last_off == offset {
17125                        stack.push(("Cacheinfo", last_off));
17126                        break;
17127                    }
17128                }
17129                Ifla6Attrs::Icmp6stats(val) => {
17130                    if last_off == offset {
17131                        stack.push(("Icmp6stats", last_off));
17132                        break;
17133                    }
17134                }
17135                Ifla6Attrs::Token(val) => {
17136                    if last_off == offset {
17137                        stack.push(("Token", last_off));
17138                        break;
17139                    }
17140                }
17141                Ifla6Attrs::AddrGenMode(val) => {
17142                    if last_off == offset {
17143                        stack.push(("AddrGenMode", last_off));
17144                        break;
17145                    }
17146                }
17147                Ifla6Attrs::RaMtu(val) => {
17148                    if last_off == offset {
17149                        stack.push(("RaMtu", last_off));
17150                        break;
17151                    }
17152                }
17153                _ => {}
17154            };
17155            last_off = cur + attrs.pos;
17156        }
17157        if !stack.is_empty() {
17158            stack.push(("Ifla6Attrs", cur));
17159        }
17160        (stack, None)
17161    }
17162}
17163#[derive(Clone)]
17164pub enum MctpAttrs {
17165    Net(u32),
17166    PhysBinding(u8),
17167}
17168impl<'a> IterableMctpAttrs<'a> {
17169    pub fn get_net(&self) -> Result<u32, ErrorContext> {
17170        let mut iter = self.clone();
17171        iter.pos = 0;
17172        for attr in iter {
17173            if let Ok(MctpAttrs::Net(val)) = attr {
17174                return Ok(val);
17175            }
17176        }
17177        Err(ErrorContext::new_missing(
17178            "MctpAttrs",
17179            "Net",
17180            self.orig_loc,
17181            self.buf.as_ptr() as usize,
17182        ))
17183    }
17184    pub fn get_phys_binding(&self) -> Result<u8, ErrorContext> {
17185        let mut iter = self.clone();
17186        iter.pos = 0;
17187        for attr in iter {
17188            if let Ok(MctpAttrs::PhysBinding(val)) = attr {
17189                return Ok(val);
17190            }
17191        }
17192        Err(ErrorContext::new_missing(
17193            "MctpAttrs",
17194            "PhysBinding",
17195            self.orig_loc,
17196            self.buf.as_ptr() as usize,
17197        ))
17198    }
17199}
17200impl MctpAttrs {
17201    pub fn new<'a>(buf: &'a [u8]) -> IterableMctpAttrs<'a> {
17202        IterableMctpAttrs::with_loc(buf, buf.as_ptr() as usize)
17203    }
17204    fn attr_from_type(r#type: u16) -> Option<&'static str> {
17205        let res = match r#type {
17206            1u16 => "Net",
17207            2u16 => "PhysBinding",
17208            _ => return None,
17209        };
17210        Some(res)
17211    }
17212}
17213#[derive(Clone, Copy, Default)]
17214pub struct IterableMctpAttrs<'a> {
17215    buf: &'a [u8],
17216    pos: usize,
17217    orig_loc: usize,
17218}
17219impl<'a> IterableMctpAttrs<'a> {
17220    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17221        Self {
17222            buf,
17223            pos: 0,
17224            orig_loc,
17225        }
17226    }
17227    pub fn get_buf(&self) -> &'a [u8] {
17228        self.buf
17229    }
17230}
17231impl<'a> Iterator for IterableMctpAttrs<'a> {
17232    type Item = Result<MctpAttrs, ErrorContext>;
17233    fn next(&mut self) -> Option<Self::Item> {
17234        let mut pos;
17235        let mut r#type;
17236        loop {
17237            pos = self.pos;
17238            r#type = None;
17239            if self.buf.len() == self.pos {
17240                return None;
17241            }
17242            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
17243                self.pos = self.buf.len();
17244                break;
17245            };
17246            r#type = Some(header.r#type);
17247            let res = match header.r#type {
17248                1u16 => MctpAttrs::Net({
17249                    let res = parse_u32(next);
17250                    let Some(val) = res else { break };
17251                    val
17252                }),
17253                2u16 => MctpAttrs::PhysBinding({
17254                    let res = parse_u8(next);
17255                    let Some(val) = res else { break };
17256                    val
17257                }),
17258                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17259                n => continue,
17260            };
17261            return Some(Ok(res));
17262        }
17263        Some(Err(ErrorContext::new(
17264            "MctpAttrs",
17265            r#type.and_then(|t| MctpAttrs::attr_from_type(t)),
17266            self.orig_loc,
17267            self.buf.as_ptr().wrapping_add(pos) as usize,
17268        )))
17269    }
17270}
17271impl std::fmt::Debug for IterableMctpAttrs<'_> {
17272    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17273        let mut fmt = f.debug_struct("MctpAttrs");
17274        for attr in self.clone() {
17275            let attr = match attr {
17276                Ok(a) => a,
17277                Err(err) => {
17278                    fmt.finish()?;
17279                    f.write_str("Err(")?;
17280                    err.fmt(f)?;
17281                    return f.write_str(")");
17282                }
17283            };
17284            match attr {
17285                MctpAttrs::Net(val) => fmt.field("Net", &val),
17286                MctpAttrs::PhysBinding(val) => fmt.field("PhysBinding", &val),
17287            };
17288        }
17289        fmt.finish()
17290    }
17291}
17292impl IterableMctpAttrs<'_> {
17293    pub fn lookup_attr(
17294        &self,
17295        offset: usize,
17296        missing_type: Option<u16>,
17297    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17298        let mut stack = Vec::new();
17299        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17300        if missing_type.is_some() && cur == offset {
17301            stack.push(("MctpAttrs", offset));
17302            return (
17303                stack,
17304                missing_type.and_then(|t| MctpAttrs::attr_from_type(t)),
17305            );
17306        }
17307        if cur > offset || cur + self.buf.len() < offset {
17308            return (stack, None);
17309        }
17310        let mut attrs = self.clone();
17311        let mut last_off = cur + attrs.pos;
17312        while let Some(attr) = attrs.next() {
17313            let Ok(attr) = attr else { break };
17314            match attr {
17315                MctpAttrs::Net(val) => {
17316                    if last_off == offset {
17317                        stack.push(("Net", last_off));
17318                        break;
17319                    }
17320                }
17321                MctpAttrs::PhysBinding(val) => {
17322                    if last_off == offset {
17323                        stack.push(("PhysBinding", last_off));
17324                        break;
17325                    }
17326                }
17327                _ => {}
17328            };
17329            last_off = cur + attrs.pos;
17330        }
17331        if !stack.is_empty() {
17332            stack.push(("MctpAttrs", cur));
17333        }
17334        (stack, None)
17335    }
17336}
17337#[derive(Clone)]
17338pub enum StatsAttrs<'a> {
17339    Link64(RtnlLinkStats64),
17340    LinkXstats(&'a [u8]),
17341    LinkXstatsSlave(&'a [u8]),
17342    LinkOffloadXstats(IterableLinkOffloadXstats<'a>),
17343    AfSpec(&'a [u8]),
17344}
17345impl<'a> IterableStatsAttrs<'a> {
17346    pub fn get_link_64(&self) -> Result<RtnlLinkStats64, ErrorContext> {
17347        let mut iter = self.clone();
17348        iter.pos = 0;
17349        for attr in iter {
17350            if let Ok(StatsAttrs::Link64(val)) = attr {
17351                return Ok(val);
17352            }
17353        }
17354        Err(ErrorContext::new_missing(
17355            "StatsAttrs",
17356            "Link64",
17357            self.orig_loc,
17358            self.buf.as_ptr() as usize,
17359        ))
17360    }
17361    pub fn get_link_xstats(&self) -> Result<&'a [u8], ErrorContext> {
17362        let mut iter = self.clone();
17363        iter.pos = 0;
17364        for attr in iter {
17365            if let Ok(StatsAttrs::LinkXstats(val)) = attr {
17366                return Ok(val);
17367            }
17368        }
17369        Err(ErrorContext::new_missing(
17370            "StatsAttrs",
17371            "LinkXstats",
17372            self.orig_loc,
17373            self.buf.as_ptr() as usize,
17374        ))
17375    }
17376    pub fn get_link_xstats_slave(&self) -> Result<&'a [u8], ErrorContext> {
17377        let mut iter = self.clone();
17378        iter.pos = 0;
17379        for attr in iter {
17380            if let Ok(StatsAttrs::LinkXstatsSlave(val)) = attr {
17381                return Ok(val);
17382            }
17383        }
17384        Err(ErrorContext::new_missing(
17385            "StatsAttrs",
17386            "LinkXstatsSlave",
17387            self.orig_loc,
17388            self.buf.as_ptr() as usize,
17389        ))
17390    }
17391    pub fn get_link_offload_xstats(&self) -> Result<IterableLinkOffloadXstats<'a>, ErrorContext> {
17392        let mut iter = self.clone();
17393        iter.pos = 0;
17394        for attr in iter {
17395            if let Ok(StatsAttrs::LinkOffloadXstats(val)) = attr {
17396                return Ok(val);
17397            }
17398        }
17399        Err(ErrorContext::new_missing(
17400            "StatsAttrs",
17401            "LinkOffloadXstats",
17402            self.orig_loc,
17403            self.buf.as_ptr() as usize,
17404        ))
17405    }
17406    pub fn get_af_spec(&self) -> Result<&'a [u8], ErrorContext> {
17407        let mut iter = self.clone();
17408        iter.pos = 0;
17409        for attr in iter {
17410            if let Ok(StatsAttrs::AfSpec(val)) = attr {
17411                return Ok(val);
17412            }
17413        }
17414        Err(ErrorContext::new_missing(
17415            "StatsAttrs",
17416            "AfSpec",
17417            self.orig_loc,
17418            self.buf.as_ptr() as usize,
17419        ))
17420    }
17421}
17422impl StatsAttrs<'_> {
17423    pub fn new<'a>(buf: &'a [u8]) -> IterableStatsAttrs<'a> {
17424        IterableStatsAttrs::with_loc(buf, buf.as_ptr() as usize)
17425    }
17426    fn attr_from_type(r#type: u16) -> Option<&'static str> {
17427        let res = match r#type {
17428            1u16 => "Link64",
17429            2u16 => "LinkXstats",
17430            3u16 => "LinkXstatsSlave",
17431            4u16 => "LinkOffloadXstats",
17432            5u16 => "AfSpec",
17433            _ => return None,
17434        };
17435        Some(res)
17436    }
17437}
17438#[derive(Clone, Copy, Default)]
17439pub struct IterableStatsAttrs<'a> {
17440    buf: &'a [u8],
17441    pos: usize,
17442    orig_loc: usize,
17443}
17444impl<'a> IterableStatsAttrs<'a> {
17445    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17446        Self {
17447            buf,
17448            pos: 0,
17449            orig_loc,
17450        }
17451    }
17452    pub fn get_buf(&self) -> &'a [u8] {
17453        self.buf
17454    }
17455}
17456impl<'a> Iterator for IterableStatsAttrs<'a> {
17457    type Item = Result<StatsAttrs<'a>, ErrorContext>;
17458    fn next(&mut self) -> Option<Self::Item> {
17459        let mut pos;
17460        let mut r#type;
17461        loop {
17462            pos = self.pos;
17463            r#type = None;
17464            if self.buf.len() == self.pos {
17465                return None;
17466            }
17467            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
17468                self.pos = self.buf.len();
17469                break;
17470            };
17471            r#type = Some(header.r#type);
17472            let res = match header.r#type {
17473                1u16 => StatsAttrs::Link64({
17474                    let res = Some(RtnlLinkStats64::new_from_zeroed(next));
17475                    let Some(val) = res else { break };
17476                    val
17477                }),
17478                2u16 => StatsAttrs::LinkXstats({
17479                    let res = Some(next);
17480                    let Some(val) = res else { break };
17481                    val
17482                }),
17483                3u16 => StatsAttrs::LinkXstatsSlave({
17484                    let res = Some(next);
17485                    let Some(val) = res else { break };
17486                    val
17487                }),
17488                4u16 => StatsAttrs::LinkOffloadXstats({
17489                    let res = Some(IterableLinkOffloadXstats::with_loc(next, self.orig_loc));
17490                    let Some(val) = res else { break };
17491                    val
17492                }),
17493                5u16 => StatsAttrs::AfSpec({
17494                    let res = Some(next);
17495                    let Some(val) = res else { break };
17496                    val
17497                }),
17498                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17499                n => continue,
17500            };
17501            return Some(Ok(res));
17502        }
17503        Some(Err(ErrorContext::new(
17504            "StatsAttrs",
17505            r#type.and_then(|t| StatsAttrs::attr_from_type(t)),
17506            self.orig_loc,
17507            self.buf.as_ptr().wrapping_add(pos) as usize,
17508        )))
17509    }
17510}
17511impl<'a> std::fmt::Debug for IterableStatsAttrs<'_> {
17512    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17513        let mut fmt = f.debug_struct("StatsAttrs");
17514        for attr in self.clone() {
17515            let attr = match attr {
17516                Ok(a) => a,
17517                Err(err) => {
17518                    fmt.finish()?;
17519                    f.write_str("Err(")?;
17520                    err.fmt(f)?;
17521                    return f.write_str(")");
17522                }
17523            };
17524            match attr {
17525                StatsAttrs::Link64(val) => fmt.field("Link64", &val),
17526                StatsAttrs::LinkXstats(val) => fmt.field("LinkXstats", &val),
17527                StatsAttrs::LinkXstatsSlave(val) => fmt.field("LinkXstatsSlave", &val),
17528                StatsAttrs::LinkOffloadXstats(val) => fmt.field("LinkOffloadXstats", &val),
17529                StatsAttrs::AfSpec(val) => fmt.field("AfSpec", &val),
17530            };
17531        }
17532        fmt.finish()
17533    }
17534}
17535impl IterableStatsAttrs<'_> {
17536    pub fn lookup_attr(
17537        &self,
17538        offset: usize,
17539        missing_type: Option<u16>,
17540    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17541        let mut stack = Vec::new();
17542        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17543        if missing_type.is_some() && cur == offset {
17544            stack.push(("StatsAttrs", offset));
17545            return (
17546                stack,
17547                missing_type.and_then(|t| StatsAttrs::attr_from_type(t)),
17548            );
17549        }
17550        if cur > offset || cur + self.buf.len() < offset {
17551            return (stack, None);
17552        }
17553        let mut attrs = self.clone();
17554        let mut last_off = cur + attrs.pos;
17555        let mut missing = None;
17556        while let Some(attr) = attrs.next() {
17557            let Ok(attr) = attr else { break };
17558            match attr {
17559                StatsAttrs::Link64(val) => {
17560                    if last_off == offset {
17561                        stack.push(("Link64", last_off));
17562                        break;
17563                    }
17564                }
17565                StatsAttrs::LinkXstats(val) => {
17566                    if last_off == offset {
17567                        stack.push(("LinkXstats", last_off));
17568                        break;
17569                    }
17570                }
17571                StatsAttrs::LinkXstatsSlave(val) => {
17572                    if last_off == offset {
17573                        stack.push(("LinkXstatsSlave", last_off));
17574                        break;
17575                    }
17576                }
17577                StatsAttrs::LinkOffloadXstats(val) => {
17578                    (stack, missing) = val.lookup_attr(offset, missing_type);
17579                    if !stack.is_empty() {
17580                        break;
17581                    }
17582                }
17583                StatsAttrs::AfSpec(val) => {
17584                    if last_off == offset {
17585                        stack.push(("AfSpec", last_off));
17586                        break;
17587                    }
17588                }
17589                _ => {}
17590            };
17591            last_off = cur + attrs.pos;
17592        }
17593        if !stack.is_empty() {
17594            stack.push(("StatsAttrs", cur));
17595        }
17596        (stack, missing)
17597    }
17598}
17599#[derive(Clone)]
17600pub enum LinkOffloadXstats<'a> {
17601    CpuHit(&'a [u8]),
17602    HwSInfo(IterableArrayHwSInfoOne<'a>),
17603    L3Stats(&'a [u8]),
17604}
17605impl<'a> IterableLinkOffloadXstats<'a> {
17606    pub fn get_cpu_hit(&self) -> Result<&'a [u8], ErrorContext> {
17607        let mut iter = self.clone();
17608        iter.pos = 0;
17609        for attr in iter {
17610            if let Ok(LinkOffloadXstats::CpuHit(val)) = attr {
17611                return Ok(val);
17612            }
17613        }
17614        Err(ErrorContext::new_missing(
17615            "LinkOffloadXstats",
17616            "CpuHit",
17617            self.orig_loc,
17618            self.buf.as_ptr() as usize,
17619        ))
17620    }
17621    pub fn get_hw_s_info(
17622        &self,
17623    ) -> Result<ArrayIterable<IterableArrayHwSInfoOne<'a>, IterableHwSInfoOne<'a>>, ErrorContext>
17624    {
17625        for attr in self.clone() {
17626            if let Ok(LinkOffloadXstats::HwSInfo(val)) = attr {
17627                return Ok(ArrayIterable::new(val));
17628            }
17629        }
17630        Err(ErrorContext::new_missing(
17631            "LinkOffloadXstats",
17632            "HwSInfo",
17633            self.orig_loc,
17634            self.buf.as_ptr() as usize,
17635        ))
17636    }
17637    pub fn get_l3_stats(&self) -> Result<&'a [u8], ErrorContext> {
17638        let mut iter = self.clone();
17639        iter.pos = 0;
17640        for attr in iter {
17641            if let Ok(LinkOffloadXstats::L3Stats(val)) = attr {
17642                return Ok(val);
17643            }
17644        }
17645        Err(ErrorContext::new_missing(
17646            "LinkOffloadXstats",
17647            "L3Stats",
17648            self.orig_loc,
17649            self.buf.as_ptr() as usize,
17650        ))
17651    }
17652}
17653impl HwSInfoOne {
17654    pub fn new_array(buf: &[u8]) -> IterableArrayHwSInfoOne<'_> {
17655        IterableArrayHwSInfoOne::with_loc(buf, buf.as_ptr() as usize)
17656    }
17657}
17658#[derive(Clone, Copy, Default)]
17659pub struct IterableArrayHwSInfoOne<'a> {
17660    buf: &'a [u8],
17661    pos: usize,
17662    orig_loc: usize,
17663}
17664impl<'a> IterableArrayHwSInfoOne<'a> {
17665    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17666        Self {
17667            buf,
17668            pos: 0,
17669            orig_loc,
17670        }
17671    }
17672    pub fn get_buf(&self) -> &'a [u8] {
17673        self.buf
17674    }
17675}
17676impl<'a> Iterator for IterableArrayHwSInfoOne<'a> {
17677    type Item = Result<IterableHwSInfoOne<'a>, ErrorContext>;
17678    fn next(&mut self) -> Option<Self::Item> {
17679        if self.buf.len() == self.pos {
17680            return None;
17681        }
17682        while let Some((header, next)) = chop_header(self.buf, &mut self.pos) {
17683            {
17684                return Some(Ok(IterableHwSInfoOne::with_loc(next, self.orig_loc)));
17685            }
17686        }
17687        let pos = self.pos;
17688        self.pos = self.buf.len();
17689        Some(Err(ErrorContext::new(
17690            "HwSInfoOne",
17691            None,
17692            self.orig_loc,
17693            self.buf.as_ptr().wrapping_add(pos) as usize,
17694        )))
17695    }
17696}
17697impl LinkOffloadXstats<'_> {
17698    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkOffloadXstats<'a> {
17699        IterableLinkOffloadXstats::with_loc(buf, buf.as_ptr() as usize)
17700    }
17701    fn attr_from_type(r#type: u16) -> Option<&'static str> {
17702        let res = match r#type {
17703            1u16 => "CpuHit",
17704            2u16 => "HwSInfo",
17705            3u16 => "L3Stats",
17706            _ => return None,
17707        };
17708        Some(res)
17709    }
17710}
17711#[derive(Clone, Copy, Default)]
17712pub struct IterableLinkOffloadXstats<'a> {
17713    buf: &'a [u8],
17714    pos: usize,
17715    orig_loc: usize,
17716}
17717impl<'a> IterableLinkOffloadXstats<'a> {
17718    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17719        Self {
17720            buf,
17721            pos: 0,
17722            orig_loc,
17723        }
17724    }
17725    pub fn get_buf(&self) -> &'a [u8] {
17726        self.buf
17727    }
17728}
17729impl<'a> Iterator for IterableLinkOffloadXstats<'a> {
17730    type Item = Result<LinkOffloadXstats<'a>, ErrorContext>;
17731    fn next(&mut self) -> Option<Self::Item> {
17732        let mut pos;
17733        let mut r#type;
17734        loop {
17735            pos = self.pos;
17736            r#type = None;
17737            if self.buf.len() == self.pos {
17738                return None;
17739            }
17740            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
17741                self.pos = self.buf.len();
17742                break;
17743            };
17744            r#type = Some(header.r#type);
17745            let res = match header.r#type {
17746                1u16 => LinkOffloadXstats::CpuHit({
17747                    let res = Some(next);
17748                    let Some(val) = res else { break };
17749                    val
17750                }),
17751                2u16 => LinkOffloadXstats::HwSInfo({
17752                    let res = Some(IterableArrayHwSInfoOne::with_loc(next, self.orig_loc));
17753                    let Some(val) = res else { break };
17754                    val
17755                }),
17756                3u16 => LinkOffloadXstats::L3Stats({
17757                    let res = Some(next);
17758                    let Some(val) = res else { break };
17759                    val
17760                }),
17761                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17762                n => continue,
17763            };
17764            return Some(Ok(res));
17765        }
17766        Some(Err(ErrorContext::new(
17767            "LinkOffloadXstats",
17768            r#type.and_then(|t| LinkOffloadXstats::attr_from_type(t)),
17769            self.orig_loc,
17770            self.buf.as_ptr().wrapping_add(pos) as usize,
17771        )))
17772    }
17773}
17774impl std::fmt::Debug for IterableArrayHwSInfoOne<'_> {
17775    fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17776        fmt.debug_list()
17777            .entries(self.clone().map(FlattenErrorContext))
17778            .finish()
17779    }
17780}
17781impl<'a> std::fmt::Debug for IterableLinkOffloadXstats<'_> {
17782    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17783        let mut fmt = f.debug_struct("LinkOffloadXstats");
17784        for attr in self.clone() {
17785            let attr = match attr {
17786                Ok(a) => a,
17787                Err(err) => {
17788                    fmt.finish()?;
17789                    f.write_str("Err(")?;
17790                    err.fmt(f)?;
17791                    return f.write_str(")");
17792                }
17793            };
17794            match attr {
17795                LinkOffloadXstats::CpuHit(val) => fmt.field("CpuHit", &val),
17796                LinkOffloadXstats::HwSInfo(val) => fmt.field("HwSInfo", &val),
17797                LinkOffloadXstats::L3Stats(val) => fmt.field("L3Stats", &val),
17798            };
17799        }
17800        fmt.finish()
17801    }
17802}
17803impl IterableLinkOffloadXstats<'_> {
17804    pub fn lookup_attr(
17805        &self,
17806        offset: usize,
17807        missing_type: Option<u16>,
17808    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17809        let mut stack = Vec::new();
17810        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17811        if missing_type.is_some() && cur == offset {
17812            stack.push(("LinkOffloadXstats", offset));
17813            return (
17814                stack,
17815                missing_type.and_then(|t| LinkOffloadXstats::attr_from_type(t)),
17816            );
17817        }
17818        if cur > offset || cur + self.buf.len() < offset {
17819            return (stack, None);
17820        }
17821        let mut attrs = self.clone();
17822        let mut last_off = cur + attrs.pos;
17823        let mut missing = None;
17824        while let Some(attr) = attrs.next() {
17825            let Ok(attr) = attr else { break };
17826            match attr {
17827                LinkOffloadXstats::CpuHit(val) => {
17828                    if last_off == offset {
17829                        stack.push(("CpuHit", last_off));
17830                        break;
17831                    }
17832                }
17833                LinkOffloadXstats::HwSInfo(val) => {
17834                    for entry in val {
17835                        let Ok(attr) = entry else { break };
17836                        (stack, missing) = attr.lookup_attr(offset, missing_type);
17837                        if !stack.is_empty() {
17838                            break;
17839                        }
17840                    }
17841                    if !stack.is_empty() {
17842                        stack.push(("HwSInfo", last_off));
17843                        break;
17844                    }
17845                }
17846                LinkOffloadXstats::L3Stats(val) => {
17847                    if last_off == offset {
17848                        stack.push(("L3Stats", last_off));
17849                        break;
17850                    }
17851                }
17852                _ => {}
17853            };
17854            last_off = cur + attrs.pos;
17855        }
17856        if !stack.is_empty() {
17857            stack.push(("LinkOffloadXstats", cur));
17858        }
17859        (stack, missing)
17860    }
17861}
17862#[derive(Clone)]
17863pub enum HwSInfoOne {
17864    Request(u8),
17865    Used(u8),
17866}
17867impl<'a> IterableHwSInfoOne<'a> {
17868    pub fn get_request(&self) -> Result<u8, ErrorContext> {
17869        let mut iter = self.clone();
17870        iter.pos = 0;
17871        for attr in iter {
17872            if let Ok(HwSInfoOne::Request(val)) = attr {
17873                return Ok(val);
17874            }
17875        }
17876        Err(ErrorContext::new_missing(
17877            "HwSInfoOne",
17878            "Request",
17879            self.orig_loc,
17880            self.buf.as_ptr() as usize,
17881        ))
17882    }
17883    pub fn get_used(&self) -> Result<u8, ErrorContext> {
17884        let mut iter = self.clone();
17885        iter.pos = 0;
17886        for attr in iter {
17887            if let Ok(HwSInfoOne::Used(val)) = attr {
17888                return Ok(val);
17889            }
17890        }
17891        Err(ErrorContext::new_missing(
17892            "HwSInfoOne",
17893            "Used",
17894            self.orig_loc,
17895            self.buf.as_ptr() as usize,
17896        ))
17897    }
17898}
17899impl HwSInfoOne {
17900    pub fn new<'a>(buf: &'a [u8]) -> IterableHwSInfoOne<'a> {
17901        IterableHwSInfoOne::with_loc(buf, buf.as_ptr() as usize)
17902    }
17903    fn attr_from_type(r#type: u16) -> Option<&'static str> {
17904        let res = match r#type {
17905            1u16 => "Request",
17906            2u16 => "Used",
17907            _ => return None,
17908        };
17909        Some(res)
17910    }
17911}
17912#[derive(Clone, Copy, Default)]
17913pub struct IterableHwSInfoOne<'a> {
17914    buf: &'a [u8],
17915    pos: usize,
17916    orig_loc: usize,
17917}
17918impl<'a> IterableHwSInfoOne<'a> {
17919    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17920        Self {
17921            buf,
17922            pos: 0,
17923            orig_loc,
17924        }
17925    }
17926    pub fn get_buf(&self) -> &'a [u8] {
17927        self.buf
17928    }
17929}
17930impl<'a> Iterator for IterableHwSInfoOne<'a> {
17931    type Item = Result<HwSInfoOne, ErrorContext>;
17932    fn next(&mut self) -> Option<Self::Item> {
17933        let mut pos;
17934        let mut r#type;
17935        loop {
17936            pos = self.pos;
17937            r#type = None;
17938            if self.buf.len() == self.pos {
17939                return None;
17940            }
17941            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
17942                self.pos = self.buf.len();
17943                break;
17944            };
17945            r#type = Some(header.r#type);
17946            let res = match header.r#type {
17947                1u16 => HwSInfoOne::Request({
17948                    let res = parse_u8(next);
17949                    let Some(val) = res else { break };
17950                    val
17951                }),
17952                2u16 => HwSInfoOne::Used({
17953                    let res = parse_u8(next);
17954                    let Some(val) = res else { break };
17955                    val
17956                }),
17957                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17958                n => continue,
17959            };
17960            return Some(Ok(res));
17961        }
17962        Some(Err(ErrorContext::new(
17963            "HwSInfoOne",
17964            r#type.and_then(|t| HwSInfoOne::attr_from_type(t)),
17965            self.orig_loc,
17966            self.buf.as_ptr().wrapping_add(pos) as usize,
17967        )))
17968    }
17969}
17970impl std::fmt::Debug for IterableHwSInfoOne<'_> {
17971    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17972        let mut fmt = f.debug_struct("HwSInfoOne");
17973        for attr in self.clone() {
17974            let attr = match attr {
17975                Ok(a) => a,
17976                Err(err) => {
17977                    fmt.finish()?;
17978                    f.write_str("Err(")?;
17979                    err.fmt(f)?;
17980                    return f.write_str(")");
17981                }
17982            };
17983            match attr {
17984                HwSInfoOne::Request(val) => fmt.field("Request", &val),
17985                HwSInfoOne::Used(val) => fmt.field("Used", &val),
17986            };
17987        }
17988        fmt.finish()
17989    }
17990}
17991impl IterableHwSInfoOne<'_> {
17992    pub fn lookup_attr(
17993        &self,
17994        offset: usize,
17995        missing_type: Option<u16>,
17996    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17997        let mut stack = Vec::new();
17998        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17999        if missing_type.is_some() && cur == offset {
18000            stack.push(("HwSInfoOne", offset));
18001            return (
18002                stack,
18003                missing_type.and_then(|t| HwSInfoOne::attr_from_type(t)),
18004            );
18005        }
18006        if cur > offset || cur + self.buf.len() < offset {
18007            return (stack, None);
18008        }
18009        let mut attrs = self.clone();
18010        let mut last_off = cur + attrs.pos;
18011        while let Some(attr) = attrs.next() {
18012            let Ok(attr) = attr else { break };
18013            match attr {
18014                HwSInfoOne::Request(val) => {
18015                    if last_off == offset {
18016                        stack.push(("Request", last_off));
18017                        break;
18018                    }
18019                }
18020                HwSInfoOne::Used(val) => {
18021                    if last_off == offset {
18022                        stack.push(("Used", last_off));
18023                        break;
18024                    }
18025                }
18026                _ => {}
18027            };
18028            last_off = cur + attrs.pos;
18029        }
18030        if !stack.is_empty() {
18031            stack.push(("HwSInfoOne", cur));
18032        }
18033        (stack, None)
18034    }
18035}
18036#[derive(Clone)]
18037pub enum LinkDpllPinAttrs {
18038    Id(u32),
18039}
18040impl<'a> IterableLinkDpllPinAttrs<'a> {
18041    pub fn get_id(&self) -> Result<u32, ErrorContext> {
18042        let mut iter = self.clone();
18043        iter.pos = 0;
18044        for attr in iter {
18045            if let Ok(LinkDpllPinAttrs::Id(val)) = attr {
18046                return Ok(val);
18047            }
18048        }
18049        Err(ErrorContext::new_missing(
18050            "LinkDpllPinAttrs",
18051            "Id",
18052            self.orig_loc,
18053            self.buf.as_ptr() as usize,
18054        ))
18055    }
18056}
18057impl LinkDpllPinAttrs {
18058    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkDpllPinAttrs<'a> {
18059        IterableLinkDpllPinAttrs::with_loc(buf, buf.as_ptr() as usize)
18060    }
18061    fn attr_from_type(r#type: u16) -> Option<&'static str> {
18062        let res = match r#type {
18063            1u16 => "Id",
18064            _ => return None,
18065        };
18066        Some(res)
18067    }
18068}
18069#[derive(Clone, Copy, Default)]
18070pub struct IterableLinkDpllPinAttrs<'a> {
18071    buf: &'a [u8],
18072    pos: usize,
18073    orig_loc: usize,
18074}
18075impl<'a> IterableLinkDpllPinAttrs<'a> {
18076    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
18077        Self {
18078            buf,
18079            pos: 0,
18080            orig_loc,
18081        }
18082    }
18083    pub fn get_buf(&self) -> &'a [u8] {
18084        self.buf
18085    }
18086}
18087impl<'a> Iterator for IterableLinkDpllPinAttrs<'a> {
18088    type Item = Result<LinkDpllPinAttrs, ErrorContext>;
18089    fn next(&mut self) -> Option<Self::Item> {
18090        let mut pos;
18091        let mut r#type;
18092        loop {
18093            pos = self.pos;
18094            r#type = None;
18095            if self.buf.len() == self.pos {
18096                return None;
18097            }
18098            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
18099                self.pos = self.buf.len();
18100                break;
18101            };
18102            r#type = Some(header.r#type);
18103            let res = match header.r#type {
18104                1u16 => LinkDpllPinAttrs::Id({
18105                    let res = parse_u32(next);
18106                    let Some(val) = res else { break };
18107                    val
18108                }),
18109                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
18110                n => continue,
18111            };
18112            return Some(Ok(res));
18113        }
18114        Some(Err(ErrorContext::new(
18115            "LinkDpllPinAttrs",
18116            r#type.and_then(|t| LinkDpllPinAttrs::attr_from_type(t)),
18117            self.orig_loc,
18118            self.buf.as_ptr().wrapping_add(pos) as usize,
18119        )))
18120    }
18121}
18122impl std::fmt::Debug for IterableLinkDpllPinAttrs<'_> {
18123    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18124        let mut fmt = f.debug_struct("LinkDpllPinAttrs");
18125        for attr in self.clone() {
18126            let attr = match attr {
18127                Ok(a) => a,
18128                Err(err) => {
18129                    fmt.finish()?;
18130                    f.write_str("Err(")?;
18131                    err.fmt(f)?;
18132                    return f.write_str(")");
18133                }
18134            };
18135            match attr {
18136                LinkDpllPinAttrs::Id(val) => fmt.field("Id", &val),
18137            };
18138        }
18139        fmt.finish()
18140    }
18141}
18142impl IterableLinkDpllPinAttrs<'_> {
18143    pub fn lookup_attr(
18144        &self,
18145        offset: usize,
18146        missing_type: Option<u16>,
18147    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18148        let mut stack = Vec::new();
18149        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
18150        if missing_type.is_some() && cur == offset {
18151            stack.push(("LinkDpllPinAttrs", offset));
18152            return (
18153                stack,
18154                missing_type.and_then(|t| LinkDpllPinAttrs::attr_from_type(t)),
18155            );
18156        }
18157        if cur > offset || cur + self.buf.len() < offset {
18158            return (stack, None);
18159        }
18160        let mut attrs = self.clone();
18161        let mut last_off = cur + attrs.pos;
18162        while let Some(attr) = attrs.next() {
18163            let Ok(attr) = attr else { break };
18164            match attr {
18165                LinkDpllPinAttrs::Id(val) => {
18166                    if last_off == offset {
18167                        stack.push(("Id", last_off));
18168                        break;
18169                    }
18170                }
18171                _ => {}
18172            };
18173            last_off = cur + attrs.pos;
18174        }
18175        if !stack.is_empty() {
18176            stack.push(("LinkDpllPinAttrs", cur));
18177        }
18178        (stack, None)
18179    }
18180}
18181#[derive(Clone)]
18182pub enum LinkinfoNetkitAttrs<'a> {
18183    PeerInfo(&'a [u8]),
18184    Primary(u8),
18185    #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
18186    Policy(u32),
18187    #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
18188    PeerPolicy(u32),
18189    #[doc = "Associated type: [`NetkitMode`] (enum)"]
18190    Mode(u32),
18191    #[doc = "Associated type: [`NetkitScrub`] (enum)"]
18192    Scrub(u32),
18193    #[doc = "Associated type: [`NetkitScrub`] (enum)"]
18194    PeerScrub(u32),
18195    Headroom(u16),
18196    Tailroom(u16),
18197    #[doc = "Associated type: [`NetkitPairing`] (enum)"]
18198    Pairing(u32),
18199}
18200impl<'a> IterableLinkinfoNetkitAttrs<'a> {
18201    pub fn get_peer_info(&self) -> Result<&'a [u8], ErrorContext> {
18202        let mut iter = self.clone();
18203        iter.pos = 0;
18204        for attr in iter {
18205            if let Ok(LinkinfoNetkitAttrs::PeerInfo(val)) = attr {
18206                return Ok(val);
18207            }
18208        }
18209        Err(ErrorContext::new_missing(
18210            "LinkinfoNetkitAttrs",
18211            "PeerInfo",
18212            self.orig_loc,
18213            self.buf.as_ptr() as usize,
18214        ))
18215    }
18216    pub fn get_primary(&self) -> Result<u8, ErrorContext> {
18217        let mut iter = self.clone();
18218        iter.pos = 0;
18219        for attr in iter {
18220            if let Ok(LinkinfoNetkitAttrs::Primary(val)) = attr {
18221                return Ok(val);
18222            }
18223        }
18224        Err(ErrorContext::new_missing(
18225            "LinkinfoNetkitAttrs",
18226            "Primary",
18227            self.orig_loc,
18228            self.buf.as_ptr() as usize,
18229        ))
18230    }
18231    #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
18232    pub fn get_policy(&self) -> Result<u32, ErrorContext> {
18233        let mut iter = self.clone();
18234        iter.pos = 0;
18235        for attr in iter {
18236            if let Ok(LinkinfoNetkitAttrs::Policy(val)) = attr {
18237                return Ok(val);
18238            }
18239        }
18240        Err(ErrorContext::new_missing(
18241            "LinkinfoNetkitAttrs",
18242            "Policy",
18243            self.orig_loc,
18244            self.buf.as_ptr() as usize,
18245        ))
18246    }
18247    #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
18248    pub fn get_peer_policy(&self) -> Result<u32, ErrorContext> {
18249        let mut iter = self.clone();
18250        iter.pos = 0;
18251        for attr in iter {
18252            if let Ok(LinkinfoNetkitAttrs::PeerPolicy(val)) = attr {
18253                return Ok(val);
18254            }
18255        }
18256        Err(ErrorContext::new_missing(
18257            "LinkinfoNetkitAttrs",
18258            "PeerPolicy",
18259            self.orig_loc,
18260            self.buf.as_ptr() as usize,
18261        ))
18262    }
18263    #[doc = "Associated type: [`NetkitMode`] (enum)"]
18264    pub fn get_mode(&self) -> Result<u32, ErrorContext> {
18265        let mut iter = self.clone();
18266        iter.pos = 0;
18267        for attr in iter {
18268            if let Ok(LinkinfoNetkitAttrs::Mode(val)) = attr {
18269                return Ok(val);
18270            }
18271        }
18272        Err(ErrorContext::new_missing(
18273            "LinkinfoNetkitAttrs",
18274            "Mode",
18275            self.orig_loc,
18276            self.buf.as_ptr() as usize,
18277        ))
18278    }
18279    #[doc = "Associated type: [`NetkitScrub`] (enum)"]
18280    pub fn get_scrub(&self) -> Result<u32, ErrorContext> {
18281        let mut iter = self.clone();
18282        iter.pos = 0;
18283        for attr in iter {
18284            if let Ok(LinkinfoNetkitAttrs::Scrub(val)) = attr {
18285                return Ok(val);
18286            }
18287        }
18288        Err(ErrorContext::new_missing(
18289            "LinkinfoNetkitAttrs",
18290            "Scrub",
18291            self.orig_loc,
18292            self.buf.as_ptr() as usize,
18293        ))
18294    }
18295    #[doc = "Associated type: [`NetkitScrub`] (enum)"]
18296    pub fn get_peer_scrub(&self) -> Result<u32, ErrorContext> {
18297        let mut iter = self.clone();
18298        iter.pos = 0;
18299        for attr in iter {
18300            if let Ok(LinkinfoNetkitAttrs::PeerScrub(val)) = attr {
18301                return Ok(val);
18302            }
18303        }
18304        Err(ErrorContext::new_missing(
18305            "LinkinfoNetkitAttrs",
18306            "PeerScrub",
18307            self.orig_loc,
18308            self.buf.as_ptr() as usize,
18309        ))
18310    }
18311    pub fn get_headroom(&self) -> Result<u16, ErrorContext> {
18312        let mut iter = self.clone();
18313        iter.pos = 0;
18314        for attr in iter {
18315            if let Ok(LinkinfoNetkitAttrs::Headroom(val)) = attr {
18316                return Ok(val);
18317            }
18318        }
18319        Err(ErrorContext::new_missing(
18320            "LinkinfoNetkitAttrs",
18321            "Headroom",
18322            self.orig_loc,
18323            self.buf.as_ptr() as usize,
18324        ))
18325    }
18326    pub fn get_tailroom(&self) -> Result<u16, ErrorContext> {
18327        let mut iter = self.clone();
18328        iter.pos = 0;
18329        for attr in iter {
18330            if let Ok(LinkinfoNetkitAttrs::Tailroom(val)) = attr {
18331                return Ok(val);
18332            }
18333        }
18334        Err(ErrorContext::new_missing(
18335            "LinkinfoNetkitAttrs",
18336            "Tailroom",
18337            self.orig_loc,
18338            self.buf.as_ptr() as usize,
18339        ))
18340    }
18341    #[doc = "Associated type: [`NetkitPairing`] (enum)"]
18342    pub fn get_pairing(&self) -> Result<u32, ErrorContext> {
18343        let mut iter = self.clone();
18344        iter.pos = 0;
18345        for attr in iter {
18346            if let Ok(LinkinfoNetkitAttrs::Pairing(val)) = attr {
18347                return Ok(val);
18348            }
18349        }
18350        Err(ErrorContext::new_missing(
18351            "LinkinfoNetkitAttrs",
18352            "Pairing",
18353            self.orig_loc,
18354            self.buf.as_ptr() as usize,
18355        ))
18356    }
18357}
18358impl LinkinfoNetkitAttrs<'_> {
18359    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoNetkitAttrs<'a> {
18360        IterableLinkinfoNetkitAttrs::with_loc(buf, buf.as_ptr() as usize)
18361    }
18362    fn attr_from_type(r#type: u16) -> Option<&'static str> {
18363        let res = match r#type {
18364            1u16 => "PeerInfo",
18365            2u16 => "Primary",
18366            3u16 => "Policy",
18367            4u16 => "PeerPolicy",
18368            5u16 => "Mode",
18369            6u16 => "Scrub",
18370            7u16 => "PeerScrub",
18371            8u16 => "Headroom",
18372            9u16 => "Tailroom",
18373            10u16 => "Pairing",
18374            _ => return None,
18375        };
18376        Some(res)
18377    }
18378}
18379#[derive(Clone, Copy, Default)]
18380pub struct IterableLinkinfoNetkitAttrs<'a> {
18381    buf: &'a [u8],
18382    pos: usize,
18383    orig_loc: usize,
18384}
18385impl<'a> IterableLinkinfoNetkitAttrs<'a> {
18386    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
18387        Self {
18388            buf,
18389            pos: 0,
18390            orig_loc,
18391        }
18392    }
18393    pub fn get_buf(&self) -> &'a [u8] {
18394        self.buf
18395    }
18396}
18397impl<'a> Iterator for IterableLinkinfoNetkitAttrs<'a> {
18398    type Item = Result<LinkinfoNetkitAttrs<'a>, ErrorContext>;
18399    fn next(&mut self) -> Option<Self::Item> {
18400        let mut pos;
18401        let mut r#type;
18402        loop {
18403            pos = self.pos;
18404            r#type = None;
18405            if self.buf.len() == self.pos {
18406                return None;
18407            }
18408            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
18409                self.pos = self.buf.len();
18410                break;
18411            };
18412            r#type = Some(header.r#type);
18413            let res = match header.r#type {
18414                1u16 => LinkinfoNetkitAttrs::PeerInfo({
18415                    let res = Some(next);
18416                    let Some(val) = res else { break };
18417                    val
18418                }),
18419                2u16 => LinkinfoNetkitAttrs::Primary({
18420                    let res = parse_u8(next);
18421                    let Some(val) = res else { break };
18422                    val
18423                }),
18424                3u16 => LinkinfoNetkitAttrs::Policy({
18425                    let res = parse_u32(next);
18426                    let Some(val) = res else { break };
18427                    val
18428                }),
18429                4u16 => LinkinfoNetkitAttrs::PeerPolicy({
18430                    let res = parse_u32(next);
18431                    let Some(val) = res else { break };
18432                    val
18433                }),
18434                5u16 => LinkinfoNetkitAttrs::Mode({
18435                    let res = parse_u32(next);
18436                    let Some(val) = res else { break };
18437                    val
18438                }),
18439                6u16 => LinkinfoNetkitAttrs::Scrub({
18440                    let res = parse_u32(next);
18441                    let Some(val) = res else { break };
18442                    val
18443                }),
18444                7u16 => LinkinfoNetkitAttrs::PeerScrub({
18445                    let res = parse_u32(next);
18446                    let Some(val) = res else { break };
18447                    val
18448                }),
18449                8u16 => LinkinfoNetkitAttrs::Headroom({
18450                    let res = parse_u16(next);
18451                    let Some(val) = res else { break };
18452                    val
18453                }),
18454                9u16 => LinkinfoNetkitAttrs::Tailroom({
18455                    let res = parse_u16(next);
18456                    let Some(val) = res else { break };
18457                    val
18458                }),
18459                10u16 => LinkinfoNetkitAttrs::Pairing({
18460                    let res = parse_u32(next);
18461                    let Some(val) = res else { break };
18462                    val
18463                }),
18464                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
18465                n => continue,
18466            };
18467            return Some(Ok(res));
18468        }
18469        Some(Err(ErrorContext::new(
18470            "LinkinfoNetkitAttrs",
18471            r#type.and_then(|t| LinkinfoNetkitAttrs::attr_from_type(t)),
18472            self.orig_loc,
18473            self.buf.as_ptr().wrapping_add(pos) as usize,
18474        )))
18475    }
18476}
18477impl<'a> std::fmt::Debug for IterableLinkinfoNetkitAttrs<'_> {
18478    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18479        let mut fmt = f.debug_struct("LinkinfoNetkitAttrs");
18480        for attr in self.clone() {
18481            let attr = match attr {
18482                Ok(a) => a,
18483                Err(err) => {
18484                    fmt.finish()?;
18485                    f.write_str("Err(")?;
18486                    err.fmt(f)?;
18487                    return f.write_str(")");
18488                }
18489            };
18490            match attr {
18491                LinkinfoNetkitAttrs::PeerInfo(val) => fmt.field("PeerInfo", &val),
18492                LinkinfoNetkitAttrs::Primary(val) => fmt.field("Primary", &val),
18493                LinkinfoNetkitAttrs::Policy(val) => {
18494                    fmt.field("Policy", &FormatEnum(val.into(), NetkitPolicy::from_value))
18495                }
18496                LinkinfoNetkitAttrs::PeerPolicy(val) => fmt.field(
18497                    "PeerPolicy",
18498                    &FormatEnum(val.into(), NetkitPolicy::from_value),
18499                ),
18500                LinkinfoNetkitAttrs::Mode(val) => {
18501                    fmt.field("Mode", &FormatEnum(val.into(), NetkitMode::from_value))
18502                }
18503                LinkinfoNetkitAttrs::Scrub(val) => {
18504                    fmt.field("Scrub", &FormatEnum(val.into(), NetkitScrub::from_value))
18505                }
18506                LinkinfoNetkitAttrs::PeerScrub(val) => fmt.field(
18507                    "PeerScrub",
18508                    &FormatEnum(val.into(), NetkitScrub::from_value),
18509                ),
18510                LinkinfoNetkitAttrs::Headroom(val) => fmt.field("Headroom", &val),
18511                LinkinfoNetkitAttrs::Tailroom(val) => fmt.field("Tailroom", &val),
18512                LinkinfoNetkitAttrs::Pairing(val) => fmt.field(
18513                    "Pairing",
18514                    &FormatEnum(val.into(), NetkitPairing::from_value),
18515                ),
18516            };
18517        }
18518        fmt.finish()
18519    }
18520}
18521impl IterableLinkinfoNetkitAttrs<'_> {
18522    pub fn lookup_attr(
18523        &self,
18524        offset: usize,
18525        missing_type: Option<u16>,
18526    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18527        let mut stack = Vec::new();
18528        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
18529        if missing_type.is_some() && cur == offset {
18530            stack.push(("LinkinfoNetkitAttrs", offset));
18531            return (
18532                stack,
18533                missing_type.and_then(|t| LinkinfoNetkitAttrs::attr_from_type(t)),
18534            );
18535        }
18536        if cur > offset || cur + self.buf.len() < offset {
18537            return (stack, None);
18538        }
18539        let mut attrs = self.clone();
18540        let mut last_off = cur + attrs.pos;
18541        while let Some(attr) = attrs.next() {
18542            let Ok(attr) = attr else { break };
18543            match attr {
18544                LinkinfoNetkitAttrs::PeerInfo(val) => {
18545                    if last_off == offset {
18546                        stack.push(("PeerInfo", last_off));
18547                        break;
18548                    }
18549                }
18550                LinkinfoNetkitAttrs::Primary(val) => {
18551                    if last_off == offset {
18552                        stack.push(("Primary", last_off));
18553                        break;
18554                    }
18555                }
18556                LinkinfoNetkitAttrs::Policy(val) => {
18557                    if last_off == offset {
18558                        stack.push(("Policy", last_off));
18559                        break;
18560                    }
18561                }
18562                LinkinfoNetkitAttrs::PeerPolicy(val) => {
18563                    if last_off == offset {
18564                        stack.push(("PeerPolicy", last_off));
18565                        break;
18566                    }
18567                }
18568                LinkinfoNetkitAttrs::Mode(val) => {
18569                    if last_off == offset {
18570                        stack.push(("Mode", last_off));
18571                        break;
18572                    }
18573                }
18574                LinkinfoNetkitAttrs::Scrub(val) => {
18575                    if last_off == offset {
18576                        stack.push(("Scrub", last_off));
18577                        break;
18578                    }
18579                }
18580                LinkinfoNetkitAttrs::PeerScrub(val) => {
18581                    if last_off == offset {
18582                        stack.push(("PeerScrub", last_off));
18583                        break;
18584                    }
18585                }
18586                LinkinfoNetkitAttrs::Headroom(val) => {
18587                    if last_off == offset {
18588                        stack.push(("Headroom", last_off));
18589                        break;
18590                    }
18591                }
18592                LinkinfoNetkitAttrs::Tailroom(val) => {
18593                    if last_off == offset {
18594                        stack.push(("Tailroom", last_off));
18595                        break;
18596                    }
18597                }
18598                LinkinfoNetkitAttrs::Pairing(val) => {
18599                    if last_off == offset {
18600                        stack.push(("Pairing", last_off));
18601                        break;
18602                    }
18603                }
18604                _ => {}
18605            };
18606            last_off = cur + attrs.pos;
18607        }
18608        if !stack.is_empty() {
18609            stack.push(("LinkinfoNetkitAttrs", cur));
18610        }
18611        (stack, None)
18612    }
18613}
18614#[derive(Clone)]
18615pub enum LinkinfoOvpnAttrs {
18616    #[doc = "Associated type: [`OvpnMode`] (enum)"]
18617    Mode(u8),
18618}
18619impl<'a> IterableLinkinfoOvpnAttrs<'a> {
18620    #[doc = "Associated type: [`OvpnMode`] (enum)"]
18621    pub fn get_mode(&self) -> Result<u8, ErrorContext> {
18622        let mut iter = self.clone();
18623        iter.pos = 0;
18624        for attr in iter {
18625            if let Ok(LinkinfoOvpnAttrs::Mode(val)) = attr {
18626                return Ok(val);
18627            }
18628        }
18629        Err(ErrorContext::new_missing(
18630            "LinkinfoOvpnAttrs",
18631            "Mode",
18632            self.orig_loc,
18633            self.buf.as_ptr() as usize,
18634        ))
18635    }
18636}
18637impl LinkinfoOvpnAttrs {
18638    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoOvpnAttrs<'a> {
18639        IterableLinkinfoOvpnAttrs::with_loc(buf, buf.as_ptr() as usize)
18640    }
18641    fn attr_from_type(r#type: u16) -> Option<&'static str> {
18642        let res = match r#type {
18643            1u16 => "Mode",
18644            _ => return None,
18645        };
18646        Some(res)
18647    }
18648}
18649#[derive(Clone, Copy, Default)]
18650pub struct IterableLinkinfoOvpnAttrs<'a> {
18651    buf: &'a [u8],
18652    pos: usize,
18653    orig_loc: usize,
18654}
18655impl<'a> IterableLinkinfoOvpnAttrs<'a> {
18656    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
18657        Self {
18658            buf,
18659            pos: 0,
18660            orig_loc,
18661        }
18662    }
18663    pub fn get_buf(&self) -> &'a [u8] {
18664        self.buf
18665    }
18666}
18667impl<'a> Iterator for IterableLinkinfoOvpnAttrs<'a> {
18668    type Item = Result<LinkinfoOvpnAttrs, ErrorContext>;
18669    fn next(&mut self) -> Option<Self::Item> {
18670        let mut pos;
18671        let mut r#type;
18672        loop {
18673            pos = self.pos;
18674            r#type = None;
18675            if self.buf.len() == self.pos {
18676                return None;
18677            }
18678            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
18679                self.pos = self.buf.len();
18680                break;
18681            };
18682            r#type = Some(header.r#type);
18683            let res = match header.r#type {
18684                1u16 => LinkinfoOvpnAttrs::Mode({
18685                    let res = parse_u8(next);
18686                    let Some(val) = res else { break };
18687                    val
18688                }),
18689                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
18690                n => continue,
18691            };
18692            return Some(Ok(res));
18693        }
18694        Some(Err(ErrorContext::new(
18695            "LinkinfoOvpnAttrs",
18696            r#type.and_then(|t| LinkinfoOvpnAttrs::attr_from_type(t)),
18697            self.orig_loc,
18698            self.buf.as_ptr().wrapping_add(pos) as usize,
18699        )))
18700    }
18701}
18702impl std::fmt::Debug for IterableLinkinfoOvpnAttrs<'_> {
18703    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18704        let mut fmt = f.debug_struct("LinkinfoOvpnAttrs");
18705        for attr in self.clone() {
18706            let attr = match attr {
18707                Ok(a) => a,
18708                Err(err) => {
18709                    fmt.finish()?;
18710                    f.write_str("Err(")?;
18711                    err.fmt(f)?;
18712                    return f.write_str(")");
18713                }
18714            };
18715            match attr {
18716                LinkinfoOvpnAttrs::Mode(val) => {
18717                    fmt.field("Mode", &FormatEnum(val.into(), OvpnMode::from_value))
18718                }
18719            };
18720        }
18721        fmt.finish()
18722    }
18723}
18724impl IterableLinkinfoOvpnAttrs<'_> {
18725    pub fn lookup_attr(
18726        &self,
18727        offset: usize,
18728        missing_type: Option<u16>,
18729    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18730        let mut stack = Vec::new();
18731        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
18732        if missing_type.is_some() && cur == offset {
18733            stack.push(("LinkinfoOvpnAttrs", offset));
18734            return (
18735                stack,
18736                missing_type.and_then(|t| LinkinfoOvpnAttrs::attr_from_type(t)),
18737            );
18738        }
18739        if cur > offset || cur + self.buf.len() < offset {
18740            return (stack, None);
18741        }
18742        let mut attrs = self.clone();
18743        let mut last_off = cur + attrs.pos;
18744        while let Some(attr) = attrs.next() {
18745            let Ok(attr) = attr else { break };
18746            match attr {
18747                LinkinfoOvpnAttrs::Mode(val) => {
18748                    if last_off == offset {
18749                        stack.push(("Mode", last_off));
18750                        break;
18751                    }
18752                }
18753                _ => {}
18754            };
18755            last_off = cur + attrs.pos;
18756        }
18757        if !stack.is_empty() {
18758            stack.push(("LinkinfoOvpnAttrs", cur));
18759        }
18760        (stack, None)
18761    }
18762}
18763pub struct PushLinkAttrs<Prev: Pusher> {
18764    pub(crate) prev: Option<Prev>,
18765    pub(crate) header_offset: Option<usize>,
18766}
18767impl<Prev: Pusher> Pusher for PushLinkAttrs<Prev> {
18768    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18769        self.prev.as_mut().unwrap().as_vec_mut()
18770    }
18771    fn as_vec(&self) -> &Vec<u8> {
18772        self.prev.as_ref().unwrap().as_vec()
18773    }
18774}
18775impl<Prev: Pusher> PushLinkAttrs<Prev> {
18776    pub fn new(prev: Prev) -> Self {
18777        Self {
18778            prev: Some(prev),
18779            header_offset: None,
18780        }
18781    }
18782    pub fn end_nested(mut self) -> Prev {
18783        let mut prev = self.prev.take().unwrap();
18784        if let Some(header_offset) = &self.header_offset {
18785            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18786        }
18787        prev
18788    }
18789    pub fn push_address(mut self, value: &[u8]) -> Self {
18790        push_header(self.as_vec_mut(), 1u16, value.len() as u16);
18791        self.as_vec_mut().extend(value);
18792        self
18793    }
18794    pub fn push_broadcast(mut self, value: &[u8]) -> Self {
18795        push_header(self.as_vec_mut(), 2u16, value.len() as u16);
18796        self.as_vec_mut().extend(value);
18797        self
18798    }
18799    pub fn push_ifname(mut self, value: &CStr) -> Self {
18800        push_header(
18801            self.as_vec_mut(),
18802            3u16,
18803            value.to_bytes_with_nul().len() as u16,
18804        );
18805        self.as_vec_mut().extend(value.to_bytes_with_nul());
18806        self
18807    }
18808    pub fn push_ifname_bytes(mut self, value: &[u8]) -> Self {
18809        push_header(self.as_vec_mut(), 3u16, (value.len() + 1) as u16);
18810        self.as_vec_mut().extend(value);
18811        self.as_vec_mut().push(0);
18812        self
18813    }
18814    pub fn push_mtu(mut self, value: u32) -> Self {
18815        push_header(self.as_vec_mut(), 4u16, 4 as u16);
18816        self.as_vec_mut().extend(value.to_ne_bytes());
18817        self
18818    }
18819    pub fn push_link(mut self, value: u32) -> Self {
18820        push_header(self.as_vec_mut(), 5u16, 4 as u16);
18821        self.as_vec_mut().extend(value.to_ne_bytes());
18822        self
18823    }
18824    pub fn push_qdisc(mut self, value: &CStr) -> Self {
18825        push_header(
18826            self.as_vec_mut(),
18827            6u16,
18828            value.to_bytes_with_nul().len() as u16,
18829        );
18830        self.as_vec_mut().extend(value.to_bytes_with_nul());
18831        self
18832    }
18833    pub fn push_qdisc_bytes(mut self, value: &[u8]) -> Self {
18834        push_header(self.as_vec_mut(), 6u16, (value.len() + 1) as u16);
18835        self.as_vec_mut().extend(value);
18836        self.as_vec_mut().push(0);
18837        self
18838    }
18839    pub fn push_stats(mut self, value: RtnlLinkStats) -> Self {
18840        push_header(self.as_vec_mut(), 7u16, value.as_slice().len() as u16);
18841        self.as_vec_mut().extend(value.as_slice());
18842        self
18843    }
18844    pub fn push_master(mut self, value: u32) -> Self {
18845        push_header(self.as_vec_mut(), 10u16, 4 as u16);
18846        self.as_vec_mut().extend(value.to_ne_bytes());
18847        self
18848    }
18849    #[doc = "struct iw_event\n"]
18850    pub fn push_wireless(mut self, value: &[u8]) -> Self {
18851        push_header(self.as_vec_mut(), 11u16, value.len() as u16);
18852        self.as_vec_mut().extend(value);
18853        self
18854    }
18855    #[doc = "A nest of ifla6-attrs or linkinfo-brport-attrs\n"]
18856    pub fn push_protinfo(mut self, value: &[u8]) -> Self {
18857        push_header(self.as_vec_mut(), 12u16, value.len() as u16);
18858        self.as_vec_mut().extend(value);
18859        self
18860    }
18861    pub fn push_txqlen(mut self, value: u32) -> Self {
18862        push_header(self.as_vec_mut(), 13u16, 4 as u16);
18863        self.as_vec_mut().extend(value.to_ne_bytes());
18864        self
18865    }
18866    pub fn push_map(mut self, value: RtnlLinkIfmap) -> Self {
18867        push_header(self.as_vec_mut(), 14u16, value.as_slice().len() as u16);
18868        self.as_vec_mut().extend(value.as_slice());
18869        self
18870    }
18871    pub fn push_weight(mut self, value: u32) -> Self {
18872        push_header(self.as_vec_mut(), 15u16, 4 as u16);
18873        self.as_vec_mut().extend(value.to_ne_bytes());
18874        self
18875    }
18876    pub fn push_operstate(mut self, value: u8) -> Self {
18877        push_header(self.as_vec_mut(), 16u16, 1 as u16);
18878        self.as_vec_mut().extend(value.to_ne_bytes());
18879        self
18880    }
18881    pub fn push_linkmode(mut self, value: u8) -> Self {
18882        push_header(self.as_vec_mut(), 17u16, 1 as u16);
18883        self.as_vec_mut().extend(value.to_ne_bytes());
18884        self
18885    }
18886    pub fn nested_linkinfo(mut self) -> PushLinkinfoAttrs<Self> {
18887        let header_offset = push_nested_header(self.as_vec_mut(), 18u16);
18888        PushLinkinfoAttrs {
18889            prev: Some(self),
18890            header_offset: Some(header_offset),
18891        }
18892    }
18893    pub fn push_net_ns_pid(mut self, value: u32) -> Self {
18894        push_header(self.as_vec_mut(), 19u16, 4 as u16);
18895        self.as_vec_mut().extend(value.to_ne_bytes());
18896        self
18897    }
18898    pub fn push_ifalias(mut self, value: &CStr) -> Self {
18899        push_header(
18900            self.as_vec_mut(),
18901            20u16,
18902            value.to_bytes_with_nul().len() as u16,
18903        );
18904        self.as_vec_mut().extend(value.to_bytes_with_nul());
18905        self
18906    }
18907    pub fn push_ifalias_bytes(mut self, value: &[u8]) -> Self {
18908        push_header(self.as_vec_mut(), 20u16, (value.len() + 1) as u16);
18909        self.as_vec_mut().extend(value);
18910        self.as_vec_mut().push(0);
18911        self
18912    }
18913    pub fn push_num_vf(mut self, value: u32) -> Self {
18914        push_header(self.as_vec_mut(), 21u16, 4 as u16);
18915        self.as_vec_mut().extend(value.to_ne_bytes());
18916        self
18917    }
18918    pub fn nested_vfinfo_list(mut self) -> PushVfinfoListAttrs<Self> {
18919        let header_offset = push_nested_header(self.as_vec_mut(), 22u16);
18920        PushVfinfoListAttrs {
18921            prev: Some(self),
18922            header_offset: Some(header_offset),
18923        }
18924    }
18925    pub fn push_stats64(mut self, value: RtnlLinkStats64) -> Self {
18926        push_header(self.as_vec_mut(), 23u16, value.as_slice().len() as u16);
18927        self.as_vec_mut().extend(value.as_slice());
18928        self
18929    }
18930    pub fn nested_vf_ports(mut self) -> PushVfPortsAttrs<Self> {
18931        let header_offset = push_nested_header(self.as_vec_mut(), 24u16);
18932        PushVfPortsAttrs {
18933            prev: Some(self),
18934            header_offset: Some(header_offset),
18935        }
18936    }
18937    pub fn nested_port_self(mut self) -> PushPortSelfAttrs<Self> {
18938        let header_offset = push_nested_header(self.as_vec_mut(), 25u16);
18939        PushPortSelfAttrs {
18940            prev: Some(self),
18941            header_offset: Some(header_offset),
18942        }
18943    }
18944    pub fn nested_af_spec(mut self) -> PushAfSpecAttrs<Self> {
18945        let header_offset = push_nested_header(self.as_vec_mut(), 26u16);
18946        PushAfSpecAttrs {
18947            prev: Some(self),
18948            header_offset: Some(header_offset),
18949        }
18950    }
18951    pub fn push_group(mut self, value: u32) -> Self {
18952        push_header(self.as_vec_mut(), 27u16, 4 as u16);
18953        self.as_vec_mut().extend(value.to_ne_bytes());
18954        self
18955    }
18956    pub fn push_net_ns_fd(mut self, value: u32) -> Self {
18957        push_header(self.as_vec_mut(), 28u16, 4 as u16);
18958        self.as_vec_mut().extend(value.to_ne_bytes());
18959        self
18960    }
18961    #[doc = "Associated type: [`RtextFilter`] (1 bit per enumeration)"]
18962    pub fn push_ext_mask(mut self, value: u32) -> Self {
18963        push_header(self.as_vec_mut(), 29u16, 4 as u16);
18964        self.as_vec_mut().extend(value.to_ne_bytes());
18965        self
18966    }
18967    pub fn push_promiscuity(mut self, value: u32) -> Self {
18968        push_header(self.as_vec_mut(), 30u16, 4 as u16);
18969        self.as_vec_mut().extend(value.to_ne_bytes());
18970        self
18971    }
18972    pub fn push_num_tx_queues(mut self, value: u32) -> Self {
18973        push_header(self.as_vec_mut(), 31u16, 4 as u16);
18974        self.as_vec_mut().extend(value.to_ne_bytes());
18975        self
18976    }
18977    pub fn push_num_rx_queues(mut self, value: u32) -> Self {
18978        push_header(self.as_vec_mut(), 32u16, 4 as u16);
18979        self.as_vec_mut().extend(value.to_ne_bytes());
18980        self
18981    }
18982    pub fn push_carrier(mut self, value: u8) -> Self {
18983        push_header(self.as_vec_mut(), 33u16, 1 as u16);
18984        self.as_vec_mut().extend(value.to_ne_bytes());
18985        self
18986    }
18987    pub fn push_phys_port_id(mut self, value: &[u8]) -> Self {
18988        push_header(self.as_vec_mut(), 34u16, value.len() as u16);
18989        self.as_vec_mut().extend(value);
18990        self
18991    }
18992    pub fn push_carrier_changes(mut self, value: u32) -> Self {
18993        push_header(self.as_vec_mut(), 35u16, 4 as u16);
18994        self.as_vec_mut().extend(value.to_ne_bytes());
18995        self
18996    }
18997    pub fn push_phys_switch_id(mut self, value: &[u8]) -> Self {
18998        push_header(self.as_vec_mut(), 36u16, value.len() as u16);
18999        self.as_vec_mut().extend(value);
19000        self
19001    }
19002    pub fn push_link_netnsid(mut self, value: i32) -> Self {
19003        push_header(self.as_vec_mut(), 37u16, 4 as u16);
19004        self.as_vec_mut().extend(value.to_ne_bytes());
19005        self
19006    }
19007    pub fn push_phys_port_name(mut self, value: &CStr) -> Self {
19008        push_header(
19009            self.as_vec_mut(),
19010            38u16,
19011            value.to_bytes_with_nul().len() as u16,
19012        );
19013        self.as_vec_mut().extend(value.to_bytes_with_nul());
19014        self
19015    }
19016    pub fn push_phys_port_name_bytes(mut self, value: &[u8]) -> Self {
19017        push_header(self.as_vec_mut(), 38u16, (value.len() + 1) as u16);
19018        self.as_vec_mut().extend(value);
19019        self.as_vec_mut().push(0);
19020        self
19021    }
19022    pub fn push_proto_down(mut self, value: u8) -> Self {
19023        push_header(self.as_vec_mut(), 39u16, 1 as u16);
19024        self.as_vec_mut().extend(value.to_ne_bytes());
19025        self
19026    }
19027    pub fn push_gso_max_segs(mut self, value: u32) -> Self {
19028        push_header(self.as_vec_mut(), 40u16, 4 as u16);
19029        self.as_vec_mut().extend(value.to_ne_bytes());
19030        self
19031    }
19032    pub fn push_gso_max_size(mut self, value: u32) -> Self {
19033        push_header(self.as_vec_mut(), 41u16, 4 as u16);
19034        self.as_vec_mut().extend(value.to_ne_bytes());
19035        self
19036    }
19037    pub fn push_pad(mut self, value: &[u8]) -> Self {
19038        push_header(self.as_vec_mut(), 42u16, value.len() as u16);
19039        self.as_vec_mut().extend(value);
19040        self
19041    }
19042    pub fn nested_xdp(mut self) -> PushXdpAttrs<Self> {
19043        let header_offset = push_nested_header(self.as_vec_mut(), 43u16);
19044        PushXdpAttrs {
19045            prev: Some(self),
19046            header_offset: Some(header_offset),
19047        }
19048    }
19049    pub fn push_event(mut self, value: u32) -> Self {
19050        push_header(self.as_vec_mut(), 44u16, 4 as u16);
19051        self.as_vec_mut().extend(value.to_ne_bytes());
19052        self
19053    }
19054    pub fn push_new_netnsid(mut self, value: i32) -> Self {
19055        push_header(self.as_vec_mut(), 45u16, 4 as u16);
19056        self.as_vec_mut().extend(value.to_ne_bytes());
19057        self
19058    }
19059    pub fn push_target_netnsid(mut self, value: i32) -> Self {
19060        push_header(self.as_vec_mut(), 46u16, 4 as u16);
19061        self.as_vec_mut().extend(value.to_ne_bytes());
19062        self
19063    }
19064    pub fn push_carrier_up_count(mut self, value: u32) -> Self {
19065        push_header(self.as_vec_mut(), 47u16, 4 as u16);
19066        self.as_vec_mut().extend(value.to_ne_bytes());
19067        self
19068    }
19069    pub fn push_carrier_down_count(mut self, value: u32) -> Self {
19070        push_header(self.as_vec_mut(), 48u16, 4 as u16);
19071        self.as_vec_mut().extend(value.to_ne_bytes());
19072        self
19073    }
19074    pub fn push_new_ifindex(mut self, value: i32) -> Self {
19075        push_header(self.as_vec_mut(), 49u16, 4 as u16);
19076        self.as_vec_mut().extend(value.to_ne_bytes());
19077        self
19078    }
19079    pub fn push_min_mtu(mut self, value: u32) -> Self {
19080        push_header(self.as_vec_mut(), 50u16, 4 as u16);
19081        self.as_vec_mut().extend(value.to_ne_bytes());
19082        self
19083    }
19084    pub fn push_max_mtu(mut self, value: u32) -> Self {
19085        push_header(self.as_vec_mut(), 51u16, 4 as u16);
19086        self.as_vec_mut().extend(value.to_ne_bytes());
19087        self
19088    }
19089    pub fn nested_prop_list(mut self) -> PushPropListLinkAttrs<Self> {
19090        let header_offset = push_nested_header(self.as_vec_mut(), 52u16);
19091        PushPropListLinkAttrs {
19092            prev: Some(self),
19093            header_offset: Some(header_offset),
19094        }
19095    }
19096    pub fn push_alt_ifname(mut self, value: &CStr) -> Self {
19097        push_header(
19098            self.as_vec_mut(),
19099            53u16,
19100            value.to_bytes_with_nul().len() as u16,
19101        );
19102        self.as_vec_mut().extend(value.to_bytes_with_nul());
19103        self
19104    }
19105    pub fn push_alt_ifname_bytes(mut self, value: &[u8]) -> Self {
19106        push_header(self.as_vec_mut(), 53u16, (value.len() + 1) as u16);
19107        self.as_vec_mut().extend(value);
19108        self.as_vec_mut().push(0);
19109        self
19110    }
19111    pub fn push_perm_address(mut self, value: &[u8]) -> Self {
19112        push_header(self.as_vec_mut(), 54u16, value.len() as u16);
19113        self.as_vec_mut().extend(value);
19114        self
19115    }
19116    pub fn push_proto_down_reason(mut self, value: &CStr) -> Self {
19117        push_header(
19118            self.as_vec_mut(),
19119            55u16,
19120            value.to_bytes_with_nul().len() as u16,
19121        );
19122        self.as_vec_mut().extend(value.to_bytes_with_nul());
19123        self
19124    }
19125    pub fn push_proto_down_reason_bytes(mut self, value: &[u8]) -> Self {
19126        push_header(self.as_vec_mut(), 55u16, (value.len() + 1) as u16);
19127        self.as_vec_mut().extend(value);
19128        self.as_vec_mut().push(0);
19129        self
19130    }
19131    pub fn push_parent_dev_name(mut self, value: &CStr) -> Self {
19132        push_header(
19133            self.as_vec_mut(),
19134            56u16,
19135            value.to_bytes_with_nul().len() as u16,
19136        );
19137        self.as_vec_mut().extend(value.to_bytes_with_nul());
19138        self
19139    }
19140    pub fn push_parent_dev_name_bytes(mut self, value: &[u8]) -> Self {
19141        push_header(self.as_vec_mut(), 56u16, (value.len() + 1) as u16);
19142        self.as_vec_mut().extend(value);
19143        self.as_vec_mut().push(0);
19144        self
19145    }
19146    pub fn push_parent_dev_bus_name(mut self, value: &CStr) -> Self {
19147        push_header(
19148            self.as_vec_mut(),
19149            57u16,
19150            value.to_bytes_with_nul().len() as u16,
19151        );
19152        self.as_vec_mut().extend(value.to_bytes_with_nul());
19153        self
19154    }
19155    pub fn push_parent_dev_bus_name_bytes(mut self, value: &[u8]) -> Self {
19156        push_header(self.as_vec_mut(), 57u16, (value.len() + 1) as u16);
19157        self.as_vec_mut().extend(value);
19158        self.as_vec_mut().push(0);
19159        self
19160    }
19161    pub fn push_gro_max_size(mut self, value: u32) -> Self {
19162        push_header(self.as_vec_mut(), 58u16, 4 as u16);
19163        self.as_vec_mut().extend(value.to_ne_bytes());
19164        self
19165    }
19166    pub fn push_tso_max_size(mut self, value: u32) -> Self {
19167        push_header(self.as_vec_mut(), 59u16, 4 as u16);
19168        self.as_vec_mut().extend(value.to_ne_bytes());
19169        self
19170    }
19171    pub fn push_tso_max_segs(mut self, value: u32) -> Self {
19172        push_header(self.as_vec_mut(), 60u16, 4 as u16);
19173        self.as_vec_mut().extend(value.to_ne_bytes());
19174        self
19175    }
19176    pub fn push_allmulti(mut self, value: u32) -> Self {
19177        push_header(self.as_vec_mut(), 61u16, 4 as u16);
19178        self.as_vec_mut().extend(value.to_ne_bytes());
19179        self
19180    }
19181    pub fn push_devlink_port(mut self, value: &[u8]) -> Self {
19182        push_header(self.as_vec_mut(), 62u16, value.len() as u16);
19183        self.as_vec_mut().extend(value);
19184        self
19185    }
19186    pub fn push_gso_ipv4_max_size(mut self, value: u32) -> Self {
19187        push_header(self.as_vec_mut(), 63u16, 4 as u16);
19188        self.as_vec_mut().extend(value.to_ne_bytes());
19189        self
19190    }
19191    pub fn push_gro_ipv4_max_size(mut self, value: u32) -> Self {
19192        push_header(self.as_vec_mut(), 64u16, 4 as u16);
19193        self.as_vec_mut().extend(value.to_ne_bytes());
19194        self
19195    }
19196    pub fn nested_dpll_pin(mut self) -> PushLinkDpllPinAttrs<Self> {
19197        let header_offset = push_nested_header(self.as_vec_mut(), 65u16);
19198        PushLinkDpllPinAttrs {
19199            prev: Some(self),
19200            header_offset: Some(header_offset),
19201        }
19202    }
19203    #[doc = "EDT offload horizon supported by the device (in nsec).\n"]
19204    pub fn push_max_pacing_offload_horizon(mut self, value: u32) -> Self {
19205        push_header(self.as_vec_mut(), 66u16, 4 as u16);
19206        self.as_vec_mut().extend(value.to_ne_bytes());
19207        self
19208    }
19209    pub fn push_netns_immutable(mut self, value: u8) -> Self {
19210        push_header(self.as_vec_mut(), 67u16, 1 as u16);
19211        self.as_vec_mut().extend(value.to_ne_bytes());
19212        self
19213    }
19214    pub fn push_headroom(mut self, value: u16) -> Self {
19215        push_header(self.as_vec_mut(), 68u16, 2 as u16);
19216        self.as_vec_mut().extend(value.to_ne_bytes());
19217        self
19218    }
19219    pub fn push_tailroom(mut self, value: u16) -> Self {
19220        push_header(self.as_vec_mut(), 69u16, 2 as u16);
19221        self.as_vec_mut().extend(value.to_ne_bytes());
19222        self
19223    }
19224}
19225impl<Prev: Pusher> Drop for PushLinkAttrs<Prev> {
19226    fn drop(&mut self) {
19227        if let Some(prev) = &mut self.prev {
19228            if let Some(header_offset) = &self.header_offset {
19229                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19230            }
19231        }
19232    }
19233}
19234pub struct PushPropListLinkAttrs<Prev: Pusher> {
19235    pub(crate) prev: Option<Prev>,
19236    pub(crate) header_offset: Option<usize>,
19237}
19238impl<Prev: Pusher> Pusher for PushPropListLinkAttrs<Prev> {
19239    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19240        self.prev.as_mut().unwrap().as_vec_mut()
19241    }
19242    fn as_vec(&self) -> &Vec<u8> {
19243        self.prev.as_ref().unwrap().as_vec()
19244    }
19245}
19246impl<Prev: Pusher> PushPropListLinkAttrs<Prev> {
19247    pub fn new(prev: Prev) -> Self {
19248        Self {
19249            prev: Some(prev),
19250            header_offset: None,
19251        }
19252    }
19253    pub fn end_nested(mut self) -> Prev {
19254        let mut prev = self.prev.take().unwrap();
19255        if let Some(header_offset) = &self.header_offset {
19256            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19257        }
19258        prev
19259    }
19260    #[doc = "Attribute may repeat multiple times (treat it as array)"]
19261    pub fn push_alt_ifname(mut self, value: &CStr) -> Self {
19262        push_header(
19263            self.as_vec_mut(),
19264            53u16,
19265            value.to_bytes_with_nul().len() as u16,
19266        );
19267        self.as_vec_mut().extend(value.to_bytes_with_nul());
19268        self
19269    }
19270    #[doc = "Attribute may repeat multiple times (treat it as array)"]
19271    pub fn push_alt_ifname_bytes(mut self, value: &[u8]) -> Self {
19272        push_header(self.as_vec_mut(), 53u16, (value.len() + 1) as u16);
19273        self.as_vec_mut().extend(value);
19274        self.as_vec_mut().push(0);
19275        self
19276    }
19277}
19278impl<Prev: Pusher> Drop for PushPropListLinkAttrs<Prev> {
19279    fn drop(&mut self) {
19280        if let Some(prev) = &mut self.prev {
19281            if let Some(header_offset) = &self.header_offset {
19282                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19283            }
19284        }
19285    }
19286}
19287pub struct PushAfSpecAttrs<Prev: Pusher> {
19288    pub(crate) prev: Option<Prev>,
19289    pub(crate) header_offset: Option<usize>,
19290}
19291impl<Prev: Pusher> Pusher for PushAfSpecAttrs<Prev> {
19292    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19293        self.prev.as_mut().unwrap().as_vec_mut()
19294    }
19295    fn as_vec(&self) -> &Vec<u8> {
19296        self.prev.as_ref().unwrap().as_vec()
19297    }
19298}
19299impl<Prev: Pusher> PushAfSpecAttrs<Prev> {
19300    pub fn new(prev: Prev) -> Self {
19301        Self {
19302            prev: Some(prev),
19303            header_offset: None,
19304        }
19305    }
19306    pub fn end_nested(mut self) -> Prev {
19307        let mut prev = self.prev.take().unwrap();
19308        if let Some(header_offset) = &self.header_offset {
19309            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19310        }
19311        prev
19312    }
19313    pub fn nested_inet(mut self) -> PushIflaAttrs<Self> {
19314        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19315        PushIflaAttrs {
19316            prev: Some(self),
19317            header_offset: Some(header_offset),
19318        }
19319    }
19320    pub fn nested_inet6(mut self) -> PushIfla6Attrs<Self> {
19321        let header_offset = push_nested_header(self.as_vec_mut(), 10u16);
19322        PushIfla6Attrs {
19323            prev: Some(self),
19324            header_offset: Some(header_offset),
19325        }
19326    }
19327    pub fn nested_mctp(mut self) -> PushMctpAttrs<Self> {
19328        let header_offset = push_nested_header(self.as_vec_mut(), 45u16);
19329        PushMctpAttrs {
19330            prev: Some(self),
19331            header_offset: Some(header_offset),
19332        }
19333    }
19334}
19335impl<Prev: Pusher> Drop for PushAfSpecAttrs<Prev> {
19336    fn drop(&mut self) {
19337        if let Some(prev) = &mut self.prev {
19338            if let Some(header_offset) = &self.header_offset {
19339                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19340            }
19341        }
19342    }
19343}
19344pub struct PushVfinfoListAttrs<Prev: Pusher> {
19345    pub(crate) prev: Option<Prev>,
19346    pub(crate) header_offset: Option<usize>,
19347}
19348impl<Prev: Pusher> Pusher for PushVfinfoListAttrs<Prev> {
19349    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19350        self.prev.as_mut().unwrap().as_vec_mut()
19351    }
19352    fn as_vec(&self) -> &Vec<u8> {
19353        self.prev.as_ref().unwrap().as_vec()
19354    }
19355}
19356impl<Prev: Pusher> PushVfinfoListAttrs<Prev> {
19357    pub fn new(prev: Prev) -> Self {
19358        Self {
19359            prev: Some(prev),
19360            header_offset: None,
19361        }
19362    }
19363    pub fn end_nested(mut self) -> Prev {
19364        let mut prev = self.prev.take().unwrap();
19365        if let Some(header_offset) = &self.header_offset {
19366            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19367        }
19368        prev
19369    }
19370    #[doc = "Attribute may repeat multiple times (treat it as array)"]
19371    pub fn nested_info(mut self) -> PushVfinfoAttrs<Self> {
19372        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19373        PushVfinfoAttrs {
19374            prev: Some(self),
19375            header_offset: Some(header_offset),
19376        }
19377    }
19378}
19379impl<Prev: Pusher> Drop for PushVfinfoListAttrs<Prev> {
19380    fn drop(&mut self) {
19381        if let Some(prev) = &mut self.prev {
19382            if let Some(header_offset) = &self.header_offset {
19383                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19384            }
19385        }
19386    }
19387}
19388pub struct PushVfinfoAttrs<Prev: Pusher> {
19389    pub(crate) prev: Option<Prev>,
19390    pub(crate) header_offset: Option<usize>,
19391}
19392impl<Prev: Pusher> Pusher for PushVfinfoAttrs<Prev> {
19393    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19394        self.prev.as_mut().unwrap().as_vec_mut()
19395    }
19396    fn as_vec(&self) -> &Vec<u8> {
19397        self.prev.as_ref().unwrap().as_vec()
19398    }
19399}
19400impl<Prev: Pusher> PushVfinfoAttrs<Prev> {
19401    pub fn new(prev: Prev) -> Self {
19402        Self {
19403            prev: Some(prev),
19404            header_offset: None,
19405        }
19406    }
19407    pub fn end_nested(mut self) -> Prev {
19408        let mut prev = self.prev.take().unwrap();
19409        if let Some(header_offset) = &self.header_offset {
19410            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19411        }
19412        prev
19413    }
19414    pub fn push_mac(mut self, value: IflaVfMac) -> Self {
19415        push_header(self.as_vec_mut(), 1u16, value.as_slice().len() as u16);
19416        self.as_vec_mut().extend(value.as_slice());
19417        self
19418    }
19419    pub fn push_vlan(mut self, value: IflaVfVlan) -> Self {
19420        push_header(self.as_vec_mut(), 2u16, value.as_slice().len() as u16);
19421        self.as_vec_mut().extend(value.as_slice());
19422        self
19423    }
19424    pub fn push_tx_rate(mut self, value: IflaVfTxRate) -> Self {
19425        push_header(self.as_vec_mut(), 3u16, value.as_slice().len() as u16);
19426        self.as_vec_mut().extend(value.as_slice());
19427        self
19428    }
19429    pub fn push_spoofchk(mut self, value: IflaVfSpoofchk) -> Self {
19430        push_header(self.as_vec_mut(), 4u16, value.as_slice().len() as u16);
19431        self.as_vec_mut().extend(value.as_slice());
19432        self
19433    }
19434    pub fn push_link_state(mut self, value: IflaVfLinkState) -> Self {
19435        push_header(self.as_vec_mut(), 5u16, value.as_slice().len() as u16);
19436        self.as_vec_mut().extend(value.as_slice());
19437        self
19438    }
19439    pub fn push_rate(mut self, value: IflaVfRate) -> Self {
19440        push_header(self.as_vec_mut(), 6u16, value.as_slice().len() as u16);
19441        self.as_vec_mut().extend(value.as_slice());
19442        self
19443    }
19444    pub fn push_rss_query_en(mut self, value: IflaVfRssQueryEn) -> Self {
19445        push_header(self.as_vec_mut(), 7u16, value.as_slice().len() as u16);
19446        self.as_vec_mut().extend(value.as_slice());
19447        self
19448    }
19449    pub fn nested_stats(mut self) -> PushVfStatsAttrs<Self> {
19450        let header_offset = push_nested_header(self.as_vec_mut(), 8u16);
19451        PushVfStatsAttrs {
19452            prev: Some(self),
19453            header_offset: Some(header_offset),
19454        }
19455    }
19456    pub fn push_trust(mut self, value: IflaVfTrust) -> Self {
19457        push_header(self.as_vec_mut(), 9u16, value.as_slice().len() as u16);
19458        self.as_vec_mut().extend(value.as_slice());
19459        self
19460    }
19461    pub fn push_ib_node_guid(mut self, value: IflaVfGuid) -> Self {
19462        push_header(self.as_vec_mut(), 10u16, value.as_slice().len() as u16);
19463        self.as_vec_mut().extend(value.as_slice());
19464        self
19465    }
19466    pub fn push_ib_port_guid(mut self, value: IflaVfGuid) -> Self {
19467        push_header(self.as_vec_mut(), 11u16, value.as_slice().len() as u16);
19468        self.as_vec_mut().extend(value.as_slice());
19469        self
19470    }
19471    pub fn nested_vlan_list(mut self) -> PushVfVlanAttrs<Self> {
19472        let header_offset = push_nested_header(self.as_vec_mut(), 12u16);
19473        PushVfVlanAttrs {
19474            prev: Some(self),
19475            header_offset: Some(header_offset),
19476        }
19477    }
19478    pub fn push_broadcast(mut self, value: &[u8]) -> Self {
19479        push_header(self.as_vec_mut(), 13u16, value.len() as u16);
19480        self.as_vec_mut().extend(value);
19481        self
19482    }
19483}
19484impl<Prev: Pusher> Drop for PushVfinfoAttrs<Prev> {
19485    fn drop(&mut self) {
19486        if let Some(prev) = &mut self.prev {
19487            if let Some(header_offset) = &self.header_offset {
19488                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19489            }
19490        }
19491    }
19492}
19493pub struct PushVfStatsAttrs<Prev: Pusher> {
19494    pub(crate) prev: Option<Prev>,
19495    pub(crate) header_offset: Option<usize>,
19496}
19497impl<Prev: Pusher> Pusher for PushVfStatsAttrs<Prev> {
19498    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19499        self.prev.as_mut().unwrap().as_vec_mut()
19500    }
19501    fn as_vec(&self) -> &Vec<u8> {
19502        self.prev.as_ref().unwrap().as_vec()
19503    }
19504}
19505impl<Prev: Pusher> PushVfStatsAttrs<Prev> {
19506    pub fn new(prev: Prev) -> Self {
19507        Self {
19508            prev: Some(prev),
19509            header_offset: None,
19510        }
19511    }
19512    pub fn end_nested(mut self) -> Prev {
19513        let mut prev = self.prev.take().unwrap();
19514        if let Some(header_offset) = &self.header_offset {
19515            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19516        }
19517        prev
19518    }
19519    pub fn push_rx_packets(mut self, value: u64) -> Self {
19520        push_header(self.as_vec_mut(), 0u16, 8 as u16);
19521        self.as_vec_mut().extend(value.to_ne_bytes());
19522        self
19523    }
19524    pub fn push_tx_packets(mut self, value: u64) -> Self {
19525        push_header(self.as_vec_mut(), 1u16, 8 as u16);
19526        self.as_vec_mut().extend(value.to_ne_bytes());
19527        self
19528    }
19529    pub fn push_rx_bytes(mut self, value: u64) -> Self {
19530        push_header(self.as_vec_mut(), 2u16, 8 as u16);
19531        self.as_vec_mut().extend(value.to_ne_bytes());
19532        self
19533    }
19534    pub fn push_tx_bytes(mut self, value: u64) -> Self {
19535        push_header(self.as_vec_mut(), 3u16, 8 as u16);
19536        self.as_vec_mut().extend(value.to_ne_bytes());
19537        self
19538    }
19539    pub fn push_broadcast(mut self, value: u64) -> Self {
19540        push_header(self.as_vec_mut(), 4u16, 8 as u16);
19541        self.as_vec_mut().extend(value.to_ne_bytes());
19542        self
19543    }
19544    pub fn push_multicast(mut self, value: u64) -> Self {
19545        push_header(self.as_vec_mut(), 5u16, 8 as u16);
19546        self.as_vec_mut().extend(value.to_ne_bytes());
19547        self
19548    }
19549    pub fn push_pad(mut self, value: &[u8]) -> Self {
19550        push_header(self.as_vec_mut(), 6u16, value.len() as u16);
19551        self.as_vec_mut().extend(value);
19552        self
19553    }
19554    pub fn push_rx_dropped(mut self, value: u64) -> Self {
19555        push_header(self.as_vec_mut(), 7u16, 8 as u16);
19556        self.as_vec_mut().extend(value.to_ne_bytes());
19557        self
19558    }
19559    pub fn push_tx_dropped(mut self, value: u64) -> Self {
19560        push_header(self.as_vec_mut(), 8u16, 8 as u16);
19561        self.as_vec_mut().extend(value.to_ne_bytes());
19562        self
19563    }
19564}
19565impl<Prev: Pusher> Drop for PushVfStatsAttrs<Prev> {
19566    fn drop(&mut self) {
19567        if let Some(prev) = &mut self.prev {
19568            if let Some(header_offset) = &self.header_offset {
19569                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19570            }
19571        }
19572    }
19573}
19574pub struct PushVfVlanAttrs<Prev: Pusher> {
19575    pub(crate) prev: Option<Prev>,
19576    pub(crate) header_offset: Option<usize>,
19577}
19578impl<Prev: Pusher> Pusher for PushVfVlanAttrs<Prev> {
19579    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19580        self.prev.as_mut().unwrap().as_vec_mut()
19581    }
19582    fn as_vec(&self) -> &Vec<u8> {
19583        self.prev.as_ref().unwrap().as_vec()
19584    }
19585}
19586impl<Prev: Pusher> PushVfVlanAttrs<Prev> {
19587    pub fn new(prev: Prev) -> Self {
19588        Self {
19589            prev: Some(prev),
19590            header_offset: None,
19591        }
19592    }
19593    pub fn end_nested(mut self) -> Prev {
19594        let mut prev = self.prev.take().unwrap();
19595        if let Some(header_offset) = &self.header_offset {
19596            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19597        }
19598        prev
19599    }
19600    #[doc = "Attribute may repeat multiple times (treat it as array)"]
19601    pub fn push_info(mut self, value: IflaVfVlanInfo) -> Self {
19602        push_header(self.as_vec_mut(), 1u16, value.as_slice().len() as u16);
19603        self.as_vec_mut().extend(value.as_slice());
19604        self
19605    }
19606}
19607impl<Prev: Pusher> Drop for PushVfVlanAttrs<Prev> {
19608    fn drop(&mut self) {
19609        if let Some(prev) = &mut self.prev {
19610            if let Some(header_offset) = &self.header_offset {
19611                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19612            }
19613        }
19614    }
19615}
19616pub struct PushVfPortsAttrs<Prev: Pusher> {
19617    pub(crate) prev: Option<Prev>,
19618    pub(crate) header_offset: Option<usize>,
19619}
19620impl<Prev: Pusher> Pusher for PushVfPortsAttrs<Prev> {
19621    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19622        self.prev.as_mut().unwrap().as_vec_mut()
19623    }
19624    fn as_vec(&self) -> &Vec<u8> {
19625        self.prev.as_ref().unwrap().as_vec()
19626    }
19627}
19628impl<Prev: Pusher> PushVfPortsAttrs<Prev> {
19629    pub fn new(prev: Prev) -> Self {
19630        Self {
19631            prev: Some(prev),
19632            header_offset: None,
19633        }
19634    }
19635    pub fn end_nested(mut self) -> Prev {
19636        let mut prev = self.prev.take().unwrap();
19637        if let Some(header_offset) = &self.header_offset {
19638            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19639        }
19640        prev
19641    }
19642}
19643impl<Prev: Pusher> Drop for PushVfPortsAttrs<Prev> {
19644    fn drop(&mut self) {
19645        if let Some(prev) = &mut self.prev {
19646            if let Some(header_offset) = &self.header_offset {
19647                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19648            }
19649        }
19650    }
19651}
19652pub struct PushPortSelfAttrs<Prev: Pusher> {
19653    pub(crate) prev: Option<Prev>,
19654    pub(crate) header_offset: Option<usize>,
19655}
19656impl<Prev: Pusher> Pusher for PushPortSelfAttrs<Prev> {
19657    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19658        self.prev.as_mut().unwrap().as_vec_mut()
19659    }
19660    fn as_vec(&self) -> &Vec<u8> {
19661        self.prev.as_ref().unwrap().as_vec()
19662    }
19663}
19664impl<Prev: Pusher> PushPortSelfAttrs<Prev> {
19665    pub fn new(prev: Prev) -> Self {
19666        Self {
19667            prev: Some(prev),
19668            header_offset: None,
19669        }
19670    }
19671    pub fn end_nested(mut self) -> Prev {
19672        let mut prev = self.prev.take().unwrap();
19673        if let Some(header_offset) = &self.header_offset {
19674            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19675        }
19676        prev
19677    }
19678}
19679impl<Prev: Pusher> Drop for PushPortSelfAttrs<Prev> {
19680    fn drop(&mut self) {
19681        if let Some(prev) = &mut self.prev {
19682            if let Some(header_offset) = &self.header_offset {
19683                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19684            }
19685        }
19686    }
19687}
19688pub struct PushLinkinfoAttrs<Prev: Pusher> {
19689    pub(crate) prev: Option<Prev>,
19690    pub(crate) header_offset: Option<usize>,
19691}
19692impl<Prev: Pusher> Pusher for PushLinkinfoAttrs<Prev> {
19693    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19694        self.prev.as_mut().unwrap().as_vec_mut()
19695    }
19696    fn as_vec(&self) -> &Vec<u8> {
19697        self.prev.as_ref().unwrap().as_vec()
19698    }
19699}
19700impl<Prev: Pusher> PushLinkinfoAttrs<Prev> {
19701    pub fn new(prev: Prev) -> Self {
19702        Self {
19703            prev: Some(prev),
19704            header_offset: None,
19705        }
19706    }
19707    pub fn end_nested(mut self) -> Prev {
19708        let mut prev = self.prev.take().unwrap();
19709        if let Some(header_offset) = &self.header_offset {
19710            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19711        }
19712        prev
19713    }
19714    pub fn push_kind(mut self, value: &CStr) -> Self {
19715        push_header(
19716            self.as_vec_mut(),
19717            1u16,
19718            value.to_bytes_with_nul().len() as u16,
19719        );
19720        self.as_vec_mut().extend(value.to_bytes_with_nul());
19721        self
19722    }
19723    pub fn push_kind_bytes(mut self, value: &[u8]) -> Self {
19724        push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
19725        self.as_vec_mut().extend(value);
19726        self.as_vec_mut().push(0);
19727        self
19728    }
19729    #[doc = "Selector attribute `kind` is inserted automatically."]
19730    #[doc = "At most one sub-message attribute is expected per attribute set."]
19731    pub fn nested_data_bond(mut self) -> PushLinkinfoBondAttrs<PushDummy<Prev>> {
19732        self = self.push_kind(c"bond");
19733        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19734        let dummy = PushDummy {
19735            prev: self.prev.take(),
19736            header_offset: self.header_offset.take(),
19737        };
19738        PushLinkinfoBondAttrs {
19739            prev: Some(dummy),
19740            header_offset: Some(new_header_offset),
19741        }
19742    }
19743    #[doc = "Selector attribute `kind` is inserted automatically."]
19744    #[doc = "At most one sub-message attribute is expected per attribute set."]
19745    pub fn nested_data_bridge(mut self) -> PushLinkinfoBridgeAttrs<PushDummy<Prev>> {
19746        self = self.push_kind(c"bridge");
19747        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19748        let dummy = PushDummy {
19749            prev: self.prev.take(),
19750            header_offset: self.header_offset.take(),
19751        };
19752        PushLinkinfoBridgeAttrs {
19753            prev: Some(dummy),
19754            header_offset: Some(new_header_offset),
19755        }
19756    }
19757    #[doc = "Selector attribute `kind` is inserted automatically."]
19758    #[doc = "At most one sub-message attribute is expected per attribute set."]
19759    pub fn nested_data_erspan(mut self) -> PushLinkinfoGreAttrs<PushDummy<Prev>> {
19760        self = self.push_kind(c"erspan");
19761        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19762        let dummy = PushDummy {
19763            prev: self.prev.take(),
19764            header_offset: self.header_offset.take(),
19765        };
19766        PushLinkinfoGreAttrs {
19767            prev: Some(dummy),
19768            header_offset: Some(new_header_offset),
19769        }
19770    }
19771    #[doc = "Selector attribute `kind` is inserted automatically."]
19772    #[doc = "At most one sub-message attribute is expected per attribute set."]
19773    pub fn nested_data_gre(mut self) -> PushLinkinfoGreAttrs<PushDummy<Prev>> {
19774        self = self.push_kind(c"gre");
19775        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19776        let dummy = PushDummy {
19777            prev: self.prev.take(),
19778            header_offset: self.header_offset.take(),
19779        };
19780        PushLinkinfoGreAttrs {
19781            prev: Some(dummy),
19782            header_offset: Some(new_header_offset),
19783        }
19784    }
19785    #[doc = "Selector attribute `kind` is inserted automatically."]
19786    #[doc = "At most one sub-message attribute is expected per attribute set."]
19787    pub fn nested_data_gretap(mut self) -> PushLinkinfoGreAttrs<PushDummy<Prev>> {
19788        self = self.push_kind(c"gretap");
19789        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19790        let dummy = PushDummy {
19791            prev: self.prev.take(),
19792            header_offset: self.header_offset.take(),
19793        };
19794        PushLinkinfoGreAttrs {
19795            prev: Some(dummy),
19796            header_offset: Some(new_header_offset),
19797        }
19798    }
19799    #[doc = "Selector attribute `kind` is inserted automatically."]
19800    #[doc = "At most one sub-message attribute is expected per attribute set."]
19801    pub fn nested_data_ip6gre(mut self) -> PushLinkinfoGre6Attrs<PushDummy<Prev>> {
19802        self = self.push_kind(c"ip6gre");
19803        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19804        let dummy = PushDummy {
19805            prev: self.prev.take(),
19806            header_offset: self.header_offset.take(),
19807        };
19808        PushLinkinfoGre6Attrs {
19809            prev: Some(dummy),
19810            header_offset: Some(new_header_offset),
19811        }
19812    }
19813    #[doc = "Selector attribute `kind` is inserted automatically."]
19814    #[doc = "At most one sub-message attribute is expected per attribute set."]
19815    pub fn nested_data_geneve(mut self) -> PushLinkinfoGeneveAttrs<PushDummy<Prev>> {
19816        self = self.push_kind(c"geneve");
19817        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19818        let dummy = PushDummy {
19819            prev: self.prev.take(),
19820            header_offset: self.header_offset.take(),
19821        };
19822        PushLinkinfoGeneveAttrs {
19823            prev: Some(dummy),
19824            header_offset: Some(new_header_offset),
19825        }
19826    }
19827    #[doc = "Selector attribute `kind` is inserted automatically."]
19828    #[doc = "At most one sub-message attribute is expected per attribute set."]
19829    pub fn nested_data_hsr(mut self) -> PushLinkinfoHsrAttrs<PushDummy<Prev>> {
19830        self = self.push_kind(c"hsr");
19831        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19832        let dummy = PushDummy {
19833            prev: self.prev.take(),
19834            header_offset: self.header_offset.take(),
19835        };
19836        PushLinkinfoHsrAttrs {
19837            prev: Some(dummy),
19838            header_offset: Some(new_header_offset),
19839        }
19840    }
19841    #[doc = "Selector attribute `kind` is inserted automatically."]
19842    #[doc = "At most one sub-message attribute is expected per attribute set."]
19843    pub fn nested_data_ipip(mut self) -> PushLinkinfoIptunAttrs<PushDummy<Prev>> {
19844        self = self.push_kind(c"ipip");
19845        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19846        let dummy = PushDummy {
19847            prev: self.prev.take(),
19848            header_offset: self.header_offset.take(),
19849        };
19850        PushLinkinfoIptunAttrs {
19851            prev: Some(dummy),
19852            header_offset: Some(new_header_offset),
19853        }
19854    }
19855    #[doc = "Selector attribute `kind` is inserted automatically."]
19856    #[doc = "At most one sub-message attribute is expected per attribute set."]
19857    pub fn nested_data_ip6tnl(mut self) -> PushLinkinfoIp6tnlAttrs<PushDummy<Prev>> {
19858        self = self.push_kind(c"ip6tnl");
19859        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19860        let dummy = PushDummy {
19861            prev: self.prev.take(),
19862            header_offset: self.header_offset.take(),
19863        };
19864        PushLinkinfoIp6tnlAttrs {
19865            prev: Some(dummy),
19866            header_offset: Some(new_header_offset),
19867        }
19868    }
19869    #[doc = "Selector attribute `kind` is inserted automatically."]
19870    #[doc = "At most one sub-message attribute is expected per attribute set."]
19871    pub fn nested_data_sit(mut self) -> PushLinkinfoIptunAttrs<PushDummy<Prev>> {
19872        self = self.push_kind(c"sit");
19873        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19874        let dummy = PushDummy {
19875            prev: self.prev.take(),
19876            header_offset: self.header_offset.take(),
19877        };
19878        PushLinkinfoIptunAttrs {
19879            prev: Some(dummy),
19880            header_offset: Some(new_header_offset),
19881        }
19882    }
19883    #[doc = "Selector attribute `kind` is inserted automatically."]
19884    #[doc = "At most one sub-message attribute is expected per attribute set."]
19885    pub fn nested_data_tun(mut self) -> PushLinkinfoTunAttrs<PushDummy<Prev>> {
19886        self = self.push_kind(c"tun");
19887        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19888        let dummy = PushDummy {
19889            prev: self.prev.take(),
19890            header_offset: self.header_offset.take(),
19891        };
19892        PushLinkinfoTunAttrs {
19893            prev: Some(dummy),
19894            header_offset: Some(new_header_offset),
19895        }
19896    }
19897    #[doc = "Selector attribute `kind` is inserted automatically."]
19898    #[doc = "At most one sub-message attribute is expected per attribute set."]
19899    pub fn nested_data_vlan(mut self) -> PushLinkinfoVlanAttrs<PushDummy<Prev>> {
19900        self = self.push_kind(c"vlan");
19901        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19902        let dummy = PushDummy {
19903            prev: self.prev.take(),
19904            header_offset: self.header_offset.take(),
19905        };
19906        PushLinkinfoVlanAttrs {
19907            prev: Some(dummy),
19908            header_offset: Some(new_header_offset),
19909        }
19910    }
19911    #[doc = "Selector attribute `kind` is inserted automatically."]
19912    #[doc = "At most one sub-message attribute is expected per attribute set."]
19913    pub fn nested_data_vrf(mut self) -> PushLinkinfoVrfAttrs<PushDummy<Prev>> {
19914        self = self.push_kind(c"vrf");
19915        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19916        let dummy = PushDummy {
19917            prev: self.prev.take(),
19918            header_offset: self.header_offset.take(),
19919        };
19920        PushLinkinfoVrfAttrs {
19921            prev: Some(dummy),
19922            header_offset: Some(new_header_offset),
19923        }
19924    }
19925    #[doc = "Selector attribute `kind` is inserted automatically."]
19926    #[doc = "At most one sub-message attribute is expected per attribute set."]
19927    pub fn nested_data_vti(mut self) -> PushLinkinfoVtiAttrs<PushDummy<Prev>> {
19928        self = self.push_kind(c"vti");
19929        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19930        let dummy = PushDummy {
19931            prev: self.prev.take(),
19932            header_offset: self.header_offset.take(),
19933        };
19934        PushLinkinfoVtiAttrs {
19935            prev: Some(dummy),
19936            header_offset: Some(new_header_offset),
19937        }
19938    }
19939    #[doc = "Selector attribute `kind` is inserted automatically."]
19940    #[doc = "At most one sub-message attribute is expected per attribute set."]
19941    pub fn nested_data_vti6(mut self) -> PushLinkinfoVti6Attrs<PushDummy<Prev>> {
19942        self = self.push_kind(c"vti6");
19943        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19944        let dummy = PushDummy {
19945            prev: self.prev.take(),
19946            header_offset: self.header_offset.take(),
19947        };
19948        PushLinkinfoVti6Attrs {
19949            prev: Some(dummy),
19950            header_offset: Some(new_header_offset),
19951        }
19952    }
19953    #[doc = "Selector attribute `kind` is inserted automatically."]
19954    #[doc = "At most one sub-message attribute is expected per attribute set."]
19955    pub fn nested_data_netkit(mut self) -> PushLinkinfoNetkitAttrs<PushDummy<Prev>> {
19956        self = self.push_kind(c"netkit");
19957        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19958        let dummy = PushDummy {
19959            prev: self.prev.take(),
19960            header_offset: self.header_offset.take(),
19961        };
19962        PushLinkinfoNetkitAttrs {
19963            prev: Some(dummy),
19964            header_offset: Some(new_header_offset),
19965        }
19966    }
19967    #[doc = "Selector attribute `kind` is inserted automatically."]
19968    #[doc = "At most one sub-message attribute is expected per attribute set."]
19969    pub fn nested_data_ovpn(mut self) -> PushLinkinfoOvpnAttrs<PushDummy<Prev>> {
19970        self = self.push_kind(c"ovpn");
19971        let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19972        let dummy = PushDummy {
19973            prev: self.prev.take(),
19974            header_offset: self.header_offset.take(),
19975        };
19976        PushLinkinfoOvpnAttrs {
19977            prev: Some(dummy),
19978            header_offset: Some(new_header_offset),
19979        }
19980    }
19981    pub fn push_xstats(mut self, value: &[u8]) -> Self {
19982        push_header(self.as_vec_mut(), 3u16, value.len() as u16);
19983        self.as_vec_mut().extend(value);
19984        self
19985    }
19986    pub fn push_slave_kind(mut self, value: &CStr) -> Self {
19987        push_header(
19988            self.as_vec_mut(),
19989            4u16,
19990            value.to_bytes_with_nul().len() as u16,
19991        );
19992        self.as_vec_mut().extend(value.to_bytes_with_nul());
19993        self
19994    }
19995    pub fn push_slave_kind_bytes(mut self, value: &[u8]) -> Self {
19996        push_header(self.as_vec_mut(), 4u16, (value.len() + 1) as u16);
19997        self.as_vec_mut().extend(value);
19998        self.as_vec_mut().push(0);
19999        self
20000    }
20001    #[doc = "Selector attribute `slave-kind` is inserted automatically."]
20002    #[doc = "At most one sub-message attribute is expected per attribute set."]
20003    pub fn nested_slave_data_bridge(mut self) -> PushLinkinfoBrportAttrs<PushDummy<Prev>> {
20004        self = self.push_slave_kind(c"bridge");
20005        let new_header_offset = push_nested_header(self.as_vec_mut(), 5u16);
20006        let dummy = PushDummy {
20007            prev: self.prev.take(),
20008            header_offset: self.header_offset.take(),
20009        };
20010        PushLinkinfoBrportAttrs {
20011            prev: Some(dummy),
20012            header_offset: Some(new_header_offset),
20013        }
20014    }
20015    #[doc = "Selector attribute `slave-kind` is inserted automatically."]
20016    #[doc = "At most one sub-message attribute is expected per attribute set."]
20017    pub fn nested_slave_data_bond(mut self) -> PushBondSlaveAttrs<PushDummy<Prev>> {
20018        self = self.push_slave_kind(c"bond");
20019        let new_header_offset = push_nested_header(self.as_vec_mut(), 5u16);
20020        let dummy = PushDummy {
20021            prev: self.prev.take(),
20022            header_offset: self.header_offset.take(),
20023        };
20024        PushBondSlaveAttrs {
20025            prev: Some(dummy),
20026            header_offset: Some(new_header_offset),
20027        }
20028    }
20029}
20030impl<Prev: Pusher> Drop for PushLinkinfoAttrs<Prev> {
20031    fn drop(&mut self) {
20032        if let Some(prev) = &mut self.prev {
20033            if let Some(header_offset) = &self.header_offset {
20034                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20035            }
20036        }
20037    }
20038}
20039pub struct PushLinkinfoBondAttrs<Prev: Pusher> {
20040    pub(crate) prev: Option<Prev>,
20041    pub(crate) header_offset: Option<usize>,
20042}
20043impl<Prev: Pusher> Pusher for PushLinkinfoBondAttrs<Prev> {
20044    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20045        self.prev.as_mut().unwrap().as_vec_mut()
20046    }
20047    fn as_vec(&self) -> &Vec<u8> {
20048        self.prev.as_ref().unwrap().as_vec()
20049    }
20050}
20051pub struct PushArrayU32<Prev: Pusher> {
20052    pub(crate) prev: Option<Prev>,
20053    pub(crate) header_offset: Option<usize>,
20054    pub(crate) counter: u16,
20055}
20056impl<Prev: Pusher> Pusher for PushArrayU32<Prev> {
20057    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20058        self.prev.as_mut().unwrap().as_vec_mut()
20059    }
20060    fn as_vec(&self) -> &Vec<u8> {
20061        self.prev.as_ref().unwrap().as_vec()
20062    }
20063}
20064impl<Prev: Pusher> PushArrayU32<Prev> {
20065    pub fn new(prev: Prev) -> Self {
20066        Self {
20067            prev: Some(prev),
20068            header_offset: None,
20069            counter: 0,
20070        }
20071    }
20072    pub fn end_array(mut self) -> Prev {
20073        let mut prev = self.prev.take().unwrap();
20074        if let Some(header_offset) = &self.header_offset {
20075            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20076        }
20077        prev
20078    }
20079    pub fn entry(mut self, value: std::net::Ipv4Addr) -> Self {
20080        let index = self.counter;
20081        self.counter += 1;
20082        push_header(self.as_vec_mut(), index, 4 as u16);
20083        self.as_vec_mut().extend(&value.to_bits().to_be_bytes());
20084        self
20085    }
20086}
20087impl<Prev: Pusher> Drop for PushArrayU32<Prev> {
20088    fn drop(&mut self) {
20089        if let Some(prev) = &mut self.prev {
20090            if let Some(header_offset) = &self.header_offset {
20091                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20092            }
20093        }
20094    }
20095}
20096pub struct PushArrayBinary<Prev: Pusher> {
20097    pub(crate) prev: Option<Prev>,
20098    pub(crate) header_offset: Option<usize>,
20099    pub(crate) counter: u16,
20100}
20101impl<Prev: Pusher> Pusher for PushArrayBinary<Prev> {
20102    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20103        self.prev.as_mut().unwrap().as_vec_mut()
20104    }
20105    fn as_vec(&self) -> &Vec<u8> {
20106        self.prev.as_ref().unwrap().as_vec()
20107    }
20108}
20109impl<Prev: Pusher> PushArrayBinary<Prev> {
20110    pub fn new(prev: Prev) -> Self {
20111        Self {
20112            prev: Some(prev),
20113            header_offset: None,
20114            counter: 0,
20115        }
20116    }
20117    pub fn end_array(mut self) -> Prev {
20118        let mut prev = self.prev.take().unwrap();
20119        if let Some(header_offset) = &self.header_offset {
20120            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20121        }
20122        prev
20123    }
20124    pub fn entry(mut self, value: &[u8]) -> Self {
20125        let index = self.counter;
20126        self.counter += 1;
20127        push_header(self.as_vec_mut(), index, value.len() as u16);
20128        self.as_vec_mut().extend(value);
20129        self
20130    }
20131}
20132impl<Prev: Pusher> Drop for PushArrayBinary<Prev> {
20133    fn drop(&mut self) {
20134        if let Some(prev) = &mut self.prev {
20135            if let Some(header_offset) = &self.header_offset {
20136                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20137            }
20138        }
20139    }
20140}
20141impl<Prev: Pusher> PushLinkinfoBondAttrs<Prev> {
20142    pub fn new(prev: Prev) -> Self {
20143        Self {
20144            prev: Some(prev),
20145            header_offset: None,
20146        }
20147    }
20148    pub fn end_nested(mut self) -> Prev {
20149        let mut prev = self.prev.take().unwrap();
20150        if let Some(header_offset) = &self.header_offset {
20151            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20152        }
20153        prev
20154    }
20155    pub fn push_mode(mut self, value: u8) -> Self {
20156        push_header(self.as_vec_mut(), 1u16, 1 as u16);
20157        self.as_vec_mut().extend(value.to_ne_bytes());
20158        self
20159    }
20160    pub fn push_active_slave(mut self, value: u32) -> Self {
20161        push_header(self.as_vec_mut(), 2u16, 4 as u16);
20162        self.as_vec_mut().extend(value.to_ne_bytes());
20163        self
20164    }
20165    pub fn push_miimon(mut self, value: u32) -> Self {
20166        push_header(self.as_vec_mut(), 3u16, 4 as u16);
20167        self.as_vec_mut().extend(value.to_ne_bytes());
20168        self
20169    }
20170    pub fn push_updelay(mut self, value: u32) -> Self {
20171        push_header(self.as_vec_mut(), 4u16, 4 as u16);
20172        self.as_vec_mut().extend(value.to_ne_bytes());
20173        self
20174    }
20175    pub fn push_downdelay(mut self, value: u32) -> Self {
20176        push_header(self.as_vec_mut(), 5u16, 4 as u16);
20177        self.as_vec_mut().extend(value.to_ne_bytes());
20178        self
20179    }
20180    pub fn push_use_carrier(mut self, value: u8) -> Self {
20181        push_header(self.as_vec_mut(), 6u16, 1 as u16);
20182        self.as_vec_mut().extend(value.to_ne_bytes());
20183        self
20184    }
20185    pub fn push_arp_interval(mut self, value: u32) -> Self {
20186        push_header(self.as_vec_mut(), 7u16, 4 as u16);
20187        self.as_vec_mut().extend(value.to_ne_bytes());
20188        self
20189    }
20190    pub fn array_arp_ip_target(mut self) -> PushArrayU32<Self> {
20191        let header_offset = push_nested_header(self.as_vec_mut(), 8u16);
20192        PushArrayU32 {
20193            prev: Some(self),
20194            header_offset: Some(header_offset),
20195            counter: 0,
20196        }
20197    }
20198    pub fn push_arp_validate(mut self, value: u32) -> Self {
20199        push_header(self.as_vec_mut(), 9u16, 4 as u16);
20200        self.as_vec_mut().extend(value.to_ne_bytes());
20201        self
20202    }
20203    pub fn push_arp_all_targets(mut self, value: u32) -> Self {
20204        push_header(self.as_vec_mut(), 10u16, 4 as u16);
20205        self.as_vec_mut().extend(value.to_ne_bytes());
20206        self
20207    }
20208    pub fn push_primary(mut self, value: u32) -> Self {
20209        push_header(self.as_vec_mut(), 11u16, 4 as u16);
20210        self.as_vec_mut().extend(value.to_ne_bytes());
20211        self
20212    }
20213    pub fn push_primary_reselect(mut self, value: u8) -> Self {
20214        push_header(self.as_vec_mut(), 12u16, 1 as u16);
20215        self.as_vec_mut().extend(value.to_ne_bytes());
20216        self
20217    }
20218    pub fn push_fail_over_mac(mut self, value: u8) -> Self {
20219        push_header(self.as_vec_mut(), 13u16, 1 as u16);
20220        self.as_vec_mut().extend(value.to_ne_bytes());
20221        self
20222    }
20223    pub fn push_xmit_hash_policy(mut self, value: u8) -> Self {
20224        push_header(self.as_vec_mut(), 14u16, 1 as u16);
20225        self.as_vec_mut().extend(value.to_ne_bytes());
20226        self
20227    }
20228    pub fn push_resend_igmp(mut self, value: u32) -> Self {
20229        push_header(self.as_vec_mut(), 15u16, 4 as u16);
20230        self.as_vec_mut().extend(value.to_ne_bytes());
20231        self
20232    }
20233    pub fn push_num_peer_notif(mut self, value: u8) -> Self {
20234        push_header(self.as_vec_mut(), 16u16, 1 as u16);
20235        self.as_vec_mut().extend(value.to_ne_bytes());
20236        self
20237    }
20238    pub fn push_all_slaves_active(mut self, value: u8) -> Self {
20239        push_header(self.as_vec_mut(), 17u16, 1 as u16);
20240        self.as_vec_mut().extend(value.to_ne_bytes());
20241        self
20242    }
20243    pub fn push_min_links(mut self, value: u32) -> Self {
20244        push_header(self.as_vec_mut(), 18u16, 4 as u16);
20245        self.as_vec_mut().extend(value.to_ne_bytes());
20246        self
20247    }
20248    pub fn push_lp_interval(mut self, value: u32) -> Self {
20249        push_header(self.as_vec_mut(), 19u16, 4 as u16);
20250        self.as_vec_mut().extend(value.to_ne_bytes());
20251        self
20252    }
20253    pub fn push_packets_per_slave(mut self, value: u32) -> Self {
20254        push_header(self.as_vec_mut(), 20u16, 4 as u16);
20255        self.as_vec_mut().extend(value.to_ne_bytes());
20256        self
20257    }
20258    pub fn push_ad_lacp_rate(mut self, value: u8) -> Self {
20259        push_header(self.as_vec_mut(), 21u16, 1 as u16);
20260        self.as_vec_mut().extend(value.to_ne_bytes());
20261        self
20262    }
20263    pub fn push_ad_select(mut self, value: u8) -> Self {
20264        push_header(self.as_vec_mut(), 22u16, 1 as u16);
20265        self.as_vec_mut().extend(value.to_ne_bytes());
20266        self
20267    }
20268    pub fn nested_ad_info(mut self) -> PushBondAdInfoAttrs<Self> {
20269        let header_offset = push_nested_header(self.as_vec_mut(), 23u16);
20270        PushBondAdInfoAttrs {
20271            prev: Some(self),
20272            header_offset: Some(header_offset),
20273        }
20274    }
20275    pub fn push_ad_actor_sys_prio(mut self, value: u16) -> Self {
20276        push_header(self.as_vec_mut(), 24u16, 2 as u16);
20277        self.as_vec_mut().extend(value.to_ne_bytes());
20278        self
20279    }
20280    pub fn push_ad_user_port_key(mut self, value: u16) -> Self {
20281        push_header(self.as_vec_mut(), 25u16, 2 as u16);
20282        self.as_vec_mut().extend(value.to_ne_bytes());
20283        self
20284    }
20285    pub fn push_ad_actor_system(mut self, value: &[u8]) -> Self {
20286        push_header(self.as_vec_mut(), 26u16, value.len() as u16);
20287        self.as_vec_mut().extend(value);
20288        self
20289    }
20290    pub fn push_tlb_dynamic_lb(mut self, value: u8) -> Self {
20291        push_header(self.as_vec_mut(), 27u16, 1 as u16);
20292        self.as_vec_mut().extend(value.to_ne_bytes());
20293        self
20294    }
20295    pub fn push_peer_notif_delay(mut self, value: u32) -> Self {
20296        push_header(self.as_vec_mut(), 28u16, 4 as u16);
20297        self.as_vec_mut().extend(value.to_ne_bytes());
20298        self
20299    }
20300    pub fn push_ad_lacp_active(mut self, value: u8) -> Self {
20301        push_header(self.as_vec_mut(), 29u16, 1 as u16);
20302        self.as_vec_mut().extend(value.to_ne_bytes());
20303        self
20304    }
20305    pub fn push_missed_max(mut self, value: u8) -> Self {
20306        push_header(self.as_vec_mut(), 30u16, 1 as u16);
20307        self.as_vec_mut().extend(value.to_ne_bytes());
20308        self
20309    }
20310    pub fn array_ns_ip6_target(mut self) -> PushArrayBinary<Self> {
20311        let header_offset = push_nested_header(self.as_vec_mut(), 31u16);
20312        PushArrayBinary {
20313            prev: Some(self),
20314            header_offset: Some(header_offset),
20315            counter: 0,
20316        }
20317    }
20318    pub fn push_coupled_control(mut self, value: u8) -> Self {
20319        push_header(self.as_vec_mut(), 32u16, 1 as u16);
20320        self.as_vec_mut().extend(value.to_ne_bytes());
20321        self
20322    }
20323    pub fn push_broadcast_neigh(mut self, value: u8) -> Self {
20324        push_header(self.as_vec_mut(), 33u16, 1 as u16);
20325        self.as_vec_mut().extend(value.to_ne_bytes());
20326        self
20327    }
20328    pub fn push_lacp_strict(mut self, value: u8) -> Self {
20329        push_header(self.as_vec_mut(), 34u16, 1 as u16);
20330        self.as_vec_mut().extend(value.to_ne_bytes());
20331        self
20332    }
20333}
20334impl<Prev: Pusher> Drop for PushLinkinfoBondAttrs<Prev> {
20335    fn drop(&mut self) {
20336        if let Some(prev) = &mut self.prev {
20337            if let Some(header_offset) = &self.header_offset {
20338                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20339            }
20340        }
20341    }
20342}
20343pub struct PushBondAdInfoAttrs<Prev: Pusher> {
20344    pub(crate) prev: Option<Prev>,
20345    pub(crate) header_offset: Option<usize>,
20346}
20347impl<Prev: Pusher> Pusher for PushBondAdInfoAttrs<Prev> {
20348    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20349        self.prev.as_mut().unwrap().as_vec_mut()
20350    }
20351    fn as_vec(&self) -> &Vec<u8> {
20352        self.prev.as_ref().unwrap().as_vec()
20353    }
20354}
20355impl<Prev: Pusher> PushBondAdInfoAttrs<Prev> {
20356    pub fn new(prev: Prev) -> Self {
20357        Self {
20358            prev: Some(prev),
20359            header_offset: None,
20360        }
20361    }
20362    pub fn end_nested(mut self) -> Prev {
20363        let mut prev = self.prev.take().unwrap();
20364        if let Some(header_offset) = &self.header_offset {
20365            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20366        }
20367        prev
20368    }
20369    pub fn push_aggregator(mut self, value: u16) -> Self {
20370        push_header(self.as_vec_mut(), 1u16, 2 as u16);
20371        self.as_vec_mut().extend(value.to_ne_bytes());
20372        self
20373    }
20374    pub fn push_num_ports(mut self, value: u16) -> Self {
20375        push_header(self.as_vec_mut(), 2u16, 2 as u16);
20376        self.as_vec_mut().extend(value.to_ne_bytes());
20377        self
20378    }
20379    pub fn push_actor_key(mut self, value: u16) -> Self {
20380        push_header(self.as_vec_mut(), 3u16, 2 as u16);
20381        self.as_vec_mut().extend(value.to_ne_bytes());
20382        self
20383    }
20384    pub fn push_partner_key(mut self, value: u16) -> Self {
20385        push_header(self.as_vec_mut(), 4u16, 2 as u16);
20386        self.as_vec_mut().extend(value.to_ne_bytes());
20387        self
20388    }
20389    pub fn push_partner_mac(mut self, value: &[u8]) -> Self {
20390        push_header(self.as_vec_mut(), 5u16, value.len() as u16);
20391        self.as_vec_mut().extend(value);
20392        self
20393    }
20394}
20395impl<Prev: Pusher> Drop for PushBondAdInfoAttrs<Prev> {
20396    fn drop(&mut self) {
20397        if let Some(prev) = &mut self.prev {
20398            if let Some(header_offset) = &self.header_offset {
20399                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20400            }
20401        }
20402    }
20403}
20404pub struct PushBondSlaveAttrs<Prev: Pusher> {
20405    pub(crate) prev: Option<Prev>,
20406    pub(crate) header_offset: Option<usize>,
20407}
20408impl<Prev: Pusher> Pusher for PushBondSlaveAttrs<Prev> {
20409    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20410        self.prev.as_mut().unwrap().as_vec_mut()
20411    }
20412    fn as_vec(&self) -> &Vec<u8> {
20413        self.prev.as_ref().unwrap().as_vec()
20414    }
20415}
20416impl<Prev: Pusher> PushBondSlaveAttrs<Prev> {
20417    pub fn new(prev: Prev) -> Self {
20418        Self {
20419            prev: Some(prev),
20420            header_offset: None,
20421        }
20422    }
20423    pub fn end_nested(mut self) -> Prev {
20424        let mut prev = self.prev.take().unwrap();
20425        if let Some(header_offset) = &self.header_offset {
20426            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20427        }
20428        prev
20429    }
20430    pub fn push_state(mut self, value: u8) -> Self {
20431        push_header(self.as_vec_mut(), 1u16, 1 as u16);
20432        self.as_vec_mut().extend(value.to_ne_bytes());
20433        self
20434    }
20435    pub fn push_mii_status(mut self, value: u8) -> Self {
20436        push_header(self.as_vec_mut(), 2u16, 1 as u16);
20437        self.as_vec_mut().extend(value.to_ne_bytes());
20438        self
20439    }
20440    pub fn push_link_failure_count(mut self, value: u32) -> Self {
20441        push_header(self.as_vec_mut(), 3u16, 4 as u16);
20442        self.as_vec_mut().extend(value.to_ne_bytes());
20443        self
20444    }
20445    pub fn push_perm_hwaddr(mut self, value: &[u8]) -> Self {
20446        push_header(self.as_vec_mut(), 4u16, value.len() as u16);
20447        self.as_vec_mut().extend(value);
20448        self
20449    }
20450    pub fn push_queue_id(mut self, value: u16) -> Self {
20451        push_header(self.as_vec_mut(), 5u16, 2 as u16);
20452        self.as_vec_mut().extend(value.to_ne_bytes());
20453        self
20454    }
20455    pub fn push_ad_aggregator_id(mut self, value: u16) -> Self {
20456        push_header(self.as_vec_mut(), 6u16, 2 as u16);
20457        self.as_vec_mut().extend(value.to_ne_bytes());
20458        self
20459    }
20460    pub fn push_ad_actor_oper_port_state(mut self, value: u8) -> Self {
20461        push_header(self.as_vec_mut(), 7u16, 1 as u16);
20462        self.as_vec_mut().extend(value.to_ne_bytes());
20463        self
20464    }
20465    pub fn push_ad_partner_oper_port_state(mut self, value: u16) -> Self {
20466        push_header(self.as_vec_mut(), 8u16, 2 as u16);
20467        self.as_vec_mut().extend(value.to_ne_bytes());
20468        self
20469    }
20470    pub fn push_prio(mut self, value: u32) -> Self {
20471        push_header(self.as_vec_mut(), 9u16, 4 as u16);
20472        self.as_vec_mut().extend(value.to_ne_bytes());
20473        self
20474    }
20475}
20476impl<Prev: Pusher> Drop for PushBondSlaveAttrs<Prev> {
20477    fn drop(&mut self) {
20478        if let Some(prev) = &mut self.prev {
20479            if let Some(header_offset) = &self.header_offset {
20480                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20481            }
20482        }
20483    }
20484}
20485pub struct PushLinkinfoBridgeAttrs<Prev: Pusher> {
20486    pub(crate) prev: Option<Prev>,
20487    pub(crate) header_offset: Option<usize>,
20488}
20489impl<Prev: Pusher> Pusher for PushLinkinfoBridgeAttrs<Prev> {
20490    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20491        self.prev.as_mut().unwrap().as_vec_mut()
20492    }
20493    fn as_vec(&self) -> &Vec<u8> {
20494        self.prev.as_ref().unwrap().as_vec()
20495    }
20496}
20497impl<Prev: Pusher> PushLinkinfoBridgeAttrs<Prev> {
20498    pub fn new(prev: Prev) -> Self {
20499        Self {
20500            prev: Some(prev),
20501            header_offset: None,
20502        }
20503    }
20504    pub fn end_nested(mut self) -> Prev {
20505        let mut prev = self.prev.take().unwrap();
20506        if let Some(header_offset) = &self.header_offset {
20507            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20508        }
20509        prev
20510    }
20511    pub fn push_forward_delay(mut self, value: u32) -> Self {
20512        push_header(self.as_vec_mut(), 1u16, 4 as u16);
20513        self.as_vec_mut().extend(value.to_ne_bytes());
20514        self
20515    }
20516    pub fn push_hello_time(mut self, value: u32) -> Self {
20517        push_header(self.as_vec_mut(), 2u16, 4 as u16);
20518        self.as_vec_mut().extend(value.to_ne_bytes());
20519        self
20520    }
20521    pub fn push_max_age(mut self, value: u32) -> Self {
20522        push_header(self.as_vec_mut(), 3u16, 4 as u16);
20523        self.as_vec_mut().extend(value.to_ne_bytes());
20524        self
20525    }
20526    pub fn push_ageing_time(mut self, value: u32) -> Self {
20527        push_header(self.as_vec_mut(), 4u16, 4 as u16);
20528        self.as_vec_mut().extend(value.to_ne_bytes());
20529        self
20530    }
20531    pub fn push_stp_state(mut self, value: u32) -> Self {
20532        push_header(self.as_vec_mut(), 5u16, 4 as u16);
20533        self.as_vec_mut().extend(value.to_ne_bytes());
20534        self
20535    }
20536    pub fn push_priority(mut self, value: u16) -> Self {
20537        push_header(self.as_vec_mut(), 6u16, 2 as u16);
20538        self.as_vec_mut().extend(value.to_ne_bytes());
20539        self
20540    }
20541    pub fn push_vlan_filtering(mut self, value: u8) -> Self {
20542        push_header(self.as_vec_mut(), 7u16, 1 as u16);
20543        self.as_vec_mut().extend(value.to_ne_bytes());
20544        self
20545    }
20546    pub fn push_vlan_protocol(mut self, value: u16) -> Self {
20547        push_header(self.as_vec_mut(), 8u16, 2 as u16);
20548        self.as_vec_mut().extend(value.to_ne_bytes());
20549        self
20550    }
20551    pub fn push_group_fwd_mask(mut self, value: u16) -> Self {
20552        push_header(self.as_vec_mut(), 9u16, 2 as u16);
20553        self.as_vec_mut().extend(value.to_ne_bytes());
20554        self
20555    }
20556    pub fn push_root_id(mut self, value: IflaBridgeId) -> Self {
20557        push_header(self.as_vec_mut(), 10u16, value.as_slice().len() as u16);
20558        self.as_vec_mut().extend(value.as_slice());
20559        self
20560    }
20561    pub fn push_bridge_id(mut self, value: IflaBridgeId) -> Self {
20562        push_header(self.as_vec_mut(), 11u16, value.as_slice().len() as u16);
20563        self.as_vec_mut().extend(value.as_slice());
20564        self
20565    }
20566    pub fn push_root_port(mut self, value: u16) -> Self {
20567        push_header(self.as_vec_mut(), 12u16, 2 as u16);
20568        self.as_vec_mut().extend(value.to_ne_bytes());
20569        self
20570    }
20571    pub fn push_root_path_cost(mut self, value: u32) -> Self {
20572        push_header(self.as_vec_mut(), 13u16, 4 as u16);
20573        self.as_vec_mut().extend(value.to_ne_bytes());
20574        self
20575    }
20576    pub fn push_topology_change(mut self, value: u8) -> Self {
20577        push_header(self.as_vec_mut(), 14u16, 1 as u16);
20578        self.as_vec_mut().extend(value.to_ne_bytes());
20579        self
20580    }
20581    pub fn push_topology_change_detected(mut self, value: u8) -> Self {
20582        push_header(self.as_vec_mut(), 15u16, 1 as u16);
20583        self.as_vec_mut().extend(value.to_ne_bytes());
20584        self
20585    }
20586    pub fn push_hello_timer(mut self, value: u64) -> Self {
20587        push_header(self.as_vec_mut(), 16u16, 8 as u16);
20588        self.as_vec_mut().extend(value.to_ne_bytes());
20589        self
20590    }
20591    pub fn push_tcn_timer(mut self, value: u64) -> Self {
20592        push_header(self.as_vec_mut(), 17u16, 8 as u16);
20593        self.as_vec_mut().extend(value.to_ne_bytes());
20594        self
20595    }
20596    pub fn push_topology_change_timer(mut self, value: u64) -> Self {
20597        push_header(self.as_vec_mut(), 18u16, 8 as u16);
20598        self.as_vec_mut().extend(value.to_ne_bytes());
20599        self
20600    }
20601    pub fn push_gc_timer(mut self, value: u64) -> Self {
20602        push_header(self.as_vec_mut(), 19u16, 8 as u16);
20603        self.as_vec_mut().extend(value.to_ne_bytes());
20604        self
20605    }
20606    pub fn push_group_addr(mut self, value: &[u8]) -> Self {
20607        push_header(self.as_vec_mut(), 20u16, value.len() as u16);
20608        self.as_vec_mut().extend(value);
20609        self
20610    }
20611    pub fn push_fdb_flush(mut self, value: &[u8]) -> Self {
20612        push_header(self.as_vec_mut(), 21u16, value.len() as u16);
20613        self.as_vec_mut().extend(value);
20614        self
20615    }
20616    pub fn push_mcast_router(mut self, value: u8) -> Self {
20617        push_header(self.as_vec_mut(), 22u16, 1 as u16);
20618        self.as_vec_mut().extend(value.to_ne_bytes());
20619        self
20620    }
20621    pub fn push_mcast_snooping(mut self, value: u8) -> Self {
20622        push_header(self.as_vec_mut(), 23u16, 1 as u16);
20623        self.as_vec_mut().extend(value.to_ne_bytes());
20624        self
20625    }
20626    pub fn push_mcast_query_use_ifaddr(mut self, value: u8) -> Self {
20627        push_header(self.as_vec_mut(), 24u16, 1 as u16);
20628        self.as_vec_mut().extend(value.to_ne_bytes());
20629        self
20630    }
20631    pub fn push_mcast_querier(mut self, value: u8) -> Self {
20632        push_header(self.as_vec_mut(), 25u16, 1 as u16);
20633        self.as_vec_mut().extend(value.to_ne_bytes());
20634        self
20635    }
20636    pub fn push_mcast_hash_elasticity(mut self, value: u32) -> Self {
20637        push_header(self.as_vec_mut(), 26u16, 4 as u16);
20638        self.as_vec_mut().extend(value.to_ne_bytes());
20639        self
20640    }
20641    pub fn push_mcast_hash_max(mut self, value: u32) -> Self {
20642        push_header(self.as_vec_mut(), 27u16, 4 as u16);
20643        self.as_vec_mut().extend(value.to_ne_bytes());
20644        self
20645    }
20646    pub fn push_mcast_last_member_cnt(mut self, value: u32) -> Self {
20647        push_header(self.as_vec_mut(), 28u16, 4 as u16);
20648        self.as_vec_mut().extend(value.to_ne_bytes());
20649        self
20650    }
20651    pub fn push_mcast_startup_query_cnt(mut self, value: u32) -> Self {
20652        push_header(self.as_vec_mut(), 29u16, 4 as u16);
20653        self.as_vec_mut().extend(value.to_ne_bytes());
20654        self
20655    }
20656    pub fn push_mcast_last_member_intvl(mut self, value: u64) -> Self {
20657        push_header(self.as_vec_mut(), 30u16, 8 as u16);
20658        self.as_vec_mut().extend(value.to_ne_bytes());
20659        self
20660    }
20661    pub fn push_mcast_membership_intvl(mut self, value: u64) -> Self {
20662        push_header(self.as_vec_mut(), 31u16, 8 as u16);
20663        self.as_vec_mut().extend(value.to_ne_bytes());
20664        self
20665    }
20666    pub fn push_mcast_querier_intvl(mut self, value: u64) -> Self {
20667        push_header(self.as_vec_mut(), 32u16, 8 as u16);
20668        self.as_vec_mut().extend(value.to_ne_bytes());
20669        self
20670    }
20671    pub fn push_mcast_query_intvl(mut self, value: u64) -> Self {
20672        push_header(self.as_vec_mut(), 33u16, 8 as u16);
20673        self.as_vec_mut().extend(value.to_ne_bytes());
20674        self
20675    }
20676    pub fn push_mcast_query_response_intvl(mut self, value: u64) -> Self {
20677        push_header(self.as_vec_mut(), 34u16, 8 as u16);
20678        self.as_vec_mut().extend(value.to_ne_bytes());
20679        self
20680    }
20681    pub fn push_mcast_startup_query_intvl(mut self, value: u64) -> Self {
20682        push_header(self.as_vec_mut(), 35u16, 8 as u16);
20683        self.as_vec_mut().extend(value.to_ne_bytes());
20684        self
20685    }
20686    pub fn push_nf_call_iptables(mut self, value: u8) -> Self {
20687        push_header(self.as_vec_mut(), 36u16, 1 as u16);
20688        self.as_vec_mut().extend(value.to_ne_bytes());
20689        self
20690    }
20691    pub fn push_nf_call_ip6tables(mut self, value: u8) -> Self {
20692        push_header(self.as_vec_mut(), 37u16, 1 as u16);
20693        self.as_vec_mut().extend(value.to_ne_bytes());
20694        self
20695    }
20696    pub fn push_nf_call_arptables(mut self, value: u8) -> Self {
20697        push_header(self.as_vec_mut(), 38u16, 1 as u16);
20698        self.as_vec_mut().extend(value.to_ne_bytes());
20699        self
20700    }
20701    pub fn push_vlan_default_pvid(mut self, value: u16) -> Self {
20702        push_header(self.as_vec_mut(), 39u16, 2 as u16);
20703        self.as_vec_mut().extend(value.to_ne_bytes());
20704        self
20705    }
20706    pub fn push_pad(mut self, value: &[u8]) -> Self {
20707        push_header(self.as_vec_mut(), 40u16, value.len() as u16);
20708        self.as_vec_mut().extend(value);
20709        self
20710    }
20711    pub fn push_vlan_stats_enabled(mut self, value: u8) -> Self {
20712        push_header(self.as_vec_mut(), 41u16, 1 as u16);
20713        self.as_vec_mut().extend(value.to_ne_bytes());
20714        self
20715    }
20716    pub fn push_mcast_stats_enabled(mut self, value: u8) -> Self {
20717        push_header(self.as_vec_mut(), 42u16, 1 as u16);
20718        self.as_vec_mut().extend(value.to_ne_bytes());
20719        self
20720    }
20721    pub fn push_mcast_igmp_version(mut self, value: u8) -> Self {
20722        push_header(self.as_vec_mut(), 43u16, 1 as u16);
20723        self.as_vec_mut().extend(value.to_ne_bytes());
20724        self
20725    }
20726    pub fn push_mcast_mld_version(mut self, value: u8) -> Self {
20727        push_header(self.as_vec_mut(), 44u16, 1 as u16);
20728        self.as_vec_mut().extend(value.to_ne_bytes());
20729        self
20730    }
20731    pub fn push_vlan_stats_per_port(mut self, value: u8) -> Self {
20732        push_header(self.as_vec_mut(), 45u16, 1 as u16);
20733        self.as_vec_mut().extend(value.to_ne_bytes());
20734        self
20735    }
20736    pub fn push_multi_boolopt(mut self, value: BrBooloptMulti) -> Self {
20737        push_header(self.as_vec_mut(), 46u16, value.as_slice().len() as u16);
20738        self.as_vec_mut().extend(value.as_slice());
20739        self
20740    }
20741    pub fn push_mcast_querier_state(mut self, value: &[u8]) -> Self {
20742        push_header(self.as_vec_mut(), 47u16, value.len() as u16);
20743        self.as_vec_mut().extend(value);
20744        self
20745    }
20746    pub fn push_fdb_n_learned(mut self, value: u32) -> Self {
20747        push_header(self.as_vec_mut(), 48u16, 4 as u16);
20748        self.as_vec_mut().extend(value.to_ne_bytes());
20749        self
20750    }
20751    pub fn push_fdb_max_learned(mut self, value: u32) -> Self {
20752        push_header(self.as_vec_mut(), 49u16, 4 as u16);
20753        self.as_vec_mut().extend(value.to_ne_bytes());
20754        self
20755    }
20756    #[doc = "Associated type: [`BrStpMode`] (enum)"]
20757    pub fn push_stp_mode(mut self, value: u32) -> Self {
20758        push_header(self.as_vec_mut(), 50u16, 4 as u16);
20759        self.as_vec_mut().extend(value.to_ne_bytes());
20760        self
20761    }
20762}
20763impl<Prev: Pusher> Drop for PushLinkinfoBridgeAttrs<Prev> {
20764    fn drop(&mut self) {
20765        if let Some(prev) = &mut self.prev {
20766            if let Some(header_offset) = &self.header_offset {
20767                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20768            }
20769        }
20770    }
20771}
20772pub struct PushLinkinfoBrportAttrs<Prev: Pusher> {
20773    pub(crate) prev: Option<Prev>,
20774    pub(crate) header_offset: Option<usize>,
20775}
20776impl<Prev: Pusher> Pusher for PushLinkinfoBrportAttrs<Prev> {
20777    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20778        self.prev.as_mut().unwrap().as_vec_mut()
20779    }
20780    fn as_vec(&self) -> &Vec<u8> {
20781        self.prev.as_ref().unwrap().as_vec()
20782    }
20783}
20784impl<Prev: Pusher> PushLinkinfoBrportAttrs<Prev> {
20785    pub fn new(prev: Prev) -> Self {
20786        Self {
20787            prev: Some(prev),
20788            header_offset: None,
20789        }
20790    }
20791    pub fn end_nested(mut self) -> Prev {
20792        let mut prev = self.prev.take().unwrap();
20793        if let Some(header_offset) = &self.header_offset {
20794            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20795        }
20796        prev
20797    }
20798    pub fn push_state(mut self, value: u8) -> Self {
20799        push_header(self.as_vec_mut(), 1u16, 1 as u16);
20800        self.as_vec_mut().extend(value.to_ne_bytes());
20801        self
20802    }
20803    pub fn push_priority(mut self, value: u16) -> Self {
20804        push_header(self.as_vec_mut(), 2u16, 2 as u16);
20805        self.as_vec_mut().extend(value.to_ne_bytes());
20806        self
20807    }
20808    pub fn push_cost(mut self, value: u32) -> Self {
20809        push_header(self.as_vec_mut(), 3u16, 4 as u16);
20810        self.as_vec_mut().extend(value.to_ne_bytes());
20811        self
20812    }
20813    pub fn push_mode(mut self, value: ()) -> Self {
20814        push_header(self.as_vec_mut(), 4u16, 0 as u16);
20815        self
20816    }
20817    pub fn push_guard(mut self, value: ()) -> Self {
20818        push_header(self.as_vec_mut(), 5u16, 0 as u16);
20819        self
20820    }
20821    pub fn push_protect(mut self, value: ()) -> Self {
20822        push_header(self.as_vec_mut(), 6u16, 0 as u16);
20823        self
20824    }
20825    pub fn push_fast_leave(mut self, value: ()) -> Self {
20826        push_header(self.as_vec_mut(), 7u16, 0 as u16);
20827        self
20828    }
20829    pub fn push_learning(mut self, value: ()) -> Self {
20830        push_header(self.as_vec_mut(), 8u16, 0 as u16);
20831        self
20832    }
20833    pub fn push_unicast_flood(mut self, value: ()) -> Self {
20834        push_header(self.as_vec_mut(), 9u16, 0 as u16);
20835        self
20836    }
20837    pub fn push_proxyarp(mut self, value: ()) -> Self {
20838        push_header(self.as_vec_mut(), 10u16, 0 as u16);
20839        self
20840    }
20841    pub fn push_learning_sync(mut self, value: ()) -> Self {
20842        push_header(self.as_vec_mut(), 11u16, 0 as u16);
20843        self
20844    }
20845    pub fn push_proxyarp_wifi(mut self, value: ()) -> Self {
20846        push_header(self.as_vec_mut(), 12u16, 0 as u16);
20847        self
20848    }
20849    pub fn push_root_id(mut self, value: IflaBridgeId) -> Self {
20850        push_header(self.as_vec_mut(), 13u16, value.as_slice().len() as u16);
20851        self.as_vec_mut().extend(value.as_slice());
20852        self
20853    }
20854    pub fn push_bridge_id(mut self, value: IflaBridgeId) -> Self {
20855        push_header(self.as_vec_mut(), 14u16, value.as_slice().len() as u16);
20856        self.as_vec_mut().extend(value.as_slice());
20857        self
20858    }
20859    pub fn push_designated_port(mut self, value: u16) -> Self {
20860        push_header(self.as_vec_mut(), 15u16, 2 as u16);
20861        self.as_vec_mut().extend(value.to_ne_bytes());
20862        self
20863    }
20864    pub fn push_designated_cost(mut self, value: u16) -> Self {
20865        push_header(self.as_vec_mut(), 16u16, 2 as u16);
20866        self.as_vec_mut().extend(value.to_ne_bytes());
20867        self
20868    }
20869    pub fn push_id(mut self, value: u16) -> Self {
20870        push_header(self.as_vec_mut(), 17u16, 2 as u16);
20871        self.as_vec_mut().extend(value.to_ne_bytes());
20872        self
20873    }
20874    pub fn push_no(mut self, value: u16) -> Self {
20875        push_header(self.as_vec_mut(), 18u16, 2 as u16);
20876        self.as_vec_mut().extend(value.to_ne_bytes());
20877        self
20878    }
20879    pub fn push_topology_change_ack(mut self, value: u8) -> Self {
20880        push_header(self.as_vec_mut(), 19u16, 1 as u16);
20881        self.as_vec_mut().extend(value.to_ne_bytes());
20882        self
20883    }
20884    pub fn push_config_pending(mut self, value: u8) -> Self {
20885        push_header(self.as_vec_mut(), 20u16, 1 as u16);
20886        self.as_vec_mut().extend(value.to_ne_bytes());
20887        self
20888    }
20889    pub fn push_message_age_timer(mut self, value: u64) -> Self {
20890        push_header(self.as_vec_mut(), 21u16, 8 as u16);
20891        self.as_vec_mut().extend(value.to_ne_bytes());
20892        self
20893    }
20894    pub fn push_forward_delay_timer(mut self, value: u64) -> Self {
20895        push_header(self.as_vec_mut(), 22u16, 8 as u16);
20896        self.as_vec_mut().extend(value.to_ne_bytes());
20897        self
20898    }
20899    pub fn push_hold_timer(mut self, value: u64) -> Self {
20900        push_header(self.as_vec_mut(), 23u16, 8 as u16);
20901        self.as_vec_mut().extend(value.to_ne_bytes());
20902        self
20903    }
20904    pub fn push_flush(mut self, value: ()) -> Self {
20905        push_header(self.as_vec_mut(), 24u16, 0 as u16);
20906        self
20907    }
20908    pub fn push_multicast_router(mut self, value: u8) -> Self {
20909        push_header(self.as_vec_mut(), 25u16, 1 as u16);
20910        self.as_vec_mut().extend(value.to_ne_bytes());
20911        self
20912    }
20913    pub fn push_pad(mut self, value: &[u8]) -> Self {
20914        push_header(self.as_vec_mut(), 26u16, value.len() as u16);
20915        self.as_vec_mut().extend(value);
20916        self
20917    }
20918    pub fn push_mcast_flood(mut self, value: ()) -> Self {
20919        push_header(self.as_vec_mut(), 27u16, 0 as u16);
20920        self
20921    }
20922    pub fn push_mcast_to_ucast(mut self, value: ()) -> Self {
20923        push_header(self.as_vec_mut(), 28u16, 0 as u16);
20924        self
20925    }
20926    pub fn push_vlan_tunnel(mut self, value: ()) -> Self {
20927        push_header(self.as_vec_mut(), 29u16, 0 as u16);
20928        self
20929    }
20930    pub fn push_bcast_flood(mut self, value: ()) -> Self {
20931        push_header(self.as_vec_mut(), 30u16, 0 as u16);
20932        self
20933    }
20934    pub fn push_group_fwd_mask(mut self, value: u16) -> Self {
20935        push_header(self.as_vec_mut(), 31u16, 2 as u16);
20936        self.as_vec_mut().extend(value.to_ne_bytes());
20937        self
20938    }
20939    pub fn push_neigh_suppress(mut self, value: ()) -> Self {
20940        push_header(self.as_vec_mut(), 32u16, 0 as u16);
20941        self
20942    }
20943    pub fn push_isolated(mut self, value: ()) -> Self {
20944        push_header(self.as_vec_mut(), 33u16, 0 as u16);
20945        self
20946    }
20947    pub fn push_backup_port(mut self, value: u32) -> Self {
20948        push_header(self.as_vec_mut(), 34u16, 4 as u16);
20949        self.as_vec_mut().extend(value.to_ne_bytes());
20950        self
20951    }
20952    pub fn push_mrp_ring_open(mut self, value: ()) -> Self {
20953        push_header(self.as_vec_mut(), 35u16, 0 as u16);
20954        self
20955    }
20956    pub fn push_mrp_in_open(mut self, value: ()) -> Self {
20957        push_header(self.as_vec_mut(), 36u16, 0 as u16);
20958        self
20959    }
20960    pub fn push_mcast_eht_hosts_limit(mut self, value: u32) -> Self {
20961        push_header(self.as_vec_mut(), 37u16, 4 as u16);
20962        self.as_vec_mut().extend(value.to_ne_bytes());
20963        self
20964    }
20965    pub fn push_mcast_eht_hosts_cnt(mut self, value: u32) -> Self {
20966        push_header(self.as_vec_mut(), 38u16, 4 as u16);
20967        self.as_vec_mut().extend(value.to_ne_bytes());
20968        self
20969    }
20970    pub fn push_locked(mut self, value: ()) -> Self {
20971        push_header(self.as_vec_mut(), 39u16, 0 as u16);
20972        self
20973    }
20974    pub fn push_mab(mut self, value: ()) -> Self {
20975        push_header(self.as_vec_mut(), 40u16, 0 as u16);
20976        self
20977    }
20978    pub fn push_mcast_n_groups(mut self, value: u32) -> Self {
20979        push_header(self.as_vec_mut(), 41u16, 4 as u16);
20980        self.as_vec_mut().extend(value.to_ne_bytes());
20981        self
20982    }
20983    pub fn push_mcast_max_groups(mut self, value: u32) -> Self {
20984        push_header(self.as_vec_mut(), 42u16, 4 as u16);
20985        self.as_vec_mut().extend(value.to_ne_bytes());
20986        self
20987    }
20988    pub fn push_neigh_vlan_suppress(mut self, value: ()) -> Self {
20989        push_header(self.as_vec_mut(), 43u16, 0 as u16);
20990        self
20991    }
20992    pub fn push_backup_nhid(mut self, value: u32) -> Self {
20993        push_header(self.as_vec_mut(), 44u16, 4 as u16);
20994        self.as_vec_mut().extend(value.to_ne_bytes());
20995        self
20996    }
20997    pub fn push_neigh_forward_grat(mut self, value: u8) -> Self {
20998        push_header(self.as_vec_mut(), 45u16, 1 as u16);
20999        self.as_vec_mut().extend(value.to_ne_bytes());
21000        self
21001    }
21002}
21003impl<Prev: Pusher> Drop for PushLinkinfoBrportAttrs<Prev> {
21004    fn drop(&mut self) {
21005        if let Some(prev) = &mut self.prev {
21006            if let Some(header_offset) = &self.header_offset {
21007                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21008            }
21009        }
21010    }
21011}
21012pub struct PushLinkinfoGreAttrs<Prev: Pusher> {
21013    pub(crate) prev: Option<Prev>,
21014    pub(crate) header_offset: Option<usize>,
21015}
21016impl<Prev: Pusher> Pusher for PushLinkinfoGreAttrs<Prev> {
21017    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21018        self.prev.as_mut().unwrap().as_vec_mut()
21019    }
21020    fn as_vec(&self) -> &Vec<u8> {
21021        self.prev.as_ref().unwrap().as_vec()
21022    }
21023}
21024impl<Prev: Pusher> PushLinkinfoGreAttrs<Prev> {
21025    pub fn new(prev: Prev) -> Self {
21026        Self {
21027            prev: Some(prev),
21028            header_offset: None,
21029        }
21030    }
21031    pub fn end_nested(mut self) -> Prev {
21032        let mut prev = self.prev.take().unwrap();
21033        if let Some(header_offset) = &self.header_offset {
21034            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21035        }
21036        prev
21037    }
21038    pub fn push_link(mut self, value: u32) -> Self {
21039        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21040        self.as_vec_mut().extend(value.to_ne_bytes());
21041        self
21042    }
21043    pub fn push_iflags(mut self, value: u16) -> Self {
21044        push_header(self.as_vec_mut(), 2u16, 2 as u16);
21045        self.as_vec_mut().extend(value.to_be_bytes());
21046        self
21047    }
21048    pub fn push_oflags(mut self, value: u16) -> Self {
21049        push_header(self.as_vec_mut(), 3u16, 2 as u16);
21050        self.as_vec_mut().extend(value.to_be_bytes());
21051        self
21052    }
21053    pub fn push_ikey(mut self, value: u32) -> Self {
21054        push_header(self.as_vec_mut(), 4u16, 4 as u16);
21055        self.as_vec_mut().extend(value.to_be_bytes());
21056        self
21057    }
21058    pub fn push_okey(mut self, value: u32) -> Self {
21059        push_header(self.as_vec_mut(), 5u16, 4 as u16);
21060        self.as_vec_mut().extend(value.to_be_bytes());
21061        self
21062    }
21063    pub fn push_local(mut self, value: std::net::IpAddr) -> Self {
21064        push_header(self.as_vec_mut(), 6u16, {
21065            match &value {
21066                IpAddr::V4(_) => 4,
21067                IpAddr::V6(_) => 16,
21068            }
21069        } as u16);
21070        encode_ip(self.as_vec_mut(), value);
21071        self
21072    }
21073    pub fn push_remote(mut self, value: std::net::IpAddr) -> Self {
21074        push_header(self.as_vec_mut(), 7u16, {
21075            match &value {
21076                IpAddr::V4(_) => 4,
21077                IpAddr::V6(_) => 16,
21078            }
21079        } as u16);
21080        encode_ip(self.as_vec_mut(), value);
21081        self
21082    }
21083    pub fn push_ttl(mut self, value: u8) -> Self {
21084        push_header(self.as_vec_mut(), 8u16, 1 as u16);
21085        self.as_vec_mut().extend(value.to_ne_bytes());
21086        self
21087    }
21088    pub fn push_tos(mut self, value: u8) -> Self {
21089        push_header(self.as_vec_mut(), 9u16, 1 as u16);
21090        self.as_vec_mut().extend(value.to_ne_bytes());
21091        self
21092    }
21093    pub fn push_pmtudisc(mut self, value: u8) -> Self {
21094        push_header(self.as_vec_mut(), 10u16, 1 as u16);
21095        self.as_vec_mut().extend(value.to_ne_bytes());
21096        self
21097    }
21098    pub fn push_encap_limit(mut self, value: u8) -> Self {
21099        push_header(self.as_vec_mut(), 11u16, 1 as u16);
21100        self.as_vec_mut().extend(value.to_ne_bytes());
21101        self
21102    }
21103    pub fn push_flowinfo(mut self, value: u32) -> Self {
21104        push_header(self.as_vec_mut(), 12u16, 4 as u16);
21105        self.as_vec_mut().extend(value.to_be_bytes());
21106        self
21107    }
21108    pub fn push_flags(mut self, value: u32) -> Self {
21109        push_header(self.as_vec_mut(), 13u16, 4 as u16);
21110        self.as_vec_mut().extend(value.to_ne_bytes());
21111        self
21112    }
21113    pub fn push_encap_type(mut self, value: u16) -> Self {
21114        push_header(self.as_vec_mut(), 14u16, 2 as u16);
21115        self.as_vec_mut().extend(value.to_ne_bytes());
21116        self
21117    }
21118    pub fn push_encap_flags(mut self, value: u16) -> Self {
21119        push_header(self.as_vec_mut(), 15u16, 2 as u16);
21120        self.as_vec_mut().extend(value.to_ne_bytes());
21121        self
21122    }
21123    pub fn push_encap_sport(mut self, value: u16) -> Self {
21124        push_header(self.as_vec_mut(), 16u16, 2 as u16);
21125        self.as_vec_mut().extend(value.to_be_bytes());
21126        self
21127    }
21128    pub fn push_encap_dport(mut self, value: u16) -> Self {
21129        push_header(self.as_vec_mut(), 17u16, 2 as u16);
21130        self.as_vec_mut().extend(value.to_be_bytes());
21131        self
21132    }
21133    pub fn push_collect_metadata(mut self, value: ()) -> Self {
21134        push_header(self.as_vec_mut(), 18u16, 0 as u16);
21135        self
21136    }
21137    pub fn push_ignore_df(mut self, value: u8) -> Self {
21138        push_header(self.as_vec_mut(), 19u16, 1 as u16);
21139        self.as_vec_mut().extend(value.to_ne_bytes());
21140        self
21141    }
21142    pub fn push_fwmark(mut self, value: u32) -> Self {
21143        push_header(self.as_vec_mut(), 20u16, 4 as u16);
21144        self.as_vec_mut().extend(value.to_ne_bytes());
21145        self
21146    }
21147    pub fn push_erspan_index(mut self, value: u32) -> Self {
21148        push_header(self.as_vec_mut(), 21u16, 4 as u16);
21149        self.as_vec_mut().extend(value.to_ne_bytes());
21150        self
21151    }
21152    pub fn push_erspan_ver(mut self, value: u8) -> Self {
21153        push_header(self.as_vec_mut(), 22u16, 1 as u16);
21154        self.as_vec_mut().extend(value.to_ne_bytes());
21155        self
21156    }
21157    pub fn push_erspan_dir(mut self, value: u8) -> Self {
21158        push_header(self.as_vec_mut(), 23u16, 1 as u16);
21159        self.as_vec_mut().extend(value.to_ne_bytes());
21160        self
21161    }
21162    pub fn push_erspan_hwid(mut self, value: u16) -> Self {
21163        push_header(self.as_vec_mut(), 24u16, 2 as u16);
21164        self.as_vec_mut().extend(value.to_ne_bytes());
21165        self
21166    }
21167}
21168impl<Prev: Pusher> Drop for PushLinkinfoGreAttrs<Prev> {
21169    fn drop(&mut self) {
21170        if let Some(prev) = &mut self.prev {
21171            if let Some(header_offset) = &self.header_offset {
21172                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21173            }
21174        }
21175    }
21176}
21177pub struct PushLinkinfoGre6Attrs<Prev: Pusher> {
21178    pub(crate) prev: Option<Prev>,
21179    pub(crate) header_offset: Option<usize>,
21180}
21181impl<Prev: Pusher> Pusher for PushLinkinfoGre6Attrs<Prev> {
21182    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21183        self.prev.as_mut().unwrap().as_vec_mut()
21184    }
21185    fn as_vec(&self) -> &Vec<u8> {
21186        self.prev.as_ref().unwrap().as_vec()
21187    }
21188}
21189impl<Prev: Pusher> PushLinkinfoGre6Attrs<Prev> {
21190    pub fn new(prev: Prev) -> Self {
21191        Self {
21192            prev: Some(prev),
21193            header_offset: None,
21194        }
21195    }
21196    pub fn end_nested(mut self) -> Prev {
21197        let mut prev = self.prev.take().unwrap();
21198        if let Some(header_offset) = &self.header_offset {
21199            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21200        }
21201        prev
21202    }
21203    pub fn push_link(mut self, value: u32) -> Self {
21204        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21205        self.as_vec_mut().extend(value.to_ne_bytes());
21206        self
21207    }
21208    pub fn push_iflags(mut self, value: u16) -> Self {
21209        push_header(self.as_vec_mut(), 2u16, 2 as u16);
21210        self.as_vec_mut().extend(value.to_be_bytes());
21211        self
21212    }
21213    pub fn push_oflags(mut self, value: u16) -> Self {
21214        push_header(self.as_vec_mut(), 3u16, 2 as u16);
21215        self.as_vec_mut().extend(value.to_be_bytes());
21216        self
21217    }
21218    pub fn push_ikey(mut self, value: u32) -> Self {
21219        push_header(self.as_vec_mut(), 4u16, 4 as u16);
21220        self.as_vec_mut().extend(value.to_be_bytes());
21221        self
21222    }
21223    pub fn push_okey(mut self, value: u32) -> Self {
21224        push_header(self.as_vec_mut(), 5u16, 4 as u16);
21225        self.as_vec_mut().extend(value.to_be_bytes());
21226        self
21227    }
21228    pub fn push_local(mut self, value: &[u8]) -> Self {
21229        push_header(self.as_vec_mut(), 6u16, value.len() as u16);
21230        self.as_vec_mut().extend(value);
21231        self
21232    }
21233    pub fn push_remote(mut self, value: &[u8]) -> Self {
21234        push_header(self.as_vec_mut(), 7u16, value.len() as u16);
21235        self.as_vec_mut().extend(value);
21236        self
21237    }
21238    pub fn push_ttl(mut self, value: u8) -> Self {
21239        push_header(self.as_vec_mut(), 8u16, 1 as u16);
21240        self.as_vec_mut().extend(value.to_ne_bytes());
21241        self
21242    }
21243    pub fn push_encap_limit(mut self, value: u8) -> Self {
21244        push_header(self.as_vec_mut(), 11u16, 1 as u16);
21245        self.as_vec_mut().extend(value.to_ne_bytes());
21246        self
21247    }
21248    pub fn push_flowinfo(mut self, value: u32) -> Self {
21249        push_header(self.as_vec_mut(), 12u16, 4 as u16);
21250        self.as_vec_mut().extend(value.to_be_bytes());
21251        self
21252    }
21253    pub fn push_flags(mut self, value: u32) -> Self {
21254        push_header(self.as_vec_mut(), 13u16, 4 as u16);
21255        self.as_vec_mut().extend(value.to_ne_bytes());
21256        self
21257    }
21258    pub fn push_encap_type(mut self, value: u16) -> Self {
21259        push_header(self.as_vec_mut(), 14u16, 2 as u16);
21260        self.as_vec_mut().extend(value.to_ne_bytes());
21261        self
21262    }
21263    pub fn push_encap_flags(mut self, value: u16) -> Self {
21264        push_header(self.as_vec_mut(), 15u16, 2 as u16);
21265        self.as_vec_mut().extend(value.to_ne_bytes());
21266        self
21267    }
21268    pub fn push_encap_sport(mut self, value: u16) -> Self {
21269        push_header(self.as_vec_mut(), 16u16, 2 as u16);
21270        self.as_vec_mut().extend(value.to_be_bytes());
21271        self
21272    }
21273    pub fn push_encap_dport(mut self, value: u16) -> Self {
21274        push_header(self.as_vec_mut(), 17u16, 2 as u16);
21275        self.as_vec_mut().extend(value.to_be_bytes());
21276        self
21277    }
21278    pub fn push_collect_metadata(mut self, value: ()) -> Self {
21279        push_header(self.as_vec_mut(), 18u16, 0 as u16);
21280        self
21281    }
21282    pub fn push_fwmark(mut self, value: u32) -> Self {
21283        push_header(self.as_vec_mut(), 20u16, 4 as u16);
21284        self.as_vec_mut().extend(value.to_ne_bytes());
21285        self
21286    }
21287    pub fn push_erspan_index(mut self, value: u32) -> Self {
21288        push_header(self.as_vec_mut(), 21u16, 4 as u16);
21289        self.as_vec_mut().extend(value.to_ne_bytes());
21290        self
21291    }
21292    pub fn push_erspan_ver(mut self, value: u8) -> Self {
21293        push_header(self.as_vec_mut(), 22u16, 1 as u16);
21294        self.as_vec_mut().extend(value.to_ne_bytes());
21295        self
21296    }
21297    pub fn push_erspan_dir(mut self, value: u8) -> Self {
21298        push_header(self.as_vec_mut(), 23u16, 1 as u16);
21299        self.as_vec_mut().extend(value.to_ne_bytes());
21300        self
21301    }
21302    pub fn push_erspan_hwid(mut self, value: u16) -> Self {
21303        push_header(self.as_vec_mut(), 24u16, 2 as u16);
21304        self.as_vec_mut().extend(value.to_ne_bytes());
21305        self
21306    }
21307}
21308impl<Prev: Pusher> Drop for PushLinkinfoGre6Attrs<Prev> {
21309    fn drop(&mut self) {
21310        if let Some(prev) = &mut self.prev {
21311            if let Some(header_offset) = &self.header_offset {
21312                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21313            }
21314        }
21315    }
21316}
21317pub struct PushLinkinfoVtiAttrs<Prev: Pusher> {
21318    pub(crate) prev: Option<Prev>,
21319    pub(crate) header_offset: Option<usize>,
21320}
21321impl<Prev: Pusher> Pusher for PushLinkinfoVtiAttrs<Prev> {
21322    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21323        self.prev.as_mut().unwrap().as_vec_mut()
21324    }
21325    fn as_vec(&self) -> &Vec<u8> {
21326        self.prev.as_ref().unwrap().as_vec()
21327    }
21328}
21329impl<Prev: Pusher> PushLinkinfoVtiAttrs<Prev> {
21330    pub fn new(prev: Prev) -> Self {
21331        Self {
21332            prev: Some(prev),
21333            header_offset: None,
21334        }
21335    }
21336    pub fn end_nested(mut self) -> Prev {
21337        let mut prev = self.prev.take().unwrap();
21338        if let Some(header_offset) = &self.header_offset {
21339            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21340        }
21341        prev
21342    }
21343    pub fn push_link(mut self, value: u32) -> Self {
21344        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21345        self.as_vec_mut().extend(value.to_ne_bytes());
21346        self
21347    }
21348    pub fn push_ikey(mut self, value: u32) -> Self {
21349        push_header(self.as_vec_mut(), 2u16, 4 as u16);
21350        self.as_vec_mut().extend(value.to_be_bytes());
21351        self
21352    }
21353    pub fn push_okey(mut self, value: u32) -> Self {
21354        push_header(self.as_vec_mut(), 3u16, 4 as u16);
21355        self.as_vec_mut().extend(value.to_be_bytes());
21356        self
21357    }
21358    pub fn push_local(mut self, value: std::net::IpAddr) -> Self {
21359        push_header(self.as_vec_mut(), 4u16, {
21360            match &value {
21361                IpAddr::V4(_) => 4,
21362                IpAddr::V6(_) => 16,
21363            }
21364        } as u16);
21365        encode_ip(self.as_vec_mut(), value);
21366        self
21367    }
21368    pub fn push_remote(mut self, value: std::net::IpAddr) -> Self {
21369        push_header(self.as_vec_mut(), 5u16, {
21370            match &value {
21371                IpAddr::V4(_) => 4,
21372                IpAddr::V6(_) => 16,
21373            }
21374        } as u16);
21375        encode_ip(self.as_vec_mut(), value);
21376        self
21377    }
21378    pub fn push_fwmark(mut self, value: u32) -> Self {
21379        push_header(self.as_vec_mut(), 6u16, 4 as u16);
21380        self.as_vec_mut().extend(value.to_ne_bytes());
21381        self
21382    }
21383}
21384impl<Prev: Pusher> Drop for PushLinkinfoVtiAttrs<Prev> {
21385    fn drop(&mut self) {
21386        if let Some(prev) = &mut self.prev {
21387            if let Some(header_offset) = &self.header_offset {
21388                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21389            }
21390        }
21391    }
21392}
21393pub struct PushLinkinfoVti6Attrs<Prev: Pusher> {
21394    pub(crate) prev: Option<Prev>,
21395    pub(crate) header_offset: Option<usize>,
21396}
21397impl<Prev: Pusher> Pusher for PushLinkinfoVti6Attrs<Prev> {
21398    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21399        self.prev.as_mut().unwrap().as_vec_mut()
21400    }
21401    fn as_vec(&self) -> &Vec<u8> {
21402        self.prev.as_ref().unwrap().as_vec()
21403    }
21404}
21405impl<Prev: Pusher> PushLinkinfoVti6Attrs<Prev> {
21406    pub fn new(prev: Prev) -> Self {
21407        Self {
21408            prev: Some(prev),
21409            header_offset: None,
21410        }
21411    }
21412    pub fn end_nested(mut self) -> Prev {
21413        let mut prev = self.prev.take().unwrap();
21414        if let Some(header_offset) = &self.header_offset {
21415            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21416        }
21417        prev
21418    }
21419    pub fn push_link(mut self, value: u32) -> Self {
21420        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21421        self.as_vec_mut().extend(value.to_ne_bytes());
21422        self
21423    }
21424    pub fn push_ikey(mut self, value: u32) -> Self {
21425        push_header(self.as_vec_mut(), 2u16, 4 as u16);
21426        self.as_vec_mut().extend(value.to_be_bytes());
21427        self
21428    }
21429    pub fn push_okey(mut self, value: u32) -> Self {
21430        push_header(self.as_vec_mut(), 3u16, 4 as u16);
21431        self.as_vec_mut().extend(value.to_be_bytes());
21432        self
21433    }
21434    pub fn push_local(mut self, value: &[u8]) -> Self {
21435        push_header(self.as_vec_mut(), 4u16, value.len() as u16);
21436        self.as_vec_mut().extend(value);
21437        self
21438    }
21439    pub fn push_remote(mut self, value: &[u8]) -> Self {
21440        push_header(self.as_vec_mut(), 5u16, value.len() as u16);
21441        self.as_vec_mut().extend(value);
21442        self
21443    }
21444    pub fn push_fwmark(mut self, value: u32) -> Self {
21445        push_header(self.as_vec_mut(), 6u16, 4 as u16);
21446        self.as_vec_mut().extend(value.to_ne_bytes());
21447        self
21448    }
21449}
21450impl<Prev: Pusher> Drop for PushLinkinfoVti6Attrs<Prev> {
21451    fn drop(&mut self) {
21452        if let Some(prev) = &mut self.prev {
21453            if let Some(header_offset) = &self.header_offset {
21454                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21455            }
21456        }
21457    }
21458}
21459pub struct PushLinkinfoGeneveAttrs<Prev: Pusher> {
21460    pub(crate) prev: Option<Prev>,
21461    pub(crate) header_offset: Option<usize>,
21462}
21463impl<Prev: Pusher> Pusher for PushLinkinfoGeneveAttrs<Prev> {
21464    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21465        self.prev.as_mut().unwrap().as_vec_mut()
21466    }
21467    fn as_vec(&self) -> &Vec<u8> {
21468        self.prev.as_ref().unwrap().as_vec()
21469    }
21470}
21471impl<Prev: Pusher> PushLinkinfoGeneveAttrs<Prev> {
21472    pub fn new(prev: Prev) -> Self {
21473        Self {
21474            prev: Some(prev),
21475            header_offset: None,
21476        }
21477    }
21478    pub fn end_nested(mut self) -> Prev {
21479        let mut prev = self.prev.take().unwrap();
21480        if let Some(header_offset) = &self.header_offset {
21481            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21482        }
21483        prev
21484    }
21485    pub fn push_id(mut self, value: u32) -> Self {
21486        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21487        self.as_vec_mut().extend(value.to_ne_bytes());
21488        self
21489    }
21490    pub fn push_remote(mut self, value: std::net::Ipv4Addr) -> Self {
21491        push_header(self.as_vec_mut(), 2u16, 4 as u16);
21492        self.as_vec_mut().extend(&value.to_bits().to_be_bytes());
21493        self
21494    }
21495    pub fn push_ttl(mut self, value: u8) -> Self {
21496        push_header(self.as_vec_mut(), 3u16, 1 as u16);
21497        self.as_vec_mut().extend(value.to_ne_bytes());
21498        self
21499    }
21500    pub fn push_tos(mut self, value: u8) -> Self {
21501        push_header(self.as_vec_mut(), 4u16, 1 as u16);
21502        self.as_vec_mut().extend(value.to_ne_bytes());
21503        self
21504    }
21505    pub fn push_port(mut self, value: u16) -> Self {
21506        push_header(self.as_vec_mut(), 5u16, 2 as u16);
21507        self.as_vec_mut().extend(value.to_be_bytes());
21508        self
21509    }
21510    pub fn push_collect_metadata(mut self, value: ()) -> Self {
21511        push_header(self.as_vec_mut(), 6u16, 0 as u16);
21512        self
21513    }
21514    pub fn push_remote6(mut self, value: &[u8]) -> Self {
21515        push_header(self.as_vec_mut(), 7u16, value.len() as u16);
21516        self.as_vec_mut().extend(value);
21517        self
21518    }
21519    pub fn push_udp_csum(mut self, value: u8) -> Self {
21520        push_header(self.as_vec_mut(), 8u16, 1 as u16);
21521        self.as_vec_mut().extend(value.to_ne_bytes());
21522        self
21523    }
21524    pub fn push_udp_zero_csum6_tx(mut self, value: u8) -> Self {
21525        push_header(self.as_vec_mut(), 9u16, 1 as u16);
21526        self.as_vec_mut().extend(value.to_ne_bytes());
21527        self
21528    }
21529    pub fn push_udp_zero_csum6_rx(mut self, value: u8) -> Self {
21530        push_header(self.as_vec_mut(), 10u16, 1 as u16);
21531        self.as_vec_mut().extend(value.to_ne_bytes());
21532        self
21533    }
21534    pub fn push_label(mut self, value: u32) -> Self {
21535        push_header(self.as_vec_mut(), 11u16, 4 as u16);
21536        self.as_vec_mut().extend(value.to_be_bytes());
21537        self
21538    }
21539    pub fn push_ttl_inherit(mut self, value: u8) -> Self {
21540        push_header(self.as_vec_mut(), 12u16, 1 as u16);
21541        self.as_vec_mut().extend(value.to_ne_bytes());
21542        self
21543    }
21544    pub fn push_df(mut self, value: u8) -> Self {
21545        push_header(self.as_vec_mut(), 13u16, 1 as u16);
21546        self.as_vec_mut().extend(value.to_ne_bytes());
21547        self
21548    }
21549    pub fn push_inner_proto_inherit(mut self, value: ()) -> Self {
21550        push_header(self.as_vec_mut(), 14u16, 0 as u16);
21551        self
21552    }
21553    pub fn push_port_range(mut self, value: IflaGenevePortRange) -> Self {
21554        push_header(self.as_vec_mut(), 15u16, value.as_slice().len() as u16);
21555        self.as_vec_mut().extend(value.as_slice());
21556        self
21557    }
21558    pub fn push_gro_hint(mut self, value: ()) -> Self {
21559        push_header(self.as_vec_mut(), 16u16, 0 as u16);
21560        self
21561    }
21562    pub fn push_local(mut self, value: std::net::Ipv4Addr) -> Self {
21563        push_header(self.as_vec_mut(), 17u16, 4 as u16);
21564        self.as_vec_mut().extend(&value.to_bits().to_be_bytes());
21565        self
21566    }
21567    pub fn push_local6(mut self, value: &[u8]) -> Self {
21568        push_header(self.as_vec_mut(), 18u16, value.len() as u16);
21569        self.as_vec_mut().extend(value);
21570        self
21571    }
21572}
21573impl<Prev: Pusher> Drop for PushLinkinfoGeneveAttrs<Prev> {
21574    fn drop(&mut self) {
21575        if let Some(prev) = &mut self.prev {
21576            if let Some(header_offset) = &self.header_offset {
21577                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21578            }
21579        }
21580    }
21581}
21582pub struct PushLinkinfoHsrAttrs<Prev: Pusher> {
21583    pub(crate) prev: Option<Prev>,
21584    pub(crate) header_offset: Option<usize>,
21585}
21586impl<Prev: Pusher> Pusher for PushLinkinfoHsrAttrs<Prev> {
21587    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21588        self.prev.as_mut().unwrap().as_vec_mut()
21589    }
21590    fn as_vec(&self) -> &Vec<u8> {
21591        self.prev.as_ref().unwrap().as_vec()
21592    }
21593}
21594impl<Prev: Pusher> PushLinkinfoHsrAttrs<Prev> {
21595    pub fn new(prev: Prev) -> Self {
21596        Self {
21597            prev: Some(prev),
21598            header_offset: None,
21599        }
21600    }
21601    pub fn end_nested(mut self) -> Prev {
21602        let mut prev = self.prev.take().unwrap();
21603        if let Some(header_offset) = &self.header_offset {
21604            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21605        }
21606        prev
21607    }
21608    pub fn push_slave1(mut self, value: u32) -> Self {
21609        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21610        self.as_vec_mut().extend(value.to_ne_bytes());
21611        self
21612    }
21613    pub fn push_slave2(mut self, value: u32) -> Self {
21614        push_header(self.as_vec_mut(), 2u16, 4 as u16);
21615        self.as_vec_mut().extend(value.to_ne_bytes());
21616        self
21617    }
21618    pub fn push_multicast_spec(mut self, value: u8) -> Self {
21619        push_header(self.as_vec_mut(), 3u16, 1 as u16);
21620        self.as_vec_mut().extend(value.to_ne_bytes());
21621        self
21622    }
21623    pub fn push_supervision_addr(mut self, value: &[u8]) -> Self {
21624        push_header(self.as_vec_mut(), 4u16, value.len() as u16);
21625        self.as_vec_mut().extend(value);
21626        self
21627    }
21628    pub fn push_seq_nr(mut self, value: u16) -> Self {
21629        push_header(self.as_vec_mut(), 5u16, 2 as u16);
21630        self.as_vec_mut().extend(value.to_ne_bytes());
21631        self
21632    }
21633    pub fn push_version(mut self, value: u8) -> Self {
21634        push_header(self.as_vec_mut(), 6u16, 1 as u16);
21635        self.as_vec_mut().extend(value.to_ne_bytes());
21636        self
21637    }
21638    pub fn push_protocol(mut self, value: u8) -> Self {
21639        push_header(self.as_vec_mut(), 7u16, 1 as u16);
21640        self.as_vec_mut().extend(value.to_ne_bytes());
21641        self
21642    }
21643    pub fn push_interlink(mut self, value: u32) -> Self {
21644        push_header(self.as_vec_mut(), 8u16, 4 as u16);
21645        self.as_vec_mut().extend(value.to_ne_bytes());
21646        self
21647    }
21648}
21649impl<Prev: Pusher> Drop for PushLinkinfoHsrAttrs<Prev> {
21650    fn drop(&mut self) {
21651        if let Some(prev) = &mut self.prev {
21652            if let Some(header_offset) = &self.header_offset {
21653                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21654            }
21655        }
21656    }
21657}
21658pub struct PushLinkinfoIptunAttrs<Prev: Pusher> {
21659    pub(crate) prev: Option<Prev>,
21660    pub(crate) header_offset: Option<usize>,
21661}
21662impl<Prev: Pusher> Pusher for PushLinkinfoIptunAttrs<Prev> {
21663    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21664        self.prev.as_mut().unwrap().as_vec_mut()
21665    }
21666    fn as_vec(&self) -> &Vec<u8> {
21667        self.prev.as_ref().unwrap().as_vec()
21668    }
21669}
21670impl<Prev: Pusher> PushLinkinfoIptunAttrs<Prev> {
21671    pub fn new(prev: Prev) -> Self {
21672        Self {
21673            prev: Some(prev),
21674            header_offset: None,
21675        }
21676    }
21677    pub fn end_nested(mut self) -> Prev {
21678        let mut prev = self.prev.take().unwrap();
21679        if let Some(header_offset) = &self.header_offset {
21680            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21681        }
21682        prev
21683    }
21684    pub fn push_link(mut self, value: u32) -> Self {
21685        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21686        self.as_vec_mut().extend(value.to_ne_bytes());
21687        self
21688    }
21689    pub fn push_local(mut self, value: std::net::IpAddr) -> Self {
21690        push_header(self.as_vec_mut(), 2u16, {
21691            match &value {
21692                IpAddr::V4(_) => 4,
21693                IpAddr::V6(_) => 16,
21694            }
21695        } as u16);
21696        encode_ip(self.as_vec_mut(), value);
21697        self
21698    }
21699    pub fn push_remote(mut self, value: std::net::IpAddr) -> Self {
21700        push_header(self.as_vec_mut(), 3u16, {
21701            match &value {
21702                IpAddr::V4(_) => 4,
21703                IpAddr::V6(_) => 16,
21704            }
21705        } as u16);
21706        encode_ip(self.as_vec_mut(), value);
21707        self
21708    }
21709    pub fn push_ttl(mut self, value: u8) -> Self {
21710        push_header(self.as_vec_mut(), 4u16, 1 as u16);
21711        self.as_vec_mut().extend(value.to_ne_bytes());
21712        self
21713    }
21714    pub fn push_tos(mut self, value: u8) -> Self {
21715        push_header(self.as_vec_mut(), 5u16, 1 as u16);
21716        self.as_vec_mut().extend(value.to_ne_bytes());
21717        self
21718    }
21719    pub fn push_encap_limit(mut self, value: u8) -> Self {
21720        push_header(self.as_vec_mut(), 6u16, 1 as u16);
21721        self.as_vec_mut().extend(value.to_ne_bytes());
21722        self
21723    }
21724    pub fn push_flowinfo(mut self, value: u32) -> Self {
21725        push_header(self.as_vec_mut(), 7u16, 4 as u16);
21726        self.as_vec_mut().extend(value.to_be_bytes());
21727        self
21728    }
21729    pub fn push_flags(mut self, value: u16) -> Self {
21730        push_header(self.as_vec_mut(), 8u16, 2 as u16);
21731        self.as_vec_mut().extend(value.to_be_bytes());
21732        self
21733    }
21734    pub fn push_proto(mut self, value: u8) -> Self {
21735        push_header(self.as_vec_mut(), 9u16, 1 as u16);
21736        self.as_vec_mut().extend(value.to_ne_bytes());
21737        self
21738    }
21739    pub fn push_pmtudisc(mut self, value: u8) -> Self {
21740        push_header(self.as_vec_mut(), 10u16, 1 as u16);
21741        self.as_vec_mut().extend(value.to_ne_bytes());
21742        self
21743    }
21744    pub fn push_6rd_prefix(mut self, value: &[u8]) -> Self {
21745        push_header(self.as_vec_mut(), 11u16, value.len() as u16);
21746        self.as_vec_mut().extend(value);
21747        self
21748    }
21749    pub fn push_6rd_relay_prefix(mut self, value: std::net::Ipv4Addr) -> Self {
21750        push_header(self.as_vec_mut(), 12u16, 4 as u16);
21751        self.as_vec_mut().extend(&value.to_bits().to_be_bytes());
21752        self
21753    }
21754    pub fn push_6rd_prefixlen(mut self, value: u16) -> Self {
21755        push_header(self.as_vec_mut(), 13u16, 2 as u16);
21756        self.as_vec_mut().extend(value.to_ne_bytes());
21757        self
21758    }
21759    pub fn push_6rd_relay_prefixlen(mut self, value: u16) -> Self {
21760        push_header(self.as_vec_mut(), 14u16, 2 as u16);
21761        self.as_vec_mut().extend(value.to_ne_bytes());
21762        self
21763    }
21764    pub fn push_encap_type(mut self, value: u16) -> Self {
21765        push_header(self.as_vec_mut(), 15u16, 2 as u16);
21766        self.as_vec_mut().extend(value.to_ne_bytes());
21767        self
21768    }
21769    pub fn push_encap_flags(mut self, value: u16) -> Self {
21770        push_header(self.as_vec_mut(), 16u16, 2 as u16);
21771        self.as_vec_mut().extend(value.to_ne_bytes());
21772        self
21773    }
21774    pub fn push_encap_sport(mut self, value: u16) -> Self {
21775        push_header(self.as_vec_mut(), 17u16, 2 as u16);
21776        self.as_vec_mut().extend(value.to_be_bytes());
21777        self
21778    }
21779    pub fn push_encap_dport(mut self, value: u16) -> Self {
21780        push_header(self.as_vec_mut(), 18u16, 2 as u16);
21781        self.as_vec_mut().extend(value.to_be_bytes());
21782        self
21783    }
21784    pub fn push_collect_metadata(mut self, value: ()) -> Self {
21785        push_header(self.as_vec_mut(), 19u16, 0 as u16);
21786        self
21787    }
21788    pub fn push_fwmark(mut self, value: u32) -> Self {
21789        push_header(self.as_vec_mut(), 20u16, 4 as u16);
21790        self.as_vec_mut().extend(value.to_ne_bytes());
21791        self
21792    }
21793}
21794impl<Prev: Pusher> Drop for PushLinkinfoIptunAttrs<Prev> {
21795    fn drop(&mut self) {
21796        if let Some(prev) = &mut self.prev {
21797            if let Some(header_offset) = &self.header_offset {
21798                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21799            }
21800        }
21801    }
21802}
21803pub struct PushLinkinfoIp6tnlAttrs<Prev: Pusher> {
21804    pub(crate) prev: Option<Prev>,
21805    pub(crate) header_offset: Option<usize>,
21806}
21807impl<Prev: Pusher> Pusher for PushLinkinfoIp6tnlAttrs<Prev> {
21808    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21809        self.prev.as_mut().unwrap().as_vec_mut()
21810    }
21811    fn as_vec(&self) -> &Vec<u8> {
21812        self.prev.as_ref().unwrap().as_vec()
21813    }
21814}
21815impl<Prev: Pusher> PushLinkinfoIp6tnlAttrs<Prev> {
21816    pub fn new(prev: Prev) -> Self {
21817        Self {
21818            prev: Some(prev),
21819            header_offset: None,
21820        }
21821    }
21822    pub fn end_nested(mut self) -> Prev {
21823        let mut prev = self.prev.take().unwrap();
21824        if let Some(header_offset) = &self.header_offset {
21825            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21826        }
21827        prev
21828    }
21829    pub fn push_link(mut self, value: u32) -> Self {
21830        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21831        self.as_vec_mut().extend(value.to_ne_bytes());
21832        self
21833    }
21834    pub fn push_local(mut self, value: &[u8]) -> Self {
21835        push_header(self.as_vec_mut(), 2u16, value.len() as u16);
21836        self.as_vec_mut().extend(value);
21837        self
21838    }
21839    pub fn push_remote(mut self, value: &[u8]) -> Self {
21840        push_header(self.as_vec_mut(), 3u16, value.len() as u16);
21841        self.as_vec_mut().extend(value);
21842        self
21843    }
21844    pub fn push_ttl(mut self, value: u8) -> Self {
21845        push_header(self.as_vec_mut(), 4u16, 1 as u16);
21846        self.as_vec_mut().extend(value.to_ne_bytes());
21847        self
21848    }
21849    pub fn push_encap_limit(mut self, value: u8) -> Self {
21850        push_header(self.as_vec_mut(), 6u16, 1 as u16);
21851        self.as_vec_mut().extend(value.to_ne_bytes());
21852        self
21853    }
21854    pub fn push_flowinfo(mut self, value: u32) -> Self {
21855        push_header(self.as_vec_mut(), 7u16, 4 as u16);
21856        self.as_vec_mut().extend(value.to_be_bytes());
21857        self
21858    }
21859    pub fn push_flags(mut self, value: u32) -> Self {
21860        push_header(self.as_vec_mut(), 8u16, 4 as u16);
21861        self.as_vec_mut().extend(value.to_be_bytes());
21862        self
21863    }
21864    pub fn push_proto(mut self, value: u8) -> Self {
21865        push_header(self.as_vec_mut(), 9u16, 1 as u16);
21866        self.as_vec_mut().extend(value.to_ne_bytes());
21867        self
21868    }
21869    pub fn push_encap_type(mut self, value: u16) -> Self {
21870        push_header(self.as_vec_mut(), 15u16, 2 as u16);
21871        self.as_vec_mut().extend(value.to_ne_bytes());
21872        self
21873    }
21874    pub fn push_encap_flags(mut self, value: u16) -> Self {
21875        push_header(self.as_vec_mut(), 16u16, 2 as u16);
21876        self.as_vec_mut().extend(value.to_ne_bytes());
21877        self
21878    }
21879    pub fn push_encap_sport(mut self, value: u16) -> Self {
21880        push_header(self.as_vec_mut(), 17u16, 2 as u16);
21881        self.as_vec_mut().extend(value.to_be_bytes());
21882        self
21883    }
21884    pub fn push_encap_dport(mut self, value: u16) -> Self {
21885        push_header(self.as_vec_mut(), 18u16, 2 as u16);
21886        self.as_vec_mut().extend(value.to_be_bytes());
21887        self
21888    }
21889    pub fn push_collect_metadata(mut self, value: ()) -> Self {
21890        push_header(self.as_vec_mut(), 19u16, 0 as u16);
21891        self
21892    }
21893    pub fn push_fwmark(mut self, value: u32) -> Self {
21894        push_header(self.as_vec_mut(), 20u16, 4 as u16);
21895        self.as_vec_mut().extend(value.to_ne_bytes());
21896        self
21897    }
21898}
21899impl<Prev: Pusher> Drop for PushLinkinfoIp6tnlAttrs<Prev> {
21900    fn drop(&mut self) {
21901        if let Some(prev) = &mut self.prev {
21902            if let Some(header_offset) = &self.header_offset {
21903                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21904            }
21905        }
21906    }
21907}
21908pub struct PushLinkinfoTunAttrs<Prev: Pusher> {
21909    pub(crate) prev: Option<Prev>,
21910    pub(crate) header_offset: Option<usize>,
21911}
21912impl<Prev: Pusher> Pusher for PushLinkinfoTunAttrs<Prev> {
21913    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21914        self.prev.as_mut().unwrap().as_vec_mut()
21915    }
21916    fn as_vec(&self) -> &Vec<u8> {
21917        self.prev.as_ref().unwrap().as_vec()
21918    }
21919}
21920impl<Prev: Pusher> PushLinkinfoTunAttrs<Prev> {
21921    pub fn new(prev: Prev) -> Self {
21922        Self {
21923            prev: Some(prev),
21924            header_offset: None,
21925        }
21926    }
21927    pub fn end_nested(mut self) -> Prev {
21928        let mut prev = self.prev.take().unwrap();
21929        if let Some(header_offset) = &self.header_offset {
21930            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21931        }
21932        prev
21933    }
21934    pub fn push_owner(mut self, value: u32) -> Self {
21935        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21936        self.as_vec_mut().extend(value.to_ne_bytes());
21937        self
21938    }
21939    pub fn push_group(mut self, value: u32) -> Self {
21940        push_header(self.as_vec_mut(), 2u16, 4 as u16);
21941        self.as_vec_mut().extend(value.to_ne_bytes());
21942        self
21943    }
21944    pub fn push_type(mut self, value: u8) -> Self {
21945        push_header(self.as_vec_mut(), 3u16, 1 as u16);
21946        self.as_vec_mut().extend(value.to_ne_bytes());
21947        self
21948    }
21949    pub fn push_pi(mut self, value: u8) -> Self {
21950        push_header(self.as_vec_mut(), 4u16, 1 as u16);
21951        self.as_vec_mut().extend(value.to_ne_bytes());
21952        self
21953    }
21954    pub fn push_vnet_hdr(mut self, value: u8) -> Self {
21955        push_header(self.as_vec_mut(), 5u16, 1 as u16);
21956        self.as_vec_mut().extend(value.to_ne_bytes());
21957        self
21958    }
21959    pub fn push_persist(mut self, value: u8) -> Self {
21960        push_header(self.as_vec_mut(), 6u16, 1 as u16);
21961        self.as_vec_mut().extend(value.to_ne_bytes());
21962        self
21963    }
21964    pub fn push_multi_queue(mut self, value: u8) -> Self {
21965        push_header(self.as_vec_mut(), 7u16, 1 as u16);
21966        self.as_vec_mut().extend(value.to_ne_bytes());
21967        self
21968    }
21969    pub fn push_num_queues(mut self, value: u32) -> Self {
21970        push_header(self.as_vec_mut(), 8u16, 4 as u16);
21971        self.as_vec_mut().extend(value.to_ne_bytes());
21972        self
21973    }
21974    pub fn push_num_disabled_queues(mut self, value: u32) -> Self {
21975        push_header(self.as_vec_mut(), 9u16, 4 as u16);
21976        self.as_vec_mut().extend(value.to_ne_bytes());
21977        self
21978    }
21979}
21980impl<Prev: Pusher> Drop for PushLinkinfoTunAttrs<Prev> {
21981    fn drop(&mut self) {
21982        if let Some(prev) = &mut self.prev {
21983            if let Some(header_offset) = &self.header_offset {
21984                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21985            }
21986        }
21987    }
21988}
21989pub struct PushLinkinfoVlanAttrs<Prev: Pusher> {
21990    pub(crate) prev: Option<Prev>,
21991    pub(crate) header_offset: Option<usize>,
21992}
21993impl<Prev: Pusher> Pusher for PushLinkinfoVlanAttrs<Prev> {
21994    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21995        self.prev.as_mut().unwrap().as_vec_mut()
21996    }
21997    fn as_vec(&self) -> &Vec<u8> {
21998        self.prev.as_ref().unwrap().as_vec()
21999    }
22000}
22001impl<Prev: Pusher> PushLinkinfoVlanAttrs<Prev> {
22002    pub fn new(prev: Prev) -> Self {
22003        Self {
22004            prev: Some(prev),
22005            header_offset: None,
22006        }
22007    }
22008    pub fn end_nested(mut self) -> Prev {
22009        let mut prev = self.prev.take().unwrap();
22010        if let Some(header_offset) = &self.header_offset {
22011            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22012        }
22013        prev
22014    }
22015    pub fn push_id(mut self, value: u16) -> Self {
22016        push_header(self.as_vec_mut(), 1u16, 2 as u16);
22017        self.as_vec_mut().extend(value.to_ne_bytes());
22018        self
22019    }
22020    pub fn push_flags(mut self, value: IflaVlanFlags) -> Self {
22021        push_header(self.as_vec_mut(), 2u16, value.as_slice().len() as u16);
22022        self.as_vec_mut().extend(value.as_slice());
22023        self
22024    }
22025    pub fn nested_egress_qos(mut self) -> PushIflaVlanQos<Self> {
22026        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
22027        PushIflaVlanQos {
22028            prev: Some(self),
22029            header_offset: Some(header_offset),
22030        }
22031    }
22032    pub fn nested_ingress_qos(mut self) -> PushIflaVlanQos<Self> {
22033        let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
22034        PushIflaVlanQos {
22035            prev: Some(self),
22036            header_offset: Some(header_offset),
22037        }
22038    }
22039    #[doc = "Associated type: [`VlanProtocols`] (enum)"]
22040    pub fn push_protocol(mut self, value: u16) -> Self {
22041        push_header(self.as_vec_mut(), 5u16, 2 as u16);
22042        self.as_vec_mut().extend(value.to_be_bytes());
22043        self
22044    }
22045}
22046impl<Prev: Pusher> Drop for PushLinkinfoVlanAttrs<Prev> {
22047    fn drop(&mut self) {
22048        if let Some(prev) = &mut self.prev {
22049            if let Some(header_offset) = &self.header_offset {
22050                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22051            }
22052        }
22053    }
22054}
22055pub struct PushIflaVlanQos<Prev: Pusher> {
22056    pub(crate) prev: Option<Prev>,
22057    pub(crate) header_offset: Option<usize>,
22058}
22059impl<Prev: Pusher> Pusher for PushIflaVlanQos<Prev> {
22060    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22061        self.prev.as_mut().unwrap().as_vec_mut()
22062    }
22063    fn as_vec(&self) -> &Vec<u8> {
22064        self.prev.as_ref().unwrap().as_vec()
22065    }
22066}
22067impl<Prev: Pusher> PushIflaVlanQos<Prev> {
22068    pub fn new(prev: Prev) -> Self {
22069        Self {
22070            prev: Some(prev),
22071            header_offset: None,
22072        }
22073    }
22074    pub fn end_nested(mut self) -> Prev {
22075        let mut prev = self.prev.take().unwrap();
22076        if let Some(header_offset) = &self.header_offset {
22077            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22078        }
22079        prev
22080    }
22081    #[doc = "Attribute may repeat multiple times (treat it as array)"]
22082    pub fn push_mapping(mut self, value: IflaVlanQosMapping) -> Self {
22083        push_header(self.as_vec_mut(), 1u16, value.as_slice().len() as u16);
22084        self.as_vec_mut().extend(value.as_slice());
22085        self
22086    }
22087}
22088impl<Prev: Pusher> Drop for PushIflaVlanQos<Prev> {
22089    fn drop(&mut self) {
22090        if let Some(prev) = &mut self.prev {
22091            if let Some(header_offset) = &self.header_offset {
22092                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22093            }
22094        }
22095    }
22096}
22097pub struct PushLinkinfoVrfAttrs<Prev: Pusher> {
22098    pub(crate) prev: Option<Prev>,
22099    pub(crate) header_offset: Option<usize>,
22100}
22101impl<Prev: Pusher> Pusher for PushLinkinfoVrfAttrs<Prev> {
22102    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22103        self.prev.as_mut().unwrap().as_vec_mut()
22104    }
22105    fn as_vec(&self) -> &Vec<u8> {
22106        self.prev.as_ref().unwrap().as_vec()
22107    }
22108}
22109impl<Prev: Pusher> PushLinkinfoVrfAttrs<Prev> {
22110    pub fn new(prev: Prev) -> Self {
22111        Self {
22112            prev: Some(prev),
22113            header_offset: None,
22114        }
22115    }
22116    pub fn end_nested(mut self) -> Prev {
22117        let mut prev = self.prev.take().unwrap();
22118        if let Some(header_offset) = &self.header_offset {
22119            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22120        }
22121        prev
22122    }
22123    pub fn push_table(mut self, value: u32) -> Self {
22124        push_header(self.as_vec_mut(), 1u16, 4 as u16);
22125        self.as_vec_mut().extend(value.to_ne_bytes());
22126        self
22127    }
22128}
22129impl<Prev: Pusher> Drop for PushLinkinfoVrfAttrs<Prev> {
22130    fn drop(&mut self) {
22131        if let Some(prev) = &mut self.prev {
22132            if let Some(header_offset) = &self.header_offset {
22133                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22134            }
22135        }
22136    }
22137}
22138pub struct PushXdpAttrs<Prev: Pusher> {
22139    pub(crate) prev: Option<Prev>,
22140    pub(crate) header_offset: Option<usize>,
22141}
22142impl<Prev: Pusher> Pusher for PushXdpAttrs<Prev> {
22143    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22144        self.prev.as_mut().unwrap().as_vec_mut()
22145    }
22146    fn as_vec(&self) -> &Vec<u8> {
22147        self.prev.as_ref().unwrap().as_vec()
22148    }
22149}
22150impl<Prev: Pusher> PushXdpAttrs<Prev> {
22151    pub fn new(prev: Prev) -> Self {
22152        Self {
22153            prev: Some(prev),
22154            header_offset: None,
22155        }
22156    }
22157    pub fn end_nested(mut self) -> Prev {
22158        let mut prev = self.prev.take().unwrap();
22159        if let Some(header_offset) = &self.header_offset {
22160            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22161        }
22162        prev
22163    }
22164    pub fn push_fd(mut self, value: i32) -> Self {
22165        push_header(self.as_vec_mut(), 1u16, 4 as u16);
22166        self.as_vec_mut().extend(value.to_ne_bytes());
22167        self
22168    }
22169    pub fn push_attached(mut self, value: u8) -> Self {
22170        push_header(self.as_vec_mut(), 2u16, 1 as u16);
22171        self.as_vec_mut().extend(value.to_ne_bytes());
22172        self
22173    }
22174    pub fn push_flags(mut self, value: u32) -> Self {
22175        push_header(self.as_vec_mut(), 3u16, 4 as u16);
22176        self.as_vec_mut().extend(value.to_ne_bytes());
22177        self
22178    }
22179    pub fn push_prog_id(mut self, value: u32) -> Self {
22180        push_header(self.as_vec_mut(), 4u16, 4 as u16);
22181        self.as_vec_mut().extend(value.to_ne_bytes());
22182        self
22183    }
22184    pub fn push_drv_prog_id(mut self, value: u32) -> Self {
22185        push_header(self.as_vec_mut(), 5u16, 4 as u16);
22186        self.as_vec_mut().extend(value.to_ne_bytes());
22187        self
22188    }
22189    pub fn push_skb_prog_id(mut self, value: u32) -> Self {
22190        push_header(self.as_vec_mut(), 6u16, 4 as u16);
22191        self.as_vec_mut().extend(value.to_ne_bytes());
22192        self
22193    }
22194    pub fn push_hw_prog_id(mut self, value: u32) -> Self {
22195        push_header(self.as_vec_mut(), 7u16, 4 as u16);
22196        self.as_vec_mut().extend(value.to_ne_bytes());
22197        self
22198    }
22199    pub fn push_expected_fd(mut self, value: i32) -> Self {
22200        push_header(self.as_vec_mut(), 8u16, 4 as u16);
22201        self.as_vec_mut().extend(value.to_ne_bytes());
22202        self
22203    }
22204}
22205impl<Prev: Pusher> Drop for PushXdpAttrs<Prev> {
22206    fn drop(&mut self) {
22207        if let Some(prev) = &mut self.prev {
22208            if let Some(header_offset) = &self.header_offset {
22209                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22210            }
22211        }
22212    }
22213}
22214pub struct PushIflaAttrs<Prev: Pusher> {
22215    pub(crate) prev: Option<Prev>,
22216    pub(crate) header_offset: Option<usize>,
22217}
22218impl<Prev: Pusher> Pusher for PushIflaAttrs<Prev> {
22219    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22220        self.prev.as_mut().unwrap().as_vec_mut()
22221    }
22222    fn as_vec(&self) -> &Vec<u8> {
22223        self.prev.as_ref().unwrap().as_vec()
22224    }
22225}
22226impl<Prev: Pusher> PushIflaAttrs<Prev> {
22227    pub fn new(prev: Prev) -> Self {
22228        Self {
22229            prev: Some(prev),
22230            header_offset: None,
22231        }
22232    }
22233    pub fn end_nested(mut self) -> Prev {
22234        let mut prev = self.prev.take().unwrap();
22235        if let Some(header_offset) = &self.header_offset {
22236            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22237        }
22238        prev
22239    }
22240    #[doc = "u32 indexed by ipv4-devconf - 1 on output, on input it\\'s a nest\n"]
22241    pub fn push_conf(mut self, value: &[u8]) -> Self {
22242        push_header(self.as_vec_mut(), 1u16, value.len() as u16);
22243        self.as_vec_mut().extend(value);
22244        self
22245    }
22246}
22247impl<Prev: Pusher> Drop for PushIflaAttrs<Prev> {
22248    fn drop(&mut self) {
22249        if let Some(prev) = &mut self.prev {
22250            if let Some(header_offset) = &self.header_offset {
22251                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22252            }
22253        }
22254    }
22255}
22256pub struct PushIfla6Attrs<Prev: Pusher> {
22257    pub(crate) prev: Option<Prev>,
22258    pub(crate) header_offset: Option<usize>,
22259}
22260impl<Prev: Pusher> Pusher for PushIfla6Attrs<Prev> {
22261    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22262        self.prev.as_mut().unwrap().as_vec_mut()
22263    }
22264    fn as_vec(&self) -> &Vec<u8> {
22265        self.prev.as_ref().unwrap().as_vec()
22266    }
22267}
22268impl<Prev: Pusher> PushIfla6Attrs<Prev> {
22269    pub fn new(prev: Prev) -> Self {
22270        Self {
22271            prev: Some(prev),
22272            header_offset: None,
22273        }
22274    }
22275    pub fn end_nested(mut self) -> Prev {
22276        let mut prev = self.prev.take().unwrap();
22277        if let Some(header_offset) = &self.header_offset {
22278            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22279        }
22280        prev
22281    }
22282    pub fn push_flags(mut self, value: u32) -> Self {
22283        push_header(self.as_vec_mut(), 1u16, 4 as u16);
22284        self.as_vec_mut().extend(value.to_ne_bytes());
22285        self
22286    }
22287    #[doc = "u32 indexed by ipv6-devconf - 1 on output, on input it\\'s a nest\n"]
22288    pub fn push_conf(mut self, value: &[u8]) -> Self {
22289        push_header(self.as_vec_mut(), 2u16, value.len() as u16);
22290        self.as_vec_mut().extend(value);
22291        self
22292    }
22293    pub fn push_stats(mut self, value: &[u8]) -> Self {
22294        push_header(self.as_vec_mut(), 3u16, value.len() as u16);
22295        self.as_vec_mut().extend(value);
22296        self
22297    }
22298    pub fn push_mcast(mut self, value: &[u8]) -> Self {
22299        push_header(self.as_vec_mut(), 4u16, value.len() as u16);
22300        self.as_vec_mut().extend(value);
22301        self
22302    }
22303    pub fn push_cacheinfo(mut self, value: IflaCacheinfo) -> Self {
22304        push_header(self.as_vec_mut(), 5u16, value.as_slice().len() as u16);
22305        self.as_vec_mut().extend(value.as_slice());
22306        self
22307    }
22308    pub fn push_icmp6stats(mut self, value: &[u8]) -> Self {
22309        push_header(self.as_vec_mut(), 6u16, value.len() as u16);
22310        self.as_vec_mut().extend(value);
22311        self
22312    }
22313    pub fn push_token(mut self, value: &[u8]) -> Self {
22314        push_header(self.as_vec_mut(), 7u16, value.len() as u16);
22315        self.as_vec_mut().extend(value);
22316        self
22317    }
22318    pub fn push_addr_gen_mode(mut self, value: u8) -> Self {
22319        push_header(self.as_vec_mut(), 8u16, 1 as u16);
22320        self.as_vec_mut().extend(value.to_ne_bytes());
22321        self
22322    }
22323    pub fn push_ra_mtu(mut self, value: u32) -> Self {
22324        push_header(self.as_vec_mut(), 9u16, 4 as u16);
22325        self.as_vec_mut().extend(value.to_ne_bytes());
22326        self
22327    }
22328}
22329impl<Prev: Pusher> Drop for PushIfla6Attrs<Prev> {
22330    fn drop(&mut self) {
22331        if let Some(prev) = &mut self.prev {
22332            if let Some(header_offset) = &self.header_offset {
22333                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22334            }
22335        }
22336    }
22337}
22338pub struct PushMctpAttrs<Prev: Pusher> {
22339    pub(crate) prev: Option<Prev>,
22340    pub(crate) header_offset: Option<usize>,
22341}
22342impl<Prev: Pusher> Pusher for PushMctpAttrs<Prev> {
22343    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22344        self.prev.as_mut().unwrap().as_vec_mut()
22345    }
22346    fn as_vec(&self) -> &Vec<u8> {
22347        self.prev.as_ref().unwrap().as_vec()
22348    }
22349}
22350impl<Prev: Pusher> PushMctpAttrs<Prev> {
22351    pub fn new(prev: Prev) -> Self {
22352        Self {
22353            prev: Some(prev),
22354            header_offset: None,
22355        }
22356    }
22357    pub fn end_nested(mut self) -> Prev {
22358        let mut prev = self.prev.take().unwrap();
22359        if let Some(header_offset) = &self.header_offset {
22360            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22361        }
22362        prev
22363    }
22364    pub fn push_net(mut self, value: u32) -> Self {
22365        push_header(self.as_vec_mut(), 1u16, 4 as u16);
22366        self.as_vec_mut().extend(value.to_ne_bytes());
22367        self
22368    }
22369    pub fn push_phys_binding(mut self, value: u8) -> Self {
22370        push_header(self.as_vec_mut(), 2u16, 1 as u16);
22371        self.as_vec_mut().extend(value.to_ne_bytes());
22372        self
22373    }
22374}
22375impl<Prev: Pusher> Drop for PushMctpAttrs<Prev> {
22376    fn drop(&mut self) {
22377        if let Some(prev) = &mut self.prev {
22378            if let Some(header_offset) = &self.header_offset {
22379                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22380            }
22381        }
22382    }
22383}
22384pub struct PushStatsAttrs<Prev: Pusher> {
22385    pub(crate) prev: Option<Prev>,
22386    pub(crate) header_offset: Option<usize>,
22387}
22388impl<Prev: Pusher> Pusher for PushStatsAttrs<Prev> {
22389    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22390        self.prev.as_mut().unwrap().as_vec_mut()
22391    }
22392    fn as_vec(&self) -> &Vec<u8> {
22393        self.prev.as_ref().unwrap().as_vec()
22394    }
22395}
22396impl<Prev: Pusher> PushStatsAttrs<Prev> {
22397    pub fn new(prev: Prev) -> Self {
22398        Self {
22399            prev: Some(prev),
22400            header_offset: None,
22401        }
22402    }
22403    pub fn end_nested(mut self) -> Prev {
22404        let mut prev = self.prev.take().unwrap();
22405        if let Some(header_offset) = &self.header_offset {
22406            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22407        }
22408        prev
22409    }
22410    pub fn push_link_64(mut self, value: RtnlLinkStats64) -> Self {
22411        push_header(self.as_vec_mut(), 1u16, value.as_slice().len() as u16);
22412        self.as_vec_mut().extend(value.as_slice());
22413        self
22414    }
22415    pub fn push_link_xstats(mut self, value: &[u8]) -> Self {
22416        push_header(self.as_vec_mut(), 2u16, value.len() as u16);
22417        self.as_vec_mut().extend(value);
22418        self
22419    }
22420    pub fn push_link_xstats_slave(mut self, value: &[u8]) -> Self {
22421        push_header(self.as_vec_mut(), 3u16, value.len() as u16);
22422        self.as_vec_mut().extend(value);
22423        self
22424    }
22425    pub fn nested_link_offload_xstats(mut self) -> PushLinkOffloadXstats<Self> {
22426        let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
22427        PushLinkOffloadXstats {
22428            prev: Some(self),
22429            header_offset: Some(header_offset),
22430        }
22431    }
22432    pub fn push_af_spec(mut self, value: &[u8]) -> Self {
22433        push_header(self.as_vec_mut(), 5u16, value.len() as u16);
22434        self.as_vec_mut().extend(value);
22435        self
22436    }
22437}
22438impl<Prev: Pusher> Drop for PushStatsAttrs<Prev> {
22439    fn drop(&mut self) {
22440        if let Some(prev) = &mut self.prev {
22441            if let Some(header_offset) = &self.header_offset {
22442                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22443            }
22444        }
22445    }
22446}
22447pub struct PushLinkOffloadXstats<Prev: Pusher> {
22448    pub(crate) prev: Option<Prev>,
22449    pub(crate) header_offset: Option<usize>,
22450}
22451impl<Prev: Pusher> Pusher for PushLinkOffloadXstats<Prev> {
22452    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22453        self.prev.as_mut().unwrap().as_vec_mut()
22454    }
22455    fn as_vec(&self) -> &Vec<u8> {
22456        self.prev.as_ref().unwrap().as_vec()
22457    }
22458}
22459pub struct PushArrayHwSInfoOne<Prev: Pusher> {
22460    pub(crate) prev: Option<Prev>,
22461    pub(crate) header_offset: Option<usize>,
22462    pub(crate) counter: u16,
22463}
22464impl<Prev: Pusher> Pusher for PushArrayHwSInfoOne<Prev> {
22465    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22466        self.prev.as_mut().unwrap().as_vec_mut()
22467    }
22468    fn as_vec(&self) -> &Vec<u8> {
22469        self.prev.as_ref().unwrap().as_vec()
22470    }
22471}
22472impl<Prev: Pusher> PushArrayHwSInfoOne<Prev> {
22473    pub fn new(prev: Prev) -> Self {
22474        Self {
22475            prev: Some(prev),
22476            header_offset: None,
22477            counter: 0,
22478        }
22479    }
22480    pub fn end_array(mut self) -> Prev {
22481        let mut prev = self.prev.take().unwrap();
22482        if let Some(header_offset) = &self.header_offset {
22483            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22484        }
22485        prev
22486    }
22487    pub fn entry_nested(mut self) -> PushHwSInfoOne<Self> {
22488        let index = self.counter;
22489        self.counter += 1;
22490        let header_offset = push_nested_header(self.as_vec_mut(), index);
22491        PushHwSInfoOne {
22492            prev: Some(self),
22493            header_offset: Some(header_offset),
22494        }
22495    }
22496}
22497impl<Prev: Pusher> Drop for PushArrayHwSInfoOne<Prev> {
22498    fn drop(&mut self) {
22499        if let Some(prev) = &mut self.prev {
22500            if let Some(header_offset) = &self.header_offset {
22501                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22502            }
22503        }
22504    }
22505}
22506impl<Prev: Pusher> PushLinkOffloadXstats<Prev> {
22507    pub fn new(prev: Prev) -> Self {
22508        Self {
22509            prev: Some(prev),
22510            header_offset: None,
22511        }
22512    }
22513    pub fn end_nested(mut self) -> Prev {
22514        let mut prev = self.prev.take().unwrap();
22515        if let Some(header_offset) = &self.header_offset {
22516            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22517        }
22518        prev
22519    }
22520    pub fn push_cpu_hit(mut self, value: &[u8]) -> Self {
22521        push_header(self.as_vec_mut(), 1u16, value.len() as u16);
22522        self.as_vec_mut().extend(value);
22523        self
22524    }
22525    pub fn array_hw_s_info(mut self) -> PushArrayHwSInfoOne<Self> {
22526        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
22527        PushArrayHwSInfoOne {
22528            prev: Some(self),
22529            header_offset: Some(header_offset),
22530            counter: 0,
22531        }
22532    }
22533    pub fn push_l3_stats(mut self, value: &[u8]) -> Self {
22534        push_header(self.as_vec_mut(), 3u16, value.len() as u16);
22535        self.as_vec_mut().extend(value);
22536        self
22537    }
22538}
22539impl<Prev: Pusher> Drop for PushLinkOffloadXstats<Prev> {
22540    fn drop(&mut self) {
22541        if let Some(prev) = &mut self.prev {
22542            if let Some(header_offset) = &self.header_offset {
22543                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22544            }
22545        }
22546    }
22547}
22548pub struct PushHwSInfoOne<Prev: Pusher> {
22549    pub(crate) prev: Option<Prev>,
22550    pub(crate) header_offset: Option<usize>,
22551}
22552impl<Prev: Pusher> Pusher for PushHwSInfoOne<Prev> {
22553    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22554        self.prev.as_mut().unwrap().as_vec_mut()
22555    }
22556    fn as_vec(&self) -> &Vec<u8> {
22557        self.prev.as_ref().unwrap().as_vec()
22558    }
22559}
22560impl<Prev: Pusher> PushHwSInfoOne<Prev> {
22561    pub fn new(prev: Prev) -> Self {
22562        Self {
22563            prev: Some(prev),
22564            header_offset: None,
22565        }
22566    }
22567    pub fn end_nested(mut self) -> Prev {
22568        let mut prev = self.prev.take().unwrap();
22569        if let Some(header_offset) = &self.header_offset {
22570            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22571        }
22572        prev
22573    }
22574    pub fn push_request(mut self, value: u8) -> Self {
22575        push_header(self.as_vec_mut(), 1u16, 1 as u16);
22576        self.as_vec_mut().extend(value.to_ne_bytes());
22577        self
22578    }
22579    pub fn push_used(mut self, value: u8) -> Self {
22580        push_header(self.as_vec_mut(), 2u16, 1 as u16);
22581        self.as_vec_mut().extend(value.to_ne_bytes());
22582        self
22583    }
22584}
22585impl<Prev: Pusher> Drop for PushHwSInfoOne<Prev> {
22586    fn drop(&mut self) {
22587        if let Some(prev) = &mut self.prev {
22588            if let Some(header_offset) = &self.header_offset {
22589                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22590            }
22591        }
22592    }
22593}
22594pub struct PushLinkDpllPinAttrs<Prev: Pusher> {
22595    pub(crate) prev: Option<Prev>,
22596    pub(crate) header_offset: Option<usize>,
22597}
22598impl<Prev: Pusher> Pusher for PushLinkDpllPinAttrs<Prev> {
22599    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22600        self.prev.as_mut().unwrap().as_vec_mut()
22601    }
22602    fn as_vec(&self) -> &Vec<u8> {
22603        self.prev.as_ref().unwrap().as_vec()
22604    }
22605}
22606impl<Prev: Pusher> PushLinkDpllPinAttrs<Prev> {
22607    pub fn new(prev: Prev) -> Self {
22608        Self {
22609            prev: Some(prev),
22610            header_offset: None,
22611        }
22612    }
22613    pub fn end_nested(mut self) -> Prev {
22614        let mut prev = self.prev.take().unwrap();
22615        if let Some(header_offset) = &self.header_offset {
22616            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22617        }
22618        prev
22619    }
22620    pub fn push_id(mut self, value: u32) -> Self {
22621        push_header(self.as_vec_mut(), 1u16, 4 as u16);
22622        self.as_vec_mut().extend(value.to_ne_bytes());
22623        self
22624    }
22625}
22626impl<Prev: Pusher> Drop for PushLinkDpllPinAttrs<Prev> {
22627    fn drop(&mut self) {
22628        if let Some(prev) = &mut self.prev {
22629            if let Some(header_offset) = &self.header_offset {
22630                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22631            }
22632        }
22633    }
22634}
22635pub struct PushLinkinfoNetkitAttrs<Prev: Pusher> {
22636    pub(crate) prev: Option<Prev>,
22637    pub(crate) header_offset: Option<usize>,
22638}
22639impl<Prev: Pusher> Pusher for PushLinkinfoNetkitAttrs<Prev> {
22640    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22641        self.prev.as_mut().unwrap().as_vec_mut()
22642    }
22643    fn as_vec(&self) -> &Vec<u8> {
22644        self.prev.as_ref().unwrap().as_vec()
22645    }
22646}
22647impl<Prev: Pusher> PushLinkinfoNetkitAttrs<Prev> {
22648    pub fn new(prev: Prev) -> Self {
22649        Self {
22650            prev: Some(prev),
22651            header_offset: None,
22652        }
22653    }
22654    pub fn end_nested(mut self) -> Prev {
22655        let mut prev = self.prev.take().unwrap();
22656        if let Some(header_offset) = &self.header_offset {
22657            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22658        }
22659        prev
22660    }
22661    pub fn push_peer_info(mut self, value: &[u8]) -> Self {
22662        push_header(self.as_vec_mut(), 1u16, value.len() as u16);
22663        self.as_vec_mut().extend(value);
22664        self
22665    }
22666    pub fn push_primary(mut self, value: u8) -> Self {
22667        push_header(self.as_vec_mut(), 2u16, 1 as u16);
22668        self.as_vec_mut().extend(value.to_ne_bytes());
22669        self
22670    }
22671    #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
22672    pub fn push_policy(mut self, value: u32) -> Self {
22673        push_header(self.as_vec_mut(), 3u16, 4 as u16);
22674        self.as_vec_mut().extend(value.to_ne_bytes());
22675        self
22676    }
22677    #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
22678    pub fn push_peer_policy(mut self, value: u32) -> Self {
22679        push_header(self.as_vec_mut(), 4u16, 4 as u16);
22680        self.as_vec_mut().extend(value.to_ne_bytes());
22681        self
22682    }
22683    #[doc = "Associated type: [`NetkitMode`] (enum)"]
22684    pub fn push_mode(mut self, value: u32) -> Self {
22685        push_header(self.as_vec_mut(), 5u16, 4 as u16);
22686        self.as_vec_mut().extend(value.to_ne_bytes());
22687        self
22688    }
22689    #[doc = "Associated type: [`NetkitScrub`] (enum)"]
22690    pub fn push_scrub(mut self, value: u32) -> Self {
22691        push_header(self.as_vec_mut(), 6u16, 4 as u16);
22692        self.as_vec_mut().extend(value.to_ne_bytes());
22693        self
22694    }
22695    #[doc = "Associated type: [`NetkitScrub`] (enum)"]
22696    pub fn push_peer_scrub(mut self, value: u32) -> Self {
22697        push_header(self.as_vec_mut(), 7u16, 4 as u16);
22698        self.as_vec_mut().extend(value.to_ne_bytes());
22699        self
22700    }
22701    pub fn push_headroom(mut self, value: u16) -> Self {
22702        push_header(self.as_vec_mut(), 8u16, 2 as u16);
22703        self.as_vec_mut().extend(value.to_ne_bytes());
22704        self
22705    }
22706    pub fn push_tailroom(mut self, value: u16) -> Self {
22707        push_header(self.as_vec_mut(), 9u16, 2 as u16);
22708        self.as_vec_mut().extend(value.to_ne_bytes());
22709        self
22710    }
22711    #[doc = "Associated type: [`NetkitPairing`] (enum)"]
22712    pub fn push_pairing(mut self, value: u32) -> Self {
22713        push_header(self.as_vec_mut(), 10u16, 4 as u16);
22714        self.as_vec_mut().extend(value.to_ne_bytes());
22715        self
22716    }
22717}
22718impl<Prev: Pusher> Drop for PushLinkinfoNetkitAttrs<Prev> {
22719    fn drop(&mut self) {
22720        if let Some(prev) = &mut self.prev {
22721            if let Some(header_offset) = &self.header_offset {
22722                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22723            }
22724        }
22725    }
22726}
22727pub struct PushLinkinfoOvpnAttrs<Prev: Pusher> {
22728    pub(crate) prev: Option<Prev>,
22729    pub(crate) header_offset: Option<usize>,
22730}
22731impl<Prev: Pusher> Pusher for PushLinkinfoOvpnAttrs<Prev> {
22732    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22733        self.prev.as_mut().unwrap().as_vec_mut()
22734    }
22735    fn as_vec(&self) -> &Vec<u8> {
22736        self.prev.as_ref().unwrap().as_vec()
22737    }
22738}
22739impl<Prev: Pusher> PushLinkinfoOvpnAttrs<Prev> {
22740    pub fn new(prev: Prev) -> Self {
22741        Self {
22742            prev: Some(prev),
22743            header_offset: None,
22744        }
22745    }
22746    pub fn end_nested(mut self) -> Prev {
22747        let mut prev = self.prev.take().unwrap();
22748        if let Some(header_offset) = &self.header_offset {
22749            finalize_nested_header(prev.as_vec_mut(), *header_offset);
22750        }
22751        prev
22752    }
22753    #[doc = "Associated type: [`OvpnMode`] (enum)"]
22754    pub fn push_mode(mut self, value: u8) -> Self {
22755        push_header(self.as_vec_mut(), 1u16, 1 as u16);
22756        self.as_vec_mut().extend(value.to_ne_bytes());
22757        self
22758    }
22759}
22760impl<Prev: Pusher> Drop for PushLinkinfoOvpnAttrs<Prev> {
22761    fn drop(&mut self) {
22762        if let Some(prev) = &mut self.prev {
22763            if let Some(header_offset) = &self.header_offset {
22764                finalize_nested_header(prev.as_vec_mut(), *header_offset);
22765            }
22766        }
22767    }
22768}
22769#[doc = "Create a new link.\n\nRequest attributes:\n- [.push_address()](PushLinkAttrs::push_address)\n- [.push_broadcast()](PushLinkAttrs::push_broadcast)\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_mtu()](PushLinkAttrs::push_mtu)\n- [.push_txqlen()](PushLinkAttrs::push_txqlen)\n- [.push_operstate()](PushLinkAttrs::push_operstate)\n- [.push_linkmode()](PushLinkAttrs::push_linkmode)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_net_ns_pid()](PushLinkAttrs::push_net_ns_pid)\n- [.nested_af_spec()](PushLinkAttrs::nested_af_spec)\n- [.push_group()](PushLinkAttrs::push_group)\n- [.push_net_ns_fd()](PushLinkAttrs::push_net_ns_fd)\n- [.push_num_tx_queues()](PushLinkAttrs::push_num_tx_queues)\n- [.push_num_rx_queues()](PushLinkAttrs::push_num_rx_queues)\n- [.push_link_netnsid()](PushLinkAttrs::push_link_netnsid)\n- [.push_gso_max_segs()](PushLinkAttrs::push_gso_max_segs)\n- [.push_gso_max_size()](PushLinkAttrs::push_gso_max_size)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_gro_max_size()](PushLinkAttrs::push_gro_max_size)\n- [.push_gso_ipv4_max_size()](PushLinkAttrs::push_gso_ipv4_max_size)\n- [.push_gro_ipv4_max_size()](PushLinkAttrs::push_gro_ipv4_max_size)\n\n"]
22770#[derive(Debug)]
22771pub struct OpNewlinkDo<'r> {
22772    request: Request<'r>,
22773}
22774impl<'r> OpNewlinkDo<'r> {
22775    pub fn new(mut request: Request<'r>, header: &Ifinfomsg) -> Self {
22776        Self::write_header(request.buf_mut(), header);
22777        Self { request: request }
22778    }
22779    pub fn encode_request<'buf>(
22780        buf: &'buf mut Vec<u8>,
22781        header: &Ifinfomsg,
22782    ) -> PushLinkAttrs<&'buf mut Vec<u8>> {
22783        Self::write_header(buf, header);
22784        PushLinkAttrs::new(buf)
22785    }
22786    pub fn encode(&mut self) -> PushLinkAttrs<&mut Vec<u8>> {
22787        PushLinkAttrs::new(self.request.buf_mut())
22788    }
22789    pub fn into_encoder(self) -> PushLinkAttrs<RequestBuf<'r>> {
22790        PushLinkAttrs::new(self.request.buf)
22791    }
22792    pub fn decode_request<'a>(buf: &'a [u8]) -> (Ifinfomsg, IterableLinkAttrs<'a>) {
22793        let (header, attrs) = buf.split_at(buf.len().min(Ifinfomsg::len()));
22794        (
22795            Ifinfomsg::new_from_slice(header).unwrap_or_default(),
22796            IterableLinkAttrs::with_loc(attrs, buf.as_ptr() as usize),
22797        )
22798    }
22799    fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Ifinfomsg) {
22800        prev.as_vec_mut().extend(header.as_slice());
22801    }
22802}
22803impl NetlinkRequest for OpNewlinkDo<'_> {
22804    fn protocol(&self) -> Protocol {
22805        Protocol::Raw {
22806            protonum: 0u16,
22807            request_type: 16u16,
22808        }
22809    }
22810    fn flags(&self) -> u16 {
22811        self.request.flags
22812    }
22813    fn payload(&self) -> &[u8] {
22814        self.request.buf()
22815    }
22816    type ReplyType<'buf> = (Ifinfomsg, IterableLinkAttrs<'buf>);
22817    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22818        Self::decode_request(buf)
22819    }
22820    fn lookup(
22821        buf: &[u8],
22822        offset: usize,
22823        missing_type: Option<u16>,
22824    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22825        Self::decode_request(buf)
22826            .1
22827            .lookup_attr(offset, missing_type)
22828    }
22829}
22830#[doc = "Delete an existing link.\n\nRequest attributes:\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n\n"]
22831#[derive(Debug)]
22832pub struct OpDellinkDo<'r> {
22833    request: Request<'r>,
22834}
22835impl<'r> OpDellinkDo<'r> {
22836    pub fn new(mut request: Request<'r>, header: &Ifinfomsg) -> Self {
22837        Self::write_header(request.buf_mut(), header);
22838        Self { request: request }
22839    }
22840    pub fn encode_request<'buf>(
22841        buf: &'buf mut Vec<u8>,
22842        header: &Ifinfomsg,
22843    ) -> PushLinkAttrs<&'buf mut Vec<u8>> {
22844        Self::write_header(buf, header);
22845        PushLinkAttrs::new(buf)
22846    }
22847    pub fn encode(&mut self) -> PushLinkAttrs<&mut Vec<u8>> {
22848        PushLinkAttrs::new(self.request.buf_mut())
22849    }
22850    pub fn into_encoder(self) -> PushLinkAttrs<RequestBuf<'r>> {
22851        PushLinkAttrs::new(self.request.buf)
22852    }
22853    pub fn decode_request<'a>(buf: &'a [u8]) -> (Ifinfomsg, IterableLinkAttrs<'a>) {
22854        let (header, attrs) = buf.split_at(buf.len().min(Ifinfomsg::len()));
22855        (
22856            Ifinfomsg::new_from_slice(header).unwrap_or_default(),
22857            IterableLinkAttrs::with_loc(attrs, buf.as_ptr() as usize),
22858        )
22859    }
22860    fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Ifinfomsg) {
22861        prev.as_vec_mut().extend(header.as_slice());
22862    }
22863}
22864impl NetlinkRequest for OpDellinkDo<'_> {
22865    fn protocol(&self) -> Protocol {
22866        Protocol::Raw {
22867            protonum: 0u16,
22868            request_type: 17u16,
22869        }
22870    }
22871    fn flags(&self) -> u16 {
22872        self.request.flags
22873    }
22874    fn payload(&self) -> &[u8] {
22875        self.request.buf()
22876    }
22877    type ReplyType<'buf> = (Ifinfomsg, IterableLinkAttrs<'buf>);
22878    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22879        Self::decode_request(buf)
22880    }
22881    fn lookup(
22882        buf: &[u8],
22883        offset: usize,
22884        missing_type: Option<u16>,
22885    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22886        Self::decode_request(buf)
22887            .1
22888            .lookup_attr(offset, missing_type)
22889    }
22890}
22891#[doc = "Get / dump information about a link.\n\nRequest attributes:\n- [.push_master()](PushLinkAttrs::push_master)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n\nReply attributes:\n- [.get_address()](IterableLinkAttrs::get_address)\n- [.get_broadcast()](IterableLinkAttrs::get_broadcast)\n- [.get_ifname()](IterableLinkAttrs::get_ifname)\n- [.get_mtu()](IterableLinkAttrs::get_mtu)\n- [.get_link()](IterableLinkAttrs::get_link)\n- [.get_qdisc()](IterableLinkAttrs::get_qdisc)\n- [.get_stats()](IterableLinkAttrs::get_stats)\n- [.get_master()](IterableLinkAttrs::get_master)\n- [.get_wireless()](IterableLinkAttrs::get_wireless)\n- [.get_protinfo()](IterableLinkAttrs::get_protinfo)\n- [.get_txqlen()](IterableLinkAttrs::get_txqlen)\n- [.get_map()](IterableLinkAttrs::get_map)\n- [.get_weight()](IterableLinkAttrs::get_weight)\n- [.get_operstate()](IterableLinkAttrs::get_operstate)\n- [.get_linkmode()](IterableLinkAttrs::get_linkmode)\n- [.get_linkinfo()](IterableLinkAttrs::get_linkinfo)\n- [.get_net_ns_pid()](IterableLinkAttrs::get_net_ns_pid)\n- [.get_ifalias()](IterableLinkAttrs::get_ifalias)\n- [.get_num_vf()](IterableLinkAttrs::get_num_vf)\n- [.get_vfinfo_list()](IterableLinkAttrs::get_vfinfo_list)\n- [.get_stats64()](IterableLinkAttrs::get_stats64)\n- [.get_vf_ports()](IterableLinkAttrs::get_vf_ports)\n- [.get_port_self()](IterableLinkAttrs::get_port_self)\n- [.get_af_spec()](IterableLinkAttrs::get_af_spec)\n- [.get_group()](IterableLinkAttrs::get_group)\n- [.get_net_ns_fd()](IterableLinkAttrs::get_net_ns_fd)\n- [.get_ext_mask()](IterableLinkAttrs::get_ext_mask)\n- [.get_promiscuity()](IterableLinkAttrs::get_promiscuity)\n- [.get_num_tx_queues()](IterableLinkAttrs::get_num_tx_queues)\n- [.get_num_rx_queues()](IterableLinkAttrs::get_num_rx_queues)\n- [.get_carrier()](IterableLinkAttrs::get_carrier)\n- [.get_phys_port_id()](IterableLinkAttrs::get_phys_port_id)\n- [.get_carrier_changes()](IterableLinkAttrs::get_carrier_changes)\n- [.get_phys_switch_id()](IterableLinkAttrs::get_phys_switch_id)\n- [.get_link_netnsid()](IterableLinkAttrs::get_link_netnsid)\n- [.get_phys_port_name()](IterableLinkAttrs::get_phys_port_name)\n- [.get_proto_down()](IterableLinkAttrs::get_proto_down)\n- [.get_gso_max_segs()](IterableLinkAttrs::get_gso_max_segs)\n- [.get_gso_max_size()](IterableLinkAttrs::get_gso_max_size)\n- [.get_xdp()](IterableLinkAttrs::get_xdp)\n- [.get_event()](IterableLinkAttrs::get_event)\n- [.get_new_netnsid()](IterableLinkAttrs::get_new_netnsid)\n- [.get_target_netnsid()](IterableLinkAttrs::get_target_netnsid)\n- [.get_carrier_up_count()](IterableLinkAttrs::get_carrier_up_count)\n- [.get_carrier_down_count()](IterableLinkAttrs::get_carrier_down_count)\n- [.get_new_ifindex()](IterableLinkAttrs::get_new_ifindex)\n- [.get_min_mtu()](IterableLinkAttrs::get_min_mtu)\n- [.get_max_mtu()](IterableLinkAttrs::get_max_mtu)\n- [.get_prop_list()](IterableLinkAttrs::get_prop_list)\n- [.get_perm_address()](IterableLinkAttrs::get_perm_address)\n- [.get_proto_down_reason()](IterableLinkAttrs::get_proto_down_reason)\n- [.get_parent_dev_name()](IterableLinkAttrs::get_parent_dev_name)\n- [.get_parent_dev_bus_name()](IterableLinkAttrs::get_parent_dev_bus_name)\n- [.get_gro_max_size()](IterableLinkAttrs::get_gro_max_size)\n- [.get_tso_max_size()](IterableLinkAttrs::get_tso_max_size)\n- [.get_tso_max_segs()](IterableLinkAttrs::get_tso_max_segs)\n- [.get_allmulti()](IterableLinkAttrs::get_allmulti)\n- [.get_devlink_port()](IterableLinkAttrs::get_devlink_port)\n- [.get_gso_ipv4_max_size()](IterableLinkAttrs::get_gso_ipv4_max_size)\n- [.get_gro_ipv4_max_size()](IterableLinkAttrs::get_gro_ipv4_max_size)\n\n"]
22892#[derive(Debug)]
22893pub struct OpGetlinkDump<'r> {
22894    request: Request<'r>,
22895}
22896impl<'r> OpGetlinkDump<'r> {
22897    pub fn new(mut request: Request<'r>, header: &Ifinfomsg) -> Self {
22898        Self::write_header(request.buf_mut(), header);
22899        Self {
22900            request: request.set_dump(),
22901        }
22902    }
22903    pub fn encode_request<'buf>(
22904        buf: &'buf mut Vec<u8>,
22905        header: &Ifinfomsg,
22906    ) -> PushLinkAttrs<&'buf mut Vec<u8>> {
22907        Self::write_header(buf, header);
22908        PushLinkAttrs::new(buf)
22909    }
22910    pub fn encode(&mut self) -> PushLinkAttrs<&mut Vec<u8>> {
22911        PushLinkAttrs::new(self.request.buf_mut())
22912    }
22913    pub fn into_encoder(self) -> PushLinkAttrs<RequestBuf<'r>> {
22914        PushLinkAttrs::new(self.request.buf)
22915    }
22916    pub fn decode_request<'a>(buf: &'a [u8]) -> (Ifinfomsg, IterableLinkAttrs<'a>) {
22917        let (header, attrs) = buf.split_at(buf.len().min(Ifinfomsg::len()));
22918        (
22919            Ifinfomsg::new_from_slice(header).unwrap_or_default(),
22920            IterableLinkAttrs::with_loc(attrs, buf.as_ptr() as usize),
22921        )
22922    }
22923    fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Ifinfomsg) {
22924        prev.as_vec_mut().extend(header.as_slice());
22925    }
22926}
22927impl NetlinkRequest for OpGetlinkDump<'_> {
22928    fn protocol(&self) -> Protocol {
22929        Protocol::Raw {
22930            protonum: 0u16,
22931            request_type: 18u16,
22932        }
22933    }
22934    fn flags(&self) -> u16 {
22935        self.request.flags
22936    }
22937    fn payload(&self) -> &[u8] {
22938        self.request.buf()
22939    }
22940    type ReplyType<'buf> = (Ifinfomsg, IterableLinkAttrs<'buf>);
22941    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22942        Self::decode_request(buf)
22943    }
22944    fn lookup(
22945        buf: &[u8],
22946        offset: usize,
22947        missing_type: Option<u16>,
22948    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22949        Self::decode_request(buf)
22950            .1
22951            .lookup_attr(offset, missing_type)
22952    }
22953}
22954#[doc = "Get / dump information about a link.\n\nRequest attributes:\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_alt_ifname()](PushLinkAttrs::push_alt_ifname)\n\nReply attributes:\n- [.get_address()](IterableLinkAttrs::get_address)\n- [.get_broadcast()](IterableLinkAttrs::get_broadcast)\n- [.get_ifname()](IterableLinkAttrs::get_ifname)\n- [.get_mtu()](IterableLinkAttrs::get_mtu)\n- [.get_link()](IterableLinkAttrs::get_link)\n- [.get_qdisc()](IterableLinkAttrs::get_qdisc)\n- [.get_stats()](IterableLinkAttrs::get_stats)\n- [.get_master()](IterableLinkAttrs::get_master)\n- [.get_wireless()](IterableLinkAttrs::get_wireless)\n- [.get_protinfo()](IterableLinkAttrs::get_protinfo)\n- [.get_txqlen()](IterableLinkAttrs::get_txqlen)\n- [.get_map()](IterableLinkAttrs::get_map)\n- [.get_weight()](IterableLinkAttrs::get_weight)\n- [.get_operstate()](IterableLinkAttrs::get_operstate)\n- [.get_linkmode()](IterableLinkAttrs::get_linkmode)\n- [.get_linkinfo()](IterableLinkAttrs::get_linkinfo)\n- [.get_net_ns_pid()](IterableLinkAttrs::get_net_ns_pid)\n- [.get_ifalias()](IterableLinkAttrs::get_ifalias)\n- [.get_num_vf()](IterableLinkAttrs::get_num_vf)\n- [.get_vfinfo_list()](IterableLinkAttrs::get_vfinfo_list)\n- [.get_stats64()](IterableLinkAttrs::get_stats64)\n- [.get_vf_ports()](IterableLinkAttrs::get_vf_ports)\n- [.get_port_self()](IterableLinkAttrs::get_port_self)\n- [.get_af_spec()](IterableLinkAttrs::get_af_spec)\n- [.get_group()](IterableLinkAttrs::get_group)\n- [.get_net_ns_fd()](IterableLinkAttrs::get_net_ns_fd)\n- [.get_ext_mask()](IterableLinkAttrs::get_ext_mask)\n- [.get_promiscuity()](IterableLinkAttrs::get_promiscuity)\n- [.get_num_tx_queues()](IterableLinkAttrs::get_num_tx_queues)\n- [.get_num_rx_queues()](IterableLinkAttrs::get_num_rx_queues)\n- [.get_carrier()](IterableLinkAttrs::get_carrier)\n- [.get_phys_port_id()](IterableLinkAttrs::get_phys_port_id)\n- [.get_carrier_changes()](IterableLinkAttrs::get_carrier_changes)\n- [.get_phys_switch_id()](IterableLinkAttrs::get_phys_switch_id)\n- [.get_link_netnsid()](IterableLinkAttrs::get_link_netnsid)\n- [.get_phys_port_name()](IterableLinkAttrs::get_phys_port_name)\n- [.get_proto_down()](IterableLinkAttrs::get_proto_down)\n- [.get_gso_max_segs()](IterableLinkAttrs::get_gso_max_segs)\n- [.get_gso_max_size()](IterableLinkAttrs::get_gso_max_size)\n- [.get_xdp()](IterableLinkAttrs::get_xdp)\n- [.get_event()](IterableLinkAttrs::get_event)\n- [.get_new_netnsid()](IterableLinkAttrs::get_new_netnsid)\n- [.get_target_netnsid()](IterableLinkAttrs::get_target_netnsid)\n- [.get_carrier_up_count()](IterableLinkAttrs::get_carrier_up_count)\n- [.get_carrier_down_count()](IterableLinkAttrs::get_carrier_down_count)\n- [.get_new_ifindex()](IterableLinkAttrs::get_new_ifindex)\n- [.get_min_mtu()](IterableLinkAttrs::get_min_mtu)\n- [.get_max_mtu()](IterableLinkAttrs::get_max_mtu)\n- [.get_prop_list()](IterableLinkAttrs::get_prop_list)\n- [.get_perm_address()](IterableLinkAttrs::get_perm_address)\n- [.get_proto_down_reason()](IterableLinkAttrs::get_proto_down_reason)\n- [.get_parent_dev_name()](IterableLinkAttrs::get_parent_dev_name)\n- [.get_parent_dev_bus_name()](IterableLinkAttrs::get_parent_dev_bus_name)\n- [.get_gro_max_size()](IterableLinkAttrs::get_gro_max_size)\n- [.get_tso_max_size()](IterableLinkAttrs::get_tso_max_size)\n- [.get_tso_max_segs()](IterableLinkAttrs::get_tso_max_segs)\n- [.get_allmulti()](IterableLinkAttrs::get_allmulti)\n- [.get_devlink_port()](IterableLinkAttrs::get_devlink_port)\n- [.get_gso_ipv4_max_size()](IterableLinkAttrs::get_gso_ipv4_max_size)\n- [.get_gro_ipv4_max_size()](IterableLinkAttrs::get_gro_ipv4_max_size)\n\n"]
22955#[derive(Debug)]
22956pub struct OpGetlinkDo<'r> {
22957    request: Request<'r>,
22958}
22959impl<'r> OpGetlinkDo<'r> {
22960    pub fn new(mut request: Request<'r>, header: &Ifinfomsg) -> Self {
22961        Self::write_header(request.buf_mut(), header);
22962        Self { request: request }
22963    }
22964    pub fn encode_request<'buf>(
22965        buf: &'buf mut Vec<u8>,
22966        header: &Ifinfomsg,
22967    ) -> PushLinkAttrs<&'buf mut Vec<u8>> {
22968        Self::write_header(buf, header);
22969        PushLinkAttrs::new(buf)
22970    }
22971    pub fn encode(&mut self) -> PushLinkAttrs<&mut Vec<u8>> {
22972        PushLinkAttrs::new(self.request.buf_mut())
22973    }
22974    pub fn into_encoder(self) -> PushLinkAttrs<RequestBuf<'r>> {
22975        PushLinkAttrs::new(self.request.buf)
22976    }
22977    pub fn decode_request<'a>(buf: &'a [u8]) -> (Ifinfomsg, IterableLinkAttrs<'a>) {
22978        let (header, attrs) = buf.split_at(buf.len().min(Ifinfomsg::len()));
22979        (
22980            Ifinfomsg::new_from_slice(header).unwrap_or_default(),
22981            IterableLinkAttrs::with_loc(attrs, buf.as_ptr() as usize),
22982        )
22983    }
22984    fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Ifinfomsg) {
22985        prev.as_vec_mut().extend(header.as_slice());
22986    }
22987}
22988impl NetlinkRequest for OpGetlinkDo<'_> {
22989    fn protocol(&self) -> Protocol {
22990        Protocol::Raw {
22991            protonum: 0u16,
22992            request_type: 18u16,
22993        }
22994    }
22995    fn flags(&self) -> u16 {
22996        self.request.flags
22997    }
22998    fn payload(&self) -> &[u8] {
22999        self.request.buf()
23000    }
23001    type ReplyType<'buf> = (Ifinfomsg, IterableLinkAttrs<'buf>);
23002    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23003        Self::decode_request(buf)
23004    }
23005    fn lookup(
23006        buf: &[u8],
23007        offset: usize,
23008        missing_type: Option<u16>,
23009    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23010        Self::decode_request(buf)
23011            .1
23012            .lookup_attr(offset, missing_type)
23013    }
23014}
23015#[doc = "Set information about a link.\n\nRequest attributes:\n- [.push_address()](PushLinkAttrs::push_address)\n- [.push_broadcast()](PushLinkAttrs::push_broadcast)\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_mtu()](PushLinkAttrs::push_mtu)\n- [.push_link()](PushLinkAttrs::push_link)\n- [.push_qdisc()](PushLinkAttrs::push_qdisc)\n- [.push_stats()](PushLinkAttrs::push_stats)\n- [.push_master()](PushLinkAttrs::push_master)\n- [.push_wireless()](PushLinkAttrs::push_wireless)\n- [.push_protinfo()](PushLinkAttrs::push_protinfo)\n- [.push_txqlen()](PushLinkAttrs::push_txqlen)\n- [.push_map()](PushLinkAttrs::push_map)\n- [.push_weight()](PushLinkAttrs::push_weight)\n- [.push_operstate()](PushLinkAttrs::push_operstate)\n- [.push_linkmode()](PushLinkAttrs::push_linkmode)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_net_ns_pid()](PushLinkAttrs::push_net_ns_pid)\n- [.push_ifalias()](PushLinkAttrs::push_ifalias)\n- [.push_num_vf()](PushLinkAttrs::push_num_vf)\n- [.nested_vfinfo_list()](PushLinkAttrs::nested_vfinfo_list)\n- [.push_stats64()](PushLinkAttrs::push_stats64)\n- [.nested_vf_ports()](PushLinkAttrs::nested_vf_ports)\n- [.nested_port_self()](PushLinkAttrs::nested_port_self)\n- [.nested_af_spec()](PushLinkAttrs::nested_af_spec)\n- [.push_group()](PushLinkAttrs::push_group)\n- [.push_net_ns_fd()](PushLinkAttrs::push_net_ns_fd)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_promiscuity()](PushLinkAttrs::push_promiscuity)\n- [.push_num_tx_queues()](PushLinkAttrs::push_num_tx_queues)\n- [.push_num_rx_queues()](PushLinkAttrs::push_num_rx_queues)\n- [.push_carrier()](PushLinkAttrs::push_carrier)\n- [.push_phys_port_id()](PushLinkAttrs::push_phys_port_id)\n- [.push_carrier_changes()](PushLinkAttrs::push_carrier_changes)\n- [.push_phys_switch_id()](PushLinkAttrs::push_phys_switch_id)\n- [.push_link_netnsid()](PushLinkAttrs::push_link_netnsid)\n- [.push_phys_port_name()](PushLinkAttrs::push_phys_port_name)\n- [.push_proto_down()](PushLinkAttrs::push_proto_down)\n- [.push_gso_max_segs()](PushLinkAttrs::push_gso_max_segs)\n- [.push_gso_max_size()](PushLinkAttrs::push_gso_max_size)\n- [.nested_xdp()](PushLinkAttrs::nested_xdp)\n- [.push_event()](PushLinkAttrs::push_event)\n- [.push_new_netnsid()](PushLinkAttrs::push_new_netnsid)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_carrier_up_count()](PushLinkAttrs::push_carrier_up_count)\n- [.push_carrier_down_count()](PushLinkAttrs::push_carrier_down_count)\n- [.push_new_ifindex()](PushLinkAttrs::push_new_ifindex)\n- [.push_min_mtu()](PushLinkAttrs::push_min_mtu)\n- [.push_max_mtu()](PushLinkAttrs::push_max_mtu)\n- [.nested_prop_list()](PushLinkAttrs::nested_prop_list)\n- [.push_perm_address()](PushLinkAttrs::push_perm_address)\n- [.push_proto_down_reason()](PushLinkAttrs::push_proto_down_reason)\n- [.push_parent_dev_name()](PushLinkAttrs::push_parent_dev_name)\n- [.push_parent_dev_bus_name()](PushLinkAttrs::push_parent_dev_bus_name)\n- [.push_gro_max_size()](PushLinkAttrs::push_gro_max_size)\n- [.push_tso_max_size()](PushLinkAttrs::push_tso_max_size)\n- [.push_tso_max_segs()](PushLinkAttrs::push_tso_max_segs)\n- [.push_allmulti()](PushLinkAttrs::push_allmulti)\n- [.push_devlink_port()](PushLinkAttrs::push_devlink_port)\n- [.push_gso_ipv4_max_size()](PushLinkAttrs::push_gso_ipv4_max_size)\n- [.push_gro_ipv4_max_size()](PushLinkAttrs::push_gro_ipv4_max_size)\n\n"]
23016#[derive(Debug)]
23017pub struct OpSetlinkDo<'r> {
23018    request: Request<'r>,
23019}
23020impl<'r> OpSetlinkDo<'r> {
23021    pub fn new(mut request: Request<'r>, header: &Ifinfomsg) -> Self {
23022        Self::write_header(request.buf_mut(), header);
23023        Self { request: request }
23024    }
23025    pub fn encode_request<'buf>(
23026        buf: &'buf mut Vec<u8>,
23027        header: &Ifinfomsg,
23028    ) -> PushLinkAttrs<&'buf mut Vec<u8>> {
23029        Self::write_header(buf, header);
23030        PushLinkAttrs::new(buf)
23031    }
23032    pub fn encode(&mut self) -> PushLinkAttrs<&mut Vec<u8>> {
23033        PushLinkAttrs::new(self.request.buf_mut())
23034    }
23035    pub fn into_encoder(self) -> PushLinkAttrs<RequestBuf<'r>> {
23036        PushLinkAttrs::new(self.request.buf)
23037    }
23038    pub fn decode_request<'a>(buf: &'a [u8]) -> (Ifinfomsg, IterableLinkAttrs<'a>) {
23039        let (header, attrs) = buf.split_at(buf.len().min(Ifinfomsg::len()));
23040        (
23041            Ifinfomsg::new_from_slice(header).unwrap_or_default(),
23042            IterableLinkAttrs::with_loc(attrs, buf.as_ptr() as usize),
23043        )
23044    }
23045    fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Ifinfomsg) {
23046        prev.as_vec_mut().extend(header.as_slice());
23047    }
23048}
23049impl NetlinkRequest for OpSetlinkDo<'_> {
23050    fn protocol(&self) -> Protocol {
23051        Protocol::Raw {
23052            protonum: 0u16,
23053            request_type: 19u16,
23054        }
23055    }
23056    fn flags(&self) -> u16 {
23057        self.request.flags
23058    }
23059    fn payload(&self) -> &[u8] {
23060        self.request.buf()
23061    }
23062    type ReplyType<'buf> = (Ifinfomsg, IterableLinkAttrs<'buf>);
23063    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23064        Self::decode_request(buf)
23065    }
23066    fn lookup(
23067        buf: &[u8],
23068        offset: usize,
23069        missing_type: Option<u16>,
23070    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23071        Self::decode_request(buf)
23072            .1
23073            .lookup_attr(offset, missing_type)
23074    }
23075}
23076#[doc = "Get / dump link stats.\n\nReply attributes:\n- [.get_link_64()](IterableStatsAttrs::get_link_64)\n- [.get_link_xstats()](IterableStatsAttrs::get_link_xstats)\n- [.get_link_xstats_slave()](IterableStatsAttrs::get_link_xstats_slave)\n- [.get_link_offload_xstats()](IterableStatsAttrs::get_link_offload_xstats)\n- [.get_af_spec()](IterableStatsAttrs::get_af_spec)\n\n"]
23077#[derive(Debug)]
23078pub struct OpGetstatsDump<'r> {
23079    request: Request<'r>,
23080}
23081impl<'r> OpGetstatsDump<'r> {
23082    pub fn new(mut request: Request<'r>, header: &IfStatsMsg) -> Self {
23083        Self::write_header(request.buf_mut(), header);
23084        Self {
23085            request: request.set_dump(),
23086        }
23087    }
23088    pub fn encode_request<'buf>(
23089        buf: &'buf mut Vec<u8>,
23090        header: &IfStatsMsg,
23091    ) -> PushStatsAttrs<&'buf mut Vec<u8>> {
23092        Self::write_header(buf, header);
23093        PushStatsAttrs::new(buf)
23094    }
23095    pub fn encode(&mut self) -> PushStatsAttrs<&mut Vec<u8>> {
23096        PushStatsAttrs::new(self.request.buf_mut())
23097    }
23098    pub fn into_encoder(self) -> PushStatsAttrs<RequestBuf<'r>> {
23099        PushStatsAttrs::new(self.request.buf)
23100    }
23101    pub fn decode_request<'a>(buf: &'a [u8]) -> (IfStatsMsg, IterableStatsAttrs<'a>) {
23102        let (header, attrs) = buf.split_at(buf.len().min(IfStatsMsg::len()));
23103        (
23104            IfStatsMsg::new_from_slice(header).unwrap_or_default(),
23105            IterableStatsAttrs::with_loc(attrs, buf.as_ptr() as usize),
23106        )
23107    }
23108    fn write_header<Prev: Pusher>(prev: &mut Prev, header: &IfStatsMsg) {
23109        prev.as_vec_mut().extend(header.as_slice());
23110    }
23111}
23112impl NetlinkRequest for OpGetstatsDump<'_> {
23113    fn protocol(&self) -> Protocol {
23114        Protocol::Raw {
23115            protonum: 0u16,
23116            request_type: 94u16,
23117        }
23118    }
23119    fn flags(&self) -> u16 {
23120        self.request.flags
23121    }
23122    fn payload(&self) -> &[u8] {
23123        self.request.buf()
23124    }
23125    type ReplyType<'buf> = (IfStatsMsg, IterableStatsAttrs<'buf>);
23126    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23127        Self::decode_request(buf)
23128    }
23129    fn lookup(
23130        buf: &[u8],
23131        offset: usize,
23132        missing_type: Option<u16>,
23133    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23134        Self::decode_request(buf)
23135            .1
23136            .lookup_attr(offset, missing_type)
23137    }
23138}
23139#[doc = "Get / dump link stats.\n\nReply attributes:\n- [.get_link_64()](IterableStatsAttrs::get_link_64)\n- [.get_link_xstats()](IterableStatsAttrs::get_link_xstats)\n- [.get_link_xstats_slave()](IterableStatsAttrs::get_link_xstats_slave)\n- [.get_link_offload_xstats()](IterableStatsAttrs::get_link_offload_xstats)\n- [.get_af_spec()](IterableStatsAttrs::get_af_spec)\n\n"]
23140#[derive(Debug)]
23141pub struct OpGetstatsDo<'r> {
23142    request: Request<'r>,
23143}
23144impl<'r> OpGetstatsDo<'r> {
23145    pub fn new(mut request: Request<'r>, header: &IfStatsMsg) -> Self {
23146        Self::write_header(request.buf_mut(), header);
23147        Self { request: request }
23148    }
23149    pub fn encode_request<'buf>(
23150        buf: &'buf mut Vec<u8>,
23151        header: &IfStatsMsg,
23152    ) -> PushStatsAttrs<&'buf mut Vec<u8>> {
23153        Self::write_header(buf, header);
23154        PushStatsAttrs::new(buf)
23155    }
23156    pub fn encode(&mut self) -> PushStatsAttrs<&mut Vec<u8>> {
23157        PushStatsAttrs::new(self.request.buf_mut())
23158    }
23159    pub fn into_encoder(self) -> PushStatsAttrs<RequestBuf<'r>> {
23160        PushStatsAttrs::new(self.request.buf)
23161    }
23162    pub fn decode_request<'a>(buf: &'a [u8]) -> (IfStatsMsg, IterableStatsAttrs<'a>) {
23163        let (header, attrs) = buf.split_at(buf.len().min(IfStatsMsg::len()));
23164        (
23165            IfStatsMsg::new_from_slice(header).unwrap_or_default(),
23166            IterableStatsAttrs::with_loc(attrs, buf.as_ptr() as usize),
23167        )
23168    }
23169    fn write_header<Prev: Pusher>(prev: &mut Prev, header: &IfStatsMsg) {
23170        prev.as_vec_mut().extend(header.as_slice());
23171    }
23172}
23173impl NetlinkRequest for OpGetstatsDo<'_> {
23174    fn protocol(&self) -> Protocol {
23175        Protocol::Raw {
23176            protonum: 0u16,
23177            request_type: 94u16,
23178        }
23179    }
23180    fn flags(&self) -> u16 {
23181        self.request.flags
23182    }
23183    fn payload(&self) -> &[u8] {
23184        self.request.buf()
23185    }
23186    type ReplyType<'buf> = (IfStatsMsg, IterableStatsAttrs<'buf>);
23187    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23188        Self::decode_request(buf)
23189    }
23190    fn lookup(
23191        buf: &[u8],
23192        offset: usize,
23193        missing_type: Option<u16>,
23194    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23195        Self::decode_request(buf)
23196            .1
23197            .lookup_attr(offset, missing_type)
23198    }
23199}
23200#[derive(Debug)]
23201pub struct ChainedFinal<'a> {
23202    inner: Chained<'a>,
23203}
23204#[derive(Debug)]
23205pub struct Chained<'a> {
23206    buf: RequestBuf<'a>,
23207    first_seq: u32,
23208    lookups: Vec<(&'static str, LookupFn)>,
23209    last_header_offset: usize,
23210    last_kind: Option<RequestInfo>,
23211}
23212impl<'a> ChainedFinal<'a> {
23213    pub fn into_chained(self) -> Chained<'a> {
23214        self.inner
23215    }
23216    pub fn buf(&self) -> &Vec<u8> {
23217        self.inner.buf()
23218    }
23219    pub fn buf_mut(&mut self) -> &mut Vec<u8> {
23220        self.inner.buf_mut()
23221    }
23222    fn get_index(&self, seq: u32) -> Option<u32> {
23223        let min = self.inner.first_seq;
23224        let max = min.wrapping_add(self.inner.lookups.len() as u32);
23225        return if min <= max {
23226            (min..max).contains(&seq).then(|| seq - min)
23227        } else if min <= seq {
23228            Some(seq - min)
23229        } else if seq < max {
23230            Some(u32::MAX - min + seq)
23231        } else {
23232            None
23233        };
23234    }
23235}
23236impl crate::traits::NetlinkChained for ChainedFinal<'_> {
23237    fn protonum(&self) -> u16 {
23238        PROTONUM
23239    }
23240    fn payload(&self) -> &[u8] {
23241        self.buf()
23242    }
23243    fn chain_len(&self) -> usize {
23244        self.inner.lookups.len()
23245    }
23246    fn get_index(&self, seq: u32) -> Option<usize> {
23247        self.get_index(seq).map(|n| n as usize)
23248    }
23249    fn name(&self, index: usize) -> &'static str {
23250        self.inner.lookups[index].0
23251    }
23252    fn lookup(&self, index: usize) -> LookupFn {
23253        self.inner.lookups[index].1
23254    }
23255}
23256impl Chained<'static> {
23257    pub fn new(first_seq: u32) -> Self {
23258        Self::new_from_buf(Vec::new(), first_seq)
23259    }
23260    pub fn new_from_buf(buf: Vec<u8>, first_seq: u32) -> Self {
23261        Self {
23262            buf: RequestBuf::Own(buf),
23263            first_seq,
23264            lookups: Vec::new(),
23265            last_header_offset: 0,
23266            last_kind: None,
23267        }
23268    }
23269    pub fn into_buf(self) -> Vec<u8> {
23270        match self.buf {
23271            RequestBuf::Own(buf) => buf,
23272            _ => unreachable!(),
23273        }
23274    }
23275}
23276impl<'a> Chained<'a> {
23277    pub fn new_with_buf(buf: &'a mut Vec<u8>, first_seq: u32) -> Self {
23278        Self {
23279            buf: RequestBuf::Ref(buf),
23280            first_seq,
23281            lookups: Vec::new(),
23282            last_header_offset: 0,
23283            last_kind: None,
23284        }
23285    }
23286    pub fn finalize(mut self) -> ChainedFinal<'a> {
23287        self.update_header();
23288        ChainedFinal { inner: self }
23289    }
23290    pub fn request(&mut self) -> Request<'_> {
23291        self.update_header();
23292        self.last_header_offset = self.buf().len();
23293        self.buf_mut().extend_from_slice(Nlmsghdr::new().as_slice());
23294        let mut request = Request::new_extend(self.buf.buf_mut());
23295        self.last_kind = None;
23296        request.writeback = Some(&mut self.last_kind);
23297        request
23298    }
23299    pub fn buf(&self) -> &Vec<u8> {
23300        self.buf.buf()
23301    }
23302    pub fn buf_mut(&mut self) -> &mut Vec<u8> {
23303        self.buf.buf_mut()
23304    }
23305    fn update_header(&mut self) {
23306        let Some(RequestInfo {
23307            protocol,
23308            flags,
23309            name,
23310            lookup,
23311        }) = self.last_kind
23312        else {
23313            if !self.buf().is_empty() {
23314                assert_eq!(self.last_header_offset + Nlmsghdr::len(), self.buf().len());
23315                self.buf.buf_mut().truncate(self.last_header_offset);
23316            }
23317            return;
23318        };
23319        let header_offset = self.last_header_offset;
23320        let request_type = match protocol {
23321            Protocol::Raw { request_type, .. } => request_type,
23322            Protocol::Generic(_) => unreachable!(),
23323        };
23324        let index = self.lookups.len();
23325        let seq = self.first_seq.wrapping_add(index as u32);
23326        self.lookups.push((name, lookup));
23327        let buf = self.buf_mut();
23328        align(buf);
23329        let header = Nlmsghdr {
23330            len: (buf.len() - header_offset) as u32,
23331            r#type: request_type,
23332            flags: flags | consts::NLM_F_REQUEST as u16 | consts::NLM_F_ACK as u16,
23333            seq,
23334            pid: 0,
23335        };
23336        buf[header_offset..(header_offset + 16)].clone_from_slice(header.as_slice());
23337    }
23338}
23339use crate::traits::LookupFn;
23340use crate::utils::RequestBuf;
23341#[derive(Debug)]
23342pub struct Request<'buf> {
23343    buf: RequestBuf<'buf>,
23344    flags: u16,
23345    writeback: Option<&'buf mut Option<RequestInfo>>,
23346}
23347#[allow(unused)]
23348#[derive(Debug, Clone)]
23349pub struct RequestInfo {
23350    protocol: Protocol,
23351    flags: u16,
23352    name: &'static str,
23353    lookup: LookupFn,
23354}
23355impl Request<'static> {
23356    pub fn new() -> Self {
23357        Self::new_from_buf(Vec::new())
23358    }
23359    pub fn new_from_buf(buf: Vec<u8>) -> Self {
23360        Self {
23361            flags: 0,
23362            buf: RequestBuf::Own(buf),
23363            writeback: None,
23364        }
23365    }
23366    pub fn into_buf(self) -> Vec<u8> {
23367        match self.buf {
23368            RequestBuf::Own(buf) => buf,
23369            _ => unreachable!(),
23370        }
23371    }
23372}
23373impl<'buf> Request<'buf> {
23374    pub fn new_with_buf(buf: &'buf mut Vec<u8>) -> Self {
23375        buf.clear();
23376        Self::new_extend(buf)
23377    }
23378    pub fn new_extend(buf: &'buf mut Vec<u8>) -> Self {
23379        Self {
23380            flags: 0,
23381            buf: RequestBuf::Ref(buf),
23382            writeback: None,
23383        }
23384    }
23385    fn do_writeback(&mut self, protocol: Protocol, name: &'static str, lookup: LookupFn) {
23386        let Some(writeback) = &mut self.writeback else {
23387            return;
23388        };
23389        **writeback = Some(RequestInfo {
23390            protocol,
23391            flags: self.flags,
23392            name,
23393            lookup,
23394        })
23395    }
23396    pub fn buf(&self) -> &Vec<u8> {
23397        self.buf.buf()
23398    }
23399    pub fn buf_mut(&mut self) -> &mut Vec<u8> {
23400        self.buf.buf_mut()
23401    }
23402    #[doc = "Set `NLM_F_CREATE` flag"]
23403    pub fn set_create(mut self) -> Self {
23404        self.flags |= consts::NLM_F_CREATE as u16;
23405        self
23406    }
23407    #[doc = "Set `NLM_F_EXCL` flag"]
23408    pub fn set_excl(mut self) -> Self {
23409        self.flags |= consts::NLM_F_EXCL as u16;
23410        self
23411    }
23412    #[doc = "Set `NLM_F_REPLACE` flag"]
23413    pub fn set_replace(mut self) -> Self {
23414        self.flags |= consts::NLM_F_REPLACE as u16;
23415        self
23416    }
23417    #[doc = "Set `NLM_F_CREATE` and `NLM_F_REPLACE` flag"]
23418    pub fn set_change(self) -> Self {
23419        self.set_create().set_replace()
23420    }
23421    #[doc = "Set `NLM_F_APPEND` flag"]
23422    pub fn set_append(mut self) -> Self {
23423        self.flags |= consts::NLM_F_APPEND as u16;
23424        self
23425    }
23426    #[doc = "Set `self.flags |= flags`"]
23427    pub fn set_flags(mut self, flags: u16) -> Self {
23428        self.flags |= flags;
23429        self
23430    }
23431    #[doc = "Set `self.flags ^= self.flags & flags`"]
23432    pub fn unset_flags(mut self, flags: u16) -> Self {
23433        self.flags ^= self.flags & flags;
23434        self
23435    }
23436    #[doc = "Set `NLM_F_DUMP` flag"]
23437    fn set_dump(mut self) -> Self {
23438        self.flags |= consts::NLM_F_DUMP as u16;
23439        self
23440    }
23441    #[doc = "Create a new link.\n\nRequest attributes:\n- [.push_address()](PushLinkAttrs::push_address)\n- [.push_broadcast()](PushLinkAttrs::push_broadcast)\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_mtu()](PushLinkAttrs::push_mtu)\n- [.push_txqlen()](PushLinkAttrs::push_txqlen)\n- [.push_operstate()](PushLinkAttrs::push_operstate)\n- [.push_linkmode()](PushLinkAttrs::push_linkmode)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_net_ns_pid()](PushLinkAttrs::push_net_ns_pid)\n- [.nested_af_spec()](PushLinkAttrs::nested_af_spec)\n- [.push_group()](PushLinkAttrs::push_group)\n- [.push_net_ns_fd()](PushLinkAttrs::push_net_ns_fd)\n- [.push_num_tx_queues()](PushLinkAttrs::push_num_tx_queues)\n- [.push_num_rx_queues()](PushLinkAttrs::push_num_rx_queues)\n- [.push_link_netnsid()](PushLinkAttrs::push_link_netnsid)\n- [.push_gso_max_segs()](PushLinkAttrs::push_gso_max_segs)\n- [.push_gso_max_size()](PushLinkAttrs::push_gso_max_size)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_gro_max_size()](PushLinkAttrs::push_gro_max_size)\n- [.push_gso_ipv4_max_size()](PushLinkAttrs::push_gso_ipv4_max_size)\n- [.push_gro_ipv4_max_size()](PushLinkAttrs::push_gro_ipv4_max_size)\n\n"]
23442    pub fn op_newlink_do(self, header: &Ifinfomsg) -> OpNewlinkDo<'buf> {
23443        let mut res = OpNewlinkDo::new(self, header);
23444        res.request
23445            .do_writeback(res.protocol(), "op-newlink-do", OpNewlinkDo::lookup);
23446        res
23447    }
23448    #[doc = "Delete an existing link.\n\nRequest attributes:\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n\n"]
23449    pub fn op_dellink_do(self, header: &Ifinfomsg) -> OpDellinkDo<'buf> {
23450        let mut res = OpDellinkDo::new(self, header);
23451        res.request
23452            .do_writeback(res.protocol(), "op-dellink-do", OpDellinkDo::lookup);
23453        res
23454    }
23455    #[doc = "Get / dump information about a link.\n\nRequest attributes:\n- [.push_master()](PushLinkAttrs::push_master)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n\nReply attributes:\n- [.get_address()](IterableLinkAttrs::get_address)\n- [.get_broadcast()](IterableLinkAttrs::get_broadcast)\n- [.get_ifname()](IterableLinkAttrs::get_ifname)\n- [.get_mtu()](IterableLinkAttrs::get_mtu)\n- [.get_link()](IterableLinkAttrs::get_link)\n- [.get_qdisc()](IterableLinkAttrs::get_qdisc)\n- [.get_stats()](IterableLinkAttrs::get_stats)\n- [.get_master()](IterableLinkAttrs::get_master)\n- [.get_wireless()](IterableLinkAttrs::get_wireless)\n- [.get_protinfo()](IterableLinkAttrs::get_protinfo)\n- [.get_txqlen()](IterableLinkAttrs::get_txqlen)\n- [.get_map()](IterableLinkAttrs::get_map)\n- [.get_weight()](IterableLinkAttrs::get_weight)\n- [.get_operstate()](IterableLinkAttrs::get_operstate)\n- [.get_linkmode()](IterableLinkAttrs::get_linkmode)\n- [.get_linkinfo()](IterableLinkAttrs::get_linkinfo)\n- [.get_net_ns_pid()](IterableLinkAttrs::get_net_ns_pid)\n- [.get_ifalias()](IterableLinkAttrs::get_ifalias)\n- [.get_num_vf()](IterableLinkAttrs::get_num_vf)\n- [.get_vfinfo_list()](IterableLinkAttrs::get_vfinfo_list)\n- [.get_stats64()](IterableLinkAttrs::get_stats64)\n- [.get_vf_ports()](IterableLinkAttrs::get_vf_ports)\n- [.get_port_self()](IterableLinkAttrs::get_port_self)\n- [.get_af_spec()](IterableLinkAttrs::get_af_spec)\n- [.get_group()](IterableLinkAttrs::get_group)\n- [.get_net_ns_fd()](IterableLinkAttrs::get_net_ns_fd)\n- [.get_ext_mask()](IterableLinkAttrs::get_ext_mask)\n- [.get_promiscuity()](IterableLinkAttrs::get_promiscuity)\n- [.get_num_tx_queues()](IterableLinkAttrs::get_num_tx_queues)\n- [.get_num_rx_queues()](IterableLinkAttrs::get_num_rx_queues)\n- [.get_carrier()](IterableLinkAttrs::get_carrier)\n- [.get_phys_port_id()](IterableLinkAttrs::get_phys_port_id)\n- [.get_carrier_changes()](IterableLinkAttrs::get_carrier_changes)\n- [.get_phys_switch_id()](IterableLinkAttrs::get_phys_switch_id)\n- [.get_link_netnsid()](IterableLinkAttrs::get_link_netnsid)\n- [.get_phys_port_name()](IterableLinkAttrs::get_phys_port_name)\n- [.get_proto_down()](IterableLinkAttrs::get_proto_down)\n- [.get_gso_max_segs()](IterableLinkAttrs::get_gso_max_segs)\n- [.get_gso_max_size()](IterableLinkAttrs::get_gso_max_size)\n- [.get_xdp()](IterableLinkAttrs::get_xdp)\n- [.get_event()](IterableLinkAttrs::get_event)\n- [.get_new_netnsid()](IterableLinkAttrs::get_new_netnsid)\n- [.get_target_netnsid()](IterableLinkAttrs::get_target_netnsid)\n- [.get_carrier_up_count()](IterableLinkAttrs::get_carrier_up_count)\n- [.get_carrier_down_count()](IterableLinkAttrs::get_carrier_down_count)\n- [.get_new_ifindex()](IterableLinkAttrs::get_new_ifindex)\n- [.get_min_mtu()](IterableLinkAttrs::get_min_mtu)\n- [.get_max_mtu()](IterableLinkAttrs::get_max_mtu)\n- [.get_prop_list()](IterableLinkAttrs::get_prop_list)\n- [.get_perm_address()](IterableLinkAttrs::get_perm_address)\n- [.get_proto_down_reason()](IterableLinkAttrs::get_proto_down_reason)\n- [.get_parent_dev_name()](IterableLinkAttrs::get_parent_dev_name)\n- [.get_parent_dev_bus_name()](IterableLinkAttrs::get_parent_dev_bus_name)\n- [.get_gro_max_size()](IterableLinkAttrs::get_gro_max_size)\n- [.get_tso_max_size()](IterableLinkAttrs::get_tso_max_size)\n- [.get_tso_max_segs()](IterableLinkAttrs::get_tso_max_segs)\n- [.get_allmulti()](IterableLinkAttrs::get_allmulti)\n- [.get_devlink_port()](IterableLinkAttrs::get_devlink_port)\n- [.get_gso_ipv4_max_size()](IterableLinkAttrs::get_gso_ipv4_max_size)\n- [.get_gro_ipv4_max_size()](IterableLinkAttrs::get_gro_ipv4_max_size)\n\n"]
23456    pub fn op_getlink_dump(self, header: &Ifinfomsg) -> OpGetlinkDump<'buf> {
23457        let mut res = OpGetlinkDump::new(self, header);
23458        res.request
23459            .do_writeback(res.protocol(), "op-getlink-dump", OpGetlinkDump::lookup);
23460        res
23461    }
23462    #[doc = "Get / dump information about a link.\n\nRequest attributes:\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_alt_ifname()](PushLinkAttrs::push_alt_ifname)\n\nReply attributes:\n- [.get_address()](IterableLinkAttrs::get_address)\n- [.get_broadcast()](IterableLinkAttrs::get_broadcast)\n- [.get_ifname()](IterableLinkAttrs::get_ifname)\n- [.get_mtu()](IterableLinkAttrs::get_mtu)\n- [.get_link()](IterableLinkAttrs::get_link)\n- [.get_qdisc()](IterableLinkAttrs::get_qdisc)\n- [.get_stats()](IterableLinkAttrs::get_stats)\n- [.get_master()](IterableLinkAttrs::get_master)\n- [.get_wireless()](IterableLinkAttrs::get_wireless)\n- [.get_protinfo()](IterableLinkAttrs::get_protinfo)\n- [.get_txqlen()](IterableLinkAttrs::get_txqlen)\n- [.get_map()](IterableLinkAttrs::get_map)\n- [.get_weight()](IterableLinkAttrs::get_weight)\n- [.get_operstate()](IterableLinkAttrs::get_operstate)\n- [.get_linkmode()](IterableLinkAttrs::get_linkmode)\n- [.get_linkinfo()](IterableLinkAttrs::get_linkinfo)\n- [.get_net_ns_pid()](IterableLinkAttrs::get_net_ns_pid)\n- [.get_ifalias()](IterableLinkAttrs::get_ifalias)\n- [.get_num_vf()](IterableLinkAttrs::get_num_vf)\n- [.get_vfinfo_list()](IterableLinkAttrs::get_vfinfo_list)\n- [.get_stats64()](IterableLinkAttrs::get_stats64)\n- [.get_vf_ports()](IterableLinkAttrs::get_vf_ports)\n- [.get_port_self()](IterableLinkAttrs::get_port_self)\n- [.get_af_spec()](IterableLinkAttrs::get_af_spec)\n- [.get_group()](IterableLinkAttrs::get_group)\n- [.get_net_ns_fd()](IterableLinkAttrs::get_net_ns_fd)\n- [.get_ext_mask()](IterableLinkAttrs::get_ext_mask)\n- [.get_promiscuity()](IterableLinkAttrs::get_promiscuity)\n- [.get_num_tx_queues()](IterableLinkAttrs::get_num_tx_queues)\n- [.get_num_rx_queues()](IterableLinkAttrs::get_num_rx_queues)\n- [.get_carrier()](IterableLinkAttrs::get_carrier)\n- [.get_phys_port_id()](IterableLinkAttrs::get_phys_port_id)\n- [.get_carrier_changes()](IterableLinkAttrs::get_carrier_changes)\n- [.get_phys_switch_id()](IterableLinkAttrs::get_phys_switch_id)\n- [.get_link_netnsid()](IterableLinkAttrs::get_link_netnsid)\n- [.get_phys_port_name()](IterableLinkAttrs::get_phys_port_name)\n- [.get_proto_down()](IterableLinkAttrs::get_proto_down)\n- [.get_gso_max_segs()](IterableLinkAttrs::get_gso_max_segs)\n- [.get_gso_max_size()](IterableLinkAttrs::get_gso_max_size)\n- [.get_xdp()](IterableLinkAttrs::get_xdp)\n- [.get_event()](IterableLinkAttrs::get_event)\n- [.get_new_netnsid()](IterableLinkAttrs::get_new_netnsid)\n- [.get_target_netnsid()](IterableLinkAttrs::get_target_netnsid)\n- [.get_carrier_up_count()](IterableLinkAttrs::get_carrier_up_count)\n- [.get_carrier_down_count()](IterableLinkAttrs::get_carrier_down_count)\n- [.get_new_ifindex()](IterableLinkAttrs::get_new_ifindex)\n- [.get_min_mtu()](IterableLinkAttrs::get_min_mtu)\n- [.get_max_mtu()](IterableLinkAttrs::get_max_mtu)\n- [.get_prop_list()](IterableLinkAttrs::get_prop_list)\n- [.get_perm_address()](IterableLinkAttrs::get_perm_address)\n- [.get_proto_down_reason()](IterableLinkAttrs::get_proto_down_reason)\n- [.get_parent_dev_name()](IterableLinkAttrs::get_parent_dev_name)\n- [.get_parent_dev_bus_name()](IterableLinkAttrs::get_parent_dev_bus_name)\n- [.get_gro_max_size()](IterableLinkAttrs::get_gro_max_size)\n- [.get_tso_max_size()](IterableLinkAttrs::get_tso_max_size)\n- [.get_tso_max_segs()](IterableLinkAttrs::get_tso_max_segs)\n- [.get_allmulti()](IterableLinkAttrs::get_allmulti)\n- [.get_devlink_port()](IterableLinkAttrs::get_devlink_port)\n- [.get_gso_ipv4_max_size()](IterableLinkAttrs::get_gso_ipv4_max_size)\n- [.get_gro_ipv4_max_size()](IterableLinkAttrs::get_gro_ipv4_max_size)\n\n"]
23463    pub fn op_getlink_do(self, header: &Ifinfomsg) -> OpGetlinkDo<'buf> {
23464        let mut res = OpGetlinkDo::new(self, header);
23465        res.request
23466            .do_writeback(res.protocol(), "op-getlink-do", OpGetlinkDo::lookup);
23467        res
23468    }
23469    #[doc = "Set information about a link.\n\nRequest attributes:\n- [.push_address()](PushLinkAttrs::push_address)\n- [.push_broadcast()](PushLinkAttrs::push_broadcast)\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_mtu()](PushLinkAttrs::push_mtu)\n- [.push_link()](PushLinkAttrs::push_link)\n- [.push_qdisc()](PushLinkAttrs::push_qdisc)\n- [.push_stats()](PushLinkAttrs::push_stats)\n- [.push_master()](PushLinkAttrs::push_master)\n- [.push_wireless()](PushLinkAttrs::push_wireless)\n- [.push_protinfo()](PushLinkAttrs::push_protinfo)\n- [.push_txqlen()](PushLinkAttrs::push_txqlen)\n- [.push_map()](PushLinkAttrs::push_map)\n- [.push_weight()](PushLinkAttrs::push_weight)\n- [.push_operstate()](PushLinkAttrs::push_operstate)\n- [.push_linkmode()](PushLinkAttrs::push_linkmode)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_net_ns_pid()](PushLinkAttrs::push_net_ns_pid)\n- [.push_ifalias()](PushLinkAttrs::push_ifalias)\n- [.push_num_vf()](PushLinkAttrs::push_num_vf)\n- [.nested_vfinfo_list()](PushLinkAttrs::nested_vfinfo_list)\n- [.push_stats64()](PushLinkAttrs::push_stats64)\n- [.nested_vf_ports()](PushLinkAttrs::nested_vf_ports)\n- [.nested_port_self()](PushLinkAttrs::nested_port_self)\n- [.nested_af_spec()](PushLinkAttrs::nested_af_spec)\n- [.push_group()](PushLinkAttrs::push_group)\n- [.push_net_ns_fd()](PushLinkAttrs::push_net_ns_fd)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_promiscuity()](PushLinkAttrs::push_promiscuity)\n- [.push_num_tx_queues()](PushLinkAttrs::push_num_tx_queues)\n- [.push_num_rx_queues()](PushLinkAttrs::push_num_rx_queues)\n- [.push_carrier()](PushLinkAttrs::push_carrier)\n- [.push_phys_port_id()](PushLinkAttrs::push_phys_port_id)\n- [.push_carrier_changes()](PushLinkAttrs::push_carrier_changes)\n- [.push_phys_switch_id()](PushLinkAttrs::push_phys_switch_id)\n- [.push_link_netnsid()](PushLinkAttrs::push_link_netnsid)\n- [.push_phys_port_name()](PushLinkAttrs::push_phys_port_name)\n- [.push_proto_down()](PushLinkAttrs::push_proto_down)\n- [.push_gso_max_segs()](PushLinkAttrs::push_gso_max_segs)\n- [.push_gso_max_size()](PushLinkAttrs::push_gso_max_size)\n- [.nested_xdp()](PushLinkAttrs::nested_xdp)\n- [.push_event()](PushLinkAttrs::push_event)\n- [.push_new_netnsid()](PushLinkAttrs::push_new_netnsid)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_carrier_up_count()](PushLinkAttrs::push_carrier_up_count)\n- [.push_carrier_down_count()](PushLinkAttrs::push_carrier_down_count)\n- [.push_new_ifindex()](PushLinkAttrs::push_new_ifindex)\n- [.push_min_mtu()](PushLinkAttrs::push_min_mtu)\n- [.push_max_mtu()](PushLinkAttrs::push_max_mtu)\n- [.nested_prop_list()](PushLinkAttrs::nested_prop_list)\n- [.push_perm_address()](PushLinkAttrs::push_perm_address)\n- [.push_proto_down_reason()](PushLinkAttrs::push_proto_down_reason)\n- [.push_parent_dev_name()](PushLinkAttrs::push_parent_dev_name)\n- [.push_parent_dev_bus_name()](PushLinkAttrs::push_parent_dev_bus_name)\n- [.push_gro_max_size()](PushLinkAttrs::push_gro_max_size)\n- [.push_tso_max_size()](PushLinkAttrs::push_tso_max_size)\n- [.push_tso_max_segs()](PushLinkAttrs::push_tso_max_segs)\n- [.push_allmulti()](PushLinkAttrs::push_allmulti)\n- [.push_devlink_port()](PushLinkAttrs::push_devlink_port)\n- [.push_gso_ipv4_max_size()](PushLinkAttrs::push_gso_ipv4_max_size)\n- [.push_gro_ipv4_max_size()](PushLinkAttrs::push_gro_ipv4_max_size)\n\n"]
23470    pub fn op_setlink_do(self, header: &Ifinfomsg) -> OpSetlinkDo<'buf> {
23471        let mut res = OpSetlinkDo::new(self, header);
23472        res.request
23473            .do_writeback(res.protocol(), "op-setlink-do", OpSetlinkDo::lookup);
23474        res
23475    }
23476    #[doc = "Get / dump link stats.\n\nReply attributes:\n- [.get_link_64()](IterableStatsAttrs::get_link_64)\n- [.get_link_xstats()](IterableStatsAttrs::get_link_xstats)\n- [.get_link_xstats_slave()](IterableStatsAttrs::get_link_xstats_slave)\n- [.get_link_offload_xstats()](IterableStatsAttrs::get_link_offload_xstats)\n- [.get_af_spec()](IterableStatsAttrs::get_af_spec)\n\n"]
23477    pub fn op_getstats_dump(self, header: &IfStatsMsg) -> OpGetstatsDump<'buf> {
23478        let mut res = OpGetstatsDump::new(self, header);
23479        res.request
23480            .do_writeback(res.protocol(), "op-getstats-dump", OpGetstatsDump::lookup);
23481        res
23482    }
23483    #[doc = "Get / dump link stats.\n\nReply attributes:\n- [.get_link_64()](IterableStatsAttrs::get_link_64)\n- [.get_link_xstats()](IterableStatsAttrs::get_link_xstats)\n- [.get_link_xstats_slave()](IterableStatsAttrs::get_link_xstats_slave)\n- [.get_link_offload_xstats()](IterableStatsAttrs::get_link_offload_xstats)\n- [.get_af_spec()](IterableStatsAttrs::get_af_spec)\n\n"]
23484    pub fn op_getstats_do(self, header: &IfStatsMsg) -> OpGetstatsDo<'buf> {
23485        let mut res = OpGetstatsDo::new(self, header);
23486        res.request
23487            .do_writeback(res.protocol(), "op-getstats-do", OpGetstatsDo::lookup);
23488        res
23489    }
23490}
23491#[cfg(test)]
23492mod generated_tests {
23493    use super::*;
23494    #[test]
23495    fn tests() {
23496        let _ = IterableLinkAttrs::get_address;
23497        let _ = IterableLinkAttrs::get_af_spec;
23498        let _ = IterableLinkAttrs::get_allmulti;
23499        let _ = IterableLinkAttrs::get_broadcast;
23500        let _ = IterableLinkAttrs::get_carrier;
23501        let _ = IterableLinkAttrs::get_carrier_changes;
23502        let _ = IterableLinkAttrs::get_carrier_down_count;
23503        let _ = IterableLinkAttrs::get_carrier_up_count;
23504        let _ = IterableLinkAttrs::get_devlink_port;
23505        let _ = IterableLinkAttrs::get_event;
23506        let _ = IterableLinkAttrs::get_ext_mask;
23507        let _ = IterableLinkAttrs::get_gro_ipv4_max_size;
23508        let _ = IterableLinkAttrs::get_gro_max_size;
23509        let _ = IterableLinkAttrs::get_group;
23510        let _ = IterableLinkAttrs::get_gso_ipv4_max_size;
23511        let _ = IterableLinkAttrs::get_gso_max_segs;
23512        let _ = IterableLinkAttrs::get_gso_max_size;
23513        let _ = IterableLinkAttrs::get_ifalias;
23514        let _ = IterableLinkAttrs::get_ifname;
23515        let _ = IterableLinkAttrs::get_link;
23516        let _ = IterableLinkAttrs::get_link_netnsid;
23517        let _ = IterableLinkAttrs::get_linkinfo;
23518        let _ = IterableLinkAttrs::get_linkmode;
23519        let _ = IterableLinkAttrs::get_map;
23520        let _ = IterableLinkAttrs::get_master;
23521        let _ = IterableLinkAttrs::get_max_mtu;
23522        let _ = IterableLinkAttrs::get_min_mtu;
23523        let _ = IterableLinkAttrs::get_mtu;
23524        let _ = IterableLinkAttrs::get_net_ns_fd;
23525        let _ = IterableLinkAttrs::get_net_ns_pid;
23526        let _ = IterableLinkAttrs::get_new_ifindex;
23527        let _ = IterableLinkAttrs::get_new_netnsid;
23528        let _ = IterableLinkAttrs::get_num_rx_queues;
23529        let _ = IterableLinkAttrs::get_num_tx_queues;
23530        let _ = IterableLinkAttrs::get_num_vf;
23531        let _ = IterableLinkAttrs::get_operstate;
23532        let _ = IterableLinkAttrs::get_parent_dev_bus_name;
23533        let _ = IterableLinkAttrs::get_parent_dev_name;
23534        let _ = IterableLinkAttrs::get_perm_address;
23535        let _ = IterableLinkAttrs::get_phys_port_id;
23536        let _ = IterableLinkAttrs::get_phys_port_name;
23537        let _ = IterableLinkAttrs::get_phys_switch_id;
23538        let _ = IterableLinkAttrs::get_port_self;
23539        let _ = IterableLinkAttrs::get_promiscuity;
23540        let _ = IterableLinkAttrs::get_prop_list;
23541        let _ = IterableLinkAttrs::get_protinfo;
23542        let _ = IterableLinkAttrs::get_proto_down;
23543        let _ = IterableLinkAttrs::get_proto_down_reason;
23544        let _ = IterableLinkAttrs::get_qdisc;
23545        let _ = IterableLinkAttrs::get_stats64;
23546        let _ = IterableLinkAttrs::get_stats;
23547        let _ = IterableLinkAttrs::get_target_netnsid;
23548        let _ = IterableLinkAttrs::get_tso_max_segs;
23549        let _ = IterableLinkAttrs::get_tso_max_size;
23550        let _ = IterableLinkAttrs::get_txqlen;
23551        let _ = IterableLinkAttrs::get_vf_ports;
23552        let _ = IterableLinkAttrs::get_vfinfo_list;
23553        let _ = IterableLinkAttrs::get_weight;
23554        let _ = IterableLinkAttrs::get_wireless;
23555        let _ = IterableLinkAttrs::get_xdp;
23556        let _ = IterableStatsAttrs::get_af_spec;
23557        let _ = IterableStatsAttrs::get_link_64;
23558        let _ = IterableStatsAttrs::get_link_offload_xstats;
23559        let _ = IterableStatsAttrs::get_link_xstats;
23560        let _ = IterableStatsAttrs::get_link_xstats_slave;
23561        let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_af_spec;
23562        let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_linkinfo;
23563        let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_port_self;
23564        let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_prop_list;
23565        let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_vf_ports;
23566        let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_vfinfo_list;
23567        let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_xdp;
23568        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_address;
23569        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_allmulti;
23570        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_alt_ifname;
23571        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_broadcast;
23572        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_carrier;
23573        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_carrier_changes;
23574        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_carrier_down_count;
23575        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_carrier_up_count;
23576        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_devlink_port;
23577        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_event;
23578        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_ext_mask;
23579        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_gro_ipv4_max_size;
23580        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_gro_max_size;
23581        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_group;
23582        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_gso_ipv4_max_size;
23583        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_gso_max_segs;
23584        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_gso_max_size;
23585        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_ifalias;
23586        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_ifname;
23587        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_link;
23588        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_link_netnsid;
23589        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_linkmode;
23590        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_map;
23591        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_master;
23592        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_max_mtu;
23593        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_min_mtu;
23594        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_mtu;
23595        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_net_ns_fd;
23596        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_net_ns_pid;
23597        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_new_ifindex;
23598        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_new_netnsid;
23599        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_num_rx_queues;
23600        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_num_tx_queues;
23601        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_num_vf;
23602        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_operstate;
23603        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_parent_dev_bus_name;
23604        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_parent_dev_name;
23605        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_perm_address;
23606        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_phys_port_id;
23607        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_phys_port_name;
23608        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_phys_switch_id;
23609        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_promiscuity;
23610        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_protinfo;
23611        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_proto_down;
23612        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_proto_down_reason;
23613        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_qdisc;
23614        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_stats64;
23615        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_stats;
23616        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_target_netnsid;
23617        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_tso_max_segs;
23618        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_tso_max_size;
23619        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_txqlen;
23620        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_weight;
23621        let _ = PushLinkAttrs::<&mut Vec<u8>>::push_wireless;
23622    }
23623}