Skip to main content

netlink_bindings/devlink/
mod.rs

1#![doc = "Partial family for Devlink\\."]
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 = "devlink";
17pub const PROTONAME_CSTR: &CStr = c"devlink";
18#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
19#[derive(Debug, Clone, Copy)]
20pub enum SbPoolType {
21    Ingress = 0,
22    Egress = 1,
23}
24impl SbPoolType {
25    pub fn from_value(value: u64) -> Option<Self> {
26        Some(match value {
27            0 => Self::Ingress,
28            1 => Self::Egress,
29            _ => return None,
30        })
31    }
32}
33#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
34#[derive(Debug, Clone, Copy)]
35pub enum PortType {
36    Notset = 0,
37    Auto = 1,
38    Eth = 2,
39    Ib = 3,
40}
41impl PortType {
42    pub fn from_value(value: u64) -> Option<Self> {
43        Some(match value {
44            0 => Self::Notset,
45            1 => Self::Auto,
46            2 => Self::Eth,
47            3 => Self::Ib,
48            _ => return None,
49        })
50    }
51}
52#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
53#[derive(Debug, Clone, Copy)]
54pub enum PortFlavour {
55    Physical = 0,
56    Cpu = 1,
57    Dsa = 2,
58    PciPf = 3,
59    PciVf = 4,
60    Virtual = 5,
61    Unused = 6,
62    PciSf = 7,
63}
64impl PortFlavour {
65    pub fn from_value(value: u64) -> Option<Self> {
66        Some(match value {
67            0 => Self::Physical,
68            1 => Self::Cpu,
69            2 => Self::Dsa,
70            3 => Self::PciPf,
71            4 => Self::PciVf,
72            5 => Self::Virtual,
73            6 => Self::Unused,
74            7 => Self::PciSf,
75            _ => return None,
76        })
77    }
78}
79#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
80#[derive(Debug, Clone, Copy)]
81pub enum PortFnState {
82    Inactive = 0,
83    Active = 1,
84}
85impl PortFnState {
86    pub fn from_value(value: u64) -> Option<Self> {
87        Some(match value {
88            0 => Self::Inactive,
89            1 => Self::Active,
90            _ => return None,
91        })
92    }
93}
94#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
95#[derive(Debug, Clone, Copy)]
96pub enum PortFnOpstate {
97    Detached = 0,
98    Attached = 1,
99}
100impl PortFnOpstate {
101    pub fn from_value(value: u64) -> Option<Self> {
102        Some(match value {
103            0 => Self::Detached,
104            1 => Self::Attached,
105            _ => return None,
106        })
107    }
108}
109#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
110#[derive(Debug, Clone, Copy)]
111pub enum PortFnAttrCap {
112    RoceBit = 0,
113    MigratableBit = 1,
114    IpsecCryptoBit = 2,
115    IpsecPacketBit = 3,
116}
117impl PortFnAttrCap {
118    pub fn from_value(value: u64) -> Option<Self> {
119        Some(match value {
120            0 => Self::RoceBit,
121            1 => Self::MigratableBit,
122            2 => Self::IpsecCryptoBit,
123            3 => Self::IpsecPacketBit,
124            _ => return None,
125        })
126    }
127}
128#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
129#[derive(Debug, Clone, Copy)]
130pub enum RateType {
131    Leaf = 0,
132    Node = 1,
133}
134impl RateType {
135    pub fn from_value(value: u64) -> Option<Self> {
136        Some(match value {
137            0 => Self::Leaf,
138            1 => Self::Node,
139            _ => return None,
140        })
141    }
142}
143#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
144#[derive(Debug, Clone, Copy)]
145pub enum SbThresholdType {
146    Static = 0,
147    Dynamic = 1,
148}
149impl SbThresholdType {
150    pub fn from_value(value: u64) -> Option<Self> {
151        Some(match value {
152            0 => Self::Static,
153            1 => Self::Dynamic,
154            _ => return None,
155        })
156    }
157}
158#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
159#[derive(Debug, Clone, Copy)]
160pub enum EswitchMode {
161    Legacy = 0,
162    Switchdev = 1,
163    SwitchdevInactive = 2,
164}
165impl EswitchMode {
166    pub fn from_value(value: u64) -> Option<Self> {
167        Some(match value {
168            0 => Self::Legacy,
169            1 => Self::Switchdev,
170            2 => Self::SwitchdevInactive,
171            _ => return None,
172        })
173    }
174}
175#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
176#[derive(Debug, Clone, Copy)]
177pub enum EswitchInlineMode {
178    None = 0,
179    Link = 1,
180    Network = 2,
181    Transport = 3,
182}
183impl EswitchInlineMode {
184    pub fn from_value(value: u64) -> Option<Self> {
185        Some(match value {
186            0 => Self::None,
187            1 => Self::Link,
188            2 => Self::Network,
189            3 => Self::Transport,
190            _ => return None,
191        })
192    }
193}
194#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
195#[derive(Debug, Clone, Copy)]
196pub enum EswitchEncapMode {
197    None = 0,
198    Basic = 1,
199}
200impl EswitchEncapMode {
201    pub fn from_value(value: u64) -> Option<Self> {
202        Some(match value {
203            0 => Self::None,
204            1 => Self::Basic,
205            _ => return None,
206        })
207    }
208}
209#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
210#[derive(Debug, Clone, Copy)]
211pub enum DpipeHeaderId {
212    Ethernet = 0,
213    Ipv4 = 1,
214    Ipv6 = 2,
215}
216impl DpipeHeaderId {
217    pub fn from_value(value: u64) -> Option<Self> {
218        Some(match value {
219            0 => Self::Ethernet,
220            1 => Self::Ipv4,
221            2 => Self::Ipv6,
222            _ => return None,
223        })
224    }
225}
226#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
227#[derive(Debug, Clone, Copy)]
228pub enum DpipeMatchType {
229    FieldExact = 0,
230}
231impl DpipeMatchType {
232    pub fn from_value(value: u64) -> Option<Self> {
233        Some(match value {
234            0 => Self::FieldExact,
235            _ => return None,
236        })
237    }
238}
239#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
240#[derive(Debug, Clone, Copy)]
241pub enum DpipeActionType {
242    FieldModify = 0,
243}
244impl DpipeActionType {
245    pub fn from_value(value: u64) -> Option<Self> {
246        Some(match value {
247            0 => Self::FieldModify,
248            _ => return None,
249        })
250    }
251}
252#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
253#[derive(Debug, Clone, Copy)]
254pub enum DpipeFieldMappingType {
255    None = 0,
256    Ifindex = 1,
257}
258impl DpipeFieldMappingType {
259    pub fn from_value(value: u64) -> Option<Self> {
260        Some(match value {
261            0 => Self::None,
262            1 => Self::Ifindex,
263            _ => return None,
264        })
265    }
266}
267#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
268#[derive(Debug, Clone, Copy)]
269pub enum ResourceUnit {
270    Entry = 0,
271}
272impl ResourceUnit {
273    pub fn from_value(value: u64) -> Option<Self> {
274        Some(match value {
275            0 => Self::Entry,
276            _ => return None,
277        })
278    }
279}
280#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
281#[derive(Debug, Clone, Copy)]
282pub enum ReloadAction {
283    DriverReinit = 1,
284    FwActivate = 2,
285}
286impl ReloadAction {
287    pub fn from_value(value: u64) -> Option<Self> {
288        Some(match value {
289            1 => Self::DriverReinit,
290            2 => Self::FwActivate,
291            _ => return None,
292        })
293    }
294}
295#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
296#[derive(Debug, Clone, Copy)]
297pub enum ParamCmode {
298    Runtime = 0,
299    Driverinit = 1,
300    Permanent = 2,
301}
302impl ParamCmode {
303    pub fn from_value(value: u64) -> Option<Self> {
304        Some(match value {
305            0 => Self::Runtime,
306            1 => Self::Driverinit,
307            2 => Self::Permanent,
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 FlashOverwrite {
315    SettingsBit = 0,
316    IdentifiersBit = 1,
317}
318impl FlashOverwrite {
319    pub fn from_value(value: u64) -> Option<Self> {
320        Some(match value {
321            0 => Self::SettingsBit,
322            1 => Self::IdentifiersBit,
323            _ => return None,
324        })
325    }
326}
327#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
328#[derive(Debug, Clone, Copy)]
329pub enum TrapAction {
330    Drop = 0,
331    Trap = 1,
332    Mirror = 2,
333}
334impl TrapAction {
335    pub fn from_value(value: u64) -> Option<Self> {
336        Some(match value {
337            0 => Self::Drop,
338            1 => Self::Trap,
339            2 => Self::Mirror,
340            _ => return None,
341        })
342    }
343}
344#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
345#[derive(Debug, Clone, Copy)]
346pub enum TrapType {
347    Drop = 0,
348    Exception = 1,
349    Control = 2,
350}
351impl TrapType {
352    pub fn from_value(value: u64) -> Option<Self> {
353        Some(match value {
354            0 => Self::Drop,
355            1 => Self::Exception,
356            2 => Self::Control,
357            _ => return None,
358        })
359    }
360}
361#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
362#[derive(Debug, Clone, Copy)]
363pub enum VarAttrType {
364    U8 = 1,
365    U16 = 2,
366    U32 = 3,
367    U64 = 4,
368    String = 5,
369    Flag = 6,
370    NulString = 10,
371    Binary = 11,
372}
373impl VarAttrType {
374    pub fn from_value(value: u64) -> Option<Self> {
375        Some(match value {
376            1 => Self::U8,
377            2 => Self::U16,
378            3 => Self::U32,
379            4 => Self::U64,
380            5 => Self::String,
381            6 => Self::Flag,
382            10 => Self::NulString,
383            11 => Self::Binary,
384            _ => return None,
385        })
386    }
387}
388pub const RATE_TC_INDEX_MAX: u64 = 7u64;
389#[derive(Clone)]
390pub enum Devlink<'a> {
391    BusName(&'a CStr),
392    DevName(&'a CStr),
393    PortIndex(u32),
394    #[doc = "Associated type: [`PortType`] (enum)"]
395    PortType(u16),
396    PortDesiredType(u16),
397    PortNetdevIfindex(u32),
398    PortNetdevName(&'a CStr),
399    PortIbdevName(&'a CStr),
400    PortSplitCount(u32),
401    PortSplitGroup(u32),
402    SbIndex(u32),
403    SbSize(u32),
404    SbIngressPoolCount(u16),
405    SbEgressPoolCount(u16),
406    SbIngressTcCount(u16),
407    SbEgressTcCount(u16),
408    SbPoolIndex(u16),
409    #[doc = "Associated type: [`SbPoolType`] (enum)"]
410    SbPoolType(u8),
411    SbPoolSize(u32),
412    #[doc = "Associated type: [`SbThresholdType`] (enum)"]
413    SbPoolThresholdType(u8),
414    SbThreshold(u32),
415    SbTcIndex(u16),
416    SbOccCur(u32),
417    SbOccMax(u32),
418    #[doc = "Associated type: [`EswitchMode`] (enum)"]
419    EswitchMode(u16),
420    #[doc = "Associated type: [`EswitchInlineMode`] (enum)"]
421    EswitchInlineMode(u8),
422    DpipeTables(IterableDlDpipeTables<'a>),
423    #[doc = "Attribute may repeat multiple times (treat it as array)"]
424    DpipeTable(IterableDlDpipeTable<'a>),
425    DpipeTableName(&'a CStr),
426    DpipeTableSize(u64),
427    DpipeTableMatches(IterableDlDpipeTableMatches<'a>),
428    DpipeTableActions(IterableDlDpipeTableActions<'a>),
429    DpipeTableCountersEnabled(u8),
430    DpipeEntries(IterableDlDpipeEntries<'a>),
431    #[doc = "Attribute may repeat multiple times (treat it as array)"]
432    DpipeEntry(IterableDlDpipeEntry<'a>),
433    DpipeEntryIndex(u64),
434    DpipeEntryMatchValues(IterableDlDpipeEntryMatchValues<'a>),
435    DpipeEntryActionValues(IterableDlDpipeEntryActionValues<'a>),
436    DpipeEntryCounter(u64),
437    #[doc = "Attribute may repeat multiple times (treat it as array)"]
438    DpipeMatch(IterableDlDpipeMatch<'a>),
439    #[doc = "Attribute may repeat multiple times (treat it as array)"]
440    DpipeMatchValue(IterableDlDpipeMatchValue<'a>),
441    #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
442    DpipeMatchType(u32),
443    #[doc = "Attribute may repeat multiple times (treat it as array)"]
444    DpipeAction(IterableDlDpipeAction<'a>),
445    #[doc = "Attribute may repeat multiple times (treat it as array)"]
446    DpipeActionValue(IterableDlDpipeActionValue<'a>),
447    #[doc = "Associated type: [`DpipeActionType`] (enum)"]
448    DpipeActionType(u32),
449    DpipeValue(&'a [u8]),
450    DpipeValueMask(&'a [u8]),
451    DpipeValueMapping(u32),
452    DpipeHeaders(IterableDlDpipeHeaders<'a>),
453    #[doc = "Attribute may repeat multiple times (treat it as array)"]
454    DpipeHeader(IterableDlDpipeHeader<'a>),
455    DpipeHeaderName(&'a CStr),
456    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
457    DpipeHeaderId(u32),
458    DpipeHeaderFields(IterableDlDpipeHeaderFields<'a>),
459    DpipeHeaderGlobal(u8),
460    DpipeHeaderIndex(u32),
461    #[doc = "Attribute may repeat multiple times (treat it as array)"]
462    DpipeField(IterableDlDpipeField<'a>),
463    DpipeFieldName(&'a CStr),
464    DpipeFieldId(u32),
465    DpipeFieldBitwidth(u32),
466    #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
467    DpipeFieldMappingType(u32),
468    Pad(&'a [u8]),
469    #[doc = "Associated type: [`EswitchEncapMode`] (enum)"]
470    EswitchEncapMode(u8),
471    ResourceList(IterableDlResourceList<'a>),
472    #[doc = "Attribute may repeat multiple times (treat it as array)"]
473    Resource(IterableDlResource<'a>),
474    ResourceName(&'a CStr),
475    ResourceId(u64),
476    ResourceSize(u64),
477    ResourceSizeNew(u64),
478    ResourceSizeValid(u8),
479    ResourceSizeMin(u64),
480    ResourceSizeMax(u64),
481    ResourceSizeGran(u64),
482    #[doc = "Associated type: [`ResourceUnit`] (enum)"]
483    ResourceUnit(u8),
484    ResourceOcc(u64),
485    DpipeTableResourceId(u64),
486    DpipeTableResourceUnits(u64),
487    #[doc = "Associated type: [`PortFlavour`] (enum)"]
488    PortFlavour(u16),
489    PortNumber(u32),
490    PortSplitSubportNumber(u32),
491    Param(IterableDlParam<'a>),
492    ParamName(&'a CStr),
493    ParamGeneric(()),
494    #[doc = "Associated type: [`VarAttrType`] (enum)"]
495    ParamType(u8),
496    #[doc = "Associated type: [`ParamCmode`] (enum)"]
497    ParamValueCmode(u8),
498    RegionName(&'a CStr),
499    RegionSize(u64),
500    RegionSnapshots(IterableDlRegionSnapshots<'a>),
501    RegionSnapshot(IterableDlRegionSnapshot<'a>),
502    RegionSnapshotId(u32),
503    RegionChunks(IterableDlRegionChunks<'a>),
504    RegionChunk(IterableDlRegionChunk<'a>),
505    RegionChunkData(&'a [u8]),
506    RegionChunkAddr(u64),
507    RegionChunkLen(u64),
508    InfoDriverName(&'a CStr),
509    InfoSerialNumber(&'a CStr),
510    #[doc = "Attribute may repeat multiple times (treat it as array)"]
511    InfoVersionFixed(IterableDlInfoVersion<'a>),
512    #[doc = "Attribute may repeat multiple times (treat it as array)"]
513    InfoVersionRunning(IterableDlInfoVersion<'a>),
514    #[doc = "Attribute may repeat multiple times (treat it as array)"]
515    InfoVersionStored(IterableDlInfoVersion<'a>),
516    InfoVersionName(&'a CStr),
517    InfoVersionValue(&'a CStr),
518    SbPoolCellSize(u32),
519    Fmsg(IterableDlFmsg<'a>),
520    FmsgObjNestStart(()),
521    FmsgPairNestStart(()),
522    FmsgArrNestStart(()),
523    FmsgNestEnd(()),
524    FmsgObjName(&'a CStr),
525    #[doc = "Associated type: [`VarAttrType`] (enum)"]
526    FmsgObjValueType(u8),
527    HealthReporter(IterableDlHealthReporter<'a>),
528    HealthReporterName(&'a CStr),
529    HealthReporterState(u8),
530    HealthReporterErrCount(u64),
531    HealthReporterRecoverCount(u64),
532    HealthReporterDumpTs(u64),
533    HealthReporterGracefulPeriod(u64),
534    HealthReporterAutoRecover(u8),
535    FlashUpdateFileName(&'a CStr),
536    FlashUpdateComponent(&'a CStr),
537    FlashUpdateStatusMsg(&'a CStr),
538    FlashUpdateStatusDone(u64),
539    FlashUpdateStatusTotal(u64),
540    PortPciPfNumber(u16),
541    PortPciVfNumber(u16),
542    Stats(IterableDlAttrStats<'a>),
543    TrapName(&'a CStr),
544    #[doc = "Associated type: [`TrapAction`] (enum)"]
545    TrapAction(u8),
546    #[doc = "Associated type: [`TrapType`] (enum)"]
547    TrapType(u8),
548    TrapGeneric(()),
549    TrapMetadata(IterableDlTrapMetadata<'a>),
550    TrapGroupName(&'a CStr),
551    ReloadFailed(u8),
552    HealthReporterDumpTsNs(u64),
553    NetnsFd(u32),
554    NetnsPid(u32),
555    NetnsId(u32),
556    HealthReporterAutoDump(u8),
557    TrapPolicerId(u32),
558    TrapPolicerRate(u64),
559    TrapPolicerBurst(u64),
560    PortFunction(IterableDlPortFunction<'a>),
561    InfoBoardSerialNumber(&'a CStr),
562    PortLanes(u32),
563    PortSplittable(u8),
564    PortExternal(u8),
565    PortControllerNumber(u32),
566    FlashUpdateStatusTimeout(u64),
567    #[doc = "Associated type: [`FlashOverwrite`] (1 bit per enumeration)"]
568    FlashUpdateOverwriteMask(BuiltinBitfield32),
569    #[doc = "Associated type: [`ReloadAction`] (enum)"]
570    ReloadAction(u8),
571    #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
572    ReloadActionsPerformed(BuiltinBitfield32),
573    #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
574    ReloadLimits(BuiltinBitfield32),
575    DevStats(IterableDlDevStats<'a>),
576    ReloadStats(IterableDlReloadStats<'a>),
577    #[doc = "Attribute may repeat multiple times (treat it as array)"]
578    ReloadStatsEntry(IterableDlReloadStatsEntry<'a>),
579    ReloadStatsLimit(u8),
580    ReloadStatsValue(u32),
581    RemoteReloadStats(IterableDlReloadStats<'a>),
582    #[doc = "Attribute may repeat multiple times (treat it as array)"]
583    ReloadActionInfo(IterableDlReloadActInfo<'a>),
584    #[doc = "Attribute may repeat multiple times (treat it as array)"]
585    ReloadActionStats(IterableDlReloadActStats<'a>),
586    PortPciSfNumber(u32),
587    #[doc = "Associated type: [`RateType`] (enum)"]
588    RateType(u16),
589    RateTxShare(u64),
590    RateTxMax(u64),
591    RateNodeName(&'a CStr),
592    RateParentNodeName(&'a CStr),
593    RegionMaxSnapshots(u32),
594    LinecardIndex(u32),
595    LinecardState(u8),
596    LinecardType(&'a CStr),
597    LinecardSupportedTypes(IterableDlLinecardSupportedTypes<'a>),
598    Selftests(IterableDlSelftestId<'a>),
599    RateTxPriority(u32),
600    RateTxWeight(u32),
601    RegionDirect(()),
602    #[doc = "Attribute may repeat multiple times (treat it as array)"]
603    RateTcBws(IterableDlRateTcBws<'a>),
604    #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
605    HealthReporterBurstPeriod(u64),
606    #[doc = "Request restoring parameter to its default value\\."]
607    ParamResetDefault(()),
608}
609impl<'a> IterableDevlink<'a> {
610    pub fn get_bus_name(&self) -> Result<&'a CStr, ErrorContext> {
611        let mut iter = self.clone();
612        iter.pos = 0;
613        for attr in iter {
614            if let Devlink::BusName(val) = attr? {
615                return Ok(val);
616            }
617        }
618        Err(ErrorContext::new_missing(
619            "Devlink",
620            "BusName",
621            self.orig_loc,
622            self.buf.as_ptr() as usize,
623        ))
624    }
625    pub fn get_dev_name(&self) -> Result<&'a CStr, ErrorContext> {
626        let mut iter = self.clone();
627        iter.pos = 0;
628        for attr in iter {
629            if let Devlink::DevName(val) = attr? {
630                return Ok(val);
631            }
632        }
633        Err(ErrorContext::new_missing(
634            "Devlink",
635            "DevName",
636            self.orig_loc,
637            self.buf.as_ptr() as usize,
638        ))
639    }
640    pub fn get_port_index(&self) -> Result<u32, ErrorContext> {
641        let mut iter = self.clone();
642        iter.pos = 0;
643        for attr in iter {
644            if let Devlink::PortIndex(val) = attr? {
645                return Ok(val);
646            }
647        }
648        Err(ErrorContext::new_missing(
649            "Devlink",
650            "PortIndex",
651            self.orig_loc,
652            self.buf.as_ptr() as usize,
653        ))
654    }
655    #[doc = "Associated type: [`PortType`] (enum)"]
656    pub fn get_port_type(&self) -> Result<u16, ErrorContext> {
657        let mut iter = self.clone();
658        iter.pos = 0;
659        for attr in iter {
660            if let Devlink::PortType(val) = attr? {
661                return Ok(val);
662            }
663        }
664        Err(ErrorContext::new_missing(
665            "Devlink",
666            "PortType",
667            self.orig_loc,
668            self.buf.as_ptr() as usize,
669        ))
670    }
671    pub fn get_port_desired_type(&self) -> Result<u16, ErrorContext> {
672        let mut iter = self.clone();
673        iter.pos = 0;
674        for attr in iter {
675            if let Devlink::PortDesiredType(val) = attr? {
676                return Ok(val);
677            }
678        }
679        Err(ErrorContext::new_missing(
680            "Devlink",
681            "PortDesiredType",
682            self.orig_loc,
683            self.buf.as_ptr() as usize,
684        ))
685    }
686    pub fn get_port_netdev_ifindex(&self) -> Result<u32, ErrorContext> {
687        let mut iter = self.clone();
688        iter.pos = 0;
689        for attr in iter {
690            if let Devlink::PortNetdevIfindex(val) = attr? {
691                return Ok(val);
692            }
693        }
694        Err(ErrorContext::new_missing(
695            "Devlink",
696            "PortNetdevIfindex",
697            self.orig_loc,
698            self.buf.as_ptr() as usize,
699        ))
700    }
701    pub fn get_port_netdev_name(&self) -> Result<&'a CStr, ErrorContext> {
702        let mut iter = self.clone();
703        iter.pos = 0;
704        for attr in iter {
705            if let Devlink::PortNetdevName(val) = attr? {
706                return Ok(val);
707            }
708        }
709        Err(ErrorContext::new_missing(
710            "Devlink",
711            "PortNetdevName",
712            self.orig_loc,
713            self.buf.as_ptr() as usize,
714        ))
715    }
716    pub fn get_port_ibdev_name(&self) -> Result<&'a CStr, ErrorContext> {
717        let mut iter = self.clone();
718        iter.pos = 0;
719        for attr in iter {
720            if let Devlink::PortIbdevName(val) = attr? {
721                return Ok(val);
722            }
723        }
724        Err(ErrorContext::new_missing(
725            "Devlink",
726            "PortIbdevName",
727            self.orig_loc,
728            self.buf.as_ptr() as usize,
729        ))
730    }
731    pub fn get_port_split_count(&self) -> Result<u32, ErrorContext> {
732        let mut iter = self.clone();
733        iter.pos = 0;
734        for attr in iter {
735            if let Devlink::PortSplitCount(val) = attr? {
736                return Ok(val);
737            }
738        }
739        Err(ErrorContext::new_missing(
740            "Devlink",
741            "PortSplitCount",
742            self.orig_loc,
743            self.buf.as_ptr() as usize,
744        ))
745    }
746    pub fn get_port_split_group(&self) -> Result<u32, ErrorContext> {
747        let mut iter = self.clone();
748        iter.pos = 0;
749        for attr in iter {
750            if let Devlink::PortSplitGroup(val) = attr? {
751                return Ok(val);
752            }
753        }
754        Err(ErrorContext::new_missing(
755            "Devlink",
756            "PortSplitGroup",
757            self.orig_loc,
758            self.buf.as_ptr() as usize,
759        ))
760    }
761    pub fn get_sb_index(&self) -> Result<u32, ErrorContext> {
762        let mut iter = self.clone();
763        iter.pos = 0;
764        for attr in iter {
765            if let Devlink::SbIndex(val) = attr? {
766                return Ok(val);
767            }
768        }
769        Err(ErrorContext::new_missing(
770            "Devlink",
771            "SbIndex",
772            self.orig_loc,
773            self.buf.as_ptr() as usize,
774        ))
775    }
776    pub fn get_sb_size(&self) -> Result<u32, ErrorContext> {
777        let mut iter = self.clone();
778        iter.pos = 0;
779        for attr in iter {
780            if let Devlink::SbSize(val) = attr? {
781                return Ok(val);
782            }
783        }
784        Err(ErrorContext::new_missing(
785            "Devlink",
786            "SbSize",
787            self.orig_loc,
788            self.buf.as_ptr() as usize,
789        ))
790    }
791    pub fn get_sb_ingress_pool_count(&self) -> Result<u16, ErrorContext> {
792        let mut iter = self.clone();
793        iter.pos = 0;
794        for attr in iter {
795            if let Devlink::SbIngressPoolCount(val) = attr? {
796                return Ok(val);
797            }
798        }
799        Err(ErrorContext::new_missing(
800            "Devlink",
801            "SbIngressPoolCount",
802            self.orig_loc,
803            self.buf.as_ptr() as usize,
804        ))
805    }
806    pub fn get_sb_egress_pool_count(&self) -> Result<u16, ErrorContext> {
807        let mut iter = self.clone();
808        iter.pos = 0;
809        for attr in iter {
810            if let Devlink::SbEgressPoolCount(val) = attr? {
811                return Ok(val);
812            }
813        }
814        Err(ErrorContext::new_missing(
815            "Devlink",
816            "SbEgressPoolCount",
817            self.orig_loc,
818            self.buf.as_ptr() as usize,
819        ))
820    }
821    pub fn get_sb_ingress_tc_count(&self) -> Result<u16, ErrorContext> {
822        let mut iter = self.clone();
823        iter.pos = 0;
824        for attr in iter {
825            if let Devlink::SbIngressTcCount(val) = attr? {
826                return Ok(val);
827            }
828        }
829        Err(ErrorContext::new_missing(
830            "Devlink",
831            "SbIngressTcCount",
832            self.orig_loc,
833            self.buf.as_ptr() as usize,
834        ))
835    }
836    pub fn get_sb_egress_tc_count(&self) -> Result<u16, ErrorContext> {
837        let mut iter = self.clone();
838        iter.pos = 0;
839        for attr in iter {
840            if let Devlink::SbEgressTcCount(val) = attr? {
841                return Ok(val);
842            }
843        }
844        Err(ErrorContext::new_missing(
845            "Devlink",
846            "SbEgressTcCount",
847            self.orig_loc,
848            self.buf.as_ptr() as usize,
849        ))
850    }
851    pub fn get_sb_pool_index(&self) -> Result<u16, ErrorContext> {
852        let mut iter = self.clone();
853        iter.pos = 0;
854        for attr in iter {
855            if let Devlink::SbPoolIndex(val) = attr? {
856                return Ok(val);
857            }
858        }
859        Err(ErrorContext::new_missing(
860            "Devlink",
861            "SbPoolIndex",
862            self.orig_loc,
863            self.buf.as_ptr() as usize,
864        ))
865    }
866    #[doc = "Associated type: [`SbPoolType`] (enum)"]
867    pub fn get_sb_pool_type(&self) -> Result<u8, ErrorContext> {
868        let mut iter = self.clone();
869        iter.pos = 0;
870        for attr in iter {
871            if let Devlink::SbPoolType(val) = attr? {
872                return Ok(val);
873            }
874        }
875        Err(ErrorContext::new_missing(
876            "Devlink",
877            "SbPoolType",
878            self.orig_loc,
879            self.buf.as_ptr() as usize,
880        ))
881    }
882    pub fn get_sb_pool_size(&self) -> Result<u32, ErrorContext> {
883        let mut iter = self.clone();
884        iter.pos = 0;
885        for attr in iter {
886            if let Devlink::SbPoolSize(val) = attr? {
887                return Ok(val);
888            }
889        }
890        Err(ErrorContext::new_missing(
891            "Devlink",
892            "SbPoolSize",
893            self.orig_loc,
894            self.buf.as_ptr() as usize,
895        ))
896    }
897    #[doc = "Associated type: [`SbThresholdType`] (enum)"]
898    pub fn get_sb_pool_threshold_type(&self) -> Result<u8, ErrorContext> {
899        let mut iter = self.clone();
900        iter.pos = 0;
901        for attr in iter {
902            if let Devlink::SbPoolThresholdType(val) = attr? {
903                return Ok(val);
904            }
905        }
906        Err(ErrorContext::new_missing(
907            "Devlink",
908            "SbPoolThresholdType",
909            self.orig_loc,
910            self.buf.as_ptr() as usize,
911        ))
912    }
913    pub fn get_sb_threshold(&self) -> Result<u32, ErrorContext> {
914        let mut iter = self.clone();
915        iter.pos = 0;
916        for attr in iter {
917            if let Devlink::SbThreshold(val) = attr? {
918                return Ok(val);
919            }
920        }
921        Err(ErrorContext::new_missing(
922            "Devlink",
923            "SbThreshold",
924            self.orig_loc,
925            self.buf.as_ptr() as usize,
926        ))
927    }
928    pub fn get_sb_tc_index(&self) -> Result<u16, ErrorContext> {
929        let mut iter = self.clone();
930        iter.pos = 0;
931        for attr in iter {
932            if let Devlink::SbTcIndex(val) = attr? {
933                return Ok(val);
934            }
935        }
936        Err(ErrorContext::new_missing(
937            "Devlink",
938            "SbTcIndex",
939            self.orig_loc,
940            self.buf.as_ptr() as usize,
941        ))
942    }
943    pub fn get_sb_occ_cur(&self) -> Result<u32, ErrorContext> {
944        let mut iter = self.clone();
945        iter.pos = 0;
946        for attr in iter {
947            if let Devlink::SbOccCur(val) = attr? {
948                return Ok(val);
949            }
950        }
951        Err(ErrorContext::new_missing(
952            "Devlink",
953            "SbOccCur",
954            self.orig_loc,
955            self.buf.as_ptr() as usize,
956        ))
957    }
958    pub fn get_sb_occ_max(&self) -> Result<u32, ErrorContext> {
959        let mut iter = self.clone();
960        iter.pos = 0;
961        for attr in iter {
962            if let Devlink::SbOccMax(val) = attr? {
963                return Ok(val);
964            }
965        }
966        Err(ErrorContext::new_missing(
967            "Devlink",
968            "SbOccMax",
969            self.orig_loc,
970            self.buf.as_ptr() as usize,
971        ))
972    }
973    #[doc = "Associated type: [`EswitchMode`] (enum)"]
974    pub fn get_eswitch_mode(&self) -> Result<u16, ErrorContext> {
975        let mut iter = self.clone();
976        iter.pos = 0;
977        for attr in iter {
978            if let Devlink::EswitchMode(val) = attr? {
979                return Ok(val);
980            }
981        }
982        Err(ErrorContext::new_missing(
983            "Devlink",
984            "EswitchMode",
985            self.orig_loc,
986            self.buf.as_ptr() as usize,
987        ))
988    }
989    #[doc = "Associated type: [`EswitchInlineMode`] (enum)"]
990    pub fn get_eswitch_inline_mode(&self) -> Result<u8, ErrorContext> {
991        let mut iter = self.clone();
992        iter.pos = 0;
993        for attr in iter {
994            if let Devlink::EswitchInlineMode(val) = attr? {
995                return Ok(val);
996            }
997        }
998        Err(ErrorContext::new_missing(
999            "Devlink",
1000            "EswitchInlineMode",
1001            self.orig_loc,
1002            self.buf.as_ptr() as usize,
1003        ))
1004    }
1005    pub fn get_dpipe_tables(&self) -> Result<IterableDlDpipeTables<'a>, ErrorContext> {
1006        let mut iter = self.clone();
1007        iter.pos = 0;
1008        for attr in iter {
1009            if let Devlink::DpipeTables(val) = attr? {
1010                return Ok(val);
1011            }
1012        }
1013        Err(ErrorContext::new_missing(
1014            "Devlink",
1015            "DpipeTables",
1016            self.orig_loc,
1017            self.buf.as_ptr() as usize,
1018        ))
1019    }
1020    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1021    pub fn get_dpipe_table(
1022        &self,
1023    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeTable<'a>> {
1024        MultiAttrIterable::new(self.clone(), |variant| {
1025            if let Devlink::DpipeTable(val) = variant {
1026                Some(val)
1027            } else {
1028                None
1029            }
1030        })
1031    }
1032    pub fn get_dpipe_table_name(&self) -> Result<&'a CStr, ErrorContext> {
1033        let mut iter = self.clone();
1034        iter.pos = 0;
1035        for attr in iter {
1036            if let Devlink::DpipeTableName(val) = attr? {
1037                return Ok(val);
1038            }
1039        }
1040        Err(ErrorContext::new_missing(
1041            "Devlink",
1042            "DpipeTableName",
1043            self.orig_loc,
1044            self.buf.as_ptr() as usize,
1045        ))
1046    }
1047    pub fn get_dpipe_table_size(&self) -> Result<u64, ErrorContext> {
1048        let mut iter = self.clone();
1049        iter.pos = 0;
1050        for attr in iter {
1051            if let Devlink::DpipeTableSize(val) = attr? {
1052                return Ok(val);
1053            }
1054        }
1055        Err(ErrorContext::new_missing(
1056            "Devlink",
1057            "DpipeTableSize",
1058            self.orig_loc,
1059            self.buf.as_ptr() as usize,
1060        ))
1061    }
1062    pub fn get_dpipe_table_matches(&self) -> Result<IterableDlDpipeTableMatches<'a>, ErrorContext> {
1063        let mut iter = self.clone();
1064        iter.pos = 0;
1065        for attr in iter {
1066            if let Devlink::DpipeTableMatches(val) = attr? {
1067                return Ok(val);
1068            }
1069        }
1070        Err(ErrorContext::new_missing(
1071            "Devlink",
1072            "DpipeTableMatches",
1073            self.orig_loc,
1074            self.buf.as_ptr() as usize,
1075        ))
1076    }
1077    pub fn get_dpipe_table_actions(&self) -> Result<IterableDlDpipeTableActions<'a>, ErrorContext> {
1078        let mut iter = self.clone();
1079        iter.pos = 0;
1080        for attr in iter {
1081            if let Devlink::DpipeTableActions(val) = attr? {
1082                return Ok(val);
1083            }
1084        }
1085        Err(ErrorContext::new_missing(
1086            "Devlink",
1087            "DpipeTableActions",
1088            self.orig_loc,
1089            self.buf.as_ptr() as usize,
1090        ))
1091    }
1092    pub fn get_dpipe_table_counters_enabled(&self) -> Result<u8, ErrorContext> {
1093        let mut iter = self.clone();
1094        iter.pos = 0;
1095        for attr in iter {
1096            if let Devlink::DpipeTableCountersEnabled(val) = attr? {
1097                return Ok(val);
1098            }
1099        }
1100        Err(ErrorContext::new_missing(
1101            "Devlink",
1102            "DpipeTableCountersEnabled",
1103            self.orig_loc,
1104            self.buf.as_ptr() as usize,
1105        ))
1106    }
1107    pub fn get_dpipe_entries(&self) -> Result<IterableDlDpipeEntries<'a>, ErrorContext> {
1108        let mut iter = self.clone();
1109        iter.pos = 0;
1110        for attr in iter {
1111            if let Devlink::DpipeEntries(val) = attr? {
1112                return Ok(val);
1113            }
1114        }
1115        Err(ErrorContext::new_missing(
1116            "Devlink",
1117            "DpipeEntries",
1118            self.orig_loc,
1119            self.buf.as_ptr() as usize,
1120        ))
1121    }
1122    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1123    pub fn get_dpipe_entry(
1124        &self,
1125    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeEntry<'a>> {
1126        MultiAttrIterable::new(self.clone(), |variant| {
1127            if let Devlink::DpipeEntry(val) = variant {
1128                Some(val)
1129            } else {
1130                None
1131            }
1132        })
1133    }
1134    pub fn get_dpipe_entry_index(&self) -> Result<u64, ErrorContext> {
1135        let mut iter = self.clone();
1136        iter.pos = 0;
1137        for attr in iter {
1138            if let Devlink::DpipeEntryIndex(val) = attr? {
1139                return Ok(val);
1140            }
1141        }
1142        Err(ErrorContext::new_missing(
1143            "Devlink",
1144            "DpipeEntryIndex",
1145            self.orig_loc,
1146            self.buf.as_ptr() as usize,
1147        ))
1148    }
1149    pub fn get_dpipe_entry_match_values(
1150        &self,
1151    ) -> Result<IterableDlDpipeEntryMatchValues<'a>, ErrorContext> {
1152        let mut iter = self.clone();
1153        iter.pos = 0;
1154        for attr in iter {
1155            if let Devlink::DpipeEntryMatchValues(val) = attr? {
1156                return Ok(val);
1157            }
1158        }
1159        Err(ErrorContext::new_missing(
1160            "Devlink",
1161            "DpipeEntryMatchValues",
1162            self.orig_loc,
1163            self.buf.as_ptr() as usize,
1164        ))
1165    }
1166    pub fn get_dpipe_entry_action_values(
1167        &self,
1168    ) -> Result<IterableDlDpipeEntryActionValues<'a>, ErrorContext> {
1169        let mut iter = self.clone();
1170        iter.pos = 0;
1171        for attr in iter {
1172            if let Devlink::DpipeEntryActionValues(val) = attr? {
1173                return Ok(val);
1174            }
1175        }
1176        Err(ErrorContext::new_missing(
1177            "Devlink",
1178            "DpipeEntryActionValues",
1179            self.orig_loc,
1180            self.buf.as_ptr() as usize,
1181        ))
1182    }
1183    pub fn get_dpipe_entry_counter(&self) -> Result<u64, ErrorContext> {
1184        let mut iter = self.clone();
1185        iter.pos = 0;
1186        for attr in iter {
1187            if let Devlink::DpipeEntryCounter(val) = attr? {
1188                return Ok(val);
1189            }
1190        }
1191        Err(ErrorContext::new_missing(
1192            "Devlink",
1193            "DpipeEntryCounter",
1194            self.orig_loc,
1195            self.buf.as_ptr() as usize,
1196        ))
1197    }
1198    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1199    pub fn get_dpipe_match(
1200        &self,
1201    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeMatch<'a>> {
1202        MultiAttrIterable::new(self.clone(), |variant| {
1203            if let Devlink::DpipeMatch(val) = variant {
1204                Some(val)
1205            } else {
1206                None
1207            }
1208        })
1209    }
1210    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1211    pub fn get_dpipe_match_value(
1212        &self,
1213    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeMatchValue<'a>> {
1214        MultiAttrIterable::new(self.clone(), |variant| {
1215            if let Devlink::DpipeMatchValue(val) = variant {
1216                Some(val)
1217            } else {
1218                None
1219            }
1220        })
1221    }
1222    #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
1223    pub fn get_dpipe_match_type(&self) -> Result<u32, ErrorContext> {
1224        let mut iter = self.clone();
1225        iter.pos = 0;
1226        for attr in iter {
1227            if let Devlink::DpipeMatchType(val) = attr? {
1228                return Ok(val);
1229            }
1230        }
1231        Err(ErrorContext::new_missing(
1232            "Devlink",
1233            "DpipeMatchType",
1234            self.orig_loc,
1235            self.buf.as_ptr() as usize,
1236        ))
1237    }
1238    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1239    pub fn get_dpipe_action(
1240        &self,
1241    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeAction<'a>> {
1242        MultiAttrIterable::new(self.clone(), |variant| {
1243            if let Devlink::DpipeAction(val) = variant {
1244                Some(val)
1245            } else {
1246                None
1247            }
1248        })
1249    }
1250    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1251    pub fn get_dpipe_action_value(
1252        &self,
1253    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeActionValue<'a>> {
1254        MultiAttrIterable::new(self.clone(), |variant| {
1255            if let Devlink::DpipeActionValue(val) = variant {
1256                Some(val)
1257            } else {
1258                None
1259            }
1260        })
1261    }
1262    #[doc = "Associated type: [`DpipeActionType`] (enum)"]
1263    pub fn get_dpipe_action_type(&self) -> Result<u32, ErrorContext> {
1264        let mut iter = self.clone();
1265        iter.pos = 0;
1266        for attr in iter {
1267            if let Devlink::DpipeActionType(val) = attr? {
1268                return Ok(val);
1269            }
1270        }
1271        Err(ErrorContext::new_missing(
1272            "Devlink",
1273            "DpipeActionType",
1274            self.orig_loc,
1275            self.buf.as_ptr() as usize,
1276        ))
1277    }
1278    pub fn get_dpipe_value(&self) -> Result<&'a [u8], ErrorContext> {
1279        let mut iter = self.clone();
1280        iter.pos = 0;
1281        for attr in iter {
1282            if let Devlink::DpipeValue(val) = attr? {
1283                return Ok(val);
1284            }
1285        }
1286        Err(ErrorContext::new_missing(
1287            "Devlink",
1288            "DpipeValue",
1289            self.orig_loc,
1290            self.buf.as_ptr() as usize,
1291        ))
1292    }
1293    pub fn get_dpipe_value_mask(&self) -> Result<&'a [u8], ErrorContext> {
1294        let mut iter = self.clone();
1295        iter.pos = 0;
1296        for attr in iter {
1297            if let Devlink::DpipeValueMask(val) = attr? {
1298                return Ok(val);
1299            }
1300        }
1301        Err(ErrorContext::new_missing(
1302            "Devlink",
1303            "DpipeValueMask",
1304            self.orig_loc,
1305            self.buf.as_ptr() as usize,
1306        ))
1307    }
1308    pub fn get_dpipe_value_mapping(&self) -> Result<u32, ErrorContext> {
1309        let mut iter = self.clone();
1310        iter.pos = 0;
1311        for attr in iter {
1312            if let Devlink::DpipeValueMapping(val) = attr? {
1313                return Ok(val);
1314            }
1315        }
1316        Err(ErrorContext::new_missing(
1317            "Devlink",
1318            "DpipeValueMapping",
1319            self.orig_loc,
1320            self.buf.as_ptr() as usize,
1321        ))
1322    }
1323    pub fn get_dpipe_headers(&self) -> Result<IterableDlDpipeHeaders<'a>, ErrorContext> {
1324        let mut iter = self.clone();
1325        iter.pos = 0;
1326        for attr in iter {
1327            if let Devlink::DpipeHeaders(val) = attr? {
1328                return Ok(val);
1329            }
1330        }
1331        Err(ErrorContext::new_missing(
1332            "Devlink",
1333            "DpipeHeaders",
1334            self.orig_loc,
1335            self.buf.as_ptr() as usize,
1336        ))
1337    }
1338    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1339    pub fn get_dpipe_header(
1340        &self,
1341    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeHeader<'a>> {
1342        MultiAttrIterable::new(self.clone(), |variant| {
1343            if let Devlink::DpipeHeader(val) = variant {
1344                Some(val)
1345            } else {
1346                None
1347            }
1348        })
1349    }
1350    pub fn get_dpipe_header_name(&self) -> Result<&'a CStr, ErrorContext> {
1351        let mut iter = self.clone();
1352        iter.pos = 0;
1353        for attr in iter {
1354            if let Devlink::DpipeHeaderName(val) = attr? {
1355                return Ok(val);
1356            }
1357        }
1358        Err(ErrorContext::new_missing(
1359            "Devlink",
1360            "DpipeHeaderName",
1361            self.orig_loc,
1362            self.buf.as_ptr() as usize,
1363        ))
1364    }
1365    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
1366    pub fn get_dpipe_header_id(&self) -> Result<u32, ErrorContext> {
1367        let mut iter = self.clone();
1368        iter.pos = 0;
1369        for attr in iter {
1370            if let Devlink::DpipeHeaderId(val) = attr? {
1371                return Ok(val);
1372            }
1373        }
1374        Err(ErrorContext::new_missing(
1375            "Devlink",
1376            "DpipeHeaderId",
1377            self.orig_loc,
1378            self.buf.as_ptr() as usize,
1379        ))
1380    }
1381    pub fn get_dpipe_header_fields(&self) -> Result<IterableDlDpipeHeaderFields<'a>, ErrorContext> {
1382        let mut iter = self.clone();
1383        iter.pos = 0;
1384        for attr in iter {
1385            if let Devlink::DpipeHeaderFields(val) = attr? {
1386                return Ok(val);
1387            }
1388        }
1389        Err(ErrorContext::new_missing(
1390            "Devlink",
1391            "DpipeHeaderFields",
1392            self.orig_loc,
1393            self.buf.as_ptr() as usize,
1394        ))
1395    }
1396    pub fn get_dpipe_header_global(&self) -> Result<u8, ErrorContext> {
1397        let mut iter = self.clone();
1398        iter.pos = 0;
1399        for attr in iter {
1400            if let Devlink::DpipeHeaderGlobal(val) = attr? {
1401                return Ok(val);
1402            }
1403        }
1404        Err(ErrorContext::new_missing(
1405            "Devlink",
1406            "DpipeHeaderGlobal",
1407            self.orig_loc,
1408            self.buf.as_ptr() as usize,
1409        ))
1410    }
1411    pub fn get_dpipe_header_index(&self) -> Result<u32, ErrorContext> {
1412        let mut iter = self.clone();
1413        iter.pos = 0;
1414        for attr in iter {
1415            if let Devlink::DpipeHeaderIndex(val) = attr? {
1416                return Ok(val);
1417            }
1418        }
1419        Err(ErrorContext::new_missing(
1420            "Devlink",
1421            "DpipeHeaderIndex",
1422            self.orig_loc,
1423            self.buf.as_ptr() as usize,
1424        ))
1425    }
1426    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1427    pub fn get_dpipe_field(
1428        &self,
1429    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeField<'a>> {
1430        MultiAttrIterable::new(self.clone(), |variant| {
1431            if let Devlink::DpipeField(val) = variant {
1432                Some(val)
1433            } else {
1434                None
1435            }
1436        })
1437    }
1438    pub fn get_dpipe_field_name(&self) -> Result<&'a CStr, ErrorContext> {
1439        let mut iter = self.clone();
1440        iter.pos = 0;
1441        for attr in iter {
1442            if let Devlink::DpipeFieldName(val) = attr? {
1443                return Ok(val);
1444            }
1445        }
1446        Err(ErrorContext::new_missing(
1447            "Devlink",
1448            "DpipeFieldName",
1449            self.orig_loc,
1450            self.buf.as_ptr() as usize,
1451        ))
1452    }
1453    pub fn get_dpipe_field_id(&self) -> Result<u32, ErrorContext> {
1454        let mut iter = self.clone();
1455        iter.pos = 0;
1456        for attr in iter {
1457            if let Devlink::DpipeFieldId(val) = attr? {
1458                return Ok(val);
1459            }
1460        }
1461        Err(ErrorContext::new_missing(
1462            "Devlink",
1463            "DpipeFieldId",
1464            self.orig_loc,
1465            self.buf.as_ptr() as usize,
1466        ))
1467    }
1468    pub fn get_dpipe_field_bitwidth(&self) -> Result<u32, ErrorContext> {
1469        let mut iter = self.clone();
1470        iter.pos = 0;
1471        for attr in iter {
1472            if let Devlink::DpipeFieldBitwidth(val) = attr? {
1473                return Ok(val);
1474            }
1475        }
1476        Err(ErrorContext::new_missing(
1477            "Devlink",
1478            "DpipeFieldBitwidth",
1479            self.orig_loc,
1480            self.buf.as_ptr() as usize,
1481        ))
1482    }
1483    #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
1484    pub fn get_dpipe_field_mapping_type(&self) -> Result<u32, ErrorContext> {
1485        let mut iter = self.clone();
1486        iter.pos = 0;
1487        for attr in iter {
1488            if let Devlink::DpipeFieldMappingType(val) = attr? {
1489                return Ok(val);
1490            }
1491        }
1492        Err(ErrorContext::new_missing(
1493            "Devlink",
1494            "DpipeFieldMappingType",
1495            self.orig_loc,
1496            self.buf.as_ptr() as usize,
1497        ))
1498    }
1499    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
1500        let mut iter = self.clone();
1501        iter.pos = 0;
1502        for attr in iter {
1503            if let Devlink::Pad(val) = attr? {
1504                return Ok(val);
1505            }
1506        }
1507        Err(ErrorContext::new_missing(
1508            "Devlink",
1509            "Pad",
1510            self.orig_loc,
1511            self.buf.as_ptr() as usize,
1512        ))
1513    }
1514    #[doc = "Associated type: [`EswitchEncapMode`] (enum)"]
1515    pub fn get_eswitch_encap_mode(&self) -> Result<u8, ErrorContext> {
1516        let mut iter = self.clone();
1517        iter.pos = 0;
1518        for attr in iter {
1519            if let Devlink::EswitchEncapMode(val) = attr? {
1520                return Ok(val);
1521            }
1522        }
1523        Err(ErrorContext::new_missing(
1524            "Devlink",
1525            "EswitchEncapMode",
1526            self.orig_loc,
1527            self.buf.as_ptr() as usize,
1528        ))
1529    }
1530    pub fn get_resource_list(&self) -> Result<IterableDlResourceList<'a>, ErrorContext> {
1531        let mut iter = self.clone();
1532        iter.pos = 0;
1533        for attr in iter {
1534            if let Devlink::ResourceList(val) = attr? {
1535                return Ok(val);
1536            }
1537        }
1538        Err(ErrorContext::new_missing(
1539            "Devlink",
1540            "ResourceList",
1541            self.orig_loc,
1542            self.buf.as_ptr() as usize,
1543        ))
1544    }
1545    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1546    pub fn get_resource(&self) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlResource<'a>> {
1547        MultiAttrIterable::new(self.clone(), |variant| {
1548            if let Devlink::Resource(val) = variant {
1549                Some(val)
1550            } else {
1551                None
1552            }
1553        })
1554    }
1555    pub fn get_resource_name(&self) -> Result<&'a CStr, ErrorContext> {
1556        let mut iter = self.clone();
1557        iter.pos = 0;
1558        for attr in iter {
1559            if let Devlink::ResourceName(val) = attr? {
1560                return Ok(val);
1561            }
1562        }
1563        Err(ErrorContext::new_missing(
1564            "Devlink",
1565            "ResourceName",
1566            self.orig_loc,
1567            self.buf.as_ptr() as usize,
1568        ))
1569    }
1570    pub fn get_resource_id(&self) -> Result<u64, ErrorContext> {
1571        let mut iter = self.clone();
1572        iter.pos = 0;
1573        for attr in iter {
1574            if let Devlink::ResourceId(val) = attr? {
1575                return Ok(val);
1576            }
1577        }
1578        Err(ErrorContext::new_missing(
1579            "Devlink",
1580            "ResourceId",
1581            self.orig_loc,
1582            self.buf.as_ptr() as usize,
1583        ))
1584    }
1585    pub fn get_resource_size(&self) -> Result<u64, ErrorContext> {
1586        let mut iter = self.clone();
1587        iter.pos = 0;
1588        for attr in iter {
1589            if let Devlink::ResourceSize(val) = attr? {
1590                return Ok(val);
1591            }
1592        }
1593        Err(ErrorContext::new_missing(
1594            "Devlink",
1595            "ResourceSize",
1596            self.orig_loc,
1597            self.buf.as_ptr() as usize,
1598        ))
1599    }
1600    pub fn get_resource_size_new(&self) -> Result<u64, ErrorContext> {
1601        let mut iter = self.clone();
1602        iter.pos = 0;
1603        for attr in iter {
1604            if let Devlink::ResourceSizeNew(val) = attr? {
1605                return Ok(val);
1606            }
1607        }
1608        Err(ErrorContext::new_missing(
1609            "Devlink",
1610            "ResourceSizeNew",
1611            self.orig_loc,
1612            self.buf.as_ptr() as usize,
1613        ))
1614    }
1615    pub fn get_resource_size_valid(&self) -> Result<u8, ErrorContext> {
1616        let mut iter = self.clone();
1617        iter.pos = 0;
1618        for attr in iter {
1619            if let Devlink::ResourceSizeValid(val) = attr? {
1620                return Ok(val);
1621            }
1622        }
1623        Err(ErrorContext::new_missing(
1624            "Devlink",
1625            "ResourceSizeValid",
1626            self.orig_loc,
1627            self.buf.as_ptr() as usize,
1628        ))
1629    }
1630    pub fn get_resource_size_min(&self) -> Result<u64, ErrorContext> {
1631        let mut iter = self.clone();
1632        iter.pos = 0;
1633        for attr in iter {
1634            if let Devlink::ResourceSizeMin(val) = attr? {
1635                return Ok(val);
1636            }
1637        }
1638        Err(ErrorContext::new_missing(
1639            "Devlink",
1640            "ResourceSizeMin",
1641            self.orig_loc,
1642            self.buf.as_ptr() as usize,
1643        ))
1644    }
1645    pub fn get_resource_size_max(&self) -> Result<u64, ErrorContext> {
1646        let mut iter = self.clone();
1647        iter.pos = 0;
1648        for attr in iter {
1649            if let Devlink::ResourceSizeMax(val) = attr? {
1650                return Ok(val);
1651            }
1652        }
1653        Err(ErrorContext::new_missing(
1654            "Devlink",
1655            "ResourceSizeMax",
1656            self.orig_loc,
1657            self.buf.as_ptr() as usize,
1658        ))
1659    }
1660    pub fn get_resource_size_gran(&self) -> Result<u64, ErrorContext> {
1661        let mut iter = self.clone();
1662        iter.pos = 0;
1663        for attr in iter {
1664            if let Devlink::ResourceSizeGran(val) = attr? {
1665                return Ok(val);
1666            }
1667        }
1668        Err(ErrorContext::new_missing(
1669            "Devlink",
1670            "ResourceSizeGran",
1671            self.orig_loc,
1672            self.buf.as_ptr() as usize,
1673        ))
1674    }
1675    #[doc = "Associated type: [`ResourceUnit`] (enum)"]
1676    pub fn get_resource_unit(&self) -> Result<u8, ErrorContext> {
1677        let mut iter = self.clone();
1678        iter.pos = 0;
1679        for attr in iter {
1680            if let Devlink::ResourceUnit(val) = attr? {
1681                return Ok(val);
1682            }
1683        }
1684        Err(ErrorContext::new_missing(
1685            "Devlink",
1686            "ResourceUnit",
1687            self.orig_loc,
1688            self.buf.as_ptr() as usize,
1689        ))
1690    }
1691    pub fn get_resource_occ(&self) -> Result<u64, ErrorContext> {
1692        let mut iter = self.clone();
1693        iter.pos = 0;
1694        for attr in iter {
1695            if let Devlink::ResourceOcc(val) = attr? {
1696                return Ok(val);
1697            }
1698        }
1699        Err(ErrorContext::new_missing(
1700            "Devlink",
1701            "ResourceOcc",
1702            self.orig_loc,
1703            self.buf.as_ptr() as usize,
1704        ))
1705    }
1706    pub fn get_dpipe_table_resource_id(&self) -> Result<u64, ErrorContext> {
1707        let mut iter = self.clone();
1708        iter.pos = 0;
1709        for attr in iter {
1710            if let Devlink::DpipeTableResourceId(val) = attr? {
1711                return Ok(val);
1712            }
1713        }
1714        Err(ErrorContext::new_missing(
1715            "Devlink",
1716            "DpipeTableResourceId",
1717            self.orig_loc,
1718            self.buf.as_ptr() as usize,
1719        ))
1720    }
1721    pub fn get_dpipe_table_resource_units(&self) -> Result<u64, ErrorContext> {
1722        let mut iter = self.clone();
1723        iter.pos = 0;
1724        for attr in iter {
1725            if let Devlink::DpipeTableResourceUnits(val) = attr? {
1726                return Ok(val);
1727            }
1728        }
1729        Err(ErrorContext::new_missing(
1730            "Devlink",
1731            "DpipeTableResourceUnits",
1732            self.orig_loc,
1733            self.buf.as_ptr() as usize,
1734        ))
1735    }
1736    #[doc = "Associated type: [`PortFlavour`] (enum)"]
1737    pub fn get_port_flavour(&self) -> Result<u16, ErrorContext> {
1738        let mut iter = self.clone();
1739        iter.pos = 0;
1740        for attr in iter {
1741            if let Devlink::PortFlavour(val) = attr? {
1742                return Ok(val);
1743            }
1744        }
1745        Err(ErrorContext::new_missing(
1746            "Devlink",
1747            "PortFlavour",
1748            self.orig_loc,
1749            self.buf.as_ptr() as usize,
1750        ))
1751    }
1752    pub fn get_port_number(&self) -> Result<u32, ErrorContext> {
1753        let mut iter = self.clone();
1754        iter.pos = 0;
1755        for attr in iter {
1756            if let Devlink::PortNumber(val) = attr? {
1757                return Ok(val);
1758            }
1759        }
1760        Err(ErrorContext::new_missing(
1761            "Devlink",
1762            "PortNumber",
1763            self.orig_loc,
1764            self.buf.as_ptr() as usize,
1765        ))
1766    }
1767    pub fn get_port_split_subport_number(&self) -> Result<u32, ErrorContext> {
1768        let mut iter = self.clone();
1769        iter.pos = 0;
1770        for attr in iter {
1771            if let Devlink::PortSplitSubportNumber(val) = attr? {
1772                return Ok(val);
1773            }
1774        }
1775        Err(ErrorContext::new_missing(
1776            "Devlink",
1777            "PortSplitSubportNumber",
1778            self.orig_loc,
1779            self.buf.as_ptr() as usize,
1780        ))
1781    }
1782    pub fn get_param(&self) -> Result<IterableDlParam<'a>, ErrorContext> {
1783        let mut iter = self.clone();
1784        iter.pos = 0;
1785        for attr in iter {
1786            if let Devlink::Param(val) = attr? {
1787                return Ok(val);
1788            }
1789        }
1790        Err(ErrorContext::new_missing(
1791            "Devlink",
1792            "Param",
1793            self.orig_loc,
1794            self.buf.as_ptr() as usize,
1795        ))
1796    }
1797    pub fn get_param_name(&self) -> Result<&'a CStr, ErrorContext> {
1798        let mut iter = self.clone();
1799        iter.pos = 0;
1800        for attr in iter {
1801            if let Devlink::ParamName(val) = attr? {
1802                return Ok(val);
1803            }
1804        }
1805        Err(ErrorContext::new_missing(
1806            "Devlink",
1807            "ParamName",
1808            self.orig_loc,
1809            self.buf.as_ptr() as usize,
1810        ))
1811    }
1812    pub fn get_param_generic(&self) -> Result<(), ErrorContext> {
1813        let mut iter = self.clone();
1814        iter.pos = 0;
1815        for attr in iter {
1816            if let Devlink::ParamGeneric(val) = attr? {
1817                return Ok(val);
1818            }
1819        }
1820        Err(ErrorContext::new_missing(
1821            "Devlink",
1822            "ParamGeneric",
1823            self.orig_loc,
1824            self.buf.as_ptr() as usize,
1825        ))
1826    }
1827    #[doc = "Associated type: [`VarAttrType`] (enum)"]
1828    pub fn get_param_type(&self) -> Result<u8, ErrorContext> {
1829        let mut iter = self.clone();
1830        iter.pos = 0;
1831        for attr in iter {
1832            if let Devlink::ParamType(val) = attr? {
1833                return Ok(val);
1834            }
1835        }
1836        Err(ErrorContext::new_missing(
1837            "Devlink",
1838            "ParamType",
1839            self.orig_loc,
1840            self.buf.as_ptr() as usize,
1841        ))
1842    }
1843    #[doc = "Associated type: [`ParamCmode`] (enum)"]
1844    pub fn get_param_value_cmode(&self) -> Result<u8, ErrorContext> {
1845        let mut iter = self.clone();
1846        iter.pos = 0;
1847        for attr in iter {
1848            if let Devlink::ParamValueCmode(val) = attr? {
1849                return Ok(val);
1850            }
1851        }
1852        Err(ErrorContext::new_missing(
1853            "Devlink",
1854            "ParamValueCmode",
1855            self.orig_loc,
1856            self.buf.as_ptr() as usize,
1857        ))
1858    }
1859    pub fn get_region_name(&self) -> Result<&'a CStr, ErrorContext> {
1860        let mut iter = self.clone();
1861        iter.pos = 0;
1862        for attr in iter {
1863            if let Devlink::RegionName(val) = attr? {
1864                return Ok(val);
1865            }
1866        }
1867        Err(ErrorContext::new_missing(
1868            "Devlink",
1869            "RegionName",
1870            self.orig_loc,
1871            self.buf.as_ptr() as usize,
1872        ))
1873    }
1874    pub fn get_region_size(&self) -> Result<u64, ErrorContext> {
1875        let mut iter = self.clone();
1876        iter.pos = 0;
1877        for attr in iter {
1878            if let Devlink::RegionSize(val) = attr? {
1879                return Ok(val);
1880            }
1881        }
1882        Err(ErrorContext::new_missing(
1883            "Devlink",
1884            "RegionSize",
1885            self.orig_loc,
1886            self.buf.as_ptr() as usize,
1887        ))
1888    }
1889    pub fn get_region_snapshots(&self) -> Result<IterableDlRegionSnapshots<'a>, ErrorContext> {
1890        let mut iter = self.clone();
1891        iter.pos = 0;
1892        for attr in iter {
1893            if let Devlink::RegionSnapshots(val) = attr? {
1894                return Ok(val);
1895            }
1896        }
1897        Err(ErrorContext::new_missing(
1898            "Devlink",
1899            "RegionSnapshots",
1900            self.orig_loc,
1901            self.buf.as_ptr() as usize,
1902        ))
1903    }
1904    pub fn get_region_snapshot(&self) -> Result<IterableDlRegionSnapshot<'a>, ErrorContext> {
1905        let mut iter = self.clone();
1906        iter.pos = 0;
1907        for attr in iter {
1908            if let Devlink::RegionSnapshot(val) = attr? {
1909                return Ok(val);
1910            }
1911        }
1912        Err(ErrorContext::new_missing(
1913            "Devlink",
1914            "RegionSnapshot",
1915            self.orig_loc,
1916            self.buf.as_ptr() as usize,
1917        ))
1918    }
1919    pub fn get_region_snapshot_id(&self) -> Result<u32, ErrorContext> {
1920        let mut iter = self.clone();
1921        iter.pos = 0;
1922        for attr in iter {
1923            if let Devlink::RegionSnapshotId(val) = attr? {
1924                return Ok(val);
1925            }
1926        }
1927        Err(ErrorContext::new_missing(
1928            "Devlink",
1929            "RegionSnapshotId",
1930            self.orig_loc,
1931            self.buf.as_ptr() as usize,
1932        ))
1933    }
1934    pub fn get_region_chunks(&self) -> Result<IterableDlRegionChunks<'a>, ErrorContext> {
1935        let mut iter = self.clone();
1936        iter.pos = 0;
1937        for attr in iter {
1938            if let Devlink::RegionChunks(val) = attr? {
1939                return Ok(val);
1940            }
1941        }
1942        Err(ErrorContext::new_missing(
1943            "Devlink",
1944            "RegionChunks",
1945            self.orig_loc,
1946            self.buf.as_ptr() as usize,
1947        ))
1948    }
1949    pub fn get_region_chunk(&self) -> Result<IterableDlRegionChunk<'a>, ErrorContext> {
1950        let mut iter = self.clone();
1951        iter.pos = 0;
1952        for attr in iter {
1953            if let Devlink::RegionChunk(val) = attr? {
1954                return Ok(val);
1955            }
1956        }
1957        Err(ErrorContext::new_missing(
1958            "Devlink",
1959            "RegionChunk",
1960            self.orig_loc,
1961            self.buf.as_ptr() as usize,
1962        ))
1963    }
1964    pub fn get_region_chunk_data(&self) -> Result<&'a [u8], ErrorContext> {
1965        let mut iter = self.clone();
1966        iter.pos = 0;
1967        for attr in iter {
1968            if let Devlink::RegionChunkData(val) = attr? {
1969                return Ok(val);
1970            }
1971        }
1972        Err(ErrorContext::new_missing(
1973            "Devlink",
1974            "RegionChunkData",
1975            self.orig_loc,
1976            self.buf.as_ptr() as usize,
1977        ))
1978    }
1979    pub fn get_region_chunk_addr(&self) -> Result<u64, ErrorContext> {
1980        let mut iter = self.clone();
1981        iter.pos = 0;
1982        for attr in iter {
1983            if let Devlink::RegionChunkAddr(val) = attr? {
1984                return Ok(val);
1985            }
1986        }
1987        Err(ErrorContext::new_missing(
1988            "Devlink",
1989            "RegionChunkAddr",
1990            self.orig_loc,
1991            self.buf.as_ptr() as usize,
1992        ))
1993    }
1994    pub fn get_region_chunk_len(&self) -> Result<u64, ErrorContext> {
1995        let mut iter = self.clone();
1996        iter.pos = 0;
1997        for attr in iter {
1998            if let Devlink::RegionChunkLen(val) = attr? {
1999                return Ok(val);
2000            }
2001        }
2002        Err(ErrorContext::new_missing(
2003            "Devlink",
2004            "RegionChunkLen",
2005            self.orig_loc,
2006            self.buf.as_ptr() as usize,
2007        ))
2008    }
2009    pub fn get_info_driver_name(&self) -> Result<&'a CStr, ErrorContext> {
2010        let mut iter = self.clone();
2011        iter.pos = 0;
2012        for attr in iter {
2013            if let Devlink::InfoDriverName(val) = attr? {
2014                return Ok(val);
2015            }
2016        }
2017        Err(ErrorContext::new_missing(
2018            "Devlink",
2019            "InfoDriverName",
2020            self.orig_loc,
2021            self.buf.as_ptr() as usize,
2022        ))
2023    }
2024    pub fn get_info_serial_number(&self) -> Result<&'a CStr, ErrorContext> {
2025        let mut iter = self.clone();
2026        iter.pos = 0;
2027        for attr in iter {
2028            if let Devlink::InfoSerialNumber(val) = attr? {
2029                return Ok(val);
2030            }
2031        }
2032        Err(ErrorContext::new_missing(
2033            "Devlink",
2034            "InfoSerialNumber",
2035            self.orig_loc,
2036            self.buf.as_ptr() as usize,
2037        ))
2038    }
2039    #[doc = "Attribute may repeat multiple times (treat it as array)"]
2040    pub fn get_info_version_fixed(
2041        &self,
2042    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlInfoVersion<'a>> {
2043        MultiAttrIterable::new(self.clone(), |variant| {
2044            if let Devlink::InfoVersionFixed(val) = variant {
2045                Some(val)
2046            } else {
2047                None
2048            }
2049        })
2050    }
2051    #[doc = "Attribute may repeat multiple times (treat it as array)"]
2052    pub fn get_info_version_running(
2053        &self,
2054    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlInfoVersion<'a>> {
2055        MultiAttrIterable::new(self.clone(), |variant| {
2056            if let Devlink::InfoVersionRunning(val) = variant {
2057                Some(val)
2058            } else {
2059                None
2060            }
2061        })
2062    }
2063    #[doc = "Attribute may repeat multiple times (treat it as array)"]
2064    pub fn get_info_version_stored(
2065        &self,
2066    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlInfoVersion<'a>> {
2067        MultiAttrIterable::new(self.clone(), |variant| {
2068            if let Devlink::InfoVersionStored(val) = variant {
2069                Some(val)
2070            } else {
2071                None
2072            }
2073        })
2074    }
2075    pub fn get_info_version_name(&self) -> Result<&'a CStr, ErrorContext> {
2076        let mut iter = self.clone();
2077        iter.pos = 0;
2078        for attr in iter {
2079            if let Devlink::InfoVersionName(val) = attr? {
2080                return Ok(val);
2081            }
2082        }
2083        Err(ErrorContext::new_missing(
2084            "Devlink",
2085            "InfoVersionName",
2086            self.orig_loc,
2087            self.buf.as_ptr() as usize,
2088        ))
2089    }
2090    pub fn get_info_version_value(&self) -> Result<&'a CStr, ErrorContext> {
2091        let mut iter = self.clone();
2092        iter.pos = 0;
2093        for attr in iter {
2094            if let Devlink::InfoVersionValue(val) = attr? {
2095                return Ok(val);
2096            }
2097        }
2098        Err(ErrorContext::new_missing(
2099            "Devlink",
2100            "InfoVersionValue",
2101            self.orig_loc,
2102            self.buf.as_ptr() as usize,
2103        ))
2104    }
2105    pub fn get_sb_pool_cell_size(&self) -> Result<u32, ErrorContext> {
2106        let mut iter = self.clone();
2107        iter.pos = 0;
2108        for attr in iter {
2109            if let Devlink::SbPoolCellSize(val) = attr? {
2110                return Ok(val);
2111            }
2112        }
2113        Err(ErrorContext::new_missing(
2114            "Devlink",
2115            "SbPoolCellSize",
2116            self.orig_loc,
2117            self.buf.as_ptr() as usize,
2118        ))
2119    }
2120    pub fn get_fmsg(&self) -> Result<IterableDlFmsg<'a>, ErrorContext> {
2121        let mut iter = self.clone();
2122        iter.pos = 0;
2123        for attr in iter {
2124            if let Devlink::Fmsg(val) = attr? {
2125                return Ok(val);
2126            }
2127        }
2128        Err(ErrorContext::new_missing(
2129            "Devlink",
2130            "Fmsg",
2131            self.orig_loc,
2132            self.buf.as_ptr() as usize,
2133        ))
2134    }
2135    pub fn get_fmsg_obj_nest_start(&self) -> Result<(), ErrorContext> {
2136        let mut iter = self.clone();
2137        iter.pos = 0;
2138        for attr in iter {
2139            if let Devlink::FmsgObjNestStart(val) = attr? {
2140                return Ok(val);
2141            }
2142        }
2143        Err(ErrorContext::new_missing(
2144            "Devlink",
2145            "FmsgObjNestStart",
2146            self.orig_loc,
2147            self.buf.as_ptr() as usize,
2148        ))
2149    }
2150    pub fn get_fmsg_pair_nest_start(&self) -> Result<(), ErrorContext> {
2151        let mut iter = self.clone();
2152        iter.pos = 0;
2153        for attr in iter {
2154            if let Devlink::FmsgPairNestStart(val) = attr? {
2155                return Ok(val);
2156            }
2157        }
2158        Err(ErrorContext::new_missing(
2159            "Devlink",
2160            "FmsgPairNestStart",
2161            self.orig_loc,
2162            self.buf.as_ptr() as usize,
2163        ))
2164    }
2165    pub fn get_fmsg_arr_nest_start(&self) -> Result<(), ErrorContext> {
2166        let mut iter = self.clone();
2167        iter.pos = 0;
2168        for attr in iter {
2169            if let Devlink::FmsgArrNestStart(val) = attr? {
2170                return Ok(val);
2171            }
2172        }
2173        Err(ErrorContext::new_missing(
2174            "Devlink",
2175            "FmsgArrNestStart",
2176            self.orig_loc,
2177            self.buf.as_ptr() as usize,
2178        ))
2179    }
2180    pub fn get_fmsg_nest_end(&self) -> Result<(), ErrorContext> {
2181        let mut iter = self.clone();
2182        iter.pos = 0;
2183        for attr in iter {
2184            if let Devlink::FmsgNestEnd(val) = attr? {
2185                return Ok(val);
2186            }
2187        }
2188        Err(ErrorContext::new_missing(
2189            "Devlink",
2190            "FmsgNestEnd",
2191            self.orig_loc,
2192            self.buf.as_ptr() as usize,
2193        ))
2194    }
2195    pub fn get_fmsg_obj_name(&self) -> Result<&'a CStr, ErrorContext> {
2196        let mut iter = self.clone();
2197        iter.pos = 0;
2198        for attr in iter {
2199            if let Devlink::FmsgObjName(val) = attr? {
2200                return Ok(val);
2201            }
2202        }
2203        Err(ErrorContext::new_missing(
2204            "Devlink",
2205            "FmsgObjName",
2206            self.orig_loc,
2207            self.buf.as_ptr() as usize,
2208        ))
2209    }
2210    #[doc = "Associated type: [`VarAttrType`] (enum)"]
2211    pub fn get_fmsg_obj_value_type(&self) -> Result<u8, ErrorContext> {
2212        let mut iter = self.clone();
2213        iter.pos = 0;
2214        for attr in iter {
2215            if let Devlink::FmsgObjValueType(val) = attr? {
2216                return Ok(val);
2217            }
2218        }
2219        Err(ErrorContext::new_missing(
2220            "Devlink",
2221            "FmsgObjValueType",
2222            self.orig_loc,
2223            self.buf.as_ptr() as usize,
2224        ))
2225    }
2226    pub fn get_health_reporter(&self) -> Result<IterableDlHealthReporter<'a>, ErrorContext> {
2227        let mut iter = self.clone();
2228        iter.pos = 0;
2229        for attr in iter {
2230            if let Devlink::HealthReporter(val) = attr? {
2231                return Ok(val);
2232            }
2233        }
2234        Err(ErrorContext::new_missing(
2235            "Devlink",
2236            "HealthReporter",
2237            self.orig_loc,
2238            self.buf.as_ptr() as usize,
2239        ))
2240    }
2241    pub fn get_health_reporter_name(&self) -> Result<&'a CStr, ErrorContext> {
2242        let mut iter = self.clone();
2243        iter.pos = 0;
2244        for attr in iter {
2245            if let Devlink::HealthReporterName(val) = attr? {
2246                return Ok(val);
2247            }
2248        }
2249        Err(ErrorContext::new_missing(
2250            "Devlink",
2251            "HealthReporterName",
2252            self.orig_loc,
2253            self.buf.as_ptr() as usize,
2254        ))
2255    }
2256    pub fn get_health_reporter_state(&self) -> Result<u8, ErrorContext> {
2257        let mut iter = self.clone();
2258        iter.pos = 0;
2259        for attr in iter {
2260            if let Devlink::HealthReporterState(val) = attr? {
2261                return Ok(val);
2262            }
2263        }
2264        Err(ErrorContext::new_missing(
2265            "Devlink",
2266            "HealthReporterState",
2267            self.orig_loc,
2268            self.buf.as_ptr() as usize,
2269        ))
2270    }
2271    pub fn get_health_reporter_err_count(&self) -> Result<u64, ErrorContext> {
2272        let mut iter = self.clone();
2273        iter.pos = 0;
2274        for attr in iter {
2275            if let Devlink::HealthReporterErrCount(val) = attr? {
2276                return Ok(val);
2277            }
2278        }
2279        Err(ErrorContext::new_missing(
2280            "Devlink",
2281            "HealthReporterErrCount",
2282            self.orig_loc,
2283            self.buf.as_ptr() as usize,
2284        ))
2285    }
2286    pub fn get_health_reporter_recover_count(&self) -> Result<u64, ErrorContext> {
2287        let mut iter = self.clone();
2288        iter.pos = 0;
2289        for attr in iter {
2290            if let Devlink::HealthReporterRecoverCount(val) = attr? {
2291                return Ok(val);
2292            }
2293        }
2294        Err(ErrorContext::new_missing(
2295            "Devlink",
2296            "HealthReporterRecoverCount",
2297            self.orig_loc,
2298            self.buf.as_ptr() as usize,
2299        ))
2300    }
2301    pub fn get_health_reporter_dump_ts(&self) -> Result<u64, ErrorContext> {
2302        let mut iter = self.clone();
2303        iter.pos = 0;
2304        for attr in iter {
2305            if let Devlink::HealthReporterDumpTs(val) = attr? {
2306                return Ok(val);
2307            }
2308        }
2309        Err(ErrorContext::new_missing(
2310            "Devlink",
2311            "HealthReporterDumpTs",
2312            self.orig_loc,
2313            self.buf.as_ptr() as usize,
2314        ))
2315    }
2316    pub fn get_health_reporter_graceful_period(&self) -> Result<u64, ErrorContext> {
2317        let mut iter = self.clone();
2318        iter.pos = 0;
2319        for attr in iter {
2320            if let Devlink::HealthReporterGracefulPeriod(val) = attr? {
2321                return Ok(val);
2322            }
2323        }
2324        Err(ErrorContext::new_missing(
2325            "Devlink",
2326            "HealthReporterGracefulPeriod",
2327            self.orig_loc,
2328            self.buf.as_ptr() as usize,
2329        ))
2330    }
2331    pub fn get_health_reporter_auto_recover(&self) -> Result<u8, ErrorContext> {
2332        let mut iter = self.clone();
2333        iter.pos = 0;
2334        for attr in iter {
2335            if let Devlink::HealthReporterAutoRecover(val) = attr? {
2336                return Ok(val);
2337            }
2338        }
2339        Err(ErrorContext::new_missing(
2340            "Devlink",
2341            "HealthReporterAutoRecover",
2342            self.orig_loc,
2343            self.buf.as_ptr() as usize,
2344        ))
2345    }
2346    pub fn get_flash_update_file_name(&self) -> Result<&'a CStr, ErrorContext> {
2347        let mut iter = self.clone();
2348        iter.pos = 0;
2349        for attr in iter {
2350            if let Devlink::FlashUpdateFileName(val) = attr? {
2351                return Ok(val);
2352            }
2353        }
2354        Err(ErrorContext::new_missing(
2355            "Devlink",
2356            "FlashUpdateFileName",
2357            self.orig_loc,
2358            self.buf.as_ptr() as usize,
2359        ))
2360    }
2361    pub fn get_flash_update_component(&self) -> Result<&'a CStr, ErrorContext> {
2362        let mut iter = self.clone();
2363        iter.pos = 0;
2364        for attr in iter {
2365            if let Devlink::FlashUpdateComponent(val) = attr? {
2366                return Ok(val);
2367            }
2368        }
2369        Err(ErrorContext::new_missing(
2370            "Devlink",
2371            "FlashUpdateComponent",
2372            self.orig_loc,
2373            self.buf.as_ptr() as usize,
2374        ))
2375    }
2376    pub fn get_flash_update_status_msg(&self) -> Result<&'a CStr, ErrorContext> {
2377        let mut iter = self.clone();
2378        iter.pos = 0;
2379        for attr in iter {
2380            if let Devlink::FlashUpdateStatusMsg(val) = attr? {
2381                return Ok(val);
2382            }
2383        }
2384        Err(ErrorContext::new_missing(
2385            "Devlink",
2386            "FlashUpdateStatusMsg",
2387            self.orig_loc,
2388            self.buf.as_ptr() as usize,
2389        ))
2390    }
2391    pub fn get_flash_update_status_done(&self) -> Result<u64, ErrorContext> {
2392        let mut iter = self.clone();
2393        iter.pos = 0;
2394        for attr in iter {
2395            if let Devlink::FlashUpdateStatusDone(val) = attr? {
2396                return Ok(val);
2397            }
2398        }
2399        Err(ErrorContext::new_missing(
2400            "Devlink",
2401            "FlashUpdateStatusDone",
2402            self.orig_loc,
2403            self.buf.as_ptr() as usize,
2404        ))
2405    }
2406    pub fn get_flash_update_status_total(&self) -> Result<u64, ErrorContext> {
2407        let mut iter = self.clone();
2408        iter.pos = 0;
2409        for attr in iter {
2410            if let Devlink::FlashUpdateStatusTotal(val) = attr? {
2411                return Ok(val);
2412            }
2413        }
2414        Err(ErrorContext::new_missing(
2415            "Devlink",
2416            "FlashUpdateStatusTotal",
2417            self.orig_loc,
2418            self.buf.as_ptr() as usize,
2419        ))
2420    }
2421    pub fn get_port_pci_pf_number(&self) -> Result<u16, ErrorContext> {
2422        let mut iter = self.clone();
2423        iter.pos = 0;
2424        for attr in iter {
2425            if let Devlink::PortPciPfNumber(val) = attr? {
2426                return Ok(val);
2427            }
2428        }
2429        Err(ErrorContext::new_missing(
2430            "Devlink",
2431            "PortPciPfNumber",
2432            self.orig_loc,
2433            self.buf.as_ptr() as usize,
2434        ))
2435    }
2436    pub fn get_port_pci_vf_number(&self) -> Result<u16, ErrorContext> {
2437        let mut iter = self.clone();
2438        iter.pos = 0;
2439        for attr in iter {
2440            if let Devlink::PortPciVfNumber(val) = attr? {
2441                return Ok(val);
2442            }
2443        }
2444        Err(ErrorContext::new_missing(
2445            "Devlink",
2446            "PortPciVfNumber",
2447            self.orig_loc,
2448            self.buf.as_ptr() as usize,
2449        ))
2450    }
2451    pub fn get_stats(&self) -> Result<IterableDlAttrStats<'a>, ErrorContext> {
2452        let mut iter = self.clone();
2453        iter.pos = 0;
2454        for attr in iter {
2455            if let Devlink::Stats(val) = attr? {
2456                return Ok(val);
2457            }
2458        }
2459        Err(ErrorContext::new_missing(
2460            "Devlink",
2461            "Stats",
2462            self.orig_loc,
2463            self.buf.as_ptr() as usize,
2464        ))
2465    }
2466    pub fn get_trap_name(&self) -> Result<&'a CStr, ErrorContext> {
2467        let mut iter = self.clone();
2468        iter.pos = 0;
2469        for attr in iter {
2470            if let Devlink::TrapName(val) = attr? {
2471                return Ok(val);
2472            }
2473        }
2474        Err(ErrorContext::new_missing(
2475            "Devlink",
2476            "TrapName",
2477            self.orig_loc,
2478            self.buf.as_ptr() as usize,
2479        ))
2480    }
2481    #[doc = "Associated type: [`TrapAction`] (enum)"]
2482    pub fn get_trap_action(&self) -> Result<u8, ErrorContext> {
2483        let mut iter = self.clone();
2484        iter.pos = 0;
2485        for attr in iter {
2486            if let Devlink::TrapAction(val) = attr? {
2487                return Ok(val);
2488            }
2489        }
2490        Err(ErrorContext::new_missing(
2491            "Devlink",
2492            "TrapAction",
2493            self.orig_loc,
2494            self.buf.as_ptr() as usize,
2495        ))
2496    }
2497    #[doc = "Associated type: [`TrapType`] (enum)"]
2498    pub fn get_trap_type(&self) -> Result<u8, ErrorContext> {
2499        let mut iter = self.clone();
2500        iter.pos = 0;
2501        for attr in iter {
2502            if let Devlink::TrapType(val) = attr? {
2503                return Ok(val);
2504            }
2505        }
2506        Err(ErrorContext::new_missing(
2507            "Devlink",
2508            "TrapType",
2509            self.orig_loc,
2510            self.buf.as_ptr() as usize,
2511        ))
2512    }
2513    pub fn get_trap_generic(&self) -> Result<(), ErrorContext> {
2514        let mut iter = self.clone();
2515        iter.pos = 0;
2516        for attr in iter {
2517            if let Devlink::TrapGeneric(val) = attr? {
2518                return Ok(val);
2519            }
2520        }
2521        Err(ErrorContext::new_missing(
2522            "Devlink",
2523            "TrapGeneric",
2524            self.orig_loc,
2525            self.buf.as_ptr() as usize,
2526        ))
2527    }
2528    pub fn get_trap_metadata(&self) -> Result<IterableDlTrapMetadata<'a>, ErrorContext> {
2529        let mut iter = self.clone();
2530        iter.pos = 0;
2531        for attr in iter {
2532            if let Devlink::TrapMetadata(val) = attr? {
2533                return Ok(val);
2534            }
2535        }
2536        Err(ErrorContext::new_missing(
2537            "Devlink",
2538            "TrapMetadata",
2539            self.orig_loc,
2540            self.buf.as_ptr() as usize,
2541        ))
2542    }
2543    pub fn get_trap_group_name(&self) -> Result<&'a CStr, ErrorContext> {
2544        let mut iter = self.clone();
2545        iter.pos = 0;
2546        for attr in iter {
2547            if let Devlink::TrapGroupName(val) = attr? {
2548                return Ok(val);
2549            }
2550        }
2551        Err(ErrorContext::new_missing(
2552            "Devlink",
2553            "TrapGroupName",
2554            self.orig_loc,
2555            self.buf.as_ptr() as usize,
2556        ))
2557    }
2558    pub fn get_reload_failed(&self) -> Result<u8, ErrorContext> {
2559        let mut iter = self.clone();
2560        iter.pos = 0;
2561        for attr in iter {
2562            if let Devlink::ReloadFailed(val) = attr? {
2563                return Ok(val);
2564            }
2565        }
2566        Err(ErrorContext::new_missing(
2567            "Devlink",
2568            "ReloadFailed",
2569            self.orig_loc,
2570            self.buf.as_ptr() as usize,
2571        ))
2572    }
2573    pub fn get_health_reporter_dump_ts_ns(&self) -> Result<u64, ErrorContext> {
2574        let mut iter = self.clone();
2575        iter.pos = 0;
2576        for attr in iter {
2577            if let Devlink::HealthReporterDumpTsNs(val) = attr? {
2578                return Ok(val);
2579            }
2580        }
2581        Err(ErrorContext::new_missing(
2582            "Devlink",
2583            "HealthReporterDumpTsNs",
2584            self.orig_loc,
2585            self.buf.as_ptr() as usize,
2586        ))
2587    }
2588    pub fn get_netns_fd(&self) -> Result<u32, ErrorContext> {
2589        let mut iter = self.clone();
2590        iter.pos = 0;
2591        for attr in iter {
2592            if let Devlink::NetnsFd(val) = attr? {
2593                return Ok(val);
2594            }
2595        }
2596        Err(ErrorContext::new_missing(
2597            "Devlink",
2598            "NetnsFd",
2599            self.orig_loc,
2600            self.buf.as_ptr() as usize,
2601        ))
2602    }
2603    pub fn get_netns_pid(&self) -> Result<u32, ErrorContext> {
2604        let mut iter = self.clone();
2605        iter.pos = 0;
2606        for attr in iter {
2607            if let Devlink::NetnsPid(val) = attr? {
2608                return Ok(val);
2609            }
2610        }
2611        Err(ErrorContext::new_missing(
2612            "Devlink",
2613            "NetnsPid",
2614            self.orig_loc,
2615            self.buf.as_ptr() as usize,
2616        ))
2617    }
2618    pub fn get_netns_id(&self) -> Result<u32, ErrorContext> {
2619        let mut iter = self.clone();
2620        iter.pos = 0;
2621        for attr in iter {
2622            if let Devlink::NetnsId(val) = attr? {
2623                return Ok(val);
2624            }
2625        }
2626        Err(ErrorContext::new_missing(
2627            "Devlink",
2628            "NetnsId",
2629            self.orig_loc,
2630            self.buf.as_ptr() as usize,
2631        ))
2632    }
2633    pub fn get_health_reporter_auto_dump(&self) -> Result<u8, ErrorContext> {
2634        let mut iter = self.clone();
2635        iter.pos = 0;
2636        for attr in iter {
2637            if let Devlink::HealthReporterAutoDump(val) = attr? {
2638                return Ok(val);
2639            }
2640        }
2641        Err(ErrorContext::new_missing(
2642            "Devlink",
2643            "HealthReporterAutoDump",
2644            self.orig_loc,
2645            self.buf.as_ptr() as usize,
2646        ))
2647    }
2648    pub fn get_trap_policer_id(&self) -> Result<u32, ErrorContext> {
2649        let mut iter = self.clone();
2650        iter.pos = 0;
2651        for attr in iter {
2652            if let Devlink::TrapPolicerId(val) = attr? {
2653                return Ok(val);
2654            }
2655        }
2656        Err(ErrorContext::new_missing(
2657            "Devlink",
2658            "TrapPolicerId",
2659            self.orig_loc,
2660            self.buf.as_ptr() as usize,
2661        ))
2662    }
2663    pub fn get_trap_policer_rate(&self) -> Result<u64, ErrorContext> {
2664        let mut iter = self.clone();
2665        iter.pos = 0;
2666        for attr in iter {
2667            if let Devlink::TrapPolicerRate(val) = attr? {
2668                return Ok(val);
2669            }
2670        }
2671        Err(ErrorContext::new_missing(
2672            "Devlink",
2673            "TrapPolicerRate",
2674            self.orig_loc,
2675            self.buf.as_ptr() as usize,
2676        ))
2677    }
2678    pub fn get_trap_policer_burst(&self) -> Result<u64, ErrorContext> {
2679        let mut iter = self.clone();
2680        iter.pos = 0;
2681        for attr in iter {
2682            if let Devlink::TrapPolicerBurst(val) = attr? {
2683                return Ok(val);
2684            }
2685        }
2686        Err(ErrorContext::new_missing(
2687            "Devlink",
2688            "TrapPolicerBurst",
2689            self.orig_loc,
2690            self.buf.as_ptr() as usize,
2691        ))
2692    }
2693    pub fn get_port_function(&self) -> Result<IterableDlPortFunction<'a>, ErrorContext> {
2694        let mut iter = self.clone();
2695        iter.pos = 0;
2696        for attr in iter {
2697            if let Devlink::PortFunction(val) = attr? {
2698                return Ok(val);
2699            }
2700        }
2701        Err(ErrorContext::new_missing(
2702            "Devlink",
2703            "PortFunction",
2704            self.orig_loc,
2705            self.buf.as_ptr() as usize,
2706        ))
2707    }
2708    pub fn get_info_board_serial_number(&self) -> Result<&'a CStr, ErrorContext> {
2709        let mut iter = self.clone();
2710        iter.pos = 0;
2711        for attr in iter {
2712            if let Devlink::InfoBoardSerialNumber(val) = attr? {
2713                return Ok(val);
2714            }
2715        }
2716        Err(ErrorContext::new_missing(
2717            "Devlink",
2718            "InfoBoardSerialNumber",
2719            self.orig_loc,
2720            self.buf.as_ptr() as usize,
2721        ))
2722    }
2723    pub fn get_port_lanes(&self) -> Result<u32, ErrorContext> {
2724        let mut iter = self.clone();
2725        iter.pos = 0;
2726        for attr in iter {
2727            if let Devlink::PortLanes(val) = attr? {
2728                return Ok(val);
2729            }
2730        }
2731        Err(ErrorContext::new_missing(
2732            "Devlink",
2733            "PortLanes",
2734            self.orig_loc,
2735            self.buf.as_ptr() as usize,
2736        ))
2737    }
2738    pub fn get_port_splittable(&self) -> Result<u8, ErrorContext> {
2739        let mut iter = self.clone();
2740        iter.pos = 0;
2741        for attr in iter {
2742            if let Devlink::PortSplittable(val) = attr? {
2743                return Ok(val);
2744            }
2745        }
2746        Err(ErrorContext::new_missing(
2747            "Devlink",
2748            "PortSplittable",
2749            self.orig_loc,
2750            self.buf.as_ptr() as usize,
2751        ))
2752    }
2753    pub fn get_port_external(&self) -> Result<u8, ErrorContext> {
2754        let mut iter = self.clone();
2755        iter.pos = 0;
2756        for attr in iter {
2757            if let Devlink::PortExternal(val) = attr? {
2758                return Ok(val);
2759            }
2760        }
2761        Err(ErrorContext::new_missing(
2762            "Devlink",
2763            "PortExternal",
2764            self.orig_loc,
2765            self.buf.as_ptr() as usize,
2766        ))
2767    }
2768    pub fn get_port_controller_number(&self) -> Result<u32, ErrorContext> {
2769        let mut iter = self.clone();
2770        iter.pos = 0;
2771        for attr in iter {
2772            if let Devlink::PortControllerNumber(val) = attr? {
2773                return Ok(val);
2774            }
2775        }
2776        Err(ErrorContext::new_missing(
2777            "Devlink",
2778            "PortControllerNumber",
2779            self.orig_loc,
2780            self.buf.as_ptr() as usize,
2781        ))
2782    }
2783    pub fn get_flash_update_status_timeout(&self) -> Result<u64, ErrorContext> {
2784        let mut iter = self.clone();
2785        iter.pos = 0;
2786        for attr in iter {
2787            if let Devlink::FlashUpdateStatusTimeout(val) = attr? {
2788                return Ok(val);
2789            }
2790        }
2791        Err(ErrorContext::new_missing(
2792            "Devlink",
2793            "FlashUpdateStatusTimeout",
2794            self.orig_loc,
2795            self.buf.as_ptr() as usize,
2796        ))
2797    }
2798    #[doc = "Associated type: [`FlashOverwrite`] (1 bit per enumeration)"]
2799    pub fn get_flash_update_overwrite_mask(&self) -> Result<BuiltinBitfield32, ErrorContext> {
2800        let mut iter = self.clone();
2801        iter.pos = 0;
2802        for attr in iter {
2803            if let Devlink::FlashUpdateOverwriteMask(val) = attr? {
2804                return Ok(val);
2805            }
2806        }
2807        Err(ErrorContext::new_missing(
2808            "Devlink",
2809            "FlashUpdateOverwriteMask",
2810            self.orig_loc,
2811            self.buf.as_ptr() as usize,
2812        ))
2813    }
2814    #[doc = "Associated type: [`ReloadAction`] (enum)"]
2815    pub fn get_reload_action(&self) -> Result<u8, ErrorContext> {
2816        let mut iter = self.clone();
2817        iter.pos = 0;
2818        for attr in iter {
2819            if let Devlink::ReloadAction(val) = attr? {
2820                return Ok(val);
2821            }
2822        }
2823        Err(ErrorContext::new_missing(
2824            "Devlink",
2825            "ReloadAction",
2826            self.orig_loc,
2827            self.buf.as_ptr() as usize,
2828        ))
2829    }
2830    #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
2831    pub fn get_reload_actions_performed(&self) -> Result<BuiltinBitfield32, ErrorContext> {
2832        let mut iter = self.clone();
2833        iter.pos = 0;
2834        for attr in iter {
2835            if let Devlink::ReloadActionsPerformed(val) = attr? {
2836                return Ok(val);
2837            }
2838        }
2839        Err(ErrorContext::new_missing(
2840            "Devlink",
2841            "ReloadActionsPerformed",
2842            self.orig_loc,
2843            self.buf.as_ptr() as usize,
2844        ))
2845    }
2846    #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
2847    pub fn get_reload_limits(&self) -> Result<BuiltinBitfield32, ErrorContext> {
2848        let mut iter = self.clone();
2849        iter.pos = 0;
2850        for attr in iter {
2851            if let Devlink::ReloadLimits(val) = attr? {
2852                return Ok(val);
2853            }
2854        }
2855        Err(ErrorContext::new_missing(
2856            "Devlink",
2857            "ReloadLimits",
2858            self.orig_loc,
2859            self.buf.as_ptr() as usize,
2860        ))
2861    }
2862    pub fn get_dev_stats(&self) -> Result<IterableDlDevStats<'a>, ErrorContext> {
2863        let mut iter = self.clone();
2864        iter.pos = 0;
2865        for attr in iter {
2866            if let Devlink::DevStats(val) = attr? {
2867                return Ok(val);
2868            }
2869        }
2870        Err(ErrorContext::new_missing(
2871            "Devlink",
2872            "DevStats",
2873            self.orig_loc,
2874            self.buf.as_ptr() as usize,
2875        ))
2876    }
2877    pub fn get_reload_stats(&self) -> Result<IterableDlReloadStats<'a>, ErrorContext> {
2878        let mut iter = self.clone();
2879        iter.pos = 0;
2880        for attr in iter {
2881            if let Devlink::ReloadStats(val) = attr? {
2882                return Ok(val);
2883            }
2884        }
2885        Err(ErrorContext::new_missing(
2886            "Devlink",
2887            "ReloadStats",
2888            self.orig_loc,
2889            self.buf.as_ptr() as usize,
2890        ))
2891    }
2892    #[doc = "Attribute may repeat multiple times (treat it as array)"]
2893    pub fn get_reload_stats_entry(
2894        &self,
2895    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlReloadStatsEntry<'a>> {
2896        MultiAttrIterable::new(self.clone(), |variant| {
2897            if let Devlink::ReloadStatsEntry(val) = variant {
2898                Some(val)
2899            } else {
2900                None
2901            }
2902        })
2903    }
2904    pub fn get_reload_stats_limit(&self) -> Result<u8, ErrorContext> {
2905        let mut iter = self.clone();
2906        iter.pos = 0;
2907        for attr in iter {
2908            if let Devlink::ReloadStatsLimit(val) = attr? {
2909                return Ok(val);
2910            }
2911        }
2912        Err(ErrorContext::new_missing(
2913            "Devlink",
2914            "ReloadStatsLimit",
2915            self.orig_loc,
2916            self.buf.as_ptr() as usize,
2917        ))
2918    }
2919    pub fn get_reload_stats_value(&self) -> Result<u32, ErrorContext> {
2920        let mut iter = self.clone();
2921        iter.pos = 0;
2922        for attr in iter {
2923            if let Devlink::ReloadStatsValue(val) = attr? {
2924                return Ok(val);
2925            }
2926        }
2927        Err(ErrorContext::new_missing(
2928            "Devlink",
2929            "ReloadStatsValue",
2930            self.orig_loc,
2931            self.buf.as_ptr() as usize,
2932        ))
2933    }
2934    pub fn get_remote_reload_stats(&self) -> Result<IterableDlReloadStats<'a>, ErrorContext> {
2935        let mut iter = self.clone();
2936        iter.pos = 0;
2937        for attr in iter {
2938            if let Devlink::RemoteReloadStats(val) = attr? {
2939                return Ok(val);
2940            }
2941        }
2942        Err(ErrorContext::new_missing(
2943            "Devlink",
2944            "RemoteReloadStats",
2945            self.orig_loc,
2946            self.buf.as_ptr() as usize,
2947        ))
2948    }
2949    #[doc = "Attribute may repeat multiple times (treat it as array)"]
2950    pub fn get_reload_action_info(
2951        &self,
2952    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlReloadActInfo<'a>> {
2953        MultiAttrIterable::new(self.clone(), |variant| {
2954            if let Devlink::ReloadActionInfo(val) = variant {
2955                Some(val)
2956            } else {
2957                None
2958            }
2959        })
2960    }
2961    #[doc = "Attribute may repeat multiple times (treat it as array)"]
2962    pub fn get_reload_action_stats(
2963        &self,
2964    ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlReloadActStats<'a>> {
2965        MultiAttrIterable::new(self.clone(), |variant| {
2966            if let Devlink::ReloadActionStats(val) = variant {
2967                Some(val)
2968            } else {
2969                None
2970            }
2971        })
2972    }
2973    pub fn get_port_pci_sf_number(&self) -> Result<u32, ErrorContext> {
2974        let mut iter = self.clone();
2975        iter.pos = 0;
2976        for attr in iter {
2977            if let Devlink::PortPciSfNumber(val) = attr? {
2978                return Ok(val);
2979            }
2980        }
2981        Err(ErrorContext::new_missing(
2982            "Devlink",
2983            "PortPciSfNumber",
2984            self.orig_loc,
2985            self.buf.as_ptr() as usize,
2986        ))
2987    }
2988    #[doc = "Associated type: [`RateType`] (enum)"]
2989    pub fn get_rate_type(&self) -> Result<u16, ErrorContext> {
2990        let mut iter = self.clone();
2991        iter.pos = 0;
2992        for attr in iter {
2993            if let Devlink::RateType(val) = attr? {
2994                return Ok(val);
2995            }
2996        }
2997        Err(ErrorContext::new_missing(
2998            "Devlink",
2999            "RateType",
3000            self.orig_loc,
3001            self.buf.as_ptr() as usize,
3002        ))
3003    }
3004    pub fn get_rate_tx_share(&self) -> Result<u64, ErrorContext> {
3005        let mut iter = self.clone();
3006        iter.pos = 0;
3007        for attr in iter {
3008            if let Devlink::RateTxShare(val) = attr? {
3009                return Ok(val);
3010            }
3011        }
3012        Err(ErrorContext::new_missing(
3013            "Devlink",
3014            "RateTxShare",
3015            self.orig_loc,
3016            self.buf.as_ptr() as usize,
3017        ))
3018    }
3019    pub fn get_rate_tx_max(&self) -> Result<u64, ErrorContext> {
3020        let mut iter = self.clone();
3021        iter.pos = 0;
3022        for attr in iter {
3023            if let Devlink::RateTxMax(val) = attr? {
3024                return Ok(val);
3025            }
3026        }
3027        Err(ErrorContext::new_missing(
3028            "Devlink",
3029            "RateTxMax",
3030            self.orig_loc,
3031            self.buf.as_ptr() as usize,
3032        ))
3033    }
3034    pub fn get_rate_node_name(&self) -> Result<&'a CStr, ErrorContext> {
3035        let mut iter = self.clone();
3036        iter.pos = 0;
3037        for attr in iter {
3038            if let Devlink::RateNodeName(val) = attr? {
3039                return Ok(val);
3040            }
3041        }
3042        Err(ErrorContext::new_missing(
3043            "Devlink",
3044            "RateNodeName",
3045            self.orig_loc,
3046            self.buf.as_ptr() as usize,
3047        ))
3048    }
3049    pub fn get_rate_parent_node_name(&self) -> Result<&'a CStr, ErrorContext> {
3050        let mut iter = self.clone();
3051        iter.pos = 0;
3052        for attr in iter {
3053            if let Devlink::RateParentNodeName(val) = attr? {
3054                return Ok(val);
3055            }
3056        }
3057        Err(ErrorContext::new_missing(
3058            "Devlink",
3059            "RateParentNodeName",
3060            self.orig_loc,
3061            self.buf.as_ptr() as usize,
3062        ))
3063    }
3064    pub fn get_region_max_snapshots(&self) -> Result<u32, ErrorContext> {
3065        let mut iter = self.clone();
3066        iter.pos = 0;
3067        for attr in iter {
3068            if let Devlink::RegionMaxSnapshots(val) = attr? {
3069                return Ok(val);
3070            }
3071        }
3072        Err(ErrorContext::new_missing(
3073            "Devlink",
3074            "RegionMaxSnapshots",
3075            self.orig_loc,
3076            self.buf.as_ptr() as usize,
3077        ))
3078    }
3079    pub fn get_linecard_index(&self) -> Result<u32, ErrorContext> {
3080        let mut iter = self.clone();
3081        iter.pos = 0;
3082        for attr in iter {
3083            if let Devlink::LinecardIndex(val) = attr? {
3084                return Ok(val);
3085            }
3086        }
3087        Err(ErrorContext::new_missing(
3088            "Devlink",
3089            "LinecardIndex",
3090            self.orig_loc,
3091            self.buf.as_ptr() as usize,
3092        ))
3093    }
3094    pub fn get_linecard_state(&self) -> Result<u8, ErrorContext> {
3095        let mut iter = self.clone();
3096        iter.pos = 0;
3097        for attr in iter {
3098            if let Devlink::LinecardState(val) = attr? {
3099                return Ok(val);
3100            }
3101        }
3102        Err(ErrorContext::new_missing(
3103            "Devlink",
3104            "LinecardState",
3105            self.orig_loc,
3106            self.buf.as_ptr() as usize,
3107        ))
3108    }
3109    pub fn get_linecard_type(&self) -> Result<&'a CStr, ErrorContext> {
3110        let mut iter = self.clone();
3111        iter.pos = 0;
3112        for attr in iter {
3113            if let Devlink::LinecardType(val) = attr? {
3114                return Ok(val);
3115            }
3116        }
3117        Err(ErrorContext::new_missing(
3118            "Devlink",
3119            "LinecardType",
3120            self.orig_loc,
3121            self.buf.as_ptr() as usize,
3122        ))
3123    }
3124    pub fn get_linecard_supported_types(
3125        &self,
3126    ) -> Result<IterableDlLinecardSupportedTypes<'a>, ErrorContext> {
3127        let mut iter = self.clone();
3128        iter.pos = 0;
3129        for attr in iter {
3130            if let Devlink::LinecardSupportedTypes(val) = attr? {
3131                return Ok(val);
3132            }
3133        }
3134        Err(ErrorContext::new_missing(
3135            "Devlink",
3136            "LinecardSupportedTypes",
3137            self.orig_loc,
3138            self.buf.as_ptr() as usize,
3139        ))
3140    }
3141    pub fn get_selftests(&self) -> Result<IterableDlSelftestId<'a>, ErrorContext> {
3142        let mut iter = self.clone();
3143        iter.pos = 0;
3144        for attr in iter {
3145            if let Devlink::Selftests(val) = attr? {
3146                return Ok(val);
3147            }
3148        }
3149        Err(ErrorContext::new_missing(
3150            "Devlink",
3151            "Selftests",
3152            self.orig_loc,
3153            self.buf.as_ptr() as usize,
3154        ))
3155    }
3156    pub fn get_rate_tx_priority(&self) -> Result<u32, ErrorContext> {
3157        let mut iter = self.clone();
3158        iter.pos = 0;
3159        for attr in iter {
3160            if let Devlink::RateTxPriority(val) = attr? {
3161                return Ok(val);
3162            }
3163        }
3164        Err(ErrorContext::new_missing(
3165            "Devlink",
3166            "RateTxPriority",
3167            self.orig_loc,
3168            self.buf.as_ptr() as usize,
3169        ))
3170    }
3171    pub fn get_rate_tx_weight(&self) -> Result<u32, ErrorContext> {
3172        let mut iter = self.clone();
3173        iter.pos = 0;
3174        for attr in iter {
3175            if let Devlink::RateTxWeight(val) = attr? {
3176                return Ok(val);
3177            }
3178        }
3179        Err(ErrorContext::new_missing(
3180            "Devlink",
3181            "RateTxWeight",
3182            self.orig_loc,
3183            self.buf.as_ptr() as usize,
3184        ))
3185    }
3186    pub fn get_region_direct(&self) -> Result<(), ErrorContext> {
3187        let mut iter = self.clone();
3188        iter.pos = 0;
3189        for attr in iter {
3190            if let Devlink::RegionDirect(val) = attr? {
3191                return Ok(val);
3192            }
3193        }
3194        Err(ErrorContext::new_missing(
3195            "Devlink",
3196            "RegionDirect",
3197            self.orig_loc,
3198            self.buf.as_ptr() as usize,
3199        ))
3200    }
3201    #[doc = "Attribute may repeat multiple times (treat it as array)"]
3202    pub fn get_rate_tc_bws(&self) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlRateTcBws<'a>> {
3203        MultiAttrIterable::new(self.clone(), |variant| {
3204            if let Devlink::RateTcBws(val) = variant {
3205                Some(val)
3206            } else {
3207                None
3208            }
3209        })
3210    }
3211    #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
3212    pub fn get_health_reporter_burst_period(&self) -> Result<u64, ErrorContext> {
3213        let mut iter = self.clone();
3214        iter.pos = 0;
3215        for attr in iter {
3216            if let Devlink::HealthReporterBurstPeriod(val) = attr? {
3217                return Ok(val);
3218            }
3219        }
3220        Err(ErrorContext::new_missing(
3221            "Devlink",
3222            "HealthReporterBurstPeriod",
3223            self.orig_loc,
3224            self.buf.as_ptr() as usize,
3225        ))
3226    }
3227    #[doc = "Request restoring parameter to its default value\\."]
3228    pub fn get_param_reset_default(&self) -> Result<(), ErrorContext> {
3229        let mut iter = self.clone();
3230        iter.pos = 0;
3231        for attr in iter {
3232            if let Devlink::ParamResetDefault(val) = attr? {
3233                return Ok(val);
3234            }
3235        }
3236        Err(ErrorContext::new_missing(
3237            "Devlink",
3238            "ParamResetDefault",
3239            self.orig_loc,
3240            self.buf.as_ptr() as usize,
3241        ))
3242    }
3243}
3244impl Devlink<'_> {
3245    pub fn new<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
3246        IterableDevlink::with_loc(buf, buf.as_ptr() as usize)
3247    }
3248    fn attr_from_type(r#type: u16) -> Option<&'static str> {
3249        let res = match r#type {
3250            1u16 => "BusName",
3251            2u16 => "DevName",
3252            3u16 => "PortIndex",
3253            4u16 => "PortType",
3254            5u16 => "PortDesiredType",
3255            6u16 => "PortNetdevIfindex",
3256            7u16 => "PortNetdevName",
3257            8u16 => "PortIbdevName",
3258            9u16 => "PortSplitCount",
3259            10u16 => "PortSplitGroup",
3260            11u16 => "SbIndex",
3261            12u16 => "SbSize",
3262            13u16 => "SbIngressPoolCount",
3263            14u16 => "SbEgressPoolCount",
3264            15u16 => "SbIngressTcCount",
3265            16u16 => "SbEgressTcCount",
3266            17u16 => "SbPoolIndex",
3267            18u16 => "SbPoolType",
3268            19u16 => "SbPoolSize",
3269            20u16 => "SbPoolThresholdType",
3270            21u16 => "SbThreshold",
3271            22u16 => "SbTcIndex",
3272            23u16 => "SbOccCur",
3273            24u16 => "SbOccMax",
3274            25u16 => "EswitchMode",
3275            26u16 => "EswitchInlineMode",
3276            27u16 => "DpipeTables",
3277            28u16 => "DpipeTable",
3278            29u16 => "DpipeTableName",
3279            30u16 => "DpipeTableSize",
3280            31u16 => "DpipeTableMatches",
3281            32u16 => "DpipeTableActions",
3282            33u16 => "DpipeTableCountersEnabled",
3283            34u16 => "DpipeEntries",
3284            35u16 => "DpipeEntry",
3285            36u16 => "DpipeEntryIndex",
3286            37u16 => "DpipeEntryMatchValues",
3287            38u16 => "DpipeEntryActionValues",
3288            39u16 => "DpipeEntryCounter",
3289            40u16 => "DpipeMatch",
3290            41u16 => "DpipeMatchValue",
3291            42u16 => "DpipeMatchType",
3292            43u16 => "DpipeAction",
3293            44u16 => "DpipeActionValue",
3294            45u16 => "DpipeActionType",
3295            46u16 => "DpipeValue",
3296            47u16 => "DpipeValueMask",
3297            48u16 => "DpipeValueMapping",
3298            49u16 => "DpipeHeaders",
3299            50u16 => "DpipeHeader",
3300            51u16 => "DpipeHeaderName",
3301            52u16 => "DpipeHeaderId",
3302            53u16 => "DpipeHeaderFields",
3303            54u16 => "DpipeHeaderGlobal",
3304            55u16 => "DpipeHeaderIndex",
3305            56u16 => "DpipeField",
3306            57u16 => "DpipeFieldName",
3307            58u16 => "DpipeFieldId",
3308            59u16 => "DpipeFieldBitwidth",
3309            60u16 => "DpipeFieldMappingType",
3310            61u16 => "Pad",
3311            62u16 => "EswitchEncapMode",
3312            63u16 => "ResourceList",
3313            64u16 => "Resource",
3314            65u16 => "ResourceName",
3315            66u16 => "ResourceId",
3316            67u16 => "ResourceSize",
3317            68u16 => "ResourceSizeNew",
3318            69u16 => "ResourceSizeValid",
3319            70u16 => "ResourceSizeMin",
3320            71u16 => "ResourceSizeMax",
3321            72u16 => "ResourceSizeGran",
3322            73u16 => "ResourceUnit",
3323            74u16 => "ResourceOcc",
3324            75u16 => "DpipeTableResourceId",
3325            76u16 => "DpipeTableResourceUnits",
3326            77u16 => "PortFlavour",
3327            78u16 => "PortNumber",
3328            79u16 => "PortSplitSubportNumber",
3329            80u16 => "Param",
3330            81u16 => "ParamName",
3331            82u16 => "ParamGeneric",
3332            83u16 => "ParamType",
3333            87u16 => "ParamValueCmode",
3334            88u16 => "RegionName",
3335            89u16 => "RegionSize",
3336            90u16 => "RegionSnapshots",
3337            91u16 => "RegionSnapshot",
3338            92u16 => "RegionSnapshotId",
3339            93u16 => "RegionChunks",
3340            94u16 => "RegionChunk",
3341            95u16 => "RegionChunkData",
3342            96u16 => "RegionChunkAddr",
3343            97u16 => "RegionChunkLen",
3344            98u16 => "InfoDriverName",
3345            99u16 => "InfoSerialNumber",
3346            100u16 => "InfoVersionFixed",
3347            101u16 => "InfoVersionRunning",
3348            102u16 => "InfoVersionStored",
3349            103u16 => "InfoVersionName",
3350            104u16 => "InfoVersionValue",
3351            105u16 => "SbPoolCellSize",
3352            106u16 => "Fmsg",
3353            107u16 => "FmsgObjNestStart",
3354            108u16 => "FmsgPairNestStart",
3355            109u16 => "FmsgArrNestStart",
3356            110u16 => "FmsgNestEnd",
3357            111u16 => "FmsgObjName",
3358            112u16 => "FmsgObjValueType",
3359            114u16 => "HealthReporter",
3360            115u16 => "HealthReporterName",
3361            116u16 => "HealthReporterState",
3362            117u16 => "HealthReporterErrCount",
3363            118u16 => "HealthReporterRecoverCount",
3364            119u16 => "HealthReporterDumpTs",
3365            120u16 => "HealthReporterGracefulPeriod",
3366            121u16 => "HealthReporterAutoRecover",
3367            122u16 => "FlashUpdateFileName",
3368            123u16 => "FlashUpdateComponent",
3369            124u16 => "FlashUpdateStatusMsg",
3370            125u16 => "FlashUpdateStatusDone",
3371            126u16 => "FlashUpdateStatusTotal",
3372            127u16 => "PortPciPfNumber",
3373            128u16 => "PortPciVfNumber",
3374            129u16 => "Stats",
3375            130u16 => "TrapName",
3376            131u16 => "TrapAction",
3377            132u16 => "TrapType",
3378            133u16 => "TrapGeneric",
3379            134u16 => "TrapMetadata",
3380            135u16 => "TrapGroupName",
3381            136u16 => "ReloadFailed",
3382            137u16 => "HealthReporterDumpTsNs",
3383            138u16 => "NetnsFd",
3384            139u16 => "NetnsPid",
3385            140u16 => "NetnsId",
3386            141u16 => "HealthReporterAutoDump",
3387            142u16 => "TrapPolicerId",
3388            143u16 => "TrapPolicerRate",
3389            144u16 => "TrapPolicerBurst",
3390            145u16 => "PortFunction",
3391            146u16 => "InfoBoardSerialNumber",
3392            147u16 => "PortLanes",
3393            148u16 => "PortSplittable",
3394            149u16 => "PortExternal",
3395            150u16 => "PortControllerNumber",
3396            151u16 => "FlashUpdateStatusTimeout",
3397            152u16 => "FlashUpdateOverwriteMask",
3398            153u16 => "ReloadAction",
3399            154u16 => "ReloadActionsPerformed",
3400            155u16 => "ReloadLimits",
3401            156u16 => "DevStats",
3402            157u16 => "ReloadStats",
3403            158u16 => "ReloadStatsEntry",
3404            159u16 => "ReloadStatsLimit",
3405            160u16 => "ReloadStatsValue",
3406            161u16 => "RemoteReloadStats",
3407            162u16 => "ReloadActionInfo",
3408            163u16 => "ReloadActionStats",
3409            164u16 => "PortPciSfNumber",
3410            165u16 => "RateType",
3411            166u16 => "RateTxShare",
3412            167u16 => "RateTxMax",
3413            168u16 => "RateNodeName",
3414            169u16 => "RateParentNodeName",
3415            170u16 => "RegionMaxSnapshots",
3416            171u16 => "LinecardIndex",
3417            172u16 => "LinecardState",
3418            173u16 => "LinecardType",
3419            174u16 => "LinecardSupportedTypes",
3420            176u16 => "Selftests",
3421            177u16 => "RateTxPriority",
3422            178u16 => "RateTxWeight",
3423            179u16 => "RegionDirect",
3424            180u16 => "RateTcBws",
3425            181u16 => "HealthReporterBurstPeriod",
3426            183u16 => "ParamResetDefault",
3427            _ => return None,
3428        };
3429        Some(res)
3430    }
3431}
3432#[derive(Clone, Copy, Default)]
3433pub struct IterableDevlink<'a> {
3434    buf: &'a [u8],
3435    pos: usize,
3436    orig_loc: usize,
3437}
3438impl<'a> IterableDevlink<'a> {
3439    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
3440        Self {
3441            buf,
3442            pos: 0,
3443            orig_loc,
3444        }
3445    }
3446    pub fn get_buf(&self) -> &'a [u8] {
3447        self.buf
3448    }
3449}
3450impl<'a> Iterator for IterableDevlink<'a> {
3451    type Item = Result<Devlink<'a>, ErrorContext>;
3452    fn next(&mut self) -> Option<Self::Item> {
3453        let pos = self.pos;
3454        let mut r#type;
3455        loop {
3456            r#type = None;
3457            if self.buf.len() == self.pos {
3458                return None;
3459            }
3460            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
3461                break;
3462            };
3463            r#type = Some(header.r#type);
3464            let res = match header.r#type {
3465                1u16 => Devlink::BusName({
3466                    let res = CStr::from_bytes_with_nul(next).ok();
3467                    let Some(val) = res else { break };
3468                    val
3469                }),
3470                2u16 => Devlink::DevName({
3471                    let res = CStr::from_bytes_with_nul(next).ok();
3472                    let Some(val) = res else { break };
3473                    val
3474                }),
3475                3u16 => Devlink::PortIndex({
3476                    let res = parse_u32(next);
3477                    let Some(val) = res else { break };
3478                    val
3479                }),
3480                4u16 => Devlink::PortType({
3481                    let res = parse_u16(next);
3482                    let Some(val) = res else { break };
3483                    val
3484                }),
3485                5u16 => Devlink::PortDesiredType({
3486                    let res = parse_u16(next);
3487                    let Some(val) = res else { break };
3488                    val
3489                }),
3490                6u16 => Devlink::PortNetdevIfindex({
3491                    let res = parse_u32(next);
3492                    let Some(val) = res else { break };
3493                    val
3494                }),
3495                7u16 => Devlink::PortNetdevName({
3496                    let res = CStr::from_bytes_with_nul(next).ok();
3497                    let Some(val) = res else { break };
3498                    val
3499                }),
3500                8u16 => Devlink::PortIbdevName({
3501                    let res = CStr::from_bytes_with_nul(next).ok();
3502                    let Some(val) = res else { break };
3503                    val
3504                }),
3505                9u16 => Devlink::PortSplitCount({
3506                    let res = parse_u32(next);
3507                    let Some(val) = res else { break };
3508                    val
3509                }),
3510                10u16 => Devlink::PortSplitGroup({
3511                    let res = parse_u32(next);
3512                    let Some(val) = res else { break };
3513                    val
3514                }),
3515                11u16 => Devlink::SbIndex({
3516                    let res = parse_u32(next);
3517                    let Some(val) = res else { break };
3518                    val
3519                }),
3520                12u16 => Devlink::SbSize({
3521                    let res = parse_u32(next);
3522                    let Some(val) = res else { break };
3523                    val
3524                }),
3525                13u16 => Devlink::SbIngressPoolCount({
3526                    let res = parse_u16(next);
3527                    let Some(val) = res else { break };
3528                    val
3529                }),
3530                14u16 => Devlink::SbEgressPoolCount({
3531                    let res = parse_u16(next);
3532                    let Some(val) = res else { break };
3533                    val
3534                }),
3535                15u16 => Devlink::SbIngressTcCount({
3536                    let res = parse_u16(next);
3537                    let Some(val) = res else { break };
3538                    val
3539                }),
3540                16u16 => Devlink::SbEgressTcCount({
3541                    let res = parse_u16(next);
3542                    let Some(val) = res else { break };
3543                    val
3544                }),
3545                17u16 => Devlink::SbPoolIndex({
3546                    let res = parse_u16(next);
3547                    let Some(val) = res else { break };
3548                    val
3549                }),
3550                18u16 => Devlink::SbPoolType({
3551                    let res = parse_u8(next);
3552                    let Some(val) = res else { break };
3553                    val
3554                }),
3555                19u16 => Devlink::SbPoolSize({
3556                    let res = parse_u32(next);
3557                    let Some(val) = res else { break };
3558                    val
3559                }),
3560                20u16 => Devlink::SbPoolThresholdType({
3561                    let res = parse_u8(next);
3562                    let Some(val) = res else { break };
3563                    val
3564                }),
3565                21u16 => Devlink::SbThreshold({
3566                    let res = parse_u32(next);
3567                    let Some(val) = res else { break };
3568                    val
3569                }),
3570                22u16 => Devlink::SbTcIndex({
3571                    let res = parse_u16(next);
3572                    let Some(val) = res else { break };
3573                    val
3574                }),
3575                23u16 => Devlink::SbOccCur({
3576                    let res = parse_u32(next);
3577                    let Some(val) = res else { break };
3578                    val
3579                }),
3580                24u16 => Devlink::SbOccMax({
3581                    let res = parse_u32(next);
3582                    let Some(val) = res else { break };
3583                    val
3584                }),
3585                25u16 => Devlink::EswitchMode({
3586                    let res = parse_u16(next);
3587                    let Some(val) = res else { break };
3588                    val
3589                }),
3590                26u16 => Devlink::EswitchInlineMode({
3591                    let res = parse_u8(next);
3592                    let Some(val) = res else { break };
3593                    val
3594                }),
3595                27u16 => Devlink::DpipeTables({
3596                    let res = Some(IterableDlDpipeTables::with_loc(next, self.orig_loc));
3597                    let Some(val) = res else { break };
3598                    val
3599                }),
3600                28u16 => Devlink::DpipeTable({
3601                    let res = Some(IterableDlDpipeTable::with_loc(next, self.orig_loc));
3602                    let Some(val) = res else { break };
3603                    val
3604                }),
3605                29u16 => Devlink::DpipeTableName({
3606                    let res = CStr::from_bytes_with_nul(next).ok();
3607                    let Some(val) = res else { break };
3608                    val
3609                }),
3610                30u16 => Devlink::DpipeTableSize({
3611                    let res = parse_u64(next);
3612                    let Some(val) = res else { break };
3613                    val
3614                }),
3615                31u16 => Devlink::DpipeTableMatches({
3616                    let res = Some(IterableDlDpipeTableMatches::with_loc(next, self.orig_loc));
3617                    let Some(val) = res else { break };
3618                    val
3619                }),
3620                32u16 => Devlink::DpipeTableActions({
3621                    let res = Some(IterableDlDpipeTableActions::with_loc(next, self.orig_loc));
3622                    let Some(val) = res else { break };
3623                    val
3624                }),
3625                33u16 => Devlink::DpipeTableCountersEnabled({
3626                    let res = parse_u8(next);
3627                    let Some(val) = res else { break };
3628                    val
3629                }),
3630                34u16 => Devlink::DpipeEntries({
3631                    let res = Some(IterableDlDpipeEntries::with_loc(next, self.orig_loc));
3632                    let Some(val) = res else { break };
3633                    val
3634                }),
3635                35u16 => Devlink::DpipeEntry({
3636                    let res = Some(IterableDlDpipeEntry::with_loc(next, self.orig_loc));
3637                    let Some(val) = res else { break };
3638                    val
3639                }),
3640                36u16 => Devlink::DpipeEntryIndex({
3641                    let res = parse_u64(next);
3642                    let Some(val) = res else { break };
3643                    val
3644                }),
3645                37u16 => Devlink::DpipeEntryMatchValues({
3646                    let res = Some(IterableDlDpipeEntryMatchValues::with_loc(
3647                        next,
3648                        self.orig_loc,
3649                    ));
3650                    let Some(val) = res else { break };
3651                    val
3652                }),
3653                38u16 => Devlink::DpipeEntryActionValues({
3654                    let res = Some(IterableDlDpipeEntryActionValues::with_loc(
3655                        next,
3656                        self.orig_loc,
3657                    ));
3658                    let Some(val) = res else { break };
3659                    val
3660                }),
3661                39u16 => Devlink::DpipeEntryCounter({
3662                    let res = parse_u64(next);
3663                    let Some(val) = res else { break };
3664                    val
3665                }),
3666                40u16 => Devlink::DpipeMatch({
3667                    let res = Some(IterableDlDpipeMatch::with_loc(next, self.orig_loc));
3668                    let Some(val) = res else { break };
3669                    val
3670                }),
3671                41u16 => Devlink::DpipeMatchValue({
3672                    let res = Some(IterableDlDpipeMatchValue::with_loc(next, self.orig_loc));
3673                    let Some(val) = res else { break };
3674                    val
3675                }),
3676                42u16 => Devlink::DpipeMatchType({
3677                    let res = parse_u32(next);
3678                    let Some(val) = res else { break };
3679                    val
3680                }),
3681                43u16 => Devlink::DpipeAction({
3682                    let res = Some(IterableDlDpipeAction::with_loc(next, self.orig_loc));
3683                    let Some(val) = res else { break };
3684                    val
3685                }),
3686                44u16 => Devlink::DpipeActionValue({
3687                    let res = Some(IterableDlDpipeActionValue::with_loc(next, self.orig_loc));
3688                    let Some(val) = res else { break };
3689                    val
3690                }),
3691                45u16 => Devlink::DpipeActionType({
3692                    let res = parse_u32(next);
3693                    let Some(val) = res else { break };
3694                    val
3695                }),
3696                46u16 => Devlink::DpipeValue({
3697                    let res = Some(next);
3698                    let Some(val) = res else { break };
3699                    val
3700                }),
3701                47u16 => Devlink::DpipeValueMask({
3702                    let res = Some(next);
3703                    let Some(val) = res else { break };
3704                    val
3705                }),
3706                48u16 => Devlink::DpipeValueMapping({
3707                    let res = parse_u32(next);
3708                    let Some(val) = res else { break };
3709                    val
3710                }),
3711                49u16 => Devlink::DpipeHeaders({
3712                    let res = Some(IterableDlDpipeHeaders::with_loc(next, self.orig_loc));
3713                    let Some(val) = res else { break };
3714                    val
3715                }),
3716                50u16 => Devlink::DpipeHeader({
3717                    let res = Some(IterableDlDpipeHeader::with_loc(next, self.orig_loc));
3718                    let Some(val) = res else { break };
3719                    val
3720                }),
3721                51u16 => Devlink::DpipeHeaderName({
3722                    let res = CStr::from_bytes_with_nul(next).ok();
3723                    let Some(val) = res else { break };
3724                    val
3725                }),
3726                52u16 => Devlink::DpipeHeaderId({
3727                    let res = parse_u32(next);
3728                    let Some(val) = res else { break };
3729                    val
3730                }),
3731                53u16 => Devlink::DpipeHeaderFields({
3732                    let res = Some(IterableDlDpipeHeaderFields::with_loc(next, self.orig_loc));
3733                    let Some(val) = res else { break };
3734                    val
3735                }),
3736                54u16 => Devlink::DpipeHeaderGlobal({
3737                    let res = parse_u8(next);
3738                    let Some(val) = res else { break };
3739                    val
3740                }),
3741                55u16 => Devlink::DpipeHeaderIndex({
3742                    let res = parse_u32(next);
3743                    let Some(val) = res else { break };
3744                    val
3745                }),
3746                56u16 => Devlink::DpipeField({
3747                    let res = Some(IterableDlDpipeField::with_loc(next, self.orig_loc));
3748                    let Some(val) = res else { break };
3749                    val
3750                }),
3751                57u16 => Devlink::DpipeFieldName({
3752                    let res = CStr::from_bytes_with_nul(next).ok();
3753                    let Some(val) = res else { break };
3754                    val
3755                }),
3756                58u16 => Devlink::DpipeFieldId({
3757                    let res = parse_u32(next);
3758                    let Some(val) = res else { break };
3759                    val
3760                }),
3761                59u16 => Devlink::DpipeFieldBitwidth({
3762                    let res = parse_u32(next);
3763                    let Some(val) = res else { break };
3764                    val
3765                }),
3766                60u16 => Devlink::DpipeFieldMappingType({
3767                    let res = parse_u32(next);
3768                    let Some(val) = res else { break };
3769                    val
3770                }),
3771                61u16 => Devlink::Pad({
3772                    let res = Some(next);
3773                    let Some(val) = res else { break };
3774                    val
3775                }),
3776                62u16 => Devlink::EswitchEncapMode({
3777                    let res = parse_u8(next);
3778                    let Some(val) = res else { break };
3779                    val
3780                }),
3781                63u16 => Devlink::ResourceList({
3782                    let res = Some(IterableDlResourceList::with_loc(next, self.orig_loc));
3783                    let Some(val) = res else { break };
3784                    val
3785                }),
3786                64u16 => Devlink::Resource({
3787                    let res = Some(IterableDlResource::with_loc(next, self.orig_loc));
3788                    let Some(val) = res else { break };
3789                    val
3790                }),
3791                65u16 => Devlink::ResourceName({
3792                    let res = CStr::from_bytes_with_nul(next).ok();
3793                    let Some(val) = res else { break };
3794                    val
3795                }),
3796                66u16 => Devlink::ResourceId({
3797                    let res = parse_u64(next);
3798                    let Some(val) = res else { break };
3799                    val
3800                }),
3801                67u16 => Devlink::ResourceSize({
3802                    let res = parse_u64(next);
3803                    let Some(val) = res else { break };
3804                    val
3805                }),
3806                68u16 => Devlink::ResourceSizeNew({
3807                    let res = parse_u64(next);
3808                    let Some(val) = res else { break };
3809                    val
3810                }),
3811                69u16 => Devlink::ResourceSizeValid({
3812                    let res = parse_u8(next);
3813                    let Some(val) = res else { break };
3814                    val
3815                }),
3816                70u16 => Devlink::ResourceSizeMin({
3817                    let res = parse_u64(next);
3818                    let Some(val) = res else { break };
3819                    val
3820                }),
3821                71u16 => Devlink::ResourceSizeMax({
3822                    let res = parse_u64(next);
3823                    let Some(val) = res else { break };
3824                    val
3825                }),
3826                72u16 => Devlink::ResourceSizeGran({
3827                    let res = parse_u64(next);
3828                    let Some(val) = res else { break };
3829                    val
3830                }),
3831                73u16 => Devlink::ResourceUnit({
3832                    let res = parse_u8(next);
3833                    let Some(val) = res else { break };
3834                    val
3835                }),
3836                74u16 => Devlink::ResourceOcc({
3837                    let res = parse_u64(next);
3838                    let Some(val) = res else { break };
3839                    val
3840                }),
3841                75u16 => Devlink::DpipeTableResourceId({
3842                    let res = parse_u64(next);
3843                    let Some(val) = res else { break };
3844                    val
3845                }),
3846                76u16 => Devlink::DpipeTableResourceUnits({
3847                    let res = parse_u64(next);
3848                    let Some(val) = res else { break };
3849                    val
3850                }),
3851                77u16 => Devlink::PortFlavour({
3852                    let res = parse_u16(next);
3853                    let Some(val) = res else { break };
3854                    val
3855                }),
3856                78u16 => Devlink::PortNumber({
3857                    let res = parse_u32(next);
3858                    let Some(val) = res else { break };
3859                    val
3860                }),
3861                79u16 => Devlink::PortSplitSubportNumber({
3862                    let res = parse_u32(next);
3863                    let Some(val) = res else { break };
3864                    val
3865                }),
3866                80u16 => Devlink::Param({
3867                    let res = Some(IterableDlParam::with_loc(next, self.orig_loc));
3868                    let Some(val) = res else { break };
3869                    val
3870                }),
3871                81u16 => Devlink::ParamName({
3872                    let res = CStr::from_bytes_with_nul(next).ok();
3873                    let Some(val) = res else { break };
3874                    val
3875                }),
3876                82u16 => Devlink::ParamGeneric(()),
3877                83u16 => Devlink::ParamType({
3878                    let res = parse_u8(next);
3879                    let Some(val) = res else { break };
3880                    val
3881                }),
3882                87u16 => Devlink::ParamValueCmode({
3883                    let res = parse_u8(next);
3884                    let Some(val) = res else { break };
3885                    val
3886                }),
3887                88u16 => Devlink::RegionName({
3888                    let res = CStr::from_bytes_with_nul(next).ok();
3889                    let Some(val) = res else { break };
3890                    val
3891                }),
3892                89u16 => Devlink::RegionSize({
3893                    let res = parse_u64(next);
3894                    let Some(val) = res else { break };
3895                    val
3896                }),
3897                90u16 => Devlink::RegionSnapshots({
3898                    let res = Some(IterableDlRegionSnapshots::with_loc(next, self.orig_loc));
3899                    let Some(val) = res else { break };
3900                    val
3901                }),
3902                91u16 => Devlink::RegionSnapshot({
3903                    let res = Some(IterableDlRegionSnapshot::with_loc(next, self.orig_loc));
3904                    let Some(val) = res else { break };
3905                    val
3906                }),
3907                92u16 => Devlink::RegionSnapshotId({
3908                    let res = parse_u32(next);
3909                    let Some(val) = res else { break };
3910                    val
3911                }),
3912                93u16 => Devlink::RegionChunks({
3913                    let res = Some(IterableDlRegionChunks::with_loc(next, self.orig_loc));
3914                    let Some(val) = res else { break };
3915                    val
3916                }),
3917                94u16 => Devlink::RegionChunk({
3918                    let res = Some(IterableDlRegionChunk::with_loc(next, self.orig_loc));
3919                    let Some(val) = res else { break };
3920                    val
3921                }),
3922                95u16 => Devlink::RegionChunkData({
3923                    let res = Some(next);
3924                    let Some(val) = res else { break };
3925                    val
3926                }),
3927                96u16 => Devlink::RegionChunkAddr({
3928                    let res = parse_u64(next);
3929                    let Some(val) = res else { break };
3930                    val
3931                }),
3932                97u16 => Devlink::RegionChunkLen({
3933                    let res = parse_u64(next);
3934                    let Some(val) = res else { break };
3935                    val
3936                }),
3937                98u16 => Devlink::InfoDriverName({
3938                    let res = CStr::from_bytes_with_nul(next).ok();
3939                    let Some(val) = res else { break };
3940                    val
3941                }),
3942                99u16 => Devlink::InfoSerialNumber({
3943                    let res = CStr::from_bytes_with_nul(next).ok();
3944                    let Some(val) = res else { break };
3945                    val
3946                }),
3947                100u16 => Devlink::InfoVersionFixed({
3948                    let res = Some(IterableDlInfoVersion::with_loc(next, self.orig_loc));
3949                    let Some(val) = res else { break };
3950                    val
3951                }),
3952                101u16 => Devlink::InfoVersionRunning({
3953                    let res = Some(IterableDlInfoVersion::with_loc(next, self.orig_loc));
3954                    let Some(val) = res else { break };
3955                    val
3956                }),
3957                102u16 => Devlink::InfoVersionStored({
3958                    let res = Some(IterableDlInfoVersion::with_loc(next, self.orig_loc));
3959                    let Some(val) = res else { break };
3960                    val
3961                }),
3962                103u16 => Devlink::InfoVersionName({
3963                    let res = CStr::from_bytes_with_nul(next).ok();
3964                    let Some(val) = res else { break };
3965                    val
3966                }),
3967                104u16 => Devlink::InfoVersionValue({
3968                    let res = CStr::from_bytes_with_nul(next).ok();
3969                    let Some(val) = res else { break };
3970                    val
3971                }),
3972                105u16 => Devlink::SbPoolCellSize({
3973                    let res = parse_u32(next);
3974                    let Some(val) = res else { break };
3975                    val
3976                }),
3977                106u16 => Devlink::Fmsg({
3978                    let res = Some(IterableDlFmsg::with_loc(next, self.orig_loc));
3979                    let Some(val) = res else { break };
3980                    val
3981                }),
3982                107u16 => Devlink::FmsgObjNestStart(()),
3983                108u16 => Devlink::FmsgPairNestStart(()),
3984                109u16 => Devlink::FmsgArrNestStart(()),
3985                110u16 => Devlink::FmsgNestEnd(()),
3986                111u16 => Devlink::FmsgObjName({
3987                    let res = CStr::from_bytes_with_nul(next).ok();
3988                    let Some(val) = res else { break };
3989                    val
3990                }),
3991                112u16 => Devlink::FmsgObjValueType({
3992                    let res = parse_u8(next);
3993                    let Some(val) = res else { break };
3994                    val
3995                }),
3996                114u16 => Devlink::HealthReporter({
3997                    let res = Some(IterableDlHealthReporter::with_loc(next, self.orig_loc));
3998                    let Some(val) = res else { break };
3999                    val
4000                }),
4001                115u16 => Devlink::HealthReporterName({
4002                    let res = CStr::from_bytes_with_nul(next).ok();
4003                    let Some(val) = res else { break };
4004                    val
4005                }),
4006                116u16 => Devlink::HealthReporterState({
4007                    let res = parse_u8(next);
4008                    let Some(val) = res else { break };
4009                    val
4010                }),
4011                117u16 => Devlink::HealthReporterErrCount({
4012                    let res = parse_u64(next);
4013                    let Some(val) = res else { break };
4014                    val
4015                }),
4016                118u16 => Devlink::HealthReporterRecoverCount({
4017                    let res = parse_u64(next);
4018                    let Some(val) = res else { break };
4019                    val
4020                }),
4021                119u16 => Devlink::HealthReporterDumpTs({
4022                    let res = parse_u64(next);
4023                    let Some(val) = res else { break };
4024                    val
4025                }),
4026                120u16 => Devlink::HealthReporterGracefulPeriod({
4027                    let res = parse_u64(next);
4028                    let Some(val) = res else { break };
4029                    val
4030                }),
4031                121u16 => Devlink::HealthReporterAutoRecover({
4032                    let res = parse_u8(next);
4033                    let Some(val) = res else { break };
4034                    val
4035                }),
4036                122u16 => Devlink::FlashUpdateFileName({
4037                    let res = CStr::from_bytes_with_nul(next).ok();
4038                    let Some(val) = res else { break };
4039                    val
4040                }),
4041                123u16 => Devlink::FlashUpdateComponent({
4042                    let res = CStr::from_bytes_with_nul(next).ok();
4043                    let Some(val) = res else { break };
4044                    val
4045                }),
4046                124u16 => Devlink::FlashUpdateStatusMsg({
4047                    let res = CStr::from_bytes_with_nul(next).ok();
4048                    let Some(val) = res else { break };
4049                    val
4050                }),
4051                125u16 => Devlink::FlashUpdateStatusDone({
4052                    let res = parse_u64(next);
4053                    let Some(val) = res else { break };
4054                    val
4055                }),
4056                126u16 => Devlink::FlashUpdateStatusTotal({
4057                    let res = parse_u64(next);
4058                    let Some(val) = res else { break };
4059                    val
4060                }),
4061                127u16 => Devlink::PortPciPfNumber({
4062                    let res = parse_u16(next);
4063                    let Some(val) = res else { break };
4064                    val
4065                }),
4066                128u16 => Devlink::PortPciVfNumber({
4067                    let res = parse_u16(next);
4068                    let Some(val) = res else { break };
4069                    val
4070                }),
4071                129u16 => Devlink::Stats({
4072                    let res = Some(IterableDlAttrStats::with_loc(next, self.orig_loc));
4073                    let Some(val) = res else { break };
4074                    val
4075                }),
4076                130u16 => Devlink::TrapName({
4077                    let res = CStr::from_bytes_with_nul(next).ok();
4078                    let Some(val) = res else { break };
4079                    val
4080                }),
4081                131u16 => Devlink::TrapAction({
4082                    let res = parse_u8(next);
4083                    let Some(val) = res else { break };
4084                    val
4085                }),
4086                132u16 => Devlink::TrapType({
4087                    let res = parse_u8(next);
4088                    let Some(val) = res else { break };
4089                    val
4090                }),
4091                133u16 => Devlink::TrapGeneric(()),
4092                134u16 => Devlink::TrapMetadata({
4093                    let res = Some(IterableDlTrapMetadata::with_loc(next, self.orig_loc));
4094                    let Some(val) = res else { break };
4095                    val
4096                }),
4097                135u16 => Devlink::TrapGroupName({
4098                    let res = CStr::from_bytes_with_nul(next).ok();
4099                    let Some(val) = res else { break };
4100                    val
4101                }),
4102                136u16 => Devlink::ReloadFailed({
4103                    let res = parse_u8(next);
4104                    let Some(val) = res else { break };
4105                    val
4106                }),
4107                137u16 => Devlink::HealthReporterDumpTsNs({
4108                    let res = parse_u64(next);
4109                    let Some(val) = res else { break };
4110                    val
4111                }),
4112                138u16 => Devlink::NetnsFd({
4113                    let res = parse_u32(next);
4114                    let Some(val) = res else { break };
4115                    val
4116                }),
4117                139u16 => Devlink::NetnsPid({
4118                    let res = parse_u32(next);
4119                    let Some(val) = res else { break };
4120                    val
4121                }),
4122                140u16 => Devlink::NetnsId({
4123                    let res = parse_u32(next);
4124                    let Some(val) = res else { break };
4125                    val
4126                }),
4127                141u16 => Devlink::HealthReporterAutoDump({
4128                    let res = parse_u8(next);
4129                    let Some(val) = res else { break };
4130                    val
4131                }),
4132                142u16 => Devlink::TrapPolicerId({
4133                    let res = parse_u32(next);
4134                    let Some(val) = res else { break };
4135                    val
4136                }),
4137                143u16 => Devlink::TrapPolicerRate({
4138                    let res = parse_u64(next);
4139                    let Some(val) = res else { break };
4140                    val
4141                }),
4142                144u16 => Devlink::TrapPolicerBurst({
4143                    let res = parse_u64(next);
4144                    let Some(val) = res else { break };
4145                    val
4146                }),
4147                145u16 => Devlink::PortFunction({
4148                    let res = Some(IterableDlPortFunction::with_loc(next, self.orig_loc));
4149                    let Some(val) = res else { break };
4150                    val
4151                }),
4152                146u16 => Devlink::InfoBoardSerialNumber({
4153                    let res = CStr::from_bytes_with_nul(next).ok();
4154                    let Some(val) = res else { break };
4155                    val
4156                }),
4157                147u16 => Devlink::PortLanes({
4158                    let res = parse_u32(next);
4159                    let Some(val) = res else { break };
4160                    val
4161                }),
4162                148u16 => Devlink::PortSplittable({
4163                    let res = parse_u8(next);
4164                    let Some(val) = res else { break };
4165                    val
4166                }),
4167                149u16 => Devlink::PortExternal({
4168                    let res = parse_u8(next);
4169                    let Some(val) = res else { break };
4170                    val
4171                }),
4172                150u16 => Devlink::PortControllerNumber({
4173                    let res = parse_u32(next);
4174                    let Some(val) = res else { break };
4175                    val
4176                }),
4177                151u16 => Devlink::FlashUpdateStatusTimeout({
4178                    let res = parse_u64(next);
4179                    let Some(val) = res else { break };
4180                    val
4181                }),
4182                152u16 => Devlink::FlashUpdateOverwriteMask({
4183                    let res = BuiltinBitfield32::new_from_slice(next);
4184                    let Some(val) = res else { break };
4185                    val
4186                }),
4187                153u16 => Devlink::ReloadAction({
4188                    let res = parse_u8(next);
4189                    let Some(val) = res else { break };
4190                    val
4191                }),
4192                154u16 => Devlink::ReloadActionsPerformed({
4193                    let res = BuiltinBitfield32::new_from_slice(next);
4194                    let Some(val) = res else { break };
4195                    val
4196                }),
4197                155u16 => Devlink::ReloadLimits({
4198                    let res = BuiltinBitfield32::new_from_slice(next);
4199                    let Some(val) = res else { break };
4200                    val
4201                }),
4202                156u16 => Devlink::DevStats({
4203                    let res = Some(IterableDlDevStats::with_loc(next, self.orig_loc));
4204                    let Some(val) = res else { break };
4205                    val
4206                }),
4207                157u16 => Devlink::ReloadStats({
4208                    let res = Some(IterableDlReloadStats::with_loc(next, self.orig_loc));
4209                    let Some(val) = res else { break };
4210                    val
4211                }),
4212                158u16 => Devlink::ReloadStatsEntry({
4213                    let res = Some(IterableDlReloadStatsEntry::with_loc(next, self.orig_loc));
4214                    let Some(val) = res else { break };
4215                    val
4216                }),
4217                159u16 => Devlink::ReloadStatsLimit({
4218                    let res = parse_u8(next);
4219                    let Some(val) = res else { break };
4220                    val
4221                }),
4222                160u16 => Devlink::ReloadStatsValue({
4223                    let res = parse_u32(next);
4224                    let Some(val) = res else { break };
4225                    val
4226                }),
4227                161u16 => Devlink::RemoteReloadStats({
4228                    let res = Some(IterableDlReloadStats::with_loc(next, self.orig_loc));
4229                    let Some(val) = res else { break };
4230                    val
4231                }),
4232                162u16 => Devlink::ReloadActionInfo({
4233                    let res = Some(IterableDlReloadActInfo::with_loc(next, self.orig_loc));
4234                    let Some(val) = res else { break };
4235                    val
4236                }),
4237                163u16 => Devlink::ReloadActionStats({
4238                    let res = Some(IterableDlReloadActStats::with_loc(next, self.orig_loc));
4239                    let Some(val) = res else { break };
4240                    val
4241                }),
4242                164u16 => Devlink::PortPciSfNumber({
4243                    let res = parse_u32(next);
4244                    let Some(val) = res else { break };
4245                    val
4246                }),
4247                165u16 => Devlink::RateType({
4248                    let res = parse_u16(next);
4249                    let Some(val) = res else { break };
4250                    val
4251                }),
4252                166u16 => Devlink::RateTxShare({
4253                    let res = parse_u64(next);
4254                    let Some(val) = res else { break };
4255                    val
4256                }),
4257                167u16 => Devlink::RateTxMax({
4258                    let res = parse_u64(next);
4259                    let Some(val) = res else { break };
4260                    val
4261                }),
4262                168u16 => Devlink::RateNodeName({
4263                    let res = CStr::from_bytes_with_nul(next).ok();
4264                    let Some(val) = res else { break };
4265                    val
4266                }),
4267                169u16 => Devlink::RateParentNodeName({
4268                    let res = CStr::from_bytes_with_nul(next).ok();
4269                    let Some(val) = res else { break };
4270                    val
4271                }),
4272                170u16 => Devlink::RegionMaxSnapshots({
4273                    let res = parse_u32(next);
4274                    let Some(val) = res else { break };
4275                    val
4276                }),
4277                171u16 => Devlink::LinecardIndex({
4278                    let res = parse_u32(next);
4279                    let Some(val) = res else { break };
4280                    val
4281                }),
4282                172u16 => Devlink::LinecardState({
4283                    let res = parse_u8(next);
4284                    let Some(val) = res else { break };
4285                    val
4286                }),
4287                173u16 => Devlink::LinecardType({
4288                    let res = CStr::from_bytes_with_nul(next).ok();
4289                    let Some(val) = res else { break };
4290                    val
4291                }),
4292                174u16 => Devlink::LinecardSupportedTypes({
4293                    let res = Some(IterableDlLinecardSupportedTypes::with_loc(
4294                        next,
4295                        self.orig_loc,
4296                    ));
4297                    let Some(val) = res else { break };
4298                    val
4299                }),
4300                176u16 => Devlink::Selftests({
4301                    let res = Some(IterableDlSelftestId::with_loc(next, self.orig_loc));
4302                    let Some(val) = res else { break };
4303                    val
4304                }),
4305                177u16 => Devlink::RateTxPriority({
4306                    let res = parse_u32(next);
4307                    let Some(val) = res else { break };
4308                    val
4309                }),
4310                178u16 => Devlink::RateTxWeight({
4311                    let res = parse_u32(next);
4312                    let Some(val) = res else { break };
4313                    val
4314                }),
4315                179u16 => Devlink::RegionDirect(()),
4316                180u16 => Devlink::RateTcBws({
4317                    let res = Some(IterableDlRateTcBws::with_loc(next, self.orig_loc));
4318                    let Some(val) = res else { break };
4319                    val
4320                }),
4321                181u16 => Devlink::HealthReporterBurstPeriod({
4322                    let res = parse_u64(next);
4323                    let Some(val) = res else { break };
4324                    val
4325                }),
4326                183u16 => Devlink::ParamResetDefault(()),
4327                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4328                n => continue,
4329            };
4330            return Some(Ok(res));
4331        }
4332        Some(Err(ErrorContext::new(
4333            "Devlink",
4334            r#type.and_then(|t| Devlink::attr_from_type(t)),
4335            self.orig_loc,
4336            self.buf.as_ptr().wrapping_add(pos) as usize,
4337        )))
4338    }
4339}
4340impl<'a> std::fmt::Debug for IterableDevlink<'_> {
4341    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4342        let mut fmt = f.debug_struct("Devlink");
4343        for attr in self.clone() {
4344            let attr = match attr {
4345                Ok(a) => a,
4346                Err(err) => {
4347                    fmt.finish()?;
4348                    f.write_str("Err(")?;
4349                    err.fmt(f)?;
4350                    return f.write_str(")");
4351                }
4352            };
4353            match attr {
4354                Devlink::BusName(val) => fmt.field("BusName", &val),
4355                Devlink::DevName(val) => fmt.field("DevName", &val),
4356                Devlink::PortIndex(val) => fmt.field("PortIndex", &val),
4357                Devlink::PortType(val) => {
4358                    fmt.field("PortType", &FormatEnum(val.into(), PortType::from_value))
4359                }
4360                Devlink::PortDesiredType(val) => fmt.field("PortDesiredType", &val),
4361                Devlink::PortNetdevIfindex(val) => fmt.field("PortNetdevIfindex", &val),
4362                Devlink::PortNetdevName(val) => fmt.field("PortNetdevName", &val),
4363                Devlink::PortIbdevName(val) => fmt.field("PortIbdevName", &val),
4364                Devlink::PortSplitCount(val) => fmt.field("PortSplitCount", &val),
4365                Devlink::PortSplitGroup(val) => fmt.field("PortSplitGroup", &val),
4366                Devlink::SbIndex(val) => fmt.field("SbIndex", &val),
4367                Devlink::SbSize(val) => fmt.field("SbSize", &val),
4368                Devlink::SbIngressPoolCount(val) => fmt.field("SbIngressPoolCount", &val),
4369                Devlink::SbEgressPoolCount(val) => fmt.field("SbEgressPoolCount", &val),
4370                Devlink::SbIngressTcCount(val) => fmt.field("SbIngressTcCount", &val),
4371                Devlink::SbEgressTcCount(val) => fmt.field("SbEgressTcCount", &val),
4372                Devlink::SbPoolIndex(val) => fmt.field("SbPoolIndex", &val),
4373                Devlink::SbPoolType(val) => fmt.field(
4374                    "SbPoolType",
4375                    &FormatEnum(val.into(), SbPoolType::from_value),
4376                ),
4377                Devlink::SbPoolSize(val) => fmt.field("SbPoolSize", &val),
4378                Devlink::SbPoolThresholdType(val) => fmt.field(
4379                    "SbPoolThresholdType",
4380                    &FormatEnum(val.into(), SbThresholdType::from_value),
4381                ),
4382                Devlink::SbThreshold(val) => fmt.field("SbThreshold", &val),
4383                Devlink::SbTcIndex(val) => fmt.field("SbTcIndex", &val),
4384                Devlink::SbOccCur(val) => fmt.field("SbOccCur", &val),
4385                Devlink::SbOccMax(val) => fmt.field("SbOccMax", &val),
4386                Devlink::EswitchMode(val) => fmt.field(
4387                    "EswitchMode",
4388                    &FormatEnum(val.into(), EswitchMode::from_value),
4389                ),
4390                Devlink::EswitchInlineMode(val) => fmt.field(
4391                    "EswitchInlineMode",
4392                    &FormatEnum(val.into(), EswitchInlineMode::from_value),
4393                ),
4394                Devlink::DpipeTables(val) => fmt.field("DpipeTables", &val),
4395                Devlink::DpipeTable(val) => fmt.field("DpipeTable", &val),
4396                Devlink::DpipeTableName(val) => fmt.field("DpipeTableName", &val),
4397                Devlink::DpipeTableSize(val) => fmt.field("DpipeTableSize", &val),
4398                Devlink::DpipeTableMatches(val) => fmt.field("DpipeTableMatches", &val),
4399                Devlink::DpipeTableActions(val) => fmt.field("DpipeTableActions", &val),
4400                Devlink::DpipeTableCountersEnabled(val) => {
4401                    fmt.field("DpipeTableCountersEnabled", &val)
4402                }
4403                Devlink::DpipeEntries(val) => fmt.field("DpipeEntries", &val),
4404                Devlink::DpipeEntry(val) => fmt.field("DpipeEntry", &val),
4405                Devlink::DpipeEntryIndex(val) => fmt.field("DpipeEntryIndex", &val),
4406                Devlink::DpipeEntryMatchValues(val) => fmt.field("DpipeEntryMatchValues", &val),
4407                Devlink::DpipeEntryActionValues(val) => fmt.field("DpipeEntryActionValues", &val),
4408                Devlink::DpipeEntryCounter(val) => fmt.field("DpipeEntryCounter", &val),
4409                Devlink::DpipeMatch(val) => fmt.field("DpipeMatch", &val),
4410                Devlink::DpipeMatchValue(val) => fmt.field("DpipeMatchValue", &val),
4411                Devlink::DpipeMatchType(val) => fmt.field(
4412                    "DpipeMatchType",
4413                    &FormatEnum(val.into(), DpipeMatchType::from_value),
4414                ),
4415                Devlink::DpipeAction(val) => fmt.field("DpipeAction", &val),
4416                Devlink::DpipeActionValue(val) => fmt.field("DpipeActionValue", &val),
4417                Devlink::DpipeActionType(val) => fmt.field(
4418                    "DpipeActionType",
4419                    &FormatEnum(val.into(), DpipeActionType::from_value),
4420                ),
4421                Devlink::DpipeValue(val) => fmt.field("DpipeValue", &val),
4422                Devlink::DpipeValueMask(val) => fmt.field("DpipeValueMask", &val),
4423                Devlink::DpipeValueMapping(val) => fmt.field("DpipeValueMapping", &val),
4424                Devlink::DpipeHeaders(val) => fmt.field("DpipeHeaders", &val),
4425                Devlink::DpipeHeader(val) => fmt.field("DpipeHeader", &val),
4426                Devlink::DpipeHeaderName(val) => fmt.field("DpipeHeaderName", &val),
4427                Devlink::DpipeHeaderId(val) => fmt.field(
4428                    "DpipeHeaderId",
4429                    &FormatEnum(val.into(), DpipeHeaderId::from_value),
4430                ),
4431                Devlink::DpipeHeaderFields(val) => fmt.field("DpipeHeaderFields", &val),
4432                Devlink::DpipeHeaderGlobal(val) => fmt.field("DpipeHeaderGlobal", &val),
4433                Devlink::DpipeHeaderIndex(val) => fmt.field("DpipeHeaderIndex", &val),
4434                Devlink::DpipeField(val) => fmt.field("DpipeField", &val),
4435                Devlink::DpipeFieldName(val) => fmt.field("DpipeFieldName", &val),
4436                Devlink::DpipeFieldId(val) => fmt.field("DpipeFieldId", &val),
4437                Devlink::DpipeFieldBitwidth(val) => fmt.field("DpipeFieldBitwidth", &val),
4438                Devlink::DpipeFieldMappingType(val) => fmt.field(
4439                    "DpipeFieldMappingType",
4440                    &FormatEnum(val.into(), DpipeFieldMappingType::from_value),
4441                ),
4442                Devlink::Pad(val) => fmt.field("Pad", &val),
4443                Devlink::EswitchEncapMode(val) => fmt.field(
4444                    "EswitchEncapMode",
4445                    &FormatEnum(val.into(), EswitchEncapMode::from_value),
4446                ),
4447                Devlink::ResourceList(val) => fmt.field("ResourceList", &val),
4448                Devlink::Resource(val) => fmt.field("Resource", &val),
4449                Devlink::ResourceName(val) => fmt.field("ResourceName", &val),
4450                Devlink::ResourceId(val) => fmt.field("ResourceId", &val),
4451                Devlink::ResourceSize(val) => fmt.field("ResourceSize", &val),
4452                Devlink::ResourceSizeNew(val) => fmt.field("ResourceSizeNew", &val),
4453                Devlink::ResourceSizeValid(val) => fmt.field("ResourceSizeValid", &val),
4454                Devlink::ResourceSizeMin(val) => fmt.field("ResourceSizeMin", &val),
4455                Devlink::ResourceSizeMax(val) => fmt.field("ResourceSizeMax", &val),
4456                Devlink::ResourceSizeGran(val) => fmt.field("ResourceSizeGran", &val),
4457                Devlink::ResourceUnit(val) => fmt.field(
4458                    "ResourceUnit",
4459                    &FormatEnum(val.into(), ResourceUnit::from_value),
4460                ),
4461                Devlink::ResourceOcc(val) => fmt.field("ResourceOcc", &val),
4462                Devlink::DpipeTableResourceId(val) => fmt.field("DpipeTableResourceId", &val),
4463                Devlink::DpipeTableResourceUnits(val) => fmt.field("DpipeTableResourceUnits", &val),
4464                Devlink::PortFlavour(val) => fmt.field(
4465                    "PortFlavour",
4466                    &FormatEnum(val.into(), PortFlavour::from_value),
4467                ),
4468                Devlink::PortNumber(val) => fmt.field("PortNumber", &val),
4469                Devlink::PortSplitSubportNumber(val) => fmt.field("PortSplitSubportNumber", &val),
4470                Devlink::Param(val) => fmt.field("Param", &val),
4471                Devlink::ParamName(val) => fmt.field("ParamName", &val),
4472                Devlink::ParamGeneric(val) => fmt.field("ParamGeneric", &val),
4473                Devlink::ParamType(val) => fmt.field(
4474                    "ParamType",
4475                    &FormatEnum(val.into(), VarAttrType::from_value),
4476                ),
4477                Devlink::ParamValueCmode(val) => fmt.field(
4478                    "ParamValueCmode",
4479                    &FormatEnum(val.into(), ParamCmode::from_value),
4480                ),
4481                Devlink::RegionName(val) => fmt.field("RegionName", &val),
4482                Devlink::RegionSize(val) => fmt.field("RegionSize", &val),
4483                Devlink::RegionSnapshots(val) => fmt.field("RegionSnapshots", &val),
4484                Devlink::RegionSnapshot(val) => fmt.field("RegionSnapshot", &val),
4485                Devlink::RegionSnapshotId(val) => fmt.field("RegionSnapshotId", &val),
4486                Devlink::RegionChunks(val) => fmt.field("RegionChunks", &val),
4487                Devlink::RegionChunk(val) => fmt.field("RegionChunk", &val),
4488                Devlink::RegionChunkData(val) => fmt.field("RegionChunkData", &val),
4489                Devlink::RegionChunkAddr(val) => fmt.field("RegionChunkAddr", &val),
4490                Devlink::RegionChunkLen(val) => fmt.field("RegionChunkLen", &val),
4491                Devlink::InfoDriverName(val) => fmt.field("InfoDriverName", &val),
4492                Devlink::InfoSerialNumber(val) => fmt.field("InfoSerialNumber", &val),
4493                Devlink::InfoVersionFixed(val) => fmt.field("InfoVersionFixed", &val),
4494                Devlink::InfoVersionRunning(val) => fmt.field("InfoVersionRunning", &val),
4495                Devlink::InfoVersionStored(val) => fmt.field("InfoVersionStored", &val),
4496                Devlink::InfoVersionName(val) => fmt.field("InfoVersionName", &val),
4497                Devlink::InfoVersionValue(val) => fmt.field("InfoVersionValue", &val),
4498                Devlink::SbPoolCellSize(val) => fmt.field("SbPoolCellSize", &val),
4499                Devlink::Fmsg(val) => fmt.field("Fmsg", &val),
4500                Devlink::FmsgObjNestStart(val) => fmt.field("FmsgObjNestStart", &val),
4501                Devlink::FmsgPairNestStart(val) => fmt.field("FmsgPairNestStart", &val),
4502                Devlink::FmsgArrNestStart(val) => fmt.field("FmsgArrNestStart", &val),
4503                Devlink::FmsgNestEnd(val) => fmt.field("FmsgNestEnd", &val),
4504                Devlink::FmsgObjName(val) => fmt.field("FmsgObjName", &val),
4505                Devlink::FmsgObjValueType(val) => fmt.field(
4506                    "FmsgObjValueType",
4507                    &FormatEnum(val.into(), VarAttrType::from_value),
4508                ),
4509                Devlink::HealthReporter(val) => fmt.field("HealthReporter", &val),
4510                Devlink::HealthReporterName(val) => fmt.field("HealthReporterName", &val),
4511                Devlink::HealthReporterState(val) => fmt.field("HealthReporterState", &val),
4512                Devlink::HealthReporterErrCount(val) => fmt.field("HealthReporterErrCount", &val),
4513                Devlink::HealthReporterRecoverCount(val) => {
4514                    fmt.field("HealthReporterRecoverCount", &val)
4515                }
4516                Devlink::HealthReporterDumpTs(val) => fmt.field("HealthReporterDumpTs", &val),
4517                Devlink::HealthReporterGracefulPeriod(val) => {
4518                    fmt.field("HealthReporterGracefulPeriod", &val)
4519                }
4520                Devlink::HealthReporterAutoRecover(val) => {
4521                    fmt.field("HealthReporterAutoRecover", &val)
4522                }
4523                Devlink::FlashUpdateFileName(val) => fmt.field("FlashUpdateFileName", &val),
4524                Devlink::FlashUpdateComponent(val) => fmt.field("FlashUpdateComponent", &val),
4525                Devlink::FlashUpdateStatusMsg(val) => fmt.field("FlashUpdateStatusMsg", &val),
4526                Devlink::FlashUpdateStatusDone(val) => fmt.field("FlashUpdateStatusDone", &val),
4527                Devlink::FlashUpdateStatusTotal(val) => fmt.field("FlashUpdateStatusTotal", &val),
4528                Devlink::PortPciPfNumber(val) => fmt.field("PortPciPfNumber", &val),
4529                Devlink::PortPciVfNumber(val) => fmt.field("PortPciVfNumber", &val),
4530                Devlink::Stats(val) => fmt.field("Stats", &val),
4531                Devlink::TrapName(val) => fmt.field("TrapName", &val),
4532                Devlink::TrapAction(val) => fmt.field(
4533                    "TrapAction",
4534                    &FormatEnum(val.into(), TrapAction::from_value),
4535                ),
4536                Devlink::TrapType(val) => {
4537                    fmt.field("TrapType", &FormatEnum(val.into(), TrapType::from_value))
4538                }
4539                Devlink::TrapGeneric(val) => fmt.field("TrapGeneric", &val),
4540                Devlink::TrapMetadata(val) => fmt.field("TrapMetadata", &val),
4541                Devlink::TrapGroupName(val) => fmt.field("TrapGroupName", &val),
4542                Devlink::ReloadFailed(val) => fmt.field("ReloadFailed", &val),
4543                Devlink::HealthReporterDumpTsNs(val) => fmt.field("HealthReporterDumpTsNs", &val),
4544                Devlink::NetnsFd(val) => fmt.field("NetnsFd", &val),
4545                Devlink::NetnsPid(val) => fmt.field("NetnsPid", &val),
4546                Devlink::NetnsId(val) => fmt.field("NetnsId", &val),
4547                Devlink::HealthReporterAutoDump(val) => fmt.field("HealthReporterAutoDump", &val),
4548                Devlink::TrapPolicerId(val) => fmt.field("TrapPolicerId", &val),
4549                Devlink::TrapPolicerRate(val) => fmt.field("TrapPolicerRate", &val),
4550                Devlink::TrapPolicerBurst(val) => fmt.field("TrapPolicerBurst", &val),
4551                Devlink::PortFunction(val) => fmt.field("PortFunction", &val),
4552                Devlink::InfoBoardSerialNumber(val) => fmt.field("InfoBoardSerialNumber", &val),
4553                Devlink::PortLanes(val) => fmt.field("PortLanes", &val),
4554                Devlink::PortSplittable(val) => fmt.field("PortSplittable", &val),
4555                Devlink::PortExternal(val) => fmt.field("PortExternal", &val),
4556                Devlink::PortControllerNumber(val) => fmt.field("PortControllerNumber", &val),
4557                Devlink::FlashUpdateStatusTimeout(val) => {
4558                    fmt.field("FlashUpdateStatusTimeout", &val)
4559                }
4560                Devlink::FlashUpdateOverwriteMask(val) => fmt.field(
4561                    "FlashUpdateOverwriteMask",
4562                    &FormatFlags(val.value.into(), |val| {
4563                        FlashOverwrite::from_value(val.trailing_zeros().into())
4564                    }),
4565                ),
4566                Devlink::ReloadAction(val) => fmt.field(
4567                    "ReloadAction",
4568                    &FormatEnum(val.into(), ReloadAction::from_value),
4569                ),
4570                Devlink::ReloadActionsPerformed(val) => fmt.field(
4571                    "ReloadActionsPerformed",
4572                    &FormatFlags(val.value.into(), |val| {
4573                        ReloadAction::from_value(val.trailing_zeros().into())
4574                    }),
4575                ),
4576                Devlink::ReloadLimits(val) => fmt.field(
4577                    "ReloadLimits",
4578                    &FormatFlags(val.value.into(), |val| {
4579                        ReloadAction::from_value(val.trailing_zeros().into())
4580                    }),
4581                ),
4582                Devlink::DevStats(val) => fmt.field("DevStats", &val),
4583                Devlink::ReloadStats(val) => fmt.field("ReloadStats", &val),
4584                Devlink::ReloadStatsEntry(val) => fmt.field("ReloadStatsEntry", &val),
4585                Devlink::ReloadStatsLimit(val) => fmt.field("ReloadStatsLimit", &val),
4586                Devlink::ReloadStatsValue(val) => fmt.field("ReloadStatsValue", &val),
4587                Devlink::RemoteReloadStats(val) => fmt.field("RemoteReloadStats", &val),
4588                Devlink::ReloadActionInfo(val) => fmt.field("ReloadActionInfo", &val),
4589                Devlink::ReloadActionStats(val) => fmt.field("ReloadActionStats", &val),
4590                Devlink::PortPciSfNumber(val) => fmt.field("PortPciSfNumber", &val),
4591                Devlink::RateType(val) => {
4592                    fmt.field("RateType", &FormatEnum(val.into(), RateType::from_value))
4593                }
4594                Devlink::RateTxShare(val) => fmt.field("RateTxShare", &val),
4595                Devlink::RateTxMax(val) => fmt.field("RateTxMax", &val),
4596                Devlink::RateNodeName(val) => fmt.field("RateNodeName", &val),
4597                Devlink::RateParentNodeName(val) => fmt.field("RateParentNodeName", &val),
4598                Devlink::RegionMaxSnapshots(val) => fmt.field("RegionMaxSnapshots", &val),
4599                Devlink::LinecardIndex(val) => fmt.field("LinecardIndex", &val),
4600                Devlink::LinecardState(val) => fmt.field("LinecardState", &val),
4601                Devlink::LinecardType(val) => fmt.field("LinecardType", &val),
4602                Devlink::LinecardSupportedTypes(val) => fmt.field("LinecardSupportedTypes", &val),
4603                Devlink::Selftests(val) => fmt.field("Selftests", &val),
4604                Devlink::RateTxPriority(val) => fmt.field("RateTxPriority", &val),
4605                Devlink::RateTxWeight(val) => fmt.field("RateTxWeight", &val),
4606                Devlink::RegionDirect(val) => fmt.field("RegionDirect", &val),
4607                Devlink::RateTcBws(val) => fmt.field("RateTcBws", &val),
4608                Devlink::HealthReporterBurstPeriod(val) => {
4609                    fmt.field("HealthReporterBurstPeriod", &val)
4610                }
4611                Devlink::ParamResetDefault(val) => fmt.field("ParamResetDefault", &val),
4612            };
4613        }
4614        fmt.finish()
4615    }
4616}
4617impl IterableDevlink<'_> {
4618    pub fn lookup_attr(
4619        &self,
4620        offset: usize,
4621        missing_type: Option<u16>,
4622    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4623        let mut stack = Vec::new();
4624        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4625        if missing_type.is_some() && cur == offset {
4626            stack.push(("Devlink", offset));
4627            return (stack, missing_type.and_then(|t| Devlink::attr_from_type(t)));
4628        }
4629        if cur > offset || cur + self.buf.len() < offset {
4630            return (stack, None);
4631        }
4632        let mut attrs = self.clone();
4633        let mut last_off = cur + attrs.pos;
4634        let mut missing = None;
4635        while let Some(attr) = attrs.next() {
4636            let Ok(attr) = attr else { break };
4637            match attr {
4638                Devlink::BusName(val) => {
4639                    if last_off == offset {
4640                        stack.push(("BusName", last_off));
4641                        break;
4642                    }
4643                }
4644                Devlink::DevName(val) => {
4645                    if last_off == offset {
4646                        stack.push(("DevName", last_off));
4647                        break;
4648                    }
4649                }
4650                Devlink::PortIndex(val) => {
4651                    if last_off == offset {
4652                        stack.push(("PortIndex", last_off));
4653                        break;
4654                    }
4655                }
4656                Devlink::PortType(val) => {
4657                    if last_off == offset {
4658                        stack.push(("PortType", last_off));
4659                        break;
4660                    }
4661                }
4662                Devlink::PortDesiredType(val) => {
4663                    if last_off == offset {
4664                        stack.push(("PortDesiredType", last_off));
4665                        break;
4666                    }
4667                }
4668                Devlink::PortNetdevIfindex(val) => {
4669                    if last_off == offset {
4670                        stack.push(("PortNetdevIfindex", last_off));
4671                        break;
4672                    }
4673                }
4674                Devlink::PortNetdevName(val) => {
4675                    if last_off == offset {
4676                        stack.push(("PortNetdevName", last_off));
4677                        break;
4678                    }
4679                }
4680                Devlink::PortIbdevName(val) => {
4681                    if last_off == offset {
4682                        stack.push(("PortIbdevName", last_off));
4683                        break;
4684                    }
4685                }
4686                Devlink::PortSplitCount(val) => {
4687                    if last_off == offset {
4688                        stack.push(("PortSplitCount", last_off));
4689                        break;
4690                    }
4691                }
4692                Devlink::PortSplitGroup(val) => {
4693                    if last_off == offset {
4694                        stack.push(("PortSplitGroup", last_off));
4695                        break;
4696                    }
4697                }
4698                Devlink::SbIndex(val) => {
4699                    if last_off == offset {
4700                        stack.push(("SbIndex", last_off));
4701                        break;
4702                    }
4703                }
4704                Devlink::SbSize(val) => {
4705                    if last_off == offset {
4706                        stack.push(("SbSize", last_off));
4707                        break;
4708                    }
4709                }
4710                Devlink::SbIngressPoolCount(val) => {
4711                    if last_off == offset {
4712                        stack.push(("SbIngressPoolCount", last_off));
4713                        break;
4714                    }
4715                }
4716                Devlink::SbEgressPoolCount(val) => {
4717                    if last_off == offset {
4718                        stack.push(("SbEgressPoolCount", last_off));
4719                        break;
4720                    }
4721                }
4722                Devlink::SbIngressTcCount(val) => {
4723                    if last_off == offset {
4724                        stack.push(("SbIngressTcCount", last_off));
4725                        break;
4726                    }
4727                }
4728                Devlink::SbEgressTcCount(val) => {
4729                    if last_off == offset {
4730                        stack.push(("SbEgressTcCount", last_off));
4731                        break;
4732                    }
4733                }
4734                Devlink::SbPoolIndex(val) => {
4735                    if last_off == offset {
4736                        stack.push(("SbPoolIndex", last_off));
4737                        break;
4738                    }
4739                }
4740                Devlink::SbPoolType(val) => {
4741                    if last_off == offset {
4742                        stack.push(("SbPoolType", last_off));
4743                        break;
4744                    }
4745                }
4746                Devlink::SbPoolSize(val) => {
4747                    if last_off == offset {
4748                        stack.push(("SbPoolSize", last_off));
4749                        break;
4750                    }
4751                }
4752                Devlink::SbPoolThresholdType(val) => {
4753                    if last_off == offset {
4754                        stack.push(("SbPoolThresholdType", last_off));
4755                        break;
4756                    }
4757                }
4758                Devlink::SbThreshold(val) => {
4759                    if last_off == offset {
4760                        stack.push(("SbThreshold", last_off));
4761                        break;
4762                    }
4763                }
4764                Devlink::SbTcIndex(val) => {
4765                    if last_off == offset {
4766                        stack.push(("SbTcIndex", last_off));
4767                        break;
4768                    }
4769                }
4770                Devlink::SbOccCur(val) => {
4771                    if last_off == offset {
4772                        stack.push(("SbOccCur", last_off));
4773                        break;
4774                    }
4775                }
4776                Devlink::SbOccMax(val) => {
4777                    if last_off == offset {
4778                        stack.push(("SbOccMax", last_off));
4779                        break;
4780                    }
4781                }
4782                Devlink::EswitchMode(val) => {
4783                    if last_off == offset {
4784                        stack.push(("EswitchMode", last_off));
4785                        break;
4786                    }
4787                }
4788                Devlink::EswitchInlineMode(val) => {
4789                    if last_off == offset {
4790                        stack.push(("EswitchInlineMode", last_off));
4791                        break;
4792                    }
4793                }
4794                Devlink::DpipeTables(val) => {
4795                    (stack, missing) = val.lookup_attr(offset, missing_type);
4796                    if !stack.is_empty() {
4797                        break;
4798                    }
4799                }
4800                Devlink::DpipeTable(val) => {
4801                    (stack, missing) = val.lookup_attr(offset, missing_type);
4802                    if !stack.is_empty() {
4803                        break;
4804                    }
4805                }
4806                Devlink::DpipeTableName(val) => {
4807                    if last_off == offset {
4808                        stack.push(("DpipeTableName", last_off));
4809                        break;
4810                    }
4811                }
4812                Devlink::DpipeTableSize(val) => {
4813                    if last_off == offset {
4814                        stack.push(("DpipeTableSize", last_off));
4815                        break;
4816                    }
4817                }
4818                Devlink::DpipeTableMatches(val) => {
4819                    (stack, missing) = val.lookup_attr(offset, missing_type);
4820                    if !stack.is_empty() {
4821                        break;
4822                    }
4823                }
4824                Devlink::DpipeTableActions(val) => {
4825                    (stack, missing) = val.lookup_attr(offset, missing_type);
4826                    if !stack.is_empty() {
4827                        break;
4828                    }
4829                }
4830                Devlink::DpipeTableCountersEnabled(val) => {
4831                    if last_off == offset {
4832                        stack.push(("DpipeTableCountersEnabled", last_off));
4833                        break;
4834                    }
4835                }
4836                Devlink::DpipeEntries(val) => {
4837                    (stack, missing) = val.lookup_attr(offset, missing_type);
4838                    if !stack.is_empty() {
4839                        break;
4840                    }
4841                }
4842                Devlink::DpipeEntry(val) => {
4843                    (stack, missing) = val.lookup_attr(offset, missing_type);
4844                    if !stack.is_empty() {
4845                        break;
4846                    }
4847                }
4848                Devlink::DpipeEntryIndex(val) => {
4849                    if last_off == offset {
4850                        stack.push(("DpipeEntryIndex", last_off));
4851                        break;
4852                    }
4853                }
4854                Devlink::DpipeEntryMatchValues(val) => {
4855                    (stack, missing) = val.lookup_attr(offset, missing_type);
4856                    if !stack.is_empty() {
4857                        break;
4858                    }
4859                }
4860                Devlink::DpipeEntryActionValues(val) => {
4861                    (stack, missing) = val.lookup_attr(offset, missing_type);
4862                    if !stack.is_empty() {
4863                        break;
4864                    }
4865                }
4866                Devlink::DpipeEntryCounter(val) => {
4867                    if last_off == offset {
4868                        stack.push(("DpipeEntryCounter", last_off));
4869                        break;
4870                    }
4871                }
4872                Devlink::DpipeMatch(val) => {
4873                    (stack, missing) = val.lookup_attr(offset, missing_type);
4874                    if !stack.is_empty() {
4875                        break;
4876                    }
4877                }
4878                Devlink::DpipeMatchValue(val) => {
4879                    (stack, missing) = val.lookup_attr(offset, missing_type);
4880                    if !stack.is_empty() {
4881                        break;
4882                    }
4883                }
4884                Devlink::DpipeMatchType(val) => {
4885                    if last_off == offset {
4886                        stack.push(("DpipeMatchType", last_off));
4887                        break;
4888                    }
4889                }
4890                Devlink::DpipeAction(val) => {
4891                    (stack, missing) = val.lookup_attr(offset, missing_type);
4892                    if !stack.is_empty() {
4893                        break;
4894                    }
4895                }
4896                Devlink::DpipeActionValue(val) => {
4897                    (stack, missing) = val.lookup_attr(offset, missing_type);
4898                    if !stack.is_empty() {
4899                        break;
4900                    }
4901                }
4902                Devlink::DpipeActionType(val) => {
4903                    if last_off == offset {
4904                        stack.push(("DpipeActionType", last_off));
4905                        break;
4906                    }
4907                }
4908                Devlink::DpipeValue(val) => {
4909                    if last_off == offset {
4910                        stack.push(("DpipeValue", last_off));
4911                        break;
4912                    }
4913                }
4914                Devlink::DpipeValueMask(val) => {
4915                    if last_off == offset {
4916                        stack.push(("DpipeValueMask", last_off));
4917                        break;
4918                    }
4919                }
4920                Devlink::DpipeValueMapping(val) => {
4921                    if last_off == offset {
4922                        stack.push(("DpipeValueMapping", last_off));
4923                        break;
4924                    }
4925                }
4926                Devlink::DpipeHeaders(val) => {
4927                    (stack, missing) = val.lookup_attr(offset, missing_type);
4928                    if !stack.is_empty() {
4929                        break;
4930                    }
4931                }
4932                Devlink::DpipeHeader(val) => {
4933                    (stack, missing) = val.lookup_attr(offset, missing_type);
4934                    if !stack.is_empty() {
4935                        break;
4936                    }
4937                }
4938                Devlink::DpipeHeaderName(val) => {
4939                    if last_off == offset {
4940                        stack.push(("DpipeHeaderName", last_off));
4941                        break;
4942                    }
4943                }
4944                Devlink::DpipeHeaderId(val) => {
4945                    if last_off == offset {
4946                        stack.push(("DpipeHeaderId", last_off));
4947                        break;
4948                    }
4949                }
4950                Devlink::DpipeHeaderFields(val) => {
4951                    (stack, missing) = val.lookup_attr(offset, missing_type);
4952                    if !stack.is_empty() {
4953                        break;
4954                    }
4955                }
4956                Devlink::DpipeHeaderGlobal(val) => {
4957                    if last_off == offset {
4958                        stack.push(("DpipeHeaderGlobal", last_off));
4959                        break;
4960                    }
4961                }
4962                Devlink::DpipeHeaderIndex(val) => {
4963                    if last_off == offset {
4964                        stack.push(("DpipeHeaderIndex", last_off));
4965                        break;
4966                    }
4967                }
4968                Devlink::DpipeField(val) => {
4969                    (stack, missing) = val.lookup_attr(offset, missing_type);
4970                    if !stack.is_empty() {
4971                        break;
4972                    }
4973                }
4974                Devlink::DpipeFieldName(val) => {
4975                    if last_off == offset {
4976                        stack.push(("DpipeFieldName", last_off));
4977                        break;
4978                    }
4979                }
4980                Devlink::DpipeFieldId(val) => {
4981                    if last_off == offset {
4982                        stack.push(("DpipeFieldId", last_off));
4983                        break;
4984                    }
4985                }
4986                Devlink::DpipeFieldBitwidth(val) => {
4987                    if last_off == offset {
4988                        stack.push(("DpipeFieldBitwidth", last_off));
4989                        break;
4990                    }
4991                }
4992                Devlink::DpipeFieldMappingType(val) => {
4993                    if last_off == offset {
4994                        stack.push(("DpipeFieldMappingType", last_off));
4995                        break;
4996                    }
4997                }
4998                Devlink::Pad(val) => {
4999                    if last_off == offset {
5000                        stack.push(("Pad", last_off));
5001                        break;
5002                    }
5003                }
5004                Devlink::EswitchEncapMode(val) => {
5005                    if last_off == offset {
5006                        stack.push(("EswitchEncapMode", last_off));
5007                        break;
5008                    }
5009                }
5010                Devlink::ResourceList(val) => {
5011                    (stack, missing) = val.lookup_attr(offset, missing_type);
5012                    if !stack.is_empty() {
5013                        break;
5014                    }
5015                }
5016                Devlink::Resource(val) => {
5017                    (stack, missing) = val.lookup_attr(offset, missing_type);
5018                    if !stack.is_empty() {
5019                        break;
5020                    }
5021                }
5022                Devlink::ResourceName(val) => {
5023                    if last_off == offset {
5024                        stack.push(("ResourceName", last_off));
5025                        break;
5026                    }
5027                }
5028                Devlink::ResourceId(val) => {
5029                    if last_off == offset {
5030                        stack.push(("ResourceId", last_off));
5031                        break;
5032                    }
5033                }
5034                Devlink::ResourceSize(val) => {
5035                    if last_off == offset {
5036                        stack.push(("ResourceSize", last_off));
5037                        break;
5038                    }
5039                }
5040                Devlink::ResourceSizeNew(val) => {
5041                    if last_off == offset {
5042                        stack.push(("ResourceSizeNew", last_off));
5043                        break;
5044                    }
5045                }
5046                Devlink::ResourceSizeValid(val) => {
5047                    if last_off == offset {
5048                        stack.push(("ResourceSizeValid", last_off));
5049                        break;
5050                    }
5051                }
5052                Devlink::ResourceSizeMin(val) => {
5053                    if last_off == offset {
5054                        stack.push(("ResourceSizeMin", last_off));
5055                        break;
5056                    }
5057                }
5058                Devlink::ResourceSizeMax(val) => {
5059                    if last_off == offset {
5060                        stack.push(("ResourceSizeMax", last_off));
5061                        break;
5062                    }
5063                }
5064                Devlink::ResourceSizeGran(val) => {
5065                    if last_off == offset {
5066                        stack.push(("ResourceSizeGran", last_off));
5067                        break;
5068                    }
5069                }
5070                Devlink::ResourceUnit(val) => {
5071                    if last_off == offset {
5072                        stack.push(("ResourceUnit", last_off));
5073                        break;
5074                    }
5075                }
5076                Devlink::ResourceOcc(val) => {
5077                    if last_off == offset {
5078                        stack.push(("ResourceOcc", last_off));
5079                        break;
5080                    }
5081                }
5082                Devlink::DpipeTableResourceId(val) => {
5083                    if last_off == offset {
5084                        stack.push(("DpipeTableResourceId", last_off));
5085                        break;
5086                    }
5087                }
5088                Devlink::DpipeTableResourceUnits(val) => {
5089                    if last_off == offset {
5090                        stack.push(("DpipeTableResourceUnits", last_off));
5091                        break;
5092                    }
5093                }
5094                Devlink::PortFlavour(val) => {
5095                    if last_off == offset {
5096                        stack.push(("PortFlavour", last_off));
5097                        break;
5098                    }
5099                }
5100                Devlink::PortNumber(val) => {
5101                    if last_off == offset {
5102                        stack.push(("PortNumber", last_off));
5103                        break;
5104                    }
5105                }
5106                Devlink::PortSplitSubportNumber(val) => {
5107                    if last_off == offset {
5108                        stack.push(("PortSplitSubportNumber", last_off));
5109                        break;
5110                    }
5111                }
5112                Devlink::Param(val) => {
5113                    (stack, missing) = val.lookup_attr(offset, missing_type);
5114                    if !stack.is_empty() {
5115                        break;
5116                    }
5117                }
5118                Devlink::ParamName(val) => {
5119                    if last_off == offset {
5120                        stack.push(("ParamName", last_off));
5121                        break;
5122                    }
5123                }
5124                Devlink::ParamGeneric(val) => {
5125                    if last_off == offset {
5126                        stack.push(("ParamGeneric", last_off));
5127                        break;
5128                    }
5129                }
5130                Devlink::ParamType(val) => {
5131                    if last_off == offset {
5132                        stack.push(("ParamType", last_off));
5133                        break;
5134                    }
5135                }
5136                Devlink::ParamValueCmode(val) => {
5137                    if last_off == offset {
5138                        stack.push(("ParamValueCmode", last_off));
5139                        break;
5140                    }
5141                }
5142                Devlink::RegionName(val) => {
5143                    if last_off == offset {
5144                        stack.push(("RegionName", last_off));
5145                        break;
5146                    }
5147                }
5148                Devlink::RegionSize(val) => {
5149                    if last_off == offset {
5150                        stack.push(("RegionSize", last_off));
5151                        break;
5152                    }
5153                }
5154                Devlink::RegionSnapshots(val) => {
5155                    (stack, missing) = val.lookup_attr(offset, missing_type);
5156                    if !stack.is_empty() {
5157                        break;
5158                    }
5159                }
5160                Devlink::RegionSnapshot(val) => {
5161                    (stack, missing) = val.lookup_attr(offset, missing_type);
5162                    if !stack.is_empty() {
5163                        break;
5164                    }
5165                }
5166                Devlink::RegionSnapshotId(val) => {
5167                    if last_off == offset {
5168                        stack.push(("RegionSnapshotId", last_off));
5169                        break;
5170                    }
5171                }
5172                Devlink::RegionChunks(val) => {
5173                    (stack, missing) = val.lookup_attr(offset, missing_type);
5174                    if !stack.is_empty() {
5175                        break;
5176                    }
5177                }
5178                Devlink::RegionChunk(val) => {
5179                    (stack, missing) = val.lookup_attr(offset, missing_type);
5180                    if !stack.is_empty() {
5181                        break;
5182                    }
5183                }
5184                Devlink::RegionChunkData(val) => {
5185                    if last_off == offset {
5186                        stack.push(("RegionChunkData", last_off));
5187                        break;
5188                    }
5189                }
5190                Devlink::RegionChunkAddr(val) => {
5191                    if last_off == offset {
5192                        stack.push(("RegionChunkAddr", last_off));
5193                        break;
5194                    }
5195                }
5196                Devlink::RegionChunkLen(val) => {
5197                    if last_off == offset {
5198                        stack.push(("RegionChunkLen", last_off));
5199                        break;
5200                    }
5201                }
5202                Devlink::InfoDriverName(val) => {
5203                    if last_off == offset {
5204                        stack.push(("InfoDriverName", last_off));
5205                        break;
5206                    }
5207                }
5208                Devlink::InfoSerialNumber(val) => {
5209                    if last_off == offset {
5210                        stack.push(("InfoSerialNumber", last_off));
5211                        break;
5212                    }
5213                }
5214                Devlink::InfoVersionFixed(val) => {
5215                    (stack, missing) = val.lookup_attr(offset, missing_type);
5216                    if !stack.is_empty() {
5217                        break;
5218                    }
5219                }
5220                Devlink::InfoVersionRunning(val) => {
5221                    (stack, missing) = val.lookup_attr(offset, missing_type);
5222                    if !stack.is_empty() {
5223                        break;
5224                    }
5225                }
5226                Devlink::InfoVersionStored(val) => {
5227                    (stack, missing) = val.lookup_attr(offset, missing_type);
5228                    if !stack.is_empty() {
5229                        break;
5230                    }
5231                }
5232                Devlink::InfoVersionName(val) => {
5233                    if last_off == offset {
5234                        stack.push(("InfoVersionName", last_off));
5235                        break;
5236                    }
5237                }
5238                Devlink::InfoVersionValue(val) => {
5239                    if last_off == offset {
5240                        stack.push(("InfoVersionValue", last_off));
5241                        break;
5242                    }
5243                }
5244                Devlink::SbPoolCellSize(val) => {
5245                    if last_off == offset {
5246                        stack.push(("SbPoolCellSize", last_off));
5247                        break;
5248                    }
5249                }
5250                Devlink::Fmsg(val) => {
5251                    (stack, missing) = val.lookup_attr(offset, missing_type);
5252                    if !stack.is_empty() {
5253                        break;
5254                    }
5255                }
5256                Devlink::FmsgObjNestStart(val) => {
5257                    if last_off == offset {
5258                        stack.push(("FmsgObjNestStart", last_off));
5259                        break;
5260                    }
5261                }
5262                Devlink::FmsgPairNestStart(val) => {
5263                    if last_off == offset {
5264                        stack.push(("FmsgPairNestStart", last_off));
5265                        break;
5266                    }
5267                }
5268                Devlink::FmsgArrNestStart(val) => {
5269                    if last_off == offset {
5270                        stack.push(("FmsgArrNestStart", last_off));
5271                        break;
5272                    }
5273                }
5274                Devlink::FmsgNestEnd(val) => {
5275                    if last_off == offset {
5276                        stack.push(("FmsgNestEnd", last_off));
5277                        break;
5278                    }
5279                }
5280                Devlink::FmsgObjName(val) => {
5281                    if last_off == offset {
5282                        stack.push(("FmsgObjName", last_off));
5283                        break;
5284                    }
5285                }
5286                Devlink::FmsgObjValueType(val) => {
5287                    if last_off == offset {
5288                        stack.push(("FmsgObjValueType", last_off));
5289                        break;
5290                    }
5291                }
5292                Devlink::HealthReporter(val) => {
5293                    (stack, missing) = val.lookup_attr(offset, missing_type);
5294                    if !stack.is_empty() {
5295                        break;
5296                    }
5297                }
5298                Devlink::HealthReporterName(val) => {
5299                    if last_off == offset {
5300                        stack.push(("HealthReporterName", last_off));
5301                        break;
5302                    }
5303                }
5304                Devlink::HealthReporterState(val) => {
5305                    if last_off == offset {
5306                        stack.push(("HealthReporterState", last_off));
5307                        break;
5308                    }
5309                }
5310                Devlink::HealthReporterErrCount(val) => {
5311                    if last_off == offset {
5312                        stack.push(("HealthReporterErrCount", last_off));
5313                        break;
5314                    }
5315                }
5316                Devlink::HealthReporterRecoverCount(val) => {
5317                    if last_off == offset {
5318                        stack.push(("HealthReporterRecoverCount", last_off));
5319                        break;
5320                    }
5321                }
5322                Devlink::HealthReporterDumpTs(val) => {
5323                    if last_off == offset {
5324                        stack.push(("HealthReporterDumpTs", last_off));
5325                        break;
5326                    }
5327                }
5328                Devlink::HealthReporterGracefulPeriod(val) => {
5329                    if last_off == offset {
5330                        stack.push(("HealthReporterGracefulPeriod", last_off));
5331                        break;
5332                    }
5333                }
5334                Devlink::HealthReporterAutoRecover(val) => {
5335                    if last_off == offset {
5336                        stack.push(("HealthReporterAutoRecover", last_off));
5337                        break;
5338                    }
5339                }
5340                Devlink::FlashUpdateFileName(val) => {
5341                    if last_off == offset {
5342                        stack.push(("FlashUpdateFileName", last_off));
5343                        break;
5344                    }
5345                }
5346                Devlink::FlashUpdateComponent(val) => {
5347                    if last_off == offset {
5348                        stack.push(("FlashUpdateComponent", last_off));
5349                        break;
5350                    }
5351                }
5352                Devlink::FlashUpdateStatusMsg(val) => {
5353                    if last_off == offset {
5354                        stack.push(("FlashUpdateStatusMsg", last_off));
5355                        break;
5356                    }
5357                }
5358                Devlink::FlashUpdateStatusDone(val) => {
5359                    if last_off == offset {
5360                        stack.push(("FlashUpdateStatusDone", last_off));
5361                        break;
5362                    }
5363                }
5364                Devlink::FlashUpdateStatusTotal(val) => {
5365                    if last_off == offset {
5366                        stack.push(("FlashUpdateStatusTotal", last_off));
5367                        break;
5368                    }
5369                }
5370                Devlink::PortPciPfNumber(val) => {
5371                    if last_off == offset {
5372                        stack.push(("PortPciPfNumber", last_off));
5373                        break;
5374                    }
5375                }
5376                Devlink::PortPciVfNumber(val) => {
5377                    if last_off == offset {
5378                        stack.push(("PortPciVfNumber", last_off));
5379                        break;
5380                    }
5381                }
5382                Devlink::Stats(val) => {
5383                    (stack, missing) = val.lookup_attr(offset, missing_type);
5384                    if !stack.is_empty() {
5385                        break;
5386                    }
5387                }
5388                Devlink::TrapName(val) => {
5389                    if last_off == offset {
5390                        stack.push(("TrapName", last_off));
5391                        break;
5392                    }
5393                }
5394                Devlink::TrapAction(val) => {
5395                    if last_off == offset {
5396                        stack.push(("TrapAction", last_off));
5397                        break;
5398                    }
5399                }
5400                Devlink::TrapType(val) => {
5401                    if last_off == offset {
5402                        stack.push(("TrapType", last_off));
5403                        break;
5404                    }
5405                }
5406                Devlink::TrapGeneric(val) => {
5407                    if last_off == offset {
5408                        stack.push(("TrapGeneric", last_off));
5409                        break;
5410                    }
5411                }
5412                Devlink::TrapMetadata(val) => {
5413                    (stack, missing) = val.lookup_attr(offset, missing_type);
5414                    if !stack.is_empty() {
5415                        break;
5416                    }
5417                }
5418                Devlink::TrapGroupName(val) => {
5419                    if last_off == offset {
5420                        stack.push(("TrapGroupName", last_off));
5421                        break;
5422                    }
5423                }
5424                Devlink::ReloadFailed(val) => {
5425                    if last_off == offset {
5426                        stack.push(("ReloadFailed", last_off));
5427                        break;
5428                    }
5429                }
5430                Devlink::HealthReporterDumpTsNs(val) => {
5431                    if last_off == offset {
5432                        stack.push(("HealthReporterDumpTsNs", last_off));
5433                        break;
5434                    }
5435                }
5436                Devlink::NetnsFd(val) => {
5437                    if last_off == offset {
5438                        stack.push(("NetnsFd", last_off));
5439                        break;
5440                    }
5441                }
5442                Devlink::NetnsPid(val) => {
5443                    if last_off == offset {
5444                        stack.push(("NetnsPid", last_off));
5445                        break;
5446                    }
5447                }
5448                Devlink::NetnsId(val) => {
5449                    if last_off == offset {
5450                        stack.push(("NetnsId", last_off));
5451                        break;
5452                    }
5453                }
5454                Devlink::HealthReporterAutoDump(val) => {
5455                    if last_off == offset {
5456                        stack.push(("HealthReporterAutoDump", last_off));
5457                        break;
5458                    }
5459                }
5460                Devlink::TrapPolicerId(val) => {
5461                    if last_off == offset {
5462                        stack.push(("TrapPolicerId", last_off));
5463                        break;
5464                    }
5465                }
5466                Devlink::TrapPolicerRate(val) => {
5467                    if last_off == offset {
5468                        stack.push(("TrapPolicerRate", last_off));
5469                        break;
5470                    }
5471                }
5472                Devlink::TrapPolicerBurst(val) => {
5473                    if last_off == offset {
5474                        stack.push(("TrapPolicerBurst", last_off));
5475                        break;
5476                    }
5477                }
5478                Devlink::PortFunction(val) => {
5479                    (stack, missing) = val.lookup_attr(offset, missing_type);
5480                    if !stack.is_empty() {
5481                        break;
5482                    }
5483                }
5484                Devlink::InfoBoardSerialNumber(val) => {
5485                    if last_off == offset {
5486                        stack.push(("InfoBoardSerialNumber", last_off));
5487                        break;
5488                    }
5489                }
5490                Devlink::PortLanes(val) => {
5491                    if last_off == offset {
5492                        stack.push(("PortLanes", last_off));
5493                        break;
5494                    }
5495                }
5496                Devlink::PortSplittable(val) => {
5497                    if last_off == offset {
5498                        stack.push(("PortSplittable", last_off));
5499                        break;
5500                    }
5501                }
5502                Devlink::PortExternal(val) => {
5503                    if last_off == offset {
5504                        stack.push(("PortExternal", last_off));
5505                        break;
5506                    }
5507                }
5508                Devlink::PortControllerNumber(val) => {
5509                    if last_off == offset {
5510                        stack.push(("PortControllerNumber", last_off));
5511                        break;
5512                    }
5513                }
5514                Devlink::FlashUpdateStatusTimeout(val) => {
5515                    if last_off == offset {
5516                        stack.push(("FlashUpdateStatusTimeout", last_off));
5517                        break;
5518                    }
5519                }
5520                Devlink::FlashUpdateOverwriteMask(val) => {
5521                    if last_off == offset {
5522                        stack.push(("FlashUpdateOverwriteMask", last_off));
5523                        break;
5524                    }
5525                }
5526                Devlink::ReloadAction(val) => {
5527                    if last_off == offset {
5528                        stack.push(("ReloadAction", last_off));
5529                        break;
5530                    }
5531                }
5532                Devlink::ReloadActionsPerformed(val) => {
5533                    if last_off == offset {
5534                        stack.push(("ReloadActionsPerformed", last_off));
5535                        break;
5536                    }
5537                }
5538                Devlink::ReloadLimits(val) => {
5539                    if last_off == offset {
5540                        stack.push(("ReloadLimits", last_off));
5541                        break;
5542                    }
5543                }
5544                Devlink::DevStats(val) => {
5545                    (stack, missing) = val.lookup_attr(offset, missing_type);
5546                    if !stack.is_empty() {
5547                        break;
5548                    }
5549                }
5550                Devlink::ReloadStats(val) => {
5551                    (stack, missing) = val.lookup_attr(offset, missing_type);
5552                    if !stack.is_empty() {
5553                        break;
5554                    }
5555                }
5556                Devlink::ReloadStatsEntry(val) => {
5557                    (stack, missing) = val.lookup_attr(offset, missing_type);
5558                    if !stack.is_empty() {
5559                        break;
5560                    }
5561                }
5562                Devlink::ReloadStatsLimit(val) => {
5563                    if last_off == offset {
5564                        stack.push(("ReloadStatsLimit", last_off));
5565                        break;
5566                    }
5567                }
5568                Devlink::ReloadStatsValue(val) => {
5569                    if last_off == offset {
5570                        stack.push(("ReloadStatsValue", last_off));
5571                        break;
5572                    }
5573                }
5574                Devlink::RemoteReloadStats(val) => {
5575                    (stack, missing) = val.lookup_attr(offset, missing_type);
5576                    if !stack.is_empty() {
5577                        break;
5578                    }
5579                }
5580                Devlink::ReloadActionInfo(val) => {
5581                    (stack, missing) = val.lookup_attr(offset, missing_type);
5582                    if !stack.is_empty() {
5583                        break;
5584                    }
5585                }
5586                Devlink::ReloadActionStats(val) => {
5587                    (stack, missing) = val.lookup_attr(offset, missing_type);
5588                    if !stack.is_empty() {
5589                        break;
5590                    }
5591                }
5592                Devlink::PortPciSfNumber(val) => {
5593                    if last_off == offset {
5594                        stack.push(("PortPciSfNumber", last_off));
5595                        break;
5596                    }
5597                }
5598                Devlink::RateType(val) => {
5599                    if last_off == offset {
5600                        stack.push(("RateType", last_off));
5601                        break;
5602                    }
5603                }
5604                Devlink::RateTxShare(val) => {
5605                    if last_off == offset {
5606                        stack.push(("RateTxShare", last_off));
5607                        break;
5608                    }
5609                }
5610                Devlink::RateTxMax(val) => {
5611                    if last_off == offset {
5612                        stack.push(("RateTxMax", last_off));
5613                        break;
5614                    }
5615                }
5616                Devlink::RateNodeName(val) => {
5617                    if last_off == offset {
5618                        stack.push(("RateNodeName", last_off));
5619                        break;
5620                    }
5621                }
5622                Devlink::RateParentNodeName(val) => {
5623                    if last_off == offset {
5624                        stack.push(("RateParentNodeName", last_off));
5625                        break;
5626                    }
5627                }
5628                Devlink::RegionMaxSnapshots(val) => {
5629                    if last_off == offset {
5630                        stack.push(("RegionMaxSnapshots", last_off));
5631                        break;
5632                    }
5633                }
5634                Devlink::LinecardIndex(val) => {
5635                    if last_off == offset {
5636                        stack.push(("LinecardIndex", last_off));
5637                        break;
5638                    }
5639                }
5640                Devlink::LinecardState(val) => {
5641                    if last_off == offset {
5642                        stack.push(("LinecardState", last_off));
5643                        break;
5644                    }
5645                }
5646                Devlink::LinecardType(val) => {
5647                    if last_off == offset {
5648                        stack.push(("LinecardType", last_off));
5649                        break;
5650                    }
5651                }
5652                Devlink::LinecardSupportedTypes(val) => {
5653                    (stack, missing) = val.lookup_attr(offset, missing_type);
5654                    if !stack.is_empty() {
5655                        break;
5656                    }
5657                }
5658                Devlink::Selftests(val) => {
5659                    (stack, missing) = val.lookup_attr(offset, missing_type);
5660                    if !stack.is_empty() {
5661                        break;
5662                    }
5663                }
5664                Devlink::RateTxPriority(val) => {
5665                    if last_off == offset {
5666                        stack.push(("RateTxPriority", last_off));
5667                        break;
5668                    }
5669                }
5670                Devlink::RateTxWeight(val) => {
5671                    if last_off == offset {
5672                        stack.push(("RateTxWeight", last_off));
5673                        break;
5674                    }
5675                }
5676                Devlink::RegionDirect(val) => {
5677                    if last_off == offset {
5678                        stack.push(("RegionDirect", last_off));
5679                        break;
5680                    }
5681                }
5682                Devlink::RateTcBws(val) => {
5683                    (stack, missing) = val.lookup_attr(offset, missing_type);
5684                    if !stack.is_empty() {
5685                        break;
5686                    }
5687                }
5688                Devlink::HealthReporterBurstPeriod(val) => {
5689                    if last_off == offset {
5690                        stack.push(("HealthReporterBurstPeriod", last_off));
5691                        break;
5692                    }
5693                }
5694                Devlink::ParamResetDefault(val) => {
5695                    if last_off == offset {
5696                        stack.push(("ParamResetDefault", last_off));
5697                        break;
5698                    }
5699                }
5700                _ => {}
5701            };
5702            last_off = cur + attrs.pos;
5703        }
5704        if !stack.is_empty() {
5705            stack.push(("Devlink", cur));
5706        }
5707        (stack, missing)
5708    }
5709}
5710#[derive(Clone)]
5711pub enum DlDevStats<'a> {
5712    ReloadStats(IterableDlReloadStats<'a>),
5713    RemoteReloadStats(IterableDlReloadStats<'a>),
5714}
5715impl<'a> IterableDlDevStats<'a> {
5716    pub fn get_reload_stats(&self) -> Result<IterableDlReloadStats<'a>, ErrorContext> {
5717        let mut iter = self.clone();
5718        iter.pos = 0;
5719        for attr in iter {
5720            if let DlDevStats::ReloadStats(val) = attr? {
5721                return Ok(val);
5722            }
5723        }
5724        Err(ErrorContext::new_missing(
5725            "DlDevStats",
5726            "ReloadStats",
5727            self.orig_loc,
5728            self.buf.as_ptr() as usize,
5729        ))
5730    }
5731    pub fn get_remote_reload_stats(&self) -> Result<IterableDlReloadStats<'a>, ErrorContext> {
5732        let mut iter = self.clone();
5733        iter.pos = 0;
5734        for attr in iter {
5735            if let DlDevStats::RemoteReloadStats(val) = attr? {
5736                return Ok(val);
5737            }
5738        }
5739        Err(ErrorContext::new_missing(
5740            "DlDevStats",
5741            "RemoteReloadStats",
5742            self.orig_loc,
5743            self.buf.as_ptr() as usize,
5744        ))
5745    }
5746}
5747impl DlDevStats<'_> {
5748    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDevStats<'a> {
5749        IterableDlDevStats::with_loc(buf, buf.as_ptr() as usize)
5750    }
5751    fn attr_from_type(r#type: u16) -> Option<&'static str> {
5752        Devlink::attr_from_type(r#type)
5753    }
5754}
5755#[derive(Clone, Copy, Default)]
5756pub struct IterableDlDevStats<'a> {
5757    buf: &'a [u8],
5758    pos: usize,
5759    orig_loc: usize,
5760}
5761impl<'a> IterableDlDevStats<'a> {
5762    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5763        Self {
5764            buf,
5765            pos: 0,
5766            orig_loc,
5767        }
5768    }
5769    pub fn get_buf(&self) -> &'a [u8] {
5770        self.buf
5771    }
5772}
5773impl<'a> Iterator for IterableDlDevStats<'a> {
5774    type Item = Result<DlDevStats<'a>, ErrorContext>;
5775    fn next(&mut self) -> Option<Self::Item> {
5776        let pos = self.pos;
5777        let mut r#type;
5778        loop {
5779            r#type = None;
5780            if self.buf.len() == self.pos {
5781                return None;
5782            }
5783            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5784                break;
5785            };
5786            r#type = Some(header.r#type);
5787            let res = match header.r#type {
5788                157u16 => DlDevStats::ReloadStats({
5789                    let res = Some(IterableDlReloadStats::with_loc(next, self.orig_loc));
5790                    let Some(val) = res else { break };
5791                    val
5792                }),
5793                161u16 => DlDevStats::RemoteReloadStats({
5794                    let res = Some(IterableDlReloadStats::with_loc(next, self.orig_loc));
5795                    let Some(val) = res else { break };
5796                    val
5797                }),
5798                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5799                n => continue,
5800            };
5801            return Some(Ok(res));
5802        }
5803        Some(Err(ErrorContext::new(
5804            "DlDevStats",
5805            r#type.and_then(|t| DlDevStats::attr_from_type(t)),
5806            self.orig_loc,
5807            self.buf.as_ptr().wrapping_add(pos) as usize,
5808        )))
5809    }
5810}
5811impl<'a> std::fmt::Debug for IterableDlDevStats<'_> {
5812    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5813        let mut fmt = f.debug_struct("DlDevStats");
5814        for attr in self.clone() {
5815            let attr = match attr {
5816                Ok(a) => a,
5817                Err(err) => {
5818                    fmt.finish()?;
5819                    f.write_str("Err(")?;
5820                    err.fmt(f)?;
5821                    return f.write_str(")");
5822                }
5823            };
5824            match attr {
5825                DlDevStats::ReloadStats(val) => fmt.field("ReloadStats", &val),
5826                DlDevStats::RemoteReloadStats(val) => fmt.field("RemoteReloadStats", &val),
5827            };
5828        }
5829        fmt.finish()
5830    }
5831}
5832impl IterableDlDevStats<'_> {
5833    pub fn lookup_attr(
5834        &self,
5835        offset: usize,
5836        missing_type: Option<u16>,
5837    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5838        let mut stack = Vec::new();
5839        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5840        if missing_type.is_some() && cur == offset {
5841            stack.push(("DlDevStats", offset));
5842            return (
5843                stack,
5844                missing_type.and_then(|t| DlDevStats::attr_from_type(t)),
5845            );
5846        }
5847        if cur > offset || cur + self.buf.len() < offset {
5848            return (stack, None);
5849        }
5850        let mut attrs = self.clone();
5851        let mut last_off = cur + attrs.pos;
5852        let mut missing = None;
5853        while let Some(attr) = attrs.next() {
5854            let Ok(attr) = attr else { break };
5855            match attr {
5856                DlDevStats::ReloadStats(val) => {
5857                    (stack, missing) = val.lookup_attr(offset, missing_type);
5858                    if !stack.is_empty() {
5859                        break;
5860                    }
5861                }
5862                DlDevStats::RemoteReloadStats(val) => {
5863                    (stack, missing) = val.lookup_attr(offset, missing_type);
5864                    if !stack.is_empty() {
5865                        break;
5866                    }
5867                }
5868                _ => {}
5869            };
5870            last_off = cur + attrs.pos;
5871        }
5872        if !stack.is_empty() {
5873            stack.push(("DlDevStats", cur));
5874        }
5875        (stack, missing)
5876    }
5877}
5878#[derive(Clone)]
5879pub enum DlReloadStats<'a> {
5880    #[doc = "Attribute may repeat multiple times (treat it as array)"]
5881    ReloadActionInfo(IterableDlReloadActInfo<'a>),
5882}
5883impl<'a> IterableDlReloadStats<'a> {
5884    #[doc = "Attribute may repeat multiple times (treat it as array)"]
5885    pub fn get_reload_action_info(
5886        &self,
5887    ) -> MultiAttrIterable<Self, DlReloadStats<'a>, IterableDlReloadActInfo<'a>> {
5888        MultiAttrIterable::new(self.clone(), |variant| {
5889            if let DlReloadStats::ReloadActionInfo(val) = variant {
5890                Some(val)
5891            } else {
5892                None
5893            }
5894        })
5895    }
5896}
5897impl DlReloadStats<'_> {
5898    pub fn new<'a>(buf: &'a [u8]) -> IterableDlReloadStats<'a> {
5899        IterableDlReloadStats::with_loc(buf, buf.as_ptr() as usize)
5900    }
5901    fn attr_from_type(r#type: u16) -> Option<&'static str> {
5902        Devlink::attr_from_type(r#type)
5903    }
5904}
5905#[derive(Clone, Copy, Default)]
5906pub struct IterableDlReloadStats<'a> {
5907    buf: &'a [u8],
5908    pos: usize,
5909    orig_loc: usize,
5910}
5911impl<'a> IterableDlReloadStats<'a> {
5912    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5913        Self {
5914            buf,
5915            pos: 0,
5916            orig_loc,
5917        }
5918    }
5919    pub fn get_buf(&self) -> &'a [u8] {
5920        self.buf
5921    }
5922}
5923impl<'a> Iterator for IterableDlReloadStats<'a> {
5924    type Item = Result<DlReloadStats<'a>, ErrorContext>;
5925    fn next(&mut self) -> Option<Self::Item> {
5926        let pos = self.pos;
5927        let mut r#type;
5928        loop {
5929            r#type = None;
5930            if self.buf.len() == self.pos {
5931                return None;
5932            }
5933            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5934                break;
5935            };
5936            r#type = Some(header.r#type);
5937            let res = match header.r#type {
5938                162u16 => DlReloadStats::ReloadActionInfo({
5939                    let res = Some(IterableDlReloadActInfo::with_loc(next, self.orig_loc));
5940                    let Some(val) = res else { break };
5941                    val
5942                }),
5943                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5944                n => continue,
5945            };
5946            return Some(Ok(res));
5947        }
5948        Some(Err(ErrorContext::new(
5949            "DlReloadStats",
5950            r#type.and_then(|t| DlReloadStats::attr_from_type(t)),
5951            self.orig_loc,
5952            self.buf.as_ptr().wrapping_add(pos) as usize,
5953        )))
5954    }
5955}
5956impl<'a> std::fmt::Debug for IterableDlReloadStats<'_> {
5957    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5958        let mut fmt = f.debug_struct("DlReloadStats");
5959        for attr in self.clone() {
5960            let attr = match attr {
5961                Ok(a) => a,
5962                Err(err) => {
5963                    fmt.finish()?;
5964                    f.write_str("Err(")?;
5965                    err.fmt(f)?;
5966                    return f.write_str(")");
5967                }
5968            };
5969            match attr {
5970                DlReloadStats::ReloadActionInfo(val) => fmt.field("ReloadActionInfo", &val),
5971            };
5972        }
5973        fmt.finish()
5974    }
5975}
5976impl IterableDlReloadStats<'_> {
5977    pub fn lookup_attr(
5978        &self,
5979        offset: usize,
5980        missing_type: Option<u16>,
5981    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5982        let mut stack = Vec::new();
5983        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5984        if missing_type.is_some() && cur == offset {
5985            stack.push(("DlReloadStats", offset));
5986            return (
5987                stack,
5988                missing_type.and_then(|t| DlReloadStats::attr_from_type(t)),
5989            );
5990        }
5991        if cur > offset || cur + self.buf.len() < offset {
5992            return (stack, None);
5993        }
5994        let mut attrs = self.clone();
5995        let mut last_off = cur + attrs.pos;
5996        let mut missing = None;
5997        while let Some(attr) = attrs.next() {
5998            let Ok(attr) = attr else { break };
5999            match attr {
6000                DlReloadStats::ReloadActionInfo(val) => {
6001                    (stack, missing) = val.lookup_attr(offset, missing_type);
6002                    if !stack.is_empty() {
6003                        break;
6004                    }
6005                }
6006                _ => {}
6007            };
6008            last_off = cur + attrs.pos;
6009        }
6010        if !stack.is_empty() {
6011            stack.push(("DlReloadStats", cur));
6012        }
6013        (stack, missing)
6014    }
6015}
6016#[derive(Clone)]
6017pub enum DlReloadActInfo<'a> {
6018    #[doc = "Associated type: [`ReloadAction`] (enum)"]
6019    ReloadAction(u8),
6020    #[doc = "Attribute may repeat multiple times (treat it as array)"]
6021    ReloadActionStats(IterableDlReloadActStats<'a>),
6022}
6023impl<'a> IterableDlReloadActInfo<'a> {
6024    #[doc = "Associated type: [`ReloadAction`] (enum)"]
6025    pub fn get_reload_action(&self) -> Result<u8, ErrorContext> {
6026        let mut iter = self.clone();
6027        iter.pos = 0;
6028        for attr in iter {
6029            if let DlReloadActInfo::ReloadAction(val) = attr? {
6030                return Ok(val);
6031            }
6032        }
6033        Err(ErrorContext::new_missing(
6034            "DlReloadActInfo",
6035            "ReloadAction",
6036            self.orig_loc,
6037            self.buf.as_ptr() as usize,
6038        ))
6039    }
6040    #[doc = "Attribute may repeat multiple times (treat it as array)"]
6041    pub fn get_reload_action_stats(
6042        &self,
6043    ) -> MultiAttrIterable<Self, DlReloadActInfo<'a>, IterableDlReloadActStats<'a>> {
6044        MultiAttrIterable::new(self.clone(), |variant| {
6045            if let DlReloadActInfo::ReloadActionStats(val) = variant {
6046                Some(val)
6047            } else {
6048                None
6049            }
6050        })
6051    }
6052}
6053impl DlReloadActInfo<'_> {
6054    pub fn new<'a>(buf: &'a [u8]) -> IterableDlReloadActInfo<'a> {
6055        IterableDlReloadActInfo::with_loc(buf, buf.as_ptr() as usize)
6056    }
6057    fn attr_from_type(r#type: u16) -> Option<&'static str> {
6058        Devlink::attr_from_type(r#type)
6059    }
6060}
6061#[derive(Clone, Copy, Default)]
6062pub struct IterableDlReloadActInfo<'a> {
6063    buf: &'a [u8],
6064    pos: usize,
6065    orig_loc: usize,
6066}
6067impl<'a> IterableDlReloadActInfo<'a> {
6068    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6069        Self {
6070            buf,
6071            pos: 0,
6072            orig_loc,
6073        }
6074    }
6075    pub fn get_buf(&self) -> &'a [u8] {
6076        self.buf
6077    }
6078}
6079impl<'a> Iterator for IterableDlReloadActInfo<'a> {
6080    type Item = Result<DlReloadActInfo<'a>, ErrorContext>;
6081    fn next(&mut self) -> Option<Self::Item> {
6082        let pos = self.pos;
6083        let mut r#type;
6084        loop {
6085            r#type = None;
6086            if self.buf.len() == self.pos {
6087                return None;
6088            }
6089            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6090                break;
6091            };
6092            r#type = Some(header.r#type);
6093            let res = match header.r#type {
6094                153u16 => DlReloadActInfo::ReloadAction({
6095                    let res = parse_u8(next);
6096                    let Some(val) = res else { break };
6097                    val
6098                }),
6099                163u16 => DlReloadActInfo::ReloadActionStats({
6100                    let res = Some(IterableDlReloadActStats::with_loc(next, self.orig_loc));
6101                    let Some(val) = res else { break };
6102                    val
6103                }),
6104                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6105                n => continue,
6106            };
6107            return Some(Ok(res));
6108        }
6109        Some(Err(ErrorContext::new(
6110            "DlReloadActInfo",
6111            r#type.and_then(|t| DlReloadActInfo::attr_from_type(t)),
6112            self.orig_loc,
6113            self.buf.as_ptr().wrapping_add(pos) as usize,
6114        )))
6115    }
6116}
6117impl<'a> std::fmt::Debug for IterableDlReloadActInfo<'_> {
6118    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6119        let mut fmt = f.debug_struct("DlReloadActInfo");
6120        for attr in self.clone() {
6121            let attr = match attr {
6122                Ok(a) => a,
6123                Err(err) => {
6124                    fmt.finish()?;
6125                    f.write_str("Err(")?;
6126                    err.fmt(f)?;
6127                    return f.write_str(")");
6128                }
6129            };
6130            match attr {
6131                DlReloadActInfo::ReloadAction(val) => fmt.field(
6132                    "ReloadAction",
6133                    &FormatEnum(val.into(), ReloadAction::from_value),
6134                ),
6135                DlReloadActInfo::ReloadActionStats(val) => fmt.field("ReloadActionStats", &val),
6136            };
6137        }
6138        fmt.finish()
6139    }
6140}
6141impl IterableDlReloadActInfo<'_> {
6142    pub fn lookup_attr(
6143        &self,
6144        offset: usize,
6145        missing_type: Option<u16>,
6146    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6147        let mut stack = Vec::new();
6148        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6149        if missing_type.is_some() && cur == offset {
6150            stack.push(("DlReloadActInfo", offset));
6151            return (
6152                stack,
6153                missing_type.and_then(|t| DlReloadActInfo::attr_from_type(t)),
6154            );
6155        }
6156        if cur > offset || cur + self.buf.len() < offset {
6157            return (stack, None);
6158        }
6159        let mut attrs = self.clone();
6160        let mut last_off = cur + attrs.pos;
6161        let mut missing = None;
6162        while let Some(attr) = attrs.next() {
6163            let Ok(attr) = attr else { break };
6164            match attr {
6165                DlReloadActInfo::ReloadAction(val) => {
6166                    if last_off == offset {
6167                        stack.push(("ReloadAction", last_off));
6168                        break;
6169                    }
6170                }
6171                DlReloadActInfo::ReloadActionStats(val) => {
6172                    (stack, missing) = val.lookup_attr(offset, missing_type);
6173                    if !stack.is_empty() {
6174                        break;
6175                    }
6176                }
6177                _ => {}
6178            };
6179            last_off = cur + attrs.pos;
6180        }
6181        if !stack.is_empty() {
6182            stack.push(("DlReloadActInfo", cur));
6183        }
6184        (stack, missing)
6185    }
6186}
6187#[derive(Clone)]
6188pub enum DlReloadActStats<'a> {
6189    #[doc = "Attribute may repeat multiple times (treat it as array)"]
6190    ReloadStatsEntry(IterableDlReloadStatsEntry<'a>),
6191}
6192impl<'a> IterableDlReloadActStats<'a> {
6193    #[doc = "Attribute may repeat multiple times (treat it as array)"]
6194    pub fn get_reload_stats_entry(
6195        &self,
6196    ) -> MultiAttrIterable<Self, DlReloadActStats<'a>, IterableDlReloadStatsEntry<'a>> {
6197        MultiAttrIterable::new(self.clone(), |variant| {
6198            if let DlReloadActStats::ReloadStatsEntry(val) = variant {
6199                Some(val)
6200            } else {
6201                None
6202            }
6203        })
6204    }
6205}
6206impl DlReloadActStats<'_> {
6207    pub fn new<'a>(buf: &'a [u8]) -> IterableDlReloadActStats<'a> {
6208        IterableDlReloadActStats::with_loc(buf, buf.as_ptr() as usize)
6209    }
6210    fn attr_from_type(r#type: u16) -> Option<&'static str> {
6211        Devlink::attr_from_type(r#type)
6212    }
6213}
6214#[derive(Clone, Copy, Default)]
6215pub struct IterableDlReloadActStats<'a> {
6216    buf: &'a [u8],
6217    pos: usize,
6218    orig_loc: usize,
6219}
6220impl<'a> IterableDlReloadActStats<'a> {
6221    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6222        Self {
6223            buf,
6224            pos: 0,
6225            orig_loc,
6226        }
6227    }
6228    pub fn get_buf(&self) -> &'a [u8] {
6229        self.buf
6230    }
6231}
6232impl<'a> Iterator for IterableDlReloadActStats<'a> {
6233    type Item = Result<DlReloadActStats<'a>, ErrorContext>;
6234    fn next(&mut self) -> Option<Self::Item> {
6235        let pos = self.pos;
6236        let mut r#type;
6237        loop {
6238            r#type = None;
6239            if self.buf.len() == self.pos {
6240                return None;
6241            }
6242            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6243                break;
6244            };
6245            r#type = Some(header.r#type);
6246            let res = match header.r#type {
6247                158u16 => DlReloadActStats::ReloadStatsEntry({
6248                    let res = Some(IterableDlReloadStatsEntry::with_loc(next, self.orig_loc));
6249                    let Some(val) = res else { break };
6250                    val
6251                }),
6252                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6253                n => continue,
6254            };
6255            return Some(Ok(res));
6256        }
6257        Some(Err(ErrorContext::new(
6258            "DlReloadActStats",
6259            r#type.and_then(|t| DlReloadActStats::attr_from_type(t)),
6260            self.orig_loc,
6261            self.buf.as_ptr().wrapping_add(pos) as usize,
6262        )))
6263    }
6264}
6265impl<'a> std::fmt::Debug for IterableDlReloadActStats<'_> {
6266    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6267        let mut fmt = f.debug_struct("DlReloadActStats");
6268        for attr in self.clone() {
6269            let attr = match attr {
6270                Ok(a) => a,
6271                Err(err) => {
6272                    fmt.finish()?;
6273                    f.write_str("Err(")?;
6274                    err.fmt(f)?;
6275                    return f.write_str(")");
6276                }
6277            };
6278            match attr {
6279                DlReloadActStats::ReloadStatsEntry(val) => fmt.field("ReloadStatsEntry", &val),
6280            };
6281        }
6282        fmt.finish()
6283    }
6284}
6285impl IterableDlReloadActStats<'_> {
6286    pub fn lookup_attr(
6287        &self,
6288        offset: usize,
6289        missing_type: Option<u16>,
6290    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6291        let mut stack = Vec::new();
6292        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6293        if missing_type.is_some() && cur == offset {
6294            stack.push(("DlReloadActStats", offset));
6295            return (
6296                stack,
6297                missing_type.and_then(|t| DlReloadActStats::attr_from_type(t)),
6298            );
6299        }
6300        if cur > offset || cur + self.buf.len() < offset {
6301            return (stack, None);
6302        }
6303        let mut attrs = self.clone();
6304        let mut last_off = cur + attrs.pos;
6305        let mut missing = None;
6306        while let Some(attr) = attrs.next() {
6307            let Ok(attr) = attr else { break };
6308            match attr {
6309                DlReloadActStats::ReloadStatsEntry(val) => {
6310                    (stack, missing) = val.lookup_attr(offset, missing_type);
6311                    if !stack.is_empty() {
6312                        break;
6313                    }
6314                }
6315                _ => {}
6316            };
6317            last_off = cur + attrs.pos;
6318        }
6319        if !stack.is_empty() {
6320            stack.push(("DlReloadActStats", cur));
6321        }
6322        (stack, missing)
6323    }
6324}
6325#[derive(Clone)]
6326pub enum DlReloadStatsEntry {
6327    ReloadStatsLimit(u8),
6328    ReloadStatsValue(u32),
6329}
6330impl<'a> IterableDlReloadStatsEntry<'a> {
6331    pub fn get_reload_stats_limit(&self) -> Result<u8, ErrorContext> {
6332        let mut iter = self.clone();
6333        iter.pos = 0;
6334        for attr in iter {
6335            if let DlReloadStatsEntry::ReloadStatsLimit(val) = attr? {
6336                return Ok(val);
6337            }
6338        }
6339        Err(ErrorContext::new_missing(
6340            "DlReloadStatsEntry",
6341            "ReloadStatsLimit",
6342            self.orig_loc,
6343            self.buf.as_ptr() as usize,
6344        ))
6345    }
6346    pub fn get_reload_stats_value(&self) -> Result<u32, ErrorContext> {
6347        let mut iter = self.clone();
6348        iter.pos = 0;
6349        for attr in iter {
6350            if let DlReloadStatsEntry::ReloadStatsValue(val) = attr? {
6351                return Ok(val);
6352            }
6353        }
6354        Err(ErrorContext::new_missing(
6355            "DlReloadStatsEntry",
6356            "ReloadStatsValue",
6357            self.orig_loc,
6358            self.buf.as_ptr() as usize,
6359        ))
6360    }
6361}
6362impl DlReloadStatsEntry {
6363    pub fn new<'a>(buf: &'a [u8]) -> IterableDlReloadStatsEntry<'a> {
6364        IterableDlReloadStatsEntry::with_loc(buf, buf.as_ptr() as usize)
6365    }
6366    fn attr_from_type(r#type: u16) -> Option<&'static str> {
6367        Devlink::attr_from_type(r#type)
6368    }
6369}
6370#[derive(Clone, Copy, Default)]
6371pub struct IterableDlReloadStatsEntry<'a> {
6372    buf: &'a [u8],
6373    pos: usize,
6374    orig_loc: usize,
6375}
6376impl<'a> IterableDlReloadStatsEntry<'a> {
6377    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6378        Self {
6379            buf,
6380            pos: 0,
6381            orig_loc,
6382        }
6383    }
6384    pub fn get_buf(&self) -> &'a [u8] {
6385        self.buf
6386    }
6387}
6388impl<'a> Iterator for IterableDlReloadStatsEntry<'a> {
6389    type Item = Result<DlReloadStatsEntry, ErrorContext>;
6390    fn next(&mut self) -> Option<Self::Item> {
6391        let pos = self.pos;
6392        let mut r#type;
6393        loop {
6394            r#type = None;
6395            if self.buf.len() == self.pos {
6396                return None;
6397            }
6398            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6399                break;
6400            };
6401            r#type = Some(header.r#type);
6402            let res = match header.r#type {
6403                159u16 => DlReloadStatsEntry::ReloadStatsLimit({
6404                    let res = parse_u8(next);
6405                    let Some(val) = res else { break };
6406                    val
6407                }),
6408                160u16 => DlReloadStatsEntry::ReloadStatsValue({
6409                    let res = parse_u32(next);
6410                    let Some(val) = res else { break };
6411                    val
6412                }),
6413                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6414                n => continue,
6415            };
6416            return Some(Ok(res));
6417        }
6418        Some(Err(ErrorContext::new(
6419            "DlReloadStatsEntry",
6420            r#type.and_then(|t| DlReloadStatsEntry::attr_from_type(t)),
6421            self.orig_loc,
6422            self.buf.as_ptr().wrapping_add(pos) as usize,
6423        )))
6424    }
6425}
6426impl std::fmt::Debug for IterableDlReloadStatsEntry<'_> {
6427    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6428        let mut fmt = f.debug_struct("DlReloadStatsEntry");
6429        for attr in self.clone() {
6430            let attr = match attr {
6431                Ok(a) => a,
6432                Err(err) => {
6433                    fmt.finish()?;
6434                    f.write_str("Err(")?;
6435                    err.fmt(f)?;
6436                    return f.write_str(")");
6437                }
6438            };
6439            match attr {
6440                DlReloadStatsEntry::ReloadStatsLimit(val) => fmt.field("ReloadStatsLimit", &val),
6441                DlReloadStatsEntry::ReloadStatsValue(val) => fmt.field("ReloadStatsValue", &val),
6442            };
6443        }
6444        fmt.finish()
6445    }
6446}
6447impl IterableDlReloadStatsEntry<'_> {
6448    pub fn lookup_attr(
6449        &self,
6450        offset: usize,
6451        missing_type: Option<u16>,
6452    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6453        let mut stack = Vec::new();
6454        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6455        if missing_type.is_some() && cur == offset {
6456            stack.push(("DlReloadStatsEntry", offset));
6457            return (
6458                stack,
6459                missing_type.and_then(|t| DlReloadStatsEntry::attr_from_type(t)),
6460            );
6461        }
6462        if cur > offset || cur + self.buf.len() < offset {
6463            return (stack, None);
6464        }
6465        let mut attrs = self.clone();
6466        let mut last_off = cur + attrs.pos;
6467        while let Some(attr) = attrs.next() {
6468            let Ok(attr) = attr else { break };
6469            match attr {
6470                DlReloadStatsEntry::ReloadStatsLimit(val) => {
6471                    if last_off == offset {
6472                        stack.push(("ReloadStatsLimit", last_off));
6473                        break;
6474                    }
6475                }
6476                DlReloadStatsEntry::ReloadStatsValue(val) => {
6477                    if last_off == offset {
6478                        stack.push(("ReloadStatsValue", last_off));
6479                        break;
6480                    }
6481                }
6482                _ => {}
6483            };
6484            last_off = cur + attrs.pos;
6485        }
6486        if !stack.is_empty() {
6487            stack.push(("DlReloadStatsEntry", cur));
6488        }
6489        (stack, None)
6490    }
6491}
6492#[derive(Clone)]
6493pub enum DlInfoVersion<'a> {
6494    InfoVersionName(&'a CStr),
6495    InfoVersionValue(&'a CStr),
6496}
6497impl<'a> IterableDlInfoVersion<'a> {
6498    pub fn get_info_version_name(&self) -> Result<&'a CStr, ErrorContext> {
6499        let mut iter = self.clone();
6500        iter.pos = 0;
6501        for attr in iter {
6502            if let DlInfoVersion::InfoVersionName(val) = attr? {
6503                return Ok(val);
6504            }
6505        }
6506        Err(ErrorContext::new_missing(
6507            "DlInfoVersion",
6508            "InfoVersionName",
6509            self.orig_loc,
6510            self.buf.as_ptr() as usize,
6511        ))
6512    }
6513    pub fn get_info_version_value(&self) -> Result<&'a CStr, ErrorContext> {
6514        let mut iter = self.clone();
6515        iter.pos = 0;
6516        for attr in iter {
6517            if let DlInfoVersion::InfoVersionValue(val) = attr? {
6518                return Ok(val);
6519            }
6520        }
6521        Err(ErrorContext::new_missing(
6522            "DlInfoVersion",
6523            "InfoVersionValue",
6524            self.orig_loc,
6525            self.buf.as_ptr() as usize,
6526        ))
6527    }
6528}
6529impl DlInfoVersion<'_> {
6530    pub fn new<'a>(buf: &'a [u8]) -> IterableDlInfoVersion<'a> {
6531        IterableDlInfoVersion::with_loc(buf, buf.as_ptr() as usize)
6532    }
6533    fn attr_from_type(r#type: u16) -> Option<&'static str> {
6534        Devlink::attr_from_type(r#type)
6535    }
6536}
6537#[derive(Clone, Copy, Default)]
6538pub struct IterableDlInfoVersion<'a> {
6539    buf: &'a [u8],
6540    pos: usize,
6541    orig_loc: usize,
6542}
6543impl<'a> IterableDlInfoVersion<'a> {
6544    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6545        Self {
6546            buf,
6547            pos: 0,
6548            orig_loc,
6549        }
6550    }
6551    pub fn get_buf(&self) -> &'a [u8] {
6552        self.buf
6553    }
6554}
6555impl<'a> Iterator for IterableDlInfoVersion<'a> {
6556    type Item = Result<DlInfoVersion<'a>, ErrorContext>;
6557    fn next(&mut self) -> Option<Self::Item> {
6558        let pos = self.pos;
6559        let mut r#type;
6560        loop {
6561            r#type = None;
6562            if self.buf.len() == self.pos {
6563                return None;
6564            }
6565            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6566                break;
6567            };
6568            r#type = Some(header.r#type);
6569            let res = match header.r#type {
6570                103u16 => DlInfoVersion::InfoVersionName({
6571                    let res = CStr::from_bytes_with_nul(next).ok();
6572                    let Some(val) = res else { break };
6573                    val
6574                }),
6575                104u16 => DlInfoVersion::InfoVersionValue({
6576                    let res = CStr::from_bytes_with_nul(next).ok();
6577                    let Some(val) = res else { break };
6578                    val
6579                }),
6580                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6581                n => continue,
6582            };
6583            return Some(Ok(res));
6584        }
6585        Some(Err(ErrorContext::new(
6586            "DlInfoVersion",
6587            r#type.and_then(|t| DlInfoVersion::attr_from_type(t)),
6588            self.orig_loc,
6589            self.buf.as_ptr().wrapping_add(pos) as usize,
6590        )))
6591    }
6592}
6593impl<'a> std::fmt::Debug for IterableDlInfoVersion<'_> {
6594    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6595        let mut fmt = f.debug_struct("DlInfoVersion");
6596        for attr in self.clone() {
6597            let attr = match attr {
6598                Ok(a) => a,
6599                Err(err) => {
6600                    fmt.finish()?;
6601                    f.write_str("Err(")?;
6602                    err.fmt(f)?;
6603                    return f.write_str(")");
6604                }
6605            };
6606            match attr {
6607                DlInfoVersion::InfoVersionName(val) => fmt.field("InfoVersionName", &val),
6608                DlInfoVersion::InfoVersionValue(val) => fmt.field("InfoVersionValue", &val),
6609            };
6610        }
6611        fmt.finish()
6612    }
6613}
6614impl IterableDlInfoVersion<'_> {
6615    pub fn lookup_attr(
6616        &self,
6617        offset: usize,
6618        missing_type: Option<u16>,
6619    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6620        let mut stack = Vec::new();
6621        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6622        if missing_type.is_some() && cur == offset {
6623            stack.push(("DlInfoVersion", offset));
6624            return (
6625                stack,
6626                missing_type.and_then(|t| DlInfoVersion::attr_from_type(t)),
6627            );
6628        }
6629        if cur > offset || cur + self.buf.len() < offset {
6630            return (stack, None);
6631        }
6632        let mut attrs = self.clone();
6633        let mut last_off = cur + attrs.pos;
6634        while let Some(attr) = attrs.next() {
6635            let Ok(attr) = attr else { break };
6636            match attr {
6637                DlInfoVersion::InfoVersionName(val) => {
6638                    if last_off == offset {
6639                        stack.push(("InfoVersionName", last_off));
6640                        break;
6641                    }
6642                }
6643                DlInfoVersion::InfoVersionValue(val) => {
6644                    if last_off == offset {
6645                        stack.push(("InfoVersionValue", last_off));
6646                        break;
6647                    }
6648                }
6649                _ => {}
6650            };
6651            last_off = cur + attrs.pos;
6652        }
6653        if !stack.is_empty() {
6654            stack.push(("DlInfoVersion", cur));
6655        }
6656        (stack, None)
6657    }
6658}
6659#[derive(Clone)]
6660pub enum DlPortFunction<'a> {
6661    HwAddr(&'a [u8]),
6662    #[doc = "Associated type: [`PortFnState`] (enum)"]
6663    State(u8),
6664    #[doc = "Associated type: [`PortFnOpstate`] (enum)"]
6665    Opstate(u8),
6666    #[doc = "Associated type: [`PortFnAttrCap`] (1 bit per enumeration)"]
6667    Caps(BuiltinBitfield32),
6668}
6669impl<'a> IterableDlPortFunction<'a> {
6670    pub fn get_hw_addr(&self) -> Result<&'a [u8], ErrorContext> {
6671        let mut iter = self.clone();
6672        iter.pos = 0;
6673        for attr in iter {
6674            if let DlPortFunction::HwAddr(val) = attr? {
6675                return Ok(val);
6676            }
6677        }
6678        Err(ErrorContext::new_missing(
6679            "DlPortFunction",
6680            "HwAddr",
6681            self.orig_loc,
6682            self.buf.as_ptr() as usize,
6683        ))
6684    }
6685    #[doc = "Associated type: [`PortFnState`] (enum)"]
6686    pub fn get_state(&self) -> Result<u8, ErrorContext> {
6687        let mut iter = self.clone();
6688        iter.pos = 0;
6689        for attr in iter {
6690            if let DlPortFunction::State(val) = attr? {
6691                return Ok(val);
6692            }
6693        }
6694        Err(ErrorContext::new_missing(
6695            "DlPortFunction",
6696            "State",
6697            self.orig_loc,
6698            self.buf.as_ptr() as usize,
6699        ))
6700    }
6701    #[doc = "Associated type: [`PortFnOpstate`] (enum)"]
6702    pub fn get_opstate(&self) -> Result<u8, ErrorContext> {
6703        let mut iter = self.clone();
6704        iter.pos = 0;
6705        for attr in iter {
6706            if let DlPortFunction::Opstate(val) = attr? {
6707                return Ok(val);
6708            }
6709        }
6710        Err(ErrorContext::new_missing(
6711            "DlPortFunction",
6712            "Opstate",
6713            self.orig_loc,
6714            self.buf.as_ptr() as usize,
6715        ))
6716    }
6717    #[doc = "Associated type: [`PortFnAttrCap`] (1 bit per enumeration)"]
6718    pub fn get_caps(&self) -> Result<BuiltinBitfield32, ErrorContext> {
6719        let mut iter = self.clone();
6720        iter.pos = 0;
6721        for attr in iter {
6722            if let DlPortFunction::Caps(val) = attr? {
6723                return Ok(val);
6724            }
6725        }
6726        Err(ErrorContext::new_missing(
6727            "DlPortFunction",
6728            "Caps",
6729            self.orig_loc,
6730            self.buf.as_ptr() as usize,
6731        ))
6732    }
6733}
6734impl DlPortFunction<'_> {
6735    pub fn new<'a>(buf: &'a [u8]) -> IterableDlPortFunction<'a> {
6736        IterableDlPortFunction::with_loc(buf, buf.as_ptr() as usize)
6737    }
6738    fn attr_from_type(r#type: u16) -> Option<&'static str> {
6739        let res = match r#type {
6740            1u16 => "HwAddr",
6741            2u16 => "State",
6742            3u16 => "Opstate",
6743            4u16 => "Caps",
6744            _ => return None,
6745        };
6746        Some(res)
6747    }
6748}
6749#[derive(Clone, Copy, Default)]
6750pub struct IterableDlPortFunction<'a> {
6751    buf: &'a [u8],
6752    pos: usize,
6753    orig_loc: usize,
6754}
6755impl<'a> IterableDlPortFunction<'a> {
6756    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6757        Self {
6758            buf,
6759            pos: 0,
6760            orig_loc,
6761        }
6762    }
6763    pub fn get_buf(&self) -> &'a [u8] {
6764        self.buf
6765    }
6766}
6767impl<'a> Iterator for IterableDlPortFunction<'a> {
6768    type Item = Result<DlPortFunction<'a>, ErrorContext>;
6769    fn next(&mut self) -> Option<Self::Item> {
6770        let pos = self.pos;
6771        let mut r#type;
6772        loop {
6773            r#type = None;
6774            if self.buf.len() == self.pos {
6775                return None;
6776            }
6777            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6778                break;
6779            };
6780            r#type = Some(header.r#type);
6781            let res = match header.r#type {
6782                1u16 => DlPortFunction::HwAddr({
6783                    let res = Some(next);
6784                    let Some(val) = res else { break };
6785                    val
6786                }),
6787                2u16 => DlPortFunction::State({
6788                    let res = parse_u8(next);
6789                    let Some(val) = res else { break };
6790                    val
6791                }),
6792                3u16 => DlPortFunction::Opstate({
6793                    let res = parse_u8(next);
6794                    let Some(val) = res else { break };
6795                    val
6796                }),
6797                4u16 => DlPortFunction::Caps({
6798                    let res = BuiltinBitfield32::new_from_slice(next);
6799                    let Some(val) = res else { break };
6800                    val
6801                }),
6802                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6803                n => continue,
6804            };
6805            return Some(Ok(res));
6806        }
6807        Some(Err(ErrorContext::new(
6808            "DlPortFunction",
6809            r#type.and_then(|t| DlPortFunction::attr_from_type(t)),
6810            self.orig_loc,
6811            self.buf.as_ptr().wrapping_add(pos) as usize,
6812        )))
6813    }
6814}
6815impl<'a> std::fmt::Debug for IterableDlPortFunction<'_> {
6816    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6817        let mut fmt = f.debug_struct("DlPortFunction");
6818        for attr in self.clone() {
6819            let attr = match attr {
6820                Ok(a) => a,
6821                Err(err) => {
6822                    fmt.finish()?;
6823                    f.write_str("Err(")?;
6824                    err.fmt(f)?;
6825                    return f.write_str(")");
6826                }
6827            };
6828            match attr {
6829                DlPortFunction::HwAddr(val) => fmt.field("HwAddr", &val),
6830                DlPortFunction::State(val) => {
6831                    fmt.field("State", &FormatEnum(val.into(), PortFnState::from_value))
6832                }
6833                DlPortFunction::Opstate(val) => fmt.field(
6834                    "Opstate",
6835                    &FormatEnum(val.into(), PortFnOpstate::from_value),
6836                ),
6837                DlPortFunction::Caps(val) => fmt.field(
6838                    "Caps",
6839                    &FormatFlags(val.value.into(), |val| {
6840                        PortFnAttrCap::from_value(val.trailing_zeros().into())
6841                    }),
6842                ),
6843            };
6844        }
6845        fmt.finish()
6846    }
6847}
6848impl IterableDlPortFunction<'_> {
6849    pub fn lookup_attr(
6850        &self,
6851        offset: usize,
6852        missing_type: Option<u16>,
6853    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6854        let mut stack = Vec::new();
6855        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6856        if missing_type.is_some() && cur == offset {
6857            stack.push(("DlPortFunction", offset));
6858            return (
6859                stack,
6860                missing_type.and_then(|t| DlPortFunction::attr_from_type(t)),
6861            );
6862        }
6863        if cur > offset || cur + self.buf.len() < offset {
6864            return (stack, None);
6865        }
6866        let mut attrs = self.clone();
6867        let mut last_off = cur + attrs.pos;
6868        while let Some(attr) = attrs.next() {
6869            let Ok(attr) = attr else { break };
6870            match attr {
6871                DlPortFunction::HwAddr(val) => {
6872                    if last_off == offset {
6873                        stack.push(("HwAddr", last_off));
6874                        break;
6875                    }
6876                }
6877                DlPortFunction::State(val) => {
6878                    if last_off == offset {
6879                        stack.push(("State", last_off));
6880                        break;
6881                    }
6882                }
6883                DlPortFunction::Opstate(val) => {
6884                    if last_off == offset {
6885                        stack.push(("Opstate", last_off));
6886                        break;
6887                    }
6888                }
6889                DlPortFunction::Caps(val) => {
6890                    if last_off == offset {
6891                        stack.push(("Caps", last_off));
6892                        break;
6893                    }
6894                }
6895                _ => {}
6896            };
6897            last_off = cur + attrs.pos;
6898        }
6899        if !stack.is_empty() {
6900            stack.push(("DlPortFunction", cur));
6901        }
6902        (stack, None)
6903    }
6904}
6905#[derive(Clone)]
6906pub enum DlDpipeTables<'a> {
6907    #[doc = "Attribute may repeat multiple times (treat it as array)"]
6908    DpipeTable(IterableDlDpipeTable<'a>),
6909}
6910impl<'a> IterableDlDpipeTables<'a> {
6911    #[doc = "Attribute may repeat multiple times (treat it as array)"]
6912    pub fn get_dpipe_table(
6913        &self,
6914    ) -> MultiAttrIterable<Self, DlDpipeTables<'a>, IterableDlDpipeTable<'a>> {
6915        MultiAttrIterable::new(self.clone(), |variant| {
6916            if let DlDpipeTables::DpipeTable(val) = variant {
6917                Some(val)
6918            } else {
6919                None
6920            }
6921        })
6922    }
6923}
6924impl DlDpipeTables<'_> {
6925    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeTables<'a> {
6926        IterableDlDpipeTables::with_loc(buf, buf.as_ptr() as usize)
6927    }
6928    fn attr_from_type(r#type: u16) -> Option<&'static str> {
6929        Devlink::attr_from_type(r#type)
6930    }
6931}
6932#[derive(Clone, Copy, Default)]
6933pub struct IterableDlDpipeTables<'a> {
6934    buf: &'a [u8],
6935    pos: usize,
6936    orig_loc: usize,
6937}
6938impl<'a> IterableDlDpipeTables<'a> {
6939    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6940        Self {
6941            buf,
6942            pos: 0,
6943            orig_loc,
6944        }
6945    }
6946    pub fn get_buf(&self) -> &'a [u8] {
6947        self.buf
6948    }
6949}
6950impl<'a> Iterator for IterableDlDpipeTables<'a> {
6951    type Item = Result<DlDpipeTables<'a>, ErrorContext>;
6952    fn next(&mut self) -> Option<Self::Item> {
6953        let pos = self.pos;
6954        let mut r#type;
6955        loop {
6956            r#type = None;
6957            if self.buf.len() == self.pos {
6958                return None;
6959            }
6960            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6961                break;
6962            };
6963            r#type = Some(header.r#type);
6964            let res = match header.r#type {
6965                28u16 => DlDpipeTables::DpipeTable({
6966                    let res = Some(IterableDlDpipeTable::with_loc(next, self.orig_loc));
6967                    let Some(val) = res else { break };
6968                    val
6969                }),
6970                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6971                n => continue,
6972            };
6973            return Some(Ok(res));
6974        }
6975        Some(Err(ErrorContext::new(
6976            "DlDpipeTables",
6977            r#type.and_then(|t| DlDpipeTables::attr_from_type(t)),
6978            self.orig_loc,
6979            self.buf.as_ptr().wrapping_add(pos) as usize,
6980        )))
6981    }
6982}
6983impl<'a> std::fmt::Debug for IterableDlDpipeTables<'_> {
6984    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6985        let mut fmt = f.debug_struct("DlDpipeTables");
6986        for attr in self.clone() {
6987            let attr = match attr {
6988                Ok(a) => a,
6989                Err(err) => {
6990                    fmt.finish()?;
6991                    f.write_str("Err(")?;
6992                    err.fmt(f)?;
6993                    return f.write_str(")");
6994                }
6995            };
6996            match attr {
6997                DlDpipeTables::DpipeTable(val) => fmt.field("DpipeTable", &val),
6998            };
6999        }
7000        fmt.finish()
7001    }
7002}
7003impl IterableDlDpipeTables<'_> {
7004    pub fn lookup_attr(
7005        &self,
7006        offset: usize,
7007        missing_type: Option<u16>,
7008    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7009        let mut stack = Vec::new();
7010        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7011        if missing_type.is_some() && cur == offset {
7012            stack.push(("DlDpipeTables", offset));
7013            return (
7014                stack,
7015                missing_type.and_then(|t| DlDpipeTables::attr_from_type(t)),
7016            );
7017        }
7018        if cur > offset || cur + self.buf.len() < offset {
7019            return (stack, None);
7020        }
7021        let mut attrs = self.clone();
7022        let mut last_off = cur + attrs.pos;
7023        let mut missing = None;
7024        while let Some(attr) = attrs.next() {
7025            let Ok(attr) = attr else { break };
7026            match attr {
7027                DlDpipeTables::DpipeTable(val) => {
7028                    (stack, missing) = val.lookup_attr(offset, missing_type);
7029                    if !stack.is_empty() {
7030                        break;
7031                    }
7032                }
7033                _ => {}
7034            };
7035            last_off = cur + attrs.pos;
7036        }
7037        if !stack.is_empty() {
7038            stack.push(("DlDpipeTables", cur));
7039        }
7040        (stack, missing)
7041    }
7042}
7043#[derive(Clone)]
7044pub enum DlDpipeTable<'a> {
7045    DpipeTableName(&'a CStr),
7046    DpipeTableSize(u64),
7047    DpipeTableMatches(IterableDlDpipeTableMatches<'a>),
7048    DpipeTableActions(IterableDlDpipeTableActions<'a>),
7049    DpipeTableCountersEnabled(u8),
7050    DpipeTableResourceId(u64),
7051    DpipeTableResourceUnits(u64),
7052}
7053impl<'a> IterableDlDpipeTable<'a> {
7054    pub fn get_dpipe_table_name(&self) -> Result<&'a CStr, ErrorContext> {
7055        let mut iter = self.clone();
7056        iter.pos = 0;
7057        for attr in iter {
7058            if let DlDpipeTable::DpipeTableName(val) = attr? {
7059                return Ok(val);
7060            }
7061        }
7062        Err(ErrorContext::new_missing(
7063            "DlDpipeTable",
7064            "DpipeTableName",
7065            self.orig_loc,
7066            self.buf.as_ptr() as usize,
7067        ))
7068    }
7069    pub fn get_dpipe_table_size(&self) -> Result<u64, ErrorContext> {
7070        let mut iter = self.clone();
7071        iter.pos = 0;
7072        for attr in iter {
7073            if let DlDpipeTable::DpipeTableSize(val) = attr? {
7074                return Ok(val);
7075            }
7076        }
7077        Err(ErrorContext::new_missing(
7078            "DlDpipeTable",
7079            "DpipeTableSize",
7080            self.orig_loc,
7081            self.buf.as_ptr() as usize,
7082        ))
7083    }
7084    pub fn get_dpipe_table_matches(&self) -> Result<IterableDlDpipeTableMatches<'a>, ErrorContext> {
7085        let mut iter = self.clone();
7086        iter.pos = 0;
7087        for attr in iter {
7088            if let DlDpipeTable::DpipeTableMatches(val) = attr? {
7089                return Ok(val);
7090            }
7091        }
7092        Err(ErrorContext::new_missing(
7093            "DlDpipeTable",
7094            "DpipeTableMatches",
7095            self.orig_loc,
7096            self.buf.as_ptr() as usize,
7097        ))
7098    }
7099    pub fn get_dpipe_table_actions(&self) -> Result<IterableDlDpipeTableActions<'a>, ErrorContext> {
7100        let mut iter = self.clone();
7101        iter.pos = 0;
7102        for attr in iter {
7103            if let DlDpipeTable::DpipeTableActions(val) = attr? {
7104                return Ok(val);
7105            }
7106        }
7107        Err(ErrorContext::new_missing(
7108            "DlDpipeTable",
7109            "DpipeTableActions",
7110            self.orig_loc,
7111            self.buf.as_ptr() as usize,
7112        ))
7113    }
7114    pub fn get_dpipe_table_counters_enabled(&self) -> Result<u8, ErrorContext> {
7115        let mut iter = self.clone();
7116        iter.pos = 0;
7117        for attr in iter {
7118            if let DlDpipeTable::DpipeTableCountersEnabled(val) = attr? {
7119                return Ok(val);
7120            }
7121        }
7122        Err(ErrorContext::new_missing(
7123            "DlDpipeTable",
7124            "DpipeTableCountersEnabled",
7125            self.orig_loc,
7126            self.buf.as_ptr() as usize,
7127        ))
7128    }
7129    pub fn get_dpipe_table_resource_id(&self) -> Result<u64, ErrorContext> {
7130        let mut iter = self.clone();
7131        iter.pos = 0;
7132        for attr in iter {
7133            if let DlDpipeTable::DpipeTableResourceId(val) = attr? {
7134                return Ok(val);
7135            }
7136        }
7137        Err(ErrorContext::new_missing(
7138            "DlDpipeTable",
7139            "DpipeTableResourceId",
7140            self.orig_loc,
7141            self.buf.as_ptr() as usize,
7142        ))
7143    }
7144    pub fn get_dpipe_table_resource_units(&self) -> Result<u64, ErrorContext> {
7145        let mut iter = self.clone();
7146        iter.pos = 0;
7147        for attr in iter {
7148            if let DlDpipeTable::DpipeTableResourceUnits(val) = attr? {
7149                return Ok(val);
7150            }
7151        }
7152        Err(ErrorContext::new_missing(
7153            "DlDpipeTable",
7154            "DpipeTableResourceUnits",
7155            self.orig_loc,
7156            self.buf.as_ptr() as usize,
7157        ))
7158    }
7159}
7160impl DlDpipeTable<'_> {
7161    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeTable<'a> {
7162        IterableDlDpipeTable::with_loc(buf, buf.as_ptr() as usize)
7163    }
7164    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7165        Devlink::attr_from_type(r#type)
7166    }
7167}
7168#[derive(Clone, Copy, Default)]
7169pub struct IterableDlDpipeTable<'a> {
7170    buf: &'a [u8],
7171    pos: usize,
7172    orig_loc: usize,
7173}
7174impl<'a> IterableDlDpipeTable<'a> {
7175    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7176        Self {
7177            buf,
7178            pos: 0,
7179            orig_loc,
7180        }
7181    }
7182    pub fn get_buf(&self) -> &'a [u8] {
7183        self.buf
7184    }
7185}
7186impl<'a> Iterator for IterableDlDpipeTable<'a> {
7187    type Item = Result<DlDpipeTable<'a>, ErrorContext>;
7188    fn next(&mut self) -> Option<Self::Item> {
7189        let pos = self.pos;
7190        let mut r#type;
7191        loop {
7192            r#type = None;
7193            if self.buf.len() == self.pos {
7194                return None;
7195            }
7196            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7197                break;
7198            };
7199            r#type = Some(header.r#type);
7200            let res = match header.r#type {
7201                29u16 => DlDpipeTable::DpipeTableName({
7202                    let res = CStr::from_bytes_with_nul(next).ok();
7203                    let Some(val) = res else { break };
7204                    val
7205                }),
7206                30u16 => DlDpipeTable::DpipeTableSize({
7207                    let res = parse_u64(next);
7208                    let Some(val) = res else { break };
7209                    val
7210                }),
7211                31u16 => DlDpipeTable::DpipeTableMatches({
7212                    let res = Some(IterableDlDpipeTableMatches::with_loc(next, self.orig_loc));
7213                    let Some(val) = res else { break };
7214                    val
7215                }),
7216                32u16 => DlDpipeTable::DpipeTableActions({
7217                    let res = Some(IterableDlDpipeTableActions::with_loc(next, self.orig_loc));
7218                    let Some(val) = res else { break };
7219                    val
7220                }),
7221                33u16 => DlDpipeTable::DpipeTableCountersEnabled({
7222                    let res = parse_u8(next);
7223                    let Some(val) = res else { break };
7224                    val
7225                }),
7226                75u16 => DlDpipeTable::DpipeTableResourceId({
7227                    let res = parse_u64(next);
7228                    let Some(val) = res else { break };
7229                    val
7230                }),
7231                76u16 => DlDpipeTable::DpipeTableResourceUnits({
7232                    let res = parse_u64(next);
7233                    let Some(val) = res else { break };
7234                    val
7235                }),
7236                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7237                n => continue,
7238            };
7239            return Some(Ok(res));
7240        }
7241        Some(Err(ErrorContext::new(
7242            "DlDpipeTable",
7243            r#type.and_then(|t| DlDpipeTable::attr_from_type(t)),
7244            self.orig_loc,
7245            self.buf.as_ptr().wrapping_add(pos) as usize,
7246        )))
7247    }
7248}
7249impl<'a> std::fmt::Debug for IterableDlDpipeTable<'_> {
7250    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7251        let mut fmt = f.debug_struct("DlDpipeTable");
7252        for attr in self.clone() {
7253            let attr = match attr {
7254                Ok(a) => a,
7255                Err(err) => {
7256                    fmt.finish()?;
7257                    f.write_str("Err(")?;
7258                    err.fmt(f)?;
7259                    return f.write_str(")");
7260                }
7261            };
7262            match attr {
7263                DlDpipeTable::DpipeTableName(val) => fmt.field("DpipeTableName", &val),
7264                DlDpipeTable::DpipeTableSize(val) => fmt.field("DpipeTableSize", &val),
7265                DlDpipeTable::DpipeTableMatches(val) => fmt.field("DpipeTableMatches", &val),
7266                DlDpipeTable::DpipeTableActions(val) => fmt.field("DpipeTableActions", &val),
7267                DlDpipeTable::DpipeTableCountersEnabled(val) => {
7268                    fmt.field("DpipeTableCountersEnabled", &val)
7269                }
7270                DlDpipeTable::DpipeTableResourceId(val) => fmt.field("DpipeTableResourceId", &val),
7271                DlDpipeTable::DpipeTableResourceUnits(val) => {
7272                    fmt.field("DpipeTableResourceUnits", &val)
7273                }
7274            };
7275        }
7276        fmt.finish()
7277    }
7278}
7279impl IterableDlDpipeTable<'_> {
7280    pub fn lookup_attr(
7281        &self,
7282        offset: usize,
7283        missing_type: Option<u16>,
7284    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7285        let mut stack = Vec::new();
7286        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7287        if missing_type.is_some() && cur == offset {
7288            stack.push(("DlDpipeTable", offset));
7289            return (
7290                stack,
7291                missing_type.and_then(|t| DlDpipeTable::attr_from_type(t)),
7292            );
7293        }
7294        if cur > offset || cur + self.buf.len() < offset {
7295            return (stack, None);
7296        }
7297        let mut attrs = self.clone();
7298        let mut last_off = cur + attrs.pos;
7299        let mut missing = None;
7300        while let Some(attr) = attrs.next() {
7301            let Ok(attr) = attr else { break };
7302            match attr {
7303                DlDpipeTable::DpipeTableName(val) => {
7304                    if last_off == offset {
7305                        stack.push(("DpipeTableName", last_off));
7306                        break;
7307                    }
7308                }
7309                DlDpipeTable::DpipeTableSize(val) => {
7310                    if last_off == offset {
7311                        stack.push(("DpipeTableSize", last_off));
7312                        break;
7313                    }
7314                }
7315                DlDpipeTable::DpipeTableMatches(val) => {
7316                    (stack, missing) = val.lookup_attr(offset, missing_type);
7317                    if !stack.is_empty() {
7318                        break;
7319                    }
7320                }
7321                DlDpipeTable::DpipeTableActions(val) => {
7322                    (stack, missing) = val.lookup_attr(offset, missing_type);
7323                    if !stack.is_empty() {
7324                        break;
7325                    }
7326                }
7327                DlDpipeTable::DpipeTableCountersEnabled(val) => {
7328                    if last_off == offset {
7329                        stack.push(("DpipeTableCountersEnabled", last_off));
7330                        break;
7331                    }
7332                }
7333                DlDpipeTable::DpipeTableResourceId(val) => {
7334                    if last_off == offset {
7335                        stack.push(("DpipeTableResourceId", last_off));
7336                        break;
7337                    }
7338                }
7339                DlDpipeTable::DpipeTableResourceUnits(val) => {
7340                    if last_off == offset {
7341                        stack.push(("DpipeTableResourceUnits", last_off));
7342                        break;
7343                    }
7344                }
7345                _ => {}
7346            };
7347            last_off = cur + attrs.pos;
7348        }
7349        if !stack.is_empty() {
7350            stack.push(("DlDpipeTable", cur));
7351        }
7352        (stack, missing)
7353    }
7354}
7355#[derive(Clone)]
7356pub enum DlDpipeTableMatches<'a> {
7357    #[doc = "Attribute may repeat multiple times (treat it as array)"]
7358    DpipeMatch(IterableDlDpipeMatch<'a>),
7359}
7360impl<'a> IterableDlDpipeTableMatches<'a> {
7361    #[doc = "Attribute may repeat multiple times (treat it as array)"]
7362    pub fn get_dpipe_match(
7363        &self,
7364    ) -> MultiAttrIterable<Self, DlDpipeTableMatches<'a>, IterableDlDpipeMatch<'a>> {
7365        MultiAttrIterable::new(self.clone(), |variant| {
7366            if let DlDpipeTableMatches::DpipeMatch(val) = variant {
7367                Some(val)
7368            } else {
7369                None
7370            }
7371        })
7372    }
7373}
7374impl DlDpipeTableMatches<'_> {
7375    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeTableMatches<'a> {
7376        IterableDlDpipeTableMatches::with_loc(buf, buf.as_ptr() as usize)
7377    }
7378    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7379        Devlink::attr_from_type(r#type)
7380    }
7381}
7382#[derive(Clone, Copy, Default)]
7383pub struct IterableDlDpipeTableMatches<'a> {
7384    buf: &'a [u8],
7385    pos: usize,
7386    orig_loc: usize,
7387}
7388impl<'a> IterableDlDpipeTableMatches<'a> {
7389    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7390        Self {
7391            buf,
7392            pos: 0,
7393            orig_loc,
7394        }
7395    }
7396    pub fn get_buf(&self) -> &'a [u8] {
7397        self.buf
7398    }
7399}
7400impl<'a> Iterator for IterableDlDpipeTableMatches<'a> {
7401    type Item = Result<DlDpipeTableMatches<'a>, ErrorContext>;
7402    fn next(&mut self) -> Option<Self::Item> {
7403        let pos = self.pos;
7404        let mut r#type;
7405        loop {
7406            r#type = None;
7407            if self.buf.len() == self.pos {
7408                return None;
7409            }
7410            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7411                break;
7412            };
7413            r#type = Some(header.r#type);
7414            let res = match header.r#type {
7415                40u16 => DlDpipeTableMatches::DpipeMatch({
7416                    let res = Some(IterableDlDpipeMatch::with_loc(next, self.orig_loc));
7417                    let Some(val) = res else { break };
7418                    val
7419                }),
7420                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7421                n => continue,
7422            };
7423            return Some(Ok(res));
7424        }
7425        Some(Err(ErrorContext::new(
7426            "DlDpipeTableMatches",
7427            r#type.and_then(|t| DlDpipeTableMatches::attr_from_type(t)),
7428            self.orig_loc,
7429            self.buf.as_ptr().wrapping_add(pos) as usize,
7430        )))
7431    }
7432}
7433impl<'a> std::fmt::Debug for IterableDlDpipeTableMatches<'_> {
7434    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7435        let mut fmt = f.debug_struct("DlDpipeTableMatches");
7436        for attr in self.clone() {
7437            let attr = match attr {
7438                Ok(a) => a,
7439                Err(err) => {
7440                    fmt.finish()?;
7441                    f.write_str("Err(")?;
7442                    err.fmt(f)?;
7443                    return f.write_str(")");
7444                }
7445            };
7446            match attr {
7447                DlDpipeTableMatches::DpipeMatch(val) => fmt.field("DpipeMatch", &val),
7448            };
7449        }
7450        fmt.finish()
7451    }
7452}
7453impl IterableDlDpipeTableMatches<'_> {
7454    pub fn lookup_attr(
7455        &self,
7456        offset: usize,
7457        missing_type: Option<u16>,
7458    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7459        let mut stack = Vec::new();
7460        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7461        if missing_type.is_some() && cur == offset {
7462            stack.push(("DlDpipeTableMatches", offset));
7463            return (
7464                stack,
7465                missing_type.and_then(|t| DlDpipeTableMatches::attr_from_type(t)),
7466            );
7467        }
7468        if cur > offset || cur + self.buf.len() < offset {
7469            return (stack, None);
7470        }
7471        let mut attrs = self.clone();
7472        let mut last_off = cur + attrs.pos;
7473        let mut missing = None;
7474        while let Some(attr) = attrs.next() {
7475            let Ok(attr) = attr else { break };
7476            match attr {
7477                DlDpipeTableMatches::DpipeMatch(val) => {
7478                    (stack, missing) = val.lookup_attr(offset, missing_type);
7479                    if !stack.is_empty() {
7480                        break;
7481                    }
7482                }
7483                _ => {}
7484            };
7485            last_off = cur + attrs.pos;
7486        }
7487        if !stack.is_empty() {
7488            stack.push(("DlDpipeTableMatches", cur));
7489        }
7490        (stack, missing)
7491    }
7492}
7493#[derive(Clone)]
7494pub enum DlDpipeTableActions<'a> {
7495    #[doc = "Attribute may repeat multiple times (treat it as array)"]
7496    DpipeAction(IterableDlDpipeAction<'a>),
7497}
7498impl<'a> IterableDlDpipeTableActions<'a> {
7499    #[doc = "Attribute may repeat multiple times (treat it as array)"]
7500    pub fn get_dpipe_action(
7501        &self,
7502    ) -> MultiAttrIterable<Self, DlDpipeTableActions<'a>, IterableDlDpipeAction<'a>> {
7503        MultiAttrIterable::new(self.clone(), |variant| {
7504            if let DlDpipeTableActions::DpipeAction(val) = variant {
7505                Some(val)
7506            } else {
7507                None
7508            }
7509        })
7510    }
7511}
7512impl DlDpipeTableActions<'_> {
7513    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeTableActions<'a> {
7514        IterableDlDpipeTableActions::with_loc(buf, buf.as_ptr() as usize)
7515    }
7516    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7517        Devlink::attr_from_type(r#type)
7518    }
7519}
7520#[derive(Clone, Copy, Default)]
7521pub struct IterableDlDpipeTableActions<'a> {
7522    buf: &'a [u8],
7523    pos: usize,
7524    orig_loc: usize,
7525}
7526impl<'a> IterableDlDpipeTableActions<'a> {
7527    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7528        Self {
7529            buf,
7530            pos: 0,
7531            orig_loc,
7532        }
7533    }
7534    pub fn get_buf(&self) -> &'a [u8] {
7535        self.buf
7536    }
7537}
7538impl<'a> Iterator for IterableDlDpipeTableActions<'a> {
7539    type Item = Result<DlDpipeTableActions<'a>, ErrorContext>;
7540    fn next(&mut self) -> Option<Self::Item> {
7541        let pos = self.pos;
7542        let mut r#type;
7543        loop {
7544            r#type = None;
7545            if self.buf.len() == self.pos {
7546                return None;
7547            }
7548            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7549                break;
7550            };
7551            r#type = Some(header.r#type);
7552            let res = match header.r#type {
7553                43u16 => DlDpipeTableActions::DpipeAction({
7554                    let res = Some(IterableDlDpipeAction::with_loc(next, self.orig_loc));
7555                    let Some(val) = res else { break };
7556                    val
7557                }),
7558                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7559                n => continue,
7560            };
7561            return Some(Ok(res));
7562        }
7563        Some(Err(ErrorContext::new(
7564            "DlDpipeTableActions",
7565            r#type.and_then(|t| DlDpipeTableActions::attr_from_type(t)),
7566            self.orig_loc,
7567            self.buf.as_ptr().wrapping_add(pos) as usize,
7568        )))
7569    }
7570}
7571impl<'a> std::fmt::Debug for IterableDlDpipeTableActions<'_> {
7572    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7573        let mut fmt = f.debug_struct("DlDpipeTableActions");
7574        for attr in self.clone() {
7575            let attr = match attr {
7576                Ok(a) => a,
7577                Err(err) => {
7578                    fmt.finish()?;
7579                    f.write_str("Err(")?;
7580                    err.fmt(f)?;
7581                    return f.write_str(")");
7582                }
7583            };
7584            match attr {
7585                DlDpipeTableActions::DpipeAction(val) => fmt.field("DpipeAction", &val),
7586            };
7587        }
7588        fmt.finish()
7589    }
7590}
7591impl IterableDlDpipeTableActions<'_> {
7592    pub fn lookup_attr(
7593        &self,
7594        offset: usize,
7595        missing_type: Option<u16>,
7596    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7597        let mut stack = Vec::new();
7598        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7599        if missing_type.is_some() && cur == offset {
7600            stack.push(("DlDpipeTableActions", offset));
7601            return (
7602                stack,
7603                missing_type.and_then(|t| DlDpipeTableActions::attr_from_type(t)),
7604            );
7605        }
7606        if cur > offset || cur + self.buf.len() < offset {
7607            return (stack, None);
7608        }
7609        let mut attrs = self.clone();
7610        let mut last_off = cur + attrs.pos;
7611        let mut missing = None;
7612        while let Some(attr) = attrs.next() {
7613            let Ok(attr) = attr else { break };
7614            match attr {
7615                DlDpipeTableActions::DpipeAction(val) => {
7616                    (stack, missing) = val.lookup_attr(offset, missing_type);
7617                    if !stack.is_empty() {
7618                        break;
7619                    }
7620                }
7621                _ => {}
7622            };
7623            last_off = cur + attrs.pos;
7624        }
7625        if !stack.is_empty() {
7626            stack.push(("DlDpipeTableActions", cur));
7627        }
7628        (stack, missing)
7629    }
7630}
7631#[derive(Clone)]
7632pub enum DlDpipeEntries<'a> {
7633    #[doc = "Attribute may repeat multiple times (treat it as array)"]
7634    DpipeEntry(IterableDlDpipeEntry<'a>),
7635}
7636impl<'a> IterableDlDpipeEntries<'a> {
7637    #[doc = "Attribute may repeat multiple times (treat it as array)"]
7638    pub fn get_dpipe_entry(
7639        &self,
7640    ) -> MultiAttrIterable<Self, DlDpipeEntries<'a>, IterableDlDpipeEntry<'a>> {
7641        MultiAttrIterable::new(self.clone(), |variant| {
7642            if let DlDpipeEntries::DpipeEntry(val) = variant {
7643                Some(val)
7644            } else {
7645                None
7646            }
7647        })
7648    }
7649}
7650impl DlDpipeEntries<'_> {
7651    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeEntries<'a> {
7652        IterableDlDpipeEntries::with_loc(buf, buf.as_ptr() as usize)
7653    }
7654    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7655        Devlink::attr_from_type(r#type)
7656    }
7657}
7658#[derive(Clone, Copy, Default)]
7659pub struct IterableDlDpipeEntries<'a> {
7660    buf: &'a [u8],
7661    pos: usize,
7662    orig_loc: usize,
7663}
7664impl<'a> IterableDlDpipeEntries<'a> {
7665    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7666        Self {
7667            buf,
7668            pos: 0,
7669            orig_loc,
7670        }
7671    }
7672    pub fn get_buf(&self) -> &'a [u8] {
7673        self.buf
7674    }
7675}
7676impl<'a> Iterator for IterableDlDpipeEntries<'a> {
7677    type Item = Result<DlDpipeEntries<'a>, ErrorContext>;
7678    fn next(&mut self) -> Option<Self::Item> {
7679        let pos = self.pos;
7680        let mut r#type;
7681        loop {
7682            r#type = None;
7683            if self.buf.len() == self.pos {
7684                return None;
7685            }
7686            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7687                break;
7688            };
7689            r#type = Some(header.r#type);
7690            let res = match header.r#type {
7691                35u16 => DlDpipeEntries::DpipeEntry({
7692                    let res = Some(IterableDlDpipeEntry::with_loc(next, self.orig_loc));
7693                    let Some(val) = res else { break };
7694                    val
7695                }),
7696                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7697                n => continue,
7698            };
7699            return Some(Ok(res));
7700        }
7701        Some(Err(ErrorContext::new(
7702            "DlDpipeEntries",
7703            r#type.and_then(|t| DlDpipeEntries::attr_from_type(t)),
7704            self.orig_loc,
7705            self.buf.as_ptr().wrapping_add(pos) as usize,
7706        )))
7707    }
7708}
7709impl<'a> std::fmt::Debug for IterableDlDpipeEntries<'_> {
7710    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7711        let mut fmt = f.debug_struct("DlDpipeEntries");
7712        for attr in self.clone() {
7713            let attr = match attr {
7714                Ok(a) => a,
7715                Err(err) => {
7716                    fmt.finish()?;
7717                    f.write_str("Err(")?;
7718                    err.fmt(f)?;
7719                    return f.write_str(")");
7720                }
7721            };
7722            match attr {
7723                DlDpipeEntries::DpipeEntry(val) => fmt.field("DpipeEntry", &val),
7724            };
7725        }
7726        fmt.finish()
7727    }
7728}
7729impl IterableDlDpipeEntries<'_> {
7730    pub fn lookup_attr(
7731        &self,
7732        offset: usize,
7733        missing_type: Option<u16>,
7734    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7735        let mut stack = Vec::new();
7736        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7737        if missing_type.is_some() && cur == offset {
7738            stack.push(("DlDpipeEntries", offset));
7739            return (
7740                stack,
7741                missing_type.and_then(|t| DlDpipeEntries::attr_from_type(t)),
7742            );
7743        }
7744        if cur > offset || cur + self.buf.len() < offset {
7745            return (stack, None);
7746        }
7747        let mut attrs = self.clone();
7748        let mut last_off = cur + attrs.pos;
7749        let mut missing = None;
7750        while let Some(attr) = attrs.next() {
7751            let Ok(attr) = attr else { break };
7752            match attr {
7753                DlDpipeEntries::DpipeEntry(val) => {
7754                    (stack, missing) = val.lookup_attr(offset, missing_type);
7755                    if !stack.is_empty() {
7756                        break;
7757                    }
7758                }
7759                _ => {}
7760            };
7761            last_off = cur + attrs.pos;
7762        }
7763        if !stack.is_empty() {
7764            stack.push(("DlDpipeEntries", cur));
7765        }
7766        (stack, missing)
7767    }
7768}
7769#[derive(Clone)]
7770pub enum DlDpipeEntry<'a> {
7771    DpipeEntryIndex(u64),
7772    DpipeEntryMatchValues(IterableDlDpipeEntryMatchValues<'a>),
7773    DpipeEntryActionValues(IterableDlDpipeEntryActionValues<'a>),
7774    DpipeEntryCounter(u64),
7775}
7776impl<'a> IterableDlDpipeEntry<'a> {
7777    pub fn get_dpipe_entry_index(&self) -> Result<u64, ErrorContext> {
7778        let mut iter = self.clone();
7779        iter.pos = 0;
7780        for attr in iter {
7781            if let DlDpipeEntry::DpipeEntryIndex(val) = attr? {
7782                return Ok(val);
7783            }
7784        }
7785        Err(ErrorContext::new_missing(
7786            "DlDpipeEntry",
7787            "DpipeEntryIndex",
7788            self.orig_loc,
7789            self.buf.as_ptr() as usize,
7790        ))
7791    }
7792    pub fn get_dpipe_entry_match_values(
7793        &self,
7794    ) -> Result<IterableDlDpipeEntryMatchValues<'a>, ErrorContext> {
7795        let mut iter = self.clone();
7796        iter.pos = 0;
7797        for attr in iter {
7798            if let DlDpipeEntry::DpipeEntryMatchValues(val) = attr? {
7799                return Ok(val);
7800            }
7801        }
7802        Err(ErrorContext::new_missing(
7803            "DlDpipeEntry",
7804            "DpipeEntryMatchValues",
7805            self.orig_loc,
7806            self.buf.as_ptr() as usize,
7807        ))
7808    }
7809    pub fn get_dpipe_entry_action_values(
7810        &self,
7811    ) -> Result<IterableDlDpipeEntryActionValues<'a>, ErrorContext> {
7812        let mut iter = self.clone();
7813        iter.pos = 0;
7814        for attr in iter {
7815            if let DlDpipeEntry::DpipeEntryActionValues(val) = attr? {
7816                return Ok(val);
7817            }
7818        }
7819        Err(ErrorContext::new_missing(
7820            "DlDpipeEntry",
7821            "DpipeEntryActionValues",
7822            self.orig_loc,
7823            self.buf.as_ptr() as usize,
7824        ))
7825    }
7826    pub fn get_dpipe_entry_counter(&self) -> Result<u64, ErrorContext> {
7827        let mut iter = self.clone();
7828        iter.pos = 0;
7829        for attr in iter {
7830            if let DlDpipeEntry::DpipeEntryCounter(val) = attr? {
7831                return Ok(val);
7832            }
7833        }
7834        Err(ErrorContext::new_missing(
7835            "DlDpipeEntry",
7836            "DpipeEntryCounter",
7837            self.orig_loc,
7838            self.buf.as_ptr() as usize,
7839        ))
7840    }
7841}
7842impl DlDpipeEntry<'_> {
7843    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeEntry<'a> {
7844        IterableDlDpipeEntry::with_loc(buf, buf.as_ptr() as usize)
7845    }
7846    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7847        Devlink::attr_from_type(r#type)
7848    }
7849}
7850#[derive(Clone, Copy, Default)]
7851pub struct IterableDlDpipeEntry<'a> {
7852    buf: &'a [u8],
7853    pos: usize,
7854    orig_loc: usize,
7855}
7856impl<'a> IterableDlDpipeEntry<'a> {
7857    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7858        Self {
7859            buf,
7860            pos: 0,
7861            orig_loc,
7862        }
7863    }
7864    pub fn get_buf(&self) -> &'a [u8] {
7865        self.buf
7866    }
7867}
7868impl<'a> Iterator for IterableDlDpipeEntry<'a> {
7869    type Item = Result<DlDpipeEntry<'a>, ErrorContext>;
7870    fn next(&mut self) -> Option<Self::Item> {
7871        let pos = self.pos;
7872        let mut r#type;
7873        loop {
7874            r#type = None;
7875            if self.buf.len() == self.pos {
7876                return None;
7877            }
7878            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7879                break;
7880            };
7881            r#type = Some(header.r#type);
7882            let res = match header.r#type {
7883                36u16 => DlDpipeEntry::DpipeEntryIndex({
7884                    let res = parse_u64(next);
7885                    let Some(val) = res else { break };
7886                    val
7887                }),
7888                37u16 => DlDpipeEntry::DpipeEntryMatchValues({
7889                    let res = Some(IterableDlDpipeEntryMatchValues::with_loc(
7890                        next,
7891                        self.orig_loc,
7892                    ));
7893                    let Some(val) = res else { break };
7894                    val
7895                }),
7896                38u16 => DlDpipeEntry::DpipeEntryActionValues({
7897                    let res = Some(IterableDlDpipeEntryActionValues::with_loc(
7898                        next,
7899                        self.orig_loc,
7900                    ));
7901                    let Some(val) = res else { break };
7902                    val
7903                }),
7904                39u16 => DlDpipeEntry::DpipeEntryCounter({
7905                    let res = parse_u64(next);
7906                    let Some(val) = res else { break };
7907                    val
7908                }),
7909                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7910                n => continue,
7911            };
7912            return Some(Ok(res));
7913        }
7914        Some(Err(ErrorContext::new(
7915            "DlDpipeEntry",
7916            r#type.and_then(|t| DlDpipeEntry::attr_from_type(t)),
7917            self.orig_loc,
7918            self.buf.as_ptr().wrapping_add(pos) as usize,
7919        )))
7920    }
7921}
7922impl<'a> std::fmt::Debug for IterableDlDpipeEntry<'_> {
7923    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7924        let mut fmt = f.debug_struct("DlDpipeEntry");
7925        for attr in self.clone() {
7926            let attr = match attr {
7927                Ok(a) => a,
7928                Err(err) => {
7929                    fmt.finish()?;
7930                    f.write_str("Err(")?;
7931                    err.fmt(f)?;
7932                    return f.write_str(")");
7933                }
7934            };
7935            match attr {
7936                DlDpipeEntry::DpipeEntryIndex(val) => fmt.field("DpipeEntryIndex", &val),
7937                DlDpipeEntry::DpipeEntryMatchValues(val) => {
7938                    fmt.field("DpipeEntryMatchValues", &val)
7939                }
7940                DlDpipeEntry::DpipeEntryActionValues(val) => {
7941                    fmt.field("DpipeEntryActionValues", &val)
7942                }
7943                DlDpipeEntry::DpipeEntryCounter(val) => fmt.field("DpipeEntryCounter", &val),
7944            };
7945        }
7946        fmt.finish()
7947    }
7948}
7949impl IterableDlDpipeEntry<'_> {
7950    pub fn lookup_attr(
7951        &self,
7952        offset: usize,
7953        missing_type: Option<u16>,
7954    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7955        let mut stack = Vec::new();
7956        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7957        if missing_type.is_some() && cur == offset {
7958            stack.push(("DlDpipeEntry", offset));
7959            return (
7960                stack,
7961                missing_type.and_then(|t| DlDpipeEntry::attr_from_type(t)),
7962            );
7963        }
7964        if cur > offset || cur + self.buf.len() < offset {
7965            return (stack, None);
7966        }
7967        let mut attrs = self.clone();
7968        let mut last_off = cur + attrs.pos;
7969        let mut missing = None;
7970        while let Some(attr) = attrs.next() {
7971            let Ok(attr) = attr else { break };
7972            match attr {
7973                DlDpipeEntry::DpipeEntryIndex(val) => {
7974                    if last_off == offset {
7975                        stack.push(("DpipeEntryIndex", last_off));
7976                        break;
7977                    }
7978                }
7979                DlDpipeEntry::DpipeEntryMatchValues(val) => {
7980                    (stack, missing) = val.lookup_attr(offset, missing_type);
7981                    if !stack.is_empty() {
7982                        break;
7983                    }
7984                }
7985                DlDpipeEntry::DpipeEntryActionValues(val) => {
7986                    (stack, missing) = val.lookup_attr(offset, missing_type);
7987                    if !stack.is_empty() {
7988                        break;
7989                    }
7990                }
7991                DlDpipeEntry::DpipeEntryCounter(val) => {
7992                    if last_off == offset {
7993                        stack.push(("DpipeEntryCounter", last_off));
7994                        break;
7995                    }
7996                }
7997                _ => {}
7998            };
7999            last_off = cur + attrs.pos;
8000        }
8001        if !stack.is_empty() {
8002            stack.push(("DlDpipeEntry", cur));
8003        }
8004        (stack, missing)
8005    }
8006}
8007#[derive(Clone)]
8008pub enum DlDpipeEntryMatchValues<'a> {
8009    #[doc = "Attribute may repeat multiple times (treat it as array)"]
8010    DpipeMatchValue(IterableDlDpipeMatchValue<'a>),
8011}
8012impl<'a> IterableDlDpipeEntryMatchValues<'a> {
8013    #[doc = "Attribute may repeat multiple times (treat it as array)"]
8014    pub fn get_dpipe_match_value(
8015        &self,
8016    ) -> MultiAttrIterable<Self, DlDpipeEntryMatchValues<'a>, IterableDlDpipeMatchValue<'a>> {
8017        MultiAttrIterable::new(self.clone(), |variant| {
8018            if let DlDpipeEntryMatchValues::DpipeMatchValue(val) = variant {
8019                Some(val)
8020            } else {
8021                None
8022            }
8023        })
8024    }
8025}
8026impl DlDpipeEntryMatchValues<'_> {
8027    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeEntryMatchValues<'a> {
8028        IterableDlDpipeEntryMatchValues::with_loc(buf, buf.as_ptr() as usize)
8029    }
8030    fn attr_from_type(r#type: u16) -> Option<&'static str> {
8031        Devlink::attr_from_type(r#type)
8032    }
8033}
8034#[derive(Clone, Copy, Default)]
8035pub struct IterableDlDpipeEntryMatchValues<'a> {
8036    buf: &'a [u8],
8037    pos: usize,
8038    orig_loc: usize,
8039}
8040impl<'a> IterableDlDpipeEntryMatchValues<'a> {
8041    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8042        Self {
8043            buf,
8044            pos: 0,
8045            orig_loc,
8046        }
8047    }
8048    pub fn get_buf(&self) -> &'a [u8] {
8049        self.buf
8050    }
8051}
8052impl<'a> Iterator for IterableDlDpipeEntryMatchValues<'a> {
8053    type Item = Result<DlDpipeEntryMatchValues<'a>, ErrorContext>;
8054    fn next(&mut self) -> Option<Self::Item> {
8055        let pos = self.pos;
8056        let mut r#type;
8057        loop {
8058            r#type = None;
8059            if self.buf.len() == self.pos {
8060                return None;
8061            }
8062            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8063                break;
8064            };
8065            r#type = Some(header.r#type);
8066            let res = match header.r#type {
8067                41u16 => DlDpipeEntryMatchValues::DpipeMatchValue({
8068                    let res = Some(IterableDlDpipeMatchValue::with_loc(next, self.orig_loc));
8069                    let Some(val) = res else { break };
8070                    val
8071                }),
8072                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8073                n => continue,
8074            };
8075            return Some(Ok(res));
8076        }
8077        Some(Err(ErrorContext::new(
8078            "DlDpipeEntryMatchValues",
8079            r#type.and_then(|t| DlDpipeEntryMatchValues::attr_from_type(t)),
8080            self.orig_loc,
8081            self.buf.as_ptr().wrapping_add(pos) as usize,
8082        )))
8083    }
8084}
8085impl<'a> std::fmt::Debug for IterableDlDpipeEntryMatchValues<'_> {
8086    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8087        let mut fmt = f.debug_struct("DlDpipeEntryMatchValues");
8088        for attr in self.clone() {
8089            let attr = match attr {
8090                Ok(a) => a,
8091                Err(err) => {
8092                    fmt.finish()?;
8093                    f.write_str("Err(")?;
8094                    err.fmt(f)?;
8095                    return f.write_str(")");
8096                }
8097            };
8098            match attr {
8099                DlDpipeEntryMatchValues::DpipeMatchValue(val) => fmt.field("DpipeMatchValue", &val),
8100            };
8101        }
8102        fmt.finish()
8103    }
8104}
8105impl IterableDlDpipeEntryMatchValues<'_> {
8106    pub fn lookup_attr(
8107        &self,
8108        offset: usize,
8109        missing_type: Option<u16>,
8110    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8111        let mut stack = Vec::new();
8112        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8113        if missing_type.is_some() && cur == offset {
8114            stack.push(("DlDpipeEntryMatchValues", offset));
8115            return (
8116                stack,
8117                missing_type.and_then(|t| DlDpipeEntryMatchValues::attr_from_type(t)),
8118            );
8119        }
8120        if cur > offset || cur + self.buf.len() < offset {
8121            return (stack, None);
8122        }
8123        let mut attrs = self.clone();
8124        let mut last_off = cur + attrs.pos;
8125        let mut missing = None;
8126        while let Some(attr) = attrs.next() {
8127            let Ok(attr) = attr else { break };
8128            match attr {
8129                DlDpipeEntryMatchValues::DpipeMatchValue(val) => {
8130                    (stack, missing) = val.lookup_attr(offset, missing_type);
8131                    if !stack.is_empty() {
8132                        break;
8133                    }
8134                }
8135                _ => {}
8136            };
8137            last_off = cur + attrs.pos;
8138        }
8139        if !stack.is_empty() {
8140            stack.push(("DlDpipeEntryMatchValues", cur));
8141        }
8142        (stack, missing)
8143    }
8144}
8145#[derive(Clone)]
8146pub enum DlDpipeEntryActionValues<'a> {
8147    #[doc = "Attribute may repeat multiple times (treat it as array)"]
8148    DpipeActionValue(IterableDlDpipeActionValue<'a>),
8149}
8150impl<'a> IterableDlDpipeEntryActionValues<'a> {
8151    #[doc = "Attribute may repeat multiple times (treat it as array)"]
8152    pub fn get_dpipe_action_value(
8153        &self,
8154    ) -> MultiAttrIterable<Self, DlDpipeEntryActionValues<'a>, IterableDlDpipeActionValue<'a>> {
8155        MultiAttrIterable::new(self.clone(), |variant| {
8156            if let DlDpipeEntryActionValues::DpipeActionValue(val) = variant {
8157                Some(val)
8158            } else {
8159                None
8160            }
8161        })
8162    }
8163}
8164impl DlDpipeEntryActionValues<'_> {
8165    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeEntryActionValues<'a> {
8166        IterableDlDpipeEntryActionValues::with_loc(buf, buf.as_ptr() as usize)
8167    }
8168    fn attr_from_type(r#type: u16) -> Option<&'static str> {
8169        Devlink::attr_from_type(r#type)
8170    }
8171}
8172#[derive(Clone, Copy, Default)]
8173pub struct IterableDlDpipeEntryActionValues<'a> {
8174    buf: &'a [u8],
8175    pos: usize,
8176    orig_loc: usize,
8177}
8178impl<'a> IterableDlDpipeEntryActionValues<'a> {
8179    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8180        Self {
8181            buf,
8182            pos: 0,
8183            orig_loc,
8184        }
8185    }
8186    pub fn get_buf(&self) -> &'a [u8] {
8187        self.buf
8188    }
8189}
8190impl<'a> Iterator for IterableDlDpipeEntryActionValues<'a> {
8191    type Item = Result<DlDpipeEntryActionValues<'a>, ErrorContext>;
8192    fn next(&mut self) -> Option<Self::Item> {
8193        let pos = self.pos;
8194        let mut r#type;
8195        loop {
8196            r#type = None;
8197            if self.buf.len() == self.pos {
8198                return None;
8199            }
8200            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8201                break;
8202            };
8203            r#type = Some(header.r#type);
8204            let res = match header.r#type {
8205                44u16 => DlDpipeEntryActionValues::DpipeActionValue({
8206                    let res = Some(IterableDlDpipeActionValue::with_loc(next, self.orig_loc));
8207                    let Some(val) = res else { break };
8208                    val
8209                }),
8210                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8211                n => continue,
8212            };
8213            return Some(Ok(res));
8214        }
8215        Some(Err(ErrorContext::new(
8216            "DlDpipeEntryActionValues",
8217            r#type.and_then(|t| DlDpipeEntryActionValues::attr_from_type(t)),
8218            self.orig_loc,
8219            self.buf.as_ptr().wrapping_add(pos) as usize,
8220        )))
8221    }
8222}
8223impl<'a> std::fmt::Debug for IterableDlDpipeEntryActionValues<'_> {
8224    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8225        let mut fmt = f.debug_struct("DlDpipeEntryActionValues");
8226        for attr in self.clone() {
8227            let attr = match attr {
8228                Ok(a) => a,
8229                Err(err) => {
8230                    fmt.finish()?;
8231                    f.write_str("Err(")?;
8232                    err.fmt(f)?;
8233                    return f.write_str(")");
8234                }
8235            };
8236            match attr {
8237                DlDpipeEntryActionValues::DpipeActionValue(val) => {
8238                    fmt.field("DpipeActionValue", &val)
8239                }
8240            };
8241        }
8242        fmt.finish()
8243    }
8244}
8245impl IterableDlDpipeEntryActionValues<'_> {
8246    pub fn lookup_attr(
8247        &self,
8248        offset: usize,
8249        missing_type: Option<u16>,
8250    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8251        let mut stack = Vec::new();
8252        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8253        if missing_type.is_some() && cur == offset {
8254            stack.push(("DlDpipeEntryActionValues", offset));
8255            return (
8256                stack,
8257                missing_type.and_then(|t| DlDpipeEntryActionValues::attr_from_type(t)),
8258            );
8259        }
8260        if cur > offset || cur + self.buf.len() < offset {
8261            return (stack, None);
8262        }
8263        let mut attrs = self.clone();
8264        let mut last_off = cur + attrs.pos;
8265        let mut missing = None;
8266        while let Some(attr) = attrs.next() {
8267            let Ok(attr) = attr else { break };
8268            match attr {
8269                DlDpipeEntryActionValues::DpipeActionValue(val) => {
8270                    (stack, missing) = val.lookup_attr(offset, missing_type);
8271                    if !stack.is_empty() {
8272                        break;
8273                    }
8274                }
8275                _ => {}
8276            };
8277            last_off = cur + attrs.pos;
8278        }
8279        if !stack.is_empty() {
8280            stack.push(("DlDpipeEntryActionValues", cur));
8281        }
8282        (stack, missing)
8283    }
8284}
8285#[derive(Clone)]
8286pub enum DlDpipeMatch {
8287    #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
8288    DpipeMatchType(u32),
8289    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
8290    DpipeHeaderId(u32),
8291    DpipeHeaderGlobal(u8),
8292    DpipeHeaderIndex(u32),
8293    DpipeFieldId(u32),
8294}
8295impl<'a> IterableDlDpipeMatch<'a> {
8296    #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
8297    pub fn get_dpipe_match_type(&self) -> Result<u32, ErrorContext> {
8298        let mut iter = self.clone();
8299        iter.pos = 0;
8300        for attr in iter {
8301            if let DlDpipeMatch::DpipeMatchType(val) = attr? {
8302                return Ok(val);
8303            }
8304        }
8305        Err(ErrorContext::new_missing(
8306            "DlDpipeMatch",
8307            "DpipeMatchType",
8308            self.orig_loc,
8309            self.buf.as_ptr() as usize,
8310        ))
8311    }
8312    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
8313    pub fn get_dpipe_header_id(&self) -> Result<u32, ErrorContext> {
8314        let mut iter = self.clone();
8315        iter.pos = 0;
8316        for attr in iter {
8317            if let DlDpipeMatch::DpipeHeaderId(val) = attr? {
8318                return Ok(val);
8319            }
8320        }
8321        Err(ErrorContext::new_missing(
8322            "DlDpipeMatch",
8323            "DpipeHeaderId",
8324            self.orig_loc,
8325            self.buf.as_ptr() as usize,
8326        ))
8327    }
8328    pub fn get_dpipe_header_global(&self) -> Result<u8, ErrorContext> {
8329        let mut iter = self.clone();
8330        iter.pos = 0;
8331        for attr in iter {
8332            if let DlDpipeMatch::DpipeHeaderGlobal(val) = attr? {
8333                return Ok(val);
8334            }
8335        }
8336        Err(ErrorContext::new_missing(
8337            "DlDpipeMatch",
8338            "DpipeHeaderGlobal",
8339            self.orig_loc,
8340            self.buf.as_ptr() as usize,
8341        ))
8342    }
8343    pub fn get_dpipe_header_index(&self) -> Result<u32, ErrorContext> {
8344        let mut iter = self.clone();
8345        iter.pos = 0;
8346        for attr in iter {
8347            if let DlDpipeMatch::DpipeHeaderIndex(val) = attr? {
8348                return Ok(val);
8349            }
8350        }
8351        Err(ErrorContext::new_missing(
8352            "DlDpipeMatch",
8353            "DpipeHeaderIndex",
8354            self.orig_loc,
8355            self.buf.as_ptr() as usize,
8356        ))
8357    }
8358    pub fn get_dpipe_field_id(&self) -> Result<u32, ErrorContext> {
8359        let mut iter = self.clone();
8360        iter.pos = 0;
8361        for attr in iter {
8362            if let DlDpipeMatch::DpipeFieldId(val) = attr? {
8363                return Ok(val);
8364            }
8365        }
8366        Err(ErrorContext::new_missing(
8367            "DlDpipeMatch",
8368            "DpipeFieldId",
8369            self.orig_loc,
8370            self.buf.as_ptr() as usize,
8371        ))
8372    }
8373}
8374impl DlDpipeMatch {
8375    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeMatch<'a> {
8376        IterableDlDpipeMatch::with_loc(buf, buf.as_ptr() as usize)
8377    }
8378    fn attr_from_type(r#type: u16) -> Option<&'static str> {
8379        Devlink::attr_from_type(r#type)
8380    }
8381}
8382#[derive(Clone, Copy, Default)]
8383pub struct IterableDlDpipeMatch<'a> {
8384    buf: &'a [u8],
8385    pos: usize,
8386    orig_loc: usize,
8387}
8388impl<'a> IterableDlDpipeMatch<'a> {
8389    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8390        Self {
8391            buf,
8392            pos: 0,
8393            orig_loc,
8394        }
8395    }
8396    pub fn get_buf(&self) -> &'a [u8] {
8397        self.buf
8398    }
8399}
8400impl<'a> Iterator for IterableDlDpipeMatch<'a> {
8401    type Item = Result<DlDpipeMatch, ErrorContext>;
8402    fn next(&mut self) -> Option<Self::Item> {
8403        let pos = self.pos;
8404        let mut r#type;
8405        loop {
8406            r#type = None;
8407            if self.buf.len() == self.pos {
8408                return None;
8409            }
8410            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8411                break;
8412            };
8413            r#type = Some(header.r#type);
8414            let res = match header.r#type {
8415                42u16 => DlDpipeMatch::DpipeMatchType({
8416                    let res = parse_u32(next);
8417                    let Some(val) = res else { break };
8418                    val
8419                }),
8420                52u16 => DlDpipeMatch::DpipeHeaderId({
8421                    let res = parse_u32(next);
8422                    let Some(val) = res else { break };
8423                    val
8424                }),
8425                54u16 => DlDpipeMatch::DpipeHeaderGlobal({
8426                    let res = parse_u8(next);
8427                    let Some(val) = res else { break };
8428                    val
8429                }),
8430                55u16 => DlDpipeMatch::DpipeHeaderIndex({
8431                    let res = parse_u32(next);
8432                    let Some(val) = res else { break };
8433                    val
8434                }),
8435                58u16 => DlDpipeMatch::DpipeFieldId({
8436                    let res = parse_u32(next);
8437                    let Some(val) = res else { break };
8438                    val
8439                }),
8440                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8441                n => continue,
8442            };
8443            return Some(Ok(res));
8444        }
8445        Some(Err(ErrorContext::new(
8446            "DlDpipeMatch",
8447            r#type.and_then(|t| DlDpipeMatch::attr_from_type(t)),
8448            self.orig_loc,
8449            self.buf.as_ptr().wrapping_add(pos) as usize,
8450        )))
8451    }
8452}
8453impl std::fmt::Debug for IterableDlDpipeMatch<'_> {
8454    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8455        let mut fmt = f.debug_struct("DlDpipeMatch");
8456        for attr in self.clone() {
8457            let attr = match attr {
8458                Ok(a) => a,
8459                Err(err) => {
8460                    fmt.finish()?;
8461                    f.write_str("Err(")?;
8462                    err.fmt(f)?;
8463                    return f.write_str(")");
8464                }
8465            };
8466            match attr {
8467                DlDpipeMatch::DpipeMatchType(val) => fmt.field(
8468                    "DpipeMatchType",
8469                    &FormatEnum(val.into(), DpipeMatchType::from_value),
8470                ),
8471                DlDpipeMatch::DpipeHeaderId(val) => fmt.field(
8472                    "DpipeHeaderId",
8473                    &FormatEnum(val.into(), DpipeHeaderId::from_value),
8474                ),
8475                DlDpipeMatch::DpipeHeaderGlobal(val) => fmt.field("DpipeHeaderGlobal", &val),
8476                DlDpipeMatch::DpipeHeaderIndex(val) => fmt.field("DpipeHeaderIndex", &val),
8477                DlDpipeMatch::DpipeFieldId(val) => fmt.field("DpipeFieldId", &val),
8478            };
8479        }
8480        fmt.finish()
8481    }
8482}
8483impl IterableDlDpipeMatch<'_> {
8484    pub fn lookup_attr(
8485        &self,
8486        offset: usize,
8487        missing_type: Option<u16>,
8488    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8489        let mut stack = Vec::new();
8490        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8491        if missing_type.is_some() && cur == offset {
8492            stack.push(("DlDpipeMatch", offset));
8493            return (
8494                stack,
8495                missing_type.and_then(|t| DlDpipeMatch::attr_from_type(t)),
8496            );
8497        }
8498        if cur > offset || cur + self.buf.len() < offset {
8499            return (stack, None);
8500        }
8501        let mut attrs = self.clone();
8502        let mut last_off = cur + attrs.pos;
8503        while let Some(attr) = attrs.next() {
8504            let Ok(attr) = attr else { break };
8505            match attr {
8506                DlDpipeMatch::DpipeMatchType(val) => {
8507                    if last_off == offset {
8508                        stack.push(("DpipeMatchType", last_off));
8509                        break;
8510                    }
8511                }
8512                DlDpipeMatch::DpipeHeaderId(val) => {
8513                    if last_off == offset {
8514                        stack.push(("DpipeHeaderId", last_off));
8515                        break;
8516                    }
8517                }
8518                DlDpipeMatch::DpipeHeaderGlobal(val) => {
8519                    if last_off == offset {
8520                        stack.push(("DpipeHeaderGlobal", last_off));
8521                        break;
8522                    }
8523                }
8524                DlDpipeMatch::DpipeHeaderIndex(val) => {
8525                    if last_off == offset {
8526                        stack.push(("DpipeHeaderIndex", last_off));
8527                        break;
8528                    }
8529                }
8530                DlDpipeMatch::DpipeFieldId(val) => {
8531                    if last_off == offset {
8532                        stack.push(("DpipeFieldId", last_off));
8533                        break;
8534                    }
8535                }
8536                _ => {}
8537            };
8538            last_off = cur + attrs.pos;
8539        }
8540        if !stack.is_empty() {
8541            stack.push(("DlDpipeMatch", cur));
8542        }
8543        (stack, None)
8544    }
8545}
8546#[derive(Clone)]
8547pub enum DlDpipeMatchValue<'a> {
8548    #[doc = "Attribute may repeat multiple times (treat it as array)"]
8549    DpipeMatch(IterableDlDpipeMatch<'a>),
8550    DpipeValue(&'a [u8]),
8551    DpipeValueMask(&'a [u8]),
8552    DpipeValueMapping(u32),
8553}
8554impl<'a> IterableDlDpipeMatchValue<'a> {
8555    #[doc = "Attribute may repeat multiple times (treat it as array)"]
8556    pub fn get_dpipe_match(
8557        &self,
8558    ) -> MultiAttrIterable<Self, DlDpipeMatchValue<'a>, IterableDlDpipeMatch<'a>> {
8559        MultiAttrIterable::new(self.clone(), |variant| {
8560            if let DlDpipeMatchValue::DpipeMatch(val) = variant {
8561                Some(val)
8562            } else {
8563                None
8564            }
8565        })
8566    }
8567    pub fn get_dpipe_value(&self) -> Result<&'a [u8], ErrorContext> {
8568        let mut iter = self.clone();
8569        iter.pos = 0;
8570        for attr in iter {
8571            if let DlDpipeMatchValue::DpipeValue(val) = attr? {
8572                return Ok(val);
8573            }
8574        }
8575        Err(ErrorContext::new_missing(
8576            "DlDpipeMatchValue",
8577            "DpipeValue",
8578            self.orig_loc,
8579            self.buf.as_ptr() as usize,
8580        ))
8581    }
8582    pub fn get_dpipe_value_mask(&self) -> Result<&'a [u8], ErrorContext> {
8583        let mut iter = self.clone();
8584        iter.pos = 0;
8585        for attr in iter {
8586            if let DlDpipeMatchValue::DpipeValueMask(val) = attr? {
8587                return Ok(val);
8588            }
8589        }
8590        Err(ErrorContext::new_missing(
8591            "DlDpipeMatchValue",
8592            "DpipeValueMask",
8593            self.orig_loc,
8594            self.buf.as_ptr() as usize,
8595        ))
8596    }
8597    pub fn get_dpipe_value_mapping(&self) -> Result<u32, ErrorContext> {
8598        let mut iter = self.clone();
8599        iter.pos = 0;
8600        for attr in iter {
8601            if let DlDpipeMatchValue::DpipeValueMapping(val) = attr? {
8602                return Ok(val);
8603            }
8604        }
8605        Err(ErrorContext::new_missing(
8606            "DlDpipeMatchValue",
8607            "DpipeValueMapping",
8608            self.orig_loc,
8609            self.buf.as_ptr() as usize,
8610        ))
8611    }
8612}
8613impl DlDpipeMatchValue<'_> {
8614    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeMatchValue<'a> {
8615        IterableDlDpipeMatchValue::with_loc(buf, buf.as_ptr() as usize)
8616    }
8617    fn attr_from_type(r#type: u16) -> Option<&'static str> {
8618        Devlink::attr_from_type(r#type)
8619    }
8620}
8621#[derive(Clone, Copy, Default)]
8622pub struct IterableDlDpipeMatchValue<'a> {
8623    buf: &'a [u8],
8624    pos: usize,
8625    orig_loc: usize,
8626}
8627impl<'a> IterableDlDpipeMatchValue<'a> {
8628    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8629        Self {
8630            buf,
8631            pos: 0,
8632            orig_loc,
8633        }
8634    }
8635    pub fn get_buf(&self) -> &'a [u8] {
8636        self.buf
8637    }
8638}
8639impl<'a> Iterator for IterableDlDpipeMatchValue<'a> {
8640    type Item = Result<DlDpipeMatchValue<'a>, ErrorContext>;
8641    fn next(&mut self) -> Option<Self::Item> {
8642        let pos = self.pos;
8643        let mut r#type;
8644        loop {
8645            r#type = None;
8646            if self.buf.len() == self.pos {
8647                return None;
8648            }
8649            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8650                break;
8651            };
8652            r#type = Some(header.r#type);
8653            let res = match header.r#type {
8654                40u16 => DlDpipeMatchValue::DpipeMatch({
8655                    let res = Some(IterableDlDpipeMatch::with_loc(next, self.orig_loc));
8656                    let Some(val) = res else { break };
8657                    val
8658                }),
8659                46u16 => DlDpipeMatchValue::DpipeValue({
8660                    let res = Some(next);
8661                    let Some(val) = res else { break };
8662                    val
8663                }),
8664                47u16 => DlDpipeMatchValue::DpipeValueMask({
8665                    let res = Some(next);
8666                    let Some(val) = res else { break };
8667                    val
8668                }),
8669                48u16 => DlDpipeMatchValue::DpipeValueMapping({
8670                    let res = parse_u32(next);
8671                    let Some(val) = res else { break };
8672                    val
8673                }),
8674                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8675                n => continue,
8676            };
8677            return Some(Ok(res));
8678        }
8679        Some(Err(ErrorContext::new(
8680            "DlDpipeMatchValue",
8681            r#type.and_then(|t| DlDpipeMatchValue::attr_from_type(t)),
8682            self.orig_loc,
8683            self.buf.as_ptr().wrapping_add(pos) as usize,
8684        )))
8685    }
8686}
8687impl<'a> std::fmt::Debug for IterableDlDpipeMatchValue<'_> {
8688    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8689        let mut fmt = f.debug_struct("DlDpipeMatchValue");
8690        for attr in self.clone() {
8691            let attr = match attr {
8692                Ok(a) => a,
8693                Err(err) => {
8694                    fmt.finish()?;
8695                    f.write_str("Err(")?;
8696                    err.fmt(f)?;
8697                    return f.write_str(")");
8698                }
8699            };
8700            match attr {
8701                DlDpipeMatchValue::DpipeMatch(val) => fmt.field("DpipeMatch", &val),
8702                DlDpipeMatchValue::DpipeValue(val) => fmt.field("DpipeValue", &val),
8703                DlDpipeMatchValue::DpipeValueMask(val) => fmt.field("DpipeValueMask", &val),
8704                DlDpipeMatchValue::DpipeValueMapping(val) => fmt.field("DpipeValueMapping", &val),
8705            };
8706        }
8707        fmt.finish()
8708    }
8709}
8710impl IterableDlDpipeMatchValue<'_> {
8711    pub fn lookup_attr(
8712        &self,
8713        offset: usize,
8714        missing_type: Option<u16>,
8715    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8716        let mut stack = Vec::new();
8717        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8718        if missing_type.is_some() && cur == offset {
8719            stack.push(("DlDpipeMatchValue", offset));
8720            return (
8721                stack,
8722                missing_type.and_then(|t| DlDpipeMatchValue::attr_from_type(t)),
8723            );
8724        }
8725        if cur > offset || cur + self.buf.len() < offset {
8726            return (stack, None);
8727        }
8728        let mut attrs = self.clone();
8729        let mut last_off = cur + attrs.pos;
8730        let mut missing = None;
8731        while let Some(attr) = attrs.next() {
8732            let Ok(attr) = attr else { break };
8733            match attr {
8734                DlDpipeMatchValue::DpipeMatch(val) => {
8735                    (stack, missing) = val.lookup_attr(offset, missing_type);
8736                    if !stack.is_empty() {
8737                        break;
8738                    }
8739                }
8740                DlDpipeMatchValue::DpipeValue(val) => {
8741                    if last_off == offset {
8742                        stack.push(("DpipeValue", last_off));
8743                        break;
8744                    }
8745                }
8746                DlDpipeMatchValue::DpipeValueMask(val) => {
8747                    if last_off == offset {
8748                        stack.push(("DpipeValueMask", last_off));
8749                        break;
8750                    }
8751                }
8752                DlDpipeMatchValue::DpipeValueMapping(val) => {
8753                    if last_off == offset {
8754                        stack.push(("DpipeValueMapping", last_off));
8755                        break;
8756                    }
8757                }
8758                _ => {}
8759            };
8760            last_off = cur + attrs.pos;
8761        }
8762        if !stack.is_empty() {
8763            stack.push(("DlDpipeMatchValue", cur));
8764        }
8765        (stack, missing)
8766    }
8767}
8768#[derive(Clone)]
8769pub enum DlDpipeAction {
8770    #[doc = "Associated type: [`DpipeActionType`] (enum)"]
8771    DpipeActionType(u32),
8772    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
8773    DpipeHeaderId(u32),
8774    DpipeHeaderGlobal(u8),
8775    DpipeHeaderIndex(u32),
8776    DpipeFieldId(u32),
8777}
8778impl<'a> IterableDlDpipeAction<'a> {
8779    #[doc = "Associated type: [`DpipeActionType`] (enum)"]
8780    pub fn get_dpipe_action_type(&self) -> Result<u32, ErrorContext> {
8781        let mut iter = self.clone();
8782        iter.pos = 0;
8783        for attr in iter {
8784            if let DlDpipeAction::DpipeActionType(val) = attr? {
8785                return Ok(val);
8786            }
8787        }
8788        Err(ErrorContext::new_missing(
8789            "DlDpipeAction",
8790            "DpipeActionType",
8791            self.orig_loc,
8792            self.buf.as_ptr() as usize,
8793        ))
8794    }
8795    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
8796    pub fn get_dpipe_header_id(&self) -> Result<u32, ErrorContext> {
8797        let mut iter = self.clone();
8798        iter.pos = 0;
8799        for attr in iter {
8800            if let DlDpipeAction::DpipeHeaderId(val) = attr? {
8801                return Ok(val);
8802            }
8803        }
8804        Err(ErrorContext::new_missing(
8805            "DlDpipeAction",
8806            "DpipeHeaderId",
8807            self.orig_loc,
8808            self.buf.as_ptr() as usize,
8809        ))
8810    }
8811    pub fn get_dpipe_header_global(&self) -> Result<u8, ErrorContext> {
8812        let mut iter = self.clone();
8813        iter.pos = 0;
8814        for attr in iter {
8815            if let DlDpipeAction::DpipeHeaderGlobal(val) = attr? {
8816                return Ok(val);
8817            }
8818        }
8819        Err(ErrorContext::new_missing(
8820            "DlDpipeAction",
8821            "DpipeHeaderGlobal",
8822            self.orig_loc,
8823            self.buf.as_ptr() as usize,
8824        ))
8825    }
8826    pub fn get_dpipe_header_index(&self) -> Result<u32, ErrorContext> {
8827        let mut iter = self.clone();
8828        iter.pos = 0;
8829        for attr in iter {
8830            if let DlDpipeAction::DpipeHeaderIndex(val) = attr? {
8831                return Ok(val);
8832            }
8833        }
8834        Err(ErrorContext::new_missing(
8835            "DlDpipeAction",
8836            "DpipeHeaderIndex",
8837            self.orig_loc,
8838            self.buf.as_ptr() as usize,
8839        ))
8840    }
8841    pub fn get_dpipe_field_id(&self) -> Result<u32, ErrorContext> {
8842        let mut iter = self.clone();
8843        iter.pos = 0;
8844        for attr in iter {
8845            if let DlDpipeAction::DpipeFieldId(val) = attr? {
8846                return Ok(val);
8847            }
8848        }
8849        Err(ErrorContext::new_missing(
8850            "DlDpipeAction",
8851            "DpipeFieldId",
8852            self.orig_loc,
8853            self.buf.as_ptr() as usize,
8854        ))
8855    }
8856}
8857impl DlDpipeAction {
8858    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeAction<'a> {
8859        IterableDlDpipeAction::with_loc(buf, buf.as_ptr() as usize)
8860    }
8861    fn attr_from_type(r#type: u16) -> Option<&'static str> {
8862        Devlink::attr_from_type(r#type)
8863    }
8864}
8865#[derive(Clone, Copy, Default)]
8866pub struct IterableDlDpipeAction<'a> {
8867    buf: &'a [u8],
8868    pos: usize,
8869    orig_loc: usize,
8870}
8871impl<'a> IterableDlDpipeAction<'a> {
8872    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8873        Self {
8874            buf,
8875            pos: 0,
8876            orig_loc,
8877        }
8878    }
8879    pub fn get_buf(&self) -> &'a [u8] {
8880        self.buf
8881    }
8882}
8883impl<'a> Iterator for IterableDlDpipeAction<'a> {
8884    type Item = Result<DlDpipeAction, ErrorContext>;
8885    fn next(&mut self) -> Option<Self::Item> {
8886        let pos = self.pos;
8887        let mut r#type;
8888        loop {
8889            r#type = None;
8890            if self.buf.len() == self.pos {
8891                return None;
8892            }
8893            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8894                break;
8895            };
8896            r#type = Some(header.r#type);
8897            let res = match header.r#type {
8898                45u16 => DlDpipeAction::DpipeActionType({
8899                    let res = parse_u32(next);
8900                    let Some(val) = res else { break };
8901                    val
8902                }),
8903                52u16 => DlDpipeAction::DpipeHeaderId({
8904                    let res = parse_u32(next);
8905                    let Some(val) = res else { break };
8906                    val
8907                }),
8908                54u16 => DlDpipeAction::DpipeHeaderGlobal({
8909                    let res = parse_u8(next);
8910                    let Some(val) = res else { break };
8911                    val
8912                }),
8913                55u16 => DlDpipeAction::DpipeHeaderIndex({
8914                    let res = parse_u32(next);
8915                    let Some(val) = res else { break };
8916                    val
8917                }),
8918                58u16 => DlDpipeAction::DpipeFieldId({
8919                    let res = parse_u32(next);
8920                    let Some(val) = res else { break };
8921                    val
8922                }),
8923                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8924                n => continue,
8925            };
8926            return Some(Ok(res));
8927        }
8928        Some(Err(ErrorContext::new(
8929            "DlDpipeAction",
8930            r#type.and_then(|t| DlDpipeAction::attr_from_type(t)),
8931            self.orig_loc,
8932            self.buf.as_ptr().wrapping_add(pos) as usize,
8933        )))
8934    }
8935}
8936impl std::fmt::Debug for IterableDlDpipeAction<'_> {
8937    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8938        let mut fmt = f.debug_struct("DlDpipeAction");
8939        for attr in self.clone() {
8940            let attr = match attr {
8941                Ok(a) => a,
8942                Err(err) => {
8943                    fmt.finish()?;
8944                    f.write_str("Err(")?;
8945                    err.fmt(f)?;
8946                    return f.write_str(")");
8947                }
8948            };
8949            match attr {
8950                DlDpipeAction::DpipeActionType(val) => fmt.field(
8951                    "DpipeActionType",
8952                    &FormatEnum(val.into(), DpipeActionType::from_value),
8953                ),
8954                DlDpipeAction::DpipeHeaderId(val) => fmt.field(
8955                    "DpipeHeaderId",
8956                    &FormatEnum(val.into(), DpipeHeaderId::from_value),
8957                ),
8958                DlDpipeAction::DpipeHeaderGlobal(val) => fmt.field("DpipeHeaderGlobal", &val),
8959                DlDpipeAction::DpipeHeaderIndex(val) => fmt.field("DpipeHeaderIndex", &val),
8960                DlDpipeAction::DpipeFieldId(val) => fmt.field("DpipeFieldId", &val),
8961            };
8962        }
8963        fmt.finish()
8964    }
8965}
8966impl IterableDlDpipeAction<'_> {
8967    pub fn lookup_attr(
8968        &self,
8969        offset: usize,
8970        missing_type: Option<u16>,
8971    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8972        let mut stack = Vec::new();
8973        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8974        if missing_type.is_some() && cur == offset {
8975            stack.push(("DlDpipeAction", offset));
8976            return (
8977                stack,
8978                missing_type.and_then(|t| DlDpipeAction::attr_from_type(t)),
8979            );
8980        }
8981        if cur > offset || cur + self.buf.len() < offset {
8982            return (stack, None);
8983        }
8984        let mut attrs = self.clone();
8985        let mut last_off = cur + attrs.pos;
8986        while let Some(attr) = attrs.next() {
8987            let Ok(attr) = attr else { break };
8988            match attr {
8989                DlDpipeAction::DpipeActionType(val) => {
8990                    if last_off == offset {
8991                        stack.push(("DpipeActionType", last_off));
8992                        break;
8993                    }
8994                }
8995                DlDpipeAction::DpipeHeaderId(val) => {
8996                    if last_off == offset {
8997                        stack.push(("DpipeHeaderId", last_off));
8998                        break;
8999                    }
9000                }
9001                DlDpipeAction::DpipeHeaderGlobal(val) => {
9002                    if last_off == offset {
9003                        stack.push(("DpipeHeaderGlobal", last_off));
9004                        break;
9005                    }
9006                }
9007                DlDpipeAction::DpipeHeaderIndex(val) => {
9008                    if last_off == offset {
9009                        stack.push(("DpipeHeaderIndex", last_off));
9010                        break;
9011                    }
9012                }
9013                DlDpipeAction::DpipeFieldId(val) => {
9014                    if last_off == offset {
9015                        stack.push(("DpipeFieldId", last_off));
9016                        break;
9017                    }
9018                }
9019                _ => {}
9020            };
9021            last_off = cur + attrs.pos;
9022        }
9023        if !stack.is_empty() {
9024            stack.push(("DlDpipeAction", cur));
9025        }
9026        (stack, None)
9027    }
9028}
9029#[derive(Clone)]
9030pub enum DlDpipeActionValue<'a> {
9031    #[doc = "Attribute may repeat multiple times (treat it as array)"]
9032    DpipeAction(IterableDlDpipeAction<'a>),
9033    DpipeValue(&'a [u8]),
9034    DpipeValueMask(&'a [u8]),
9035    DpipeValueMapping(u32),
9036}
9037impl<'a> IterableDlDpipeActionValue<'a> {
9038    #[doc = "Attribute may repeat multiple times (treat it as array)"]
9039    pub fn get_dpipe_action(
9040        &self,
9041    ) -> MultiAttrIterable<Self, DlDpipeActionValue<'a>, IterableDlDpipeAction<'a>> {
9042        MultiAttrIterable::new(self.clone(), |variant| {
9043            if let DlDpipeActionValue::DpipeAction(val) = variant {
9044                Some(val)
9045            } else {
9046                None
9047            }
9048        })
9049    }
9050    pub fn get_dpipe_value(&self) -> Result<&'a [u8], ErrorContext> {
9051        let mut iter = self.clone();
9052        iter.pos = 0;
9053        for attr in iter {
9054            if let DlDpipeActionValue::DpipeValue(val) = attr? {
9055                return Ok(val);
9056            }
9057        }
9058        Err(ErrorContext::new_missing(
9059            "DlDpipeActionValue",
9060            "DpipeValue",
9061            self.orig_loc,
9062            self.buf.as_ptr() as usize,
9063        ))
9064    }
9065    pub fn get_dpipe_value_mask(&self) -> Result<&'a [u8], ErrorContext> {
9066        let mut iter = self.clone();
9067        iter.pos = 0;
9068        for attr in iter {
9069            if let DlDpipeActionValue::DpipeValueMask(val) = attr? {
9070                return Ok(val);
9071            }
9072        }
9073        Err(ErrorContext::new_missing(
9074            "DlDpipeActionValue",
9075            "DpipeValueMask",
9076            self.orig_loc,
9077            self.buf.as_ptr() as usize,
9078        ))
9079    }
9080    pub fn get_dpipe_value_mapping(&self) -> Result<u32, ErrorContext> {
9081        let mut iter = self.clone();
9082        iter.pos = 0;
9083        for attr in iter {
9084            if let DlDpipeActionValue::DpipeValueMapping(val) = attr? {
9085                return Ok(val);
9086            }
9087        }
9088        Err(ErrorContext::new_missing(
9089            "DlDpipeActionValue",
9090            "DpipeValueMapping",
9091            self.orig_loc,
9092            self.buf.as_ptr() as usize,
9093        ))
9094    }
9095}
9096impl DlDpipeActionValue<'_> {
9097    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeActionValue<'a> {
9098        IterableDlDpipeActionValue::with_loc(buf, buf.as_ptr() as usize)
9099    }
9100    fn attr_from_type(r#type: u16) -> Option<&'static str> {
9101        Devlink::attr_from_type(r#type)
9102    }
9103}
9104#[derive(Clone, Copy, Default)]
9105pub struct IterableDlDpipeActionValue<'a> {
9106    buf: &'a [u8],
9107    pos: usize,
9108    orig_loc: usize,
9109}
9110impl<'a> IterableDlDpipeActionValue<'a> {
9111    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9112        Self {
9113            buf,
9114            pos: 0,
9115            orig_loc,
9116        }
9117    }
9118    pub fn get_buf(&self) -> &'a [u8] {
9119        self.buf
9120    }
9121}
9122impl<'a> Iterator for IterableDlDpipeActionValue<'a> {
9123    type Item = Result<DlDpipeActionValue<'a>, ErrorContext>;
9124    fn next(&mut self) -> Option<Self::Item> {
9125        let pos = self.pos;
9126        let mut r#type;
9127        loop {
9128            r#type = None;
9129            if self.buf.len() == self.pos {
9130                return None;
9131            }
9132            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9133                break;
9134            };
9135            r#type = Some(header.r#type);
9136            let res = match header.r#type {
9137                43u16 => DlDpipeActionValue::DpipeAction({
9138                    let res = Some(IterableDlDpipeAction::with_loc(next, self.orig_loc));
9139                    let Some(val) = res else { break };
9140                    val
9141                }),
9142                46u16 => DlDpipeActionValue::DpipeValue({
9143                    let res = Some(next);
9144                    let Some(val) = res else { break };
9145                    val
9146                }),
9147                47u16 => DlDpipeActionValue::DpipeValueMask({
9148                    let res = Some(next);
9149                    let Some(val) = res else { break };
9150                    val
9151                }),
9152                48u16 => DlDpipeActionValue::DpipeValueMapping({
9153                    let res = parse_u32(next);
9154                    let Some(val) = res else { break };
9155                    val
9156                }),
9157                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9158                n => continue,
9159            };
9160            return Some(Ok(res));
9161        }
9162        Some(Err(ErrorContext::new(
9163            "DlDpipeActionValue",
9164            r#type.and_then(|t| DlDpipeActionValue::attr_from_type(t)),
9165            self.orig_loc,
9166            self.buf.as_ptr().wrapping_add(pos) as usize,
9167        )))
9168    }
9169}
9170impl<'a> std::fmt::Debug for IterableDlDpipeActionValue<'_> {
9171    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9172        let mut fmt = f.debug_struct("DlDpipeActionValue");
9173        for attr in self.clone() {
9174            let attr = match attr {
9175                Ok(a) => a,
9176                Err(err) => {
9177                    fmt.finish()?;
9178                    f.write_str("Err(")?;
9179                    err.fmt(f)?;
9180                    return f.write_str(")");
9181                }
9182            };
9183            match attr {
9184                DlDpipeActionValue::DpipeAction(val) => fmt.field("DpipeAction", &val),
9185                DlDpipeActionValue::DpipeValue(val) => fmt.field("DpipeValue", &val),
9186                DlDpipeActionValue::DpipeValueMask(val) => fmt.field("DpipeValueMask", &val),
9187                DlDpipeActionValue::DpipeValueMapping(val) => fmt.field("DpipeValueMapping", &val),
9188            };
9189        }
9190        fmt.finish()
9191    }
9192}
9193impl IterableDlDpipeActionValue<'_> {
9194    pub fn lookup_attr(
9195        &self,
9196        offset: usize,
9197        missing_type: Option<u16>,
9198    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9199        let mut stack = Vec::new();
9200        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9201        if missing_type.is_some() && cur == offset {
9202            stack.push(("DlDpipeActionValue", offset));
9203            return (
9204                stack,
9205                missing_type.and_then(|t| DlDpipeActionValue::attr_from_type(t)),
9206            );
9207        }
9208        if cur > offset || cur + self.buf.len() < offset {
9209            return (stack, None);
9210        }
9211        let mut attrs = self.clone();
9212        let mut last_off = cur + attrs.pos;
9213        let mut missing = None;
9214        while let Some(attr) = attrs.next() {
9215            let Ok(attr) = attr else { break };
9216            match attr {
9217                DlDpipeActionValue::DpipeAction(val) => {
9218                    (stack, missing) = val.lookup_attr(offset, missing_type);
9219                    if !stack.is_empty() {
9220                        break;
9221                    }
9222                }
9223                DlDpipeActionValue::DpipeValue(val) => {
9224                    if last_off == offset {
9225                        stack.push(("DpipeValue", last_off));
9226                        break;
9227                    }
9228                }
9229                DlDpipeActionValue::DpipeValueMask(val) => {
9230                    if last_off == offset {
9231                        stack.push(("DpipeValueMask", last_off));
9232                        break;
9233                    }
9234                }
9235                DlDpipeActionValue::DpipeValueMapping(val) => {
9236                    if last_off == offset {
9237                        stack.push(("DpipeValueMapping", last_off));
9238                        break;
9239                    }
9240                }
9241                _ => {}
9242            };
9243            last_off = cur + attrs.pos;
9244        }
9245        if !stack.is_empty() {
9246            stack.push(("DlDpipeActionValue", cur));
9247        }
9248        (stack, missing)
9249    }
9250}
9251#[derive(Clone)]
9252pub enum DlDpipeHeaders<'a> {
9253    #[doc = "Attribute may repeat multiple times (treat it as array)"]
9254    DpipeHeader(IterableDlDpipeHeader<'a>),
9255}
9256impl<'a> IterableDlDpipeHeaders<'a> {
9257    #[doc = "Attribute may repeat multiple times (treat it as array)"]
9258    pub fn get_dpipe_header(
9259        &self,
9260    ) -> MultiAttrIterable<Self, DlDpipeHeaders<'a>, IterableDlDpipeHeader<'a>> {
9261        MultiAttrIterable::new(self.clone(), |variant| {
9262            if let DlDpipeHeaders::DpipeHeader(val) = variant {
9263                Some(val)
9264            } else {
9265                None
9266            }
9267        })
9268    }
9269}
9270impl DlDpipeHeaders<'_> {
9271    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeHeaders<'a> {
9272        IterableDlDpipeHeaders::with_loc(buf, buf.as_ptr() as usize)
9273    }
9274    fn attr_from_type(r#type: u16) -> Option<&'static str> {
9275        Devlink::attr_from_type(r#type)
9276    }
9277}
9278#[derive(Clone, Copy, Default)]
9279pub struct IterableDlDpipeHeaders<'a> {
9280    buf: &'a [u8],
9281    pos: usize,
9282    orig_loc: usize,
9283}
9284impl<'a> IterableDlDpipeHeaders<'a> {
9285    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9286        Self {
9287            buf,
9288            pos: 0,
9289            orig_loc,
9290        }
9291    }
9292    pub fn get_buf(&self) -> &'a [u8] {
9293        self.buf
9294    }
9295}
9296impl<'a> Iterator for IterableDlDpipeHeaders<'a> {
9297    type Item = Result<DlDpipeHeaders<'a>, ErrorContext>;
9298    fn next(&mut self) -> Option<Self::Item> {
9299        let pos = self.pos;
9300        let mut r#type;
9301        loop {
9302            r#type = None;
9303            if self.buf.len() == self.pos {
9304                return None;
9305            }
9306            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9307                break;
9308            };
9309            r#type = Some(header.r#type);
9310            let res = match header.r#type {
9311                50u16 => DlDpipeHeaders::DpipeHeader({
9312                    let res = Some(IterableDlDpipeHeader::with_loc(next, self.orig_loc));
9313                    let Some(val) = res else { break };
9314                    val
9315                }),
9316                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9317                n => continue,
9318            };
9319            return Some(Ok(res));
9320        }
9321        Some(Err(ErrorContext::new(
9322            "DlDpipeHeaders",
9323            r#type.and_then(|t| DlDpipeHeaders::attr_from_type(t)),
9324            self.orig_loc,
9325            self.buf.as_ptr().wrapping_add(pos) as usize,
9326        )))
9327    }
9328}
9329impl<'a> std::fmt::Debug for IterableDlDpipeHeaders<'_> {
9330    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9331        let mut fmt = f.debug_struct("DlDpipeHeaders");
9332        for attr in self.clone() {
9333            let attr = match attr {
9334                Ok(a) => a,
9335                Err(err) => {
9336                    fmt.finish()?;
9337                    f.write_str("Err(")?;
9338                    err.fmt(f)?;
9339                    return f.write_str(")");
9340                }
9341            };
9342            match attr {
9343                DlDpipeHeaders::DpipeHeader(val) => fmt.field("DpipeHeader", &val),
9344            };
9345        }
9346        fmt.finish()
9347    }
9348}
9349impl IterableDlDpipeHeaders<'_> {
9350    pub fn lookup_attr(
9351        &self,
9352        offset: usize,
9353        missing_type: Option<u16>,
9354    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9355        let mut stack = Vec::new();
9356        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9357        if missing_type.is_some() && cur == offset {
9358            stack.push(("DlDpipeHeaders", offset));
9359            return (
9360                stack,
9361                missing_type.and_then(|t| DlDpipeHeaders::attr_from_type(t)),
9362            );
9363        }
9364        if cur > offset || cur + self.buf.len() < offset {
9365            return (stack, None);
9366        }
9367        let mut attrs = self.clone();
9368        let mut last_off = cur + attrs.pos;
9369        let mut missing = None;
9370        while let Some(attr) = attrs.next() {
9371            let Ok(attr) = attr else { break };
9372            match attr {
9373                DlDpipeHeaders::DpipeHeader(val) => {
9374                    (stack, missing) = val.lookup_attr(offset, missing_type);
9375                    if !stack.is_empty() {
9376                        break;
9377                    }
9378                }
9379                _ => {}
9380            };
9381            last_off = cur + attrs.pos;
9382        }
9383        if !stack.is_empty() {
9384            stack.push(("DlDpipeHeaders", cur));
9385        }
9386        (stack, missing)
9387    }
9388}
9389#[derive(Clone)]
9390pub enum DlDpipeHeader<'a> {
9391    DpipeHeaderName(&'a CStr),
9392    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
9393    DpipeHeaderId(u32),
9394    DpipeHeaderFields(IterableDlDpipeHeaderFields<'a>),
9395    DpipeHeaderGlobal(u8),
9396}
9397impl<'a> IterableDlDpipeHeader<'a> {
9398    pub fn get_dpipe_header_name(&self) -> Result<&'a CStr, ErrorContext> {
9399        let mut iter = self.clone();
9400        iter.pos = 0;
9401        for attr in iter {
9402            if let DlDpipeHeader::DpipeHeaderName(val) = attr? {
9403                return Ok(val);
9404            }
9405        }
9406        Err(ErrorContext::new_missing(
9407            "DlDpipeHeader",
9408            "DpipeHeaderName",
9409            self.orig_loc,
9410            self.buf.as_ptr() as usize,
9411        ))
9412    }
9413    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
9414    pub fn get_dpipe_header_id(&self) -> Result<u32, ErrorContext> {
9415        let mut iter = self.clone();
9416        iter.pos = 0;
9417        for attr in iter {
9418            if let DlDpipeHeader::DpipeHeaderId(val) = attr? {
9419                return Ok(val);
9420            }
9421        }
9422        Err(ErrorContext::new_missing(
9423            "DlDpipeHeader",
9424            "DpipeHeaderId",
9425            self.orig_loc,
9426            self.buf.as_ptr() as usize,
9427        ))
9428    }
9429    pub fn get_dpipe_header_fields(&self) -> Result<IterableDlDpipeHeaderFields<'a>, ErrorContext> {
9430        let mut iter = self.clone();
9431        iter.pos = 0;
9432        for attr in iter {
9433            if let DlDpipeHeader::DpipeHeaderFields(val) = attr? {
9434                return Ok(val);
9435            }
9436        }
9437        Err(ErrorContext::new_missing(
9438            "DlDpipeHeader",
9439            "DpipeHeaderFields",
9440            self.orig_loc,
9441            self.buf.as_ptr() as usize,
9442        ))
9443    }
9444    pub fn get_dpipe_header_global(&self) -> Result<u8, ErrorContext> {
9445        let mut iter = self.clone();
9446        iter.pos = 0;
9447        for attr in iter {
9448            if let DlDpipeHeader::DpipeHeaderGlobal(val) = attr? {
9449                return Ok(val);
9450            }
9451        }
9452        Err(ErrorContext::new_missing(
9453            "DlDpipeHeader",
9454            "DpipeHeaderGlobal",
9455            self.orig_loc,
9456            self.buf.as_ptr() as usize,
9457        ))
9458    }
9459}
9460impl DlDpipeHeader<'_> {
9461    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeHeader<'a> {
9462        IterableDlDpipeHeader::with_loc(buf, buf.as_ptr() as usize)
9463    }
9464    fn attr_from_type(r#type: u16) -> Option<&'static str> {
9465        Devlink::attr_from_type(r#type)
9466    }
9467}
9468#[derive(Clone, Copy, Default)]
9469pub struct IterableDlDpipeHeader<'a> {
9470    buf: &'a [u8],
9471    pos: usize,
9472    orig_loc: usize,
9473}
9474impl<'a> IterableDlDpipeHeader<'a> {
9475    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9476        Self {
9477            buf,
9478            pos: 0,
9479            orig_loc,
9480        }
9481    }
9482    pub fn get_buf(&self) -> &'a [u8] {
9483        self.buf
9484    }
9485}
9486impl<'a> Iterator for IterableDlDpipeHeader<'a> {
9487    type Item = Result<DlDpipeHeader<'a>, ErrorContext>;
9488    fn next(&mut self) -> Option<Self::Item> {
9489        let pos = self.pos;
9490        let mut r#type;
9491        loop {
9492            r#type = None;
9493            if self.buf.len() == self.pos {
9494                return None;
9495            }
9496            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9497                break;
9498            };
9499            r#type = Some(header.r#type);
9500            let res = match header.r#type {
9501                51u16 => DlDpipeHeader::DpipeHeaderName({
9502                    let res = CStr::from_bytes_with_nul(next).ok();
9503                    let Some(val) = res else { break };
9504                    val
9505                }),
9506                52u16 => DlDpipeHeader::DpipeHeaderId({
9507                    let res = parse_u32(next);
9508                    let Some(val) = res else { break };
9509                    val
9510                }),
9511                53u16 => DlDpipeHeader::DpipeHeaderFields({
9512                    let res = Some(IterableDlDpipeHeaderFields::with_loc(next, self.orig_loc));
9513                    let Some(val) = res else { break };
9514                    val
9515                }),
9516                54u16 => DlDpipeHeader::DpipeHeaderGlobal({
9517                    let res = parse_u8(next);
9518                    let Some(val) = res else { break };
9519                    val
9520                }),
9521                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9522                n => continue,
9523            };
9524            return Some(Ok(res));
9525        }
9526        Some(Err(ErrorContext::new(
9527            "DlDpipeHeader",
9528            r#type.and_then(|t| DlDpipeHeader::attr_from_type(t)),
9529            self.orig_loc,
9530            self.buf.as_ptr().wrapping_add(pos) as usize,
9531        )))
9532    }
9533}
9534impl<'a> std::fmt::Debug for IterableDlDpipeHeader<'_> {
9535    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9536        let mut fmt = f.debug_struct("DlDpipeHeader");
9537        for attr in self.clone() {
9538            let attr = match attr {
9539                Ok(a) => a,
9540                Err(err) => {
9541                    fmt.finish()?;
9542                    f.write_str("Err(")?;
9543                    err.fmt(f)?;
9544                    return f.write_str(")");
9545                }
9546            };
9547            match attr {
9548                DlDpipeHeader::DpipeHeaderName(val) => fmt.field("DpipeHeaderName", &val),
9549                DlDpipeHeader::DpipeHeaderId(val) => fmt.field(
9550                    "DpipeHeaderId",
9551                    &FormatEnum(val.into(), DpipeHeaderId::from_value),
9552                ),
9553                DlDpipeHeader::DpipeHeaderFields(val) => fmt.field("DpipeHeaderFields", &val),
9554                DlDpipeHeader::DpipeHeaderGlobal(val) => fmt.field("DpipeHeaderGlobal", &val),
9555            };
9556        }
9557        fmt.finish()
9558    }
9559}
9560impl IterableDlDpipeHeader<'_> {
9561    pub fn lookup_attr(
9562        &self,
9563        offset: usize,
9564        missing_type: Option<u16>,
9565    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9566        let mut stack = Vec::new();
9567        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9568        if missing_type.is_some() && cur == offset {
9569            stack.push(("DlDpipeHeader", offset));
9570            return (
9571                stack,
9572                missing_type.and_then(|t| DlDpipeHeader::attr_from_type(t)),
9573            );
9574        }
9575        if cur > offset || cur + self.buf.len() < offset {
9576            return (stack, None);
9577        }
9578        let mut attrs = self.clone();
9579        let mut last_off = cur + attrs.pos;
9580        let mut missing = None;
9581        while let Some(attr) = attrs.next() {
9582            let Ok(attr) = attr else { break };
9583            match attr {
9584                DlDpipeHeader::DpipeHeaderName(val) => {
9585                    if last_off == offset {
9586                        stack.push(("DpipeHeaderName", last_off));
9587                        break;
9588                    }
9589                }
9590                DlDpipeHeader::DpipeHeaderId(val) => {
9591                    if last_off == offset {
9592                        stack.push(("DpipeHeaderId", last_off));
9593                        break;
9594                    }
9595                }
9596                DlDpipeHeader::DpipeHeaderFields(val) => {
9597                    (stack, missing) = val.lookup_attr(offset, missing_type);
9598                    if !stack.is_empty() {
9599                        break;
9600                    }
9601                }
9602                DlDpipeHeader::DpipeHeaderGlobal(val) => {
9603                    if last_off == offset {
9604                        stack.push(("DpipeHeaderGlobal", last_off));
9605                        break;
9606                    }
9607                }
9608                _ => {}
9609            };
9610            last_off = cur + attrs.pos;
9611        }
9612        if !stack.is_empty() {
9613            stack.push(("DlDpipeHeader", cur));
9614        }
9615        (stack, missing)
9616    }
9617}
9618#[derive(Clone)]
9619pub enum DlDpipeHeaderFields<'a> {
9620    #[doc = "Attribute may repeat multiple times (treat it as array)"]
9621    DpipeField(IterableDlDpipeField<'a>),
9622}
9623impl<'a> IterableDlDpipeHeaderFields<'a> {
9624    #[doc = "Attribute may repeat multiple times (treat it as array)"]
9625    pub fn get_dpipe_field(
9626        &self,
9627    ) -> MultiAttrIterable<Self, DlDpipeHeaderFields<'a>, IterableDlDpipeField<'a>> {
9628        MultiAttrIterable::new(self.clone(), |variant| {
9629            if let DlDpipeHeaderFields::DpipeField(val) = variant {
9630                Some(val)
9631            } else {
9632                None
9633            }
9634        })
9635    }
9636}
9637impl DlDpipeHeaderFields<'_> {
9638    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeHeaderFields<'a> {
9639        IterableDlDpipeHeaderFields::with_loc(buf, buf.as_ptr() as usize)
9640    }
9641    fn attr_from_type(r#type: u16) -> Option<&'static str> {
9642        Devlink::attr_from_type(r#type)
9643    }
9644}
9645#[derive(Clone, Copy, Default)]
9646pub struct IterableDlDpipeHeaderFields<'a> {
9647    buf: &'a [u8],
9648    pos: usize,
9649    orig_loc: usize,
9650}
9651impl<'a> IterableDlDpipeHeaderFields<'a> {
9652    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9653        Self {
9654            buf,
9655            pos: 0,
9656            orig_loc,
9657        }
9658    }
9659    pub fn get_buf(&self) -> &'a [u8] {
9660        self.buf
9661    }
9662}
9663impl<'a> Iterator for IterableDlDpipeHeaderFields<'a> {
9664    type Item = Result<DlDpipeHeaderFields<'a>, ErrorContext>;
9665    fn next(&mut self) -> Option<Self::Item> {
9666        let pos = self.pos;
9667        let mut r#type;
9668        loop {
9669            r#type = None;
9670            if self.buf.len() == self.pos {
9671                return None;
9672            }
9673            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9674                break;
9675            };
9676            r#type = Some(header.r#type);
9677            let res = match header.r#type {
9678                56u16 => DlDpipeHeaderFields::DpipeField({
9679                    let res = Some(IterableDlDpipeField::with_loc(next, self.orig_loc));
9680                    let Some(val) = res else { break };
9681                    val
9682                }),
9683                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9684                n => continue,
9685            };
9686            return Some(Ok(res));
9687        }
9688        Some(Err(ErrorContext::new(
9689            "DlDpipeHeaderFields",
9690            r#type.and_then(|t| DlDpipeHeaderFields::attr_from_type(t)),
9691            self.orig_loc,
9692            self.buf.as_ptr().wrapping_add(pos) as usize,
9693        )))
9694    }
9695}
9696impl<'a> std::fmt::Debug for IterableDlDpipeHeaderFields<'_> {
9697    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9698        let mut fmt = f.debug_struct("DlDpipeHeaderFields");
9699        for attr in self.clone() {
9700            let attr = match attr {
9701                Ok(a) => a,
9702                Err(err) => {
9703                    fmt.finish()?;
9704                    f.write_str("Err(")?;
9705                    err.fmt(f)?;
9706                    return f.write_str(")");
9707                }
9708            };
9709            match attr {
9710                DlDpipeHeaderFields::DpipeField(val) => fmt.field("DpipeField", &val),
9711            };
9712        }
9713        fmt.finish()
9714    }
9715}
9716impl IterableDlDpipeHeaderFields<'_> {
9717    pub fn lookup_attr(
9718        &self,
9719        offset: usize,
9720        missing_type: Option<u16>,
9721    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9722        let mut stack = Vec::new();
9723        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9724        if missing_type.is_some() && cur == offset {
9725            stack.push(("DlDpipeHeaderFields", offset));
9726            return (
9727                stack,
9728                missing_type.and_then(|t| DlDpipeHeaderFields::attr_from_type(t)),
9729            );
9730        }
9731        if cur > offset || cur + self.buf.len() < offset {
9732            return (stack, None);
9733        }
9734        let mut attrs = self.clone();
9735        let mut last_off = cur + attrs.pos;
9736        let mut missing = None;
9737        while let Some(attr) = attrs.next() {
9738            let Ok(attr) = attr else { break };
9739            match attr {
9740                DlDpipeHeaderFields::DpipeField(val) => {
9741                    (stack, missing) = val.lookup_attr(offset, missing_type);
9742                    if !stack.is_empty() {
9743                        break;
9744                    }
9745                }
9746                _ => {}
9747            };
9748            last_off = cur + attrs.pos;
9749        }
9750        if !stack.is_empty() {
9751            stack.push(("DlDpipeHeaderFields", cur));
9752        }
9753        (stack, missing)
9754    }
9755}
9756#[derive(Clone)]
9757pub enum DlDpipeField<'a> {
9758    DpipeFieldName(&'a CStr),
9759    DpipeFieldId(u32),
9760    DpipeFieldBitwidth(u32),
9761    #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
9762    DpipeFieldMappingType(u32),
9763}
9764impl<'a> IterableDlDpipeField<'a> {
9765    pub fn get_dpipe_field_name(&self) -> Result<&'a CStr, ErrorContext> {
9766        let mut iter = self.clone();
9767        iter.pos = 0;
9768        for attr in iter {
9769            if let DlDpipeField::DpipeFieldName(val) = attr? {
9770                return Ok(val);
9771            }
9772        }
9773        Err(ErrorContext::new_missing(
9774            "DlDpipeField",
9775            "DpipeFieldName",
9776            self.orig_loc,
9777            self.buf.as_ptr() as usize,
9778        ))
9779    }
9780    pub fn get_dpipe_field_id(&self) -> Result<u32, ErrorContext> {
9781        let mut iter = self.clone();
9782        iter.pos = 0;
9783        for attr in iter {
9784            if let DlDpipeField::DpipeFieldId(val) = attr? {
9785                return Ok(val);
9786            }
9787        }
9788        Err(ErrorContext::new_missing(
9789            "DlDpipeField",
9790            "DpipeFieldId",
9791            self.orig_loc,
9792            self.buf.as_ptr() as usize,
9793        ))
9794    }
9795    pub fn get_dpipe_field_bitwidth(&self) -> Result<u32, ErrorContext> {
9796        let mut iter = self.clone();
9797        iter.pos = 0;
9798        for attr in iter {
9799            if let DlDpipeField::DpipeFieldBitwidth(val) = attr? {
9800                return Ok(val);
9801            }
9802        }
9803        Err(ErrorContext::new_missing(
9804            "DlDpipeField",
9805            "DpipeFieldBitwidth",
9806            self.orig_loc,
9807            self.buf.as_ptr() as usize,
9808        ))
9809    }
9810    #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
9811    pub fn get_dpipe_field_mapping_type(&self) -> Result<u32, ErrorContext> {
9812        let mut iter = self.clone();
9813        iter.pos = 0;
9814        for attr in iter {
9815            if let DlDpipeField::DpipeFieldMappingType(val) = attr? {
9816                return Ok(val);
9817            }
9818        }
9819        Err(ErrorContext::new_missing(
9820            "DlDpipeField",
9821            "DpipeFieldMappingType",
9822            self.orig_loc,
9823            self.buf.as_ptr() as usize,
9824        ))
9825    }
9826}
9827impl DlDpipeField<'_> {
9828    pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeField<'a> {
9829        IterableDlDpipeField::with_loc(buf, buf.as_ptr() as usize)
9830    }
9831    fn attr_from_type(r#type: u16) -> Option<&'static str> {
9832        Devlink::attr_from_type(r#type)
9833    }
9834}
9835#[derive(Clone, Copy, Default)]
9836pub struct IterableDlDpipeField<'a> {
9837    buf: &'a [u8],
9838    pos: usize,
9839    orig_loc: usize,
9840}
9841impl<'a> IterableDlDpipeField<'a> {
9842    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9843        Self {
9844            buf,
9845            pos: 0,
9846            orig_loc,
9847        }
9848    }
9849    pub fn get_buf(&self) -> &'a [u8] {
9850        self.buf
9851    }
9852}
9853impl<'a> Iterator for IterableDlDpipeField<'a> {
9854    type Item = Result<DlDpipeField<'a>, ErrorContext>;
9855    fn next(&mut self) -> Option<Self::Item> {
9856        let pos = self.pos;
9857        let mut r#type;
9858        loop {
9859            r#type = None;
9860            if self.buf.len() == self.pos {
9861                return None;
9862            }
9863            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9864                break;
9865            };
9866            r#type = Some(header.r#type);
9867            let res = match header.r#type {
9868                57u16 => DlDpipeField::DpipeFieldName({
9869                    let res = CStr::from_bytes_with_nul(next).ok();
9870                    let Some(val) = res else { break };
9871                    val
9872                }),
9873                58u16 => DlDpipeField::DpipeFieldId({
9874                    let res = parse_u32(next);
9875                    let Some(val) = res else { break };
9876                    val
9877                }),
9878                59u16 => DlDpipeField::DpipeFieldBitwidth({
9879                    let res = parse_u32(next);
9880                    let Some(val) = res else { break };
9881                    val
9882                }),
9883                60u16 => DlDpipeField::DpipeFieldMappingType({
9884                    let res = parse_u32(next);
9885                    let Some(val) = res else { break };
9886                    val
9887                }),
9888                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9889                n => continue,
9890            };
9891            return Some(Ok(res));
9892        }
9893        Some(Err(ErrorContext::new(
9894            "DlDpipeField",
9895            r#type.and_then(|t| DlDpipeField::attr_from_type(t)),
9896            self.orig_loc,
9897            self.buf.as_ptr().wrapping_add(pos) as usize,
9898        )))
9899    }
9900}
9901impl<'a> std::fmt::Debug for IterableDlDpipeField<'_> {
9902    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9903        let mut fmt = f.debug_struct("DlDpipeField");
9904        for attr in self.clone() {
9905            let attr = match attr {
9906                Ok(a) => a,
9907                Err(err) => {
9908                    fmt.finish()?;
9909                    f.write_str("Err(")?;
9910                    err.fmt(f)?;
9911                    return f.write_str(")");
9912                }
9913            };
9914            match attr {
9915                DlDpipeField::DpipeFieldName(val) => fmt.field("DpipeFieldName", &val),
9916                DlDpipeField::DpipeFieldId(val) => fmt.field("DpipeFieldId", &val),
9917                DlDpipeField::DpipeFieldBitwidth(val) => fmt.field("DpipeFieldBitwidth", &val),
9918                DlDpipeField::DpipeFieldMappingType(val) => fmt.field(
9919                    "DpipeFieldMappingType",
9920                    &FormatEnum(val.into(), DpipeFieldMappingType::from_value),
9921                ),
9922            };
9923        }
9924        fmt.finish()
9925    }
9926}
9927impl IterableDlDpipeField<'_> {
9928    pub fn lookup_attr(
9929        &self,
9930        offset: usize,
9931        missing_type: Option<u16>,
9932    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9933        let mut stack = Vec::new();
9934        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9935        if missing_type.is_some() && cur == offset {
9936            stack.push(("DlDpipeField", offset));
9937            return (
9938                stack,
9939                missing_type.and_then(|t| DlDpipeField::attr_from_type(t)),
9940            );
9941        }
9942        if cur > offset || cur + self.buf.len() < offset {
9943            return (stack, None);
9944        }
9945        let mut attrs = self.clone();
9946        let mut last_off = cur + attrs.pos;
9947        while let Some(attr) = attrs.next() {
9948            let Ok(attr) = attr else { break };
9949            match attr {
9950                DlDpipeField::DpipeFieldName(val) => {
9951                    if last_off == offset {
9952                        stack.push(("DpipeFieldName", last_off));
9953                        break;
9954                    }
9955                }
9956                DlDpipeField::DpipeFieldId(val) => {
9957                    if last_off == offset {
9958                        stack.push(("DpipeFieldId", last_off));
9959                        break;
9960                    }
9961                }
9962                DlDpipeField::DpipeFieldBitwidth(val) => {
9963                    if last_off == offset {
9964                        stack.push(("DpipeFieldBitwidth", last_off));
9965                        break;
9966                    }
9967                }
9968                DlDpipeField::DpipeFieldMappingType(val) => {
9969                    if last_off == offset {
9970                        stack.push(("DpipeFieldMappingType", last_off));
9971                        break;
9972                    }
9973                }
9974                _ => {}
9975            };
9976            last_off = cur + attrs.pos;
9977        }
9978        if !stack.is_empty() {
9979            stack.push(("DlDpipeField", cur));
9980        }
9981        (stack, None)
9982    }
9983}
9984#[derive(Clone)]
9985pub enum DlResource<'a> {
9986    ResourceName(&'a CStr),
9987    ResourceId(u64),
9988    ResourceSize(u64),
9989    ResourceSizeNew(u64),
9990    ResourceSizeValid(u8),
9991    ResourceSizeMin(u64),
9992    ResourceSizeMax(u64),
9993    ResourceSizeGran(u64),
9994    #[doc = "Associated type: [`ResourceUnit`] (enum)"]
9995    ResourceUnit(u8),
9996    ResourceOcc(u64),
9997}
9998impl<'a> IterableDlResource<'a> {
9999    pub fn get_resource_name(&self) -> Result<&'a CStr, ErrorContext> {
10000        let mut iter = self.clone();
10001        iter.pos = 0;
10002        for attr in iter {
10003            if let DlResource::ResourceName(val) = attr? {
10004                return Ok(val);
10005            }
10006        }
10007        Err(ErrorContext::new_missing(
10008            "DlResource",
10009            "ResourceName",
10010            self.orig_loc,
10011            self.buf.as_ptr() as usize,
10012        ))
10013    }
10014    pub fn get_resource_id(&self) -> Result<u64, ErrorContext> {
10015        let mut iter = self.clone();
10016        iter.pos = 0;
10017        for attr in iter {
10018            if let DlResource::ResourceId(val) = attr? {
10019                return Ok(val);
10020            }
10021        }
10022        Err(ErrorContext::new_missing(
10023            "DlResource",
10024            "ResourceId",
10025            self.orig_loc,
10026            self.buf.as_ptr() as usize,
10027        ))
10028    }
10029    pub fn get_resource_size(&self) -> Result<u64, ErrorContext> {
10030        let mut iter = self.clone();
10031        iter.pos = 0;
10032        for attr in iter {
10033            if let DlResource::ResourceSize(val) = attr? {
10034                return Ok(val);
10035            }
10036        }
10037        Err(ErrorContext::new_missing(
10038            "DlResource",
10039            "ResourceSize",
10040            self.orig_loc,
10041            self.buf.as_ptr() as usize,
10042        ))
10043    }
10044    pub fn get_resource_size_new(&self) -> Result<u64, ErrorContext> {
10045        let mut iter = self.clone();
10046        iter.pos = 0;
10047        for attr in iter {
10048            if let DlResource::ResourceSizeNew(val) = attr? {
10049                return Ok(val);
10050            }
10051        }
10052        Err(ErrorContext::new_missing(
10053            "DlResource",
10054            "ResourceSizeNew",
10055            self.orig_loc,
10056            self.buf.as_ptr() as usize,
10057        ))
10058    }
10059    pub fn get_resource_size_valid(&self) -> Result<u8, ErrorContext> {
10060        let mut iter = self.clone();
10061        iter.pos = 0;
10062        for attr in iter {
10063            if let DlResource::ResourceSizeValid(val) = attr? {
10064                return Ok(val);
10065            }
10066        }
10067        Err(ErrorContext::new_missing(
10068            "DlResource",
10069            "ResourceSizeValid",
10070            self.orig_loc,
10071            self.buf.as_ptr() as usize,
10072        ))
10073    }
10074    pub fn get_resource_size_min(&self) -> Result<u64, ErrorContext> {
10075        let mut iter = self.clone();
10076        iter.pos = 0;
10077        for attr in iter {
10078            if let DlResource::ResourceSizeMin(val) = attr? {
10079                return Ok(val);
10080            }
10081        }
10082        Err(ErrorContext::new_missing(
10083            "DlResource",
10084            "ResourceSizeMin",
10085            self.orig_loc,
10086            self.buf.as_ptr() as usize,
10087        ))
10088    }
10089    pub fn get_resource_size_max(&self) -> Result<u64, ErrorContext> {
10090        let mut iter = self.clone();
10091        iter.pos = 0;
10092        for attr in iter {
10093            if let DlResource::ResourceSizeMax(val) = attr? {
10094                return Ok(val);
10095            }
10096        }
10097        Err(ErrorContext::new_missing(
10098            "DlResource",
10099            "ResourceSizeMax",
10100            self.orig_loc,
10101            self.buf.as_ptr() as usize,
10102        ))
10103    }
10104    pub fn get_resource_size_gran(&self) -> Result<u64, ErrorContext> {
10105        let mut iter = self.clone();
10106        iter.pos = 0;
10107        for attr in iter {
10108            if let DlResource::ResourceSizeGran(val) = attr? {
10109                return Ok(val);
10110            }
10111        }
10112        Err(ErrorContext::new_missing(
10113            "DlResource",
10114            "ResourceSizeGran",
10115            self.orig_loc,
10116            self.buf.as_ptr() as usize,
10117        ))
10118    }
10119    #[doc = "Associated type: [`ResourceUnit`] (enum)"]
10120    pub fn get_resource_unit(&self) -> Result<u8, ErrorContext> {
10121        let mut iter = self.clone();
10122        iter.pos = 0;
10123        for attr in iter {
10124            if let DlResource::ResourceUnit(val) = attr? {
10125                return Ok(val);
10126            }
10127        }
10128        Err(ErrorContext::new_missing(
10129            "DlResource",
10130            "ResourceUnit",
10131            self.orig_loc,
10132            self.buf.as_ptr() as usize,
10133        ))
10134    }
10135    pub fn get_resource_occ(&self) -> Result<u64, ErrorContext> {
10136        let mut iter = self.clone();
10137        iter.pos = 0;
10138        for attr in iter {
10139            if let DlResource::ResourceOcc(val) = attr? {
10140                return Ok(val);
10141            }
10142        }
10143        Err(ErrorContext::new_missing(
10144            "DlResource",
10145            "ResourceOcc",
10146            self.orig_loc,
10147            self.buf.as_ptr() as usize,
10148        ))
10149    }
10150}
10151impl DlResource<'_> {
10152    pub fn new<'a>(buf: &'a [u8]) -> IterableDlResource<'a> {
10153        IterableDlResource::with_loc(buf, buf.as_ptr() as usize)
10154    }
10155    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10156        Devlink::attr_from_type(r#type)
10157    }
10158}
10159#[derive(Clone, Copy, Default)]
10160pub struct IterableDlResource<'a> {
10161    buf: &'a [u8],
10162    pos: usize,
10163    orig_loc: usize,
10164}
10165impl<'a> IterableDlResource<'a> {
10166    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10167        Self {
10168            buf,
10169            pos: 0,
10170            orig_loc,
10171        }
10172    }
10173    pub fn get_buf(&self) -> &'a [u8] {
10174        self.buf
10175    }
10176}
10177impl<'a> Iterator for IterableDlResource<'a> {
10178    type Item = Result<DlResource<'a>, ErrorContext>;
10179    fn next(&mut self) -> Option<Self::Item> {
10180        let pos = self.pos;
10181        let mut r#type;
10182        loop {
10183            r#type = None;
10184            if self.buf.len() == self.pos {
10185                return None;
10186            }
10187            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10188                break;
10189            };
10190            r#type = Some(header.r#type);
10191            let res = match header.r#type {
10192                65u16 => DlResource::ResourceName({
10193                    let res = CStr::from_bytes_with_nul(next).ok();
10194                    let Some(val) = res else { break };
10195                    val
10196                }),
10197                66u16 => DlResource::ResourceId({
10198                    let res = parse_u64(next);
10199                    let Some(val) = res else { break };
10200                    val
10201                }),
10202                67u16 => DlResource::ResourceSize({
10203                    let res = parse_u64(next);
10204                    let Some(val) = res else { break };
10205                    val
10206                }),
10207                68u16 => DlResource::ResourceSizeNew({
10208                    let res = parse_u64(next);
10209                    let Some(val) = res else { break };
10210                    val
10211                }),
10212                69u16 => DlResource::ResourceSizeValid({
10213                    let res = parse_u8(next);
10214                    let Some(val) = res else { break };
10215                    val
10216                }),
10217                70u16 => DlResource::ResourceSizeMin({
10218                    let res = parse_u64(next);
10219                    let Some(val) = res else { break };
10220                    val
10221                }),
10222                71u16 => DlResource::ResourceSizeMax({
10223                    let res = parse_u64(next);
10224                    let Some(val) = res else { break };
10225                    val
10226                }),
10227                72u16 => DlResource::ResourceSizeGran({
10228                    let res = parse_u64(next);
10229                    let Some(val) = res else { break };
10230                    val
10231                }),
10232                73u16 => DlResource::ResourceUnit({
10233                    let res = parse_u8(next);
10234                    let Some(val) = res else { break };
10235                    val
10236                }),
10237                74u16 => DlResource::ResourceOcc({
10238                    let res = parse_u64(next);
10239                    let Some(val) = res else { break };
10240                    val
10241                }),
10242                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10243                n => continue,
10244            };
10245            return Some(Ok(res));
10246        }
10247        Some(Err(ErrorContext::new(
10248            "DlResource",
10249            r#type.and_then(|t| DlResource::attr_from_type(t)),
10250            self.orig_loc,
10251            self.buf.as_ptr().wrapping_add(pos) as usize,
10252        )))
10253    }
10254}
10255impl<'a> std::fmt::Debug for IterableDlResource<'_> {
10256    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10257        let mut fmt = f.debug_struct("DlResource");
10258        for attr in self.clone() {
10259            let attr = match attr {
10260                Ok(a) => a,
10261                Err(err) => {
10262                    fmt.finish()?;
10263                    f.write_str("Err(")?;
10264                    err.fmt(f)?;
10265                    return f.write_str(")");
10266                }
10267            };
10268            match attr {
10269                DlResource::ResourceName(val) => fmt.field("ResourceName", &val),
10270                DlResource::ResourceId(val) => fmt.field("ResourceId", &val),
10271                DlResource::ResourceSize(val) => fmt.field("ResourceSize", &val),
10272                DlResource::ResourceSizeNew(val) => fmt.field("ResourceSizeNew", &val),
10273                DlResource::ResourceSizeValid(val) => fmt.field("ResourceSizeValid", &val),
10274                DlResource::ResourceSizeMin(val) => fmt.field("ResourceSizeMin", &val),
10275                DlResource::ResourceSizeMax(val) => fmt.field("ResourceSizeMax", &val),
10276                DlResource::ResourceSizeGran(val) => fmt.field("ResourceSizeGran", &val),
10277                DlResource::ResourceUnit(val) => fmt.field(
10278                    "ResourceUnit",
10279                    &FormatEnum(val.into(), ResourceUnit::from_value),
10280                ),
10281                DlResource::ResourceOcc(val) => fmt.field("ResourceOcc", &val),
10282            };
10283        }
10284        fmt.finish()
10285    }
10286}
10287impl IterableDlResource<'_> {
10288    pub fn lookup_attr(
10289        &self,
10290        offset: usize,
10291        missing_type: Option<u16>,
10292    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10293        let mut stack = Vec::new();
10294        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10295        if missing_type.is_some() && cur == offset {
10296            stack.push(("DlResource", offset));
10297            return (
10298                stack,
10299                missing_type.and_then(|t| DlResource::attr_from_type(t)),
10300            );
10301        }
10302        if cur > offset || cur + self.buf.len() < offset {
10303            return (stack, None);
10304        }
10305        let mut attrs = self.clone();
10306        let mut last_off = cur + attrs.pos;
10307        while let Some(attr) = attrs.next() {
10308            let Ok(attr) = attr else { break };
10309            match attr {
10310                DlResource::ResourceName(val) => {
10311                    if last_off == offset {
10312                        stack.push(("ResourceName", last_off));
10313                        break;
10314                    }
10315                }
10316                DlResource::ResourceId(val) => {
10317                    if last_off == offset {
10318                        stack.push(("ResourceId", last_off));
10319                        break;
10320                    }
10321                }
10322                DlResource::ResourceSize(val) => {
10323                    if last_off == offset {
10324                        stack.push(("ResourceSize", last_off));
10325                        break;
10326                    }
10327                }
10328                DlResource::ResourceSizeNew(val) => {
10329                    if last_off == offset {
10330                        stack.push(("ResourceSizeNew", last_off));
10331                        break;
10332                    }
10333                }
10334                DlResource::ResourceSizeValid(val) => {
10335                    if last_off == offset {
10336                        stack.push(("ResourceSizeValid", last_off));
10337                        break;
10338                    }
10339                }
10340                DlResource::ResourceSizeMin(val) => {
10341                    if last_off == offset {
10342                        stack.push(("ResourceSizeMin", last_off));
10343                        break;
10344                    }
10345                }
10346                DlResource::ResourceSizeMax(val) => {
10347                    if last_off == offset {
10348                        stack.push(("ResourceSizeMax", last_off));
10349                        break;
10350                    }
10351                }
10352                DlResource::ResourceSizeGran(val) => {
10353                    if last_off == offset {
10354                        stack.push(("ResourceSizeGran", last_off));
10355                        break;
10356                    }
10357                }
10358                DlResource::ResourceUnit(val) => {
10359                    if last_off == offset {
10360                        stack.push(("ResourceUnit", last_off));
10361                        break;
10362                    }
10363                }
10364                DlResource::ResourceOcc(val) => {
10365                    if last_off == offset {
10366                        stack.push(("ResourceOcc", last_off));
10367                        break;
10368                    }
10369                }
10370                _ => {}
10371            };
10372            last_off = cur + attrs.pos;
10373        }
10374        if !stack.is_empty() {
10375            stack.push(("DlResource", cur));
10376        }
10377        (stack, None)
10378    }
10379}
10380#[derive(Clone)]
10381pub enum DlResourceList<'a> {
10382    #[doc = "Attribute may repeat multiple times (treat it as array)"]
10383    Resource(IterableDlResource<'a>),
10384}
10385impl<'a> IterableDlResourceList<'a> {
10386    #[doc = "Attribute may repeat multiple times (treat it as array)"]
10387    pub fn get_resource(
10388        &self,
10389    ) -> MultiAttrIterable<Self, DlResourceList<'a>, IterableDlResource<'a>> {
10390        MultiAttrIterable::new(self.clone(), |variant| {
10391            if let DlResourceList::Resource(val) = variant {
10392                Some(val)
10393            } else {
10394                None
10395            }
10396        })
10397    }
10398}
10399impl DlResourceList<'_> {
10400    pub fn new<'a>(buf: &'a [u8]) -> IterableDlResourceList<'a> {
10401        IterableDlResourceList::with_loc(buf, buf.as_ptr() as usize)
10402    }
10403    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10404        Devlink::attr_from_type(r#type)
10405    }
10406}
10407#[derive(Clone, Copy, Default)]
10408pub struct IterableDlResourceList<'a> {
10409    buf: &'a [u8],
10410    pos: usize,
10411    orig_loc: usize,
10412}
10413impl<'a> IterableDlResourceList<'a> {
10414    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10415        Self {
10416            buf,
10417            pos: 0,
10418            orig_loc,
10419        }
10420    }
10421    pub fn get_buf(&self) -> &'a [u8] {
10422        self.buf
10423    }
10424}
10425impl<'a> Iterator for IterableDlResourceList<'a> {
10426    type Item = Result<DlResourceList<'a>, ErrorContext>;
10427    fn next(&mut self) -> Option<Self::Item> {
10428        let pos = self.pos;
10429        let mut r#type;
10430        loop {
10431            r#type = None;
10432            if self.buf.len() == self.pos {
10433                return None;
10434            }
10435            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10436                break;
10437            };
10438            r#type = Some(header.r#type);
10439            let res = match header.r#type {
10440                64u16 => DlResourceList::Resource({
10441                    let res = Some(IterableDlResource::with_loc(next, self.orig_loc));
10442                    let Some(val) = res else { break };
10443                    val
10444                }),
10445                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10446                n => continue,
10447            };
10448            return Some(Ok(res));
10449        }
10450        Some(Err(ErrorContext::new(
10451            "DlResourceList",
10452            r#type.and_then(|t| DlResourceList::attr_from_type(t)),
10453            self.orig_loc,
10454            self.buf.as_ptr().wrapping_add(pos) as usize,
10455        )))
10456    }
10457}
10458impl<'a> std::fmt::Debug for IterableDlResourceList<'_> {
10459    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10460        let mut fmt = f.debug_struct("DlResourceList");
10461        for attr in self.clone() {
10462            let attr = match attr {
10463                Ok(a) => a,
10464                Err(err) => {
10465                    fmt.finish()?;
10466                    f.write_str("Err(")?;
10467                    err.fmt(f)?;
10468                    return f.write_str(")");
10469                }
10470            };
10471            match attr {
10472                DlResourceList::Resource(val) => fmt.field("Resource", &val),
10473            };
10474        }
10475        fmt.finish()
10476    }
10477}
10478impl IterableDlResourceList<'_> {
10479    pub fn lookup_attr(
10480        &self,
10481        offset: usize,
10482        missing_type: Option<u16>,
10483    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10484        let mut stack = Vec::new();
10485        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10486        if missing_type.is_some() && cur == offset {
10487            stack.push(("DlResourceList", offset));
10488            return (
10489                stack,
10490                missing_type.and_then(|t| DlResourceList::attr_from_type(t)),
10491            );
10492        }
10493        if cur > offset || cur + self.buf.len() < offset {
10494            return (stack, None);
10495        }
10496        let mut attrs = self.clone();
10497        let mut last_off = cur + attrs.pos;
10498        let mut missing = None;
10499        while let Some(attr) = attrs.next() {
10500            let Ok(attr) = attr else { break };
10501            match attr {
10502                DlResourceList::Resource(val) => {
10503                    (stack, missing) = val.lookup_attr(offset, missing_type);
10504                    if !stack.is_empty() {
10505                        break;
10506                    }
10507                }
10508                _ => {}
10509            };
10510            last_off = cur + attrs.pos;
10511        }
10512        if !stack.is_empty() {
10513            stack.push(("DlResourceList", cur));
10514        }
10515        (stack, missing)
10516    }
10517}
10518#[derive(Clone)]
10519pub enum DlParam<'a> {
10520    ParamName(&'a CStr),
10521    ParamGeneric(()),
10522    #[doc = "Associated type: [`VarAttrType`] (enum)"]
10523    ParamType(u8),
10524}
10525impl<'a> IterableDlParam<'a> {
10526    pub fn get_param_name(&self) -> Result<&'a CStr, ErrorContext> {
10527        let mut iter = self.clone();
10528        iter.pos = 0;
10529        for attr in iter {
10530            if let DlParam::ParamName(val) = attr? {
10531                return Ok(val);
10532            }
10533        }
10534        Err(ErrorContext::new_missing(
10535            "DlParam",
10536            "ParamName",
10537            self.orig_loc,
10538            self.buf.as_ptr() as usize,
10539        ))
10540    }
10541    pub fn get_param_generic(&self) -> Result<(), ErrorContext> {
10542        let mut iter = self.clone();
10543        iter.pos = 0;
10544        for attr in iter {
10545            if let DlParam::ParamGeneric(val) = attr? {
10546                return Ok(val);
10547            }
10548        }
10549        Err(ErrorContext::new_missing(
10550            "DlParam",
10551            "ParamGeneric",
10552            self.orig_loc,
10553            self.buf.as_ptr() as usize,
10554        ))
10555    }
10556    #[doc = "Associated type: [`VarAttrType`] (enum)"]
10557    pub fn get_param_type(&self) -> Result<u8, ErrorContext> {
10558        let mut iter = self.clone();
10559        iter.pos = 0;
10560        for attr in iter {
10561            if let DlParam::ParamType(val) = attr? {
10562                return Ok(val);
10563            }
10564        }
10565        Err(ErrorContext::new_missing(
10566            "DlParam",
10567            "ParamType",
10568            self.orig_loc,
10569            self.buf.as_ptr() as usize,
10570        ))
10571    }
10572}
10573impl DlParam<'_> {
10574    pub fn new<'a>(buf: &'a [u8]) -> IterableDlParam<'a> {
10575        IterableDlParam::with_loc(buf, buf.as_ptr() as usize)
10576    }
10577    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10578        Devlink::attr_from_type(r#type)
10579    }
10580}
10581#[derive(Clone, Copy, Default)]
10582pub struct IterableDlParam<'a> {
10583    buf: &'a [u8],
10584    pos: usize,
10585    orig_loc: usize,
10586}
10587impl<'a> IterableDlParam<'a> {
10588    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10589        Self {
10590            buf,
10591            pos: 0,
10592            orig_loc,
10593        }
10594    }
10595    pub fn get_buf(&self) -> &'a [u8] {
10596        self.buf
10597    }
10598}
10599impl<'a> Iterator for IterableDlParam<'a> {
10600    type Item = Result<DlParam<'a>, ErrorContext>;
10601    fn next(&mut self) -> Option<Self::Item> {
10602        let pos = self.pos;
10603        let mut r#type;
10604        loop {
10605            r#type = None;
10606            if self.buf.len() == self.pos {
10607                return None;
10608            }
10609            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10610                break;
10611            };
10612            r#type = Some(header.r#type);
10613            let res = match header.r#type {
10614                81u16 => DlParam::ParamName({
10615                    let res = CStr::from_bytes_with_nul(next).ok();
10616                    let Some(val) = res else { break };
10617                    val
10618                }),
10619                82u16 => DlParam::ParamGeneric(()),
10620                83u16 => DlParam::ParamType({
10621                    let res = parse_u8(next);
10622                    let Some(val) = res else { break };
10623                    val
10624                }),
10625                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10626                n => continue,
10627            };
10628            return Some(Ok(res));
10629        }
10630        Some(Err(ErrorContext::new(
10631            "DlParam",
10632            r#type.and_then(|t| DlParam::attr_from_type(t)),
10633            self.orig_loc,
10634            self.buf.as_ptr().wrapping_add(pos) as usize,
10635        )))
10636    }
10637}
10638impl<'a> std::fmt::Debug for IterableDlParam<'_> {
10639    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10640        let mut fmt = f.debug_struct("DlParam");
10641        for attr in self.clone() {
10642            let attr = match attr {
10643                Ok(a) => a,
10644                Err(err) => {
10645                    fmt.finish()?;
10646                    f.write_str("Err(")?;
10647                    err.fmt(f)?;
10648                    return f.write_str(")");
10649                }
10650            };
10651            match attr {
10652                DlParam::ParamName(val) => fmt.field("ParamName", &val),
10653                DlParam::ParamGeneric(val) => fmt.field("ParamGeneric", &val),
10654                DlParam::ParamType(val) => fmt.field(
10655                    "ParamType",
10656                    &FormatEnum(val.into(), VarAttrType::from_value),
10657                ),
10658            };
10659        }
10660        fmt.finish()
10661    }
10662}
10663impl IterableDlParam<'_> {
10664    pub fn lookup_attr(
10665        &self,
10666        offset: usize,
10667        missing_type: Option<u16>,
10668    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10669        let mut stack = Vec::new();
10670        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10671        if missing_type.is_some() && cur == offset {
10672            stack.push(("DlParam", offset));
10673            return (stack, missing_type.and_then(|t| DlParam::attr_from_type(t)));
10674        }
10675        if cur > offset || cur + self.buf.len() < offset {
10676            return (stack, None);
10677        }
10678        let mut attrs = self.clone();
10679        let mut last_off = cur + attrs.pos;
10680        while let Some(attr) = attrs.next() {
10681            let Ok(attr) = attr else { break };
10682            match attr {
10683                DlParam::ParamName(val) => {
10684                    if last_off == offset {
10685                        stack.push(("ParamName", last_off));
10686                        break;
10687                    }
10688                }
10689                DlParam::ParamGeneric(val) => {
10690                    if last_off == offset {
10691                        stack.push(("ParamGeneric", last_off));
10692                        break;
10693                    }
10694                }
10695                DlParam::ParamType(val) => {
10696                    if last_off == offset {
10697                        stack.push(("ParamType", last_off));
10698                        break;
10699                    }
10700                }
10701                _ => {}
10702            };
10703            last_off = cur + attrs.pos;
10704        }
10705        if !stack.is_empty() {
10706            stack.push(("DlParam", cur));
10707        }
10708        (stack, None)
10709    }
10710}
10711#[derive(Clone)]
10712pub enum DlRegionSnapshots<'a> {
10713    RegionSnapshot(IterableDlRegionSnapshot<'a>),
10714}
10715impl<'a> IterableDlRegionSnapshots<'a> {
10716    pub fn get_region_snapshot(&self) -> Result<IterableDlRegionSnapshot<'a>, ErrorContext> {
10717        let mut iter = self.clone();
10718        iter.pos = 0;
10719        for attr in iter {
10720            if let DlRegionSnapshots::RegionSnapshot(val) = attr? {
10721                return Ok(val);
10722            }
10723        }
10724        Err(ErrorContext::new_missing(
10725            "DlRegionSnapshots",
10726            "RegionSnapshot",
10727            self.orig_loc,
10728            self.buf.as_ptr() as usize,
10729        ))
10730    }
10731}
10732impl DlRegionSnapshots<'_> {
10733    pub fn new<'a>(buf: &'a [u8]) -> IterableDlRegionSnapshots<'a> {
10734        IterableDlRegionSnapshots::with_loc(buf, buf.as_ptr() as usize)
10735    }
10736    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10737        Devlink::attr_from_type(r#type)
10738    }
10739}
10740#[derive(Clone, Copy, Default)]
10741pub struct IterableDlRegionSnapshots<'a> {
10742    buf: &'a [u8],
10743    pos: usize,
10744    orig_loc: usize,
10745}
10746impl<'a> IterableDlRegionSnapshots<'a> {
10747    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10748        Self {
10749            buf,
10750            pos: 0,
10751            orig_loc,
10752        }
10753    }
10754    pub fn get_buf(&self) -> &'a [u8] {
10755        self.buf
10756    }
10757}
10758impl<'a> Iterator for IterableDlRegionSnapshots<'a> {
10759    type Item = Result<DlRegionSnapshots<'a>, ErrorContext>;
10760    fn next(&mut self) -> Option<Self::Item> {
10761        let pos = self.pos;
10762        let mut r#type;
10763        loop {
10764            r#type = None;
10765            if self.buf.len() == self.pos {
10766                return None;
10767            }
10768            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10769                break;
10770            };
10771            r#type = Some(header.r#type);
10772            let res = match header.r#type {
10773                91u16 => DlRegionSnapshots::RegionSnapshot({
10774                    let res = Some(IterableDlRegionSnapshot::with_loc(next, self.orig_loc));
10775                    let Some(val) = res else { break };
10776                    val
10777                }),
10778                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10779                n => continue,
10780            };
10781            return Some(Ok(res));
10782        }
10783        Some(Err(ErrorContext::new(
10784            "DlRegionSnapshots",
10785            r#type.and_then(|t| DlRegionSnapshots::attr_from_type(t)),
10786            self.orig_loc,
10787            self.buf.as_ptr().wrapping_add(pos) as usize,
10788        )))
10789    }
10790}
10791impl<'a> std::fmt::Debug for IterableDlRegionSnapshots<'_> {
10792    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10793        let mut fmt = f.debug_struct("DlRegionSnapshots");
10794        for attr in self.clone() {
10795            let attr = match attr {
10796                Ok(a) => a,
10797                Err(err) => {
10798                    fmt.finish()?;
10799                    f.write_str("Err(")?;
10800                    err.fmt(f)?;
10801                    return f.write_str(")");
10802                }
10803            };
10804            match attr {
10805                DlRegionSnapshots::RegionSnapshot(val) => fmt.field("RegionSnapshot", &val),
10806            };
10807        }
10808        fmt.finish()
10809    }
10810}
10811impl IterableDlRegionSnapshots<'_> {
10812    pub fn lookup_attr(
10813        &self,
10814        offset: usize,
10815        missing_type: Option<u16>,
10816    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10817        let mut stack = Vec::new();
10818        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10819        if missing_type.is_some() && cur == offset {
10820            stack.push(("DlRegionSnapshots", offset));
10821            return (
10822                stack,
10823                missing_type.and_then(|t| DlRegionSnapshots::attr_from_type(t)),
10824            );
10825        }
10826        if cur > offset || cur + self.buf.len() < offset {
10827            return (stack, None);
10828        }
10829        let mut attrs = self.clone();
10830        let mut last_off = cur + attrs.pos;
10831        let mut missing = None;
10832        while let Some(attr) = attrs.next() {
10833            let Ok(attr) = attr else { break };
10834            match attr {
10835                DlRegionSnapshots::RegionSnapshot(val) => {
10836                    (stack, missing) = val.lookup_attr(offset, missing_type);
10837                    if !stack.is_empty() {
10838                        break;
10839                    }
10840                }
10841                _ => {}
10842            };
10843            last_off = cur + attrs.pos;
10844        }
10845        if !stack.is_empty() {
10846            stack.push(("DlRegionSnapshots", cur));
10847        }
10848        (stack, missing)
10849    }
10850}
10851#[derive(Clone)]
10852pub enum DlRegionSnapshot {
10853    RegionSnapshotId(u32),
10854}
10855impl<'a> IterableDlRegionSnapshot<'a> {
10856    pub fn get_region_snapshot_id(&self) -> Result<u32, ErrorContext> {
10857        let mut iter = self.clone();
10858        iter.pos = 0;
10859        for attr in iter {
10860            if let DlRegionSnapshot::RegionSnapshotId(val) = attr? {
10861                return Ok(val);
10862            }
10863        }
10864        Err(ErrorContext::new_missing(
10865            "DlRegionSnapshot",
10866            "RegionSnapshotId",
10867            self.orig_loc,
10868            self.buf.as_ptr() as usize,
10869        ))
10870    }
10871}
10872impl DlRegionSnapshot {
10873    pub fn new<'a>(buf: &'a [u8]) -> IterableDlRegionSnapshot<'a> {
10874        IterableDlRegionSnapshot::with_loc(buf, buf.as_ptr() as usize)
10875    }
10876    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10877        Devlink::attr_from_type(r#type)
10878    }
10879}
10880#[derive(Clone, Copy, Default)]
10881pub struct IterableDlRegionSnapshot<'a> {
10882    buf: &'a [u8],
10883    pos: usize,
10884    orig_loc: usize,
10885}
10886impl<'a> IterableDlRegionSnapshot<'a> {
10887    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10888        Self {
10889            buf,
10890            pos: 0,
10891            orig_loc,
10892        }
10893    }
10894    pub fn get_buf(&self) -> &'a [u8] {
10895        self.buf
10896    }
10897}
10898impl<'a> Iterator for IterableDlRegionSnapshot<'a> {
10899    type Item = Result<DlRegionSnapshot, ErrorContext>;
10900    fn next(&mut self) -> Option<Self::Item> {
10901        let pos = self.pos;
10902        let mut r#type;
10903        loop {
10904            r#type = None;
10905            if self.buf.len() == self.pos {
10906                return None;
10907            }
10908            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10909                break;
10910            };
10911            r#type = Some(header.r#type);
10912            let res = match header.r#type {
10913                92u16 => DlRegionSnapshot::RegionSnapshotId({
10914                    let res = parse_u32(next);
10915                    let Some(val) = res else { break };
10916                    val
10917                }),
10918                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10919                n => continue,
10920            };
10921            return Some(Ok(res));
10922        }
10923        Some(Err(ErrorContext::new(
10924            "DlRegionSnapshot",
10925            r#type.and_then(|t| DlRegionSnapshot::attr_from_type(t)),
10926            self.orig_loc,
10927            self.buf.as_ptr().wrapping_add(pos) as usize,
10928        )))
10929    }
10930}
10931impl std::fmt::Debug for IterableDlRegionSnapshot<'_> {
10932    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10933        let mut fmt = f.debug_struct("DlRegionSnapshot");
10934        for attr in self.clone() {
10935            let attr = match attr {
10936                Ok(a) => a,
10937                Err(err) => {
10938                    fmt.finish()?;
10939                    f.write_str("Err(")?;
10940                    err.fmt(f)?;
10941                    return f.write_str(")");
10942                }
10943            };
10944            match attr {
10945                DlRegionSnapshot::RegionSnapshotId(val) => fmt.field("RegionSnapshotId", &val),
10946            };
10947        }
10948        fmt.finish()
10949    }
10950}
10951impl IterableDlRegionSnapshot<'_> {
10952    pub fn lookup_attr(
10953        &self,
10954        offset: usize,
10955        missing_type: Option<u16>,
10956    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10957        let mut stack = Vec::new();
10958        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10959        if missing_type.is_some() && cur == offset {
10960            stack.push(("DlRegionSnapshot", offset));
10961            return (
10962                stack,
10963                missing_type.and_then(|t| DlRegionSnapshot::attr_from_type(t)),
10964            );
10965        }
10966        if cur > offset || cur + self.buf.len() < offset {
10967            return (stack, None);
10968        }
10969        let mut attrs = self.clone();
10970        let mut last_off = cur + attrs.pos;
10971        while let Some(attr) = attrs.next() {
10972            let Ok(attr) = attr else { break };
10973            match attr {
10974                DlRegionSnapshot::RegionSnapshotId(val) => {
10975                    if last_off == offset {
10976                        stack.push(("RegionSnapshotId", last_off));
10977                        break;
10978                    }
10979                }
10980                _ => {}
10981            };
10982            last_off = cur + attrs.pos;
10983        }
10984        if !stack.is_empty() {
10985            stack.push(("DlRegionSnapshot", cur));
10986        }
10987        (stack, None)
10988    }
10989}
10990#[derive(Clone)]
10991pub enum DlRegionChunks<'a> {
10992    RegionChunk(IterableDlRegionChunk<'a>),
10993}
10994impl<'a> IterableDlRegionChunks<'a> {
10995    pub fn get_region_chunk(&self) -> Result<IterableDlRegionChunk<'a>, ErrorContext> {
10996        let mut iter = self.clone();
10997        iter.pos = 0;
10998        for attr in iter {
10999            if let DlRegionChunks::RegionChunk(val) = attr? {
11000                return Ok(val);
11001            }
11002        }
11003        Err(ErrorContext::new_missing(
11004            "DlRegionChunks",
11005            "RegionChunk",
11006            self.orig_loc,
11007            self.buf.as_ptr() as usize,
11008        ))
11009    }
11010}
11011impl DlRegionChunks<'_> {
11012    pub fn new<'a>(buf: &'a [u8]) -> IterableDlRegionChunks<'a> {
11013        IterableDlRegionChunks::with_loc(buf, buf.as_ptr() as usize)
11014    }
11015    fn attr_from_type(r#type: u16) -> Option<&'static str> {
11016        Devlink::attr_from_type(r#type)
11017    }
11018}
11019#[derive(Clone, Copy, Default)]
11020pub struct IterableDlRegionChunks<'a> {
11021    buf: &'a [u8],
11022    pos: usize,
11023    orig_loc: usize,
11024}
11025impl<'a> IterableDlRegionChunks<'a> {
11026    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11027        Self {
11028            buf,
11029            pos: 0,
11030            orig_loc,
11031        }
11032    }
11033    pub fn get_buf(&self) -> &'a [u8] {
11034        self.buf
11035    }
11036}
11037impl<'a> Iterator for IterableDlRegionChunks<'a> {
11038    type Item = Result<DlRegionChunks<'a>, ErrorContext>;
11039    fn next(&mut self) -> Option<Self::Item> {
11040        let pos = self.pos;
11041        let mut r#type;
11042        loop {
11043            r#type = None;
11044            if self.buf.len() == self.pos {
11045                return None;
11046            }
11047            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11048                break;
11049            };
11050            r#type = Some(header.r#type);
11051            let res = match header.r#type {
11052                94u16 => DlRegionChunks::RegionChunk({
11053                    let res = Some(IterableDlRegionChunk::with_loc(next, self.orig_loc));
11054                    let Some(val) = res else { break };
11055                    val
11056                }),
11057                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11058                n => continue,
11059            };
11060            return Some(Ok(res));
11061        }
11062        Some(Err(ErrorContext::new(
11063            "DlRegionChunks",
11064            r#type.and_then(|t| DlRegionChunks::attr_from_type(t)),
11065            self.orig_loc,
11066            self.buf.as_ptr().wrapping_add(pos) as usize,
11067        )))
11068    }
11069}
11070impl<'a> std::fmt::Debug for IterableDlRegionChunks<'_> {
11071    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11072        let mut fmt = f.debug_struct("DlRegionChunks");
11073        for attr in self.clone() {
11074            let attr = match attr {
11075                Ok(a) => a,
11076                Err(err) => {
11077                    fmt.finish()?;
11078                    f.write_str("Err(")?;
11079                    err.fmt(f)?;
11080                    return f.write_str(")");
11081                }
11082            };
11083            match attr {
11084                DlRegionChunks::RegionChunk(val) => fmt.field("RegionChunk", &val),
11085            };
11086        }
11087        fmt.finish()
11088    }
11089}
11090impl IterableDlRegionChunks<'_> {
11091    pub fn lookup_attr(
11092        &self,
11093        offset: usize,
11094        missing_type: Option<u16>,
11095    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11096        let mut stack = Vec::new();
11097        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11098        if missing_type.is_some() && cur == offset {
11099            stack.push(("DlRegionChunks", offset));
11100            return (
11101                stack,
11102                missing_type.and_then(|t| DlRegionChunks::attr_from_type(t)),
11103            );
11104        }
11105        if cur > offset || cur + self.buf.len() < offset {
11106            return (stack, None);
11107        }
11108        let mut attrs = self.clone();
11109        let mut last_off = cur + attrs.pos;
11110        let mut missing = None;
11111        while let Some(attr) = attrs.next() {
11112            let Ok(attr) = attr else { break };
11113            match attr {
11114                DlRegionChunks::RegionChunk(val) => {
11115                    (stack, missing) = val.lookup_attr(offset, missing_type);
11116                    if !stack.is_empty() {
11117                        break;
11118                    }
11119                }
11120                _ => {}
11121            };
11122            last_off = cur + attrs.pos;
11123        }
11124        if !stack.is_empty() {
11125            stack.push(("DlRegionChunks", cur));
11126        }
11127        (stack, missing)
11128    }
11129}
11130#[derive(Clone)]
11131pub enum DlRegionChunk<'a> {
11132    RegionChunkData(&'a [u8]),
11133    RegionChunkAddr(u64),
11134}
11135impl<'a> IterableDlRegionChunk<'a> {
11136    pub fn get_region_chunk_data(&self) -> Result<&'a [u8], ErrorContext> {
11137        let mut iter = self.clone();
11138        iter.pos = 0;
11139        for attr in iter {
11140            if let DlRegionChunk::RegionChunkData(val) = attr? {
11141                return Ok(val);
11142            }
11143        }
11144        Err(ErrorContext::new_missing(
11145            "DlRegionChunk",
11146            "RegionChunkData",
11147            self.orig_loc,
11148            self.buf.as_ptr() as usize,
11149        ))
11150    }
11151    pub fn get_region_chunk_addr(&self) -> Result<u64, ErrorContext> {
11152        let mut iter = self.clone();
11153        iter.pos = 0;
11154        for attr in iter {
11155            if let DlRegionChunk::RegionChunkAddr(val) = attr? {
11156                return Ok(val);
11157            }
11158        }
11159        Err(ErrorContext::new_missing(
11160            "DlRegionChunk",
11161            "RegionChunkAddr",
11162            self.orig_loc,
11163            self.buf.as_ptr() as usize,
11164        ))
11165    }
11166}
11167impl DlRegionChunk<'_> {
11168    pub fn new<'a>(buf: &'a [u8]) -> IterableDlRegionChunk<'a> {
11169        IterableDlRegionChunk::with_loc(buf, buf.as_ptr() as usize)
11170    }
11171    fn attr_from_type(r#type: u16) -> Option<&'static str> {
11172        Devlink::attr_from_type(r#type)
11173    }
11174}
11175#[derive(Clone, Copy, Default)]
11176pub struct IterableDlRegionChunk<'a> {
11177    buf: &'a [u8],
11178    pos: usize,
11179    orig_loc: usize,
11180}
11181impl<'a> IterableDlRegionChunk<'a> {
11182    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11183        Self {
11184            buf,
11185            pos: 0,
11186            orig_loc,
11187        }
11188    }
11189    pub fn get_buf(&self) -> &'a [u8] {
11190        self.buf
11191    }
11192}
11193impl<'a> Iterator for IterableDlRegionChunk<'a> {
11194    type Item = Result<DlRegionChunk<'a>, ErrorContext>;
11195    fn next(&mut self) -> Option<Self::Item> {
11196        let pos = self.pos;
11197        let mut r#type;
11198        loop {
11199            r#type = None;
11200            if self.buf.len() == self.pos {
11201                return None;
11202            }
11203            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11204                break;
11205            };
11206            r#type = Some(header.r#type);
11207            let res = match header.r#type {
11208                95u16 => DlRegionChunk::RegionChunkData({
11209                    let res = Some(next);
11210                    let Some(val) = res else { break };
11211                    val
11212                }),
11213                96u16 => DlRegionChunk::RegionChunkAddr({
11214                    let res = parse_u64(next);
11215                    let Some(val) = res else { break };
11216                    val
11217                }),
11218                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11219                n => continue,
11220            };
11221            return Some(Ok(res));
11222        }
11223        Some(Err(ErrorContext::new(
11224            "DlRegionChunk",
11225            r#type.and_then(|t| DlRegionChunk::attr_from_type(t)),
11226            self.orig_loc,
11227            self.buf.as_ptr().wrapping_add(pos) as usize,
11228        )))
11229    }
11230}
11231impl<'a> std::fmt::Debug for IterableDlRegionChunk<'_> {
11232    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11233        let mut fmt = f.debug_struct("DlRegionChunk");
11234        for attr in self.clone() {
11235            let attr = match attr {
11236                Ok(a) => a,
11237                Err(err) => {
11238                    fmt.finish()?;
11239                    f.write_str("Err(")?;
11240                    err.fmt(f)?;
11241                    return f.write_str(")");
11242                }
11243            };
11244            match attr {
11245                DlRegionChunk::RegionChunkData(val) => fmt.field("RegionChunkData", &val),
11246                DlRegionChunk::RegionChunkAddr(val) => fmt.field("RegionChunkAddr", &val),
11247            };
11248        }
11249        fmt.finish()
11250    }
11251}
11252impl IterableDlRegionChunk<'_> {
11253    pub fn lookup_attr(
11254        &self,
11255        offset: usize,
11256        missing_type: Option<u16>,
11257    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11258        let mut stack = Vec::new();
11259        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11260        if missing_type.is_some() && cur == offset {
11261            stack.push(("DlRegionChunk", offset));
11262            return (
11263                stack,
11264                missing_type.and_then(|t| DlRegionChunk::attr_from_type(t)),
11265            );
11266        }
11267        if cur > offset || cur + self.buf.len() < offset {
11268            return (stack, None);
11269        }
11270        let mut attrs = self.clone();
11271        let mut last_off = cur + attrs.pos;
11272        while let Some(attr) = attrs.next() {
11273            let Ok(attr) = attr else { break };
11274            match attr {
11275                DlRegionChunk::RegionChunkData(val) => {
11276                    if last_off == offset {
11277                        stack.push(("RegionChunkData", last_off));
11278                        break;
11279                    }
11280                }
11281                DlRegionChunk::RegionChunkAddr(val) => {
11282                    if last_off == offset {
11283                        stack.push(("RegionChunkAddr", last_off));
11284                        break;
11285                    }
11286                }
11287                _ => {}
11288            };
11289            last_off = cur + attrs.pos;
11290        }
11291        if !stack.is_empty() {
11292            stack.push(("DlRegionChunk", cur));
11293        }
11294        (stack, None)
11295    }
11296}
11297#[derive(Clone)]
11298pub enum DlFmsg<'a> {
11299    FmsgObjNestStart(()),
11300    FmsgPairNestStart(()),
11301    FmsgArrNestStart(()),
11302    FmsgNestEnd(()),
11303    FmsgObjName(&'a CStr),
11304}
11305impl<'a> IterableDlFmsg<'a> {
11306    pub fn get_fmsg_obj_nest_start(&self) -> Result<(), ErrorContext> {
11307        let mut iter = self.clone();
11308        iter.pos = 0;
11309        for attr in iter {
11310            if let DlFmsg::FmsgObjNestStart(val) = attr? {
11311                return Ok(val);
11312            }
11313        }
11314        Err(ErrorContext::new_missing(
11315            "DlFmsg",
11316            "FmsgObjNestStart",
11317            self.orig_loc,
11318            self.buf.as_ptr() as usize,
11319        ))
11320    }
11321    pub fn get_fmsg_pair_nest_start(&self) -> Result<(), ErrorContext> {
11322        let mut iter = self.clone();
11323        iter.pos = 0;
11324        for attr in iter {
11325            if let DlFmsg::FmsgPairNestStart(val) = attr? {
11326                return Ok(val);
11327            }
11328        }
11329        Err(ErrorContext::new_missing(
11330            "DlFmsg",
11331            "FmsgPairNestStart",
11332            self.orig_loc,
11333            self.buf.as_ptr() as usize,
11334        ))
11335    }
11336    pub fn get_fmsg_arr_nest_start(&self) -> Result<(), ErrorContext> {
11337        let mut iter = self.clone();
11338        iter.pos = 0;
11339        for attr in iter {
11340            if let DlFmsg::FmsgArrNestStart(val) = attr? {
11341                return Ok(val);
11342            }
11343        }
11344        Err(ErrorContext::new_missing(
11345            "DlFmsg",
11346            "FmsgArrNestStart",
11347            self.orig_loc,
11348            self.buf.as_ptr() as usize,
11349        ))
11350    }
11351    pub fn get_fmsg_nest_end(&self) -> Result<(), ErrorContext> {
11352        let mut iter = self.clone();
11353        iter.pos = 0;
11354        for attr in iter {
11355            if let DlFmsg::FmsgNestEnd(val) = attr? {
11356                return Ok(val);
11357            }
11358        }
11359        Err(ErrorContext::new_missing(
11360            "DlFmsg",
11361            "FmsgNestEnd",
11362            self.orig_loc,
11363            self.buf.as_ptr() as usize,
11364        ))
11365    }
11366    pub fn get_fmsg_obj_name(&self) -> Result<&'a CStr, ErrorContext> {
11367        let mut iter = self.clone();
11368        iter.pos = 0;
11369        for attr in iter {
11370            if let DlFmsg::FmsgObjName(val) = attr? {
11371                return Ok(val);
11372            }
11373        }
11374        Err(ErrorContext::new_missing(
11375            "DlFmsg",
11376            "FmsgObjName",
11377            self.orig_loc,
11378            self.buf.as_ptr() as usize,
11379        ))
11380    }
11381}
11382impl DlFmsg<'_> {
11383    pub fn new<'a>(buf: &'a [u8]) -> IterableDlFmsg<'a> {
11384        IterableDlFmsg::with_loc(buf, buf.as_ptr() as usize)
11385    }
11386    fn attr_from_type(r#type: u16) -> Option<&'static str> {
11387        Devlink::attr_from_type(r#type)
11388    }
11389}
11390#[derive(Clone, Copy, Default)]
11391pub struct IterableDlFmsg<'a> {
11392    buf: &'a [u8],
11393    pos: usize,
11394    orig_loc: usize,
11395}
11396impl<'a> IterableDlFmsg<'a> {
11397    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11398        Self {
11399            buf,
11400            pos: 0,
11401            orig_loc,
11402        }
11403    }
11404    pub fn get_buf(&self) -> &'a [u8] {
11405        self.buf
11406    }
11407}
11408impl<'a> Iterator for IterableDlFmsg<'a> {
11409    type Item = Result<DlFmsg<'a>, ErrorContext>;
11410    fn next(&mut self) -> Option<Self::Item> {
11411        let pos = self.pos;
11412        let mut r#type;
11413        loop {
11414            r#type = None;
11415            if self.buf.len() == self.pos {
11416                return None;
11417            }
11418            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11419                break;
11420            };
11421            r#type = Some(header.r#type);
11422            let res = match header.r#type {
11423                107u16 => DlFmsg::FmsgObjNestStart(()),
11424                108u16 => DlFmsg::FmsgPairNestStart(()),
11425                109u16 => DlFmsg::FmsgArrNestStart(()),
11426                110u16 => DlFmsg::FmsgNestEnd(()),
11427                111u16 => DlFmsg::FmsgObjName({
11428                    let res = CStr::from_bytes_with_nul(next).ok();
11429                    let Some(val) = res else { break };
11430                    val
11431                }),
11432                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11433                n => continue,
11434            };
11435            return Some(Ok(res));
11436        }
11437        Some(Err(ErrorContext::new(
11438            "DlFmsg",
11439            r#type.and_then(|t| DlFmsg::attr_from_type(t)),
11440            self.orig_loc,
11441            self.buf.as_ptr().wrapping_add(pos) as usize,
11442        )))
11443    }
11444}
11445impl<'a> std::fmt::Debug for IterableDlFmsg<'_> {
11446    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11447        let mut fmt = f.debug_struct("DlFmsg");
11448        for attr in self.clone() {
11449            let attr = match attr {
11450                Ok(a) => a,
11451                Err(err) => {
11452                    fmt.finish()?;
11453                    f.write_str("Err(")?;
11454                    err.fmt(f)?;
11455                    return f.write_str(")");
11456                }
11457            };
11458            match attr {
11459                DlFmsg::FmsgObjNestStart(val) => fmt.field("FmsgObjNestStart", &val),
11460                DlFmsg::FmsgPairNestStart(val) => fmt.field("FmsgPairNestStart", &val),
11461                DlFmsg::FmsgArrNestStart(val) => fmt.field("FmsgArrNestStart", &val),
11462                DlFmsg::FmsgNestEnd(val) => fmt.field("FmsgNestEnd", &val),
11463                DlFmsg::FmsgObjName(val) => fmt.field("FmsgObjName", &val),
11464            };
11465        }
11466        fmt.finish()
11467    }
11468}
11469impl IterableDlFmsg<'_> {
11470    pub fn lookup_attr(
11471        &self,
11472        offset: usize,
11473        missing_type: Option<u16>,
11474    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11475        let mut stack = Vec::new();
11476        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11477        if missing_type.is_some() && cur == offset {
11478            stack.push(("DlFmsg", offset));
11479            return (stack, missing_type.and_then(|t| DlFmsg::attr_from_type(t)));
11480        }
11481        if cur > offset || cur + self.buf.len() < offset {
11482            return (stack, None);
11483        }
11484        let mut attrs = self.clone();
11485        let mut last_off = cur + attrs.pos;
11486        while let Some(attr) = attrs.next() {
11487            let Ok(attr) = attr else { break };
11488            match attr {
11489                DlFmsg::FmsgObjNestStart(val) => {
11490                    if last_off == offset {
11491                        stack.push(("FmsgObjNestStart", last_off));
11492                        break;
11493                    }
11494                }
11495                DlFmsg::FmsgPairNestStart(val) => {
11496                    if last_off == offset {
11497                        stack.push(("FmsgPairNestStart", last_off));
11498                        break;
11499                    }
11500                }
11501                DlFmsg::FmsgArrNestStart(val) => {
11502                    if last_off == offset {
11503                        stack.push(("FmsgArrNestStart", last_off));
11504                        break;
11505                    }
11506                }
11507                DlFmsg::FmsgNestEnd(val) => {
11508                    if last_off == offset {
11509                        stack.push(("FmsgNestEnd", last_off));
11510                        break;
11511                    }
11512                }
11513                DlFmsg::FmsgObjName(val) => {
11514                    if last_off == offset {
11515                        stack.push(("FmsgObjName", last_off));
11516                        break;
11517                    }
11518                }
11519                _ => {}
11520            };
11521            last_off = cur + attrs.pos;
11522        }
11523        if !stack.is_empty() {
11524            stack.push(("DlFmsg", cur));
11525        }
11526        (stack, None)
11527    }
11528}
11529#[derive(Clone)]
11530pub enum DlHealthReporter<'a> {
11531    HealthReporterName(&'a CStr),
11532    HealthReporterState(u8),
11533    HealthReporterErrCount(u64),
11534    HealthReporterRecoverCount(u64),
11535    HealthReporterDumpTs(u64),
11536    HealthReporterGracefulPeriod(u64),
11537    HealthReporterAutoRecover(u8),
11538    HealthReporterDumpTsNs(u64),
11539    HealthReporterAutoDump(u8),
11540    #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
11541    HealthReporterBurstPeriod(u64),
11542}
11543impl<'a> IterableDlHealthReporter<'a> {
11544    pub fn get_health_reporter_name(&self) -> Result<&'a CStr, ErrorContext> {
11545        let mut iter = self.clone();
11546        iter.pos = 0;
11547        for attr in iter {
11548            if let DlHealthReporter::HealthReporterName(val) = attr? {
11549                return Ok(val);
11550            }
11551        }
11552        Err(ErrorContext::new_missing(
11553            "DlHealthReporter",
11554            "HealthReporterName",
11555            self.orig_loc,
11556            self.buf.as_ptr() as usize,
11557        ))
11558    }
11559    pub fn get_health_reporter_state(&self) -> Result<u8, ErrorContext> {
11560        let mut iter = self.clone();
11561        iter.pos = 0;
11562        for attr in iter {
11563            if let DlHealthReporter::HealthReporterState(val) = attr? {
11564                return Ok(val);
11565            }
11566        }
11567        Err(ErrorContext::new_missing(
11568            "DlHealthReporter",
11569            "HealthReporterState",
11570            self.orig_loc,
11571            self.buf.as_ptr() as usize,
11572        ))
11573    }
11574    pub fn get_health_reporter_err_count(&self) -> Result<u64, ErrorContext> {
11575        let mut iter = self.clone();
11576        iter.pos = 0;
11577        for attr in iter {
11578            if let DlHealthReporter::HealthReporterErrCount(val) = attr? {
11579                return Ok(val);
11580            }
11581        }
11582        Err(ErrorContext::new_missing(
11583            "DlHealthReporter",
11584            "HealthReporterErrCount",
11585            self.orig_loc,
11586            self.buf.as_ptr() as usize,
11587        ))
11588    }
11589    pub fn get_health_reporter_recover_count(&self) -> Result<u64, ErrorContext> {
11590        let mut iter = self.clone();
11591        iter.pos = 0;
11592        for attr in iter {
11593            if let DlHealthReporter::HealthReporterRecoverCount(val) = attr? {
11594                return Ok(val);
11595            }
11596        }
11597        Err(ErrorContext::new_missing(
11598            "DlHealthReporter",
11599            "HealthReporterRecoverCount",
11600            self.orig_loc,
11601            self.buf.as_ptr() as usize,
11602        ))
11603    }
11604    pub fn get_health_reporter_dump_ts(&self) -> Result<u64, ErrorContext> {
11605        let mut iter = self.clone();
11606        iter.pos = 0;
11607        for attr in iter {
11608            if let DlHealthReporter::HealthReporterDumpTs(val) = attr? {
11609                return Ok(val);
11610            }
11611        }
11612        Err(ErrorContext::new_missing(
11613            "DlHealthReporter",
11614            "HealthReporterDumpTs",
11615            self.orig_loc,
11616            self.buf.as_ptr() as usize,
11617        ))
11618    }
11619    pub fn get_health_reporter_graceful_period(&self) -> Result<u64, ErrorContext> {
11620        let mut iter = self.clone();
11621        iter.pos = 0;
11622        for attr in iter {
11623            if let DlHealthReporter::HealthReporterGracefulPeriod(val) = attr? {
11624                return Ok(val);
11625            }
11626        }
11627        Err(ErrorContext::new_missing(
11628            "DlHealthReporter",
11629            "HealthReporterGracefulPeriod",
11630            self.orig_loc,
11631            self.buf.as_ptr() as usize,
11632        ))
11633    }
11634    pub fn get_health_reporter_auto_recover(&self) -> Result<u8, ErrorContext> {
11635        let mut iter = self.clone();
11636        iter.pos = 0;
11637        for attr in iter {
11638            if let DlHealthReporter::HealthReporterAutoRecover(val) = attr? {
11639                return Ok(val);
11640            }
11641        }
11642        Err(ErrorContext::new_missing(
11643            "DlHealthReporter",
11644            "HealthReporterAutoRecover",
11645            self.orig_loc,
11646            self.buf.as_ptr() as usize,
11647        ))
11648    }
11649    pub fn get_health_reporter_dump_ts_ns(&self) -> Result<u64, ErrorContext> {
11650        let mut iter = self.clone();
11651        iter.pos = 0;
11652        for attr in iter {
11653            if let DlHealthReporter::HealthReporterDumpTsNs(val) = attr? {
11654                return Ok(val);
11655            }
11656        }
11657        Err(ErrorContext::new_missing(
11658            "DlHealthReporter",
11659            "HealthReporterDumpTsNs",
11660            self.orig_loc,
11661            self.buf.as_ptr() as usize,
11662        ))
11663    }
11664    pub fn get_health_reporter_auto_dump(&self) -> Result<u8, ErrorContext> {
11665        let mut iter = self.clone();
11666        iter.pos = 0;
11667        for attr in iter {
11668            if let DlHealthReporter::HealthReporterAutoDump(val) = attr? {
11669                return Ok(val);
11670            }
11671        }
11672        Err(ErrorContext::new_missing(
11673            "DlHealthReporter",
11674            "HealthReporterAutoDump",
11675            self.orig_loc,
11676            self.buf.as_ptr() as usize,
11677        ))
11678    }
11679    #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
11680    pub fn get_health_reporter_burst_period(&self) -> Result<u64, ErrorContext> {
11681        let mut iter = self.clone();
11682        iter.pos = 0;
11683        for attr in iter {
11684            if let DlHealthReporter::HealthReporterBurstPeriod(val) = attr? {
11685                return Ok(val);
11686            }
11687        }
11688        Err(ErrorContext::new_missing(
11689            "DlHealthReporter",
11690            "HealthReporterBurstPeriod",
11691            self.orig_loc,
11692            self.buf.as_ptr() as usize,
11693        ))
11694    }
11695}
11696impl DlHealthReporter<'_> {
11697    pub fn new<'a>(buf: &'a [u8]) -> IterableDlHealthReporter<'a> {
11698        IterableDlHealthReporter::with_loc(buf, buf.as_ptr() as usize)
11699    }
11700    fn attr_from_type(r#type: u16) -> Option<&'static str> {
11701        Devlink::attr_from_type(r#type)
11702    }
11703}
11704#[derive(Clone, Copy, Default)]
11705pub struct IterableDlHealthReporter<'a> {
11706    buf: &'a [u8],
11707    pos: usize,
11708    orig_loc: usize,
11709}
11710impl<'a> IterableDlHealthReporter<'a> {
11711    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11712        Self {
11713            buf,
11714            pos: 0,
11715            orig_loc,
11716        }
11717    }
11718    pub fn get_buf(&self) -> &'a [u8] {
11719        self.buf
11720    }
11721}
11722impl<'a> Iterator for IterableDlHealthReporter<'a> {
11723    type Item = Result<DlHealthReporter<'a>, ErrorContext>;
11724    fn next(&mut self) -> Option<Self::Item> {
11725        let pos = self.pos;
11726        let mut r#type;
11727        loop {
11728            r#type = None;
11729            if self.buf.len() == self.pos {
11730                return None;
11731            }
11732            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11733                break;
11734            };
11735            r#type = Some(header.r#type);
11736            let res = match header.r#type {
11737                115u16 => DlHealthReporter::HealthReporterName({
11738                    let res = CStr::from_bytes_with_nul(next).ok();
11739                    let Some(val) = res else { break };
11740                    val
11741                }),
11742                116u16 => DlHealthReporter::HealthReporterState({
11743                    let res = parse_u8(next);
11744                    let Some(val) = res else { break };
11745                    val
11746                }),
11747                117u16 => DlHealthReporter::HealthReporterErrCount({
11748                    let res = parse_u64(next);
11749                    let Some(val) = res else { break };
11750                    val
11751                }),
11752                118u16 => DlHealthReporter::HealthReporterRecoverCount({
11753                    let res = parse_u64(next);
11754                    let Some(val) = res else { break };
11755                    val
11756                }),
11757                119u16 => DlHealthReporter::HealthReporterDumpTs({
11758                    let res = parse_u64(next);
11759                    let Some(val) = res else { break };
11760                    val
11761                }),
11762                120u16 => DlHealthReporter::HealthReporterGracefulPeriod({
11763                    let res = parse_u64(next);
11764                    let Some(val) = res else { break };
11765                    val
11766                }),
11767                121u16 => DlHealthReporter::HealthReporterAutoRecover({
11768                    let res = parse_u8(next);
11769                    let Some(val) = res else { break };
11770                    val
11771                }),
11772                137u16 => DlHealthReporter::HealthReporterDumpTsNs({
11773                    let res = parse_u64(next);
11774                    let Some(val) = res else { break };
11775                    val
11776                }),
11777                141u16 => DlHealthReporter::HealthReporterAutoDump({
11778                    let res = parse_u8(next);
11779                    let Some(val) = res else { break };
11780                    val
11781                }),
11782                181u16 => DlHealthReporter::HealthReporterBurstPeriod({
11783                    let res = parse_u64(next);
11784                    let Some(val) = res else { break };
11785                    val
11786                }),
11787                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11788                n => continue,
11789            };
11790            return Some(Ok(res));
11791        }
11792        Some(Err(ErrorContext::new(
11793            "DlHealthReporter",
11794            r#type.and_then(|t| DlHealthReporter::attr_from_type(t)),
11795            self.orig_loc,
11796            self.buf.as_ptr().wrapping_add(pos) as usize,
11797        )))
11798    }
11799}
11800impl<'a> std::fmt::Debug for IterableDlHealthReporter<'_> {
11801    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11802        let mut fmt = f.debug_struct("DlHealthReporter");
11803        for attr in self.clone() {
11804            let attr = match attr {
11805                Ok(a) => a,
11806                Err(err) => {
11807                    fmt.finish()?;
11808                    f.write_str("Err(")?;
11809                    err.fmt(f)?;
11810                    return f.write_str(")");
11811                }
11812            };
11813            match attr {
11814                DlHealthReporter::HealthReporterName(val) => fmt.field("HealthReporterName", &val),
11815                DlHealthReporter::HealthReporterState(val) => {
11816                    fmt.field("HealthReporterState", &val)
11817                }
11818                DlHealthReporter::HealthReporterErrCount(val) => {
11819                    fmt.field("HealthReporterErrCount", &val)
11820                }
11821                DlHealthReporter::HealthReporterRecoverCount(val) => {
11822                    fmt.field("HealthReporterRecoverCount", &val)
11823                }
11824                DlHealthReporter::HealthReporterDumpTs(val) => {
11825                    fmt.field("HealthReporterDumpTs", &val)
11826                }
11827                DlHealthReporter::HealthReporterGracefulPeriod(val) => {
11828                    fmt.field("HealthReporterGracefulPeriod", &val)
11829                }
11830                DlHealthReporter::HealthReporterAutoRecover(val) => {
11831                    fmt.field("HealthReporterAutoRecover", &val)
11832                }
11833                DlHealthReporter::HealthReporterDumpTsNs(val) => {
11834                    fmt.field("HealthReporterDumpTsNs", &val)
11835                }
11836                DlHealthReporter::HealthReporterAutoDump(val) => {
11837                    fmt.field("HealthReporterAutoDump", &val)
11838                }
11839                DlHealthReporter::HealthReporterBurstPeriod(val) => {
11840                    fmt.field("HealthReporterBurstPeriod", &val)
11841                }
11842            };
11843        }
11844        fmt.finish()
11845    }
11846}
11847impl IterableDlHealthReporter<'_> {
11848    pub fn lookup_attr(
11849        &self,
11850        offset: usize,
11851        missing_type: Option<u16>,
11852    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11853        let mut stack = Vec::new();
11854        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11855        if missing_type.is_some() && cur == offset {
11856            stack.push(("DlHealthReporter", offset));
11857            return (
11858                stack,
11859                missing_type.and_then(|t| DlHealthReporter::attr_from_type(t)),
11860            );
11861        }
11862        if cur > offset || cur + self.buf.len() < offset {
11863            return (stack, None);
11864        }
11865        let mut attrs = self.clone();
11866        let mut last_off = cur + attrs.pos;
11867        while let Some(attr) = attrs.next() {
11868            let Ok(attr) = attr else { break };
11869            match attr {
11870                DlHealthReporter::HealthReporterName(val) => {
11871                    if last_off == offset {
11872                        stack.push(("HealthReporterName", last_off));
11873                        break;
11874                    }
11875                }
11876                DlHealthReporter::HealthReporterState(val) => {
11877                    if last_off == offset {
11878                        stack.push(("HealthReporterState", last_off));
11879                        break;
11880                    }
11881                }
11882                DlHealthReporter::HealthReporterErrCount(val) => {
11883                    if last_off == offset {
11884                        stack.push(("HealthReporterErrCount", last_off));
11885                        break;
11886                    }
11887                }
11888                DlHealthReporter::HealthReporterRecoverCount(val) => {
11889                    if last_off == offset {
11890                        stack.push(("HealthReporterRecoverCount", last_off));
11891                        break;
11892                    }
11893                }
11894                DlHealthReporter::HealthReporterDumpTs(val) => {
11895                    if last_off == offset {
11896                        stack.push(("HealthReporterDumpTs", last_off));
11897                        break;
11898                    }
11899                }
11900                DlHealthReporter::HealthReporterGracefulPeriod(val) => {
11901                    if last_off == offset {
11902                        stack.push(("HealthReporterGracefulPeriod", last_off));
11903                        break;
11904                    }
11905                }
11906                DlHealthReporter::HealthReporterAutoRecover(val) => {
11907                    if last_off == offset {
11908                        stack.push(("HealthReporterAutoRecover", last_off));
11909                        break;
11910                    }
11911                }
11912                DlHealthReporter::HealthReporterDumpTsNs(val) => {
11913                    if last_off == offset {
11914                        stack.push(("HealthReporterDumpTsNs", last_off));
11915                        break;
11916                    }
11917                }
11918                DlHealthReporter::HealthReporterAutoDump(val) => {
11919                    if last_off == offset {
11920                        stack.push(("HealthReporterAutoDump", last_off));
11921                        break;
11922                    }
11923                }
11924                DlHealthReporter::HealthReporterBurstPeriod(val) => {
11925                    if last_off == offset {
11926                        stack.push(("HealthReporterBurstPeriod", last_off));
11927                        break;
11928                    }
11929                }
11930                _ => {}
11931            };
11932            last_off = cur + attrs.pos;
11933        }
11934        if !stack.is_empty() {
11935            stack.push(("DlHealthReporter", cur));
11936        }
11937        (stack, None)
11938    }
11939}
11940#[derive(Clone)]
11941pub enum DlAttrStats {
11942    StatsRxPackets(u64),
11943    StatsRxBytes(u64),
11944    StatsRxDropped(u64),
11945}
11946impl<'a> IterableDlAttrStats<'a> {
11947    pub fn get_stats_rx_packets(&self) -> Result<u64, ErrorContext> {
11948        let mut iter = self.clone();
11949        iter.pos = 0;
11950        for attr in iter {
11951            if let DlAttrStats::StatsRxPackets(val) = attr? {
11952                return Ok(val);
11953            }
11954        }
11955        Err(ErrorContext::new_missing(
11956            "DlAttrStats",
11957            "StatsRxPackets",
11958            self.orig_loc,
11959            self.buf.as_ptr() as usize,
11960        ))
11961    }
11962    pub fn get_stats_rx_bytes(&self) -> Result<u64, ErrorContext> {
11963        let mut iter = self.clone();
11964        iter.pos = 0;
11965        for attr in iter {
11966            if let DlAttrStats::StatsRxBytes(val) = attr? {
11967                return Ok(val);
11968            }
11969        }
11970        Err(ErrorContext::new_missing(
11971            "DlAttrStats",
11972            "StatsRxBytes",
11973            self.orig_loc,
11974            self.buf.as_ptr() as usize,
11975        ))
11976    }
11977    pub fn get_stats_rx_dropped(&self) -> Result<u64, ErrorContext> {
11978        let mut iter = self.clone();
11979        iter.pos = 0;
11980        for attr in iter {
11981            if let DlAttrStats::StatsRxDropped(val) = attr? {
11982                return Ok(val);
11983            }
11984        }
11985        Err(ErrorContext::new_missing(
11986            "DlAttrStats",
11987            "StatsRxDropped",
11988            self.orig_loc,
11989            self.buf.as_ptr() as usize,
11990        ))
11991    }
11992}
11993impl DlAttrStats {
11994    pub fn new<'a>(buf: &'a [u8]) -> IterableDlAttrStats<'a> {
11995        IterableDlAttrStats::with_loc(buf, buf.as_ptr() as usize)
11996    }
11997    fn attr_from_type(r#type: u16) -> Option<&'static str> {
11998        let res = match r#type {
11999            0u16 => "StatsRxPackets",
12000            1u16 => "StatsRxBytes",
12001            2u16 => "StatsRxDropped",
12002            _ => return None,
12003        };
12004        Some(res)
12005    }
12006}
12007#[derive(Clone, Copy, Default)]
12008pub struct IterableDlAttrStats<'a> {
12009    buf: &'a [u8],
12010    pos: usize,
12011    orig_loc: usize,
12012}
12013impl<'a> IterableDlAttrStats<'a> {
12014    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12015        Self {
12016            buf,
12017            pos: 0,
12018            orig_loc,
12019        }
12020    }
12021    pub fn get_buf(&self) -> &'a [u8] {
12022        self.buf
12023    }
12024}
12025impl<'a> Iterator for IterableDlAttrStats<'a> {
12026    type Item = Result<DlAttrStats, ErrorContext>;
12027    fn next(&mut self) -> Option<Self::Item> {
12028        let pos = self.pos;
12029        let mut r#type;
12030        loop {
12031            r#type = None;
12032            if self.buf.len() == self.pos {
12033                return None;
12034            }
12035            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12036                break;
12037            };
12038            r#type = Some(header.r#type);
12039            let res = match header.r#type {
12040                0u16 => DlAttrStats::StatsRxPackets({
12041                    let res = parse_u64(next);
12042                    let Some(val) = res else { break };
12043                    val
12044                }),
12045                1u16 => DlAttrStats::StatsRxBytes({
12046                    let res = parse_u64(next);
12047                    let Some(val) = res else { break };
12048                    val
12049                }),
12050                2u16 => DlAttrStats::StatsRxDropped({
12051                    let res = parse_u64(next);
12052                    let Some(val) = res else { break };
12053                    val
12054                }),
12055                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12056                n => continue,
12057            };
12058            return Some(Ok(res));
12059        }
12060        Some(Err(ErrorContext::new(
12061            "DlAttrStats",
12062            r#type.and_then(|t| DlAttrStats::attr_from_type(t)),
12063            self.orig_loc,
12064            self.buf.as_ptr().wrapping_add(pos) as usize,
12065        )))
12066    }
12067}
12068impl std::fmt::Debug for IterableDlAttrStats<'_> {
12069    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12070        let mut fmt = f.debug_struct("DlAttrStats");
12071        for attr in self.clone() {
12072            let attr = match attr {
12073                Ok(a) => a,
12074                Err(err) => {
12075                    fmt.finish()?;
12076                    f.write_str("Err(")?;
12077                    err.fmt(f)?;
12078                    return f.write_str(")");
12079                }
12080            };
12081            match attr {
12082                DlAttrStats::StatsRxPackets(val) => fmt.field("StatsRxPackets", &val),
12083                DlAttrStats::StatsRxBytes(val) => fmt.field("StatsRxBytes", &val),
12084                DlAttrStats::StatsRxDropped(val) => fmt.field("StatsRxDropped", &val),
12085            };
12086        }
12087        fmt.finish()
12088    }
12089}
12090impl IterableDlAttrStats<'_> {
12091    pub fn lookup_attr(
12092        &self,
12093        offset: usize,
12094        missing_type: Option<u16>,
12095    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12096        let mut stack = Vec::new();
12097        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12098        if missing_type.is_some() && cur == offset {
12099            stack.push(("DlAttrStats", offset));
12100            return (
12101                stack,
12102                missing_type.and_then(|t| DlAttrStats::attr_from_type(t)),
12103            );
12104        }
12105        if cur > offset || cur + self.buf.len() < offset {
12106            return (stack, None);
12107        }
12108        let mut attrs = self.clone();
12109        let mut last_off = cur + attrs.pos;
12110        while let Some(attr) = attrs.next() {
12111            let Ok(attr) = attr else { break };
12112            match attr {
12113                DlAttrStats::StatsRxPackets(val) => {
12114                    if last_off == offset {
12115                        stack.push(("StatsRxPackets", last_off));
12116                        break;
12117                    }
12118                }
12119                DlAttrStats::StatsRxBytes(val) => {
12120                    if last_off == offset {
12121                        stack.push(("StatsRxBytes", last_off));
12122                        break;
12123                    }
12124                }
12125                DlAttrStats::StatsRxDropped(val) => {
12126                    if last_off == offset {
12127                        stack.push(("StatsRxDropped", last_off));
12128                        break;
12129                    }
12130                }
12131                _ => {}
12132            };
12133            last_off = cur + attrs.pos;
12134        }
12135        if !stack.is_empty() {
12136            stack.push(("DlAttrStats", cur));
12137        }
12138        (stack, None)
12139    }
12140}
12141#[derive(Clone)]
12142pub enum DlTrapMetadata {
12143    TrapMetadataTypeInPort(()),
12144    TrapMetadataTypeFaCookie(()),
12145}
12146impl<'a> IterableDlTrapMetadata<'a> {
12147    pub fn get_trap_metadata_type_in_port(&self) -> Result<(), ErrorContext> {
12148        let mut iter = self.clone();
12149        iter.pos = 0;
12150        for attr in iter {
12151            if let DlTrapMetadata::TrapMetadataTypeInPort(val) = attr? {
12152                return Ok(val);
12153            }
12154        }
12155        Err(ErrorContext::new_missing(
12156            "DlTrapMetadata",
12157            "TrapMetadataTypeInPort",
12158            self.orig_loc,
12159            self.buf.as_ptr() as usize,
12160        ))
12161    }
12162    pub fn get_trap_metadata_type_fa_cookie(&self) -> Result<(), ErrorContext> {
12163        let mut iter = self.clone();
12164        iter.pos = 0;
12165        for attr in iter {
12166            if let DlTrapMetadata::TrapMetadataTypeFaCookie(val) = attr? {
12167                return Ok(val);
12168            }
12169        }
12170        Err(ErrorContext::new_missing(
12171            "DlTrapMetadata",
12172            "TrapMetadataTypeFaCookie",
12173            self.orig_loc,
12174            self.buf.as_ptr() as usize,
12175        ))
12176    }
12177}
12178impl DlTrapMetadata {
12179    pub fn new<'a>(buf: &'a [u8]) -> IterableDlTrapMetadata<'a> {
12180        IterableDlTrapMetadata::with_loc(buf, buf.as_ptr() as usize)
12181    }
12182    fn attr_from_type(r#type: u16) -> Option<&'static str> {
12183        let res = match r#type {
12184            0u16 => "TrapMetadataTypeInPort",
12185            1u16 => "TrapMetadataTypeFaCookie",
12186            _ => return None,
12187        };
12188        Some(res)
12189    }
12190}
12191#[derive(Clone, Copy, Default)]
12192pub struct IterableDlTrapMetadata<'a> {
12193    buf: &'a [u8],
12194    pos: usize,
12195    orig_loc: usize,
12196}
12197impl<'a> IterableDlTrapMetadata<'a> {
12198    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12199        Self {
12200            buf,
12201            pos: 0,
12202            orig_loc,
12203        }
12204    }
12205    pub fn get_buf(&self) -> &'a [u8] {
12206        self.buf
12207    }
12208}
12209impl<'a> Iterator for IterableDlTrapMetadata<'a> {
12210    type Item = Result<DlTrapMetadata, ErrorContext>;
12211    fn next(&mut self) -> Option<Self::Item> {
12212        let pos = self.pos;
12213        let mut r#type;
12214        loop {
12215            r#type = None;
12216            if self.buf.len() == self.pos {
12217                return None;
12218            }
12219            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12220                break;
12221            };
12222            r#type = Some(header.r#type);
12223            let res = match header.r#type {
12224                0u16 => DlTrapMetadata::TrapMetadataTypeInPort(()),
12225                1u16 => DlTrapMetadata::TrapMetadataTypeFaCookie(()),
12226                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12227                n => continue,
12228            };
12229            return Some(Ok(res));
12230        }
12231        Some(Err(ErrorContext::new(
12232            "DlTrapMetadata",
12233            r#type.and_then(|t| DlTrapMetadata::attr_from_type(t)),
12234            self.orig_loc,
12235            self.buf.as_ptr().wrapping_add(pos) as usize,
12236        )))
12237    }
12238}
12239impl std::fmt::Debug for IterableDlTrapMetadata<'_> {
12240    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12241        let mut fmt = f.debug_struct("DlTrapMetadata");
12242        for attr in self.clone() {
12243            let attr = match attr {
12244                Ok(a) => a,
12245                Err(err) => {
12246                    fmt.finish()?;
12247                    f.write_str("Err(")?;
12248                    err.fmt(f)?;
12249                    return f.write_str(")");
12250                }
12251            };
12252            match attr {
12253                DlTrapMetadata::TrapMetadataTypeInPort(val) => {
12254                    fmt.field("TrapMetadataTypeInPort", &val)
12255                }
12256                DlTrapMetadata::TrapMetadataTypeFaCookie(val) => {
12257                    fmt.field("TrapMetadataTypeFaCookie", &val)
12258                }
12259            };
12260        }
12261        fmt.finish()
12262    }
12263}
12264impl IterableDlTrapMetadata<'_> {
12265    pub fn lookup_attr(
12266        &self,
12267        offset: usize,
12268        missing_type: Option<u16>,
12269    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12270        let mut stack = Vec::new();
12271        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12272        if missing_type.is_some() && cur == offset {
12273            stack.push(("DlTrapMetadata", offset));
12274            return (
12275                stack,
12276                missing_type.and_then(|t| DlTrapMetadata::attr_from_type(t)),
12277            );
12278        }
12279        if cur > offset || cur + self.buf.len() < offset {
12280            return (stack, None);
12281        }
12282        let mut attrs = self.clone();
12283        let mut last_off = cur + attrs.pos;
12284        while let Some(attr) = attrs.next() {
12285            let Ok(attr) = attr else { break };
12286            match attr {
12287                DlTrapMetadata::TrapMetadataTypeInPort(val) => {
12288                    if last_off == offset {
12289                        stack.push(("TrapMetadataTypeInPort", last_off));
12290                        break;
12291                    }
12292                }
12293                DlTrapMetadata::TrapMetadataTypeFaCookie(val) => {
12294                    if last_off == offset {
12295                        stack.push(("TrapMetadataTypeFaCookie", last_off));
12296                        break;
12297                    }
12298                }
12299                _ => {}
12300            };
12301            last_off = cur + attrs.pos;
12302        }
12303        if !stack.is_empty() {
12304            stack.push(("DlTrapMetadata", cur));
12305        }
12306        (stack, None)
12307    }
12308}
12309#[derive(Clone)]
12310pub enum DlLinecardSupportedTypes<'a> {
12311    LinecardType(&'a CStr),
12312}
12313impl<'a> IterableDlLinecardSupportedTypes<'a> {
12314    pub fn get_linecard_type(&self) -> Result<&'a CStr, ErrorContext> {
12315        let mut iter = self.clone();
12316        iter.pos = 0;
12317        for attr in iter {
12318            if let DlLinecardSupportedTypes::LinecardType(val) = attr? {
12319                return Ok(val);
12320            }
12321        }
12322        Err(ErrorContext::new_missing(
12323            "DlLinecardSupportedTypes",
12324            "LinecardType",
12325            self.orig_loc,
12326            self.buf.as_ptr() as usize,
12327        ))
12328    }
12329}
12330impl DlLinecardSupportedTypes<'_> {
12331    pub fn new<'a>(buf: &'a [u8]) -> IterableDlLinecardSupportedTypes<'a> {
12332        IterableDlLinecardSupportedTypes::with_loc(buf, buf.as_ptr() as usize)
12333    }
12334    fn attr_from_type(r#type: u16) -> Option<&'static str> {
12335        Devlink::attr_from_type(r#type)
12336    }
12337}
12338#[derive(Clone, Copy, Default)]
12339pub struct IterableDlLinecardSupportedTypes<'a> {
12340    buf: &'a [u8],
12341    pos: usize,
12342    orig_loc: usize,
12343}
12344impl<'a> IterableDlLinecardSupportedTypes<'a> {
12345    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12346        Self {
12347            buf,
12348            pos: 0,
12349            orig_loc,
12350        }
12351    }
12352    pub fn get_buf(&self) -> &'a [u8] {
12353        self.buf
12354    }
12355}
12356impl<'a> Iterator for IterableDlLinecardSupportedTypes<'a> {
12357    type Item = Result<DlLinecardSupportedTypes<'a>, ErrorContext>;
12358    fn next(&mut self) -> Option<Self::Item> {
12359        let pos = self.pos;
12360        let mut r#type;
12361        loop {
12362            r#type = None;
12363            if self.buf.len() == self.pos {
12364                return None;
12365            }
12366            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12367                break;
12368            };
12369            r#type = Some(header.r#type);
12370            let res = match header.r#type {
12371                173u16 => DlLinecardSupportedTypes::LinecardType({
12372                    let res = CStr::from_bytes_with_nul(next).ok();
12373                    let Some(val) = res else { break };
12374                    val
12375                }),
12376                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12377                n => continue,
12378            };
12379            return Some(Ok(res));
12380        }
12381        Some(Err(ErrorContext::new(
12382            "DlLinecardSupportedTypes",
12383            r#type.and_then(|t| DlLinecardSupportedTypes::attr_from_type(t)),
12384            self.orig_loc,
12385            self.buf.as_ptr().wrapping_add(pos) as usize,
12386        )))
12387    }
12388}
12389impl<'a> std::fmt::Debug for IterableDlLinecardSupportedTypes<'_> {
12390    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12391        let mut fmt = f.debug_struct("DlLinecardSupportedTypes");
12392        for attr in self.clone() {
12393            let attr = match attr {
12394                Ok(a) => a,
12395                Err(err) => {
12396                    fmt.finish()?;
12397                    f.write_str("Err(")?;
12398                    err.fmt(f)?;
12399                    return f.write_str(")");
12400                }
12401            };
12402            match attr {
12403                DlLinecardSupportedTypes::LinecardType(val) => fmt.field("LinecardType", &val),
12404            };
12405        }
12406        fmt.finish()
12407    }
12408}
12409impl IterableDlLinecardSupportedTypes<'_> {
12410    pub fn lookup_attr(
12411        &self,
12412        offset: usize,
12413        missing_type: Option<u16>,
12414    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12415        let mut stack = Vec::new();
12416        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12417        if missing_type.is_some() && cur == offset {
12418            stack.push(("DlLinecardSupportedTypes", offset));
12419            return (
12420                stack,
12421                missing_type.and_then(|t| DlLinecardSupportedTypes::attr_from_type(t)),
12422            );
12423        }
12424        if cur > offset || cur + self.buf.len() < offset {
12425            return (stack, None);
12426        }
12427        let mut attrs = self.clone();
12428        let mut last_off = cur + attrs.pos;
12429        while let Some(attr) = attrs.next() {
12430            let Ok(attr) = attr else { break };
12431            match attr {
12432                DlLinecardSupportedTypes::LinecardType(val) => {
12433                    if last_off == offset {
12434                        stack.push(("LinecardType", last_off));
12435                        break;
12436                    }
12437                }
12438                _ => {}
12439            };
12440            last_off = cur + attrs.pos;
12441        }
12442        if !stack.is_empty() {
12443            stack.push(("DlLinecardSupportedTypes", cur));
12444        }
12445        (stack, None)
12446    }
12447}
12448#[derive(Clone)]
12449pub enum DlSelftestId {
12450    Flash(()),
12451}
12452impl<'a> IterableDlSelftestId<'a> {
12453    pub fn get_flash(&self) -> Result<(), ErrorContext> {
12454        let mut iter = self.clone();
12455        iter.pos = 0;
12456        for attr in iter {
12457            if let DlSelftestId::Flash(val) = attr? {
12458                return Ok(val);
12459            }
12460        }
12461        Err(ErrorContext::new_missing(
12462            "DlSelftestId",
12463            "Flash",
12464            self.orig_loc,
12465            self.buf.as_ptr() as usize,
12466        ))
12467    }
12468}
12469impl DlSelftestId {
12470    pub fn new<'a>(buf: &'a [u8]) -> IterableDlSelftestId<'a> {
12471        IterableDlSelftestId::with_loc(buf, buf.as_ptr() as usize)
12472    }
12473    fn attr_from_type(r#type: u16) -> Option<&'static str> {
12474        let res = match r#type {
12475            1u16 => "Flash",
12476            _ => return None,
12477        };
12478        Some(res)
12479    }
12480}
12481#[derive(Clone, Copy, Default)]
12482pub struct IterableDlSelftestId<'a> {
12483    buf: &'a [u8],
12484    pos: usize,
12485    orig_loc: usize,
12486}
12487impl<'a> IterableDlSelftestId<'a> {
12488    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12489        Self {
12490            buf,
12491            pos: 0,
12492            orig_loc,
12493        }
12494    }
12495    pub fn get_buf(&self) -> &'a [u8] {
12496        self.buf
12497    }
12498}
12499impl<'a> Iterator for IterableDlSelftestId<'a> {
12500    type Item = Result<DlSelftestId, ErrorContext>;
12501    fn next(&mut self) -> Option<Self::Item> {
12502        let pos = self.pos;
12503        let mut r#type;
12504        loop {
12505            r#type = None;
12506            if self.buf.len() == self.pos {
12507                return None;
12508            }
12509            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12510                break;
12511            };
12512            r#type = Some(header.r#type);
12513            let res = match header.r#type {
12514                1u16 => DlSelftestId::Flash(()),
12515                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12516                n => continue,
12517            };
12518            return Some(Ok(res));
12519        }
12520        Some(Err(ErrorContext::new(
12521            "DlSelftestId",
12522            r#type.and_then(|t| DlSelftestId::attr_from_type(t)),
12523            self.orig_loc,
12524            self.buf.as_ptr().wrapping_add(pos) as usize,
12525        )))
12526    }
12527}
12528impl std::fmt::Debug for IterableDlSelftestId<'_> {
12529    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12530        let mut fmt = f.debug_struct("DlSelftestId");
12531        for attr in self.clone() {
12532            let attr = match attr {
12533                Ok(a) => a,
12534                Err(err) => {
12535                    fmt.finish()?;
12536                    f.write_str("Err(")?;
12537                    err.fmt(f)?;
12538                    return f.write_str(")");
12539                }
12540            };
12541            match attr {
12542                DlSelftestId::Flash(val) => fmt.field("Flash", &val),
12543            };
12544        }
12545        fmt.finish()
12546    }
12547}
12548impl IterableDlSelftestId<'_> {
12549    pub fn lookup_attr(
12550        &self,
12551        offset: usize,
12552        missing_type: Option<u16>,
12553    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12554        let mut stack = Vec::new();
12555        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12556        if missing_type.is_some() && cur == offset {
12557            stack.push(("DlSelftestId", offset));
12558            return (
12559                stack,
12560                missing_type.and_then(|t| DlSelftestId::attr_from_type(t)),
12561            );
12562        }
12563        if cur > offset || cur + self.buf.len() < offset {
12564            return (stack, None);
12565        }
12566        let mut attrs = self.clone();
12567        let mut last_off = cur + attrs.pos;
12568        while let Some(attr) = attrs.next() {
12569            let Ok(attr) = attr else { break };
12570            match attr {
12571                DlSelftestId::Flash(val) => {
12572                    if last_off == offset {
12573                        stack.push(("Flash", last_off));
12574                        break;
12575                    }
12576                }
12577                _ => {}
12578            };
12579            last_off = cur + attrs.pos;
12580        }
12581        if !stack.is_empty() {
12582            stack.push(("DlSelftestId", cur));
12583        }
12584        (stack, None)
12585    }
12586}
12587#[derive(Clone)]
12588pub enum DlRateTcBws {
12589    Index(u8),
12590    #[doc = "Specifies the bandwidth share assigned to the Traffic Class\\.\nThe bandwidth for the traffic class is determined\nin proportion to the sum of the shares of all configured classes\\.\n"]
12591    Bw(u32),
12592}
12593impl<'a> IterableDlRateTcBws<'a> {
12594    pub fn get_index(&self) -> Result<u8, ErrorContext> {
12595        let mut iter = self.clone();
12596        iter.pos = 0;
12597        for attr in iter {
12598            if let DlRateTcBws::Index(val) = attr? {
12599                return Ok(val);
12600            }
12601        }
12602        Err(ErrorContext::new_missing(
12603            "DlRateTcBws",
12604            "Index",
12605            self.orig_loc,
12606            self.buf.as_ptr() as usize,
12607        ))
12608    }
12609    #[doc = "Specifies the bandwidth share assigned to the Traffic Class\\.\nThe bandwidth for the traffic class is determined\nin proportion to the sum of the shares of all configured classes\\.\n"]
12610    pub fn get_bw(&self) -> Result<u32, ErrorContext> {
12611        let mut iter = self.clone();
12612        iter.pos = 0;
12613        for attr in iter {
12614            if let DlRateTcBws::Bw(val) = attr? {
12615                return Ok(val);
12616            }
12617        }
12618        Err(ErrorContext::new_missing(
12619            "DlRateTcBws",
12620            "Bw",
12621            self.orig_loc,
12622            self.buf.as_ptr() as usize,
12623        ))
12624    }
12625}
12626impl DlRateTcBws {
12627    pub fn new<'a>(buf: &'a [u8]) -> IterableDlRateTcBws<'a> {
12628        IterableDlRateTcBws::with_loc(buf, buf.as_ptr() as usize)
12629    }
12630    fn attr_from_type(r#type: u16) -> Option<&'static str> {
12631        let res = match r#type {
12632            1u16 => "Index",
12633            2u16 => "Bw",
12634            _ => return None,
12635        };
12636        Some(res)
12637    }
12638}
12639#[derive(Clone, Copy, Default)]
12640pub struct IterableDlRateTcBws<'a> {
12641    buf: &'a [u8],
12642    pos: usize,
12643    orig_loc: usize,
12644}
12645impl<'a> IterableDlRateTcBws<'a> {
12646    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12647        Self {
12648            buf,
12649            pos: 0,
12650            orig_loc,
12651        }
12652    }
12653    pub fn get_buf(&self) -> &'a [u8] {
12654        self.buf
12655    }
12656}
12657impl<'a> Iterator for IterableDlRateTcBws<'a> {
12658    type Item = Result<DlRateTcBws, ErrorContext>;
12659    fn next(&mut self) -> Option<Self::Item> {
12660        let pos = self.pos;
12661        let mut r#type;
12662        loop {
12663            r#type = None;
12664            if self.buf.len() == self.pos {
12665                return None;
12666            }
12667            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12668                break;
12669            };
12670            r#type = Some(header.r#type);
12671            let res = match header.r#type {
12672                1u16 => DlRateTcBws::Index({
12673                    let res = parse_u8(next);
12674                    let Some(val) = res else { break };
12675                    val
12676                }),
12677                2u16 => DlRateTcBws::Bw({
12678                    let res = parse_u32(next);
12679                    let Some(val) = res else { break };
12680                    val
12681                }),
12682                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12683                n => continue,
12684            };
12685            return Some(Ok(res));
12686        }
12687        Some(Err(ErrorContext::new(
12688            "DlRateTcBws",
12689            r#type.and_then(|t| DlRateTcBws::attr_from_type(t)),
12690            self.orig_loc,
12691            self.buf.as_ptr().wrapping_add(pos) as usize,
12692        )))
12693    }
12694}
12695impl std::fmt::Debug for IterableDlRateTcBws<'_> {
12696    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12697        let mut fmt = f.debug_struct("DlRateTcBws");
12698        for attr in self.clone() {
12699            let attr = match attr {
12700                Ok(a) => a,
12701                Err(err) => {
12702                    fmt.finish()?;
12703                    f.write_str("Err(")?;
12704                    err.fmt(f)?;
12705                    return f.write_str(")");
12706                }
12707            };
12708            match attr {
12709                DlRateTcBws::Index(val) => fmt.field("Index", &val),
12710                DlRateTcBws::Bw(val) => fmt.field("Bw", &val),
12711            };
12712        }
12713        fmt.finish()
12714    }
12715}
12716impl IterableDlRateTcBws<'_> {
12717    pub fn lookup_attr(
12718        &self,
12719        offset: usize,
12720        missing_type: Option<u16>,
12721    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12722        let mut stack = Vec::new();
12723        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12724        if missing_type.is_some() && cur == offset {
12725            stack.push(("DlRateTcBws", offset));
12726            return (
12727                stack,
12728                missing_type.and_then(|t| DlRateTcBws::attr_from_type(t)),
12729            );
12730        }
12731        if cur > offset || cur + self.buf.len() < offset {
12732            return (stack, None);
12733        }
12734        let mut attrs = self.clone();
12735        let mut last_off = cur + attrs.pos;
12736        while let Some(attr) = attrs.next() {
12737            let Ok(attr) = attr else { break };
12738            match attr {
12739                DlRateTcBws::Index(val) => {
12740                    if last_off == offset {
12741                        stack.push(("Index", last_off));
12742                        break;
12743                    }
12744                }
12745                DlRateTcBws::Bw(val) => {
12746                    if last_off == offset {
12747                        stack.push(("Bw", last_off));
12748                        break;
12749                    }
12750                }
12751                _ => {}
12752            };
12753            last_off = cur + attrs.pos;
12754        }
12755        if !stack.is_empty() {
12756            stack.push(("DlRateTcBws", cur));
12757        }
12758        (stack, None)
12759    }
12760}
12761pub struct PushDevlink<Prev: Rec> {
12762    pub(crate) prev: Option<Prev>,
12763    pub(crate) header_offset: Option<usize>,
12764}
12765impl<Prev: Rec> Rec for PushDevlink<Prev> {
12766    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
12767        self.prev.as_mut().unwrap().as_rec_mut()
12768    }
12769    fn as_rec(&self) -> &Vec<u8> {
12770        self.prev.as_ref().unwrap().as_rec()
12771    }
12772}
12773impl<Prev: Rec> PushDevlink<Prev> {
12774    pub fn new(prev: Prev) -> Self {
12775        Self {
12776            prev: Some(prev),
12777            header_offset: None,
12778        }
12779    }
12780    pub fn end_nested(mut self) -> Prev {
12781        let mut prev = self.prev.take().unwrap();
12782        if let Some(header_offset) = &self.header_offset {
12783            finalize_nested_header(prev.as_rec_mut(), *header_offset);
12784        }
12785        prev
12786    }
12787    pub fn push_bus_name(mut self, value: &CStr) -> Self {
12788        push_header(
12789            self.as_rec_mut(),
12790            1u16,
12791            value.to_bytes_with_nul().len() as u16,
12792        );
12793        self.as_rec_mut().extend(value.to_bytes_with_nul());
12794        self
12795    }
12796    pub fn push_bus_name_bytes(mut self, value: &[u8]) -> Self {
12797        push_header(self.as_rec_mut(), 1u16, (value.len() + 1) as u16);
12798        self.as_rec_mut().extend(value);
12799        self.as_rec_mut().push(0);
12800        self
12801    }
12802    pub fn push_dev_name(mut self, value: &CStr) -> Self {
12803        push_header(
12804            self.as_rec_mut(),
12805            2u16,
12806            value.to_bytes_with_nul().len() as u16,
12807        );
12808        self.as_rec_mut().extend(value.to_bytes_with_nul());
12809        self
12810    }
12811    pub fn push_dev_name_bytes(mut self, value: &[u8]) -> Self {
12812        push_header(self.as_rec_mut(), 2u16, (value.len() + 1) as u16);
12813        self.as_rec_mut().extend(value);
12814        self.as_rec_mut().push(0);
12815        self
12816    }
12817    pub fn push_port_index(mut self, value: u32) -> Self {
12818        push_header(self.as_rec_mut(), 3u16, 4 as u16);
12819        self.as_rec_mut().extend(value.to_ne_bytes());
12820        self
12821    }
12822    #[doc = "Associated type: [`PortType`] (enum)"]
12823    pub fn push_port_type(mut self, value: u16) -> Self {
12824        push_header(self.as_rec_mut(), 4u16, 2 as u16);
12825        self.as_rec_mut().extend(value.to_ne_bytes());
12826        self
12827    }
12828    pub fn push_port_desired_type(mut self, value: u16) -> Self {
12829        push_header(self.as_rec_mut(), 5u16, 2 as u16);
12830        self.as_rec_mut().extend(value.to_ne_bytes());
12831        self
12832    }
12833    pub fn push_port_netdev_ifindex(mut self, value: u32) -> Self {
12834        push_header(self.as_rec_mut(), 6u16, 4 as u16);
12835        self.as_rec_mut().extend(value.to_ne_bytes());
12836        self
12837    }
12838    pub fn push_port_netdev_name(mut self, value: &CStr) -> Self {
12839        push_header(
12840            self.as_rec_mut(),
12841            7u16,
12842            value.to_bytes_with_nul().len() as u16,
12843        );
12844        self.as_rec_mut().extend(value.to_bytes_with_nul());
12845        self
12846    }
12847    pub fn push_port_netdev_name_bytes(mut self, value: &[u8]) -> Self {
12848        push_header(self.as_rec_mut(), 7u16, (value.len() + 1) as u16);
12849        self.as_rec_mut().extend(value);
12850        self.as_rec_mut().push(0);
12851        self
12852    }
12853    pub fn push_port_ibdev_name(mut self, value: &CStr) -> Self {
12854        push_header(
12855            self.as_rec_mut(),
12856            8u16,
12857            value.to_bytes_with_nul().len() as u16,
12858        );
12859        self.as_rec_mut().extend(value.to_bytes_with_nul());
12860        self
12861    }
12862    pub fn push_port_ibdev_name_bytes(mut self, value: &[u8]) -> Self {
12863        push_header(self.as_rec_mut(), 8u16, (value.len() + 1) as u16);
12864        self.as_rec_mut().extend(value);
12865        self.as_rec_mut().push(0);
12866        self
12867    }
12868    pub fn push_port_split_count(mut self, value: u32) -> Self {
12869        push_header(self.as_rec_mut(), 9u16, 4 as u16);
12870        self.as_rec_mut().extend(value.to_ne_bytes());
12871        self
12872    }
12873    pub fn push_port_split_group(mut self, value: u32) -> Self {
12874        push_header(self.as_rec_mut(), 10u16, 4 as u16);
12875        self.as_rec_mut().extend(value.to_ne_bytes());
12876        self
12877    }
12878    pub fn push_sb_index(mut self, value: u32) -> Self {
12879        push_header(self.as_rec_mut(), 11u16, 4 as u16);
12880        self.as_rec_mut().extend(value.to_ne_bytes());
12881        self
12882    }
12883    pub fn push_sb_size(mut self, value: u32) -> Self {
12884        push_header(self.as_rec_mut(), 12u16, 4 as u16);
12885        self.as_rec_mut().extend(value.to_ne_bytes());
12886        self
12887    }
12888    pub fn push_sb_ingress_pool_count(mut self, value: u16) -> Self {
12889        push_header(self.as_rec_mut(), 13u16, 2 as u16);
12890        self.as_rec_mut().extend(value.to_ne_bytes());
12891        self
12892    }
12893    pub fn push_sb_egress_pool_count(mut self, value: u16) -> Self {
12894        push_header(self.as_rec_mut(), 14u16, 2 as u16);
12895        self.as_rec_mut().extend(value.to_ne_bytes());
12896        self
12897    }
12898    pub fn push_sb_ingress_tc_count(mut self, value: u16) -> Self {
12899        push_header(self.as_rec_mut(), 15u16, 2 as u16);
12900        self.as_rec_mut().extend(value.to_ne_bytes());
12901        self
12902    }
12903    pub fn push_sb_egress_tc_count(mut self, value: u16) -> Self {
12904        push_header(self.as_rec_mut(), 16u16, 2 as u16);
12905        self.as_rec_mut().extend(value.to_ne_bytes());
12906        self
12907    }
12908    pub fn push_sb_pool_index(mut self, value: u16) -> Self {
12909        push_header(self.as_rec_mut(), 17u16, 2 as u16);
12910        self.as_rec_mut().extend(value.to_ne_bytes());
12911        self
12912    }
12913    #[doc = "Associated type: [`SbPoolType`] (enum)"]
12914    pub fn push_sb_pool_type(mut self, value: u8) -> Self {
12915        push_header(self.as_rec_mut(), 18u16, 1 as u16);
12916        self.as_rec_mut().extend(value.to_ne_bytes());
12917        self
12918    }
12919    pub fn push_sb_pool_size(mut self, value: u32) -> Self {
12920        push_header(self.as_rec_mut(), 19u16, 4 as u16);
12921        self.as_rec_mut().extend(value.to_ne_bytes());
12922        self
12923    }
12924    #[doc = "Associated type: [`SbThresholdType`] (enum)"]
12925    pub fn push_sb_pool_threshold_type(mut self, value: u8) -> Self {
12926        push_header(self.as_rec_mut(), 20u16, 1 as u16);
12927        self.as_rec_mut().extend(value.to_ne_bytes());
12928        self
12929    }
12930    pub fn push_sb_threshold(mut self, value: u32) -> Self {
12931        push_header(self.as_rec_mut(), 21u16, 4 as u16);
12932        self.as_rec_mut().extend(value.to_ne_bytes());
12933        self
12934    }
12935    pub fn push_sb_tc_index(mut self, value: u16) -> Self {
12936        push_header(self.as_rec_mut(), 22u16, 2 as u16);
12937        self.as_rec_mut().extend(value.to_ne_bytes());
12938        self
12939    }
12940    pub fn push_sb_occ_cur(mut self, value: u32) -> Self {
12941        push_header(self.as_rec_mut(), 23u16, 4 as u16);
12942        self.as_rec_mut().extend(value.to_ne_bytes());
12943        self
12944    }
12945    pub fn push_sb_occ_max(mut self, value: u32) -> Self {
12946        push_header(self.as_rec_mut(), 24u16, 4 as u16);
12947        self.as_rec_mut().extend(value.to_ne_bytes());
12948        self
12949    }
12950    #[doc = "Associated type: [`EswitchMode`] (enum)"]
12951    pub fn push_eswitch_mode(mut self, value: u16) -> Self {
12952        push_header(self.as_rec_mut(), 25u16, 2 as u16);
12953        self.as_rec_mut().extend(value.to_ne_bytes());
12954        self
12955    }
12956    #[doc = "Associated type: [`EswitchInlineMode`] (enum)"]
12957    pub fn push_eswitch_inline_mode(mut self, value: u8) -> Self {
12958        push_header(self.as_rec_mut(), 26u16, 1 as u16);
12959        self.as_rec_mut().extend(value.to_ne_bytes());
12960        self
12961    }
12962    pub fn nested_dpipe_tables(mut self) -> PushDlDpipeTables<Self> {
12963        let header_offset = push_nested_header(self.as_rec_mut(), 27u16);
12964        PushDlDpipeTables {
12965            prev: Some(self),
12966            header_offset: Some(header_offset),
12967        }
12968    }
12969    #[doc = "Attribute may repeat multiple times (treat it as array)"]
12970    pub fn nested_dpipe_table(mut self) -> PushDlDpipeTable<Self> {
12971        let header_offset = push_nested_header(self.as_rec_mut(), 28u16);
12972        PushDlDpipeTable {
12973            prev: Some(self),
12974            header_offset: Some(header_offset),
12975        }
12976    }
12977    pub fn push_dpipe_table_name(mut self, value: &CStr) -> Self {
12978        push_header(
12979            self.as_rec_mut(),
12980            29u16,
12981            value.to_bytes_with_nul().len() as u16,
12982        );
12983        self.as_rec_mut().extend(value.to_bytes_with_nul());
12984        self
12985    }
12986    pub fn push_dpipe_table_name_bytes(mut self, value: &[u8]) -> Self {
12987        push_header(self.as_rec_mut(), 29u16, (value.len() + 1) as u16);
12988        self.as_rec_mut().extend(value);
12989        self.as_rec_mut().push(0);
12990        self
12991    }
12992    pub fn push_dpipe_table_size(mut self, value: u64) -> Self {
12993        push_header(self.as_rec_mut(), 30u16, 8 as u16);
12994        self.as_rec_mut().extend(value.to_ne_bytes());
12995        self
12996    }
12997    pub fn nested_dpipe_table_matches(mut self) -> PushDlDpipeTableMatches<Self> {
12998        let header_offset = push_nested_header(self.as_rec_mut(), 31u16);
12999        PushDlDpipeTableMatches {
13000            prev: Some(self),
13001            header_offset: Some(header_offset),
13002        }
13003    }
13004    pub fn nested_dpipe_table_actions(mut self) -> PushDlDpipeTableActions<Self> {
13005        let header_offset = push_nested_header(self.as_rec_mut(), 32u16);
13006        PushDlDpipeTableActions {
13007            prev: Some(self),
13008            header_offset: Some(header_offset),
13009        }
13010    }
13011    pub fn push_dpipe_table_counters_enabled(mut self, value: u8) -> Self {
13012        push_header(self.as_rec_mut(), 33u16, 1 as u16);
13013        self.as_rec_mut().extend(value.to_ne_bytes());
13014        self
13015    }
13016    pub fn nested_dpipe_entries(mut self) -> PushDlDpipeEntries<Self> {
13017        let header_offset = push_nested_header(self.as_rec_mut(), 34u16);
13018        PushDlDpipeEntries {
13019            prev: Some(self),
13020            header_offset: Some(header_offset),
13021        }
13022    }
13023    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13024    pub fn nested_dpipe_entry(mut self) -> PushDlDpipeEntry<Self> {
13025        let header_offset = push_nested_header(self.as_rec_mut(), 35u16);
13026        PushDlDpipeEntry {
13027            prev: Some(self),
13028            header_offset: Some(header_offset),
13029        }
13030    }
13031    pub fn push_dpipe_entry_index(mut self, value: u64) -> Self {
13032        push_header(self.as_rec_mut(), 36u16, 8 as u16);
13033        self.as_rec_mut().extend(value.to_ne_bytes());
13034        self
13035    }
13036    pub fn nested_dpipe_entry_match_values(mut self) -> PushDlDpipeEntryMatchValues<Self> {
13037        let header_offset = push_nested_header(self.as_rec_mut(), 37u16);
13038        PushDlDpipeEntryMatchValues {
13039            prev: Some(self),
13040            header_offset: Some(header_offset),
13041        }
13042    }
13043    pub fn nested_dpipe_entry_action_values(mut self) -> PushDlDpipeEntryActionValues<Self> {
13044        let header_offset = push_nested_header(self.as_rec_mut(), 38u16);
13045        PushDlDpipeEntryActionValues {
13046            prev: Some(self),
13047            header_offset: Some(header_offset),
13048        }
13049    }
13050    pub fn push_dpipe_entry_counter(mut self, value: u64) -> Self {
13051        push_header(self.as_rec_mut(), 39u16, 8 as u16);
13052        self.as_rec_mut().extend(value.to_ne_bytes());
13053        self
13054    }
13055    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13056    pub fn nested_dpipe_match(mut self) -> PushDlDpipeMatch<Self> {
13057        let header_offset = push_nested_header(self.as_rec_mut(), 40u16);
13058        PushDlDpipeMatch {
13059            prev: Some(self),
13060            header_offset: Some(header_offset),
13061        }
13062    }
13063    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13064    pub fn nested_dpipe_match_value(mut self) -> PushDlDpipeMatchValue<Self> {
13065        let header_offset = push_nested_header(self.as_rec_mut(), 41u16);
13066        PushDlDpipeMatchValue {
13067            prev: Some(self),
13068            header_offset: Some(header_offset),
13069        }
13070    }
13071    #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
13072    pub fn push_dpipe_match_type(mut self, value: u32) -> Self {
13073        push_header(self.as_rec_mut(), 42u16, 4 as u16);
13074        self.as_rec_mut().extend(value.to_ne_bytes());
13075        self
13076    }
13077    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13078    pub fn nested_dpipe_action(mut self) -> PushDlDpipeAction<Self> {
13079        let header_offset = push_nested_header(self.as_rec_mut(), 43u16);
13080        PushDlDpipeAction {
13081            prev: Some(self),
13082            header_offset: Some(header_offset),
13083        }
13084    }
13085    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13086    pub fn nested_dpipe_action_value(mut self) -> PushDlDpipeActionValue<Self> {
13087        let header_offset = push_nested_header(self.as_rec_mut(), 44u16);
13088        PushDlDpipeActionValue {
13089            prev: Some(self),
13090            header_offset: Some(header_offset),
13091        }
13092    }
13093    #[doc = "Associated type: [`DpipeActionType`] (enum)"]
13094    pub fn push_dpipe_action_type(mut self, value: u32) -> Self {
13095        push_header(self.as_rec_mut(), 45u16, 4 as u16);
13096        self.as_rec_mut().extend(value.to_ne_bytes());
13097        self
13098    }
13099    pub fn push_dpipe_value(mut self, value: &[u8]) -> Self {
13100        push_header(self.as_rec_mut(), 46u16, value.len() as u16);
13101        self.as_rec_mut().extend(value);
13102        self
13103    }
13104    pub fn push_dpipe_value_mask(mut self, value: &[u8]) -> Self {
13105        push_header(self.as_rec_mut(), 47u16, value.len() as u16);
13106        self.as_rec_mut().extend(value);
13107        self
13108    }
13109    pub fn push_dpipe_value_mapping(mut self, value: u32) -> Self {
13110        push_header(self.as_rec_mut(), 48u16, 4 as u16);
13111        self.as_rec_mut().extend(value.to_ne_bytes());
13112        self
13113    }
13114    pub fn nested_dpipe_headers(mut self) -> PushDlDpipeHeaders<Self> {
13115        let header_offset = push_nested_header(self.as_rec_mut(), 49u16);
13116        PushDlDpipeHeaders {
13117            prev: Some(self),
13118            header_offset: Some(header_offset),
13119        }
13120    }
13121    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13122    pub fn nested_dpipe_header(mut self) -> PushDlDpipeHeader<Self> {
13123        let header_offset = push_nested_header(self.as_rec_mut(), 50u16);
13124        PushDlDpipeHeader {
13125            prev: Some(self),
13126            header_offset: Some(header_offset),
13127        }
13128    }
13129    pub fn push_dpipe_header_name(mut self, value: &CStr) -> Self {
13130        push_header(
13131            self.as_rec_mut(),
13132            51u16,
13133            value.to_bytes_with_nul().len() as u16,
13134        );
13135        self.as_rec_mut().extend(value.to_bytes_with_nul());
13136        self
13137    }
13138    pub fn push_dpipe_header_name_bytes(mut self, value: &[u8]) -> Self {
13139        push_header(self.as_rec_mut(), 51u16, (value.len() + 1) as u16);
13140        self.as_rec_mut().extend(value);
13141        self.as_rec_mut().push(0);
13142        self
13143    }
13144    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
13145    pub fn push_dpipe_header_id(mut self, value: u32) -> Self {
13146        push_header(self.as_rec_mut(), 52u16, 4 as u16);
13147        self.as_rec_mut().extend(value.to_ne_bytes());
13148        self
13149    }
13150    pub fn nested_dpipe_header_fields(mut self) -> PushDlDpipeHeaderFields<Self> {
13151        let header_offset = push_nested_header(self.as_rec_mut(), 53u16);
13152        PushDlDpipeHeaderFields {
13153            prev: Some(self),
13154            header_offset: Some(header_offset),
13155        }
13156    }
13157    pub fn push_dpipe_header_global(mut self, value: u8) -> Self {
13158        push_header(self.as_rec_mut(), 54u16, 1 as u16);
13159        self.as_rec_mut().extend(value.to_ne_bytes());
13160        self
13161    }
13162    pub fn push_dpipe_header_index(mut self, value: u32) -> Self {
13163        push_header(self.as_rec_mut(), 55u16, 4 as u16);
13164        self.as_rec_mut().extend(value.to_ne_bytes());
13165        self
13166    }
13167    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13168    pub fn nested_dpipe_field(mut self) -> PushDlDpipeField<Self> {
13169        let header_offset = push_nested_header(self.as_rec_mut(), 56u16);
13170        PushDlDpipeField {
13171            prev: Some(self),
13172            header_offset: Some(header_offset),
13173        }
13174    }
13175    pub fn push_dpipe_field_name(mut self, value: &CStr) -> Self {
13176        push_header(
13177            self.as_rec_mut(),
13178            57u16,
13179            value.to_bytes_with_nul().len() as u16,
13180        );
13181        self.as_rec_mut().extend(value.to_bytes_with_nul());
13182        self
13183    }
13184    pub fn push_dpipe_field_name_bytes(mut self, value: &[u8]) -> Self {
13185        push_header(self.as_rec_mut(), 57u16, (value.len() + 1) as u16);
13186        self.as_rec_mut().extend(value);
13187        self.as_rec_mut().push(0);
13188        self
13189    }
13190    pub fn push_dpipe_field_id(mut self, value: u32) -> Self {
13191        push_header(self.as_rec_mut(), 58u16, 4 as u16);
13192        self.as_rec_mut().extend(value.to_ne_bytes());
13193        self
13194    }
13195    pub fn push_dpipe_field_bitwidth(mut self, value: u32) -> Self {
13196        push_header(self.as_rec_mut(), 59u16, 4 as u16);
13197        self.as_rec_mut().extend(value.to_ne_bytes());
13198        self
13199    }
13200    #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
13201    pub fn push_dpipe_field_mapping_type(mut self, value: u32) -> Self {
13202        push_header(self.as_rec_mut(), 60u16, 4 as u16);
13203        self.as_rec_mut().extend(value.to_ne_bytes());
13204        self
13205    }
13206    pub fn push_pad(mut self, value: &[u8]) -> Self {
13207        push_header(self.as_rec_mut(), 61u16, value.len() as u16);
13208        self.as_rec_mut().extend(value);
13209        self
13210    }
13211    #[doc = "Associated type: [`EswitchEncapMode`] (enum)"]
13212    pub fn push_eswitch_encap_mode(mut self, value: u8) -> Self {
13213        push_header(self.as_rec_mut(), 62u16, 1 as u16);
13214        self.as_rec_mut().extend(value.to_ne_bytes());
13215        self
13216    }
13217    pub fn nested_resource_list(mut self) -> PushDlResourceList<Self> {
13218        let header_offset = push_nested_header(self.as_rec_mut(), 63u16);
13219        PushDlResourceList {
13220            prev: Some(self),
13221            header_offset: Some(header_offset),
13222        }
13223    }
13224    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13225    pub fn nested_resource(mut self) -> PushDlResource<Self> {
13226        let header_offset = push_nested_header(self.as_rec_mut(), 64u16);
13227        PushDlResource {
13228            prev: Some(self),
13229            header_offset: Some(header_offset),
13230        }
13231    }
13232    pub fn push_resource_name(mut self, value: &CStr) -> Self {
13233        push_header(
13234            self.as_rec_mut(),
13235            65u16,
13236            value.to_bytes_with_nul().len() as u16,
13237        );
13238        self.as_rec_mut().extend(value.to_bytes_with_nul());
13239        self
13240    }
13241    pub fn push_resource_name_bytes(mut self, value: &[u8]) -> Self {
13242        push_header(self.as_rec_mut(), 65u16, (value.len() + 1) as u16);
13243        self.as_rec_mut().extend(value);
13244        self.as_rec_mut().push(0);
13245        self
13246    }
13247    pub fn push_resource_id(mut self, value: u64) -> Self {
13248        push_header(self.as_rec_mut(), 66u16, 8 as u16);
13249        self.as_rec_mut().extend(value.to_ne_bytes());
13250        self
13251    }
13252    pub fn push_resource_size(mut self, value: u64) -> Self {
13253        push_header(self.as_rec_mut(), 67u16, 8 as u16);
13254        self.as_rec_mut().extend(value.to_ne_bytes());
13255        self
13256    }
13257    pub fn push_resource_size_new(mut self, value: u64) -> Self {
13258        push_header(self.as_rec_mut(), 68u16, 8 as u16);
13259        self.as_rec_mut().extend(value.to_ne_bytes());
13260        self
13261    }
13262    pub fn push_resource_size_valid(mut self, value: u8) -> Self {
13263        push_header(self.as_rec_mut(), 69u16, 1 as u16);
13264        self.as_rec_mut().extend(value.to_ne_bytes());
13265        self
13266    }
13267    pub fn push_resource_size_min(mut self, value: u64) -> Self {
13268        push_header(self.as_rec_mut(), 70u16, 8 as u16);
13269        self.as_rec_mut().extend(value.to_ne_bytes());
13270        self
13271    }
13272    pub fn push_resource_size_max(mut self, value: u64) -> Self {
13273        push_header(self.as_rec_mut(), 71u16, 8 as u16);
13274        self.as_rec_mut().extend(value.to_ne_bytes());
13275        self
13276    }
13277    pub fn push_resource_size_gran(mut self, value: u64) -> Self {
13278        push_header(self.as_rec_mut(), 72u16, 8 as u16);
13279        self.as_rec_mut().extend(value.to_ne_bytes());
13280        self
13281    }
13282    #[doc = "Associated type: [`ResourceUnit`] (enum)"]
13283    pub fn push_resource_unit(mut self, value: u8) -> Self {
13284        push_header(self.as_rec_mut(), 73u16, 1 as u16);
13285        self.as_rec_mut().extend(value.to_ne_bytes());
13286        self
13287    }
13288    pub fn push_resource_occ(mut self, value: u64) -> Self {
13289        push_header(self.as_rec_mut(), 74u16, 8 as u16);
13290        self.as_rec_mut().extend(value.to_ne_bytes());
13291        self
13292    }
13293    pub fn push_dpipe_table_resource_id(mut self, value: u64) -> Self {
13294        push_header(self.as_rec_mut(), 75u16, 8 as u16);
13295        self.as_rec_mut().extend(value.to_ne_bytes());
13296        self
13297    }
13298    pub fn push_dpipe_table_resource_units(mut self, value: u64) -> Self {
13299        push_header(self.as_rec_mut(), 76u16, 8 as u16);
13300        self.as_rec_mut().extend(value.to_ne_bytes());
13301        self
13302    }
13303    #[doc = "Associated type: [`PortFlavour`] (enum)"]
13304    pub fn push_port_flavour(mut self, value: u16) -> Self {
13305        push_header(self.as_rec_mut(), 77u16, 2 as u16);
13306        self.as_rec_mut().extend(value.to_ne_bytes());
13307        self
13308    }
13309    pub fn push_port_number(mut self, value: u32) -> Self {
13310        push_header(self.as_rec_mut(), 78u16, 4 as u16);
13311        self.as_rec_mut().extend(value.to_ne_bytes());
13312        self
13313    }
13314    pub fn push_port_split_subport_number(mut self, value: u32) -> Self {
13315        push_header(self.as_rec_mut(), 79u16, 4 as u16);
13316        self.as_rec_mut().extend(value.to_ne_bytes());
13317        self
13318    }
13319    pub fn nested_param(mut self) -> PushDlParam<Self> {
13320        let header_offset = push_nested_header(self.as_rec_mut(), 80u16);
13321        PushDlParam {
13322            prev: Some(self),
13323            header_offset: Some(header_offset),
13324        }
13325    }
13326    pub fn push_param_name(mut self, value: &CStr) -> Self {
13327        push_header(
13328            self.as_rec_mut(),
13329            81u16,
13330            value.to_bytes_with_nul().len() as u16,
13331        );
13332        self.as_rec_mut().extend(value.to_bytes_with_nul());
13333        self
13334    }
13335    pub fn push_param_name_bytes(mut self, value: &[u8]) -> Self {
13336        push_header(self.as_rec_mut(), 81u16, (value.len() + 1) as u16);
13337        self.as_rec_mut().extend(value);
13338        self.as_rec_mut().push(0);
13339        self
13340    }
13341    pub fn push_param_generic(mut self, value: ()) -> Self {
13342        push_header(self.as_rec_mut(), 82u16, 0 as u16);
13343        self
13344    }
13345    #[doc = "Associated type: [`VarAttrType`] (enum)"]
13346    pub fn push_param_type(mut self, value: u8) -> Self {
13347        push_header(self.as_rec_mut(), 83u16, 1 as u16);
13348        self.as_rec_mut().extend(value.to_ne_bytes());
13349        self
13350    }
13351    #[doc = "Associated type: [`ParamCmode`] (enum)"]
13352    pub fn push_param_value_cmode(mut self, value: u8) -> Self {
13353        push_header(self.as_rec_mut(), 87u16, 1 as u16);
13354        self.as_rec_mut().extend(value.to_ne_bytes());
13355        self
13356    }
13357    pub fn push_region_name(mut self, value: &CStr) -> Self {
13358        push_header(
13359            self.as_rec_mut(),
13360            88u16,
13361            value.to_bytes_with_nul().len() as u16,
13362        );
13363        self.as_rec_mut().extend(value.to_bytes_with_nul());
13364        self
13365    }
13366    pub fn push_region_name_bytes(mut self, value: &[u8]) -> Self {
13367        push_header(self.as_rec_mut(), 88u16, (value.len() + 1) as u16);
13368        self.as_rec_mut().extend(value);
13369        self.as_rec_mut().push(0);
13370        self
13371    }
13372    pub fn push_region_size(mut self, value: u64) -> Self {
13373        push_header(self.as_rec_mut(), 89u16, 8 as u16);
13374        self.as_rec_mut().extend(value.to_ne_bytes());
13375        self
13376    }
13377    pub fn nested_region_snapshots(mut self) -> PushDlRegionSnapshots<Self> {
13378        let header_offset = push_nested_header(self.as_rec_mut(), 90u16);
13379        PushDlRegionSnapshots {
13380            prev: Some(self),
13381            header_offset: Some(header_offset),
13382        }
13383    }
13384    pub fn nested_region_snapshot(mut self) -> PushDlRegionSnapshot<Self> {
13385        let header_offset = push_nested_header(self.as_rec_mut(), 91u16);
13386        PushDlRegionSnapshot {
13387            prev: Some(self),
13388            header_offset: Some(header_offset),
13389        }
13390    }
13391    pub fn push_region_snapshot_id(mut self, value: u32) -> Self {
13392        push_header(self.as_rec_mut(), 92u16, 4 as u16);
13393        self.as_rec_mut().extend(value.to_ne_bytes());
13394        self
13395    }
13396    pub fn nested_region_chunks(mut self) -> PushDlRegionChunks<Self> {
13397        let header_offset = push_nested_header(self.as_rec_mut(), 93u16);
13398        PushDlRegionChunks {
13399            prev: Some(self),
13400            header_offset: Some(header_offset),
13401        }
13402    }
13403    pub fn nested_region_chunk(mut self) -> PushDlRegionChunk<Self> {
13404        let header_offset = push_nested_header(self.as_rec_mut(), 94u16);
13405        PushDlRegionChunk {
13406            prev: Some(self),
13407            header_offset: Some(header_offset),
13408        }
13409    }
13410    pub fn push_region_chunk_data(mut self, value: &[u8]) -> Self {
13411        push_header(self.as_rec_mut(), 95u16, value.len() as u16);
13412        self.as_rec_mut().extend(value);
13413        self
13414    }
13415    pub fn push_region_chunk_addr(mut self, value: u64) -> Self {
13416        push_header(self.as_rec_mut(), 96u16, 8 as u16);
13417        self.as_rec_mut().extend(value.to_ne_bytes());
13418        self
13419    }
13420    pub fn push_region_chunk_len(mut self, value: u64) -> Self {
13421        push_header(self.as_rec_mut(), 97u16, 8 as u16);
13422        self.as_rec_mut().extend(value.to_ne_bytes());
13423        self
13424    }
13425    pub fn push_info_driver_name(mut self, value: &CStr) -> Self {
13426        push_header(
13427            self.as_rec_mut(),
13428            98u16,
13429            value.to_bytes_with_nul().len() as u16,
13430        );
13431        self.as_rec_mut().extend(value.to_bytes_with_nul());
13432        self
13433    }
13434    pub fn push_info_driver_name_bytes(mut self, value: &[u8]) -> Self {
13435        push_header(self.as_rec_mut(), 98u16, (value.len() + 1) as u16);
13436        self.as_rec_mut().extend(value);
13437        self.as_rec_mut().push(0);
13438        self
13439    }
13440    pub fn push_info_serial_number(mut self, value: &CStr) -> Self {
13441        push_header(
13442            self.as_rec_mut(),
13443            99u16,
13444            value.to_bytes_with_nul().len() as u16,
13445        );
13446        self.as_rec_mut().extend(value.to_bytes_with_nul());
13447        self
13448    }
13449    pub fn push_info_serial_number_bytes(mut self, value: &[u8]) -> Self {
13450        push_header(self.as_rec_mut(), 99u16, (value.len() + 1) as u16);
13451        self.as_rec_mut().extend(value);
13452        self.as_rec_mut().push(0);
13453        self
13454    }
13455    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13456    pub fn nested_info_version_fixed(mut self) -> PushDlInfoVersion<Self> {
13457        let header_offset = push_nested_header(self.as_rec_mut(), 100u16);
13458        PushDlInfoVersion {
13459            prev: Some(self),
13460            header_offset: Some(header_offset),
13461        }
13462    }
13463    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13464    pub fn nested_info_version_running(mut self) -> PushDlInfoVersion<Self> {
13465        let header_offset = push_nested_header(self.as_rec_mut(), 101u16);
13466        PushDlInfoVersion {
13467            prev: Some(self),
13468            header_offset: Some(header_offset),
13469        }
13470    }
13471    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13472    pub fn nested_info_version_stored(mut self) -> PushDlInfoVersion<Self> {
13473        let header_offset = push_nested_header(self.as_rec_mut(), 102u16);
13474        PushDlInfoVersion {
13475            prev: Some(self),
13476            header_offset: Some(header_offset),
13477        }
13478    }
13479    pub fn push_info_version_name(mut self, value: &CStr) -> Self {
13480        push_header(
13481            self.as_rec_mut(),
13482            103u16,
13483            value.to_bytes_with_nul().len() as u16,
13484        );
13485        self.as_rec_mut().extend(value.to_bytes_with_nul());
13486        self
13487    }
13488    pub fn push_info_version_name_bytes(mut self, value: &[u8]) -> Self {
13489        push_header(self.as_rec_mut(), 103u16, (value.len() + 1) as u16);
13490        self.as_rec_mut().extend(value);
13491        self.as_rec_mut().push(0);
13492        self
13493    }
13494    pub fn push_info_version_value(mut self, value: &CStr) -> Self {
13495        push_header(
13496            self.as_rec_mut(),
13497            104u16,
13498            value.to_bytes_with_nul().len() as u16,
13499        );
13500        self.as_rec_mut().extend(value.to_bytes_with_nul());
13501        self
13502    }
13503    pub fn push_info_version_value_bytes(mut self, value: &[u8]) -> Self {
13504        push_header(self.as_rec_mut(), 104u16, (value.len() + 1) as u16);
13505        self.as_rec_mut().extend(value);
13506        self.as_rec_mut().push(0);
13507        self
13508    }
13509    pub fn push_sb_pool_cell_size(mut self, value: u32) -> Self {
13510        push_header(self.as_rec_mut(), 105u16, 4 as u16);
13511        self.as_rec_mut().extend(value.to_ne_bytes());
13512        self
13513    }
13514    pub fn nested_fmsg(mut self) -> PushDlFmsg<Self> {
13515        let header_offset = push_nested_header(self.as_rec_mut(), 106u16);
13516        PushDlFmsg {
13517            prev: Some(self),
13518            header_offset: Some(header_offset),
13519        }
13520    }
13521    pub fn push_fmsg_obj_nest_start(mut self, value: ()) -> Self {
13522        push_header(self.as_rec_mut(), 107u16, 0 as u16);
13523        self
13524    }
13525    pub fn push_fmsg_pair_nest_start(mut self, value: ()) -> Self {
13526        push_header(self.as_rec_mut(), 108u16, 0 as u16);
13527        self
13528    }
13529    pub fn push_fmsg_arr_nest_start(mut self, value: ()) -> Self {
13530        push_header(self.as_rec_mut(), 109u16, 0 as u16);
13531        self
13532    }
13533    pub fn push_fmsg_nest_end(mut self, value: ()) -> Self {
13534        push_header(self.as_rec_mut(), 110u16, 0 as u16);
13535        self
13536    }
13537    pub fn push_fmsg_obj_name(mut self, value: &CStr) -> Self {
13538        push_header(
13539            self.as_rec_mut(),
13540            111u16,
13541            value.to_bytes_with_nul().len() as u16,
13542        );
13543        self.as_rec_mut().extend(value.to_bytes_with_nul());
13544        self
13545    }
13546    pub fn push_fmsg_obj_name_bytes(mut self, value: &[u8]) -> Self {
13547        push_header(self.as_rec_mut(), 111u16, (value.len() + 1) as u16);
13548        self.as_rec_mut().extend(value);
13549        self.as_rec_mut().push(0);
13550        self
13551    }
13552    #[doc = "Associated type: [`VarAttrType`] (enum)"]
13553    pub fn push_fmsg_obj_value_type(mut self, value: u8) -> Self {
13554        push_header(self.as_rec_mut(), 112u16, 1 as u16);
13555        self.as_rec_mut().extend(value.to_ne_bytes());
13556        self
13557    }
13558    pub fn nested_health_reporter(mut self) -> PushDlHealthReporter<Self> {
13559        let header_offset = push_nested_header(self.as_rec_mut(), 114u16);
13560        PushDlHealthReporter {
13561            prev: Some(self),
13562            header_offset: Some(header_offset),
13563        }
13564    }
13565    pub fn push_health_reporter_name(mut self, value: &CStr) -> Self {
13566        push_header(
13567            self.as_rec_mut(),
13568            115u16,
13569            value.to_bytes_with_nul().len() as u16,
13570        );
13571        self.as_rec_mut().extend(value.to_bytes_with_nul());
13572        self
13573    }
13574    pub fn push_health_reporter_name_bytes(mut self, value: &[u8]) -> Self {
13575        push_header(self.as_rec_mut(), 115u16, (value.len() + 1) as u16);
13576        self.as_rec_mut().extend(value);
13577        self.as_rec_mut().push(0);
13578        self
13579    }
13580    pub fn push_health_reporter_state(mut self, value: u8) -> Self {
13581        push_header(self.as_rec_mut(), 116u16, 1 as u16);
13582        self.as_rec_mut().extend(value.to_ne_bytes());
13583        self
13584    }
13585    pub fn push_health_reporter_err_count(mut self, value: u64) -> Self {
13586        push_header(self.as_rec_mut(), 117u16, 8 as u16);
13587        self.as_rec_mut().extend(value.to_ne_bytes());
13588        self
13589    }
13590    pub fn push_health_reporter_recover_count(mut self, value: u64) -> Self {
13591        push_header(self.as_rec_mut(), 118u16, 8 as u16);
13592        self.as_rec_mut().extend(value.to_ne_bytes());
13593        self
13594    }
13595    pub fn push_health_reporter_dump_ts(mut self, value: u64) -> Self {
13596        push_header(self.as_rec_mut(), 119u16, 8 as u16);
13597        self.as_rec_mut().extend(value.to_ne_bytes());
13598        self
13599    }
13600    pub fn push_health_reporter_graceful_period(mut self, value: u64) -> Self {
13601        push_header(self.as_rec_mut(), 120u16, 8 as u16);
13602        self.as_rec_mut().extend(value.to_ne_bytes());
13603        self
13604    }
13605    pub fn push_health_reporter_auto_recover(mut self, value: u8) -> Self {
13606        push_header(self.as_rec_mut(), 121u16, 1 as u16);
13607        self.as_rec_mut().extend(value.to_ne_bytes());
13608        self
13609    }
13610    pub fn push_flash_update_file_name(mut self, value: &CStr) -> Self {
13611        push_header(
13612            self.as_rec_mut(),
13613            122u16,
13614            value.to_bytes_with_nul().len() as u16,
13615        );
13616        self.as_rec_mut().extend(value.to_bytes_with_nul());
13617        self
13618    }
13619    pub fn push_flash_update_file_name_bytes(mut self, value: &[u8]) -> Self {
13620        push_header(self.as_rec_mut(), 122u16, (value.len() + 1) as u16);
13621        self.as_rec_mut().extend(value);
13622        self.as_rec_mut().push(0);
13623        self
13624    }
13625    pub fn push_flash_update_component(mut self, value: &CStr) -> Self {
13626        push_header(
13627            self.as_rec_mut(),
13628            123u16,
13629            value.to_bytes_with_nul().len() as u16,
13630        );
13631        self.as_rec_mut().extend(value.to_bytes_with_nul());
13632        self
13633    }
13634    pub fn push_flash_update_component_bytes(mut self, value: &[u8]) -> Self {
13635        push_header(self.as_rec_mut(), 123u16, (value.len() + 1) as u16);
13636        self.as_rec_mut().extend(value);
13637        self.as_rec_mut().push(0);
13638        self
13639    }
13640    pub fn push_flash_update_status_msg(mut self, value: &CStr) -> Self {
13641        push_header(
13642            self.as_rec_mut(),
13643            124u16,
13644            value.to_bytes_with_nul().len() as u16,
13645        );
13646        self.as_rec_mut().extend(value.to_bytes_with_nul());
13647        self
13648    }
13649    pub fn push_flash_update_status_msg_bytes(mut self, value: &[u8]) -> Self {
13650        push_header(self.as_rec_mut(), 124u16, (value.len() + 1) as u16);
13651        self.as_rec_mut().extend(value);
13652        self.as_rec_mut().push(0);
13653        self
13654    }
13655    pub fn push_flash_update_status_done(mut self, value: u64) -> Self {
13656        push_header(self.as_rec_mut(), 125u16, 8 as u16);
13657        self.as_rec_mut().extend(value.to_ne_bytes());
13658        self
13659    }
13660    pub fn push_flash_update_status_total(mut self, value: u64) -> Self {
13661        push_header(self.as_rec_mut(), 126u16, 8 as u16);
13662        self.as_rec_mut().extend(value.to_ne_bytes());
13663        self
13664    }
13665    pub fn push_port_pci_pf_number(mut self, value: u16) -> Self {
13666        push_header(self.as_rec_mut(), 127u16, 2 as u16);
13667        self.as_rec_mut().extend(value.to_ne_bytes());
13668        self
13669    }
13670    pub fn push_port_pci_vf_number(mut self, value: u16) -> Self {
13671        push_header(self.as_rec_mut(), 128u16, 2 as u16);
13672        self.as_rec_mut().extend(value.to_ne_bytes());
13673        self
13674    }
13675    pub fn nested_stats(mut self) -> PushDlAttrStats<Self> {
13676        let header_offset = push_nested_header(self.as_rec_mut(), 129u16);
13677        PushDlAttrStats {
13678            prev: Some(self),
13679            header_offset: Some(header_offset),
13680        }
13681    }
13682    pub fn push_trap_name(mut self, value: &CStr) -> Self {
13683        push_header(
13684            self.as_rec_mut(),
13685            130u16,
13686            value.to_bytes_with_nul().len() as u16,
13687        );
13688        self.as_rec_mut().extend(value.to_bytes_with_nul());
13689        self
13690    }
13691    pub fn push_trap_name_bytes(mut self, value: &[u8]) -> Self {
13692        push_header(self.as_rec_mut(), 130u16, (value.len() + 1) as u16);
13693        self.as_rec_mut().extend(value);
13694        self.as_rec_mut().push(0);
13695        self
13696    }
13697    #[doc = "Associated type: [`TrapAction`] (enum)"]
13698    pub fn push_trap_action(mut self, value: u8) -> Self {
13699        push_header(self.as_rec_mut(), 131u16, 1 as u16);
13700        self.as_rec_mut().extend(value.to_ne_bytes());
13701        self
13702    }
13703    #[doc = "Associated type: [`TrapType`] (enum)"]
13704    pub fn push_trap_type(mut self, value: u8) -> Self {
13705        push_header(self.as_rec_mut(), 132u16, 1 as u16);
13706        self.as_rec_mut().extend(value.to_ne_bytes());
13707        self
13708    }
13709    pub fn push_trap_generic(mut self, value: ()) -> Self {
13710        push_header(self.as_rec_mut(), 133u16, 0 as u16);
13711        self
13712    }
13713    pub fn nested_trap_metadata(mut self) -> PushDlTrapMetadata<Self> {
13714        let header_offset = push_nested_header(self.as_rec_mut(), 134u16);
13715        PushDlTrapMetadata {
13716            prev: Some(self),
13717            header_offset: Some(header_offset),
13718        }
13719    }
13720    pub fn push_trap_group_name(mut self, value: &CStr) -> Self {
13721        push_header(
13722            self.as_rec_mut(),
13723            135u16,
13724            value.to_bytes_with_nul().len() as u16,
13725        );
13726        self.as_rec_mut().extend(value.to_bytes_with_nul());
13727        self
13728    }
13729    pub fn push_trap_group_name_bytes(mut self, value: &[u8]) -> Self {
13730        push_header(self.as_rec_mut(), 135u16, (value.len() + 1) as u16);
13731        self.as_rec_mut().extend(value);
13732        self.as_rec_mut().push(0);
13733        self
13734    }
13735    pub fn push_reload_failed(mut self, value: u8) -> Self {
13736        push_header(self.as_rec_mut(), 136u16, 1 as u16);
13737        self.as_rec_mut().extend(value.to_ne_bytes());
13738        self
13739    }
13740    pub fn push_health_reporter_dump_ts_ns(mut self, value: u64) -> Self {
13741        push_header(self.as_rec_mut(), 137u16, 8 as u16);
13742        self.as_rec_mut().extend(value.to_ne_bytes());
13743        self
13744    }
13745    pub fn push_netns_fd(mut self, value: u32) -> Self {
13746        push_header(self.as_rec_mut(), 138u16, 4 as u16);
13747        self.as_rec_mut().extend(value.to_ne_bytes());
13748        self
13749    }
13750    pub fn push_netns_pid(mut self, value: u32) -> Self {
13751        push_header(self.as_rec_mut(), 139u16, 4 as u16);
13752        self.as_rec_mut().extend(value.to_ne_bytes());
13753        self
13754    }
13755    pub fn push_netns_id(mut self, value: u32) -> Self {
13756        push_header(self.as_rec_mut(), 140u16, 4 as u16);
13757        self.as_rec_mut().extend(value.to_ne_bytes());
13758        self
13759    }
13760    pub fn push_health_reporter_auto_dump(mut self, value: u8) -> Self {
13761        push_header(self.as_rec_mut(), 141u16, 1 as u16);
13762        self.as_rec_mut().extend(value.to_ne_bytes());
13763        self
13764    }
13765    pub fn push_trap_policer_id(mut self, value: u32) -> Self {
13766        push_header(self.as_rec_mut(), 142u16, 4 as u16);
13767        self.as_rec_mut().extend(value.to_ne_bytes());
13768        self
13769    }
13770    pub fn push_trap_policer_rate(mut self, value: u64) -> Self {
13771        push_header(self.as_rec_mut(), 143u16, 8 as u16);
13772        self.as_rec_mut().extend(value.to_ne_bytes());
13773        self
13774    }
13775    pub fn push_trap_policer_burst(mut self, value: u64) -> Self {
13776        push_header(self.as_rec_mut(), 144u16, 8 as u16);
13777        self.as_rec_mut().extend(value.to_ne_bytes());
13778        self
13779    }
13780    pub fn nested_port_function(mut self) -> PushDlPortFunction<Self> {
13781        let header_offset = push_nested_header(self.as_rec_mut(), 145u16);
13782        PushDlPortFunction {
13783            prev: Some(self),
13784            header_offset: Some(header_offset),
13785        }
13786    }
13787    pub fn push_info_board_serial_number(mut self, value: &CStr) -> Self {
13788        push_header(
13789            self.as_rec_mut(),
13790            146u16,
13791            value.to_bytes_with_nul().len() as u16,
13792        );
13793        self.as_rec_mut().extend(value.to_bytes_with_nul());
13794        self
13795    }
13796    pub fn push_info_board_serial_number_bytes(mut self, value: &[u8]) -> Self {
13797        push_header(self.as_rec_mut(), 146u16, (value.len() + 1) as u16);
13798        self.as_rec_mut().extend(value);
13799        self.as_rec_mut().push(0);
13800        self
13801    }
13802    pub fn push_port_lanes(mut self, value: u32) -> Self {
13803        push_header(self.as_rec_mut(), 147u16, 4 as u16);
13804        self.as_rec_mut().extend(value.to_ne_bytes());
13805        self
13806    }
13807    pub fn push_port_splittable(mut self, value: u8) -> Self {
13808        push_header(self.as_rec_mut(), 148u16, 1 as u16);
13809        self.as_rec_mut().extend(value.to_ne_bytes());
13810        self
13811    }
13812    pub fn push_port_external(mut self, value: u8) -> Self {
13813        push_header(self.as_rec_mut(), 149u16, 1 as u16);
13814        self.as_rec_mut().extend(value.to_ne_bytes());
13815        self
13816    }
13817    pub fn push_port_controller_number(mut self, value: u32) -> Self {
13818        push_header(self.as_rec_mut(), 150u16, 4 as u16);
13819        self.as_rec_mut().extend(value.to_ne_bytes());
13820        self
13821    }
13822    pub fn push_flash_update_status_timeout(mut self, value: u64) -> Self {
13823        push_header(self.as_rec_mut(), 151u16, 8 as u16);
13824        self.as_rec_mut().extend(value.to_ne_bytes());
13825        self
13826    }
13827    #[doc = "Associated type: [`FlashOverwrite`] (1 bit per enumeration)"]
13828    pub fn push_flash_update_overwrite_mask(mut self, value: BuiltinBitfield32) -> Self {
13829        push_header(self.as_rec_mut(), 152u16, value.as_slice().len() as u16);
13830        self.as_rec_mut().extend(value.as_slice());
13831        self
13832    }
13833    #[doc = "Associated type: [`ReloadAction`] (enum)"]
13834    pub fn push_reload_action(mut self, value: u8) -> Self {
13835        push_header(self.as_rec_mut(), 153u16, 1 as u16);
13836        self.as_rec_mut().extend(value.to_ne_bytes());
13837        self
13838    }
13839    #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
13840    pub fn push_reload_actions_performed(mut self, value: BuiltinBitfield32) -> Self {
13841        push_header(self.as_rec_mut(), 154u16, value.as_slice().len() as u16);
13842        self.as_rec_mut().extend(value.as_slice());
13843        self
13844    }
13845    #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
13846    pub fn push_reload_limits(mut self, value: BuiltinBitfield32) -> Self {
13847        push_header(self.as_rec_mut(), 155u16, value.as_slice().len() as u16);
13848        self.as_rec_mut().extend(value.as_slice());
13849        self
13850    }
13851    pub fn nested_dev_stats(mut self) -> PushDlDevStats<Self> {
13852        let header_offset = push_nested_header(self.as_rec_mut(), 156u16);
13853        PushDlDevStats {
13854            prev: Some(self),
13855            header_offset: Some(header_offset),
13856        }
13857    }
13858    pub fn nested_reload_stats(mut self) -> PushDlReloadStats<Self> {
13859        let header_offset = push_nested_header(self.as_rec_mut(), 157u16);
13860        PushDlReloadStats {
13861            prev: Some(self),
13862            header_offset: Some(header_offset),
13863        }
13864    }
13865    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13866    pub fn nested_reload_stats_entry(mut self) -> PushDlReloadStatsEntry<Self> {
13867        let header_offset = push_nested_header(self.as_rec_mut(), 158u16);
13868        PushDlReloadStatsEntry {
13869            prev: Some(self),
13870            header_offset: Some(header_offset),
13871        }
13872    }
13873    pub fn push_reload_stats_limit(mut self, value: u8) -> Self {
13874        push_header(self.as_rec_mut(), 159u16, 1 as u16);
13875        self.as_rec_mut().extend(value.to_ne_bytes());
13876        self
13877    }
13878    pub fn push_reload_stats_value(mut self, value: u32) -> Self {
13879        push_header(self.as_rec_mut(), 160u16, 4 as u16);
13880        self.as_rec_mut().extend(value.to_ne_bytes());
13881        self
13882    }
13883    pub fn nested_remote_reload_stats(mut self) -> PushDlReloadStats<Self> {
13884        let header_offset = push_nested_header(self.as_rec_mut(), 161u16);
13885        PushDlReloadStats {
13886            prev: Some(self),
13887            header_offset: Some(header_offset),
13888        }
13889    }
13890    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13891    pub fn nested_reload_action_info(mut self) -> PushDlReloadActInfo<Self> {
13892        let header_offset = push_nested_header(self.as_rec_mut(), 162u16);
13893        PushDlReloadActInfo {
13894            prev: Some(self),
13895            header_offset: Some(header_offset),
13896        }
13897    }
13898    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13899    pub fn nested_reload_action_stats(mut self) -> PushDlReloadActStats<Self> {
13900        let header_offset = push_nested_header(self.as_rec_mut(), 163u16);
13901        PushDlReloadActStats {
13902            prev: Some(self),
13903            header_offset: Some(header_offset),
13904        }
13905    }
13906    pub fn push_port_pci_sf_number(mut self, value: u32) -> Self {
13907        push_header(self.as_rec_mut(), 164u16, 4 as u16);
13908        self.as_rec_mut().extend(value.to_ne_bytes());
13909        self
13910    }
13911    #[doc = "Associated type: [`RateType`] (enum)"]
13912    pub fn push_rate_type(mut self, value: u16) -> Self {
13913        push_header(self.as_rec_mut(), 165u16, 2 as u16);
13914        self.as_rec_mut().extend(value.to_ne_bytes());
13915        self
13916    }
13917    pub fn push_rate_tx_share(mut self, value: u64) -> Self {
13918        push_header(self.as_rec_mut(), 166u16, 8 as u16);
13919        self.as_rec_mut().extend(value.to_ne_bytes());
13920        self
13921    }
13922    pub fn push_rate_tx_max(mut self, value: u64) -> Self {
13923        push_header(self.as_rec_mut(), 167u16, 8 as u16);
13924        self.as_rec_mut().extend(value.to_ne_bytes());
13925        self
13926    }
13927    pub fn push_rate_node_name(mut self, value: &CStr) -> Self {
13928        push_header(
13929            self.as_rec_mut(),
13930            168u16,
13931            value.to_bytes_with_nul().len() as u16,
13932        );
13933        self.as_rec_mut().extend(value.to_bytes_with_nul());
13934        self
13935    }
13936    pub fn push_rate_node_name_bytes(mut self, value: &[u8]) -> Self {
13937        push_header(self.as_rec_mut(), 168u16, (value.len() + 1) as u16);
13938        self.as_rec_mut().extend(value);
13939        self.as_rec_mut().push(0);
13940        self
13941    }
13942    pub fn push_rate_parent_node_name(mut self, value: &CStr) -> Self {
13943        push_header(
13944            self.as_rec_mut(),
13945            169u16,
13946            value.to_bytes_with_nul().len() as u16,
13947        );
13948        self.as_rec_mut().extend(value.to_bytes_with_nul());
13949        self
13950    }
13951    pub fn push_rate_parent_node_name_bytes(mut self, value: &[u8]) -> Self {
13952        push_header(self.as_rec_mut(), 169u16, (value.len() + 1) as u16);
13953        self.as_rec_mut().extend(value);
13954        self.as_rec_mut().push(0);
13955        self
13956    }
13957    pub fn push_region_max_snapshots(mut self, value: u32) -> Self {
13958        push_header(self.as_rec_mut(), 170u16, 4 as u16);
13959        self.as_rec_mut().extend(value.to_ne_bytes());
13960        self
13961    }
13962    pub fn push_linecard_index(mut self, value: u32) -> Self {
13963        push_header(self.as_rec_mut(), 171u16, 4 as u16);
13964        self.as_rec_mut().extend(value.to_ne_bytes());
13965        self
13966    }
13967    pub fn push_linecard_state(mut self, value: u8) -> Self {
13968        push_header(self.as_rec_mut(), 172u16, 1 as u16);
13969        self.as_rec_mut().extend(value.to_ne_bytes());
13970        self
13971    }
13972    pub fn push_linecard_type(mut self, value: &CStr) -> Self {
13973        push_header(
13974            self.as_rec_mut(),
13975            173u16,
13976            value.to_bytes_with_nul().len() as u16,
13977        );
13978        self.as_rec_mut().extend(value.to_bytes_with_nul());
13979        self
13980    }
13981    pub fn push_linecard_type_bytes(mut self, value: &[u8]) -> Self {
13982        push_header(self.as_rec_mut(), 173u16, (value.len() + 1) as u16);
13983        self.as_rec_mut().extend(value);
13984        self.as_rec_mut().push(0);
13985        self
13986    }
13987    pub fn nested_linecard_supported_types(mut self) -> PushDlLinecardSupportedTypes<Self> {
13988        let header_offset = push_nested_header(self.as_rec_mut(), 174u16);
13989        PushDlLinecardSupportedTypes {
13990            prev: Some(self),
13991            header_offset: Some(header_offset),
13992        }
13993    }
13994    pub fn nested_selftests(mut self) -> PushDlSelftestId<Self> {
13995        let header_offset = push_nested_header(self.as_rec_mut(), 176u16);
13996        PushDlSelftestId {
13997            prev: Some(self),
13998            header_offset: Some(header_offset),
13999        }
14000    }
14001    pub fn push_rate_tx_priority(mut self, value: u32) -> Self {
14002        push_header(self.as_rec_mut(), 177u16, 4 as u16);
14003        self.as_rec_mut().extend(value.to_ne_bytes());
14004        self
14005    }
14006    pub fn push_rate_tx_weight(mut self, value: u32) -> Self {
14007        push_header(self.as_rec_mut(), 178u16, 4 as u16);
14008        self.as_rec_mut().extend(value.to_ne_bytes());
14009        self
14010    }
14011    pub fn push_region_direct(mut self, value: ()) -> Self {
14012        push_header(self.as_rec_mut(), 179u16, 0 as u16);
14013        self
14014    }
14015    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14016    pub fn nested_rate_tc_bws(mut self) -> PushDlRateTcBws<Self> {
14017        let header_offset = push_nested_header(self.as_rec_mut(), 180u16);
14018        PushDlRateTcBws {
14019            prev: Some(self),
14020            header_offset: Some(header_offset),
14021        }
14022    }
14023    #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
14024    pub fn push_health_reporter_burst_period(mut self, value: u64) -> Self {
14025        push_header(self.as_rec_mut(), 181u16, 8 as u16);
14026        self.as_rec_mut().extend(value.to_ne_bytes());
14027        self
14028    }
14029    #[doc = "Request restoring parameter to its default value\\."]
14030    pub fn push_param_reset_default(mut self, value: ()) -> Self {
14031        push_header(self.as_rec_mut(), 183u16, 0 as u16);
14032        self
14033    }
14034}
14035impl<Prev: Rec> Drop for PushDevlink<Prev> {
14036    fn drop(&mut self) {
14037        if let Some(prev) = &mut self.prev {
14038            if let Some(header_offset) = &self.header_offset {
14039                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14040            }
14041        }
14042    }
14043}
14044pub struct PushDlDevStats<Prev: Rec> {
14045    pub(crate) prev: Option<Prev>,
14046    pub(crate) header_offset: Option<usize>,
14047}
14048impl<Prev: Rec> Rec for PushDlDevStats<Prev> {
14049    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14050        self.prev.as_mut().unwrap().as_rec_mut()
14051    }
14052    fn as_rec(&self) -> &Vec<u8> {
14053        self.prev.as_ref().unwrap().as_rec()
14054    }
14055}
14056impl<Prev: Rec> PushDlDevStats<Prev> {
14057    pub fn new(prev: Prev) -> Self {
14058        Self {
14059            prev: Some(prev),
14060            header_offset: None,
14061        }
14062    }
14063    pub fn end_nested(mut self) -> Prev {
14064        let mut prev = self.prev.take().unwrap();
14065        if let Some(header_offset) = &self.header_offset {
14066            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14067        }
14068        prev
14069    }
14070    pub fn nested_reload_stats(mut self) -> PushDlReloadStats<Self> {
14071        let header_offset = push_nested_header(self.as_rec_mut(), 157u16);
14072        PushDlReloadStats {
14073            prev: Some(self),
14074            header_offset: Some(header_offset),
14075        }
14076    }
14077    pub fn nested_remote_reload_stats(mut self) -> PushDlReloadStats<Self> {
14078        let header_offset = push_nested_header(self.as_rec_mut(), 161u16);
14079        PushDlReloadStats {
14080            prev: Some(self),
14081            header_offset: Some(header_offset),
14082        }
14083    }
14084}
14085impl<Prev: Rec> Drop for PushDlDevStats<Prev> {
14086    fn drop(&mut self) {
14087        if let Some(prev) = &mut self.prev {
14088            if let Some(header_offset) = &self.header_offset {
14089                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14090            }
14091        }
14092    }
14093}
14094pub struct PushDlReloadStats<Prev: Rec> {
14095    pub(crate) prev: Option<Prev>,
14096    pub(crate) header_offset: Option<usize>,
14097}
14098impl<Prev: Rec> Rec for PushDlReloadStats<Prev> {
14099    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14100        self.prev.as_mut().unwrap().as_rec_mut()
14101    }
14102    fn as_rec(&self) -> &Vec<u8> {
14103        self.prev.as_ref().unwrap().as_rec()
14104    }
14105}
14106impl<Prev: Rec> PushDlReloadStats<Prev> {
14107    pub fn new(prev: Prev) -> Self {
14108        Self {
14109            prev: Some(prev),
14110            header_offset: None,
14111        }
14112    }
14113    pub fn end_nested(mut self) -> Prev {
14114        let mut prev = self.prev.take().unwrap();
14115        if let Some(header_offset) = &self.header_offset {
14116            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14117        }
14118        prev
14119    }
14120    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14121    pub fn nested_reload_action_info(mut self) -> PushDlReloadActInfo<Self> {
14122        let header_offset = push_nested_header(self.as_rec_mut(), 162u16);
14123        PushDlReloadActInfo {
14124            prev: Some(self),
14125            header_offset: Some(header_offset),
14126        }
14127    }
14128}
14129impl<Prev: Rec> Drop for PushDlReloadStats<Prev> {
14130    fn drop(&mut self) {
14131        if let Some(prev) = &mut self.prev {
14132            if let Some(header_offset) = &self.header_offset {
14133                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14134            }
14135        }
14136    }
14137}
14138pub struct PushDlReloadActInfo<Prev: Rec> {
14139    pub(crate) prev: Option<Prev>,
14140    pub(crate) header_offset: Option<usize>,
14141}
14142impl<Prev: Rec> Rec for PushDlReloadActInfo<Prev> {
14143    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14144        self.prev.as_mut().unwrap().as_rec_mut()
14145    }
14146    fn as_rec(&self) -> &Vec<u8> {
14147        self.prev.as_ref().unwrap().as_rec()
14148    }
14149}
14150impl<Prev: Rec> PushDlReloadActInfo<Prev> {
14151    pub fn new(prev: Prev) -> Self {
14152        Self {
14153            prev: Some(prev),
14154            header_offset: None,
14155        }
14156    }
14157    pub fn end_nested(mut self) -> Prev {
14158        let mut prev = self.prev.take().unwrap();
14159        if let Some(header_offset) = &self.header_offset {
14160            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14161        }
14162        prev
14163    }
14164    #[doc = "Associated type: [`ReloadAction`] (enum)"]
14165    pub fn push_reload_action(mut self, value: u8) -> Self {
14166        push_header(self.as_rec_mut(), 153u16, 1 as u16);
14167        self.as_rec_mut().extend(value.to_ne_bytes());
14168        self
14169    }
14170    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14171    pub fn nested_reload_action_stats(mut self) -> PushDlReloadActStats<Self> {
14172        let header_offset = push_nested_header(self.as_rec_mut(), 163u16);
14173        PushDlReloadActStats {
14174            prev: Some(self),
14175            header_offset: Some(header_offset),
14176        }
14177    }
14178}
14179impl<Prev: Rec> Drop for PushDlReloadActInfo<Prev> {
14180    fn drop(&mut self) {
14181        if let Some(prev) = &mut self.prev {
14182            if let Some(header_offset) = &self.header_offset {
14183                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14184            }
14185        }
14186    }
14187}
14188pub struct PushDlReloadActStats<Prev: Rec> {
14189    pub(crate) prev: Option<Prev>,
14190    pub(crate) header_offset: Option<usize>,
14191}
14192impl<Prev: Rec> Rec for PushDlReloadActStats<Prev> {
14193    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14194        self.prev.as_mut().unwrap().as_rec_mut()
14195    }
14196    fn as_rec(&self) -> &Vec<u8> {
14197        self.prev.as_ref().unwrap().as_rec()
14198    }
14199}
14200impl<Prev: Rec> PushDlReloadActStats<Prev> {
14201    pub fn new(prev: Prev) -> Self {
14202        Self {
14203            prev: Some(prev),
14204            header_offset: None,
14205        }
14206    }
14207    pub fn end_nested(mut self) -> Prev {
14208        let mut prev = self.prev.take().unwrap();
14209        if let Some(header_offset) = &self.header_offset {
14210            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14211        }
14212        prev
14213    }
14214    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14215    pub fn nested_reload_stats_entry(mut self) -> PushDlReloadStatsEntry<Self> {
14216        let header_offset = push_nested_header(self.as_rec_mut(), 158u16);
14217        PushDlReloadStatsEntry {
14218            prev: Some(self),
14219            header_offset: Some(header_offset),
14220        }
14221    }
14222}
14223impl<Prev: Rec> Drop for PushDlReloadActStats<Prev> {
14224    fn drop(&mut self) {
14225        if let Some(prev) = &mut self.prev {
14226            if let Some(header_offset) = &self.header_offset {
14227                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14228            }
14229        }
14230    }
14231}
14232pub struct PushDlReloadStatsEntry<Prev: Rec> {
14233    pub(crate) prev: Option<Prev>,
14234    pub(crate) header_offset: Option<usize>,
14235}
14236impl<Prev: Rec> Rec for PushDlReloadStatsEntry<Prev> {
14237    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14238        self.prev.as_mut().unwrap().as_rec_mut()
14239    }
14240    fn as_rec(&self) -> &Vec<u8> {
14241        self.prev.as_ref().unwrap().as_rec()
14242    }
14243}
14244impl<Prev: Rec> PushDlReloadStatsEntry<Prev> {
14245    pub fn new(prev: Prev) -> Self {
14246        Self {
14247            prev: Some(prev),
14248            header_offset: None,
14249        }
14250    }
14251    pub fn end_nested(mut self) -> Prev {
14252        let mut prev = self.prev.take().unwrap();
14253        if let Some(header_offset) = &self.header_offset {
14254            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14255        }
14256        prev
14257    }
14258    pub fn push_reload_stats_limit(mut self, value: u8) -> Self {
14259        push_header(self.as_rec_mut(), 159u16, 1 as u16);
14260        self.as_rec_mut().extend(value.to_ne_bytes());
14261        self
14262    }
14263    pub fn push_reload_stats_value(mut self, value: u32) -> Self {
14264        push_header(self.as_rec_mut(), 160u16, 4 as u16);
14265        self.as_rec_mut().extend(value.to_ne_bytes());
14266        self
14267    }
14268}
14269impl<Prev: Rec> Drop for PushDlReloadStatsEntry<Prev> {
14270    fn drop(&mut self) {
14271        if let Some(prev) = &mut self.prev {
14272            if let Some(header_offset) = &self.header_offset {
14273                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14274            }
14275        }
14276    }
14277}
14278pub struct PushDlInfoVersion<Prev: Rec> {
14279    pub(crate) prev: Option<Prev>,
14280    pub(crate) header_offset: Option<usize>,
14281}
14282impl<Prev: Rec> Rec for PushDlInfoVersion<Prev> {
14283    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14284        self.prev.as_mut().unwrap().as_rec_mut()
14285    }
14286    fn as_rec(&self) -> &Vec<u8> {
14287        self.prev.as_ref().unwrap().as_rec()
14288    }
14289}
14290impl<Prev: Rec> PushDlInfoVersion<Prev> {
14291    pub fn new(prev: Prev) -> Self {
14292        Self {
14293            prev: Some(prev),
14294            header_offset: None,
14295        }
14296    }
14297    pub fn end_nested(mut self) -> Prev {
14298        let mut prev = self.prev.take().unwrap();
14299        if let Some(header_offset) = &self.header_offset {
14300            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14301        }
14302        prev
14303    }
14304    pub fn push_info_version_name(mut self, value: &CStr) -> Self {
14305        push_header(
14306            self.as_rec_mut(),
14307            103u16,
14308            value.to_bytes_with_nul().len() as u16,
14309        );
14310        self.as_rec_mut().extend(value.to_bytes_with_nul());
14311        self
14312    }
14313    pub fn push_info_version_name_bytes(mut self, value: &[u8]) -> Self {
14314        push_header(self.as_rec_mut(), 103u16, (value.len() + 1) as u16);
14315        self.as_rec_mut().extend(value);
14316        self.as_rec_mut().push(0);
14317        self
14318    }
14319    pub fn push_info_version_value(mut self, value: &CStr) -> Self {
14320        push_header(
14321            self.as_rec_mut(),
14322            104u16,
14323            value.to_bytes_with_nul().len() as u16,
14324        );
14325        self.as_rec_mut().extend(value.to_bytes_with_nul());
14326        self
14327    }
14328    pub fn push_info_version_value_bytes(mut self, value: &[u8]) -> Self {
14329        push_header(self.as_rec_mut(), 104u16, (value.len() + 1) as u16);
14330        self.as_rec_mut().extend(value);
14331        self.as_rec_mut().push(0);
14332        self
14333    }
14334}
14335impl<Prev: Rec> Drop for PushDlInfoVersion<Prev> {
14336    fn drop(&mut self) {
14337        if let Some(prev) = &mut self.prev {
14338            if let Some(header_offset) = &self.header_offset {
14339                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14340            }
14341        }
14342    }
14343}
14344pub struct PushDlPortFunction<Prev: Rec> {
14345    pub(crate) prev: Option<Prev>,
14346    pub(crate) header_offset: Option<usize>,
14347}
14348impl<Prev: Rec> Rec for PushDlPortFunction<Prev> {
14349    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14350        self.prev.as_mut().unwrap().as_rec_mut()
14351    }
14352    fn as_rec(&self) -> &Vec<u8> {
14353        self.prev.as_ref().unwrap().as_rec()
14354    }
14355}
14356impl<Prev: Rec> PushDlPortFunction<Prev> {
14357    pub fn new(prev: Prev) -> Self {
14358        Self {
14359            prev: Some(prev),
14360            header_offset: None,
14361        }
14362    }
14363    pub fn end_nested(mut self) -> Prev {
14364        let mut prev = self.prev.take().unwrap();
14365        if let Some(header_offset) = &self.header_offset {
14366            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14367        }
14368        prev
14369    }
14370    pub fn push_hw_addr(mut self, value: &[u8]) -> Self {
14371        push_header(self.as_rec_mut(), 1u16, value.len() as u16);
14372        self.as_rec_mut().extend(value);
14373        self
14374    }
14375    #[doc = "Associated type: [`PortFnState`] (enum)"]
14376    pub fn push_state(mut self, value: u8) -> Self {
14377        push_header(self.as_rec_mut(), 2u16, 1 as u16);
14378        self.as_rec_mut().extend(value.to_ne_bytes());
14379        self
14380    }
14381    #[doc = "Associated type: [`PortFnOpstate`] (enum)"]
14382    pub fn push_opstate(mut self, value: u8) -> Self {
14383        push_header(self.as_rec_mut(), 3u16, 1 as u16);
14384        self.as_rec_mut().extend(value.to_ne_bytes());
14385        self
14386    }
14387    #[doc = "Associated type: [`PortFnAttrCap`] (1 bit per enumeration)"]
14388    pub fn push_caps(mut self, value: BuiltinBitfield32) -> Self {
14389        push_header(self.as_rec_mut(), 4u16, value.as_slice().len() as u16);
14390        self.as_rec_mut().extend(value.as_slice());
14391        self
14392    }
14393}
14394impl<Prev: Rec> Drop for PushDlPortFunction<Prev> {
14395    fn drop(&mut self) {
14396        if let Some(prev) = &mut self.prev {
14397            if let Some(header_offset) = &self.header_offset {
14398                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14399            }
14400        }
14401    }
14402}
14403pub struct PushDlDpipeTables<Prev: Rec> {
14404    pub(crate) prev: Option<Prev>,
14405    pub(crate) header_offset: Option<usize>,
14406}
14407impl<Prev: Rec> Rec for PushDlDpipeTables<Prev> {
14408    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14409        self.prev.as_mut().unwrap().as_rec_mut()
14410    }
14411    fn as_rec(&self) -> &Vec<u8> {
14412        self.prev.as_ref().unwrap().as_rec()
14413    }
14414}
14415impl<Prev: Rec> PushDlDpipeTables<Prev> {
14416    pub fn new(prev: Prev) -> Self {
14417        Self {
14418            prev: Some(prev),
14419            header_offset: None,
14420        }
14421    }
14422    pub fn end_nested(mut self) -> Prev {
14423        let mut prev = self.prev.take().unwrap();
14424        if let Some(header_offset) = &self.header_offset {
14425            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14426        }
14427        prev
14428    }
14429    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14430    pub fn nested_dpipe_table(mut self) -> PushDlDpipeTable<Self> {
14431        let header_offset = push_nested_header(self.as_rec_mut(), 28u16);
14432        PushDlDpipeTable {
14433            prev: Some(self),
14434            header_offset: Some(header_offset),
14435        }
14436    }
14437}
14438impl<Prev: Rec> Drop for PushDlDpipeTables<Prev> {
14439    fn drop(&mut self) {
14440        if let Some(prev) = &mut self.prev {
14441            if let Some(header_offset) = &self.header_offset {
14442                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14443            }
14444        }
14445    }
14446}
14447pub struct PushDlDpipeTable<Prev: Rec> {
14448    pub(crate) prev: Option<Prev>,
14449    pub(crate) header_offset: Option<usize>,
14450}
14451impl<Prev: Rec> Rec for PushDlDpipeTable<Prev> {
14452    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14453        self.prev.as_mut().unwrap().as_rec_mut()
14454    }
14455    fn as_rec(&self) -> &Vec<u8> {
14456        self.prev.as_ref().unwrap().as_rec()
14457    }
14458}
14459impl<Prev: Rec> PushDlDpipeTable<Prev> {
14460    pub fn new(prev: Prev) -> Self {
14461        Self {
14462            prev: Some(prev),
14463            header_offset: None,
14464        }
14465    }
14466    pub fn end_nested(mut self) -> Prev {
14467        let mut prev = self.prev.take().unwrap();
14468        if let Some(header_offset) = &self.header_offset {
14469            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14470        }
14471        prev
14472    }
14473    pub fn push_dpipe_table_name(mut self, value: &CStr) -> Self {
14474        push_header(
14475            self.as_rec_mut(),
14476            29u16,
14477            value.to_bytes_with_nul().len() as u16,
14478        );
14479        self.as_rec_mut().extend(value.to_bytes_with_nul());
14480        self
14481    }
14482    pub fn push_dpipe_table_name_bytes(mut self, value: &[u8]) -> Self {
14483        push_header(self.as_rec_mut(), 29u16, (value.len() + 1) as u16);
14484        self.as_rec_mut().extend(value);
14485        self.as_rec_mut().push(0);
14486        self
14487    }
14488    pub fn push_dpipe_table_size(mut self, value: u64) -> Self {
14489        push_header(self.as_rec_mut(), 30u16, 8 as u16);
14490        self.as_rec_mut().extend(value.to_ne_bytes());
14491        self
14492    }
14493    pub fn nested_dpipe_table_matches(mut self) -> PushDlDpipeTableMatches<Self> {
14494        let header_offset = push_nested_header(self.as_rec_mut(), 31u16);
14495        PushDlDpipeTableMatches {
14496            prev: Some(self),
14497            header_offset: Some(header_offset),
14498        }
14499    }
14500    pub fn nested_dpipe_table_actions(mut self) -> PushDlDpipeTableActions<Self> {
14501        let header_offset = push_nested_header(self.as_rec_mut(), 32u16);
14502        PushDlDpipeTableActions {
14503            prev: Some(self),
14504            header_offset: Some(header_offset),
14505        }
14506    }
14507    pub fn push_dpipe_table_counters_enabled(mut self, value: u8) -> Self {
14508        push_header(self.as_rec_mut(), 33u16, 1 as u16);
14509        self.as_rec_mut().extend(value.to_ne_bytes());
14510        self
14511    }
14512    pub fn push_dpipe_table_resource_id(mut self, value: u64) -> Self {
14513        push_header(self.as_rec_mut(), 75u16, 8 as u16);
14514        self.as_rec_mut().extend(value.to_ne_bytes());
14515        self
14516    }
14517    pub fn push_dpipe_table_resource_units(mut self, value: u64) -> Self {
14518        push_header(self.as_rec_mut(), 76u16, 8 as u16);
14519        self.as_rec_mut().extend(value.to_ne_bytes());
14520        self
14521    }
14522}
14523impl<Prev: Rec> Drop for PushDlDpipeTable<Prev> {
14524    fn drop(&mut self) {
14525        if let Some(prev) = &mut self.prev {
14526            if let Some(header_offset) = &self.header_offset {
14527                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14528            }
14529        }
14530    }
14531}
14532pub struct PushDlDpipeTableMatches<Prev: Rec> {
14533    pub(crate) prev: Option<Prev>,
14534    pub(crate) header_offset: Option<usize>,
14535}
14536impl<Prev: Rec> Rec for PushDlDpipeTableMatches<Prev> {
14537    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14538        self.prev.as_mut().unwrap().as_rec_mut()
14539    }
14540    fn as_rec(&self) -> &Vec<u8> {
14541        self.prev.as_ref().unwrap().as_rec()
14542    }
14543}
14544impl<Prev: Rec> PushDlDpipeTableMatches<Prev> {
14545    pub fn new(prev: Prev) -> Self {
14546        Self {
14547            prev: Some(prev),
14548            header_offset: None,
14549        }
14550    }
14551    pub fn end_nested(mut self) -> Prev {
14552        let mut prev = self.prev.take().unwrap();
14553        if let Some(header_offset) = &self.header_offset {
14554            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14555        }
14556        prev
14557    }
14558    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14559    pub fn nested_dpipe_match(mut self) -> PushDlDpipeMatch<Self> {
14560        let header_offset = push_nested_header(self.as_rec_mut(), 40u16);
14561        PushDlDpipeMatch {
14562            prev: Some(self),
14563            header_offset: Some(header_offset),
14564        }
14565    }
14566}
14567impl<Prev: Rec> Drop for PushDlDpipeTableMatches<Prev> {
14568    fn drop(&mut self) {
14569        if let Some(prev) = &mut self.prev {
14570            if let Some(header_offset) = &self.header_offset {
14571                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14572            }
14573        }
14574    }
14575}
14576pub struct PushDlDpipeTableActions<Prev: Rec> {
14577    pub(crate) prev: Option<Prev>,
14578    pub(crate) header_offset: Option<usize>,
14579}
14580impl<Prev: Rec> Rec for PushDlDpipeTableActions<Prev> {
14581    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14582        self.prev.as_mut().unwrap().as_rec_mut()
14583    }
14584    fn as_rec(&self) -> &Vec<u8> {
14585        self.prev.as_ref().unwrap().as_rec()
14586    }
14587}
14588impl<Prev: Rec> PushDlDpipeTableActions<Prev> {
14589    pub fn new(prev: Prev) -> Self {
14590        Self {
14591            prev: Some(prev),
14592            header_offset: None,
14593        }
14594    }
14595    pub fn end_nested(mut self) -> Prev {
14596        let mut prev = self.prev.take().unwrap();
14597        if let Some(header_offset) = &self.header_offset {
14598            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14599        }
14600        prev
14601    }
14602    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14603    pub fn nested_dpipe_action(mut self) -> PushDlDpipeAction<Self> {
14604        let header_offset = push_nested_header(self.as_rec_mut(), 43u16);
14605        PushDlDpipeAction {
14606            prev: Some(self),
14607            header_offset: Some(header_offset),
14608        }
14609    }
14610}
14611impl<Prev: Rec> Drop for PushDlDpipeTableActions<Prev> {
14612    fn drop(&mut self) {
14613        if let Some(prev) = &mut self.prev {
14614            if let Some(header_offset) = &self.header_offset {
14615                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14616            }
14617        }
14618    }
14619}
14620pub struct PushDlDpipeEntries<Prev: Rec> {
14621    pub(crate) prev: Option<Prev>,
14622    pub(crate) header_offset: Option<usize>,
14623}
14624impl<Prev: Rec> Rec for PushDlDpipeEntries<Prev> {
14625    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14626        self.prev.as_mut().unwrap().as_rec_mut()
14627    }
14628    fn as_rec(&self) -> &Vec<u8> {
14629        self.prev.as_ref().unwrap().as_rec()
14630    }
14631}
14632impl<Prev: Rec> PushDlDpipeEntries<Prev> {
14633    pub fn new(prev: Prev) -> Self {
14634        Self {
14635            prev: Some(prev),
14636            header_offset: None,
14637        }
14638    }
14639    pub fn end_nested(mut self) -> Prev {
14640        let mut prev = self.prev.take().unwrap();
14641        if let Some(header_offset) = &self.header_offset {
14642            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14643        }
14644        prev
14645    }
14646    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14647    pub fn nested_dpipe_entry(mut self) -> PushDlDpipeEntry<Self> {
14648        let header_offset = push_nested_header(self.as_rec_mut(), 35u16);
14649        PushDlDpipeEntry {
14650            prev: Some(self),
14651            header_offset: Some(header_offset),
14652        }
14653    }
14654}
14655impl<Prev: Rec> Drop for PushDlDpipeEntries<Prev> {
14656    fn drop(&mut self) {
14657        if let Some(prev) = &mut self.prev {
14658            if let Some(header_offset) = &self.header_offset {
14659                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14660            }
14661        }
14662    }
14663}
14664pub struct PushDlDpipeEntry<Prev: Rec> {
14665    pub(crate) prev: Option<Prev>,
14666    pub(crate) header_offset: Option<usize>,
14667}
14668impl<Prev: Rec> Rec for PushDlDpipeEntry<Prev> {
14669    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14670        self.prev.as_mut().unwrap().as_rec_mut()
14671    }
14672    fn as_rec(&self) -> &Vec<u8> {
14673        self.prev.as_ref().unwrap().as_rec()
14674    }
14675}
14676impl<Prev: Rec> PushDlDpipeEntry<Prev> {
14677    pub fn new(prev: Prev) -> Self {
14678        Self {
14679            prev: Some(prev),
14680            header_offset: None,
14681        }
14682    }
14683    pub fn end_nested(mut self) -> Prev {
14684        let mut prev = self.prev.take().unwrap();
14685        if let Some(header_offset) = &self.header_offset {
14686            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14687        }
14688        prev
14689    }
14690    pub fn push_dpipe_entry_index(mut self, value: u64) -> Self {
14691        push_header(self.as_rec_mut(), 36u16, 8 as u16);
14692        self.as_rec_mut().extend(value.to_ne_bytes());
14693        self
14694    }
14695    pub fn nested_dpipe_entry_match_values(mut self) -> PushDlDpipeEntryMatchValues<Self> {
14696        let header_offset = push_nested_header(self.as_rec_mut(), 37u16);
14697        PushDlDpipeEntryMatchValues {
14698            prev: Some(self),
14699            header_offset: Some(header_offset),
14700        }
14701    }
14702    pub fn nested_dpipe_entry_action_values(mut self) -> PushDlDpipeEntryActionValues<Self> {
14703        let header_offset = push_nested_header(self.as_rec_mut(), 38u16);
14704        PushDlDpipeEntryActionValues {
14705            prev: Some(self),
14706            header_offset: Some(header_offset),
14707        }
14708    }
14709    pub fn push_dpipe_entry_counter(mut self, value: u64) -> Self {
14710        push_header(self.as_rec_mut(), 39u16, 8 as u16);
14711        self.as_rec_mut().extend(value.to_ne_bytes());
14712        self
14713    }
14714}
14715impl<Prev: Rec> Drop for PushDlDpipeEntry<Prev> {
14716    fn drop(&mut self) {
14717        if let Some(prev) = &mut self.prev {
14718            if let Some(header_offset) = &self.header_offset {
14719                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14720            }
14721        }
14722    }
14723}
14724pub struct PushDlDpipeEntryMatchValues<Prev: Rec> {
14725    pub(crate) prev: Option<Prev>,
14726    pub(crate) header_offset: Option<usize>,
14727}
14728impl<Prev: Rec> Rec for PushDlDpipeEntryMatchValues<Prev> {
14729    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14730        self.prev.as_mut().unwrap().as_rec_mut()
14731    }
14732    fn as_rec(&self) -> &Vec<u8> {
14733        self.prev.as_ref().unwrap().as_rec()
14734    }
14735}
14736impl<Prev: Rec> PushDlDpipeEntryMatchValues<Prev> {
14737    pub fn new(prev: Prev) -> Self {
14738        Self {
14739            prev: Some(prev),
14740            header_offset: None,
14741        }
14742    }
14743    pub fn end_nested(mut self) -> Prev {
14744        let mut prev = self.prev.take().unwrap();
14745        if let Some(header_offset) = &self.header_offset {
14746            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14747        }
14748        prev
14749    }
14750    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14751    pub fn nested_dpipe_match_value(mut self) -> PushDlDpipeMatchValue<Self> {
14752        let header_offset = push_nested_header(self.as_rec_mut(), 41u16);
14753        PushDlDpipeMatchValue {
14754            prev: Some(self),
14755            header_offset: Some(header_offset),
14756        }
14757    }
14758}
14759impl<Prev: Rec> Drop for PushDlDpipeEntryMatchValues<Prev> {
14760    fn drop(&mut self) {
14761        if let Some(prev) = &mut self.prev {
14762            if let Some(header_offset) = &self.header_offset {
14763                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14764            }
14765        }
14766    }
14767}
14768pub struct PushDlDpipeEntryActionValues<Prev: Rec> {
14769    pub(crate) prev: Option<Prev>,
14770    pub(crate) header_offset: Option<usize>,
14771}
14772impl<Prev: Rec> Rec for PushDlDpipeEntryActionValues<Prev> {
14773    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14774        self.prev.as_mut().unwrap().as_rec_mut()
14775    }
14776    fn as_rec(&self) -> &Vec<u8> {
14777        self.prev.as_ref().unwrap().as_rec()
14778    }
14779}
14780impl<Prev: Rec> PushDlDpipeEntryActionValues<Prev> {
14781    pub fn new(prev: Prev) -> Self {
14782        Self {
14783            prev: Some(prev),
14784            header_offset: None,
14785        }
14786    }
14787    pub fn end_nested(mut self) -> Prev {
14788        let mut prev = self.prev.take().unwrap();
14789        if let Some(header_offset) = &self.header_offset {
14790            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14791        }
14792        prev
14793    }
14794    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14795    pub fn nested_dpipe_action_value(mut self) -> PushDlDpipeActionValue<Self> {
14796        let header_offset = push_nested_header(self.as_rec_mut(), 44u16);
14797        PushDlDpipeActionValue {
14798            prev: Some(self),
14799            header_offset: Some(header_offset),
14800        }
14801    }
14802}
14803impl<Prev: Rec> Drop for PushDlDpipeEntryActionValues<Prev> {
14804    fn drop(&mut self) {
14805        if let Some(prev) = &mut self.prev {
14806            if let Some(header_offset) = &self.header_offset {
14807                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14808            }
14809        }
14810    }
14811}
14812pub struct PushDlDpipeMatch<Prev: Rec> {
14813    pub(crate) prev: Option<Prev>,
14814    pub(crate) header_offset: Option<usize>,
14815}
14816impl<Prev: Rec> Rec for PushDlDpipeMatch<Prev> {
14817    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14818        self.prev.as_mut().unwrap().as_rec_mut()
14819    }
14820    fn as_rec(&self) -> &Vec<u8> {
14821        self.prev.as_ref().unwrap().as_rec()
14822    }
14823}
14824impl<Prev: Rec> PushDlDpipeMatch<Prev> {
14825    pub fn new(prev: Prev) -> Self {
14826        Self {
14827            prev: Some(prev),
14828            header_offset: None,
14829        }
14830    }
14831    pub fn end_nested(mut self) -> Prev {
14832        let mut prev = self.prev.take().unwrap();
14833        if let Some(header_offset) = &self.header_offset {
14834            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14835        }
14836        prev
14837    }
14838    #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
14839    pub fn push_dpipe_match_type(mut self, value: u32) -> Self {
14840        push_header(self.as_rec_mut(), 42u16, 4 as u16);
14841        self.as_rec_mut().extend(value.to_ne_bytes());
14842        self
14843    }
14844    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
14845    pub fn push_dpipe_header_id(mut self, value: u32) -> Self {
14846        push_header(self.as_rec_mut(), 52u16, 4 as u16);
14847        self.as_rec_mut().extend(value.to_ne_bytes());
14848        self
14849    }
14850    pub fn push_dpipe_header_global(mut self, value: u8) -> Self {
14851        push_header(self.as_rec_mut(), 54u16, 1 as u16);
14852        self.as_rec_mut().extend(value.to_ne_bytes());
14853        self
14854    }
14855    pub fn push_dpipe_header_index(mut self, value: u32) -> Self {
14856        push_header(self.as_rec_mut(), 55u16, 4 as u16);
14857        self.as_rec_mut().extend(value.to_ne_bytes());
14858        self
14859    }
14860    pub fn push_dpipe_field_id(mut self, value: u32) -> Self {
14861        push_header(self.as_rec_mut(), 58u16, 4 as u16);
14862        self.as_rec_mut().extend(value.to_ne_bytes());
14863        self
14864    }
14865}
14866impl<Prev: Rec> Drop for PushDlDpipeMatch<Prev> {
14867    fn drop(&mut self) {
14868        if let Some(prev) = &mut self.prev {
14869            if let Some(header_offset) = &self.header_offset {
14870                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14871            }
14872        }
14873    }
14874}
14875pub struct PushDlDpipeMatchValue<Prev: Rec> {
14876    pub(crate) prev: Option<Prev>,
14877    pub(crate) header_offset: Option<usize>,
14878}
14879impl<Prev: Rec> Rec for PushDlDpipeMatchValue<Prev> {
14880    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14881        self.prev.as_mut().unwrap().as_rec_mut()
14882    }
14883    fn as_rec(&self) -> &Vec<u8> {
14884        self.prev.as_ref().unwrap().as_rec()
14885    }
14886}
14887impl<Prev: Rec> PushDlDpipeMatchValue<Prev> {
14888    pub fn new(prev: Prev) -> Self {
14889        Self {
14890            prev: Some(prev),
14891            header_offset: None,
14892        }
14893    }
14894    pub fn end_nested(mut self) -> Prev {
14895        let mut prev = self.prev.take().unwrap();
14896        if let Some(header_offset) = &self.header_offset {
14897            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14898        }
14899        prev
14900    }
14901    #[doc = "Attribute may repeat multiple times (treat it as array)"]
14902    pub fn nested_dpipe_match(mut self) -> PushDlDpipeMatch<Self> {
14903        let header_offset = push_nested_header(self.as_rec_mut(), 40u16);
14904        PushDlDpipeMatch {
14905            prev: Some(self),
14906            header_offset: Some(header_offset),
14907        }
14908    }
14909    pub fn push_dpipe_value(mut self, value: &[u8]) -> Self {
14910        push_header(self.as_rec_mut(), 46u16, value.len() as u16);
14911        self.as_rec_mut().extend(value);
14912        self
14913    }
14914    pub fn push_dpipe_value_mask(mut self, value: &[u8]) -> Self {
14915        push_header(self.as_rec_mut(), 47u16, value.len() as u16);
14916        self.as_rec_mut().extend(value);
14917        self
14918    }
14919    pub fn push_dpipe_value_mapping(mut self, value: u32) -> Self {
14920        push_header(self.as_rec_mut(), 48u16, 4 as u16);
14921        self.as_rec_mut().extend(value.to_ne_bytes());
14922        self
14923    }
14924}
14925impl<Prev: Rec> Drop for PushDlDpipeMatchValue<Prev> {
14926    fn drop(&mut self) {
14927        if let Some(prev) = &mut self.prev {
14928            if let Some(header_offset) = &self.header_offset {
14929                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14930            }
14931        }
14932    }
14933}
14934pub struct PushDlDpipeAction<Prev: Rec> {
14935    pub(crate) prev: Option<Prev>,
14936    pub(crate) header_offset: Option<usize>,
14937}
14938impl<Prev: Rec> Rec for PushDlDpipeAction<Prev> {
14939    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14940        self.prev.as_mut().unwrap().as_rec_mut()
14941    }
14942    fn as_rec(&self) -> &Vec<u8> {
14943        self.prev.as_ref().unwrap().as_rec()
14944    }
14945}
14946impl<Prev: Rec> PushDlDpipeAction<Prev> {
14947    pub fn new(prev: Prev) -> Self {
14948        Self {
14949            prev: Some(prev),
14950            header_offset: None,
14951        }
14952    }
14953    pub fn end_nested(mut self) -> Prev {
14954        let mut prev = self.prev.take().unwrap();
14955        if let Some(header_offset) = &self.header_offset {
14956            finalize_nested_header(prev.as_rec_mut(), *header_offset);
14957        }
14958        prev
14959    }
14960    #[doc = "Associated type: [`DpipeActionType`] (enum)"]
14961    pub fn push_dpipe_action_type(mut self, value: u32) -> Self {
14962        push_header(self.as_rec_mut(), 45u16, 4 as u16);
14963        self.as_rec_mut().extend(value.to_ne_bytes());
14964        self
14965    }
14966    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
14967    pub fn push_dpipe_header_id(mut self, value: u32) -> Self {
14968        push_header(self.as_rec_mut(), 52u16, 4 as u16);
14969        self.as_rec_mut().extend(value.to_ne_bytes());
14970        self
14971    }
14972    pub fn push_dpipe_header_global(mut self, value: u8) -> Self {
14973        push_header(self.as_rec_mut(), 54u16, 1 as u16);
14974        self.as_rec_mut().extend(value.to_ne_bytes());
14975        self
14976    }
14977    pub fn push_dpipe_header_index(mut self, value: u32) -> Self {
14978        push_header(self.as_rec_mut(), 55u16, 4 as u16);
14979        self.as_rec_mut().extend(value.to_ne_bytes());
14980        self
14981    }
14982    pub fn push_dpipe_field_id(mut self, value: u32) -> Self {
14983        push_header(self.as_rec_mut(), 58u16, 4 as u16);
14984        self.as_rec_mut().extend(value.to_ne_bytes());
14985        self
14986    }
14987}
14988impl<Prev: Rec> Drop for PushDlDpipeAction<Prev> {
14989    fn drop(&mut self) {
14990        if let Some(prev) = &mut self.prev {
14991            if let Some(header_offset) = &self.header_offset {
14992                finalize_nested_header(prev.as_rec_mut(), *header_offset);
14993            }
14994        }
14995    }
14996}
14997pub struct PushDlDpipeActionValue<Prev: Rec> {
14998    pub(crate) prev: Option<Prev>,
14999    pub(crate) header_offset: Option<usize>,
15000}
15001impl<Prev: Rec> Rec for PushDlDpipeActionValue<Prev> {
15002    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15003        self.prev.as_mut().unwrap().as_rec_mut()
15004    }
15005    fn as_rec(&self) -> &Vec<u8> {
15006        self.prev.as_ref().unwrap().as_rec()
15007    }
15008}
15009impl<Prev: Rec> PushDlDpipeActionValue<Prev> {
15010    pub fn new(prev: Prev) -> Self {
15011        Self {
15012            prev: Some(prev),
15013            header_offset: None,
15014        }
15015    }
15016    pub fn end_nested(mut self) -> Prev {
15017        let mut prev = self.prev.take().unwrap();
15018        if let Some(header_offset) = &self.header_offset {
15019            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15020        }
15021        prev
15022    }
15023    #[doc = "Attribute may repeat multiple times (treat it as array)"]
15024    pub fn nested_dpipe_action(mut self) -> PushDlDpipeAction<Self> {
15025        let header_offset = push_nested_header(self.as_rec_mut(), 43u16);
15026        PushDlDpipeAction {
15027            prev: Some(self),
15028            header_offset: Some(header_offset),
15029        }
15030    }
15031    pub fn push_dpipe_value(mut self, value: &[u8]) -> Self {
15032        push_header(self.as_rec_mut(), 46u16, value.len() as u16);
15033        self.as_rec_mut().extend(value);
15034        self
15035    }
15036    pub fn push_dpipe_value_mask(mut self, value: &[u8]) -> Self {
15037        push_header(self.as_rec_mut(), 47u16, value.len() as u16);
15038        self.as_rec_mut().extend(value);
15039        self
15040    }
15041    pub fn push_dpipe_value_mapping(mut self, value: u32) -> Self {
15042        push_header(self.as_rec_mut(), 48u16, 4 as u16);
15043        self.as_rec_mut().extend(value.to_ne_bytes());
15044        self
15045    }
15046}
15047impl<Prev: Rec> Drop for PushDlDpipeActionValue<Prev> {
15048    fn drop(&mut self) {
15049        if let Some(prev) = &mut self.prev {
15050            if let Some(header_offset) = &self.header_offset {
15051                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15052            }
15053        }
15054    }
15055}
15056pub struct PushDlDpipeHeaders<Prev: Rec> {
15057    pub(crate) prev: Option<Prev>,
15058    pub(crate) header_offset: Option<usize>,
15059}
15060impl<Prev: Rec> Rec for PushDlDpipeHeaders<Prev> {
15061    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15062        self.prev.as_mut().unwrap().as_rec_mut()
15063    }
15064    fn as_rec(&self) -> &Vec<u8> {
15065        self.prev.as_ref().unwrap().as_rec()
15066    }
15067}
15068impl<Prev: Rec> PushDlDpipeHeaders<Prev> {
15069    pub fn new(prev: Prev) -> Self {
15070        Self {
15071            prev: Some(prev),
15072            header_offset: None,
15073        }
15074    }
15075    pub fn end_nested(mut self) -> Prev {
15076        let mut prev = self.prev.take().unwrap();
15077        if let Some(header_offset) = &self.header_offset {
15078            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15079        }
15080        prev
15081    }
15082    #[doc = "Attribute may repeat multiple times (treat it as array)"]
15083    pub fn nested_dpipe_header(mut self) -> PushDlDpipeHeader<Self> {
15084        let header_offset = push_nested_header(self.as_rec_mut(), 50u16);
15085        PushDlDpipeHeader {
15086            prev: Some(self),
15087            header_offset: Some(header_offset),
15088        }
15089    }
15090}
15091impl<Prev: Rec> Drop for PushDlDpipeHeaders<Prev> {
15092    fn drop(&mut self) {
15093        if let Some(prev) = &mut self.prev {
15094            if let Some(header_offset) = &self.header_offset {
15095                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15096            }
15097        }
15098    }
15099}
15100pub struct PushDlDpipeHeader<Prev: Rec> {
15101    pub(crate) prev: Option<Prev>,
15102    pub(crate) header_offset: Option<usize>,
15103}
15104impl<Prev: Rec> Rec for PushDlDpipeHeader<Prev> {
15105    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15106        self.prev.as_mut().unwrap().as_rec_mut()
15107    }
15108    fn as_rec(&self) -> &Vec<u8> {
15109        self.prev.as_ref().unwrap().as_rec()
15110    }
15111}
15112impl<Prev: Rec> PushDlDpipeHeader<Prev> {
15113    pub fn new(prev: Prev) -> Self {
15114        Self {
15115            prev: Some(prev),
15116            header_offset: None,
15117        }
15118    }
15119    pub fn end_nested(mut self) -> Prev {
15120        let mut prev = self.prev.take().unwrap();
15121        if let Some(header_offset) = &self.header_offset {
15122            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15123        }
15124        prev
15125    }
15126    pub fn push_dpipe_header_name(mut self, value: &CStr) -> Self {
15127        push_header(
15128            self.as_rec_mut(),
15129            51u16,
15130            value.to_bytes_with_nul().len() as u16,
15131        );
15132        self.as_rec_mut().extend(value.to_bytes_with_nul());
15133        self
15134    }
15135    pub fn push_dpipe_header_name_bytes(mut self, value: &[u8]) -> Self {
15136        push_header(self.as_rec_mut(), 51u16, (value.len() + 1) as u16);
15137        self.as_rec_mut().extend(value);
15138        self.as_rec_mut().push(0);
15139        self
15140    }
15141    #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
15142    pub fn push_dpipe_header_id(mut self, value: u32) -> Self {
15143        push_header(self.as_rec_mut(), 52u16, 4 as u16);
15144        self.as_rec_mut().extend(value.to_ne_bytes());
15145        self
15146    }
15147    pub fn nested_dpipe_header_fields(mut self) -> PushDlDpipeHeaderFields<Self> {
15148        let header_offset = push_nested_header(self.as_rec_mut(), 53u16);
15149        PushDlDpipeHeaderFields {
15150            prev: Some(self),
15151            header_offset: Some(header_offset),
15152        }
15153    }
15154    pub fn push_dpipe_header_global(mut self, value: u8) -> Self {
15155        push_header(self.as_rec_mut(), 54u16, 1 as u16);
15156        self.as_rec_mut().extend(value.to_ne_bytes());
15157        self
15158    }
15159}
15160impl<Prev: Rec> Drop for PushDlDpipeHeader<Prev> {
15161    fn drop(&mut self) {
15162        if let Some(prev) = &mut self.prev {
15163            if let Some(header_offset) = &self.header_offset {
15164                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15165            }
15166        }
15167    }
15168}
15169pub struct PushDlDpipeHeaderFields<Prev: Rec> {
15170    pub(crate) prev: Option<Prev>,
15171    pub(crate) header_offset: Option<usize>,
15172}
15173impl<Prev: Rec> Rec for PushDlDpipeHeaderFields<Prev> {
15174    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15175        self.prev.as_mut().unwrap().as_rec_mut()
15176    }
15177    fn as_rec(&self) -> &Vec<u8> {
15178        self.prev.as_ref().unwrap().as_rec()
15179    }
15180}
15181impl<Prev: Rec> PushDlDpipeHeaderFields<Prev> {
15182    pub fn new(prev: Prev) -> Self {
15183        Self {
15184            prev: Some(prev),
15185            header_offset: None,
15186        }
15187    }
15188    pub fn end_nested(mut self) -> Prev {
15189        let mut prev = self.prev.take().unwrap();
15190        if let Some(header_offset) = &self.header_offset {
15191            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15192        }
15193        prev
15194    }
15195    #[doc = "Attribute may repeat multiple times (treat it as array)"]
15196    pub fn nested_dpipe_field(mut self) -> PushDlDpipeField<Self> {
15197        let header_offset = push_nested_header(self.as_rec_mut(), 56u16);
15198        PushDlDpipeField {
15199            prev: Some(self),
15200            header_offset: Some(header_offset),
15201        }
15202    }
15203}
15204impl<Prev: Rec> Drop for PushDlDpipeHeaderFields<Prev> {
15205    fn drop(&mut self) {
15206        if let Some(prev) = &mut self.prev {
15207            if let Some(header_offset) = &self.header_offset {
15208                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15209            }
15210        }
15211    }
15212}
15213pub struct PushDlDpipeField<Prev: Rec> {
15214    pub(crate) prev: Option<Prev>,
15215    pub(crate) header_offset: Option<usize>,
15216}
15217impl<Prev: Rec> Rec for PushDlDpipeField<Prev> {
15218    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15219        self.prev.as_mut().unwrap().as_rec_mut()
15220    }
15221    fn as_rec(&self) -> &Vec<u8> {
15222        self.prev.as_ref().unwrap().as_rec()
15223    }
15224}
15225impl<Prev: Rec> PushDlDpipeField<Prev> {
15226    pub fn new(prev: Prev) -> Self {
15227        Self {
15228            prev: Some(prev),
15229            header_offset: None,
15230        }
15231    }
15232    pub fn end_nested(mut self) -> Prev {
15233        let mut prev = self.prev.take().unwrap();
15234        if let Some(header_offset) = &self.header_offset {
15235            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15236        }
15237        prev
15238    }
15239    pub fn push_dpipe_field_name(mut self, value: &CStr) -> Self {
15240        push_header(
15241            self.as_rec_mut(),
15242            57u16,
15243            value.to_bytes_with_nul().len() as u16,
15244        );
15245        self.as_rec_mut().extend(value.to_bytes_with_nul());
15246        self
15247    }
15248    pub fn push_dpipe_field_name_bytes(mut self, value: &[u8]) -> Self {
15249        push_header(self.as_rec_mut(), 57u16, (value.len() + 1) as u16);
15250        self.as_rec_mut().extend(value);
15251        self.as_rec_mut().push(0);
15252        self
15253    }
15254    pub fn push_dpipe_field_id(mut self, value: u32) -> Self {
15255        push_header(self.as_rec_mut(), 58u16, 4 as u16);
15256        self.as_rec_mut().extend(value.to_ne_bytes());
15257        self
15258    }
15259    pub fn push_dpipe_field_bitwidth(mut self, value: u32) -> Self {
15260        push_header(self.as_rec_mut(), 59u16, 4 as u16);
15261        self.as_rec_mut().extend(value.to_ne_bytes());
15262        self
15263    }
15264    #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
15265    pub fn push_dpipe_field_mapping_type(mut self, value: u32) -> Self {
15266        push_header(self.as_rec_mut(), 60u16, 4 as u16);
15267        self.as_rec_mut().extend(value.to_ne_bytes());
15268        self
15269    }
15270}
15271impl<Prev: Rec> Drop for PushDlDpipeField<Prev> {
15272    fn drop(&mut self) {
15273        if let Some(prev) = &mut self.prev {
15274            if let Some(header_offset) = &self.header_offset {
15275                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15276            }
15277        }
15278    }
15279}
15280pub struct PushDlResource<Prev: Rec> {
15281    pub(crate) prev: Option<Prev>,
15282    pub(crate) header_offset: Option<usize>,
15283}
15284impl<Prev: Rec> Rec for PushDlResource<Prev> {
15285    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15286        self.prev.as_mut().unwrap().as_rec_mut()
15287    }
15288    fn as_rec(&self) -> &Vec<u8> {
15289        self.prev.as_ref().unwrap().as_rec()
15290    }
15291}
15292impl<Prev: Rec> PushDlResource<Prev> {
15293    pub fn new(prev: Prev) -> Self {
15294        Self {
15295            prev: Some(prev),
15296            header_offset: None,
15297        }
15298    }
15299    pub fn end_nested(mut self) -> Prev {
15300        let mut prev = self.prev.take().unwrap();
15301        if let Some(header_offset) = &self.header_offset {
15302            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15303        }
15304        prev
15305    }
15306    pub fn push_resource_name(mut self, value: &CStr) -> Self {
15307        push_header(
15308            self.as_rec_mut(),
15309            65u16,
15310            value.to_bytes_with_nul().len() as u16,
15311        );
15312        self.as_rec_mut().extend(value.to_bytes_with_nul());
15313        self
15314    }
15315    pub fn push_resource_name_bytes(mut self, value: &[u8]) -> Self {
15316        push_header(self.as_rec_mut(), 65u16, (value.len() + 1) as u16);
15317        self.as_rec_mut().extend(value);
15318        self.as_rec_mut().push(0);
15319        self
15320    }
15321    pub fn push_resource_id(mut self, value: u64) -> Self {
15322        push_header(self.as_rec_mut(), 66u16, 8 as u16);
15323        self.as_rec_mut().extend(value.to_ne_bytes());
15324        self
15325    }
15326    pub fn push_resource_size(mut self, value: u64) -> Self {
15327        push_header(self.as_rec_mut(), 67u16, 8 as u16);
15328        self.as_rec_mut().extend(value.to_ne_bytes());
15329        self
15330    }
15331    pub fn push_resource_size_new(mut self, value: u64) -> Self {
15332        push_header(self.as_rec_mut(), 68u16, 8 as u16);
15333        self.as_rec_mut().extend(value.to_ne_bytes());
15334        self
15335    }
15336    pub fn push_resource_size_valid(mut self, value: u8) -> Self {
15337        push_header(self.as_rec_mut(), 69u16, 1 as u16);
15338        self.as_rec_mut().extend(value.to_ne_bytes());
15339        self
15340    }
15341    pub fn push_resource_size_min(mut self, value: u64) -> Self {
15342        push_header(self.as_rec_mut(), 70u16, 8 as u16);
15343        self.as_rec_mut().extend(value.to_ne_bytes());
15344        self
15345    }
15346    pub fn push_resource_size_max(mut self, value: u64) -> Self {
15347        push_header(self.as_rec_mut(), 71u16, 8 as u16);
15348        self.as_rec_mut().extend(value.to_ne_bytes());
15349        self
15350    }
15351    pub fn push_resource_size_gran(mut self, value: u64) -> Self {
15352        push_header(self.as_rec_mut(), 72u16, 8 as u16);
15353        self.as_rec_mut().extend(value.to_ne_bytes());
15354        self
15355    }
15356    #[doc = "Associated type: [`ResourceUnit`] (enum)"]
15357    pub fn push_resource_unit(mut self, value: u8) -> Self {
15358        push_header(self.as_rec_mut(), 73u16, 1 as u16);
15359        self.as_rec_mut().extend(value.to_ne_bytes());
15360        self
15361    }
15362    pub fn push_resource_occ(mut self, value: u64) -> Self {
15363        push_header(self.as_rec_mut(), 74u16, 8 as u16);
15364        self.as_rec_mut().extend(value.to_ne_bytes());
15365        self
15366    }
15367}
15368impl<Prev: Rec> Drop for PushDlResource<Prev> {
15369    fn drop(&mut self) {
15370        if let Some(prev) = &mut self.prev {
15371            if let Some(header_offset) = &self.header_offset {
15372                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15373            }
15374        }
15375    }
15376}
15377pub struct PushDlResourceList<Prev: Rec> {
15378    pub(crate) prev: Option<Prev>,
15379    pub(crate) header_offset: Option<usize>,
15380}
15381impl<Prev: Rec> Rec for PushDlResourceList<Prev> {
15382    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15383        self.prev.as_mut().unwrap().as_rec_mut()
15384    }
15385    fn as_rec(&self) -> &Vec<u8> {
15386        self.prev.as_ref().unwrap().as_rec()
15387    }
15388}
15389impl<Prev: Rec> PushDlResourceList<Prev> {
15390    pub fn new(prev: Prev) -> Self {
15391        Self {
15392            prev: Some(prev),
15393            header_offset: None,
15394        }
15395    }
15396    pub fn end_nested(mut self) -> Prev {
15397        let mut prev = self.prev.take().unwrap();
15398        if let Some(header_offset) = &self.header_offset {
15399            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15400        }
15401        prev
15402    }
15403    #[doc = "Attribute may repeat multiple times (treat it as array)"]
15404    pub fn nested_resource(mut self) -> PushDlResource<Self> {
15405        let header_offset = push_nested_header(self.as_rec_mut(), 64u16);
15406        PushDlResource {
15407            prev: Some(self),
15408            header_offset: Some(header_offset),
15409        }
15410    }
15411}
15412impl<Prev: Rec> Drop for PushDlResourceList<Prev> {
15413    fn drop(&mut self) {
15414        if let Some(prev) = &mut self.prev {
15415            if let Some(header_offset) = &self.header_offset {
15416                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15417            }
15418        }
15419    }
15420}
15421pub struct PushDlParam<Prev: Rec> {
15422    pub(crate) prev: Option<Prev>,
15423    pub(crate) header_offset: Option<usize>,
15424}
15425impl<Prev: Rec> Rec for PushDlParam<Prev> {
15426    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15427        self.prev.as_mut().unwrap().as_rec_mut()
15428    }
15429    fn as_rec(&self) -> &Vec<u8> {
15430        self.prev.as_ref().unwrap().as_rec()
15431    }
15432}
15433impl<Prev: Rec> PushDlParam<Prev> {
15434    pub fn new(prev: Prev) -> Self {
15435        Self {
15436            prev: Some(prev),
15437            header_offset: None,
15438        }
15439    }
15440    pub fn end_nested(mut self) -> Prev {
15441        let mut prev = self.prev.take().unwrap();
15442        if let Some(header_offset) = &self.header_offset {
15443            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15444        }
15445        prev
15446    }
15447    pub fn push_param_name(mut self, value: &CStr) -> Self {
15448        push_header(
15449            self.as_rec_mut(),
15450            81u16,
15451            value.to_bytes_with_nul().len() as u16,
15452        );
15453        self.as_rec_mut().extend(value.to_bytes_with_nul());
15454        self
15455    }
15456    pub fn push_param_name_bytes(mut self, value: &[u8]) -> Self {
15457        push_header(self.as_rec_mut(), 81u16, (value.len() + 1) as u16);
15458        self.as_rec_mut().extend(value);
15459        self.as_rec_mut().push(0);
15460        self
15461    }
15462    pub fn push_param_generic(mut self, value: ()) -> Self {
15463        push_header(self.as_rec_mut(), 82u16, 0 as u16);
15464        self
15465    }
15466    #[doc = "Associated type: [`VarAttrType`] (enum)"]
15467    pub fn push_param_type(mut self, value: u8) -> Self {
15468        push_header(self.as_rec_mut(), 83u16, 1 as u16);
15469        self.as_rec_mut().extend(value.to_ne_bytes());
15470        self
15471    }
15472}
15473impl<Prev: Rec> Drop for PushDlParam<Prev> {
15474    fn drop(&mut self) {
15475        if let Some(prev) = &mut self.prev {
15476            if let Some(header_offset) = &self.header_offset {
15477                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15478            }
15479        }
15480    }
15481}
15482pub struct PushDlRegionSnapshots<Prev: Rec> {
15483    pub(crate) prev: Option<Prev>,
15484    pub(crate) header_offset: Option<usize>,
15485}
15486impl<Prev: Rec> Rec for PushDlRegionSnapshots<Prev> {
15487    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15488        self.prev.as_mut().unwrap().as_rec_mut()
15489    }
15490    fn as_rec(&self) -> &Vec<u8> {
15491        self.prev.as_ref().unwrap().as_rec()
15492    }
15493}
15494impl<Prev: Rec> PushDlRegionSnapshots<Prev> {
15495    pub fn new(prev: Prev) -> Self {
15496        Self {
15497            prev: Some(prev),
15498            header_offset: None,
15499        }
15500    }
15501    pub fn end_nested(mut self) -> Prev {
15502        let mut prev = self.prev.take().unwrap();
15503        if let Some(header_offset) = &self.header_offset {
15504            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15505        }
15506        prev
15507    }
15508    pub fn nested_region_snapshot(mut self) -> PushDlRegionSnapshot<Self> {
15509        let header_offset = push_nested_header(self.as_rec_mut(), 91u16);
15510        PushDlRegionSnapshot {
15511            prev: Some(self),
15512            header_offset: Some(header_offset),
15513        }
15514    }
15515}
15516impl<Prev: Rec> Drop for PushDlRegionSnapshots<Prev> {
15517    fn drop(&mut self) {
15518        if let Some(prev) = &mut self.prev {
15519            if let Some(header_offset) = &self.header_offset {
15520                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15521            }
15522        }
15523    }
15524}
15525pub struct PushDlRegionSnapshot<Prev: Rec> {
15526    pub(crate) prev: Option<Prev>,
15527    pub(crate) header_offset: Option<usize>,
15528}
15529impl<Prev: Rec> Rec for PushDlRegionSnapshot<Prev> {
15530    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15531        self.prev.as_mut().unwrap().as_rec_mut()
15532    }
15533    fn as_rec(&self) -> &Vec<u8> {
15534        self.prev.as_ref().unwrap().as_rec()
15535    }
15536}
15537impl<Prev: Rec> PushDlRegionSnapshot<Prev> {
15538    pub fn new(prev: Prev) -> Self {
15539        Self {
15540            prev: Some(prev),
15541            header_offset: None,
15542        }
15543    }
15544    pub fn end_nested(mut self) -> Prev {
15545        let mut prev = self.prev.take().unwrap();
15546        if let Some(header_offset) = &self.header_offset {
15547            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15548        }
15549        prev
15550    }
15551    pub fn push_region_snapshot_id(mut self, value: u32) -> Self {
15552        push_header(self.as_rec_mut(), 92u16, 4 as u16);
15553        self.as_rec_mut().extend(value.to_ne_bytes());
15554        self
15555    }
15556}
15557impl<Prev: Rec> Drop for PushDlRegionSnapshot<Prev> {
15558    fn drop(&mut self) {
15559        if let Some(prev) = &mut self.prev {
15560            if let Some(header_offset) = &self.header_offset {
15561                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15562            }
15563        }
15564    }
15565}
15566pub struct PushDlRegionChunks<Prev: Rec> {
15567    pub(crate) prev: Option<Prev>,
15568    pub(crate) header_offset: Option<usize>,
15569}
15570impl<Prev: Rec> Rec for PushDlRegionChunks<Prev> {
15571    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15572        self.prev.as_mut().unwrap().as_rec_mut()
15573    }
15574    fn as_rec(&self) -> &Vec<u8> {
15575        self.prev.as_ref().unwrap().as_rec()
15576    }
15577}
15578impl<Prev: Rec> PushDlRegionChunks<Prev> {
15579    pub fn new(prev: Prev) -> Self {
15580        Self {
15581            prev: Some(prev),
15582            header_offset: None,
15583        }
15584    }
15585    pub fn end_nested(mut self) -> Prev {
15586        let mut prev = self.prev.take().unwrap();
15587        if let Some(header_offset) = &self.header_offset {
15588            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15589        }
15590        prev
15591    }
15592    pub fn nested_region_chunk(mut self) -> PushDlRegionChunk<Self> {
15593        let header_offset = push_nested_header(self.as_rec_mut(), 94u16);
15594        PushDlRegionChunk {
15595            prev: Some(self),
15596            header_offset: Some(header_offset),
15597        }
15598    }
15599}
15600impl<Prev: Rec> Drop for PushDlRegionChunks<Prev> {
15601    fn drop(&mut self) {
15602        if let Some(prev) = &mut self.prev {
15603            if let Some(header_offset) = &self.header_offset {
15604                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15605            }
15606        }
15607    }
15608}
15609pub struct PushDlRegionChunk<Prev: Rec> {
15610    pub(crate) prev: Option<Prev>,
15611    pub(crate) header_offset: Option<usize>,
15612}
15613impl<Prev: Rec> Rec for PushDlRegionChunk<Prev> {
15614    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15615        self.prev.as_mut().unwrap().as_rec_mut()
15616    }
15617    fn as_rec(&self) -> &Vec<u8> {
15618        self.prev.as_ref().unwrap().as_rec()
15619    }
15620}
15621impl<Prev: Rec> PushDlRegionChunk<Prev> {
15622    pub fn new(prev: Prev) -> Self {
15623        Self {
15624            prev: Some(prev),
15625            header_offset: None,
15626        }
15627    }
15628    pub fn end_nested(mut self) -> Prev {
15629        let mut prev = self.prev.take().unwrap();
15630        if let Some(header_offset) = &self.header_offset {
15631            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15632        }
15633        prev
15634    }
15635    pub fn push_region_chunk_data(mut self, value: &[u8]) -> Self {
15636        push_header(self.as_rec_mut(), 95u16, value.len() as u16);
15637        self.as_rec_mut().extend(value);
15638        self
15639    }
15640    pub fn push_region_chunk_addr(mut self, value: u64) -> Self {
15641        push_header(self.as_rec_mut(), 96u16, 8 as u16);
15642        self.as_rec_mut().extend(value.to_ne_bytes());
15643        self
15644    }
15645}
15646impl<Prev: Rec> Drop for PushDlRegionChunk<Prev> {
15647    fn drop(&mut self) {
15648        if let Some(prev) = &mut self.prev {
15649            if let Some(header_offset) = &self.header_offset {
15650                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15651            }
15652        }
15653    }
15654}
15655pub struct PushDlFmsg<Prev: Rec> {
15656    pub(crate) prev: Option<Prev>,
15657    pub(crate) header_offset: Option<usize>,
15658}
15659impl<Prev: Rec> Rec for PushDlFmsg<Prev> {
15660    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15661        self.prev.as_mut().unwrap().as_rec_mut()
15662    }
15663    fn as_rec(&self) -> &Vec<u8> {
15664        self.prev.as_ref().unwrap().as_rec()
15665    }
15666}
15667impl<Prev: Rec> PushDlFmsg<Prev> {
15668    pub fn new(prev: Prev) -> Self {
15669        Self {
15670            prev: Some(prev),
15671            header_offset: None,
15672        }
15673    }
15674    pub fn end_nested(mut self) -> Prev {
15675        let mut prev = self.prev.take().unwrap();
15676        if let Some(header_offset) = &self.header_offset {
15677            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15678        }
15679        prev
15680    }
15681    pub fn push_fmsg_obj_nest_start(mut self, value: ()) -> Self {
15682        push_header(self.as_rec_mut(), 107u16, 0 as u16);
15683        self
15684    }
15685    pub fn push_fmsg_pair_nest_start(mut self, value: ()) -> Self {
15686        push_header(self.as_rec_mut(), 108u16, 0 as u16);
15687        self
15688    }
15689    pub fn push_fmsg_arr_nest_start(mut self, value: ()) -> Self {
15690        push_header(self.as_rec_mut(), 109u16, 0 as u16);
15691        self
15692    }
15693    pub fn push_fmsg_nest_end(mut self, value: ()) -> Self {
15694        push_header(self.as_rec_mut(), 110u16, 0 as u16);
15695        self
15696    }
15697    pub fn push_fmsg_obj_name(mut self, value: &CStr) -> Self {
15698        push_header(
15699            self.as_rec_mut(),
15700            111u16,
15701            value.to_bytes_with_nul().len() as u16,
15702        );
15703        self.as_rec_mut().extend(value.to_bytes_with_nul());
15704        self
15705    }
15706    pub fn push_fmsg_obj_name_bytes(mut self, value: &[u8]) -> Self {
15707        push_header(self.as_rec_mut(), 111u16, (value.len() + 1) as u16);
15708        self.as_rec_mut().extend(value);
15709        self.as_rec_mut().push(0);
15710        self
15711    }
15712}
15713impl<Prev: Rec> Drop for PushDlFmsg<Prev> {
15714    fn drop(&mut self) {
15715        if let Some(prev) = &mut self.prev {
15716            if let Some(header_offset) = &self.header_offset {
15717                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15718            }
15719        }
15720    }
15721}
15722pub struct PushDlHealthReporter<Prev: Rec> {
15723    pub(crate) prev: Option<Prev>,
15724    pub(crate) header_offset: Option<usize>,
15725}
15726impl<Prev: Rec> Rec for PushDlHealthReporter<Prev> {
15727    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15728        self.prev.as_mut().unwrap().as_rec_mut()
15729    }
15730    fn as_rec(&self) -> &Vec<u8> {
15731        self.prev.as_ref().unwrap().as_rec()
15732    }
15733}
15734impl<Prev: Rec> PushDlHealthReporter<Prev> {
15735    pub fn new(prev: Prev) -> Self {
15736        Self {
15737            prev: Some(prev),
15738            header_offset: None,
15739        }
15740    }
15741    pub fn end_nested(mut self) -> Prev {
15742        let mut prev = self.prev.take().unwrap();
15743        if let Some(header_offset) = &self.header_offset {
15744            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15745        }
15746        prev
15747    }
15748    pub fn push_health_reporter_name(mut self, value: &CStr) -> Self {
15749        push_header(
15750            self.as_rec_mut(),
15751            115u16,
15752            value.to_bytes_with_nul().len() as u16,
15753        );
15754        self.as_rec_mut().extend(value.to_bytes_with_nul());
15755        self
15756    }
15757    pub fn push_health_reporter_name_bytes(mut self, value: &[u8]) -> Self {
15758        push_header(self.as_rec_mut(), 115u16, (value.len() + 1) as u16);
15759        self.as_rec_mut().extend(value);
15760        self.as_rec_mut().push(0);
15761        self
15762    }
15763    pub fn push_health_reporter_state(mut self, value: u8) -> Self {
15764        push_header(self.as_rec_mut(), 116u16, 1 as u16);
15765        self.as_rec_mut().extend(value.to_ne_bytes());
15766        self
15767    }
15768    pub fn push_health_reporter_err_count(mut self, value: u64) -> Self {
15769        push_header(self.as_rec_mut(), 117u16, 8 as u16);
15770        self.as_rec_mut().extend(value.to_ne_bytes());
15771        self
15772    }
15773    pub fn push_health_reporter_recover_count(mut self, value: u64) -> Self {
15774        push_header(self.as_rec_mut(), 118u16, 8 as u16);
15775        self.as_rec_mut().extend(value.to_ne_bytes());
15776        self
15777    }
15778    pub fn push_health_reporter_dump_ts(mut self, value: u64) -> Self {
15779        push_header(self.as_rec_mut(), 119u16, 8 as u16);
15780        self.as_rec_mut().extend(value.to_ne_bytes());
15781        self
15782    }
15783    pub fn push_health_reporter_graceful_period(mut self, value: u64) -> Self {
15784        push_header(self.as_rec_mut(), 120u16, 8 as u16);
15785        self.as_rec_mut().extend(value.to_ne_bytes());
15786        self
15787    }
15788    pub fn push_health_reporter_auto_recover(mut self, value: u8) -> Self {
15789        push_header(self.as_rec_mut(), 121u16, 1 as u16);
15790        self.as_rec_mut().extend(value.to_ne_bytes());
15791        self
15792    }
15793    pub fn push_health_reporter_dump_ts_ns(mut self, value: u64) -> Self {
15794        push_header(self.as_rec_mut(), 137u16, 8 as u16);
15795        self.as_rec_mut().extend(value.to_ne_bytes());
15796        self
15797    }
15798    pub fn push_health_reporter_auto_dump(mut self, value: u8) -> Self {
15799        push_header(self.as_rec_mut(), 141u16, 1 as u16);
15800        self.as_rec_mut().extend(value.to_ne_bytes());
15801        self
15802    }
15803    #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
15804    pub fn push_health_reporter_burst_period(mut self, value: u64) -> Self {
15805        push_header(self.as_rec_mut(), 181u16, 8 as u16);
15806        self.as_rec_mut().extend(value.to_ne_bytes());
15807        self
15808    }
15809}
15810impl<Prev: Rec> Drop for PushDlHealthReporter<Prev> {
15811    fn drop(&mut self) {
15812        if let Some(prev) = &mut self.prev {
15813            if let Some(header_offset) = &self.header_offset {
15814                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15815            }
15816        }
15817    }
15818}
15819pub struct PushDlAttrStats<Prev: Rec> {
15820    pub(crate) prev: Option<Prev>,
15821    pub(crate) header_offset: Option<usize>,
15822}
15823impl<Prev: Rec> Rec for PushDlAttrStats<Prev> {
15824    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15825        self.prev.as_mut().unwrap().as_rec_mut()
15826    }
15827    fn as_rec(&self) -> &Vec<u8> {
15828        self.prev.as_ref().unwrap().as_rec()
15829    }
15830}
15831impl<Prev: Rec> PushDlAttrStats<Prev> {
15832    pub fn new(prev: Prev) -> Self {
15833        Self {
15834            prev: Some(prev),
15835            header_offset: None,
15836        }
15837    }
15838    pub fn end_nested(mut self) -> Prev {
15839        let mut prev = self.prev.take().unwrap();
15840        if let Some(header_offset) = &self.header_offset {
15841            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15842        }
15843        prev
15844    }
15845    pub fn push_stats_rx_packets(mut self, value: u64) -> Self {
15846        push_header(self.as_rec_mut(), 0u16, 8 as u16);
15847        self.as_rec_mut().extend(value.to_ne_bytes());
15848        self
15849    }
15850    pub fn push_stats_rx_bytes(mut self, value: u64) -> Self {
15851        push_header(self.as_rec_mut(), 1u16, 8 as u16);
15852        self.as_rec_mut().extend(value.to_ne_bytes());
15853        self
15854    }
15855    pub fn push_stats_rx_dropped(mut self, value: u64) -> Self {
15856        push_header(self.as_rec_mut(), 2u16, 8 as u16);
15857        self.as_rec_mut().extend(value.to_ne_bytes());
15858        self
15859    }
15860}
15861impl<Prev: Rec> Drop for PushDlAttrStats<Prev> {
15862    fn drop(&mut self) {
15863        if let Some(prev) = &mut self.prev {
15864            if let Some(header_offset) = &self.header_offset {
15865                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15866            }
15867        }
15868    }
15869}
15870pub struct PushDlTrapMetadata<Prev: Rec> {
15871    pub(crate) prev: Option<Prev>,
15872    pub(crate) header_offset: Option<usize>,
15873}
15874impl<Prev: Rec> Rec for PushDlTrapMetadata<Prev> {
15875    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15876        self.prev.as_mut().unwrap().as_rec_mut()
15877    }
15878    fn as_rec(&self) -> &Vec<u8> {
15879        self.prev.as_ref().unwrap().as_rec()
15880    }
15881}
15882impl<Prev: Rec> PushDlTrapMetadata<Prev> {
15883    pub fn new(prev: Prev) -> Self {
15884        Self {
15885            prev: Some(prev),
15886            header_offset: None,
15887        }
15888    }
15889    pub fn end_nested(mut self) -> Prev {
15890        let mut prev = self.prev.take().unwrap();
15891        if let Some(header_offset) = &self.header_offset {
15892            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15893        }
15894        prev
15895    }
15896    pub fn push_trap_metadata_type_in_port(mut self, value: ()) -> Self {
15897        push_header(self.as_rec_mut(), 0u16, 0 as u16);
15898        self
15899    }
15900    pub fn push_trap_metadata_type_fa_cookie(mut self, value: ()) -> Self {
15901        push_header(self.as_rec_mut(), 1u16, 0 as u16);
15902        self
15903    }
15904}
15905impl<Prev: Rec> Drop for PushDlTrapMetadata<Prev> {
15906    fn drop(&mut self) {
15907        if let Some(prev) = &mut self.prev {
15908            if let Some(header_offset) = &self.header_offset {
15909                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15910            }
15911        }
15912    }
15913}
15914pub struct PushDlLinecardSupportedTypes<Prev: Rec> {
15915    pub(crate) prev: Option<Prev>,
15916    pub(crate) header_offset: Option<usize>,
15917}
15918impl<Prev: Rec> Rec for PushDlLinecardSupportedTypes<Prev> {
15919    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15920        self.prev.as_mut().unwrap().as_rec_mut()
15921    }
15922    fn as_rec(&self) -> &Vec<u8> {
15923        self.prev.as_ref().unwrap().as_rec()
15924    }
15925}
15926impl<Prev: Rec> PushDlLinecardSupportedTypes<Prev> {
15927    pub fn new(prev: Prev) -> Self {
15928        Self {
15929            prev: Some(prev),
15930            header_offset: None,
15931        }
15932    }
15933    pub fn end_nested(mut self) -> Prev {
15934        let mut prev = self.prev.take().unwrap();
15935        if let Some(header_offset) = &self.header_offset {
15936            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15937        }
15938        prev
15939    }
15940    pub fn push_linecard_type(mut self, value: &CStr) -> Self {
15941        push_header(
15942            self.as_rec_mut(),
15943            173u16,
15944            value.to_bytes_with_nul().len() as u16,
15945        );
15946        self.as_rec_mut().extend(value.to_bytes_with_nul());
15947        self
15948    }
15949    pub fn push_linecard_type_bytes(mut self, value: &[u8]) -> Self {
15950        push_header(self.as_rec_mut(), 173u16, (value.len() + 1) as u16);
15951        self.as_rec_mut().extend(value);
15952        self.as_rec_mut().push(0);
15953        self
15954    }
15955}
15956impl<Prev: Rec> Drop for PushDlLinecardSupportedTypes<Prev> {
15957    fn drop(&mut self) {
15958        if let Some(prev) = &mut self.prev {
15959            if let Some(header_offset) = &self.header_offset {
15960                finalize_nested_header(prev.as_rec_mut(), *header_offset);
15961            }
15962        }
15963    }
15964}
15965pub struct PushDlSelftestId<Prev: Rec> {
15966    pub(crate) prev: Option<Prev>,
15967    pub(crate) header_offset: Option<usize>,
15968}
15969impl<Prev: Rec> Rec for PushDlSelftestId<Prev> {
15970    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15971        self.prev.as_mut().unwrap().as_rec_mut()
15972    }
15973    fn as_rec(&self) -> &Vec<u8> {
15974        self.prev.as_ref().unwrap().as_rec()
15975    }
15976}
15977impl<Prev: Rec> PushDlSelftestId<Prev> {
15978    pub fn new(prev: Prev) -> Self {
15979        Self {
15980            prev: Some(prev),
15981            header_offset: None,
15982        }
15983    }
15984    pub fn end_nested(mut self) -> Prev {
15985        let mut prev = self.prev.take().unwrap();
15986        if let Some(header_offset) = &self.header_offset {
15987            finalize_nested_header(prev.as_rec_mut(), *header_offset);
15988        }
15989        prev
15990    }
15991    pub fn push_flash(mut self, value: ()) -> Self {
15992        push_header(self.as_rec_mut(), 1u16, 0 as u16);
15993        self
15994    }
15995}
15996impl<Prev: Rec> Drop for PushDlSelftestId<Prev> {
15997    fn drop(&mut self) {
15998        if let Some(prev) = &mut self.prev {
15999            if let Some(header_offset) = &self.header_offset {
16000                finalize_nested_header(prev.as_rec_mut(), *header_offset);
16001            }
16002        }
16003    }
16004}
16005pub struct PushDlRateTcBws<Prev: Rec> {
16006    pub(crate) prev: Option<Prev>,
16007    pub(crate) header_offset: Option<usize>,
16008}
16009impl<Prev: Rec> Rec for PushDlRateTcBws<Prev> {
16010    fn as_rec_mut(&mut self) -> &mut Vec<u8> {
16011        self.prev.as_mut().unwrap().as_rec_mut()
16012    }
16013    fn as_rec(&self) -> &Vec<u8> {
16014        self.prev.as_ref().unwrap().as_rec()
16015    }
16016}
16017impl<Prev: Rec> PushDlRateTcBws<Prev> {
16018    pub fn new(prev: Prev) -> Self {
16019        Self {
16020            prev: Some(prev),
16021            header_offset: None,
16022        }
16023    }
16024    pub fn end_nested(mut self) -> Prev {
16025        let mut prev = self.prev.take().unwrap();
16026        if let Some(header_offset) = &self.header_offset {
16027            finalize_nested_header(prev.as_rec_mut(), *header_offset);
16028        }
16029        prev
16030    }
16031    pub fn push_index(mut self, value: u8) -> Self {
16032        push_header(self.as_rec_mut(), 1u16, 1 as u16);
16033        self.as_rec_mut().extend(value.to_ne_bytes());
16034        self
16035    }
16036    #[doc = "Specifies the bandwidth share assigned to the Traffic Class\\.\nThe bandwidth for the traffic class is determined\nin proportion to the sum of the shares of all configured classes\\.\n"]
16037    pub fn push_bw(mut self, value: u32) -> Self {
16038        push_header(self.as_rec_mut(), 2u16, 4 as u16);
16039        self.as_rec_mut().extend(value.to_ne_bytes());
16040        self
16041    }
16042}
16043impl<Prev: Rec> Drop for PushDlRateTcBws<Prev> {
16044    fn drop(&mut self) {
16045        if let Some(prev) = &mut self.prev {
16046            if let Some(header_offset) = &self.header_offset {
16047                finalize_nested_header(prev.as_rec_mut(), *header_offset);
16048            }
16049        }
16050    }
16051}
16052#[doc = "Get devlink instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_failed()](IterableDevlink::get_reload_failed)\n- [.get_dev_stats()](IterableDevlink::get_dev_stats)\n"]
16053#[derive(Debug)]
16054pub struct OpGetDump<'r> {
16055    request: Request<'r>,
16056}
16057impl<'r> OpGetDump<'r> {
16058    pub fn new(mut request: Request<'r>) -> Self {
16059        Self::write_header(request.buf_mut());
16060        Self {
16061            request: request.set_dump(),
16062        }
16063    }
16064    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16065        Self::write_header(buf);
16066        PushDevlink::new(buf)
16067    }
16068    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16069        PushDevlink::new(self.request.buf_mut())
16070    }
16071    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16072        PushDevlink::new(self.request.buf)
16073    }
16074    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16075        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16076        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16077    }
16078    fn write_header<Prev: Rec>(prev: &mut Prev) {
16079        let mut header = BuiltinNfgenmsg::new();
16080        header.cmd = 1u8;
16081        header.version = 1u8;
16082        prev.as_rec_mut().extend(header.as_slice());
16083    }
16084}
16085impl NetlinkRequest for OpGetDump<'_> {
16086    fn protocol(&self) -> Protocol {
16087        Protocol::Generic("devlink".as_bytes())
16088    }
16089    fn flags(&self) -> u16 {
16090        self.request.flags
16091    }
16092    fn payload(&self) -> &[u8] {
16093        self.request.buf()
16094    }
16095    type ReplyType<'buf> = IterableDevlink<'buf>;
16096    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16097        Self::decode_request(buf)
16098    }
16099    fn lookup(
16100        buf: &[u8],
16101        offset: usize,
16102        missing_type: Option<u16>,
16103    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16104        Self::decode_request(buf).lookup_attr(offset, missing_type)
16105    }
16106}
16107#[doc = "Get devlink instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_failed()](IterableDevlink::get_reload_failed)\n- [.get_dev_stats()](IterableDevlink::get_dev_stats)\n"]
16108#[derive(Debug)]
16109pub struct OpGetDo<'r> {
16110    request: Request<'r>,
16111}
16112impl<'r> OpGetDo<'r> {
16113    pub fn new(mut request: Request<'r>) -> Self {
16114        Self::write_header(request.buf_mut());
16115        Self { request: request }
16116    }
16117    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16118        Self::write_header(buf);
16119        PushDevlink::new(buf)
16120    }
16121    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16122        PushDevlink::new(self.request.buf_mut())
16123    }
16124    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16125        PushDevlink::new(self.request.buf)
16126    }
16127    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16128        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16129        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16130    }
16131    fn write_header<Prev: Rec>(prev: &mut Prev) {
16132        let mut header = BuiltinNfgenmsg::new();
16133        header.cmd = 1u8;
16134        header.version = 1u8;
16135        prev.as_rec_mut().extend(header.as_slice());
16136    }
16137}
16138impl NetlinkRequest for OpGetDo<'_> {
16139    fn protocol(&self) -> Protocol {
16140        Protocol::Generic("devlink".as_bytes())
16141    }
16142    fn flags(&self) -> u16 {
16143        self.request.flags
16144    }
16145    fn payload(&self) -> &[u8] {
16146        self.request.buf()
16147    }
16148    type ReplyType<'buf> = IterableDevlink<'buf>;
16149    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16150        Self::decode_request(buf)
16151    }
16152    fn lookup(
16153        buf: &[u8],
16154        offset: usize,
16155        missing_type: Option<u16>,
16156    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16157        Self::decode_request(buf).lookup_attr(offset, missing_type)
16158    }
16159}
16160#[doc = "Get devlink port instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
16161#[derive(Debug)]
16162pub struct OpPortGetDump<'r> {
16163    request: Request<'r>,
16164}
16165impl<'r> OpPortGetDump<'r> {
16166    pub fn new(mut request: Request<'r>) -> Self {
16167        Self::write_header(request.buf_mut());
16168        Self {
16169            request: request.set_dump(),
16170        }
16171    }
16172    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16173        Self::write_header(buf);
16174        PushDevlink::new(buf)
16175    }
16176    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16177        PushDevlink::new(self.request.buf_mut())
16178    }
16179    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16180        PushDevlink::new(self.request.buf)
16181    }
16182    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16183        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16184        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16185    }
16186    fn write_header<Prev: Rec>(prev: &mut Prev) {
16187        let mut header = BuiltinNfgenmsg::new();
16188        header.cmd = 5u8;
16189        header.version = 1u8;
16190        prev.as_rec_mut().extend(header.as_slice());
16191    }
16192}
16193impl NetlinkRequest for OpPortGetDump<'_> {
16194    fn protocol(&self) -> Protocol {
16195        Protocol::Generic("devlink".as_bytes())
16196    }
16197    fn flags(&self) -> u16 {
16198        self.request.flags
16199    }
16200    fn payload(&self) -> &[u8] {
16201        self.request.buf()
16202    }
16203    type ReplyType<'buf> = IterableDevlink<'buf>;
16204    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16205        Self::decode_request(buf)
16206    }
16207    fn lookup(
16208        buf: &[u8],
16209        offset: usize,
16210        missing_type: Option<u16>,
16211    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16212        Self::decode_request(buf).lookup_attr(offset, missing_type)
16213    }
16214}
16215#[doc = "Get devlink port instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
16216#[derive(Debug)]
16217pub struct OpPortGetDo<'r> {
16218    request: Request<'r>,
16219}
16220impl<'r> OpPortGetDo<'r> {
16221    pub fn new(mut request: Request<'r>) -> Self {
16222        Self::write_header(request.buf_mut());
16223        Self { request: request }
16224    }
16225    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16226        Self::write_header(buf);
16227        PushDevlink::new(buf)
16228    }
16229    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16230        PushDevlink::new(self.request.buf_mut())
16231    }
16232    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16233        PushDevlink::new(self.request.buf)
16234    }
16235    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16236        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16237        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16238    }
16239    fn write_header<Prev: Rec>(prev: &mut Prev) {
16240        let mut header = BuiltinNfgenmsg::new();
16241        header.cmd = 5u8;
16242        header.version = 1u8;
16243        prev.as_rec_mut().extend(header.as_slice());
16244    }
16245}
16246impl NetlinkRequest for OpPortGetDo<'_> {
16247    fn protocol(&self) -> Protocol {
16248        Protocol::Generic("devlink".as_bytes())
16249    }
16250    fn flags(&self) -> u16 {
16251        self.request.flags
16252    }
16253    fn payload(&self) -> &[u8] {
16254        self.request.buf()
16255    }
16256    type ReplyType<'buf> = IterableDevlink<'buf>;
16257    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16258        Self::decode_request(buf)
16259    }
16260    fn lookup(
16261        buf: &[u8],
16262        offset: usize,
16263        missing_type: Option<u16>,
16264    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16265        Self::decode_request(buf).lookup_attr(offset, missing_type)
16266    }
16267}
16268#[doc = "Set devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_type()](PushDevlink::push_port_type)\n- [.nested_port_function()](PushDevlink::nested_port_function)\n"]
16269#[derive(Debug)]
16270pub struct OpPortSetDo<'r> {
16271    request: Request<'r>,
16272}
16273impl<'r> OpPortSetDo<'r> {
16274    pub fn new(mut request: Request<'r>) -> Self {
16275        Self::write_header(request.buf_mut());
16276        Self { request: request }
16277    }
16278    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16279        Self::write_header(buf);
16280        PushDevlink::new(buf)
16281    }
16282    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16283        PushDevlink::new(self.request.buf_mut())
16284    }
16285    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16286        PushDevlink::new(self.request.buf)
16287    }
16288    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16289        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16290        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16291    }
16292    fn write_header<Prev: Rec>(prev: &mut Prev) {
16293        let mut header = BuiltinNfgenmsg::new();
16294        header.cmd = 6u8;
16295        header.version = 1u8;
16296        prev.as_rec_mut().extend(header.as_slice());
16297    }
16298}
16299impl NetlinkRequest for OpPortSetDo<'_> {
16300    fn protocol(&self) -> Protocol {
16301        Protocol::Generic("devlink".as_bytes())
16302    }
16303    fn flags(&self) -> u16 {
16304        self.request.flags
16305    }
16306    fn payload(&self) -> &[u8] {
16307        self.request.buf()
16308    }
16309    type ReplyType<'buf> = IterableDevlink<'buf>;
16310    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16311        Self::decode_request(buf)
16312    }
16313    fn lookup(
16314        buf: &[u8],
16315        offset: usize,
16316        missing_type: Option<u16>,
16317    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16318        Self::decode_request(buf).lookup_attr(offset, missing_type)
16319    }
16320}
16321#[doc = "Create devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_flavour()](PushDevlink::push_port_flavour)\n- [.push_port_pci_pf_number()](PushDevlink::push_port_pci_pf_number)\n- [.push_port_controller_number()](PushDevlink::push_port_controller_number)\n- [.push_port_pci_sf_number()](PushDevlink::push_port_pci_sf_number)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
16322#[derive(Debug)]
16323pub struct OpPortNewDo<'r> {
16324    request: Request<'r>,
16325}
16326impl<'r> OpPortNewDo<'r> {
16327    pub fn new(mut request: Request<'r>) -> Self {
16328        Self::write_header(request.buf_mut());
16329        Self { request: request }
16330    }
16331    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16332        Self::write_header(buf);
16333        PushDevlink::new(buf)
16334    }
16335    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16336        PushDevlink::new(self.request.buf_mut())
16337    }
16338    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16339        PushDevlink::new(self.request.buf)
16340    }
16341    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16342        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16343        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16344    }
16345    fn write_header<Prev: Rec>(prev: &mut Prev) {
16346        let mut header = BuiltinNfgenmsg::new();
16347        header.cmd = 7u8;
16348        header.version = 1u8;
16349        prev.as_rec_mut().extend(header.as_slice());
16350    }
16351}
16352impl NetlinkRequest for OpPortNewDo<'_> {
16353    fn protocol(&self) -> Protocol {
16354        Protocol::Generic("devlink".as_bytes())
16355    }
16356    fn flags(&self) -> u16 {
16357        self.request.flags
16358    }
16359    fn payload(&self) -> &[u8] {
16360        self.request.buf()
16361    }
16362    type ReplyType<'buf> = IterableDevlink<'buf>;
16363    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16364        Self::decode_request(buf)
16365    }
16366    fn lookup(
16367        buf: &[u8],
16368        offset: usize,
16369        missing_type: Option<u16>,
16370    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16371        Self::decode_request(buf).lookup_attr(offset, missing_type)
16372    }
16373}
16374#[doc = "Delete devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
16375#[derive(Debug)]
16376pub struct OpPortDelDo<'r> {
16377    request: Request<'r>,
16378}
16379impl<'r> OpPortDelDo<'r> {
16380    pub fn new(mut request: Request<'r>) -> Self {
16381        Self::write_header(request.buf_mut());
16382        Self { request: request }
16383    }
16384    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16385        Self::write_header(buf);
16386        PushDevlink::new(buf)
16387    }
16388    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16389        PushDevlink::new(self.request.buf_mut())
16390    }
16391    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16392        PushDevlink::new(self.request.buf)
16393    }
16394    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16395        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16396        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16397    }
16398    fn write_header<Prev: Rec>(prev: &mut Prev) {
16399        let mut header = BuiltinNfgenmsg::new();
16400        header.cmd = 8u8;
16401        header.version = 1u8;
16402        prev.as_rec_mut().extend(header.as_slice());
16403    }
16404}
16405impl NetlinkRequest for OpPortDelDo<'_> {
16406    fn protocol(&self) -> Protocol {
16407        Protocol::Generic("devlink".as_bytes())
16408    }
16409    fn flags(&self) -> u16 {
16410        self.request.flags
16411    }
16412    fn payload(&self) -> &[u8] {
16413        self.request.buf()
16414    }
16415    type ReplyType<'buf> = IterableDevlink<'buf>;
16416    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16417        Self::decode_request(buf)
16418    }
16419    fn lookup(
16420        buf: &[u8],
16421        offset: usize,
16422        missing_type: Option<u16>,
16423    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16424        Self::decode_request(buf).lookup_attr(offset, missing_type)
16425    }
16426}
16427#[doc = "Split devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_split_count()](PushDevlink::push_port_split_count)\n"]
16428#[derive(Debug)]
16429pub struct OpPortSplitDo<'r> {
16430    request: Request<'r>,
16431}
16432impl<'r> OpPortSplitDo<'r> {
16433    pub fn new(mut request: Request<'r>) -> Self {
16434        Self::write_header(request.buf_mut());
16435        Self { request: request }
16436    }
16437    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16438        Self::write_header(buf);
16439        PushDevlink::new(buf)
16440    }
16441    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16442        PushDevlink::new(self.request.buf_mut())
16443    }
16444    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16445        PushDevlink::new(self.request.buf)
16446    }
16447    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16448        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16449        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16450    }
16451    fn write_header<Prev: Rec>(prev: &mut Prev) {
16452        let mut header = BuiltinNfgenmsg::new();
16453        header.cmd = 9u8;
16454        header.version = 1u8;
16455        prev.as_rec_mut().extend(header.as_slice());
16456    }
16457}
16458impl NetlinkRequest for OpPortSplitDo<'_> {
16459    fn protocol(&self) -> Protocol {
16460        Protocol::Generic("devlink".as_bytes())
16461    }
16462    fn flags(&self) -> u16 {
16463        self.request.flags
16464    }
16465    fn payload(&self) -> &[u8] {
16466        self.request.buf()
16467    }
16468    type ReplyType<'buf> = IterableDevlink<'buf>;
16469    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16470        Self::decode_request(buf)
16471    }
16472    fn lookup(
16473        buf: &[u8],
16474        offset: usize,
16475        missing_type: Option<u16>,
16476    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16477        Self::decode_request(buf).lookup_attr(offset, missing_type)
16478    }
16479}
16480#[doc = "Unplit devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
16481#[derive(Debug)]
16482pub struct OpPortUnsplitDo<'r> {
16483    request: Request<'r>,
16484}
16485impl<'r> OpPortUnsplitDo<'r> {
16486    pub fn new(mut request: Request<'r>) -> Self {
16487        Self::write_header(request.buf_mut());
16488        Self { request: request }
16489    }
16490    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16491        Self::write_header(buf);
16492        PushDevlink::new(buf)
16493    }
16494    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16495        PushDevlink::new(self.request.buf_mut())
16496    }
16497    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16498        PushDevlink::new(self.request.buf)
16499    }
16500    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16501        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16502        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16503    }
16504    fn write_header<Prev: Rec>(prev: &mut Prev) {
16505        let mut header = BuiltinNfgenmsg::new();
16506        header.cmd = 10u8;
16507        header.version = 1u8;
16508        prev.as_rec_mut().extend(header.as_slice());
16509    }
16510}
16511impl NetlinkRequest for OpPortUnsplitDo<'_> {
16512    fn protocol(&self) -> Protocol {
16513        Protocol::Generic("devlink".as_bytes())
16514    }
16515    fn flags(&self) -> u16 {
16516        self.request.flags
16517    }
16518    fn payload(&self) -> &[u8] {
16519        self.request.buf()
16520    }
16521    type ReplyType<'buf> = IterableDevlink<'buf>;
16522    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16523        Self::decode_request(buf)
16524    }
16525    fn lookup(
16526        buf: &[u8],
16527        offset: usize,
16528        missing_type: Option<u16>,
16529    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16530        Self::decode_request(buf).lookup_attr(offset, missing_type)
16531    }
16532}
16533#[doc = "Get shared buffer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n"]
16534#[derive(Debug)]
16535pub struct OpSbGetDump<'r> {
16536    request: Request<'r>,
16537}
16538impl<'r> OpSbGetDump<'r> {
16539    pub fn new(mut request: Request<'r>) -> Self {
16540        Self::write_header(request.buf_mut());
16541        Self {
16542            request: request.set_dump(),
16543        }
16544    }
16545    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16546        Self::write_header(buf);
16547        PushDevlink::new(buf)
16548    }
16549    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16550        PushDevlink::new(self.request.buf_mut())
16551    }
16552    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16553        PushDevlink::new(self.request.buf)
16554    }
16555    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16556        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16557        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16558    }
16559    fn write_header<Prev: Rec>(prev: &mut Prev) {
16560        let mut header = BuiltinNfgenmsg::new();
16561        header.cmd = 11u8;
16562        header.version = 1u8;
16563        prev.as_rec_mut().extend(header.as_slice());
16564    }
16565}
16566impl NetlinkRequest for OpSbGetDump<'_> {
16567    fn protocol(&self) -> Protocol {
16568        Protocol::Generic("devlink".as_bytes())
16569    }
16570    fn flags(&self) -> u16 {
16571        self.request.flags
16572    }
16573    fn payload(&self) -> &[u8] {
16574        self.request.buf()
16575    }
16576    type ReplyType<'buf> = IterableDevlink<'buf>;
16577    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16578        Self::decode_request(buf)
16579    }
16580    fn lookup(
16581        buf: &[u8],
16582        offset: usize,
16583        missing_type: Option<u16>,
16584    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16585        Self::decode_request(buf).lookup_attr(offset, missing_type)
16586    }
16587}
16588#[doc = "Get shared buffer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n"]
16589#[derive(Debug)]
16590pub struct OpSbGetDo<'r> {
16591    request: Request<'r>,
16592}
16593impl<'r> OpSbGetDo<'r> {
16594    pub fn new(mut request: Request<'r>) -> Self {
16595        Self::write_header(request.buf_mut());
16596        Self { request: request }
16597    }
16598    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16599        Self::write_header(buf);
16600        PushDevlink::new(buf)
16601    }
16602    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16603        PushDevlink::new(self.request.buf_mut())
16604    }
16605    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16606        PushDevlink::new(self.request.buf)
16607    }
16608    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16609        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16610        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16611    }
16612    fn write_header<Prev: Rec>(prev: &mut Prev) {
16613        let mut header = BuiltinNfgenmsg::new();
16614        header.cmd = 11u8;
16615        header.version = 1u8;
16616        prev.as_rec_mut().extend(header.as_slice());
16617    }
16618}
16619impl NetlinkRequest for OpSbGetDo<'_> {
16620    fn protocol(&self) -> Protocol {
16621        Protocol::Generic("devlink".as_bytes())
16622    }
16623    fn flags(&self) -> u16 {
16624        self.request.flags
16625    }
16626    fn payload(&self) -> &[u8] {
16627        self.request.buf()
16628    }
16629    type ReplyType<'buf> = IterableDevlink<'buf>;
16630    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16631        Self::decode_request(buf)
16632    }
16633    fn lookup(
16634        buf: &[u8],
16635        offset: usize,
16636        missing_type: Option<u16>,
16637    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16638        Self::decode_request(buf).lookup_attr(offset, missing_type)
16639    }
16640}
16641#[doc = "Get shared buffer pool instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
16642#[derive(Debug)]
16643pub struct OpSbPoolGetDump<'r> {
16644    request: Request<'r>,
16645}
16646impl<'r> OpSbPoolGetDump<'r> {
16647    pub fn new(mut request: Request<'r>) -> Self {
16648        Self::write_header(request.buf_mut());
16649        Self {
16650            request: request.set_dump(),
16651        }
16652    }
16653    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16654        Self::write_header(buf);
16655        PushDevlink::new(buf)
16656    }
16657    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16658        PushDevlink::new(self.request.buf_mut())
16659    }
16660    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16661        PushDevlink::new(self.request.buf)
16662    }
16663    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16664        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16665        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16666    }
16667    fn write_header<Prev: Rec>(prev: &mut Prev) {
16668        let mut header = BuiltinNfgenmsg::new();
16669        header.cmd = 15u8;
16670        header.version = 1u8;
16671        prev.as_rec_mut().extend(header.as_slice());
16672    }
16673}
16674impl NetlinkRequest for OpSbPoolGetDump<'_> {
16675    fn protocol(&self) -> Protocol {
16676        Protocol::Generic("devlink".as_bytes())
16677    }
16678    fn flags(&self) -> u16 {
16679        self.request.flags
16680    }
16681    fn payload(&self) -> &[u8] {
16682        self.request.buf()
16683    }
16684    type ReplyType<'buf> = IterableDevlink<'buf>;
16685    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16686        Self::decode_request(buf)
16687    }
16688    fn lookup(
16689        buf: &[u8],
16690        offset: usize,
16691        missing_type: Option<u16>,
16692    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16693        Self::decode_request(buf).lookup_attr(offset, missing_type)
16694    }
16695}
16696#[doc = "Get shared buffer pool instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
16697#[derive(Debug)]
16698pub struct OpSbPoolGetDo<'r> {
16699    request: Request<'r>,
16700}
16701impl<'r> OpSbPoolGetDo<'r> {
16702    pub fn new(mut request: Request<'r>) -> Self {
16703        Self::write_header(request.buf_mut());
16704        Self { request: request }
16705    }
16706    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16707        Self::write_header(buf);
16708        PushDevlink::new(buf)
16709    }
16710    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16711        PushDevlink::new(self.request.buf_mut())
16712    }
16713    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16714        PushDevlink::new(self.request.buf)
16715    }
16716    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16717        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16718        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16719    }
16720    fn write_header<Prev: Rec>(prev: &mut Prev) {
16721        let mut header = BuiltinNfgenmsg::new();
16722        header.cmd = 15u8;
16723        header.version = 1u8;
16724        prev.as_rec_mut().extend(header.as_slice());
16725    }
16726}
16727impl NetlinkRequest for OpSbPoolGetDo<'_> {
16728    fn protocol(&self) -> Protocol {
16729        Protocol::Generic("devlink".as_bytes())
16730    }
16731    fn flags(&self) -> u16 {
16732        self.request.flags
16733    }
16734    fn payload(&self) -> &[u8] {
16735        self.request.buf()
16736    }
16737    type ReplyType<'buf> = IterableDevlink<'buf>;
16738    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16739        Self::decode_request(buf)
16740    }
16741    fn lookup(
16742        buf: &[u8],
16743        offset: usize,
16744        missing_type: Option<u16>,
16745    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16746        Self::decode_request(buf).lookup_attr(offset, missing_type)
16747    }
16748}
16749#[doc = "Set shared buffer pool instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_pool_size()](PushDevlink::push_sb_pool_size)\n- [.push_sb_pool_threshold_type()](PushDevlink::push_sb_pool_threshold_type)\n"]
16750#[derive(Debug)]
16751pub struct OpSbPoolSetDo<'r> {
16752    request: Request<'r>,
16753}
16754impl<'r> OpSbPoolSetDo<'r> {
16755    pub fn new(mut request: Request<'r>) -> Self {
16756        Self::write_header(request.buf_mut());
16757        Self { request: request }
16758    }
16759    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16760        Self::write_header(buf);
16761        PushDevlink::new(buf)
16762    }
16763    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16764        PushDevlink::new(self.request.buf_mut())
16765    }
16766    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16767        PushDevlink::new(self.request.buf)
16768    }
16769    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16770        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16771        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16772    }
16773    fn write_header<Prev: Rec>(prev: &mut Prev) {
16774        let mut header = BuiltinNfgenmsg::new();
16775        header.cmd = 16u8;
16776        header.version = 1u8;
16777        prev.as_rec_mut().extend(header.as_slice());
16778    }
16779}
16780impl NetlinkRequest for OpSbPoolSetDo<'_> {
16781    fn protocol(&self) -> Protocol {
16782        Protocol::Generic("devlink".as_bytes())
16783    }
16784    fn flags(&self) -> u16 {
16785        self.request.flags
16786    }
16787    fn payload(&self) -> &[u8] {
16788        self.request.buf()
16789    }
16790    type ReplyType<'buf> = IterableDevlink<'buf>;
16791    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16792        Self::decode_request(buf)
16793    }
16794    fn lookup(
16795        buf: &[u8],
16796        offset: usize,
16797        missing_type: Option<u16>,
16798    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16799        Self::decode_request(buf).lookup_attr(offset, missing_type)
16800    }
16801}
16802#[doc = "Get shared buffer port\\-pool combinations and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
16803#[derive(Debug)]
16804pub struct OpSbPortPoolGetDump<'r> {
16805    request: Request<'r>,
16806}
16807impl<'r> OpSbPortPoolGetDump<'r> {
16808    pub fn new(mut request: Request<'r>) -> Self {
16809        Self::write_header(request.buf_mut());
16810        Self {
16811            request: request.set_dump(),
16812        }
16813    }
16814    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16815        Self::write_header(buf);
16816        PushDevlink::new(buf)
16817    }
16818    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16819        PushDevlink::new(self.request.buf_mut())
16820    }
16821    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16822        PushDevlink::new(self.request.buf)
16823    }
16824    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16825        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16826        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16827    }
16828    fn write_header<Prev: Rec>(prev: &mut Prev) {
16829        let mut header = BuiltinNfgenmsg::new();
16830        header.cmd = 19u8;
16831        header.version = 1u8;
16832        prev.as_rec_mut().extend(header.as_slice());
16833    }
16834}
16835impl NetlinkRequest for OpSbPortPoolGetDump<'_> {
16836    fn protocol(&self) -> Protocol {
16837        Protocol::Generic("devlink".as_bytes())
16838    }
16839    fn flags(&self) -> u16 {
16840        self.request.flags
16841    }
16842    fn payload(&self) -> &[u8] {
16843        self.request.buf()
16844    }
16845    type ReplyType<'buf> = IterableDevlink<'buf>;
16846    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16847        Self::decode_request(buf)
16848    }
16849    fn lookup(
16850        buf: &[u8],
16851        offset: usize,
16852        missing_type: Option<u16>,
16853    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16854        Self::decode_request(buf).lookup_attr(offset, missing_type)
16855    }
16856}
16857#[doc = "Get shared buffer port\\-pool combinations and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
16858#[derive(Debug)]
16859pub struct OpSbPortPoolGetDo<'r> {
16860    request: Request<'r>,
16861}
16862impl<'r> OpSbPortPoolGetDo<'r> {
16863    pub fn new(mut request: Request<'r>) -> Self {
16864        Self::write_header(request.buf_mut());
16865        Self { request: request }
16866    }
16867    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16868        Self::write_header(buf);
16869        PushDevlink::new(buf)
16870    }
16871    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16872        PushDevlink::new(self.request.buf_mut())
16873    }
16874    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16875        PushDevlink::new(self.request.buf)
16876    }
16877    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16878        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16879        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16880    }
16881    fn write_header<Prev: Rec>(prev: &mut Prev) {
16882        let mut header = BuiltinNfgenmsg::new();
16883        header.cmd = 19u8;
16884        header.version = 1u8;
16885        prev.as_rec_mut().extend(header.as_slice());
16886    }
16887}
16888impl NetlinkRequest for OpSbPortPoolGetDo<'_> {
16889    fn protocol(&self) -> Protocol {
16890        Protocol::Generic("devlink".as_bytes())
16891    }
16892    fn flags(&self) -> u16 {
16893        self.request.flags
16894    }
16895    fn payload(&self) -> &[u8] {
16896        self.request.buf()
16897    }
16898    type ReplyType<'buf> = IterableDevlink<'buf>;
16899    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16900        Self::decode_request(buf)
16901    }
16902    fn lookup(
16903        buf: &[u8],
16904        offset: usize,
16905        missing_type: Option<u16>,
16906    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16907        Self::decode_request(buf).lookup_attr(offset, missing_type)
16908    }
16909}
16910#[doc = "Set shared buffer port\\-pool combinations and threshold\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_threshold()](PushDevlink::push_sb_threshold)\n"]
16911#[derive(Debug)]
16912pub struct OpSbPortPoolSetDo<'r> {
16913    request: Request<'r>,
16914}
16915impl<'r> OpSbPortPoolSetDo<'r> {
16916    pub fn new(mut request: Request<'r>) -> Self {
16917        Self::write_header(request.buf_mut());
16918        Self { request: request }
16919    }
16920    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16921        Self::write_header(buf);
16922        PushDevlink::new(buf)
16923    }
16924    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16925        PushDevlink::new(self.request.buf_mut())
16926    }
16927    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16928        PushDevlink::new(self.request.buf)
16929    }
16930    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16931        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16932        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16933    }
16934    fn write_header<Prev: Rec>(prev: &mut Prev) {
16935        let mut header = BuiltinNfgenmsg::new();
16936        header.cmd = 20u8;
16937        header.version = 1u8;
16938        prev.as_rec_mut().extend(header.as_slice());
16939    }
16940}
16941impl NetlinkRequest for OpSbPortPoolSetDo<'_> {
16942    fn protocol(&self) -> Protocol {
16943        Protocol::Generic("devlink".as_bytes())
16944    }
16945    fn flags(&self) -> u16 {
16946        self.request.flags
16947    }
16948    fn payload(&self) -> &[u8] {
16949        self.request.buf()
16950    }
16951    type ReplyType<'buf> = IterableDevlink<'buf>;
16952    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16953        Self::decode_request(buf)
16954    }
16955    fn lookup(
16956        buf: &[u8],
16957        offset: usize,
16958        missing_type: Option<u16>,
16959    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16960        Self::decode_request(buf).lookup_attr(offset, missing_type)
16961    }
16962}
16963#[doc = "Get shared buffer port\\-TC to pool bindings and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_type()](IterableDevlink::get_sb_pool_type)\n- [.get_sb_tc_index()](IterableDevlink::get_sb_tc_index)\n"]
16964#[derive(Debug)]
16965pub struct OpSbTcPoolBindGetDump<'r> {
16966    request: Request<'r>,
16967}
16968impl<'r> OpSbTcPoolBindGetDump<'r> {
16969    pub fn new(mut request: Request<'r>) -> Self {
16970        Self::write_header(request.buf_mut());
16971        Self {
16972            request: request.set_dump(),
16973        }
16974    }
16975    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16976        Self::write_header(buf);
16977        PushDevlink::new(buf)
16978    }
16979    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16980        PushDevlink::new(self.request.buf_mut())
16981    }
16982    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16983        PushDevlink::new(self.request.buf)
16984    }
16985    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16986        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16987        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16988    }
16989    fn write_header<Prev: Rec>(prev: &mut Prev) {
16990        let mut header = BuiltinNfgenmsg::new();
16991        header.cmd = 23u8;
16992        header.version = 1u8;
16993        prev.as_rec_mut().extend(header.as_slice());
16994    }
16995}
16996impl NetlinkRequest for OpSbTcPoolBindGetDump<'_> {
16997    fn protocol(&self) -> Protocol {
16998        Protocol::Generic("devlink".as_bytes())
16999    }
17000    fn flags(&self) -> u16 {
17001        self.request.flags
17002    }
17003    fn payload(&self) -> &[u8] {
17004        self.request.buf()
17005    }
17006    type ReplyType<'buf> = IterableDevlink<'buf>;
17007    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17008        Self::decode_request(buf)
17009    }
17010    fn lookup(
17011        buf: &[u8],
17012        offset: usize,
17013        missing_type: Option<u16>,
17014    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17015        Self::decode_request(buf).lookup_attr(offset, missing_type)
17016    }
17017}
17018#[doc = "Get shared buffer port\\-TC to pool bindings and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_type()](PushDevlink::push_sb_pool_type)\n- [.push_sb_tc_index()](PushDevlink::push_sb_tc_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_type()](IterableDevlink::get_sb_pool_type)\n- [.get_sb_tc_index()](IterableDevlink::get_sb_tc_index)\n"]
17019#[derive(Debug)]
17020pub struct OpSbTcPoolBindGetDo<'r> {
17021    request: Request<'r>,
17022}
17023impl<'r> OpSbTcPoolBindGetDo<'r> {
17024    pub fn new(mut request: Request<'r>) -> Self {
17025        Self::write_header(request.buf_mut());
17026        Self { request: request }
17027    }
17028    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17029        Self::write_header(buf);
17030        PushDevlink::new(buf)
17031    }
17032    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17033        PushDevlink::new(self.request.buf_mut())
17034    }
17035    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17036        PushDevlink::new(self.request.buf)
17037    }
17038    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17039        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17040        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17041    }
17042    fn write_header<Prev: Rec>(prev: &mut Prev) {
17043        let mut header = BuiltinNfgenmsg::new();
17044        header.cmd = 23u8;
17045        header.version = 1u8;
17046        prev.as_rec_mut().extend(header.as_slice());
17047    }
17048}
17049impl NetlinkRequest for OpSbTcPoolBindGetDo<'_> {
17050    fn protocol(&self) -> Protocol {
17051        Protocol::Generic("devlink".as_bytes())
17052    }
17053    fn flags(&self) -> u16 {
17054        self.request.flags
17055    }
17056    fn payload(&self) -> &[u8] {
17057        self.request.buf()
17058    }
17059    type ReplyType<'buf> = IterableDevlink<'buf>;
17060    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17061        Self::decode_request(buf)
17062    }
17063    fn lookup(
17064        buf: &[u8],
17065        offset: usize,
17066        missing_type: Option<u16>,
17067    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17068        Self::decode_request(buf).lookup_attr(offset, missing_type)
17069    }
17070}
17071#[doc = "Set shared buffer port\\-TC to pool bindings and threshold\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_pool_type()](PushDevlink::push_sb_pool_type)\n- [.push_sb_threshold()](PushDevlink::push_sb_threshold)\n- [.push_sb_tc_index()](PushDevlink::push_sb_tc_index)\n"]
17072#[derive(Debug)]
17073pub struct OpSbTcPoolBindSetDo<'r> {
17074    request: Request<'r>,
17075}
17076impl<'r> OpSbTcPoolBindSetDo<'r> {
17077    pub fn new(mut request: Request<'r>) -> Self {
17078        Self::write_header(request.buf_mut());
17079        Self { request: request }
17080    }
17081    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17082        Self::write_header(buf);
17083        PushDevlink::new(buf)
17084    }
17085    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17086        PushDevlink::new(self.request.buf_mut())
17087    }
17088    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17089        PushDevlink::new(self.request.buf)
17090    }
17091    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17092        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17093        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17094    }
17095    fn write_header<Prev: Rec>(prev: &mut Prev) {
17096        let mut header = BuiltinNfgenmsg::new();
17097        header.cmd = 24u8;
17098        header.version = 1u8;
17099        prev.as_rec_mut().extend(header.as_slice());
17100    }
17101}
17102impl NetlinkRequest for OpSbTcPoolBindSetDo<'_> {
17103    fn protocol(&self) -> Protocol {
17104        Protocol::Generic("devlink".as_bytes())
17105    }
17106    fn flags(&self) -> u16 {
17107        self.request.flags
17108    }
17109    fn payload(&self) -> &[u8] {
17110        self.request.buf()
17111    }
17112    type ReplyType<'buf> = IterableDevlink<'buf>;
17113    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17114        Self::decode_request(buf)
17115    }
17116    fn lookup(
17117        buf: &[u8],
17118        offset: usize,
17119        missing_type: Option<u16>,
17120    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17121        Self::decode_request(buf).lookup_attr(offset, missing_type)
17122    }
17123}
17124#[doc = "Take occupancy snapshot of shared buffer\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n"]
17125#[derive(Debug)]
17126pub struct OpSbOccSnapshotDo<'r> {
17127    request: Request<'r>,
17128}
17129impl<'r> OpSbOccSnapshotDo<'r> {
17130    pub fn new(mut request: Request<'r>) -> Self {
17131        Self::write_header(request.buf_mut());
17132        Self { request: request }
17133    }
17134    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17135        Self::write_header(buf);
17136        PushDevlink::new(buf)
17137    }
17138    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17139        PushDevlink::new(self.request.buf_mut())
17140    }
17141    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17142        PushDevlink::new(self.request.buf)
17143    }
17144    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17145        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17146        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17147    }
17148    fn write_header<Prev: Rec>(prev: &mut Prev) {
17149        let mut header = BuiltinNfgenmsg::new();
17150        header.cmd = 27u8;
17151        header.version = 1u8;
17152        prev.as_rec_mut().extend(header.as_slice());
17153    }
17154}
17155impl NetlinkRequest for OpSbOccSnapshotDo<'_> {
17156    fn protocol(&self) -> Protocol {
17157        Protocol::Generic("devlink".as_bytes())
17158    }
17159    fn flags(&self) -> u16 {
17160        self.request.flags
17161    }
17162    fn payload(&self) -> &[u8] {
17163        self.request.buf()
17164    }
17165    type ReplyType<'buf> = IterableDevlink<'buf>;
17166    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17167        Self::decode_request(buf)
17168    }
17169    fn lookup(
17170        buf: &[u8],
17171        offset: usize,
17172        missing_type: Option<u16>,
17173    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17174        Self::decode_request(buf).lookup_attr(offset, missing_type)
17175    }
17176}
17177#[doc = "Clear occupancy watermarks of shared buffer\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n"]
17178#[derive(Debug)]
17179pub struct OpSbOccMaxClearDo<'r> {
17180    request: Request<'r>,
17181}
17182impl<'r> OpSbOccMaxClearDo<'r> {
17183    pub fn new(mut request: Request<'r>) -> Self {
17184        Self::write_header(request.buf_mut());
17185        Self { request: request }
17186    }
17187    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17188        Self::write_header(buf);
17189        PushDevlink::new(buf)
17190    }
17191    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17192        PushDevlink::new(self.request.buf_mut())
17193    }
17194    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17195        PushDevlink::new(self.request.buf)
17196    }
17197    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17198        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17199        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17200    }
17201    fn write_header<Prev: Rec>(prev: &mut Prev) {
17202        let mut header = BuiltinNfgenmsg::new();
17203        header.cmd = 28u8;
17204        header.version = 1u8;
17205        prev.as_rec_mut().extend(header.as_slice());
17206    }
17207}
17208impl NetlinkRequest for OpSbOccMaxClearDo<'_> {
17209    fn protocol(&self) -> Protocol {
17210        Protocol::Generic("devlink".as_bytes())
17211    }
17212    fn flags(&self) -> u16 {
17213        self.request.flags
17214    }
17215    fn payload(&self) -> &[u8] {
17216        self.request.buf()
17217    }
17218    type ReplyType<'buf> = IterableDevlink<'buf>;
17219    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17220        Self::decode_request(buf)
17221    }
17222    fn lookup(
17223        buf: &[u8],
17224        offset: usize,
17225        missing_type: Option<u16>,
17226    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17227        Self::decode_request(buf).lookup_attr(offset, missing_type)
17228    }
17229}
17230#[doc = "Get eswitch attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_eswitch_mode()](IterableDevlink::get_eswitch_mode)\n- [.get_eswitch_inline_mode()](IterableDevlink::get_eswitch_inline_mode)\n- [.get_eswitch_encap_mode()](IterableDevlink::get_eswitch_encap_mode)\n"]
17231#[derive(Debug)]
17232pub struct OpEswitchGetDo<'r> {
17233    request: Request<'r>,
17234}
17235impl<'r> OpEswitchGetDo<'r> {
17236    pub fn new(mut request: Request<'r>) -> Self {
17237        Self::write_header(request.buf_mut());
17238        Self { request: request }
17239    }
17240    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17241        Self::write_header(buf);
17242        PushDevlink::new(buf)
17243    }
17244    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17245        PushDevlink::new(self.request.buf_mut())
17246    }
17247    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17248        PushDevlink::new(self.request.buf)
17249    }
17250    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17251        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17252        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17253    }
17254    fn write_header<Prev: Rec>(prev: &mut Prev) {
17255        let mut header = BuiltinNfgenmsg::new();
17256        header.cmd = 29u8;
17257        header.version = 1u8;
17258        prev.as_rec_mut().extend(header.as_slice());
17259    }
17260}
17261impl NetlinkRequest for OpEswitchGetDo<'_> {
17262    fn protocol(&self) -> Protocol {
17263        Protocol::Generic("devlink".as_bytes())
17264    }
17265    fn flags(&self) -> u16 {
17266        self.request.flags
17267    }
17268    fn payload(&self) -> &[u8] {
17269        self.request.buf()
17270    }
17271    type ReplyType<'buf> = IterableDevlink<'buf>;
17272    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17273        Self::decode_request(buf)
17274    }
17275    fn lookup(
17276        buf: &[u8],
17277        offset: usize,
17278        missing_type: Option<u16>,
17279    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17280        Self::decode_request(buf).lookup_attr(offset, missing_type)
17281    }
17282}
17283#[doc = "Set eswitch attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_eswitch_mode()](PushDevlink::push_eswitch_mode)\n- [.push_eswitch_inline_mode()](PushDevlink::push_eswitch_inline_mode)\n- [.push_eswitch_encap_mode()](PushDevlink::push_eswitch_encap_mode)\n"]
17284#[derive(Debug)]
17285pub struct OpEswitchSetDo<'r> {
17286    request: Request<'r>,
17287}
17288impl<'r> OpEswitchSetDo<'r> {
17289    pub fn new(mut request: Request<'r>) -> Self {
17290        Self::write_header(request.buf_mut());
17291        Self { request: request }
17292    }
17293    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17294        Self::write_header(buf);
17295        PushDevlink::new(buf)
17296    }
17297    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17298        PushDevlink::new(self.request.buf_mut())
17299    }
17300    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17301        PushDevlink::new(self.request.buf)
17302    }
17303    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17304        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17305        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17306    }
17307    fn write_header<Prev: Rec>(prev: &mut Prev) {
17308        let mut header = BuiltinNfgenmsg::new();
17309        header.cmd = 30u8;
17310        header.version = 1u8;
17311        prev.as_rec_mut().extend(header.as_slice());
17312    }
17313}
17314impl NetlinkRequest for OpEswitchSetDo<'_> {
17315    fn protocol(&self) -> Protocol {
17316        Protocol::Generic("devlink".as_bytes())
17317    }
17318    fn flags(&self) -> u16 {
17319        self.request.flags
17320    }
17321    fn payload(&self) -> &[u8] {
17322        self.request.buf()
17323    }
17324    type ReplyType<'buf> = IterableDevlink<'buf>;
17325    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17326        Self::decode_request(buf)
17327    }
17328    fn lookup(
17329        buf: &[u8],
17330        offset: usize,
17331        missing_type: Option<u16>,
17332    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17333        Self::decode_request(buf).lookup_attr(offset, missing_type)
17334    }
17335}
17336#[doc = "Get dpipe table attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_tables()](IterableDevlink::get_dpipe_tables)\n"]
17337#[derive(Debug)]
17338pub struct OpDpipeTableGetDo<'r> {
17339    request: Request<'r>,
17340}
17341impl<'r> OpDpipeTableGetDo<'r> {
17342    pub fn new(mut request: Request<'r>) -> Self {
17343        Self::write_header(request.buf_mut());
17344        Self { request: request }
17345    }
17346    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17347        Self::write_header(buf);
17348        PushDevlink::new(buf)
17349    }
17350    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17351        PushDevlink::new(self.request.buf_mut())
17352    }
17353    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17354        PushDevlink::new(self.request.buf)
17355    }
17356    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17357        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17358        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17359    }
17360    fn write_header<Prev: Rec>(prev: &mut Prev) {
17361        let mut header = BuiltinNfgenmsg::new();
17362        header.cmd = 31u8;
17363        header.version = 1u8;
17364        prev.as_rec_mut().extend(header.as_slice());
17365    }
17366}
17367impl NetlinkRequest for OpDpipeTableGetDo<'_> {
17368    fn protocol(&self) -> Protocol {
17369        Protocol::Generic("devlink".as_bytes())
17370    }
17371    fn flags(&self) -> u16 {
17372        self.request.flags
17373    }
17374    fn payload(&self) -> &[u8] {
17375        self.request.buf()
17376    }
17377    type ReplyType<'buf> = IterableDevlink<'buf>;
17378    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17379        Self::decode_request(buf)
17380    }
17381    fn lookup(
17382        buf: &[u8],
17383        offset: usize,
17384        missing_type: Option<u16>,
17385    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17386        Self::decode_request(buf).lookup_attr(offset, missing_type)
17387    }
17388}
17389#[doc = "Get dpipe entries attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_entries()](IterableDevlink::get_dpipe_entries)\n"]
17390#[derive(Debug)]
17391pub struct OpDpipeEntriesGetDo<'r> {
17392    request: Request<'r>,
17393}
17394impl<'r> OpDpipeEntriesGetDo<'r> {
17395    pub fn new(mut request: Request<'r>) -> Self {
17396        Self::write_header(request.buf_mut());
17397        Self { request: request }
17398    }
17399    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17400        Self::write_header(buf);
17401        PushDevlink::new(buf)
17402    }
17403    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17404        PushDevlink::new(self.request.buf_mut())
17405    }
17406    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17407        PushDevlink::new(self.request.buf)
17408    }
17409    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17410        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17411        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17412    }
17413    fn write_header<Prev: Rec>(prev: &mut Prev) {
17414        let mut header = BuiltinNfgenmsg::new();
17415        header.cmd = 32u8;
17416        header.version = 1u8;
17417        prev.as_rec_mut().extend(header.as_slice());
17418    }
17419}
17420impl NetlinkRequest for OpDpipeEntriesGetDo<'_> {
17421    fn protocol(&self) -> Protocol {
17422        Protocol::Generic("devlink".as_bytes())
17423    }
17424    fn flags(&self) -> u16 {
17425        self.request.flags
17426    }
17427    fn payload(&self) -> &[u8] {
17428        self.request.buf()
17429    }
17430    type ReplyType<'buf> = IterableDevlink<'buf>;
17431    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17432        Self::decode_request(buf)
17433    }
17434    fn lookup(
17435        buf: &[u8],
17436        offset: usize,
17437        missing_type: Option<u16>,
17438    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17439        Self::decode_request(buf).lookup_attr(offset, missing_type)
17440    }
17441}
17442#[doc = "Get dpipe headers attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_headers()](IterableDevlink::get_dpipe_headers)\n"]
17443#[derive(Debug)]
17444pub struct OpDpipeHeadersGetDo<'r> {
17445    request: Request<'r>,
17446}
17447impl<'r> OpDpipeHeadersGetDo<'r> {
17448    pub fn new(mut request: Request<'r>) -> Self {
17449        Self::write_header(request.buf_mut());
17450        Self { request: request }
17451    }
17452    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17453        Self::write_header(buf);
17454        PushDevlink::new(buf)
17455    }
17456    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17457        PushDevlink::new(self.request.buf_mut())
17458    }
17459    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17460        PushDevlink::new(self.request.buf)
17461    }
17462    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17463        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17464        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17465    }
17466    fn write_header<Prev: Rec>(prev: &mut Prev) {
17467        let mut header = BuiltinNfgenmsg::new();
17468        header.cmd = 33u8;
17469        header.version = 1u8;
17470        prev.as_rec_mut().extend(header.as_slice());
17471    }
17472}
17473impl NetlinkRequest for OpDpipeHeadersGetDo<'_> {
17474    fn protocol(&self) -> Protocol {
17475        Protocol::Generic("devlink".as_bytes())
17476    }
17477    fn flags(&self) -> u16 {
17478        self.request.flags
17479    }
17480    fn payload(&self) -> &[u8] {
17481        self.request.buf()
17482    }
17483    type ReplyType<'buf> = IterableDevlink<'buf>;
17484    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17485        Self::decode_request(buf)
17486    }
17487    fn lookup(
17488        buf: &[u8],
17489        offset: usize,
17490        missing_type: Option<u16>,
17491    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17492        Self::decode_request(buf).lookup_attr(offset, missing_type)
17493    }
17494}
17495#[doc = "Set dpipe counter attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n- [.push_dpipe_table_counters_enabled()](PushDevlink::push_dpipe_table_counters_enabled)\n"]
17496#[derive(Debug)]
17497pub struct OpDpipeTableCountersSetDo<'r> {
17498    request: Request<'r>,
17499}
17500impl<'r> OpDpipeTableCountersSetDo<'r> {
17501    pub fn new(mut request: Request<'r>) -> Self {
17502        Self::write_header(request.buf_mut());
17503        Self { request: request }
17504    }
17505    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17506        Self::write_header(buf);
17507        PushDevlink::new(buf)
17508    }
17509    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17510        PushDevlink::new(self.request.buf_mut())
17511    }
17512    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17513        PushDevlink::new(self.request.buf)
17514    }
17515    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17516        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17517        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17518    }
17519    fn write_header<Prev: Rec>(prev: &mut Prev) {
17520        let mut header = BuiltinNfgenmsg::new();
17521        header.cmd = 34u8;
17522        header.version = 1u8;
17523        prev.as_rec_mut().extend(header.as_slice());
17524    }
17525}
17526impl NetlinkRequest for OpDpipeTableCountersSetDo<'_> {
17527    fn protocol(&self) -> Protocol {
17528        Protocol::Generic("devlink".as_bytes())
17529    }
17530    fn flags(&self) -> u16 {
17531        self.request.flags
17532    }
17533    fn payload(&self) -> &[u8] {
17534        self.request.buf()
17535    }
17536    type ReplyType<'buf> = IterableDevlink<'buf>;
17537    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17538        Self::decode_request(buf)
17539    }
17540    fn lookup(
17541        buf: &[u8],
17542        offset: usize,
17543        missing_type: Option<u16>,
17544    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17545        Self::decode_request(buf).lookup_attr(offset, missing_type)
17546    }
17547}
17548#[doc = "Set resource attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_resource_id()](PushDevlink::push_resource_id)\n- [.push_resource_size()](PushDevlink::push_resource_size)\n"]
17549#[derive(Debug)]
17550pub struct OpResourceSetDo<'r> {
17551    request: Request<'r>,
17552}
17553impl<'r> OpResourceSetDo<'r> {
17554    pub fn new(mut request: Request<'r>) -> Self {
17555        Self::write_header(request.buf_mut());
17556        Self { request: request }
17557    }
17558    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17559        Self::write_header(buf);
17560        PushDevlink::new(buf)
17561    }
17562    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17563        PushDevlink::new(self.request.buf_mut())
17564    }
17565    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17566        PushDevlink::new(self.request.buf)
17567    }
17568    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17569        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17570        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17571    }
17572    fn write_header<Prev: Rec>(prev: &mut Prev) {
17573        let mut header = BuiltinNfgenmsg::new();
17574        header.cmd = 35u8;
17575        header.version = 1u8;
17576        prev.as_rec_mut().extend(header.as_slice());
17577    }
17578}
17579impl NetlinkRequest for OpResourceSetDo<'_> {
17580    fn protocol(&self) -> Protocol {
17581        Protocol::Generic("devlink".as_bytes())
17582    }
17583    fn flags(&self) -> u16 {
17584        self.request.flags
17585    }
17586    fn payload(&self) -> &[u8] {
17587        self.request.buf()
17588    }
17589    type ReplyType<'buf> = IterableDevlink<'buf>;
17590    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17591        Self::decode_request(buf)
17592    }
17593    fn lookup(
17594        buf: &[u8],
17595        offset: usize,
17596        missing_type: Option<u16>,
17597    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17598        Self::decode_request(buf).lookup_attr(offset, missing_type)
17599    }
17600}
17601#[doc = "Get resource attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_resource_list()](IterableDevlink::get_resource_list)\n"]
17602#[derive(Debug)]
17603pub struct OpResourceDumpDo<'r> {
17604    request: Request<'r>,
17605}
17606impl<'r> OpResourceDumpDo<'r> {
17607    pub fn new(mut request: Request<'r>) -> Self {
17608        Self::write_header(request.buf_mut());
17609        Self { request: request }
17610    }
17611    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17612        Self::write_header(buf);
17613        PushDevlink::new(buf)
17614    }
17615    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17616        PushDevlink::new(self.request.buf_mut())
17617    }
17618    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17619        PushDevlink::new(self.request.buf)
17620    }
17621    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17622        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17623        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17624    }
17625    fn write_header<Prev: Rec>(prev: &mut Prev) {
17626        let mut header = BuiltinNfgenmsg::new();
17627        header.cmd = 36u8;
17628        header.version = 1u8;
17629        prev.as_rec_mut().extend(header.as_slice());
17630    }
17631}
17632impl NetlinkRequest for OpResourceDumpDo<'_> {
17633    fn protocol(&self) -> Protocol {
17634        Protocol::Generic("devlink".as_bytes())
17635    }
17636    fn flags(&self) -> u16 {
17637        self.request.flags
17638    }
17639    fn payload(&self) -> &[u8] {
17640        self.request.buf()
17641    }
17642    type ReplyType<'buf> = IterableDevlink<'buf>;
17643    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17644        Self::decode_request(buf)
17645    }
17646    fn lookup(
17647        buf: &[u8],
17648        offset: usize,
17649        missing_type: Option<u16>,
17650    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17651        Self::decode_request(buf).lookup_attr(offset, missing_type)
17652    }
17653}
17654#[doc = "Reload devlink\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_netns_fd()](PushDevlink::push_netns_fd)\n- [.push_netns_pid()](PushDevlink::push_netns_pid)\n- [.push_netns_id()](PushDevlink::push_netns_id)\n- [.push_reload_action()](PushDevlink::push_reload_action)\n- [.push_reload_limits()](PushDevlink::push_reload_limits)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_actions_performed()](IterableDevlink::get_reload_actions_performed)\n"]
17655#[derive(Debug)]
17656pub struct OpReloadDo<'r> {
17657    request: Request<'r>,
17658}
17659impl<'r> OpReloadDo<'r> {
17660    pub fn new(mut request: Request<'r>) -> Self {
17661        Self::write_header(request.buf_mut());
17662        Self { request: request }
17663    }
17664    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17665        Self::write_header(buf);
17666        PushDevlink::new(buf)
17667    }
17668    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17669        PushDevlink::new(self.request.buf_mut())
17670    }
17671    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17672        PushDevlink::new(self.request.buf)
17673    }
17674    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17675        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17676        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17677    }
17678    fn write_header<Prev: Rec>(prev: &mut Prev) {
17679        let mut header = BuiltinNfgenmsg::new();
17680        header.cmd = 37u8;
17681        header.version = 1u8;
17682        prev.as_rec_mut().extend(header.as_slice());
17683    }
17684}
17685impl NetlinkRequest for OpReloadDo<'_> {
17686    fn protocol(&self) -> Protocol {
17687        Protocol::Generic("devlink".as_bytes())
17688    }
17689    fn flags(&self) -> u16 {
17690        self.request.flags
17691    }
17692    fn payload(&self) -> &[u8] {
17693        self.request.buf()
17694    }
17695    type ReplyType<'buf> = IterableDevlink<'buf>;
17696    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17697        Self::decode_request(buf)
17698    }
17699    fn lookup(
17700        buf: &[u8],
17701        offset: usize,
17702        missing_type: Option<u16>,
17703    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17704        Self::decode_request(buf).lookup_attr(offset, missing_type)
17705    }
17706}
17707#[doc = "Get param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_param_name()](IterableDevlink::get_param_name)\n"]
17708#[derive(Debug)]
17709pub struct OpParamGetDump<'r> {
17710    request: Request<'r>,
17711}
17712impl<'r> OpParamGetDump<'r> {
17713    pub fn new(mut request: Request<'r>) -> Self {
17714        Self::write_header(request.buf_mut());
17715        Self {
17716            request: request.set_dump(),
17717        }
17718    }
17719    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17720        Self::write_header(buf);
17721        PushDevlink::new(buf)
17722    }
17723    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17724        PushDevlink::new(self.request.buf_mut())
17725    }
17726    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17727        PushDevlink::new(self.request.buf)
17728    }
17729    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17730        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17731        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17732    }
17733    fn write_header<Prev: Rec>(prev: &mut Prev) {
17734        let mut header = BuiltinNfgenmsg::new();
17735        header.cmd = 38u8;
17736        header.version = 1u8;
17737        prev.as_rec_mut().extend(header.as_slice());
17738    }
17739}
17740impl NetlinkRequest for OpParamGetDump<'_> {
17741    fn protocol(&self) -> Protocol {
17742        Protocol::Generic("devlink".as_bytes())
17743    }
17744    fn flags(&self) -> u16 {
17745        self.request.flags
17746    }
17747    fn payload(&self) -> &[u8] {
17748        self.request.buf()
17749    }
17750    type ReplyType<'buf> = IterableDevlink<'buf>;
17751    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17752        Self::decode_request(buf)
17753    }
17754    fn lookup(
17755        buf: &[u8],
17756        offset: usize,
17757        missing_type: Option<u16>,
17758    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17759        Self::decode_request(buf).lookup_attr(offset, missing_type)
17760    }
17761}
17762#[doc = "Get param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_param_name()](PushDevlink::push_param_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_param_name()](IterableDevlink::get_param_name)\n"]
17763#[derive(Debug)]
17764pub struct OpParamGetDo<'r> {
17765    request: Request<'r>,
17766}
17767impl<'r> OpParamGetDo<'r> {
17768    pub fn new(mut request: Request<'r>) -> Self {
17769        Self::write_header(request.buf_mut());
17770        Self { request: request }
17771    }
17772    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17773        Self::write_header(buf);
17774        PushDevlink::new(buf)
17775    }
17776    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17777        PushDevlink::new(self.request.buf_mut())
17778    }
17779    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17780        PushDevlink::new(self.request.buf)
17781    }
17782    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17783        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17784        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17785    }
17786    fn write_header<Prev: Rec>(prev: &mut Prev) {
17787        let mut header = BuiltinNfgenmsg::new();
17788        header.cmd = 38u8;
17789        header.version = 1u8;
17790        prev.as_rec_mut().extend(header.as_slice());
17791    }
17792}
17793impl NetlinkRequest for OpParamGetDo<'_> {
17794    fn protocol(&self) -> Protocol {
17795        Protocol::Generic("devlink".as_bytes())
17796    }
17797    fn flags(&self) -> u16 {
17798        self.request.flags
17799    }
17800    fn payload(&self) -> &[u8] {
17801        self.request.buf()
17802    }
17803    type ReplyType<'buf> = IterableDevlink<'buf>;
17804    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17805        Self::decode_request(buf)
17806    }
17807    fn lookup(
17808        buf: &[u8],
17809        offset: usize,
17810        missing_type: Option<u16>,
17811    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17812        Self::decode_request(buf).lookup_attr(offset, missing_type)
17813    }
17814}
17815#[doc = "Set param instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_param_name()](PushDevlink::push_param_name)\n- [.push_param_type()](PushDevlink::push_param_type)\n- [.push_param_value_cmode()](PushDevlink::push_param_value_cmode)\n- [.push_param_reset_default()](PushDevlink::push_param_reset_default)\n"]
17816#[derive(Debug)]
17817pub struct OpParamSetDo<'r> {
17818    request: Request<'r>,
17819}
17820impl<'r> OpParamSetDo<'r> {
17821    pub fn new(mut request: Request<'r>) -> Self {
17822        Self::write_header(request.buf_mut());
17823        Self { request: request }
17824    }
17825    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17826        Self::write_header(buf);
17827        PushDevlink::new(buf)
17828    }
17829    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17830        PushDevlink::new(self.request.buf_mut())
17831    }
17832    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17833        PushDevlink::new(self.request.buf)
17834    }
17835    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17836        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17837        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17838    }
17839    fn write_header<Prev: Rec>(prev: &mut Prev) {
17840        let mut header = BuiltinNfgenmsg::new();
17841        header.cmd = 39u8;
17842        header.version = 1u8;
17843        prev.as_rec_mut().extend(header.as_slice());
17844    }
17845}
17846impl NetlinkRequest for OpParamSetDo<'_> {
17847    fn protocol(&self) -> Protocol {
17848        Protocol::Generic("devlink".as_bytes())
17849    }
17850    fn flags(&self) -> u16 {
17851        self.request.flags
17852    }
17853    fn payload(&self) -> &[u8] {
17854        self.request.buf()
17855    }
17856    type ReplyType<'buf> = IterableDevlink<'buf>;
17857    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17858        Self::decode_request(buf)
17859    }
17860    fn lookup(
17861        buf: &[u8],
17862        offset: usize,
17863        missing_type: Option<u16>,
17864    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17865        Self::decode_request(buf).lookup_attr(offset, missing_type)
17866    }
17867}
17868#[doc = "Get region instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
17869#[derive(Debug)]
17870pub struct OpRegionGetDump<'r> {
17871    request: Request<'r>,
17872}
17873impl<'r> OpRegionGetDump<'r> {
17874    pub fn new(mut request: Request<'r>) -> Self {
17875        Self::write_header(request.buf_mut());
17876        Self {
17877            request: request.set_dump(),
17878        }
17879    }
17880    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17881        Self::write_header(buf);
17882        PushDevlink::new(buf)
17883    }
17884    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17885        PushDevlink::new(self.request.buf_mut())
17886    }
17887    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17888        PushDevlink::new(self.request.buf)
17889    }
17890    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17891        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17892        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17893    }
17894    fn write_header<Prev: Rec>(prev: &mut Prev) {
17895        let mut header = BuiltinNfgenmsg::new();
17896        header.cmd = 42u8;
17897        header.version = 1u8;
17898        prev.as_rec_mut().extend(header.as_slice());
17899    }
17900}
17901impl NetlinkRequest for OpRegionGetDump<'_> {
17902    fn protocol(&self) -> Protocol {
17903        Protocol::Generic("devlink".as_bytes())
17904    }
17905    fn flags(&self) -> u16 {
17906        self.request.flags
17907    }
17908    fn payload(&self) -> &[u8] {
17909        self.request.buf()
17910    }
17911    type ReplyType<'buf> = IterableDevlink<'buf>;
17912    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17913        Self::decode_request(buf)
17914    }
17915    fn lookup(
17916        buf: &[u8],
17917        offset: usize,
17918        missing_type: Option<u16>,
17919    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17920        Self::decode_request(buf).lookup_attr(offset, missing_type)
17921    }
17922}
17923#[doc = "Get region instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
17924#[derive(Debug)]
17925pub struct OpRegionGetDo<'r> {
17926    request: Request<'r>,
17927}
17928impl<'r> OpRegionGetDo<'r> {
17929    pub fn new(mut request: Request<'r>) -> Self {
17930        Self::write_header(request.buf_mut());
17931        Self { request: request }
17932    }
17933    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17934        Self::write_header(buf);
17935        PushDevlink::new(buf)
17936    }
17937    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17938        PushDevlink::new(self.request.buf_mut())
17939    }
17940    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17941        PushDevlink::new(self.request.buf)
17942    }
17943    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17944        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17945        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17946    }
17947    fn write_header<Prev: Rec>(prev: &mut Prev) {
17948        let mut header = BuiltinNfgenmsg::new();
17949        header.cmd = 42u8;
17950        header.version = 1u8;
17951        prev.as_rec_mut().extend(header.as_slice());
17952    }
17953}
17954impl NetlinkRequest for OpRegionGetDo<'_> {
17955    fn protocol(&self) -> Protocol {
17956        Protocol::Generic("devlink".as_bytes())
17957    }
17958    fn flags(&self) -> u16 {
17959        self.request.flags
17960    }
17961    fn payload(&self) -> &[u8] {
17962        self.request.buf()
17963    }
17964    type ReplyType<'buf> = IterableDevlink<'buf>;
17965    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17966        Self::decode_request(buf)
17967    }
17968    fn lookup(
17969        buf: &[u8],
17970        offset: usize,
17971        missing_type: Option<u16>,
17972    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17973        Self::decode_request(buf).lookup_attr(offset, missing_type)
17974    }
17975}
17976#[doc = "Create region snapshot\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n- [.get_region_snapshot_id()](IterableDevlink::get_region_snapshot_id)\n"]
17977#[derive(Debug)]
17978pub struct OpRegionNewDo<'r> {
17979    request: Request<'r>,
17980}
17981impl<'r> OpRegionNewDo<'r> {
17982    pub fn new(mut request: Request<'r>) -> Self {
17983        Self::write_header(request.buf_mut());
17984        Self { request: request }
17985    }
17986    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17987        Self::write_header(buf);
17988        PushDevlink::new(buf)
17989    }
17990    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17991        PushDevlink::new(self.request.buf_mut())
17992    }
17993    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17994        PushDevlink::new(self.request.buf)
17995    }
17996    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17997        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17998        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17999    }
18000    fn write_header<Prev: Rec>(prev: &mut Prev) {
18001        let mut header = BuiltinNfgenmsg::new();
18002        header.cmd = 44u8;
18003        header.version = 1u8;
18004        prev.as_rec_mut().extend(header.as_slice());
18005    }
18006}
18007impl NetlinkRequest for OpRegionNewDo<'_> {
18008    fn protocol(&self) -> Protocol {
18009        Protocol::Generic("devlink".as_bytes())
18010    }
18011    fn flags(&self) -> u16 {
18012        self.request.flags
18013    }
18014    fn payload(&self) -> &[u8] {
18015        self.request.buf()
18016    }
18017    type ReplyType<'buf> = IterableDevlink<'buf>;
18018    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18019        Self::decode_request(buf)
18020    }
18021    fn lookup(
18022        buf: &[u8],
18023        offset: usize,
18024        missing_type: Option<u16>,
18025    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18026        Self::decode_request(buf).lookup_attr(offset, missing_type)
18027    }
18028}
18029#[doc = "Delete region snapshot\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n"]
18030#[derive(Debug)]
18031pub struct OpRegionDelDo<'r> {
18032    request: Request<'r>,
18033}
18034impl<'r> OpRegionDelDo<'r> {
18035    pub fn new(mut request: Request<'r>) -> Self {
18036        Self::write_header(request.buf_mut());
18037        Self { request: request }
18038    }
18039    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18040        Self::write_header(buf);
18041        PushDevlink::new(buf)
18042    }
18043    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18044        PushDevlink::new(self.request.buf_mut())
18045    }
18046    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18047        PushDevlink::new(self.request.buf)
18048    }
18049    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18050        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18051        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18052    }
18053    fn write_header<Prev: Rec>(prev: &mut Prev) {
18054        let mut header = BuiltinNfgenmsg::new();
18055        header.cmd = 45u8;
18056        header.version = 1u8;
18057        prev.as_rec_mut().extend(header.as_slice());
18058    }
18059}
18060impl NetlinkRequest for OpRegionDelDo<'_> {
18061    fn protocol(&self) -> Protocol {
18062        Protocol::Generic("devlink".as_bytes())
18063    }
18064    fn flags(&self) -> u16 {
18065        self.request.flags
18066    }
18067    fn payload(&self) -> &[u8] {
18068        self.request.buf()
18069    }
18070    type ReplyType<'buf> = IterableDevlink<'buf>;
18071    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18072        Self::decode_request(buf)
18073    }
18074    fn lookup(
18075        buf: &[u8],
18076        offset: usize,
18077        missing_type: Option<u16>,
18078    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18079        Self::decode_request(buf).lookup_attr(offset, missing_type)
18080    }
18081}
18082#[doc = "Read region data\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n- [.push_region_chunk_addr()](PushDevlink::push_region_chunk_addr)\n- [.push_region_chunk_len()](PushDevlink::push_region_chunk_len)\n- [.push_region_direct()](PushDevlink::push_region_direct)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
18083#[derive(Debug)]
18084pub struct OpRegionReadDump<'r> {
18085    request: Request<'r>,
18086}
18087impl<'r> OpRegionReadDump<'r> {
18088    pub fn new(mut request: Request<'r>) -> Self {
18089        Self::write_header(request.buf_mut());
18090        Self {
18091            request: request.set_dump(),
18092        }
18093    }
18094    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18095        Self::write_header(buf);
18096        PushDevlink::new(buf)
18097    }
18098    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18099        PushDevlink::new(self.request.buf_mut())
18100    }
18101    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18102        PushDevlink::new(self.request.buf)
18103    }
18104    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18105        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18106        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18107    }
18108    fn write_header<Prev: Rec>(prev: &mut Prev) {
18109        let mut header = BuiltinNfgenmsg::new();
18110        header.cmd = 46u8;
18111        header.version = 1u8;
18112        prev.as_rec_mut().extend(header.as_slice());
18113    }
18114}
18115impl NetlinkRequest for OpRegionReadDump<'_> {
18116    fn protocol(&self) -> Protocol {
18117        Protocol::Generic("devlink".as_bytes())
18118    }
18119    fn flags(&self) -> u16 {
18120        self.request.flags
18121    }
18122    fn payload(&self) -> &[u8] {
18123        self.request.buf()
18124    }
18125    type ReplyType<'buf> = IterableDevlink<'buf>;
18126    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18127        Self::decode_request(buf)
18128    }
18129    fn lookup(
18130        buf: &[u8],
18131        offset: usize,
18132        missing_type: Option<u16>,
18133    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18134        Self::decode_request(buf).lookup_attr(offset, missing_type)
18135    }
18136}
18137#[doc = "Get port param instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
18138#[derive(Debug)]
18139pub struct OpPortParamGetDump<'r> {
18140    request: Request<'r>,
18141}
18142impl<'r> OpPortParamGetDump<'r> {
18143    pub fn new(mut request: Request<'r>) -> Self {
18144        Self::write_header(request.buf_mut());
18145        Self {
18146            request: request.set_dump(),
18147        }
18148    }
18149    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18150        Self::write_header(buf);
18151        PushDevlink::new(buf)
18152    }
18153    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18154        PushDevlink::new(self.request.buf_mut())
18155    }
18156    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18157        PushDevlink::new(self.request.buf)
18158    }
18159    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18160        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18161        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18162    }
18163    fn write_header<Prev: Rec>(prev: &mut Prev) {
18164        let mut header = BuiltinNfgenmsg::new();
18165        header.cmd = 47u8;
18166        header.version = 1u8;
18167        prev.as_rec_mut().extend(header.as_slice());
18168    }
18169}
18170impl NetlinkRequest for OpPortParamGetDump<'_> {
18171    fn protocol(&self) -> Protocol {
18172        Protocol::Generic("devlink".as_bytes())
18173    }
18174    fn flags(&self) -> u16 {
18175        self.request.flags
18176    }
18177    fn payload(&self) -> &[u8] {
18178        self.request.buf()
18179    }
18180    type ReplyType<'buf> = IterableDevlink<'buf>;
18181    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18182        Self::decode_request(buf)
18183    }
18184    fn lookup(
18185        buf: &[u8],
18186        offset: usize,
18187        missing_type: Option<u16>,
18188    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18189        Self::decode_request(buf).lookup_attr(offset, missing_type)
18190    }
18191}
18192#[doc = "Get port param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
18193#[derive(Debug)]
18194pub struct OpPortParamGetDo<'r> {
18195    request: Request<'r>,
18196}
18197impl<'r> OpPortParamGetDo<'r> {
18198    pub fn new(mut request: Request<'r>) -> Self {
18199        Self::write_header(request.buf_mut());
18200        Self { request: request }
18201    }
18202    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18203        Self::write_header(buf);
18204        PushDevlink::new(buf)
18205    }
18206    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18207        PushDevlink::new(self.request.buf_mut())
18208    }
18209    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18210        PushDevlink::new(self.request.buf)
18211    }
18212    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18213        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18214        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18215    }
18216    fn write_header<Prev: Rec>(prev: &mut Prev) {
18217        let mut header = BuiltinNfgenmsg::new();
18218        header.cmd = 47u8;
18219        header.version = 1u8;
18220        prev.as_rec_mut().extend(header.as_slice());
18221    }
18222}
18223impl NetlinkRequest for OpPortParamGetDo<'_> {
18224    fn protocol(&self) -> Protocol {
18225        Protocol::Generic("devlink".as_bytes())
18226    }
18227    fn flags(&self) -> u16 {
18228        self.request.flags
18229    }
18230    fn payload(&self) -> &[u8] {
18231        self.request.buf()
18232    }
18233    type ReplyType<'buf> = IterableDevlink<'buf>;
18234    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18235        Self::decode_request(buf)
18236    }
18237    fn lookup(
18238        buf: &[u8],
18239        offset: usize,
18240        missing_type: Option<u16>,
18241    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18242        Self::decode_request(buf).lookup_attr(offset, missing_type)
18243    }
18244}
18245#[doc = "Set port param instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
18246#[derive(Debug)]
18247pub struct OpPortParamSetDo<'r> {
18248    request: Request<'r>,
18249}
18250impl<'r> OpPortParamSetDo<'r> {
18251    pub fn new(mut request: Request<'r>) -> Self {
18252        Self::write_header(request.buf_mut());
18253        Self { request: request }
18254    }
18255    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18256        Self::write_header(buf);
18257        PushDevlink::new(buf)
18258    }
18259    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18260        PushDevlink::new(self.request.buf_mut())
18261    }
18262    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18263        PushDevlink::new(self.request.buf)
18264    }
18265    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18266        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18267        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18268    }
18269    fn write_header<Prev: Rec>(prev: &mut Prev) {
18270        let mut header = BuiltinNfgenmsg::new();
18271        header.cmd = 48u8;
18272        header.version = 1u8;
18273        prev.as_rec_mut().extend(header.as_slice());
18274    }
18275}
18276impl NetlinkRequest for OpPortParamSetDo<'_> {
18277    fn protocol(&self) -> Protocol {
18278        Protocol::Generic("devlink".as_bytes())
18279    }
18280    fn flags(&self) -> u16 {
18281        self.request.flags
18282    }
18283    fn payload(&self) -> &[u8] {
18284        self.request.buf()
18285    }
18286    type ReplyType<'buf> = IterableDevlink<'buf>;
18287    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18288        Self::decode_request(buf)
18289    }
18290    fn lookup(
18291        buf: &[u8],
18292        offset: usize,
18293        missing_type: Option<u16>,
18294    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18295        Self::decode_request(buf).lookup_attr(offset, missing_type)
18296    }
18297}
18298#[doc = "Get device information, like driver name, hardware and firmware versions\netc\\.\n\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_info_driver_name()](IterableDevlink::get_info_driver_name)\n- [.get_info_serial_number()](IterableDevlink::get_info_serial_number)\n- [.get_info_version_fixed()](IterableDevlink::get_info_version_fixed)\n- [.get_info_version_running()](IterableDevlink::get_info_version_running)\n- [.get_info_version_stored()](IterableDevlink::get_info_version_stored)\n- [.get_info_board_serial_number()](IterableDevlink::get_info_board_serial_number)\n"]
18299#[derive(Debug)]
18300pub struct OpInfoGetDump<'r> {
18301    request: Request<'r>,
18302}
18303impl<'r> OpInfoGetDump<'r> {
18304    pub fn new(mut request: Request<'r>) -> Self {
18305        Self::write_header(request.buf_mut());
18306        Self {
18307            request: request.set_dump(),
18308        }
18309    }
18310    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18311        Self::write_header(buf);
18312        PushDevlink::new(buf)
18313    }
18314    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18315        PushDevlink::new(self.request.buf_mut())
18316    }
18317    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18318        PushDevlink::new(self.request.buf)
18319    }
18320    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18321        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18322        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18323    }
18324    fn write_header<Prev: Rec>(prev: &mut Prev) {
18325        let mut header = BuiltinNfgenmsg::new();
18326        header.cmd = 51u8;
18327        header.version = 1u8;
18328        prev.as_rec_mut().extend(header.as_slice());
18329    }
18330}
18331impl NetlinkRequest for OpInfoGetDump<'_> {
18332    fn protocol(&self) -> Protocol {
18333        Protocol::Generic("devlink".as_bytes())
18334    }
18335    fn flags(&self) -> u16 {
18336        self.request.flags
18337    }
18338    fn payload(&self) -> &[u8] {
18339        self.request.buf()
18340    }
18341    type ReplyType<'buf> = IterableDevlink<'buf>;
18342    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18343        Self::decode_request(buf)
18344    }
18345    fn lookup(
18346        buf: &[u8],
18347        offset: usize,
18348        missing_type: Option<u16>,
18349    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18350        Self::decode_request(buf).lookup_attr(offset, missing_type)
18351    }
18352}
18353#[doc = "Get device information, like driver name, hardware and firmware versions\netc\\.\n\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_info_driver_name()](IterableDevlink::get_info_driver_name)\n- [.get_info_serial_number()](IterableDevlink::get_info_serial_number)\n- [.get_info_version_fixed()](IterableDevlink::get_info_version_fixed)\n- [.get_info_version_running()](IterableDevlink::get_info_version_running)\n- [.get_info_version_stored()](IterableDevlink::get_info_version_stored)\n- [.get_info_board_serial_number()](IterableDevlink::get_info_board_serial_number)\n"]
18354#[derive(Debug)]
18355pub struct OpInfoGetDo<'r> {
18356    request: Request<'r>,
18357}
18358impl<'r> OpInfoGetDo<'r> {
18359    pub fn new(mut request: Request<'r>) -> Self {
18360        Self::write_header(request.buf_mut());
18361        Self { request: request }
18362    }
18363    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18364        Self::write_header(buf);
18365        PushDevlink::new(buf)
18366    }
18367    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18368        PushDevlink::new(self.request.buf_mut())
18369    }
18370    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18371        PushDevlink::new(self.request.buf)
18372    }
18373    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18374        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18375        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18376    }
18377    fn write_header<Prev: Rec>(prev: &mut Prev) {
18378        let mut header = BuiltinNfgenmsg::new();
18379        header.cmd = 51u8;
18380        header.version = 1u8;
18381        prev.as_rec_mut().extend(header.as_slice());
18382    }
18383}
18384impl NetlinkRequest for OpInfoGetDo<'_> {
18385    fn protocol(&self) -> Protocol {
18386        Protocol::Generic("devlink".as_bytes())
18387    }
18388    fn flags(&self) -> u16 {
18389        self.request.flags
18390    }
18391    fn payload(&self) -> &[u8] {
18392        self.request.buf()
18393    }
18394    type ReplyType<'buf> = IterableDevlink<'buf>;
18395    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18396        Self::decode_request(buf)
18397    }
18398    fn lookup(
18399        buf: &[u8],
18400        offset: usize,
18401        missing_type: Option<u16>,
18402    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18403        Self::decode_request(buf).lookup_attr(offset, missing_type)
18404    }
18405}
18406#[doc = "Get health reporter instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_health_reporter_name()](IterableDevlink::get_health_reporter_name)\n"]
18407#[derive(Debug)]
18408pub struct OpHealthReporterGetDump<'r> {
18409    request: Request<'r>,
18410}
18411impl<'r> OpHealthReporterGetDump<'r> {
18412    pub fn new(mut request: Request<'r>) -> Self {
18413        Self::write_header(request.buf_mut());
18414        Self {
18415            request: request.set_dump(),
18416        }
18417    }
18418    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18419        Self::write_header(buf);
18420        PushDevlink::new(buf)
18421    }
18422    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18423        PushDevlink::new(self.request.buf_mut())
18424    }
18425    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18426        PushDevlink::new(self.request.buf)
18427    }
18428    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18429        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18430        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18431    }
18432    fn write_header<Prev: Rec>(prev: &mut Prev) {
18433        let mut header = BuiltinNfgenmsg::new();
18434        header.cmd = 52u8;
18435        header.version = 1u8;
18436        prev.as_rec_mut().extend(header.as_slice());
18437    }
18438}
18439impl NetlinkRequest for OpHealthReporterGetDump<'_> {
18440    fn protocol(&self) -> Protocol {
18441        Protocol::Generic("devlink".as_bytes())
18442    }
18443    fn flags(&self) -> u16 {
18444        self.request.flags
18445    }
18446    fn payload(&self) -> &[u8] {
18447        self.request.buf()
18448    }
18449    type ReplyType<'buf> = IterableDevlink<'buf>;
18450    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18451        Self::decode_request(buf)
18452    }
18453    fn lookup(
18454        buf: &[u8],
18455        offset: usize,
18456        missing_type: Option<u16>,
18457    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18458        Self::decode_request(buf).lookup_attr(offset, missing_type)
18459    }
18460}
18461#[doc = "Get health reporter instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_health_reporter_name()](IterableDevlink::get_health_reporter_name)\n"]
18462#[derive(Debug)]
18463pub struct OpHealthReporterGetDo<'r> {
18464    request: Request<'r>,
18465}
18466impl<'r> OpHealthReporterGetDo<'r> {
18467    pub fn new(mut request: Request<'r>) -> Self {
18468        Self::write_header(request.buf_mut());
18469        Self { request: request }
18470    }
18471    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18472        Self::write_header(buf);
18473        PushDevlink::new(buf)
18474    }
18475    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18476        PushDevlink::new(self.request.buf_mut())
18477    }
18478    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18479        PushDevlink::new(self.request.buf)
18480    }
18481    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18482        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18483        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18484    }
18485    fn write_header<Prev: Rec>(prev: &mut Prev) {
18486        let mut header = BuiltinNfgenmsg::new();
18487        header.cmd = 52u8;
18488        header.version = 1u8;
18489        prev.as_rec_mut().extend(header.as_slice());
18490    }
18491}
18492impl NetlinkRequest for OpHealthReporterGetDo<'_> {
18493    fn protocol(&self) -> Protocol {
18494        Protocol::Generic("devlink".as_bytes())
18495    }
18496    fn flags(&self) -> u16 {
18497        self.request.flags
18498    }
18499    fn payload(&self) -> &[u8] {
18500        self.request.buf()
18501    }
18502    type ReplyType<'buf> = IterableDevlink<'buf>;
18503    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18504        Self::decode_request(buf)
18505    }
18506    fn lookup(
18507        buf: &[u8],
18508        offset: usize,
18509        missing_type: Option<u16>,
18510    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18511        Self::decode_request(buf).lookup_attr(offset, missing_type)
18512    }
18513}
18514#[doc = "Set health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n- [.push_health_reporter_graceful_period()](PushDevlink::push_health_reporter_graceful_period)\n- [.push_health_reporter_auto_recover()](PushDevlink::push_health_reporter_auto_recover)\n- [.push_health_reporter_auto_dump()](PushDevlink::push_health_reporter_auto_dump)\n- [.push_health_reporter_burst_period()](PushDevlink::push_health_reporter_burst_period)\n"]
18515#[derive(Debug)]
18516pub struct OpHealthReporterSetDo<'r> {
18517    request: Request<'r>,
18518}
18519impl<'r> OpHealthReporterSetDo<'r> {
18520    pub fn new(mut request: Request<'r>) -> Self {
18521        Self::write_header(request.buf_mut());
18522        Self { request: request }
18523    }
18524    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18525        Self::write_header(buf);
18526        PushDevlink::new(buf)
18527    }
18528    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18529        PushDevlink::new(self.request.buf_mut())
18530    }
18531    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18532        PushDevlink::new(self.request.buf)
18533    }
18534    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18535        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18536        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18537    }
18538    fn write_header<Prev: Rec>(prev: &mut Prev) {
18539        let mut header = BuiltinNfgenmsg::new();
18540        header.cmd = 53u8;
18541        header.version = 1u8;
18542        prev.as_rec_mut().extend(header.as_slice());
18543    }
18544}
18545impl NetlinkRequest for OpHealthReporterSetDo<'_> {
18546    fn protocol(&self) -> Protocol {
18547        Protocol::Generic("devlink".as_bytes())
18548    }
18549    fn flags(&self) -> u16 {
18550        self.request.flags
18551    }
18552    fn payload(&self) -> &[u8] {
18553        self.request.buf()
18554    }
18555    type ReplyType<'buf> = IterableDevlink<'buf>;
18556    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18557        Self::decode_request(buf)
18558    }
18559    fn lookup(
18560        buf: &[u8],
18561        offset: usize,
18562        missing_type: Option<u16>,
18563    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18564        Self::decode_request(buf).lookup_attr(offset, missing_type)
18565    }
18566}
18567#[doc = "Recover health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
18568#[derive(Debug)]
18569pub struct OpHealthReporterRecoverDo<'r> {
18570    request: Request<'r>,
18571}
18572impl<'r> OpHealthReporterRecoverDo<'r> {
18573    pub fn new(mut request: Request<'r>) -> Self {
18574        Self::write_header(request.buf_mut());
18575        Self { request: request }
18576    }
18577    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18578        Self::write_header(buf);
18579        PushDevlink::new(buf)
18580    }
18581    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18582        PushDevlink::new(self.request.buf_mut())
18583    }
18584    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18585        PushDevlink::new(self.request.buf)
18586    }
18587    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18588        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18589        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18590    }
18591    fn write_header<Prev: Rec>(prev: &mut Prev) {
18592        let mut header = BuiltinNfgenmsg::new();
18593        header.cmd = 54u8;
18594        header.version = 1u8;
18595        prev.as_rec_mut().extend(header.as_slice());
18596    }
18597}
18598impl NetlinkRequest for OpHealthReporterRecoverDo<'_> {
18599    fn protocol(&self) -> Protocol {
18600        Protocol::Generic("devlink".as_bytes())
18601    }
18602    fn flags(&self) -> u16 {
18603        self.request.flags
18604    }
18605    fn payload(&self) -> &[u8] {
18606        self.request.buf()
18607    }
18608    type ReplyType<'buf> = IterableDevlink<'buf>;
18609    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18610        Self::decode_request(buf)
18611    }
18612    fn lookup(
18613        buf: &[u8],
18614        offset: usize,
18615        missing_type: Option<u16>,
18616    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18617        Self::decode_request(buf).lookup_attr(offset, missing_type)
18618    }
18619}
18620#[doc = "Diagnose health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
18621#[derive(Debug)]
18622pub struct OpHealthReporterDiagnoseDo<'r> {
18623    request: Request<'r>,
18624}
18625impl<'r> OpHealthReporterDiagnoseDo<'r> {
18626    pub fn new(mut request: Request<'r>) -> Self {
18627        Self::write_header(request.buf_mut());
18628        Self { request: request }
18629    }
18630    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18631        Self::write_header(buf);
18632        PushDevlink::new(buf)
18633    }
18634    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18635        PushDevlink::new(self.request.buf_mut())
18636    }
18637    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18638        PushDevlink::new(self.request.buf)
18639    }
18640    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18641        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18642        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18643    }
18644    fn write_header<Prev: Rec>(prev: &mut Prev) {
18645        let mut header = BuiltinNfgenmsg::new();
18646        header.cmd = 55u8;
18647        header.version = 1u8;
18648        prev.as_rec_mut().extend(header.as_slice());
18649    }
18650}
18651impl NetlinkRequest for OpHealthReporterDiagnoseDo<'_> {
18652    fn protocol(&self) -> Protocol {
18653        Protocol::Generic("devlink".as_bytes())
18654    }
18655    fn flags(&self) -> u16 {
18656        self.request.flags
18657    }
18658    fn payload(&self) -> &[u8] {
18659        self.request.buf()
18660    }
18661    type ReplyType<'buf> = IterableDevlink<'buf>;
18662    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18663        Self::decode_request(buf)
18664    }
18665    fn lookup(
18666        buf: &[u8],
18667        offset: usize,
18668        missing_type: Option<u16>,
18669    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18670        Self::decode_request(buf).lookup_attr(offset, missing_type)
18671    }
18672}
18673#[doc = "Dump health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n\nReply attributes:\n- [.get_fmsg()](IterableDevlink::get_fmsg)\n"]
18674#[derive(Debug)]
18675pub struct OpHealthReporterDumpGetDump<'r> {
18676    request: Request<'r>,
18677}
18678impl<'r> OpHealthReporterDumpGetDump<'r> {
18679    pub fn new(mut request: Request<'r>) -> Self {
18680        Self::write_header(request.buf_mut());
18681        Self {
18682            request: request.set_dump(),
18683        }
18684    }
18685    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18686        Self::write_header(buf);
18687        PushDevlink::new(buf)
18688    }
18689    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18690        PushDevlink::new(self.request.buf_mut())
18691    }
18692    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18693        PushDevlink::new(self.request.buf)
18694    }
18695    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18696        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18697        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18698    }
18699    fn write_header<Prev: Rec>(prev: &mut Prev) {
18700        let mut header = BuiltinNfgenmsg::new();
18701        header.cmd = 56u8;
18702        header.version = 1u8;
18703        prev.as_rec_mut().extend(header.as_slice());
18704    }
18705}
18706impl NetlinkRequest for OpHealthReporterDumpGetDump<'_> {
18707    fn protocol(&self) -> Protocol {
18708        Protocol::Generic("devlink".as_bytes())
18709    }
18710    fn flags(&self) -> u16 {
18711        self.request.flags
18712    }
18713    fn payload(&self) -> &[u8] {
18714        self.request.buf()
18715    }
18716    type ReplyType<'buf> = IterableDevlink<'buf>;
18717    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18718        Self::decode_request(buf)
18719    }
18720    fn lookup(
18721        buf: &[u8],
18722        offset: usize,
18723        missing_type: Option<u16>,
18724    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18725        Self::decode_request(buf).lookup_attr(offset, missing_type)
18726    }
18727}
18728#[doc = "Clear dump of health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
18729#[derive(Debug)]
18730pub struct OpHealthReporterDumpClearDo<'r> {
18731    request: Request<'r>,
18732}
18733impl<'r> OpHealthReporterDumpClearDo<'r> {
18734    pub fn new(mut request: Request<'r>) -> Self {
18735        Self::write_header(request.buf_mut());
18736        Self { request: request }
18737    }
18738    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18739        Self::write_header(buf);
18740        PushDevlink::new(buf)
18741    }
18742    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18743        PushDevlink::new(self.request.buf_mut())
18744    }
18745    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18746        PushDevlink::new(self.request.buf)
18747    }
18748    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18749        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18750        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18751    }
18752    fn write_header<Prev: Rec>(prev: &mut Prev) {
18753        let mut header = BuiltinNfgenmsg::new();
18754        header.cmd = 57u8;
18755        header.version = 1u8;
18756        prev.as_rec_mut().extend(header.as_slice());
18757    }
18758}
18759impl NetlinkRequest for OpHealthReporterDumpClearDo<'_> {
18760    fn protocol(&self) -> Protocol {
18761        Protocol::Generic("devlink".as_bytes())
18762    }
18763    fn flags(&self) -> u16 {
18764        self.request.flags
18765    }
18766    fn payload(&self) -> &[u8] {
18767        self.request.buf()
18768    }
18769    type ReplyType<'buf> = IterableDevlink<'buf>;
18770    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18771        Self::decode_request(buf)
18772    }
18773    fn lookup(
18774        buf: &[u8],
18775        offset: usize,
18776        missing_type: Option<u16>,
18777    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18778        Self::decode_request(buf).lookup_attr(offset, missing_type)
18779    }
18780}
18781#[doc = "Flash update devlink instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_flash_update_file_name()](PushDevlink::push_flash_update_file_name)\n- [.push_flash_update_component()](PushDevlink::push_flash_update_component)\n- [.push_flash_update_overwrite_mask()](PushDevlink::push_flash_update_overwrite_mask)\n"]
18782#[derive(Debug)]
18783pub struct OpFlashUpdateDo<'r> {
18784    request: Request<'r>,
18785}
18786impl<'r> OpFlashUpdateDo<'r> {
18787    pub fn new(mut request: Request<'r>) -> Self {
18788        Self::write_header(request.buf_mut());
18789        Self { request: request }
18790    }
18791    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18792        Self::write_header(buf);
18793        PushDevlink::new(buf)
18794    }
18795    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18796        PushDevlink::new(self.request.buf_mut())
18797    }
18798    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18799        PushDevlink::new(self.request.buf)
18800    }
18801    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18802        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18803        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18804    }
18805    fn write_header<Prev: Rec>(prev: &mut Prev) {
18806        let mut header = BuiltinNfgenmsg::new();
18807        header.cmd = 58u8;
18808        header.version = 1u8;
18809        prev.as_rec_mut().extend(header.as_slice());
18810    }
18811}
18812impl NetlinkRequest for OpFlashUpdateDo<'_> {
18813    fn protocol(&self) -> Protocol {
18814        Protocol::Generic("devlink".as_bytes())
18815    }
18816    fn flags(&self) -> u16 {
18817        self.request.flags
18818    }
18819    fn payload(&self) -> &[u8] {
18820        self.request.buf()
18821    }
18822    type ReplyType<'buf> = IterableDevlink<'buf>;
18823    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18824        Self::decode_request(buf)
18825    }
18826    fn lookup(
18827        buf: &[u8],
18828        offset: usize,
18829        missing_type: Option<u16>,
18830    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18831        Self::decode_request(buf).lookup_attr(offset, missing_type)
18832    }
18833}
18834#[doc = "Get trap instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_name()](IterableDevlink::get_trap_name)\n"]
18835#[derive(Debug)]
18836pub struct OpTrapGetDump<'r> {
18837    request: Request<'r>,
18838}
18839impl<'r> OpTrapGetDump<'r> {
18840    pub fn new(mut request: Request<'r>) -> Self {
18841        Self::write_header(request.buf_mut());
18842        Self {
18843            request: request.set_dump(),
18844        }
18845    }
18846    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18847        Self::write_header(buf);
18848        PushDevlink::new(buf)
18849    }
18850    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18851        PushDevlink::new(self.request.buf_mut())
18852    }
18853    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18854        PushDevlink::new(self.request.buf)
18855    }
18856    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18857        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18858        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18859    }
18860    fn write_header<Prev: Rec>(prev: &mut Prev) {
18861        let mut header = BuiltinNfgenmsg::new();
18862        header.cmd = 61u8;
18863        header.version = 1u8;
18864        prev.as_rec_mut().extend(header.as_slice());
18865    }
18866}
18867impl NetlinkRequest for OpTrapGetDump<'_> {
18868    fn protocol(&self) -> Protocol {
18869        Protocol::Generic("devlink".as_bytes())
18870    }
18871    fn flags(&self) -> u16 {
18872        self.request.flags
18873    }
18874    fn payload(&self) -> &[u8] {
18875        self.request.buf()
18876    }
18877    type ReplyType<'buf> = IterableDevlink<'buf>;
18878    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18879        Self::decode_request(buf)
18880    }
18881    fn lookup(
18882        buf: &[u8],
18883        offset: usize,
18884        missing_type: Option<u16>,
18885    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18886        Self::decode_request(buf).lookup_attr(offset, missing_type)
18887    }
18888}
18889#[doc = "Get trap instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_name()](PushDevlink::push_trap_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_name()](IterableDevlink::get_trap_name)\n"]
18890#[derive(Debug)]
18891pub struct OpTrapGetDo<'r> {
18892    request: Request<'r>,
18893}
18894impl<'r> OpTrapGetDo<'r> {
18895    pub fn new(mut request: Request<'r>) -> Self {
18896        Self::write_header(request.buf_mut());
18897        Self { request: request }
18898    }
18899    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18900        Self::write_header(buf);
18901        PushDevlink::new(buf)
18902    }
18903    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18904        PushDevlink::new(self.request.buf_mut())
18905    }
18906    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18907        PushDevlink::new(self.request.buf)
18908    }
18909    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18910        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18911        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18912    }
18913    fn write_header<Prev: Rec>(prev: &mut Prev) {
18914        let mut header = BuiltinNfgenmsg::new();
18915        header.cmd = 61u8;
18916        header.version = 1u8;
18917        prev.as_rec_mut().extend(header.as_slice());
18918    }
18919}
18920impl NetlinkRequest for OpTrapGetDo<'_> {
18921    fn protocol(&self) -> Protocol {
18922        Protocol::Generic("devlink".as_bytes())
18923    }
18924    fn flags(&self) -> u16 {
18925        self.request.flags
18926    }
18927    fn payload(&self) -> &[u8] {
18928        self.request.buf()
18929    }
18930    type ReplyType<'buf> = IterableDevlink<'buf>;
18931    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18932        Self::decode_request(buf)
18933    }
18934    fn lookup(
18935        buf: &[u8],
18936        offset: usize,
18937        missing_type: Option<u16>,
18938    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18939        Self::decode_request(buf).lookup_attr(offset, missing_type)
18940    }
18941}
18942#[doc = "Set trap instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_name()](PushDevlink::push_trap_name)\n- [.push_trap_action()](PushDevlink::push_trap_action)\n"]
18943#[derive(Debug)]
18944pub struct OpTrapSetDo<'r> {
18945    request: Request<'r>,
18946}
18947impl<'r> OpTrapSetDo<'r> {
18948    pub fn new(mut request: Request<'r>) -> Self {
18949        Self::write_header(request.buf_mut());
18950        Self { request: request }
18951    }
18952    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18953        Self::write_header(buf);
18954        PushDevlink::new(buf)
18955    }
18956    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18957        PushDevlink::new(self.request.buf_mut())
18958    }
18959    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18960        PushDevlink::new(self.request.buf)
18961    }
18962    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18963        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18964        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18965    }
18966    fn write_header<Prev: Rec>(prev: &mut Prev) {
18967        let mut header = BuiltinNfgenmsg::new();
18968        header.cmd = 62u8;
18969        header.version = 1u8;
18970        prev.as_rec_mut().extend(header.as_slice());
18971    }
18972}
18973impl NetlinkRequest for OpTrapSetDo<'_> {
18974    fn protocol(&self) -> Protocol {
18975        Protocol::Generic("devlink".as_bytes())
18976    }
18977    fn flags(&self) -> u16 {
18978        self.request.flags
18979    }
18980    fn payload(&self) -> &[u8] {
18981        self.request.buf()
18982    }
18983    type ReplyType<'buf> = IterableDevlink<'buf>;
18984    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18985        Self::decode_request(buf)
18986    }
18987    fn lookup(
18988        buf: &[u8],
18989        offset: usize,
18990        missing_type: Option<u16>,
18991    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18992        Self::decode_request(buf).lookup_attr(offset, missing_type)
18993    }
18994}
18995#[doc = "Get trap group instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_group_name()](IterableDevlink::get_trap_group_name)\n"]
18996#[derive(Debug)]
18997pub struct OpTrapGroupGetDump<'r> {
18998    request: Request<'r>,
18999}
19000impl<'r> OpTrapGroupGetDump<'r> {
19001    pub fn new(mut request: Request<'r>) -> Self {
19002        Self::write_header(request.buf_mut());
19003        Self {
19004            request: request.set_dump(),
19005        }
19006    }
19007    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19008        Self::write_header(buf);
19009        PushDevlink::new(buf)
19010    }
19011    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19012        PushDevlink::new(self.request.buf_mut())
19013    }
19014    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19015        PushDevlink::new(self.request.buf)
19016    }
19017    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19018        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19019        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19020    }
19021    fn write_header<Prev: Rec>(prev: &mut Prev) {
19022        let mut header = BuiltinNfgenmsg::new();
19023        header.cmd = 65u8;
19024        header.version = 1u8;
19025        prev.as_rec_mut().extend(header.as_slice());
19026    }
19027}
19028impl NetlinkRequest for OpTrapGroupGetDump<'_> {
19029    fn protocol(&self) -> Protocol {
19030        Protocol::Generic("devlink".as_bytes())
19031    }
19032    fn flags(&self) -> u16 {
19033        self.request.flags
19034    }
19035    fn payload(&self) -> &[u8] {
19036        self.request.buf()
19037    }
19038    type ReplyType<'buf> = IterableDevlink<'buf>;
19039    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19040        Self::decode_request(buf)
19041    }
19042    fn lookup(
19043        buf: &[u8],
19044        offset: usize,
19045        missing_type: Option<u16>,
19046    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19047        Self::decode_request(buf).lookup_attr(offset, missing_type)
19048    }
19049}
19050#[doc = "Get trap group instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_group_name()](PushDevlink::push_trap_group_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_group_name()](IterableDevlink::get_trap_group_name)\n"]
19051#[derive(Debug)]
19052pub struct OpTrapGroupGetDo<'r> {
19053    request: Request<'r>,
19054}
19055impl<'r> OpTrapGroupGetDo<'r> {
19056    pub fn new(mut request: Request<'r>) -> Self {
19057        Self::write_header(request.buf_mut());
19058        Self { request: request }
19059    }
19060    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19061        Self::write_header(buf);
19062        PushDevlink::new(buf)
19063    }
19064    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19065        PushDevlink::new(self.request.buf_mut())
19066    }
19067    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19068        PushDevlink::new(self.request.buf)
19069    }
19070    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19071        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19072        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19073    }
19074    fn write_header<Prev: Rec>(prev: &mut Prev) {
19075        let mut header = BuiltinNfgenmsg::new();
19076        header.cmd = 65u8;
19077        header.version = 1u8;
19078        prev.as_rec_mut().extend(header.as_slice());
19079    }
19080}
19081impl NetlinkRequest for OpTrapGroupGetDo<'_> {
19082    fn protocol(&self) -> Protocol {
19083        Protocol::Generic("devlink".as_bytes())
19084    }
19085    fn flags(&self) -> u16 {
19086        self.request.flags
19087    }
19088    fn payload(&self) -> &[u8] {
19089        self.request.buf()
19090    }
19091    type ReplyType<'buf> = IterableDevlink<'buf>;
19092    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19093        Self::decode_request(buf)
19094    }
19095    fn lookup(
19096        buf: &[u8],
19097        offset: usize,
19098        missing_type: Option<u16>,
19099    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19100        Self::decode_request(buf).lookup_attr(offset, missing_type)
19101    }
19102}
19103#[doc = "Set trap group instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_action()](PushDevlink::push_trap_action)\n- [.push_trap_group_name()](PushDevlink::push_trap_group_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n"]
19104#[derive(Debug)]
19105pub struct OpTrapGroupSetDo<'r> {
19106    request: Request<'r>,
19107}
19108impl<'r> OpTrapGroupSetDo<'r> {
19109    pub fn new(mut request: Request<'r>) -> Self {
19110        Self::write_header(request.buf_mut());
19111        Self { request: request }
19112    }
19113    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19114        Self::write_header(buf);
19115        PushDevlink::new(buf)
19116    }
19117    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19118        PushDevlink::new(self.request.buf_mut())
19119    }
19120    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19121        PushDevlink::new(self.request.buf)
19122    }
19123    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19124        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19125        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19126    }
19127    fn write_header<Prev: Rec>(prev: &mut Prev) {
19128        let mut header = BuiltinNfgenmsg::new();
19129        header.cmd = 66u8;
19130        header.version = 1u8;
19131        prev.as_rec_mut().extend(header.as_slice());
19132    }
19133}
19134impl NetlinkRequest for OpTrapGroupSetDo<'_> {
19135    fn protocol(&self) -> Protocol {
19136        Protocol::Generic("devlink".as_bytes())
19137    }
19138    fn flags(&self) -> u16 {
19139        self.request.flags
19140    }
19141    fn payload(&self) -> &[u8] {
19142        self.request.buf()
19143    }
19144    type ReplyType<'buf> = IterableDevlink<'buf>;
19145    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19146        Self::decode_request(buf)
19147    }
19148    fn lookup(
19149        buf: &[u8],
19150        offset: usize,
19151        missing_type: Option<u16>,
19152    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19153        Self::decode_request(buf).lookup_attr(offset, missing_type)
19154    }
19155}
19156#[doc = "Get trap policer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_policer_id()](IterableDevlink::get_trap_policer_id)\n"]
19157#[derive(Debug)]
19158pub struct OpTrapPolicerGetDump<'r> {
19159    request: Request<'r>,
19160}
19161impl<'r> OpTrapPolicerGetDump<'r> {
19162    pub fn new(mut request: Request<'r>) -> Self {
19163        Self::write_header(request.buf_mut());
19164        Self {
19165            request: request.set_dump(),
19166        }
19167    }
19168    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19169        Self::write_header(buf);
19170        PushDevlink::new(buf)
19171    }
19172    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19173        PushDevlink::new(self.request.buf_mut())
19174    }
19175    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19176        PushDevlink::new(self.request.buf)
19177    }
19178    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19179        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19180        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19181    }
19182    fn write_header<Prev: Rec>(prev: &mut Prev) {
19183        let mut header = BuiltinNfgenmsg::new();
19184        header.cmd = 69u8;
19185        header.version = 1u8;
19186        prev.as_rec_mut().extend(header.as_slice());
19187    }
19188}
19189impl NetlinkRequest for OpTrapPolicerGetDump<'_> {
19190    fn protocol(&self) -> Protocol {
19191        Protocol::Generic("devlink".as_bytes())
19192    }
19193    fn flags(&self) -> u16 {
19194        self.request.flags
19195    }
19196    fn payload(&self) -> &[u8] {
19197        self.request.buf()
19198    }
19199    type ReplyType<'buf> = IterableDevlink<'buf>;
19200    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19201        Self::decode_request(buf)
19202    }
19203    fn lookup(
19204        buf: &[u8],
19205        offset: usize,
19206        missing_type: Option<u16>,
19207    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19208        Self::decode_request(buf).lookup_attr(offset, missing_type)
19209    }
19210}
19211#[doc = "Get trap policer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_policer_id()](IterableDevlink::get_trap_policer_id)\n"]
19212#[derive(Debug)]
19213pub struct OpTrapPolicerGetDo<'r> {
19214    request: Request<'r>,
19215}
19216impl<'r> OpTrapPolicerGetDo<'r> {
19217    pub fn new(mut request: Request<'r>) -> Self {
19218        Self::write_header(request.buf_mut());
19219        Self { request: request }
19220    }
19221    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19222        Self::write_header(buf);
19223        PushDevlink::new(buf)
19224    }
19225    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19226        PushDevlink::new(self.request.buf_mut())
19227    }
19228    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19229        PushDevlink::new(self.request.buf)
19230    }
19231    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19232        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19233        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19234    }
19235    fn write_header<Prev: Rec>(prev: &mut Prev) {
19236        let mut header = BuiltinNfgenmsg::new();
19237        header.cmd = 69u8;
19238        header.version = 1u8;
19239        prev.as_rec_mut().extend(header.as_slice());
19240    }
19241}
19242impl NetlinkRequest for OpTrapPolicerGetDo<'_> {
19243    fn protocol(&self) -> Protocol {
19244        Protocol::Generic("devlink".as_bytes())
19245    }
19246    fn flags(&self) -> u16 {
19247        self.request.flags
19248    }
19249    fn payload(&self) -> &[u8] {
19250        self.request.buf()
19251    }
19252    type ReplyType<'buf> = IterableDevlink<'buf>;
19253    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19254        Self::decode_request(buf)
19255    }
19256    fn lookup(
19257        buf: &[u8],
19258        offset: usize,
19259        missing_type: Option<u16>,
19260    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19261        Self::decode_request(buf).lookup_attr(offset, missing_type)
19262    }
19263}
19264#[doc = "Get trap policer instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n- [.push_trap_policer_rate()](PushDevlink::push_trap_policer_rate)\n- [.push_trap_policer_burst()](PushDevlink::push_trap_policer_burst)\n"]
19265#[derive(Debug)]
19266pub struct OpTrapPolicerSetDo<'r> {
19267    request: Request<'r>,
19268}
19269impl<'r> OpTrapPolicerSetDo<'r> {
19270    pub fn new(mut request: Request<'r>) -> Self {
19271        Self::write_header(request.buf_mut());
19272        Self { request: request }
19273    }
19274    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19275        Self::write_header(buf);
19276        PushDevlink::new(buf)
19277    }
19278    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19279        PushDevlink::new(self.request.buf_mut())
19280    }
19281    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19282        PushDevlink::new(self.request.buf)
19283    }
19284    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19285        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19286        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19287    }
19288    fn write_header<Prev: Rec>(prev: &mut Prev) {
19289        let mut header = BuiltinNfgenmsg::new();
19290        header.cmd = 70u8;
19291        header.version = 1u8;
19292        prev.as_rec_mut().extend(header.as_slice());
19293    }
19294}
19295impl NetlinkRequest for OpTrapPolicerSetDo<'_> {
19296    fn protocol(&self) -> Protocol {
19297        Protocol::Generic("devlink".as_bytes())
19298    }
19299    fn flags(&self) -> u16 {
19300        self.request.flags
19301    }
19302    fn payload(&self) -> &[u8] {
19303        self.request.buf()
19304    }
19305    type ReplyType<'buf> = IterableDevlink<'buf>;
19306    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19307        Self::decode_request(buf)
19308    }
19309    fn lookup(
19310        buf: &[u8],
19311        offset: usize,
19312        missing_type: Option<u16>,
19313    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19314        Self::decode_request(buf).lookup_attr(offset, missing_type)
19315    }
19316}
19317#[doc = "Test health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
19318#[derive(Debug)]
19319pub struct OpHealthReporterTestDo<'r> {
19320    request: Request<'r>,
19321}
19322impl<'r> OpHealthReporterTestDo<'r> {
19323    pub fn new(mut request: Request<'r>) -> Self {
19324        Self::write_header(request.buf_mut());
19325        Self { request: request }
19326    }
19327    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19328        Self::write_header(buf);
19329        PushDevlink::new(buf)
19330    }
19331    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19332        PushDevlink::new(self.request.buf_mut())
19333    }
19334    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19335        PushDevlink::new(self.request.buf)
19336    }
19337    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19338        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19339        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19340    }
19341    fn write_header<Prev: Rec>(prev: &mut Prev) {
19342        let mut header = BuiltinNfgenmsg::new();
19343        header.cmd = 73u8;
19344        header.version = 1u8;
19345        prev.as_rec_mut().extend(header.as_slice());
19346    }
19347}
19348impl NetlinkRequest for OpHealthReporterTestDo<'_> {
19349    fn protocol(&self) -> Protocol {
19350        Protocol::Generic("devlink".as_bytes())
19351    }
19352    fn flags(&self) -> u16 {
19353        self.request.flags
19354    }
19355    fn payload(&self) -> &[u8] {
19356        self.request.buf()
19357    }
19358    type ReplyType<'buf> = IterableDevlink<'buf>;
19359    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19360        Self::decode_request(buf)
19361    }
19362    fn lookup(
19363        buf: &[u8],
19364        offset: usize,
19365        missing_type: Option<u16>,
19366    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19367        Self::decode_request(buf).lookup_attr(offset, missing_type)
19368    }
19369}
19370#[doc = "Get rate instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_rate_node_name()](IterableDevlink::get_rate_node_name)\n"]
19371#[derive(Debug)]
19372pub struct OpRateGetDump<'r> {
19373    request: Request<'r>,
19374}
19375impl<'r> OpRateGetDump<'r> {
19376    pub fn new(mut request: Request<'r>) -> Self {
19377        Self::write_header(request.buf_mut());
19378        Self {
19379            request: request.set_dump(),
19380        }
19381    }
19382    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19383        Self::write_header(buf);
19384        PushDevlink::new(buf)
19385    }
19386    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19387        PushDevlink::new(self.request.buf_mut())
19388    }
19389    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19390        PushDevlink::new(self.request.buf)
19391    }
19392    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19393        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19394        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19395    }
19396    fn write_header<Prev: Rec>(prev: &mut Prev) {
19397        let mut header = BuiltinNfgenmsg::new();
19398        header.cmd = 74u8;
19399        header.version = 1u8;
19400        prev.as_rec_mut().extend(header.as_slice());
19401    }
19402}
19403impl NetlinkRequest for OpRateGetDump<'_> {
19404    fn protocol(&self) -> Protocol {
19405        Protocol::Generic("devlink".as_bytes())
19406    }
19407    fn flags(&self) -> u16 {
19408        self.request.flags
19409    }
19410    fn payload(&self) -> &[u8] {
19411        self.request.buf()
19412    }
19413    type ReplyType<'buf> = IterableDevlink<'buf>;
19414    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19415        Self::decode_request(buf)
19416    }
19417    fn lookup(
19418        buf: &[u8],
19419        offset: usize,
19420        missing_type: Option<u16>,
19421    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19422        Self::decode_request(buf).lookup_attr(offset, missing_type)
19423    }
19424}
19425#[doc = "Get rate instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_rate_node_name()](IterableDevlink::get_rate_node_name)\n"]
19426#[derive(Debug)]
19427pub struct OpRateGetDo<'r> {
19428    request: Request<'r>,
19429}
19430impl<'r> OpRateGetDo<'r> {
19431    pub fn new(mut request: Request<'r>) -> Self {
19432        Self::write_header(request.buf_mut());
19433        Self { request: request }
19434    }
19435    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19436        Self::write_header(buf);
19437        PushDevlink::new(buf)
19438    }
19439    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19440        PushDevlink::new(self.request.buf_mut())
19441    }
19442    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19443        PushDevlink::new(self.request.buf)
19444    }
19445    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19446        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19447        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19448    }
19449    fn write_header<Prev: Rec>(prev: &mut Prev) {
19450        let mut header = BuiltinNfgenmsg::new();
19451        header.cmd = 74u8;
19452        header.version = 1u8;
19453        prev.as_rec_mut().extend(header.as_slice());
19454    }
19455}
19456impl NetlinkRequest for OpRateGetDo<'_> {
19457    fn protocol(&self) -> Protocol {
19458        Protocol::Generic("devlink".as_bytes())
19459    }
19460    fn flags(&self) -> u16 {
19461        self.request.flags
19462    }
19463    fn payload(&self) -> &[u8] {
19464        self.request.buf()
19465    }
19466    type ReplyType<'buf> = IterableDevlink<'buf>;
19467    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19468        Self::decode_request(buf)
19469    }
19470    fn lookup(
19471        buf: &[u8],
19472        offset: usize,
19473        missing_type: Option<u16>,
19474    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19475        Self::decode_request(buf).lookup_attr(offset, missing_type)
19476    }
19477}
19478#[doc = "Set rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_tx_share()](PushDevlink::push_rate_tx_share)\n- [.push_rate_tx_max()](PushDevlink::push_rate_tx_max)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n- [.push_rate_parent_node_name()](PushDevlink::push_rate_parent_node_name)\n- [.push_rate_tx_priority()](PushDevlink::push_rate_tx_priority)\n- [.push_rate_tx_weight()](PushDevlink::push_rate_tx_weight)\n- [.nested_rate_tc_bws()](PushDevlink::nested_rate_tc_bws)\n"]
19479#[derive(Debug)]
19480pub struct OpRateSetDo<'r> {
19481    request: Request<'r>,
19482}
19483impl<'r> OpRateSetDo<'r> {
19484    pub fn new(mut request: Request<'r>) -> Self {
19485        Self::write_header(request.buf_mut());
19486        Self { request: request }
19487    }
19488    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19489        Self::write_header(buf);
19490        PushDevlink::new(buf)
19491    }
19492    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19493        PushDevlink::new(self.request.buf_mut())
19494    }
19495    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19496        PushDevlink::new(self.request.buf)
19497    }
19498    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19499        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19500        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19501    }
19502    fn write_header<Prev: Rec>(prev: &mut Prev) {
19503        let mut header = BuiltinNfgenmsg::new();
19504        header.cmd = 75u8;
19505        header.version = 1u8;
19506        prev.as_rec_mut().extend(header.as_slice());
19507    }
19508}
19509impl NetlinkRequest for OpRateSetDo<'_> {
19510    fn protocol(&self) -> Protocol {
19511        Protocol::Generic("devlink".as_bytes())
19512    }
19513    fn flags(&self) -> u16 {
19514        self.request.flags
19515    }
19516    fn payload(&self) -> &[u8] {
19517        self.request.buf()
19518    }
19519    type ReplyType<'buf> = IterableDevlink<'buf>;
19520    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19521        Self::decode_request(buf)
19522    }
19523    fn lookup(
19524        buf: &[u8],
19525        offset: usize,
19526        missing_type: Option<u16>,
19527    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19528        Self::decode_request(buf).lookup_attr(offset, missing_type)
19529    }
19530}
19531#[doc = "Create rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_tx_share()](PushDevlink::push_rate_tx_share)\n- [.push_rate_tx_max()](PushDevlink::push_rate_tx_max)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n- [.push_rate_parent_node_name()](PushDevlink::push_rate_parent_node_name)\n- [.push_rate_tx_priority()](PushDevlink::push_rate_tx_priority)\n- [.push_rate_tx_weight()](PushDevlink::push_rate_tx_weight)\n- [.nested_rate_tc_bws()](PushDevlink::nested_rate_tc_bws)\n"]
19532#[derive(Debug)]
19533pub struct OpRateNewDo<'r> {
19534    request: Request<'r>,
19535}
19536impl<'r> OpRateNewDo<'r> {
19537    pub fn new(mut request: Request<'r>) -> Self {
19538        Self::write_header(request.buf_mut());
19539        Self { request: request }
19540    }
19541    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19542        Self::write_header(buf);
19543        PushDevlink::new(buf)
19544    }
19545    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19546        PushDevlink::new(self.request.buf_mut())
19547    }
19548    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19549        PushDevlink::new(self.request.buf)
19550    }
19551    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19552        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19553        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19554    }
19555    fn write_header<Prev: Rec>(prev: &mut Prev) {
19556        let mut header = BuiltinNfgenmsg::new();
19557        header.cmd = 76u8;
19558        header.version = 1u8;
19559        prev.as_rec_mut().extend(header.as_slice());
19560    }
19561}
19562impl NetlinkRequest for OpRateNewDo<'_> {
19563    fn protocol(&self) -> Protocol {
19564        Protocol::Generic("devlink".as_bytes())
19565    }
19566    fn flags(&self) -> u16 {
19567        self.request.flags
19568    }
19569    fn payload(&self) -> &[u8] {
19570        self.request.buf()
19571    }
19572    type ReplyType<'buf> = IterableDevlink<'buf>;
19573    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19574        Self::decode_request(buf)
19575    }
19576    fn lookup(
19577        buf: &[u8],
19578        offset: usize,
19579        missing_type: Option<u16>,
19580    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19581        Self::decode_request(buf).lookup_attr(offset, missing_type)
19582    }
19583}
19584#[doc = "Delete rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n"]
19585#[derive(Debug)]
19586pub struct OpRateDelDo<'r> {
19587    request: Request<'r>,
19588}
19589impl<'r> OpRateDelDo<'r> {
19590    pub fn new(mut request: Request<'r>) -> Self {
19591        Self::write_header(request.buf_mut());
19592        Self { request: request }
19593    }
19594    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19595        Self::write_header(buf);
19596        PushDevlink::new(buf)
19597    }
19598    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19599        PushDevlink::new(self.request.buf_mut())
19600    }
19601    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19602        PushDevlink::new(self.request.buf)
19603    }
19604    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19605        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19606        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19607    }
19608    fn write_header<Prev: Rec>(prev: &mut Prev) {
19609        let mut header = BuiltinNfgenmsg::new();
19610        header.cmd = 77u8;
19611        header.version = 1u8;
19612        prev.as_rec_mut().extend(header.as_slice());
19613    }
19614}
19615impl NetlinkRequest for OpRateDelDo<'_> {
19616    fn protocol(&self) -> Protocol {
19617        Protocol::Generic("devlink".as_bytes())
19618    }
19619    fn flags(&self) -> u16 {
19620        self.request.flags
19621    }
19622    fn payload(&self) -> &[u8] {
19623        self.request.buf()
19624    }
19625    type ReplyType<'buf> = IterableDevlink<'buf>;
19626    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19627        Self::decode_request(buf)
19628    }
19629    fn lookup(
19630        buf: &[u8],
19631        offset: usize,
19632        missing_type: Option<u16>,
19633    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19634        Self::decode_request(buf).lookup_attr(offset, missing_type)
19635    }
19636}
19637#[doc = "Get line card instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_linecard_index()](IterableDevlink::get_linecard_index)\n"]
19638#[derive(Debug)]
19639pub struct OpLinecardGetDump<'r> {
19640    request: Request<'r>,
19641}
19642impl<'r> OpLinecardGetDump<'r> {
19643    pub fn new(mut request: Request<'r>) -> Self {
19644        Self::write_header(request.buf_mut());
19645        Self {
19646            request: request.set_dump(),
19647        }
19648    }
19649    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19650        Self::write_header(buf);
19651        PushDevlink::new(buf)
19652    }
19653    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19654        PushDevlink::new(self.request.buf_mut())
19655    }
19656    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19657        PushDevlink::new(self.request.buf)
19658    }
19659    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19660        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19661        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19662    }
19663    fn write_header<Prev: Rec>(prev: &mut Prev) {
19664        let mut header = BuiltinNfgenmsg::new();
19665        header.cmd = 78u8;
19666        header.version = 1u8;
19667        prev.as_rec_mut().extend(header.as_slice());
19668    }
19669}
19670impl NetlinkRequest for OpLinecardGetDump<'_> {
19671    fn protocol(&self) -> Protocol {
19672        Protocol::Generic("devlink".as_bytes())
19673    }
19674    fn flags(&self) -> u16 {
19675        self.request.flags
19676    }
19677    fn payload(&self) -> &[u8] {
19678        self.request.buf()
19679    }
19680    type ReplyType<'buf> = IterableDevlink<'buf>;
19681    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19682        Self::decode_request(buf)
19683    }
19684    fn lookup(
19685        buf: &[u8],
19686        offset: usize,
19687        missing_type: Option<u16>,
19688    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19689        Self::decode_request(buf).lookup_attr(offset, missing_type)
19690    }
19691}
19692#[doc = "Get line card instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_linecard_index()](PushDevlink::push_linecard_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_linecard_index()](IterableDevlink::get_linecard_index)\n"]
19693#[derive(Debug)]
19694pub struct OpLinecardGetDo<'r> {
19695    request: Request<'r>,
19696}
19697impl<'r> OpLinecardGetDo<'r> {
19698    pub fn new(mut request: Request<'r>) -> Self {
19699        Self::write_header(request.buf_mut());
19700        Self { request: request }
19701    }
19702    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19703        Self::write_header(buf);
19704        PushDevlink::new(buf)
19705    }
19706    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19707        PushDevlink::new(self.request.buf_mut())
19708    }
19709    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19710        PushDevlink::new(self.request.buf)
19711    }
19712    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19713        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19714        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19715    }
19716    fn write_header<Prev: Rec>(prev: &mut Prev) {
19717        let mut header = BuiltinNfgenmsg::new();
19718        header.cmd = 78u8;
19719        header.version = 1u8;
19720        prev.as_rec_mut().extend(header.as_slice());
19721    }
19722}
19723impl NetlinkRequest for OpLinecardGetDo<'_> {
19724    fn protocol(&self) -> Protocol {
19725        Protocol::Generic("devlink".as_bytes())
19726    }
19727    fn flags(&self) -> u16 {
19728        self.request.flags
19729    }
19730    fn payload(&self) -> &[u8] {
19731        self.request.buf()
19732    }
19733    type ReplyType<'buf> = IterableDevlink<'buf>;
19734    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19735        Self::decode_request(buf)
19736    }
19737    fn lookup(
19738        buf: &[u8],
19739        offset: usize,
19740        missing_type: Option<u16>,
19741    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19742        Self::decode_request(buf).lookup_attr(offset, missing_type)
19743    }
19744}
19745#[doc = "Set line card instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_linecard_index()](PushDevlink::push_linecard_index)\n- [.push_linecard_type()](PushDevlink::push_linecard_type)\n"]
19746#[derive(Debug)]
19747pub struct OpLinecardSetDo<'r> {
19748    request: Request<'r>,
19749}
19750impl<'r> OpLinecardSetDo<'r> {
19751    pub fn new(mut request: Request<'r>) -> Self {
19752        Self::write_header(request.buf_mut());
19753        Self { request: request }
19754    }
19755    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19756        Self::write_header(buf);
19757        PushDevlink::new(buf)
19758    }
19759    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19760        PushDevlink::new(self.request.buf_mut())
19761    }
19762    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19763        PushDevlink::new(self.request.buf)
19764    }
19765    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19766        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19767        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19768    }
19769    fn write_header<Prev: Rec>(prev: &mut Prev) {
19770        let mut header = BuiltinNfgenmsg::new();
19771        header.cmd = 79u8;
19772        header.version = 1u8;
19773        prev.as_rec_mut().extend(header.as_slice());
19774    }
19775}
19776impl NetlinkRequest for OpLinecardSetDo<'_> {
19777    fn protocol(&self) -> Protocol {
19778        Protocol::Generic("devlink".as_bytes())
19779    }
19780    fn flags(&self) -> u16 {
19781        self.request.flags
19782    }
19783    fn payload(&self) -> &[u8] {
19784        self.request.buf()
19785    }
19786    type ReplyType<'buf> = IterableDevlink<'buf>;
19787    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19788        Self::decode_request(buf)
19789    }
19790    fn lookup(
19791        buf: &[u8],
19792        offset: usize,
19793        missing_type: Option<u16>,
19794    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19795        Self::decode_request(buf).lookup_attr(offset, missing_type)
19796    }
19797}
19798#[doc = "Get device selftest instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n"]
19799#[derive(Debug)]
19800pub struct OpSelftestsGetDump<'r> {
19801    request: Request<'r>,
19802}
19803impl<'r> OpSelftestsGetDump<'r> {
19804    pub fn new(mut request: Request<'r>) -> Self {
19805        Self::write_header(request.buf_mut());
19806        Self {
19807            request: request.set_dump(),
19808        }
19809    }
19810    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19811        Self::write_header(buf);
19812        PushDevlink::new(buf)
19813    }
19814    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19815        PushDevlink::new(self.request.buf_mut())
19816    }
19817    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19818        PushDevlink::new(self.request.buf)
19819    }
19820    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19821        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19822        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19823    }
19824    fn write_header<Prev: Rec>(prev: &mut Prev) {
19825        let mut header = BuiltinNfgenmsg::new();
19826        header.cmd = 82u8;
19827        header.version = 1u8;
19828        prev.as_rec_mut().extend(header.as_slice());
19829    }
19830}
19831impl NetlinkRequest for OpSelftestsGetDump<'_> {
19832    fn protocol(&self) -> Protocol {
19833        Protocol::Generic("devlink".as_bytes())
19834    }
19835    fn flags(&self) -> u16 {
19836        self.request.flags
19837    }
19838    fn payload(&self) -> &[u8] {
19839        self.request.buf()
19840    }
19841    type ReplyType<'buf> = IterableDevlink<'buf>;
19842    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19843        Self::decode_request(buf)
19844    }
19845    fn lookup(
19846        buf: &[u8],
19847        offset: usize,
19848        missing_type: Option<u16>,
19849    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19850        Self::decode_request(buf).lookup_attr(offset, missing_type)
19851    }
19852}
19853#[doc = "Get device selftest instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n"]
19854#[derive(Debug)]
19855pub struct OpSelftestsGetDo<'r> {
19856    request: Request<'r>,
19857}
19858impl<'r> OpSelftestsGetDo<'r> {
19859    pub fn new(mut request: Request<'r>) -> Self {
19860        Self::write_header(request.buf_mut());
19861        Self { request: request }
19862    }
19863    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19864        Self::write_header(buf);
19865        PushDevlink::new(buf)
19866    }
19867    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19868        PushDevlink::new(self.request.buf_mut())
19869    }
19870    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19871        PushDevlink::new(self.request.buf)
19872    }
19873    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19874        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19875        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19876    }
19877    fn write_header<Prev: Rec>(prev: &mut Prev) {
19878        let mut header = BuiltinNfgenmsg::new();
19879        header.cmd = 82u8;
19880        header.version = 1u8;
19881        prev.as_rec_mut().extend(header.as_slice());
19882    }
19883}
19884impl NetlinkRequest for OpSelftestsGetDo<'_> {
19885    fn protocol(&self) -> Protocol {
19886        Protocol::Generic("devlink".as_bytes())
19887    }
19888    fn flags(&self) -> u16 {
19889        self.request.flags
19890    }
19891    fn payload(&self) -> &[u8] {
19892        self.request.buf()
19893    }
19894    type ReplyType<'buf> = IterableDevlink<'buf>;
19895    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19896        Self::decode_request(buf)
19897    }
19898    fn lookup(
19899        buf: &[u8],
19900        offset: usize,
19901        missing_type: Option<u16>,
19902    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19903        Self::decode_request(buf).lookup_attr(offset, missing_type)
19904    }
19905}
19906#[doc = "Run device selftest instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.nested_selftests()](PushDevlink::nested_selftests)\n"]
19907#[derive(Debug)]
19908pub struct OpSelftestsRunDo<'r> {
19909    request: Request<'r>,
19910}
19911impl<'r> OpSelftestsRunDo<'r> {
19912    pub fn new(mut request: Request<'r>) -> Self {
19913        Self::write_header(request.buf_mut());
19914        Self { request: request }
19915    }
19916    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19917        Self::write_header(buf);
19918        PushDevlink::new(buf)
19919    }
19920    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19921        PushDevlink::new(self.request.buf_mut())
19922    }
19923    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19924        PushDevlink::new(self.request.buf)
19925    }
19926    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19927        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19928        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19929    }
19930    fn write_header<Prev: Rec>(prev: &mut Prev) {
19931        let mut header = BuiltinNfgenmsg::new();
19932        header.cmd = 83u8;
19933        header.version = 1u8;
19934        prev.as_rec_mut().extend(header.as_slice());
19935    }
19936}
19937impl NetlinkRequest for OpSelftestsRunDo<'_> {
19938    fn protocol(&self) -> Protocol {
19939        Protocol::Generic("devlink".as_bytes())
19940    }
19941    fn flags(&self) -> u16 {
19942        self.request.flags
19943    }
19944    fn payload(&self) -> &[u8] {
19945        self.request.buf()
19946    }
19947    type ReplyType<'buf> = IterableDevlink<'buf>;
19948    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19949        Self::decode_request(buf)
19950    }
19951    fn lookup(
19952        buf: &[u8],
19953        offset: usize,
19954        missing_type: Option<u16>,
19955    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19956        Self::decode_request(buf).lookup_attr(offset, missing_type)
19957    }
19958}
19959#[doc = "Set notification messages socket filter\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
19960#[derive(Debug)]
19961pub struct OpNotifyFilterSetDo<'r> {
19962    request: Request<'r>,
19963}
19964impl<'r> OpNotifyFilterSetDo<'r> {
19965    pub fn new(mut request: Request<'r>) -> Self {
19966        Self::write_header(request.buf_mut());
19967        Self { request: request }
19968    }
19969    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19970        Self::write_header(buf);
19971        PushDevlink::new(buf)
19972    }
19973    pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19974        PushDevlink::new(self.request.buf_mut())
19975    }
19976    pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19977        PushDevlink::new(self.request.buf)
19978    }
19979    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19980        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19981        IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19982    }
19983    fn write_header<Prev: Rec>(prev: &mut Prev) {
19984        let mut header = BuiltinNfgenmsg::new();
19985        header.cmd = 84u8;
19986        header.version = 1u8;
19987        prev.as_rec_mut().extend(header.as_slice());
19988    }
19989}
19990impl NetlinkRequest for OpNotifyFilterSetDo<'_> {
19991    fn protocol(&self) -> Protocol {
19992        Protocol::Generic("devlink".as_bytes())
19993    }
19994    fn flags(&self) -> u16 {
19995        self.request.flags
19996    }
19997    fn payload(&self) -> &[u8] {
19998        self.request.buf()
19999    }
20000    type ReplyType<'buf> = IterableDevlink<'buf>;
20001    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
20002        Self::decode_request(buf)
20003    }
20004    fn lookup(
20005        buf: &[u8],
20006        offset: usize,
20007        missing_type: Option<u16>,
20008    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
20009        Self::decode_request(buf).lookup_attr(offset, missing_type)
20010    }
20011}
20012use crate::traits::LookupFn;
20013use crate::utils::RequestBuf;
20014#[derive(Debug)]
20015pub struct Request<'buf> {
20016    buf: RequestBuf<'buf>,
20017    flags: u16,
20018    writeback: Option<&'buf mut Option<RequestInfo>>,
20019}
20020#[allow(unused)]
20021#[derive(Debug, Clone)]
20022pub struct RequestInfo {
20023    protocol: Protocol,
20024    flags: u16,
20025    name: &'static str,
20026    lookup: LookupFn,
20027}
20028impl Request<'static> {
20029    pub fn new() -> Self {
20030        Self::new_from_buf(Vec::new())
20031    }
20032    pub fn new_from_buf(buf: Vec<u8>) -> Self {
20033        Self {
20034            flags: 0,
20035            buf: RequestBuf::Own(buf),
20036            writeback: None,
20037        }
20038    }
20039    pub fn into_buf(self) -> Vec<u8> {
20040        match self.buf {
20041            RequestBuf::Own(buf) => buf,
20042            _ => unreachable!(),
20043        }
20044    }
20045}
20046impl<'buf> Request<'buf> {
20047    pub fn new_with_buf(buf: &'buf mut Vec<u8>) -> Self {
20048        buf.clear();
20049        Self::new_extend(buf)
20050    }
20051    pub fn new_extend(buf: &'buf mut Vec<u8>) -> Self {
20052        Self {
20053            flags: 0,
20054            buf: RequestBuf::Ref(buf),
20055            writeback: None,
20056        }
20057    }
20058    fn do_writeback(&mut self, protocol: Protocol, name: &'static str, lookup: LookupFn) {
20059        let Some(writeback) = &mut self.writeback else {
20060            return;
20061        };
20062        **writeback = Some(RequestInfo {
20063            protocol,
20064            flags: self.flags,
20065            name,
20066            lookup,
20067        })
20068    }
20069    pub fn buf(&self) -> &Vec<u8> {
20070        self.buf.buf()
20071    }
20072    pub fn buf_mut(&mut self) -> &mut Vec<u8> {
20073        self.buf.buf_mut()
20074    }
20075    #[doc = "Set `NLM_F_CREATE` flag"]
20076    pub fn set_create(mut self) -> Self {
20077        self.flags |= consts::NLM_F_CREATE as u16;
20078        self
20079    }
20080    #[doc = "Set `NLM_F_EXCL` flag"]
20081    pub fn set_excl(mut self) -> Self {
20082        self.flags |= consts::NLM_F_EXCL as u16;
20083        self
20084    }
20085    #[doc = "Set `NLM_F_REPLACE` flag"]
20086    pub fn set_replace(mut self) -> Self {
20087        self.flags |= consts::NLM_F_REPLACE as u16;
20088        self
20089    }
20090    #[doc = "Set `NLM_F_CREATE` and `NLM_F_REPLACE` flag"]
20091    pub fn set_change(self) -> Self {
20092        self.set_create().set_replace()
20093    }
20094    #[doc = "Set `NLM_F_APPEND` flag"]
20095    pub fn set_append(mut self) -> Self {
20096        self.flags |= consts::NLM_F_APPEND as u16;
20097        self
20098    }
20099    #[doc = "Set `self.flags |= flags`"]
20100    pub fn set_flags(mut self, flags: u16) -> Self {
20101        self.flags |= flags;
20102        self
20103    }
20104    #[doc = "Set `self.flags ^= self.flags & flags`"]
20105    pub fn unset_flags(mut self, flags: u16) -> Self {
20106        self.flags ^= self.flags & flags;
20107        self
20108    }
20109    #[doc = "Set `NLM_F_DUMP` flag"]
20110    fn set_dump(mut self) -> Self {
20111        self.flags |= consts::NLM_F_DUMP as u16;
20112        self
20113    }
20114    #[doc = "Get devlink instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_failed()](IterableDevlink::get_reload_failed)\n- [.get_dev_stats()](IterableDevlink::get_dev_stats)\n"]
20115    pub fn op_get_dump(self) -> OpGetDump<'buf> {
20116        let mut res = OpGetDump::new(self);
20117        res.request
20118            .do_writeback(res.protocol(), "op-get-dump", OpGetDump::lookup);
20119        res
20120    }
20121    #[doc = "Get devlink instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_failed()](IterableDevlink::get_reload_failed)\n- [.get_dev_stats()](IterableDevlink::get_dev_stats)\n"]
20122    pub fn op_get_do(self) -> OpGetDo<'buf> {
20123        let mut res = OpGetDo::new(self);
20124        res.request
20125            .do_writeback(res.protocol(), "op-get-do", OpGetDo::lookup);
20126        res
20127    }
20128    #[doc = "Get devlink port instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
20129    pub fn op_port_get_dump(self) -> OpPortGetDump<'buf> {
20130        let mut res = OpPortGetDump::new(self);
20131        res.request
20132            .do_writeback(res.protocol(), "op-port-get-dump", OpPortGetDump::lookup);
20133        res
20134    }
20135    #[doc = "Get devlink port instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
20136    pub fn op_port_get_do(self) -> OpPortGetDo<'buf> {
20137        let mut res = OpPortGetDo::new(self);
20138        res.request
20139            .do_writeback(res.protocol(), "op-port-get-do", OpPortGetDo::lookup);
20140        res
20141    }
20142    #[doc = "Set devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_type()](PushDevlink::push_port_type)\n- [.nested_port_function()](PushDevlink::nested_port_function)\n"]
20143    pub fn op_port_set_do(self) -> OpPortSetDo<'buf> {
20144        let mut res = OpPortSetDo::new(self);
20145        res.request
20146            .do_writeback(res.protocol(), "op-port-set-do", OpPortSetDo::lookup);
20147        res
20148    }
20149    #[doc = "Create devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_flavour()](PushDevlink::push_port_flavour)\n- [.push_port_pci_pf_number()](PushDevlink::push_port_pci_pf_number)\n- [.push_port_controller_number()](PushDevlink::push_port_controller_number)\n- [.push_port_pci_sf_number()](PushDevlink::push_port_pci_sf_number)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
20150    pub fn op_port_new_do(self) -> OpPortNewDo<'buf> {
20151        let mut res = OpPortNewDo::new(self);
20152        res.request
20153            .do_writeback(res.protocol(), "op-port-new-do", OpPortNewDo::lookup);
20154        res
20155    }
20156    #[doc = "Delete devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
20157    pub fn op_port_del_do(self) -> OpPortDelDo<'buf> {
20158        let mut res = OpPortDelDo::new(self);
20159        res.request
20160            .do_writeback(res.protocol(), "op-port-del-do", OpPortDelDo::lookup);
20161        res
20162    }
20163    #[doc = "Split devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_split_count()](PushDevlink::push_port_split_count)\n"]
20164    pub fn op_port_split_do(self) -> OpPortSplitDo<'buf> {
20165        let mut res = OpPortSplitDo::new(self);
20166        res.request
20167            .do_writeback(res.protocol(), "op-port-split-do", OpPortSplitDo::lookup);
20168        res
20169    }
20170    #[doc = "Unplit devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
20171    pub fn op_port_unsplit_do(self) -> OpPortUnsplitDo<'buf> {
20172        let mut res = OpPortUnsplitDo::new(self);
20173        res.request.do_writeback(
20174            res.protocol(),
20175            "op-port-unsplit-do",
20176            OpPortUnsplitDo::lookup,
20177        );
20178        res
20179    }
20180    #[doc = "Get shared buffer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n"]
20181    pub fn op_sb_get_dump(self) -> OpSbGetDump<'buf> {
20182        let mut res = OpSbGetDump::new(self);
20183        res.request
20184            .do_writeback(res.protocol(), "op-sb-get-dump", OpSbGetDump::lookup);
20185        res
20186    }
20187    #[doc = "Get shared buffer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n"]
20188    pub fn op_sb_get_do(self) -> OpSbGetDo<'buf> {
20189        let mut res = OpSbGetDo::new(self);
20190        res.request
20191            .do_writeback(res.protocol(), "op-sb-get-do", OpSbGetDo::lookup);
20192        res
20193    }
20194    #[doc = "Get shared buffer pool instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
20195    pub fn op_sb_pool_get_dump(self) -> OpSbPoolGetDump<'buf> {
20196        let mut res = OpSbPoolGetDump::new(self);
20197        res.request.do_writeback(
20198            res.protocol(),
20199            "op-sb-pool-get-dump",
20200            OpSbPoolGetDump::lookup,
20201        );
20202        res
20203    }
20204    #[doc = "Get shared buffer pool instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
20205    pub fn op_sb_pool_get_do(self) -> OpSbPoolGetDo<'buf> {
20206        let mut res = OpSbPoolGetDo::new(self);
20207        res.request
20208            .do_writeback(res.protocol(), "op-sb-pool-get-do", OpSbPoolGetDo::lookup);
20209        res
20210    }
20211    #[doc = "Set shared buffer pool instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_pool_size()](PushDevlink::push_sb_pool_size)\n- [.push_sb_pool_threshold_type()](PushDevlink::push_sb_pool_threshold_type)\n"]
20212    pub fn op_sb_pool_set_do(self) -> OpSbPoolSetDo<'buf> {
20213        let mut res = OpSbPoolSetDo::new(self);
20214        res.request
20215            .do_writeback(res.protocol(), "op-sb-pool-set-do", OpSbPoolSetDo::lookup);
20216        res
20217    }
20218    #[doc = "Get shared buffer port\\-pool combinations and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
20219    pub fn op_sb_port_pool_get_dump(self) -> OpSbPortPoolGetDump<'buf> {
20220        let mut res = OpSbPortPoolGetDump::new(self);
20221        res.request.do_writeback(
20222            res.protocol(),
20223            "op-sb-port-pool-get-dump",
20224            OpSbPortPoolGetDump::lookup,
20225        );
20226        res
20227    }
20228    #[doc = "Get shared buffer port\\-pool combinations and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
20229    pub fn op_sb_port_pool_get_do(self) -> OpSbPortPoolGetDo<'buf> {
20230        let mut res = OpSbPortPoolGetDo::new(self);
20231        res.request.do_writeback(
20232            res.protocol(),
20233            "op-sb-port-pool-get-do",
20234            OpSbPortPoolGetDo::lookup,
20235        );
20236        res
20237    }
20238    #[doc = "Set shared buffer port\\-pool combinations and threshold\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_threshold()](PushDevlink::push_sb_threshold)\n"]
20239    pub fn op_sb_port_pool_set_do(self) -> OpSbPortPoolSetDo<'buf> {
20240        let mut res = OpSbPortPoolSetDo::new(self);
20241        res.request.do_writeback(
20242            res.protocol(),
20243            "op-sb-port-pool-set-do",
20244            OpSbPortPoolSetDo::lookup,
20245        );
20246        res
20247    }
20248    #[doc = "Get shared buffer port\\-TC to pool bindings and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_type()](IterableDevlink::get_sb_pool_type)\n- [.get_sb_tc_index()](IterableDevlink::get_sb_tc_index)\n"]
20249    pub fn op_sb_tc_pool_bind_get_dump(self) -> OpSbTcPoolBindGetDump<'buf> {
20250        let mut res = OpSbTcPoolBindGetDump::new(self);
20251        res.request.do_writeback(
20252            res.protocol(),
20253            "op-sb-tc-pool-bind-get-dump",
20254            OpSbTcPoolBindGetDump::lookup,
20255        );
20256        res
20257    }
20258    #[doc = "Get shared buffer port\\-TC to pool bindings and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_type()](PushDevlink::push_sb_pool_type)\n- [.push_sb_tc_index()](PushDevlink::push_sb_tc_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_type()](IterableDevlink::get_sb_pool_type)\n- [.get_sb_tc_index()](IterableDevlink::get_sb_tc_index)\n"]
20259    pub fn op_sb_tc_pool_bind_get_do(self) -> OpSbTcPoolBindGetDo<'buf> {
20260        let mut res = OpSbTcPoolBindGetDo::new(self);
20261        res.request.do_writeback(
20262            res.protocol(),
20263            "op-sb-tc-pool-bind-get-do",
20264            OpSbTcPoolBindGetDo::lookup,
20265        );
20266        res
20267    }
20268    #[doc = "Set shared buffer port\\-TC to pool bindings and threshold\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_pool_type()](PushDevlink::push_sb_pool_type)\n- [.push_sb_threshold()](PushDevlink::push_sb_threshold)\n- [.push_sb_tc_index()](PushDevlink::push_sb_tc_index)\n"]
20269    pub fn op_sb_tc_pool_bind_set_do(self) -> OpSbTcPoolBindSetDo<'buf> {
20270        let mut res = OpSbTcPoolBindSetDo::new(self);
20271        res.request.do_writeback(
20272            res.protocol(),
20273            "op-sb-tc-pool-bind-set-do",
20274            OpSbTcPoolBindSetDo::lookup,
20275        );
20276        res
20277    }
20278    #[doc = "Take occupancy snapshot of shared buffer\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n"]
20279    pub fn op_sb_occ_snapshot_do(self) -> OpSbOccSnapshotDo<'buf> {
20280        let mut res = OpSbOccSnapshotDo::new(self);
20281        res.request.do_writeback(
20282            res.protocol(),
20283            "op-sb-occ-snapshot-do",
20284            OpSbOccSnapshotDo::lookup,
20285        );
20286        res
20287    }
20288    #[doc = "Clear occupancy watermarks of shared buffer\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n"]
20289    pub fn op_sb_occ_max_clear_do(self) -> OpSbOccMaxClearDo<'buf> {
20290        let mut res = OpSbOccMaxClearDo::new(self);
20291        res.request.do_writeback(
20292            res.protocol(),
20293            "op-sb-occ-max-clear-do",
20294            OpSbOccMaxClearDo::lookup,
20295        );
20296        res
20297    }
20298    #[doc = "Get eswitch attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_eswitch_mode()](IterableDevlink::get_eswitch_mode)\n- [.get_eswitch_inline_mode()](IterableDevlink::get_eswitch_inline_mode)\n- [.get_eswitch_encap_mode()](IterableDevlink::get_eswitch_encap_mode)\n"]
20299    pub fn op_eswitch_get_do(self) -> OpEswitchGetDo<'buf> {
20300        let mut res = OpEswitchGetDo::new(self);
20301        res.request
20302            .do_writeback(res.protocol(), "op-eswitch-get-do", OpEswitchGetDo::lookup);
20303        res
20304    }
20305    #[doc = "Set eswitch attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_eswitch_mode()](PushDevlink::push_eswitch_mode)\n- [.push_eswitch_inline_mode()](PushDevlink::push_eswitch_inline_mode)\n- [.push_eswitch_encap_mode()](PushDevlink::push_eswitch_encap_mode)\n"]
20306    pub fn op_eswitch_set_do(self) -> OpEswitchSetDo<'buf> {
20307        let mut res = OpEswitchSetDo::new(self);
20308        res.request
20309            .do_writeback(res.protocol(), "op-eswitch-set-do", OpEswitchSetDo::lookup);
20310        res
20311    }
20312    #[doc = "Get dpipe table attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_tables()](IterableDevlink::get_dpipe_tables)\n"]
20313    pub fn op_dpipe_table_get_do(self) -> OpDpipeTableGetDo<'buf> {
20314        let mut res = OpDpipeTableGetDo::new(self);
20315        res.request.do_writeback(
20316            res.protocol(),
20317            "op-dpipe-table-get-do",
20318            OpDpipeTableGetDo::lookup,
20319        );
20320        res
20321    }
20322    #[doc = "Get dpipe entries attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_entries()](IterableDevlink::get_dpipe_entries)\n"]
20323    pub fn op_dpipe_entries_get_do(self) -> OpDpipeEntriesGetDo<'buf> {
20324        let mut res = OpDpipeEntriesGetDo::new(self);
20325        res.request.do_writeback(
20326            res.protocol(),
20327            "op-dpipe-entries-get-do",
20328            OpDpipeEntriesGetDo::lookup,
20329        );
20330        res
20331    }
20332    #[doc = "Get dpipe headers attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_headers()](IterableDevlink::get_dpipe_headers)\n"]
20333    pub fn op_dpipe_headers_get_do(self) -> OpDpipeHeadersGetDo<'buf> {
20334        let mut res = OpDpipeHeadersGetDo::new(self);
20335        res.request.do_writeback(
20336            res.protocol(),
20337            "op-dpipe-headers-get-do",
20338            OpDpipeHeadersGetDo::lookup,
20339        );
20340        res
20341    }
20342    #[doc = "Set dpipe counter attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n- [.push_dpipe_table_counters_enabled()](PushDevlink::push_dpipe_table_counters_enabled)\n"]
20343    pub fn op_dpipe_table_counters_set_do(self) -> OpDpipeTableCountersSetDo<'buf> {
20344        let mut res = OpDpipeTableCountersSetDo::new(self);
20345        res.request.do_writeback(
20346            res.protocol(),
20347            "op-dpipe-table-counters-set-do",
20348            OpDpipeTableCountersSetDo::lookup,
20349        );
20350        res
20351    }
20352    #[doc = "Set resource attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_resource_id()](PushDevlink::push_resource_id)\n- [.push_resource_size()](PushDevlink::push_resource_size)\n"]
20353    pub fn op_resource_set_do(self) -> OpResourceSetDo<'buf> {
20354        let mut res = OpResourceSetDo::new(self);
20355        res.request.do_writeback(
20356            res.protocol(),
20357            "op-resource-set-do",
20358            OpResourceSetDo::lookup,
20359        );
20360        res
20361    }
20362    #[doc = "Get resource attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_resource_list()](IterableDevlink::get_resource_list)\n"]
20363    pub fn op_resource_dump_do(self) -> OpResourceDumpDo<'buf> {
20364        let mut res = OpResourceDumpDo::new(self);
20365        res.request.do_writeback(
20366            res.protocol(),
20367            "op-resource-dump-do",
20368            OpResourceDumpDo::lookup,
20369        );
20370        res
20371    }
20372    #[doc = "Reload devlink\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_netns_fd()](PushDevlink::push_netns_fd)\n- [.push_netns_pid()](PushDevlink::push_netns_pid)\n- [.push_netns_id()](PushDevlink::push_netns_id)\n- [.push_reload_action()](PushDevlink::push_reload_action)\n- [.push_reload_limits()](PushDevlink::push_reload_limits)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_actions_performed()](IterableDevlink::get_reload_actions_performed)\n"]
20373    pub fn op_reload_do(self) -> OpReloadDo<'buf> {
20374        let mut res = OpReloadDo::new(self);
20375        res.request
20376            .do_writeback(res.protocol(), "op-reload-do", OpReloadDo::lookup);
20377        res
20378    }
20379    #[doc = "Get param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_param_name()](IterableDevlink::get_param_name)\n"]
20380    pub fn op_param_get_dump(self) -> OpParamGetDump<'buf> {
20381        let mut res = OpParamGetDump::new(self);
20382        res.request
20383            .do_writeback(res.protocol(), "op-param-get-dump", OpParamGetDump::lookup);
20384        res
20385    }
20386    #[doc = "Get param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_param_name()](PushDevlink::push_param_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_param_name()](IterableDevlink::get_param_name)\n"]
20387    pub fn op_param_get_do(self) -> OpParamGetDo<'buf> {
20388        let mut res = OpParamGetDo::new(self);
20389        res.request
20390            .do_writeback(res.protocol(), "op-param-get-do", OpParamGetDo::lookup);
20391        res
20392    }
20393    #[doc = "Set param instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_param_name()](PushDevlink::push_param_name)\n- [.push_param_type()](PushDevlink::push_param_type)\n- [.push_param_value_cmode()](PushDevlink::push_param_value_cmode)\n- [.push_param_reset_default()](PushDevlink::push_param_reset_default)\n"]
20394    pub fn op_param_set_do(self) -> OpParamSetDo<'buf> {
20395        let mut res = OpParamSetDo::new(self);
20396        res.request
20397            .do_writeback(res.protocol(), "op-param-set-do", OpParamSetDo::lookup);
20398        res
20399    }
20400    #[doc = "Get region instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
20401    pub fn op_region_get_dump(self) -> OpRegionGetDump<'buf> {
20402        let mut res = OpRegionGetDump::new(self);
20403        res.request.do_writeback(
20404            res.protocol(),
20405            "op-region-get-dump",
20406            OpRegionGetDump::lookup,
20407        );
20408        res
20409    }
20410    #[doc = "Get region instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
20411    pub fn op_region_get_do(self) -> OpRegionGetDo<'buf> {
20412        let mut res = OpRegionGetDo::new(self);
20413        res.request
20414            .do_writeback(res.protocol(), "op-region-get-do", OpRegionGetDo::lookup);
20415        res
20416    }
20417    #[doc = "Create region snapshot\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n- [.get_region_snapshot_id()](IterableDevlink::get_region_snapshot_id)\n"]
20418    pub fn op_region_new_do(self) -> OpRegionNewDo<'buf> {
20419        let mut res = OpRegionNewDo::new(self);
20420        res.request
20421            .do_writeback(res.protocol(), "op-region-new-do", OpRegionNewDo::lookup);
20422        res
20423    }
20424    #[doc = "Delete region snapshot\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n"]
20425    pub fn op_region_del_do(self) -> OpRegionDelDo<'buf> {
20426        let mut res = OpRegionDelDo::new(self);
20427        res.request
20428            .do_writeback(res.protocol(), "op-region-del-do", OpRegionDelDo::lookup);
20429        res
20430    }
20431    #[doc = "Read region data\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n- [.push_region_chunk_addr()](PushDevlink::push_region_chunk_addr)\n- [.push_region_chunk_len()](PushDevlink::push_region_chunk_len)\n- [.push_region_direct()](PushDevlink::push_region_direct)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
20432    pub fn op_region_read_dump(self) -> OpRegionReadDump<'buf> {
20433        let mut res = OpRegionReadDump::new(self);
20434        res.request.do_writeback(
20435            res.protocol(),
20436            "op-region-read-dump",
20437            OpRegionReadDump::lookup,
20438        );
20439        res
20440    }
20441    #[doc = "Get port param instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
20442    pub fn op_port_param_get_dump(self) -> OpPortParamGetDump<'buf> {
20443        let mut res = OpPortParamGetDump::new(self);
20444        res.request.do_writeback(
20445            res.protocol(),
20446            "op-port-param-get-dump",
20447            OpPortParamGetDump::lookup,
20448        );
20449        res
20450    }
20451    #[doc = "Get port param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
20452    pub fn op_port_param_get_do(self) -> OpPortParamGetDo<'buf> {
20453        let mut res = OpPortParamGetDo::new(self);
20454        res.request.do_writeback(
20455            res.protocol(),
20456            "op-port-param-get-do",
20457            OpPortParamGetDo::lookup,
20458        );
20459        res
20460    }
20461    #[doc = "Set port param instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
20462    pub fn op_port_param_set_do(self) -> OpPortParamSetDo<'buf> {
20463        let mut res = OpPortParamSetDo::new(self);
20464        res.request.do_writeback(
20465            res.protocol(),
20466            "op-port-param-set-do",
20467            OpPortParamSetDo::lookup,
20468        );
20469        res
20470    }
20471    #[doc = "Get device information, like driver name, hardware and firmware versions\netc\\.\n\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_info_driver_name()](IterableDevlink::get_info_driver_name)\n- [.get_info_serial_number()](IterableDevlink::get_info_serial_number)\n- [.get_info_version_fixed()](IterableDevlink::get_info_version_fixed)\n- [.get_info_version_running()](IterableDevlink::get_info_version_running)\n- [.get_info_version_stored()](IterableDevlink::get_info_version_stored)\n- [.get_info_board_serial_number()](IterableDevlink::get_info_board_serial_number)\n"]
20472    pub fn op_info_get_dump(self) -> OpInfoGetDump<'buf> {
20473        let mut res = OpInfoGetDump::new(self);
20474        res.request
20475            .do_writeback(res.protocol(), "op-info-get-dump", OpInfoGetDump::lookup);
20476        res
20477    }
20478    #[doc = "Get device information, like driver name, hardware and firmware versions\netc\\.\n\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_info_driver_name()](IterableDevlink::get_info_driver_name)\n- [.get_info_serial_number()](IterableDevlink::get_info_serial_number)\n- [.get_info_version_fixed()](IterableDevlink::get_info_version_fixed)\n- [.get_info_version_running()](IterableDevlink::get_info_version_running)\n- [.get_info_version_stored()](IterableDevlink::get_info_version_stored)\n- [.get_info_board_serial_number()](IterableDevlink::get_info_board_serial_number)\n"]
20479    pub fn op_info_get_do(self) -> OpInfoGetDo<'buf> {
20480        let mut res = OpInfoGetDo::new(self);
20481        res.request
20482            .do_writeback(res.protocol(), "op-info-get-do", OpInfoGetDo::lookup);
20483        res
20484    }
20485    #[doc = "Get health reporter instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_health_reporter_name()](IterableDevlink::get_health_reporter_name)\n"]
20486    pub fn op_health_reporter_get_dump(self) -> OpHealthReporterGetDump<'buf> {
20487        let mut res = OpHealthReporterGetDump::new(self);
20488        res.request.do_writeback(
20489            res.protocol(),
20490            "op-health-reporter-get-dump",
20491            OpHealthReporterGetDump::lookup,
20492        );
20493        res
20494    }
20495    #[doc = "Get health reporter instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_health_reporter_name()](IterableDevlink::get_health_reporter_name)\n"]
20496    pub fn op_health_reporter_get_do(self) -> OpHealthReporterGetDo<'buf> {
20497        let mut res = OpHealthReporterGetDo::new(self);
20498        res.request.do_writeback(
20499            res.protocol(),
20500            "op-health-reporter-get-do",
20501            OpHealthReporterGetDo::lookup,
20502        );
20503        res
20504    }
20505    #[doc = "Set health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n- [.push_health_reporter_graceful_period()](PushDevlink::push_health_reporter_graceful_period)\n- [.push_health_reporter_auto_recover()](PushDevlink::push_health_reporter_auto_recover)\n- [.push_health_reporter_auto_dump()](PushDevlink::push_health_reporter_auto_dump)\n- [.push_health_reporter_burst_period()](PushDevlink::push_health_reporter_burst_period)\n"]
20506    pub fn op_health_reporter_set_do(self) -> OpHealthReporterSetDo<'buf> {
20507        let mut res = OpHealthReporterSetDo::new(self);
20508        res.request.do_writeback(
20509            res.protocol(),
20510            "op-health-reporter-set-do",
20511            OpHealthReporterSetDo::lookup,
20512        );
20513        res
20514    }
20515    #[doc = "Recover health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
20516    pub fn op_health_reporter_recover_do(self) -> OpHealthReporterRecoverDo<'buf> {
20517        let mut res = OpHealthReporterRecoverDo::new(self);
20518        res.request.do_writeback(
20519            res.protocol(),
20520            "op-health-reporter-recover-do",
20521            OpHealthReporterRecoverDo::lookup,
20522        );
20523        res
20524    }
20525    #[doc = "Diagnose health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
20526    pub fn op_health_reporter_diagnose_do(self) -> OpHealthReporterDiagnoseDo<'buf> {
20527        let mut res = OpHealthReporterDiagnoseDo::new(self);
20528        res.request.do_writeback(
20529            res.protocol(),
20530            "op-health-reporter-diagnose-do",
20531            OpHealthReporterDiagnoseDo::lookup,
20532        );
20533        res
20534    }
20535    #[doc = "Dump health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n\nReply attributes:\n- [.get_fmsg()](IterableDevlink::get_fmsg)\n"]
20536    pub fn op_health_reporter_dump_get_dump(self) -> OpHealthReporterDumpGetDump<'buf> {
20537        let mut res = OpHealthReporterDumpGetDump::new(self);
20538        res.request.do_writeback(
20539            res.protocol(),
20540            "op-health-reporter-dump-get-dump",
20541            OpHealthReporterDumpGetDump::lookup,
20542        );
20543        res
20544    }
20545    #[doc = "Clear dump of health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
20546    pub fn op_health_reporter_dump_clear_do(self) -> OpHealthReporterDumpClearDo<'buf> {
20547        let mut res = OpHealthReporterDumpClearDo::new(self);
20548        res.request.do_writeback(
20549            res.protocol(),
20550            "op-health-reporter-dump-clear-do",
20551            OpHealthReporterDumpClearDo::lookup,
20552        );
20553        res
20554    }
20555    #[doc = "Flash update devlink instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_flash_update_file_name()](PushDevlink::push_flash_update_file_name)\n- [.push_flash_update_component()](PushDevlink::push_flash_update_component)\n- [.push_flash_update_overwrite_mask()](PushDevlink::push_flash_update_overwrite_mask)\n"]
20556    pub fn op_flash_update_do(self) -> OpFlashUpdateDo<'buf> {
20557        let mut res = OpFlashUpdateDo::new(self);
20558        res.request.do_writeback(
20559            res.protocol(),
20560            "op-flash-update-do",
20561            OpFlashUpdateDo::lookup,
20562        );
20563        res
20564    }
20565    #[doc = "Get trap instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_name()](IterableDevlink::get_trap_name)\n"]
20566    pub fn op_trap_get_dump(self) -> OpTrapGetDump<'buf> {
20567        let mut res = OpTrapGetDump::new(self);
20568        res.request
20569            .do_writeback(res.protocol(), "op-trap-get-dump", OpTrapGetDump::lookup);
20570        res
20571    }
20572    #[doc = "Get trap instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_name()](PushDevlink::push_trap_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_name()](IterableDevlink::get_trap_name)\n"]
20573    pub fn op_trap_get_do(self) -> OpTrapGetDo<'buf> {
20574        let mut res = OpTrapGetDo::new(self);
20575        res.request
20576            .do_writeback(res.protocol(), "op-trap-get-do", OpTrapGetDo::lookup);
20577        res
20578    }
20579    #[doc = "Set trap instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_name()](PushDevlink::push_trap_name)\n- [.push_trap_action()](PushDevlink::push_trap_action)\n"]
20580    pub fn op_trap_set_do(self) -> OpTrapSetDo<'buf> {
20581        let mut res = OpTrapSetDo::new(self);
20582        res.request
20583            .do_writeback(res.protocol(), "op-trap-set-do", OpTrapSetDo::lookup);
20584        res
20585    }
20586    #[doc = "Get trap group instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_group_name()](IterableDevlink::get_trap_group_name)\n"]
20587    pub fn op_trap_group_get_dump(self) -> OpTrapGroupGetDump<'buf> {
20588        let mut res = OpTrapGroupGetDump::new(self);
20589        res.request.do_writeback(
20590            res.protocol(),
20591            "op-trap-group-get-dump",
20592            OpTrapGroupGetDump::lookup,
20593        );
20594        res
20595    }
20596    #[doc = "Get trap group instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_group_name()](PushDevlink::push_trap_group_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_group_name()](IterableDevlink::get_trap_group_name)\n"]
20597    pub fn op_trap_group_get_do(self) -> OpTrapGroupGetDo<'buf> {
20598        let mut res = OpTrapGroupGetDo::new(self);
20599        res.request.do_writeback(
20600            res.protocol(),
20601            "op-trap-group-get-do",
20602            OpTrapGroupGetDo::lookup,
20603        );
20604        res
20605    }
20606    #[doc = "Set trap group instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_action()](PushDevlink::push_trap_action)\n- [.push_trap_group_name()](PushDevlink::push_trap_group_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n"]
20607    pub fn op_trap_group_set_do(self) -> OpTrapGroupSetDo<'buf> {
20608        let mut res = OpTrapGroupSetDo::new(self);
20609        res.request.do_writeback(
20610            res.protocol(),
20611            "op-trap-group-set-do",
20612            OpTrapGroupSetDo::lookup,
20613        );
20614        res
20615    }
20616    #[doc = "Get trap policer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_policer_id()](IterableDevlink::get_trap_policer_id)\n"]
20617    pub fn op_trap_policer_get_dump(self) -> OpTrapPolicerGetDump<'buf> {
20618        let mut res = OpTrapPolicerGetDump::new(self);
20619        res.request.do_writeback(
20620            res.protocol(),
20621            "op-trap-policer-get-dump",
20622            OpTrapPolicerGetDump::lookup,
20623        );
20624        res
20625    }
20626    #[doc = "Get trap policer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_policer_id()](IterableDevlink::get_trap_policer_id)\n"]
20627    pub fn op_trap_policer_get_do(self) -> OpTrapPolicerGetDo<'buf> {
20628        let mut res = OpTrapPolicerGetDo::new(self);
20629        res.request.do_writeback(
20630            res.protocol(),
20631            "op-trap-policer-get-do",
20632            OpTrapPolicerGetDo::lookup,
20633        );
20634        res
20635    }
20636    #[doc = "Get trap policer instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n- [.push_trap_policer_rate()](PushDevlink::push_trap_policer_rate)\n- [.push_trap_policer_burst()](PushDevlink::push_trap_policer_burst)\n"]
20637    pub fn op_trap_policer_set_do(self) -> OpTrapPolicerSetDo<'buf> {
20638        let mut res = OpTrapPolicerSetDo::new(self);
20639        res.request.do_writeback(
20640            res.protocol(),
20641            "op-trap-policer-set-do",
20642            OpTrapPolicerSetDo::lookup,
20643        );
20644        res
20645    }
20646    #[doc = "Test health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
20647    pub fn op_health_reporter_test_do(self) -> OpHealthReporterTestDo<'buf> {
20648        let mut res = OpHealthReporterTestDo::new(self);
20649        res.request.do_writeback(
20650            res.protocol(),
20651            "op-health-reporter-test-do",
20652            OpHealthReporterTestDo::lookup,
20653        );
20654        res
20655    }
20656    #[doc = "Get rate instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_rate_node_name()](IterableDevlink::get_rate_node_name)\n"]
20657    pub fn op_rate_get_dump(self) -> OpRateGetDump<'buf> {
20658        let mut res = OpRateGetDump::new(self);
20659        res.request
20660            .do_writeback(res.protocol(), "op-rate-get-dump", OpRateGetDump::lookup);
20661        res
20662    }
20663    #[doc = "Get rate instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_rate_node_name()](IterableDevlink::get_rate_node_name)\n"]
20664    pub fn op_rate_get_do(self) -> OpRateGetDo<'buf> {
20665        let mut res = OpRateGetDo::new(self);
20666        res.request
20667            .do_writeback(res.protocol(), "op-rate-get-do", OpRateGetDo::lookup);
20668        res
20669    }
20670    #[doc = "Set rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_tx_share()](PushDevlink::push_rate_tx_share)\n- [.push_rate_tx_max()](PushDevlink::push_rate_tx_max)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n- [.push_rate_parent_node_name()](PushDevlink::push_rate_parent_node_name)\n- [.push_rate_tx_priority()](PushDevlink::push_rate_tx_priority)\n- [.push_rate_tx_weight()](PushDevlink::push_rate_tx_weight)\n- [.nested_rate_tc_bws()](PushDevlink::nested_rate_tc_bws)\n"]
20671    pub fn op_rate_set_do(self) -> OpRateSetDo<'buf> {
20672        let mut res = OpRateSetDo::new(self);
20673        res.request
20674            .do_writeback(res.protocol(), "op-rate-set-do", OpRateSetDo::lookup);
20675        res
20676    }
20677    #[doc = "Create rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_tx_share()](PushDevlink::push_rate_tx_share)\n- [.push_rate_tx_max()](PushDevlink::push_rate_tx_max)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n- [.push_rate_parent_node_name()](PushDevlink::push_rate_parent_node_name)\n- [.push_rate_tx_priority()](PushDevlink::push_rate_tx_priority)\n- [.push_rate_tx_weight()](PushDevlink::push_rate_tx_weight)\n- [.nested_rate_tc_bws()](PushDevlink::nested_rate_tc_bws)\n"]
20678    pub fn op_rate_new_do(self) -> OpRateNewDo<'buf> {
20679        let mut res = OpRateNewDo::new(self);
20680        res.request
20681            .do_writeback(res.protocol(), "op-rate-new-do", OpRateNewDo::lookup);
20682        res
20683    }
20684    #[doc = "Delete rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n"]
20685    pub fn op_rate_del_do(self) -> OpRateDelDo<'buf> {
20686        let mut res = OpRateDelDo::new(self);
20687        res.request
20688            .do_writeback(res.protocol(), "op-rate-del-do", OpRateDelDo::lookup);
20689        res
20690    }
20691    #[doc = "Get line card instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_linecard_index()](IterableDevlink::get_linecard_index)\n"]
20692    pub fn op_linecard_get_dump(self) -> OpLinecardGetDump<'buf> {
20693        let mut res = OpLinecardGetDump::new(self);
20694        res.request.do_writeback(
20695            res.protocol(),
20696            "op-linecard-get-dump",
20697            OpLinecardGetDump::lookup,
20698        );
20699        res
20700    }
20701    #[doc = "Get line card instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_linecard_index()](PushDevlink::push_linecard_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_linecard_index()](IterableDevlink::get_linecard_index)\n"]
20702    pub fn op_linecard_get_do(self) -> OpLinecardGetDo<'buf> {
20703        let mut res = OpLinecardGetDo::new(self);
20704        res.request.do_writeback(
20705            res.protocol(),
20706            "op-linecard-get-do",
20707            OpLinecardGetDo::lookup,
20708        );
20709        res
20710    }
20711    #[doc = "Set line card instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_linecard_index()](PushDevlink::push_linecard_index)\n- [.push_linecard_type()](PushDevlink::push_linecard_type)\n"]
20712    pub fn op_linecard_set_do(self) -> OpLinecardSetDo<'buf> {
20713        let mut res = OpLinecardSetDo::new(self);
20714        res.request.do_writeback(
20715            res.protocol(),
20716            "op-linecard-set-do",
20717            OpLinecardSetDo::lookup,
20718        );
20719        res
20720    }
20721    #[doc = "Get device selftest instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n"]
20722    pub fn op_selftests_get_dump(self) -> OpSelftestsGetDump<'buf> {
20723        let mut res = OpSelftestsGetDump::new(self);
20724        res.request.do_writeback(
20725            res.protocol(),
20726            "op-selftests-get-dump",
20727            OpSelftestsGetDump::lookup,
20728        );
20729        res
20730    }
20731    #[doc = "Get device selftest instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n"]
20732    pub fn op_selftests_get_do(self) -> OpSelftestsGetDo<'buf> {
20733        let mut res = OpSelftestsGetDo::new(self);
20734        res.request.do_writeback(
20735            res.protocol(),
20736            "op-selftests-get-do",
20737            OpSelftestsGetDo::lookup,
20738        );
20739        res
20740    }
20741    #[doc = "Run device selftest instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.nested_selftests()](PushDevlink::nested_selftests)\n"]
20742    pub fn op_selftests_run_do(self) -> OpSelftestsRunDo<'buf> {
20743        let mut res = OpSelftestsRunDo::new(self);
20744        res.request.do_writeback(
20745            res.protocol(),
20746            "op-selftests-run-do",
20747            OpSelftestsRunDo::lookup,
20748        );
20749        res
20750    }
20751    #[doc = "Set notification messages socket filter\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
20752    pub fn op_notify_filter_set_do(self) -> OpNotifyFilterSetDo<'buf> {
20753        let mut res = OpNotifyFilterSetDo::new(self);
20754        res.request.do_writeback(
20755            res.protocol(),
20756            "op-notify-filter-set-do",
20757            OpNotifyFilterSetDo::lookup,
20758        );
20759        res
20760    }
20761}
20762#[cfg(test)]
20763mod generated_tests {
20764    use super::*;
20765    #[test]
20766    fn tests() {
20767        let _ = IterableDevlink::get_bus_name;
20768        let _ = IterableDevlink::get_dev_name;
20769        let _ = IterableDevlink::get_dev_stats;
20770        let _ = IterableDevlink::get_dpipe_entries;
20771        let _ = IterableDevlink::get_dpipe_headers;
20772        let _ = IterableDevlink::get_dpipe_tables;
20773        let _ = IterableDevlink::get_eswitch_encap_mode;
20774        let _ = IterableDevlink::get_eswitch_inline_mode;
20775        let _ = IterableDevlink::get_eswitch_mode;
20776        let _ = IterableDevlink::get_fmsg;
20777        let _ = IterableDevlink::get_health_reporter_name;
20778        let _ = IterableDevlink::get_info_board_serial_number;
20779        let _ = IterableDevlink::get_info_driver_name;
20780        let _ = IterableDevlink::get_info_serial_number;
20781        let _ = IterableDevlink::get_info_version_fixed;
20782        let _ = IterableDevlink::get_info_version_running;
20783        let _ = IterableDevlink::get_info_version_stored;
20784        let _ = IterableDevlink::get_linecard_index;
20785        let _ = IterableDevlink::get_param_name;
20786        let _ = IterableDevlink::get_port_index;
20787        let _ = IterableDevlink::get_rate_node_name;
20788        let _ = IterableDevlink::get_region_name;
20789        let _ = IterableDevlink::get_region_snapshot_id;
20790        let _ = IterableDevlink::get_reload_actions_performed;
20791        let _ = IterableDevlink::get_reload_failed;
20792        let _ = IterableDevlink::get_resource_list;
20793        let _ = IterableDevlink::get_sb_index;
20794        let _ = IterableDevlink::get_sb_pool_index;
20795        let _ = IterableDevlink::get_sb_pool_type;
20796        let _ = IterableDevlink::get_sb_tc_index;
20797        let _ = IterableDevlink::get_trap_group_name;
20798        let _ = IterableDevlink::get_trap_name;
20799        let _ = IterableDevlink::get_trap_policer_id;
20800        let _ = PushDevlink::<&mut Vec<u8>>::nested_port_function;
20801        let _ = PushDevlink::<&mut Vec<u8>>::nested_rate_tc_bws;
20802        let _ = PushDevlink::<&mut Vec<u8>>::nested_selftests;
20803        let _ = PushDevlink::<&mut Vec<u8>>::push_bus_name;
20804        let _ = PushDevlink::<&mut Vec<u8>>::push_dev_name;
20805        let _ = PushDevlink::<&mut Vec<u8>>::push_dpipe_table_counters_enabled;
20806        let _ = PushDevlink::<&mut Vec<u8>>::push_dpipe_table_name;
20807        let _ = PushDevlink::<&mut Vec<u8>>::push_eswitch_encap_mode;
20808        let _ = PushDevlink::<&mut Vec<u8>>::push_eswitch_inline_mode;
20809        let _ = PushDevlink::<&mut Vec<u8>>::push_eswitch_mode;
20810        let _ = PushDevlink::<&mut Vec<u8>>::push_flash_update_component;
20811        let _ = PushDevlink::<&mut Vec<u8>>::push_flash_update_file_name;
20812        let _ = PushDevlink::<&mut Vec<u8>>::push_flash_update_overwrite_mask;
20813        let _ = PushDevlink::<&mut Vec<u8>>::push_health_reporter_auto_dump;
20814        let _ = PushDevlink::<&mut Vec<u8>>::push_health_reporter_auto_recover;
20815        let _ = PushDevlink::<&mut Vec<u8>>::push_health_reporter_burst_period;
20816        let _ = PushDevlink::<&mut Vec<u8>>::push_health_reporter_graceful_period;
20817        let _ = PushDevlink::<&mut Vec<u8>>::push_health_reporter_name;
20818        let _ = PushDevlink::<&mut Vec<u8>>::push_linecard_index;
20819        let _ = PushDevlink::<&mut Vec<u8>>::push_linecard_type;
20820        let _ = PushDevlink::<&mut Vec<u8>>::push_netns_fd;
20821        let _ = PushDevlink::<&mut Vec<u8>>::push_netns_id;
20822        let _ = PushDevlink::<&mut Vec<u8>>::push_netns_pid;
20823        let _ = PushDevlink::<&mut Vec<u8>>::push_param_name;
20824        let _ = PushDevlink::<&mut Vec<u8>>::push_param_reset_default;
20825        let _ = PushDevlink::<&mut Vec<u8>>::push_param_type;
20826        let _ = PushDevlink::<&mut Vec<u8>>::push_param_value_cmode;
20827        let _ = PushDevlink::<&mut Vec<u8>>::push_port_controller_number;
20828        let _ = PushDevlink::<&mut Vec<u8>>::push_port_flavour;
20829        let _ = PushDevlink::<&mut Vec<u8>>::push_port_index;
20830        let _ = PushDevlink::<&mut Vec<u8>>::push_port_pci_pf_number;
20831        let _ = PushDevlink::<&mut Vec<u8>>::push_port_pci_sf_number;
20832        let _ = PushDevlink::<&mut Vec<u8>>::push_port_split_count;
20833        let _ = PushDevlink::<&mut Vec<u8>>::push_port_type;
20834        let _ = PushDevlink::<&mut Vec<u8>>::push_rate_node_name;
20835        let _ = PushDevlink::<&mut Vec<u8>>::push_rate_parent_node_name;
20836        let _ = PushDevlink::<&mut Vec<u8>>::push_rate_tx_max;
20837        let _ = PushDevlink::<&mut Vec<u8>>::push_rate_tx_priority;
20838        let _ = PushDevlink::<&mut Vec<u8>>::push_rate_tx_share;
20839        let _ = PushDevlink::<&mut Vec<u8>>::push_rate_tx_weight;
20840        let _ = PushDevlink::<&mut Vec<u8>>::push_region_chunk_addr;
20841        let _ = PushDevlink::<&mut Vec<u8>>::push_region_chunk_len;
20842        let _ = PushDevlink::<&mut Vec<u8>>::push_region_direct;
20843        let _ = PushDevlink::<&mut Vec<u8>>::push_region_name;
20844        let _ = PushDevlink::<&mut Vec<u8>>::push_region_snapshot_id;
20845        let _ = PushDevlink::<&mut Vec<u8>>::push_reload_action;
20846        let _ = PushDevlink::<&mut Vec<u8>>::push_reload_limits;
20847        let _ = PushDevlink::<&mut Vec<u8>>::push_resource_id;
20848        let _ = PushDevlink::<&mut Vec<u8>>::push_resource_size;
20849        let _ = PushDevlink::<&mut Vec<u8>>::push_sb_index;
20850        let _ = PushDevlink::<&mut Vec<u8>>::push_sb_pool_index;
20851        let _ = PushDevlink::<&mut Vec<u8>>::push_sb_pool_size;
20852        let _ = PushDevlink::<&mut Vec<u8>>::push_sb_pool_threshold_type;
20853        let _ = PushDevlink::<&mut Vec<u8>>::push_sb_pool_type;
20854        let _ = PushDevlink::<&mut Vec<u8>>::push_sb_tc_index;
20855        let _ = PushDevlink::<&mut Vec<u8>>::push_sb_threshold;
20856        let _ = PushDevlink::<&mut Vec<u8>>::push_trap_action;
20857        let _ = PushDevlink::<&mut Vec<u8>>::push_trap_group_name;
20858        let _ = PushDevlink::<&mut Vec<u8>>::push_trap_name;
20859        let _ = PushDevlink::<&mut Vec<u8>>::push_trap_policer_burst;
20860        let _ = PushDevlink::<&mut Vec<u8>>::push_trap_policer_id;
20861        let _ = PushDevlink::<&mut Vec<u8>>::push_trap_policer_rate;
20862    }
20863}