Skip to main content

netlink_bindings/ethtool/
mod.rs

1#![doc = "Partial family for Ethtool Netlink.\n"]
2#![allow(clippy::all)]
3#![allow(unused_imports)]
4#![allow(unused_assignments)]
5#![allow(non_snake_case)]
6#![allow(unused_variables)]
7#![allow(irrefutable_let_patterns)]
8#![allow(unreachable_code)]
9#![allow(unreachable_patterns)]
10use crate::builtin::{BuiltinBitfield32, BuiltinNfgenmsg, Nlmsghdr, PushDummy};
11use crate::{
12    consts,
13    traits::{NetlinkRequest, Protocol},
14    utils::*,
15};
16pub const PROTONAME: &str = "ethtool";
17pub const PROTONAME_CSTR: &CStr = c"ethtool";
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 UdpTunnelType {
21    Vxlan = 0,
22    Geneve = 1,
23    VxlanGpe = 2,
24}
25impl UdpTunnelType {
26    pub fn from_value(value: u64) -> Option<Self> {
27        Some(match value {
28            0 => Self::Vxlan,
29            1 => Self::Geneve,
30            2 => Self::VxlanGpe,
31            _ => return None,
32        })
33    }
34}
35#[doc = "common ethtool header flags\n"]
36#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
37#[derive(Debug, Clone, Copy)]
38pub enum HeaderFlags {
39    #[doc = "use compact bitsets in reply\n"]
40    CompactBitsets = 1 << 0,
41    #[doc = "provide optional reply for SET or ACT requests\n"]
42    OmitReply = 1 << 1,
43    #[doc = "request statistics, if supported by the driver\n"]
44    Stats = 1 << 2,
45}
46impl HeaderFlags {
47    pub fn from_value(value: u64) -> Option<Self> {
48        Some(match value {
49            n if n == 1 << 0 => Self::CompactBitsets,
50            n if n == 1 << 1 => Self::OmitReply,
51            n if n == 1 << 2 => Self::Stats,
52            _ => return None,
53        })
54    }
55}
56#[doc = "plug-in module firmware flashing status\n"]
57#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
58#[derive(Debug, Clone, Copy)]
59pub enum ModuleFwFlashStatus {
60    #[doc = "The firmware flashing process has started.\n"]
61    Started = 0,
62    #[doc = "The firmware flashing process is in progress.\n"]
63    InProgress = 1,
64    #[doc = "The firmware flashing process was completed successfully.\n"]
65    Completed = 2,
66    #[doc = "The firmware flashing process was stopped due to an error.\n"]
67    Error = 3,
68}
69impl ModuleFwFlashStatus {
70    pub fn from_value(value: u64) -> Option<Self> {
71        Some(match value {
72            0 => Self::Started,
73            1 => Self::InProgress,
74            2 => Self::Completed,
75            3 => Self::Error,
76            _ => return None,
77        })
78    }
79}
80#[doc = "\\\"groups of PSE extended states functions. IEEE 802.3-2022 33.2.4.4\nVariables\\\"\n"]
81#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
82#[derive(Debug, Clone, Copy)]
83pub enum C33PseExtState {
84    #[doc = "none\n"]
85    None = 0,
86    #[doc = "Group of error_condition states\n"]
87    ErrorCondition = 1,
88    #[doc = "Group of mr_mps_valid states\n"]
89    MrMpsValid = 2,
90    #[doc = "Group of mr_pse_enable states\n"]
91    MrPseEnable = 3,
92    #[doc = "Group of option_detect_ted states\n"]
93    OptionDetectTed = 4,
94    #[doc = "Group of option_vport_lim states\n"]
95    OptionVportLim = 5,
96    #[doc = "Group of ovld_detected states\n"]
97    OvldDetected = 6,
98    #[doc = "Group of power_not_available states\n"]
99    PowerNotAvailable = 7,
100    #[doc = "Group of short_detected states\n"]
101    ShortDetected = 8,
102}
103impl C33PseExtState {
104    pub fn from_value(value: u64) -> Option<Self> {
105        Some(match value {
106            0 => Self::None,
107            1 => Self::ErrorCondition,
108            2 => Self::MrMpsValid,
109            3 => Self::MrPseEnable,
110            4 => Self::OptionDetectTed,
111            5 => Self::OptionVportLim,
112            6 => Self::OvldDetected,
113            7 => Self::PowerNotAvailable,
114            8 => Self::ShortDetected,
115            _ => return None,
116        })
117    }
118}
119#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
120#[derive(Debug, Clone, Copy)]
121pub enum PhyUpstreamType {
122    Mac = 0,
123    Phy = 1,
124}
125impl PhyUpstreamType {
126    pub fn from_value(value: u64) -> Option<Self> {
127        Some(match value {
128            0 => Self::Mac,
129            1 => Self::Phy,
130            _ => return None,
131        })
132    }
133}
134#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
135#[derive(Debug, Clone, Copy)]
136pub enum TcpDataSplit {
137    Unknown = 0,
138    Disabled = 1,
139    Enabled = 2,
140}
141impl TcpDataSplit {
142    pub fn from_value(value: u64) -> Option<Self> {
143        Some(match value {
144            0 => Self::Unknown,
145            1 => Self::Disabled,
146            2 => Self::Enabled,
147            _ => return None,
148        })
149    }
150}
151#[doc = "Source of the hardware timestamp\n"]
152#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
153#[derive(Debug, Clone, Copy)]
154pub enum HwtstampSource {
155    #[doc = "Hardware timestamp comes from a MAC or a device which has MAC and PHY\nintegrated\n"]
156    Netdev = 1,
157    #[doc = "Hardware timestamp comes from one PHY device of the network topology\n"]
158    Phylib = 2,
159}
160impl HwtstampSource {
161    pub fn from_value(value: u64) -> Option<Self> {
162        Some(match value {
163            1 => Self::Netdev,
164            2 => Self::Phylib,
165            _ => return None,
166        })
167    }
168}
169#[doc = "PSE event list for the PSE controller\n"]
170#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
171#[derive(Debug, Clone, Copy)]
172pub enum PseEvent {
173    #[doc = "PSE output current is too high\n"]
174    PseEventOverCurrent = 1 << 0,
175    #[doc = "PSE in over temperature state\n"]
176    PseEventOverTemp = 1 << 1,
177    #[doc = "detection process occur on the PSE. IEEE 802.3-2022 33.2.5 and 145.2.6\nPSE detection of PDs. IEEE 802.3-202 30.9.1.1.5 aPSEPowerDetectionStatus\n"]
178    C33PseEventDetection = 1 << 2,
179    #[doc = "classification process occur on the PSE. IEEE 802.3-2022 33.2.6 and\n145.2.8 classification of PDs mutual identification. IEEE 802.3-2022\n30.9.1.1.8 aPSEPowerClassification.\n"]
180    C33PseEventClassification = 1 << 3,
181    #[doc = "PD has been disconnected on the PSE. IEEE 802.3-2022 33.3.8 and 145.3.9\nPD Maintain Power Signature. IEEE 802.3-2022 33.5.1.2.9 MPS Absent. IEEE\n802.3-2022 30.9.1.1.20 aPSEMPSAbsentCounter.\n"]
182    C33PseEventDisconnection = 1 << 4,
183    #[doc = "PSE turned off due to over budget situation\n"]
184    PseEventOverBudget = 1 << 5,
185    #[doc = "PSE faced an error managing the power control from software\n"]
186    PseEventSwPwControlError = 1 << 6,
187}
188impl PseEvent {
189    pub fn from_value(value: u64) -> Option<Self> {
190        Some(match value {
191            n if n == 1 << 0 => Self::PseEventOverCurrent,
192            n if n == 1 << 1 => Self::PseEventOverTemp,
193            n if n == 1 << 2 => Self::C33PseEventDetection,
194            n if n == 1 << 3 => Self::C33PseEventClassification,
195            n if n == 1 << 4 => Self::C33PseEventDisconnection,
196            n if n == 1 << 5 => Self::PseEventOverBudget,
197            n if n == 1 << 6 => Self::PseEventSwPwControlError,
198            _ => return None,
199        })
200    }
201}
202#[doc = "RSS hash function transformations.\n"]
203#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
204#[derive(Debug, Clone, Copy)]
205pub enum InputXfrm {
206    #[doc = "XOR the corresponding source and destination fields of each specified\nprotocol. Both copies of the XOR\\'ed fields are fed into the RSS and\nRXHASH calculation. Note that this XORing reduces the input set entropy\nand could be exploited to reduce the RSS queue spread.\n"]
207    SymXor = 1 << 0,
208    #[doc = "Similar to SYM_XOR, except that one copy of the XOR\\'ed fields is\nreplaced by an OR of the same fields.\n"]
209    SymOrXor = 1 << 1,
210}
211impl InputXfrm {
212    pub fn from_value(value: u64) -> Option<Self> {
213        Some(match value {
214            n if n == 1 << 0 => Self::SymXor,
215            n if n == 1 << 1 => Self::SymOrXor,
216            _ => return None,
217        })
218    }
219}
220#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
221#[derive(Debug, Clone, Copy)]
222pub enum RxfhFields {
223    L2da = 1 << 1,
224    Vlan = 1 << 2,
225    L3Proto = 1 << 3,
226    IpSrc = 1 << 4,
227    IpDst = 1 << 5,
228    #[doc = "src port in case of TCP/UDP/SCTP\n"]
229    L4B01 = 1 << 6,
230    #[doc = "dst port in case of TCP/UDP/SCTP\n"]
231    L4B23 = 1 << 7,
232    GtpTeid = 1 << 8,
233    #[doc = "IPv6 Flow Label\n"]
234    Ip6Fl = 1 << 9,
235    Discard = 1 << 31,
236}
237impl RxfhFields {
238    pub fn from_value(value: u64) -> Option<Self> {
239        Some(match value {
240            n if n == 1 << 1 => Self::L2da,
241            n if n == 1 << 2 => Self::Vlan,
242            n if n == 1 << 3 => Self::L3Proto,
243            n if n == 1 << 4 => Self::IpSrc,
244            n if n == 1 << 5 => Self::IpDst,
245            n if n == 1 << 6 => Self::L4B01,
246            n if n == 1 << 7 => Self::L4B23,
247            n if n == 1 << 8 => Self::GtpTeid,
248            n if n == 1 << 9 => Self::Ip6Fl,
249            n if n == 1 << 31 => Self::Discard,
250            _ => return None,
251        })
252    }
253}
254#[derive(Clone)]
255pub enum Header<'a> {
256    DevIndex(u32),
257    DevName(&'a CStr),
258    #[doc = "Associated type: [`HeaderFlags`] (enum)"]
259    Flags(u32),
260    PhyIndex(u32),
261}
262impl<'a> IterableHeader<'a> {
263    pub fn get_dev_index(&self) -> Result<u32, ErrorContext> {
264        let mut iter = self.clone();
265        iter.pos = 0;
266        for attr in iter {
267            if let Ok(Header::DevIndex(val)) = attr {
268                return Ok(val);
269            }
270        }
271        Err(ErrorContext::new_missing(
272            "Header",
273            "DevIndex",
274            self.orig_loc,
275            self.buf.as_ptr() as usize,
276        ))
277    }
278    pub fn get_dev_name(&self) -> Result<&'a CStr, ErrorContext> {
279        let mut iter = self.clone();
280        iter.pos = 0;
281        for attr in iter {
282            if let Ok(Header::DevName(val)) = attr {
283                return Ok(val);
284            }
285        }
286        Err(ErrorContext::new_missing(
287            "Header",
288            "DevName",
289            self.orig_loc,
290            self.buf.as_ptr() as usize,
291        ))
292    }
293    #[doc = "Associated type: [`HeaderFlags`] (enum)"]
294    pub fn get_flags(&self) -> Result<u32, ErrorContext> {
295        let mut iter = self.clone();
296        iter.pos = 0;
297        for attr in iter {
298            if let Ok(Header::Flags(val)) = attr {
299                return Ok(val);
300            }
301        }
302        Err(ErrorContext::new_missing(
303            "Header",
304            "Flags",
305            self.orig_loc,
306            self.buf.as_ptr() as usize,
307        ))
308    }
309    pub fn get_phy_index(&self) -> Result<u32, ErrorContext> {
310        let mut iter = self.clone();
311        iter.pos = 0;
312        for attr in iter {
313            if let Ok(Header::PhyIndex(val)) = attr {
314                return Ok(val);
315            }
316        }
317        Err(ErrorContext::new_missing(
318            "Header",
319            "PhyIndex",
320            self.orig_loc,
321            self.buf.as_ptr() as usize,
322        ))
323    }
324}
325impl Header<'_> {
326    pub fn new<'a>(buf: &'a [u8]) -> IterableHeader<'a> {
327        IterableHeader::with_loc(buf, buf.as_ptr() as usize)
328    }
329    fn attr_from_type(r#type: u16) -> Option<&'static str> {
330        let res = match r#type {
331            0u16 => "Unspec",
332            1u16 => "DevIndex",
333            2u16 => "DevName",
334            3u16 => "Flags",
335            4u16 => "PhyIndex",
336            _ => return None,
337        };
338        Some(res)
339    }
340}
341#[derive(Clone, Copy, Default)]
342pub struct IterableHeader<'a> {
343    buf: &'a [u8],
344    pos: usize,
345    orig_loc: usize,
346}
347impl<'a> IterableHeader<'a> {
348    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
349        Self {
350            buf,
351            pos: 0,
352            orig_loc,
353        }
354    }
355    pub fn get_buf(&self) -> &'a [u8] {
356        self.buf
357    }
358}
359impl<'a> Iterator for IterableHeader<'a> {
360    type Item = Result<Header<'a>, ErrorContext>;
361    fn next(&mut self) -> Option<Self::Item> {
362        let mut pos;
363        let mut r#type;
364        loop {
365            pos = self.pos;
366            r#type = None;
367            if self.buf.len() == self.pos {
368                return None;
369            }
370            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
371                self.pos = self.buf.len();
372                break;
373            };
374            r#type = Some(header.r#type);
375            let res = match header.r#type {
376                1u16 => Header::DevIndex({
377                    let res = parse_u32(next);
378                    let Some(val) = res else { break };
379                    val
380                }),
381                2u16 => Header::DevName({
382                    let res = CStr::from_bytes_with_nul(next).ok();
383                    let Some(val) = res else { break };
384                    val
385                }),
386                3u16 => Header::Flags({
387                    let res = parse_u32(next);
388                    let Some(val) = res else { break };
389                    val
390                }),
391                4u16 => Header::PhyIndex({
392                    let res = parse_u32(next);
393                    let Some(val) = res else { break };
394                    val
395                }),
396                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
397                n => continue,
398            };
399            return Some(Ok(res));
400        }
401        Some(Err(ErrorContext::new(
402            "Header",
403            r#type.and_then(|t| Header::attr_from_type(t)),
404            self.orig_loc,
405            self.buf.as_ptr().wrapping_add(pos) as usize,
406        )))
407    }
408}
409impl<'a> std::fmt::Debug for IterableHeader<'_> {
410    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
411        let mut fmt = f.debug_struct("Header");
412        for attr in self.clone() {
413            let attr = match attr {
414                Ok(a) => a,
415                Err(err) => {
416                    fmt.finish()?;
417                    f.write_str("Err(")?;
418                    err.fmt(f)?;
419                    return f.write_str(")");
420                }
421            };
422            match attr {
423                Header::DevIndex(val) => fmt.field("DevIndex", &val),
424                Header::DevName(val) => fmt.field("DevName", &val),
425                Header::Flags(val) => {
426                    fmt.field("Flags", &FormatFlags(val.into(), HeaderFlags::from_value))
427                }
428                Header::PhyIndex(val) => fmt.field("PhyIndex", &val),
429            };
430        }
431        fmt.finish()
432    }
433}
434impl IterableHeader<'_> {
435    pub fn lookup_attr(
436        &self,
437        offset: usize,
438        missing_type: Option<u16>,
439    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
440        let mut stack = Vec::new();
441        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
442        if missing_type.is_some() && cur == offset {
443            stack.push(("Header", offset));
444            return (stack, missing_type.and_then(|t| Header::attr_from_type(t)));
445        }
446        if cur > offset || cur + self.buf.len() < offset {
447            return (stack, None);
448        }
449        let mut attrs = self.clone();
450        let mut last_off = cur + attrs.pos;
451        while let Some(attr) = attrs.next() {
452            let Ok(attr) = attr else { break };
453            match attr {
454                Header::DevIndex(val) => {
455                    if last_off == offset {
456                        stack.push(("DevIndex", last_off));
457                        break;
458                    }
459                }
460                Header::DevName(val) => {
461                    if last_off == offset {
462                        stack.push(("DevName", last_off));
463                        break;
464                    }
465                }
466                Header::Flags(val) => {
467                    if last_off == offset {
468                        stack.push(("Flags", last_off));
469                        break;
470                    }
471                }
472                Header::PhyIndex(val) => {
473                    if last_off == offset {
474                        stack.push(("PhyIndex", last_off));
475                        break;
476                    }
477                }
478                _ => {}
479            };
480            last_off = cur + attrs.pos;
481        }
482        if !stack.is_empty() {
483            stack.push(("Header", cur));
484        }
485        (stack, None)
486    }
487}
488#[derive(Clone)]
489pub enum BitsetBit<'a> {
490    Index(u32),
491    Name(&'a CStr),
492    Value(()),
493}
494impl<'a> IterableBitsetBit<'a> {
495    pub fn get_index(&self) -> Result<u32, ErrorContext> {
496        let mut iter = self.clone();
497        iter.pos = 0;
498        for attr in iter {
499            if let Ok(BitsetBit::Index(val)) = attr {
500                return Ok(val);
501            }
502        }
503        Err(ErrorContext::new_missing(
504            "BitsetBit",
505            "Index",
506            self.orig_loc,
507            self.buf.as_ptr() as usize,
508        ))
509    }
510    pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
511        let mut iter = self.clone();
512        iter.pos = 0;
513        for attr in iter {
514            if let Ok(BitsetBit::Name(val)) = attr {
515                return Ok(val);
516            }
517        }
518        Err(ErrorContext::new_missing(
519            "BitsetBit",
520            "Name",
521            self.orig_loc,
522            self.buf.as_ptr() as usize,
523        ))
524    }
525    pub fn get_value(&self) -> Result<(), ErrorContext> {
526        let mut iter = self.clone();
527        iter.pos = 0;
528        for attr in iter {
529            if let Ok(BitsetBit::Value(val)) = attr {
530                return Ok(val);
531            }
532        }
533        Err(ErrorContext::new_missing(
534            "BitsetBit",
535            "Value",
536            self.orig_loc,
537            self.buf.as_ptr() as usize,
538        ))
539    }
540}
541impl BitsetBit<'_> {
542    pub fn new<'a>(buf: &'a [u8]) -> IterableBitsetBit<'a> {
543        IterableBitsetBit::with_loc(buf, buf.as_ptr() as usize)
544    }
545    fn attr_from_type(r#type: u16) -> Option<&'static str> {
546        let res = match r#type {
547            0u16 => "Unspec",
548            1u16 => "Index",
549            2u16 => "Name",
550            3u16 => "Value",
551            _ => return None,
552        };
553        Some(res)
554    }
555}
556#[derive(Clone, Copy, Default)]
557pub struct IterableBitsetBit<'a> {
558    buf: &'a [u8],
559    pos: usize,
560    orig_loc: usize,
561}
562impl<'a> IterableBitsetBit<'a> {
563    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
564        Self {
565            buf,
566            pos: 0,
567            orig_loc,
568        }
569    }
570    pub fn get_buf(&self) -> &'a [u8] {
571        self.buf
572    }
573}
574impl<'a> Iterator for IterableBitsetBit<'a> {
575    type Item = Result<BitsetBit<'a>, ErrorContext>;
576    fn next(&mut self) -> Option<Self::Item> {
577        let mut pos;
578        let mut r#type;
579        loop {
580            pos = self.pos;
581            r#type = None;
582            if self.buf.len() == self.pos {
583                return None;
584            }
585            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
586                self.pos = self.buf.len();
587                break;
588            };
589            r#type = Some(header.r#type);
590            let res = match header.r#type {
591                1u16 => BitsetBit::Index({
592                    let res = parse_u32(next);
593                    let Some(val) = res else { break };
594                    val
595                }),
596                2u16 => BitsetBit::Name({
597                    let res = CStr::from_bytes_with_nul(next).ok();
598                    let Some(val) = res else { break };
599                    val
600                }),
601                3u16 => BitsetBit::Value(()),
602                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
603                n => continue,
604            };
605            return Some(Ok(res));
606        }
607        Some(Err(ErrorContext::new(
608            "BitsetBit",
609            r#type.and_then(|t| BitsetBit::attr_from_type(t)),
610            self.orig_loc,
611            self.buf.as_ptr().wrapping_add(pos) as usize,
612        )))
613    }
614}
615impl<'a> std::fmt::Debug for IterableBitsetBit<'_> {
616    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
617        let mut fmt = f.debug_struct("BitsetBit");
618        for attr in self.clone() {
619            let attr = match attr {
620                Ok(a) => a,
621                Err(err) => {
622                    fmt.finish()?;
623                    f.write_str("Err(")?;
624                    err.fmt(f)?;
625                    return f.write_str(")");
626                }
627            };
628            match attr {
629                BitsetBit::Index(val) => fmt.field("Index", &val),
630                BitsetBit::Name(val) => fmt.field("Name", &val),
631                BitsetBit::Value(val) => fmt.field("Value", &val),
632            };
633        }
634        fmt.finish()
635    }
636}
637impl IterableBitsetBit<'_> {
638    pub fn lookup_attr(
639        &self,
640        offset: usize,
641        missing_type: Option<u16>,
642    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
643        let mut stack = Vec::new();
644        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
645        if missing_type.is_some() && cur == offset {
646            stack.push(("BitsetBit", offset));
647            return (
648                stack,
649                missing_type.and_then(|t| BitsetBit::attr_from_type(t)),
650            );
651        }
652        if cur > offset || cur + self.buf.len() < offset {
653            return (stack, None);
654        }
655        let mut attrs = self.clone();
656        let mut last_off = cur + attrs.pos;
657        while let Some(attr) = attrs.next() {
658            let Ok(attr) = attr else { break };
659            match attr {
660                BitsetBit::Index(val) => {
661                    if last_off == offset {
662                        stack.push(("Index", last_off));
663                        break;
664                    }
665                }
666                BitsetBit::Name(val) => {
667                    if last_off == offset {
668                        stack.push(("Name", last_off));
669                        break;
670                    }
671                }
672                BitsetBit::Value(val) => {
673                    if last_off == offset {
674                        stack.push(("Value", last_off));
675                        break;
676                    }
677                }
678                _ => {}
679            };
680            last_off = cur + attrs.pos;
681        }
682        if !stack.is_empty() {
683            stack.push(("BitsetBit", cur));
684        }
685        (stack, None)
686    }
687}
688#[derive(Clone)]
689pub enum BitsetBits<'a> {
690    #[doc = "Attribute may repeat multiple times (treat it as array)"]
691    Bit(IterableBitsetBit<'a>),
692}
693impl<'a> IterableBitsetBits<'a> {
694    #[doc = "Attribute may repeat multiple times (treat it as array)"]
695    pub fn get_bit(&self) -> MultiAttrIterable<Self, BitsetBits<'a>, IterableBitsetBit<'a>> {
696        MultiAttrIterable::new(self.clone(), |variant| {
697            if let BitsetBits::Bit(val) = variant {
698                Some(val)
699            } else {
700                None
701            }
702        })
703    }
704}
705impl BitsetBits<'_> {
706    pub fn new<'a>(buf: &'a [u8]) -> IterableBitsetBits<'a> {
707        IterableBitsetBits::with_loc(buf, buf.as_ptr() as usize)
708    }
709    fn attr_from_type(r#type: u16) -> Option<&'static str> {
710        let res = match r#type {
711            0u16 => "Unspec",
712            1u16 => "Bit",
713            _ => return None,
714        };
715        Some(res)
716    }
717}
718#[derive(Clone, Copy, Default)]
719pub struct IterableBitsetBits<'a> {
720    buf: &'a [u8],
721    pos: usize,
722    orig_loc: usize,
723}
724impl<'a> IterableBitsetBits<'a> {
725    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
726        Self {
727            buf,
728            pos: 0,
729            orig_loc,
730        }
731    }
732    pub fn get_buf(&self) -> &'a [u8] {
733        self.buf
734    }
735}
736impl<'a> Iterator for IterableBitsetBits<'a> {
737    type Item = Result<BitsetBits<'a>, ErrorContext>;
738    fn next(&mut self) -> Option<Self::Item> {
739        let mut pos;
740        let mut r#type;
741        loop {
742            pos = self.pos;
743            r#type = None;
744            if self.buf.len() == self.pos {
745                return None;
746            }
747            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
748                self.pos = self.buf.len();
749                break;
750            };
751            r#type = Some(header.r#type);
752            let res = match header.r#type {
753                1u16 => BitsetBits::Bit({
754                    let res = Some(IterableBitsetBit::with_loc(next, self.orig_loc));
755                    let Some(val) = res else { break };
756                    val
757                }),
758                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
759                n => continue,
760            };
761            return Some(Ok(res));
762        }
763        Some(Err(ErrorContext::new(
764            "BitsetBits",
765            r#type.and_then(|t| BitsetBits::attr_from_type(t)),
766            self.orig_loc,
767            self.buf.as_ptr().wrapping_add(pos) as usize,
768        )))
769    }
770}
771impl<'a> std::fmt::Debug for IterableBitsetBits<'_> {
772    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
773        let mut fmt = f.debug_struct("BitsetBits");
774        for attr in self.clone() {
775            let attr = match attr {
776                Ok(a) => a,
777                Err(err) => {
778                    fmt.finish()?;
779                    f.write_str("Err(")?;
780                    err.fmt(f)?;
781                    return f.write_str(")");
782                }
783            };
784            match attr {
785                BitsetBits::Bit(val) => fmt.field("Bit", &val),
786            };
787        }
788        fmt.finish()
789    }
790}
791impl IterableBitsetBits<'_> {
792    pub fn lookup_attr(
793        &self,
794        offset: usize,
795        missing_type: Option<u16>,
796    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
797        let mut stack = Vec::new();
798        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
799        if missing_type.is_some() && cur == offset {
800            stack.push(("BitsetBits", offset));
801            return (
802                stack,
803                missing_type.and_then(|t| BitsetBits::attr_from_type(t)),
804            );
805        }
806        if cur > offset || cur + self.buf.len() < offset {
807            return (stack, None);
808        }
809        let mut attrs = self.clone();
810        let mut last_off = cur + attrs.pos;
811        let mut missing = None;
812        while let Some(attr) = attrs.next() {
813            let Ok(attr) = attr else { break };
814            match attr {
815                BitsetBits::Bit(val) => {
816                    (stack, missing) = val.lookup_attr(offset, missing_type);
817                    if !stack.is_empty() {
818                        break;
819                    }
820                }
821                _ => {}
822            };
823            last_off = cur + attrs.pos;
824        }
825        if !stack.is_empty() {
826            stack.push(("BitsetBits", cur));
827        }
828        (stack, missing)
829    }
830}
831#[derive(Clone)]
832pub enum Bitset<'a> {
833    Nomask(()),
834    Size(u32),
835    Bits(IterableBitsetBits<'a>),
836    Value(&'a [u8]),
837    Mask(&'a [u8]),
838}
839impl<'a> IterableBitset<'a> {
840    pub fn get_nomask(&self) -> Result<(), ErrorContext> {
841        let mut iter = self.clone();
842        iter.pos = 0;
843        for attr in iter {
844            if let Ok(Bitset::Nomask(val)) = attr {
845                return Ok(val);
846            }
847        }
848        Err(ErrorContext::new_missing(
849            "Bitset",
850            "Nomask",
851            self.orig_loc,
852            self.buf.as_ptr() as usize,
853        ))
854    }
855    pub fn get_size(&self) -> Result<u32, ErrorContext> {
856        let mut iter = self.clone();
857        iter.pos = 0;
858        for attr in iter {
859            if let Ok(Bitset::Size(val)) = attr {
860                return Ok(val);
861            }
862        }
863        Err(ErrorContext::new_missing(
864            "Bitset",
865            "Size",
866            self.orig_loc,
867            self.buf.as_ptr() as usize,
868        ))
869    }
870    pub fn get_bits(&self) -> Result<IterableBitsetBits<'a>, ErrorContext> {
871        let mut iter = self.clone();
872        iter.pos = 0;
873        for attr in iter {
874            if let Ok(Bitset::Bits(val)) = attr {
875                return Ok(val);
876            }
877        }
878        Err(ErrorContext::new_missing(
879            "Bitset",
880            "Bits",
881            self.orig_loc,
882            self.buf.as_ptr() as usize,
883        ))
884    }
885    pub fn get_value(&self) -> Result<&'a [u8], ErrorContext> {
886        let mut iter = self.clone();
887        iter.pos = 0;
888        for attr in iter {
889            if let Ok(Bitset::Value(val)) = attr {
890                return Ok(val);
891            }
892        }
893        Err(ErrorContext::new_missing(
894            "Bitset",
895            "Value",
896            self.orig_loc,
897            self.buf.as_ptr() as usize,
898        ))
899    }
900    pub fn get_mask(&self) -> Result<&'a [u8], ErrorContext> {
901        let mut iter = self.clone();
902        iter.pos = 0;
903        for attr in iter {
904            if let Ok(Bitset::Mask(val)) = attr {
905                return Ok(val);
906            }
907        }
908        Err(ErrorContext::new_missing(
909            "Bitset",
910            "Mask",
911            self.orig_loc,
912            self.buf.as_ptr() as usize,
913        ))
914    }
915}
916impl Bitset<'_> {
917    pub fn new<'a>(buf: &'a [u8]) -> IterableBitset<'a> {
918        IterableBitset::with_loc(buf, buf.as_ptr() as usize)
919    }
920    fn attr_from_type(r#type: u16) -> Option<&'static str> {
921        let res = match r#type {
922            0u16 => "Unspec",
923            1u16 => "Nomask",
924            2u16 => "Size",
925            3u16 => "Bits",
926            4u16 => "Value",
927            5u16 => "Mask",
928            _ => return None,
929        };
930        Some(res)
931    }
932}
933#[derive(Clone, Copy, Default)]
934pub struct IterableBitset<'a> {
935    buf: &'a [u8],
936    pos: usize,
937    orig_loc: usize,
938}
939impl<'a> IterableBitset<'a> {
940    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
941        Self {
942            buf,
943            pos: 0,
944            orig_loc,
945        }
946    }
947    pub fn get_buf(&self) -> &'a [u8] {
948        self.buf
949    }
950}
951impl<'a> Iterator for IterableBitset<'a> {
952    type Item = Result<Bitset<'a>, ErrorContext>;
953    fn next(&mut self) -> Option<Self::Item> {
954        let mut pos;
955        let mut r#type;
956        loop {
957            pos = self.pos;
958            r#type = None;
959            if self.buf.len() == self.pos {
960                return None;
961            }
962            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
963                self.pos = self.buf.len();
964                break;
965            };
966            r#type = Some(header.r#type);
967            let res = match header.r#type {
968                1u16 => Bitset::Nomask(()),
969                2u16 => Bitset::Size({
970                    let res = parse_u32(next);
971                    let Some(val) = res else { break };
972                    val
973                }),
974                3u16 => Bitset::Bits({
975                    let res = Some(IterableBitsetBits::with_loc(next, self.orig_loc));
976                    let Some(val) = res else { break };
977                    val
978                }),
979                4u16 => Bitset::Value({
980                    let res = Some(next);
981                    let Some(val) = res else { break };
982                    val
983                }),
984                5u16 => Bitset::Mask({
985                    let res = Some(next);
986                    let Some(val) = res else { break };
987                    val
988                }),
989                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
990                n => continue,
991            };
992            return Some(Ok(res));
993        }
994        Some(Err(ErrorContext::new(
995            "Bitset",
996            r#type.and_then(|t| Bitset::attr_from_type(t)),
997            self.orig_loc,
998            self.buf.as_ptr().wrapping_add(pos) as usize,
999        )))
1000    }
1001}
1002impl<'a> std::fmt::Debug for IterableBitset<'_> {
1003    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1004        let mut fmt = f.debug_struct("Bitset");
1005        for attr in self.clone() {
1006            let attr = match attr {
1007                Ok(a) => a,
1008                Err(err) => {
1009                    fmt.finish()?;
1010                    f.write_str("Err(")?;
1011                    err.fmt(f)?;
1012                    return f.write_str(")");
1013                }
1014            };
1015            match attr {
1016                Bitset::Nomask(val) => fmt.field("Nomask", &val),
1017                Bitset::Size(val) => fmt.field("Size", &val),
1018                Bitset::Bits(val) => fmt.field("Bits", &val),
1019                Bitset::Value(val) => fmt.field("Value", &val),
1020                Bitset::Mask(val) => fmt.field("Mask", &val),
1021            };
1022        }
1023        fmt.finish()
1024    }
1025}
1026impl IterableBitset<'_> {
1027    pub fn lookup_attr(
1028        &self,
1029        offset: usize,
1030        missing_type: Option<u16>,
1031    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1032        let mut stack = Vec::new();
1033        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1034        if missing_type.is_some() && cur == offset {
1035            stack.push(("Bitset", offset));
1036            return (stack, missing_type.and_then(|t| Bitset::attr_from_type(t)));
1037        }
1038        if cur > offset || cur + self.buf.len() < offset {
1039            return (stack, None);
1040        }
1041        let mut attrs = self.clone();
1042        let mut last_off = cur + attrs.pos;
1043        let mut missing = None;
1044        while let Some(attr) = attrs.next() {
1045            let Ok(attr) = attr else { break };
1046            match attr {
1047                Bitset::Nomask(val) => {
1048                    if last_off == offset {
1049                        stack.push(("Nomask", last_off));
1050                        break;
1051                    }
1052                }
1053                Bitset::Size(val) => {
1054                    if last_off == offset {
1055                        stack.push(("Size", last_off));
1056                        break;
1057                    }
1058                }
1059                Bitset::Bits(val) => {
1060                    (stack, missing) = val.lookup_attr(offset, missing_type);
1061                    if !stack.is_empty() {
1062                        break;
1063                    }
1064                }
1065                Bitset::Value(val) => {
1066                    if last_off == offset {
1067                        stack.push(("Value", last_off));
1068                        break;
1069                    }
1070                }
1071                Bitset::Mask(val) => {
1072                    if last_off == offset {
1073                        stack.push(("Mask", last_off));
1074                        break;
1075                    }
1076                }
1077                _ => {}
1078            };
1079            last_off = cur + attrs.pos;
1080        }
1081        if !stack.is_empty() {
1082            stack.push(("Bitset", cur));
1083        }
1084        (stack, missing)
1085    }
1086}
1087#[derive(Clone)]
1088pub enum String<'a> {
1089    Index(u32),
1090    Value(&'a CStr),
1091}
1092impl<'a> IterableString<'a> {
1093    pub fn get_index(&self) -> Result<u32, ErrorContext> {
1094        let mut iter = self.clone();
1095        iter.pos = 0;
1096        for attr in iter {
1097            if let Ok(String::Index(val)) = attr {
1098                return Ok(val);
1099            }
1100        }
1101        Err(ErrorContext::new_missing(
1102            "String",
1103            "Index",
1104            self.orig_loc,
1105            self.buf.as_ptr() as usize,
1106        ))
1107    }
1108    pub fn get_value(&self) -> Result<&'a CStr, ErrorContext> {
1109        let mut iter = self.clone();
1110        iter.pos = 0;
1111        for attr in iter {
1112            if let Ok(String::Value(val)) = attr {
1113                return Ok(val);
1114            }
1115        }
1116        Err(ErrorContext::new_missing(
1117            "String",
1118            "Value",
1119            self.orig_loc,
1120            self.buf.as_ptr() as usize,
1121        ))
1122    }
1123}
1124impl String<'_> {
1125    pub fn new<'a>(buf: &'a [u8]) -> IterableString<'a> {
1126        IterableString::with_loc(buf, buf.as_ptr() as usize)
1127    }
1128    fn attr_from_type(r#type: u16) -> Option<&'static str> {
1129        let res = match r#type {
1130            0u16 => "Unspec",
1131            1u16 => "Index",
1132            2u16 => "Value",
1133            _ => return None,
1134        };
1135        Some(res)
1136    }
1137}
1138#[derive(Clone, Copy, Default)]
1139pub struct IterableString<'a> {
1140    buf: &'a [u8],
1141    pos: usize,
1142    orig_loc: usize,
1143}
1144impl<'a> IterableString<'a> {
1145    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1146        Self {
1147            buf,
1148            pos: 0,
1149            orig_loc,
1150        }
1151    }
1152    pub fn get_buf(&self) -> &'a [u8] {
1153        self.buf
1154    }
1155}
1156impl<'a> Iterator for IterableString<'a> {
1157    type Item = Result<String<'a>, ErrorContext>;
1158    fn next(&mut self) -> Option<Self::Item> {
1159        let mut pos;
1160        let mut r#type;
1161        loop {
1162            pos = self.pos;
1163            r#type = None;
1164            if self.buf.len() == self.pos {
1165                return None;
1166            }
1167            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1168                self.pos = self.buf.len();
1169                break;
1170            };
1171            r#type = Some(header.r#type);
1172            let res = match header.r#type {
1173                1u16 => String::Index({
1174                    let res = parse_u32(next);
1175                    let Some(val) = res else { break };
1176                    val
1177                }),
1178                2u16 => String::Value({
1179                    let res = CStr::from_bytes_with_nul(next).ok();
1180                    let Some(val) = res else { break };
1181                    val
1182                }),
1183                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1184                n => continue,
1185            };
1186            return Some(Ok(res));
1187        }
1188        Some(Err(ErrorContext::new(
1189            "String",
1190            r#type.and_then(|t| String::attr_from_type(t)),
1191            self.orig_loc,
1192            self.buf.as_ptr().wrapping_add(pos) as usize,
1193        )))
1194    }
1195}
1196impl<'a> std::fmt::Debug for IterableString<'_> {
1197    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1198        let mut fmt = f.debug_struct("String");
1199        for attr in self.clone() {
1200            let attr = match attr {
1201                Ok(a) => a,
1202                Err(err) => {
1203                    fmt.finish()?;
1204                    f.write_str("Err(")?;
1205                    err.fmt(f)?;
1206                    return f.write_str(")");
1207                }
1208            };
1209            match attr {
1210                String::Index(val) => fmt.field("Index", &val),
1211                String::Value(val) => fmt.field("Value", &val),
1212            };
1213        }
1214        fmt.finish()
1215    }
1216}
1217impl IterableString<'_> {
1218    pub fn lookup_attr(
1219        &self,
1220        offset: usize,
1221        missing_type: Option<u16>,
1222    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1223        let mut stack = Vec::new();
1224        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1225        if missing_type.is_some() && cur == offset {
1226            stack.push(("String", offset));
1227            return (stack, missing_type.and_then(|t| String::attr_from_type(t)));
1228        }
1229        if cur > offset || cur + self.buf.len() < offset {
1230            return (stack, None);
1231        }
1232        let mut attrs = self.clone();
1233        let mut last_off = cur + attrs.pos;
1234        while let Some(attr) = attrs.next() {
1235            let Ok(attr) = attr else { break };
1236            match attr {
1237                String::Index(val) => {
1238                    if last_off == offset {
1239                        stack.push(("Index", last_off));
1240                        break;
1241                    }
1242                }
1243                String::Value(val) => {
1244                    if last_off == offset {
1245                        stack.push(("Value", last_off));
1246                        break;
1247                    }
1248                }
1249                _ => {}
1250            };
1251            last_off = cur + attrs.pos;
1252        }
1253        if !stack.is_empty() {
1254            stack.push(("String", cur));
1255        }
1256        (stack, None)
1257    }
1258}
1259#[derive(Clone)]
1260pub enum Strings<'a> {
1261    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1262    String(IterableString<'a>),
1263}
1264impl<'a> IterableStrings<'a> {
1265    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1266    pub fn get_string(&self) -> MultiAttrIterable<Self, Strings<'a>, IterableString<'a>> {
1267        MultiAttrIterable::new(self.clone(), |variant| {
1268            if let Strings::String(val) = variant {
1269                Some(val)
1270            } else {
1271                None
1272            }
1273        })
1274    }
1275}
1276impl Strings<'_> {
1277    pub fn new<'a>(buf: &'a [u8]) -> IterableStrings<'a> {
1278        IterableStrings::with_loc(buf, buf.as_ptr() as usize)
1279    }
1280    fn attr_from_type(r#type: u16) -> Option<&'static str> {
1281        let res = match r#type {
1282            0u16 => "Unspec",
1283            1u16 => "String",
1284            _ => return None,
1285        };
1286        Some(res)
1287    }
1288}
1289#[derive(Clone, Copy, Default)]
1290pub struct IterableStrings<'a> {
1291    buf: &'a [u8],
1292    pos: usize,
1293    orig_loc: usize,
1294}
1295impl<'a> IterableStrings<'a> {
1296    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1297        Self {
1298            buf,
1299            pos: 0,
1300            orig_loc,
1301        }
1302    }
1303    pub fn get_buf(&self) -> &'a [u8] {
1304        self.buf
1305    }
1306}
1307impl<'a> Iterator for IterableStrings<'a> {
1308    type Item = Result<Strings<'a>, ErrorContext>;
1309    fn next(&mut self) -> Option<Self::Item> {
1310        let mut pos;
1311        let mut r#type;
1312        loop {
1313            pos = self.pos;
1314            r#type = None;
1315            if self.buf.len() == self.pos {
1316                return None;
1317            }
1318            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1319                self.pos = self.buf.len();
1320                break;
1321            };
1322            r#type = Some(header.r#type);
1323            let res = match header.r#type {
1324                1u16 => Strings::String({
1325                    let res = Some(IterableString::with_loc(next, self.orig_loc));
1326                    let Some(val) = res else { break };
1327                    val
1328                }),
1329                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1330                n => continue,
1331            };
1332            return Some(Ok(res));
1333        }
1334        Some(Err(ErrorContext::new(
1335            "Strings",
1336            r#type.and_then(|t| Strings::attr_from_type(t)),
1337            self.orig_loc,
1338            self.buf.as_ptr().wrapping_add(pos) as usize,
1339        )))
1340    }
1341}
1342impl<'a> std::fmt::Debug for IterableStrings<'_> {
1343    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1344        let mut fmt = f.debug_struct("Strings");
1345        for attr in self.clone() {
1346            let attr = match attr {
1347                Ok(a) => a,
1348                Err(err) => {
1349                    fmt.finish()?;
1350                    f.write_str("Err(")?;
1351                    err.fmt(f)?;
1352                    return f.write_str(")");
1353                }
1354            };
1355            match attr {
1356                Strings::String(val) => fmt.field("String", &val),
1357            };
1358        }
1359        fmt.finish()
1360    }
1361}
1362impl IterableStrings<'_> {
1363    pub fn lookup_attr(
1364        &self,
1365        offset: usize,
1366        missing_type: Option<u16>,
1367    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1368        let mut stack = Vec::new();
1369        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1370        if missing_type.is_some() && cur == offset {
1371            stack.push(("Strings", offset));
1372            return (stack, missing_type.and_then(|t| Strings::attr_from_type(t)));
1373        }
1374        if cur > offset || cur + self.buf.len() < offset {
1375            return (stack, None);
1376        }
1377        let mut attrs = self.clone();
1378        let mut last_off = cur + attrs.pos;
1379        let mut missing = None;
1380        while let Some(attr) = attrs.next() {
1381            let Ok(attr) = attr else { break };
1382            match attr {
1383                Strings::String(val) => {
1384                    (stack, missing) = val.lookup_attr(offset, missing_type);
1385                    if !stack.is_empty() {
1386                        break;
1387                    }
1388                }
1389                _ => {}
1390            };
1391            last_off = cur + attrs.pos;
1392        }
1393        if !stack.is_empty() {
1394            stack.push(("Strings", cur));
1395        }
1396        (stack, missing)
1397    }
1398}
1399#[derive(Clone)]
1400pub enum Stringset<'a> {
1401    Id(u32),
1402    Count(u32),
1403    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1404    Strings(IterableStrings<'a>),
1405}
1406impl<'a> IterableStringset<'a> {
1407    pub fn get_id(&self) -> Result<u32, ErrorContext> {
1408        let mut iter = self.clone();
1409        iter.pos = 0;
1410        for attr in iter {
1411            if let Ok(Stringset::Id(val)) = attr {
1412                return Ok(val);
1413            }
1414        }
1415        Err(ErrorContext::new_missing(
1416            "Stringset",
1417            "Id",
1418            self.orig_loc,
1419            self.buf.as_ptr() as usize,
1420        ))
1421    }
1422    pub fn get_count(&self) -> Result<u32, ErrorContext> {
1423        let mut iter = self.clone();
1424        iter.pos = 0;
1425        for attr in iter {
1426            if let Ok(Stringset::Count(val)) = attr {
1427                return Ok(val);
1428            }
1429        }
1430        Err(ErrorContext::new_missing(
1431            "Stringset",
1432            "Count",
1433            self.orig_loc,
1434            self.buf.as_ptr() as usize,
1435        ))
1436    }
1437    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1438    pub fn get_strings(&self) -> MultiAttrIterable<Self, Stringset<'a>, IterableStrings<'a>> {
1439        MultiAttrIterable::new(self.clone(), |variant| {
1440            if let Stringset::Strings(val) = variant {
1441                Some(val)
1442            } else {
1443                None
1444            }
1445        })
1446    }
1447}
1448impl Stringset<'_> {
1449    pub fn new<'a>(buf: &'a [u8]) -> IterableStringset<'a> {
1450        IterableStringset::with_loc(buf, buf.as_ptr() as usize)
1451    }
1452    fn attr_from_type(r#type: u16) -> Option<&'static str> {
1453        let res = match r#type {
1454            0u16 => "Unspec",
1455            1u16 => "Id",
1456            2u16 => "Count",
1457            3u16 => "Strings",
1458            _ => return None,
1459        };
1460        Some(res)
1461    }
1462}
1463#[derive(Clone, Copy, Default)]
1464pub struct IterableStringset<'a> {
1465    buf: &'a [u8],
1466    pos: usize,
1467    orig_loc: usize,
1468}
1469impl<'a> IterableStringset<'a> {
1470    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1471        Self {
1472            buf,
1473            pos: 0,
1474            orig_loc,
1475        }
1476    }
1477    pub fn get_buf(&self) -> &'a [u8] {
1478        self.buf
1479    }
1480}
1481impl<'a> Iterator for IterableStringset<'a> {
1482    type Item = Result<Stringset<'a>, ErrorContext>;
1483    fn next(&mut self) -> Option<Self::Item> {
1484        let mut pos;
1485        let mut r#type;
1486        loop {
1487            pos = self.pos;
1488            r#type = None;
1489            if self.buf.len() == self.pos {
1490                return None;
1491            }
1492            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1493                self.pos = self.buf.len();
1494                break;
1495            };
1496            r#type = Some(header.r#type);
1497            let res = match header.r#type {
1498                1u16 => Stringset::Id({
1499                    let res = parse_u32(next);
1500                    let Some(val) = res else { break };
1501                    val
1502                }),
1503                2u16 => Stringset::Count({
1504                    let res = parse_u32(next);
1505                    let Some(val) = res else { break };
1506                    val
1507                }),
1508                3u16 => Stringset::Strings({
1509                    let res = Some(IterableStrings::with_loc(next, self.orig_loc));
1510                    let Some(val) = res else { break };
1511                    val
1512                }),
1513                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1514                n => continue,
1515            };
1516            return Some(Ok(res));
1517        }
1518        Some(Err(ErrorContext::new(
1519            "Stringset",
1520            r#type.and_then(|t| Stringset::attr_from_type(t)),
1521            self.orig_loc,
1522            self.buf.as_ptr().wrapping_add(pos) as usize,
1523        )))
1524    }
1525}
1526impl<'a> std::fmt::Debug for IterableStringset<'_> {
1527    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1528        let mut fmt = f.debug_struct("Stringset");
1529        for attr in self.clone() {
1530            let attr = match attr {
1531                Ok(a) => a,
1532                Err(err) => {
1533                    fmt.finish()?;
1534                    f.write_str("Err(")?;
1535                    err.fmt(f)?;
1536                    return f.write_str(")");
1537                }
1538            };
1539            match attr {
1540                Stringset::Id(val) => fmt.field("Id", &val),
1541                Stringset::Count(val) => fmt.field("Count", &val),
1542                Stringset::Strings(val) => fmt.field("Strings", &val),
1543            };
1544        }
1545        fmt.finish()
1546    }
1547}
1548impl IterableStringset<'_> {
1549    pub fn lookup_attr(
1550        &self,
1551        offset: usize,
1552        missing_type: Option<u16>,
1553    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1554        let mut stack = Vec::new();
1555        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1556        if missing_type.is_some() && cur == offset {
1557            stack.push(("Stringset", offset));
1558            return (
1559                stack,
1560                missing_type.and_then(|t| Stringset::attr_from_type(t)),
1561            );
1562        }
1563        if cur > offset || cur + self.buf.len() < offset {
1564            return (stack, None);
1565        }
1566        let mut attrs = self.clone();
1567        let mut last_off = cur + attrs.pos;
1568        let mut missing = None;
1569        while let Some(attr) = attrs.next() {
1570            let Ok(attr) = attr else { break };
1571            match attr {
1572                Stringset::Id(val) => {
1573                    if last_off == offset {
1574                        stack.push(("Id", last_off));
1575                        break;
1576                    }
1577                }
1578                Stringset::Count(val) => {
1579                    if last_off == offset {
1580                        stack.push(("Count", last_off));
1581                        break;
1582                    }
1583                }
1584                Stringset::Strings(val) => {
1585                    (stack, missing) = val.lookup_attr(offset, missing_type);
1586                    if !stack.is_empty() {
1587                        break;
1588                    }
1589                }
1590                _ => {}
1591            };
1592            last_off = cur + attrs.pos;
1593        }
1594        if !stack.is_empty() {
1595            stack.push(("Stringset", cur));
1596        }
1597        (stack, missing)
1598    }
1599}
1600#[derive(Clone)]
1601pub enum Stringsets<'a> {
1602    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1603    Stringset(IterableStringset<'a>),
1604}
1605impl<'a> IterableStringsets<'a> {
1606    #[doc = "Attribute may repeat multiple times (treat it as array)"]
1607    pub fn get_stringset(&self) -> MultiAttrIterable<Self, Stringsets<'a>, IterableStringset<'a>> {
1608        MultiAttrIterable::new(self.clone(), |variant| {
1609            if let Stringsets::Stringset(val) = variant {
1610                Some(val)
1611            } else {
1612                None
1613            }
1614        })
1615    }
1616}
1617impl Stringsets<'_> {
1618    pub fn new<'a>(buf: &'a [u8]) -> IterableStringsets<'a> {
1619        IterableStringsets::with_loc(buf, buf.as_ptr() as usize)
1620    }
1621    fn attr_from_type(r#type: u16) -> Option<&'static str> {
1622        let res = match r#type {
1623            0u16 => "Unspec",
1624            1u16 => "Stringset",
1625            _ => return None,
1626        };
1627        Some(res)
1628    }
1629}
1630#[derive(Clone, Copy, Default)]
1631pub struct IterableStringsets<'a> {
1632    buf: &'a [u8],
1633    pos: usize,
1634    orig_loc: usize,
1635}
1636impl<'a> IterableStringsets<'a> {
1637    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1638        Self {
1639            buf,
1640            pos: 0,
1641            orig_loc,
1642        }
1643    }
1644    pub fn get_buf(&self) -> &'a [u8] {
1645        self.buf
1646    }
1647}
1648impl<'a> Iterator for IterableStringsets<'a> {
1649    type Item = Result<Stringsets<'a>, ErrorContext>;
1650    fn next(&mut self) -> Option<Self::Item> {
1651        let mut pos;
1652        let mut r#type;
1653        loop {
1654            pos = self.pos;
1655            r#type = None;
1656            if self.buf.len() == self.pos {
1657                return None;
1658            }
1659            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1660                self.pos = self.buf.len();
1661                break;
1662            };
1663            r#type = Some(header.r#type);
1664            let res = match header.r#type {
1665                1u16 => Stringsets::Stringset({
1666                    let res = Some(IterableStringset::with_loc(next, self.orig_loc));
1667                    let Some(val) = res else { break };
1668                    val
1669                }),
1670                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1671                n => continue,
1672            };
1673            return Some(Ok(res));
1674        }
1675        Some(Err(ErrorContext::new(
1676            "Stringsets",
1677            r#type.and_then(|t| Stringsets::attr_from_type(t)),
1678            self.orig_loc,
1679            self.buf.as_ptr().wrapping_add(pos) as usize,
1680        )))
1681    }
1682}
1683impl<'a> std::fmt::Debug for IterableStringsets<'_> {
1684    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1685        let mut fmt = f.debug_struct("Stringsets");
1686        for attr in self.clone() {
1687            let attr = match attr {
1688                Ok(a) => a,
1689                Err(err) => {
1690                    fmt.finish()?;
1691                    f.write_str("Err(")?;
1692                    err.fmt(f)?;
1693                    return f.write_str(")");
1694                }
1695            };
1696            match attr {
1697                Stringsets::Stringset(val) => fmt.field("Stringset", &val),
1698            };
1699        }
1700        fmt.finish()
1701    }
1702}
1703impl IterableStringsets<'_> {
1704    pub fn lookup_attr(
1705        &self,
1706        offset: usize,
1707        missing_type: Option<u16>,
1708    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1709        let mut stack = Vec::new();
1710        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1711        if missing_type.is_some() && cur == offset {
1712            stack.push(("Stringsets", offset));
1713            return (
1714                stack,
1715                missing_type.and_then(|t| Stringsets::attr_from_type(t)),
1716            );
1717        }
1718        if cur > offset || cur + self.buf.len() < offset {
1719            return (stack, None);
1720        }
1721        let mut attrs = self.clone();
1722        let mut last_off = cur + attrs.pos;
1723        let mut missing = None;
1724        while let Some(attr) = attrs.next() {
1725            let Ok(attr) = attr else { break };
1726            match attr {
1727                Stringsets::Stringset(val) => {
1728                    (stack, missing) = val.lookup_attr(offset, missing_type);
1729                    if !stack.is_empty() {
1730                        break;
1731                    }
1732                }
1733                _ => {}
1734            };
1735            last_off = cur + attrs.pos;
1736        }
1737        if !stack.is_empty() {
1738            stack.push(("Stringsets", cur));
1739        }
1740        (stack, missing)
1741    }
1742}
1743#[derive(Clone)]
1744pub enum Strset<'a> {
1745    Header(IterableHeader<'a>),
1746    Stringsets(IterableStringsets<'a>),
1747    CountsOnly(()),
1748}
1749impl<'a> IterableStrset<'a> {
1750    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
1751        let mut iter = self.clone();
1752        iter.pos = 0;
1753        for attr in iter {
1754            if let Ok(Strset::Header(val)) = attr {
1755                return Ok(val);
1756            }
1757        }
1758        Err(ErrorContext::new_missing(
1759            "Strset",
1760            "Header",
1761            self.orig_loc,
1762            self.buf.as_ptr() as usize,
1763        ))
1764    }
1765    pub fn get_stringsets(&self) -> Result<IterableStringsets<'a>, ErrorContext> {
1766        let mut iter = self.clone();
1767        iter.pos = 0;
1768        for attr in iter {
1769            if let Ok(Strset::Stringsets(val)) = attr {
1770                return Ok(val);
1771            }
1772        }
1773        Err(ErrorContext::new_missing(
1774            "Strset",
1775            "Stringsets",
1776            self.orig_loc,
1777            self.buf.as_ptr() as usize,
1778        ))
1779    }
1780    pub fn get_counts_only(&self) -> Result<(), ErrorContext> {
1781        let mut iter = self.clone();
1782        iter.pos = 0;
1783        for attr in iter {
1784            if let Ok(Strset::CountsOnly(val)) = attr {
1785                return Ok(val);
1786            }
1787        }
1788        Err(ErrorContext::new_missing(
1789            "Strset",
1790            "CountsOnly",
1791            self.orig_loc,
1792            self.buf.as_ptr() as usize,
1793        ))
1794    }
1795}
1796impl Strset<'_> {
1797    pub fn new<'a>(buf: &'a [u8]) -> IterableStrset<'a> {
1798        IterableStrset::with_loc(buf, buf.as_ptr() as usize)
1799    }
1800    fn attr_from_type(r#type: u16) -> Option<&'static str> {
1801        let res = match r#type {
1802            0u16 => "Unspec",
1803            1u16 => "Header",
1804            2u16 => "Stringsets",
1805            3u16 => "CountsOnly",
1806            _ => return None,
1807        };
1808        Some(res)
1809    }
1810}
1811#[derive(Clone, Copy, Default)]
1812pub struct IterableStrset<'a> {
1813    buf: &'a [u8],
1814    pos: usize,
1815    orig_loc: usize,
1816}
1817impl<'a> IterableStrset<'a> {
1818    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1819        Self {
1820            buf,
1821            pos: 0,
1822            orig_loc,
1823        }
1824    }
1825    pub fn get_buf(&self) -> &'a [u8] {
1826        self.buf
1827    }
1828}
1829impl<'a> Iterator for IterableStrset<'a> {
1830    type Item = Result<Strset<'a>, ErrorContext>;
1831    fn next(&mut self) -> Option<Self::Item> {
1832        let mut pos;
1833        let mut r#type;
1834        loop {
1835            pos = self.pos;
1836            r#type = None;
1837            if self.buf.len() == self.pos {
1838                return None;
1839            }
1840            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1841                self.pos = self.buf.len();
1842                break;
1843            };
1844            r#type = Some(header.r#type);
1845            let res = match header.r#type {
1846                1u16 => Strset::Header({
1847                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
1848                    let Some(val) = res else { break };
1849                    val
1850                }),
1851                2u16 => Strset::Stringsets({
1852                    let res = Some(IterableStringsets::with_loc(next, self.orig_loc));
1853                    let Some(val) = res else { break };
1854                    val
1855                }),
1856                3u16 => Strset::CountsOnly(()),
1857                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1858                n => continue,
1859            };
1860            return Some(Ok(res));
1861        }
1862        Some(Err(ErrorContext::new(
1863            "Strset",
1864            r#type.and_then(|t| Strset::attr_from_type(t)),
1865            self.orig_loc,
1866            self.buf.as_ptr().wrapping_add(pos) as usize,
1867        )))
1868    }
1869}
1870impl<'a> std::fmt::Debug for IterableStrset<'_> {
1871    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1872        let mut fmt = f.debug_struct("Strset");
1873        for attr in self.clone() {
1874            let attr = match attr {
1875                Ok(a) => a,
1876                Err(err) => {
1877                    fmt.finish()?;
1878                    f.write_str("Err(")?;
1879                    err.fmt(f)?;
1880                    return f.write_str(")");
1881                }
1882            };
1883            match attr {
1884                Strset::Header(val) => fmt.field("Header", &val),
1885                Strset::Stringsets(val) => fmt.field("Stringsets", &val),
1886                Strset::CountsOnly(val) => fmt.field("CountsOnly", &val),
1887            };
1888        }
1889        fmt.finish()
1890    }
1891}
1892impl IterableStrset<'_> {
1893    pub fn lookup_attr(
1894        &self,
1895        offset: usize,
1896        missing_type: Option<u16>,
1897    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1898        let mut stack = Vec::new();
1899        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1900        if missing_type.is_some() && cur == offset {
1901            stack.push(("Strset", offset));
1902            return (stack, missing_type.and_then(|t| Strset::attr_from_type(t)));
1903        }
1904        if cur > offset || cur + self.buf.len() < offset {
1905            return (stack, None);
1906        }
1907        let mut attrs = self.clone();
1908        let mut last_off = cur + attrs.pos;
1909        let mut missing = None;
1910        while let Some(attr) = attrs.next() {
1911            let Ok(attr) = attr else { break };
1912            match attr {
1913                Strset::Header(val) => {
1914                    (stack, missing) = val.lookup_attr(offset, missing_type);
1915                    if !stack.is_empty() {
1916                        break;
1917                    }
1918                }
1919                Strset::Stringsets(val) => {
1920                    (stack, missing) = val.lookup_attr(offset, missing_type);
1921                    if !stack.is_empty() {
1922                        break;
1923                    }
1924                }
1925                Strset::CountsOnly(val) => {
1926                    if last_off == offset {
1927                        stack.push(("CountsOnly", last_off));
1928                        break;
1929                    }
1930                }
1931                _ => {}
1932            };
1933            last_off = cur + attrs.pos;
1934        }
1935        if !stack.is_empty() {
1936            stack.push(("Strset", cur));
1937        }
1938        (stack, missing)
1939    }
1940}
1941#[derive(Clone)]
1942pub enum Privflags<'a> {
1943    Header(IterableHeader<'a>),
1944    Flags(IterableBitset<'a>),
1945}
1946impl<'a> IterablePrivflags<'a> {
1947    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
1948        let mut iter = self.clone();
1949        iter.pos = 0;
1950        for attr in iter {
1951            if let Ok(Privflags::Header(val)) = attr {
1952                return Ok(val);
1953            }
1954        }
1955        Err(ErrorContext::new_missing(
1956            "Privflags",
1957            "Header",
1958            self.orig_loc,
1959            self.buf.as_ptr() as usize,
1960        ))
1961    }
1962    pub fn get_flags(&self) -> Result<IterableBitset<'a>, ErrorContext> {
1963        let mut iter = self.clone();
1964        iter.pos = 0;
1965        for attr in iter {
1966            if let Ok(Privflags::Flags(val)) = attr {
1967                return Ok(val);
1968            }
1969        }
1970        Err(ErrorContext::new_missing(
1971            "Privflags",
1972            "Flags",
1973            self.orig_loc,
1974            self.buf.as_ptr() as usize,
1975        ))
1976    }
1977}
1978impl Privflags<'_> {
1979    pub fn new<'a>(buf: &'a [u8]) -> IterablePrivflags<'a> {
1980        IterablePrivflags::with_loc(buf, buf.as_ptr() as usize)
1981    }
1982    fn attr_from_type(r#type: u16) -> Option<&'static str> {
1983        let res = match r#type {
1984            0u16 => "Unspec",
1985            1u16 => "Header",
1986            2u16 => "Flags",
1987            _ => return None,
1988        };
1989        Some(res)
1990    }
1991}
1992#[derive(Clone, Copy, Default)]
1993pub struct IterablePrivflags<'a> {
1994    buf: &'a [u8],
1995    pos: usize,
1996    orig_loc: usize,
1997}
1998impl<'a> IterablePrivflags<'a> {
1999    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
2000        Self {
2001            buf,
2002            pos: 0,
2003            orig_loc,
2004        }
2005    }
2006    pub fn get_buf(&self) -> &'a [u8] {
2007        self.buf
2008    }
2009}
2010impl<'a> Iterator for IterablePrivflags<'a> {
2011    type Item = Result<Privflags<'a>, ErrorContext>;
2012    fn next(&mut self) -> Option<Self::Item> {
2013        let mut pos;
2014        let mut r#type;
2015        loop {
2016            pos = self.pos;
2017            r#type = None;
2018            if self.buf.len() == self.pos {
2019                return None;
2020            }
2021            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
2022                self.pos = self.buf.len();
2023                break;
2024            };
2025            r#type = Some(header.r#type);
2026            let res = match header.r#type {
2027                1u16 => Privflags::Header({
2028                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
2029                    let Some(val) = res else { break };
2030                    val
2031                }),
2032                2u16 => Privflags::Flags({
2033                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
2034                    let Some(val) = res else { break };
2035                    val
2036                }),
2037                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
2038                n => continue,
2039            };
2040            return Some(Ok(res));
2041        }
2042        Some(Err(ErrorContext::new(
2043            "Privflags",
2044            r#type.and_then(|t| Privflags::attr_from_type(t)),
2045            self.orig_loc,
2046            self.buf.as_ptr().wrapping_add(pos) as usize,
2047        )))
2048    }
2049}
2050impl<'a> std::fmt::Debug for IterablePrivflags<'_> {
2051    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2052        let mut fmt = f.debug_struct("Privflags");
2053        for attr in self.clone() {
2054            let attr = match attr {
2055                Ok(a) => a,
2056                Err(err) => {
2057                    fmt.finish()?;
2058                    f.write_str("Err(")?;
2059                    err.fmt(f)?;
2060                    return f.write_str(")");
2061                }
2062            };
2063            match attr {
2064                Privflags::Header(val) => fmt.field("Header", &val),
2065                Privflags::Flags(val) => fmt.field("Flags", &val),
2066            };
2067        }
2068        fmt.finish()
2069    }
2070}
2071impl IterablePrivflags<'_> {
2072    pub fn lookup_attr(
2073        &self,
2074        offset: usize,
2075        missing_type: Option<u16>,
2076    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2077        let mut stack = Vec::new();
2078        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
2079        if missing_type.is_some() && cur == offset {
2080            stack.push(("Privflags", offset));
2081            return (
2082                stack,
2083                missing_type.and_then(|t| Privflags::attr_from_type(t)),
2084            );
2085        }
2086        if cur > offset || cur + self.buf.len() < offset {
2087            return (stack, None);
2088        }
2089        let mut attrs = self.clone();
2090        let mut last_off = cur + attrs.pos;
2091        let mut missing = None;
2092        while let Some(attr) = attrs.next() {
2093            let Ok(attr) = attr else { break };
2094            match attr {
2095                Privflags::Header(val) => {
2096                    (stack, missing) = val.lookup_attr(offset, missing_type);
2097                    if !stack.is_empty() {
2098                        break;
2099                    }
2100                }
2101                Privflags::Flags(val) => {
2102                    (stack, missing) = val.lookup_attr(offset, missing_type);
2103                    if !stack.is_empty() {
2104                        break;
2105                    }
2106                }
2107                _ => {}
2108            };
2109            last_off = cur + attrs.pos;
2110        }
2111        if !stack.is_empty() {
2112            stack.push(("Privflags", cur));
2113        }
2114        (stack, missing)
2115    }
2116}
2117#[derive(Clone)]
2118pub enum Rings<'a> {
2119    Header(IterableHeader<'a>),
2120    RxMax(u32),
2121    RxMiniMax(u32),
2122    RxJumboMax(u32),
2123    TxMax(u32),
2124    Rx(u32),
2125    RxMini(u32),
2126    RxJumbo(u32),
2127    Tx(u32),
2128    RxBufLen(u32),
2129    #[doc = "Associated type: [`TcpDataSplit`] (enum)"]
2130    TcpDataSplit(u8),
2131    CqeSize(u32),
2132    TxPush(u8),
2133    RxPush(u8),
2134    TxPushBufLen(u32),
2135    TxPushBufLenMax(u32),
2136    HdsThresh(u32),
2137    HdsThreshMax(u32),
2138}
2139impl<'a> IterableRings<'a> {
2140    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
2141        let mut iter = self.clone();
2142        iter.pos = 0;
2143        for attr in iter {
2144            if let Ok(Rings::Header(val)) = attr {
2145                return Ok(val);
2146            }
2147        }
2148        Err(ErrorContext::new_missing(
2149            "Rings",
2150            "Header",
2151            self.orig_loc,
2152            self.buf.as_ptr() as usize,
2153        ))
2154    }
2155    pub fn get_rx_max(&self) -> Result<u32, ErrorContext> {
2156        let mut iter = self.clone();
2157        iter.pos = 0;
2158        for attr in iter {
2159            if let Ok(Rings::RxMax(val)) = attr {
2160                return Ok(val);
2161            }
2162        }
2163        Err(ErrorContext::new_missing(
2164            "Rings",
2165            "RxMax",
2166            self.orig_loc,
2167            self.buf.as_ptr() as usize,
2168        ))
2169    }
2170    pub fn get_rx_mini_max(&self) -> Result<u32, ErrorContext> {
2171        let mut iter = self.clone();
2172        iter.pos = 0;
2173        for attr in iter {
2174            if let Ok(Rings::RxMiniMax(val)) = attr {
2175                return Ok(val);
2176            }
2177        }
2178        Err(ErrorContext::new_missing(
2179            "Rings",
2180            "RxMiniMax",
2181            self.orig_loc,
2182            self.buf.as_ptr() as usize,
2183        ))
2184    }
2185    pub fn get_rx_jumbo_max(&self) -> Result<u32, ErrorContext> {
2186        let mut iter = self.clone();
2187        iter.pos = 0;
2188        for attr in iter {
2189            if let Ok(Rings::RxJumboMax(val)) = attr {
2190                return Ok(val);
2191            }
2192        }
2193        Err(ErrorContext::new_missing(
2194            "Rings",
2195            "RxJumboMax",
2196            self.orig_loc,
2197            self.buf.as_ptr() as usize,
2198        ))
2199    }
2200    pub fn get_tx_max(&self) -> Result<u32, ErrorContext> {
2201        let mut iter = self.clone();
2202        iter.pos = 0;
2203        for attr in iter {
2204            if let Ok(Rings::TxMax(val)) = attr {
2205                return Ok(val);
2206            }
2207        }
2208        Err(ErrorContext::new_missing(
2209            "Rings",
2210            "TxMax",
2211            self.orig_loc,
2212            self.buf.as_ptr() as usize,
2213        ))
2214    }
2215    pub fn get_rx(&self) -> Result<u32, ErrorContext> {
2216        let mut iter = self.clone();
2217        iter.pos = 0;
2218        for attr in iter {
2219            if let Ok(Rings::Rx(val)) = attr {
2220                return Ok(val);
2221            }
2222        }
2223        Err(ErrorContext::new_missing(
2224            "Rings",
2225            "Rx",
2226            self.orig_loc,
2227            self.buf.as_ptr() as usize,
2228        ))
2229    }
2230    pub fn get_rx_mini(&self) -> Result<u32, ErrorContext> {
2231        let mut iter = self.clone();
2232        iter.pos = 0;
2233        for attr in iter {
2234            if let Ok(Rings::RxMini(val)) = attr {
2235                return Ok(val);
2236            }
2237        }
2238        Err(ErrorContext::new_missing(
2239            "Rings",
2240            "RxMini",
2241            self.orig_loc,
2242            self.buf.as_ptr() as usize,
2243        ))
2244    }
2245    pub fn get_rx_jumbo(&self) -> Result<u32, ErrorContext> {
2246        let mut iter = self.clone();
2247        iter.pos = 0;
2248        for attr in iter {
2249            if let Ok(Rings::RxJumbo(val)) = attr {
2250                return Ok(val);
2251            }
2252        }
2253        Err(ErrorContext::new_missing(
2254            "Rings",
2255            "RxJumbo",
2256            self.orig_loc,
2257            self.buf.as_ptr() as usize,
2258        ))
2259    }
2260    pub fn get_tx(&self) -> Result<u32, ErrorContext> {
2261        let mut iter = self.clone();
2262        iter.pos = 0;
2263        for attr in iter {
2264            if let Ok(Rings::Tx(val)) = attr {
2265                return Ok(val);
2266            }
2267        }
2268        Err(ErrorContext::new_missing(
2269            "Rings",
2270            "Tx",
2271            self.orig_loc,
2272            self.buf.as_ptr() as usize,
2273        ))
2274    }
2275    pub fn get_rx_buf_len(&self) -> Result<u32, ErrorContext> {
2276        let mut iter = self.clone();
2277        iter.pos = 0;
2278        for attr in iter {
2279            if let Ok(Rings::RxBufLen(val)) = attr {
2280                return Ok(val);
2281            }
2282        }
2283        Err(ErrorContext::new_missing(
2284            "Rings",
2285            "RxBufLen",
2286            self.orig_loc,
2287            self.buf.as_ptr() as usize,
2288        ))
2289    }
2290    #[doc = "Associated type: [`TcpDataSplit`] (enum)"]
2291    pub fn get_tcp_data_split(&self) -> Result<u8, ErrorContext> {
2292        let mut iter = self.clone();
2293        iter.pos = 0;
2294        for attr in iter {
2295            if let Ok(Rings::TcpDataSplit(val)) = attr {
2296                return Ok(val);
2297            }
2298        }
2299        Err(ErrorContext::new_missing(
2300            "Rings",
2301            "TcpDataSplit",
2302            self.orig_loc,
2303            self.buf.as_ptr() as usize,
2304        ))
2305    }
2306    pub fn get_cqe_size(&self) -> Result<u32, ErrorContext> {
2307        let mut iter = self.clone();
2308        iter.pos = 0;
2309        for attr in iter {
2310            if let Ok(Rings::CqeSize(val)) = attr {
2311                return Ok(val);
2312            }
2313        }
2314        Err(ErrorContext::new_missing(
2315            "Rings",
2316            "CqeSize",
2317            self.orig_loc,
2318            self.buf.as_ptr() as usize,
2319        ))
2320    }
2321    pub fn get_tx_push(&self) -> Result<u8, ErrorContext> {
2322        let mut iter = self.clone();
2323        iter.pos = 0;
2324        for attr in iter {
2325            if let Ok(Rings::TxPush(val)) = attr {
2326                return Ok(val);
2327            }
2328        }
2329        Err(ErrorContext::new_missing(
2330            "Rings",
2331            "TxPush",
2332            self.orig_loc,
2333            self.buf.as_ptr() as usize,
2334        ))
2335    }
2336    pub fn get_rx_push(&self) -> Result<u8, ErrorContext> {
2337        let mut iter = self.clone();
2338        iter.pos = 0;
2339        for attr in iter {
2340            if let Ok(Rings::RxPush(val)) = attr {
2341                return Ok(val);
2342            }
2343        }
2344        Err(ErrorContext::new_missing(
2345            "Rings",
2346            "RxPush",
2347            self.orig_loc,
2348            self.buf.as_ptr() as usize,
2349        ))
2350    }
2351    pub fn get_tx_push_buf_len(&self) -> Result<u32, ErrorContext> {
2352        let mut iter = self.clone();
2353        iter.pos = 0;
2354        for attr in iter {
2355            if let Ok(Rings::TxPushBufLen(val)) = attr {
2356                return Ok(val);
2357            }
2358        }
2359        Err(ErrorContext::new_missing(
2360            "Rings",
2361            "TxPushBufLen",
2362            self.orig_loc,
2363            self.buf.as_ptr() as usize,
2364        ))
2365    }
2366    pub fn get_tx_push_buf_len_max(&self) -> Result<u32, ErrorContext> {
2367        let mut iter = self.clone();
2368        iter.pos = 0;
2369        for attr in iter {
2370            if let Ok(Rings::TxPushBufLenMax(val)) = attr {
2371                return Ok(val);
2372            }
2373        }
2374        Err(ErrorContext::new_missing(
2375            "Rings",
2376            "TxPushBufLenMax",
2377            self.orig_loc,
2378            self.buf.as_ptr() as usize,
2379        ))
2380    }
2381    pub fn get_hds_thresh(&self) -> Result<u32, ErrorContext> {
2382        let mut iter = self.clone();
2383        iter.pos = 0;
2384        for attr in iter {
2385            if let Ok(Rings::HdsThresh(val)) = attr {
2386                return Ok(val);
2387            }
2388        }
2389        Err(ErrorContext::new_missing(
2390            "Rings",
2391            "HdsThresh",
2392            self.orig_loc,
2393            self.buf.as_ptr() as usize,
2394        ))
2395    }
2396    pub fn get_hds_thresh_max(&self) -> Result<u32, ErrorContext> {
2397        let mut iter = self.clone();
2398        iter.pos = 0;
2399        for attr in iter {
2400            if let Ok(Rings::HdsThreshMax(val)) = attr {
2401                return Ok(val);
2402            }
2403        }
2404        Err(ErrorContext::new_missing(
2405            "Rings",
2406            "HdsThreshMax",
2407            self.orig_loc,
2408            self.buf.as_ptr() as usize,
2409        ))
2410    }
2411}
2412impl Rings<'_> {
2413    pub fn new<'a>(buf: &'a [u8]) -> IterableRings<'a> {
2414        IterableRings::with_loc(buf, buf.as_ptr() as usize)
2415    }
2416    fn attr_from_type(r#type: u16) -> Option<&'static str> {
2417        let res = match r#type {
2418            0u16 => "Unspec",
2419            1u16 => "Header",
2420            2u16 => "RxMax",
2421            3u16 => "RxMiniMax",
2422            4u16 => "RxJumboMax",
2423            5u16 => "TxMax",
2424            6u16 => "Rx",
2425            7u16 => "RxMini",
2426            8u16 => "RxJumbo",
2427            9u16 => "Tx",
2428            10u16 => "RxBufLen",
2429            11u16 => "TcpDataSplit",
2430            12u16 => "CqeSize",
2431            13u16 => "TxPush",
2432            14u16 => "RxPush",
2433            15u16 => "TxPushBufLen",
2434            16u16 => "TxPushBufLenMax",
2435            17u16 => "HdsThresh",
2436            18u16 => "HdsThreshMax",
2437            _ => return None,
2438        };
2439        Some(res)
2440    }
2441}
2442#[derive(Clone, Copy, Default)]
2443pub struct IterableRings<'a> {
2444    buf: &'a [u8],
2445    pos: usize,
2446    orig_loc: usize,
2447}
2448impl<'a> IterableRings<'a> {
2449    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
2450        Self {
2451            buf,
2452            pos: 0,
2453            orig_loc,
2454        }
2455    }
2456    pub fn get_buf(&self) -> &'a [u8] {
2457        self.buf
2458    }
2459}
2460impl<'a> Iterator for IterableRings<'a> {
2461    type Item = Result<Rings<'a>, ErrorContext>;
2462    fn next(&mut self) -> Option<Self::Item> {
2463        let mut pos;
2464        let mut r#type;
2465        loop {
2466            pos = self.pos;
2467            r#type = None;
2468            if self.buf.len() == self.pos {
2469                return None;
2470            }
2471            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
2472                self.pos = self.buf.len();
2473                break;
2474            };
2475            r#type = Some(header.r#type);
2476            let res = match header.r#type {
2477                1u16 => Rings::Header({
2478                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
2479                    let Some(val) = res else { break };
2480                    val
2481                }),
2482                2u16 => Rings::RxMax({
2483                    let res = parse_u32(next);
2484                    let Some(val) = res else { break };
2485                    val
2486                }),
2487                3u16 => Rings::RxMiniMax({
2488                    let res = parse_u32(next);
2489                    let Some(val) = res else { break };
2490                    val
2491                }),
2492                4u16 => Rings::RxJumboMax({
2493                    let res = parse_u32(next);
2494                    let Some(val) = res else { break };
2495                    val
2496                }),
2497                5u16 => Rings::TxMax({
2498                    let res = parse_u32(next);
2499                    let Some(val) = res else { break };
2500                    val
2501                }),
2502                6u16 => Rings::Rx({
2503                    let res = parse_u32(next);
2504                    let Some(val) = res else { break };
2505                    val
2506                }),
2507                7u16 => Rings::RxMini({
2508                    let res = parse_u32(next);
2509                    let Some(val) = res else { break };
2510                    val
2511                }),
2512                8u16 => Rings::RxJumbo({
2513                    let res = parse_u32(next);
2514                    let Some(val) = res else { break };
2515                    val
2516                }),
2517                9u16 => Rings::Tx({
2518                    let res = parse_u32(next);
2519                    let Some(val) = res else { break };
2520                    val
2521                }),
2522                10u16 => Rings::RxBufLen({
2523                    let res = parse_u32(next);
2524                    let Some(val) = res else { break };
2525                    val
2526                }),
2527                11u16 => Rings::TcpDataSplit({
2528                    let res = parse_u8(next);
2529                    let Some(val) = res else { break };
2530                    val
2531                }),
2532                12u16 => Rings::CqeSize({
2533                    let res = parse_u32(next);
2534                    let Some(val) = res else { break };
2535                    val
2536                }),
2537                13u16 => Rings::TxPush({
2538                    let res = parse_u8(next);
2539                    let Some(val) = res else { break };
2540                    val
2541                }),
2542                14u16 => Rings::RxPush({
2543                    let res = parse_u8(next);
2544                    let Some(val) = res else { break };
2545                    val
2546                }),
2547                15u16 => Rings::TxPushBufLen({
2548                    let res = parse_u32(next);
2549                    let Some(val) = res else { break };
2550                    val
2551                }),
2552                16u16 => Rings::TxPushBufLenMax({
2553                    let res = parse_u32(next);
2554                    let Some(val) = res else { break };
2555                    val
2556                }),
2557                17u16 => Rings::HdsThresh({
2558                    let res = parse_u32(next);
2559                    let Some(val) = res else { break };
2560                    val
2561                }),
2562                18u16 => Rings::HdsThreshMax({
2563                    let res = parse_u32(next);
2564                    let Some(val) = res else { break };
2565                    val
2566                }),
2567                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
2568                n => continue,
2569            };
2570            return Some(Ok(res));
2571        }
2572        Some(Err(ErrorContext::new(
2573            "Rings",
2574            r#type.and_then(|t| Rings::attr_from_type(t)),
2575            self.orig_loc,
2576            self.buf.as_ptr().wrapping_add(pos) as usize,
2577        )))
2578    }
2579}
2580impl<'a> std::fmt::Debug for IterableRings<'_> {
2581    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2582        let mut fmt = f.debug_struct("Rings");
2583        for attr in self.clone() {
2584            let attr = match attr {
2585                Ok(a) => a,
2586                Err(err) => {
2587                    fmt.finish()?;
2588                    f.write_str("Err(")?;
2589                    err.fmt(f)?;
2590                    return f.write_str(")");
2591                }
2592            };
2593            match attr {
2594                Rings::Header(val) => fmt.field("Header", &val),
2595                Rings::RxMax(val) => fmt.field("RxMax", &val),
2596                Rings::RxMiniMax(val) => fmt.field("RxMiniMax", &val),
2597                Rings::RxJumboMax(val) => fmt.field("RxJumboMax", &val),
2598                Rings::TxMax(val) => fmt.field("TxMax", &val),
2599                Rings::Rx(val) => fmt.field("Rx", &val),
2600                Rings::RxMini(val) => fmt.field("RxMini", &val),
2601                Rings::RxJumbo(val) => fmt.field("RxJumbo", &val),
2602                Rings::Tx(val) => fmt.field("Tx", &val),
2603                Rings::RxBufLen(val) => fmt.field("RxBufLen", &val),
2604                Rings::TcpDataSplit(val) => fmt.field(
2605                    "TcpDataSplit",
2606                    &FormatEnum(val.into(), TcpDataSplit::from_value),
2607                ),
2608                Rings::CqeSize(val) => fmt.field("CqeSize", &val),
2609                Rings::TxPush(val) => fmt.field("TxPush", &val),
2610                Rings::RxPush(val) => fmt.field("RxPush", &val),
2611                Rings::TxPushBufLen(val) => fmt.field("TxPushBufLen", &val),
2612                Rings::TxPushBufLenMax(val) => fmt.field("TxPushBufLenMax", &val),
2613                Rings::HdsThresh(val) => fmt.field("HdsThresh", &val),
2614                Rings::HdsThreshMax(val) => fmt.field("HdsThreshMax", &val),
2615            };
2616        }
2617        fmt.finish()
2618    }
2619}
2620impl IterableRings<'_> {
2621    pub fn lookup_attr(
2622        &self,
2623        offset: usize,
2624        missing_type: Option<u16>,
2625    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2626        let mut stack = Vec::new();
2627        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
2628        if missing_type.is_some() && cur == offset {
2629            stack.push(("Rings", offset));
2630            return (stack, missing_type.and_then(|t| Rings::attr_from_type(t)));
2631        }
2632        if cur > offset || cur + self.buf.len() < offset {
2633            return (stack, None);
2634        }
2635        let mut attrs = self.clone();
2636        let mut last_off = cur + attrs.pos;
2637        let mut missing = None;
2638        while let Some(attr) = attrs.next() {
2639            let Ok(attr) = attr else { break };
2640            match attr {
2641                Rings::Header(val) => {
2642                    (stack, missing) = val.lookup_attr(offset, missing_type);
2643                    if !stack.is_empty() {
2644                        break;
2645                    }
2646                }
2647                Rings::RxMax(val) => {
2648                    if last_off == offset {
2649                        stack.push(("RxMax", last_off));
2650                        break;
2651                    }
2652                }
2653                Rings::RxMiniMax(val) => {
2654                    if last_off == offset {
2655                        stack.push(("RxMiniMax", last_off));
2656                        break;
2657                    }
2658                }
2659                Rings::RxJumboMax(val) => {
2660                    if last_off == offset {
2661                        stack.push(("RxJumboMax", last_off));
2662                        break;
2663                    }
2664                }
2665                Rings::TxMax(val) => {
2666                    if last_off == offset {
2667                        stack.push(("TxMax", last_off));
2668                        break;
2669                    }
2670                }
2671                Rings::Rx(val) => {
2672                    if last_off == offset {
2673                        stack.push(("Rx", last_off));
2674                        break;
2675                    }
2676                }
2677                Rings::RxMini(val) => {
2678                    if last_off == offset {
2679                        stack.push(("RxMini", last_off));
2680                        break;
2681                    }
2682                }
2683                Rings::RxJumbo(val) => {
2684                    if last_off == offset {
2685                        stack.push(("RxJumbo", last_off));
2686                        break;
2687                    }
2688                }
2689                Rings::Tx(val) => {
2690                    if last_off == offset {
2691                        stack.push(("Tx", last_off));
2692                        break;
2693                    }
2694                }
2695                Rings::RxBufLen(val) => {
2696                    if last_off == offset {
2697                        stack.push(("RxBufLen", last_off));
2698                        break;
2699                    }
2700                }
2701                Rings::TcpDataSplit(val) => {
2702                    if last_off == offset {
2703                        stack.push(("TcpDataSplit", last_off));
2704                        break;
2705                    }
2706                }
2707                Rings::CqeSize(val) => {
2708                    if last_off == offset {
2709                        stack.push(("CqeSize", last_off));
2710                        break;
2711                    }
2712                }
2713                Rings::TxPush(val) => {
2714                    if last_off == offset {
2715                        stack.push(("TxPush", last_off));
2716                        break;
2717                    }
2718                }
2719                Rings::RxPush(val) => {
2720                    if last_off == offset {
2721                        stack.push(("RxPush", last_off));
2722                        break;
2723                    }
2724                }
2725                Rings::TxPushBufLen(val) => {
2726                    if last_off == offset {
2727                        stack.push(("TxPushBufLen", last_off));
2728                        break;
2729                    }
2730                }
2731                Rings::TxPushBufLenMax(val) => {
2732                    if last_off == offset {
2733                        stack.push(("TxPushBufLenMax", last_off));
2734                        break;
2735                    }
2736                }
2737                Rings::HdsThresh(val) => {
2738                    if last_off == offset {
2739                        stack.push(("HdsThresh", last_off));
2740                        break;
2741                    }
2742                }
2743                Rings::HdsThreshMax(val) => {
2744                    if last_off == offset {
2745                        stack.push(("HdsThreshMax", last_off));
2746                        break;
2747                    }
2748                }
2749                _ => {}
2750            };
2751            last_off = cur + attrs.pos;
2752        }
2753        if !stack.is_empty() {
2754            stack.push(("Rings", cur));
2755        }
2756        (stack, missing)
2757    }
2758}
2759#[derive(Clone)]
2760pub enum MmStat<'a> {
2761    Pad(&'a [u8]),
2762    #[doc = "aMACMergeFrameAssErrorCount\n"]
2763    ReassemblyErrors(u64),
2764    #[doc = "aMACMergeFrameSmdErrorCount\n"]
2765    SmdErrors(u64),
2766    #[doc = "aMACMergeFrameAssOkCount\n"]
2767    ReassemblyOk(u64),
2768    #[doc = "aMACMergeFragCountRx\n"]
2769    RxFragCount(u64),
2770    #[doc = "aMACMergeFragCountTx\n"]
2771    TxFragCount(u64),
2772    #[doc = "aMACMergeHoldCount\n"]
2773    HoldCount(u64),
2774}
2775impl<'a> IterableMmStat<'a> {
2776    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
2777        let mut iter = self.clone();
2778        iter.pos = 0;
2779        for attr in iter {
2780            if let Ok(MmStat::Pad(val)) = attr {
2781                return Ok(val);
2782            }
2783        }
2784        Err(ErrorContext::new_missing(
2785            "MmStat",
2786            "Pad",
2787            self.orig_loc,
2788            self.buf.as_ptr() as usize,
2789        ))
2790    }
2791    #[doc = "aMACMergeFrameAssErrorCount\n"]
2792    pub fn get_reassembly_errors(&self) -> Result<u64, ErrorContext> {
2793        let mut iter = self.clone();
2794        iter.pos = 0;
2795        for attr in iter {
2796            if let Ok(MmStat::ReassemblyErrors(val)) = attr {
2797                return Ok(val);
2798            }
2799        }
2800        Err(ErrorContext::new_missing(
2801            "MmStat",
2802            "ReassemblyErrors",
2803            self.orig_loc,
2804            self.buf.as_ptr() as usize,
2805        ))
2806    }
2807    #[doc = "aMACMergeFrameSmdErrorCount\n"]
2808    pub fn get_smd_errors(&self) -> Result<u64, ErrorContext> {
2809        let mut iter = self.clone();
2810        iter.pos = 0;
2811        for attr in iter {
2812            if let Ok(MmStat::SmdErrors(val)) = attr {
2813                return Ok(val);
2814            }
2815        }
2816        Err(ErrorContext::new_missing(
2817            "MmStat",
2818            "SmdErrors",
2819            self.orig_loc,
2820            self.buf.as_ptr() as usize,
2821        ))
2822    }
2823    #[doc = "aMACMergeFrameAssOkCount\n"]
2824    pub fn get_reassembly_ok(&self) -> Result<u64, ErrorContext> {
2825        let mut iter = self.clone();
2826        iter.pos = 0;
2827        for attr in iter {
2828            if let Ok(MmStat::ReassemblyOk(val)) = attr {
2829                return Ok(val);
2830            }
2831        }
2832        Err(ErrorContext::new_missing(
2833            "MmStat",
2834            "ReassemblyOk",
2835            self.orig_loc,
2836            self.buf.as_ptr() as usize,
2837        ))
2838    }
2839    #[doc = "aMACMergeFragCountRx\n"]
2840    pub fn get_rx_frag_count(&self) -> Result<u64, ErrorContext> {
2841        let mut iter = self.clone();
2842        iter.pos = 0;
2843        for attr in iter {
2844            if let Ok(MmStat::RxFragCount(val)) = attr {
2845                return Ok(val);
2846            }
2847        }
2848        Err(ErrorContext::new_missing(
2849            "MmStat",
2850            "RxFragCount",
2851            self.orig_loc,
2852            self.buf.as_ptr() as usize,
2853        ))
2854    }
2855    #[doc = "aMACMergeFragCountTx\n"]
2856    pub fn get_tx_frag_count(&self) -> Result<u64, ErrorContext> {
2857        let mut iter = self.clone();
2858        iter.pos = 0;
2859        for attr in iter {
2860            if let Ok(MmStat::TxFragCount(val)) = attr {
2861                return Ok(val);
2862            }
2863        }
2864        Err(ErrorContext::new_missing(
2865            "MmStat",
2866            "TxFragCount",
2867            self.orig_loc,
2868            self.buf.as_ptr() as usize,
2869        ))
2870    }
2871    #[doc = "aMACMergeHoldCount\n"]
2872    pub fn get_hold_count(&self) -> Result<u64, ErrorContext> {
2873        let mut iter = self.clone();
2874        iter.pos = 0;
2875        for attr in iter {
2876            if let Ok(MmStat::HoldCount(val)) = attr {
2877                return Ok(val);
2878            }
2879        }
2880        Err(ErrorContext::new_missing(
2881            "MmStat",
2882            "HoldCount",
2883            self.orig_loc,
2884            self.buf.as_ptr() as usize,
2885        ))
2886    }
2887}
2888impl MmStat<'_> {
2889    pub fn new<'a>(buf: &'a [u8]) -> IterableMmStat<'a> {
2890        IterableMmStat::with_loc(buf, buf.as_ptr() as usize)
2891    }
2892    fn attr_from_type(r#type: u16) -> Option<&'static str> {
2893        let res = match r#type {
2894            0u16 => "Unspec",
2895            1u16 => "Pad",
2896            2u16 => "ReassemblyErrors",
2897            3u16 => "SmdErrors",
2898            4u16 => "ReassemblyOk",
2899            5u16 => "RxFragCount",
2900            6u16 => "TxFragCount",
2901            7u16 => "HoldCount",
2902            _ => return None,
2903        };
2904        Some(res)
2905    }
2906}
2907#[derive(Clone, Copy, Default)]
2908pub struct IterableMmStat<'a> {
2909    buf: &'a [u8],
2910    pos: usize,
2911    orig_loc: usize,
2912}
2913impl<'a> IterableMmStat<'a> {
2914    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
2915        Self {
2916            buf,
2917            pos: 0,
2918            orig_loc,
2919        }
2920    }
2921    pub fn get_buf(&self) -> &'a [u8] {
2922        self.buf
2923    }
2924}
2925impl<'a> Iterator for IterableMmStat<'a> {
2926    type Item = Result<MmStat<'a>, ErrorContext>;
2927    fn next(&mut self) -> Option<Self::Item> {
2928        let mut pos;
2929        let mut r#type;
2930        loop {
2931            pos = self.pos;
2932            r#type = None;
2933            if self.buf.len() == self.pos {
2934                return None;
2935            }
2936            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
2937                self.pos = self.buf.len();
2938                break;
2939            };
2940            r#type = Some(header.r#type);
2941            let res = match header.r#type {
2942                1u16 => MmStat::Pad({
2943                    let res = Some(next);
2944                    let Some(val) = res else { break };
2945                    val
2946                }),
2947                2u16 => MmStat::ReassemblyErrors({
2948                    let res = parse_u64(next);
2949                    let Some(val) = res else { break };
2950                    val
2951                }),
2952                3u16 => MmStat::SmdErrors({
2953                    let res = parse_u64(next);
2954                    let Some(val) = res else { break };
2955                    val
2956                }),
2957                4u16 => MmStat::ReassemblyOk({
2958                    let res = parse_u64(next);
2959                    let Some(val) = res else { break };
2960                    val
2961                }),
2962                5u16 => MmStat::RxFragCount({
2963                    let res = parse_u64(next);
2964                    let Some(val) = res else { break };
2965                    val
2966                }),
2967                6u16 => MmStat::TxFragCount({
2968                    let res = parse_u64(next);
2969                    let Some(val) = res else { break };
2970                    val
2971                }),
2972                7u16 => MmStat::HoldCount({
2973                    let res = parse_u64(next);
2974                    let Some(val) = res else { break };
2975                    val
2976                }),
2977                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
2978                n => continue,
2979            };
2980            return Some(Ok(res));
2981        }
2982        Some(Err(ErrorContext::new(
2983            "MmStat",
2984            r#type.and_then(|t| MmStat::attr_from_type(t)),
2985            self.orig_loc,
2986            self.buf.as_ptr().wrapping_add(pos) as usize,
2987        )))
2988    }
2989}
2990impl<'a> std::fmt::Debug for IterableMmStat<'_> {
2991    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2992        let mut fmt = f.debug_struct("MmStat");
2993        for attr in self.clone() {
2994            let attr = match attr {
2995                Ok(a) => a,
2996                Err(err) => {
2997                    fmt.finish()?;
2998                    f.write_str("Err(")?;
2999                    err.fmt(f)?;
3000                    return f.write_str(")");
3001                }
3002            };
3003            match attr {
3004                MmStat::Pad(val) => fmt.field("Pad", &val),
3005                MmStat::ReassemblyErrors(val) => fmt.field("ReassemblyErrors", &val),
3006                MmStat::SmdErrors(val) => fmt.field("SmdErrors", &val),
3007                MmStat::ReassemblyOk(val) => fmt.field("ReassemblyOk", &val),
3008                MmStat::RxFragCount(val) => fmt.field("RxFragCount", &val),
3009                MmStat::TxFragCount(val) => fmt.field("TxFragCount", &val),
3010                MmStat::HoldCount(val) => fmt.field("HoldCount", &val),
3011            };
3012        }
3013        fmt.finish()
3014    }
3015}
3016impl IterableMmStat<'_> {
3017    pub fn lookup_attr(
3018        &self,
3019        offset: usize,
3020        missing_type: Option<u16>,
3021    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
3022        let mut stack = Vec::new();
3023        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
3024        if missing_type.is_some() && cur == offset {
3025            stack.push(("MmStat", offset));
3026            return (stack, missing_type.and_then(|t| MmStat::attr_from_type(t)));
3027        }
3028        if cur > offset || cur + self.buf.len() < offset {
3029            return (stack, None);
3030        }
3031        let mut attrs = self.clone();
3032        let mut last_off = cur + attrs.pos;
3033        while let Some(attr) = attrs.next() {
3034            let Ok(attr) = attr else { break };
3035            match attr {
3036                MmStat::Pad(val) => {
3037                    if last_off == offset {
3038                        stack.push(("Pad", last_off));
3039                        break;
3040                    }
3041                }
3042                MmStat::ReassemblyErrors(val) => {
3043                    if last_off == offset {
3044                        stack.push(("ReassemblyErrors", last_off));
3045                        break;
3046                    }
3047                }
3048                MmStat::SmdErrors(val) => {
3049                    if last_off == offset {
3050                        stack.push(("SmdErrors", last_off));
3051                        break;
3052                    }
3053                }
3054                MmStat::ReassemblyOk(val) => {
3055                    if last_off == offset {
3056                        stack.push(("ReassemblyOk", last_off));
3057                        break;
3058                    }
3059                }
3060                MmStat::RxFragCount(val) => {
3061                    if last_off == offset {
3062                        stack.push(("RxFragCount", last_off));
3063                        break;
3064                    }
3065                }
3066                MmStat::TxFragCount(val) => {
3067                    if last_off == offset {
3068                        stack.push(("TxFragCount", last_off));
3069                        break;
3070                    }
3071                }
3072                MmStat::HoldCount(val) => {
3073                    if last_off == offset {
3074                        stack.push(("HoldCount", last_off));
3075                        break;
3076                    }
3077                }
3078                _ => {}
3079            };
3080            last_off = cur + attrs.pos;
3081        }
3082        if !stack.is_empty() {
3083            stack.push(("MmStat", cur));
3084        }
3085        (stack, None)
3086    }
3087}
3088#[derive(Clone)]
3089pub enum Mm<'a> {
3090    Header(IterableHeader<'a>),
3091    PmacEnabled(u8),
3092    TxEnabled(u8),
3093    TxActive(u8),
3094    TxMinFragSize(u32),
3095    RxMinFragSize(u32),
3096    VerifyEnabled(u8),
3097    VerifyStatus(u8),
3098    VerifyTime(u32),
3099    MaxVerifyTime(u32),
3100    Stats(IterableMmStat<'a>),
3101}
3102impl<'a> IterableMm<'a> {
3103    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
3104        let mut iter = self.clone();
3105        iter.pos = 0;
3106        for attr in iter {
3107            if let Ok(Mm::Header(val)) = attr {
3108                return Ok(val);
3109            }
3110        }
3111        Err(ErrorContext::new_missing(
3112            "Mm",
3113            "Header",
3114            self.orig_loc,
3115            self.buf.as_ptr() as usize,
3116        ))
3117    }
3118    pub fn get_pmac_enabled(&self) -> Result<u8, ErrorContext> {
3119        let mut iter = self.clone();
3120        iter.pos = 0;
3121        for attr in iter {
3122            if let Ok(Mm::PmacEnabled(val)) = attr {
3123                return Ok(val);
3124            }
3125        }
3126        Err(ErrorContext::new_missing(
3127            "Mm",
3128            "PmacEnabled",
3129            self.orig_loc,
3130            self.buf.as_ptr() as usize,
3131        ))
3132    }
3133    pub fn get_tx_enabled(&self) -> Result<u8, ErrorContext> {
3134        let mut iter = self.clone();
3135        iter.pos = 0;
3136        for attr in iter {
3137            if let Ok(Mm::TxEnabled(val)) = attr {
3138                return Ok(val);
3139            }
3140        }
3141        Err(ErrorContext::new_missing(
3142            "Mm",
3143            "TxEnabled",
3144            self.orig_loc,
3145            self.buf.as_ptr() as usize,
3146        ))
3147    }
3148    pub fn get_tx_active(&self) -> Result<u8, ErrorContext> {
3149        let mut iter = self.clone();
3150        iter.pos = 0;
3151        for attr in iter {
3152            if let Ok(Mm::TxActive(val)) = attr {
3153                return Ok(val);
3154            }
3155        }
3156        Err(ErrorContext::new_missing(
3157            "Mm",
3158            "TxActive",
3159            self.orig_loc,
3160            self.buf.as_ptr() as usize,
3161        ))
3162    }
3163    pub fn get_tx_min_frag_size(&self) -> Result<u32, ErrorContext> {
3164        let mut iter = self.clone();
3165        iter.pos = 0;
3166        for attr in iter {
3167            if let Ok(Mm::TxMinFragSize(val)) = attr {
3168                return Ok(val);
3169            }
3170        }
3171        Err(ErrorContext::new_missing(
3172            "Mm",
3173            "TxMinFragSize",
3174            self.orig_loc,
3175            self.buf.as_ptr() as usize,
3176        ))
3177    }
3178    pub fn get_rx_min_frag_size(&self) -> Result<u32, ErrorContext> {
3179        let mut iter = self.clone();
3180        iter.pos = 0;
3181        for attr in iter {
3182            if let Ok(Mm::RxMinFragSize(val)) = attr {
3183                return Ok(val);
3184            }
3185        }
3186        Err(ErrorContext::new_missing(
3187            "Mm",
3188            "RxMinFragSize",
3189            self.orig_loc,
3190            self.buf.as_ptr() as usize,
3191        ))
3192    }
3193    pub fn get_verify_enabled(&self) -> Result<u8, ErrorContext> {
3194        let mut iter = self.clone();
3195        iter.pos = 0;
3196        for attr in iter {
3197            if let Ok(Mm::VerifyEnabled(val)) = attr {
3198                return Ok(val);
3199            }
3200        }
3201        Err(ErrorContext::new_missing(
3202            "Mm",
3203            "VerifyEnabled",
3204            self.orig_loc,
3205            self.buf.as_ptr() as usize,
3206        ))
3207    }
3208    pub fn get_verify_status(&self) -> Result<u8, ErrorContext> {
3209        let mut iter = self.clone();
3210        iter.pos = 0;
3211        for attr in iter {
3212            if let Ok(Mm::VerifyStatus(val)) = attr {
3213                return Ok(val);
3214            }
3215        }
3216        Err(ErrorContext::new_missing(
3217            "Mm",
3218            "VerifyStatus",
3219            self.orig_loc,
3220            self.buf.as_ptr() as usize,
3221        ))
3222    }
3223    pub fn get_verify_time(&self) -> Result<u32, ErrorContext> {
3224        let mut iter = self.clone();
3225        iter.pos = 0;
3226        for attr in iter {
3227            if let Ok(Mm::VerifyTime(val)) = attr {
3228                return Ok(val);
3229            }
3230        }
3231        Err(ErrorContext::new_missing(
3232            "Mm",
3233            "VerifyTime",
3234            self.orig_loc,
3235            self.buf.as_ptr() as usize,
3236        ))
3237    }
3238    pub fn get_max_verify_time(&self) -> Result<u32, ErrorContext> {
3239        let mut iter = self.clone();
3240        iter.pos = 0;
3241        for attr in iter {
3242            if let Ok(Mm::MaxVerifyTime(val)) = attr {
3243                return Ok(val);
3244            }
3245        }
3246        Err(ErrorContext::new_missing(
3247            "Mm",
3248            "MaxVerifyTime",
3249            self.orig_loc,
3250            self.buf.as_ptr() as usize,
3251        ))
3252    }
3253    pub fn get_stats(&self) -> Result<IterableMmStat<'a>, ErrorContext> {
3254        let mut iter = self.clone();
3255        iter.pos = 0;
3256        for attr in iter {
3257            if let Ok(Mm::Stats(val)) = attr {
3258                return Ok(val);
3259            }
3260        }
3261        Err(ErrorContext::new_missing(
3262            "Mm",
3263            "Stats",
3264            self.orig_loc,
3265            self.buf.as_ptr() as usize,
3266        ))
3267    }
3268}
3269impl Mm<'_> {
3270    pub fn new<'a>(buf: &'a [u8]) -> IterableMm<'a> {
3271        IterableMm::with_loc(buf, buf.as_ptr() as usize)
3272    }
3273    fn attr_from_type(r#type: u16) -> Option<&'static str> {
3274        let res = match r#type {
3275            0u16 => "Unspec",
3276            1u16 => "Header",
3277            2u16 => "PmacEnabled",
3278            3u16 => "TxEnabled",
3279            4u16 => "TxActive",
3280            5u16 => "TxMinFragSize",
3281            6u16 => "RxMinFragSize",
3282            7u16 => "VerifyEnabled",
3283            8u16 => "VerifyStatus",
3284            9u16 => "VerifyTime",
3285            10u16 => "MaxVerifyTime",
3286            11u16 => "Stats",
3287            _ => return None,
3288        };
3289        Some(res)
3290    }
3291}
3292#[derive(Clone, Copy, Default)]
3293pub struct IterableMm<'a> {
3294    buf: &'a [u8],
3295    pos: usize,
3296    orig_loc: usize,
3297}
3298impl<'a> IterableMm<'a> {
3299    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
3300        Self {
3301            buf,
3302            pos: 0,
3303            orig_loc,
3304        }
3305    }
3306    pub fn get_buf(&self) -> &'a [u8] {
3307        self.buf
3308    }
3309}
3310impl<'a> Iterator for IterableMm<'a> {
3311    type Item = Result<Mm<'a>, ErrorContext>;
3312    fn next(&mut self) -> Option<Self::Item> {
3313        let mut pos;
3314        let mut r#type;
3315        loop {
3316            pos = self.pos;
3317            r#type = None;
3318            if self.buf.len() == self.pos {
3319                return None;
3320            }
3321            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
3322                self.pos = self.buf.len();
3323                break;
3324            };
3325            r#type = Some(header.r#type);
3326            let res = match header.r#type {
3327                1u16 => Mm::Header({
3328                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
3329                    let Some(val) = res else { break };
3330                    val
3331                }),
3332                2u16 => Mm::PmacEnabled({
3333                    let res = parse_u8(next);
3334                    let Some(val) = res else { break };
3335                    val
3336                }),
3337                3u16 => Mm::TxEnabled({
3338                    let res = parse_u8(next);
3339                    let Some(val) = res else { break };
3340                    val
3341                }),
3342                4u16 => Mm::TxActive({
3343                    let res = parse_u8(next);
3344                    let Some(val) = res else { break };
3345                    val
3346                }),
3347                5u16 => Mm::TxMinFragSize({
3348                    let res = parse_u32(next);
3349                    let Some(val) = res else { break };
3350                    val
3351                }),
3352                6u16 => Mm::RxMinFragSize({
3353                    let res = parse_u32(next);
3354                    let Some(val) = res else { break };
3355                    val
3356                }),
3357                7u16 => Mm::VerifyEnabled({
3358                    let res = parse_u8(next);
3359                    let Some(val) = res else { break };
3360                    val
3361                }),
3362                8u16 => Mm::VerifyStatus({
3363                    let res = parse_u8(next);
3364                    let Some(val) = res else { break };
3365                    val
3366                }),
3367                9u16 => Mm::VerifyTime({
3368                    let res = parse_u32(next);
3369                    let Some(val) = res else { break };
3370                    val
3371                }),
3372                10u16 => Mm::MaxVerifyTime({
3373                    let res = parse_u32(next);
3374                    let Some(val) = res else { break };
3375                    val
3376                }),
3377                11u16 => Mm::Stats({
3378                    let res = Some(IterableMmStat::with_loc(next, self.orig_loc));
3379                    let Some(val) = res else { break };
3380                    val
3381                }),
3382                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
3383                n => continue,
3384            };
3385            return Some(Ok(res));
3386        }
3387        Some(Err(ErrorContext::new(
3388            "Mm",
3389            r#type.and_then(|t| Mm::attr_from_type(t)),
3390            self.orig_loc,
3391            self.buf.as_ptr().wrapping_add(pos) as usize,
3392        )))
3393    }
3394}
3395impl<'a> std::fmt::Debug for IterableMm<'_> {
3396    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3397        let mut fmt = f.debug_struct("Mm");
3398        for attr in self.clone() {
3399            let attr = match attr {
3400                Ok(a) => a,
3401                Err(err) => {
3402                    fmt.finish()?;
3403                    f.write_str("Err(")?;
3404                    err.fmt(f)?;
3405                    return f.write_str(")");
3406                }
3407            };
3408            match attr {
3409                Mm::Header(val) => fmt.field("Header", &val),
3410                Mm::PmacEnabled(val) => fmt.field("PmacEnabled", &val),
3411                Mm::TxEnabled(val) => fmt.field("TxEnabled", &val),
3412                Mm::TxActive(val) => fmt.field("TxActive", &val),
3413                Mm::TxMinFragSize(val) => fmt.field("TxMinFragSize", &val),
3414                Mm::RxMinFragSize(val) => fmt.field("RxMinFragSize", &val),
3415                Mm::VerifyEnabled(val) => fmt.field("VerifyEnabled", &val),
3416                Mm::VerifyStatus(val) => fmt.field("VerifyStatus", &val),
3417                Mm::VerifyTime(val) => fmt.field("VerifyTime", &val),
3418                Mm::MaxVerifyTime(val) => fmt.field("MaxVerifyTime", &val),
3419                Mm::Stats(val) => fmt.field("Stats", &val),
3420            };
3421        }
3422        fmt.finish()
3423    }
3424}
3425impl IterableMm<'_> {
3426    pub fn lookup_attr(
3427        &self,
3428        offset: usize,
3429        missing_type: Option<u16>,
3430    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
3431        let mut stack = Vec::new();
3432        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
3433        if missing_type.is_some() && cur == offset {
3434            stack.push(("Mm", offset));
3435            return (stack, missing_type.and_then(|t| Mm::attr_from_type(t)));
3436        }
3437        if cur > offset || cur + self.buf.len() < offset {
3438            return (stack, None);
3439        }
3440        let mut attrs = self.clone();
3441        let mut last_off = cur + attrs.pos;
3442        let mut missing = None;
3443        while let Some(attr) = attrs.next() {
3444            let Ok(attr) = attr else { break };
3445            match attr {
3446                Mm::Header(val) => {
3447                    (stack, missing) = val.lookup_attr(offset, missing_type);
3448                    if !stack.is_empty() {
3449                        break;
3450                    }
3451                }
3452                Mm::PmacEnabled(val) => {
3453                    if last_off == offset {
3454                        stack.push(("PmacEnabled", last_off));
3455                        break;
3456                    }
3457                }
3458                Mm::TxEnabled(val) => {
3459                    if last_off == offset {
3460                        stack.push(("TxEnabled", last_off));
3461                        break;
3462                    }
3463                }
3464                Mm::TxActive(val) => {
3465                    if last_off == offset {
3466                        stack.push(("TxActive", last_off));
3467                        break;
3468                    }
3469                }
3470                Mm::TxMinFragSize(val) => {
3471                    if last_off == offset {
3472                        stack.push(("TxMinFragSize", last_off));
3473                        break;
3474                    }
3475                }
3476                Mm::RxMinFragSize(val) => {
3477                    if last_off == offset {
3478                        stack.push(("RxMinFragSize", last_off));
3479                        break;
3480                    }
3481                }
3482                Mm::VerifyEnabled(val) => {
3483                    if last_off == offset {
3484                        stack.push(("VerifyEnabled", last_off));
3485                        break;
3486                    }
3487                }
3488                Mm::VerifyStatus(val) => {
3489                    if last_off == offset {
3490                        stack.push(("VerifyStatus", last_off));
3491                        break;
3492                    }
3493                }
3494                Mm::VerifyTime(val) => {
3495                    if last_off == offset {
3496                        stack.push(("VerifyTime", last_off));
3497                        break;
3498                    }
3499                }
3500                Mm::MaxVerifyTime(val) => {
3501                    if last_off == offset {
3502                        stack.push(("MaxVerifyTime", last_off));
3503                        break;
3504                    }
3505                }
3506                Mm::Stats(val) => {
3507                    (stack, missing) = val.lookup_attr(offset, missing_type);
3508                    if !stack.is_empty() {
3509                        break;
3510                    }
3511                }
3512                _ => {}
3513            };
3514            last_off = cur + attrs.pos;
3515        }
3516        if !stack.is_empty() {
3517            stack.push(("Mm", cur));
3518        }
3519        (stack, missing)
3520    }
3521}
3522#[derive(Clone)]
3523pub enum Linkinfo<'a> {
3524    Header(IterableHeader<'a>),
3525    Port(u8),
3526    Phyaddr(u8),
3527    TpMdix(u8),
3528    TpMdixCtrl(u8),
3529    Transceiver(u8),
3530}
3531impl<'a> IterableLinkinfo<'a> {
3532    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
3533        let mut iter = self.clone();
3534        iter.pos = 0;
3535        for attr in iter {
3536            if let Ok(Linkinfo::Header(val)) = attr {
3537                return Ok(val);
3538            }
3539        }
3540        Err(ErrorContext::new_missing(
3541            "Linkinfo",
3542            "Header",
3543            self.orig_loc,
3544            self.buf.as_ptr() as usize,
3545        ))
3546    }
3547    pub fn get_port(&self) -> Result<u8, ErrorContext> {
3548        let mut iter = self.clone();
3549        iter.pos = 0;
3550        for attr in iter {
3551            if let Ok(Linkinfo::Port(val)) = attr {
3552                return Ok(val);
3553            }
3554        }
3555        Err(ErrorContext::new_missing(
3556            "Linkinfo",
3557            "Port",
3558            self.orig_loc,
3559            self.buf.as_ptr() as usize,
3560        ))
3561    }
3562    pub fn get_phyaddr(&self) -> Result<u8, ErrorContext> {
3563        let mut iter = self.clone();
3564        iter.pos = 0;
3565        for attr in iter {
3566            if let Ok(Linkinfo::Phyaddr(val)) = attr {
3567                return Ok(val);
3568            }
3569        }
3570        Err(ErrorContext::new_missing(
3571            "Linkinfo",
3572            "Phyaddr",
3573            self.orig_loc,
3574            self.buf.as_ptr() as usize,
3575        ))
3576    }
3577    pub fn get_tp_mdix(&self) -> Result<u8, ErrorContext> {
3578        let mut iter = self.clone();
3579        iter.pos = 0;
3580        for attr in iter {
3581            if let Ok(Linkinfo::TpMdix(val)) = attr {
3582                return Ok(val);
3583            }
3584        }
3585        Err(ErrorContext::new_missing(
3586            "Linkinfo",
3587            "TpMdix",
3588            self.orig_loc,
3589            self.buf.as_ptr() as usize,
3590        ))
3591    }
3592    pub fn get_tp_mdix_ctrl(&self) -> Result<u8, ErrorContext> {
3593        let mut iter = self.clone();
3594        iter.pos = 0;
3595        for attr in iter {
3596            if let Ok(Linkinfo::TpMdixCtrl(val)) = attr {
3597                return Ok(val);
3598            }
3599        }
3600        Err(ErrorContext::new_missing(
3601            "Linkinfo",
3602            "TpMdixCtrl",
3603            self.orig_loc,
3604            self.buf.as_ptr() as usize,
3605        ))
3606    }
3607    pub fn get_transceiver(&self) -> Result<u8, ErrorContext> {
3608        let mut iter = self.clone();
3609        iter.pos = 0;
3610        for attr in iter {
3611            if let Ok(Linkinfo::Transceiver(val)) = attr {
3612                return Ok(val);
3613            }
3614        }
3615        Err(ErrorContext::new_missing(
3616            "Linkinfo",
3617            "Transceiver",
3618            self.orig_loc,
3619            self.buf.as_ptr() as usize,
3620        ))
3621    }
3622}
3623impl Linkinfo<'_> {
3624    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfo<'a> {
3625        IterableLinkinfo::with_loc(buf, buf.as_ptr() as usize)
3626    }
3627    fn attr_from_type(r#type: u16) -> Option<&'static str> {
3628        let res = match r#type {
3629            0u16 => "Unspec",
3630            1u16 => "Header",
3631            2u16 => "Port",
3632            3u16 => "Phyaddr",
3633            4u16 => "TpMdix",
3634            5u16 => "TpMdixCtrl",
3635            6u16 => "Transceiver",
3636            _ => return None,
3637        };
3638        Some(res)
3639    }
3640}
3641#[derive(Clone, Copy, Default)]
3642pub struct IterableLinkinfo<'a> {
3643    buf: &'a [u8],
3644    pos: usize,
3645    orig_loc: usize,
3646}
3647impl<'a> IterableLinkinfo<'a> {
3648    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
3649        Self {
3650            buf,
3651            pos: 0,
3652            orig_loc,
3653        }
3654    }
3655    pub fn get_buf(&self) -> &'a [u8] {
3656        self.buf
3657    }
3658}
3659impl<'a> Iterator for IterableLinkinfo<'a> {
3660    type Item = Result<Linkinfo<'a>, ErrorContext>;
3661    fn next(&mut self) -> Option<Self::Item> {
3662        let mut pos;
3663        let mut r#type;
3664        loop {
3665            pos = self.pos;
3666            r#type = None;
3667            if self.buf.len() == self.pos {
3668                return None;
3669            }
3670            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
3671                self.pos = self.buf.len();
3672                break;
3673            };
3674            r#type = Some(header.r#type);
3675            let res = match header.r#type {
3676                1u16 => Linkinfo::Header({
3677                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
3678                    let Some(val) = res else { break };
3679                    val
3680                }),
3681                2u16 => Linkinfo::Port({
3682                    let res = parse_u8(next);
3683                    let Some(val) = res else { break };
3684                    val
3685                }),
3686                3u16 => Linkinfo::Phyaddr({
3687                    let res = parse_u8(next);
3688                    let Some(val) = res else { break };
3689                    val
3690                }),
3691                4u16 => Linkinfo::TpMdix({
3692                    let res = parse_u8(next);
3693                    let Some(val) = res else { break };
3694                    val
3695                }),
3696                5u16 => Linkinfo::TpMdixCtrl({
3697                    let res = parse_u8(next);
3698                    let Some(val) = res else { break };
3699                    val
3700                }),
3701                6u16 => Linkinfo::Transceiver({
3702                    let res = parse_u8(next);
3703                    let Some(val) = res else { break };
3704                    val
3705                }),
3706                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
3707                n => continue,
3708            };
3709            return Some(Ok(res));
3710        }
3711        Some(Err(ErrorContext::new(
3712            "Linkinfo",
3713            r#type.and_then(|t| Linkinfo::attr_from_type(t)),
3714            self.orig_loc,
3715            self.buf.as_ptr().wrapping_add(pos) as usize,
3716        )))
3717    }
3718}
3719impl<'a> std::fmt::Debug for IterableLinkinfo<'_> {
3720    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3721        let mut fmt = f.debug_struct("Linkinfo");
3722        for attr in self.clone() {
3723            let attr = match attr {
3724                Ok(a) => a,
3725                Err(err) => {
3726                    fmt.finish()?;
3727                    f.write_str("Err(")?;
3728                    err.fmt(f)?;
3729                    return f.write_str(")");
3730                }
3731            };
3732            match attr {
3733                Linkinfo::Header(val) => fmt.field("Header", &val),
3734                Linkinfo::Port(val) => fmt.field("Port", &val),
3735                Linkinfo::Phyaddr(val) => fmt.field("Phyaddr", &val),
3736                Linkinfo::TpMdix(val) => fmt.field("TpMdix", &val),
3737                Linkinfo::TpMdixCtrl(val) => fmt.field("TpMdixCtrl", &val),
3738                Linkinfo::Transceiver(val) => fmt.field("Transceiver", &val),
3739            };
3740        }
3741        fmt.finish()
3742    }
3743}
3744impl IterableLinkinfo<'_> {
3745    pub fn lookup_attr(
3746        &self,
3747        offset: usize,
3748        missing_type: Option<u16>,
3749    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
3750        let mut stack = Vec::new();
3751        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
3752        if missing_type.is_some() && cur == offset {
3753            stack.push(("Linkinfo", offset));
3754            return (
3755                stack,
3756                missing_type.and_then(|t| Linkinfo::attr_from_type(t)),
3757            );
3758        }
3759        if cur > offset || cur + self.buf.len() < offset {
3760            return (stack, None);
3761        }
3762        let mut attrs = self.clone();
3763        let mut last_off = cur + attrs.pos;
3764        let mut missing = None;
3765        while let Some(attr) = attrs.next() {
3766            let Ok(attr) = attr else { break };
3767            match attr {
3768                Linkinfo::Header(val) => {
3769                    (stack, missing) = val.lookup_attr(offset, missing_type);
3770                    if !stack.is_empty() {
3771                        break;
3772                    }
3773                }
3774                Linkinfo::Port(val) => {
3775                    if last_off == offset {
3776                        stack.push(("Port", last_off));
3777                        break;
3778                    }
3779                }
3780                Linkinfo::Phyaddr(val) => {
3781                    if last_off == offset {
3782                        stack.push(("Phyaddr", last_off));
3783                        break;
3784                    }
3785                }
3786                Linkinfo::TpMdix(val) => {
3787                    if last_off == offset {
3788                        stack.push(("TpMdix", last_off));
3789                        break;
3790                    }
3791                }
3792                Linkinfo::TpMdixCtrl(val) => {
3793                    if last_off == offset {
3794                        stack.push(("TpMdixCtrl", last_off));
3795                        break;
3796                    }
3797                }
3798                Linkinfo::Transceiver(val) => {
3799                    if last_off == offset {
3800                        stack.push(("Transceiver", last_off));
3801                        break;
3802                    }
3803                }
3804                _ => {}
3805            };
3806            last_off = cur + attrs.pos;
3807        }
3808        if !stack.is_empty() {
3809            stack.push(("Linkinfo", cur));
3810        }
3811        (stack, missing)
3812    }
3813}
3814#[derive(Clone)]
3815pub enum Linkmodes<'a> {
3816    Header(IterableHeader<'a>),
3817    Autoneg(u8),
3818    Ours(IterableBitset<'a>),
3819    Peer(IterableBitset<'a>),
3820    Speed(u32),
3821    Duplex(u8),
3822    MasterSlaveCfg(u8),
3823    MasterSlaveState(u8),
3824    Lanes(u32),
3825    RateMatching(u8),
3826}
3827impl<'a> IterableLinkmodes<'a> {
3828    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
3829        let mut iter = self.clone();
3830        iter.pos = 0;
3831        for attr in iter {
3832            if let Ok(Linkmodes::Header(val)) = attr {
3833                return Ok(val);
3834            }
3835        }
3836        Err(ErrorContext::new_missing(
3837            "Linkmodes",
3838            "Header",
3839            self.orig_loc,
3840            self.buf.as_ptr() as usize,
3841        ))
3842    }
3843    pub fn get_autoneg(&self) -> Result<u8, ErrorContext> {
3844        let mut iter = self.clone();
3845        iter.pos = 0;
3846        for attr in iter {
3847            if let Ok(Linkmodes::Autoneg(val)) = attr {
3848                return Ok(val);
3849            }
3850        }
3851        Err(ErrorContext::new_missing(
3852            "Linkmodes",
3853            "Autoneg",
3854            self.orig_loc,
3855            self.buf.as_ptr() as usize,
3856        ))
3857    }
3858    pub fn get_ours(&self) -> Result<IterableBitset<'a>, ErrorContext> {
3859        let mut iter = self.clone();
3860        iter.pos = 0;
3861        for attr in iter {
3862            if let Ok(Linkmodes::Ours(val)) = attr {
3863                return Ok(val);
3864            }
3865        }
3866        Err(ErrorContext::new_missing(
3867            "Linkmodes",
3868            "Ours",
3869            self.orig_loc,
3870            self.buf.as_ptr() as usize,
3871        ))
3872    }
3873    pub fn get_peer(&self) -> Result<IterableBitset<'a>, ErrorContext> {
3874        let mut iter = self.clone();
3875        iter.pos = 0;
3876        for attr in iter {
3877            if let Ok(Linkmodes::Peer(val)) = attr {
3878                return Ok(val);
3879            }
3880        }
3881        Err(ErrorContext::new_missing(
3882            "Linkmodes",
3883            "Peer",
3884            self.orig_loc,
3885            self.buf.as_ptr() as usize,
3886        ))
3887    }
3888    pub fn get_speed(&self) -> Result<u32, ErrorContext> {
3889        let mut iter = self.clone();
3890        iter.pos = 0;
3891        for attr in iter {
3892            if let Ok(Linkmodes::Speed(val)) = attr {
3893                return Ok(val);
3894            }
3895        }
3896        Err(ErrorContext::new_missing(
3897            "Linkmodes",
3898            "Speed",
3899            self.orig_loc,
3900            self.buf.as_ptr() as usize,
3901        ))
3902    }
3903    pub fn get_duplex(&self) -> Result<u8, ErrorContext> {
3904        let mut iter = self.clone();
3905        iter.pos = 0;
3906        for attr in iter {
3907            if let Ok(Linkmodes::Duplex(val)) = attr {
3908                return Ok(val);
3909            }
3910        }
3911        Err(ErrorContext::new_missing(
3912            "Linkmodes",
3913            "Duplex",
3914            self.orig_loc,
3915            self.buf.as_ptr() as usize,
3916        ))
3917    }
3918    pub fn get_master_slave_cfg(&self) -> Result<u8, ErrorContext> {
3919        let mut iter = self.clone();
3920        iter.pos = 0;
3921        for attr in iter {
3922            if let Ok(Linkmodes::MasterSlaveCfg(val)) = attr {
3923                return Ok(val);
3924            }
3925        }
3926        Err(ErrorContext::new_missing(
3927            "Linkmodes",
3928            "MasterSlaveCfg",
3929            self.orig_loc,
3930            self.buf.as_ptr() as usize,
3931        ))
3932    }
3933    pub fn get_master_slave_state(&self) -> Result<u8, ErrorContext> {
3934        let mut iter = self.clone();
3935        iter.pos = 0;
3936        for attr in iter {
3937            if let Ok(Linkmodes::MasterSlaveState(val)) = attr {
3938                return Ok(val);
3939            }
3940        }
3941        Err(ErrorContext::new_missing(
3942            "Linkmodes",
3943            "MasterSlaveState",
3944            self.orig_loc,
3945            self.buf.as_ptr() as usize,
3946        ))
3947    }
3948    pub fn get_lanes(&self) -> Result<u32, ErrorContext> {
3949        let mut iter = self.clone();
3950        iter.pos = 0;
3951        for attr in iter {
3952            if let Ok(Linkmodes::Lanes(val)) = attr {
3953                return Ok(val);
3954            }
3955        }
3956        Err(ErrorContext::new_missing(
3957            "Linkmodes",
3958            "Lanes",
3959            self.orig_loc,
3960            self.buf.as_ptr() as usize,
3961        ))
3962    }
3963    pub fn get_rate_matching(&self) -> Result<u8, ErrorContext> {
3964        let mut iter = self.clone();
3965        iter.pos = 0;
3966        for attr in iter {
3967            if let Ok(Linkmodes::RateMatching(val)) = attr {
3968                return Ok(val);
3969            }
3970        }
3971        Err(ErrorContext::new_missing(
3972            "Linkmodes",
3973            "RateMatching",
3974            self.orig_loc,
3975            self.buf.as_ptr() as usize,
3976        ))
3977    }
3978}
3979impl Linkmodes<'_> {
3980    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkmodes<'a> {
3981        IterableLinkmodes::with_loc(buf, buf.as_ptr() as usize)
3982    }
3983    fn attr_from_type(r#type: u16) -> Option<&'static str> {
3984        let res = match r#type {
3985            0u16 => "Unspec",
3986            1u16 => "Header",
3987            2u16 => "Autoneg",
3988            3u16 => "Ours",
3989            4u16 => "Peer",
3990            5u16 => "Speed",
3991            6u16 => "Duplex",
3992            7u16 => "MasterSlaveCfg",
3993            8u16 => "MasterSlaveState",
3994            9u16 => "Lanes",
3995            10u16 => "RateMatching",
3996            _ => return None,
3997        };
3998        Some(res)
3999    }
4000}
4001#[derive(Clone, Copy, Default)]
4002pub struct IterableLinkmodes<'a> {
4003    buf: &'a [u8],
4004    pos: usize,
4005    orig_loc: usize,
4006}
4007impl<'a> IterableLinkmodes<'a> {
4008    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4009        Self {
4010            buf,
4011            pos: 0,
4012            orig_loc,
4013        }
4014    }
4015    pub fn get_buf(&self) -> &'a [u8] {
4016        self.buf
4017    }
4018}
4019impl<'a> Iterator for IterableLinkmodes<'a> {
4020    type Item = Result<Linkmodes<'a>, ErrorContext>;
4021    fn next(&mut self) -> Option<Self::Item> {
4022        let mut pos;
4023        let mut r#type;
4024        loop {
4025            pos = self.pos;
4026            r#type = None;
4027            if self.buf.len() == self.pos {
4028                return None;
4029            }
4030            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4031                self.pos = self.buf.len();
4032                break;
4033            };
4034            r#type = Some(header.r#type);
4035            let res = match header.r#type {
4036                1u16 => Linkmodes::Header({
4037                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
4038                    let Some(val) = res else { break };
4039                    val
4040                }),
4041                2u16 => Linkmodes::Autoneg({
4042                    let res = parse_u8(next);
4043                    let Some(val) = res else { break };
4044                    val
4045                }),
4046                3u16 => Linkmodes::Ours({
4047                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
4048                    let Some(val) = res else { break };
4049                    val
4050                }),
4051                4u16 => Linkmodes::Peer({
4052                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
4053                    let Some(val) = res else { break };
4054                    val
4055                }),
4056                5u16 => Linkmodes::Speed({
4057                    let res = parse_u32(next);
4058                    let Some(val) = res else { break };
4059                    val
4060                }),
4061                6u16 => Linkmodes::Duplex({
4062                    let res = parse_u8(next);
4063                    let Some(val) = res else { break };
4064                    val
4065                }),
4066                7u16 => Linkmodes::MasterSlaveCfg({
4067                    let res = parse_u8(next);
4068                    let Some(val) = res else { break };
4069                    val
4070                }),
4071                8u16 => Linkmodes::MasterSlaveState({
4072                    let res = parse_u8(next);
4073                    let Some(val) = res else { break };
4074                    val
4075                }),
4076                9u16 => Linkmodes::Lanes({
4077                    let res = parse_u32(next);
4078                    let Some(val) = res else { break };
4079                    val
4080                }),
4081                10u16 => Linkmodes::RateMatching({
4082                    let res = parse_u8(next);
4083                    let Some(val) = res else { break };
4084                    val
4085                }),
4086                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4087                n => continue,
4088            };
4089            return Some(Ok(res));
4090        }
4091        Some(Err(ErrorContext::new(
4092            "Linkmodes",
4093            r#type.and_then(|t| Linkmodes::attr_from_type(t)),
4094            self.orig_loc,
4095            self.buf.as_ptr().wrapping_add(pos) as usize,
4096        )))
4097    }
4098}
4099impl<'a> std::fmt::Debug for IterableLinkmodes<'_> {
4100    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4101        let mut fmt = f.debug_struct("Linkmodes");
4102        for attr in self.clone() {
4103            let attr = match attr {
4104                Ok(a) => a,
4105                Err(err) => {
4106                    fmt.finish()?;
4107                    f.write_str("Err(")?;
4108                    err.fmt(f)?;
4109                    return f.write_str(")");
4110                }
4111            };
4112            match attr {
4113                Linkmodes::Header(val) => fmt.field("Header", &val),
4114                Linkmodes::Autoneg(val) => fmt.field("Autoneg", &val),
4115                Linkmodes::Ours(val) => fmt.field("Ours", &val),
4116                Linkmodes::Peer(val) => fmt.field("Peer", &val),
4117                Linkmodes::Speed(val) => fmt.field("Speed", &val),
4118                Linkmodes::Duplex(val) => fmt.field("Duplex", &val),
4119                Linkmodes::MasterSlaveCfg(val) => fmt.field("MasterSlaveCfg", &val),
4120                Linkmodes::MasterSlaveState(val) => fmt.field("MasterSlaveState", &val),
4121                Linkmodes::Lanes(val) => fmt.field("Lanes", &val),
4122                Linkmodes::RateMatching(val) => fmt.field("RateMatching", &val),
4123            };
4124        }
4125        fmt.finish()
4126    }
4127}
4128impl IterableLinkmodes<'_> {
4129    pub fn lookup_attr(
4130        &self,
4131        offset: usize,
4132        missing_type: Option<u16>,
4133    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4134        let mut stack = Vec::new();
4135        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4136        if missing_type.is_some() && cur == offset {
4137            stack.push(("Linkmodes", offset));
4138            return (
4139                stack,
4140                missing_type.and_then(|t| Linkmodes::attr_from_type(t)),
4141            );
4142        }
4143        if cur > offset || cur + self.buf.len() < offset {
4144            return (stack, None);
4145        }
4146        let mut attrs = self.clone();
4147        let mut last_off = cur + attrs.pos;
4148        let mut missing = None;
4149        while let Some(attr) = attrs.next() {
4150            let Ok(attr) = attr else { break };
4151            match attr {
4152                Linkmodes::Header(val) => {
4153                    (stack, missing) = val.lookup_attr(offset, missing_type);
4154                    if !stack.is_empty() {
4155                        break;
4156                    }
4157                }
4158                Linkmodes::Autoneg(val) => {
4159                    if last_off == offset {
4160                        stack.push(("Autoneg", last_off));
4161                        break;
4162                    }
4163                }
4164                Linkmodes::Ours(val) => {
4165                    (stack, missing) = val.lookup_attr(offset, missing_type);
4166                    if !stack.is_empty() {
4167                        break;
4168                    }
4169                }
4170                Linkmodes::Peer(val) => {
4171                    (stack, missing) = val.lookup_attr(offset, missing_type);
4172                    if !stack.is_empty() {
4173                        break;
4174                    }
4175                }
4176                Linkmodes::Speed(val) => {
4177                    if last_off == offset {
4178                        stack.push(("Speed", last_off));
4179                        break;
4180                    }
4181                }
4182                Linkmodes::Duplex(val) => {
4183                    if last_off == offset {
4184                        stack.push(("Duplex", last_off));
4185                        break;
4186                    }
4187                }
4188                Linkmodes::MasterSlaveCfg(val) => {
4189                    if last_off == offset {
4190                        stack.push(("MasterSlaveCfg", last_off));
4191                        break;
4192                    }
4193                }
4194                Linkmodes::MasterSlaveState(val) => {
4195                    if last_off == offset {
4196                        stack.push(("MasterSlaveState", last_off));
4197                        break;
4198                    }
4199                }
4200                Linkmodes::Lanes(val) => {
4201                    if last_off == offset {
4202                        stack.push(("Lanes", last_off));
4203                        break;
4204                    }
4205                }
4206                Linkmodes::RateMatching(val) => {
4207                    if last_off == offset {
4208                        stack.push(("RateMatching", last_off));
4209                        break;
4210                    }
4211                }
4212                _ => {}
4213            };
4214            last_off = cur + attrs.pos;
4215        }
4216        if !stack.is_empty() {
4217            stack.push(("Linkmodes", cur));
4218        }
4219        (stack, missing)
4220    }
4221}
4222#[derive(Clone)]
4223pub enum Linkstate<'a> {
4224    Header(IterableHeader<'a>),
4225    Link(u8),
4226    Sqi(u32),
4227    SqiMax(u32),
4228    ExtState(u8),
4229    ExtSubstate(u8),
4230    ExtDownCnt(u32),
4231}
4232impl<'a> IterableLinkstate<'a> {
4233    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
4234        let mut iter = self.clone();
4235        iter.pos = 0;
4236        for attr in iter {
4237            if let Ok(Linkstate::Header(val)) = attr {
4238                return Ok(val);
4239            }
4240        }
4241        Err(ErrorContext::new_missing(
4242            "Linkstate",
4243            "Header",
4244            self.orig_loc,
4245            self.buf.as_ptr() as usize,
4246        ))
4247    }
4248    pub fn get_link(&self) -> Result<u8, ErrorContext> {
4249        let mut iter = self.clone();
4250        iter.pos = 0;
4251        for attr in iter {
4252            if let Ok(Linkstate::Link(val)) = attr {
4253                return Ok(val);
4254            }
4255        }
4256        Err(ErrorContext::new_missing(
4257            "Linkstate",
4258            "Link",
4259            self.orig_loc,
4260            self.buf.as_ptr() as usize,
4261        ))
4262    }
4263    pub fn get_sqi(&self) -> Result<u32, ErrorContext> {
4264        let mut iter = self.clone();
4265        iter.pos = 0;
4266        for attr in iter {
4267            if let Ok(Linkstate::Sqi(val)) = attr {
4268                return Ok(val);
4269            }
4270        }
4271        Err(ErrorContext::new_missing(
4272            "Linkstate",
4273            "Sqi",
4274            self.orig_loc,
4275            self.buf.as_ptr() as usize,
4276        ))
4277    }
4278    pub fn get_sqi_max(&self) -> Result<u32, ErrorContext> {
4279        let mut iter = self.clone();
4280        iter.pos = 0;
4281        for attr in iter {
4282            if let Ok(Linkstate::SqiMax(val)) = attr {
4283                return Ok(val);
4284            }
4285        }
4286        Err(ErrorContext::new_missing(
4287            "Linkstate",
4288            "SqiMax",
4289            self.orig_loc,
4290            self.buf.as_ptr() as usize,
4291        ))
4292    }
4293    pub fn get_ext_state(&self) -> Result<u8, ErrorContext> {
4294        let mut iter = self.clone();
4295        iter.pos = 0;
4296        for attr in iter {
4297            if let Ok(Linkstate::ExtState(val)) = attr {
4298                return Ok(val);
4299            }
4300        }
4301        Err(ErrorContext::new_missing(
4302            "Linkstate",
4303            "ExtState",
4304            self.orig_loc,
4305            self.buf.as_ptr() as usize,
4306        ))
4307    }
4308    pub fn get_ext_substate(&self) -> Result<u8, ErrorContext> {
4309        let mut iter = self.clone();
4310        iter.pos = 0;
4311        for attr in iter {
4312            if let Ok(Linkstate::ExtSubstate(val)) = attr {
4313                return Ok(val);
4314            }
4315        }
4316        Err(ErrorContext::new_missing(
4317            "Linkstate",
4318            "ExtSubstate",
4319            self.orig_loc,
4320            self.buf.as_ptr() as usize,
4321        ))
4322    }
4323    pub fn get_ext_down_cnt(&self) -> Result<u32, ErrorContext> {
4324        let mut iter = self.clone();
4325        iter.pos = 0;
4326        for attr in iter {
4327            if let Ok(Linkstate::ExtDownCnt(val)) = attr {
4328                return Ok(val);
4329            }
4330        }
4331        Err(ErrorContext::new_missing(
4332            "Linkstate",
4333            "ExtDownCnt",
4334            self.orig_loc,
4335            self.buf.as_ptr() as usize,
4336        ))
4337    }
4338}
4339impl Linkstate<'_> {
4340    pub fn new<'a>(buf: &'a [u8]) -> IterableLinkstate<'a> {
4341        IterableLinkstate::with_loc(buf, buf.as_ptr() as usize)
4342    }
4343    fn attr_from_type(r#type: u16) -> Option<&'static str> {
4344        let res = match r#type {
4345            0u16 => "Unspec",
4346            1u16 => "Header",
4347            2u16 => "Link",
4348            3u16 => "Sqi",
4349            4u16 => "SqiMax",
4350            5u16 => "ExtState",
4351            6u16 => "ExtSubstate",
4352            7u16 => "ExtDownCnt",
4353            _ => return None,
4354        };
4355        Some(res)
4356    }
4357}
4358#[derive(Clone, Copy, Default)]
4359pub struct IterableLinkstate<'a> {
4360    buf: &'a [u8],
4361    pos: usize,
4362    orig_loc: usize,
4363}
4364impl<'a> IterableLinkstate<'a> {
4365    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4366        Self {
4367            buf,
4368            pos: 0,
4369            orig_loc,
4370        }
4371    }
4372    pub fn get_buf(&self) -> &'a [u8] {
4373        self.buf
4374    }
4375}
4376impl<'a> Iterator for IterableLinkstate<'a> {
4377    type Item = Result<Linkstate<'a>, ErrorContext>;
4378    fn next(&mut self) -> Option<Self::Item> {
4379        let mut pos;
4380        let mut r#type;
4381        loop {
4382            pos = self.pos;
4383            r#type = None;
4384            if self.buf.len() == self.pos {
4385                return None;
4386            }
4387            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4388                self.pos = self.buf.len();
4389                break;
4390            };
4391            r#type = Some(header.r#type);
4392            let res = match header.r#type {
4393                1u16 => Linkstate::Header({
4394                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
4395                    let Some(val) = res else { break };
4396                    val
4397                }),
4398                2u16 => Linkstate::Link({
4399                    let res = parse_u8(next);
4400                    let Some(val) = res else { break };
4401                    val
4402                }),
4403                3u16 => Linkstate::Sqi({
4404                    let res = parse_u32(next);
4405                    let Some(val) = res else { break };
4406                    val
4407                }),
4408                4u16 => Linkstate::SqiMax({
4409                    let res = parse_u32(next);
4410                    let Some(val) = res else { break };
4411                    val
4412                }),
4413                5u16 => Linkstate::ExtState({
4414                    let res = parse_u8(next);
4415                    let Some(val) = res else { break };
4416                    val
4417                }),
4418                6u16 => Linkstate::ExtSubstate({
4419                    let res = parse_u8(next);
4420                    let Some(val) = res else { break };
4421                    val
4422                }),
4423                7u16 => Linkstate::ExtDownCnt({
4424                    let res = parse_u32(next);
4425                    let Some(val) = res else { break };
4426                    val
4427                }),
4428                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4429                n => continue,
4430            };
4431            return Some(Ok(res));
4432        }
4433        Some(Err(ErrorContext::new(
4434            "Linkstate",
4435            r#type.and_then(|t| Linkstate::attr_from_type(t)),
4436            self.orig_loc,
4437            self.buf.as_ptr().wrapping_add(pos) as usize,
4438        )))
4439    }
4440}
4441impl<'a> std::fmt::Debug for IterableLinkstate<'_> {
4442    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4443        let mut fmt = f.debug_struct("Linkstate");
4444        for attr in self.clone() {
4445            let attr = match attr {
4446                Ok(a) => a,
4447                Err(err) => {
4448                    fmt.finish()?;
4449                    f.write_str("Err(")?;
4450                    err.fmt(f)?;
4451                    return f.write_str(")");
4452                }
4453            };
4454            match attr {
4455                Linkstate::Header(val) => fmt.field("Header", &val),
4456                Linkstate::Link(val) => fmt.field("Link", &val),
4457                Linkstate::Sqi(val) => fmt.field("Sqi", &val),
4458                Linkstate::SqiMax(val) => fmt.field("SqiMax", &val),
4459                Linkstate::ExtState(val) => fmt.field("ExtState", &val),
4460                Linkstate::ExtSubstate(val) => fmt.field("ExtSubstate", &val),
4461                Linkstate::ExtDownCnt(val) => fmt.field("ExtDownCnt", &val),
4462            };
4463        }
4464        fmt.finish()
4465    }
4466}
4467impl IterableLinkstate<'_> {
4468    pub fn lookup_attr(
4469        &self,
4470        offset: usize,
4471        missing_type: Option<u16>,
4472    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4473        let mut stack = Vec::new();
4474        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4475        if missing_type.is_some() && cur == offset {
4476            stack.push(("Linkstate", offset));
4477            return (
4478                stack,
4479                missing_type.and_then(|t| Linkstate::attr_from_type(t)),
4480            );
4481        }
4482        if cur > offset || cur + self.buf.len() < offset {
4483            return (stack, None);
4484        }
4485        let mut attrs = self.clone();
4486        let mut last_off = cur + attrs.pos;
4487        let mut missing = None;
4488        while let Some(attr) = attrs.next() {
4489            let Ok(attr) = attr else { break };
4490            match attr {
4491                Linkstate::Header(val) => {
4492                    (stack, missing) = val.lookup_attr(offset, missing_type);
4493                    if !stack.is_empty() {
4494                        break;
4495                    }
4496                }
4497                Linkstate::Link(val) => {
4498                    if last_off == offset {
4499                        stack.push(("Link", last_off));
4500                        break;
4501                    }
4502                }
4503                Linkstate::Sqi(val) => {
4504                    if last_off == offset {
4505                        stack.push(("Sqi", last_off));
4506                        break;
4507                    }
4508                }
4509                Linkstate::SqiMax(val) => {
4510                    if last_off == offset {
4511                        stack.push(("SqiMax", last_off));
4512                        break;
4513                    }
4514                }
4515                Linkstate::ExtState(val) => {
4516                    if last_off == offset {
4517                        stack.push(("ExtState", last_off));
4518                        break;
4519                    }
4520                }
4521                Linkstate::ExtSubstate(val) => {
4522                    if last_off == offset {
4523                        stack.push(("ExtSubstate", last_off));
4524                        break;
4525                    }
4526                }
4527                Linkstate::ExtDownCnt(val) => {
4528                    if last_off == offset {
4529                        stack.push(("ExtDownCnt", last_off));
4530                        break;
4531                    }
4532                }
4533                _ => {}
4534            };
4535            last_off = cur + attrs.pos;
4536        }
4537        if !stack.is_empty() {
4538            stack.push(("Linkstate", cur));
4539        }
4540        (stack, missing)
4541    }
4542}
4543#[derive(Clone)]
4544pub enum Debug<'a> {
4545    Header(IterableHeader<'a>),
4546    Msgmask(IterableBitset<'a>),
4547}
4548impl<'a> IterableDebug<'a> {
4549    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
4550        let mut iter = self.clone();
4551        iter.pos = 0;
4552        for attr in iter {
4553            if let Ok(Debug::Header(val)) = attr {
4554                return Ok(val);
4555            }
4556        }
4557        Err(ErrorContext::new_missing(
4558            "Debug",
4559            "Header",
4560            self.orig_loc,
4561            self.buf.as_ptr() as usize,
4562        ))
4563    }
4564    pub fn get_msgmask(&self) -> Result<IterableBitset<'a>, ErrorContext> {
4565        let mut iter = self.clone();
4566        iter.pos = 0;
4567        for attr in iter {
4568            if let Ok(Debug::Msgmask(val)) = attr {
4569                return Ok(val);
4570            }
4571        }
4572        Err(ErrorContext::new_missing(
4573            "Debug",
4574            "Msgmask",
4575            self.orig_loc,
4576            self.buf.as_ptr() as usize,
4577        ))
4578    }
4579}
4580impl Debug<'_> {
4581    pub fn new<'a>(buf: &'a [u8]) -> IterableDebug<'a> {
4582        IterableDebug::with_loc(buf, buf.as_ptr() as usize)
4583    }
4584    fn attr_from_type(r#type: u16) -> Option<&'static str> {
4585        let res = match r#type {
4586            0u16 => "Unspec",
4587            1u16 => "Header",
4588            2u16 => "Msgmask",
4589            _ => return None,
4590        };
4591        Some(res)
4592    }
4593}
4594#[derive(Clone, Copy, Default)]
4595pub struct IterableDebug<'a> {
4596    buf: &'a [u8],
4597    pos: usize,
4598    orig_loc: usize,
4599}
4600impl<'a> IterableDebug<'a> {
4601    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4602        Self {
4603            buf,
4604            pos: 0,
4605            orig_loc,
4606        }
4607    }
4608    pub fn get_buf(&self) -> &'a [u8] {
4609        self.buf
4610    }
4611}
4612impl<'a> Iterator for IterableDebug<'a> {
4613    type Item = Result<Debug<'a>, ErrorContext>;
4614    fn next(&mut self) -> Option<Self::Item> {
4615        let mut pos;
4616        let mut r#type;
4617        loop {
4618            pos = self.pos;
4619            r#type = None;
4620            if self.buf.len() == self.pos {
4621                return None;
4622            }
4623            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4624                self.pos = self.buf.len();
4625                break;
4626            };
4627            r#type = Some(header.r#type);
4628            let res = match header.r#type {
4629                1u16 => Debug::Header({
4630                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
4631                    let Some(val) = res else { break };
4632                    val
4633                }),
4634                2u16 => Debug::Msgmask({
4635                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
4636                    let Some(val) = res else { break };
4637                    val
4638                }),
4639                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4640                n => continue,
4641            };
4642            return Some(Ok(res));
4643        }
4644        Some(Err(ErrorContext::new(
4645            "Debug",
4646            r#type.and_then(|t| Debug::attr_from_type(t)),
4647            self.orig_loc,
4648            self.buf.as_ptr().wrapping_add(pos) as usize,
4649        )))
4650    }
4651}
4652impl<'a> std::fmt::Debug for IterableDebug<'_> {
4653    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4654        let mut fmt = f.debug_struct("Debug");
4655        for attr in self.clone() {
4656            let attr = match attr {
4657                Ok(a) => a,
4658                Err(err) => {
4659                    fmt.finish()?;
4660                    f.write_str("Err(")?;
4661                    err.fmt(f)?;
4662                    return f.write_str(")");
4663                }
4664            };
4665            match attr {
4666                Debug::Header(val) => fmt.field("Header", &val),
4667                Debug::Msgmask(val) => fmt.field("Msgmask", &val),
4668            };
4669        }
4670        fmt.finish()
4671    }
4672}
4673impl IterableDebug<'_> {
4674    pub fn lookup_attr(
4675        &self,
4676        offset: usize,
4677        missing_type: Option<u16>,
4678    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4679        let mut stack = Vec::new();
4680        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4681        if missing_type.is_some() && cur == offset {
4682            stack.push(("Debug", offset));
4683            return (stack, missing_type.and_then(|t| Debug::attr_from_type(t)));
4684        }
4685        if cur > offset || cur + self.buf.len() < offset {
4686            return (stack, None);
4687        }
4688        let mut attrs = self.clone();
4689        let mut last_off = cur + attrs.pos;
4690        let mut missing = None;
4691        while let Some(attr) = attrs.next() {
4692            let Ok(attr) = attr else { break };
4693            match attr {
4694                Debug::Header(val) => {
4695                    (stack, missing) = val.lookup_attr(offset, missing_type);
4696                    if !stack.is_empty() {
4697                        break;
4698                    }
4699                }
4700                Debug::Msgmask(val) => {
4701                    (stack, missing) = val.lookup_attr(offset, missing_type);
4702                    if !stack.is_empty() {
4703                        break;
4704                    }
4705                }
4706                _ => {}
4707            };
4708            last_off = cur + attrs.pos;
4709        }
4710        if !stack.is_empty() {
4711            stack.push(("Debug", cur));
4712        }
4713        (stack, missing)
4714    }
4715}
4716#[derive(Clone)]
4717pub enum Wol<'a> {
4718    Header(IterableHeader<'a>),
4719    Modes(IterableBitset<'a>),
4720    Sopass(&'a [u8]),
4721}
4722impl<'a> IterableWol<'a> {
4723    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
4724        let mut iter = self.clone();
4725        iter.pos = 0;
4726        for attr in iter {
4727            if let Ok(Wol::Header(val)) = attr {
4728                return Ok(val);
4729            }
4730        }
4731        Err(ErrorContext::new_missing(
4732            "Wol",
4733            "Header",
4734            self.orig_loc,
4735            self.buf.as_ptr() as usize,
4736        ))
4737    }
4738    pub fn get_modes(&self) -> Result<IterableBitset<'a>, ErrorContext> {
4739        let mut iter = self.clone();
4740        iter.pos = 0;
4741        for attr in iter {
4742            if let Ok(Wol::Modes(val)) = attr {
4743                return Ok(val);
4744            }
4745        }
4746        Err(ErrorContext::new_missing(
4747            "Wol",
4748            "Modes",
4749            self.orig_loc,
4750            self.buf.as_ptr() as usize,
4751        ))
4752    }
4753    pub fn get_sopass(&self) -> Result<&'a [u8], ErrorContext> {
4754        let mut iter = self.clone();
4755        iter.pos = 0;
4756        for attr in iter {
4757            if let Ok(Wol::Sopass(val)) = attr {
4758                return Ok(val);
4759            }
4760        }
4761        Err(ErrorContext::new_missing(
4762            "Wol",
4763            "Sopass",
4764            self.orig_loc,
4765            self.buf.as_ptr() as usize,
4766        ))
4767    }
4768}
4769impl Wol<'_> {
4770    pub fn new<'a>(buf: &'a [u8]) -> IterableWol<'a> {
4771        IterableWol::with_loc(buf, buf.as_ptr() as usize)
4772    }
4773    fn attr_from_type(r#type: u16) -> Option<&'static str> {
4774        let res = match r#type {
4775            0u16 => "Unspec",
4776            1u16 => "Header",
4777            2u16 => "Modes",
4778            3u16 => "Sopass",
4779            _ => return None,
4780        };
4781        Some(res)
4782    }
4783}
4784#[derive(Clone, Copy, Default)]
4785pub struct IterableWol<'a> {
4786    buf: &'a [u8],
4787    pos: usize,
4788    orig_loc: usize,
4789}
4790impl<'a> IterableWol<'a> {
4791    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4792        Self {
4793            buf,
4794            pos: 0,
4795            orig_loc,
4796        }
4797    }
4798    pub fn get_buf(&self) -> &'a [u8] {
4799        self.buf
4800    }
4801}
4802impl<'a> Iterator for IterableWol<'a> {
4803    type Item = Result<Wol<'a>, ErrorContext>;
4804    fn next(&mut self) -> Option<Self::Item> {
4805        let mut pos;
4806        let mut r#type;
4807        loop {
4808            pos = self.pos;
4809            r#type = None;
4810            if self.buf.len() == self.pos {
4811                return None;
4812            }
4813            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4814                self.pos = self.buf.len();
4815                break;
4816            };
4817            r#type = Some(header.r#type);
4818            let res = match header.r#type {
4819                1u16 => Wol::Header({
4820                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
4821                    let Some(val) = res else { break };
4822                    val
4823                }),
4824                2u16 => Wol::Modes({
4825                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
4826                    let Some(val) = res else { break };
4827                    val
4828                }),
4829                3u16 => Wol::Sopass({
4830                    let res = Some(next);
4831                    let Some(val) = res else { break };
4832                    val
4833                }),
4834                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4835                n => continue,
4836            };
4837            return Some(Ok(res));
4838        }
4839        Some(Err(ErrorContext::new(
4840            "Wol",
4841            r#type.and_then(|t| Wol::attr_from_type(t)),
4842            self.orig_loc,
4843            self.buf.as_ptr().wrapping_add(pos) as usize,
4844        )))
4845    }
4846}
4847impl<'a> std::fmt::Debug for IterableWol<'_> {
4848    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4849        let mut fmt = f.debug_struct("Wol");
4850        for attr in self.clone() {
4851            let attr = match attr {
4852                Ok(a) => a,
4853                Err(err) => {
4854                    fmt.finish()?;
4855                    f.write_str("Err(")?;
4856                    err.fmt(f)?;
4857                    return f.write_str(")");
4858                }
4859            };
4860            match attr {
4861                Wol::Header(val) => fmt.field("Header", &val),
4862                Wol::Modes(val) => fmt.field("Modes", &val),
4863                Wol::Sopass(val) => fmt.field("Sopass", &val),
4864            };
4865        }
4866        fmt.finish()
4867    }
4868}
4869impl IterableWol<'_> {
4870    pub fn lookup_attr(
4871        &self,
4872        offset: usize,
4873        missing_type: Option<u16>,
4874    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4875        let mut stack = Vec::new();
4876        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4877        if missing_type.is_some() && cur == offset {
4878            stack.push(("Wol", offset));
4879            return (stack, missing_type.and_then(|t| Wol::attr_from_type(t)));
4880        }
4881        if cur > offset || cur + self.buf.len() < offset {
4882            return (stack, None);
4883        }
4884        let mut attrs = self.clone();
4885        let mut last_off = cur + attrs.pos;
4886        let mut missing = None;
4887        while let Some(attr) = attrs.next() {
4888            let Ok(attr) = attr else { break };
4889            match attr {
4890                Wol::Header(val) => {
4891                    (stack, missing) = val.lookup_attr(offset, missing_type);
4892                    if !stack.is_empty() {
4893                        break;
4894                    }
4895                }
4896                Wol::Modes(val) => {
4897                    (stack, missing) = val.lookup_attr(offset, missing_type);
4898                    if !stack.is_empty() {
4899                        break;
4900                    }
4901                }
4902                Wol::Sopass(val) => {
4903                    if last_off == offset {
4904                        stack.push(("Sopass", last_off));
4905                        break;
4906                    }
4907                }
4908                _ => {}
4909            };
4910            last_off = cur + attrs.pos;
4911        }
4912        if !stack.is_empty() {
4913            stack.push(("Wol", cur));
4914        }
4915        (stack, missing)
4916    }
4917}
4918#[derive(Clone)]
4919pub enum Features<'a> {
4920    Header(IterableHeader<'a>),
4921    Hw(IterableBitset<'a>),
4922    Wanted(IterableBitset<'a>),
4923    Active(IterableBitset<'a>),
4924    Nochange(IterableBitset<'a>),
4925}
4926impl<'a> IterableFeatures<'a> {
4927    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
4928        let mut iter = self.clone();
4929        iter.pos = 0;
4930        for attr in iter {
4931            if let Ok(Features::Header(val)) = attr {
4932                return Ok(val);
4933            }
4934        }
4935        Err(ErrorContext::new_missing(
4936            "Features",
4937            "Header",
4938            self.orig_loc,
4939            self.buf.as_ptr() as usize,
4940        ))
4941    }
4942    pub fn get_hw(&self) -> Result<IterableBitset<'a>, ErrorContext> {
4943        let mut iter = self.clone();
4944        iter.pos = 0;
4945        for attr in iter {
4946            if let Ok(Features::Hw(val)) = attr {
4947                return Ok(val);
4948            }
4949        }
4950        Err(ErrorContext::new_missing(
4951            "Features",
4952            "Hw",
4953            self.orig_loc,
4954            self.buf.as_ptr() as usize,
4955        ))
4956    }
4957    pub fn get_wanted(&self) -> Result<IterableBitset<'a>, ErrorContext> {
4958        let mut iter = self.clone();
4959        iter.pos = 0;
4960        for attr in iter {
4961            if let Ok(Features::Wanted(val)) = attr {
4962                return Ok(val);
4963            }
4964        }
4965        Err(ErrorContext::new_missing(
4966            "Features",
4967            "Wanted",
4968            self.orig_loc,
4969            self.buf.as_ptr() as usize,
4970        ))
4971    }
4972    pub fn get_active(&self) -> Result<IterableBitset<'a>, ErrorContext> {
4973        let mut iter = self.clone();
4974        iter.pos = 0;
4975        for attr in iter {
4976            if let Ok(Features::Active(val)) = attr {
4977                return Ok(val);
4978            }
4979        }
4980        Err(ErrorContext::new_missing(
4981            "Features",
4982            "Active",
4983            self.orig_loc,
4984            self.buf.as_ptr() as usize,
4985        ))
4986    }
4987    pub fn get_nochange(&self) -> Result<IterableBitset<'a>, ErrorContext> {
4988        let mut iter = self.clone();
4989        iter.pos = 0;
4990        for attr in iter {
4991            if let Ok(Features::Nochange(val)) = attr {
4992                return Ok(val);
4993            }
4994        }
4995        Err(ErrorContext::new_missing(
4996            "Features",
4997            "Nochange",
4998            self.orig_loc,
4999            self.buf.as_ptr() as usize,
5000        ))
5001    }
5002}
5003impl Features<'_> {
5004    pub fn new<'a>(buf: &'a [u8]) -> IterableFeatures<'a> {
5005        IterableFeatures::with_loc(buf, buf.as_ptr() as usize)
5006    }
5007    fn attr_from_type(r#type: u16) -> Option<&'static str> {
5008        let res = match r#type {
5009            0u16 => "Unspec",
5010            1u16 => "Header",
5011            2u16 => "Hw",
5012            3u16 => "Wanted",
5013            4u16 => "Active",
5014            5u16 => "Nochange",
5015            _ => return None,
5016        };
5017        Some(res)
5018    }
5019}
5020#[derive(Clone, Copy, Default)]
5021pub struct IterableFeatures<'a> {
5022    buf: &'a [u8],
5023    pos: usize,
5024    orig_loc: usize,
5025}
5026impl<'a> IterableFeatures<'a> {
5027    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5028        Self {
5029            buf,
5030            pos: 0,
5031            orig_loc,
5032        }
5033    }
5034    pub fn get_buf(&self) -> &'a [u8] {
5035        self.buf
5036    }
5037}
5038impl<'a> Iterator for IterableFeatures<'a> {
5039    type Item = Result<Features<'a>, ErrorContext>;
5040    fn next(&mut self) -> Option<Self::Item> {
5041        let mut pos;
5042        let mut r#type;
5043        loop {
5044            pos = self.pos;
5045            r#type = None;
5046            if self.buf.len() == self.pos {
5047                return None;
5048            }
5049            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5050                self.pos = self.buf.len();
5051                break;
5052            };
5053            r#type = Some(header.r#type);
5054            let res = match header.r#type {
5055                1u16 => Features::Header({
5056                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
5057                    let Some(val) = res else { break };
5058                    val
5059                }),
5060                2u16 => Features::Hw({
5061                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
5062                    let Some(val) = res else { break };
5063                    val
5064                }),
5065                3u16 => Features::Wanted({
5066                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
5067                    let Some(val) = res else { break };
5068                    val
5069                }),
5070                4u16 => Features::Active({
5071                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
5072                    let Some(val) = res else { break };
5073                    val
5074                }),
5075                5u16 => Features::Nochange({
5076                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
5077                    let Some(val) = res else { break };
5078                    val
5079                }),
5080                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5081                n => continue,
5082            };
5083            return Some(Ok(res));
5084        }
5085        Some(Err(ErrorContext::new(
5086            "Features",
5087            r#type.and_then(|t| Features::attr_from_type(t)),
5088            self.orig_loc,
5089            self.buf.as_ptr().wrapping_add(pos) as usize,
5090        )))
5091    }
5092}
5093impl<'a> std::fmt::Debug for IterableFeatures<'_> {
5094    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5095        let mut fmt = f.debug_struct("Features");
5096        for attr in self.clone() {
5097            let attr = match attr {
5098                Ok(a) => a,
5099                Err(err) => {
5100                    fmt.finish()?;
5101                    f.write_str("Err(")?;
5102                    err.fmt(f)?;
5103                    return f.write_str(")");
5104                }
5105            };
5106            match attr {
5107                Features::Header(val) => fmt.field("Header", &val),
5108                Features::Hw(val) => fmt.field("Hw", &val),
5109                Features::Wanted(val) => fmt.field("Wanted", &val),
5110                Features::Active(val) => fmt.field("Active", &val),
5111                Features::Nochange(val) => fmt.field("Nochange", &val),
5112            };
5113        }
5114        fmt.finish()
5115    }
5116}
5117impl IterableFeatures<'_> {
5118    pub fn lookup_attr(
5119        &self,
5120        offset: usize,
5121        missing_type: Option<u16>,
5122    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5123        let mut stack = Vec::new();
5124        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5125        if missing_type.is_some() && cur == offset {
5126            stack.push(("Features", offset));
5127            return (
5128                stack,
5129                missing_type.and_then(|t| Features::attr_from_type(t)),
5130            );
5131        }
5132        if cur > offset || cur + self.buf.len() < offset {
5133            return (stack, None);
5134        }
5135        let mut attrs = self.clone();
5136        let mut last_off = cur + attrs.pos;
5137        let mut missing = None;
5138        while let Some(attr) = attrs.next() {
5139            let Ok(attr) = attr else { break };
5140            match attr {
5141                Features::Header(val) => {
5142                    (stack, missing) = val.lookup_attr(offset, missing_type);
5143                    if !stack.is_empty() {
5144                        break;
5145                    }
5146                }
5147                Features::Hw(val) => {
5148                    (stack, missing) = val.lookup_attr(offset, missing_type);
5149                    if !stack.is_empty() {
5150                        break;
5151                    }
5152                }
5153                Features::Wanted(val) => {
5154                    (stack, missing) = val.lookup_attr(offset, missing_type);
5155                    if !stack.is_empty() {
5156                        break;
5157                    }
5158                }
5159                Features::Active(val) => {
5160                    (stack, missing) = val.lookup_attr(offset, missing_type);
5161                    if !stack.is_empty() {
5162                        break;
5163                    }
5164                }
5165                Features::Nochange(val) => {
5166                    (stack, missing) = val.lookup_attr(offset, missing_type);
5167                    if !stack.is_empty() {
5168                        break;
5169                    }
5170                }
5171                _ => {}
5172            };
5173            last_off = cur + attrs.pos;
5174        }
5175        if !stack.is_empty() {
5176            stack.push(("Features", cur));
5177        }
5178        (stack, missing)
5179    }
5180}
5181#[derive(Clone)]
5182pub enum Channels<'a> {
5183    Header(IterableHeader<'a>),
5184    RxMax(u32),
5185    TxMax(u32),
5186    OtherMax(u32),
5187    CombinedMax(u32),
5188    RxCount(u32),
5189    TxCount(u32),
5190    OtherCount(u32),
5191    CombinedCount(u32),
5192}
5193impl<'a> IterableChannels<'a> {
5194    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
5195        let mut iter = self.clone();
5196        iter.pos = 0;
5197        for attr in iter {
5198            if let Ok(Channels::Header(val)) = attr {
5199                return Ok(val);
5200            }
5201        }
5202        Err(ErrorContext::new_missing(
5203            "Channels",
5204            "Header",
5205            self.orig_loc,
5206            self.buf.as_ptr() as usize,
5207        ))
5208    }
5209    pub fn get_rx_max(&self) -> Result<u32, ErrorContext> {
5210        let mut iter = self.clone();
5211        iter.pos = 0;
5212        for attr in iter {
5213            if let Ok(Channels::RxMax(val)) = attr {
5214                return Ok(val);
5215            }
5216        }
5217        Err(ErrorContext::new_missing(
5218            "Channels",
5219            "RxMax",
5220            self.orig_loc,
5221            self.buf.as_ptr() as usize,
5222        ))
5223    }
5224    pub fn get_tx_max(&self) -> Result<u32, ErrorContext> {
5225        let mut iter = self.clone();
5226        iter.pos = 0;
5227        for attr in iter {
5228            if let Ok(Channels::TxMax(val)) = attr {
5229                return Ok(val);
5230            }
5231        }
5232        Err(ErrorContext::new_missing(
5233            "Channels",
5234            "TxMax",
5235            self.orig_loc,
5236            self.buf.as_ptr() as usize,
5237        ))
5238    }
5239    pub fn get_other_max(&self) -> Result<u32, ErrorContext> {
5240        let mut iter = self.clone();
5241        iter.pos = 0;
5242        for attr in iter {
5243            if let Ok(Channels::OtherMax(val)) = attr {
5244                return Ok(val);
5245            }
5246        }
5247        Err(ErrorContext::new_missing(
5248            "Channels",
5249            "OtherMax",
5250            self.orig_loc,
5251            self.buf.as_ptr() as usize,
5252        ))
5253    }
5254    pub fn get_combined_max(&self) -> Result<u32, ErrorContext> {
5255        let mut iter = self.clone();
5256        iter.pos = 0;
5257        for attr in iter {
5258            if let Ok(Channels::CombinedMax(val)) = attr {
5259                return Ok(val);
5260            }
5261        }
5262        Err(ErrorContext::new_missing(
5263            "Channels",
5264            "CombinedMax",
5265            self.orig_loc,
5266            self.buf.as_ptr() as usize,
5267        ))
5268    }
5269    pub fn get_rx_count(&self) -> Result<u32, ErrorContext> {
5270        let mut iter = self.clone();
5271        iter.pos = 0;
5272        for attr in iter {
5273            if let Ok(Channels::RxCount(val)) = attr {
5274                return Ok(val);
5275            }
5276        }
5277        Err(ErrorContext::new_missing(
5278            "Channels",
5279            "RxCount",
5280            self.orig_loc,
5281            self.buf.as_ptr() as usize,
5282        ))
5283    }
5284    pub fn get_tx_count(&self) -> Result<u32, ErrorContext> {
5285        let mut iter = self.clone();
5286        iter.pos = 0;
5287        for attr in iter {
5288            if let Ok(Channels::TxCount(val)) = attr {
5289                return Ok(val);
5290            }
5291        }
5292        Err(ErrorContext::new_missing(
5293            "Channels",
5294            "TxCount",
5295            self.orig_loc,
5296            self.buf.as_ptr() as usize,
5297        ))
5298    }
5299    pub fn get_other_count(&self) -> Result<u32, ErrorContext> {
5300        let mut iter = self.clone();
5301        iter.pos = 0;
5302        for attr in iter {
5303            if let Ok(Channels::OtherCount(val)) = attr {
5304                return Ok(val);
5305            }
5306        }
5307        Err(ErrorContext::new_missing(
5308            "Channels",
5309            "OtherCount",
5310            self.orig_loc,
5311            self.buf.as_ptr() as usize,
5312        ))
5313    }
5314    pub fn get_combined_count(&self) -> Result<u32, ErrorContext> {
5315        let mut iter = self.clone();
5316        iter.pos = 0;
5317        for attr in iter {
5318            if let Ok(Channels::CombinedCount(val)) = attr {
5319                return Ok(val);
5320            }
5321        }
5322        Err(ErrorContext::new_missing(
5323            "Channels",
5324            "CombinedCount",
5325            self.orig_loc,
5326            self.buf.as_ptr() as usize,
5327        ))
5328    }
5329}
5330impl Channels<'_> {
5331    pub fn new<'a>(buf: &'a [u8]) -> IterableChannels<'a> {
5332        IterableChannels::with_loc(buf, buf.as_ptr() as usize)
5333    }
5334    fn attr_from_type(r#type: u16) -> Option<&'static str> {
5335        let res = match r#type {
5336            0u16 => "Unspec",
5337            1u16 => "Header",
5338            2u16 => "RxMax",
5339            3u16 => "TxMax",
5340            4u16 => "OtherMax",
5341            5u16 => "CombinedMax",
5342            6u16 => "RxCount",
5343            7u16 => "TxCount",
5344            8u16 => "OtherCount",
5345            9u16 => "CombinedCount",
5346            _ => return None,
5347        };
5348        Some(res)
5349    }
5350}
5351#[derive(Clone, Copy, Default)]
5352pub struct IterableChannels<'a> {
5353    buf: &'a [u8],
5354    pos: usize,
5355    orig_loc: usize,
5356}
5357impl<'a> IterableChannels<'a> {
5358    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5359        Self {
5360            buf,
5361            pos: 0,
5362            orig_loc,
5363        }
5364    }
5365    pub fn get_buf(&self) -> &'a [u8] {
5366        self.buf
5367    }
5368}
5369impl<'a> Iterator for IterableChannels<'a> {
5370    type Item = Result<Channels<'a>, ErrorContext>;
5371    fn next(&mut self) -> Option<Self::Item> {
5372        let mut pos;
5373        let mut r#type;
5374        loop {
5375            pos = self.pos;
5376            r#type = None;
5377            if self.buf.len() == self.pos {
5378                return None;
5379            }
5380            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5381                self.pos = self.buf.len();
5382                break;
5383            };
5384            r#type = Some(header.r#type);
5385            let res = match header.r#type {
5386                1u16 => Channels::Header({
5387                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
5388                    let Some(val) = res else { break };
5389                    val
5390                }),
5391                2u16 => Channels::RxMax({
5392                    let res = parse_u32(next);
5393                    let Some(val) = res else { break };
5394                    val
5395                }),
5396                3u16 => Channels::TxMax({
5397                    let res = parse_u32(next);
5398                    let Some(val) = res else { break };
5399                    val
5400                }),
5401                4u16 => Channels::OtherMax({
5402                    let res = parse_u32(next);
5403                    let Some(val) = res else { break };
5404                    val
5405                }),
5406                5u16 => Channels::CombinedMax({
5407                    let res = parse_u32(next);
5408                    let Some(val) = res else { break };
5409                    val
5410                }),
5411                6u16 => Channels::RxCount({
5412                    let res = parse_u32(next);
5413                    let Some(val) = res else { break };
5414                    val
5415                }),
5416                7u16 => Channels::TxCount({
5417                    let res = parse_u32(next);
5418                    let Some(val) = res else { break };
5419                    val
5420                }),
5421                8u16 => Channels::OtherCount({
5422                    let res = parse_u32(next);
5423                    let Some(val) = res else { break };
5424                    val
5425                }),
5426                9u16 => Channels::CombinedCount({
5427                    let res = parse_u32(next);
5428                    let Some(val) = res else { break };
5429                    val
5430                }),
5431                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5432                n => continue,
5433            };
5434            return Some(Ok(res));
5435        }
5436        Some(Err(ErrorContext::new(
5437            "Channels",
5438            r#type.and_then(|t| Channels::attr_from_type(t)),
5439            self.orig_loc,
5440            self.buf.as_ptr().wrapping_add(pos) as usize,
5441        )))
5442    }
5443}
5444impl<'a> std::fmt::Debug for IterableChannels<'_> {
5445    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5446        let mut fmt = f.debug_struct("Channels");
5447        for attr in self.clone() {
5448            let attr = match attr {
5449                Ok(a) => a,
5450                Err(err) => {
5451                    fmt.finish()?;
5452                    f.write_str("Err(")?;
5453                    err.fmt(f)?;
5454                    return f.write_str(")");
5455                }
5456            };
5457            match attr {
5458                Channels::Header(val) => fmt.field("Header", &val),
5459                Channels::RxMax(val) => fmt.field("RxMax", &val),
5460                Channels::TxMax(val) => fmt.field("TxMax", &val),
5461                Channels::OtherMax(val) => fmt.field("OtherMax", &val),
5462                Channels::CombinedMax(val) => fmt.field("CombinedMax", &val),
5463                Channels::RxCount(val) => fmt.field("RxCount", &val),
5464                Channels::TxCount(val) => fmt.field("TxCount", &val),
5465                Channels::OtherCount(val) => fmt.field("OtherCount", &val),
5466                Channels::CombinedCount(val) => fmt.field("CombinedCount", &val),
5467            };
5468        }
5469        fmt.finish()
5470    }
5471}
5472impl IterableChannels<'_> {
5473    pub fn lookup_attr(
5474        &self,
5475        offset: usize,
5476        missing_type: Option<u16>,
5477    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5478        let mut stack = Vec::new();
5479        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5480        if missing_type.is_some() && cur == offset {
5481            stack.push(("Channels", offset));
5482            return (
5483                stack,
5484                missing_type.and_then(|t| Channels::attr_from_type(t)),
5485            );
5486        }
5487        if cur > offset || cur + self.buf.len() < offset {
5488            return (stack, None);
5489        }
5490        let mut attrs = self.clone();
5491        let mut last_off = cur + attrs.pos;
5492        let mut missing = None;
5493        while let Some(attr) = attrs.next() {
5494            let Ok(attr) = attr else { break };
5495            match attr {
5496                Channels::Header(val) => {
5497                    (stack, missing) = val.lookup_attr(offset, missing_type);
5498                    if !stack.is_empty() {
5499                        break;
5500                    }
5501                }
5502                Channels::RxMax(val) => {
5503                    if last_off == offset {
5504                        stack.push(("RxMax", last_off));
5505                        break;
5506                    }
5507                }
5508                Channels::TxMax(val) => {
5509                    if last_off == offset {
5510                        stack.push(("TxMax", last_off));
5511                        break;
5512                    }
5513                }
5514                Channels::OtherMax(val) => {
5515                    if last_off == offset {
5516                        stack.push(("OtherMax", last_off));
5517                        break;
5518                    }
5519                }
5520                Channels::CombinedMax(val) => {
5521                    if last_off == offset {
5522                        stack.push(("CombinedMax", last_off));
5523                        break;
5524                    }
5525                }
5526                Channels::RxCount(val) => {
5527                    if last_off == offset {
5528                        stack.push(("RxCount", last_off));
5529                        break;
5530                    }
5531                }
5532                Channels::TxCount(val) => {
5533                    if last_off == offset {
5534                        stack.push(("TxCount", last_off));
5535                        break;
5536                    }
5537                }
5538                Channels::OtherCount(val) => {
5539                    if last_off == offset {
5540                        stack.push(("OtherCount", last_off));
5541                        break;
5542                    }
5543                }
5544                Channels::CombinedCount(val) => {
5545                    if last_off == offset {
5546                        stack.push(("CombinedCount", last_off));
5547                        break;
5548                    }
5549                }
5550                _ => {}
5551            };
5552            last_off = cur + attrs.pos;
5553        }
5554        if !stack.is_empty() {
5555            stack.push(("Channels", cur));
5556        }
5557        (stack, missing)
5558    }
5559}
5560#[derive(Clone)]
5561pub enum IrqModeration {
5562    Usec(u32),
5563    Pkts(u32),
5564    Comps(u32),
5565}
5566impl<'a> IterableIrqModeration<'a> {
5567    pub fn get_usec(&self) -> Result<u32, ErrorContext> {
5568        let mut iter = self.clone();
5569        iter.pos = 0;
5570        for attr in iter {
5571            if let Ok(IrqModeration::Usec(val)) = attr {
5572                return Ok(val);
5573            }
5574        }
5575        Err(ErrorContext::new_missing(
5576            "IrqModeration",
5577            "Usec",
5578            self.orig_loc,
5579            self.buf.as_ptr() as usize,
5580        ))
5581    }
5582    pub fn get_pkts(&self) -> Result<u32, ErrorContext> {
5583        let mut iter = self.clone();
5584        iter.pos = 0;
5585        for attr in iter {
5586            if let Ok(IrqModeration::Pkts(val)) = attr {
5587                return Ok(val);
5588            }
5589        }
5590        Err(ErrorContext::new_missing(
5591            "IrqModeration",
5592            "Pkts",
5593            self.orig_loc,
5594            self.buf.as_ptr() as usize,
5595        ))
5596    }
5597    pub fn get_comps(&self) -> Result<u32, ErrorContext> {
5598        let mut iter = self.clone();
5599        iter.pos = 0;
5600        for attr in iter {
5601            if let Ok(IrqModeration::Comps(val)) = attr {
5602                return Ok(val);
5603            }
5604        }
5605        Err(ErrorContext::new_missing(
5606            "IrqModeration",
5607            "Comps",
5608            self.orig_loc,
5609            self.buf.as_ptr() as usize,
5610        ))
5611    }
5612}
5613impl IrqModeration {
5614    pub fn new<'a>(buf: &'a [u8]) -> IterableIrqModeration<'a> {
5615        IterableIrqModeration::with_loc(buf, buf.as_ptr() as usize)
5616    }
5617    fn attr_from_type(r#type: u16) -> Option<&'static str> {
5618        let res = match r#type {
5619            0u16 => "Unspec",
5620            1u16 => "Usec",
5621            2u16 => "Pkts",
5622            3u16 => "Comps",
5623            _ => return None,
5624        };
5625        Some(res)
5626    }
5627}
5628#[derive(Clone, Copy, Default)]
5629pub struct IterableIrqModeration<'a> {
5630    buf: &'a [u8],
5631    pos: usize,
5632    orig_loc: usize,
5633}
5634impl<'a> IterableIrqModeration<'a> {
5635    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5636        Self {
5637            buf,
5638            pos: 0,
5639            orig_loc,
5640        }
5641    }
5642    pub fn get_buf(&self) -> &'a [u8] {
5643        self.buf
5644    }
5645}
5646impl<'a> Iterator for IterableIrqModeration<'a> {
5647    type Item = Result<IrqModeration, ErrorContext>;
5648    fn next(&mut self) -> Option<Self::Item> {
5649        let mut pos;
5650        let mut r#type;
5651        loop {
5652            pos = self.pos;
5653            r#type = None;
5654            if self.buf.len() == self.pos {
5655                return None;
5656            }
5657            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5658                self.pos = self.buf.len();
5659                break;
5660            };
5661            r#type = Some(header.r#type);
5662            let res = match header.r#type {
5663                1u16 => IrqModeration::Usec({
5664                    let res = parse_u32(next);
5665                    let Some(val) = res else { break };
5666                    val
5667                }),
5668                2u16 => IrqModeration::Pkts({
5669                    let res = parse_u32(next);
5670                    let Some(val) = res else { break };
5671                    val
5672                }),
5673                3u16 => IrqModeration::Comps({
5674                    let res = parse_u32(next);
5675                    let Some(val) = res else { break };
5676                    val
5677                }),
5678                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5679                n => continue,
5680            };
5681            return Some(Ok(res));
5682        }
5683        Some(Err(ErrorContext::new(
5684            "IrqModeration",
5685            r#type.and_then(|t| IrqModeration::attr_from_type(t)),
5686            self.orig_loc,
5687            self.buf.as_ptr().wrapping_add(pos) as usize,
5688        )))
5689    }
5690}
5691impl std::fmt::Debug for IterableIrqModeration<'_> {
5692    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5693        let mut fmt = f.debug_struct("IrqModeration");
5694        for attr in self.clone() {
5695            let attr = match attr {
5696                Ok(a) => a,
5697                Err(err) => {
5698                    fmt.finish()?;
5699                    f.write_str("Err(")?;
5700                    err.fmt(f)?;
5701                    return f.write_str(")");
5702                }
5703            };
5704            match attr {
5705                IrqModeration::Usec(val) => fmt.field("Usec", &val),
5706                IrqModeration::Pkts(val) => fmt.field("Pkts", &val),
5707                IrqModeration::Comps(val) => fmt.field("Comps", &val),
5708            };
5709        }
5710        fmt.finish()
5711    }
5712}
5713impl IterableIrqModeration<'_> {
5714    pub fn lookup_attr(
5715        &self,
5716        offset: usize,
5717        missing_type: Option<u16>,
5718    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5719        let mut stack = Vec::new();
5720        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5721        if missing_type.is_some() && cur == offset {
5722            stack.push(("IrqModeration", offset));
5723            return (
5724                stack,
5725                missing_type.and_then(|t| IrqModeration::attr_from_type(t)),
5726            );
5727        }
5728        if cur > offset || cur + self.buf.len() < offset {
5729            return (stack, None);
5730        }
5731        let mut attrs = self.clone();
5732        let mut last_off = cur + attrs.pos;
5733        while let Some(attr) = attrs.next() {
5734            let Ok(attr) = attr else { break };
5735            match attr {
5736                IrqModeration::Usec(val) => {
5737                    if last_off == offset {
5738                        stack.push(("Usec", last_off));
5739                        break;
5740                    }
5741                }
5742                IrqModeration::Pkts(val) => {
5743                    if last_off == offset {
5744                        stack.push(("Pkts", last_off));
5745                        break;
5746                    }
5747                }
5748                IrqModeration::Comps(val) => {
5749                    if last_off == offset {
5750                        stack.push(("Comps", last_off));
5751                        break;
5752                    }
5753                }
5754                _ => {}
5755            };
5756            last_off = cur + attrs.pos;
5757        }
5758        if !stack.is_empty() {
5759            stack.push(("IrqModeration", cur));
5760        }
5761        (stack, None)
5762    }
5763}
5764#[derive(Clone)]
5765pub enum Profile<'a> {
5766    #[doc = "Attribute may repeat multiple times (treat it as array)"]
5767    IrqModeration(IterableIrqModeration<'a>),
5768}
5769impl<'a> IterableProfile<'a> {
5770    #[doc = "Attribute may repeat multiple times (treat it as array)"]
5771    pub fn get_irq_moderation(
5772        &self,
5773    ) -> MultiAttrIterable<Self, Profile<'a>, IterableIrqModeration<'a>> {
5774        MultiAttrIterable::new(self.clone(), |variant| {
5775            if let Profile::IrqModeration(val) = variant {
5776                Some(val)
5777            } else {
5778                None
5779            }
5780        })
5781    }
5782}
5783impl Profile<'_> {
5784    pub fn new<'a>(buf: &'a [u8]) -> IterableProfile<'a> {
5785        IterableProfile::with_loc(buf, buf.as_ptr() as usize)
5786    }
5787    fn attr_from_type(r#type: u16) -> Option<&'static str> {
5788        let res = match r#type {
5789            0u16 => "Unspec",
5790            1u16 => "IrqModeration",
5791            _ => return None,
5792        };
5793        Some(res)
5794    }
5795}
5796#[derive(Clone, Copy, Default)]
5797pub struct IterableProfile<'a> {
5798    buf: &'a [u8],
5799    pos: usize,
5800    orig_loc: usize,
5801}
5802impl<'a> IterableProfile<'a> {
5803    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5804        Self {
5805            buf,
5806            pos: 0,
5807            orig_loc,
5808        }
5809    }
5810    pub fn get_buf(&self) -> &'a [u8] {
5811        self.buf
5812    }
5813}
5814impl<'a> Iterator for IterableProfile<'a> {
5815    type Item = Result<Profile<'a>, ErrorContext>;
5816    fn next(&mut self) -> Option<Self::Item> {
5817        let mut pos;
5818        let mut r#type;
5819        loop {
5820            pos = self.pos;
5821            r#type = None;
5822            if self.buf.len() == self.pos {
5823                return None;
5824            }
5825            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5826                self.pos = self.buf.len();
5827                break;
5828            };
5829            r#type = Some(header.r#type);
5830            let res = match header.r#type {
5831                1u16 => Profile::IrqModeration({
5832                    let res = Some(IterableIrqModeration::with_loc(next, self.orig_loc));
5833                    let Some(val) = res else { break };
5834                    val
5835                }),
5836                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5837                n => continue,
5838            };
5839            return Some(Ok(res));
5840        }
5841        Some(Err(ErrorContext::new(
5842            "Profile",
5843            r#type.and_then(|t| Profile::attr_from_type(t)),
5844            self.orig_loc,
5845            self.buf.as_ptr().wrapping_add(pos) as usize,
5846        )))
5847    }
5848}
5849impl<'a> std::fmt::Debug for IterableProfile<'_> {
5850    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5851        let mut fmt = f.debug_struct("Profile");
5852        for attr in self.clone() {
5853            let attr = match attr {
5854                Ok(a) => a,
5855                Err(err) => {
5856                    fmt.finish()?;
5857                    f.write_str("Err(")?;
5858                    err.fmt(f)?;
5859                    return f.write_str(")");
5860                }
5861            };
5862            match attr {
5863                Profile::IrqModeration(val) => fmt.field("IrqModeration", &val),
5864            };
5865        }
5866        fmt.finish()
5867    }
5868}
5869impl IterableProfile<'_> {
5870    pub fn lookup_attr(
5871        &self,
5872        offset: usize,
5873        missing_type: Option<u16>,
5874    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5875        let mut stack = Vec::new();
5876        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5877        if missing_type.is_some() && cur == offset {
5878            stack.push(("Profile", offset));
5879            return (stack, missing_type.and_then(|t| Profile::attr_from_type(t)));
5880        }
5881        if cur > offset || cur + self.buf.len() < offset {
5882            return (stack, None);
5883        }
5884        let mut attrs = self.clone();
5885        let mut last_off = cur + attrs.pos;
5886        let mut missing = None;
5887        while let Some(attr) = attrs.next() {
5888            let Ok(attr) = attr else { break };
5889            match attr {
5890                Profile::IrqModeration(val) => {
5891                    (stack, missing) = val.lookup_attr(offset, missing_type);
5892                    if !stack.is_empty() {
5893                        break;
5894                    }
5895                }
5896                _ => {}
5897            };
5898            last_off = cur + attrs.pos;
5899        }
5900        if !stack.is_empty() {
5901            stack.push(("Profile", cur));
5902        }
5903        (stack, missing)
5904    }
5905}
5906#[derive(Clone)]
5907pub enum Coalesce<'a> {
5908    Header(IterableHeader<'a>),
5909    RxUsecs(u32),
5910    RxMaxFrames(u32),
5911    RxUsecsIrq(u32),
5912    RxMaxFramesIrq(u32),
5913    TxUsecs(u32),
5914    TxMaxFrames(u32),
5915    TxUsecsIrq(u32),
5916    TxMaxFramesIrq(u32),
5917    StatsBlockUsecs(u32),
5918    UseAdaptiveRx(u8),
5919    UseAdaptiveTx(u8),
5920    PktRateLow(u32),
5921    RxUsecsLow(u32),
5922    RxMaxFramesLow(u32),
5923    TxUsecsLow(u32),
5924    TxMaxFramesLow(u32),
5925    PktRateHigh(u32),
5926    RxUsecsHigh(u32),
5927    RxMaxFramesHigh(u32),
5928    TxUsecsHigh(u32),
5929    TxMaxFramesHigh(u32),
5930    RateSampleInterval(u32),
5931    UseCqeModeTx(u8),
5932    UseCqeModeRx(u8),
5933    TxAggrMaxBytes(u32),
5934    TxAggrMaxFrames(u32),
5935    TxAggrTimeUsecs(u32),
5936    RxProfile(IterableProfile<'a>),
5937    TxProfile(IterableProfile<'a>),
5938    RxCqeFrames(u32),
5939    RxCqeNsecs(u32),
5940}
5941impl<'a> IterableCoalesce<'a> {
5942    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
5943        let mut iter = self.clone();
5944        iter.pos = 0;
5945        for attr in iter {
5946            if let Ok(Coalesce::Header(val)) = attr {
5947                return Ok(val);
5948            }
5949        }
5950        Err(ErrorContext::new_missing(
5951            "Coalesce",
5952            "Header",
5953            self.orig_loc,
5954            self.buf.as_ptr() as usize,
5955        ))
5956    }
5957    pub fn get_rx_usecs(&self) -> Result<u32, ErrorContext> {
5958        let mut iter = self.clone();
5959        iter.pos = 0;
5960        for attr in iter {
5961            if let Ok(Coalesce::RxUsecs(val)) = attr {
5962                return Ok(val);
5963            }
5964        }
5965        Err(ErrorContext::new_missing(
5966            "Coalesce",
5967            "RxUsecs",
5968            self.orig_loc,
5969            self.buf.as_ptr() as usize,
5970        ))
5971    }
5972    pub fn get_rx_max_frames(&self) -> Result<u32, ErrorContext> {
5973        let mut iter = self.clone();
5974        iter.pos = 0;
5975        for attr in iter {
5976            if let Ok(Coalesce::RxMaxFrames(val)) = attr {
5977                return Ok(val);
5978            }
5979        }
5980        Err(ErrorContext::new_missing(
5981            "Coalesce",
5982            "RxMaxFrames",
5983            self.orig_loc,
5984            self.buf.as_ptr() as usize,
5985        ))
5986    }
5987    pub fn get_rx_usecs_irq(&self) -> Result<u32, ErrorContext> {
5988        let mut iter = self.clone();
5989        iter.pos = 0;
5990        for attr in iter {
5991            if let Ok(Coalesce::RxUsecsIrq(val)) = attr {
5992                return Ok(val);
5993            }
5994        }
5995        Err(ErrorContext::new_missing(
5996            "Coalesce",
5997            "RxUsecsIrq",
5998            self.orig_loc,
5999            self.buf.as_ptr() as usize,
6000        ))
6001    }
6002    pub fn get_rx_max_frames_irq(&self) -> Result<u32, ErrorContext> {
6003        let mut iter = self.clone();
6004        iter.pos = 0;
6005        for attr in iter {
6006            if let Ok(Coalesce::RxMaxFramesIrq(val)) = attr {
6007                return Ok(val);
6008            }
6009        }
6010        Err(ErrorContext::new_missing(
6011            "Coalesce",
6012            "RxMaxFramesIrq",
6013            self.orig_loc,
6014            self.buf.as_ptr() as usize,
6015        ))
6016    }
6017    pub fn get_tx_usecs(&self) -> Result<u32, ErrorContext> {
6018        let mut iter = self.clone();
6019        iter.pos = 0;
6020        for attr in iter {
6021            if let Ok(Coalesce::TxUsecs(val)) = attr {
6022                return Ok(val);
6023            }
6024        }
6025        Err(ErrorContext::new_missing(
6026            "Coalesce",
6027            "TxUsecs",
6028            self.orig_loc,
6029            self.buf.as_ptr() as usize,
6030        ))
6031    }
6032    pub fn get_tx_max_frames(&self) -> Result<u32, ErrorContext> {
6033        let mut iter = self.clone();
6034        iter.pos = 0;
6035        for attr in iter {
6036            if let Ok(Coalesce::TxMaxFrames(val)) = attr {
6037                return Ok(val);
6038            }
6039        }
6040        Err(ErrorContext::new_missing(
6041            "Coalesce",
6042            "TxMaxFrames",
6043            self.orig_loc,
6044            self.buf.as_ptr() as usize,
6045        ))
6046    }
6047    pub fn get_tx_usecs_irq(&self) -> Result<u32, ErrorContext> {
6048        let mut iter = self.clone();
6049        iter.pos = 0;
6050        for attr in iter {
6051            if let Ok(Coalesce::TxUsecsIrq(val)) = attr {
6052                return Ok(val);
6053            }
6054        }
6055        Err(ErrorContext::new_missing(
6056            "Coalesce",
6057            "TxUsecsIrq",
6058            self.orig_loc,
6059            self.buf.as_ptr() as usize,
6060        ))
6061    }
6062    pub fn get_tx_max_frames_irq(&self) -> Result<u32, ErrorContext> {
6063        let mut iter = self.clone();
6064        iter.pos = 0;
6065        for attr in iter {
6066            if let Ok(Coalesce::TxMaxFramesIrq(val)) = attr {
6067                return Ok(val);
6068            }
6069        }
6070        Err(ErrorContext::new_missing(
6071            "Coalesce",
6072            "TxMaxFramesIrq",
6073            self.orig_loc,
6074            self.buf.as_ptr() as usize,
6075        ))
6076    }
6077    pub fn get_stats_block_usecs(&self) -> Result<u32, ErrorContext> {
6078        let mut iter = self.clone();
6079        iter.pos = 0;
6080        for attr in iter {
6081            if let Ok(Coalesce::StatsBlockUsecs(val)) = attr {
6082                return Ok(val);
6083            }
6084        }
6085        Err(ErrorContext::new_missing(
6086            "Coalesce",
6087            "StatsBlockUsecs",
6088            self.orig_loc,
6089            self.buf.as_ptr() as usize,
6090        ))
6091    }
6092    pub fn get_use_adaptive_rx(&self) -> Result<u8, ErrorContext> {
6093        let mut iter = self.clone();
6094        iter.pos = 0;
6095        for attr in iter {
6096            if let Ok(Coalesce::UseAdaptiveRx(val)) = attr {
6097                return Ok(val);
6098            }
6099        }
6100        Err(ErrorContext::new_missing(
6101            "Coalesce",
6102            "UseAdaptiveRx",
6103            self.orig_loc,
6104            self.buf.as_ptr() as usize,
6105        ))
6106    }
6107    pub fn get_use_adaptive_tx(&self) -> Result<u8, ErrorContext> {
6108        let mut iter = self.clone();
6109        iter.pos = 0;
6110        for attr in iter {
6111            if let Ok(Coalesce::UseAdaptiveTx(val)) = attr {
6112                return Ok(val);
6113            }
6114        }
6115        Err(ErrorContext::new_missing(
6116            "Coalesce",
6117            "UseAdaptiveTx",
6118            self.orig_loc,
6119            self.buf.as_ptr() as usize,
6120        ))
6121    }
6122    pub fn get_pkt_rate_low(&self) -> Result<u32, ErrorContext> {
6123        let mut iter = self.clone();
6124        iter.pos = 0;
6125        for attr in iter {
6126            if let Ok(Coalesce::PktRateLow(val)) = attr {
6127                return Ok(val);
6128            }
6129        }
6130        Err(ErrorContext::new_missing(
6131            "Coalesce",
6132            "PktRateLow",
6133            self.orig_loc,
6134            self.buf.as_ptr() as usize,
6135        ))
6136    }
6137    pub fn get_rx_usecs_low(&self) -> Result<u32, ErrorContext> {
6138        let mut iter = self.clone();
6139        iter.pos = 0;
6140        for attr in iter {
6141            if let Ok(Coalesce::RxUsecsLow(val)) = attr {
6142                return Ok(val);
6143            }
6144        }
6145        Err(ErrorContext::new_missing(
6146            "Coalesce",
6147            "RxUsecsLow",
6148            self.orig_loc,
6149            self.buf.as_ptr() as usize,
6150        ))
6151    }
6152    pub fn get_rx_max_frames_low(&self) -> Result<u32, ErrorContext> {
6153        let mut iter = self.clone();
6154        iter.pos = 0;
6155        for attr in iter {
6156            if let Ok(Coalesce::RxMaxFramesLow(val)) = attr {
6157                return Ok(val);
6158            }
6159        }
6160        Err(ErrorContext::new_missing(
6161            "Coalesce",
6162            "RxMaxFramesLow",
6163            self.orig_loc,
6164            self.buf.as_ptr() as usize,
6165        ))
6166    }
6167    pub fn get_tx_usecs_low(&self) -> Result<u32, ErrorContext> {
6168        let mut iter = self.clone();
6169        iter.pos = 0;
6170        for attr in iter {
6171            if let Ok(Coalesce::TxUsecsLow(val)) = attr {
6172                return Ok(val);
6173            }
6174        }
6175        Err(ErrorContext::new_missing(
6176            "Coalesce",
6177            "TxUsecsLow",
6178            self.orig_loc,
6179            self.buf.as_ptr() as usize,
6180        ))
6181    }
6182    pub fn get_tx_max_frames_low(&self) -> Result<u32, ErrorContext> {
6183        let mut iter = self.clone();
6184        iter.pos = 0;
6185        for attr in iter {
6186            if let Ok(Coalesce::TxMaxFramesLow(val)) = attr {
6187                return Ok(val);
6188            }
6189        }
6190        Err(ErrorContext::new_missing(
6191            "Coalesce",
6192            "TxMaxFramesLow",
6193            self.orig_loc,
6194            self.buf.as_ptr() as usize,
6195        ))
6196    }
6197    pub fn get_pkt_rate_high(&self) -> Result<u32, ErrorContext> {
6198        let mut iter = self.clone();
6199        iter.pos = 0;
6200        for attr in iter {
6201            if let Ok(Coalesce::PktRateHigh(val)) = attr {
6202                return Ok(val);
6203            }
6204        }
6205        Err(ErrorContext::new_missing(
6206            "Coalesce",
6207            "PktRateHigh",
6208            self.orig_loc,
6209            self.buf.as_ptr() as usize,
6210        ))
6211    }
6212    pub fn get_rx_usecs_high(&self) -> Result<u32, ErrorContext> {
6213        let mut iter = self.clone();
6214        iter.pos = 0;
6215        for attr in iter {
6216            if let Ok(Coalesce::RxUsecsHigh(val)) = attr {
6217                return Ok(val);
6218            }
6219        }
6220        Err(ErrorContext::new_missing(
6221            "Coalesce",
6222            "RxUsecsHigh",
6223            self.orig_loc,
6224            self.buf.as_ptr() as usize,
6225        ))
6226    }
6227    pub fn get_rx_max_frames_high(&self) -> Result<u32, ErrorContext> {
6228        let mut iter = self.clone();
6229        iter.pos = 0;
6230        for attr in iter {
6231            if let Ok(Coalesce::RxMaxFramesHigh(val)) = attr {
6232                return Ok(val);
6233            }
6234        }
6235        Err(ErrorContext::new_missing(
6236            "Coalesce",
6237            "RxMaxFramesHigh",
6238            self.orig_loc,
6239            self.buf.as_ptr() as usize,
6240        ))
6241    }
6242    pub fn get_tx_usecs_high(&self) -> Result<u32, ErrorContext> {
6243        let mut iter = self.clone();
6244        iter.pos = 0;
6245        for attr in iter {
6246            if let Ok(Coalesce::TxUsecsHigh(val)) = attr {
6247                return Ok(val);
6248            }
6249        }
6250        Err(ErrorContext::new_missing(
6251            "Coalesce",
6252            "TxUsecsHigh",
6253            self.orig_loc,
6254            self.buf.as_ptr() as usize,
6255        ))
6256    }
6257    pub fn get_tx_max_frames_high(&self) -> Result<u32, ErrorContext> {
6258        let mut iter = self.clone();
6259        iter.pos = 0;
6260        for attr in iter {
6261            if let Ok(Coalesce::TxMaxFramesHigh(val)) = attr {
6262                return Ok(val);
6263            }
6264        }
6265        Err(ErrorContext::new_missing(
6266            "Coalesce",
6267            "TxMaxFramesHigh",
6268            self.orig_loc,
6269            self.buf.as_ptr() as usize,
6270        ))
6271    }
6272    pub fn get_rate_sample_interval(&self) -> Result<u32, ErrorContext> {
6273        let mut iter = self.clone();
6274        iter.pos = 0;
6275        for attr in iter {
6276            if let Ok(Coalesce::RateSampleInterval(val)) = attr {
6277                return Ok(val);
6278            }
6279        }
6280        Err(ErrorContext::new_missing(
6281            "Coalesce",
6282            "RateSampleInterval",
6283            self.orig_loc,
6284            self.buf.as_ptr() as usize,
6285        ))
6286    }
6287    pub fn get_use_cqe_mode_tx(&self) -> Result<u8, ErrorContext> {
6288        let mut iter = self.clone();
6289        iter.pos = 0;
6290        for attr in iter {
6291            if let Ok(Coalesce::UseCqeModeTx(val)) = attr {
6292                return Ok(val);
6293            }
6294        }
6295        Err(ErrorContext::new_missing(
6296            "Coalesce",
6297            "UseCqeModeTx",
6298            self.orig_loc,
6299            self.buf.as_ptr() as usize,
6300        ))
6301    }
6302    pub fn get_use_cqe_mode_rx(&self) -> Result<u8, ErrorContext> {
6303        let mut iter = self.clone();
6304        iter.pos = 0;
6305        for attr in iter {
6306            if let Ok(Coalesce::UseCqeModeRx(val)) = attr {
6307                return Ok(val);
6308            }
6309        }
6310        Err(ErrorContext::new_missing(
6311            "Coalesce",
6312            "UseCqeModeRx",
6313            self.orig_loc,
6314            self.buf.as_ptr() as usize,
6315        ))
6316    }
6317    pub fn get_tx_aggr_max_bytes(&self) -> Result<u32, ErrorContext> {
6318        let mut iter = self.clone();
6319        iter.pos = 0;
6320        for attr in iter {
6321            if let Ok(Coalesce::TxAggrMaxBytes(val)) = attr {
6322                return Ok(val);
6323            }
6324        }
6325        Err(ErrorContext::new_missing(
6326            "Coalesce",
6327            "TxAggrMaxBytes",
6328            self.orig_loc,
6329            self.buf.as_ptr() as usize,
6330        ))
6331    }
6332    pub fn get_tx_aggr_max_frames(&self) -> Result<u32, ErrorContext> {
6333        let mut iter = self.clone();
6334        iter.pos = 0;
6335        for attr in iter {
6336            if let Ok(Coalesce::TxAggrMaxFrames(val)) = attr {
6337                return Ok(val);
6338            }
6339        }
6340        Err(ErrorContext::new_missing(
6341            "Coalesce",
6342            "TxAggrMaxFrames",
6343            self.orig_loc,
6344            self.buf.as_ptr() as usize,
6345        ))
6346    }
6347    pub fn get_tx_aggr_time_usecs(&self) -> Result<u32, ErrorContext> {
6348        let mut iter = self.clone();
6349        iter.pos = 0;
6350        for attr in iter {
6351            if let Ok(Coalesce::TxAggrTimeUsecs(val)) = attr {
6352                return Ok(val);
6353            }
6354        }
6355        Err(ErrorContext::new_missing(
6356            "Coalesce",
6357            "TxAggrTimeUsecs",
6358            self.orig_loc,
6359            self.buf.as_ptr() as usize,
6360        ))
6361    }
6362    pub fn get_rx_profile(&self) -> Result<IterableProfile<'a>, ErrorContext> {
6363        let mut iter = self.clone();
6364        iter.pos = 0;
6365        for attr in iter {
6366            if let Ok(Coalesce::RxProfile(val)) = attr {
6367                return Ok(val);
6368            }
6369        }
6370        Err(ErrorContext::new_missing(
6371            "Coalesce",
6372            "RxProfile",
6373            self.orig_loc,
6374            self.buf.as_ptr() as usize,
6375        ))
6376    }
6377    pub fn get_tx_profile(&self) -> Result<IterableProfile<'a>, ErrorContext> {
6378        let mut iter = self.clone();
6379        iter.pos = 0;
6380        for attr in iter {
6381            if let Ok(Coalesce::TxProfile(val)) = attr {
6382                return Ok(val);
6383            }
6384        }
6385        Err(ErrorContext::new_missing(
6386            "Coalesce",
6387            "TxProfile",
6388            self.orig_loc,
6389            self.buf.as_ptr() as usize,
6390        ))
6391    }
6392    pub fn get_rx_cqe_frames(&self) -> Result<u32, ErrorContext> {
6393        let mut iter = self.clone();
6394        iter.pos = 0;
6395        for attr in iter {
6396            if let Ok(Coalesce::RxCqeFrames(val)) = attr {
6397                return Ok(val);
6398            }
6399        }
6400        Err(ErrorContext::new_missing(
6401            "Coalesce",
6402            "RxCqeFrames",
6403            self.orig_loc,
6404            self.buf.as_ptr() as usize,
6405        ))
6406    }
6407    pub fn get_rx_cqe_nsecs(&self) -> Result<u32, ErrorContext> {
6408        let mut iter = self.clone();
6409        iter.pos = 0;
6410        for attr in iter {
6411            if let Ok(Coalesce::RxCqeNsecs(val)) = attr {
6412                return Ok(val);
6413            }
6414        }
6415        Err(ErrorContext::new_missing(
6416            "Coalesce",
6417            "RxCqeNsecs",
6418            self.orig_loc,
6419            self.buf.as_ptr() as usize,
6420        ))
6421    }
6422}
6423impl Coalesce<'_> {
6424    pub fn new<'a>(buf: &'a [u8]) -> IterableCoalesce<'a> {
6425        IterableCoalesce::with_loc(buf, buf.as_ptr() as usize)
6426    }
6427    fn attr_from_type(r#type: u16) -> Option<&'static str> {
6428        let res = match r#type {
6429            0u16 => "Unspec",
6430            1u16 => "Header",
6431            2u16 => "RxUsecs",
6432            3u16 => "RxMaxFrames",
6433            4u16 => "RxUsecsIrq",
6434            5u16 => "RxMaxFramesIrq",
6435            6u16 => "TxUsecs",
6436            7u16 => "TxMaxFrames",
6437            8u16 => "TxUsecsIrq",
6438            9u16 => "TxMaxFramesIrq",
6439            10u16 => "StatsBlockUsecs",
6440            11u16 => "UseAdaptiveRx",
6441            12u16 => "UseAdaptiveTx",
6442            13u16 => "PktRateLow",
6443            14u16 => "RxUsecsLow",
6444            15u16 => "RxMaxFramesLow",
6445            16u16 => "TxUsecsLow",
6446            17u16 => "TxMaxFramesLow",
6447            18u16 => "PktRateHigh",
6448            19u16 => "RxUsecsHigh",
6449            20u16 => "RxMaxFramesHigh",
6450            21u16 => "TxUsecsHigh",
6451            22u16 => "TxMaxFramesHigh",
6452            23u16 => "RateSampleInterval",
6453            24u16 => "UseCqeModeTx",
6454            25u16 => "UseCqeModeRx",
6455            26u16 => "TxAggrMaxBytes",
6456            27u16 => "TxAggrMaxFrames",
6457            28u16 => "TxAggrTimeUsecs",
6458            29u16 => "RxProfile",
6459            30u16 => "TxProfile",
6460            31u16 => "RxCqeFrames",
6461            32u16 => "RxCqeNsecs",
6462            _ => return None,
6463        };
6464        Some(res)
6465    }
6466}
6467#[derive(Clone, Copy, Default)]
6468pub struct IterableCoalesce<'a> {
6469    buf: &'a [u8],
6470    pos: usize,
6471    orig_loc: usize,
6472}
6473impl<'a> IterableCoalesce<'a> {
6474    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6475        Self {
6476            buf,
6477            pos: 0,
6478            orig_loc,
6479        }
6480    }
6481    pub fn get_buf(&self) -> &'a [u8] {
6482        self.buf
6483    }
6484}
6485impl<'a> Iterator for IterableCoalesce<'a> {
6486    type Item = Result<Coalesce<'a>, ErrorContext>;
6487    fn next(&mut self) -> Option<Self::Item> {
6488        let mut pos;
6489        let mut r#type;
6490        loop {
6491            pos = self.pos;
6492            r#type = None;
6493            if self.buf.len() == self.pos {
6494                return None;
6495            }
6496            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6497                self.pos = self.buf.len();
6498                break;
6499            };
6500            r#type = Some(header.r#type);
6501            let res = match header.r#type {
6502                1u16 => Coalesce::Header({
6503                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
6504                    let Some(val) = res else { break };
6505                    val
6506                }),
6507                2u16 => Coalesce::RxUsecs({
6508                    let res = parse_u32(next);
6509                    let Some(val) = res else { break };
6510                    val
6511                }),
6512                3u16 => Coalesce::RxMaxFrames({
6513                    let res = parse_u32(next);
6514                    let Some(val) = res else { break };
6515                    val
6516                }),
6517                4u16 => Coalesce::RxUsecsIrq({
6518                    let res = parse_u32(next);
6519                    let Some(val) = res else { break };
6520                    val
6521                }),
6522                5u16 => Coalesce::RxMaxFramesIrq({
6523                    let res = parse_u32(next);
6524                    let Some(val) = res else { break };
6525                    val
6526                }),
6527                6u16 => Coalesce::TxUsecs({
6528                    let res = parse_u32(next);
6529                    let Some(val) = res else { break };
6530                    val
6531                }),
6532                7u16 => Coalesce::TxMaxFrames({
6533                    let res = parse_u32(next);
6534                    let Some(val) = res else { break };
6535                    val
6536                }),
6537                8u16 => Coalesce::TxUsecsIrq({
6538                    let res = parse_u32(next);
6539                    let Some(val) = res else { break };
6540                    val
6541                }),
6542                9u16 => Coalesce::TxMaxFramesIrq({
6543                    let res = parse_u32(next);
6544                    let Some(val) = res else { break };
6545                    val
6546                }),
6547                10u16 => Coalesce::StatsBlockUsecs({
6548                    let res = parse_u32(next);
6549                    let Some(val) = res else { break };
6550                    val
6551                }),
6552                11u16 => Coalesce::UseAdaptiveRx({
6553                    let res = parse_u8(next);
6554                    let Some(val) = res else { break };
6555                    val
6556                }),
6557                12u16 => Coalesce::UseAdaptiveTx({
6558                    let res = parse_u8(next);
6559                    let Some(val) = res else { break };
6560                    val
6561                }),
6562                13u16 => Coalesce::PktRateLow({
6563                    let res = parse_u32(next);
6564                    let Some(val) = res else { break };
6565                    val
6566                }),
6567                14u16 => Coalesce::RxUsecsLow({
6568                    let res = parse_u32(next);
6569                    let Some(val) = res else { break };
6570                    val
6571                }),
6572                15u16 => Coalesce::RxMaxFramesLow({
6573                    let res = parse_u32(next);
6574                    let Some(val) = res else { break };
6575                    val
6576                }),
6577                16u16 => Coalesce::TxUsecsLow({
6578                    let res = parse_u32(next);
6579                    let Some(val) = res else { break };
6580                    val
6581                }),
6582                17u16 => Coalesce::TxMaxFramesLow({
6583                    let res = parse_u32(next);
6584                    let Some(val) = res else { break };
6585                    val
6586                }),
6587                18u16 => Coalesce::PktRateHigh({
6588                    let res = parse_u32(next);
6589                    let Some(val) = res else { break };
6590                    val
6591                }),
6592                19u16 => Coalesce::RxUsecsHigh({
6593                    let res = parse_u32(next);
6594                    let Some(val) = res else { break };
6595                    val
6596                }),
6597                20u16 => Coalesce::RxMaxFramesHigh({
6598                    let res = parse_u32(next);
6599                    let Some(val) = res else { break };
6600                    val
6601                }),
6602                21u16 => Coalesce::TxUsecsHigh({
6603                    let res = parse_u32(next);
6604                    let Some(val) = res else { break };
6605                    val
6606                }),
6607                22u16 => Coalesce::TxMaxFramesHigh({
6608                    let res = parse_u32(next);
6609                    let Some(val) = res else { break };
6610                    val
6611                }),
6612                23u16 => Coalesce::RateSampleInterval({
6613                    let res = parse_u32(next);
6614                    let Some(val) = res else { break };
6615                    val
6616                }),
6617                24u16 => Coalesce::UseCqeModeTx({
6618                    let res = parse_u8(next);
6619                    let Some(val) = res else { break };
6620                    val
6621                }),
6622                25u16 => Coalesce::UseCqeModeRx({
6623                    let res = parse_u8(next);
6624                    let Some(val) = res else { break };
6625                    val
6626                }),
6627                26u16 => Coalesce::TxAggrMaxBytes({
6628                    let res = parse_u32(next);
6629                    let Some(val) = res else { break };
6630                    val
6631                }),
6632                27u16 => Coalesce::TxAggrMaxFrames({
6633                    let res = parse_u32(next);
6634                    let Some(val) = res else { break };
6635                    val
6636                }),
6637                28u16 => Coalesce::TxAggrTimeUsecs({
6638                    let res = parse_u32(next);
6639                    let Some(val) = res else { break };
6640                    val
6641                }),
6642                29u16 => Coalesce::RxProfile({
6643                    let res = Some(IterableProfile::with_loc(next, self.orig_loc));
6644                    let Some(val) = res else { break };
6645                    val
6646                }),
6647                30u16 => Coalesce::TxProfile({
6648                    let res = Some(IterableProfile::with_loc(next, self.orig_loc));
6649                    let Some(val) = res else { break };
6650                    val
6651                }),
6652                31u16 => Coalesce::RxCqeFrames({
6653                    let res = parse_u32(next);
6654                    let Some(val) = res else { break };
6655                    val
6656                }),
6657                32u16 => Coalesce::RxCqeNsecs({
6658                    let res = parse_u32(next);
6659                    let Some(val) = res else { break };
6660                    val
6661                }),
6662                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6663                n => continue,
6664            };
6665            return Some(Ok(res));
6666        }
6667        Some(Err(ErrorContext::new(
6668            "Coalesce",
6669            r#type.and_then(|t| Coalesce::attr_from_type(t)),
6670            self.orig_loc,
6671            self.buf.as_ptr().wrapping_add(pos) as usize,
6672        )))
6673    }
6674}
6675impl<'a> std::fmt::Debug for IterableCoalesce<'_> {
6676    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6677        let mut fmt = f.debug_struct("Coalesce");
6678        for attr in self.clone() {
6679            let attr = match attr {
6680                Ok(a) => a,
6681                Err(err) => {
6682                    fmt.finish()?;
6683                    f.write_str("Err(")?;
6684                    err.fmt(f)?;
6685                    return f.write_str(")");
6686                }
6687            };
6688            match attr {
6689                Coalesce::Header(val) => fmt.field("Header", &val),
6690                Coalesce::RxUsecs(val) => fmt.field("RxUsecs", &val),
6691                Coalesce::RxMaxFrames(val) => fmt.field("RxMaxFrames", &val),
6692                Coalesce::RxUsecsIrq(val) => fmt.field("RxUsecsIrq", &val),
6693                Coalesce::RxMaxFramesIrq(val) => fmt.field("RxMaxFramesIrq", &val),
6694                Coalesce::TxUsecs(val) => fmt.field("TxUsecs", &val),
6695                Coalesce::TxMaxFrames(val) => fmt.field("TxMaxFrames", &val),
6696                Coalesce::TxUsecsIrq(val) => fmt.field("TxUsecsIrq", &val),
6697                Coalesce::TxMaxFramesIrq(val) => fmt.field("TxMaxFramesIrq", &val),
6698                Coalesce::StatsBlockUsecs(val) => fmt.field("StatsBlockUsecs", &val),
6699                Coalesce::UseAdaptiveRx(val) => fmt.field("UseAdaptiveRx", &val),
6700                Coalesce::UseAdaptiveTx(val) => fmt.field("UseAdaptiveTx", &val),
6701                Coalesce::PktRateLow(val) => fmt.field("PktRateLow", &val),
6702                Coalesce::RxUsecsLow(val) => fmt.field("RxUsecsLow", &val),
6703                Coalesce::RxMaxFramesLow(val) => fmt.field("RxMaxFramesLow", &val),
6704                Coalesce::TxUsecsLow(val) => fmt.field("TxUsecsLow", &val),
6705                Coalesce::TxMaxFramesLow(val) => fmt.field("TxMaxFramesLow", &val),
6706                Coalesce::PktRateHigh(val) => fmt.field("PktRateHigh", &val),
6707                Coalesce::RxUsecsHigh(val) => fmt.field("RxUsecsHigh", &val),
6708                Coalesce::RxMaxFramesHigh(val) => fmt.field("RxMaxFramesHigh", &val),
6709                Coalesce::TxUsecsHigh(val) => fmt.field("TxUsecsHigh", &val),
6710                Coalesce::TxMaxFramesHigh(val) => fmt.field("TxMaxFramesHigh", &val),
6711                Coalesce::RateSampleInterval(val) => fmt.field("RateSampleInterval", &val),
6712                Coalesce::UseCqeModeTx(val) => fmt.field("UseCqeModeTx", &val),
6713                Coalesce::UseCqeModeRx(val) => fmt.field("UseCqeModeRx", &val),
6714                Coalesce::TxAggrMaxBytes(val) => fmt.field("TxAggrMaxBytes", &val),
6715                Coalesce::TxAggrMaxFrames(val) => fmt.field("TxAggrMaxFrames", &val),
6716                Coalesce::TxAggrTimeUsecs(val) => fmt.field("TxAggrTimeUsecs", &val),
6717                Coalesce::RxProfile(val) => fmt.field("RxProfile", &val),
6718                Coalesce::TxProfile(val) => fmt.field("TxProfile", &val),
6719                Coalesce::RxCqeFrames(val) => fmt.field("RxCqeFrames", &val),
6720                Coalesce::RxCqeNsecs(val) => fmt.field("RxCqeNsecs", &val),
6721            };
6722        }
6723        fmt.finish()
6724    }
6725}
6726impl IterableCoalesce<'_> {
6727    pub fn lookup_attr(
6728        &self,
6729        offset: usize,
6730        missing_type: Option<u16>,
6731    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6732        let mut stack = Vec::new();
6733        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6734        if missing_type.is_some() && cur == offset {
6735            stack.push(("Coalesce", offset));
6736            return (
6737                stack,
6738                missing_type.and_then(|t| Coalesce::attr_from_type(t)),
6739            );
6740        }
6741        if cur > offset || cur + self.buf.len() < offset {
6742            return (stack, None);
6743        }
6744        let mut attrs = self.clone();
6745        let mut last_off = cur + attrs.pos;
6746        let mut missing = None;
6747        while let Some(attr) = attrs.next() {
6748            let Ok(attr) = attr else { break };
6749            match attr {
6750                Coalesce::Header(val) => {
6751                    (stack, missing) = val.lookup_attr(offset, missing_type);
6752                    if !stack.is_empty() {
6753                        break;
6754                    }
6755                }
6756                Coalesce::RxUsecs(val) => {
6757                    if last_off == offset {
6758                        stack.push(("RxUsecs", last_off));
6759                        break;
6760                    }
6761                }
6762                Coalesce::RxMaxFrames(val) => {
6763                    if last_off == offset {
6764                        stack.push(("RxMaxFrames", last_off));
6765                        break;
6766                    }
6767                }
6768                Coalesce::RxUsecsIrq(val) => {
6769                    if last_off == offset {
6770                        stack.push(("RxUsecsIrq", last_off));
6771                        break;
6772                    }
6773                }
6774                Coalesce::RxMaxFramesIrq(val) => {
6775                    if last_off == offset {
6776                        stack.push(("RxMaxFramesIrq", last_off));
6777                        break;
6778                    }
6779                }
6780                Coalesce::TxUsecs(val) => {
6781                    if last_off == offset {
6782                        stack.push(("TxUsecs", last_off));
6783                        break;
6784                    }
6785                }
6786                Coalesce::TxMaxFrames(val) => {
6787                    if last_off == offset {
6788                        stack.push(("TxMaxFrames", last_off));
6789                        break;
6790                    }
6791                }
6792                Coalesce::TxUsecsIrq(val) => {
6793                    if last_off == offset {
6794                        stack.push(("TxUsecsIrq", last_off));
6795                        break;
6796                    }
6797                }
6798                Coalesce::TxMaxFramesIrq(val) => {
6799                    if last_off == offset {
6800                        stack.push(("TxMaxFramesIrq", last_off));
6801                        break;
6802                    }
6803                }
6804                Coalesce::StatsBlockUsecs(val) => {
6805                    if last_off == offset {
6806                        stack.push(("StatsBlockUsecs", last_off));
6807                        break;
6808                    }
6809                }
6810                Coalesce::UseAdaptiveRx(val) => {
6811                    if last_off == offset {
6812                        stack.push(("UseAdaptiveRx", last_off));
6813                        break;
6814                    }
6815                }
6816                Coalesce::UseAdaptiveTx(val) => {
6817                    if last_off == offset {
6818                        stack.push(("UseAdaptiveTx", last_off));
6819                        break;
6820                    }
6821                }
6822                Coalesce::PktRateLow(val) => {
6823                    if last_off == offset {
6824                        stack.push(("PktRateLow", last_off));
6825                        break;
6826                    }
6827                }
6828                Coalesce::RxUsecsLow(val) => {
6829                    if last_off == offset {
6830                        stack.push(("RxUsecsLow", last_off));
6831                        break;
6832                    }
6833                }
6834                Coalesce::RxMaxFramesLow(val) => {
6835                    if last_off == offset {
6836                        stack.push(("RxMaxFramesLow", last_off));
6837                        break;
6838                    }
6839                }
6840                Coalesce::TxUsecsLow(val) => {
6841                    if last_off == offset {
6842                        stack.push(("TxUsecsLow", last_off));
6843                        break;
6844                    }
6845                }
6846                Coalesce::TxMaxFramesLow(val) => {
6847                    if last_off == offset {
6848                        stack.push(("TxMaxFramesLow", last_off));
6849                        break;
6850                    }
6851                }
6852                Coalesce::PktRateHigh(val) => {
6853                    if last_off == offset {
6854                        stack.push(("PktRateHigh", last_off));
6855                        break;
6856                    }
6857                }
6858                Coalesce::RxUsecsHigh(val) => {
6859                    if last_off == offset {
6860                        stack.push(("RxUsecsHigh", last_off));
6861                        break;
6862                    }
6863                }
6864                Coalesce::RxMaxFramesHigh(val) => {
6865                    if last_off == offset {
6866                        stack.push(("RxMaxFramesHigh", last_off));
6867                        break;
6868                    }
6869                }
6870                Coalesce::TxUsecsHigh(val) => {
6871                    if last_off == offset {
6872                        stack.push(("TxUsecsHigh", last_off));
6873                        break;
6874                    }
6875                }
6876                Coalesce::TxMaxFramesHigh(val) => {
6877                    if last_off == offset {
6878                        stack.push(("TxMaxFramesHigh", last_off));
6879                        break;
6880                    }
6881                }
6882                Coalesce::RateSampleInterval(val) => {
6883                    if last_off == offset {
6884                        stack.push(("RateSampleInterval", last_off));
6885                        break;
6886                    }
6887                }
6888                Coalesce::UseCqeModeTx(val) => {
6889                    if last_off == offset {
6890                        stack.push(("UseCqeModeTx", last_off));
6891                        break;
6892                    }
6893                }
6894                Coalesce::UseCqeModeRx(val) => {
6895                    if last_off == offset {
6896                        stack.push(("UseCqeModeRx", last_off));
6897                        break;
6898                    }
6899                }
6900                Coalesce::TxAggrMaxBytes(val) => {
6901                    if last_off == offset {
6902                        stack.push(("TxAggrMaxBytes", last_off));
6903                        break;
6904                    }
6905                }
6906                Coalesce::TxAggrMaxFrames(val) => {
6907                    if last_off == offset {
6908                        stack.push(("TxAggrMaxFrames", last_off));
6909                        break;
6910                    }
6911                }
6912                Coalesce::TxAggrTimeUsecs(val) => {
6913                    if last_off == offset {
6914                        stack.push(("TxAggrTimeUsecs", last_off));
6915                        break;
6916                    }
6917                }
6918                Coalesce::RxProfile(val) => {
6919                    (stack, missing) = val.lookup_attr(offset, missing_type);
6920                    if !stack.is_empty() {
6921                        break;
6922                    }
6923                }
6924                Coalesce::TxProfile(val) => {
6925                    (stack, missing) = val.lookup_attr(offset, missing_type);
6926                    if !stack.is_empty() {
6927                        break;
6928                    }
6929                }
6930                Coalesce::RxCqeFrames(val) => {
6931                    if last_off == offset {
6932                        stack.push(("RxCqeFrames", last_off));
6933                        break;
6934                    }
6935                }
6936                Coalesce::RxCqeNsecs(val) => {
6937                    if last_off == offset {
6938                        stack.push(("RxCqeNsecs", last_off));
6939                        break;
6940                    }
6941                }
6942                _ => {}
6943            };
6944            last_off = cur + attrs.pos;
6945        }
6946        if !stack.is_empty() {
6947            stack.push(("Coalesce", cur));
6948        }
6949        (stack, missing)
6950    }
6951}
6952#[derive(Clone)]
6953pub enum PauseStat<'a> {
6954    Pad(&'a [u8]),
6955    TxFrames(u64),
6956    RxFrames(u64),
6957    #[doc = "TX pause storm event count. Increments each time device detects that its\npause assertion condition has been true for too long for normal\noperation. As a result, the device has temporarily disabled its own\nPause TX function to protect the network from itself. This counter\nshould never increment under normal overload conditions; it indicates\ncatastrophic failure like an OS crash. The rate of incrementing is\nimplementation specific.\n"]
6958    TxPauseStormEvents(u64),
6959}
6960impl<'a> IterablePauseStat<'a> {
6961    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
6962        let mut iter = self.clone();
6963        iter.pos = 0;
6964        for attr in iter {
6965            if let Ok(PauseStat::Pad(val)) = attr {
6966                return Ok(val);
6967            }
6968        }
6969        Err(ErrorContext::new_missing(
6970            "PauseStat",
6971            "Pad",
6972            self.orig_loc,
6973            self.buf.as_ptr() as usize,
6974        ))
6975    }
6976    pub fn get_tx_frames(&self) -> Result<u64, ErrorContext> {
6977        let mut iter = self.clone();
6978        iter.pos = 0;
6979        for attr in iter {
6980            if let Ok(PauseStat::TxFrames(val)) = attr {
6981                return Ok(val);
6982            }
6983        }
6984        Err(ErrorContext::new_missing(
6985            "PauseStat",
6986            "TxFrames",
6987            self.orig_loc,
6988            self.buf.as_ptr() as usize,
6989        ))
6990    }
6991    pub fn get_rx_frames(&self) -> Result<u64, ErrorContext> {
6992        let mut iter = self.clone();
6993        iter.pos = 0;
6994        for attr in iter {
6995            if let Ok(PauseStat::RxFrames(val)) = attr {
6996                return Ok(val);
6997            }
6998        }
6999        Err(ErrorContext::new_missing(
7000            "PauseStat",
7001            "RxFrames",
7002            self.orig_loc,
7003            self.buf.as_ptr() as usize,
7004        ))
7005    }
7006    #[doc = "TX pause storm event count. Increments each time device detects that its\npause assertion condition has been true for too long for normal\noperation. As a result, the device has temporarily disabled its own\nPause TX function to protect the network from itself. This counter\nshould never increment under normal overload conditions; it indicates\ncatastrophic failure like an OS crash. The rate of incrementing is\nimplementation specific.\n"]
7007    pub fn get_tx_pause_storm_events(&self) -> Result<u64, ErrorContext> {
7008        let mut iter = self.clone();
7009        iter.pos = 0;
7010        for attr in iter {
7011            if let Ok(PauseStat::TxPauseStormEvents(val)) = attr {
7012                return Ok(val);
7013            }
7014        }
7015        Err(ErrorContext::new_missing(
7016            "PauseStat",
7017            "TxPauseStormEvents",
7018            self.orig_loc,
7019            self.buf.as_ptr() as usize,
7020        ))
7021    }
7022}
7023impl PauseStat<'_> {
7024    pub fn new<'a>(buf: &'a [u8]) -> IterablePauseStat<'a> {
7025        IterablePauseStat::with_loc(buf, buf.as_ptr() as usize)
7026    }
7027    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7028        let res = match r#type {
7029            0u16 => "Unspec",
7030            1u16 => "Pad",
7031            2u16 => "TxFrames",
7032            3u16 => "RxFrames",
7033            4u16 => "TxPauseStormEvents",
7034            _ => return None,
7035        };
7036        Some(res)
7037    }
7038}
7039#[derive(Clone, Copy, Default)]
7040pub struct IterablePauseStat<'a> {
7041    buf: &'a [u8],
7042    pos: usize,
7043    orig_loc: usize,
7044}
7045impl<'a> IterablePauseStat<'a> {
7046    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7047        Self {
7048            buf,
7049            pos: 0,
7050            orig_loc,
7051        }
7052    }
7053    pub fn get_buf(&self) -> &'a [u8] {
7054        self.buf
7055    }
7056}
7057impl<'a> Iterator for IterablePauseStat<'a> {
7058    type Item = Result<PauseStat<'a>, ErrorContext>;
7059    fn next(&mut self) -> Option<Self::Item> {
7060        let mut pos;
7061        let mut r#type;
7062        loop {
7063            pos = self.pos;
7064            r#type = None;
7065            if self.buf.len() == self.pos {
7066                return None;
7067            }
7068            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7069                self.pos = self.buf.len();
7070                break;
7071            };
7072            r#type = Some(header.r#type);
7073            let res = match header.r#type {
7074                1u16 => PauseStat::Pad({
7075                    let res = Some(next);
7076                    let Some(val) = res else { break };
7077                    val
7078                }),
7079                2u16 => PauseStat::TxFrames({
7080                    let res = parse_u64(next);
7081                    let Some(val) = res else { break };
7082                    val
7083                }),
7084                3u16 => PauseStat::RxFrames({
7085                    let res = parse_u64(next);
7086                    let Some(val) = res else { break };
7087                    val
7088                }),
7089                4u16 => PauseStat::TxPauseStormEvents({
7090                    let res = parse_u64(next);
7091                    let Some(val) = res else { break };
7092                    val
7093                }),
7094                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7095                n => continue,
7096            };
7097            return Some(Ok(res));
7098        }
7099        Some(Err(ErrorContext::new(
7100            "PauseStat",
7101            r#type.and_then(|t| PauseStat::attr_from_type(t)),
7102            self.orig_loc,
7103            self.buf.as_ptr().wrapping_add(pos) as usize,
7104        )))
7105    }
7106}
7107impl<'a> std::fmt::Debug for IterablePauseStat<'_> {
7108    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7109        let mut fmt = f.debug_struct("PauseStat");
7110        for attr in self.clone() {
7111            let attr = match attr {
7112                Ok(a) => a,
7113                Err(err) => {
7114                    fmt.finish()?;
7115                    f.write_str("Err(")?;
7116                    err.fmt(f)?;
7117                    return f.write_str(")");
7118                }
7119            };
7120            match attr {
7121                PauseStat::Pad(val) => fmt.field("Pad", &val),
7122                PauseStat::TxFrames(val) => fmt.field("TxFrames", &val),
7123                PauseStat::RxFrames(val) => fmt.field("RxFrames", &val),
7124                PauseStat::TxPauseStormEvents(val) => fmt.field("TxPauseStormEvents", &val),
7125            };
7126        }
7127        fmt.finish()
7128    }
7129}
7130impl IterablePauseStat<'_> {
7131    pub fn lookup_attr(
7132        &self,
7133        offset: usize,
7134        missing_type: Option<u16>,
7135    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7136        let mut stack = Vec::new();
7137        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7138        if missing_type.is_some() && cur == offset {
7139            stack.push(("PauseStat", offset));
7140            return (
7141                stack,
7142                missing_type.and_then(|t| PauseStat::attr_from_type(t)),
7143            );
7144        }
7145        if cur > offset || cur + self.buf.len() < offset {
7146            return (stack, None);
7147        }
7148        let mut attrs = self.clone();
7149        let mut last_off = cur + attrs.pos;
7150        while let Some(attr) = attrs.next() {
7151            let Ok(attr) = attr else { break };
7152            match attr {
7153                PauseStat::Pad(val) => {
7154                    if last_off == offset {
7155                        stack.push(("Pad", last_off));
7156                        break;
7157                    }
7158                }
7159                PauseStat::TxFrames(val) => {
7160                    if last_off == offset {
7161                        stack.push(("TxFrames", last_off));
7162                        break;
7163                    }
7164                }
7165                PauseStat::RxFrames(val) => {
7166                    if last_off == offset {
7167                        stack.push(("RxFrames", last_off));
7168                        break;
7169                    }
7170                }
7171                PauseStat::TxPauseStormEvents(val) => {
7172                    if last_off == offset {
7173                        stack.push(("TxPauseStormEvents", last_off));
7174                        break;
7175                    }
7176                }
7177                _ => {}
7178            };
7179            last_off = cur + attrs.pos;
7180        }
7181        if !stack.is_empty() {
7182            stack.push(("PauseStat", cur));
7183        }
7184        (stack, None)
7185    }
7186}
7187#[derive(Clone)]
7188pub enum Pause<'a> {
7189    Header(IterableHeader<'a>),
7190    Autoneg(u8),
7191    Rx(u8),
7192    Tx(u8),
7193    Stats(IterablePauseStat<'a>),
7194    StatsSrc(u32),
7195}
7196impl<'a> IterablePause<'a> {
7197    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
7198        let mut iter = self.clone();
7199        iter.pos = 0;
7200        for attr in iter {
7201            if let Ok(Pause::Header(val)) = attr {
7202                return Ok(val);
7203            }
7204        }
7205        Err(ErrorContext::new_missing(
7206            "Pause",
7207            "Header",
7208            self.orig_loc,
7209            self.buf.as_ptr() as usize,
7210        ))
7211    }
7212    pub fn get_autoneg(&self) -> Result<u8, ErrorContext> {
7213        let mut iter = self.clone();
7214        iter.pos = 0;
7215        for attr in iter {
7216            if let Ok(Pause::Autoneg(val)) = attr {
7217                return Ok(val);
7218            }
7219        }
7220        Err(ErrorContext::new_missing(
7221            "Pause",
7222            "Autoneg",
7223            self.orig_loc,
7224            self.buf.as_ptr() as usize,
7225        ))
7226    }
7227    pub fn get_rx(&self) -> Result<u8, ErrorContext> {
7228        let mut iter = self.clone();
7229        iter.pos = 0;
7230        for attr in iter {
7231            if let Ok(Pause::Rx(val)) = attr {
7232                return Ok(val);
7233            }
7234        }
7235        Err(ErrorContext::new_missing(
7236            "Pause",
7237            "Rx",
7238            self.orig_loc,
7239            self.buf.as_ptr() as usize,
7240        ))
7241    }
7242    pub fn get_tx(&self) -> Result<u8, ErrorContext> {
7243        let mut iter = self.clone();
7244        iter.pos = 0;
7245        for attr in iter {
7246            if let Ok(Pause::Tx(val)) = attr {
7247                return Ok(val);
7248            }
7249        }
7250        Err(ErrorContext::new_missing(
7251            "Pause",
7252            "Tx",
7253            self.orig_loc,
7254            self.buf.as_ptr() as usize,
7255        ))
7256    }
7257    pub fn get_stats(&self) -> Result<IterablePauseStat<'a>, ErrorContext> {
7258        let mut iter = self.clone();
7259        iter.pos = 0;
7260        for attr in iter {
7261            if let Ok(Pause::Stats(val)) = attr {
7262                return Ok(val);
7263            }
7264        }
7265        Err(ErrorContext::new_missing(
7266            "Pause",
7267            "Stats",
7268            self.orig_loc,
7269            self.buf.as_ptr() as usize,
7270        ))
7271    }
7272    pub fn get_stats_src(&self) -> Result<u32, ErrorContext> {
7273        let mut iter = self.clone();
7274        iter.pos = 0;
7275        for attr in iter {
7276            if let Ok(Pause::StatsSrc(val)) = attr {
7277                return Ok(val);
7278            }
7279        }
7280        Err(ErrorContext::new_missing(
7281            "Pause",
7282            "StatsSrc",
7283            self.orig_loc,
7284            self.buf.as_ptr() as usize,
7285        ))
7286    }
7287}
7288impl Pause<'_> {
7289    pub fn new<'a>(buf: &'a [u8]) -> IterablePause<'a> {
7290        IterablePause::with_loc(buf, buf.as_ptr() as usize)
7291    }
7292    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7293        let res = match r#type {
7294            0u16 => "Unspec",
7295            1u16 => "Header",
7296            2u16 => "Autoneg",
7297            3u16 => "Rx",
7298            4u16 => "Tx",
7299            5u16 => "Stats",
7300            6u16 => "StatsSrc",
7301            _ => return None,
7302        };
7303        Some(res)
7304    }
7305}
7306#[derive(Clone, Copy, Default)]
7307pub struct IterablePause<'a> {
7308    buf: &'a [u8],
7309    pos: usize,
7310    orig_loc: usize,
7311}
7312impl<'a> IterablePause<'a> {
7313    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7314        Self {
7315            buf,
7316            pos: 0,
7317            orig_loc,
7318        }
7319    }
7320    pub fn get_buf(&self) -> &'a [u8] {
7321        self.buf
7322    }
7323}
7324impl<'a> Iterator for IterablePause<'a> {
7325    type Item = Result<Pause<'a>, ErrorContext>;
7326    fn next(&mut self) -> Option<Self::Item> {
7327        let mut pos;
7328        let mut r#type;
7329        loop {
7330            pos = self.pos;
7331            r#type = None;
7332            if self.buf.len() == self.pos {
7333                return None;
7334            }
7335            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7336                self.pos = self.buf.len();
7337                break;
7338            };
7339            r#type = Some(header.r#type);
7340            let res = match header.r#type {
7341                1u16 => Pause::Header({
7342                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
7343                    let Some(val) = res else { break };
7344                    val
7345                }),
7346                2u16 => Pause::Autoneg({
7347                    let res = parse_u8(next);
7348                    let Some(val) = res else { break };
7349                    val
7350                }),
7351                3u16 => Pause::Rx({
7352                    let res = parse_u8(next);
7353                    let Some(val) = res else { break };
7354                    val
7355                }),
7356                4u16 => Pause::Tx({
7357                    let res = parse_u8(next);
7358                    let Some(val) = res else { break };
7359                    val
7360                }),
7361                5u16 => Pause::Stats({
7362                    let res = Some(IterablePauseStat::with_loc(next, self.orig_loc));
7363                    let Some(val) = res else { break };
7364                    val
7365                }),
7366                6u16 => Pause::StatsSrc({
7367                    let res = parse_u32(next);
7368                    let Some(val) = res else { break };
7369                    val
7370                }),
7371                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7372                n => continue,
7373            };
7374            return Some(Ok(res));
7375        }
7376        Some(Err(ErrorContext::new(
7377            "Pause",
7378            r#type.and_then(|t| Pause::attr_from_type(t)),
7379            self.orig_loc,
7380            self.buf.as_ptr().wrapping_add(pos) as usize,
7381        )))
7382    }
7383}
7384impl<'a> std::fmt::Debug for IterablePause<'_> {
7385    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7386        let mut fmt = f.debug_struct("Pause");
7387        for attr in self.clone() {
7388            let attr = match attr {
7389                Ok(a) => a,
7390                Err(err) => {
7391                    fmt.finish()?;
7392                    f.write_str("Err(")?;
7393                    err.fmt(f)?;
7394                    return f.write_str(")");
7395                }
7396            };
7397            match attr {
7398                Pause::Header(val) => fmt.field("Header", &val),
7399                Pause::Autoneg(val) => fmt.field("Autoneg", &val),
7400                Pause::Rx(val) => fmt.field("Rx", &val),
7401                Pause::Tx(val) => fmt.field("Tx", &val),
7402                Pause::Stats(val) => fmt.field("Stats", &val),
7403                Pause::StatsSrc(val) => fmt.field("StatsSrc", &val),
7404            };
7405        }
7406        fmt.finish()
7407    }
7408}
7409impl IterablePause<'_> {
7410    pub fn lookup_attr(
7411        &self,
7412        offset: usize,
7413        missing_type: Option<u16>,
7414    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7415        let mut stack = Vec::new();
7416        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7417        if missing_type.is_some() && cur == offset {
7418            stack.push(("Pause", offset));
7419            return (stack, missing_type.and_then(|t| Pause::attr_from_type(t)));
7420        }
7421        if cur > offset || cur + self.buf.len() < offset {
7422            return (stack, None);
7423        }
7424        let mut attrs = self.clone();
7425        let mut last_off = cur + attrs.pos;
7426        let mut missing = None;
7427        while let Some(attr) = attrs.next() {
7428            let Ok(attr) = attr else { break };
7429            match attr {
7430                Pause::Header(val) => {
7431                    (stack, missing) = val.lookup_attr(offset, missing_type);
7432                    if !stack.is_empty() {
7433                        break;
7434                    }
7435                }
7436                Pause::Autoneg(val) => {
7437                    if last_off == offset {
7438                        stack.push(("Autoneg", last_off));
7439                        break;
7440                    }
7441                }
7442                Pause::Rx(val) => {
7443                    if last_off == offset {
7444                        stack.push(("Rx", last_off));
7445                        break;
7446                    }
7447                }
7448                Pause::Tx(val) => {
7449                    if last_off == offset {
7450                        stack.push(("Tx", last_off));
7451                        break;
7452                    }
7453                }
7454                Pause::Stats(val) => {
7455                    (stack, missing) = val.lookup_attr(offset, missing_type);
7456                    if !stack.is_empty() {
7457                        break;
7458                    }
7459                }
7460                Pause::StatsSrc(val) => {
7461                    if last_off == offset {
7462                        stack.push(("StatsSrc", last_off));
7463                        break;
7464                    }
7465                }
7466                _ => {}
7467            };
7468            last_off = cur + attrs.pos;
7469        }
7470        if !stack.is_empty() {
7471            stack.push(("Pause", cur));
7472        }
7473        (stack, missing)
7474    }
7475}
7476#[derive(Clone)]
7477pub enum Eee<'a> {
7478    Header(IterableHeader<'a>),
7479    ModesOurs(IterableBitset<'a>),
7480    ModesPeer(IterableBitset<'a>),
7481    Active(u8),
7482    Enabled(u8),
7483    TxLpiEnabled(u8),
7484    TxLpiTimer(u32),
7485}
7486impl<'a> IterableEee<'a> {
7487    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
7488        let mut iter = self.clone();
7489        iter.pos = 0;
7490        for attr in iter {
7491            if let Ok(Eee::Header(val)) = attr {
7492                return Ok(val);
7493            }
7494        }
7495        Err(ErrorContext::new_missing(
7496            "Eee",
7497            "Header",
7498            self.orig_loc,
7499            self.buf.as_ptr() as usize,
7500        ))
7501    }
7502    pub fn get_modes_ours(&self) -> Result<IterableBitset<'a>, ErrorContext> {
7503        let mut iter = self.clone();
7504        iter.pos = 0;
7505        for attr in iter {
7506            if let Ok(Eee::ModesOurs(val)) = attr {
7507                return Ok(val);
7508            }
7509        }
7510        Err(ErrorContext::new_missing(
7511            "Eee",
7512            "ModesOurs",
7513            self.orig_loc,
7514            self.buf.as_ptr() as usize,
7515        ))
7516    }
7517    pub fn get_modes_peer(&self) -> Result<IterableBitset<'a>, ErrorContext> {
7518        let mut iter = self.clone();
7519        iter.pos = 0;
7520        for attr in iter {
7521            if let Ok(Eee::ModesPeer(val)) = attr {
7522                return Ok(val);
7523            }
7524        }
7525        Err(ErrorContext::new_missing(
7526            "Eee",
7527            "ModesPeer",
7528            self.orig_loc,
7529            self.buf.as_ptr() as usize,
7530        ))
7531    }
7532    pub fn get_active(&self) -> Result<u8, ErrorContext> {
7533        let mut iter = self.clone();
7534        iter.pos = 0;
7535        for attr in iter {
7536            if let Ok(Eee::Active(val)) = attr {
7537                return Ok(val);
7538            }
7539        }
7540        Err(ErrorContext::new_missing(
7541            "Eee",
7542            "Active",
7543            self.orig_loc,
7544            self.buf.as_ptr() as usize,
7545        ))
7546    }
7547    pub fn get_enabled(&self) -> Result<u8, ErrorContext> {
7548        let mut iter = self.clone();
7549        iter.pos = 0;
7550        for attr in iter {
7551            if let Ok(Eee::Enabled(val)) = attr {
7552                return Ok(val);
7553            }
7554        }
7555        Err(ErrorContext::new_missing(
7556            "Eee",
7557            "Enabled",
7558            self.orig_loc,
7559            self.buf.as_ptr() as usize,
7560        ))
7561    }
7562    pub fn get_tx_lpi_enabled(&self) -> Result<u8, ErrorContext> {
7563        let mut iter = self.clone();
7564        iter.pos = 0;
7565        for attr in iter {
7566            if let Ok(Eee::TxLpiEnabled(val)) = attr {
7567                return Ok(val);
7568            }
7569        }
7570        Err(ErrorContext::new_missing(
7571            "Eee",
7572            "TxLpiEnabled",
7573            self.orig_loc,
7574            self.buf.as_ptr() as usize,
7575        ))
7576    }
7577    pub fn get_tx_lpi_timer(&self) -> Result<u32, ErrorContext> {
7578        let mut iter = self.clone();
7579        iter.pos = 0;
7580        for attr in iter {
7581            if let Ok(Eee::TxLpiTimer(val)) = attr {
7582                return Ok(val);
7583            }
7584        }
7585        Err(ErrorContext::new_missing(
7586            "Eee",
7587            "TxLpiTimer",
7588            self.orig_loc,
7589            self.buf.as_ptr() as usize,
7590        ))
7591    }
7592}
7593impl Eee<'_> {
7594    pub fn new<'a>(buf: &'a [u8]) -> IterableEee<'a> {
7595        IterableEee::with_loc(buf, buf.as_ptr() as usize)
7596    }
7597    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7598        let res = match r#type {
7599            0u16 => "Unspec",
7600            1u16 => "Header",
7601            2u16 => "ModesOurs",
7602            3u16 => "ModesPeer",
7603            4u16 => "Active",
7604            5u16 => "Enabled",
7605            6u16 => "TxLpiEnabled",
7606            7u16 => "TxLpiTimer",
7607            _ => return None,
7608        };
7609        Some(res)
7610    }
7611}
7612#[derive(Clone, Copy, Default)]
7613pub struct IterableEee<'a> {
7614    buf: &'a [u8],
7615    pos: usize,
7616    orig_loc: usize,
7617}
7618impl<'a> IterableEee<'a> {
7619    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7620        Self {
7621            buf,
7622            pos: 0,
7623            orig_loc,
7624        }
7625    }
7626    pub fn get_buf(&self) -> &'a [u8] {
7627        self.buf
7628    }
7629}
7630impl<'a> Iterator for IterableEee<'a> {
7631    type Item = Result<Eee<'a>, ErrorContext>;
7632    fn next(&mut self) -> Option<Self::Item> {
7633        let mut pos;
7634        let mut r#type;
7635        loop {
7636            pos = self.pos;
7637            r#type = None;
7638            if self.buf.len() == self.pos {
7639                return None;
7640            }
7641            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7642                self.pos = self.buf.len();
7643                break;
7644            };
7645            r#type = Some(header.r#type);
7646            let res = match header.r#type {
7647                1u16 => Eee::Header({
7648                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
7649                    let Some(val) = res else { break };
7650                    val
7651                }),
7652                2u16 => Eee::ModesOurs({
7653                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
7654                    let Some(val) = res else { break };
7655                    val
7656                }),
7657                3u16 => Eee::ModesPeer({
7658                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
7659                    let Some(val) = res else { break };
7660                    val
7661                }),
7662                4u16 => Eee::Active({
7663                    let res = parse_u8(next);
7664                    let Some(val) = res else { break };
7665                    val
7666                }),
7667                5u16 => Eee::Enabled({
7668                    let res = parse_u8(next);
7669                    let Some(val) = res else { break };
7670                    val
7671                }),
7672                6u16 => Eee::TxLpiEnabled({
7673                    let res = parse_u8(next);
7674                    let Some(val) = res else { break };
7675                    val
7676                }),
7677                7u16 => Eee::TxLpiTimer({
7678                    let res = parse_u32(next);
7679                    let Some(val) = res else { break };
7680                    val
7681                }),
7682                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7683                n => continue,
7684            };
7685            return Some(Ok(res));
7686        }
7687        Some(Err(ErrorContext::new(
7688            "Eee",
7689            r#type.and_then(|t| Eee::attr_from_type(t)),
7690            self.orig_loc,
7691            self.buf.as_ptr().wrapping_add(pos) as usize,
7692        )))
7693    }
7694}
7695impl<'a> std::fmt::Debug for IterableEee<'_> {
7696    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7697        let mut fmt = f.debug_struct("Eee");
7698        for attr in self.clone() {
7699            let attr = match attr {
7700                Ok(a) => a,
7701                Err(err) => {
7702                    fmt.finish()?;
7703                    f.write_str("Err(")?;
7704                    err.fmt(f)?;
7705                    return f.write_str(")");
7706                }
7707            };
7708            match attr {
7709                Eee::Header(val) => fmt.field("Header", &val),
7710                Eee::ModesOurs(val) => fmt.field("ModesOurs", &val),
7711                Eee::ModesPeer(val) => fmt.field("ModesPeer", &val),
7712                Eee::Active(val) => fmt.field("Active", &val),
7713                Eee::Enabled(val) => fmt.field("Enabled", &val),
7714                Eee::TxLpiEnabled(val) => fmt.field("TxLpiEnabled", &val),
7715                Eee::TxLpiTimer(val) => fmt.field("TxLpiTimer", &val),
7716            };
7717        }
7718        fmt.finish()
7719    }
7720}
7721impl IterableEee<'_> {
7722    pub fn lookup_attr(
7723        &self,
7724        offset: usize,
7725        missing_type: Option<u16>,
7726    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7727        let mut stack = Vec::new();
7728        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7729        if missing_type.is_some() && cur == offset {
7730            stack.push(("Eee", offset));
7731            return (stack, missing_type.and_then(|t| Eee::attr_from_type(t)));
7732        }
7733        if cur > offset || cur + self.buf.len() < offset {
7734            return (stack, None);
7735        }
7736        let mut attrs = self.clone();
7737        let mut last_off = cur + attrs.pos;
7738        let mut missing = None;
7739        while let Some(attr) = attrs.next() {
7740            let Ok(attr) = attr else { break };
7741            match attr {
7742                Eee::Header(val) => {
7743                    (stack, missing) = val.lookup_attr(offset, missing_type);
7744                    if !stack.is_empty() {
7745                        break;
7746                    }
7747                }
7748                Eee::ModesOurs(val) => {
7749                    (stack, missing) = val.lookup_attr(offset, missing_type);
7750                    if !stack.is_empty() {
7751                        break;
7752                    }
7753                }
7754                Eee::ModesPeer(val) => {
7755                    (stack, missing) = val.lookup_attr(offset, missing_type);
7756                    if !stack.is_empty() {
7757                        break;
7758                    }
7759                }
7760                Eee::Active(val) => {
7761                    if last_off == offset {
7762                        stack.push(("Active", last_off));
7763                        break;
7764                    }
7765                }
7766                Eee::Enabled(val) => {
7767                    if last_off == offset {
7768                        stack.push(("Enabled", last_off));
7769                        break;
7770                    }
7771                }
7772                Eee::TxLpiEnabled(val) => {
7773                    if last_off == offset {
7774                        stack.push(("TxLpiEnabled", last_off));
7775                        break;
7776                    }
7777                }
7778                Eee::TxLpiTimer(val) => {
7779                    if last_off == offset {
7780                        stack.push(("TxLpiTimer", last_off));
7781                        break;
7782                    }
7783                }
7784                _ => {}
7785            };
7786            last_off = cur + attrs.pos;
7787        }
7788        if !stack.is_empty() {
7789            stack.push(("Eee", cur));
7790        }
7791        (stack, missing)
7792    }
7793}
7794#[derive(Clone)]
7795pub enum TsStat {
7796    TxPkts(u32),
7797    TxLost(u32),
7798    TxErr(u32),
7799    TxOnestepPktsUnconfirmed(u32),
7800}
7801impl<'a> IterableTsStat<'a> {
7802    pub fn get_tx_pkts(&self) -> Result<u32, ErrorContext> {
7803        let mut iter = self.clone();
7804        iter.pos = 0;
7805        for attr in iter {
7806            if let Ok(TsStat::TxPkts(val)) = attr {
7807                return Ok(val);
7808            }
7809        }
7810        Err(ErrorContext::new_missing(
7811            "TsStat",
7812            "TxPkts",
7813            self.orig_loc,
7814            self.buf.as_ptr() as usize,
7815        ))
7816    }
7817    pub fn get_tx_lost(&self) -> Result<u32, ErrorContext> {
7818        let mut iter = self.clone();
7819        iter.pos = 0;
7820        for attr in iter {
7821            if let Ok(TsStat::TxLost(val)) = attr {
7822                return Ok(val);
7823            }
7824        }
7825        Err(ErrorContext::new_missing(
7826            "TsStat",
7827            "TxLost",
7828            self.orig_loc,
7829            self.buf.as_ptr() as usize,
7830        ))
7831    }
7832    pub fn get_tx_err(&self) -> Result<u32, ErrorContext> {
7833        let mut iter = self.clone();
7834        iter.pos = 0;
7835        for attr in iter {
7836            if let Ok(TsStat::TxErr(val)) = attr {
7837                return Ok(val);
7838            }
7839        }
7840        Err(ErrorContext::new_missing(
7841            "TsStat",
7842            "TxErr",
7843            self.orig_loc,
7844            self.buf.as_ptr() as usize,
7845        ))
7846    }
7847    pub fn get_tx_onestep_pkts_unconfirmed(&self) -> Result<u32, ErrorContext> {
7848        let mut iter = self.clone();
7849        iter.pos = 0;
7850        for attr in iter {
7851            if let Ok(TsStat::TxOnestepPktsUnconfirmed(val)) = attr {
7852                return Ok(val);
7853            }
7854        }
7855        Err(ErrorContext::new_missing(
7856            "TsStat",
7857            "TxOnestepPktsUnconfirmed",
7858            self.orig_loc,
7859            self.buf.as_ptr() as usize,
7860        ))
7861    }
7862}
7863impl TsStat {
7864    pub fn new<'a>(buf: &'a [u8]) -> IterableTsStat<'a> {
7865        IterableTsStat::with_loc(buf, buf.as_ptr() as usize)
7866    }
7867    fn attr_from_type(r#type: u16) -> Option<&'static str> {
7868        let res = match r#type {
7869            0u16 => "Unspec",
7870            1u16 => "TxPkts",
7871            2u16 => "TxLost",
7872            3u16 => "TxErr",
7873            4u16 => "TxOnestepPktsUnconfirmed",
7874            _ => return None,
7875        };
7876        Some(res)
7877    }
7878}
7879#[derive(Clone, Copy, Default)]
7880pub struct IterableTsStat<'a> {
7881    buf: &'a [u8],
7882    pos: usize,
7883    orig_loc: usize,
7884}
7885impl<'a> IterableTsStat<'a> {
7886    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7887        Self {
7888            buf,
7889            pos: 0,
7890            orig_loc,
7891        }
7892    }
7893    pub fn get_buf(&self) -> &'a [u8] {
7894        self.buf
7895    }
7896}
7897impl<'a> Iterator for IterableTsStat<'a> {
7898    type Item = Result<TsStat, ErrorContext>;
7899    fn next(&mut self) -> Option<Self::Item> {
7900        let mut pos;
7901        let mut r#type;
7902        loop {
7903            pos = self.pos;
7904            r#type = None;
7905            if self.buf.len() == self.pos {
7906                return None;
7907            }
7908            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7909                self.pos = self.buf.len();
7910                break;
7911            };
7912            r#type = Some(header.r#type);
7913            let res = match header.r#type {
7914                1u16 => TsStat::TxPkts({
7915                    let res = parse_u32(next);
7916                    let Some(val) = res else { break };
7917                    val
7918                }),
7919                2u16 => TsStat::TxLost({
7920                    let res = parse_u32(next);
7921                    let Some(val) = res else { break };
7922                    val
7923                }),
7924                3u16 => TsStat::TxErr({
7925                    let res = parse_u32(next);
7926                    let Some(val) = res else { break };
7927                    val
7928                }),
7929                4u16 => TsStat::TxOnestepPktsUnconfirmed({
7930                    let res = parse_u32(next);
7931                    let Some(val) = res else { break };
7932                    val
7933                }),
7934                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7935                n => continue,
7936            };
7937            return Some(Ok(res));
7938        }
7939        Some(Err(ErrorContext::new(
7940            "TsStat",
7941            r#type.and_then(|t| TsStat::attr_from_type(t)),
7942            self.orig_loc,
7943            self.buf.as_ptr().wrapping_add(pos) as usize,
7944        )))
7945    }
7946}
7947impl std::fmt::Debug for IterableTsStat<'_> {
7948    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7949        let mut fmt = f.debug_struct("TsStat");
7950        for attr in self.clone() {
7951            let attr = match attr {
7952                Ok(a) => a,
7953                Err(err) => {
7954                    fmt.finish()?;
7955                    f.write_str("Err(")?;
7956                    err.fmt(f)?;
7957                    return f.write_str(")");
7958                }
7959            };
7960            match attr {
7961                TsStat::TxPkts(val) => fmt.field("TxPkts", &val),
7962                TsStat::TxLost(val) => fmt.field("TxLost", &val),
7963                TsStat::TxErr(val) => fmt.field("TxErr", &val),
7964                TsStat::TxOnestepPktsUnconfirmed(val) => {
7965                    fmt.field("TxOnestepPktsUnconfirmed", &val)
7966                }
7967            };
7968        }
7969        fmt.finish()
7970    }
7971}
7972impl IterableTsStat<'_> {
7973    pub fn lookup_attr(
7974        &self,
7975        offset: usize,
7976        missing_type: Option<u16>,
7977    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7978        let mut stack = Vec::new();
7979        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7980        if missing_type.is_some() && cur == offset {
7981            stack.push(("TsStat", offset));
7982            return (stack, missing_type.and_then(|t| TsStat::attr_from_type(t)));
7983        }
7984        if cur > offset || cur + self.buf.len() < offset {
7985            return (stack, None);
7986        }
7987        let mut attrs = self.clone();
7988        let mut last_off = cur + attrs.pos;
7989        while let Some(attr) = attrs.next() {
7990            let Ok(attr) = attr else { break };
7991            match attr {
7992                TsStat::TxPkts(val) => {
7993                    if last_off == offset {
7994                        stack.push(("TxPkts", last_off));
7995                        break;
7996                    }
7997                }
7998                TsStat::TxLost(val) => {
7999                    if last_off == offset {
8000                        stack.push(("TxLost", last_off));
8001                        break;
8002                    }
8003                }
8004                TsStat::TxErr(val) => {
8005                    if last_off == offset {
8006                        stack.push(("TxErr", last_off));
8007                        break;
8008                    }
8009                }
8010                TsStat::TxOnestepPktsUnconfirmed(val) => {
8011                    if last_off == offset {
8012                        stack.push(("TxOnestepPktsUnconfirmed", last_off));
8013                        break;
8014                    }
8015                }
8016                _ => {}
8017            };
8018            last_off = cur + attrs.pos;
8019        }
8020        if !stack.is_empty() {
8021            stack.push(("TsStat", cur));
8022        }
8023        (stack, None)
8024    }
8025}
8026#[derive(Clone)]
8027pub enum TsHwtstampProvider {
8028    Index(u32),
8029    Qualifier(u32),
8030}
8031impl<'a> IterableTsHwtstampProvider<'a> {
8032    pub fn get_index(&self) -> Result<u32, ErrorContext> {
8033        let mut iter = self.clone();
8034        iter.pos = 0;
8035        for attr in iter {
8036            if let Ok(TsHwtstampProvider::Index(val)) = attr {
8037                return Ok(val);
8038            }
8039        }
8040        Err(ErrorContext::new_missing(
8041            "TsHwtstampProvider",
8042            "Index",
8043            self.orig_loc,
8044            self.buf.as_ptr() as usize,
8045        ))
8046    }
8047    pub fn get_qualifier(&self) -> Result<u32, ErrorContext> {
8048        let mut iter = self.clone();
8049        iter.pos = 0;
8050        for attr in iter {
8051            if let Ok(TsHwtstampProvider::Qualifier(val)) = attr {
8052                return Ok(val);
8053            }
8054        }
8055        Err(ErrorContext::new_missing(
8056            "TsHwtstampProvider",
8057            "Qualifier",
8058            self.orig_loc,
8059            self.buf.as_ptr() as usize,
8060        ))
8061    }
8062}
8063impl TsHwtstampProvider {
8064    pub fn new<'a>(buf: &'a [u8]) -> IterableTsHwtstampProvider<'a> {
8065        IterableTsHwtstampProvider::with_loc(buf, buf.as_ptr() as usize)
8066    }
8067    fn attr_from_type(r#type: u16) -> Option<&'static str> {
8068        let res = match r#type {
8069            0u16 => "Unspec",
8070            1u16 => "Index",
8071            2u16 => "Qualifier",
8072            _ => return None,
8073        };
8074        Some(res)
8075    }
8076}
8077#[derive(Clone, Copy, Default)]
8078pub struct IterableTsHwtstampProvider<'a> {
8079    buf: &'a [u8],
8080    pos: usize,
8081    orig_loc: usize,
8082}
8083impl<'a> IterableTsHwtstampProvider<'a> {
8084    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8085        Self {
8086            buf,
8087            pos: 0,
8088            orig_loc,
8089        }
8090    }
8091    pub fn get_buf(&self) -> &'a [u8] {
8092        self.buf
8093    }
8094}
8095impl<'a> Iterator for IterableTsHwtstampProvider<'a> {
8096    type Item = Result<TsHwtstampProvider, ErrorContext>;
8097    fn next(&mut self) -> Option<Self::Item> {
8098        let mut pos;
8099        let mut r#type;
8100        loop {
8101            pos = self.pos;
8102            r#type = None;
8103            if self.buf.len() == self.pos {
8104                return None;
8105            }
8106            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8107                self.pos = self.buf.len();
8108                break;
8109            };
8110            r#type = Some(header.r#type);
8111            let res = match header.r#type {
8112                1u16 => TsHwtstampProvider::Index({
8113                    let res = parse_u32(next);
8114                    let Some(val) = res else { break };
8115                    val
8116                }),
8117                2u16 => TsHwtstampProvider::Qualifier({
8118                    let res = parse_u32(next);
8119                    let Some(val) = res else { break };
8120                    val
8121                }),
8122                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8123                n => continue,
8124            };
8125            return Some(Ok(res));
8126        }
8127        Some(Err(ErrorContext::new(
8128            "TsHwtstampProvider",
8129            r#type.and_then(|t| TsHwtstampProvider::attr_from_type(t)),
8130            self.orig_loc,
8131            self.buf.as_ptr().wrapping_add(pos) as usize,
8132        )))
8133    }
8134}
8135impl std::fmt::Debug for IterableTsHwtstampProvider<'_> {
8136    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8137        let mut fmt = f.debug_struct("TsHwtstampProvider");
8138        for attr in self.clone() {
8139            let attr = match attr {
8140                Ok(a) => a,
8141                Err(err) => {
8142                    fmt.finish()?;
8143                    f.write_str("Err(")?;
8144                    err.fmt(f)?;
8145                    return f.write_str(")");
8146                }
8147            };
8148            match attr {
8149                TsHwtstampProvider::Index(val) => fmt.field("Index", &val),
8150                TsHwtstampProvider::Qualifier(val) => fmt.field("Qualifier", &val),
8151            };
8152        }
8153        fmt.finish()
8154    }
8155}
8156impl IterableTsHwtstampProvider<'_> {
8157    pub fn lookup_attr(
8158        &self,
8159        offset: usize,
8160        missing_type: Option<u16>,
8161    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8162        let mut stack = Vec::new();
8163        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8164        if missing_type.is_some() && cur == offset {
8165            stack.push(("TsHwtstampProvider", offset));
8166            return (
8167                stack,
8168                missing_type.and_then(|t| TsHwtstampProvider::attr_from_type(t)),
8169            );
8170        }
8171        if cur > offset || cur + self.buf.len() < offset {
8172            return (stack, None);
8173        }
8174        let mut attrs = self.clone();
8175        let mut last_off = cur + attrs.pos;
8176        while let Some(attr) = attrs.next() {
8177            let Ok(attr) = attr else { break };
8178            match attr {
8179                TsHwtstampProvider::Index(val) => {
8180                    if last_off == offset {
8181                        stack.push(("Index", last_off));
8182                        break;
8183                    }
8184                }
8185                TsHwtstampProvider::Qualifier(val) => {
8186                    if last_off == offset {
8187                        stack.push(("Qualifier", last_off));
8188                        break;
8189                    }
8190                }
8191                _ => {}
8192            };
8193            last_off = cur + attrs.pos;
8194        }
8195        if !stack.is_empty() {
8196            stack.push(("TsHwtstampProvider", cur));
8197        }
8198        (stack, None)
8199    }
8200}
8201#[derive(Clone)]
8202pub enum Tsinfo<'a> {
8203    Header(IterableHeader<'a>),
8204    Timestamping(IterableBitset<'a>),
8205    TxTypes(IterableBitset<'a>),
8206    RxFilters(IterableBitset<'a>),
8207    PhcIndex(u32),
8208    Stats(IterableTsStat<'a>),
8209    HwtstampProvider(IterableTsHwtstampProvider<'a>),
8210    #[doc = "Associated type: [`HwtstampSource`] (enum)"]
8211    HwtstampSource(u32),
8212    HwtstampPhyindex(u32),
8213}
8214impl<'a> IterableTsinfo<'a> {
8215    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
8216        let mut iter = self.clone();
8217        iter.pos = 0;
8218        for attr in iter {
8219            if let Ok(Tsinfo::Header(val)) = attr {
8220                return Ok(val);
8221            }
8222        }
8223        Err(ErrorContext::new_missing(
8224            "Tsinfo",
8225            "Header",
8226            self.orig_loc,
8227            self.buf.as_ptr() as usize,
8228        ))
8229    }
8230    pub fn get_timestamping(&self) -> Result<IterableBitset<'a>, ErrorContext> {
8231        let mut iter = self.clone();
8232        iter.pos = 0;
8233        for attr in iter {
8234            if let Ok(Tsinfo::Timestamping(val)) = attr {
8235                return Ok(val);
8236            }
8237        }
8238        Err(ErrorContext::new_missing(
8239            "Tsinfo",
8240            "Timestamping",
8241            self.orig_loc,
8242            self.buf.as_ptr() as usize,
8243        ))
8244    }
8245    pub fn get_tx_types(&self) -> Result<IterableBitset<'a>, ErrorContext> {
8246        let mut iter = self.clone();
8247        iter.pos = 0;
8248        for attr in iter {
8249            if let Ok(Tsinfo::TxTypes(val)) = attr {
8250                return Ok(val);
8251            }
8252        }
8253        Err(ErrorContext::new_missing(
8254            "Tsinfo",
8255            "TxTypes",
8256            self.orig_loc,
8257            self.buf.as_ptr() as usize,
8258        ))
8259    }
8260    pub fn get_rx_filters(&self) -> Result<IterableBitset<'a>, ErrorContext> {
8261        let mut iter = self.clone();
8262        iter.pos = 0;
8263        for attr in iter {
8264            if let Ok(Tsinfo::RxFilters(val)) = attr {
8265                return Ok(val);
8266            }
8267        }
8268        Err(ErrorContext::new_missing(
8269            "Tsinfo",
8270            "RxFilters",
8271            self.orig_loc,
8272            self.buf.as_ptr() as usize,
8273        ))
8274    }
8275    pub fn get_phc_index(&self) -> Result<u32, ErrorContext> {
8276        let mut iter = self.clone();
8277        iter.pos = 0;
8278        for attr in iter {
8279            if let Ok(Tsinfo::PhcIndex(val)) = attr {
8280                return Ok(val);
8281            }
8282        }
8283        Err(ErrorContext::new_missing(
8284            "Tsinfo",
8285            "PhcIndex",
8286            self.orig_loc,
8287            self.buf.as_ptr() as usize,
8288        ))
8289    }
8290    pub fn get_stats(&self) -> Result<IterableTsStat<'a>, ErrorContext> {
8291        let mut iter = self.clone();
8292        iter.pos = 0;
8293        for attr in iter {
8294            if let Ok(Tsinfo::Stats(val)) = attr {
8295                return Ok(val);
8296            }
8297        }
8298        Err(ErrorContext::new_missing(
8299            "Tsinfo",
8300            "Stats",
8301            self.orig_loc,
8302            self.buf.as_ptr() as usize,
8303        ))
8304    }
8305    pub fn get_hwtstamp_provider(&self) -> Result<IterableTsHwtstampProvider<'a>, ErrorContext> {
8306        let mut iter = self.clone();
8307        iter.pos = 0;
8308        for attr in iter {
8309            if let Ok(Tsinfo::HwtstampProvider(val)) = attr {
8310                return Ok(val);
8311            }
8312        }
8313        Err(ErrorContext::new_missing(
8314            "Tsinfo",
8315            "HwtstampProvider",
8316            self.orig_loc,
8317            self.buf.as_ptr() as usize,
8318        ))
8319    }
8320    #[doc = "Associated type: [`HwtstampSource`] (enum)"]
8321    pub fn get_hwtstamp_source(&self) -> Result<u32, ErrorContext> {
8322        let mut iter = self.clone();
8323        iter.pos = 0;
8324        for attr in iter {
8325            if let Ok(Tsinfo::HwtstampSource(val)) = attr {
8326                return Ok(val);
8327            }
8328        }
8329        Err(ErrorContext::new_missing(
8330            "Tsinfo",
8331            "HwtstampSource",
8332            self.orig_loc,
8333            self.buf.as_ptr() as usize,
8334        ))
8335    }
8336    pub fn get_hwtstamp_phyindex(&self) -> Result<u32, ErrorContext> {
8337        let mut iter = self.clone();
8338        iter.pos = 0;
8339        for attr in iter {
8340            if let Ok(Tsinfo::HwtstampPhyindex(val)) = attr {
8341                return Ok(val);
8342            }
8343        }
8344        Err(ErrorContext::new_missing(
8345            "Tsinfo",
8346            "HwtstampPhyindex",
8347            self.orig_loc,
8348            self.buf.as_ptr() as usize,
8349        ))
8350    }
8351}
8352impl Tsinfo<'_> {
8353    pub fn new<'a>(buf: &'a [u8]) -> IterableTsinfo<'a> {
8354        IterableTsinfo::with_loc(buf, buf.as_ptr() as usize)
8355    }
8356    fn attr_from_type(r#type: u16) -> Option<&'static str> {
8357        let res = match r#type {
8358            0u16 => "Unspec",
8359            1u16 => "Header",
8360            2u16 => "Timestamping",
8361            3u16 => "TxTypes",
8362            4u16 => "RxFilters",
8363            5u16 => "PhcIndex",
8364            6u16 => "Stats",
8365            7u16 => "HwtstampProvider",
8366            8u16 => "HwtstampSource",
8367            9u16 => "HwtstampPhyindex",
8368            _ => return None,
8369        };
8370        Some(res)
8371    }
8372}
8373#[derive(Clone, Copy, Default)]
8374pub struct IterableTsinfo<'a> {
8375    buf: &'a [u8],
8376    pos: usize,
8377    orig_loc: usize,
8378}
8379impl<'a> IterableTsinfo<'a> {
8380    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8381        Self {
8382            buf,
8383            pos: 0,
8384            orig_loc,
8385        }
8386    }
8387    pub fn get_buf(&self) -> &'a [u8] {
8388        self.buf
8389    }
8390}
8391impl<'a> Iterator for IterableTsinfo<'a> {
8392    type Item = Result<Tsinfo<'a>, ErrorContext>;
8393    fn next(&mut self) -> Option<Self::Item> {
8394        let mut pos;
8395        let mut r#type;
8396        loop {
8397            pos = self.pos;
8398            r#type = None;
8399            if self.buf.len() == self.pos {
8400                return None;
8401            }
8402            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8403                self.pos = self.buf.len();
8404                break;
8405            };
8406            r#type = Some(header.r#type);
8407            let res = match header.r#type {
8408                1u16 => Tsinfo::Header({
8409                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
8410                    let Some(val) = res else { break };
8411                    val
8412                }),
8413                2u16 => Tsinfo::Timestamping({
8414                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
8415                    let Some(val) = res else { break };
8416                    val
8417                }),
8418                3u16 => Tsinfo::TxTypes({
8419                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
8420                    let Some(val) = res else { break };
8421                    val
8422                }),
8423                4u16 => Tsinfo::RxFilters({
8424                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
8425                    let Some(val) = res else { break };
8426                    val
8427                }),
8428                5u16 => Tsinfo::PhcIndex({
8429                    let res = parse_u32(next);
8430                    let Some(val) = res else { break };
8431                    val
8432                }),
8433                6u16 => Tsinfo::Stats({
8434                    let res = Some(IterableTsStat::with_loc(next, self.orig_loc));
8435                    let Some(val) = res else { break };
8436                    val
8437                }),
8438                7u16 => Tsinfo::HwtstampProvider({
8439                    let res = Some(IterableTsHwtstampProvider::with_loc(next, self.orig_loc));
8440                    let Some(val) = res else { break };
8441                    val
8442                }),
8443                8u16 => Tsinfo::HwtstampSource({
8444                    let res = parse_u32(next);
8445                    let Some(val) = res else { break };
8446                    val
8447                }),
8448                9u16 => Tsinfo::HwtstampPhyindex({
8449                    let res = parse_u32(next);
8450                    let Some(val) = res else { break };
8451                    val
8452                }),
8453                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8454                n => continue,
8455            };
8456            return Some(Ok(res));
8457        }
8458        Some(Err(ErrorContext::new(
8459            "Tsinfo",
8460            r#type.and_then(|t| Tsinfo::attr_from_type(t)),
8461            self.orig_loc,
8462            self.buf.as_ptr().wrapping_add(pos) as usize,
8463        )))
8464    }
8465}
8466impl<'a> std::fmt::Debug for IterableTsinfo<'_> {
8467    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8468        let mut fmt = f.debug_struct("Tsinfo");
8469        for attr in self.clone() {
8470            let attr = match attr {
8471                Ok(a) => a,
8472                Err(err) => {
8473                    fmt.finish()?;
8474                    f.write_str("Err(")?;
8475                    err.fmt(f)?;
8476                    return f.write_str(")");
8477                }
8478            };
8479            match attr {
8480                Tsinfo::Header(val) => fmt.field("Header", &val),
8481                Tsinfo::Timestamping(val) => fmt.field("Timestamping", &val),
8482                Tsinfo::TxTypes(val) => fmt.field("TxTypes", &val),
8483                Tsinfo::RxFilters(val) => fmt.field("RxFilters", &val),
8484                Tsinfo::PhcIndex(val) => fmt.field("PhcIndex", &val),
8485                Tsinfo::Stats(val) => fmt.field("Stats", &val),
8486                Tsinfo::HwtstampProvider(val) => fmt.field("HwtstampProvider", &val),
8487                Tsinfo::HwtstampSource(val) => fmt.field(
8488                    "HwtstampSource",
8489                    &FormatEnum(val.into(), HwtstampSource::from_value),
8490                ),
8491                Tsinfo::HwtstampPhyindex(val) => fmt.field("HwtstampPhyindex", &val),
8492            };
8493        }
8494        fmt.finish()
8495    }
8496}
8497impl IterableTsinfo<'_> {
8498    pub fn lookup_attr(
8499        &self,
8500        offset: usize,
8501        missing_type: Option<u16>,
8502    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8503        let mut stack = Vec::new();
8504        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8505        if missing_type.is_some() && cur == offset {
8506            stack.push(("Tsinfo", offset));
8507            return (stack, missing_type.and_then(|t| Tsinfo::attr_from_type(t)));
8508        }
8509        if cur > offset || cur + self.buf.len() < offset {
8510            return (stack, None);
8511        }
8512        let mut attrs = self.clone();
8513        let mut last_off = cur + attrs.pos;
8514        let mut missing = None;
8515        while let Some(attr) = attrs.next() {
8516            let Ok(attr) = attr else { break };
8517            match attr {
8518                Tsinfo::Header(val) => {
8519                    (stack, missing) = val.lookup_attr(offset, missing_type);
8520                    if !stack.is_empty() {
8521                        break;
8522                    }
8523                }
8524                Tsinfo::Timestamping(val) => {
8525                    (stack, missing) = val.lookup_attr(offset, missing_type);
8526                    if !stack.is_empty() {
8527                        break;
8528                    }
8529                }
8530                Tsinfo::TxTypes(val) => {
8531                    (stack, missing) = val.lookup_attr(offset, missing_type);
8532                    if !stack.is_empty() {
8533                        break;
8534                    }
8535                }
8536                Tsinfo::RxFilters(val) => {
8537                    (stack, missing) = val.lookup_attr(offset, missing_type);
8538                    if !stack.is_empty() {
8539                        break;
8540                    }
8541                }
8542                Tsinfo::PhcIndex(val) => {
8543                    if last_off == offset {
8544                        stack.push(("PhcIndex", last_off));
8545                        break;
8546                    }
8547                }
8548                Tsinfo::Stats(val) => {
8549                    (stack, missing) = val.lookup_attr(offset, missing_type);
8550                    if !stack.is_empty() {
8551                        break;
8552                    }
8553                }
8554                Tsinfo::HwtstampProvider(val) => {
8555                    (stack, missing) = val.lookup_attr(offset, missing_type);
8556                    if !stack.is_empty() {
8557                        break;
8558                    }
8559                }
8560                Tsinfo::HwtstampSource(val) => {
8561                    if last_off == offset {
8562                        stack.push(("HwtstampSource", last_off));
8563                        break;
8564                    }
8565                }
8566                Tsinfo::HwtstampPhyindex(val) => {
8567                    if last_off == offset {
8568                        stack.push(("HwtstampPhyindex", last_off));
8569                        break;
8570                    }
8571                }
8572                _ => {}
8573            };
8574            last_off = cur + attrs.pos;
8575        }
8576        if !stack.is_empty() {
8577            stack.push(("Tsinfo", cur));
8578        }
8579        (stack, missing)
8580    }
8581}
8582#[derive(Clone)]
8583pub enum CableResult {
8584    #[doc = "ETHTOOL_A_CABLE_PAIR\n"]
8585    Pair(u8),
8586    #[doc = "ETHTOOL_A_CABLE_RESULT_CODE\n"]
8587    Code(u8),
8588    #[doc = "ETHTOOL_A_CABLE_INF_SRC\n"]
8589    Src(u32),
8590}
8591impl<'a> IterableCableResult<'a> {
8592    #[doc = "ETHTOOL_A_CABLE_PAIR\n"]
8593    pub fn get_pair(&self) -> Result<u8, ErrorContext> {
8594        let mut iter = self.clone();
8595        iter.pos = 0;
8596        for attr in iter {
8597            if let Ok(CableResult::Pair(val)) = attr {
8598                return Ok(val);
8599            }
8600        }
8601        Err(ErrorContext::new_missing(
8602            "CableResult",
8603            "Pair",
8604            self.orig_loc,
8605            self.buf.as_ptr() as usize,
8606        ))
8607    }
8608    #[doc = "ETHTOOL_A_CABLE_RESULT_CODE\n"]
8609    pub fn get_code(&self) -> Result<u8, ErrorContext> {
8610        let mut iter = self.clone();
8611        iter.pos = 0;
8612        for attr in iter {
8613            if let Ok(CableResult::Code(val)) = attr {
8614                return Ok(val);
8615            }
8616        }
8617        Err(ErrorContext::new_missing(
8618            "CableResult",
8619            "Code",
8620            self.orig_loc,
8621            self.buf.as_ptr() as usize,
8622        ))
8623    }
8624    #[doc = "ETHTOOL_A_CABLE_INF_SRC\n"]
8625    pub fn get_src(&self) -> Result<u32, ErrorContext> {
8626        let mut iter = self.clone();
8627        iter.pos = 0;
8628        for attr in iter {
8629            if let Ok(CableResult::Src(val)) = attr {
8630                return Ok(val);
8631            }
8632        }
8633        Err(ErrorContext::new_missing(
8634            "CableResult",
8635            "Src",
8636            self.orig_loc,
8637            self.buf.as_ptr() as usize,
8638        ))
8639    }
8640}
8641impl CableResult {
8642    pub fn new<'a>(buf: &'a [u8]) -> IterableCableResult<'a> {
8643        IterableCableResult::with_loc(buf, buf.as_ptr() as usize)
8644    }
8645    fn attr_from_type(r#type: u16) -> Option<&'static str> {
8646        let res = match r#type {
8647            0u16 => "Unspec",
8648            1u16 => "Pair",
8649            2u16 => "Code",
8650            3u16 => "Src",
8651            _ => return None,
8652        };
8653        Some(res)
8654    }
8655}
8656#[derive(Clone, Copy, Default)]
8657pub struct IterableCableResult<'a> {
8658    buf: &'a [u8],
8659    pos: usize,
8660    orig_loc: usize,
8661}
8662impl<'a> IterableCableResult<'a> {
8663    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8664        Self {
8665            buf,
8666            pos: 0,
8667            orig_loc,
8668        }
8669    }
8670    pub fn get_buf(&self) -> &'a [u8] {
8671        self.buf
8672    }
8673}
8674impl<'a> Iterator for IterableCableResult<'a> {
8675    type Item = Result<CableResult, ErrorContext>;
8676    fn next(&mut self) -> Option<Self::Item> {
8677        let mut pos;
8678        let mut r#type;
8679        loop {
8680            pos = self.pos;
8681            r#type = None;
8682            if self.buf.len() == self.pos {
8683                return None;
8684            }
8685            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8686                self.pos = self.buf.len();
8687                break;
8688            };
8689            r#type = Some(header.r#type);
8690            let res = match header.r#type {
8691                1u16 => CableResult::Pair({
8692                    let res = parse_u8(next);
8693                    let Some(val) = res else { break };
8694                    val
8695                }),
8696                2u16 => CableResult::Code({
8697                    let res = parse_u8(next);
8698                    let Some(val) = res else { break };
8699                    val
8700                }),
8701                3u16 => CableResult::Src({
8702                    let res = parse_u32(next);
8703                    let Some(val) = res else { break };
8704                    val
8705                }),
8706                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8707                n => continue,
8708            };
8709            return Some(Ok(res));
8710        }
8711        Some(Err(ErrorContext::new(
8712            "CableResult",
8713            r#type.and_then(|t| CableResult::attr_from_type(t)),
8714            self.orig_loc,
8715            self.buf.as_ptr().wrapping_add(pos) as usize,
8716        )))
8717    }
8718}
8719impl std::fmt::Debug for IterableCableResult<'_> {
8720    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8721        let mut fmt = f.debug_struct("CableResult");
8722        for attr in self.clone() {
8723            let attr = match attr {
8724                Ok(a) => a,
8725                Err(err) => {
8726                    fmt.finish()?;
8727                    f.write_str("Err(")?;
8728                    err.fmt(f)?;
8729                    return f.write_str(")");
8730                }
8731            };
8732            match attr {
8733                CableResult::Pair(val) => fmt.field("Pair", &val),
8734                CableResult::Code(val) => fmt.field("Code", &val),
8735                CableResult::Src(val) => fmt.field("Src", &val),
8736            };
8737        }
8738        fmt.finish()
8739    }
8740}
8741impl IterableCableResult<'_> {
8742    pub fn lookup_attr(
8743        &self,
8744        offset: usize,
8745        missing_type: Option<u16>,
8746    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8747        let mut stack = Vec::new();
8748        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8749        if missing_type.is_some() && cur == offset {
8750            stack.push(("CableResult", offset));
8751            return (
8752                stack,
8753                missing_type.and_then(|t| CableResult::attr_from_type(t)),
8754            );
8755        }
8756        if cur > offset || cur + self.buf.len() < offset {
8757            return (stack, None);
8758        }
8759        let mut attrs = self.clone();
8760        let mut last_off = cur + attrs.pos;
8761        while let Some(attr) = attrs.next() {
8762            let Ok(attr) = attr else { break };
8763            match attr {
8764                CableResult::Pair(val) => {
8765                    if last_off == offset {
8766                        stack.push(("Pair", last_off));
8767                        break;
8768                    }
8769                }
8770                CableResult::Code(val) => {
8771                    if last_off == offset {
8772                        stack.push(("Code", last_off));
8773                        break;
8774                    }
8775                }
8776                CableResult::Src(val) => {
8777                    if last_off == offset {
8778                        stack.push(("Src", last_off));
8779                        break;
8780                    }
8781                }
8782                _ => {}
8783            };
8784            last_off = cur + attrs.pos;
8785        }
8786        if !stack.is_empty() {
8787            stack.push(("CableResult", cur));
8788        }
8789        (stack, None)
8790    }
8791}
8792#[derive(Clone)]
8793pub enum CableFaultLength {
8794    Pair(u8),
8795    Cm(u32),
8796    Src(u32),
8797}
8798impl<'a> IterableCableFaultLength<'a> {
8799    pub fn get_pair(&self) -> Result<u8, ErrorContext> {
8800        let mut iter = self.clone();
8801        iter.pos = 0;
8802        for attr in iter {
8803            if let Ok(CableFaultLength::Pair(val)) = attr {
8804                return Ok(val);
8805            }
8806        }
8807        Err(ErrorContext::new_missing(
8808            "CableFaultLength",
8809            "Pair",
8810            self.orig_loc,
8811            self.buf.as_ptr() as usize,
8812        ))
8813    }
8814    pub fn get_cm(&self) -> Result<u32, ErrorContext> {
8815        let mut iter = self.clone();
8816        iter.pos = 0;
8817        for attr in iter {
8818            if let Ok(CableFaultLength::Cm(val)) = attr {
8819                return Ok(val);
8820            }
8821        }
8822        Err(ErrorContext::new_missing(
8823            "CableFaultLength",
8824            "Cm",
8825            self.orig_loc,
8826            self.buf.as_ptr() as usize,
8827        ))
8828    }
8829    pub fn get_src(&self) -> Result<u32, ErrorContext> {
8830        let mut iter = self.clone();
8831        iter.pos = 0;
8832        for attr in iter {
8833            if let Ok(CableFaultLength::Src(val)) = attr {
8834                return Ok(val);
8835            }
8836        }
8837        Err(ErrorContext::new_missing(
8838            "CableFaultLength",
8839            "Src",
8840            self.orig_loc,
8841            self.buf.as_ptr() as usize,
8842        ))
8843    }
8844}
8845impl CableFaultLength {
8846    pub fn new<'a>(buf: &'a [u8]) -> IterableCableFaultLength<'a> {
8847        IterableCableFaultLength::with_loc(buf, buf.as_ptr() as usize)
8848    }
8849    fn attr_from_type(r#type: u16) -> Option<&'static str> {
8850        let res = match r#type {
8851            0u16 => "Unspec",
8852            1u16 => "Pair",
8853            2u16 => "Cm",
8854            3u16 => "Src",
8855            _ => return None,
8856        };
8857        Some(res)
8858    }
8859}
8860#[derive(Clone, Copy, Default)]
8861pub struct IterableCableFaultLength<'a> {
8862    buf: &'a [u8],
8863    pos: usize,
8864    orig_loc: usize,
8865}
8866impl<'a> IterableCableFaultLength<'a> {
8867    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8868        Self {
8869            buf,
8870            pos: 0,
8871            orig_loc,
8872        }
8873    }
8874    pub fn get_buf(&self) -> &'a [u8] {
8875        self.buf
8876    }
8877}
8878impl<'a> Iterator for IterableCableFaultLength<'a> {
8879    type Item = Result<CableFaultLength, ErrorContext>;
8880    fn next(&mut self) -> Option<Self::Item> {
8881        let mut pos;
8882        let mut r#type;
8883        loop {
8884            pos = self.pos;
8885            r#type = None;
8886            if self.buf.len() == self.pos {
8887                return None;
8888            }
8889            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8890                self.pos = self.buf.len();
8891                break;
8892            };
8893            r#type = Some(header.r#type);
8894            let res = match header.r#type {
8895                1u16 => CableFaultLength::Pair({
8896                    let res = parse_u8(next);
8897                    let Some(val) = res else { break };
8898                    val
8899                }),
8900                2u16 => CableFaultLength::Cm({
8901                    let res = parse_u32(next);
8902                    let Some(val) = res else { break };
8903                    val
8904                }),
8905                3u16 => CableFaultLength::Src({
8906                    let res = parse_u32(next);
8907                    let Some(val) = res else { break };
8908                    val
8909                }),
8910                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8911                n => continue,
8912            };
8913            return Some(Ok(res));
8914        }
8915        Some(Err(ErrorContext::new(
8916            "CableFaultLength",
8917            r#type.and_then(|t| CableFaultLength::attr_from_type(t)),
8918            self.orig_loc,
8919            self.buf.as_ptr().wrapping_add(pos) as usize,
8920        )))
8921    }
8922}
8923impl std::fmt::Debug for IterableCableFaultLength<'_> {
8924    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8925        let mut fmt = f.debug_struct("CableFaultLength");
8926        for attr in self.clone() {
8927            let attr = match attr {
8928                Ok(a) => a,
8929                Err(err) => {
8930                    fmt.finish()?;
8931                    f.write_str("Err(")?;
8932                    err.fmt(f)?;
8933                    return f.write_str(")");
8934                }
8935            };
8936            match attr {
8937                CableFaultLength::Pair(val) => fmt.field("Pair", &val),
8938                CableFaultLength::Cm(val) => fmt.field("Cm", &val),
8939                CableFaultLength::Src(val) => fmt.field("Src", &val),
8940            };
8941        }
8942        fmt.finish()
8943    }
8944}
8945impl IterableCableFaultLength<'_> {
8946    pub fn lookup_attr(
8947        &self,
8948        offset: usize,
8949        missing_type: Option<u16>,
8950    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8951        let mut stack = Vec::new();
8952        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8953        if missing_type.is_some() && cur == offset {
8954            stack.push(("CableFaultLength", offset));
8955            return (
8956                stack,
8957                missing_type.and_then(|t| CableFaultLength::attr_from_type(t)),
8958            );
8959        }
8960        if cur > offset || cur + self.buf.len() < offset {
8961            return (stack, None);
8962        }
8963        let mut attrs = self.clone();
8964        let mut last_off = cur + attrs.pos;
8965        while let Some(attr) = attrs.next() {
8966            let Ok(attr) = attr else { break };
8967            match attr {
8968                CableFaultLength::Pair(val) => {
8969                    if last_off == offset {
8970                        stack.push(("Pair", last_off));
8971                        break;
8972                    }
8973                }
8974                CableFaultLength::Cm(val) => {
8975                    if last_off == offset {
8976                        stack.push(("Cm", last_off));
8977                        break;
8978                    }
8979                }
8980                CableFaultLength::Src(val) => {
8981                    if last_off == offset {
8982                        stack.push(("Src", last_off));
8983                        break;
8984                    }
8985                }
8986                _ => {}
8987            };
8988            last_off = cur + attrs.pos;
8989        }
8990        if !stack.is_empty() {
8991            stack.push(("CableFaultLength", cur));
8992        }
8993        (stack, None)
8994    }
8995}
8996#[derive(Clone)]
8997pub enum CableNest<'a> {
8998    Result(IterableCableResult<'a>),
8999    FaultLength(IterableCableFaultLength<'a>),
9000}
9001impl<'a> IterableCableNest<'a> {
9002    pub fn get_result(&self) -> Result<IterableCableResult<'a>, ErrorContext> {
9003        let mut iter = self.clone();
9004        iter.pos = 0;
9005        for attr in iter {
9006            if let Ok(CableNest::Result(val)) = attr {
9007                return Ok(val);
9008            }
9009        }
9010        Err(ErrorContext::new_missing(
9011            "CableNest",
9012            "Result",
9013            self.orig_loc,
9014            self.buf.as_ptr() as usize,
9015        ))
9016    }
9017    pub fn get_fault_length(&self) -> Result<IterableCableFaultLength<'a>, ErrorContext> {
9018        let mut iter = self.clone();
9019        iter.pos = 0;
9020        for attr in iter {
9021            if let Ok(CableNest::FaultLength(val)) = attr {
9022                return Ok(val);
9023            }
9024        }
9025        Err(ErrorContext::new_missing(
9026            "CableNest",
9027            "FaultLength",
9028            self.orig_loc,
9029            self.buf.as_ptr() as usize,
9030        ))
9031    }
9032}
9033impl CableNest<'_> {
9034    pub fn new<'a>(buf: &'a [u8]) -> IterableCableNest<'a> {
9035        IterableCableNest::with_loc(buf, buf.as_ptr() as usize)
9036    }
9037    fn attr_from_type(r#type: u16) -> Option<&'static str> {
9038        let res = match r#type {
9039            0u16 => "Unspec",
9040            1u16 => "Result",
9041            2u16 => "FaultLength",
9042            _ => return None,
9043        };
9044        Some(res)
9045    }
9046}
9047#[derive(Clone, Copy, Default)]
9048pub struct IterableCableNest<'a> {
9049    buf: &'a [u8],
9050    pos: usize,
9051    orig_loc: usize,
9052}
9053impl<'a> IterableCableNest<'a> {
9054    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9055        Self {
9056            buf,
9057            pos: 0,
9058            orig_loc,
9059        }
9060    }
9061    pub fn get_buf(&self) -> &'a [u8] {
9062        self.buf
9063    }
9064}
9065impl<'a> Iterator for IterableCableNest<'a> {
9066    type Item = Result<CableNest<'a>, ErrorContext>;
9067    fn next(&mut self) -> Option<Self::Item> {
9068        let mut pos;
9069        let mut r#type;
9070        loop {
9071            pos = self.pos;
9072            r#type = None;
9073            if self.buf.len() == self.pos {
9074                return None;
9075            }
9076            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9077                self.pos = self.buf.len();
9078                break;
9079            };
9080            r#type = Some(header.r#type);
9081            let res = match header.r#type {
9082                1u16 => CableNest::Result({
9083                    let res = Some(IterableCableResult::with_loc(next, self.orig_loc));
9084                    let Some(val) = res else { break };
9085                    val
9086                }),
9087                2u16 => CableNest::FaultLength({
9088                    let res = Some(IterableCableFaultLength::with_loc(next, self.orig_loc));
9089                    let Some(val) = res else { break };
9090                    val
9091                }),
9092                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9093                n => continue,
9094            };
9095            return Some(Ok(res));
9096        }
9097        Some(Err(ErrorContext::new(
9098            "CableNest",
9099            r#type.and_then(|t| CableNest::attr_from_type(t)),
9100            self.orig_loc,
9101            self.buf.as_ptr().wrapping_add(pos) as usize,
9102        )))
9103    }
9104}
9105impl<'a> std::fmt::Debug for IterableCableNest<'_> {
9106    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9107        let mut fmt = f.debug_struct("CableNest");
9108        for attr in self.clone() {
9109            let attr = match attr {
9110                Ok(a) => a,
9111                Err(err) => {
9112                    fmt.finish()?;
9113                    f.write_str("Err(")?;
9114                    err.fmt(f)?;
9115                    return f.write_str(")");
9116                }
9117            };
9118            match attr {
9119                CableNest::Result(val) => fmt.field("Result", &val),
9120                CableNest::FaultLength(val) => fmt.field("FaultLength", &val),
9121            };
9122        }
9123        fmt.finish()
9124    }
9125}
9126impl IterableCableNest<'_> {
9127    pub fn lookup_attr(
9128        &self,
9129        offset: usize,
9130        missing_type: Option<u16>,
9131    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9132        let mut stack = Vec::new();
9133        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9134        if missing_type.is_some() && cur == offset {
9135            stack.push(("CableNest", offset));
9136            return (
9137                stack,
9138                missing_type.and_then(|t| CableNest::attr_from_type(t)),
9139            );
9140        }
9141        if cur > offset || cur + self.buf.len() < offset {
9142            return (stack, None);
9143        }
9144        let mut attrs = self.clone();
9145        let mut last_off = cur + attrs.pos;
9146        let mut missing = None;
9147        while let Some(attr) = attrs.next() {
9148            let Ok(attr) = attr else { break };
9149            match attr {
9150                CableNest::Result(val) => {
9151                    (stack, missing) = val.lookup_attr(offset, missing_type);
9152                    if !stack.is_empty() {
9153                        break;
9154                    }
9155                }
9156                CableNest::FaultLength(val) => {
9157                    (stack, missing) = val.lookup_attr(offset, missing_type);
9158                    if !stack.is_empty() {
9159                        break;
9160                    }
9161                }
9162                _ => {}
9163            };
9164            last_off = cur + attrs.pos;
9165        }
9166        if !stack.is_empty() {
9167            stack.push(("CableNest", cur));
9168        }
9169        (stack, missing)
9170    }
9171}
9172#[derive(Clone)]
9173pub enum CableTest<'a> {
9174    Header(IterableHeader<'a>),
9175}
9176impl<'a> IterableCableTest<'a> {
9177    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
9178        let mut iter = self.clone();
9179        iter.pos = 0;
9180        for attr in iter {
9181            if let Ok(CableTest::Header(val)) = attr {
9182                return Ok(val);
9183            }
9184        }
9185        Err(ErrorContext::new_missing(
9186            "CableTest",
9187            "Header",
9188            self.orig_loc,
9189            self.buf.as_ptr() as usize,
9190        ))
9191    }
9192}
9193impl CableTest<'_> {
9194    pub fn new<'a>(buf: &'a [u8]) -> IterableCableTest<'a> {
9195        IterableCableTest::with_loc(buf, buf.as_ptr() as usize)
9196    }
9197    fn attr_from_type(r#type: u16) -> Option<&'static str> {
9198        let res = match r#type {
9199            0u16 => "Unspec",
9200            1u16 => "Header",
9201            _ => return None,
9202        };
9203        Some(res)
9204    }
9205}
9206#[derive(Clone, Copy, Default)]
9207pub struct IterableCableTest<'a> {
9208    buf: &'a [u8],
9209    pos: usize,
9210    orig_loc: usize,
9211}
9212impl<'a> IterableCableTest<'a> {
9213    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9214        Self {
9215            buf,
9216            pos: 0,
9217            orig_loc,
9218        }
9219    }
9220    pub fn get_buf(&self) -> &'a [u8] {
9221        self.buf
9222    }
9223}
9224impl<'a> Iterator for IterableCableTest<'a> {
9225    type Item = Result<CableTest<'a>, ErrorContext>;
9226    fn next(&mut self) -> Option<Self::Item> {
9227        let mut pos;
9228        let mut r#type;
9229        loop {
9230            pos = self.pos;
9231            r#type = None;
9232            if self.buf.len() == self.pos {
9233                return None;
9234            }
9235            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9236                self.pos = self.buf.len();
9237                break;
9238            };
9239            r#type = Some(header.r#type);
9240            let res = match header.r#type {
9241                1u16 => CableTest::Header({
9242                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
9243                    let Some(val) = res else { break };
9244                    val
9245                }),
9246                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9247                n => continue,
9248            };
9249            return Some(Ok(res));
9250        }
9251        Some(Err(ErrorContext::new(
9252            "CableTest",
9253            r#type.and_then(|t| CableTest::attr_from_type(t)),
9254            self.orig_loc,
9255            self.buf.as_ptr().wrapping_add(pos) as usize,
9256        )))
9257    }
9258}
9259impl<'a> std::fmt::Debug for IterableCableTest<'_> {
9260    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9261        let mut fmt = f.debug_struct("CableTest");
9262        for attr in self.clone() {
9263            let attr = match attr {
9264                Ok(a) => a,
9265                Err(err) => {
9266                    fmt.finish()?;
9267                    f.write_str("Err(")?;
9268                    err.fmt(f)?;
9269                    return f.write_str(")");
9270                }
9271            };
9272            match attr {
9273                CableTest::Header(val) => fmt.field("Header", &val),
9274            };
9275        }
9276        fmt.finish()
9277    }
9278}
9279impl IterableCableTest<'_> {
9280    pub fn lookup_attr(
9281        &self,
9282        offset: usize,
9283        missing_type: Option<u16>,
9284    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9285        let mut stack = Vec::new();
9286        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9287        if missing_type.is_some() && cur == offset {
9288            stack.push(("CableTest", offset));
9289            return (
9290                stack,
9291                missing_type.and_then(|t| CableTest::attr_from_type(t)),
9292            );
9293        }
9294        if cur > offset || cur + self.buf.len() < offset {
9295            return (stack, None);
9296        }
9297        let mut attrs = self.clone();
9298        let mut last_off = cur + attrs.pos;
9299        let mut missing = None;
9300        while let Some(attr) = attrs.next() {
9301            let Ok(attr) = attr else { break };
9302            match attr {
9303                CableTest::Header(val) => {
9304                    (stack, missing) = val.lookup_attr(offset, missing_type);
9305                    if !stack.is_empty() {
9306                        break;
9307                    }
9308                }
9309                _ => {}
9310            };
9311            last_off = cur + attrs.pos;
9312        }
9313        if !stack.is_empty() {
9314            stack.push(("CableTest", cur));
9315        }
9316        (stack, missing)
9317    }
9318}
9319#[derive(Clone)]
9320pub enum CableTestNtf<'a> {
9321    Header(IterableHeader<'a>),
9322    #[doc = "[STARTED]{#started}/\\_COMPLETE\n"]
9323    Status(u8),
9324    Nest(IterableCableNest<'a>),
9325}
9326impl<'a> IterableCableTestNtf<'a> {
9327    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
9328        let mut iter = self.clone();
9329        iter.pos = 0;
9330        for attr in iter {
9331            if let Ok(CableTestNtf::Header(val)) = attr {
9332                return Ok(val);
9333            }
9334        }
9335        Err(ErrorContext::new_missing(
9336            "CableTestNtf",
9337            "Header",
9338            self.orig_loc,
9339            self.buf.as_ptr() as usize,
9340        ))
9341    }
9342    #[doc = "[STARTED]{#started}/\\_COMPLETE\n"]
9343    pub fn get_status(&self) -> Result<u8, ErrorContext> {
9344        let mut iter = self.clone();
9345        iter.pos = 0;
9346        for attr in iter {
9347            if let Ok(CableTestNtf::Status(val)) = attr {
9348                return Ok(val);
9349            }
9350        }
9351        Err(ErrorContext::new_missing(
9352            "CableTestNtf",
9353            "Status",
9354            self.orig_loc,
9355            self.buf.as_ptr() as usize,
9356        ))
9357    }
9358    pub fn get_nest(&self) -> Result<IterableCableNest<'a>, ErrorContext> {
9359        let mut iter = self.clone();
9360        iter.pos = 0;
9361        for attr in iter {
9362            if let Ok(CableTestNtf::Nest(val)) = attr {
9363                return Ok(val);
9364            }
9365        }
9366        Err(ErrorContext::new_missing(
9367            "CableTestNtf",
9368            "Nest",
9369            self.orig_loc,
9370            self.buf.as_ptr() as usize,
9371        ))
9372    }
9373}
9374impl CableTestNtf<'_> {
9375    pub fn new<'a>(buf: &'a [u8]) -> IterableCableTestNtf<'a> {
9376        IterableCableTestNtf::with_loc(buf, buf.as_ptr() as usize)
9377    }
9378    fn attr_from_type(r#type: u16) -> Option<&'static str> {
9379        let res = match r#type {
9380            0u16 => "Unspec",
9381            1u16 => "Header",
9382            2u16 => "Status",
9383            3u16 => "Nest",
9384            _ => return None,
9385        };
9386        Some(res)
9387    }
9388}
9389#[derive(Clone, Copy, Default)]
9390pub struct IterableCableTestNtf<'a> {
9391    buf: &'a [u8],
9392    pos: usize,
9393    orig_loc: usize,
9394}
9395impl<'a> IterableCableTestNtf<'a> {
9396    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9397        Self {
9398            buf,
9399            pos: 0,
9400            orig_loc,
9401        }
9402    }
9403    pub fn get_buf(&self) -> &'a [u8] {
9404        self.buf
9405    }
9406}
9407impl<'a> Iterator for IterableCableTestNtf<'a> {
9408    type Item = Result<CableTestNtf<'a>, ErrorContext>;
9409    fn next(&mut self) -> Option<Self::Item> {
9410        let mut pos;
9411        let mut r#type;
9412        loop {
9413            pos = self.pos;
9414            r#type = None;
9415            if self.buf.len() == self.pos {
9416                return None;
9417            }
9418            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9419                self.pos = self.buf.len();
9420                break;
9421            };
9422            r#type = Some(header.r#type);
9423            let res = match header.r#type {
9424                1u16 => CableTestNtf::Header({
9425                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
9426                    let Some(val) = res else { break };
9427                    val
9428                }),
9429                2u16 => CableTestNtf::Status({
9430                    let res = parse_u8(next);
9431                    let Some(val) = res else { break };
9432                    val
9433                }),
9434                3u16 => CableTestNtf::Nest({
9435                    let res = Some(IterableCableNest::with_loc(next, self.orig_loc));
9436                    let Some(val) = res else { break };
9437                    val
9438                }),
9439                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9440                n => continue,
9441            };
9442            return Some(Ok(res));
9443        }
9444        Some(Err(ErrorContext::new(
9445            "CableTestNtf",
9446            r#type.and_then(|t| CableTestNtf::attr_from_type(t)),
9447            self.orig_loc,
9448            self.buf.as_ptr().wrapping_add(pos) as usize,
9449        )))
9450    }
9451}
9452impl<'a> std::fmt::Debug for IterableCableTestNtf<'_> {
9453    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9454        let mut fmt = f.debug_struct("CableTestNtf");
9455        for attr in self.clone() {
9456            let attr = match attr {
9457                Ok(a) => a,
9458                Err(err) => {
9459                    fmt.finish()?;
9460                    f.write_str("Err(")?;
9461                    err.fmt(f)?;
9462                    return f.write_str(")");
9463                }
9464            };
9465            match attr {
9466                CableTestNtf::Header(val) => fmt.field("Header", &val),
9467                CableTestNtf::Status(val) => fmt.field("Status", &val),
9468                CableTestNtf::Nest(val) => fmt.field("Nest", &val),
9469            };
9470        }
9471        fmt.finish()
9472    }
9473}
9474impl IterableCableTestNtf<'_> {
9475    pub fn lookup_attr(
9476        &self,
9477        offset: usize,
9478        missing_type: Option<u16>,
9479    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9480        let mut stack = Vec::new();
9481        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9482        if missing_type.is_some() && cur == offset {
9483            stack.push(("CableTestNtf", offset));
9484            return (
9485                stack,
9486                missing_type.and_then(|t| CableTestNtf::attr_from_type(t)),
9487            );
9488        }
9489        if cur > offset || cur + self.buf.len() < offset {
9490            return (stack, None);
9491        }
9492        let mut attrs = self.clone();
9493        let mut last_off = cur + attrs.pos;
9494        let mut missing = None;
9495        while let Some(attr) = attrs.next() {
9496            let Ok(attr) = attr else { break };
9497            match attr {
9498                CableTestNtf::Header(val) => {
9499                    (stack, missing) = val.lookup_attr(offset, missing_type);
9500                    if !stack.is_empty() {
9501                        break;
9502                    }
9503                }
9504                CableTestNtf::Status(val) => {
9505                    if last_off == offset {
9506                        stack.push(("Status", last_off));
9507                        break;
9508                    }
9509                }
9510                CableTestNtf::Nest(val) => {
9511                    (stack, missing) = val.lookup_attr(offset, missing_type);
9512                    if !stack.is_empty() {
9513                        break;
9514                    }
9515                }
9516                _ => {}
9517            };
9518            last_off = cur + attrs.pos;
9519        }
9520        if !stack.is_empty() {
9521            stack.push(("CableTestNtf", cur));
9522        }
9523        (stack, missing)
9524    }
9525}
9526#[derive(Clone)]
9527pub enum CableTestTdrCfg {
9528    First(u32),
9529    Last(u32),
9530    Step(u32),
9531    Pair(u8),
9532}
9533impl<'a> IterableCableTestTdrCfg<'a> {
9534    pub fn get_first(&self) -> Result<u32, ErrorContext> {
9535        let mut iter = self.clone();
9536        iter.pos = 0;
9537        for attr in iter {
9538            if let Ok(CableTestTdrCfg::First(val)) = attr {
9539                return Ok(val);
9540            }
9541        }
9542        Err(ErrorContext::new_missing(
9543            "CableTestTdrCfg",
9544            "First",
9545            self.orig_loc,
9546            self.buf.as_ptr() as usize,
9547        ))
9548    }
9549    pub fn get_last(&self) -> Result<u32, ErrorContext> {
9550        let mut iter = self.clone();
9551        iter.pos = 0;
9552        for attr in iter {
9553            if let Ok(CableTestTdrCfg::Last(val)) = attr {
9554                return Ok(val);
9555            }
9556        }
9557        Err(ErrorContext::new_missing(
9558            "CableTestTdrCfg",
9559            "Last",
9560            self.orig_loc,
9561            self.buf.as_ptr() as usize,
9562        ))
9563    }
9564    pub fn get_step(&self) -> Result<u32, ErrorContext> {
9565        let mut iter = self.clone();
9566        iter.pos = 0;
9567        for attr in iter {
9568            if let Ok(CableTestTdrCfg::Step(val)) = attr {
9569                return Ok(val);
9570            }
9571        }
9572        Err(ErrorContext::new_missing(
9573            "CableTestTdrCfg",
9574            "Step",
9575            self.orig_loc,
9576            self.buf.as_ptr() as usize,
9577        ))
9578    }
9579    pub fn get_pair(&self) -> Result<u8, ErrorContext> {
9580        let mut iter = self.clone();
9581        iter.pos = 0;
9582        for attr in iter {
9583            if let Ok(CableTestTdrCfg::Pair(val)) = attr {
9584                return Ok(val);
9585            }
9586        }
9587        Err(ErrorContext::new_missing(
9588            "CableTestTdrCfg",
9589            "Pair",
9590            self.orig_loc,
9591            self.buf.as_ptr() as usize,
9592        ))
9593    }
9594}
9595impl CableTestTdrCfg {
9596    pub fn new<'a>(buf: &'a [u8]) -> IterableCableTestTdrCfg<'a> {
9597        IterableCableTestTdrCfg::with_loc(buf, buf.as_ptr() as usize)
9598    }
9599    fn attr_from_type(r#type: u16) -> Option<&'static str> {
9600        let res = match r#type {
9601            0u16 => "Unspec",
9602            1u16 => "First",
9603            2u16 => "Last",
9604            3u16 => "Step",
9605            4u16 => "Pair",
9606            _ => return None,
9607        };
9608        Some(res)
9609    }
9610}
9611#[derive(Clone, Copy, Default)]
9612pub struct IterableCableTestTdrCfg<'a> {
9613    buf: &'a [u8],
9614    pos: usize,
9615    orig_loc: usize,
9616}
9617impl<'a> IterableCableTestTdrCfg<'a> {
9618    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9619        Self {
9620            buf,
9621            pos: 0,
9622            orig_loc,
9623        }
9624    }
9625    pub fn get_buf(&self) -> &'a [u8] {
9626        self.buf
9627    }
9628}
9629impl<'a> Iterator for IterableCableTestTdrCfg<'a> {
9630    type Item = Result<CableTestTdrCfg, ErrorContext>;
9631    fn next(&mut self) -> Option<Self::Item> {
9632        let mut pos;
9633        let mut r#type;
9634        loop {
9635            pos = self.pos;
9636            r#type = None;
9637            if self.buf.len() == self.pos {
9638                return None;
9639            }
9640            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9641                self.pos = self.buf.len();
9642                break;
9643            };
9644            r#type = Some(header.r#type);
9645            let res = match header.r#type {
9646                1u16 => CableTestTdrCfg::First({
9647                    let res = parse_u32(next);
9648                    let Some(val) = res else { break };
9649                    val
9650                }),
9651                2u16 => CableTestTdrCfg::Last({
9652                    let res = parse_u32(next);
9653                    let Some(val) = res else { break };
9654                    val
9655                }),
9656                3u16 => CableTestTdrCfg::Step({
9657                    let res = parse_u32(next);
9658                    let Some(val) = res else { break };
9659                    val
9660                }),
9661                4u16 => CableTestTdrCfg::Pair({
9662                    let res = parse_u8(next);
9663                    let Some(val) = res else { break };
9664                    val
9665                }),
9666                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9667                n => continue,
9668            };
9669            return Some(Ok(res));
9670        }
9671        Some(Err(ErrorContext::new(
9672            "CableTestTdrCfg",
9673            r#type.and_then(|t| CableTestTdrCfg::attr_from_type(t)),
9674            self.orig_loc,
9675            self.buf.as_ptr().wrapping_add(pos) as usize,
9676        )))
9677    }
9678}
9679impl std::fmt::Debug for IterableCableTestTdrCfg<'_> {
9680    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9681        let mut fmt = f.debug_struct("CableTestTdrCfg");
9682        for attr in self.clone() {
9683            let attr = match attr {
9684                Ok(a) => a,
9685                Err(err) => {
9686                    fmt.finish()?;
9687                    f.write_str("Err(")?;
9688                    err.fmt(f)?;
9689                    return f.write_str(")");
9690                }
9691            };
9692            match attr {
9693                CableTestTdrCfg::First(val) => fmt.field("First", &val),
9694                CableTestTdrCfg::Last(val) => fmt.field("Last", &val),
9695                CableTestTdrCfg::Step(val) => fmt.field("Step", &val),
9696                CableTestTdrCfg::Pair(val) => fmt.field("Pair", &val),
9697            };
9698        }
9699        fmt.finish()
9700    }
9701}
9702impl IterableCableTestTdrCfg<'_> {
9703    pub fn lookup_attr(
9704        &self,
9705        offset: usize,
9706        missing_type: Option<u16>,
9707    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9708        let mut stack = Vec::new();
9709        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9710        if missing_type.is_some() && cur == offset {
9711            stack.push(("CableTestTdrCfg", offset));
9712            return (
9713                stack,
9714                missing_type.and_then(|t| CableTestTdrCfg::attr_from_type(t)),
9715            );
9716        }
9717        if cur > offset || cur + self.buf.len() < offset {
9718            return (stack, None);
9719        }
9720        let mut attrs = self.clone();
9721        let mut last_off = cur + attrs.pos;
9722        while let Some(attr) = attrs.next() {
9723            let Ok(attr) = attr else { break };
9724            match attr {
9725                CableTestTdrCfg::First(val) => {
9726                    if last_off == offset {
9727                        stack.push(("First", last_off));
9728                        break;
9729                    }
9730                }
9731                CableTestTdrCfg::Last(val) => {
9732                    if last_off == offset {
9733                        stack.push(("Last", last_off));
9734                        break;
9735                    }
9736                }
9737                CableTestTdrCfg::Step(val) => {
9738                    if last_off == offset {
9739                        stack.push(("Step", last_off));
9740                        break;
9741                    }
9742                }
9743                CableTestTdrCfg::Pair(val) => {
9744                    if last_off == offset {
9745                        stack.push(("Pair", last_off));
9746                        break;
9747                    }
9748                }
9749                _ => {}
9750            };
9751            last_off = cur + attrs.pos;
9752        }
9753        if !stack.is_empty() {
9754            stack.push(("CableTestTdrCfg", cur));
9755        }
9756        (stack, None)
9757    }
9758}
9759#[derive(Clone)]
9760pub enum CableTestTdrNtf<'a> {
9761    Header(IterableHeader<'a>),
9762    Status(u8),
9763    Nest(IterableCableNest<'a>),
9764}
9765impl<'a> IterableCableTestTdrNtf<'a> {
9766    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
9767        let mut iter = self.clone();
9768        iter.pos = 0;
9769        for attr in iter {
9770            if let Ok(CableTestTdrNtf::Header(val)) = attr {
9771                return Ok(val);
9772            }
9773        }
9774        Err(ErrorContext::new_missing(
9775            "CableTestTdrNtf",
9776            "Header",
9777            self.orig_loc,
9778            self.buf.as_ptr() as usize,
9779        ))
9780    }
9781    pub fn get_status(&self) -> Result<u8, ErrorContext> {
9782        let mut iter = self.clone();
9783        iter.pos = 0;
9784        for attr in iter {
9785            if let Ok(CableTestTdrNtf::Status(val)) = attr {
9786                return Ok(val);
9787            }
9788        }
9789        Err(ErrorContext::new_missing(
9790            "CableTestTdrNtf",
9791            "Status",
9792            self.orig_loc,
9793            self.buf.as_ptr() as usize,
9794        ))
9795    }
9796    pub fn get_nest(&self) -> Result<IterableCableNest<'a>, ErrorContext> {
9797        let mut iter = self.clone();
9798        iter.pos = 0;
9799        for attr in iter {
9800            if let Ok(CableTestTdrNtf::Nest(val)) = attr {
9801                return Ok(val);
9802            }
9803        }
9804        Err(ErrorContext::new_missing(
9805            "CableTestTdrNtf",
9806            "Nest",
9807            self.orig_loc,
9808            self.buf.as_ptr() as usize,
9809        ))
9810    }
9811}
9812impl CableTestTdrNtf<'_> {
9813    pub fn new<'a>(buf: &'a [u8]) -> IterableCableTestTdrNtf<'a> {
9814        IterableCableTestTdrNtf::with_loc(buf, buf.as_ptr() as usize)
9815    }
9816    fn attr_from_type(r#type: u16) -> Option<&'static str> {
9817        let res = match r#type {
9818            0u16 => "Unspec",
9819            1u16 => "Header",
9820            2u16 => "Status",
9821            3u16 => "Nest",
9822            _ => return None,
9823        };
9824        Some(res)
9825    }
9826}
9827#[derive(Clone, Copy, Default)]
9828pub struct IterableCableTestTdrNtf<'a> {
9829    buf: &'a [u8],
9830    pos: usize,
9831    orig_loc: usize,
9832}
9833impl<'a> IterableCableTestTdrNtf<'a> {
9834    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9835        Self {
9836            buf,
9837            pos: 0,
9838            orig_loc,
9839        }
9840    }
9841    pub fn get_buf(&self) -> &'a [u8] {
9842        self.buf
9843    }
9844}
9845impl<'a> Iterator for IterableCableTestTdrNtf<'a> {
9846    type Item = Result<CableTestTdrNtf<'a>, ErrorContext>;
9847    fn next(&mut self) -> Option<Self::Item> {
9848        let mut pos;
9849        let mut r#type;
9850        loop {
9851            pos = self.pos;
9852            r#type = None;
9853            if self.buf.len() == self.pos {
9854                return None;
9855            }
9856            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9857                self.pos = self.buf.len();
9858                break;
9859            };
9860            r#type = Some(header.r#type);
9861            let res = match header.r#type {
9862                1u16 => CableTestTdrNtf::Header({
9863                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
9864                    let Some(val) = res else { break };
9865                    val
9866                }),
9867                2u16 => CableTestTdrNtf::Status({
9868                    let res = parse_u8(next);
9869                    let Some(val) = res else { break };
9870                    val
9871                }),
9872                3u16 => CableTestTdrNtf::Nest({
9873                    let res = Some(IterableCableNest::with_loc(next, self.orig_loc));
9874                    let Some(val) = res else { break };
9875                    val
9876                }),
9877                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9878                n => continue,
9879            };
9880            return Some(Ok(res));
9881        }
9882        Some(Err(ErrorContext::new(
9883            "CableTestTdrNtf",
9884            r#type.and_then(|t| CableTestTdrNtf::attr_from_type(t)),
9885            self.orig_loc,
9886            self.buf.as_ptr().wrapping_add(pos) as usize,
9887        )))
9888    }
9889}
9890impl<'a> std::fmt::Debug for IterableCableTestTdrNtf<'_> {
9891    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9892        let mut fmt = f.debug_struct("CableTestTdrNtf");
9893        for attr in self.clone() {
9894            let attr = match attr {
9895                Ok(a) => a,
9896                Err(err) => {
9897                    fmt.finish()?;
9898                    f.write_str("Err(")?;
9899                    err.fmt(f)?;
9900                    return f.write_str(")");
9901                }
9902            };
9903            match attr {
9904                CableTestTdrNtf::Header(val) => fmt.field("Header", &val),
9905                CableTestTdrNtf::Status(val) => fmt.field("Status", &val),
9906                CableTestTdrNtf::Nest(val) => fmt.field("Nest", &val),
9907            };
9908        }
9909        fmt.finish()
9910    }
9911}
9912impl IterableCableTestTdrNtf<'_> {
9913    pub fn lookup_attr(
9914        &self,
9915        offset: usize,
9916        missing_type: Option<u16>,
9917    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9918        let mut stack = Vec::new();
9919        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9920        if missing_type.is_some() && cur == offset {
9921            stack.push(("CableTestTdrNtf", offset));
9922            return (
9923                stack,
9924                missing_type.and_then(|t| CableTestTdrNtf::attr_from_type(t)),
9925            );
9926        }
9927        if cur > offset || cur + self.buf.len() < offset {
9928            return (stack, None);
9929        }
9930        let mut attrs = self.clone();
9931        let mut last_off = cur + attrs.pos;
9932        let mut missing = None;
9933        while let Some(attr) = attrs.next() {
9934            let Ok(attr) = attr else { break };
9935            match attr {
9936                CableTestTdrNtf::Header(val) => {
9937                    (stack, missing) = val.lookup_attr(offset, missing_type);
9938                    if !stack.is_empty() {
9939                        break;
9940                    }
9941                }
9942                CableTestTdrNtf::Status(val) => {
9943                    if last_off == offset {
9944                        stack.push(("Status", last_off));
9945                        break;
9946                    }
9947                }
9948                CableTestTdrNtf::Nest(val) => {
9949                    (stack, missing) = val.lookup_attr(offset, missing_type);
9950                    if !stack.is_empty() {
9951                        break;
9952                    }
9953                }
9954                _ => {}
9955            };
9956            last_off = cur + attrs.pos;
9957        }
9958        if !stack.is_empty() {
9959            stack.push(("CableTestTdrNtf", cur));
9960        }
9961        (stack, missing)
9962    }
9963}
9964#[derive(Clone)]
9965pub enum CableTestTdr<'a> {
9966    Header(IterableHeader<'a>),
9967    Cfg(IterableCableTestTdrCfg<'a>),
9968}
9969impl<'a> IterableCableTestTdr<'a> {
9970    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
9971        let mut iter = self.clone();
9972        iter.pos = 0;
9973        for attr in iter {
9974            if let Ok(CableTestTdr::Header(val)) = attr {
9975                return Ok(val);
9976            }
9977        }
9978        Err(ErrorContext::new_missing(
9979            "CableTestTdr",
9980            "Header",
9981            self.orig_loc,
9982            self.buf.as_ptr() as usize,
9983        ))
9984    }
9985    pub fn get_cfg(&self) -> Result<IterableCableTestTdrCfg<'a>, ErrorContext> {
9986        let mut iter = self.clone();
9987        iter.pos = 0;
9988        for attr in iter {
9989            if let Ok(CableTestTdr::Cfg(val)) = attr {
9990                return Ok(val);
9991            }
9992        }
9993        Err(ErrorContext::new_missing(
9994            "CableTestTdr",
9995            "Cfg",
9996            self.orig_loc,
9997            self.buf.as_ptr() as usize,
9998        ))
9999    }
10000}
10001impl CableTestTdr<'_> {
10002    pub fn new<'a>(buf: &'a [u8]) -> IterableCableTestTdr<'a> {
10003        IterableCableTestTdr::with_loc(buf, buf.as_ptr() as usize)
10004    }
10005    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10006        let res = match r#type {
10007            0u16 => "Unspec",
10008            1u16 => "Header",
10009            2u16 => "Cfg",
10010            _ => return None,
10011        };
10012        Some(res)
10013    }
10014}
10015#[derive(Clone, Copy, Default)]
10016pub struct IterableCableTestTdr<'a> {
10017    buf: &'a [u8],
10018    pos: usize,
10019    orig_loc: usize,
10020}
10021impl<'a> IterableCableTestTdr<'a> {
10022    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10023        Self {
10024            buf,
10025            pos: 0,
10026            orig_loc,
10027        }
10028    }
10029    pub fn get_buf(&self) -> &'a [u8] {
10030        self.buf
10031    }
10032}
10033impl<'a> Iterator for IterableCableTestTdr<'a> {
10034    type Item = Result<CableTestTdr<'a>, ErrorContext>;
10035    fn next(&mut self) -> Option<Self::Item> {
10036        let mut pos;
10037        let mut r#type;
10038        loop {
10039            pos = self.pos;
10040            r#type = None;
10041            if self.buf.len() == self.pos {
10042                return None;
10043            }
10044            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10045                self.pos = self.buf.len();
10046                break;
10047            };
10048            r#type = Some(header.r#type);
10049            let res = match header.r#type {
10050                1u16 => CableTestTdr::Header({
10051                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
10052                    let Some(val) = res else { break };
10053                    val
10054                }),
10055                2u16 => CableTestTdr::Cfg({
10056                    let res = Some(IterableCableTestTdrCfg::with_loc(next, self.orig_loc));
10057                    let Some(val) = res else { break };
10058                    val
10059                }),
10060                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10061                n => continue,
10062            };
10063            return Some(Ok(res));
10064        }
10065        Some(Err(ErrorContext::new(
10066            "CableTestTdr",
10067            r#type.and_then(|t| CableTestTdr::attr_from_type(t)),
10068            self.orig_loc,
10069            self.buf.as_ptr().wrapping_add(pos) as usize,
10070        )))
10071    }
10072}
10073impl<'a> std::fmt::Debug for IterableCableTestTdr<'_> {
10074    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10075        let mut fmt = f.debug_struct("CableTestTdr");
10076        for attr in self.clone() {
10077            let attr = match attr {
10078                Ok(a) => a,
10079                Err(err) => {
10080                    fmt.finish()?;
10081                    f.write_str("Err(")?;
10082                    err.fmt(f)?;
10083                    return f.write_str(")");
10084                }
10085            };
10086            match attr {
10087                CableTestTdr::Header(val) => fmt.field("Header", &val),
10088                CableTestTdr::Cfg(val) => fmt.field("Cfg", &val),
10089            };
10090        }
10091        fmt.finish()
10092    }
10093}
10094impl IterableCableTestTdr<'_> {
10095    pub fn lookup_attr(
10096        &self,
10097        offset: usize,
10098        missing_type: Option<u16>,
10099    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10100        let mut stack = Vec::new();
10101        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10102        if missing_type.is_some() && cur == offset {
10103            stack.push(("CableTestTdr", offset));
10104            return (
10105                stack,
10106                missing_type.and_then(|t| CableTestTdr::attr_from_type(t)),
10107            );
10108        }
10109        if cur > offset || cur + self.buf.len() < offset {
10110            return (stack, None);
10111        }
10112        let mut attrs = self.clone();
10113        let mut last_off = cur + attrs.pos;
10114        let mut missing = None;
10115        while let Some(attr) = attrs.next() {
10116            let Ok(attr) = attr else { break };
10117            match attr {
10118                CableTestTdr::Header(val) => {
10119                    (stack, missing) = val.lookup_attr(offset, missing_type);
10120                    if !stack.is_empty() {
10121                        break;
10122                    }
10123                }
10124                CableTestTdr::Cfg(val) => {
10125                    (stack, missing) = val.lookup_attr(offset, missing_type);
10126                    if !stack.is_empty() {
10127                        break;
10128                    }
10129                }
10130                _ => {}
10131            };
10132            last_off = cur + attrs.pos;
10133        }
10134        if !stack.is_empty() {
10135            stack.push(("CableTestTdr", cur));
10136        }
10137        (stack, missing)
10138    }
10139}
10140#[derive(Clone)]
10141pub enum TunnelUdpEntry {
10142    Port(u16),
10143    #[doc = "Associated type: [`UdpTunnelType`] (enum)"]
10144    Type(u32),
10145}
10146impl<'a> IterableTunnelUdpEntry<'a> {
10147    pub fn get_port(&self) -> Result<u16, ErrorContext> {
10148        let mut iter = self.clone();
10149        iter.pos = 0;
10150        for attr in iter {
10151            if let Ok(TunnelUdpEntry::Port(val)) = attr {
10152                return Ok(val);
10153            }
10154        }
10155        Err(ErrorContext::new_missing(
10156            "TunnelUdpEntry",
10157            "Port",
10158            self.orig_loc,
10159            self.buf.as_ptr() as usize,
10160        ))
10161    }
10162    #[doc = "Associated type: [`UdpTunnelType`] (enum)"]
10163    pub fn get_type(&self) -> Result<u32, ErrorContext> {
10164        let mut iter = self.clone();
10165        iter.pos = 0;
10166        for attr in iter {
10167            if let Ok(TunnelUdpEntry::Type(val)) = attr {
10168                return Ok(val);
10169            }
10170        }
10171        Err(ErrorContext::new_missing(
10172            "TunnelUdpEntry",
10173            "Type",
10174            self.orig_loc,
10175            self.buf.as_ptr() as usize,
10176        ))
10177    }
10178}
10179impl TunnelUdpEntry {
10180    pub fn new<'a>(buf: &'a [u8]) -> IterableTunnelUdpEntry<'a> {
10181        IterableTunnelUdpEntry::with_loc(buf, buf.as_ptr() as usize)
10182    }
10183    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10184        let res = match r#type {
10185            0u16 => "Unspec",
10186            1u16 => "Port",
10187            2u16 => "Type",
10188            _ => return None,
10189        };
10190        Some(res)
10191    }
10192}
10193#[derive(Clone, Copy, Default)]
10194pub struct IterableTunnelUdpEntry<'a> {
10195    buf: &'a [u8],
10196    pos: usize,
10197    orig_loc: usize,
10198}
10199impl<'a> IterableTunnelUdpEntry<'a> {
10200    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10201        Self {
10202            buf,
10203            pos: 0,
10204            orig_loc,
10205        }
10206    }
10207    pub fn get_buf(&self) -> &'a [u8] {
10208        self.buf
10209    }
10210}
10211impl<'a> Iterator for IterableTunnelUdpEntry<'a> {
10212    type Item = Result<TunnelUdpEntry, ErrorContext>;
10213    fn next(&mut self) -> Option<Self::Item> {
10214        let mut pos;
10215        let mut r#type;
10216        loop {
10217            pos = self.pos;
10218            r#type = None;
10219            if self.buf.len() == self.pos {
10220                return None;
10221            }
10222            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10223                self.pos = self.buf.len();
10224                break;
10225            };
10226            r#type = Some(header.r#type);
10227            let res = match header.r#type {
10228                1u16 => TunnelUdpEntry::Port({
10229                    let res = parse_be_u16(next);
10230                    let Some(val) = res else { break };
10231                    val
10232                }),
10233                2u16 => TunnelUdpEntry::Type({
10234                    let res = parse_u32(next);
10235                    let Some(val) = res else { break };
10236                    val
10237                }),
10238                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10239                n => continue,
10240            };
10241            return Some(Ok(res));
10242        }
10243        Some(Err(ErrorContext::new(
10244            "TunnelUdpEntry",
10245            r#type.and_then(|t| TunnelUdpEntry::attr_from_type(t)),
10246            self.orig_loc,
10247            self.buf.as_ptr().wrapping_add(pos) as usize,
10248        )))
10249    }
10250}
10251impl std::fmt::Debug for IterableTunnelUdpEntry<'_> {
10252    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10253        let mut fmt = f.debug_struct("TunnelUdpEntry");
10254        for attr in self.clone() {
10255            let attr = match attr {
10256                Ok(a) => a,
10257                Err(err) => {
10258                    fmt.finish()?;
10259                    f.write_str("Err(")?;
10260                    err.fmt(f)?;
10261                    return f.write_str(")");
10262                }
10263            };
10264            match attr {
10265                TunnelUdpEntry::Port(val) => fmt.field("Port", &val),
10266                TunnelUdpEntry::Type(val) => {
10267                    fmt.field("Type", &FormatEnum(val.into(), UdpTunnelType::from_value))
10268                }
10269            };
10270        }
10271        fmt.finish()
10272    }
10273}
10274impl IterableTunnelUdpEntry<'_> {
10275    pub fn lookup_attr(
10276        &self,
10277        offset: usize,
10278        missing_type: Option<u16>,
10279    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10280        let mut stack = Vec::new();
10281        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10282        if missing_type.is_some() && cur == offset {
10283            stack.push(("TunnelUdpEntry", offset));
10284            return (
10285                stack,
10286                missing_type.and_then(|t| TunnelUdpEntry::attr_from_type(t)),
10287            );
10288        }
10289        if cur > offset || cur + self.buf.len() < offset {
10290            return (stack, None);
10291        }
10292        let mut attrs = self.clone();
10293        let mut last_off = cur + attrs.pos;
10294        while let Some(attr) = attrs.next() {
10295            let Ok(attr) = attr else { break };
10296            match attr {
10297                TunnelUdpEntry::Port(val) => {
10298                    if last_off == offset {
10299                        stack.push(("Port", last_off));
10300                        break;
10301                    }
10302                }
10303                TunnelUdpEntry::Type(val) => {
10304                    if last_off == offset {
10305                        stack.push(("Type", last_off));
10306                        break;
10307                    }
10308                }
10309                _ => {}
10310            };
10311            last_off = cur + attrs.pos;
10312        }
10313        if !stack.is_empty() {
10314            stack.push(("TunnelUdpEntry", cur));
10315        }
10316        (stack, None)
10317    }
10318}
10319#[derive(Clone)]
10320pub enum TunnelUdpTable<'a> {
10321    Size(u32),
10322    Types(IterableBitset<'a>),
10323    #[doc = "Attribute may repeat multiple times (treat it as array)"]
10324    Entry(IterableTunnelUdpEntry<'a>),
10325}
10326impl<'a> IterableTunnelUdpTable<'a> {
10327    pub fn get_size(&self) -> Result<u32, ErrorContext> {
10328        let mut iter = self.clone();
10329        iter.pos = 0;
10330        for attr in iter {
10331            if let Ok(TunnelUdpTable::Size(val)) = attr {
10332                return Ok(val);
10333            }
10334        }
10335        Err(ErrorContext::new_missing(
10336            "TunnelUdpTable",
10337            "Size",
10338            self.orig_loc,
10339            self.buf.as_ptr() as usize,
10340        ))
10341    }
10342    pub fn get_types(&self) -> Result<IterableBitset<'a>, ErrorContext> {
10343        let mut iter = self.clone();
10344        iter.pos = 0;
10345        for attr in iter {
10346            if let Ok(TunnelUdpTable::Types(val)) = attr {
10347                return Ok(val);
10348            }
10349        }
10350        Err(ErrorContext::new_missing(
10351            "TunnelUdpTable",
10352            "Types",
10353            self.orig_loc,
10354            self.buf.as_ptr() as usize,
10355        ))
10356    }
10357    #[doc = "Attribute may repeat multiple times (treat it as array)"]
10358    pub fn get_entry(
10359        &self,
10360    ) -> MultiAttrIterable<Self, TunnelUdpTable<'a>, IterableTunnelUdpEntry<'a>> {
10361        MultiAttrIterable::new(self.clone(), |variant| {
10362            if let TunnelUdpTable::Entry(val) = variant {
10363                Some(val)
10364            } else {
10365                None
10366            }
10367        })
10368    }
10369}
10370impl TunnelUdpTable<'_> {
10371    pub fn new<'a>(buf: &'a [u8]) -> IterableTunnelUdpTable<'a> {
10372        IterableTunnelUdpTable::with_loc(buf, buf.as_ptr() as usize)
10373    }
10374    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10375        let res = match r#type {
10376            0u16 => "Unspec",
10377            1u16 => "Size",
10378            2u16 => "Types",
10379            3u16 => "Entry",
10380            _ => return None,
10381        };
10382        Some(res)
10383    }
10384}
10385#[derive(Clone, Copy, Default)]
10386pub struct IterableTunnelUdpTable<'a> {
10387    buf: &'a [u8],
10388    pos: usize,
10389    orig_loc: usize,
10390}
10391impl<'a> IterableTunnelUdpTable<'a> {
10392    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10393        Self {
10394            buf,
10395            pos: 0,
10396            orig_loc,
10397        }
10398    }
10399    pub fn get_buf(&self) -> &'a [u8] {
10400        self.buf
10401    }
10402}
10403impl<'a> Iterator for IterableTunnelUdpTable<'a> {
10404    type Item = Result<TunnelUdpTable<'a>, ErrorContext>;
10405    fn next(&mut self) -> Option<Self::Item> {
10406        let mut pos;
10407        let mut r#type;
10408        loop {
10409            pos = self.pos;
10410            r#type = None;
10411            if self.buf.len() == self.pos {
10412                return None;
10413            }
10414            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10415                self.pos = self.buf.len();
10416                break;
10417            };
10418            r#type = Some(header.r#type);
10419            let res = match header.r#type {
10420                1u16 => TunnelUdpTable::Size({
10421                    let res = parse_u32(next);
10422                    let Some(val) = res else { break };
10423                    val
10424                }),
10425                2u16 => TunnelUdpTable::Types({
10426                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
10427                    let Some(val) = res else { break };
10428                    val
10429                }),
10430                3u16 => TunnelUdpTable::Entry({
10431                    let res = Some(IterableTunnelUdpEntry::with_loc(next, self.orig_loc));
10432                    let Some(val) = res else { break };
10433                    val
10434                }),
10435                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10436                n => continue,
10437            };
10438            return Some(Ok(res));
10439        }
10440        Some(Err(ErrorContext::new(
10441            "TunnelUdpTable",
10442            r#type.and_then(|t| TunnelUdpTable::attr_from_type(t)),
10443            self.orig_loc,
10444            self.buf.as_ptr().wrapping_add(pos) as usize,
10445        )))
10446    }
10447}
10448impl<'a> std::fmt::Debug for IterableTunnelUdpTable<'_> {
10449    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10450        let mut fmt = f.debug_struct("TunnelUdpTable");
10451        for attr in self.clone() {
10452            let attr = match attr {
10453                Ok(a) => a,
10454                Err(err) => {
10455                    fmt.finish()?;
10456                    f.write_str("Err(")?;
10457                    err.fmt(f)?;
10458                    return f.write_str(")");
10459                }
10460            };
10461            match attr {
10462                TunnelUdpTable::Size(val) => fmt.field("Size", &val),
10463                TunnelUdpTable::Types(val) => fmt.field("Types", &val),
10464                TunnelUdpTable::Entry(val) => fmt.field("Entry", &val),
10465            };
10466        }
10467        fmt.finish()
10468    }
10469}
10470impl IterableTunnelUdpTable<'_> {
10471    pub fn lookup_attr(
10472        &self,
10473        offset: usize,
10474        missing_type: Option<u16>,
10475    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10476        let mut stack = Vec::new();
10477        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10478        if missing_type.is_some() && cur == offset {
10479            stack.push(("TunnelUdpTable", offset));
10480            return (
10481                stack,
10482                missing_type.and_then(|t| TunnelUdpTable::attr_from_type(t)),
10483            );
10484        }
10485        if cur > offset || cur + self.buf.len() < offset {
10486            return (stack, None);
10487        }
10488        let mut attrs = self.clone();
10489        let mut last_off = cur + attrs.pos;
10490        let mut missing = None;
10491        while let Some(attr) = attrs.next() {
10492            let Ok(attr) = attr else { break };
10493            match attr {
10494                TunnelUdpTable::Size(val) => {
10495                    if last_off == offset {
10496                        stack.push(("Size", last_off));
10497                        break;
10498                    }
10499                }
10500                TunnelUdpTable::Types(val) => {
10501                    (stack, missing) = val.lookup_attr(offset, missing_type);
10502                    if !stack.is_empty() {
10503                        break;
10504                    }
10505                }
10506                TunnelUdpTable::Entry(val) => {
10507                    (stack, missing) = val.lookup_attr(offset, missing_type);
10508                    if !stack.is_empty() {
10509                        break;
10510                    }
10511                }
10512                _ => {}
10513            };
10514            last_off = cur + attrs.pos;
10515        }
10516        if !stack.is_empty() {
10517            stack.push(("TunnelUdpTable", cur));
10518        }
10519        (stack, missing)
10520    }
10521}
10522#[derive(Clone)]
10523pub enum TunnelUdp<'a> {
10524    Table(IterableTunnelUdpTable<'a>),
10525}
10526impl<'a> IterableTunnelUdp<'a> {
10527    pub fn get_table(&self) -> Result<IterableTunnelUdpTable<'a>, ErrorContext> {
10528        let mut iter = self.clone();
10529        iter.pos = 0;
10530        for attr in iter {
10531            if let Ok(TunnelUdp::Table(val)) = attr {
10532                return Ok(val);
10533            }
10534        }
10535        Err(ErrorContext::new_missing(
10536            "TunnelUdp",
10537            "Table",
10538            self.orig_loc,
10539            self.buf.as_ptr() as usize,
10540        ))
10541    }
10542}
10543impl TunnelUdp<'_> {
10544    pub fn new<'a>(buf: &'a [u8]) -> IterableTunnelUdp<'a> {
10545        IterableTunnelUdp::with_loc(buf, buf.as_ptr() as usize)
10546    }
10547    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10548        let res = match r#type {
10549            0u16 => "Unspec",
10550            1u16 => "Table",
10551            _ => return None,
10552        };
10553        Some(res)
10554    }
10555}
10556#[derive(Clone, Copy, Default)]
10557pub struct IterableTunnelUdp<'a> {
10558    buf: &'a [u8],
10559    pos: usize,
10560    orig_loc: usize,
10561}
10562impl<'a> IterableTunnelUdp<'a> {
10563    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10564        Self {
10565            buf,
10566            pos: 0,
10567            orig_loc,
10568        }
10569    }
10570    pub fn get_buf(&self) -> &'a [u8] {
10571        self.buf
10572    }
10573}
10574impl<'a> Iterator for IterableTunnelUdp<'a> {
10575    type Item = Result<TunnelUdp<'a>, ErrorContext>;
10576    fn next(&mut self) -> Option<Self::Item> {
10577        let mut pos;
10578        let mut r#type;
10579        loop {
10580            pos = self.pos;
10581            r#type = None;
10582            if self.buf.len() == self.pos {
10583                return None;
10584            }
10585            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10586                self.pos = self.buf.len();
10587                break;
10588            };
10589            r#type = Some(header.r#type);
10590            let res = match header.r#type {
10591                1u16 => TunnelUdp::Table({
10592                    let res = Some(IterableTunnelUdpTable::with_loc(next, self.orig_loc));
10593                    let Some(val) = res else { break };
10594                    val
10595                }),
10596                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10597                n => continue,
10598            };
10599            return Some(Ok(res));
10600        }
10601        Some(Err(ErrorContext::new(
10602            "TunnelUdp",
10603            r#type.and_then(|t| TunnelUdp::attr_from_type(t)),
10604            self.orig_loc,
10605            self.buf.as_ptr().wrapping_add(pos) as usize,
10606        )))
10607    }
10608}
10609impl<'a> std::fmt::Debug for IterableTunnelUdp<'_> {
10610    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10611        let mut fmt = f.debug_struct("TunnelUdp");
10612        for attr in self.clone() {
10613            let attr = match attr {
10614                Ok(a) => a,
10615                Err(err) => {
10616                    fmt.finish()?;
10617                    f.write_str("Err(")?;
10618                    err.fmt(f)?;
10619                    return f.write_str(")");
10620                }
10621            };
10622            match attr {
10623                TunnelUdp::Table(val) => fmt.field("Table", &val),
10624            };
10625        }
10626        fmt.finish()
10627    }
10628}
10629impl IterableTunnelUdp<'_> {
10630    pub fn lookup_attr(
10631        &self,
10632        offset: usize,
10633        missing_type: Option<u16>,
10634    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10635        let mut stack = Vec::new();
10636        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10637        if missing_type.is_some() && cur == offset {
10638            stack.push(("TunnelUdp", offset));
10639            return (
10640                stack,
10641                missing_type.and_then(|t| TunnelUdp::attr_from_type(t)),
10642            );
10643        }
10644        if cur > offset || cur + self.buf.len() < offset {
10645            return (stack, None);
10646        }
10647        let mut attrs = self.clone();
10648        let mut last_off = cur + attrs.pos;
10649        let mut missing = None;
10650        while let Some(attr) = attrs.next() {
10651            let Ok(attr) = attr else { break };
10652            match attr {
10653                TunnelUdp::Table(val) => {
10654                    (stack, missing) = val.lookup_attr(offset, missing_type);
10655                    if !stack.is_empty() {
10656                        break;
10657                    }
10658                }
10659                _ => {}
10660            };
10661            last_off = cur + attrs.pos;
10662        }
10663        if !stack.is_empty() {
10664            stack.push(("TunnelUdp", cur));
10665        }
10666        (stack, missing)
10667    }
10668}
10669#[derive(Clone)]
10670pub enum TunnelInfo<'a> {
10671    Header(IterableHeader<'a>),
10672    UdpPorts(IterableTunnelUdp<'a>),
10673}
10674impl<'a> IterableTunnelInfo<'a> {
10675    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
10676        let mut iter = self.clone();
10677        iter.pos = 0;
10678        for attr in iter {
10679            if let Ok(TunnelInfo::Header(val)) = attr {
10680                return Ok(val);
10681            }
10682        }
10683        Err(ErrorContext::new_missing(
10684            "TunnelInfo",
10685            "Header",
10686            self.orig_loc,
10687            self.buf.as_ptr() as usize,
10688        ))
10689    }
10690    pub fn get_udp_ports(&self) -> Result<IterableTunnelUdp<'a>, ErrorContext> {
10691        let mut iter = self.clone();
10692        iter.pos = 0;
10693        for attr in iter {
10694            if let Ok(TunnelInfo::UdpPorts(val)) = attr {
10695                return Ok(val);
10696            }
10697        }
10698        Err(ErrorContext::new_missing(
10699            "TunnelInfo",
10700            "UdpPorts",
10701            self.orig_loc,
10702            self.buf.as_ptr() as usize,
10703        ))
10704    }
10705}
10706impl TunnelInfo<'_> {
10707    pub fn new<'a>(buf: &'a [u8]) -> IterableTunnelInfo<'a> {
10708        IterableTunnelInfo::with_loc(buf, buf.as_ptr() as usize)
10709    }
10710    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10711        let res = match r#type {
10712            0u16 => "Unspec",
10713            1u16 => "Header",
10714            2u16 => "UdpPorts",
10715            _ => return None,
10716        };
10717        Some(res)
10718    }
10719}
10720#[derive(Clone, Copy, Default)]
10721pub struct IterableTunnelInfo<'a> {
10722    buf: &'a [u8],
10723    pos: usize,
10724    orig_loc: usize,
10725}
10726impl<'a> IterableTunnelInfo<'a> {
10727    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10728        Self {
10729            buf,
10730            pos: 0,
10731            orig_loc,
10732        }
10733    }
10734    pub fn get_buf(&self) -> &'a [u8] {
10735        self.buf
10736    }
10737}
10738impl<'a> Iterator for IterableTunnelInfo<'a> {
10739    type Item = Result<TunnelInfo<'a>, ErrorContext>;
10740    fn next(&mut self) -> Option<Self::Item> {
10741        let mut pos;
10742        let mut r#type;
10743        loop {
10744            pos = self.pos;
10745            r#type = None;
10746            if self.buf.len() == self.pos {
10747                return None;
10748            }
10749            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10750                self.pos = self.buf.len();
10751                break;
10752            };
10753            r#type = Some(header.r#type);
10754            let res = match header.r#type {
10755                1u16 => TunnelInfo::Header({
10756                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
10757                    let Some(val) = res else { break };
10758                    val
10759                }),
10760                2u16 => TunnelInfo::UdpPorts({
10761                    let res = Some(IterableTunnelUdp::with_loc(next, self.orig_loc));
10762                    let Some(val) = res else { break };
10763                    val
10764                }),
10765                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10766                n => continue,
10767            };
10768            return Some(Ok(res));
10769        }
10770        Some(Err(ErrorContext::new(
10771            "TunnelInfo",
10772            r#type.and_then(|t| TunnelInfo::attr_from_type(t)),
10773            self.orig_loc,
10774            self.buf.as_ptr().wrapping_add(pos) as usize,
10775        )))
10776    }
10777}
10778impl<'a> std::fmt::Debug for IterableTunnelInfo<'_> {
10779    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10780        let mut fmt = f.debug_struct("TunnelInfo");
10781        for attr in self.clone() {
10782            let attr = match attr {
10783                Ok(a) => a,
10784                Err(err) => {
10785                    fmt.finish()?;
10786                    f.write_str("Err(")?;
10787                    err.fmt(f)?;
10788                    return f.write_str(")");
10789                }
10790            };
10791            match attr {
10792                TunnelInfo::Header(val) => fmt.field("Header", &val),
10793                TunnelInfo::UdpPorts(val) => fmt.field("UdpPorts", &val),
10794            };
10795        }
10796        fmt.finish()
10797    }
10798}
10799impl IterableTunnelInfo<'_> {
10800    pub fn lookup_attr(
10801        &self,
10802        offset: usize,
10803        missing_type: Option<u16>,
10804    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10805        let mut stack = Vec::new();
10806        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10807        if missing_type.is_some() && cur == offset {
10808            stack.push(("TunnelInfo", offset));
10809            return (
10810                stack,
10811                missing_type.and_then(|t| TunnelInfo::attr_from_type(t)),
10812            );
10813        }
10814        if cur > offset || cur + self.buf.len() < offset {
10815            return (stack, None);
10816        }
10817        let mut attrs = self.clone();
10818        let mut last_off = cur + attrs.pos;
10819        let mut missing = None;
10820        while let Some(attr) = attrs.next() {
10821            let Ok(attr) = attr else { break };
10822            match attr {
10823                TunnelInfo::Header(val) => {
10824                    (stack, missing) = val.lookup_attr(offset, missing_type);
10825                    if !stack.is_empty() {
10826                        break;
10827                    }
10828                }
10829                TunnelInfo::UdpPorts(val) => {
10830                    (stack, missing) = val.lookup_attr(offset, missing_type);
10831                    if !stack.is_empty() {
10832                        break;
10833                    }
10834                }
10835                _ => {}
10836            };
10837            last_off = cur + attrs.pos;
10838        }
10839        if !stack.is_empty() {
10840            stack.push(("TunnelInfo", cur));
10841        }
10842        (stack, missing)
10843    }
10844}
10845#[derive(Clone)]
10846pub enum FecHist<'a> {
10847    Pad(&'a [u8]),
10848    #[doc = "Low bound of FEC bin (inclusive)\n"]
10849    BinLow(u32),
10850    #[doc = "High bound of FEC bin (inclusive)\n"]
10851    BinHigh(u32),
10852    #[doc = "Error count in the bin (optional if per-lane values exist)\n"]
10853    BinVal(u32),
10854    #[doc = "An array of per-lane error counters in the bin (optional)\n"]
10855    BinValPerLane(&'a [u8]),
10856}
10857impl<'a> IterableFecHist<'a> {
10858    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
10859        let mut iter = self.clone();
10860        iter.pos = 0;
10861        for attr in iter {
10862            if let Ok(FecHist::Pad(val)) = attr {
10863                return Ok(val);
10864            }
10865        }
10866        Err(ErrorContext::new_missing(
10867            "FecHist",
10868            "Pad",
10869            self.orig_loc,
10870            self.buf.as_ptr() as usize,
10871        ))
10872    }
10873    #[doc = "Low bound of FEC bin (inclusive)\n"]
10874    pub fn get_bin_low(&self) -> Result<u32, ErrorContext> {
10875        let mut iter = self.clone();
10876        iter.pos = 0;
10877        for attr in iter {
10878            if let Ok(FecHist::BinLow(val)) = attr {
10879                return Ok(val);
10880            }
10881        }
10882        Err(ErrorContext::new_missing(
10883            "FecHist",
10884            "BinLow",
10885            self.orig_loc,
10886            self.buf.as_ptr() as usize,
10887        ))
10888    }
10889    #[doc = "High bound of FEC bin (inclusive)\n"]
10890    pub fn get_bin_high(&self) -> Result<u32, ErrorContext> {
10891        let mut iter = self.clone();
10892        iter.pos = 0;
10893        for attr in iter {
10894            if let Ok(FecHist::BinHigh(val)) = attr {
10895                return Ok(val);
10896            }
10897        }
10898        Err(ErrorContext::new_missing(
10899            "FecHist",
10900            "BinHigh",
10901            self.orig_loc,
10902            self.buf.as_ptr() as usize,
10903        ))
10904    }
10905    #[doc = "Error count in the bin (optional if per-lane values exist)\n"]
10906    pub fn get_bin_val(&self) -> Result<u32, ErrorContext> {
10907        let mut iter = self.clone();
10908        iter.pos = 0;
10909        for attr in iter {
10910            if let Ok(FecHist::BinVal(val)) = attr {
10911                return Ok(val);
10912            }
10913        }
10914        Err(ErrorContext::new_missing(
10915            "FecHist",
10916            "BinVal",
10917            self.orig_loc,
10918            self.buf.as_ptr() as usize,
10919        ))
10920    }
10921    #[doc = "An array of per-lane error counters in the bin (optional)\n"]
10922    pub fn get_bin_val_per_lane(&self) -> Result<&'a [u8], ErrorContext> {
10923        let mut iter = self.clone();
10924        iter.pos = 0;
10925        for attr in iter {
10926            if let Ok(FecHist::BinValPerLane(val)) = attr {
10927                return Ok(val);
10928            }
10929        }
10930        Err(ErrorContext::new_missing(
10931            "FecHist",
10932            "BinValPerLane",
10933            self.orig_loc,
10934            self.buf.as_ptr() as usize,
10935        ))
10936    }
10937}
10938impl FecHist<'_> {
10939    pub fn new<'a>(buf: &'a [u8]) -> IterableFecHist<'a> {
10940        IterableFecHist::with_loc(buf, buf.as_ptr() as usize)
10941    }
10942    fn attr_from_type(r#type: u16) -> Option<&'static str> {
10943        let res = match r#type {
10944            1u16 => "Pad",
10945            2u16 => "BinLow",
10946            3u16 => "BinHigh",
10947            4u16 => "BinVal",
10948            5u16 => "BinValPerLane",
10949            _ => return None,
10950        };
10951        Some(res)
10952    }
10953}
10954#[derive(Clone, Copy, Default)]
10955pub struct IterableFecHist<'a> {
10956    buf: &'a [u8],
10957    pos: usize,
10958    orig_loc: usize,
10959}
10960impl<'a> IterableFecHist<'a> {
10961    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10962        Self {
10963            buf,
10964            pos: 0,
10965            orig_loc,
10966        }
10967    }
10968    pub fn get_buf(&self) -> &'a [u8] {
10969        self.buf
10970    }
10971}
10972impl<'a> Iterator for IterableFecHist<'a> {
10973    type Item = Result<FecHist<'a>, ErrorContext>;
10974    fn next(&mut self) -> Option<Self::Item> {
10975        let mut pos;
10976        let mut r#type;
10977        loop {
10978            pos = self.pos;
10979            r#type = None;
10980            if self.buf.len() == self.pos {
10981                return None;
10982            }
10983            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10984                self.pos = self.buf.len();
10985                break;
10986            };
10987            r#type = Some(header.r#type);
10988            let res = match header.r#type {
10989                1u16 => FecHist::Pad({
10990                    let res = Some(next);
10991                    let Some(val) = res else { break };
10992                    val
10993                }),
10994                2u16 => FecHist::BinLow({
10995                    let res = parse_u32(next);
10996                    let Some(val) = res else { break };
10997                    val
10998                }),
10999                3u16 => FecHist::BinHigh({
11000                    let res = parse_u32(next);
11001                    let Some(val) = res else { break };
11002                    val
11003                }),
11004                4u16 => FecHist::BinVal({
11005                    let res = parse_u32(next);
11006                    let Some(val) = res else { break };
11007                    val
11008                }),
11009                5u16 => FecHist::BinValPerLane({
11010                    let res = Some(next);
11011                    let Some(val) = res else { break };
11012                    val
11013                }),
11014                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11015                n => continue,
11016            };
11017            return Some(Ok(res));
11018        }
11019        Some(Err(ErrorContext::new(
11020            "FecHist",
11021            r#type.and_then(|t| FecHist::attr_from_type(t)),
11022            self.orig_loc,
11023            self.buf.as_ptr().wrapping_add(pos) as usize,
11024        )))
11025    }
11026}
11027impl<'a> std::fmt::Debug for IterableFecHist<'_> {
11028    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11029        let mut fmt = f.debug_struct("FecHist");
11030        for attr in self.clone() {
11031            let attr = match attr {
11032                Ok(a) => a,
11033                Err(err) => {
11034                    fmt.finish()?;
11035                    f.write_str("Err(")?;
11036                    err.fmt(f)?;
11037                    return f.write_str(")");
11038                }
11039            };
11040            match attr {
11041                FecHist::Pad(val) => fmt.field("Pad", &val),
11042                FecHist::BinLow(val) => fmt.field("BinLow", &val),
11043                FecHist::BinHigh(val) => fmt.field("BinHigh", &val),
11044                FecHist::BinVal(val) => fmt.field("BinVal", &val),
11045                FecHist::BinValPerLane(val) => fmt.field("BinValPerLane", &val),
11046            };
11047        }
11048        fmt.finish()
11049    }
11050}
11051impl IterableFecHist<'_> {
11052    pub fn lookup_attr(
11053        &self,
11054        offset: usize,
11055        missing_type: Option<u16>,
11056    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11057        let mut stack = Vec::new();
11058        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11059        if missing_type.is_some() && cur == offset {
11060            stack.push(("FecHist", offset));
11061            return (stack, missing_type.and_then(|t| FecHist::attr_from_type(t)));
11062        }
11063        if cur > offset || cur + self.buf.len() < offset {
11064            return (stack, None);
11065        }
11066        let mut attrs = self.clone();
11067        let mut last_off = cur + attrs.pos;
11068        while let Some(attr) = attrs.next() {
11069            let Ok(attr) = attr else { break };
11070            match attr {
11071                FecHist::Pad(val) => {
11072                    if last_off == offset {
11073                        stack.push(("Pad", last_off));
11074                        break;
11075                    }
11076                }
11077                FecHist::BinLow(val) => {
11078                    if last_off == offset {
11079                        stack.push(("BinLow", last_off));
11080                        break;
11081                    }
11082                }
11083                FecHist::BinHigh(val) => {
11084                    if last_off == offset {
11085                        stack.push(("BinHigh", last_off));
11086                        break;
11087                    }
11088                }
11089                FecHist::BinVal(val) => {
11090                    if last_off == offset {
11091                        stack.push(("BinVal", last_off));
11092                        break;
11093                    }
11094                }
11095                FecHist::BinValPerLane(val) => {
11096                    if last_off == offset {
11097                        stack.push(("BinValPerLane", last_off));
11098                        break;
11099                    }
11100                }
11101                _ => {}
11102            };
11103            last_off = cur + attrs.pos;
11104        }
11105        if !stack.is_empty() {
11106            stack.push(("FecHist", cur));
11107        }
11108        (stack, None)
11109    }
11110}
11111#[derive(Clone)]
11112pub enum FecStat<'a> {
11113    Pad(&'a [u8]),
11114    Corrected(&'a [u8]),
11115    Uncorr(&'a [u8]),
11116    CorrBits(&'a [u8]),
11117    #[doc = "Attribute may repeat multiple times (treat it as array)"]
11118    Hist(IterableFecHist<'a>),
11119}
11120impl<'a> IterableFecStat<'a> {
11121    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
11122        let mut iter = self.clone();
11123        iter.pos = 0;
11124        for attr in iter {
11125            if let Ok(FecStat::Pad(val)) = attr {
11126                return Ok(val);
11127            }
11128        }
11129        Err(ErrorContext::new_missing(
11130            "FecStat",
11131            "Pad",
11132            self.orig_loc,
11133            self.buf.as_ptr() as usize,
11134        ))
11135    }
11136    pub fn get_corrected(&self) -> Result<&'a [u8], ErrorContext> {
11137        let mut iter = self.clone();
11138        iter.pos = 0;
11139        for attr in iter {
11140            if let Ok(FecStat::Corrected(val)) = attr {
11141                return Ok(val);
11142            }
11143        }
11144        Err(ErrorContext::new_missing(
11145            "FecStat",
11146            "Corrected",
11147            self.orig_loc,
11148            self.buf.as_ptr() as usize,
11149        ))
11150    }
11151    pub fn get_uncorr(&self) -> Result<&'a [u8], ErrorContext> {
11152        let mut iter = self.clone();
11153        iter.pos = 0;
11154        for attr in iter {
11155            if let Ok(FecStat::Uncorr(val)) = attr {
11156                return Ok(val);
11157            }
11158        }
11159        Err(ErrorContext::new_missing(
11160            "FecStat",
11161            "Uncorr",
11162            self.orig_loc,
11163            self.buf.as_ptr() as usize,
11164        ))
11165    }
11166    pub fn get_corr_bits(&self) -> Result<&'a [u8], ErrorContext> {
11167        let mut iter = self.clone();
11168        iter.pos = 0;
11169        for attr in iter {
11170            if let Ok(FecStat::CorrBits(val)) = attr {
11171                return Ok(val);
11172            }
11173        }
11174        Err(ErrorContext::new_missing(
11175            "FecStat",
11176            "CorrBits",
11177            self.orig_loc,
11178            self.buf.as_ptr() as usize,
11179        ))
11180    }
11181    #[doc = "Attribute may repeat multiple times (treat it as array)"]
11182    pub fn get_hist(&self) -> MultiAttrIterable<Self, FecStat<'a>, IterableFecHist<'a>> {
11183        MultiAttrIterable::new(self.clone(), |variant| {
11184            if let FecStat::Hist(val) = variant {
11185                Some(val)
11186            } else {
11187                None
11188            }
11189        })
11190    }
11191}
11192impl FecStat<'_> {
11193    pub fn new<'a>(buf: &'a [u8]) -> IterableFecStat<'a> {
11194        IterableFecStat::with_loc(buf, buf.as_ptr() as usize)
11195    }
11196    fn attr_from_type(r#type: u16) -> Option<&'static str> {
11197        let res = match r#type {
11198            0u16 => "Unspec",
11199            1u16 => "Pad",
11200            2u16 => "Corrected",
11201            3u16 => "Uncorr",
11202            4u16 => "CorrBits",
11203            5u16 => "Hist",
11204            _ => return None,
11205        };
11206        Some(res)
11207    }
11208}
11209#[derive(Clone, Copy, Default)]
11210pub struct IterableFecStat<'a> {
11211    buf: &'a [u8],
11212    pos: usize,
11213    orig_loc: usize,
11214}
11215impl<'a> IterableFecStat<'a> {
11216    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11217        Self {
11218            buf,
11219            pos: 0,
11220            orig_loc,
11221        }
11222    }
11223    pub fn get_buf(&self) -> &'a [u8] {
11224        self.buf
11225    }
11226}
11227impl<'a> Iterator for IterableFecStat<'a> {
11228    type Item = Result<FecStat<'a>, ErrorContext>;
11229    fn next(&mut self) -> Option<Self::Item> {
11230        let mut pos;
11231        let mut r#type;
11232        loop {
11233            pos = self.pos;
11234            r#type = None;
11235            if self.buf.len() == self.pos {
11236                return None;
11237            }
11238            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11239                self.pos = self.buf.len();
11240                break;
11241            };
11242            r#type = Some(header.r#type);
11243            let res = match header.r#type {
11244                1u16 => FecStat::Pad({
11245                    let res = Some(next);
11246                    let Some(val) = res else { break };
11247                    val
11248                }),
11249                2u16 => FecStat::Corrected({
11250                    let res = Some(next);
11251                    let Some(val) = res else { break };
11252                    val
11253                }),
11254                3u16 => FecStat::Uncorr({
11255                    let res = Some(next);
11256                    let Some(val) = res else { break };
11257                    val
11258                }),
11259                4u16 => FecStat::CorrBits({
11260                    let res = Some(next);
11261                    let Some(val) = res else { break };
11262                    val
11263                }),
11264                5u16 => FecStat::Hist({
11265                    let res = Some(IterableFecHist::with_loc(next, self.orig_loc));
11266                    let Some(val) = res else { break };
11267                    val
11268                }),
11269                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11270                n => continue,
11271            };
11272            return Some(Ok(res));
11273        }
11274        Some(Err(ErrorContext::new(
11275            "FecStat",
11276            r#type.and_then(|t| FecStat::attr_from_type(t)),
11277            self.orig_loc,
11278            self.buf.as_ptr().wrapping_add(pos) as usize,
11279        )))
11280    }
11281}
11282impl<'a> std::fmt::Debug for IterableFecStat<'_> {
11283    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11284        let mut fmt = f.debug_struct("FecStat");
11285        for attr in self.clone() {
11286            let attr = match attr {
11287                Ok(a) => a,
11288                Err(err) => {
11289                    fmt.finish()?;
11290                    f.write_str("Err(")?;
11291                    err.fmt(f)?;
11292                    return f.write_str(")");
11293                }
11294            };
11295            match attr {
11296                FecStat::Pad(val) => fmt.field("Pad", &val),
11297                FecStat::Corrected(val) => fmt.field("Corrected", &val),
11298                FecStat::Uncorr(val) => fmt.field("Uncorr", &val),
11299                FecStat::CorrBits(val) => fmt.field("CorrBits", &val),
11300                FecStat::Hist(val) => fmt.field("Hist", &val),
11301            };
11302        }
11303        fmt.finish()
11304    }
11305}
11306impl IterableFecStat<'_> {
11307    pub fn lookup_attr(
11308        &self,
11309        offset: usize,
11310        missing_type: Option<u16>,
11311    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11312        let mut stack = Vec::new();
11313        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11314        if missing_type.is_some() && cur == offset {
11315            stack.push(("FecStat", offset));
11316            return (stack, missing_type.and_then(|t| FecStat::attr_from_type(t)));
11317        }
11318        if cur > offset || cur + self.buf.len() < offset {
11319            return (stack, None);
11320        }
11321        let mut attrs = self.clone();
11322        let mut last_off = cur + attrs.pos;
11323        let mut missing = None;
11324        while let Some(attr) = attrs.next() {
11325            let Ok(attr) = attr else { break };
11326            match attr {
11327                FecStat::Pad(val) => {
11328                    if last_off == offset {
11329                        stack.push(("Pad", last_off));
11330                        break;
11331                    }
11332                }
11333                FecStat::Corrected(val) => {
11334                    if last_off == offset {
11335                        stack.push(("Corrected", last_off));
11336                        break;
11337                    }
11338                }
11339                FecStat::Uncorr(val) => {
11340                    if last_off == offset {
11341                        stack.push(("Uncorr", last_off));
11342                        break;
11343                    }
11344                }
11345                FecStat::CorrBits(val) => {
11346                    if last_off == offset {
11347                        stack.push(("CorrBits", last_off));
11348                        break;
11349                    }
11350                }
11351                FecStat::Hist(val) => {
11352                    (stack, missing) = val.lookup_attr(offset, missing_type);
11353                    if !stack.is_empty() {
11354                        break;
11355                    }
11356                }
11357                _ => {}
11358            };
11359            last_off = cur + attrs.pos;
11360        }
11361        if !stack.is_empty() {
11362            stack.push(("FecStat", cur));
11363        }
11364        (stack, missing)
11365    }
11366}
11367#[derive(Clone)]
11368pub enum Fec<'a> {
11369    Header(IterableHeader<'a>),
11370    Modes(IterableBitset<'a>),
11371    Auto(u8),
11372    Active(u32),
11373    Stats(IterableFecStat<'a>),
11374}
11375impl<'a> IterableFec<'a> {
11376    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
11377        let mut iter = self.clone();
11378        iter.pos = 0;
11379        for attr in iter {
11380            if let Ok(Fec::Header(val)) = attr {
11381                return Ok(val);
11382            }
11383        }
11384        Err(ErrorContext::new_missing(
11385            "Fec",
11386            "Header",
11387            self.orig_loc,
11388            self.buf.as_ptr() as usize,
11389        ))
11390    }
11391    pub fn get_modes(&self) -> Result<IterableBitset<'a>, ErrorContext> {
11392        let mut iter = self.clone();
11393        iter.pos = 0;
11394        for attr in iter {
11395            if let Ok(Fec::Modes(val)) = attr {
11396                return Ok(val);
11397            }
11398        }
11399        Err(ErrorContext::new_missing(
11400            "Fec",
11401            "Modes",
11402            self.orig_loc,
11403            self.buf.as_ptr() as usize,
11404        ))
11405    }
11406    pub fn get_auto(&self) -> Result<u8, ErrorContext> {
11407        let mut iter = self.clone();
11408        iter.pos = 0;
11409        for attr in iter {
11410            if let Ok(Fec::Auto(val)) = attr {
11411                return Ok(val);
11412            }
11413        }
11414        Err(ErrorContext::new_missing(
11415            "Fec",
11416            "Auto",
11417            self.orig_loc,
11418            self.buf.as_ptr() as usize,
11419        ))
11420    }
11421    pub fn get_active(&self) -> Result<u32, ErrorContext> {
11422        let mut iter = self.clone();
11423        iter.pos = 0;
11424        for attr in iter {
11425            if let Ok(Fec::Active(val)) = attr {
11426                return Ok(val);
11427            }
11428        }
11429        Err(ErrorContext::new_missing(
11430            "Fec",
11431            "Active",
11432            self.orig_loc,
11433            self.buf.as_ptr() as usize,
11434        ))
11435    }
11436    pub fn get_stats(&self) -> Result<IterableFecStat<'a>, ErrorContext> {
11437        let mut iter = self.clone();
11438        iter.pos = 0;
11439        for attr in iter {
11440            if let Ok(Fec::Stats(val)) = attr {
11441                return Ok(val);
11442            }
11443        }
11444        Err(ErrorContext::new_missing(
11445            "Fec",
11446            "Stats",
11447            self.orig_loc,
11448            self.buf.as_ptr() as usize,
11449        ))
11450    }
11451}
11452impl Fec<'_> {
11453    pub fn new<'a>(buf: &'a [u8]) -> IterableFec<'a> {
11454        IterableFec::with_loc(buf, buf.as_ptr() as usize)
11455    }
11456    fn attr_from_type(r#type: u16) -> Option<&'static str> {
11457        let res = match r#type {
11458            0u16 => "Unspec",
11459            1u16 => "Header",
11460            2u16 => "Modes",
11461            3u16 => "Auto",
11462            4u16 => "Active",
11463            5u16 => "Stats",
11464            _ => return None,
11465        };
11466        Some(res)
11467    }
11468}
11469#[derive(Clone, Copy, Default)]
11470pub struct IterableFec<'a> {
11471    buf: &'a [u8],
11472    pos: usize,
11473    orig_loc: usize,
11474}
11475impl<'a> IterableFec<'a> {
11476    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11477        Self {
11478            buf,
11479            pos: 0,
11480            orig_loc,
11481        }
11482    }
11483    pub fn get_buf(&self) -> &'a [u8] {
11484        self.buf
11485    }
11486}
11487impl<'a> Iterator for IterableFec<'a> {
11488    type Item = Result<Fec<'a>, ErrorContext>;
11489    fn next(&mut self) -> Option<Self::Item> {
11490        let mut pos;
11491        let mut r#type;
11492        loop {
11493            pos = self.pos;
11494            r#type = None;
11495            if self.buf.len() == self.pos {
11496                return None;
11497            }
11498            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11499                self.pos = self.buf.len();
11500                break;
11501            };
11502            r#type = Some(header.r#type);
11503            let res = match header.r#type {
11504                1u16 => Fec::Header({
11505                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
11506                    let Some(val) = res else { break };
11507                    val
11508                }),
11509                2u16 => Fec::Modes({
11510                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
11511                    let Some(val) = res else { break };
11512                    val
11513                }),
11514                3u16 => Fec::Auto({
11515                    let res = parse_u8(next);
11516                    let Some(val) = res else { break };
11517                    val
11518                }),
11519                4u16 => Fec::Active({
11520                    let res = parse_u32(next);
11521                    let Some(val) = res else { break };
11522                    val
11523                }),
11524                5u16 => Fec::Stats({
11525                    let res = Some(IterableFecStat::with_loc(next, self.orig_loc));
11526                    let Some(val) = res else { break };
11527                    val
11528                }),
11529                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11530                n => continue,
11531            };
11532            return Some(Ok(res));
11533        }
11534        Some(Err(ErrorContext::new(
11535            "Fec",
11536            r#type.and_then(|t| Fec::attr_from_type(t)),
11537            self.orig_loc,
11538            self.buf.as_ptr().wrapping_add(pos) as usize,
11539        )))
11540    }
11541}
11542impl<'a> std::fmt::Debug for IterableFec<'_> {
11543    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11544        let mut fmt = f.debug_struct("Fec");
11545        for attr in self.clone() {
11546            let attr = match attr {
11547                Ok(a) => a,
11548                Err(err) => {
11549                    fmt.finish()?;
11550                    f.write_str("Err(")?;
11551                    err.fmt(f)?;
11552                    return f.write_str(")");
11553                }
11554            };
11555            match attr {
11556                Fec::Header(val) => fmt.field("Header", &val),
11557                Fec::Modes(val) => fmt.field("Modes", &val),
11558                Fec::Auto(val) => fmt.field("Auto", &val),
11559                Fec::Active(val) => fmt.field("Active", &val),
11560                Fec::Stats(val) => fmt.field("Stats", &val),
11561            };
11562        }
11563        fmt.finish()
11564    }
11565}
11566impl IterableFec<'_> {
11567    pub fn lookup_attr(
11568        &self,
11569        offset: usize,
11570        missing_type: Option<u16>,
11571    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11572        let mut stack = Vec::new();
11573        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11574        if missing_type.is_some() && cur == offset {
11575            stack.push(("Fec", offset));
11576            return (stack, missing_type.and_then(|t| Fec::attr_from_type(t)));
11577        }
11578        if cur > offset || cur + self.buf.len() < offset {
11579            return (stack, None);
11580        }
11581        let mut attrs = self.clone();
11582        let mut last_off = cur + attrs.pos;
11583        let mut missing = None;
11584        while let Some(attr) = attrs.next() {
11585            let Ok(attr) = attr else { break };
11586            match attr {
11587                Fec::Header(val) => {
11588                    (stack, missing) = val.lookup_attr(offset, missing_type);
11589                    if !stack.is_empty() {
11590                        break;
11591                    }
11592                }
11593                Fec::Modes(val) => {
11594                    (stack, missing) = val.lookup_attr(offset, missing_type);
11595                    if !stack.is_empty() {
11596                        break;
11597                    }
11598                }
11599                Fec::Auto(val) => {
11600                    if last_off == offset {
11601                        stack.push(("Auto", last_off));
11602                        break;
11603                    }
11604                }
11605                Fec::Active(val) => {
11606                    if last_off == offset {
11607                        stack.push(("Active", last_off));
11608                        break;
11609                    }
11610                }
11611                Fec::Stats(val) => {
11612                    (stack, missing) = val.lookup_attr(offset, missing_type);
11613                    if !stack.is_empty() {
11614                        break;
11615                    }
11616                }
11617                _ => {}
11618            };
11619            last_off = cur + attrs.pos;
11620        }
11621        if !stack.is_empty() {
11622            stack.push(("Fec", cur));
11623        }
11624        (stack, missing)
11625    }
11626}
11627#[derive(Clone)]
11628pub enum ModuleEeprom<'a> {
11629    Header(IterableHeader<'a>),
11630    Offset(u32),
11631    Length(u32),
11632    Page(u8),
11633    Bank(u8),
11634    I2cAddress(u8),
11635    Data(&'a [u8]),
11636}
11637impl<'a> IterableModuleEeprom<'a> {
11638    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
11639        let mut iter = self.clone();
11640        iter.pos = 0;
11641        for attr in iter {
11642            if let Ok(ModuleEeprom::Header(val)) = attr {
11643                return Ok(val);
11644            }
11645        }
11646        Err(ErrorContext::new_missing(
11647            "ModuleEeprom",
11648            "Header",
11649            self.orig_loc,
11650            self.buf.as_ptr() as usize,
11651        ))
11652    }
11653    pub fn get_offset(&self) -> Result<u32, ErrorContext> {
11654        let mut iter = self.clone();
11655        iter.pos = 0;
11656        for attr in iter {
11657            if let Ok(ModuleEeprom::Offset(val)) = attr {
11658                return Ok(val);
11659            }
11660        }
11661        Err(ErrorContext::new_missing(
11662            "ModuleEeprom",
11663            "Offset",
11664            self.orig_loc,
11665            self.buf.as_ptr() as usize,
11666        ))
11667    }
11668    pub fn get_length(&self) -> Result<u32, ErrorContext> {
11669        let mut iter = self.clone();
11670        iter.pos = 0;
11671        for attr in iter {
11672            if let Ok(ModuleEeprom::Length(val)) = attr {
11673                return Ok(val);
11674            }
11675        }
11676        Err(ErrorContext::new_missing(
11677            "ModuleEeprom",
11678            "Length",
11679            self.orig_loc,
11680            self.buf.as_ptr() as usize,
11681        ))
11682    }
11683    pub fn get_page(&self) -> Result<u8, ErrorContext> {
11684        let mut iter = self.clone();
11685        iter.pos = 0;
11686        for attr in iter {
11687            if let Ok(ModuleEeprom::Page(val)) = attr {
11688                return Ok(val);
11689            }
11690        }
11691        Err(ErrorContext::new_missing(
11692            "ModuleEeprom",
11693            "Page",
11694            self.orig_loc,
11695            self.buf.as_ptr() as usize,
11696        ))
11697    }
11698    pub fn get_bank(&self) -> Result<u8, ErrorContext> {
11699        let mut iter = self.clone();
11700        iter.pos = 0;
11701        for attr in iter {
11702            if let Ok(ModuleEeprom::Bank(val)) = attr {
11703                return Ok(val);
11704            }
11705        }
11706        Err(ErrorContext::new_missing(
11707            "ModuleEeprom",
11708            "Bank",
11709            self.orig_loc,
11710            self.buf.as_ptr() as usize,
11711        ))
11712    }
11713    pub fn get_i2c_address(&self) -> Result<u8, ErrorContext> {
11714        let mut iter = self.clone();
11715        iter.pos = 0;
11716        for attr in iter {
11717            if let Ok(ModuleEeprom::I2cAddress(val)) = attr {
11718                return Ok(val);
11719            }
11720        }
11721        Err(ErrorContext::new_missing(
11722            "ModuleEeprom",
11723            "I2cAddress",
11724            self.orig_loc,
11725            self.buf.as_ptr() as usize,
11726        ))
11727    }
11728    pub fn get_data(&self) -> Result<&'a [u8], ErrorContext> {
11729        let mut iter = self.clone();
11730        iter.pos = 0;
11731        for attr in iter {
11732            if let Ok(ModuleEeprom::Data(val)) = attr {
11733                return Ok(val);
11734            }
11735        }
11736        Err(ErrorContext::new_missing(
11737            "ModuleEeprom",
11738            "Data",
11739            self.orig_loc,
11740            self.buf.as_ptr() as usize,
11741        ))
11742    }
11743}
11744impl ModuleEeprom<'_> {
11745    pub fn new<'a>(buf: &'a [u8]) -> IterableModuleEeprom<'a> {
11746        IterableModuleEeprom::with_loc(buf, buf.as_ptr() as usize)
11747    }
11748    fn attr_from_type(r#type: u16) -> Option<&'static str> {
11749        let res = match r#type {
11750            0u16 => "Unspec",
11751            1u16 => "Header",
11752            2u16 => "Offset",
11753            3u16 => "Length",
11754            4u16 => "Page",
11755            5u16 => "Bank",
11756            6u16 => "I2cAddress",
11757            7u16 => "Data",
11758            _ => return None,
11759        };
11760        Some(res)
11761    }
11762}
11763#[derive(Clone, Copy, Default)]
11764pub struct IterableModuleEeprom<'a> {
11765    buf: &'a [u8],
11766    pos: usize,
11767    orig_loc: usize,
11768}
11769impl<'a> IterableModuleEeprom<'a> {
11770    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11771        Self {
11772            buf,
11773            pos: 0,
11774            orig_loc,
11775        }
11776    }
11777    pub fn get_buf(&self) -> &'a [u8] {
11778        self.buf
11779    }
11780}
11781impl<'a> Iterator for IterableModuleEeprom<'a> {
11782    type Item = Result<ModuleEeprom<'a>, ErrorContext>;
11783    fn next(&mut self) -> Option<Self::Item> {
11784        let mut pos;
11785        let mut r#type;
11786        loop {
11787            pos = self.pos;
11788            r#type = None;
11789            if self.buf.len() == self.pos {
11790                return None;
11791            }
11792            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11793                self.pos = self.buf.len();
11794                break;
11795            };
11796            r#type = Some(header.r#type);
11797            let res = match header.r#type {
11798                1u16 => ModuleEeprom::Header({
11799                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
11800                    let Some(val) = res else { break };
11801                    val
11802                }),
11803                2u16 => ModuleEeprom::Offset({
11804                    let res = parse_u32(next);
11805                    let Some(val) = res else { break };
11806                    val
11807                }),
11808                3u16 => ModuleEeprom::Length({
11809                    let res = parse_u32(next);
11810                    let Some(val) = res else { break };
11811                    val
11812                }),
11813                4u16 => ModuleEeprom::Page({
11814                    let res = parse_u8(next);
11815                    let Some(val) = res else { break };
11816                    val
11817                }),
11818                5u16 => ModuleEeprom::Bank({
11819                    let res = parse_u8(next);
11820                    let Some(val) = res else { break };
11821                    val
11822                }),
11823                6u16 => ModuleEeprom::I2cAddress({
11824                    let res = parse_u8(next);
11825                    let Some(val) = res else { break };
11826                    val
11827                }),
11828                7u16 => ModuleEeprom::Data({
11829                    let res = Some(next);
11830                    let Some(val) = res else { break };
11831                    val
11832                }),
11833                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11834                n => continue,
11835            };
11836            return Some(Ok(res));
11837        }
11838        Some(Err(ErrorContext::new(
11839            "ModuleEeprom",
11840            r#type.and_then(|t| ModuleEeprom::attr_from_type(t)),
11841            self.orig_loc,
11842            self.buf.as_ptr().wrapping_add(pos) as usize,
11843        )))
11844    }
11845}
11846impl<'a> std::fmt::Debug for IterableModuleEeprom<'_> {
11847    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11848        let mut fmt = f.debug_struct("ModuleEeprom");
11849        for attr in self.clone() {
11850            let attr = match attr {
11851                Ok(a) => a,
11852                Err(err) => {
11853                    fmt.finish()?;
11854                    f.write_str("Err(")?;
11855                    err.fmt(f)?;
11856                    return f.write_str(")");
11857                }
11858            };
11859            match attr {
11860                ModuleEeprom::Header(val) => fmt.field("Header", &val),
11861                ModuleEeprom::Offset(val) => fmt.field("Offset", &val),
11862                ModuleEeprom::Length(val) => fmt.field("Length", &val),
11863                ModuleEeprom::Page(val) => fmt.field("Page", &val),
11864                ModuleEeprom::Bank(val) => fmt.field("Bank", &val),
11865                ModuleEeprom::I2cAddress(val) => fmt.field("I2cAddress", &val),
11866                ModuleEeprom::Data(val) => fmt.field("Data", &val),
11867            };
11868        }
11869        fmt.finish()
11870    }
11871}
11872impl IterableModuleEeprom<'_> {
11873    pub fn lookup_attr(
11874        &self,
11875        offset: usize,
11876        missing_type: Option<u16>,
11877    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11878        let mut stack = Vec::new();
11879        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11880        if missing_type.is_some() && cur == offset {
11881            stack.push(("ModuleEeprom", offset));
11882            return (
11883                stack,
11884                missing_type.and_then(|t| ModuleEeprom::attr_from_type(t)),
11885            );
11886        }
11887        if cur > offset || cur + self.buf.len() < offset {
11888            return (stack, None);
11889        }
11890        let mut attrs = self.clone();
11891        let mut last_off = cur + attrs.pos;
11892        let mut missing = None;
11893        while let Some(attr) = attrs.next() {
11894            let Ok(attr) = attr else { break };
11895            match attr {
11896                ModuleEeprom::Header(val) => {
11897                    (stack, missing) = val.lookup_attr(offset, missing_type);
11898                    if !stack.is_empty() {
11899                        break;
11900                    }
11901                }
11902                ModuleEeprom::Offset(val) => {
11903                    if last_off == offset {
11904                        stack.push(("Offset", last_off));
11905                        break;
11906                    }
11907                }
11908                ModuleEeprom::Length(val) => {
11909                    if last_off == offset {
11910                        stack.push(("Length", last_off));
11911                        break;
11912                    }
11913                }
11914                ModuleEeprom::Page(val) => {
11915                    if last_off == offset {
11916                        stack.push(("Page", last_off));
11917                        break;
11918                    }
11919                }
11920                ModuleEeprom::Bank(val) => {
11921                    if last_off == offset {
11922                        stack.push(("Bank", last_off));
11923                        break;
11924                    }
11925                }
11926                ModuleEeprom::I2cAddress(val) => {
11927                    if last_off == offset {
11928                        stack.push(("I2cAddress", last_off));
11929                        break;
11930                    }
11931                }
11932                ModuleEeprom::Data(val) => {
11933                    if last_off == offset {
11934                        stack.push(("Data", last_off));
11935                        break;
11936                    }
11937                }
11938                _ => {}
11939            };
11940            last_off = cur + attrs.pos;
11941        }
11942        if !stack.is_empty() {
11943            stack.push(("ModuleEeprom", cur));
11944        }
11945        (stack, missing)
11946    }
11947}
11948#[derive(Clone)]
11949pub enum StatsGrp<'a> {
11950    Pad(&'a [u8]),
11951    Id(u32),
11952    SsId(u32),
11953    Stat(u64),
11954    HistRx(IterableStatsGrpHist<'a>),
11955    HistTx(IterableStatsGrpHist<'a>),
11956    HistBktLow(u32),
11957    HistBktHi(u32),
11958    HistVal(u64),
11959}
11960impl<'a> IterableStatsGrp<'a> {
11961    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
11962        let mut iter = self.clone();
11963        iter.pos = 0;
11964        for attr in iter {
11965            if let Ok(StatsGrp::Pad(val)) = attr {
11966                return Ok(val);
11967            }
11968        }
11969        Err(ErrorContext::new_missing(
11970            "StatsGrp",
11971            "Pad",
11972            self.orig_loc,
11973            self.buf.as_ptr() as usize,
11974        ))
11975    }
11976    pub fn get_id(&self) -> Result<u32, ErrorContext> {
11977        let mut iter = self.clone();
11978        iter.pos = 0;
11979        for attr in iter {
11980            if let Ok(StatsGrp::Id(val)) = attr {
11981                return Ok(val);
11982            }
11983        }
11984        Err(ErrorContext::new_missing(
11985            "StatsGrp",
11986            "Id",
11987            self.orig_loc,
11988            self.buf.as_ptr() as usize,
11989        ))
11990    }
11991    pub fn get_ss_id(&self) -> Result<u32, ErrorContext> {
11992        let mut iter = self.clone();
11993        iter.pos = 0;
11994        for attr in iter {
11995            if let Ok(StatsGrp::SsId(val)) = attr {
11996                return Ok(val);
11997            }
11998        }
11999        Err(ErrorContext::new_missing(
12000            "StatsGrp",
12001            "SsId",
12002            self.orig_loc,
12003            self.buf.as_ptr() as usize,
12004        ))
12005    }
12006    pub fn get_stat(&self) -> Result<u64, ErrorContext> {
12007        let mut iter = self.clone();
12008        iter.pos = 0;
12009        for attr in iter {
12010            if let Ok(StatsGrp::Stat(val)) = attr {
12011                return Ok(val);
12012            }
12013        }
12014        Err(ErrorContext::new_missing(
12015            "StatsGrp",
12016            "Stat",
12017            self.orig_loc,
12018            self.buf.as_ptr() as usize,
12019        ))
12020    }
12021    pub fn get_hist_rx(&self) -> Result<IterableStatsGrpHist<'a>, ErrorContext> {
12022        let mut iter = self.clone();
12023        iter.pos = 0;
12024        for attr in iter {
12025            if let Ok(StatsGrp::HistRx(val)) = attr {
12026                return Ok(val);
12027            }
12028        }
12029        Err(ErrorContext::new_missing(
12030            "StatsGrp",
12031            "HistRx",
12032            self.orig_loc,
12033            self.buf.as_ptr() as usize,
12034        ))
12035    }
12036    pub fn get_hist_tx(&self) -> Result<IterableStatsGrpHist<'a>, ErrorContext> {
12037        let mut iter = self.clone();
12038        iter.pos = 0;
12039        for attr in iter {
12040            if let Ok(StatsGrp::HistTx(val)) = attr {
12041                return Ok(val);
12042            }
12043        }
12044        Err(ErrorContext::new_missing(
12045            "StatsGrp",
12046            "HistTx",
12047            self.orig_loc,
12048            self.buf.as_ptr() as usize,
12049        ))
12050    }
12051    pub fn get_hist_bkt_low(&self) -> Result<u32, ErrorContext> {
12052        let mut iter = self.clone();
12053        iter.pos = 0;
12054        for attr in iter {
12055            if let Ok(StatsGrp::HistBktLow(val)) = attr {
12056                return Ok(val);
12057            }
12058        }
12059        Err(ErrorContext::new_missing(
12060            "StatsGrp",
12061            "HistBktLow",
12062            self.orig_loc,
12063            self.buf.as_ptr() as usize,
12064        ))
12065    }
12066    pub fn get_hist_bkt_hi(&self) -> Result<u32, ErrorContext> {
12067        let mut iter = self.clone();
12068        iter.pos = 0;
12069        for attr in iter {
12070            if let Ok(StatsGrp::HistBktHi(val)) = attr {
12071                return Ok(val);
12072            }
12073        }
12074        Err(ErrorContext::new_missing(
12075            "StatsGrp",
12076            "HistBktHi",
12077            self.orig_loc,
12078            self.buf.as_ptr() as usize,
12079        ))
12080    }
12081    pub fn get_hist_val(&self) -> Result<u64, ErrorContext> {
12082        let mut iter = self.clone();
12083        iter.pos = 0;
12084        for attr in iter {
12085            if let Ok(StatsGrp::HistVal(val)) = attr {
12086                return Ok(val);
12087            }
12088        }
12089        Err(ErrorContext::new_missing(
12090            "StatsGrp",
12091            "HistVal",
12092            self.orig_loc,
12093            self.buf.as_ptr() as usize,
12094        ))
12095    }
12096}
12097impl StatsGrp<'_> {
12098    pub fn new<'a>(buf: &'a [u8]) -> IterableStatsGrp<'a> {
12099        IterableStatsGrp::with_loc(buf, buf.as_ptr() as usize)
12100    }
12101    fn attr_from_type(r#type: u16) -> Option<&'static str> {
12102        let res = match r#type {
12103            0u16 => "Unspec",
12104            1u16 => "Pad",
12105            2u16 => "Id",
12106            3u16 => "SsId",
12107            4u16 => "Stat",
12108            5u16 => "HistRx",
12109            6u16 => "HistTx",
12110            7u16 => "HistBktLow",
12111            8u16 => "HistBktHi",
12112            9u16 => "HistVal",
12113            _ => return None,
12114        };
12115        Some(res)
12116    }
12117}
12118#[derive(Clone, Copy, Default)]
12119pub struct IterableStatsGrp<'a> {
12120    buf: &'a [u8],
12121    pos: usize,
12122    orig_loc: usize,
12123}
12124impl<'a> IterableStatsGrp<'a> {
12125    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12126        Self {
12127            buf,
12128            pos: 0,
12129            orig_loc,
12130        }
12131    }
12132    pub fn get_buf(&self) -> &'a [u8] {
12133        self.buf
12134    }
12135}
12136impl<'a> Iterator for IterableStatsGrp<'a> {
12137    type Item = Result<StatsGrp<'a>, ErrorContext>;
12138    fn next(&mut self) -> Option<Self::Item> {
12139        let mut pos;
12140        let mut r#type;
12141        loop {
12142            pos = self.pos;
12143            r#type = None;
12144            if self.buf.len() == self.pos {
12145                return None;
12146            }
12147            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12148                self.pos = self.buf.len();
12149                break;
12150            };
12151            r#type = Some(header.r#type);
12152            let res = match header.r#type {
12153                1u16 => StatsGrp::Pad({
12154                    let res = Some(next);
12155                    let Some(val) = res else { break };
12156                    val
12157                }),
12158                2u16 => StatsGrp::Id({
12159                    let res = parse_u32(next);
12160                    let Some(val) = res else { break };
12161                    val
12162                }),
12163                3u16 => StatsGrp::SsId({
12164                    let res = parse_u32(next);
12165                    let Some(val) = res else { break };
12166                    val
12167                }),
12168                4u16 => StatsGrp::Stat({
12169                    let res = parse_u64(next);
12170                    let Some(val) = res else { break };
12171                    val
12172                }),
12173                5u16 => StatsGrp::HistRx({
12174                    let res = Some(IterableStatsGrpHist::with_loc(next, self.orig_loc));
12175                    let Some(val) = res else { break };
12176                    val
12177                }),
12178                6u16 => StatsGrp::HistTx({
12179                    let res = Some(IterableStatsGrpHist::with_loc(next, self.orig_loc));
12180                    let Some(val) = res else { break };
12181                    val
12182                }),
12183                7u16 => StatsGrp::HistBktLow({
12184                    let res = parse_u32(next);
12185                    let Some(val) = res else { break };
12186                    val
12187                }),
12188                8u16 => StatsGrp::HistBktHi({
12189                    let res = parse_u32(next);
12190                    let Some(val) = res else { break };
12191                    val
12192                }),
12193                9u16 => StatsGrp::HistVal({
12194                    let res = parse_u64(next);
12195                    let Some(val) = res else { break };
12196                    val
12197                }),
12198                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12199                n => continue,
12200            };
12201            return Some(Ok(res));
12202        }
12203        Some(Err(ErrorContext::new(
12204            "StatsGrp",
12205            r#type.and_then(|t| StatsGrp::attr_from_type(t)),
12206            self.orig_loc,
12207            self.buf.as_ptr().wrapping_add(pos) as usize,
12208        )))
12209    }
12210}
12211impl<'a> std::fmt::Debug for IterableStatsGrp<'_> {
12212    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12213        let mut fmt = f.debug_struct("StatsGrp");
12214        for attr in self.clone() {
12215            let attr = match attr {
12216                Ok(a) => a,
12217                Err(err) => {
12218                    fmt.finish()?;
12219                    f.write_str("Err(")?;
12220                    err.fmt(f)?;
12221                    return f.write_str(")");
12222                }
12223            };
12224            match attr {
12225                StatsGrp::Pad(val) => fmt.field("Pad", &val),
12226                StatsGrp::Id(val) => fmt.field("Id", &val),
12227                StatsGrp::SsId(val) => fmt.field("SsId", &val),
12228                StatsGrp::Stat(val) => fmt.field("Stat", &val),
12229                StatsGrp::HistRx(val) => fmt.field("HistRx", &val),
12230                StatsGrp::HistTx(val) => fmt.field("HistTx", &val),
12231                StatsGrp::HistBktLow(val) => fmt.field("HistBktLow", &val),
12232                StatsGrp::HistBktHi(val) => fmt.field("HistBktHi", &val),
12233                StatsGrp::HistVal(val) => fmt.field("HistVal", &val),
12234            };
12235        }
12236        fmt.finish()
12237    }
12238}
12239impl IterableStatsGrp<'_> {
12240    pub fn lookup_attr(
12241        &self,
12242        offset: usize,
12243        missing_type: Option<u16>,
12244    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12245        let mut stack = Vec::new();
12246        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12247        if missing_type.is_some() && cur == offset {
12248            stack.push(("StatsGrp", offset));
12249            return (
12250                stack,
12251                missing_type.and_then(|t| StatsGrp::attr_from_type(t)),
12252            );
12253        }
12254        if cur > offset || cur + self.buf.len() < offset {
12255            return (stack, None);
12256        }
12257        let mut attrs = self.clone();
12258        let mut last_off = cur + attrs.pos;
12259        let mut missing = None;
12260        while let Some(attr) = attrs.next() {
12261            let Ok(attr) = attr else { break };
12262            match attr {
12263                StatsGrp::Pad(val) => {
12264                    if last_off == offset {
12265                        stack.push(("Pad", last_off));
12266                        break;
12267                    }
12268                }
12269                StatsGrp::Id(val) => {
12270                    if last_off == offset {
12271                        stack.push(("Id", last_off));
12272                        break;
12273                    }
12274                }
12275                StatsGrp::SsId(val) => {
12276                    if last_off == offset {
12277                        stack.push(("SsId", last_off));
12278                        break;
12279                    }
12280                }
12281                StatsGrp::Stat(val) => {
12282                    if last_off == offset {
12283                        stack.push(("Stat", last_off));
12284                        break;
12285                    }
12286                }
12287                StatsGrp::HistRx(val) => {
12288                    (stack, missing) = val.lookup_attr(offset, missing_type);
12289                    if !stack.is_empty() {
12290                        break;
12291                    }
12292                }
12293                StatsGrp::HistTx(val) => {
12294                    (stack, missing) = val.lookup_attr(offset, missing_type);
12295                    if !stack.is_empty() {
12296                        break;
12297                    }
12298                }
12299                StatsGrp::HistBktLow(val) => {
12300                    if last_off == offset {
12301                        stack.push(("HistBktLow", last_off));
12302                        break;
12303                    }
12304                }
12305                StatsGrp::HistBktHi(val) => {
12306                    if last_off == offset {
12307                        stack.push(("HistBktHi", last_off));
12308                        break;
12309                    }
12310                }
12311                StatsGrp::HistVal(val) => {
12312                    if last_off == offset {
12313                        stack.push(("HistVal", last_off));
12314                        break;
12315                    }
12316                }
12317                _ => {}
12318            };
12319            last_off = cur + attrs.pos;
12320        }
12321        if !stack.is_empty() {
12322            stack.push(("StatsGrp", cur));
12323        }
12324        (stack, missing)
12325    }
12326}
12327#[derive(Clone)]
12328pub enum StatsGrpHist {
12329    HistBktLow(u32),
12330    HistBktHi(u32),
12331    HistVal(u64),
12332}
12333impl<'a> IterableStatsGrpHist<'a> {
12334    pub fn get_hist_bkt_low(&self) -> Result<u32, ErrorContext> {
12335        let mut iter = self.clone();
12336        iter.pos = 0;
12337        for attr in iter {
12338            if let Ok(StatsGrpHist::HistBktLow(val)) = attr {
12339                return Ok(val);
12340            }
12341        }
12342        Err(ErrorContext::new_missing(
12343            "StatsGrpHist",
12344            "HistBktLow",
12345            self.orig_loc,
12346            self.buf.as_ptr() as usize,
12347        ))
12348    }
12349    pub fn get_hist_bkt_hi(&self) -> Result<u32, ErrorContext> {
12350        let mut iter = self.clone();
12351        iter.pos = 0;
12352        for attr in iter {
12353            if let Ok(StatsGrpHist::HistBktHi(val)) = attr {
12354                return Ok(val);
12355            }
12356        }
12357        Err(ErrorContext::new_missing(
12358            "StatsGrpHist",
12359            "HistBktHi",
12360            self.orig_loc,
12361            self.buf.as_ptr() as usize,
12362        ))
12363    }
12364    pub fn get_hist_val(&self) -> Result<u64, ErrorContext> {
12365        let mut iter = self.clone();
12366        iter.pos = 0;
12367        for attr in iter {
12368            if let Ok(StatsGrpHist::HistVal(val)) = attr {
12369                return Ok(val);
12370            }
12371        }
12372        Err(ErrorContext::new_missing(
12373            "StatsGrpHist",
12374            "HistVal",
12375            self.orig_loc,
12376            self.buf.as_ptr() as usize,
12377        ))
12378    }
12379}
12380impl StatsGrpHist {
12381    pub fn new<'a>(buf: &'a [u8]) -> IterableStatsGrpHist<'a> {
12382        IterableStatsGrpHist::with_loc(buf, buf.as_ptr() as usize)
12383    }
12384    fn attr_from_type(r#type: u16) -> Option<&'static str> {
12385        StatsGrp::attr_from_type(r#type)
12386    }
12387}
12388#[derive(Clone, Copy, Default)]
12389pub struct IterableStatsGrpHist<'a> {
12390    buf: &'a [u8],
12391    pos: usize,
12392    orig_loc: usize,
12393}
12394impl<'a> IterableStatsGrpHist<'a> {
12395    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12396        Self {
12397            buf,
12398            pos: 0,
12399            orig_loc,
12400        }
12401    }
12402    pub fn get_buf(&self) -> &'a [u8] {
12403        self.buf
12404    }
12405}
12406impl<'a> Iterator for IterableStatsGrpHist<'a> {
12407    type Item = Result<StatsGrpHist, ErrorContext>;
12408    fn next(&mut self) -> Option<Self::Item> {
12409        let mut pos;
12410        let mut r#type;
12411        loop {
12412            pos = self.pos;
12413            r#type = None;
12414            if self.buf.len() == self.pos {
12415                return None;
12416            }
12417            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12418                self.pos = self.buf.len();
12419                break;
12420            };
12421            r#type = Some(header.r#type);
12422            let res = match header.r#type {
12423                7u16 => StatsGrpHist::HistBktLow({
12424                    let res = parse_u32(next);
12425                    let Some(val) = res else { break };
12426                    val
12427                }),
12428                8u16 => StatsGrpHist::HistBktHi({
12429                    let res = parse_u32(next);
12430                    let Some(val) = res else { break };
12431                    val
12432                }),
12433                9u16 => StatsGrpHist::HistVal({
12434                    let res = parse_u64(next);
12435                    let Some(val) = res else { break };
12436                    val
12437                }),
12438                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12439                n => continue,
12440            };
12441            return Some(Ok(res));
12442        }
12443        Some(Err(ErrorContext::new(
12444            "StatsGrpHist",
12445            r#type.and_then(|t| StatsGrpHist::attr_from_type(t)),
12446            self.orig_loc,
12447            self.buf.as_ptr().wrapping_add(pos) as usize,
12448        )))
12449    }
12450}
12451impl std::fmt::Debug for IterableStatsGrpHist<'_> {
12452    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12453        let mut fmt = f.debug_struct("StatsGrpHist");
12454        for attr in self.clone() {
12455            let attr = match attr {
12456                Ok(a) => a,
12457                Err(err) => {
12458                    fmt.finish()?;
12459                    f.write_str("Err(")?;
12460                    err.fmt(f)?;
12461                    return f.write_str(")");
12462                }
12463            };
12464            match attr {
12465                StatsGrpHist::HistBktLow(val) => fmt.field("HistBktLow", &val),
12466                StatsGrpHist::HistBktHi(val) => fmt.field("HistBktHi", &val),
12467                StatsGrpHist::HistVal(val) => fmt.field("HistVal", &val),
12468            };
12469        }
12470        fmt.finish()
12471    }
12472}
12473impl IterableStatsGrpHist<'_> {
12474    pub fn lookup_attr(
12475        &self,
12476        offset: usize,
12477        missing_type: Option<u16>,
12478    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12479        let mut stack = Vec::new();
12480        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12481        if missing_type.is_some() && cur == offset {
12482            stack.push(("StatsGrpHist", offset));
12483            return (
12484                stack,
12485                missing_type.and_then(|t| StatsGrpHist::attr_from_type(t)),
12486            );
12487        }
12488        if cur > offset || cur + self.buf.len() < offset {
12489            return (stack, None);
12490        }
12491        let mut attrs = self.clone();
12492        let mut last_off = cur + attrs.pos;
12493        while let Some(attr) = attrs.next() {
12494            let Ok(attr) = attr else { break };
12495            match attr {
12496                StatsGrpHist::HistBktLow(val) => {
12497                    if last_off == offset {
12498                        stack.push(("HistBktLow", last_off));
12499                        break;
12500                    }
12501                }
12502                StatsGrpHist::HistBktHi(val) => {
12503                    if last_off == offset {
12504                        stack.push(("HistBktHi", last_off));
12505                        break;
12506                    }
12507                }
12508                StatsGrpHist::HistVal(val) => {
12509                    if last_off == offset {
12510                        stack.push(("HistVal", last_off));
12511                        break;
12512                    }
12513                }
12514                _ => {}
12515            };
12516            last_off = cur + attrs.pos;
12517        }
12518        if !stack.is_empty() {
12519            stack.push(("StatsGrpHist", cur));
12520        }
12521        (stack, None)
12522    }
12523}
12524#[derive(Clone)]
12525pub enum Stats<'a> {
12526    Pad(&'a [u8]),
12527    Header(IterableHeader<'a>),
12528    Groups(IterableBitset<'a>),
12529    Grp(IterableStatsGrp<'a>),
12530    Src(u32),
12531}
12532impl<'a> IterableStats<'a> {
12533    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
12534        let mut iter = self.clone();
12535        iter.pos = 0;
12536        for attr in iter {
12537            if let Ok(Stats::Pad(val)) = attr {
12538                return Ok(val);
12539            }
12540        }
12541        Err(ErrorContext::new_missing(
12542            "Stats",
12543            "Pad",
12544            self.orig_loc,
12545            self.buf.as_ptr() as usize,
12546        ))
12547    }
12548    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
12549        let mut iter = self.clone();
12550        iter.pos = 0;
12551        for attr in iter {
12552            if let Ok(Stats::Header(val)) = attr {
12553                return Ok(val);
12554            }
12555        }
12556        Err(ErrorContext::new_missing(
12557            "Stats",
12558            "Header",
12559            self.orig_loc,
12560            self.buf.as_ptr() as usize,
12561        ))
12562    }
12563    pub fn get_groups(&self) -> Result<IterableBitset<'a>, ErrorContext> {
12564        let mut iter = self.clone();
12565        iter.pos = 0;
12566        for attr in iter {
12567            if let Ok(Stats::Groups(val)) = attr {
12568                return Ok(val);
12569            }
12570        }
12571        Err(ErrorContext::new_missing(
12572            "Stats",
12573            "Groups",
12574            self.orig_loc,
12575            self.buf.as_ptr() as usize,
12576        ))
12577    }
12578    pub fn get_grp(&self) -> Result<IterableStatsGrp<'a>, ErrorContext> {
12579        let mut iter = self.clone();
12580        iter.pos = 0;
12581        for attr in iter {
12582            if let Ok(Stats::Grp(val)) = attr {
12583                return Ok(val);
12584            }
12585        }
12586        Err(ErrorContext::new_missing(
12587            "Stats",
12588            "Grp",
12589            self.orig_loc,
12590            self.buf.as_ptr() as usize,
12591        ))
12592    }
12593    pub fn get_src(&self) -> Result<u32, ErrorContext> {
12594        let mut iter = self.clone();
12595        iter.pos = 0;
12596        for attr in iter {
12597            if let Ok(Stats::Src(val)) = attr {
12598                return Ok(val);
12599            }
12600        }
12601        Err(ErrorContext::new_missing(
12602            "Stats",
12603            "Src",
12604            self.orig_loc,
12605            self.buf.as_ptr() as usize,
12606        ))
12607    }
12608}
12609impl Stats<'_> {
12610    pub fn new<'a>(buf: &'a [u8]) -> IterableStats<'a> {
12611        IterableStats::with_loc(buf, buf.as_ptr() as usize)
12612    }
12613    fn attr_from_type(r#type: u16) -> Option<&'static str> {
12614        let res = match r#type {
12615            0u16 => "Unspec",
12616            1u16 => "Pad",
12617            2u16 => "Header",
12618            3u16 => "Groups",
12619            4u16 => "Grp",
12620            5u16 => "Src",
12621            _ => return None,
12622        };
12623        Some(res)
12624    }
12625}
12626#[derive(Clone, Copy, Default)]
12627pub struct IterableStats<'a> {
12628    buf: &'a [u8],
12629    pos: usize,
12630    orig_loc: usize,
12631}
12632impl<'a> IterableStats<'a> {
12633    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12634        Self {
12635            buf,
12636            pos: 0,
12637            orig_loc,
12638        }
12639    }
12640    pub fn get_buf(&self) -> &'a [u8] {
12641        self.buf
12642    }
12643}
12644impl<'a> Iterator for IterableStats<'a> {
12645    type Item = Result<Stats<'a>, ErrorContext>;
12646    fn next(&mut self) -> Option<Self::Item> {
12647        let mut pos;
12648        let mut r#type;
12649        loop {
12650            pos = self.pos;
12651            r#type = None;
12652            if self.buf.len() == self.pos {
12653                return None;
12654            }
12655            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12656                self.pos = self.buf.len();
12657                break;
12658            };
12659            r#type = Some(header.r#type);
12660            let res = match header.r#type {
12661                1u16 => Stats::Pad({
12662                    let res = Some(next);
12663                    let Some(val) = res else { break };
12664                    val
12665                }),
12666                2u16 => Stats::Header({
12667                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
12668                    let Some(val) = res else { break };
12669                    val
12670                }),
12671                3u16 => Stats::Groups({
12672                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
12673                    let Some(val) = res else { break };
12674                    val
12675                }),
12676                4u16 => Stats::Grp({
12677                    let res = Some(IterableStatsGrp::with_loc(next, self.orig_loc));
12678                    let Some(val) = res else { break };
12679                    val
12680                }),
12681                5u16 => Stats::Src({
12682                    let res = parse_u32(next);
12683                    let Some(val) = res else { break };
12684                    val
12685                }),
12686                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12687                n => continue,
12688            };
12689            return Some(Ok(res));
12690        }
12691        Some(Err(ErrorContext::new(
12692            "Stats",
12693            r#type.and_then(|t| Stats::attr_from_type(t)),
12694            self.orig_loc,
12695            self.buf.as_ptr().wrapping_add(pos) as usize,
12696        )))
12697    }
12698}
12699impl<'a> std::fmt::Debug for IterableStats<'_> {
12700    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12701        let mut fmt = f.debug_struct("Stats");
12702        for attr in self.clone() {
12703            let attr = match attr {
12704                Ok(a) => a,
12705                Err(err) => {
12706                    fmt.finish()?;
12707                    f.write_str("Err(")?;
12708                    err.fmt(f)?;
12709                    return f.write_str(")");
12710                }
12711            };
12712            match attr {
12713                Stats::Pad(val) => fmt.field("Pad", &val),
12714                Stats::Header(val) => fmt.field("Header", &val),
12715                Stats::Groups(val) => fmt.field("Groups", &val),
12716                Stats::Grp(val) => fmt.field("Grp", &val),
12717                Stats::Src(val) => fmt.field("Src", &val),
12718            };
12719        }
12720        fmt.finish()
12721    }
12722}
12723impl IterableStats<'_> {
12724    pub fn lookup_attr(
12725        &self,
12726        offset: usize,
12727        missing_type: Option<u16>,
12728    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12729        let mut stack = Vec::new();
12730        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12731        if missing_type.is_some() && cur == offset {
12732            stack.push(("Stats", offset));
12733            return (stack, missing_type.and_then(|t| Stats::attr_from_type(t)));
12734        }
12735        if cur > offset || cur + self.buf.len() < offset {
12736            return (stack, None);
12737        }
12738        let mut attrs = self.clone();
12739        let mut last_off = cur + attrs.pos;
12740        let mut missing = None;
12741        while let Some(attr) = attrs.next() {
12742            let Ok(attr) = attr else { break };
12743            match attr {
12744                Stats::Pad(val) => {
12745                    if last_off == offset {
12746                        stack.push(("Pad", last_off));
12747                        break;
12748                    }
12749                }
12750                Stats::Header(val) => {
12751                    (stack, missing) = val.lookup_attr(offset, missing_type);
12752                    if !stack.is_empty() {
12753                        break;
12754                    }
12755                }
12756                Stats::Groups(val) => {
12757                    (stack, missing) = val.lookup_attr(offset, missing_type);
12758                    if !stack.is_empty() {
12759                        break;
12760                    }
12761                }
12762                Stats::Grp(val) => {
12763                    (stack, missing) = val.lookup_attr(offset, missing_type);
12764                    if !stack.is_empty() {
12765                        break;
12766                    }
12767                }
12768                Stats::Src(val) => {
12769                    if last_off == offset {
12770                        stack.push(("Src", last_off));
12771                        break;
12772                    }
12773                }
12774                _ => {}
12775            };
12776            last_off = cur + attrs.pos;
12777        }
12778        if !stack.is_empty() {
12779            stack.push(("Stats", cur));
12780        }
12781        (stack, missing)
12782    }
12783}
12784#[derive(Clone)]
12785pub enum PhcVclocks<'a> {
12786    Header(IterableHeader<'a>),
12787    Num(u32),
12788    Index(&'a [u8]),
12789}
12790impl<'a> IterablePhcVclocks<'a> {
12791    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
12792        let mut iter = self.clone();
12793        iter.pos = 0;
12794        for attr in iter {
12795            if let Ok(PhcVclocks::Header(val)) = attr {
12796                return Ok(val);
12797            }
12798        }
12799        Err(ErrorContext::new_missing(
12800            "PhcVclocks",
12801            "Header",
12802            self.orig_loc,
12803            self.buf.as_ptr() as usize,
12804        ))
12805    }
12806    pub fn get_num(&self) -> Result<u32, ErrorContext> {
12807        let mut iter = self.clone();
12808        iter.pos = 0;
12809        for attr in iter {
12810            if let Ok(PhcVclocks::Num(val)) = attr {
12811                return Ok(val);
12812            }
12813        }
12814        Err(ErrorContext::new_missing(
12815            "PhcVclocks",
12816            "Num",
12817            self.orig_loc,
12818            self.buf.as_ptr() as usize,
12819        ))
12820    }
12821    pub fn get_index(&self) -> Result<&'a [u8], ErrorContext> {
12822        let mut iter = self.clone();
12823        iter.pos = 0;
12824        for attr in iter {
12825            if let Ok(PhcVclocks::Index(val)) = attr {
12826                return Ok(val);
12827            }
12828        }
12829        Err(ErrorContext::new_missing(
12830            "PhcVclocks",
12831            "Index",
12832            self.orig_loc,
12833            self.buf.as_ptr() as usize,
12834        ))
12835    }
12836}
12837impl PhcVclocks<'_> {
12838    pub fn new<'a>(buf: &'a [u8]) -> IterablePhcVclocks<'a> {
12839        IterablePhcVclocks::with_loc(buf, buf.as_ptr() as usize)
12840    }
12841    fn attr_from_type(r#type: u16) -> Option<&'static str> {
12842        let res = match r#type {
12843            0u16 => "Unspec",
12844            1u16 => "Header",
12845            2u16 => "Num",
12846            3u16 => "Index",
12847            _ => return None,
12848        };
12849        Some(res)
12850    }
12851}
12852#[derive(Clone, Copy, Default)]
12853pub struct IterablePhcVclocks<'a> {
12854    buf: &'a [u8],
12855    pos: usize,
12856    orig_loc: usize,
12857}
12858impl<'a> IterablePhcVclocks<'a> {
12859    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12860        Self {
12861            buf,
12862            pos: 0,
12863            orig_loc,
12864        }
12865    }
12866    pub fn get_buf(&self) -> &'a [u8] {
12867        self.buf
12868    }
12869}
12870impl<'a> Iterator for IterablePhcVclocks<'a> {
12871    type Item = Result<PhcVclocks<'a>, ErrorContext>;
12872    fn next(&mut self) -> Option<Self::Item> {
12873        let mut pos;
12874        let mut r#type;
12875        loop {
12876            pos = self.pos;
12877            r#type = None;
12878            if self.buf.len() == self.pos {
12879                return None;
12880            }
12881            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12882                self.pos = self.buf.len();
12883                break;
12884            };
12885            r#type = Some(header.r#type);
12886            let res = match header.r#type {
12887                1u16 => PhcVclocks::Header({
12888                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
12889                    let Some(val) = res else { break };
12890                    val
12891                }),
12892                2u16 => PhcVclocks::Num({
12893                    let res = parse_u32(next);
12894                    let Some(val) = res else { break };
12895                    val
12896                }),
12897                3u16 => PhcVclocks::Index({
12898                    let res = Some(next);
12899                    let Some(val) = res else { break };
12900                    val
12901                }),
12902                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12903                n => continue,
12904            };
12905            return Some(Ok(res));
12906        }
12907        Some(Err(ErrorContext::new(
12908            "PhcVclocks",
12909            r#type.and_then(|t| PhcVclocks::attr_from_type(t)),
12910            self.orig_loc,
12911            self.buf.as_ptr().wrapping_add(pos) as usize,
12912        )))
12913    }
12914}
12915impl<'a> std::fmt::Debug for IterablePhcVclocks<'_> {
12916    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12917        let mut fmt = f.debug_struct("PhcVclocks");
12918        for attr in self.clone() {
12919            let attr = match attr {
12920                Ok(a) => a,
12921                Err(err) => {
12922                    fmt.finish()?;
12923                    f.write_str("Err(")?;
12924                    err.fmt(f)?;
12925                    return f.write_str(")");
12926                }
12927            };
12928            match attr {
12929                PhcVclocks::Header(val) => fmt.field("Header", &val),
12930                PhcVclocks::Num(val) => fmt.field("Num", &val),
12931                PhcVclocks::Index(val) => fmt.field("Index", &val),
12932            };
12933        }
12934        fmt.finish()
12935    }
12936}
12937impl IterablePhcVclocks<'_> {
12938    pub fn lookup_attr(
12939        &self,
12940        offset: usize,
12941        missing_type: Option<u16>,
12942    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12943        let mut stack = Vec::new();
12944        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12945        if missing_type.is_some() && cur == offset {
12946            stack.push(("PhcVclocks", offset));
12947            return (
12948                stack,
12949                missing_type.and_then(|t| PhcVclocks::attr_from_type(t)),
12950            );
12951        }
12952        if cur > offset || cur + self.buf.len() < offset {
12953            return (stack, None);
12954        }
12955        let mut attrs = self.clone();
12956        let mut last_off = cur + attrs.pos;
12957        let mut missing = None;
12958        while let Some(attr) = attrs.next() {
12959            let Ok(attr) = attr else { break };
12960            match attr {
12961                PhcVclocks::Header(val) => {
12962                    (stack, missing) = val.lookup_attr(offset, missing_type);
12963                    if !stack.is_empty() {
12964                        break;
12965                    }
12966                }
12967                PhcVclocks::Num(val) => {
12968                    if last_off == offset {
12969                        stack.push(("Num", last_off));
12970                        break;
12971                    }
12972                }
12973                PhcVclocks::Index(val) => {
12974                    if last_off == offset {
12975                        stack.push(("Index", last_off));
12976                        break;
12977                    }
12978                }
12979                _ => {}
12980            };
12981            last_off = cur + attrs.pos;
12982        }
12983        if !stack.is_empty() {
12984            stack.push(("PhcVclocks", cur));
12985        }
12986        (stack, missing)
12987    }
12988}
12989#[derive(Clone)]
12990pub enum Module<'a> {
12991    Header(IterableHeader<'a>),
12992    PowerModePolicy(u8),
12993    PowerMode(u8),
12994}
12995impl<'a> IterableModule<'a> {
12996    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
12997        let mut iter = self.clone();
12998        iter.pos = 0;
12999        for attr in iter {
13000            if let Ok(Module::Header(val)) = attr {
13001                return Ok(val);
13002            }
13003        }
13004        Err(ErrorContext::new_missing(
13005            "Module",
13006            "Header",
13007            self.orig_loc,
13008            self.buf.as_ptr() as usize,
13009        ))
13010    }
13011    pub fn get_power_mode_policy(&self) -> Result<u8, ErrorContext> {
13012        let mut iter = self.clone();
13013        iter.pos = 0;
13014        for attr in iter {
13015            if let Ok(Module::PowerModePolicy(val)) = attr {
13016                return Ok(val);
13017            }
13018        }
13019        Err(ErrorContext::new_missing(
13020            "Module",
13021            "PowerModePolicy",
13022            self.orig_loc,
13023            self.buf.as_ptr() as usize,
13024        ))
13025    }
13026    pub fn get_power_mode(&self) -> Result<u8, ErrorContext> {
13027        let mut iter = self.clone();
13028        iter.pos = 0;
13029        for attr in iter {
13030            if let Ok(Module::PowerMode(val)) = attr {
13031                return Ok(val);
13032            }
13033        }
13034        Err(ErrorContext::new_missing(
13035            "Module",
13036            "PowerMode",
13037            self.orig_loc,
13038            self.buf.as_ptr() as usize,
13039        ))
13040    }
13041}
13042impl Module<'_> {
13043    pub fn new<'a>(buf: &'a [u8]) -> IterableModule<'a> {
13044        IterableModule::with_loc(buf, buf.as_ptr() as usize)
13045    }
13046    fn attr_from_type(r#type: u16) -> Option<&'static str> {
13047        let res = match r#type {
13048            0u16 => "Unspec",
13049            1u16 => "Header",
13050            2u16 => "PowerModePolicy",
13051            3u16 => "PowerMode",
13052            _ => return None,
13053        };
13054        Some(res)
13055    }
13056}
13057#[derive(Clone, Copy, Default)]
13058pub struct IterableModule<'a> {
13059    buf: &'a [u8],
13060    pos: usize,
13061    orig_loc: usize,
13062}
13063impl<'a> IterableModule<'a> {
13064    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
13065        Self {
13066            buf,
13067            pos: 0,
13068            orig_loc,
13069        }
13070    }
13071    pub fn get_buf(&self) -> &'a [u8] {
13072        self.buf
13073    }
13074}
13075impl<'a> Iterator for IterableModule<'a> {
13076    type Item = Result<Module<'a>, ErrorContext>;
13077    fn next(&mut self) -> Option<Self::Item> {
13078        let mut pos;
13079        let mut r#type;
13080        loop {
13081            pos = self.pos;
13082            r#type = None;
13083            if self.buf.len() == self.pos {
13084                return None;
13085            }
13086            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
13087                self.pos = self.buf.len();
13088                break;
13089            };
13090            r#type = Some(header.r#type);
13091            let res = match header.r#type {
13092                1u16 => Module::Header({
13093                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
13094                    let Some(val) = res else { break };
13095                    val
13096                }),
13097                2u16 => Module::PowerModePolicy({
13098                    let res = parse_u8(next);
13099                    let Some(val) = res else { break };
13100                    val
13101                }),
13102                3u16 => Module::PowerMode({
13103                    let res = parse_u8(next);
13104                    let Some(val) = res else { break };
13105                    val
13106                }),
13107                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
13108                n => continue,
13109            };
13110            return Some(Ok(res));
13111        }
13112        Some(Err(ErrorContext::new(
13113            "Module",
13114            r#type.and_then(|t| Module::attr_from_type(t)),
13115            self.orig_loc,
13116            self.buf.as_ptr().wrapping_add(pos) as usize,
13117        )))
13118    }
13119}
13120impl<'a> std::fmt::Debug for IterableModule<'_> {
13121    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13122        let mut fmt = f.debug_struct("Module");
13123        for attr in self.clone() {
13124            let attr = match attr {
13125                Ok(a) => a,
13126                Err(err) => {
13127                    fmt.finish()?;
13128                    f.write_str("Err(")?;
13129                    err.fmt(f)?;
13130                    return f.write_str(")");
13131                }
13132            };
13133            match attr {
13134                Module::Header(val) => fmt.field("Header", &val),
13135                Module::PowerModePolicy(val) => fmt.field("PowerModePolicy", &val),
13136                Module::PowerMode(val) => fmt.field("PowerMode", &val),
13137            };
13138        }
13139        fmt.finish()
13140    }
13141}
13142impl IterableModule<'_> {
13143    pub fn lookup_attr(
13144        &self,
13145        offset: usize,
13146        missing_type: Option<u16>,
13147    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
13148        let mut stack = Vec::new();
13149        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
13150        if missing_type.is_some() && cur == offset {
13151            stack.push(("Module", offset));
13152            return (stack, missing_type.and_then(|t| Module::attr_from_type(t)));
13153        }
13154        if cur > offset || cur + self.buf.len() < offset {
13155            return (stack, None);
13156        }
13157        let mut attrs = self.clone();
13158        let mut last_off = cur + attrs.pos;
13159        let mut missing = None;
13160        while let Some(attr) = attrs.next() {
13161            let Ok(attr) = attr else { break };
13162            match attr {
13163                Module::Header(val) => {
13164                    (stack, missing) = val.lookup_attr(offset, missing_type);
13165                    if !stack.is_empty() {
13166                        break;
13167                    }
13168                }
13169                Module::PowerModePolicy(val) => {
13170                    if last_off == offset {
13171                        stack.push(("PowerModePolicy", last_off));
13172                        break;
13173                    }
13174                }
13175                Module::PowerMode(val) => {
13176                    if last_off == offset {
13177                        stack.push(("PowerMode", last_off));
13178                        break;
13179                    }
13180                }
13181                _ => {}
13182            };
13183            last_off = cur + attrs.pos;
13184        }
13185        if !stack.is_empty() {
13186            stack.push(("Module", cur));
13187        }
13188        (stack, missing)
13189    }
13190}
13191#[derive(Clone)]
13192pub enum C33PsePwLimit {
13193    Min(u32),
13194    Max(u32),
13195}
13196impl<'a> IterableC33PsePwLimit<'a> {
13197    pub fn get_min(&self) -> Result<u32, ErrorContext> {
13198        let mut iter = self.clone();
13199        iter.pos = 0;
13200        for attr in iter {
13201            if let Ok(C33PsePwLimit::Min(val)) = attr {
13202                return Ok(val);
13203            }
13204        }
13205        Err(ErrorContext::new_missing(
13206            "C33PsePwLimit",
13207            "Min",
13208            self.orig_loc,
13209            self.buf.as_ptr() as usize,
13210        ))
13211    }
13212    pub fn get_max(&self) -> Result<u32, ErrorContext> {
13213        let mut iter = self.clone();
13214        iter.pos = 0;
13215        for attr in iter {
13216            if let Ok(C33PsePwLimit::Max(val)) = attr {
13217                return Ok(val);
13218            }
13219        }
13220        Err(ErrorContext::new_missing(
13221            "C33PsePwLimit",
13222            "Max",
13223            self.orig_loc,
13224            self.buf.as_ptr() as usize,
13225        ))
13226    }
13227}
13228impl C33PsePwLimit {
13229    pub fn new<'a>(buf: &'a [u8]) -> IterableC33PsePwLimit<'a> {
13230        IterableC33PsePwLimit::with_loc(buf, buf.as_ptr() as usize)
13231    }
13232    fn attr_from_type(r#type: u16) -> Option<&'static str> {
13233        let res = match r#type {
13234            0u16 => "Unspec",
13235            1u16 => "Min",
13236            2u16 => "Max",
13237            _ => return None,
13238        };
13239        Some(res)
13240    }
13241}
13242#[derive(Clone, Copy, Default)]
13243pub struct IterableC33PsePwLimit<'a> {
13244    buf: &'a [u8],
13245    pos: usize,
13246    orig_loc: usize,
13247}
13248impl<'a> IterableC33PsePwLimit<'a> {
13249    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
13250        Self {
13251            buf,
13252            pos: 0,
13253            orig_loc,
13254        }
13255    }
13256    pub fn get_buf(&self) -> &'a [u8] {
13257        self.buf
13258    }
13259}
13260impl<'a> Iterator for IterableC33PsePwLimit<'a> {
13261    type Item = Result<C33PsePwLimit, ErrorContext>;
13262    fn next(&mut self) -> Option<Self::Item> {
13263        let mut pos;
13264        let mut r#type;
13265        loop {
13266            pos = self.pos;
13267            r#type = None;
13268            if self.buf.len() == self.pos {
13269                return None;
13270            }
13271            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
13272                self.pos = self.buf.len();
13273                break;
13274            };
13275            r#type = Some(header.r#type);
13276            let res = match header.r#type {
13277                1u16 => C33PsePwLimit::Min({
13278                    let res = parse_u32(next);
13279                    let Some(val) = res else { break };
13280                    val
13281                }),
13282                2u16 => C33PsePwLimit::Max({
13283                    let res = parse_u32(next);
13284                    let Some(val) = res else { break };
13285                    val
13286                }),
13287                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
13288                n => continue,
13289            };
13290            return Some(Ok(res));
13291        }
13292        Some(Err(ErrorContext::new(
13293            "C33PsePwLimit",
13294            r#type.and_then(|t| C33PsePwLimit::attr_from_type(t)),
13295            self.orig_loc,
13296            self.buf.as_ptr().wrapping_add(pos) as usize,
13297        )))
13298    }
13299}
13300impl std::fmt::Debug for IterableC33PsePwLimit<'_> {
13301    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13302        let mut fmt = f.debug_struct("C33PsePwLimit");
13303        for attr in self.clone() {
13304            let attr = match attr {
13305                Ok(a) => a,
13306                Err(err) => {
13307                    fmt.finish()?;
13308                    f.write_str("Err(")?;
13309                    err.fmt(f)?;
13310                    return f.write_str(")");
13311                }
13312            };
13313            match attr {
13314                C33PsePwLimit::Min(val) => fmt.field("Min", &val),
13315                C33PsePwLimit::Max(val) => fmt.field("Max", &val),
13316            };
13317        }
13318        fmt.finish()
13319    }
13320}
13321impl IterableC33PsePwLimit<'_> {
13322    pub fn lookup_attr(
13323        &self,
13324        offset: usize,
13325        missing_type: Option<u16>,
13326    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
13327        let mut stack = Vec::new();
13328        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
13329        if missing_type.is_some() && cur == offset {
13330            stack.push(("C33PsePwLimit", offset));
13331            return (
13332                stack,
13333                missing_type.and_then(|t| C33PsePwLimit::attr_from_type(t)),
13334            );
13335        }
13336        if cur > offset || cur + self.buf.len() < offset {
13337            return (stack, None);
13338        }
13339        let mut attrs = self.clone();
13340        let mut last_off = cur + attrs.pos;
13341        while let Some(attr) = attrs.next() {
13342            let Ok(attr) = attr else { break };
13343            match attr {
13344                C33PsePwLimit::Min(val) => {
13345                    if last_off == offset {
13346                        stack.push(("Min", last_off));
13347                        break;
13348                    }
13349                }
13350                C33PsePwLimit::Max(val) => {
13351                    if last_off == offset {
13352                        stack.push(("Max", last_off));
13353                        break;
13354                    }
13355                }
13356                _ => {}
13357            };
13358            last_off = cur + attrs.pos;
13359        }
13360        if !stack.is_empty() {
13361            stack.push(("C33PsePwLimit", cur));
13362        }
13363        (stack, None)
13364    }
13365}
13366#[derive(Clone)]
13367pub enum Pse<'a> {
13368    Header(IterableHeader<'a>),
13369    PodlPseAdminState(u32),
13370    PodlPseAdminControl(u32),
13371    PodlPsePwDStatus(u32),
13372    C33PseAdminState(u32),
13373    C33PseAdminControl(u32),
13374    C33PsePwDStatus(u32),
13375    C33PsePwClass(u32),
13376    C33PseActualPw(u32),
13377    #[doc = "Associated type: [`C33PseExtState`] (enum)"]
13378    C33PseExtState(u32),
13379    C33PseExtSubstate(u32),
13380    C33PseAvailPwLimit(u32),
13381    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13382    C33PsePwLimitRanges(IterableC33PsePwLimit<'a>),
13383    PsePwDId(u32),
13384    PsePrioMax(u32),
13385    PsePrio(u32),
13386}
13387impl<'a> IterablePse<'a> {
13388    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
13389        let mut iter = self.clone();
13390        iter.pos = 0;
13391        for attr in iter {
13392            if let Ok(Pse::Header(val)) = attr {
13393                return Ok(val);
13394            }
13395        }
13396        Err(ErrorContext::new_missing(
13397            "Pse",
13398            "Header",
13399            self.orig_loc,
13400            self.buf.as_ptr() as usize,
13401        ))
13402    }
13403    pub fn get_podl_pse_admin_state(&self) -> Result<u32, ErrorContext> {
13404        let mut iter = self.clone();
13405        iter.pos = 0;
13406        for attr in iter {
13407            if let Ok(Pse::PodlPseAdminState(val)) = attr {
13408                return Ok(val);
13409            }
13410        }
13411        Err(ErrorContext::new_missing(
13412            "Pse",
13413            "PodlPseAdminState",
13414            self.orig_loc,
13415            self.buf.as_ptr() as usize,
13416        ))
13417    }
13418    pub fn get_podl_pse_admin_control(&self) -> Result<u32, ErrorContext> {
13419        let mut iter = self.clone();
13420        iter.pos = 0;
13421        for attr in iter {
13422            if let Ok(Pse::PodlPseAdminControl(val)) = attr {
13423                return Ok(val);
13424            }
13425        }
13426        Err(ErrorContext::new_missing(
13427            "Pse",
13428            "PodlPseAdminControl",
13429            self.orig_loc,
13430            self.buf.as_ptr() as usize,
13431        ))
13432    }
13433    pub fn get_podl_pse_pw_d_status(&self) -> Result<u32, ErrorContext> {
13434        let mut iter = self.clone();
13435        iter.pos = 0;
13436        for attr in iter {
13437            if let Ok(Pse::PodlPsePwDStatus(val)) = attr {
13438                return Ok(val);
13439            }
13440        }
13441        Err(ErrorContext::new_missing(
13442            "Pse",
13443            "PodlPsePwDStatus",
13444            self.orig_loc,
13445            self.buf.as_ptr() as usize,
13446        ))
13447    }
13448    pub fn get_c33_pse_admin_state(&self) -> Result<u32, ErrorContext> {
13449        let mut iter = self.clone();
13450        iter.pos = 0;
13451        for attr in iter {
13452            if let Ok(Pse::C33PseAdminState(val)) = attr {
13453                return Ok(val);
13454            }
13455        }
13456        Err(ErrorContext::new_missing(
13457            "Pse",
13458            "C33PseAdminState",
13459            self.orig_loc,
13460            self.buf.as_ptr() as usize,
13461        ))
13462    }
13463    pub fn get_c33_pse_admin_control(&self) -> Result<u32, ErrorContext> {
13464        let mut iter = self.clone();
13465        iter.pos = 0;
13466        for attr in iter {
13467            if let Ok(Pse::C33PseAdminControl(val)) = attr {
13468                return Ok(val);
13469            }
13470        }
13471        Err(ErrorContext::new_missing(
13472            "Pse",
13473            "C33PseAdminControl",
13474            self.orig_loc,
13475            self.buf.as_ptr() as usize,
13476        ))
13477    }
13478    pub fn get_c33_pse_pw_d_status(&self) -> Result<u32, ErrorContext> {
13479        let mut iter = self.clone();
13480        iter.pos = 0;
13481        for attr in iter {
13482            if let Ok(Pse::C33PsePwDStatus(val)) = attr {
13483                return Ok(val);
13484            }
13485        }
13486        Err(ErrorContext::new_missing(
13487            "Pse",
13488            "C33PsePwDStatus",
13489            self.orig_loc,
13490            self.buf.as_ptr() as usize,
13491        ))
13492    }
13493    pub fn get_c33_pse_pw_class(&self) -> Result<u32, ErrorContext> {
13494        let mut iter = self.clone();
13495        iter.pos = 0;
13496        for attr in iter {
13497            if let Ok(Pse::C33PsePwClass(val)) = attr {
13498                return Ok(val);
13499            }
13500        }
13501        Err(ErrorContext::new_missing(
13502            "Pse",
13503            "C33PsePwClass",
13504            self.orig_loc,
13505            self.buf.as_ptr() as usize,
13506        ))
13507    }
13508    pub fn get_c33_pse_actual_pw(&self) -> Result<u32, ErrorContext> {
13509        let mut iter = self.clone();
13510        iter.pos = 0;
13511        for attr in iter {
13512            if let Ok(Pse::C33PseActualPw(val)) = attr {
13513                return Ok(val);
13514            }
13515        }
13516        Err(ErrorContext::new_missing(
13517            "Pse",
13518            "C33PseActualPw",
13519            self.orig_loc,
13520            self.buf.as_ptr() as usize,
13521        ))
13522    }
13523    #[doc = "Associated type: [`C33PseExtState`] (enum)"]
13524    pub fn get_c33_pse_ext_state(&self) -> Result<u32, ErrorContext> {
13525        let mut iter = self.clone();
13526        iter.pos = 0;
13527        for attr in iter {
13528            if let Ok(Pse::C33PseExtState(val)) = attr {
13529                return Ok(val);
13530            }
13531        }
13532        Err(ErrorContext::new_missing(
13533            "Pse",
13534            "C33PseExtState",
13535            self.orig_loc,
13536            self.buf.as_ptr() as usize,
13537        ))
13538    }
13539    pub fn get_c33_pse_ext_substate(&self) -> Result<u32, ErrorContext> {
13540        let mut iter = self.clone();
13541        iter.pos = 0;
13542        for attr in iter {
13543            if let Ok(Pse::C33PseExtSubstate(val)) = attr {
13544                return Ok(val);
13545            }
13546        }
13547        Err(ErrorContext::new_missing(
13548            "Pse",
13549            "C33PseExtSubstate",
13550            self.orig_loc,
13551            self.buf.as_ptr() as usize,
13552        ))
13553    }
13554    pub fn get_c33_pse_avail_pw_limit(&self) -> Result<u32, ErrorContext> {
13555        let mut iter = self.clone();
13556        iter.pos = 0;
13557        for attr in iter {
13558            if let Ok(Pse::C33PseAvailPwLimit(val)) = attr {
13559                return Ok(val);
13560            }
13561        }
13562        Err(ErrorContext::new_missing(
13563            "Pse",
13564            "C33PseAvailPwLimit",
13565            self.orig_loc,
13566            self.buf.as_ptr() as usize,
13567        ))
13568    }
13569    #[doc = "Attribute may repeat multiple times (treat it as array)"]
13570    pub fn get_c33_pse_pw_limit_ranges(
13571        &self,
13572    ) -> MultiAttrIterable<Self, Pse<'a>, IterableC33PsePwLimit<'a>> {
13573        MultiAttrIterable::new(self.clone(), |variant| {
13574            if let Pse::C33PsePwLimitRanges(val) = variant {
13575                Some(val)
13576            } else {
13577                None
13578            }
13579        })
13580    }
13581    pub fn get_pse_pw_d_id(&self) -> Result<u32, ErrorContext> {
13582        let mut iter = self.clone();
13583        iter.pos = 0;
13584        for attr in iter {
13585            if let Ok(Pse::PsePwDId(val)) = attr {
13586                return Ok(val);
13587            }
13588        }
13589        Err(ErrorContext::new_missing(
13590            "Pse",
13591            "PsePwDId",
13592            self.orig_loc,
13593            self.buf.as_ptr() as usize,
13594        ))
13595    }
13596    pub fn get_pse_prio_max(&self) -> Result<u32, ErrorContext> {
13597        let mut iter = self.clone();
13598        iter.pos = 0;
13599        for attr in iter {
13600            if let Ok(Pse::PsePrioMax(val)) = attr {
13601                return Ok(val);
13602            }
13603        }
13604        Err(ErrorContext::new_missing(
13605            "Pse",
13606            "PsePrioMax",
13607            self.orig_loc,
13608            self.buf.as_ptr() as usize,
13609        ))
13610    }
13611    pub fn get_pse_prio(&self) -> Result<u32, ErrorContext> {
13612        let mut iter = self.clone();
13613        iter.pos = 0;
13614        for attr in iter {
13615            if let Ok(Pse::PsePrio(val)) = attr {
13616                return Ok(val);
13617            }
13618        }
13619        Err(ErrorContext::new_missing(
13620            "Pse",
13621            "PsePrio",
13622            self.orig_loc,
13623            self.buf.as_ptr() as usize,
13624        ))
13625    }
13626}
13627impl Pse<'_> {
13628    pub fn new<'a>(buf: &'a [u8]) -> IterablePse<'a> {
13629        IterablePse::with_loc(buf, buf.as_ptr() as usize)
13630    }
13631    fn attr_from_type(r#type: u16) -> Option<&'static str> {
13632        let res = match r#type {
13633            0u16 => "Unspec",
13634            1u16 => "Header",
13635            2u16 => "PodlPseAdminState",
13636            3u16 => "PodlPseAdminControl",
13637            4u16 => "PodlPsePwDStatus",
13638            5u16 => "C33PseAdminState",
13639            6u16 => "C33PseAdminControl",
13640            7u16 => "C33PsePwDStatus",
13641            8u16 => "C33PsePwClass",
13642            9u16 => "C33PseActualPw",
13643            10u16 => "C33PseExtState",
13644            11u16 => "C33PseExtSubstate",
13645            12u16 => "C33PseAvailPwLimit",
13646            13u16 => "C33PsePwLimitRanges",
13647            14u16 => "PsePwDId",
13648            15u16 => "PsePrioMax",
13649            16u16 => "PsePrio",
13650            _ => return None,
13651        };
13652        Some(res)
13653    }
13654}
13655#[derive(Clone, Copy, Default)]
13656pub struct IterablePse<'a> {
13657    buf: &'a [u8],
13658    pos: usize,
13659    orig_loc: usize,
13660}
13661impl<'a> IterablePse<'a> {
13662    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
13663        Self {
13664            buf,
13665            pos: 0,
13666            orig_loc,
13667        }
13668    }
13669    pub fn get_buf(&self) -> &'a [u8] {
13670        self.buf
13671    }
13672}
13673impl<'a> Iterator for IterablePse<'a> {
13674    type Item = Result<Pse<'a>, ErrorContext>;
13675    fn next(&mut self) -> Option<Self::Item> {
13676        let mut pos;
13677        let mut r#type;
13678        loop {
13679            pos = self.pos;
13680            r#type = None;
13681            if self.buf.len() == self.pos {
13682                return None;
13683            }
13684            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
13685                self.pos = self.buf.len();
13686                break;
13687            };
13688            r#type = Some(header.r#type);
13689            let res = match header.r#type {
13690                1u16 => Pse::Header({
13691                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
13692                    let Some(val) = res else { break };
13693                    val
13694                }),
13695                2u16 => Pse::PodlPseAdminState({
13696                    let res = parse_u32(next);
13697                    let Some(val) = res else { break };
13698                    val
13699                }),
13700                3u16 => Pse::PodlPseAdminControl({
13701                    let res = parse_u32(next);
13702                    let Some(val) = res else { break };
13703                    val
13704                }),
13705                4u16 => Pse::PodlPsePwDStatus({
13706                    let res = parse_u32(next);
13707                    let Some(val) = res else { break };
13708                    val
13709                }),
13710                5u16 => Pse::C33PseAdminState({
13711                    let res = parse_u32(next);
13712                    let Some(val) = res else { break };
13713                    val
13714                }),
13715                6u16 => Pse::C33PseAdminControl({
13716                    let res = parse_u32(next);
13717                    let Some(val) = res else { break };
13718                    val
13719                }),
13720                7u16 => Pse::C33PsePwDStatus({
13721                    let res = parse_u32(next);
13722                    let Some(val) = res else { break };
13723                    val
13724                }),
13725                8u16 => Pse::C33PsePwClass({
13726                    let res = parse_u32(next);
13727                    let Some(val) = res else { break };
13728                    val
13729                }),
13730                9u16 => Pse::C33PseActualPw({
13731                    let res = parse_u32(next);
13732                    let Some(val) = res else { break };
13733                    val
13734                }),
13735                10u16 => Pse::C33PseExtState({
13736                    let res = parse_u32(next);
13737                    let Some(val) = res else { break };
13738                    val
13739                }),
13740                11u16 => Pse::C33PseExtSubstate({
13741                    let res = parse_u32(next);
13742                    let Some(val) = res else { break };
13743                    val
13744                }),
13745                12u16 => Pse::C33PseAvailPwLimit({
13746                    let res = parse_u32(next);
13747                    let Some(val) = res else { break };
13748                    val
13749                }),
13750                13u16 => Pse::C33PsePwLimitRanges({
13751                    let res = Some(IterableC33PsePwLimit::with_loc(next, self.orig_loc));
13752                    let Some(val) = res else { break };
13753                    val
13754                }),
13755                14u16 => Pse::PsePwDId({
13756                    let res = parse_u32(next);
13757                    let Some(val) = res else { break };
13758                    val
13759                }),
13760                15u16 => Pse::PsePrioMax({
13761                    let res = parse_u32(next);
13762                    let Some(val) = res else { break };
13763                    val
13764                }),
13765                16u16 => Pse::PsePrio({
13766                    let res = parse_u32(next);
13767                    let Some(val) = res else { break };
13768                    val
13769                }),
13770                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
13771                n => continue,
13772            };
13773            return Some(Ok(res));
13774        }
13775        Some(Err(ErrorContext::new(
13776            "Pse",
13777            r#type.and_then(|t| Pse::attr_from_type(t)),
13778            self.orig_loc,
13779            self.buf.as_ptr().wrapping_add(pos) as usize,
13780        )))
13781    }
13782}
13783impl<'a> std::fmt::Debug for IterablePse<'_> {
13784    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13785        let mut fmt = f.debug_struct("Pse");
13786        for attr in self.clone() {
13787            let attr = match attr {
13788                Ok(a) => a,
13789                Err(err) => {
13790                    fmt.finish()?;
13791                    f.write_str("Err(")?;
13792                    err.fmt(f)?;
13793                    return f.write_str(")");
13794                }
13795            };
13796            match attr {
13797                Pse::Header(val) => fmt.field("Header", &val),
13798                Pse::PodlPseAdminState(val) => fmt.field("PodlPseAdminState", &val),
13799                Pse::PodlPseAdminControl(val) => fmt.field("PodlPseAdminControl", &val),
13800                Pse::PodlPsePwDStatus(val) => fmt.field("PodlPsePwDStatus", &val),
13801                Pse::C33PseAdminState(val) => fmt.field("C33PseAdminState", &val),
13802                Pse::C33PseAdminControl(val) => fmt.field("C33PseAdminControl", &val),
13803                Pse::C33PsePwDStatus(val) => fmt.field("C33PsePwDStatus", &val),
13804                Pse::C33PsePwClass(val) => fmt.field("C33PsePwClass", &val),
13805                Pse::C33PseActualPw(val) => fmt.field("C33PseActualPw", &val),
13806                Pse::C33PseExtState(val) => fmt.field(
13807                    "C33PseExtState",
13808                    &FormatEnum(val.into(), C33PseExtState::from_value),
13809                ),
13810                Pse::C33PseExtSubstate(val) => fmt.field("C33PseExtSubstate", &val),
13811                Pse::C33PseAvailPwLimit(val) => fmt.field("C33PseAvailPwLimit", &val),
13812                Pse::C33PsePwLimitRanges(val) => fmt.field("C33PsePwLimitRanges", &val),
13813                Pse::PsePwDId(val) => fmt.field("PsePwDId", &val),
13814                Pse::PsePrioMax(val) => fmt.field("PsePrioMax", &val),
13815                Pse::PsePrio(val) => fmt.field("PsePrio", &val),
13816            };
13817        }
13818        fmt.finish()
13819    }
13820}
13821impl IterablePse<'_> {
13822    pub fn lookup_attr(
13823        &self,
13824        offset: usize,
13825        missing_type: Option<u16>,
13826    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
13827        let mut stack = Vec::new();
13828        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
13829        if missing_type.is_some() && cur == offset {
13830            stack.push(("Pse", offset));
13831            return (stack, missing_type.and_then(|t| Pse::attr_from_type(t)));
13832        }
13833        if cur > offset || cur + self.buf.len() < offset {
13834            return (stack, None);
13835        }
13836        let mut attrs = self.clone();
13837        let mut last_off = cur + attrs.pos;
13838        let mut missing = None;
13839        while let Some(attr) = attrs.next() {
13840            let Ok(attr) = attr else { break };
13841            match attr {
13842                Pse::Header(val) => {
13843                    (stack, missing) = val.lookup_attr(offset, missing_type);
13844                    if !stack.is_empty() {
13845                        break;
13846                    }
13847                }
13848                Pse::PodlPseAdminState(val) => {
13849                    if last_off == offset {
13850                        stack.push(("PodlPseAdminState", last_off));
13851                        break;
13852                    }
13853                }
13854                Pse::PodlPseAdminControl(val) => {
13855                    if last_off == offset {
13856                        stack.push(("PodlPseAdminControl", last_off));
13857                        break;
13858                    }
13859                }
13860                Pse::PodlPsePwDStatus(val) => {
13861                    if last_off == offset {
13862                        stack.push(("PodlPsePwDStatus", last_off));
13863                        break;
13864                    }
13865                }
13866                Pse::C33PseAdminState(val) => {
13867                    if last_off == offset {
13868                        stack.push(("C33PseAdminState", last_off));
13869                        break;
13870                    }
13871                }
13872                Pse::C33PseAdminControl(val) => {
13873                    if last_off == offset {
13874                        stack.push(("C33PseAdminControl", last_off));
13875                        break;
13876                    }
13877                }
13878                Pse::C33PsePwDStatus(val) => {
13879                    if last_off == offset {
13880                        stack.push(("C33PsePwDStatus", last_off));
13881                        break;
13882                    }
13883                }
13884                Pse::C33PsePwClass(val) => {
13885                    if last_off == offset {
13886                        stack.push(("C33PsePwClass", last_off));
13887                        break;
13888                    }
13889                }
13890                Pse::C33PseActualPw(val) => {
13891                    if last_off == offset {
13892                        stack.push(("C33PseActualPw", last_off));
13893                        break;
13894                    }
13895                }
13896                Pse::C33PseExtState(val) => {
13897                    if last_off == offset {
13898                        stack.push(("C33PseExtState", last_off));
13899                        break;
13900                    }
13901                }
13902                Pse::C33PseExtSubstate(val) => {
13903                    if last_off == offset {
13904                        stack.push(("C33PseExtSubstate", last_off));
13905                        break;
13906                    }
13907                }
13908                Pse::C33PseAvailPwLimit(val) => {
13909                    if last_off == offset {
13910                        stack.push(("C33PseAvailPwLimit", last_off));
13911                        break;
13912                    }
13913                }
13914                Pse::C33PsePwLimitRanges(val) => {
13915                    (stack, missing) = val.lookup_attr(offset, missing_type);
13916                    if !stack.is_empty() {
13917                        break;
13918                    }
13919                }
13920                Pse::PsePwDId(val) => {
13921                    if last_off == offset {
13922                        stack.push(("PsePwDId", last_off));
13923                        break;
13924                    }
13925                }
13926                Pse::PsePrioMax(val) => {
13927                    if last_off == offset {
13928                        stack.push(("PsePrioMax", last_off));
13929                        break;
13930                    }
13931                }
13932                Pse::PsePrio(val) => {
13933                    if last_off == offset {
13934                        stack.push(("PsePrio", last_off));
13935                        break;
13936                    }
13937                }
13938                _ => {}
13939            };
13940            last_off = cur + attrs.pos;
13941        }
13942        if !stack.is_empty() {
13943            stack.push(("Pse", cur));
13944        }
13945        (stack, missing)
13946    }
13947}
13948#[derive(Clone)]
13949pub enum Flow {
13950    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13951    Ether(u32),
13952    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13953    Ip4(u32),
13954    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13955    Ip6(u32),
13956    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13957    Tcp4(u32),
13958    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13959    Tcp6(u32),
13960    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13961    Udp4(u32),
13962    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13963    Udp6(u32),
13964    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13965    Sctp4(u32),
13966    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13967    Sctp6(u32),
13968    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13969    Ah4(u32),
13970    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13971    Ah6(u32),
13972    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13973    Esp4(u32),
13974    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13975    Esp6(u32),
13976    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13977    AhEsp4(u32),
13978    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13979    AhEsp6(u32),
13980    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13981    Gtpu4(u32),
13982    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13983    Gtpu6(u32),
13984    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13985    Gtpc4(u32),
13986    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13987    Gtpc6(u32),
13988    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13989    GtpcTeid4(u32),
13990    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13991    GtpcTeid6(u32),
13992    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13993    GtpuEh4(u32),
13994    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13995    GtpuEh6(u32),
13996    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13997    GtpuUl4(u32),
13998    #[doc = "Associated type: [`RxfhFields`] (enum)"]
13999    GtpuUl6(u32),
14000    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14001    GtpuDl4(u32),
14002    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14003    GtpuDl6(u32),
14004}
14005impl<'a> IterableFlow<'a> {
14006    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14007    pub fn get_ether(&self) -> Result<u32, ErrorContext> {
14008        let mut iter = self.clone();
14009        iter.pos = 0;
14010        for attr in iter {
14011            if let Ok(Flow::Ether(val)) = attr {
14012                return Ok(val);
14013            }
14014        }
14015        Err(ErrorContext::new_missing(
14016            "Flow",
14017            "Ether",
14018            self.orig_loc,
14019            self.buf.as_ptr() as usize,
14020        ))
14021    }
14022    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14023    pub fn get_ip4(&self) -> Result<u32, ErrorContext> {
14024        let mut iter = self.clone();
14025        iter.pos = 0;
14026        for attr in iter {
14027            if let Ok(Flow::Ip4(val)) = attr {
14028                return Ok(val);
14029            }
14030        }
14031        Err(ErrorContext::new_missing(
14032            "Flow",
14033            "Ip4",
14034            self.orig_loc,
14035            self.buf.as_ptr() as usize,
14036        ))
14037    }
14038    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14039    pub fn get_ip6(&self) -> Result<u32, ErrorContext> {
14040        let mut iter = self.clone();
14041        iter.pos = 0;
14042        for attr in iter {
14043            if let Ok(Flow::Ip6(val)) = attr {
14044                return Ok(val);
14045            }
14046        }
14047        Err(ErrorContext::new_missing(
14048            "Flow",
14049            "Ip6",
14050            self.orig_loc,
14051            self.buf.as_ptr() as usize,
14052        ))
14053    }
14054    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14055    pub fn get_tcp4(&self) -> Result<u32, ErrorContext> {
14056        let mut iter = self.clone();
14057        iter.pos = 0;
14058        for attr in iter {
14059            if let Ok(Flow::Tcp4(val)) = attr {
14060                return Ok(val);
14061            }
14062        }
14063        Err(ErrorContext::new_missing(
14064            "Flow",
14065            "Tcp4",
14066            self.orig_loc,
14067            self.buf.as_ptr() as usize,
14068        ))
14069    }
14070    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14071    pub fn get_tcp6(&self) -> Result<u32, ErrorContext> {
14072        let mut iter = self.clone();
14073        iter.pos = 0;
14074        for attr in iter {
14075            if let Ok(Flow::Tcp6(val)) = attr {
14076                return Ok(val);
14077            }
14078        }
14079        Err(ErrorContext::new_missing(
14080            "Flow",
14081            "Tcp6",
14082            self.orig_loc,
14083            self.buf.as_ptr() as usize,
14084        ))
14085    }
14086    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14087    pub fn get_udp4(&self) -> Result<u32, ErrorContext> {
14088        let mut iter = self.clone();
14089        iter.pos = 0;
14090        for attr in iter {
14091            if let Ok(Flow::Udp4(val)) = attr {
14092                return Ok(val);
14093            }
14094        }
14095        Err(ErrorContext::new_missing(
14096            "Flow",
14097            "Udp4",
14098            self.orig_loc,
14099            self.buf.as_ptr() as usize,
14100        ))
14101    }
14102    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14103    pub fn get_udp6(&self) -> Result<u32, ErrorContext> {
14104        let mut iter = self.clone();
14105        iter.pos = 0;
14106        for attr in iter {
14107            if let Ok(Flow::Udp6(val)) = attr {
14108                return Ok(val);
14109            }
14110        }
14111        Err(ErrorContext::new_missing(
14112            "Flow",
14113            "Udp6",
14114            self.orig_loc,
14115            self.buf.as_ptr() as usize,
14116        ))
14117    }
14118    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14119    pub fn get_sctp4(&self) -> Result<u32, ErrorContext> {
14120        let mut iter = self.clone();
14121        iter.pos = 0;
14122        for attr in iter {
14123            if let Ok(Flow::Sctp4(val)) = attr {
14124                return Ok(val);
14125            }
14126        }
14127        Err(ErrorContext::new_missing(
14128            "Flow",
14129            "Sctp4",
14130            self.orig_loc,
14131            self.buf.as_ptr() as usize,
14132        ))
14133    }
14134    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14135    pub fn get_sctp6(&self) -> Result<u32, ErrorContext> {
14136        let mut iter = self.clone();
14137        iter.pos = 0;
14138        for attr in iter {
14139            if let Ok(Flow::Sctp6(val)) = attr {
14140                return Ok(val);
14141            }
14142        }
14143        Err(ErrorContext::new_missing(
14144            "Flow",
14145            "Sctp6",
14146            self.orig_loc,
14147            self.buf.as_ptr() as usize,
14148        ))
14149    }
14150    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14151    pub fn get_ah4(&self) -> Result<u32, ErrorContext> {
14152        let mut iter = self.clone();
14153        iter.pos = 0;
14154        for attr in iter {
14155            if let Ok(Flow::Ah4(val)) = attr {
14156                return Ok(val);
14157            }
14158        }
14159        Err(ErrorContext::new_missing(
14160            "Flow",
14161            "Ah4",
14162            self.orig_loc,
14163            self.buf.as_ptr() as usize,
14164        ))
14165    }
14166    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14167    pub fn get_ah6(&self) -> Result<u32, ErrorContext> {
14168        let mut iter = self.clone();
14169        iter.pos = 0;
14170        for attr in iter {
14171            if let Ok(Flow::Ah6(val)) = attr {
14172                return Ok(val);
14173            }
14174        }
14175        Err(ErrorContext::new_missing(
14176            "Flow",
14177            "Ah6",
14178            self.orig_loc,
14179            self.buf.as_ptr() as usize,
14180        ))
14181    }
14182    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14183    pub fn get_esp4(&self) -> Result<u32, ErrorContext> {
14184        let mut iter = self.clone();
14185        iter.pos = 0;
14186        for attr in iter {
14187            if let Ok(Flow::Esp4(val)) = attr {
14188                return Ok(val);
14189            }
14190        }
14191        Err(ErrorContext::new_missing(
14192            "Flow",
14193            "Esp4",
14194            self.orig_loc,
14195            self.buf.as_ptr() as usize,
14196        ))
14197    }
14198    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14199    pub fn get_esp6(&self) -> Result<u32, ErrorContext> {
14200        let mut iter = self.clone();
14201        iter.pos = 0;
14202        for attr in iter {
14203            if let Ok(Flow::Esp6(val)) = attr {
14204                return Ok(val);
14205            }
14206        }
14207        Err(ErrorContext::new_missing(
14208            "Flow",
14209            "Esp6",
14210            self.orig_loc,
14211            self.buf.as_ptr() as usize,
14212        ))
14213    }
14214    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14215    pub fn get_ah_esp4(&self) -> Result<u32, ErrorContext> {
14216        let mut iter = self.clone();
14217        iter.pos = 0;
14218        for attr in iter {
14219            if let Ok(Flow::AhEsp4(val)) = attr {
14220                return Ok(val);
14221            }
14222        }
14223        Err(ErrorContext::new_missing(
14224            "Flow",
14225            "AhEsp4",
14226            self.orig_loc,
14227            self.buf.as_ptr() as usize,
14228        ))
14229    }
14230    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14231    pub fn get_ah_esp6(&self) -> Result<u32, ErrorContext> {
14232        let mut iter = self.clone();
14233        iter.pos = 0;
14234        for attr in iter {
14235            if let Ok(Flow::AhEsp6(val)) = attr {
14236                return Ok(val);
14237            }
14238        }
14239        Err(ErrorContext::new_missing(
14240            "Flow",
14241            "AhEsp6",
14242            self.orig_loc,
14243            self.buf.as_ptr() as usize,
14244        ))
14245    }
14246    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14247    pub fn get_gtpu4(&self) -> Result<u32, ErrorContext> {
14248        let mut iter = self.clone();
14249        iter.pos = 0;
14250        for attr in iter {
14251            if let Ok(Flow::Gtpu4(val)) = attr {
14252                return Ok(val);
14253            }
14254        }
14255        Err(ErrorContext::new_missing(
14256            "Flow",
14257            "Gtpu4",
14258            self.orig_loc,
14259            self.buf.as_ptr() as usize,
14260        ))
14261    }
14262    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14263    pub fn get_gtpu6(&self) -> Result<u32, ErrorContext> {
14264        let mut iter = self.clone();
14265        iter.pos = 0;
14266        for attr in iter {
14267            if let Ok(Flow::Gtpu6(val)) = attr {
14268                return Ok(val);
14269            }
14270        }
14271        Err(ErrorContext::new_missing(
14272            "Flow",
14273            "Gtpu6",
14274            self.orig_loc,
14275            self.buf.as_ptr() as usize,
14276        ))
14277    }
14278    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14279    pub fn get_gtpc4(&self) -> Result<u32, ErrorContext> {
14280        let mut iter = self.clone();
14281        iter.pos = 0;
14282        for attr in iter {
14283            if let Ok(Flow::Gtpc4(val)) = attr {
14284                return Ok(val);
14285            }
14286        }
14287        Err(ErrorContext::new_missing(
14288            "Flow",
14289            "Gtpc4",
14290            self.orig_loc,
14291            self.buf.as_ptr() as usize,
14292        ))
14293    }
14294    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14295    pub fn get_gtpc6(&self) -> Result<u32, ErrorContext> {
14296        let mut iter = self.clone();
14297        iter.pos = 0;
14298        for attr in iter {
14299            if let Ok(Flow::Gtpc6(val)) = attr {
14300                return Ok(val);
14301            }
14302        }
14303        Err(ErrorContext::new_missing(
14304            "Flow",
14305            "Gtpc6",
14306            self.orig_loc,
14307            self.buf.as_ptr() as usize,
14308        ))
14309    }
14310    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14311    pub fn get_gtpc_teid4(&self) -> Result<u32, ErrorContext> {
14312        let mut iter = self.clone();
14313        iter.pos = 0;
14314        for attr in iter {
14315            if let Ok(Flow::GtpcTeid4(val)) = attr {
14316                return Ok(val);
14317            }
14318        }
14319        Err(ErrorContext::new_missing(
14320            "Flow",
14321            "GtpcTeid4",
14322            self.orig_loc,
14323            self.buf.as_ptr() as usize,
14324        ))
14325    }
14326    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14327    pub fn get_gtpc_teid6(&self) -> Result<u32, ErrorContext> {
14328        let mut iter = self.clone();
14329        iter.pos = 0;
14330        for attr in iter {
14331            if let Ok(Flow::GtpcTeid6(val)) = attr {
14332                return Ok(val);
14333            }
14334        }
14335        Err(ErrorContext::new_missing(
14336            "Flow",
14337            "GtpcTeid6",
14338            self.orig_loc,
14339            self.buf.as_ptr() as usize,
14340        ))
14341    }
14342    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14343    pub fn get_gtpu_eh4(&self) -> Result<u32, ErrorContext> {
14344        let mut iter = self.clone();
14345        iter.pos = 0;
14346        for attr in iter {
14347            if let Ok(Flow::GtpuEh4(val)) = attr {
14348                return Ok(val);
14349            }
14350        }
14351        Err(ErrorContext::new_missing(
14352            "Flow",
14353            "GtpuEh4",
14354            self.orig_loc,
14355            self.buf.as_ptr() as usize,
14356        ))
14357    }
14358    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14359    pub fn get_gtpu_eh6(&self) -> Result<u32, ErrorContext> {
14360        let mut iter = self.clone();
14361        iter.pos = 0;
14362        for attr in iter {
14363            if let Ok(Flow::GtpuEh6(val)) = attr {
14364                return Ok(val);
14365            }
14366        }
14367        Err(ErrorContext::new_missing(
14368            "Flow",
14369            "GtpuEh6",
14370            self.orig_loc,
14371            self.buf.as_ptr() as usize,
14372        ))
14373    }
14374    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14375    pub fn get_gtpu_ul4(&self) -> Result<u32, ErrorContext> {
14376        let mut iter = self.clone();
14377        iter.pos = 0;
14378        for attr in iter {
14379            if let Ok(Flow::GtpuUl4(val)) = attr {
14380                return Ok(val);
14381            }
14382        }
14383        Err(ErrorContext::new_missing(
14384            "Flow",
14385            "GtpuUl4",
14386            self.orig_loc,
14387            self.buf.as_ptr() as usize,
14388        ))
14389    }
14390    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14391    pub fn get_gtpu_ul6(&self) -> Result<u32, ErrorContext> {
14392        let mut iter = self.clone();
14393        iter.pos = 0;
14394        for attr in iter {
14395            if let Ok(Flow::GtpuUl6(val)) = attr {
14396                return Ok(val);
14397            }
14398        }
14399        Err(ErrorContext::new_missing(
14400            "Flow",
14401            "GtpuUl6",
14402            self.orig_loc,
14403            self.buf.as_ptr() as usize,
14404        ))
14405    }
14406    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14407    pub fn get_gtpu_dl4(&self) -> Result<u32, ErrorContext> {
14408        let mut iter = self.clone();
14409        iter.pos = 0;
14410        for attr in iter {
14411            if let Ok(Flow::GtpuDl4(val)) = attr {
14412                return Ok(val);
14413            }
14414        }
14415        Err(ErrorContext::new_missing(
14416            "Flow",
14417            "GtpuDl4",
14418            self.orig_loc,
14419            self.buf.as_ptr() as usize,
14420        ))
14421    }
14422    #[doc = "Associated type: [`RxfhFields`] (enum)"]
14423    pub fn get_gtpu_dl6(&self) -> Result<u32, ErrorContext> {
14424        let mut iter = self.clone();
14425        iter.pos = 0;
14426        for attr in iter {
14427            if let Ok(Flow::GtpuDl6(val)) = attr {
14428                return Ok(val);
14429            }
14430        }
14431        Err(ErrorContext::new_missing(
14432            "Flow",
14433            "GtpuDl6",
14434            self.orig_loc,
14435            self.buf.as_ptr() as usize,
14436        ))
14437    }
14438}
14439impl Flow {
14440    pub fn new<'a>(buf: &'a [u8]) -> IterableFlow<'a> {
14441        IterableFlow::with_loc(buf, buf.as_ptr() as usize)
14442    }
14443    fn attr_from_type(r#type: u16) -> Option<&'static str> {
14444        let res = match r#type {
14445            1u16 => "Ether",
14446            2u16 => "Ip4",
14447            3u16 => "Ip6",
14448            4u16 => "Tcp4",
14449            5u16 => "Tcp6",
14450            6u16 => "Udp4",
14451            7u16 => "Udp6",
14452            8u16 => "Sctp4",
14453            9u16 => "Sctp6",
14454            10u16 => "Ah4",
14455            11u16 => "Ah6",
14456            12u16 => "Esp4",
14457            13u16 => "Esp6",
14458            14u16 => "AhEsp4",
14459            15u16 => "AhEsp6",
14460            16u16 => "Gtpu4",
14461            17u16 => "Gtpu6",
14462            18u16 => "Gtpc4",
14463            19u16 => "Gtpc6",
14464            20u16 => "GtpcTeid4",
14465            21u16 => "GtpcTeid6",
14466            22u16 => "GtpuEh4",
14467            23u16 => "GtpuEh6",
14468            24u16 => "GtpuUl4",
14469            25u16 => "GtpuUl6",
14470            26u16 => "GtpuDl4",
14471            27u16 => "GtpuDl6",
14472            _ => return None,
14473        };
14474        Some(res)
14475    }
14476}
14477#[derive(Clone, Copy, Default)]
14478pub struct IterableFlow<'a> {
14479    buf: &'a [u8],
14480    pos: usize,
14481    orig_loc: usize,
14482}
14483impl<'a> IterableFlow<'a> {
14484    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
14485        Self {
14486            buf,
14487            pos: 0,
14488            orig_loc,
14489        }
14490    }
14491    pub fn get_buf(&self) -> &'a [u8] {
14492        self.buf
14493    }
14494}
14495impl<'a> Iterator for IterableFlow<'a> {
14496    type Item = Result<Flow, ErrorContext>;
14497    fn next(&mut self) -> Option<Self::Item> {
14498        let mut pos;
14499        let mut r#type;
14500        loop {
14501            pos = self.pos;
14502            r#type = None;
14503            if self.buf.len() == self.pos {
14504                return None;
14505            }
14506            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
14507                self.pos = self.buf.len();
14508                break;
14509            };
14510            r#type = Some(header.r#type);
14511            let res = match header.r#type {
14512                1u16 => Flow::Ether({
14513                    let res = parse_u32(next);
14514                    let Some(val) = res else { break };
14515                    val
14516                }),
14517                2u16 => Flow::Ip4({
14518                    let res = parse_u32(next);
14519                    let Some(val) = res else { break };
14520                    val
14521                }),
14522                3u16 => Flow::Ip6({
14523                    let res = parse_u32(next);
14524                    let Some(val) = res else { break };
14525                    val
14526                }),
14527                4u16 => Flow::Tcp4({
14528                    let res = parse_u32(next);
14529                    let Some(val) = res else { break };
14530                    val
14531                }),
14532                5u16 => Flow::Tcp6({
14533                    let res = parse_u32(next);
14534                    let Some(val) = res else { break };
14535                    val
14536                }),
14537                6u16 => Flow::Udp4({
14538                    let res = parse_u32(next);
14539                    let Some(val) = res else { break };
14540                    val
14541                }),
14542                7u16 => Flow::Udp6({
14543                    let res = parse_u32(next);
14544                    let Some(val) = res else { break };
14545                    val
14546                }),
14547                8u16 => Flow::Sctp4({
14548                    let res = parse_u32(next);
14549                    let Some(val) = res else { break };
14550                    val
14551                }),
14552                9u16 => Flow::Sctp6({
14553                    let res = parse_u32(next);
14554                    let Some(val) = res else { break };
14555                    val
14556                }),
14557                10u16 => Flow::Ah4({
14558                    let res = parse_u32(next);
14559                    let Some(val) = res else { break };
14560                    val
14561                }),
14562                11u16 => Flow::Ah6({
14563                    let res = parse_u32(next);
14564                    let Some(val) = res else { break };
14565                    val
14566                }),
14567                12u16 => Flow::Esp4({
14568                    let res = parse_u32(next);
14569                    let Some(val) = res else { break };
14570                    val
14571                }),
14572                13u16 => Flow::Esp6({
14573                    let res = parse_u32(next);
14574                    let Some(val) = res else { break };
14575                    val
14576                }),
14577                14u16 => Flow::AhEsp4({
14578                    let res = parse_u32(next);
14579                    let Some(val) = res else { break };
14580                    val
14581                }),
14582                15u16 => Flow::AhEsp6({
14583                    let res = parse_u32(next);
14584                    let Some(val) = res else { break };
14585                    val
14586                }),
14587                16u16 => Flow::Gtpu4({
14588                    let res = parse_u32(next);
14589                    let Some(val) = res else { break };
14590                    val
14591                }),
14592                17u16 => Flow::Gtpu6({
14593                    let res = parse_u32(next);
14594                    let Some(val) = res else { break };
14595                    val
14596                }),
14597                18u16 => Flow::Gtpc4({
14598                    let res = parse_u32(next);
14599                    let Some(val) = res else { break };
14600                    val
14601                }),
14602                19u16 => Flow::Gtpc6({
14603                    let res = parse_u32(next);
14604                    let Some(val) = res else { break };
14605                    val
14606                }),
14607                20u16 => Flow::GtpcTeid4({
14608                    let res = parse_u32(next);
14609                    let Some(val) = res else { break };
14610                    val
14611                }),
14612                21u16 => Flow::GtpcTeid6({
14613                    let res = parse_u32(next);
14614                    let Some(val) = res else { break };
14615                    val
14616                }),
14617                22u16 => Flow::GtpuEh4({
14618                    let res = parse_u32(next);
14619                    let Some(val) = res else { break };
14620                    val
14621                }),
14622                23u16 => Flow::GtpuEh6({
14623                    let res = parse_u32(next);
14624                    let Some(val) = res else { break };
14625                    val
14626                }),
14627                24u16 => Flow::GtpuUl4({
14628                    let res = parse_u32(next);
14629                    let Some(val) = res else { break };
14630                    val
14631                }),
14632                25u16 => Flow::GtpuUl6({
14633                    let res = parse_u32(next);
14634                    let Some(val) = res else { break };
14635                    val
14636                }),
14637                26u16 => Flow::GtpuDl4({
14638                    let res = parse_u32(next);
14639                    let Some(val) = res else { break };
14640                    val
14641                }),
14642                27u16 => Flow::GtpuDl6({
14643                    let res = parse_u32(next);
14644                    let Some(val) = res else { break };
14645                    val
14646                }),
14647                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
14648                n => continue,
14649            };
14650            return Some(Ok(res));
14651        }
14652        Some(Err(ErrorContext::new(
14653            "Flow",
14654            r#type.and_then(|t| Flow::attr_from_type(t)),
14655            self.orig_loc,
14656            self.buf.as_ptr().wrapping_add(pos) as usize,
14657        )))
14658    }
14659}
14660impl std::fmt::Debug for IterableFlow<'_> {
14661    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14662        let mut fmt = f.debug_struct("Flow");
14663        for attr in self.clone() {
14664            let attr = match attr {
14665                Ok(a) => a,
14666                Err(err) => {
14667                    fmt.finish()?;
14668                    f.write_str("Err(")?;
14669                    err.fmt(f)?;
14670                    return f.write_str(")");
14671                }
14672            };
14673            match attr {
14674                Flow::Ether(val) => {
14675                    fmt.field("Ether", &FormatFlags(val.into(), RxfhFields::from_value))
14676                }
14677                Flow::Ip4(val) => {
14678                    fmt.field("Ip4", &FormatFlags(val.into(), RxfhFields::from_value))
14679                }
14680                Flow::Ip6(val) => {
14681                    fmt.field("Ip6", &FormatFlags(val.into(), RxfhFields::from_value))
14682                }
14683                Flow::Tcp4(val) => {
14684                    fmt.field("Tcp4", &FormatFlags(val.into(), RxfhFields::from_value))
14685                }
14686                Flow::Tcp6(val) => {
14687                    fmt.field("Tcp6", &FormatFlags(val.into(), RxfhFields::from_value))
14688                }
14689                Flow::Udp4(val) => {
14690                    fmt.field("Udp4", &FormatFlags(val.into(), RxfhFields::from_value))
14691                }
14692                Flow::Udp6(val) => {
14693                    fmt.field("Udp6", &FormatFlags(val.into(), RxfhFields::from_value))
14694                }
14695                Flow::Sctp4(val) => {
14696                    fmt.field("Sctp4", &FormatFlags(val.into(), RxfhFields::from_value))
14697                }
14698                Flow::Sctp6(val) => {
14699                    fmt.field("Sctp6", &FormatFlags(val.into(), RxfhFields::from_value))
14700                }
14701                Flow::Ah4(val) => {
14702                    fmt.field("Ah4", &FormatFlags(val.into(), RxfhFields::from_value))
14703                }
14704                Flow::Ah6(val) => {
14705                    fmt.field("Ah6", &FormatFlags(val.into(), RxfhFields::from_value))
14706                }
14707                Flow::Esp4(val) => {
14708                    fmt.field("Esp4", &FormatFlags(val.into(), RxfhFields::from_value))
14709                }
14710                Flow::Esp6(val) => {
14711                    fmt.field("Esp6", &FormatFlags(val.into(), RxfhFields::from_value))
14712                }
14713                Flow::AhEsp4(val) => {
14714                    fmt.field("AhEsp4", &FormatFlags(val.into(), RxfhFields::from_value))
14715                }
14716                Flow::AhEsp6(val) => {
14717                    fmt.field("AhEsp6", &FormatFlags(val.into(), RxfhFields::from_value))
14718                }
14719                Flow::Gtpu4(val) => {
14720                    fmt.field("Gtpu4", &FormatFlags(val.into(), RxfhFields::from_value))
14721                }
14722                Flow::Gtpu6(val) => {
14723                    fmt.field("Gtpu6", &FormatFlags(val.into(), RxfhFields::from_value))
14724                }
14725                Flow::Gtpc4(val) => {
14726                    fmt.field("Gtpc4", &FormatFlags(val.into(), RxfhFields::from_value))
14727                }
14728                Flow::Gtpc6(val) => {
14729                    fmt.field("Gtpc6", &FormatFlags(val.into(), RxfhFields::from_value))
14730                }
14731                Flow::GtpcTeid4(val) => fmt.field(
14732                    "GtpcTeid4",
14733                    &FormatFlags(val.into(), RxfhFields::from_value),
14734                ),
14735                Flow::GtpcTeid6(val) => fmt.field(
14736                    "GtpcTeid6",
14737                    &FormatFlags(val.into(), RxfhFields::from_value),
14738                ),
14739                Flow::GtpuEh4(val) => {
14740                    fmt.field("GtpuEh4", &FormatFlags(val.into(), RxfhFields::from_value))
14741                }
14742                Flow::GtpuEh6(val) => {
14743                    fmt.field("GtpuEh6", &FormatFlags(val.into(), RxfhFields::from_value))
14744                }
14745                Flow::GtpuUl4(val) => {
14746                    fmt.field("GtpuUl4", &FormatFlags(val.into(), RxfhFields::from_value))
14747                }
14748                Flow::GtpuUl6(val) => {
14749                    fmt.field("GtpuUl6", &FormatFlags(val.into(), RxfhFields::from_value))
14750                }
14751                Flow::GtpuDl4(val) => {
14752                    fmt.field("GtpuDl4", &FormatFlags(val.into(), RxfhFields::from_value))
14753                }
14754                Flow::GtpuDl6(val) => {
14755                    fmt.field("GtpuDl6", &FormatFlags(val.into(), RxfhFields::from_value))
14756                }
14757            };
14758        }
14759        fmt.finish()
14760    }
14761}
14762impl IterableFlow<'_> {
14763    pub fn lookup_attr(
14764        &self,
14765        offset: usize,
14766        missing_type: Option<u16>,
14767    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
14768        let mut stack = Vec::new();
14769        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
14770        if missing_type.is_some() && cur == offset {
14771            stack.push(("Flow", offset));
14772            return (stack, missing_type.and_then(|t| Flow::attr_from_type(t)));
14773        }
14774        if cur > offset || cur + self.buf.len() < offset {
14775            return (stack, None);
14776        }
14777        let mut attrs = self.clone();
14778        let mut last_off = cur + attrs.pos;
14779        while let Some(attr) = attrs.next() {
14780            let Ok(attr) = attr else { break };
14781            match attr {
14782                Flow::Ether(val) => {
14783                    if last_off == offset {
14784                        stack.push(("Ether", last_off));
14785                        break;
14786                    }
14787                }
14788                Flow::Ip4(val) => {
14789                    if last_off == offset {
14790                        stack.push(("Ip4", last_off));
14791                        break;
14792                    }
14793                }
14794                Flow::Ip6(val) => {
14795                    if last_off == offset {
14796                        stack.push(("Ip6", last_off));
14797                        break;
14798                    }
14799                }
14800                Flow::Tcp4(val) => {
14801                    if last_off == offset {
14802                        stack.push(("Tcp4", last_off));
14803                        break;
14804                    }
14805                }
14806                Flow::Tcp6(val) => {
14807                    if last_off == offset {
14808                        stack.push(("Tcp6", last_off));
14809                        break;
14810                    }
14811                }
14812                Flow::Udp4(val) => {
14813                    if last_off == offset {
14814                        stack.push(("Udp4", last_off));
14815                        break;
14816                    }
14817                }
14818                Flow::Udp6(val) => {
14819                    if last_off == offset {
14820                        stack.push(("Udp6", last_off));
14821                        break;
14822                    }
14823                }
14824                Flow::Sctp4(val) => {
14825                    if last_off == offset {
14826                        stack.push(("Sctp4", last_off));
14827                        break;
14828                    }
14829                }
14830                Flow::Sctp6(val) => {
14831                    if last_off == offset {
14832                        stack.push(("Sctp6", last_off));
14833                        break;
14834                    }
14835                }
14836                Flow::Ah4(val) => {
14837                    if last_off == offset {
14838                        stack.push(("Ah4", last_off));
14839                        break;
14840                    }
14841                }
14842                Flow::Ah6(val) => {
14843                    if last_off == offset {
14844                        stack.push(("Ah6", last_off));
14845                        break;
14846                    }
14847                }
14848                Flow::Esp4(val) => {
14849                    if last_off == offset {
14850                        stack.push(("Esp4", last_off));
14851                        break;
14852                    }
14853                }
14854                Flow::Esp6(val) => {
14855                    if last_off == offset {
14856                        stack.push(("Esp6", last_off));
14857                        break;
14858                    }
14859                }
14860                Flow::AhEsp4(val) => {
14861                    if last_off == offset {
14862                        stack.push(("AhEsp4", last_off));
14863                        break;
14864                    }
14865                }
14866                Flow::AhEsp6(val) => {
14867                    if last_off == offset {
14868                        stack.push(("AhEsp6", last_off));
14869                        break;
14870                    }
14871                }
14872                Flow::Gtpu4(val) => {
14873                    if last_off == offset {
14874                        stack.push(("Gtpu4", last_off));
14875                        break;
14876                    }
14877                }
14878                Flow::Gtpu6(val) => {
14879                    if last_off == offset {
14880                        stack.push(("Gtpu6", last_off));
14881                        break;
14882                    }
14883                }
14884                Flow::Gtpc4(val) => {
14885                    if last_off == offset {
14886                        stack.push(("Gtpc4", last_off));
14887                        break;
14888                    }
14889                }
14890                Flow::Gtpc6(val) => {
14891                    if last_off == offset {
14892                        stack.push(("Gtpc6", last_off));
14893                        break;
14894                    }
14895                }
14896                Flow::GtpcTeid4(val) => {
14897                    if last_off == offset {
14898                        stack.push(("GtpcTeid4", last_off));
14899                        break;
14900                    }
14901                }
14902                Flow::GtpcTeid6(val) => {
14903                    if last_off == offset {
14904                        stack.push(("GtpcTeid6", last_off));
14905                        break;
14906                    }
14907                }
14908                Flow::GtpuEh4(val) => {
14909                    if last_off == offset {
14910                        stack.push(("GtpuEh4", last_off));
14911                        break;
14912                    }
14913                }
14914                Flow::GtpuEh6(val) => {
14915                    if last_off == offset {
14916                        stack.push(("GtpuEh6", last_off));
14917                        break;
14918                    }
14919                }
14920                Flow::GtpuUl4(val) => {
14921                    if last_off == offset {
14922                        stack.push(("GtpuUl4", last_off));
14923                        break;
14924                    }
14925                }
14926                Flow::GtpuUl6(val) => {
14927                    if last_off == offset {
14928                        stack.push(("GtpuUl6", last_off));
14929                        break;
14930                    }
14931                }
14932                Flow::GtpuDl4(val) => {
14933                    if last_off == offset {
14934                        stack.push(("GtpuDl4", last_off));
14935                        break;
14936                    }
14937                }
14938                Flow::GtpuDl6(val) => {
14939                    if last_off == offset {
14940                        stack.push(("GtpuDl6", last_off));
14941                        break;
14942                    }
14943                }
14944                _ => {}
14945            };
14946            last_off = cur + attrs.pos;
14947        }
14948        if !stack.is_empty() {
14949            stack.push(("Flow", cur));
14950        }
14951        (stack, None)
14952    }
14953}
14954#[derive(Clone)]
14955pub enum Rss<'a> {
14956    Header(IterableHeader<'a>),
14957    Context(u32),
14958    Hfunc(u32),
14959    Indir(&'a [u8]),
14960    Hkey(&'a [u8]),
14961    #[doc = "Associated type: [`InputXfrm`] (enum)"]
14962    InputXfrm(u32),
14963    StartContext(u32),
14964    FlowHash(IterableFlow<'a>),
14965}
14966impl<'a> IterableRss<'a> {
14967    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
14968        let mut iter = self.clone();
14969        iter.pos = 0;
14970        for attr in iter {
14971            if let Ok(Rss::Header(val)) = attr {
14972                return Ok(val);
14973            }
14974        }
14975        Err(ErrorContext::new_missing(
14976            "Rss",
14977            "Header",
14978            self.orig_loc,
14979            self.buf.as_ptr() as usize,
14980        ))
14981    }
14982    pub fn get_context(&self) -> Result<u32, ErrorContext> {
14983        let mut iter = self.clone();
14984        iter.pos = 0;
14985        for attr in iter {
14986            if let Ok(Rss::Context(val)) = attr {
14987                return Ok(val);
14988            }
14989        }
14990        Err(ErrorContext::new_missing(
14991            "Rss",
14992            "Context",
14993            self.orig_loc,
14994            self.buf.as_ptr() as usize,
14995        ))
14996    }
14997    pub fn get_hfunc(&self) -> Result<u32, ErrorContext> {
14998        let mut iter = self.clone();
14999        iter.pos = 0;
15000        for attr in iter {
15001            if let Ok(Rss::Hfunc(val)) = attr {
15002                return Ok(val);
15003            }
15004        }
15005        Err(ErrorContext::new_missing(
15006            "Rss",
15007            "Hfunc",
15008            self.orig_loc,
15009            self.buf.as_ptr() as usize,
15010        ))
15011    }
15012    pub fn get_indir(&self) -> Result<&'a [u8], ErrorContext> {
15013        let mut iter = self.clone();
15014        iter.pos = 0;
15015        for attr in iter {
15016            if let Ok(Rss::Indir(val)) = attr {
15017                return Ok(val);
15018            }
15019        }
15020        Err(ErrorContext::new_missing(
15021            "Rss",
15022            "Indir",
15023            self.orig_loc,
15024            self.buf.as_ptr() as usize,
15025        ))
15026    }
15027    pub fn get_hkey(&self) -> Result<&'a [u8], ErrorContext> {
15028        let mut iter = self.clone();
15029        iter.pos = 0;
15030        for attr in iter {
15031            if let Ok(Rss::Hkey(val)) = attr {
15032                return Ok(val);
15033            }
15034        }
15035        Err(ErrorContext::new_missing(
15036            "Rss",
15037            "Hkey",
15038            self.orig_loc,
15039            self.buf.as_ptr() as usize,
15040        ))
15041    }
15042    #[doc = "Associated type: [`InputXfrm`] (enum)"]
15043    pub fn get_input_xfrm(&self) -> Result<u32, ErrorContext> {
15044        let mut iter = self.clone();
15045        iter.pos = 0;
15046        for attr in iter {
15047            if let Ok(Rss::InputXfrm(val)) = attr {
15048                return Ok(val);
15049            }
15050        }
15051        Err(ErrorContext::new_missing(
15052            "Rss",
15053            "InputXfrm",
15054            self.orig_loc,
15055            self.buf.as_ptr() as usize,
15056        ))
15057    }
15058    pub fn get_start_context(&self) -> Result<u32, ErrorContext> {
15059        let mut iter = self.clone();
15060        iter.pos = 0;
15061        for attr in iter {
15062            if let Ok(Rss::StartContext(val)) = attr {
15063                return Ok(val);
15064            }
15065        }
15066        Err(ErrorContext::new_missing(
15067            "Rss",
15068            "StartContext",
15069            self.orig_loc,
15070            self.buf.as_ptr() as usize,
15071        ))
15072    }
15073    pub fn get_flow_hash(&self) -> Result<IterableFlow<'a>, ErrorContext> {
15074        let mut iter = self.clone();
15075        iter.pos = 0;
15076        for attr in iter {
15077            if let Ok(Rss::FlowHash(val)) = attr {
15078                return Ok(val);
15079            }
15080        }
15081        Err(ErrorContext::new_missing(
15082            "Rss",
15083            "FlowHash",
15084            self.orig_loc,
15085            self.buf.as_ptr() as usize,
15086        ))
15087    }
15088}
15089impl Rss<'_> {
15090    pub fn new<'a>(buf: &'a [u8]) -> IterableRss<'a> {
15091        IterableRss::with_loc(buf, buf.as_ptr() as usize)
15092    }
15093    fn attr_from_type(r#type: u16) -> Option<&'static str> {
15094        let res = match r#type {
15095            0u16 => "Unspec",
15096            1u16 => "Header",
15097            2u16 => "Context",
15098            3u16 => "Hfunc",
15099            4u16 => "Indir",
15100            5u16 => "Hkey",
15101            6u16 => "InputXfrm",
15102            7u16 => "StartContext",
15103            8u16 => "FlowHash",
15104            _ => return None,
15105        };
15106        Some(res)
15107    }
15108}
15109#[derive(Clone, Copy, Default)]
15110pub struct IterableRss<'a> {
15111    buf: &'a [u8],
15112    pos: usize,
15113    orig_loc: usize,
15114}
15115impl<'a> IterableRss<'a> {
15116    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
15117        Self {
15118            buf,
15119            pos: 0,
15120            orig_loc,
15121        }
15122    }
15123    pub fn get_buf(&self) -> &'a [u8] {
15124        self.buf
15125    }
15126}
15127impl<'a> Iterator for IterableRss<'a> {
15128    type Item = Result<Rss<'a>, ErrorContext>;
15129    fn next(&mut self) -> Option<Self::Item> {
15130        let mut pos;
15131        let mut r#type;
15132        loop {
15133            pos = self.pos;
15134            r#type = None;
15135            if self.buf.len() == self.pos {
15136                return None;
15137            }
15138            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
15139                self.pos = self.buf.len();
15140                break;
15141            };
15142            r#type = Some(header.r#type);
15143            let res = match header.r#type {
15144                1u16 => Rss::Header({
15145                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
15146                    let Some(val) = res else { break };
15147                    val
15148                }),
15149                2u16 => Rss::Context({
15150                    let res = parse_u32(next);
15151                    let Some(val) = res else { break };
15152                    val
15153                }),
15154                3u16 => Rss::Hfunc({
15155                    let res = parse_u32(next);
15156                    let Some(val) = res else { break };
15157                    val
15158                }),
15159                4u16 => Rss::Indir({
15160                    let res = Some(next);
15161                    let Some(val) = res else { break };
15162                    val
15163                }),
15164                5u16 => Rss::Hkey({
15165                    let res = Some(next);
15166                    let Some(val) = res else { break };
15167                    val
15168                }),
15169                6u16 => Rss::InputXfrm({
15170                    let res = parse_u32(next);
15171                    let Some(val) = res else { break };
15172                    val
15173                }),
15174                7u16 => Rss::StartContext({
15175                    let res = parse_u32(next);
15176                    let Some(val) = res else { break };
15177                    val
15178                }),
15179                8u16 => Rss::FlowHash({
15180                    let res = Some(IterableFlow::with_loc(next, self.orig_loc));
15181                    let Some(val) = res else { break };
15182                    val
15183                }),
15184                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
15185                n => continue,
15186            };
15187            return Some(Ok(res));
15188        }
15189        Some(Err(ErrorContext::new(
15190            "Rss",
15191            r#type.and_then(|t| Rss::attr_from_type(t)),
15192            self.orig_loc,
15193            self.buf.as_ptr().wrapping_add(pos) as usize,
15194        )))
15195    }
15196}
15197impl<'a> std::fmt::Debug for IterableRss<'_> {
15198    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15199        let mut fmt = f.debug_struct("Rss");
15200        for attr in self.clone() {
15201            let attr = match attr {
15202                Ok(a) => a,
15203                Err(err) => {
15204                    fmt.finish()?;
15205                    f.write_str("Err(")?;
15206                    err.fmt(f)?;
15207                    return f.write_str(")");
15208                }
15209            };
15210            match attr {
15211                Rss::Header(val) => fmt.field("Header", &val),
15212                Rss::Context(val) => fmt.field("Context", &val),
15213                Rss::Hfunc(val) => fmt.field("Hfunc", &val),
15214                Rss::Indir(val) => fmt.field("Indir", &val),
15215                Rss::Hkey(val) => fmt.field("Hkey", &val),
15216                Rss::InputXfrm(val) => {
15217                    fmt.field("InputXfrm", &FormatFlags(val.into(), InputXfrm::from_value))
15218                }
15219                Rss::StartContext(val) => fmt.field("StartContext", &val),
15220                Rss::FlowHash(val) => fmt.field("FlowHash", &val),
15221            };
15222        }
15223        fmt.finish()
15224    }
15225}
15226impl IterableRss<'_> {
15227    pub fn lookup_attr(
15228        &self,
15229        offset: usize,
15230        missing_type: Option<u16>,
15231    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
15232        let mut stack = Vec::new();
15233        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
15234        if missing_type.is_some() && cur == offset {
15235            stack.push(("Rss", offset));
15236            return (stack, missing_type.and_then(|t| Rss::attr_from_type(t)));
15237        }
15238        if cur > offset || cur + self.buf.len() < offset {
15239            return (stack, None);
15240        }
15241        let mut attrs = self.clone();
15242        let mut last_off = cur + attrs.pos;
15243        let mut missing = None;
15244        while let Some(attr) = attrs.next() {
15245            let Ok(attr) = attr else { break };
15246            match attr {
15247                Rss::Header(val) => {
15248                    (stack, missing) = val.lookup_attr(offset, missing_type);
15249                    if !stack.is_empty() {
15250                        break;
15251                    }
15252                }
15253                Rss::Context(val) => {
15254                    if last_off == offset {
15255                        stack.push(("Context", last_off));
15256                        break;
15257                    }
15258                }
15259                Rss::Hfunc(val) => {
15260                    if last_off == offset {
15261                        stack.push(("Hfunc", last_off));
15262                        break;
15263                    }
15264                }
15265                Rss::Indir(val) => {
15266                    if last_off == offset {
15267                        stack.push(("Indir", last_off));
15268                        break;
15269                    }
15270                }
15271                Rss::Hkey(val) => {
15272                    if last_off == offset {
15273                        stack.push(("Hkey", last_off));
15274                        break;
15275                    }
15276                }
15277                Rss::InputXfrm(val) => {
15278                    if last_off == offset {
15279                        stack.push(("InputXfrm", last_off));
15280                        break;
15281                    }
15282                }
15283                Rss::StartContext(val) => {
15284                    if last_off == offset {
15285                        stack.push(("StartContext", last_off));
15286                        break;
15287                    }
15288                }
15289                Rss::FlowHash(val) => {
15290                    (stack, missing) = val.lookup_attr(offset, missing_type);
15291                    if !stack.is_empty() {
15292                        break;
15293                    }
15294                }
15295                _ => {}
15296            };
15297            last_off = cur + attrs.pos;
15298        }
15299        if !stack.is_empty() {
15300            stack.push(("Rss", cur));
15301        }
15302        (stack, missing)
15303    }
15304}
15305#[derive(Clone)]
15306pub enum Plca<'a> {
15307    Header(IterableHeader<'a>),
15308    Version(u16),
15309    Enabled(u8),
15310    Status(u8),
15311    NodeCnt(u32),
15312    NodeId(u32),
15313    ToTmr(u32),
15314    BurstCnt(u32),
15315    BurstTmr(u32),
15316}
15317impl<'a> IterablePlca<'a> {
15318    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
15319        let mut iter = self.clone();
15320        iter.pos = 0;
15321        for attr in iter {
15322            if let Ok(Plca::Header(val)) = attr {
15323                return Ok(val);
15324            }
15325        }
15326        Err(ErrorContext::new_missing(
15327            "Plca",
15328            "Header",
15329            self.orig_loc,
15330            self.buf.as_ptr() as usize,
15331        ))
15332    }
15333    pub fn get_version(&self) -> Result<u16, ErrorContext> {
15334        let mut iter = self.clone();
15335        iter.pos = 0;
15336        for attr in iter {
15337            if let Ok(Plca::Version(val)) = attr {
15338                return Ok(val);
15339            }
15340        }
15341        Err(ErrorContext::new_missing(
15342            "Plca",
15343            "Version",
15344            self.orig_loc,
15345            self.buf.as_ptr() as usize,
15346        ))
15347    }
15348    pub fn get_enabled(&self) -> Result<u8, ErrorContext> {
15349        let mut iter = self.clone();
15350        iter.pos = 0;
15351        for attr in iter {
15352            if let Ok(Plca::Enabled(val)) = attr {
15353                return Ok(val);
15354            }
15355        }
15356        Err(ErrorContext::new_missing(
15357            "Plca",
15358            "Enabled",
15359            self.orig_loc,
15360            self.buf.as_ptr() as usize,
15361        ))
15362    }
15363    pub fn get_status(&self) -> Result<u8, ErrorContext> {
15364        let mut iter = self.clone();
15365        iter.pos = 0;
15366        for attr in iter {
15367            if let Ok(Plca::Status(val)) = attr {
15368                return Ok(val);
15369            }
15370        }
15371        Err(ErrorContext::new_missing(
15372            "Plca",
15373            "Status",
15374            self.orig_loc,
15375            self.buf.as_ptr() as usize,
15376        ))
15377    }
15378    pub fn get_node_cnt(&self) -> Result<u32, ErrorContext> {
15379        let mut iter = self.clone();
15380        iter.pos = 0;
15381        for attr in iter {
15382            if let Ok(Plca::NodeCnt(val)) = attr {
15383                return Ok(val);
15384            }
15385        }
15386        Err(ErrorContext::new_missing(
15387            "Plca",
15388            "NodeCnt",
15389            self.orig_loc,
15390            self.buf.as_ptr() as usize,
15391        ))
15392    }
15393    pub fn get_node_id(&self) -> Result<u32, ErrorContext> {
15394        let mut iter = self.clone();
15395        iter.pos = 0;
15396        for attr in iter {
15397            if let Ok(Plca::NodeId(val)) = attr {
15398                return Ok(val);
15399            }
15400        }
15401        Err(ErrorContext::new_missing(
15402            "Plca",
15403            "NodeId",
15404            self.orig_loc,
15405            self.buf.as_ptr() as usize,
15406        ))
15407    }
15408    pub fn get_to_tmr(&self) -> Result<u32, ErrorContext> {
15409        let mut iter = self.clone();
15410        iter.pos = 0;
15411        for attr in iter {
15412            if let Ok(Plca::ToTmr(val)) = attr {
15413                return Ok(val);
15414            }
15415        }
15416        Err(ErrorContext::new_missing(
15417            "Plca",
15418            "ToTmr",
15419            self.orig_loc,
15420            self.buf.as_ptr() as usize,
15421        ))
15422    }
15423    pub fn get_burst_cnt(&self) -> Result<u32, ErrorContext> {
15424        let mut iter = self.clone();
15425        iter.pos = 0;
15426        for attr in iter {
15427            if let Ok(Plca::BurstCnt(val)) = attr {
15428                return Ok(val);
15429            }
15430        }
15431        Err(ErrorContext::new_missing(
15432            "Plca",
15433            "BurstCnt",
15434            self.orig_loc,
15435            self.buf.as_ptr() as usize,
15436        ))
15437    }
15438    pub fn get_burst_tmr(&self) -> Result<u32, ErrorContext> {
15439        let mut iter = self.clone();
15440        iter.pos = 0;
15441        for attr in iter {
15442            if let Ok(Plca::BurstTmr(val)) = attr {
15443                return Ok(val);
15444            }
15445        }
15446        Err(ErrorContext::new_missing(
15447            "Plca",
15448            "BurstTmr",
15449            self.orig_loc,
15450            self.buf.as_ptr() as usize,
15451        ))
15452    }
15453}
15454impl Plca<'_> {
15455    pub fn new<'a>(buf: &'a [u8]) -> IterablePlca<'a> {
15456        IterablePlca::with_loc(buf, buf.as_ptr() as usize)
15457    }
15458    fn attr_from_type(r#type: u16) -> Option<&'static str> {
15459        let res = match r#type {
15460            0u16 => "Unspec",
15461            1u16 => "Header",
15462            2u16 => "Version",
15463            3u16 => "Enabled",
15464            4u16 => "Status",
15465            5u16 => "NodeCnt",
15466            6u16 => "NodeId",
15467            7u16 => "ToTmr",
15468            8u16 => "BurstCnt",
15469            9u16 => "BurstTmr",
15470            _ => return None,
15471        };
15472        Some(res)
15473    }
15474}
15475#[derive(Clone, Copy, Default)]
15476pub struct IterablePlca<'a> {
15477    buf: &'a [u8],
15478    pos: usize,
15479    orig_loc: usize,
15480}
15481impl<'a> IterablePlca<'a> {
15482    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
15483        Self {
15484            buf,
15485            pos: 0,
15486            orig_loc,
15487        }
15488    }
15489    pub fn get_buf(&self) -> &'a [u8] {
15490        self.buf
15491    }
15492}
15493impl<'a> Iterator for IterablePlca<'a> {
15494    type Item = Result<Plca<'a>, ErrorContext>;
15495    fn next(&mut self) -> Option<Self::Item> {
15496        let mut pos;
15497        let mut r#type;
15498        loop {
15499            pos = self.pos;
15500            r#type = None;
15501            if self.buf.len() == self.pos {
15502                return None;
15503            }
15504            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
15505                self.pos = self.buf.len();
15506                break;
15507            };
15508            r#type = Some(header.r#type);
15509            let res = match header.r#type {
15510                1u16 => Plca::Header({
15511                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
15512                    let Some(val) = res else { break };
15513                    val
15514                }),
15515                2u16 => Plca::Version({
15516                    let res = parse_u16(next);
15517                    let Some(val) = res else { break };
15518                    val
15519                }),
15520                3u16 => Plca::Enabled({
15521                    let res = parse_u8(next);
15522                    let Some(val) = res else { break };
15523                    val
15524                }),
15525                4u16 => Plca::Status({
15526                    let res = parse_u8(next);
15527                    let Some(val) = res else { break };
15528                    val
15529                }),
15530                5u16 => Plca::NodeCnt({
15531                    let res = parse_u32(next);
15532                    let Some(val) = res else { break };
15533                    val
15534                }),
15535                6u16 => Plca::NodeId({
15536                    let res = parse_u32(next);
15537                    let Some(val) = res else { break };
15538                    val
15539                }),
15540                7u16 => Plca::ToTmr({
15541                    let res = parse_u32(next);
15542                    let Some(val) = res else { break };
15543                    val
15544                }),
15545                8u16 => Plca::BurstCnt({
15546                    let res = parse_u32(next);
15547                    let Some(val) = res else { break };
15548                    val
15549                }),
15550                9u16 => Plca::BurstTmr({
15551                    let res = parse_u32(next);
15552                    let Some(val) = res else { break };
15553                    val
15554                }),
15555                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
15556                n => continue,
15557            };
15558            return Some(Ok(res));
15559        }
15560        Some(Err(ErrorContext::new(
15561            "Plca",
15562            r#type.and_then(|t| Plca::attr_from_type(t)),
15563            self.orig_loc,
15564            self.buf.as_ptr().wrapping_add(pos) as usize,
15565        )))
15566    }
15567}
15568impl<'a> std::fmt::Debug for IterablePlca<'_> {
15569    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15570        let mut fmt = f.debug_struct("Plca");
15571        for attr in self.clone() {
15572            let attr = match attr {
15573                Ok(a) => a,
15574                Err(err) => {
15575                    fmt.finish()?;
15576                    f.write_str("Err(")?;
15577                    err.fmt(f)?;
15578                    return f.write_str(")");
15579                }
15580            };
15581            match attr {
15582                Plca::Header(val) => fmt.field("Header", &val),
15583                Plca::Version(val) => fmt.field("Version", &val),
15584                Plca::Enabled(val) => fmt.field("Enabled", &val),
15585                Plca::Status(val) => fmt.field("Status", &val),
15586                Plca::NodeCnt(val) => fmt.field("NodeCnt", &val),
15587                Plca::NodeId(val) => fmt.field("NodeId", &val),
15588                Plca::ToTmr(val) => fmt.field("ToTmr", &val),
15589                Plca::BurstCnt(val) => fmt.field("BurstCnt", &val),
15590                Plca::BurstTmr(val) => fmt.field("BurstTmr", &val),
15591            };
15592        }
15593        fmt.finish()
15594    }
15595}
15596impl IterablePlca<'_> {
15597    pub fn lookup_attr(
15598        &self,
15599        offset: usize,
15600        missing_type: Option<u16>,
15601    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
15602        let mut stack = Vec::new();
15603        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
15604        if missing_type.is_some() && cur == offset {
15605            stack.push(("Plca", offset));
15606            return (stack, missing_type.and_then(|t| Plca::attr_from_type(t)));
15607        }
15608        if cur > offset || cur + self.buf.len() < offset {
15609            return (stack, None);
15610        }
15611        let mut attrs = self.clone();
15612        let mut last_off = cur + attrs.pos;
15613        let mut missing = None;
15614        while let Some(attr) = attrs.next() {
15615            let Ok(attr) = attr else { break };
15616            match attr {
15617                Plca::Header(val) => {
15618                    (stack, missing) = val.lookup_attr(offset, missing_type);
15619                    if !stack.is_empty() {
15620                        break;
15621                    }
15622                }
15623                Plca::Version(val) => {
15624                    if last_off == offset {
15625                        stack.push(("Version", last_off));
15626                        break;
15627                    }
15628                }
15629                Plca::Enabled(val) => {
15630                    if last_off == offset {
15631                        stack.push(("Enabled", last_off));
15632                        break;
15633                    }
15634                }
15635                Plca::Status(val) => {
15636                    if last_off == offset {
15637                        stack.push(("Status", last_off));
15638                        break;
15639                    }
15640                }
15641                Plca::NodeCnt(val) => {
15642                    if last_off == offset {
15643                        stack.push(("NodeCnt", last_off));
15644                        break;
15645                    }
15646                }
15647                Plca::NodeId(val) => {
15648                    if last_off == offset {
15649                        stack.push(("NodeId", last_off));
15650                        break;
15651                    }
15652                }
15653                Plca::ToTmr(val) => {
15654                    if last_off == offset {
15655                        stack.push(("ToTmr", last_off));
15656                        break;
15657                    }
15658                }
15659                Plca::BurstCnt(val) => {
15660                    if last_off == offset {
15661                        stack.push(("BurstCnt", last_off));
15662                        break;
15663                    }
15664                }
15665                Plca::BurstTmr(val) => {
15666                    if last_off == offset {
15667                        stack.push(("BurstTmr", last_off));
15668                        break;
15669                    }
15670                }
15671                _ => {}
15672            };
15673            last_off = cur + attrs.pos;
15674        }
15675        if !stack.is_empty() {
15676            stack.push(("Plca", cur));
15677        }
15678        (stack, missing)
15679    }
15680}
15681#[derive(Clone)]
15682pub enum ModuleFwFlash<'a> {
15683    Header(IterableHeader<'a>),
15684    FileName(&'a CStr),
15685    Password(u32),
15686    #[doc = "Associated type: [`ModuleFwFlashStatus`] (enum)"]
15687    Status(u32),
15688    StatusMsg(&'a CStr),
15689    Done(u32),
15690    Total(u32),
15691}
15692impl<'a> IterableModuleFwFlash<'a> {
15693    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
15694        let mut iter = self.clone();
15695        iter.pos = 0;
15696        for attr in iter {
15697            if let Ok(ModuleFwFlash::Header(val)) = attr {
15698                return Ok(val);
15699            }
15700        }
15701        Err(ErrorContext::new_missing(
15702            "ModuleFwFlash",
15703            "Header",
15704            self.orig_loc,
15705            self.buf.as_ptr() as usize,
15706        ))
15707    }
15708    pub fn get_file_name(&self) -> Result<&'a CStr, ErrorContext> {
15709        let mut iter = self.clone();
15710        iter.pos = 0;
15711        for attr in iter {
15712            if let Ok(ModuleFwFlash::FileName(val)) = attr {
15713                return Ok(val);
15714            }
15715        }
15716        Err(ErrorContext::new_missing(
15717            "ModuleFwFlash",
15718            "FileName",
15719            self.orig_loc,
15720            self.buf.as_ptr() as usize,
15721        ))
15722    }
15723    pub fn get_password(&self) -> Result<u32, ErrorContext> {
15724        let mut iter = self.clone();
15725        iter.pos = 0;
15726        for attr in iter {
15727            if let Ok(ModuleFwFlash::Password(val)) = attr {
15728                return Ok(val);
15729            }
15730        }
15731        Err(ErrorContext::new_missing(
15732            "ModuleFwFlash",
15733            "Password",
15734            self.orig_loc,
15735            self.buf.as_ptr() as usize,
15736        ))
15737    }
15738    #[doc = "Associated type: [`ModuleFwFlashStatus`] (enum)"]
15739    pub fn get_status(&self) -> Result<u32, ErrorContext> {
15740        let mut iter = self.clone();
15741        iter.pos = 0;
15742        for attr in iter {
15743            if let Ok(ModuleFwFlash::Status(val)) = attr {
15744                return Ok(val);
15745            }
15746        }
15747        Err(ErrorContext::new_missing(
15748            "ModuleFwFlash",
15749            "Status",
15750            self.orig_loc,
15751            self.buf.as_ptr() as usize,
15752        ))
15753    }
15754    pub fn get_status_msg(&self) -> Result<&'a CStr, ErrorContext> {
15755        let mut iter = self.clone();
15756        iter.pos = 0;
15757        for attr in iter {
15758            if let Ok(ModuleFwFlash::StatusMsg(val)) = attr {
15759                return Ok(val);
15760            }
15761        }
15762        Err(ErrorContext::new_missing(
15763            "ModuleFwFlash",
15764            "StatusMsg",
15765            self.orig_loc,
15766            self.buf.as_ptr() as usize,
15767        ))
15768    }
15769    pub fn get_done(&self) -> Result<u32, ErrorContext> {
15770        let mut iter = self.clone();
15771        iter.pos = 0;
15772        for attr in iter {
15773            if let Ok(ModuleFwFlash::Done(val)) = attr {
15774                return Ok(val);
15775            }
15776        }
15777        Err(ErrorContext::new_missing(
15778            "ModuleFwFlash",
15779            "Done",
15780            self.orig_loc,
15781            self.buf.as_ptr() as usize,
15782        ))
15783    }
15784    pub fn get_total(&self) -> Result<u32, ErrorContext> {
15785        let mut iter = self.clone();
15786        iter.pos = 0;
15787        for attr in iter {
15788            if let Ok(ModuleFwFlash::Total(val)) = attr {
15789                return Ok(val);
15790            }
15791        }
15792        Err(ErrorContext::new_missing(
15793            "ModuleFwFlash",
15794            "Total",
15795            self.orig_loc,
15796            self.buf.as_ptr() as usize,
15797        ))
15798    }
15799}
15800impl ModuleFwFlash<'_> {
15801    pub fn new<'a>(buf: &'a [u8]) -> IterableModuleFwFlash<'a> {
15802        IterableModuleFwFlash::with_loc(buf, buf.as_ptr() as usize)
15803    }
15804    fn attr_from_type(r#type: u16) -> Option<&'static str> {
15805        let res = match r#type {
15806            0u16 => "Unspec",
15807            1u16 => "Header",
15808            2u16 => "FileName",
15809            3u16 => "Password",
15810            4u16 => "Status",
15811            5u16 => "StatusMsg",
15812            6u16 => "Done",
15813            7u16 => "Total",
15814            _ => return None,
15815        };
15816        Some(res)
15817    }
15818}
15819#[derive(Clone, Copy, Default)]
15820pub struct IterableModuleFwFlash<'a> {
15821    buf: &'a [u8],
15822    pos: usize,
15823    orig_loc: usize,
15824}
15825impl<'a> IterableModuleFwFlash<'a> {
15826    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
15827        Self {
15828            buf,
15829            pos: 0,
15830            orig_loc,
15831        }
15832    }
15833    pub fn get_buf(&self) -> &'a [u8] {
15834        self.buf
15835    }
15836}
15837impl<'a> Iterator for IterableModuleFwFlash<'a> {
15838    type Item = Result<ModuleFwFlash<'a>, ErrorContext>;
15839    fn next(&mut self) -> Option<Self::Item> {
15840        let mut pos;
15841        let mut r#type;
15842        loop {
15843            pos = self.pos;
15844            r#type = None;
15845            if self.buf.len() == self.pos {
15846                return None;
15847            }
15848            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
15849                self.pos = self.buf.len();
15850                break;
15851            };
15852            r#type = Some(header.r#type);
15853            let res = match header.r#type {
15854                1u16 => ModuleFwFlash::Header({
15855                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
15856                    let Some(val) = res else { break };
15857                    val
15858                }),
15859                2u16 => ModuleFwFlash::FileName({
15860                    let res = CStr::from_bytes_with_nul(next).ok();
15861                    let Some(val) = res else { break };
15862                    val
15863                }),
15864                3u16 => ModuleFwFlash::Password({
15865                    let res = parse_u32(next);
15866                    let Some(val) = res else { break };
15867                    val
15868                }),
15869                4u16 => ModuleFwFlash::Status({
15870                    let res = parse_u32(next);
15871                    let Some(val) = res else { break };
15872                    val
15873                }),
15874                5u16 => ModuleFwFlash::StatusMsg({
15875                    let res = CStr::from_bytes_with_nul(next).ok();
15876                    let Some(val) = res else { break };
15877                    val
15878                }),
15879                6u16 => ModuleFwFlash::Done({
15880                    let res = parse_u32(next);
15881                    let Some(val) = res else { break };
15882                    val
15883                }),
15884                7u16 => ModuleFwFlash::Total({
15885                    let res = parse_u32(next);
15886                    let Some(val) = res else { break };
15887                    val
15888                }),
15889                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
15890                n => continue,
15891            };
15892            return Some(Ok(res));
15893        }
15894        Some(Err(ErrorContext::new(
15895            "ModuleFwFlash",
15896            r#type.and_then(|t| ModuleFwFlash::attr_from_type(t)),
15897            self.orig_loc,
15898            self.buf.as_ptr().wrapping_add(pos) as usize,
15899        )))
15900    }
15901}
15902impl<'a> std::fmt::Debug for IterableModuleFwFlash<'_> {
15903    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15904        let mut fmt = f.debug_struct("ModuleFwFlash");
15905        for attr in self.clone() {
15906            let attr = match attr {
15907                Ok(a) => a,
15908                Err(err) => {
15909                    fmt.finish()?;
15910                    f.write_str("Err(")?;
15911                    err.fmt(f)?;
15912                    return f.write_str(")");
15913                }
15914            };
15915            match attr {
15916                ModuleFwFlash::Header(val) => fmt.field("Header", &val),
15917                ModuleFwFlash::FileName(val) => fmt.field("FileName", &val),
15918                ModuleFwFlash::Password(val) => fmt.field("Password", &val),
15919                ModuleFwFlash::Status(val) => fmt.field(
15920                    "Status",
15921                    &FormatEnum(val.into(), ModuleFwFlashStatus::from_value),
15922                ),
15923                ModuleFwFlash::StatusMsg(val) => fmt.field("StatusMsg", &val),
15924                ModuleFwFlash::Done(val) => fmt.field("Done", &val),
15925                ModuleFwFlash::Total(val) => fmt.field("Total", &val),
15926            };
15927        }
15928        fmt.finish()
15929    }
15930}
15931impl IterableModuleFwFlash<'_> {
15932    pub fn lookup_attr(
15933        &self,
15934        offset: usize,
15935        missing_type: Option<u16>,
15936    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
15937        let mut stack = Vec::new();
15938        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
15939        if missing_type.is_some() && cur == offset {
15940            stack.push(("ModuleFwFlash", offset));
15941            return (
15942                stack,
15943                missing_type.and_then(|t| ModuleFwFlash::attr_from_type(t)),
15944            );
15945        }
15946        if cur > offset || cur + self.buf.len() < offset {
15947            return (stack, None);
15948        }
15949        let mut attrs = self.clone();
15950        let mut last_off = cur + attrs.pos;
15951        let mut missing = None;
15952        while let Some(attr) = attrs.next() {
15953            let Ok(attr) = attr else { break };
15954            match attr {
15955                ModuleFwFlash::Header(val) => {
15956                    (stack, missing) = val.lookup_attr(offset, missing_type);
15957                    if !stack.is_empty() {
15958                        break;
15959                    }
15960                }
15961                ModuleFwFlash::FileName(val) => {
15962                    if last_off == offset {
15963                        stack.push(("FileName", last_off));
15964                        break;
15965                    }
15966                }
15967                ModuleFwFlash::Password(val) => {
15968                    if last_off == offset {
15969                        stack.push(("Password", last_off));
15970                        break;
15971                    }
15972                }
15973                ModuleFwFlash::Status(val) => {
15974                    if last_off == offset {
15975                        stack.push(("Status", last_off));
15976                        break;
15977                    }
15978                }
15979                ModuleFwFlash::StatusMsg(val) => {
15980                    if last_off == offset {
15981                        stack.push(("StatusMsg", last_off));
15982                        break;
15983                    }
15984                }
15985                ModuleFwFlash::Done(val) => {
15986                    if last_off == offset {
15987                        stack.push(("Done", last_off));
15988                        break;
15989                    }
15990                }
15991                ModuleFwFlash::Total(val) => {
15992                    if last_off == offset {
15993                        stack.push(("Total", last_off));
15994                        break;
15995                    }
15996                }
15997                _ => {}
15998            };
15999            last_off = cur + attrs.pos;
16000        }
16001        if !stack.is_empty() {
16002            stack.push(("ModuleFwFlash", cur));
16003        }
16004        (stack, missing)
16005    }
16006}
16007#[derive(Clone)]
16008pub enum Phy<'a> {
16009    Header(IterableHeader<'a>),
16010    Index(u32),
16011    Drvname(&'a CStr),
16012    Name(&'a CStr),
16013    #[doc = "Associated type: [`PhyUpstreamType`] (enum)"]
16014    UpstreamType(u32),
16015    UpstreamIndex(u32),
16016    UpstreamSfpName(&'a CStr),
16017    DownstreamSfpName(&'a CStr),
16018}
16019impl<'a> IterablePhy<'a> {
16020    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
16021        let mut iter = self.clone();
16022        iter.pos = 0;
16023        for attr in iter {
16024            if let Ok(Phy::Header(val)) = attr {
16025                return Ok(val);
16026            }
16027        }
16028        Err(ErrorContext::new_missing(
16029            "Phy",
16030            "Header",
16031            self.orig_loc,
16032            self.buf.as_ptr() as usize,
16033        ))
16034    }
16035    pub fn get_index(&self) -> Result<u32, ErrorContext> {
16036        let mut iter = self.clone();
16037        iter.pos = 0;
16038        for attr in iter {
16039            if let Ok(Phy::Index(val)) = attr {
16040                return Ok(val);
16041            }
16042        }
16043        Err(ErrorContext::new_missing(
16044            "Phy",
16045            "Index",
16046            self.orig_loc,
16047            self.buf.as_ptr() as usize,
16048        ))
16049    }
16050    pub fn get_drvname(&self) -> Result<&'a CStr, ErrorContext> {
16051        let mut iter = self.clone();
16052        iter.pos = 0;
16053        for attr in iter {
16054            if let Ok(Phy::Drvname(val)) = attr {
16055                return Ok(val);
16056            }
16057        }
16058        Err(ErrorContext::new_missing(
16059            "Phy",
16060            "Drvname",
16061            self.orig_loc,
16062            self.buf.as_ptr() as usize,
16063        ))
16064    }
16065    pub fn get_name(&self) -> Result<&'a CStr, ErrorContext> {
16066        let mut iter = self.clone();
16067        iter.pos = 0;
16068        for attr in iter {
16069            if let Ok(Phy::Name(val)) = attr {
16070                return Ok(val);
16071            }
16072        }
16073        Err(ErrorContext::new_missing(
16074            "Phy",
16075            "Name",
16076            self.orig_loc,
16077            self.buf.as_ptr() as usize,
16078        ))
16079    }
16080    #[doc = "Associated type: [`PhyUpstreamType`] (enum)"]
16081    pub fn get_upstream_type(&self) -> Result<u32, ErrorContext> {
16082        let mut iter = self.clone();
16083        iter.pos = 0;
16084        for attr in iter {
16085            if let Ok(Phy::UpstreamType(val)) = attr {
16086                return Ok(val);
16087            }
16088        }
16089        Err(ErrorContext::new_missing(
16090            "Phy",
16091            "UpstreamType",
16092            self.orig_loc,
16093            self.buf.as_ptr() as usize,
16094        ))
16095    }
16096    pub fn get_upstream_index(&self) -> Result<u32, ErrorContext> {
16097        let mut iter = self.clone();
16098        iter.pos = 0;
16099        for attr in iter {
16100            if let Ok(Phy::UpstreamIndex(val)) = attr {
16101                return Ok(val);
16102            }
16103        }
16104        Err(ErrorContext::new_missing(
16105            "Phy",
16106            "UpstreamIndex",
16107            self.orig_loc,
16108            self.buf.as_ptr() as usize,
16109        ))
16110    }
16111    pub fn get_upstream_sfp_name(&self) -> Result<&'a CStr, ErrorContext> {
16112        let mut iter = self.clone();
16113        iter.pos = 0;
16114        for attr in iter {
16115            if let Ok(Phy::UpstreamSfpName(val)) = attr {
16116                return Ok(val);
16117            }
16118        }
16119        Err(ErrorContext::new_missing(
16120            "Phy",
16121            "UpstreamSfpName",
16122            self.orig_loc,
16123            self.buf.as_ptr() as usize,
16124        ))
16125    }
16126    pub fn get_downstream_sfp_name(&self) -> Result<&'a CStr, ErrorContext> {
16127        let mut iter = self.clone();
16128        iter.pos = 0;
16129        for attr in iter {
16130            if let Ok(Phy::DownstreamSfpName(val)) = attr {
16131                return Ok(val);
16132            }
16133        }
16134        Err(ErrorContext::new_missing(
16135            "Phy",
16136            "DownstreamSfpName",
16137            self.orig_loc,
16138            self.buf.as_ptr() as usize,
16139        ))
16140    }
16141}
16142impl Phy<'_> {
16143    pub fn new<'a>(buf: &'a [u8]) -> IterablePhy<'a> {
16144        IterablePhy::with_loc(buf, buf.as_ptr() as usize)
16145    }
16146    fn attr_from_type(r#type: u16) -> Option<&'static str> {
16147        let res = match r#type {
16148            0u16 => "Unspec",
16149            1u16 => "Header",
16150            2u16 => "Index",
16151            3u16 => "Drvname",
16152            4u16 => "Name",
16153            5u16 => "UpstreamType",
16154            6u16 => "UpstreamIndex",
16155            7u16 => "UpstreamSfpName",
16156            8u16 => "DownstreamSfpName",
16157            _ => return None,
16158        };
16159        Some(res)
16160    }
16161}
16162#[derive(Clone, Copy, Default)]
16163pub struct IterablePhy<'a> {
16164    buf: &'a [u8],
16165    pos: usize,
16166    orig_loc: usize,
16167}
16168impl<'a> IterablePhy<'a> {
16169    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16170        Self {
16171            buf,
16172            pos: 0,
16173            orig_loc,
16174        }
16175    }
16176    pub fn get_buf(&self) -> &'a [u8] {
16177        self.buf
16178    }
16179}
16180impl<'a> Iterator for IterablePhy<'a> {
16181    type Item = Result<Phy<'a>, ErrorContext>;
16182    fn next(&mut self) -> Option<Self::Item> {
16183        let mut pos;
16184        let mut r#type;
16185        loop {
16186            pos = self.pos;
16187            r#type = None;
16188            if self.buf.len() == self.pos {
16189                return None;
16190            }
16191            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16192                self.pos = self.buf.len();
16193                break;
16194            };
16195            r#type = Some(header.r#type);
16196            let res = match header.r#type {
16197                1u16 => Phy::Header({
16198                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
16199                    let Some(val) = res else { break };
16200                    val
16201                }),
16202                2u16 => Phy::Index({
16203                    let res = parse_u32(next);
16204                    let Some(val) = res else { break };
16205                    val
16206                }),
16207                3u16 => Phy::Drvname({
16208                    let res = CStr::from_bytes_with_nul(next).ok();
16209                    let Some(val) = res else { break };
16210                    val
16211                }),
16212                4u16 => Phy::Name({
16213                    let res = CStr::from_bytes_with_nul(next).ok();
16214                    let Some(val) = res else { break };
16215                    val
16216                }),
16217                5u16 => Phy::UpstreamType({
16218                    let res = parse_u32(next);
16219                    let Some(val) = res else { break };
16220                    val
16221                }),
16222                6u16 => Phy::UpstreamIndex({
16223                    let res = parse_u32(next);
16224                    let Some(val) = res else { break };
16225                    val
16226                }),
16227                7u16 => Phy::UpstreamSfpName({
16228                    let res = CStr::from_bytes_with_nul(next).ok();
16229                    let Some(val) = res else { break };
16230                    val
16231                }),
16232                8u16 => Phy::DownstreamSfpName({
16233                    let res = CStr::from_bytes_with_nul(next).ok();
16234                    let Some(val) = res else { break };
16235                    val
16236                }),
16237                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16238                n => continue,
16239            };
16240            return Some(Ok(res));
16241        }
16242        Some(Err(ErrorContext::new(
16243            "Phy",
16244            r#type.and_then(|t| Phy::attr_from_type(t)),
16245            self.orig_loc,
16246            self.buf.as_ptr().wrapping_add(pos) as usize,
16247        )))
16248    }
16249}
16250impl<'a> std::fmt::Debug for IterablePhy<'_> {
16251    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16252        let mut fmt = f.debug_struct("Phy");
16253        for attr in self.clone() {
16254            let attr = match attr {
16255                Ok(a) => a,
16256                Err(err) => {
16257                    fmt.finish()?;
16258                    f.write_str("Err(")?;
16259                    err.fmt(f)?;
16260                    return f.write_str(")");
16261                }
16262            };
16263            match attr {
16264                Phy::Header(val) => fmt.field("Header", &val),
16265                Phy::Index(val) => fmt.field("Index", &val),
16266                Phy::Drvname(val) => fmt.field("Drvname", &val),
16267                Phy::Name(val) => fmt.field("Name", &val),
16268                Phy::UpstreamType(val) => fmt.field(
16269                    "UpstreamType",
16270                    &FormatEnum(val.into(), PhyUpstreamType::from_value),
16271                ),
16272                Phy::UpstreamIndex(val) => fmt.field("UpstreamIndex", &val),
16273                Phy::UpstreamSfpName(val) => fmt.field("UpstreamSfpName", &val),
16274                Phy::DownstreamSfpName(val) => fmt.field("DownstreamSfpName", &val),
16275            };
16276        }
16277        fmt.finish()
16278    }
16279}
16280impl IterablePhy<'_> {
16281    pub fn lookup_attr(
16282        &self,
16283        offset: usize,
16284        missing_type: Option<u16>,
16285    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16286        let mut stack = Vec::new();
16287        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16288        if missing_type.is_some() && cur == offset {
16289            stack.push(("Phy", offset));
16290            return (stack, missing_type.and_then(|t| Phy::attr_from_type(t)));
16291        }
16292        if cur > offset || cur + self.buf.len() < offset {
16293            return (stack, None);
16294        }
16295        let mut attrs = self.clone();
16296        let mut last_off = cur + attrs.pos;
16297        let mut missing = None;
16298        while let Some(attr) = attrs.next() {
16299            let Ok(attr) = attr else { break };
16300            match attr {
16301                Phy::Header(val) => {
16302                    (stack, missing) = val.lookup_attr(offset, missing_type);
16303                    if !stack.is_empty() {
16304                        break;
16305                    }
16306                }
16307                Phy::Index(val) => {
16308                    if last_off == offset {
16309                        stack.push(("Index", last_off));
16310                        break;
16311                    }
16312                }
16313                Phy::Drvname(val) => {
16314                    if last_off == offset {
16315                        stack.push(("Drvname", last_off));
16316                        break;
16317                    }
16318                }
16319                Phy::Name(val) => {
16320                    if last_off == offset {
16321                        stack.push(("Name", last_off));
16322                        break;
16323                    }
16324                }
16325                Phy::UpstreamType(val) => {
16326                    if last_off == offset {
16327                        stack.push(("UpstreamType", last_off));
16328                        break;
16329                    }
16330                }
16331                Phy::UpstreamIndex(val) => {
16332                    if last_off == offset {
16333                        stack.push(("UpstreamIndex", last_off));
16334                        break;
16335                    }
16336                }
16337                Phy::UpstreamSfpName(val) => {
16338                    if last_off == offset {
16339                        stack.push(("UpstreamSfpName", last_off));
16340                        break;
16341                    }
16342                }
16343                Phy::DownstreamSfpName(val) => {
16344                    if last_off == offset {
16345                        stack.push(("DownstreamSfpName", last_off));
16346                        break;
16347                    }
16348                }
16349                _ => {}
16350            };
16351            last_off = cur + attrs.pos;
16352        }
16353        if !stack.is_empty() {
16354            stack.push(("Phy", cur));
16355        }
16356        (stack, missing)
16357    }
16358}
16359#[derive(Clone)]
16360pub enum Tsconfig<'a> {
16361    Header(IterableHeader<'a>),
16362    HwtstampProvider(IterableTsHwtstampProvider<'a>),
16363    TxTypes(IterableBitset<'a>),
16364    RxFilters(IterableBitset<'a>),
16365    HwtstampFlags(IterableBitset<'a>),
16366}
16367impl<'a> IterableTsconfig<'a> {
16368    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
16369        let mut iter = self.clone();
16370        iter.pos = 0;
16371        for attr in iter {
16372            if let Ok(Tsconfig::Header(val)) = attr {
16373                return Ok(val);
16374            }
16375        }
16376        Err(ErrorContext::new_missing(
16377            "Tsconfig",
16378            "Header",
16379            self.orig_loc,
16380            self.buf.as_ptr() as usize,
16381        ))
16382    }
16383    pub fn get_hwtstamp_provider(&self) -> Result<IterableTsHwtstampProvider<'a>, ErrorContext> {
16384        let mut iter = self.clone();
16385        iter.pos = 0;
16386        for attr in iter {
16387            if let Ok(Tsconfig::HwtstampProvider(val)) = attr {
16388                return Ok(val);
16389            }
16390        }
16391        Err(ErrorContext::new_missing(
16392            "Tsconfig",
16393            "HwtstampProvider",
16394            self.orig_loc,
16395            self.buf.as_ptr() as usize,
16396        ))
16397    }
16398    pub fn get_tx_types(&self) -> Result<IterableBitset<'a>, ErrorContext> {
16399        let mut iter = self.clone();
16400        iter.pos = 0;
16401        for attr in iter {
16402            if let Ok(Tsconfig::TxTypes(val)) = attr {
16403                return Ok(val);
16404            }
16405        }
16406        Err(ErrorContext::new_missing(
16407            "Tsconfig",
16408            "TxTypes",
16409            self.orig_loc,
16410            self.buf.as_ptr() as usize,
16411        ))
16412    }
16413    pub fn get_rx_filters(&self) -> Result<IterableBitset<'a>, ErrorContext> {
16414        let mut iter = self.clone();
16415        iter.pos = 0;
16416        for attr in iter {
16417            if let Ok(Tsconfig::RxFilters(val)) = attr {
16418                return Ok(val);
16419            }
16420        }
16421        Err(ErrorContext::new_missing(
16422            "Tsconfig",
16423            "RxFilters",
16424            self.orig_loc,
16425            self.buf.as_ptr() as usize,
16426        ))
16427    }
16428    pub fn get_hwtstamp_flags(&self) -> Result<IterableBitset<'a>, ErrorContext> {
16429        let mut iter = self.clone();
16430        iter.pos = 0;
16431        for attr in iter {
16432            if let Ok(Tsconfig::HwtstampFlags(val)) = attr {
16433                return Ok(val);
16434            }
16435        }
16436        Err(ErrorContext::new_missing(
16437            "Tsconfig",
16438            "HwtstampFlags",
16439            self.orig_loc,
16440            self.buf.as_ptr() as usize,
16441        ))
16442    }
16443}
16444impl Tsconfig<'_> {
16445    pub fn new<'a>(buf: &'a [u8]) -> IterableTsconfig<'a> {
16446        IterableTsconfig::with_loc(buf, buf.as_ptr() as usize)
16447    }
16448    fn attr_from_type(r#type: u16) -> Option<&'static str> {
16449        let res = match r#type {
16450            0u16 => "Unspec",
16451            1u16 => "Header",
16452            2u16 => "HwtstampProvider",
16453            3u16 => "TxTypes",
16454            4u16 => "RxFilters",
16455            5u16 => "HwtstampFlags",
16456            _ => return None,
16457        };
16458        Some(res)
16459    }
16460}
16461#[derive(Clone, Copy, Default)]
16462pub struct IterableTsconfig<'a> {
16463    buf: &'a [u8],
16464    pos: usize,
16465    orig_loc: usize,
16466}
16467impl<'a> IterableTsconfig<'a> {
16468    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16469        Self {
16470            buf,
16471            pos: 0,
16472            orig_loc,
16473        }
16474    }
16475    pub fn get_buf(&self) -> &'a [u8] {
16476        self.buf
16477    }
16478}
16479impl<'a> Iterator for IterableTsconfig<'a> {
16480    type Item = Result<Tsconfig<'a>, ErrorContext>;
16481    fn next(&mut self) -> Option<Self::Item> {
16482        let mut pos;
16483        let mut r#type;
16484        loop {
16485            pos = self.pos;
16486            r#type = None;
16487            if self.buf.len() == self.pos {
16488                return None;
16489            }
16490            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16491                self.pos = self.buf.len();
16492                break;
16493            };
16494            r#type = Some(header.r#type);
16495            let res = match header.r#type {
16496                1u16 => Tsconfig::Header({
16497                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
16498                    let Some(val) = res else { break };
16499                    val
16500                }),
16501                2u16 => Tsconfig::HwtstampProvider({
16502                    let res = Some(IterableTsHwtstampProvider::with_loc(next, self.orig_loc));
16503                    let Some(val) = res else { break };
16504                    val
16505                }),
16506                3u16 => Tsconfig::TxTypes({
16507                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
16508                    let Some(val) = res else { break };
16509                    val
16510                }),
16511                4u16 => Tsconfig::RxFilters({
16512                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
16513                    let Some(val) = res else { break };
16514                    val
16515                }),
16516                5u16 => Tsconfig::HwtstampFlags({
16517                    let res = Some(IterableBitset::with_loc(next, self.orig_loc));
16518                    let Some(val) = res else { break };
16519                    val
16520                }),
16521                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16522                n => continue,
16523            };
16524            return Some(Ok(res));
16525        }
16526        Some(Err(ErrorContext::new(
16527            "Tsconfig",
16528            r#type.and_then(|t| Tsconfig::attr_from_type(t)),
16529            self.orig_loc,
16530            self.buf.as_ptr().wrapping_add(pos) as usize,
16531        )))
16532    }
16533}
16534impl<'a> std::fmt::Debug for IterableTsconfig<'_> {
16535    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16536        let mut fmt = f.debug_struct("Tsconfig");
16537        for attr in self.clone() {
16538            let attr = match attr {
16539                Ok(a) => a,
16540                Err(err) => {
16541                    fmt.finish()?;
16542                    f.write_str("Err(")?;
16543                    err.fmt(f)?;
16544                    return f.write_str(")");
16545                }
16546            };
16547            match attr {
16548                Tsconfig::Header(val) => fmt.field("Header", &val),
16549                Tsconfig::HwtstampProvider(val) => fmt.field("HwtstampProvider", &val),
16550                Tsconfig::TxTypes(val) => fmt.field("TxTypes", &val),
16551                Tsconfig::RxFilters(val) => fmt.field("RxFilters", &val),
16552                Tsconfig::HwtstampFlags(val) => fmt.field("HwtstampFlags", &val),
16553            };
16554        }
16555        fmt.finish()
16556    }
16557}
16558impl IterableTsconfig<'_> {
16559    pub fn lookup_attr(
16560        &self,
16561        offset: usize,
16562        missing_type: Option<u16>,
16563    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16564        let mut stack = Vec::new();
16565        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16566        if missing_type.is_some() && cur == offset {
16567            stack.push(("Tsconfig", offset));
16568            return (
16569                stack,
16570                missing_type.and_then(|t| Tsconfig::attr_from_type(t)),
16571            );
16572        }
16573        if cur > offset || cur + self.buf.len() < offset {
16574            return (stack, None);
16575        }
16576        let mut attrs = self.clone();
16577        let mut last_off = cur + attrs.pos;
16578        let mut missing = None;
16579        while let Some(attr) = attrs.next() {
16580            let Ok(attr) = attr else { break };
16581            match attr {
16582                Tsconfig::Header(val) => {
16583                    (stack, missing) = val.lookup_attr(offset, missing_type);
16584                    if !stack.is_empty() {
16585                        break;
16586                    }
16587                }
16588                Tsconfig::HwtstampProvider(val) => {
16589                    (stack, missing) = val.lookup_attr(offset, missing_type);
16590                    if !stack.is_empty() {
16591                        break;
16592                    }
16593                }
16594                Tsconfig::TxTypes(val) => {
16595                    (stack, missing) = val.lookup_attr(offset, missing_type);
16596                    if !stack.is_empty() {
16597                        break;
16598                    }
16599                }
16600                Tsconfig::RxFilters(val) => {
16601                    (stack, missing) = val.lookup_attr(offset, missing_type);
16602                    if !stack.is_empty() {
16603                        break;
16604                    }
16605                }
16606                Tsconfig::HwtstampFlags(val) => {
16607                    (stack, missing) = val.lookup_attr(offset, missing_type);
16608                    if !stack.is_empty() {
16609                        break;
16610                    }
16611                }
16612                _ => {}
16613            };
16614            last_off = cur + attrs.pos;
16615        }
16616        if !stack.is_empty() {
16617            stack.push(("Tsconfig", cur));
16618        }
16619        (stack, missing)
16620    }
16621}
16622#[derive(Clone)]
16623pub enum PseNtf<'a> {
16624    Header(IterableHeader<'a>),
16625    #[doc = "List of events reported by the PSE controller\n\nAssociated type: [`PseEvent`] (enum)"]
16626    Events(u32),
16627}
16628impl<'a> IterablePseNtf<'a> {
16629    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
16630        let mut iter = self.clone();
16631        iter.pos = 0;
16632        for attr in iter {
16633            if let Ok(PseNtf::Header(val)) = attr {
16634                return Ok(val);
16635            }
16636        }
16637        Err(ErrorContext::new_missing(
16638            "PseNtf",
16639            "Header",
16640            self.orig_loc,
16641            self.buf.as_ptr() as usize,
16642        ))
16643    }
16644    #[doc = "List of events reported by the PSE controller\n\nAssociated type: [`PseEvent`] (enum)"]
16645    pub fn get_events(&self) -> Result<u32, ErrorContext> {
16646        let mut iter = self.clone();
16647        iter.pos = 0;
16648        for attr in iter {
16649            if let Ok(PseNtf::Events(val)) = attr {
16650                return Ok(val);
16651            }
16652        }
16653        Err(ErrorContext::new_missing(
16654            "PseNtf",
16655            "Events",
16656            self.orig_loc,
16657            self.buf.as_ptr() as usize,
16658        ))
16659    }
16660}
16661impl PseNtf<'_> {
16662    pub fn new<'a>(buf: &'a [u8]) -> IterablePseNtf<'a> {
16663        IterablePseNtf::with_loc(buf, buf.as_ptr() as usize)
16664    }
16665    fn attr_from_type(r#type: u16) -> Option<&'static str> {
16666        let res = match r#type {
16667            1u16 => "Header",
16668            2u16 => "Events",
16669            _ => return None,
16670        };
16671        Some(res)
16672    }
16673}
16674#[derive(Clone, Copy, Default)]
16675pub struct IterablePseNtf<'a> {
16676    buf: &'a [u8],
16677    pos: usize,
16678    orig_loc: usize,
16679}
16680impl<'a> IterablePseNtf<'a> {
16681    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16682        Self {
16683            buf,
16684            pos: 0,
16685            orig_loc,
16686        }
16687    }
16688    pub fn get_buf(&self) -> &'a [u8] {
16689        self.buf
16690    }
16691}
16692impl<'a> Iterator for IterablePseNtf<'a> {
16693    type Item = Result<PseNtf<'a>, ErrorContext>;
16694    fn next(&mut self) -> Option<Self::Item> {
16695        let mut pos;
16696        let mut r#type;
16697        loop {
16698            pos = self.pos;
16699            r#type = None;
16700            if self.buf.len() == self.pos {
16701                return None;
16702            }
16703            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16704                self.pos = self.buf.len();
16705                break;
16706            };
16707            r#type = Some(header.r#type);
16708            let res = match header.r#type {
16709                1u16 => PseNtf::Header({
16710                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
16711                    let Some(val) = res else { break };
16712                    val
16713                }),
16714                2u16 => PseNtf::Events({
16715                    let res = parse_u32(next);
16716                    let Some(val) = res else { break };
16717                    val
16718                }),
16719                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16720                n => continue,
16721            };
16722            return Some(Ok(res));
16723        }
16724        Some(Err(ErrorContext::new(
16725            "PseNtf",
16726            r#type.and_then(|t| PseNtf::attr_from_type(t)),
16727            self.orig_loc,
16728            self.buf.as_ptr().wrapping_add(pos) as usize,
16729        )))
16730    }
16731}
16732impl<'a> std::fmt::Debug for IterablePseNtf<'_> {
16733    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16734        let mut fmt = f.debug_struct("PseNtf");
16735        for attr in self.clone() {
16736            let attr = match attr {
16737                Ok(a) => a,
16738                Err(err) => {
16739                    fmt.finish()?;
16740                    f.write_str("Err(")?;
16741                    err.fmt(f)?;
16742                    return f.write_str(")");
16743                }
16744            };
16745            match attr {
16746                PseNtf::Header(val) => fmt.field("Header", &val),
16747                PseNtf::Events(val) => {
16748                    fmt.field("Events", &FormatFlags(val.into(), PseEvent::from_value))
16749                }
16750            };
16751        }
16752        fmt.finish()
16753    }
16754}
16755impl IterablePseNtf<'_> {
16756    pub fn lookup_attr(
16757        &self,
16758        offset: usize,
16759        missing_type: Option<u16>,
16760    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16761        let mut stack = Vec::new();
16762        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16763        if missing_type.is_some() && cur == offset {
16764            stack.push(("PseNtf", offset));
16765            return (stack, missing_type.and_then(|t| PseNtf::attr_from_type(t)));
16766        }
16767        if cur > offset || cur + self.buf.len() < offset {
16768            return (stack, None);
16769        }
16770        let mut attrs = self.clone();
16771        let mut last_off = cur + attrs.pos;
16772        let mut missing = None;
16773        while let Some(attr) = attrs.next() {
16774            let Ok(attr) = attr else { break };
16775            match attr {
16776                PseNtf::Header(val) => {
16777                    (stack, missing) = val.lookup_attr(offset, missing_type);
16778                    if !stack.is_empty() {
16779                        break;
16780                    }
16781                }
16782                PseNtf::Events(val) => {
16783                    if last_off == offset {
16784                        stack.push(("Events", last_off));
16785                        break;
16786                    }
16787                }
16788                _ => {}
16789            };
16790            last_off = cur + attrs.pos;
16791        }
16792        if !stack.is_empty() {
16793            stack.push(("PseNtf", cur));
16794        }
16795        (stack, missing)
16796    }
16797}
16798#[derive(Clone)]
16799pub enum MseCapabilities {
16800    MaxAverageMse(u32),
16801    MaxPeakMse(u32),
16802    RefreshRatePs(u32),
16803    NumSymbols(u32),
16804}
16805impl<'a> IterableMseCapabilities<'a> {
16806    pub fn get_max_average_mse(&self) -> Result<u32, ErrorContext> {
16807        let mut iter = self.clone();
16808        iter.pos = 0;
16809        for attr in iter {
16810            if let Ok(MseCapabilities::MaxAverageMse(val)) = attr {
16811                return Ok(val);
16812            }
16813        }
16814        Err(ErrorContext::new_missing(
16815            "MseCapabilities",
16816            "MaxAverageMse",
16817            self.orig_loc,
16818            self.buf.as_ptr() as usize,
16819        ))
16820    }
16821    pub fn get_max_peak_mse(&self) -> Result<u32, ErrorContext> {
16822        let mut iter = self.clone();
16823        iter.pos = 0;
16824        for attr in iter {
16825            if let Ok(MseCapabilities::MaxPeakMse(val)) = attr {
16826                return Ok(val);
16827            }
16828        }
16829        Err(ErrorContext::new_missing(
16830            "MseCapabilities",
16831            "MaxPeakMse",
16832            self.orig_loc,
16833            self.buf.as_ptr() as usize,
16834        ))
16835    }
16836    pub fn get_refresh_rate_ps(&self) -> Result<u32, ErrorContext> {
16837        let mut iter = self.clone();
16838        iter.pos = 0;
16839        for attr in iter {
16840            if let Ok(MseCapabilities::RefreshRatePs(val)) = attr {
16841                return Ok(val);
16842            }
16843        }
16844        Err(ErrorContext::new_missing(
16845            "MseCapabilities",
16846            "RefreshRatePs",
16847            self.orig_loc,
16848            self.buf.as_ptr() as usize,
16849        ))
16850    }
16851    pub fn get_num_symbols(&self) -> Result<u32, ErrorContext> {
16852        let mut iter = self.clone();
16853        iter.pos = 0;
16854        for attr in iter {
16855            if let Ok(MseCapabilities::NumSymbols(val)) = attr {
16856                return Ok(val);
16857            }
16858        }
16859        Err(ErrorContext::new_missing(
16860            "MseCapabilities",
16861            "NumSymbols",
16862            self.orig_loc,
16863            self.buf.as_ptr() as usize,
16864        ))
16865    }
16866}
16867impl MseCapabilities {
16868    pub fn new<'a>(buf: &'a [u8]) -> IterableMseCapabilities<'a> {
16869        IterableMseCapabilities::with_loc(buf, buf.as_ptr() as usize)
16870    }
16871    fn attr_from_type(r#type: u16) -> Option<&'static str> {
16872        let res = match r#type {
16873            1u16 => "MaxAverageMse",
16874            2u16 => "MaxPeakMse",
16875            3u16 => "RefreshRatePs",
16876            4u16 => "NumSymbols",
16877            _ => return None,
16878        };
16879        Some(res)
16880    }
16881}
16882#[derive(Clone, Copy, Default)]
16883pub struct IterableMseCapabilities<'a> {
16884    buf: &'a [u8],
16885    pos: usize,
16886    orig_loc: usize,
16887}
16888impl<'a> IterableMseCapabilities<'a> {
16889    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16890        Self {
16891            buf,
16892            pos: 0,
16893            orig_loc,
16894        }
16895    }
16896    pub fn get_buf(&self) -> &'a [u8] {
16897        self.buf
16898    }
16899}
16900impl<'a> Iterator for IterableMseCapabilities<'a> {
16901    type Item = Result<MseCapabilities, ErrorContext>;
16902    fn next(&mut self) -> Option<Self::Item> {
16903        let mut pos;
16904        let mut r#type;
16905        loop {
16906            pos = self.pos;
16907            r#type = None;
16908            if self.buf.len() == self.pos {
16909                return None;
16910            }
16911            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16912                self.pos = self.buf.len();
16913                break;
16914            };
16915            r#type = Some(header.r#type);
16916            let res = match header.r#type {
16917                1u16 => MseCapabilities::MaxAverageMse({
16918                    let res = parse_u32(next);
16919                    let Some(val) = res else { break };
16920                    val
16921                }),
16922                2u16 => MseCapabilities::MaxPeakMse({
16923                    let res = parse_u32(next);
16924                    let Some(val) = res else { break };
16925                    val
16926                }),
16927                3u16 => MseCapabilities::RefreshRatePs({
16928                    let res = parse_u32(next);
16929                    let Some(val) = res else { break };
16930                    val
16931                }),
16932                4u16 => MseCapabilities::NumSymbols({
16933                    let res = parse_u32(next);
16934                    let Some(val) = res else { break };
16935                    val
16936                }),
16937                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16938                n => continue,
16939            };
16940            return Some(Ok(res));
16941        }
16942        Some(Err(ErrorContext::new(
16943            "MseCapabilities",
16944            r#type.and_then(|t| MseCapabilities::attr_from_type(t)),
16945            self.orig_loc,
16946            self.buf.as_ptr().wrapping_add(pos) as usize,
16947        )))
16948    }
16949}
16950impl std::fmt::Debug for IterableMseCapabilities<'_> {
16951    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16952        let mut fmt = f.debug_struct("MseCapabilities");
16953        for attr in self.clone() {
16954            let attr = match attr {
16955                Ok(a) => a,
16956                Err(err) => {
16957                    fmt.finish()?;
16958                    f.write_str("Err(")?;
16959                    err.fmt(f)?;
16960                    return f.write_str(")");
16961                }
16962            };
16963            match attr {
16964                MseCapabilities::MaxAverageMse(val) => fmt.field("MaxAverageMse", &val),
16965                MseCapabilities::MaxPeakMse(val) => fmt.field("MaxPeakMse", &val),
16966                MseCapabilities::RefreshRatePs(val) => fmt.field("RefreshRatePs", &val),
16967                MseCapabilities::NumSymbols(val) => fmt.field("NumSymbols", &val),
16968            };
16969        }
16970        fmt.finish()
16971    }
16972}
16973impl IterableMseCapabilities<'_> {
16974    pub fn lookup_attr(
16975        &self,
16976        offset: usize,
16977        missing_type: Option<u16>,
16978    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16979        let mut stack = Vec::new();
16980        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16981        if missing_type.is_some() && cur == offset {
16982            stack.push(("MseCapabilities", offset));
16983            return (
16984                stack,
16985                missing_type.and_then(|t| MseCapabilities::attr_from_type(t)),
16986            );
16987        }
16988        if cur > offset || cur + self.buf.len() < offset {
16989            return (stack, None);
16990        }
16991        let mut attrs = self.clone();
16992        let mut last_off = cur + attrs.pos;
16993        while let Some(attr) = attrs.next() {
16994            let Ok(attr) = attr else { break };
16995            match attr {
16996                MseCapabilities::MaxAverageMse(val) => {
16997                    if last_off == offset {
16998                        stack.push(("MaxAverageMse", last_off));
16999                        break;
17000                    }
17001                }
17002                MseCapabilities::MaxPeakMse(val) => {
17003                    if last_off == offset {
17004                        stack.push(("MaxPeakMse", last_off));
17005                        break;
17006                    }
17007                }
17008                MseCapabilities::RefreshRatePs(val) => {
17009                    if last_off == offset {
17010                        stack.push(("RefreshRatePs", last_off));
17011                        break;
17012                    }
17013                }
17014                MseCapabilities::NumSymbols(val) => {
17015                    if last_off == offset {
17016                        stack.push(("NumSymbols", last_off));
17017                        break;
17018                    }
17019                }
17020                _ => {}
17021            };
17022            last_off = cur + attrs.pos;
17023        }
17024        if !stack.is_empty() {
17025            stack.push(("MseCapabilities", cur));
17026        }
17027        (stack, None)
17028    }
17029}
17030#[derive(Clone)]
17031pub enum MseSnapshot {
17032    AverageMse(u32),
17033    PeakMse(u32),
17034    WorstPeakMse(u32),
17035}
17036impl<'a> IterableMseSnapshot<'a> {
17037    pub fn get_average_mse(&self) -> Result<u32, ErrorContext> {
17038        let mut iter = self.clone();
17039        iter.pos = 0;
17040        for attr in iter {
17041            if let Ok(MseSnapshot::AverageMse(val)) = attr {
17042                return Ok(val);
17043            }
17044        }
17045        Err(ErrorContext::new_missing(
17046            "MseSnapshot",
17047            "AverageMse",
17048            self.orig_loc,
17049            self.buf.as_ptr() as usize,
17050        ))
17051    }
17052    pub fn get_peak_mse(&self) -> Result<u32, ErrorContext> {
17053        let mut iter = self.clone();
17054        iter.pos = 0;
17055        for attr in iter {
17056            if let Ok(MseSnapshot::PeakMse(val)) = attr {
17057                return Ok(val);
17058            }
17059        }
17060        Err(ErrorContext::new_missing(
17061            "MseSnapshot",
17062            "PeakMse",
17063            self.orig_loc,
17064            self.buf.as_ptr() as usize,
17065        ))
17066    }
17067    pub fn get_worst_peak_mse(&self) -> Result<u32, ErrorContext> {
17068        let mut iter = self.clone();
17069        iter.pos = 0;
17070        for attr in iter {
17071            if let Ok(MseSnapshot::WorstPeakMse(val)) = attr {
17072                return Ok(val);
17073            }
17074        }
17075        Err(ErrorContext::new_missing(
17076            "MseSnapshot",
17077            "WorstPeakMse",
17078            self.orig_loc,
17079            self.buf.as_ptr() as usize,
17080        ))
17081    }
17082}
17083impl MseSnapshot {
17084    pub fn new<'a>(buf: &'a [u8]) -> IterableMseSnapshot<'a> {
17085        IterableMseSnapshot::with_loc(buf, buf.as_ptr() as usize)
17086    }
17087    fn attr_from_type(r#type: u16) -> Option<&'static str> {
17088        let res = match r#type {
17089            1u16 => "AverageMse",
17090            2u16 => "PeakMse",
17091            3u16 => "WorstPeakMse",
17092            _ => return None,
17093        };
17094        Some(res)
17095    }
17096}
17097#[derive(Clone, Copy, Default)]
17098pub struct IterableMseSnapshot<'a> {
17099    buf: &'a [u8],
17100    pos: usize,
17101    orig_loc: usize,
17102}
17103impl<'a> IterableMseSnapshot<'a> {
17104    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17105        Self {
17106            buf,
17107            pos: 0,
17108            orig_loc,
17109        }
17110    }
17111    pub fn get_buf(&self) -> &'a [u8] {
17112        self.buf
17113    }
17114}
17115impl<'a> Iterator for IterableMseSnapshot<'a> {
17116    type Item = Result<MseSnapshot, ErrorContext>;
17117    fn next(&mut self) -> Option<Self::Item> {
17118        let mut pos;
17119        let mut r#type;
17120        loop {
17121            pos = self.pos;
17122            r#type = None;
17123            if self.buf.len() == self.pos {
17124                return None;
17125            }
17126            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
17127                self.pos = self.buf.len();
17128                break;
17129            };
17130            r#type = Some(header.r#type);
17131            let res = match header.r#type {
17132                1u16 => MseSnapshot::AverageMse({
17133                    let res = parse_u32(next);
17134                    let Some(val) = res else { break };
17135                    val
17136                }),
17137                2u16 => MseSnapshot::PeakMse({
17138                    let res = parse_u32(next);
17139                    let Some(val) = res else { break };
17140                    val
17141                }),
17142                3u16 => MseSnapshot::WorstPeakMse({
17143                    let res = parse_u32(next);
17144                    let Some(val) = res else { break };
17145                    val
17146                }),
17147                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17148                n => continue,
17149            };
17150            return Some(Ok(res));
17151        }
17152        Some(Err(ErrorContext::new(
17153            "MseSnapshot",
17154            r#type.and_then(|t| MseSnapshot::attr_from_type(t)),
17155            self.orig_loc,
17156            self.buf.as_ptr().wrapping_add(pos) as usize,
17157        )))
17158    }
17159}
17160impl std::fmt::Debug for IterableMseSnapshot<'_> {
17161    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17162        let mut fmt = f.debug_struct("MseSnapshot");
17163        for attr in self.clone() {
17164            let attr = match attr {
17165                Ok(a) => a,
17166                Err(err) => {
17167                    fmt.finish()?;
17168                    f.write_str("Err(")?;
17169                    err.fmt(f)?;
17170                    return f.write_str(")");
17171                }
17172            };
17173            match attr {
17174                MseSnapshot::AverageMse(val) => fmt.field("AverageMse", &val),
17175                MseSnapshot::PeakMse(val) => fmt.field("PeakMse", &val),
17176                MseSnapshot::WorstPeakMse(val) => fmt.field("WorstPeakMse", &val),
17177            };
17178        }
17179        fmt.finish()
17180    }
17181}
17182impl IterableMseSnapshot<'_> {
17183    pub fn lookup_attr(
17184        &self,
17185        offset: usize,
17186        missing_type: Option<u16>,
17187    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17188        let mut stack = Vec::new();
17189        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17190        if missing_type.is_some() && cur == offset {
17191            stack.push(("MseSnapshot", offset));
17192            return (
17193                stack,
17194                missing_type.and_then(|t| MseSnapshot::attr_from_type(t)),
17195            );
17196        }
17197        if cur > offset || cur + self.buf.len() < offset {
17198            return (stack, None);
17199        }
17200        let mut attrs = self.clone();
17201        let mut last_off = cur + attrs.pos;
17202        while let Some(attr) = attrs.next() {
17203            let Ok(attr) = attr else { break };
17204            match attr {
17205                MseSnapshot::AverageMse(val) => {
17206                    if last_off == offset {
17207                        stack.push(("AverageMse", last_off));
17208                        break;
17209                    }
17210                }
17211                MseSnapshot::PeakMse(val) => {
17212                    if last_off == offset {
17213                        stack.push(("PeakMse", last_off));
17214                        break;
17215                    }
17216                }
17217                MseSnapshot::WorstPeakMse(val) => {
17218                    if last_off == offset {
17219                        stack.push(("WorstPeakMse", last_off));
17220                        break;
17221                    }
17222                }
17223                _ => {}
17224            };
17225            last_off = cur + attrs.pos;
17226        }
17227        if !stack.is_empty() {
17228            stack.push(("MseSnapshot", cur));
17229        }
17230        (stack, None)
17231    }
17232}
17233#[derive(Clone)]
17234pub enum Mse<'a> {
17235    Header(IterableHeader<'a>),
17236    Capabilities(IterableMseCapabilities<'a>),
17237    ChannelA(IterableMseSnapshot<'a>),
17238    ChannelB(IterableMseSnapshot<'a>),
17239    ChannelC(IterableMseSnapshot<'a>),
17240    ChannelD(IterableMseSnapshot<'a>),
17241    WorstChannel(IterableMseSnapshot<'a>),
17242    Link(IterableMseSnapshot<'a>),
17243}
17244impl<'a> IterableMse<'a> {
17245    pub fn get_header(&self) -> Result<IterableHeader<'a>, ErrorContext> {
17246        let mut iter = self.clone();
17247        iter.pos = 0;
17248        for attr in iter {
17249            if let Ok(Mse::Header(val)) = attr {
17250                return Ok(val);
17251            }
17252        }
17253        Err(ErrorContext::new_missing(
17254            "Mse",
17255            "Header",
17256            self.orig_loc,
17257            self.buf.as_ptr() as usize,
17258        ))
17259    }
17260    pub fn get_capabilities(&self) -> Result<IterableMseCapabilities<'a>, ErrorContext> {
17261        let mut iter = self.clone();
17262        iter.pos = 0;
17263        for attr in iter {
17264            if let Ok(Mse::Capabilities(val)) = attr {
17265                return Ok(val);
17266            }
17267        }
17268        Err(ErrorContext::new_missing(
17269            "Mse",
17270            "Capabilities",
17271            self.orig_loc,
17272            self.buf.as_ptr() as usize,
17273        ))
17274    }
17275    pub fn get_channel_a(&self) -> Result<IterableMseSnapshot<'a>, ErrorContext> {
17276        let mut iter = self.clone();
17277        iter.pos = 0;
17278        for attr in iter {
17279            if let Ok(Mse::ChannelA(val)) = attr {
17280                return Ok(val);
17281            }
17282        }
17283        Err(ErrorContext::new_missing(
17284            "Mse",
17285            "ChannelA",
17286            self.orig_loc,
17287            self.buf.as_ptr() as usize,
17288        ))
17289    }
17290    pub fn get_channel_b(&self) -> Result<IterableMseSnapshot<'a>, ErrorContext> {
17291        let mut iter = self.clone();
17292        iter.pos = 0;
17293        for attr in iter {
17294            if let Ok(Mse::ChannelB(val)) = attr {
17295                return Ok(val);
17296            }
17297        }
17298        Err(ErrorContext::new_missing(
17299            "Mse",
17300            "ChannelB",
17301            self.orig_loc,
17302            self.buf.as_ptr() as usize,
17303        ))
17304    }
17305    pub fn get_channel_c(&self) -> Result<IterableMseSnapshot<'a>, ErrorContext> {
17306        let mut iter = self.clone();
17307        iter.pos = 0;
17308        for attr in iter {
17309            if let Ok(Mse::ChannelC(val)) = attr {
17310                return Ok(val);
17311            }
17312        }
17313        Err(ErrorContext::new_missing(
17314            "Mse",
17315            "ChannelC",
17316            self.orig_loc,
17317            self.buf.as_ptr() as usize,
17318        ))
17319    }
17320    pub fn get_channel_d(&self) -> Result<IterableMseSnapshot<'a>, ErrorContext> {
17321        let mut iter = self.clone();
17322        iter.pos = 0;
17323        for attr in iter {
17324            if let Ok(Mse::ChannelD(val)) = attr {
17325                return Ok(val);
17326            }
17327        }
17328        Err(ErrorContext::new_missing(
17329            "Mse",
17330            "ChannelD",
17331            self.orig_loc,
17332            self.buf.as_ptr() as usize,
17333        ))
17334    }
17335    pub fn get_worst_channel(&self) -> Result<IterableMseSnapshot<'a>, ErrorContext> {
17336        let mut iter = self.clone();
17337        iter.pos = 0;
17338        for attr in iter {
17339            if let Ok(Mse::WorstChannel(val)) = attr {
17340                return Ok(val);
17341            }
17342        }
17343        Err(ErrorContext::new_missing(
17344            "Mse",
17345            "WorstChannel",
17346            self.orig_loc,
17347            self.buf.as_ptr() as usize,
17348        ))
17349    }
17350    pub fn get_link(&self) -> Result<IterableMseSnapshot<'a>, ErrorContext> {
17351        let mut iter = self.clone();
17352        iter.pos = 0;
17353        for attr in iter {
17354            if let Ok(Mse::Link(val)) = attr {
17355                return Ok(val);
17356            }
17357        }
17358        Err(ErrorContext::new_missing(
17359            "Mse",
17360            "Link",
17361            self.orig_loc,
17362            self.buf.as_ptr() as usize,
17363        ))
17364    }
17365}
17366impl Mse<'_> {
17367    pub fn new<'a>(buf: &'a [u8]) -> IterableMse<'a> {
17368        IterableMse::with_loc(buf, buf.as_ptr() as usize)
17369    }
17370    fn attr_from_type(r#type: u16) -> Option<&'static str> {
17371        let res = match r#type {
17372            1u16 => "Header",
17373            2u16 => "Capabilities",
17374            3u16 => "ChannelA",
17375            4u16 => "ChannelB",
17376            5u16 => "ChannelC",
17377            6u16 => "ChannelD",
17378            7u16 => "WorstChannel",
17379            8u16 => "Link",
17380            _ => return None,
17381        };
17382        Some(res)
17383    }
17384}
17385#[derive(Clone, Copy, Default)]
17386pub struct IterableMse<'a> {
17387    buf: &'a [u8],
17388    pos: usize,
17389    orig_loc: usize,
17390}
17391impl<'a> IterableMse<'a> {
17392    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17393        Self {
17394            buf,
17395            pos: 0,
17396            orig_loc,
17397        }
17398    }
17399    pub fn get_buf(&self) -> &'a [u8] {
17400        self.buf
17401    }
17402}
17403impl<'a> Iterator for IterableMse<'a> {
17404    type Item = Result<Mse<'a>, ErrorContext>;
17405    fn next(&mut self) -> Option<Self::Item> {
17406        let mut pos;
17407        let mut r#type;
17408        loop {
17409            pos = self.pos;
17410            r#type = None;
17411            if self.buf.len() == self.pos {
17412                return None;
17413            }
17414            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
17415                self.pos = self.buf.len();
17416                break;
17417            };
17418            r#type = Some(header.r#type);
17419            let res = match header.r#type {
17420                1u16 => Mse::Header({
17421                    let res = Some(IterableHeader::with_loc(next, self.orig_loc));
17422                    let Some(val) = res else { break };
17423                    val
17424                }),
17425                2u16 => Mse::Capabilities({
17426                    let res = Some(IterableMseCapabilities::with_loc(next, self.orig_loc));
17427                    let Some(val) = res else { break };
17428                    val
17429                }),
17430                3u16 => Mse::ChannelA({
17431                    let res = Some(IterableMseSnapshot::with_loc(next, self.orig_loc));
17432                    let Some(val) = res else { break };
17433                    val
17434                }),
17435                4u16 => Mse::ChannelB({
17436                    let res = Some(IterableMseSnapshot::with_loc(next, self.orig_loc));
17437                    let Some(val) = res else { break };
17438                    val
17439                }),
17440                5u16 => Mse::ChannelC({
17441                    let res = Some(IterableMseSnapshot::with_loc(next, self.orig_loc));
17442                    let Some(val) = res else { break };
17443                    val
17444                }),
17445                6u16 => Mse::ChannelD({
17446                    let res = Some(IterableMseSnapshot::with_loc(next, self.orig_loc));
17447                    let Some(val) = res else { break };
17448                    val
17449                }),
17450                7u16 => Mse::WorstChannel({
17451                    let res = Some(IterableMseSnapshot::with_loc(next, self.orig_loc));
17452                    let Some(val) = res else { break };
17453                    val
17454                }),
17455                8u16 => Mse::Link({
17456                    let res = Some(IterableMseSnapshot::with_loc(next, self.orig_loc));
17457                    let Some(val) = res else { break };
17458                    val
17459                }),
17460                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17461                n => continue,
17462            };
17463            return Some(Ok(res));
17464        }
17465        Some(Err(ErrorContext::new(
17466            "Mse",
17467            r#type.and_then(|t| Mse::attr_from_type(t)),
17468            self.orig_loc,
17469            self.buf.as_ptr().wrapping_add(pos) as usize,
17470        )))
17471    }
17472}
17473impl<'a> std::fmt::Debug for IterableMse<'_> {
17474    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17475        let mut fmt = f.debug_struct("Mse");
17476        for attr in self.clone() {
17477            let attr = match attr {
17478                Ok(a) => a,
17479                Err(err) => {
17480                    fmt.finish()?;
17481                    f.write_str("Err(")?;
17482                    err.fmt(f)?;
17483                    return f.write_str(")");
17484                }
17485            };
17486            match attr {
17487                Mse::Header(val) => fmt.field("Header", &val),
17488                Mse::Capabilities(val) => fmt.field("Capabilities", &val),
17489                Mse::ChannelA(val) => fmt.field("ChannelA", &val),
17490                Mse::ChannelB(val) => fmt.field("ChannelB", &val),
17491                Mse::ChannelC(val) => fmt.field("ChannelC", &val),
17492                Mse::ChannelD(val) => fmt.field("ChannelD", &val),
17493                Mse::WorstChannel(val) => fmt.field("WorstChannel", &val),
17494                Mse::Link(val) => fmt.field("Link", &val),
17495            };
17496        }
17497        fmt.finish()
17498    }
17499}
17500impl IterableMse<'_> {
17501    pub fn lookup_attr(
17502        &self,
17503        offset: usize,
17504        missing_type: Option<u16>,
17505    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17506        let mut stack = Vec::new();
17507        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17508        if missing_type.is_some() && cur == offset {
17509            stack.push(("Mse", offset));
17510            return (stack, missing_type.and_then(|t| Mse::attr_from_type(t)));
17511        }
17512        if cur > offset || cur + self.buf.len() < offset {
17513            return (stack, None);
17514        }
17515        let mut attrs = self.clone();
17516        let mut last_off = cur + attrs.pos;
17517        let mut missing = None;
17518        while let Some(attr) = attrs.next() {
17519            let Ok(attr) = attr else { break };
17520            match attr {
17521                Mse::Header(val) => {
17522                    (stack, missing) = val.lookup_attr(offset, missing_type);
17523                    if !stack.is_empty() {
17524                        break;
17525                    }
17526                }
17527                Mse::Capabilities(val) => {
17528                    (stack, missing) = val.lookup_attr(offset, missing_type);
17529                    if !stack.is_empty() {
17530                        break;
17531                    }
17532                }
17533                Mse::ChannelA(val) => {
17534                    (stack, missing) = val.lookup_attr(offset, missing_type);
17535                    if !stack.is_empty() {
17536                        break;
17537                    }
17538                }
17539                Mse::ChannelB(val) => {
17540                    (stack, missing) = val.lookup_attr(offset, missing_type);
17541                    if !stack.is_empty() {
17542                        break;
17543                    }
17544                }
17545                Mse::ChannelC(val) => {
17546                    (stack, missing) = val.lookup_attr(offset, missing_type);
17547                    if !stack.is_empty() {
17548                        break;
17549                    }
17550                }
17551                Mse::ChannelD(val) => {
17552                    (stack, missing) = val.lookup_attr(offset, missing_type);
17553                    if !stack.is_empty() {
17554                        break;
17555                    }
17556                }
17557                Mse::WorstChannel(val) => {
17558                    (stack, missing) = val.lookup_attr(offset, missing_type);
17559                    if !stack.is_empty() {
17560                        break;
17561                    }
17562                }
17563                Mse::Link(val) => {
17564                    (stack, missing) = val.lookup_attr(offset, missing_type);
17565                    if !stack.is_empty() {
17566                        break;
17567                    }
17568                }
17569                _ => {}
17570            };
17571            last_off = cur + attrs.pos;
17572        }
17573        if !stack.is_empty() {
17574            stack.push(("Mse", cur));
17575        }
17576        (stack, missing)
17577    }
17578}
17579pub struct PushHeader<Prev: Pusher> {
17580    pub(crate) prev: Option<Prev>,
17581    pub(crate) header_offset: Option<usize>,
17582}
17583impl<Prev: Pusher> Pusher for PushHeader<Prev> {
17584    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
17585        self.prev.as_mut().unwrap().as_vec_mut()
17586    }
17587    fn as_vec(&self) -> &Vec<u8> {
17588        self.prev.as_ref().unwrap().as_vec()
17589    }
17590}
17591impl<Prev: Pusher> PushHeader<Prev> {
17592    pub fn new(prev: Prev) -> Self {
17593        Self {
17594            prev: Some(prev),
17595            header_offset: None,
17596        }
17597    }
17598    pub fn end_nested(mut self) -> Prev {
17599        let mut prev = self.prev.take().unwrap();
17600        if let Some(header_offset) = &self.header_offset {
17601            finalize_nested_header(prev.as_vec_mut(), *header_offset);
17602        }
17603        prev
17604    }
17605    pub fn push_dev_index(mut self, value: u32) -> Self {
17606        push_header(self.as_vec_mut(), 1u16, 4 as u16);
17607        self.as_vec_mut().extend(value.to_ne_bytes());
17608        self
17609    }
17610    pub fn push_dev_name(mut self, value: &CStr) -> Self {
17611        push_header(
17612            self.as_vec_mut(),
17613            2u16,
17614            value.to_bytes_with_nul().len() as u16,
17615        );
17616        self.as_vec_mut().extend(value.to_bytes_with_nul());
17617        self
17618    }
17619    pub fn push_dev_name_bytes(mut self, value: &[u8]) -> Self {
17620        push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
17621        self.as_vec_mut().extend(value);
17622        self.as_vec_mut().push(0);
17623        self
17624    }
17625    #[doc = "Associated type: [`HeaderFlags`] (enum)"]
17626    pub fn push_flags(mut self, value: u32) -> Self {
17627        push_header(self.as_vec_mut(), 3u16, 4 as u16);
17628        self.as_vec_mut().extend(value.to_ne_bytes());
17629        self
17630    }
17631    pub fn push_phy_index(mut self, value: u32) -> Self {
17632        push_header(self.as_vec_mut(), 4u16, 4 as u16);
17633        self.as_vec_mut().extend(value.to_ne_bytes());
17634        self
17635    }
17636}
17637impl<Prev: Pusher> Drop for PushHeader<Prev> {
17638    fn drop(&mut self) {
17639        if let Some(prev) = &mut self.prev {
17640            if let Some(header_offset) = &self.header_offset {
17641                finalize_nested_header(prev.as_vec_mut(), *header_offset);
17642            }
17643        }
17644    }
17645}
17646pub struct PushBitsetBit<Prev: Pusher> {
17647    pub(crate) prev: Option<Prev>,
17648    pub(crate) header_offset: Option<usize>,
17649}
17650impl<Prev: Pusher> Pusher for PushBitsetBit<Prev> {
17651    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
17652        self.prev.as_mut().unwrap().as_vec_mut()
17653    }
17654    fn as_vec(&self) -> &Vec<u8> {
17655        self.prev.as_ref().unwrap().as_vec()
17656    }
17657}
17658impl<Prev: Pusher> PushBitsetBit<Prev> {
17659    pub fn new(prev: Prev) -> Self {
17660        Self {
17661            prev: Some(prev),
17662            header_offset: None,
17663        }
17664    }
17665    pub fn end_nested(mut self) -> Prev {
17666        let mut prev = self.prev.take().unwrap();
17667        if let Some(header_offset) = &self.header_offset {
17668            finalize_nested_header(prev.as_vec_mut(), *header_offset);
17669        }
17670        prev
17671    }
17672    pub fn push_index(mut self, value: u32) -> Self {
17673        push_header(self.as_vec_mut(), 1u16, 4 as u16);
17674        self.as_vec_mut().extend(value.to_ne_bytes());
17675        self
17676    }
17677    pub fn push_name(mut self, value: &CStr) -> Self {
17678        push_header(
17679            self.as_vec_mut(),
17680            2u16,
17681            value.to_bytes_with_nul().len() as u16,
17682        );
17683        self.as_vec_mut().extend(value.to_bytes_with_nul());
17684        self
17685    }
17686    pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
17687        push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
17688        self.as_vec_mut().extend(value);
17689        self.as_vec_mut().push(0);
17690        self
17691    }
17692    pub fn push_value(mut self, value: ()) -> Self {
17693        push_header(self.as_vec_mut(), 3u16, 0 as u16);
17694        self
17695    }
17696}
17697impl<Prev: Pusher> Drop for PushBitsetBit<Prev> {
17698    fn drop(&mut self) {
17699        if let Some(prev) = &mut self.prev {
17700            if let Some(header_offset) = &self.header_offset {
17701                finalize_nested_header(prev.as_vec_mut(), *header_offset);
17702            }
17703        }
17704    }
17705}
17706pub struct PushBitsetBits<Prev: Pusher> {
17707    pub(crate) prev: Option<Prev>,
17708    pub(crate) header_offset: Option<usize>,
17709}
17710impl<Prev: Pusher> Pusher for PushBitsetBits<Prev> {
17711    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
17712        self.prev.as_mut().unwrap().as_vec_mut()
17713    }
17714    fn as_vec(&self) -> &Vec<u8> {
17715        self.prev.as_ref().unwrap().as_vec()
17716    }
17717}
17718impl<Prev: Pusher> PushBitsetBits<Prev> {
17719    pub fn new(prev: Prev) -> Self {
17720        Self {
17721            prev: Some(prev),
17722            header_offset: None,
17723        }
17724    }
17725    pub fn end_nested(mut self) -> Prev {
17726        let mut prev = self.prev.take().unwrap();
17727        if let Some(header_offset) = &self.header_offset {
17728            finalize_nested_header(prev.as_vec_mut(), *header_offset);
17729        }
17730        prev
17731    }
17732    #[doc = "Attribute may repeat multiple times (treat it as array)"]
17733    pub fn nested_bit(mut self) -> PushBitsetBit<Self> {
17734        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
17735        PushBitsetBit {
17736            prev: Some(self),
17737            header_offset: Some(header_offset),
17738        }
17739    }
17740}
17741impl<Prev: Pusher> Drop for PushBitsetBits<Prev> {
17742    fn drop(&mut self) {
17743        if let Some(prev) = &mut self.prev {
17744            if let Some(header_offset) = &self.header_offset {
17745                finalize_nested_header(prev.as_vec_mut(), *header_offset);
17746            }
17747        }
17748    }
17749}
17750pub struct PushBitset<Prev: Pusher> {
17751    pub(crate) prev: Option<Prev>,
17752    pub(crate) header_offset: Option<usize>,
17753}
17754impl<Prev: Pusher> Pusher for PushBitset<Prev> {
17755    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
17756        self.prev.as_mut().unwrap().as_vec_mut()
17757    }
17758    fn as_vec(&self) -> &Vec<u8> {
17759        self.prev.as_ref().unwrap().as_vec()
17760    }
17761}
17762impl<Prev: Pusher> PushBitset<Prev> {
17763    pub fn new(prev: Prev) -> Self {
17764        Self {
17765            prev: Some(prev),
17766            header_offset: None,
17767        }
17768    }
17769    pub fn end_nested(mut self) -> Prev {
17770        let mut prev = self.prev.take().unwrap();
17771        if let Some(header_offset) = &self.header_offset {
17772            finalize_nested_header(prev.as_vec_mut(), *header_offset);
17773        }
17774        prev
17775    }
17776    pub fn push_nomask(mut self, value: ()) -> Self {
17777        push_header(self.as_vec_mut(), 1u16, 0 as u16);
17778        self
17779    }
17780    pub fn push_size(mut self, value: u32) -> Self {
17781        push_header(self.as_vec_mut(), 2u16, 4 as u16);
17782        self.as_vec_mut().extend(value.to_ne_bytes());
17783        self
17784    }
17785    pub fn nested_bits(mut self) -> PushBitsetBits<Self> {
17786        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
17787        PushBitsetBits {
17788            prev: Some(self),
17789            header_offset: Some(header_offset),
17790        }
17791    }
17792    pub fn push_value(mut self, value: &[u8]) -> Self {
17793        push_header(self.as_vec_mut(), 4u16, value.len() as u16);
17794        self.as_vec_mut().extend(value);
17795        self
17796    }
17797    pub fn push_mask(mut self, value: &[u8]) -> Self {
17798        push_header(self.as_vec_mut(), 5u16, value.len() as u16);
17799        self.as_vec_mut().extend(value);
17800        self
17801    }
17802}
17803impl<Prev: Pusher> Drop for PushBitset<Prev> {
17804    fn drop(&mut self) {
17805        if let Some(prev) = &mut self.prev {
17806            if let Some(header_offset) = &self.header_offset {
17807                finalize_nested_header(prev.as_vec_mut(), *header_offset);
17808            }
17809        }
17810    }
17811}
17812pub struct PushString<Prev: Pusher> {
17813    pub(crate) prev: Option<Prev>,
17814    pub(crate) header_offset: Option<usize>,
17815}
17816impl<Prev: Pusher> Pusher for PushString<Prev> {
17817    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
17818        self.prev.as_mut().unwrap().as_vec_mut()
17819    }
17820    fn as_vec(&self) -> &Vec<u8> {
17821        self.prev.as_ref().unwrap().as_vec()
17822    }
17823}
17824impl<Prev: Pusher> PushString<Prev> {
17825    pub fn new(prev: Prev) -> Self {
17826        Self {
17827            prev: Some(prev),
17828            header_offset: None,
17829        }
17830    }
17831    pub fn end_nested(mut self) -> Prev {
17832        let mut prev = self.prev.take().unwrap();
17833        if let Some(header_offset) = &self.header_offset {
17834            finalize_nested_header(prev.as_vec_mut(), *header_offset);
17835        }
17836        prev
17837    }
17838    pub fn push_index(mut self, value: u32) -> Self {
17839        push_header(self.as_vec_mut(), 1u16, 4 as u16);
17840        self.as_vec_mut().extend(value.to_ne_bytes());
17841        self
17842    }
17843    pub fn push_value(mut self, value: &CStr) -> Self {
17844        push_header(
17845            self.as_vec_mut(),
17846            2u16,
17847            value.to_bytes_with_nul().len() as u16,
17848        );
17849        self.as_vec_mut().extend(value.to_bytes_with_nul());
17850        self
17851    }
17852    pub fn push_value_bytes(mut self, value: &[u8]) -> Self {
17853        push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
17854        self.as_vec_mut().extend(value);
17855        self.as_vec_mut().push(0);
17856        self
17857    }
17858}
17859impl<Prev: Pusher> Drop for PushString<Prev> {
17860    fn drop(&mut self) {
17861        if let Some(prev) = &mut self.prev {
17862            if let Some(header_offset) = &self.header_offset {
17863                finalize_nested_header(prev.as_vec_mut(), *header_offset);
17864            }
17865        }
17866    }
17867}
17868pub struct PushStrings<Prev: Pusher> {
17869    pub(crate) prev: Option<Prev>,
17870    pub(crate) header_offset: Option<usize>,
17871}
17872impl<Prev: Pusher> Pusher for PushStrings<Prev> {
17873    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
17874        self.prev.as_mut().unwrap().as_vec_mut()
17875    }
17876    fn as_vec(&self) -> &Vec<u8> {
17877        self.prev.as_ref().unwrap().as_vec()
17878    }
17879}
17880impl<Prev: Pusher> PushStrings<Prev> {
17881    pub fn new(prev: Prev) -> Self {
17882        Self {
17883            prev: Some(prev),
17884            header_offset: None,
17885        }
17886    }
17887    pub fn end_nested(mut self) -> Prev {
17888        let mut prev = self.prev.take().unwrap();
17889        if let Some(header_offset) = &self.header_offset {
17890            finalize_nested_header(prev.as_vec_mut(), *header_offset);
17891        }
17892        prev
17893    }
17894    #[doc = "Attribute may repeat multiple times (treat it as array)"]
17895    pub fn nested_string(mut self) -> PushString<Self> {
17896        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
17897        PushString {
17898            prev: Some(self),
17899            header_offset: Some(header_offset),
17900        }
17901    }
17902}
17903impl<Prev: Pusher> Drop for PushStrings<Prev> {
17904    fn drop(&mut self) {
17905        if let Some(prev) = &mut self.prev {
17906            if let Some(header_offset) = &self.header_offset {
17907                finalize_nested_header(prev.as_vec_mut(), *header_offset);
17908            }
17909        }
17910    }
17911}
17912pub struct PushStringset<Prev: Pusher> {
17913    pub(crate) prev: Option<Prev>,
17914    pub(crate) header_offset: Option<usize>,
17915}
17916impl<Prev: Pusher> Pusher for PushStringset<Prev> {
17917    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
17918        self.prev.as_mut().unwrap().as_vec_mut()
17919    }
17920    fn as_vec(&self) -> &Vec<u8> {
17921        self.prev.as_ref().unwrap().as_vec()
17922    }
17923}
17924impl<Prev: Pusher> PushStringset<Prev> {
17925    pub fn new(prev: Prev) -> Self {
17926        Self {
17927            prev: Some(prev),
17928            header_offset: None,
17929        }
17930    }
17931    pub fn end_nested(mut self) -> Prev {
17932        let mut prev = self.prev.take().unwrap();
17933        if let Some(header_offset) = &self.header_offset {
17934            finalize_nested_header(prev.as_vec_mut(), *header_offset);
17935        }
17936        prev
17937    }
17938    pub fn push_id(mut self, value: u32) -> Self {
17939        push_header(self.as_vec_mut(), 1u16, 4 as u16);
17940        self.as_vec_mut().extend(value.to_ne_bytes());
17941        self
17942    }
17943    pub fn push_count(mut self, value: u32) -> Self {
17944        push_header(self.as_vec_mut(), 2u16, 4 as u16);
17945        self.as_vec_mut().extend(value.to_ne_bytes());
17946        self
17947    }
17948    #[doc = "Attribute may repeat multiple times (treat it as array)"]
17949    pub fn nested_strings(mut self) -> PushStrings<Self> {
17950        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
17951        PushStrings {
17952            prev: Some(self),
17953            header_offset: Some(header_offset),
17954        }
17955    }
17956}
17957impl<Prev: Pusher> Drop for PushStringset<Prev> {
17958    fn drop(&mut self) {
17959        if let Some(prev) = &mut self.prev {
17960            if let Some(header_offset) = &self.header_offset {
17961                finalize_nested_header(prev.as_vec_mut(), *header_offset);
17962            }
17963        }
17964    }
17965}
17966pub struct PushStringsets<Prev: Pusher> {
17967    pub(crate) prev: Option<Prev>,
17968    pub(crate) header_offset: Option<usize>,
17969}
17970impl<Prev: Pusher> Pusher for PushStringsets<Prev> {
17971    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
17972        self.prev.as_mut().unwrap().as_vec_mut()
17973    }
17974    fn as_vec(&self) -> &Vec<u8> {
17975        self.prev.as_ref().unwrap().as_vec()
17976    }
17977}
17978impl<Prev: Pusher> PushStringsets<Prev> {
17979    pub fn new(prev: Prev) -> Self {
17980        Self {
17981            prev: Some(prev),
17982            header_offset: None,
17983        }
17984    }
17985    pub fn end_nested(mut self) -> Prev {
17986        let mut prev = self.prev.take().unwrap();
17987        if let Some(header_offset) = &self.header_offset {
17988            finalize_nested_header(prev.as_vec_mut(), *header_offset);
17989        }
17990        prev
17991    }
17992    #[doc = "Attribute may repeat multiple times (treat it as array)"]
17993    pub fn nested_stringset(mut self) -> PushStringset<Self> {
17994        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
17995        PushStringset {
17996            prev: Some(self),
17997            header_offset: Some(header_offset),
17998        }
17999    }
18000}
18001impl<Prev: Pusher> Drop for PushStringsets<Prev> {
18002    fn drop(&mut self) {
18003        if let Some(prev) = &mut self.prev {
18004            if let Some(header_offset) = &self.header_offset {
18005                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18006            }
18007        }
18008    }
18009}
18010pub struct PushStrset<Prev: Pusher> {
18011    pub(crate) prev: Option<Prev>,
18012    pub(crate) header_offset: Option<usize>,
18013}
18014impl<Prev: Pusher> Pusher for PushStrset<Prev> {
18015    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18016        self.prev.as_mut().unwrap().as_vec_mut()
18017    }
18018    fn as_vec(&self) -> &Vec<u8> {
18019        self.prev.as_ref().unwrap().as_vec()
18020    }
18021}
18022impl<Prev: Pusher> PushStrset<Prev> {
18023    pub fn new(prev: Prev) -> Self {
18024        Self {
18025            prev: Some(prev),
18026            header_offset: None,
18027        }
18028    }
18029    pub fn end_nested(mut self) -> Prev {
18030        let mut prev = self.prev.take().unwrap();
18031        if let Some(header_offset) = &self.header_offset {
18032            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18033        }
18034        prev
18035    }
18036    pub fn nested_header(mut self) -> PushHeader<Self> {
18037        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18038        PushHeader {
18039            prev: Some(self),
18040            header_offset: Some(header_offset),
18041        }
18042    }
18043    pub fn nested_stringsets(mut self) -> PushStringsets<Self> {
18044        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
18045        PushStringsets {
18046            prev: Some(self),
18047            header_offset: Some(header_offset),
18048        }
18049    }
18050    pub fn push_counts_only(mut self, value: ()) -> Self {
18051        push_header(self.as_vec_mut(), 3u16, 0 as u16);
18052        self
18053    }
18054}
18055impl<Prev: Pusher> Drop for PushStrset<Prev> {
18056    fn drop(&mut self) {
18057        if let Some(prev) = &mut self.prev {
18058            if let Some(header_offset) = &self.header_offset {
18059                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18060            }
18061        }
18062    }
18063}
18064pub struct PushPrivflags<Prev: Pusher> {
18065    pub(crate) prev: Option<Prev>,
18066    pub(crate) header_offset: Option<usize>,
18067}
18068impl<Prev: Pusher> Pusher for PushPrivflags<Prev> {
18069    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18070        self.prev.as_mut().unwrap().as_vec_mut()
18071    }
18072    fn as_vec(&self) -> &Vec<u8> {
18073        self.prev.as_ref().unwrap().as_vec()
18074    }
18075}
18076impl<Prev: Pusher> PushPrivflags<Prev> {
18077    pub fn new(prev: Prev) -> Self {
18078        Self {
18079            prev: Some(prev),
18080            header_offset: None,
18081        }
18082    }
18083    pub fn end_nested(mut self) -> Prev {
18084        let mut prev = self.prev.take().unwrap();
18085        if let Some(header_offset) = &self.header_offset {
18086            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18087        }
18088        prev
18089    }
18090    pub fn nested_header(mut self) -> PushHeader<Self> {
18091        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18092        PushHeader {
18093            prev: Some(self),
18094            header_offset: Some(header_offset),
18095        }
18096    }
18097    pub fn nested_flags(mut self) -> PushBitset<Self> {
18098        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
18099        PushBitset {
18100            prev: Some(self),
18101            header_offset: Some(header_offset),
18102        }
18103    }
18104}
18105impl<Prev: Pusher> Drop for PushPrivflags<Prev> {
18106    fn drop(&mut self) {
18107        if let Some(prev) = &mut self.prev {
18108            if let Some(header_offset) = &self.header_offset {
18109                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18110            }
18111        }
18112    }
18113}
18114pub struct PushRings<Prev: Pusher> {
18115    pub(crate) prev: Option<Prev>,
18116    pub(crate) header_offset: Option<usize>,
18117}
18118impl<Prev: Pusher> Pusher for PushRings<Prev> {
18119    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18120        self.prev.as_mut().unwrap().as_vec_mut()
18121    }
18122    fn as_vec(&self) -> &Vec<u8> {
18123        self.prev.as_ref().unwrap().as_vec()
18124    }
18125}
18126impl<Prev: Pusher> PushRings<Prev> {
18127    pub fn new(prev: Prev) -> Self {
18128        Self {
18129            prev: Some(prev),
18130            header_offset: None,
18131        }
18132    }
18133    pub fn end_nested(mut self) -> Prev {
18134        let mut prev = self.prev.take().unwrap();
18135        if let Some(header_offset) = &self.header_offset {
18136            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18137        }
18138        prev
18139    }
18140    pub fn nested_header(mut self) -> PushHeader<Self> {
18141        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18142        PushHeader {
18143            prev: Some(self),
18144            header_offset: Some(header_offset),
18145        }
18146    }
18147    pub fn push_rx_max(mut self, value: u32) -> Self {
18148        push_header(self.as_vec_mut(), 2u16, 4 as u16);
18149        self.as_vec_mut().extend(value.to_ne_bytes());
18150        self
18151    }
18152    pub fn push_rx_mini_max(mut self, value: u32) -> Self {
18153        push_header(self.as_vec_mut(), 3u16, 4 as u16);
18154        self.as_vec_mut().extend(value.to_ne_bytes());
18155        self
18156    }
18157    pub fn push_rx_jumbo_max(mut self, value: u32) -> Self {
18158        push_header(self.as_vec_mut(), 4u16, 4 as u16);
18159        self.as_vec_mut().extend(value.to_ne_bytes());
18160        self
18161    }
18162    pub fn push_tx_max(mut self, value: u32) -> Self {
18163        push_header(self.as_vec_mut(), 5u16, 4 as u16);
18164        self.as_vec_mut().extend(value.to_ne_bytes());
18165        self
18166    }
18167    pub fn push_rx(mut self, value: u32) -> Self {
18168        push_header(self.as_vec_mut(), 6u16, 4 as u16);
18169        self.as_vec_mut().extend(value.to_ne_bytes());
18170        self
18171    }
18172    pub fn push_rx_mini(mut self, value: u32) -> Self {
18173        push_header(self.as_vec_mut(), 7u16, 4 as u16);
18174        self.as_vec_mut().extend(value.to_ne_bytes());
18175        self
18176    }
18177    pub fn push_rx_jumbo(mut self, value: u32) -> Self {
18178        push_header(self.as_vec_mut(), 8u16, 4 as u16);
18179        self.as_vec_mut().extend(value.to_ne_bytes());
18180        self
18181    }
18182    pub fn push_tx(mut self, value: u32) -> Self {
18183        push_header(self.as_vec_mut(), 9u16, 4 as u16);
18184        self.as_vec_mut().extend(value.to_ne_bytes());
18185        self
18186    }
18187    pub fn push_rx_buf_len(mut self, value: u32) -> Self {
18188        push_header(self.as_vec_mut(), 10u16, 4 as u16);
18189        self.as_vec_mut().extend(value.to_ne_bytes());
18190        self
18191    }
18192    #[doc = "Associated type: [`TcpDataSplit`] (enum)"]
18193    pub fn push_tcp_data_split(mut self, value: u8) -> Self {
18194        push_header(self.as_vec_mut(), 11u16, 1 as u16);
18195        self.as_vec_mut().extend(value.to_ne_bytes());
18196        self
18197    }
18198    pub fn push_cqe_size(mut self, value: u32) -> Self {
18199        push_header(self.as_vec_mut(), 12u16, 4 as u16);
18200        self.as_vec_mut().extend(value.to_ne_bytes());
18201        self
18202    }
18203    pub fn push_tx_push(mut self, value: u8) -> Self {
18204        push_header(self.as_vec_mut(), 13u16, 1 as u16);
18205        self.as_vec_mut().extend(value.to_ne_bytes());
18206        self
18207    }
18208    pub fn push_rx_push(mut self, value: u8) -> Self {
18209        push_header(self.as_vec_mut(), 14u16, 1 as u16);
18210        self.as_vec_mut().extend(value.to_ne_bytes());
18211        self
18212    }
18213    pub fn push_tx_push_buf_len(mut self, value: u32) -> Self {
18214        push_header(self.as_vec_mut(), 15u16, 4 as u16);
18215        self.as_vec_mut().extend(value.to_ne_bytes());
18216        self
18217    }
18218    pub fn push_tx_push_buf_len_max(mut self, value: u32) -> Self {
18219        push_header(self.as_vec_mut(), 16u16, 4 as u16);
18220        self.as_vec_mut().extend(value.to_ne_bytes());
18221        self
18222    }
18223    pub fn push_hds_thresh(mut self, value: u32) -> Self {
18224        push_header(self.as_vec_mut(), 17u16, 4 as u16);
18225        self.as_vec_mut().extend(value.to_ne_bytes());
18226        self
18227    }
18228    pub fn push_hds_thresh_max(mut self, value: u32) -> Self {
18229        push_header(self.as_vec_mut(), 18u16, 4 as u16);
18230        self.as_vec_mut().extend(value.to_ne_bytes());
18231        self
18232    }
18233}
18234impl<Prev: Pusher> Drop for PushRings<Prev> {
18235    fn drop(&mut self) {
18236        if let Some(prev) = &mut self.prev {
18237            if let Some(header_offset) = &self.header_offset {
18238                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18239            }
18240        }
18241    }
18242}
18243pub struct PushMmStat<Prev: Pusher> {
18244    pub(crate) prev: Option<Prev>,
18245    pub(crate) header_offset: Option<usize>,
18246}
18247impl<Prev: Pusher> Pusher for PushMmStat<Prev> {
18248    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18249        self.prev.as_mut().unwrap().as_vec_mut()
18250    }
18251    fn as_vec(&self) -> &Vec<u8> {
18252        self.prev.as_ref().unwrap().as_vec()
18253    }
18254}
18255impl<Prev: Pusher> PushMmStat<Prev> {
18256    pub fn new(prev: Prev) -> Self {
18257        Self {
18258            prev: Some(prev),
18259            header_offset: None,
18260        }
18261    }
18262    pub fn end_nested(mut self) -> Prev {
18263        let mut prev = self.prev.take().unwrap();
18264        if let Some(header_offset) = &self.header_offset {
18265            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18266        }
18267        prev
18268    }
18269    pub fn push_pad(mut self, value: &[u8]) -> Self {
18270        push_header(self.as_vec_mut(), 1u16, value.len() as u16);
18271        self.as_vec_mut().extend(value);
18272        self
18273    }
18274    #[doc = "aMACMergeFrameAssErrorCount\n"]
18275    pub fn push_reassembly_errors(mut self, value: u64) -> Self {
18276        push_header(self.as_vec_mut(), 2u16, 8 as u16);
18277        self.as_vec_mut().extend(value.to_ne_bytes());
18278        self
18279    }
18280    #[doc = "aMACMergeFrameSmdErrorCount\n"]
18281    pub fn push_smd_errors(mut self, value: u64) -> Self {
18282        push_header(self.as_vec_mut(), 3u16, 8 as u16);
18283        self.as_vec_mut().extend(value.to_ne_bytes());
18284        self
18285    }
18286    #[doc = "aMACMergeFrameAssOkCount\n"]
18287    pub fn push_reassembly_ok(mut self, value: u64) -> Self {
18288        push_header(self.as_vec_mut(), 4u16, 8 as u16);
18289        self.as_vec_mut().extend(value.to_ne_bytes());
18290        self
18291    }
18292    #[doc = "aMACMergeFragCountRx\n"]
18293    pub fn push_rx_frag_count(mut self, value: u64) -> Self {
18294        push_header(self.as_vec_mut(), 5u16, 8 as u16);
18295        self.as_vec_mut().extend(value.to_ne_bytes());
18296        self
18297    }
18298    #[doc = "aMACMergeFragCountTx\n"]
18299    pub fn push_tx_frag_count(mut self, value: u64) -> Self {
18300        push_header(self.as_vec_mut(), 6u16, 8 as u16);
18301        self.as_vec_mut().extend(value.to_ne_bytes());
18302        self
18303    }
18304    #[doc = "aMACMergeHoldCount\n"]
18305    pub fn push_hold_count(mut self, value: u64) -> Self {
18306        push_header(self.as_vec_mut(), 7u16, 8 as u16);
18307        self.as_vec_mut().extend(value.to_ne_bytes());
18308        self
18309    }
18310}
18311impl<Prev: Pusher> Drop for PushMmStat<Prev> {
18312    fn drop(&mut self) {
18313        if let Some(prev) = &mut self.prev {
18314            if let Some(header_offset) = &self.header_offset {
18315                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18316            }
18317        }
18318    }
18319}
18320pub struct PushMm<Prev: Pusher> {
18321    pub(crate) prev: Option<Prev>,
18322    pub(crate) header_offset: Option<usize>,
18323}
18324impl<Prev: Pusher> Pusher for PushMm<Prev> {
18325    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18326        self.prev.as_mut().unwrap().as_vec_mut()
18327    }
18328    fn as_vec(&self) -> &Vec<u8> {
18329        self.prev.as_ref().unwrap().as_vec()
18330    }
18331}
18332impl<Prev: Pusher> PushMm<Prev> {
18333    pub fn new(prev: Prev) -> Self {
18334        Self {
18335            prev: Some(prev),
18336            header_offset: None,
18337        }
18338    }
18339    pub fn end_nested(mut self) -> Prev {
18340        let mut prev = self.prev.take().unwrap();
18341        if let Some(header_offset) = &self.header_offset {
18342            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18343        }
18344        prev
18345    }
18346    pub fn nested_header(mut self) -> PushHeader<Self> {
18347        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18348        PushHeader {
18349            prev: Some(self),
18350            header_offset: Some(header_offset),
18351        }
18352    }
18353    pub fn push_pmac_enabled(mut self, value: u8) -> Self {
18354        push_header(self.as_vec_mut(), 2u16, 1 as u16);
18355        self.as_vec_mut().extend(value.to_ne_bytes());
18356        self
18357    }
18358    pub fn push_tx_enabled(mut self, value: u8) -> Self {
18359        push_header(self.as_vec_mut(), 3u16, 1 as u16);
18360        self.as_vec_mut().extend(value.to_ne_bytes());
18361        self
18362    }
18363    pub fn push_tx_active(mut self, value: u8) -> Self {
18364        push_header(self.as_vec_mut(), 4u16, 1 as u16);
18365        self.as_vec_mut().extend(value.to_ne_bytes());
18366        self
18367    }
18368    pub fn push_tx_min_frag_size(mut self, value: u32) -> Self {
18369        push_header(self.as_vec_mut(), 5u16, 4 as u16);
18370        self.as_vec_mut().extend(value.to_ne_bytes());
18371        self
18372    }
18373    pub fn push_rx_min_frag_size(mut self, value: u32) -> Self {
18374        push_header(self.as_vec_mut(), 6u16, 4 as u16);
18375        self.as_vec_mut().extend(value.to_ne_bytes());
18376        self
18377    }
18378    pub fn push_verify_enabled(mut self, value: u8) -> Self {
18379        push_header(self.as_vec_mut(), 7u16, 1 as u16);
18380        self.as_vec_mut().extend(value.to_ne_bytes());
18381        self
18382    }
18383    pub fn push_verify_status(mut self, value: u8) -> Self {
18384        push_header(self.as_vec_mut(), 8u16, 1 as u16);
18385        self.as_vec_mut().extend(value.to_ne_bytes());
18386        self
18387    }
18388    pub fn push_verify_time(mut self, value: u32) -> Self {
18389        push_header(self.as_vec_mut(), 9u16, 4 as u16);
18390        self.as_vec_mut().extend(value.to_ne_bytes());
18391        self
18392    }
18393    pub fn push_max_verify_time(mut self, value: u32) -> Self {
18394        push_header(self.as_vec_mut(), 10u16, 4 as u16);
18395        self.as_vec_mut().extend(value.to_ne_bytes());
18396        self
18397    }
18398    pub fn nested_stats(mut self) -> PushMmStat<Self> {
18399        let header_offset = push_nested_header(self.as_vec_mut(), 11u16);
18400        PushMmStat {
18401            prev: Some(self),
18402            header_offset: Some(header_offset),
18403        }
18404    }
18405}
18406impl<Prev: Pusher> Drop for PushMm<Prev> {
18407    fn drop(&mut self) {
18408        if let Some(prev) = &mut self.prev {
18409            if let Some(header_offset) = &self.header_offset {
18410                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18411            }
18412        }
18413    }
18414}
18415pub struct PushLinkinfo<Prev: Pusher> {
18416    pub(crate) prev: Option<Prev>,
18417    pub(crate) header_offset: Option<usize>,
18418}
18419impl<Prev: Pusher> Pusher for PushLinkinfo<Prev> {
18420    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18421        self.prev.as_mut().unwrap().as_vec_mut()
18422    }
18423    fn as_vec(&self) -> &Vec<u8> {
18424        self.prev.as_ref().unwrap().as_vec()
18425    }
18426}
18427impl<Prev: Pusher> PushLinkinfo<Prev> {
18428    pub fn new(prev: Prev) -> Self {
18429        Self {
18430            prev: Some(prev),
18431            header_offset: None,
18432        }
18433    }
18434    pub fn end_nested(mut self) -> Prev {
18435        let mut prev = self.prev.take().unwrap();
18436        if let Some(header_offset) = &self.header_offset {
18437            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18438        }
18439        prev
18440    }
18441    pub fn nested_header(mut self) -> PushHeader<Self> {
18442        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18443        PushHeader {
18444            prev: Some(self),
18445            header_offset: Some(header_offset),
18446        }
18447    }
18448    pub fn push_port(mut self, value: u8) -> Self {
18449        push_header(self.as_vec_mut(), 2u16, 1 as u16);
18450        self.as_vec_mut().extend(value.to_ne_bytes());
18451        self
18452    }
18453    pub fn push_phyaddr(mut self, value: u8) -> Self {
18454        push_header(self.as_vec_mut(), 3u16, 1 as u16);
18455        self.as_vec_mut().extend(value.to_ne_bytes());
18456        self
18457    }
18458    pub fn push_tp_mdix(mut self, value: u8) -> Self {
18459        push_header(self.as_vec_mut(), 4u16, 1 as u16);
18460        self.as_vec_mut().extend(value.to_ne_bytes());
18461        self
18462    }
18463    pub fn push_tp_mdix_ctrl(mut self, value: u8) -> Self {
18464        push_header(self.as_vec_mut(), 5u16, 1 as u16);
18465        self.as_vec_mut().extend(value.to_ne_bytes());
18466        self
18467    }
18468    pub fn push_transceiver(mut self, value: u8) -> Self {
18469        push_header(self.as_vec_mut(), 6u16, 1 as u16);
18470        self.as_vec_mut().extend(value.to_ne_bytes());
18471        self
18472    }
18473}
18474impl<Prev: Pusher> Drop for PushLinkinfo<Prev> {
18475    fn drop(&mut self) {
18476        if let Some(prev) = &mut self.prev {
18477            if let Some(header_offset) = &self.header_offset {
18478                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18479            }
18480        }
18481    }
18482}
18483pub struct PushLinkmodes<Prev: Pusher> {
18484    pub(crate) prev: Option<Prev>,
18485    pub(crate) header_offset: Option<usize>,
18486}
18487impl<Prev: Pusher> Pusher for PushLinkmodes<Prev> {
18488    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18489        self.prev.as_mut().unwrap().as_vec_mut()
18490    }
18491    fn as_vec(&self) -> &Vec<u8> {
18492        self.prev.as_ref().unwrap().as_vec()
18493    }
18494}
18495impl<Prev: Pusher> PushLinkmodes<Prev> {
18496    pub fn new(prev: Prev) -> Self {
18497        Self {
18498            prev: Some(prev),
18499            header_offset: None,
18500        }
18501    }
18502    pub fn end_nested(mut self) -> Prev {
18503        let mut prev = self.prev.take().unwrap();
18504        if let Some(header_offset) = &self.header_offset {
18505            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18506        }
18507        prev
18508    }
18509    pub fn nested_header(mut self) -> PushHeader<Self> {
18510        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18511        PushHeader {
18512            prev: Some(self),
18513            header_offset: Some(header_offset),
18514        }
18515    }
18516    pub fn push_autoneg(mut self, value: u8) -> Self {
18517        push_header(self.as_vec_mut(), 2u16, 1 as u16);
18518        self.as_vec_mut().extend(value.to_ne_bytes());
18519        self
18520    }
18521    pub fn nested_ours(mut self) -> PushBitset<Self> {
18522        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
18523        PushBitset {
18524            prev: Some(self),
18525            header_offset: Some(header_offset),
18526        }
18527    }
18528    pub fn nested_peer(mut self) -> PushBitset<Self> {
18529        let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
18530        PushBitset {
18531            prev: Some(self),
18532            header_offset: Some(header_offset),
18533        }
18534    }
18535    pub fn push_speed(mut self, value: u32) -> Self {
18536        push_header(self.as_vec_mut(), 5u16, 4 as u16);
18537        self.as_vec_mut().extend(value.to_ne_bytes());
18538        self
18539    }
18540    pub fn push_duplex(mut self, value: u8) -> Self {
18541        push_header(self.as_vec_mut(), 6u16, 1 as u16);
18542        self.as_vec_mut().extend(value.to_ne_bytes());
18543        self
18544    }
18545    pub fn push_master_slave_cfg(mut self, value: u8) -> Self {
18546        push_header(self.as_vec_mut(), 7u16, 1 as u16);
18547        self.as_vec_mut().extend(value.to_ne_bytes());
18548        self
18549    }
18550    pub fn push_master_slave_state(mut self, value: u8) -> Self {
18551        push_header(self.as_vec_mut(), 8u16, 1 as u16);
18552        self.as_vec_mut().extend(value.to_ne_bytes());
18553        self
18554    }
18555    pub fn push_lanes(mut self, value: u32) -> Self {
18556        push_header(self.as_vec_mut(), 9u16, 4 as u16);
18557        self.as_vec_mut().extend(value.to_ne_bytes());
18558        self
18559    }
18560    pub fn push_rate_matching(mut self, value: u8) -> Self {
18561        push_header(self.as_vec_mut(), 10u16, 1 as u16);
18562        self.as_vec_mut().extend(value.to_ne_bytes());
18563        self
18564    }
18565}
18566impl<Prev: Pusher> Drop for PushLinkmodes<Prev> {
18567    fn drop(&mut self) {
18568        if let Some(prev) = &mut self.prev {
18569            if let Some(header_offset) = &self.header_offset {
18570                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18571            }
18572        }
18573    }
18574}
18575pub struct PushLinkstate<Prev: Pusher> {
18576    pub(crate) prev: Option<Prev>,
18577    pub(crate) header_offset: Option<usize>,
18578}
18579impl<Prev: Pusher> Pusher for PushLinkstate<Prev> {
18580    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18581        self.prev.as_mut().unwrap().as_vec_mut()
18582    }
18583    fn as_vec(&self) -> &Vec<u8> {
18584        self.prev.as_ref().unwrap().as_vec()
18585    }
18586}
18587impl<Prev: Pusher> PushLinkstate<Prev> {
18588    pub fn new(prev: Prev) -> Self {
18589        Self {
18590            prev: Some(prev),
18591            header_offset: None,
18592        }
18593    }
18594    pub fn end_nested(mut self) -> Prev {
18595        let mut prev = self.prev.take().unwrap();
18596        if let Some(header_offset) = &self.header_offset {
18597            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18598        }
18599        prev
18600    }
18601    pub fn nested_header(mut self) -> PushHeader<Self> {
18602        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18603        PushHeader {
18604            prev: Some(self),
18605            header_offset: Some(header_offset),
18606        }
18607    }
18608    pub fn push_link(mut self, value: u8) -> Self {
18609        push_header(self.as_vec_mut(), 2u16, 1 as u16);
18610        self.as_vec_mut().extend(value.to_ne_bytes());
18611        self
18612    }
18613    pub fn push_sqi(mut self, value: u32) -> Self {
18614        push_header(self.as_vec_mut(), 3u16, 4 as u16);
18615        self.as_vec_mut().extend(value.to_ne_bytes());
18616        self
18617    }
18618    pub fn push_sqi_max(mut self, value: u32) -> Self {
18619        push_header(self.as_vec_mut(), 4u16, 4 as u16);
18620        self.as_vec_mut().extend(value.to_ne_bytes());
18621        self
18622    }
18623    pub fn push_ext_state(mut self, value: u8) -> Self {
18624        push_header(self.as_vec_mut(), 5u16, 1 as u16);
18625        self.as_vec_mut().extend(value.to_ne_bytes());
18626        self
18627    }
18628    pub fn push_ext_substate(mut self, value: u8) -> Self {
18629        push_header(self.as_vec_mut(), 6u16, 1 as u16);
18630        self.as_vec_mut().extend(value.to_ne_bytes());
18631        self
18632    }
18633    pub fn push_ext_down_cnt(mut self, value: u32) -> Self {
18634        push_header(self.as_vec_mut(), 7u16, 4 as u16);
18635        self.as_vec_mut().extend(value.to_ne_bytes());
18636        self
18637    }
18638}
18639impl<Prev: Pusher> Drop for PushLinkstate<Prev> {
18640    fn drop(&mut self) {
18641        if let Some(prev) = &mut self.prev {
18642            if let Some(header_offset) = &self.header_offset {
18643                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18644            }
18645        }
18646    }
18647}
18648pub struct PushDebug<Prev: Pusher> {
18649    pub(crate) prev: Option<Prev>,
18650    pub(crate) header_offset: Option<usize>,
18651}
18652impl<Prev: Pusher> Pusher for PushDebug<Prev> {
18653    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18654        self.prev.as_mut().unwrap().as_vec_mut()
18655    }
18656    fn as_vec(&self) -> &Vec<u8> {
18657        self.prev.as_ref().unwrap().as_vec()
18658    }
18659}
18660impl<Prev: Pusher> PushDebug<Prev> {
18661    pub fn new(prev: Prev) -> Self {
18662        Self {
18663            prev: Some(prev),
18664            header_offset: None,
18665        }
18666    }
18667    pub fn end_nested(mut self) -> Prev {
18668        let mut prev = self.prev.take().unwrap();
18669        if let Some(header_offset) = &self.header_offset {
18670            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18671        }
18672        prev
18673    }
18674    pub fn nested_header(mut self) -> PushHeader<Self> {
18675        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18676        PushHeader {
18677            prev: Some(self),
18678            header_offset: Some(header_offset),
18679        }
18680    }
18681    pub fn nested_msgmask(mut self) -> PushBitset<Self> {
18682        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
18683        PushBitset {
18684            prev: Some(self),
18685            header_offset: Some(header_offset),
18686        }
18687    }
18688}
18689impl<Prev: Pusher> Drop for PushDebug<Prev> {
18690    fn drop(&mut self) {
18691        if let Some(prev) = &mut self.prev {
18692            if let Some(header_offset) = &self.header_offset {
18693                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18694            }
18695        }
18696    }
18697}
18698pub struct PushWol<Prev: Pusher> {
18699    pub(crate) prev: Option<Prev>,
18700    pub(crate) header_offset: Option<usize>,
18701}
18702impl<Prev: Pusher> Pusher for PushWol<Prev> {
18703    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18704        self.prev.as_mut().unwrap().as_vec_mut()
18705    }
18706    fn as_vec(&self) -> &Vec<u8> {
18707        self.prev.as_ref().unwrap().as_vec()
18708    }
18709}
18710impl<Prev: Pusher> PushWol<Prev> {
18711    pub fn new(prev: Prev) -> Self {
18712        Self {
18713            prev: Some(prev),
18714            header_offset: None,
18715        }
18716    }
18717    pub fn end_nested(mut self) -> Prev {
18718        let mut prev = self.prev.take().unwrap();
18719        if let Some(header_offset) = &self.header_offset {
18720            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18721        }
18722        prev
18723    }
18724    pub fn nested_header(mut self) -> PushHeader<Self> {
18725        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18726        PushHeader {
18727            prev: Some(self),
18728            header_offset: Some(header_offset),
18729        }
18730    }
18731    pub fn nested_modes(mut self) -> PushBitset<Self> {
18732        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
18733        PushBitset {
18734            prev: Some(self),
18735            header_offset: Some(header_offset),
18736        }
18737    }
18738    pub fn push_sopass(mut self, value: &[u8]) -> Self {
18739        push_header(self.as_vec_mut(), 3u16, value.len() as u16);
18740        self.as_vec_mut().extend(value);
18741        self
18742    }
18743}
18744impl<Prev: Pusher> Drop for PushWol<Prev> {
18745    fn drop(&mut self) {
18746        if let Some(prev) = &mut self.prev {
18747            if let Some(header_offset) = &self.header_offset {
18748                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18749            }
18750        }
18751    }
18752}
18753pub struct PushFeatures<Prev: Pusher> {
18754    pub(crate) prev: Option<Prev>,
18755    pub(crate) header_offset: Option<usize>,
18756}
18757impl<Prev: Pusher> Pusher for PushFeatures<Prev> {
18758    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18759        self.prev.as_mut().unwrap().as_vec_mut()
18760    }
18761    fn as_vec(&self) -> &Vec<u8> {
18762        self.prev.as_ref().unwrap().as_vec()
18763    }
18764}
18765impl<Prev: Pusher> PushFeatures<Prev> {
18766    pub fn new(prev: Prev) -> Self {
18767        Self {
18768            prev: Some(prev),
18769            header_offset: None,
18770        }
18771    }
18772    pub fn end_nested(mut self) -> Prev {
18773        let mut prev = self.prev.take().unwrap();
18774        if let Some(header_offset) = &self.header_offset {
18775            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18776        }
18777        prev
18778    }
18779    pub fn nested_header(mut self) -> PushHeader<Self> {
18780        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18781        PushHeader {
18782            prev: Some(self),
18783            header_offset: Some(header_offset),
18784        }
18785    }
18786    pub fn nested_hw(mut self) -> PushBitset<Self> {
18787        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
18788        PushBitset {
18789            prev: Some(self),
18790            header_offset: Some(header_offset),
18791        }
18792    }
18793    pub fn nested_wanted(mut self) -> PushBitset<Self> {
18794        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
18795        PushBitset {
18796            prev: Some(self),
18797            header_offset: Some(header_offset),
18798        }
18799    }
18800    pub fn nested_active(mut self) -> PushBitset<Self> {
18801        let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
18802        PushBitset {
18803            prev: Some(self),
18804            header_offset: Some(header_offset),
18805        }
18806    }
18807    pub fn nested_nochange(mut self) -> PushBitset<Self> {
18808        let header_offset = push_nested_header(self.as_vec_mut(), 5u16);
18809        PushBitset {
18810            prev: Some(self),
18811            header_offset: Some(header_offset),
18812        }
18813    }
18814}
18815impl<Prev: Pusher> Drop for PushFeatures<Prev> {
18816    fn drop(&mut self) {
18817        if let Some(prev) = &mut self.prev {
18818            if let Some(header_offset) = &self.header_offset {
18819                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18820            }
18821        }
18822    }
18823}
18824pub struct PushChannels<Prev: Pusher> {
18825    pub(crate) prev: Option<Prev>,
18826    pub(crate) header_offset: Option<usize>,
18827}
18828impl<Prev: Pusher> Pusher for PushChannels<Prev> {
18829    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18830        self.prev.as_mut().unwrap().as_vec_mut()
18831    }
18832    fn as_vec(&self) -> &Vec<u8> {
18833        self.prev.as_ref().unwrap().as_vec()
18834    }
18835}
18836impl<Prev: Pusher> PushChannels<Prev> {
18837    pub fn new(prev: Prev) -> Self {
18838        Self {
18839            prev: Some(prev),
18840            header_offset: None,
18841        }
18842    }
18843    pub fn end_nested(mut self) -> Prev {
18844        let mut prev = self.prev.take().unwrap();
18845        if let Some(header_offset) = &self.header_offset {
18846            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18847        }
18848        prev
18849    }
18850    pub fn nested_header(mut self) -> PushHeader<Self> {
18851        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18852        PushHeader {
18853            prev: Some(self),
18854            header_offset: Some(header_offset),
18855        }
18856    }
18857    pub fn push_rx_max(mut self, value: u32) -> Self {
18858        push_header(self.as_vec_mut(), 2u16, 4 as u16);
18859        self.as_vec_mut().extend(value.to_ne_bytes());
18860        self
18861    }
18862    pub fn push_tx_max(mut self, value: u32) -> Self {
18863        push_header(self.as_vec_mut(), 3u16, 4 as u16);
18864        self.as_vec_mut().extend(value.to_ne_bytes());
18865        self
18866    }
18867    pub fn push_other_max(mut self, value: u32) -> Self {
18868        push_header(self.as_vec_mut(), 4u16, 4 as u16);
18869        self.as_vec_mut().extend(value.to_ne_bytes());
18870        self
18871    }
18872    pub fn push_combined_max(mut self, value: u32) -> Self {
18873        push_header(self.as_vec_mut(), 5u16, 4 as u16);
18874        self.as_vec_mut().extend(value.to_ne_bytes());
18875        self
18876    }
18877    pub fn push_rx_count(mut self, value: u32) -> Self {
18878        push_header(self.as_vec_mut(), 6u16, 4 as u16);
18879        self.as_vec_mut().extend(value.to_ne_bytes());
18880        self
18881    }
18882    pub fn push_tx_count(mut self, value: u32) -> Self {
18883        push_header(self.as_vec_mut(), 7u16, 4 as u16);
18884        self.as_vec_mut().extend(value.to_ne_bytes());
18885        self
18886    }
18887    pub fn push_other_count(mut self, value: u32) -> Self {
18888        push_header(self.as_vec_mut(), 8u16, 4 as u16);
18889        self.as_vec_mut().extend(value.to_ne_bytes());
18890        self
18891    }
18892    pub fn push_combined_count(mut self, value: u32) -> Self {
18893        push_header(self.as_vec_mut(), 9u16, 4 as u16);
18894        self.as_vec_mut().extend(value.to_ne_bytes());
18895        self
18896    }
18897}
18898impl<Prev: Pusher> Drop for PushChannels<Prev> {
18899    fn drop(&mut self) {
18900        if let Some(prev) = &mut self.prev {
18901            if let Some(header_offset) = &self.header_offset {
18902                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18903            }
18904        }
18905    }
18906}
18907pub struct PushIrqModeration<Prev: Pusher> {
18908    pub(crate) prev: Option<Prev>,
18909    pub(crate) header_offset: Option<usize>,
18910}
18911impl<Prev: Pusher> Pusher for PushIrqModeration<Prev> {
18912    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18913        self.prev.as_mut().unwrap().as_vec_mut()
18914    }
18915    fn as_vec(&self) -> &Vec<u8> {
18916        self.prev.as_ref().unwrap().as_vec()
18917    }
18918}
18919impl<Prev: Pusher> PushIrqModeration<Prev> {
18920    pub fn new(prev: Prev) -> Self {
18921        Self {
18922            prev: Some(prev),
18923            header_offset: None,
18924        }
18925    }
18926    pub fn end_nested(mut self) -> Prev {
18927        let mut prev = self.prev.take().unwrap();
18928        if let Some(header_offset) = &self.header_offset {
18929            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18930        }
18931        prev
18932    }
18933    pub fn push_usec(mut self, value: u32) -> Self {
18934        push_header(self.as_vec_mut(), 1u16, 4 as u16);
18935        self.as_vec_mut().extend(value.to_ne_bytes());
18936        self
18937    }
18938    pub fn push_pkts(mut self, value: u32) -> Self {
18939        push_header(self.as_vec_mut(), 2u16, 4 as u16);
18940        self.as_vec_mut().extend(value.to_ne_bytes());
18941        self
18942    }
18943    pub fn push_comps(mut self, value: u32) -> Self {
18944        push_header(self.as_vec_mut(), 3u16, 4 as u16);
18945        self.as_vec_mut().extend(value.to_ne_bytes());
18946        self
18947    }
18948}
18949impl<Prev: Pusher> Drop for PushIrqModeration<Prev> {
18950    fn drop(&mut self) {
18951        if let Some(prev) = &mut self.prev {
18952            if let Some(header_offset) = &self.header_offset {
18953                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18954            }
18955        }
18956    }
18957}
18958pub struct PushProfile<Prev: Pusher> {
18959    pub(crate) prev: Option<Prev>,
18960    pub(crate) header_offset: Option<usize>,
18961}
18962impl<Prev: Pusher> Pusher for PushProfile<Prev> {
18963    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18964        self.prev.as_mut().unwrap().as_vec_mut()
18965    }
18966    fn as_vec(&self) -> &Vec<u8> {
18967        self.prev.as_ref().unwrap().as_vec()
18968    }
18969}
18970impl<Prev: Pusher> PushProfile<Prev> {
18971    pub fn new(prev: Prev) -> Self {
18972        Self {
18973            prev: Some(prev),
18974            header_offset: None,
18975        }
18976    }
18977    pub fn end_nested(mut self) -> Prev {
18978        let mut prev = self.prev.take().unwrap();
18979        if let Some(header_offset) = &self.header_offset {
18980            finalize_nested_header(prev.as_vec_mut(), *header_offset);
18981        }
18982        prev
18983    }
18984    #[doc = "Attribute may repeat multiple times (treat it as array)"]
18985    pub fn nested_irq_moderation(mut self) -> PushIrqModeration<Self> {
18986        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
18987        PushIrqModeration {
18988            prev: Some(self),
18989            header_offset: Some(header_offset),
18990        }
18991    }
18992}
18993impl<Prev: Pusher> Drop for PushProfile<Prev> {
18994    fn drop(&mut self) {
18995        if let Some(prev) = &mut self.prev {
18996            if let Some(header_offset) = &self.header_offset {
18997                finalize_nested_header(prev.as_vec_mut(), *header_offset);
18998            }
18999        }
19000    }
19001}
19002pub struct PushCoalesce<Prev: Pusher> {
19003    pub(crate) prev: Option<Prev>,
19004    pub(crate) header_offset: Option<usize>,
19005}
19006impl<Prev: Pusher> Pusher for PushCoalesce<Prev> {
19007    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19008        self.prev.as_mut().unwrap().as_vec_mut()
19009    }
19010    fn as_vec(&self) -> &Vec<u8> {
19011        self.prev.as_ref().unwrap().as_vec()
19012    }
19013}
19014impl<Prev: Pusher> PushCoalesce<Prev> {
19015    pub fn new(prev: Prev) -> Self {
19016        Self {
19017            prev: Some(prev),
19018            header_offset: None,
19019        }
19020    }
19021    pub fn end_nested(mut self) -> Prev {
19022        let mut prev = self.prev.take().unwrap();
19023        if let Some(header_offset) = &self.header_offset {
19024            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19025        }
19026        prev
19027    }
19028    pub fn nested_header(mut self) -> PushHeader<Self> {
19029        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19030        PushHeader {
19031            prev: Some(self),
19032            header_offset: Some(header_offset),
19033        }
19034    }
19035    pub fn push_rx_usecs(mut self, value: u32) -> Self {
19036        push_header(self.as_vec_mut(), 2u16, 4 as u16);
19037        self.as_vec_mut().extend(value.to_ne_bytes());
19038        self
19039    }
19040    pub fn push_rx_max_frames(mut self, value: u32) -> Self {
19041        push_header(self.as_vec_mut(), 3u16, 4 as u16);
19042        self.as_vec_mut().extend(value.to_ne_bytes());
19043        self
19044    }
19045    pub fn push_rx_usecs_irq(mut self, value: u32) -> Self {
19046        push_header(self.as_vec_mut(), 4u16, 4 as u16);
19047        self.as_vec_mut().extend(value.to_ne_bytes());
19048        self
19049    }
19050    pub fn push_rx_max_frames_irq(mut self, value: u32) -> Self {
19051        push_header(self.as_vec_mut(), 5u16, 4 as u16);
19052        self.as_vec_mut().extend(value.to_ne_bytes());
19053        self
19054    }
19055    pub fn push_tx_usecs(mut self, value: u32) -> Self {
19056        push_header(self.as_vec_mut(), 6u16, 4 as u16);
19057        self.as_vec_mut().extend(value.to_ne_bytes());
19058        self
19059    }
19060    pub fn push_tx_max_frames(mut self, value: u32) -> Self {
19061        push_header(self.as_vec_mut(), 7u16, 4 as u16);
19062        self.as_vec_mut().extend(value.to_ne_bytes());
19063        self
19064    }
19065    pub fn push_tx_usecs_irq(mut self, value: u32) -> Self {
19066        push_header(self.as_vec_mut(), 8u16, 4 as u16);
19067        self.as_vec_mut().extend(value.to_ne_bytes());
19068        self
19069    }
19070    pub fn push_tx_max_frames_irq(mut self, value: u32) -> Self {
19071        push_header(self.as_vec_mut(), 9u16, 4 as u16);
19072        self.as_vec_mut().extend(value.to_ne_bytes());
19073        self
19074    }
19075    pub fn push_stats_block_usecs(mut self, value: u32) -> Self {
19076        push_header(self.as_vec_mut(), 10u16, 4 as u16);
19077        self.as_vec_mut().extend(value.to_ne_bytes());
19078        self
19079    }
19080    pub fn push_use_adaptive_rx(mut self, value: u8) -> Self {
19081        push_header(self.as_vec_mut(), 11u16, 1 as u16);
19082        self.as_vec_mut().extend(value.to_ne_bytes());
19083        self
19084    }
19085    pub fn push_use_adaptive_tx(mut self, value: u8) -> Self {
19086        push_header(self.as_vec_mut(), 12u16, 1 as u16);
19087        self.as_vec_mut().extend(value.to_ne_bytes());
19088        self
19089    }
19090    pub fn push_pkt_rate_low(mut self, value: u32) -> Self {
19091        push_header(self.as_vec_mut(), 13u16, 4 as u16);
19092        self.as_vec_mut().extend(value.to_ne_bytes());
19093        self
19094    }
19095    pub fn push_rx_usecs_low(mut self, value: u32) -> Self {
19096        push_header(self.as_vec_mut(), 14u16, 4 as u16);
19097        self.as_vec_mut().extend(value.to_ne_bytes());
19098        self
19099    }
19100    pub fn push_rx_max_frames_low(mut self, value: u32) -> Self {
19101        push_header(self.as_vec_mut(), 15u16, 4 as u16);
19102        self.as_vec_mut().extend(value.to_ne_bytes());
19103        self
19104    }
19105    pub fn push_tx_usecs_low(mut self, value: u32) -> Self {
19106        push_header(self.as_vec_mut(), 16u16, 4 as u16);
19107        self.as_vec_mut().extend(value.to_ne_bytes());
19108        self
19109    }
19110    pub fn push_tx_max_frames_low(mut self, value: u32) -> Self {
19111        push_header(self.as_vec_mut(), 17u16, 4 as u16);
19112        self.as_vec_mut().extend(value.to_ne_bytes());
19113        self
19114    }
19115    pub fn push_pkt_rate_high(mut self, value: u32) -> Self {
19116        push_header(self.as_vec_mut(), 18u16, 4 as u16);
19117        self.as_vec_mut().extend(value.to_ne_bytes());
19118        self
19119    }
19120    pub fn push_rx_usecs_high(mut self, value: u32) -> Self {
19121        push_header(self.as_vec_mut(), 19u16, 4 as u16);
19122        self.as_vec_mut().extend(value.to_ne_bytes());
19123        self
19124    }
19125    pub fn push_rx_max_frames_high(mut self, value: u32) -> Self {
19126        push_header(self.as_vec_mut(), 20u16, 4 as u16);
19127        self.as_vec_mut().extend(value.to_ne_bytes());
19128        self
19129    }
19130    pub fn push_tx_usecs_high(mut self, value: u32) -> Self {
19131        push_header(self.as_vec_mut(), 21u16, 4 as u16);
19132        self.as_vec_mut().extend(value.to_ne_bytes());
19133        self
19134    }
19135    pub fn push_tx_max_frames_high(mut self, value: u32) -> Self {
19136        push_header(self.as_vec_mut(), 22u16, 4 as u16);
19137        self.as_vec_mut().extend(value.to_ne_bytes());
19138        self
19139    }
19140    pub fn push_rate_sample_interval(mut self, value: u32) -> Self {
19141        push_header(self.as_vec_mut(), 23u16, 4 as u16);
19142        self.as_vec_mut().extend(value.to_ne_bytes());
19143        self
19144    }
19145    pub fn push_use_cqe_mode_tx(mut self, value: u8) -> Self {
19146        push_header(self.as_vec_mut(), 24u16, 1 as u16);
19147        self.as_vec_mut().extend(value.to_ne_bytes());
19148        self
19149    }
19150    pub fn push_use_cqe_mode_rx(mut self, value: u8) -> Self {
19151        push_header(self.as_vec_mut(), 25u16, 1 as u16);
19152        self.as_vec_mut().extend(value.to_ne_bytes());
19153        self
19154    }
19155    pub fn push_tx_aggr_max_bytes(mut self, value: u32) -> Self {
19156        push_header(self.as_vec_mut(), 26u16, 4 as u16);
19157        self.as_vec_mut().extend(value.to_ne_bytes());
19158        self
19159    }
19160    pub fn push_tx_aggr_max_frames(mut self, value: u32) -> Self {
19161        push_header(self.as_vec_mut(), 27u16, 4 as u16);
19162        self.as_vec_mut().extend(value.to_ne_bytes());
19163        self
19164    }
19165    pub fn push_tx_aggr_time_usecs(mut self, value: u32) -> Self {
19166        push_header(self.as_vec_mut(), 28u16, 4 as u16);
19167        self.as_vec_mut().extend(value.to_ne_bytes());
19168        self
19169    }
19170    pub fn nested_rx_profile(mut self) -> PushProfile<Self> {
19171        let header_offset = push_nested_header(self.as_vec_mut(), 29u16);
19172        PushProfile {
19173            prev: Some(self),
19174            header_offset: Some(header_offset),
19175        }
19176    }
19177    pub fn nested_tx_profile(mut self) -> PushProfile<Self> {
19178        let header_offset = push_nested_header(self.as_vec_mut(), 30u16);
19179        PushProfile {
19180            prev: Some(self),
19181            header_offset: Some(header_offset),
19182        }
19183    }
19184    pub fn push_rx_cqe_frames(mut self, value: u32) -> Self {
19185        push_header(self.as_vec_mut(), 31u16, 4 as u16);
19186        self.as_vec_mut().extend(value.to_ne_bytes());
19187        self
19188    }
19189    pub fn push_rx_cqe_nsecs(mut self, value: u32) -> Self {
19190        push_header(self.as_vec_mut(), 32u16, 4 as u16);
19191        self.as_vec_mut().extend(value.to_ne_bytes());
19192        self
19193    }
19194}
19195impl<Prev: Pusher> Drop for PushCoalesce<Prev> {
19196    fn drop(&mut self) {
19197        if let Some(prev) = &mut self.prev {
19198            if let Some(header_offset) = &self.header_offset {
19199                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19200            }
19201        }
19202    }
19203}
19204pub struct PushPauseStat<Prev: Pusher> {
19205    pub(crate) prev: Option<Prev>,
19206    pub(crate) header_offset: Option<usize>,
19207}
19208impl<Prev: Pusher> Pusher for PushPauseStat<Prev> {
19209    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19210        self.prev.as_mut().unwrap().as_vec_mut()
19211    }
19212    fn as_vec(&self) -> &Vec<u8> {
19213        self.prev.as_ref().unwrap().as_vec()
19214    }
19215}
19216impl<Prev: Pusher> PushPauseStat<Prev> {
19217    pub fn new(prev: Prev) -> Self {
19218        Self {
19219            prev: Some(prev),
19220            header_offset: None,
19221        }
19222    }
19223    pub fn end_nested(mut self) -> Prev {
19224        let mut prev = self.prev.take().unwrap();
19225        if let Some(header_offset) = &self.header_offset {
19226            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19227        }
19228        prev
19229    }
19230    pub fn push_pad(mut self, value: &[u8]) -> Self {
19231        push_header(self.as_vec_mut(), 1u16, value.len() as u16);
19232        self.as_vec_mut().extend(value);
19233        self
19234    }
19235    pub fn push_tx_frames(mut self, value: u64) -> Self {
19236        push_header(self.as_vec_mut(), 2u16, 8 as u16);
19237        self.as_vec_mut().extend(value.to_ne_bytes());
19238        self
19239    }
19240    pub fn push_rx_frames(mut self, value: u64) -> Self {
19241        push_header(self.as_vec_mut(), 3u16, 8 as u16);
19242        self.as_vec_mut().extend(value.to_ne_bytes());
19243        self
19244    }
19245    #[doc = "TX pause storm event count. Increments each time device detects that its\npause assertion condition has been true for too long for normal\noperation. As a result, the device has temporarily disabled its own\nPause TX function to protect the network from itself. This counter\nshould never increment under normal overload conditions; it indicates\ncatastrophic failure like an OS crash. The rate of incrementing is\nimplementation specific.\n"]
19246    pub fn push_tx_pause_storm_events(mut self, value: u64) -> Self {
19247        push_header(self.as_vec_mut(), 4u16, 8 as u16);
19248        self.as_vec_mut().extend(value.to_ne_bytes());
19249        self
19250    }
19251}
19252impl<Prev: Pusher> Drop for PushPauseStat<Prev> {
19253    fn drop(&mut self) {
19254        if let Some(prev) = &mut self.prev {
19255            if let Some(header_offset) = &self.header_offset {
19256                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19257            }
19258        }
19259    }
19260}
19261pub struct PushPause<Prev: Pusher> {
19262    pub(crate) prev: Option<Prev>,
19263    pub(crate) header_offset: Option<usize>,
19264}
19265impl<Prev: Pusher> Pusher for PushPause<Prev> {
19266    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19267        self.prev.as_mut().unwrap().as_vec_mut()
19268    }
19269    fn as_vec(&self) -> &Vec<u8> {
19270        self.prev.as_ref().unwrap().as_vec()
19271    }
19272}
19273impl<Prev: Pusher> PushPause<Prev> {
19274    pub fn new(prev: Prev) -> Self {
19275        Self {
19276            prev: Some(prev),
19277            header_offset: None,
19278        }
19279    }
19280    pub fn end_nested(mut self) -> Prev {
19281        let mut prev = self.prev.take().unwrap();
19282        if let Some(header_offset) = &self.header_offset {
19283            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19284        }
19285        prev
19286    }
19287    pub fn nested_header(mut self) -> PushHeader<Self> {
19288        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19289        PushHeader {
19290            prev: Some(self),
19291            header_offset: Some(header_offset),
19292        }
19293    }
19294    pub fn push_autoneg(mut self, value: u8) -> Self {
19295        push_header(self.as_vec_mut(), 2u16, 1 as u16);
19296        self.as_vec_mut().extend(value.to_ne_bytes());
19297        self
19298    }
19299    pub fn push_rx(mut self, value: u8) -> Self {
19300        push_header(self.as_vec_mut(), 3u16, 1 as u16);
19301        self.as_vec_mut().extend(value.to_ne_bytes());
19302        self
19303    }
19304    pub fn push_tx(mut self, value: u8) -> Self {
19305        push_header(self.as_vec_mut(), 4u16, 1 as u16);
19306        self.as_vec_mut().extend(value.to_ne_bytes());
19307        self
19308    }
19309    pub fn nested_stats(mut self) -> PushPauseStat<Self> {
19310        let header_offset = push_nested_header(self.as_vec_mut(), 5u16);
19311        PushPauseStat {
19312            prev: Some(self),
19313            header_offset: Some(header_offset),
19314        }
19315    }
19316    pub fn push_stats_src(mut self, value: u32) -> Self {
19317        push_header(self.as_vec_mut(), 6u16, 4 as u16);
19318        self.as_vec_mut().extend(value.to_ne_bytes());
19319        self
19320    }
19321}
19322impl<Prev: Pusher> Drop for PushPause<Prev> {
19323    fn drop(&mut self) {
19324        if let Some(prev) = &mut self.prev {
19325            if let Some(header_offset) = &self.header_offset {
19326                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19327            }
19328        }
19329    }
19330}
19331pub struct PushEee<Prev: Pusher> {
19332    pub(crate) prev: Option<Prev>,
19333    pub(crate) header_offset: Option<usize>,
19334}
19335impl<Prev: Pusher> Pusher for PushEee<Prev> {
19336    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19337        self.prev.as_mut().unwrap().as_vec_mut()
19338    }
19339    fn as_vec(&self) -> &Vec<u8> {
19340        self.prev.as_ref().unwrap().as_vec()
19341    }
19342}
19343impl<Prev: Pusher> PushEee<Prev> {
19344    pub fn new(prev: Prev) -> Self {
19345        Self {
19346            prev: Some(prev),
19347            header_offset: None,
19348        }
19349    }
19350    pub fn end_nested(mut self) -> Prev {
19351        let mut prev = self.prev.take().unwrap();
19352        if let Some(header_offset) = &self.header_offset {
19353            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19354        }
19355        prev
19356    }
19357    pub fn nested_header(mut self) -> PushHeader<Self> {
19358        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19359        PushHeader {
19360            prev: Some(self),
19361            header_offset: Some(header_offset),
19362        }
19363    }
19364    pub fn nested_modes_ours(mut self) -> PushBitset<Self> {
19365        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19366        PushBitset {
19367            prev: Some(self),
19368            header_offset: Some(header_offset),
19369        }
19370    }
19371    pub fn nested_modes_peer(mut self) -> PushBitset<Self> {
19372        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
19373        PushBitset {
19374            prev: Some(self),
19375            header_offset: Some(header_offset),
19376        }
19377    }
19378    pub fn push_active(mut self, value: u8) -> Self {
19379        push_header(self.as_vec_mut(), 4u16, 1 as u16);
19380        self.as_vec_mut().extend(value.to_ne_bytes());
19381        self
19382    }
19383    pub fn push_enabled(mut self, value: u8) -> Self {
19384        push_header(self.as_vec_mut(), 5u16, 1 as u16);
19385        self.as_vec_mut().extend(value.to_ne_bytes());
19386        self
19387    }
19388    pub fn push_tx_lpi_enabled(mut self, value: u8) -> Self {
19389        push_header(self.as_vec_mut(), 6u16, 1 as u16);
19390        self.as_vec_mut().extend(value.to_ne_bytes());
19391        self
19392    }
19393    pub fn push_tx_lpi_timer(mut self, value: u32) -> Self {
19394        push_header(self.as_vec_mut(), 7u16, 4 as u16);
19395        self.as_vec_mut().extend(value.to_ne_bytes());
19396        self
19397    }
19398}
19399impl<Prev: Pusher> Drop for PushEee<Prev> {
19400    fn drop(&mut self) {
19401        if let Some(prev) = &mut self.prev {
19402            if let Some(header_offset) = &self.header_offset {
19403                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19404            }
19405        }
19406    }
19407}
19408pub struct PushTsStat<Prev: Pusher> {
19409    pub(crate) prev: Option<Prev>,
19410    pub(crate) header_offset: Option<usize>,
19411}
19412impl<Prev: Pusher> Pusher for PushTsStat<Prev> {
19413    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19414        self.prev.as_mut().unwrap().as_vec_mut()
19415    }
19416    fn as_vec(&self) -> &Vec<u8> {
19417        self.prev.as_ref().unwrap().as_vec()
19418    }
19419}
19420impl<Prev: Pusher> PushTsStat<Prev> {
19421    pub fn new(prev: Prev) -> Self {
19422        Self {
19423            prev: Some(prev),
19424            header_offset: None,
19425        }
19426    }
19427    pub fn end_nested(mut self) -> Prev {
19428        let mut prev = self.prev.take().unwrap();
19429        if let Some(header_offset) = &self.header_offset {
19430            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19431        }
19432        prev
19433    }
19434    pub fn push_tx_pkts(mut self, value: u32) -> Self {
19435        push_header(self.as_vec_mut(), 1u16, 4 as u16);
19436        self.as_vec_mut().extend(value.to_ne_bytes());
19437        self
19438    }
19439    pub fn push_tx_lost(mut self, value: u32) -> Self {
19440        push_header(self.as_vec_mut(), 2u16, 4 as u16);
19441        self.as_vec_mut().extend(value.to_ne_bytes());
19442        self
19443    }
19444    pub fn push_tx_err(mut self, value: u32) -> Self {
19445        push_header(self.as_vec_mut(), 3u16, 4 as u16);
19446        self.as_vec_mut().extend(value.to_ne_bytes());
19447        self
19448    }
19449    pub fn push_tx_onestep_pkts_unconfirmed(mut self, value: u32) -> Self {
19450        push_header(self.as_vec_mut(), 4u16, 4 as u16);
19451        self.as_vec_mut().extend(value.to_ne_bytes());
19452        self
19453    }
19454}
19455impl<Prev: Pusher> Drop for PushTsStat<Prev> {
19456    fn drop(&mut self) {
19457        if let Some(prev) = &mut self.prev {
19458            if let Some(header_offset) = &self.header_offset {
19459                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19460            }
19461        }
19462    }
19463}
19464pub struct PushTsHwtstampProvider<Prev: Pusher> {
19465    pub(crate) prev: Option<Prev>,
19466    pub(crate) header_offset: Option<usize>,
19467}
19468impl<Prev: Pusher> Pusher for PushTsHwtstampProvider<Prev> {
19469    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19470        self.prev.as_mut().unwrap().as_vec_mut()
19471    }
19472    fn as_vec(&self) -> &Vec<u8> {
19473        self.prev.as_ref().unwrap().as_vec()
19474    }
19475}
19476impl<Prev: Pusher> PushTsHwtstampProvider<Prev> {
19477    pub fn new(prev: Prev) -> Self {
19478        Self {
19479            prev: Some(prev),
19480            header_offset: None,
19481        }
19482    }
19483    pub fn end_nested(mut self) -> Prev {
19484        let mut prev = self.prev.take().unwrap();
19485        if let Some(header_offset) = &self.header_offset {
19486            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19487        }
19488        prev
19489    }
19490    pub fn push_index(mut self, value: u32) -> Self {
19491        push_header(self.as_vec_mut(), 1u16, 4 as u16);
19492        self.as_vec_mut().extend(value.to_ne_bytes());
19493        self
19494    }
19495    pub fn push_qualifier(mut self, value: u32) -> Self {
19496        push_header(self.as_vec_mut(), 2u16, 4 as u16);
19497        self.as_vec_mut().extend(value.to_ne_bytes());
19498        self
19499    }
19500}
19501impl<Prev: Pusher> Drop for PushTsHwtstampProvider<Prev> {
19502    fn drop(&mut self) {
19503        if let Some(prev) = &mut self.prev {
19504            if let Some(header_offset) = &self.header_offset {
19505                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19506            }
19507        }
19508    }
19509}
19510pub struct PushTsinfo<Prev: Pusher> {
19511    pub(crate) prev: Option<Prev>,
19512    pub(crate) header_offset: Option<usize>,
19513}
19514impl<Prev: Pusher> Pusher for PushTsinfo<Prev> {
19515    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19516        self.prev.as_mut().unwrap().as_vec_mut()
19517    }
19518    fn as_vec(&self) -> &Vec<u8> {
19519        self.prev.as_ref().unwrap().as_vec()
19520    }
19521}
19522impl<Prev: Pusher> PushTsinfo<Prev> {
19523    pub fn new(prev: Prev) -> Self {
19524        Self {
19525            prev: Some(prev),
19526            header_offset: None,
19527        }
19528    }
19529    pub fn end_nested(mut self) -> Prev {
19530        let mut prev = self.prev.take().unwrap();
19531        if let Some(header_offset) = &self.header_offset {
19532            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19533        }
19534        prev
19535    }
19536    pub fn nested_header(mut self) -> PushHeader<Self> {
19537        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19538        PushHeader {
19539            prev: Some(self),
19540            header_offset: Some(header_offset),
19541        }
19542    }
19543    pub fn nested_timestamping(mut self) -> PushBitset<Self> {
19544        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19545        PushBitset {
19546            prev: Some(self),
19547            header_offset: Some(header_offset),
19548        }
19549    }
19550    pub fn nested_tx_types(mut self) -> PushBitset<Self> {
19551        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
19552        PushBitset {
19553            prev: Some(self),
19554            header_offset: Some(header_offset),
19555        }
19556    }
19557    pub fn nested_rx_filters(mut self) -> PushBitset<Self> {
19558        let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
19559        PushBitset {
19560            prev: Some(self),
19561            header_offset: Some(header_offset),
19562        }
19563    }
19564    pub fn push_phc_index(mut self, value: u32) -> Self {
19565        push_header(self.as_vec_mut(), 5u16, 4 as u16);
19566        self.as_vec_mut().extend(value.to_ne_bytes());
19567        self
19568    }
19569    pub fn nested_stats(mut self) -> PushTsStat<Self> {
19570        let header_offset = push_nested_header(self.as_vec_mut(), 6u16);
19571        PushTsStat {
19572            prev: Some(self),
19573            header_offset: Some(header_offset),
19574        }
19575    }
19576    pub fn nested_hwtstamp_provider(mut self) -> PushTsHwtstampProvider<Self> {
19577        let header_offset = push_nested_header(self.as_vec_mut(), 7u16);
19578        PushTsHwtstampProvider {
19579            prev: Some(self),
19580            header_offset: Some(header_offset),
19581        }
19582    }
19583    #[doc = "Associated type: [`HwtstampSource`] (enum)"]
19584    pub fn push_hwtstamp_source(mut self, value: u32) -> Self {
19585        push_header(self.as_vec_mut(), 8u16, 4 as u16);
19586        self.as_vec_mut().extend(value.to_ne_bytes());
19587        self
19588    }
19589    pub fn push_hwtstamp_phyindex(mut self, value: u32) -> Self {
19590        push_header(self.as_vec_mut(), 9u16, 4 as u16);
19591        self.as_vec_mut().extend(value.to_ne_bytes());
19592        self
19593    }
19594}
19595impl<Prev: Pusher> Drop for PushTsinfo<Prev> {
19596    fn drop(&mut self) {
19597        if let Some(prev) = &mut self.prev {
19598            if let Some(header_offset) = &self.header_offset {
19599                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19600            }
19601        }
19602    }
19603}
19604pub struct PushCableResult<Prev: Pusher> {
19605    pub(crate) prev: Option<Prev>,
19606    pub(crate) header_offset: Option<usize>,
19607}
19608impl<Prev: Pusher> Pusher for PushCableResult<Prev> {
19609    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19610        self.prev.as_mut().unwrap().as_vec_mut()
19611    }
19612    fn as_vec(&self) -> &Vec<u8> {
19613        self.prev.as_ref().unwrap().as_vec()
19614    }
19615}
19616impl<Prev: Pusher> PushCableResult<Prev> {
19617    pub fn new(prev: Prev) -> Self {
19618        Self {
19619            prev: Some(prev),
19620            header_offset: None,
19621        }
19622    }
19623    pub fn end_nested(mut self) -> Prev {
19624        let mut prev = self.prev.take().unwrap();
19625        if let Some(header_offset) = &self.header_offset {
19626            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19627        }
19628        prev
19629    }
19630    #[doc = "ETHTOOL_A_CABLE_PAIR\n"]
19631    pub fn push_pair(mut self, value: u8) -> Self {
19632        push_header(self.as_vec_mut(), 1u16, 1 as u16);
19633        self.as_vec_mut().extend(value.to_ne_bytes());
19634        self
19635    }
19636    #[doc = "ETHTOOL_A_CABLE_RESULT_CODE\n"]
19637    pub fn push_code(mut self, value: u8) -> Self {
19638        push_header(self.as_vec_mut(), 2u16, 1 as u16);
19639        self.as_vec_mut().extend(value.to_ne_bytes());
19640        self
19641    }
19642    #[doc = "ETHTOOL_A_CABLE_INF_SRC\n"]
19643    pub fn push_src(mut self, value: u32) -> Self {
19644        push_header(self.as_vec_mut(), 3u16, 4 as u16);
19645        self.as_vec_mut().extend(value.to_ne_bytes());
19646        self
19647    }
19648}
19649impl<Prev: Pusher> Drop for PushCableResult<Prev> {
19650    fn drop(&mut self) {
19651        if let Some(prev) = &mut self.prev {
19652            if let Some(header_offset) = &self.header_offset {
19653                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19654            }
19655        }
19656    }
19657}
19658pub struct PushCableFaultLength<Prev: Pusher> {
19659    pub(crate) prev: Option<Prev>,
19660    pub(crate) header_offset: Option<usize>,
19661}
19662impl<Prev: Pusher> Pusher for PushCableFaultLength<Prev> {
19663    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19664        self.prev.as_mut().unwrap().as_vec_mut()
19665    }
19666    fn as_vec(&self) -> &Vec<u8> {
19667        self.prev.as_ref().unwrap().as_vec()
19668    }
19669}
19670impl<Prev: Pusher> PushCableFaultLength<Prev> {
19671    pub fn new(prev: Prev) -> Self {
19672        Self {
19673            prev: Some(prev),
19674            header_offset: None,
19675        }
19676    }
19677    pub fn end_nested(mut self) -> Prev {
19678        let mut prev = self.prev.take().unwrap();
19679        if let Some(header_offset) = &self.header_offset {
19680            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19681        }
19682        prev
19683    }
19684    pub fn push_pair(mut self, value: u8) -> Self {
19685        push_header(self.as_vec_mut(), 1u16, 1 as u16);
19686        self.as_vec_mut().extend(value.to_ne_bytes());
19687        self
19688    }
19689    pub fn push_cm(mut self, value: u32) -> Self {
19690        push_header(self.as_vec_mut(), 2u16, 4 as u16);
19691        self.as_vec_mut().extend(value.to_ne_bytes());
19692        self
19693    }
19694    pub fn push_src(mut self, value: u32) -> Self {
19695        push_header(self.as_vec_mut(), 3u16, 4 as u16);
19696        self.as_vec_mut().extend(value.to_ne_bytes());
19697        self
19698    }
19699}
19700impl<Prev: Pusher> Drop for PushCableFaultLength<Prev> {
19701    fn drop(&mut self) {
19702        if let Some(prev) = &mut self.prev {
19703            if let Some(header_offset) = &self.header_offset {
19704                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19705            }
19706        }
19707    }
19708}
19709pub struct PushCableNest<Prev: Pusher> {
19710    pub(crate) prev: Option<Prev>,
19711    pub(crate) header_offset: Option<usize>,
19712}
19713impl<Prev: Pusher> Pusher for PushCableNest<Prev> {
19714    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19715        self.prev.as_mut().unwrap().as_vec_mut()
19716    }
19717    fn as_vec(&self) -> &Vec<u8> {
19718        self.prev.as_ref().unwrap().as_vec()
19719    }
19720}
19721impl<Prev: Pusher> PushCableNest<Prev> {
19722    pub fn new(prev: Prev) -> Self {
19723        Self {
19724            prev: Some(prev),
19725            header_offset: None,
19726        }
19727    }
19728    pub fn end_nested(mut self) -> Prev {
19729        let mut prev = self.prev.take().unwrap();
19730        if let Some(header_offset) = &self.header_offset {
19731            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19732        }
19733        prev
19734    }
19735    pub fn nested_result(mut self) -> PushCableResult<Self> {
19736        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19737        PushCableResult {
19738            prev: Some(self),
19739            header_offset: Some(header_offset),
19740        }
19741    }
19742    pub fn nested_fault_length(mut self) -> PushCableFaultLength<Self> {
19743        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19744        PushCableFaultLength {
19745            prev: Some(self),
19746            header_offset: Some(header_offset),
19747        }
19748    }
19749}
19750impl<Prev: Pusher> Drop for PushCableNest<Prev> {
19751    fn drop(&mut self) {
19752        if let Some(prev) = &mut self.prev {
19753            if let Some(header_offset) = &self.header_offset {
19754                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19755            }
19756        }
19757    }
19758}
19759pub struct PushCableTest<Prev: Pusher> {
19760    pub(crate) prev: Option<Prev>,
19761    pub(crate) header_offset: Option<usize>,
19762}
19763impl<Prev: Pusher> Pusher for PushCableTest<Prev> {
19764    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19765        self.prev.as_mut().unwrap().as_vec_mut()
19766    }
19767    fn as_vec(&self) -> &Vec<u8> {
19768        self.prev.as_ref().unwrap().as_vec()
19769    }
19770}
19771impl<Prev: Pusher> PushCableTest<Prev> {
19772    pub fn new(prev: Prev) -> Self {
19773        Self {
19774            prev: Some(prev),
19775            header_offset: None,
19776        }
19777    }
19778    pub fn end_nested(mut self) -> Prev {
19779        let mut prev = self.prev.take().unwrap();
19780        if let Some(header_offset) = &self.header_offset {
19781            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19782        }
19783        prev
19784    }
19785    pub fn nested_header(mut self) -> PushHeader<Self> {
19786        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19787        PushHeader {
19788            prev: Some(self),
19789            header_offset: Some(header_offset),
19790        }
19791    }
19792}
19793impl<Prev: Pusher> Drop for PushCableTest<Prev> {
19794    fn drop(&mut self) {
19795        if let Some(prev) = &mut self.prev {
19796            if let Some(header_offset) = &self.header_offset {
19797                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19798            }
19799        }
19800    }
19801}
19802pub struct PushCableTestNtf<Prev: Pusher> {
19803    pub(crate) prev: Option<Prev>,
19804    pub(crate) header_offset: Option<usize>,
19805}
19806impl<Prev: Pusher> Pusher for PushCableTestNtf<Prev> {
19807    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19808        self.prev.as_mut().unwrap().as_vec_mut()
19809    }
19810    fn as_vec(&self) -> &Vec<u8> {
19811        self.prev.as_ref().unwrap().as_vec()
19812    }
19813}
19814impl<Prev: Pusher> PushCableTestNtf<Prev> {
19815    pub fn new(prev: Prev) -> Self {
19816        Self {
19817            prev: Some(prev),
19818            header_offset: None,
19819        }
19820    }
19821    pub fn end_nested(mut self) -> Prev {
19822        let mut prev = self.prev.take().unwrap();
19823        if let Some(header_offset) = &self.header_offset {
19824            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19825        }
19826        prev
19827    }
19828    pub fn nested_header(mut self) -> PushHeader<Self> {
19829        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19830        PushHeader {
19831            prev: Some(self),
19832            header_offset: Some(header_offset),
19833        }
19834    }
19835    #[doc = "[STARTED]{#started}/\\_COMPLETE\n"]
19836    pub fn push_status(mut self, value: u8) -> Self {
19837        push_header(self.as_vec_mut(), 2u16, 1 as u16);
19838        self.as_vec_mut().extend(value.to_ne_bytes());
19839        self
19840    }
19841    pub fn nested_nest(mut self) -> PushCableNest<Self> {
19842        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
19843        PushCableNest {
19844            prev: Some(self),
19845            header_offset: Some(header_offset),
19846        }
19847    }
19848}
19849impl<Prev: Pusher> Drop for PushCableTestNtf<Prev> {
19850    fn drop(&mut self) {
19851        if let Some(prev) = &mut self.prev {
19852            if let Some(header_offset) = &self.header_offset {
19853                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19854            }
19855        }
19856    }
19857}
19858pub struct PushCableTestTdrCfg<Prev: Pusher> {
19859    pub(crate) prev: Option<Prev>,
19860    pub(crate) header_offset: Option<usize>,
19861}
19862impl<Prev: Pusher> Pusher for PushCableTestTdrCfg<Prev> {
19863    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19864        self.prev.as_mut().unwrap().as_vec_mut()
19865    }
19866    fn as_vec(&self) -> &Vec<u8> {
19867        self.prev.as_ref().unwrap().as_vec()
19868    }
19869}
19870impl<Prev: Pusher> PushCableTestTdrCfg<Prev> {
19871    pub fn new(prev: Prev) -> Self {
19872        Self {
19873            prev: Some(prev),
19874            header_offset: None,
19875        }
19876    }
19877    pub fn end_nested(mut self) -> Prev {
19878        let mut prev = self.prev.take().unwrap();
19879        if let Some(header_offset) = &self.header_offset {
19880            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19881        }
19882        prev
19883    }
19884    pub fn push_first(mut self, value: u32) -> Self {
19885        push_header(self.as_vec_mut(), 1u16, 4 as u16);
19886        self.as_vec_mut().extend(value.to_ne_bytes());
19887        self
19888    }
19889    pub fn push_last(mut self, value: u32) -> Self {
19890        push_header(self.as_vec_mut(), 2u16, 4 as u16);
19891        self.as_vec_mut().extend(value.to_ne_bytes());
19892        self
19893    }
19894    pub fn push_step(mut self, value: u32) -> Self {
19895        push_header(self.as_vec_mut(), 3u16, 4 as u16);
19896        self.as_vec_mut().extend(value.to_ne_bytes());
19897        self
19898    }
19899    pub fn push_pair(mut self, value: u8) -> Self {
19900        push_header(self.as_vec_mut(), 4u16, 1 as u16);
19901        self.as_vec_mut().extend(value.to_ne_bytes());
19902        self
19903    }
19904}
19905impl<Prev: Pusher> Drop for PushCableTestTdrCfg<Prev> {
19906    fn drop(&mut self) {
19907        if let Some(prev) = &mut self.prev {
19908            if let Some(header_offset) = &self.header_offset {
19909                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19910            }
19911        }
19912    }
19913}
19914pub struct PushCableTestTdrNtf<Prev: Pusher> {
19915    pub(crate) prev: Option<Prev>,
19916    pub(crate) header_offset: Option<usize>,
19917}
19918impl<Prev: Pusher> Pusher for PushCableTestTdrNtf<Prev> {
19919    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19920        self.prev.as_mut().unwrap().as_vec_mut()
19921    }
19922    fn as_vec(&self) -> &Vec<u8> {
19923        self.prev.as_ref().unwrap().as_vec()
19924    }
19925}
19926impl<Prev: Pusher> PushCableTestTdrNtf<Prev> {
19927    pub fn new(prev: Prev) -> Self {
19928        Self {
19929            prev: Some(prev),
19930            header_offset: None,
19931        }
19932    }
19933    pub fn end_nested(mut self) -> Prev {
19934        let mut prev = self.prev.take().unwrap();
19935        if let Some(header_offset) = &self.header_offset {
19936            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19937        }
19938        prev
19939    }
19940    pub fn nested_header(mut self) -> PushHeader<Self> {
19941        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19942        PushHeader {
19943            prev: Some(self),
19944            header_offset: Some(header_offset),
19945        }
19946    }
19947    pub fn push_status(mut self, value: u8) -> Self {
19948        push_header(self.as_vec_mut(), 2u16, 1 as u16);
19949        self.as_vec_mut().extend(value.to_ne_bytes());
19950        self
19951    }
19952    pub fn nested_nest(mut self) -> PushCableNest<Self> {
19953        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
19954        PushCableNest {
19955            prev: Some(self),
19956            header_offset: Some(header_offset),
19957        }
19958    }
19959}
19960impl<Prev: Pusher> Drop for PushCableTestTdrNtf<Prev> {
19961    fn drop(&mut self) {
19962        if let Some(prev) = &mut self.prev {
19963            if let Some(header_offset) = &self.header_offset {
19964                finalize_nested_header(prev.as_vec_mut(), *header_offset);
19965            }
19966        }
19967    }
19968}
19969pub struct PushCableTestTdr<Prev: Pusher> {
19970    pub(crate) prev: Option<Prev>,
19971    pub(crate) header_offset: Option<usize>,
19972}
19973impl<Prev: Pusher> Pusher for PushCableTestTdr<Prev> {
19974    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19975        self.prev.as_mut().unwrap().as_vec_mut()
19976    }
19977    fn as_vec(&self) -> &Vec<u8> {
19978        self.prev.as_ref().unwrap().as_vec()
19979    }
19980}
19981impl<Prev: Pusher> PushCableTestTdr<Prev> {
19982    pub fn new(prev: Prev) -> Self {
19983        Self {
19984            prev: Some(prev),
19985            header_offset: None,
19986        }
19987    }
19988    pub fn end_nested(mut self) -> Prev {
19989        let mut prev = self.prev.take().unwrap();
19990        if let Some(header_offset) = &self.header_offset {
19991            finalize_nested_header(prev.as_vec_mut(), *header_offset);
19992        }
19993        prev
19994    }
19995    pub fn nested_header(mut self) -> PushHeader<Self> {
19996        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19997        PushHeader {
19998            prev: Some(self),
19999            header_offset: Some(header_offset),
20000        }
20001    }
20002    pub fn nested_cfg(mut self) -> PushCableTestTdrCfg<Self> {
20003        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
20004        PushCableTestTdrCfg {
20005            prev: Some(self),
20006            header_offset: Some(header_offset),
20007        }
20008    }
20009}
20010impl<Prev: Pusher> Drop for PushCableTestTdr<Prev> {
20011    fn drop(&mut self) {
20012        if let Some(prev) = &mut self.prev {
20013            if let Some(header_offset) = &self.header_offset {
20014                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20015            }
20016        }
20017    }
20018}
20019pub struct PushTunnelUdpEntry<Prev: Pusher> {
20020    pub(crate) prev: Option<Prev>,
20021    pub(crate) header_offset: Option<usize>,
20022}
20023impl<Prev: Pusher> Pusher for PushTunnelUdpEntry<Prev> {
20024    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20025        self.prev.as_mut().unwrap().as_vec_mut()
20026    }
20027    fn as_vec(&self) -> &Vec<u8> {
20028        self.prev.as_ref().unwrap().as_vec()
20029    }
20030}
20031impl<Prev: Pusher> PushTunnelUdpEntry<Prev> {
20032    pub fn new(prev: Prev) -> Self {
20033        Self {
20034            prev: Some(prev),
20035            header_offset: None,
20036        }
20037    }
20038    pub fn end_nested(mut self) -> Prev {
20039        let mut prev = self.prev.take().unwrap();
20040        if let Some(header_offset) = &self.header_offset {
20041            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20042        }
20043        prev
20044    }
20045    pub fn push_port(mut self, value: u16) -> Self {
20046        push_header(self.as_vec_mut(), 1u16, 2 as u16);
20047        self.as_vec_mut().extend(value.to_be_bytes());
20048        self
20049    }
20050    #[doc = "Associated type: [`UdpTunnelType`] (enum)"]
20051    pub fn push_type(mut self, value: u32) -> Self {
20052        push_header(self.as_vec_mut(), 2u16, 4 as u16);
20053        self.as_vec_mut().extend(value.to_ne_bytes());
20054        self
20055    }
20056}
20057impl<Prev: Pusher> Drop for PushTunnelUdpEntry<Prev> {
20058    fn drop(&mut self) {
20059        if let Some(prev) = &mut self.prev {
20060            if let Some(header_offset) = &self.header_offset {
20061                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20062            }
20063        }
20064    }
20065}
20066pub struct PushTunnelUdpTable<Prev: Pusher> {
20067    pub(crate) prev: Option<Prev>,
20068    pub(crate) header_offset: Option<usize>,
20069}
20070impl<Prev: Pusher> Pusher for PushTunnelUdpTable<Prev> {
20071    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20072        self.prev.as_mut().unwrap().as_vec_mut()
20073    }
20074    fn as_vec(&self) -> &Vec<u8> {
20075        self.prev.as_ref().unwrap().as_vec()
20076    }
20077}
20078impl<Prev: Pusher> PushTunnelUdpTable<Prev> {
20079    pub fn new(prev: Prev) -> Self {
20080        Self {
20081            prev: Some(prev),
20082            header_offset: None,
20083        }
20084    }
20085    pub fn end_nested(mut self) -> Prev {
20086        let mut prev = self.prev.take().unwrap();
20087        if let Some(header_offset) = &self.header_offset {
20088            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20089        }
20090        prev
20091    }
20092    pub fn push_size(mut self, value: u32) -> Self {
20093        push_header(self.as_vec_mut(), 1u16, 4 as u16);
20094        self.as_vec_mut().extend(value.to_ne_bytes());
20095        self
20096    }
20097    pub fn nested_types(mut self) -> PushBitset<Self> {
20098        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
20099        PushBitset {
20100            prev: Some(self),
20101            header_offset: Some(header_offset),
20102        }
20103    }
20104    #[doc = "Attribute may repeat multiple times (treat it as array)"]
20105    pub fn nested_entry(mut self) -> PushTunnelUdpEntry<Self> {
20106        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
20107        PushTunnelUdpEntry {
20108            prev: Some(self),
20109            header_offset: Some(header_offset),
20110        }
20111    }
20112}
20113impl<Prev: Pusher> Drop for PushTunnelUdpTable<Prev> {
20114    fn drop(&mut self) {
20115        if let Some(prev) = &mut self.prev {
20116            if let Some(header_offset) = &self.header_offset {
20117                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20118            }
20119        }
20120    }
20121}
20122pub struct PushTunnelUdp<Prev: Pusher> {
20123    pub(crate) prev: Option<Prev>,
20124    pub(crate) header_offset: Option<usize>,
20125}
20126impl<Prev: Pusher> Pusher for PushTunnelUdp<Prev> {
20127    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20128        self.prev.as_mut().unwrap().as_vec_mut()
20129    }
20130    fn as_vec(&self) -> &Vec<u8> {
20131        self.prev.as_ref().unwrap().as_vec()
20132    }
20133}
20134impl<Prev: Pusher> PushTunnelUdp<Prev> {
20135    pub fn new(prev: Prev) -> Self {
20136        Self {
20137            prev: Some(prev),
20138            header_offset: None,
20139        }
20140    }
20141    pub fn end_nested(mut self) -> Prev {
20142        let mut prev = self.prev.take().unwrap();
20143        if let Some(header_offset) = &self.header_offset {
20144            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20145        }
20146        prev
20147    }
20148    pub fn nested_table(mut self) -> PushTunnelUdpTable<Self> {
20149        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
20150        PushTunnelUdpTable {
20151            prev: Some(self),
20152            header_offset: Some(header_offset),
20153        }
20154    }
20155}
20156impl<Prev: Pusher> Drop for PushTunnelUdp<Prev> {
20157    fn drop(&mut self) {
20158        if let Some(prev) = &mut self.prev {
20159            if let Some(header_offset) = &self.header_offset {
20160                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20161            }
20162        }
20163    }
20164}
20165pub struct PushTunnelInfo<Prev: Pusher> {
20166    pub(crate) prev: Option<Prev>,
20167    pub(crate) header_offset: Option<usize>,
20168}
20169impl<Prev: Pusher> Pusher for PushTunnelInfo<Prev> {
20170    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20171        self.prev.as_mut().unwrap().as_vec_mut()
20172    }
20173    fn as_vec(&self) -> &Vec<u8> {
20174        self.prev.as_ref().unwrap().as_vec()
20175    }
20176}
20177impl<Prev: Pusher> PushTunnelInfo<Prev> {
20178    pub fn new(prev: Prev) -> Self {
20179        Self {
20180            prev: Some(prev),
20181            header_offset: None,
20182        }
20183    }
20184    pub fn end_nested(mut self) -> Prev {
20185        let mut prev = self.prev.take().unwrap();
20186        if let Some(header_offset) = &self.header_offset {
20187            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20188        }
20189        prev
20190    }
20191    pub fn nested_header(mut self) -> PushHeader<Self> {
20192        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
20193        PushHeader {
20194            prev: Some(self),
20195            header_offset: Some(header_offset),
20196        }
20197    }
20198    pub fn nested_udp_ports(mut self) -> PushTunnelUdp<Self> {
20199        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
20200        PushTunnelUdp {
20201            prev: Some(self),
20202            header_offset: Some(header_offset),
20203        }
20204    }
20205}
20206impl<Prev: Pusher> Drop for PushTunnelInfo<Prev> {
20207    fn drop(&mut self) {
20208        if let Some(prev) = &mut self.prev {
20209            if let Some(header_offset) = &self.header_offset {
20210                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20211            }
20212        }
20213    }
20214}
20215pub struct PushFecHist<Prev: Pusher> {
20216    pub(crate) prev: Option<Prev>,
20217    pub(crate) header_offset: Option<usize>,
20218}
20219impl<Prev: Pusher> Pusher for PushFecHist<Prev> {
20220    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20221        self.prev.as_mut().unwrap().as_vec_mut()
20222    }
20223    fn as_vec(&self) -> &Vec<u8> {
20224        self.prev.as_ref().unwrap().as_vec()
20225    }
20226}
20227impl<Prev: Pusher> PushFecHist<Prev> {
20228    pub fn new(prev: Prev) -> Self {
20229        Self {
20230            prev: Some(prev),
20231            header_offset: None,
20232        }
20233    }
20234    pub fn end_nested(mut self) -> Prev {
20235        let mut prev = self.prev.take().unwrap();
20236        if let Some(header_offset) = &self.header_offset {
20237            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20238        }
20239        prev
20240    }
20241    pub fn push_pad(mut self, value: &[u8]) -> Self {
20242        push_header(self.as_vec_mut(), 1u16, value.len() as u16);
20243        self.as_vec_mut().extend(value);
20244        self
20245    }
20246    #[doc = "Low bound of FEC bin (inclusive)\n"]
20247    pub fn push_bin_low(mut self, value: u32) -> Self {
20248        push_header(self.as_vec_mut(), 2u16, 4 as u16);
20249        self.as_vec_mut().extend(value.to_ne_bytes());
20250        self
20251    }
20252    #[doc = "High bound of FEC bin (inclusive)\n"]
20253    pub fn push_bin_high(mut self, value: u32) -> Self {
20254        push_header(self.as_vec_mut(), 3u16, 4 as u16);
20255        self.as_vec_mut().extend(value.to_ne_bytes());
20256        self
20257    }
20258    #[doc = "Error count in the bin (optional if per-lane values exist)\n"]
20259    pub fn push_bin_val(mut self, value: u32) -> Self {
20260        push_header(self.as_vec_mut(), 4u16, 4 as u16);
20261        self.as_vec_mut().extend(value.to_ne_bytes());
20262        self
20263    }
20264    #[doc = "An array of per-lane error counters in the bin (optional)\n"]
20265    pub fn push_bin_val_per_lane(mut self, value: &[u8]) -> Self {
20266        push_header(self.as_vec_mut(), 5u16, value.len() as u16);
20267        self.as_vec_mut().extend(value);
20268        self
20269    }
20270}
20271impl<Prev: Pusher> Drop for PushFecHist<Prev> {
20272    fn drop(&mut self) {
20273        if let Some(prev) = &mut self.prev {
20274            if let Some(header_offset) = &self.header_offset {
20275                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20276            }
20277        }
20278    }
20279}
20280pub struct PushFecStat<Prev: Pusher> {
20281    pub(crate) prev: Option<Prev>,
20282    pub(crate) header_offset: Option<usize>,
20283}
20284impl<Prev: Pusher> Pusher for PushFecStat<Prev> {
20285    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20286        self.prev.as_mut().unwrap().as_vec_mut()
20287    }
20288    fn as_vec(&self) -> &Vec<u8> {
20289        self.prev.as_ref().unwrap().as_vec()
20290    }
20291}
20292impl<Prev: Pusher> PushFecStat<Prev> {
20293    pub fn new(prev: Prev) -> Self {
20294        Self {
20295            prev: Some(prev),
20296            header_offset: None,
20297        }
20298    }
20299    pub fn end_nested(mut self) -> Prev {
20300        let mut prev = self.prev.take().unwrap();
20301        if let Some(header_offset) = &self.header_offset {
20302            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20303        }
20304        prev
20305    }
20306    pub fn push_pad(mut self, value: &[u8]) -> Self {
20307        push_header(self.as_vec_mut(), 1u16, value.len() as u16);
20308        self.as_vec_mut().extend(value);
20309        self
20310    }
20311    pub fn push_corrected(mut self, value: &[u8]) -> Self {
20312        push_header(self.as_vec_mut(), 2u16, value.len() as u16);
20313        self.as_vec_mut().extend(value);
20314        self
20315    }
20316    pub fn push_uncorr(mut self, value: &[u8]) -> Self {
20317        push_header(self.as_vec_mut(), 3u16, value.len() as u16);
20318        self.as_vec_mut().extend(value);
20319        self
20320    }
20321    pub fn push_corr_bits(mut self, value: &[u8]) -> Self {
20322        push_header(self.as_vec_mut(), 4u16, value.len() as u16);
20323        self.as_vec_mut().extend(value);
20324        self
20325    }
20326    #[doc = "Attribute may repeat multiple times (treat it as array)"]
20327    pub fn nested_hist(mut self) -> PushFecHist<Self> {
20328        let header_offset = push_nested_header(self.as_vec_mut(), 5u16);
20329        PushFecHist {
20330            prev: Some(self),
20331            header_offset: Some(header_offset),
20332        }
20333    }
20334}
20335impl<Prev: Pusher> Drop for PushFecStat<Prev> {
20336    fn drop(&mut self) {
20337        if let Some(prev) = &mut self.prev {
20338            if let Some(header_offset) = &self.header_offset {
20339                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20340            }
20341        }
20342    }
20343}
20344pub struct PushFec<Prev: Pusher> {
20345    pub(crate) prev: Option<Prev>,
20346    pub(crate) header_offset: Option<usize>,
20347}
20348impl<Prev: Pusher> Pusher for PushFec<Prev> {
20349    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20350        self.prev.as_mut().unwrap().as_vec_mut()
20351    }
20352    fn as_vec(&self) -> &Vec<u8> {
20353        self.prev.as_ref().unwrap().as_vec()
20354    }
20355}
20356impl<Prev: Pusher> PushFec<Prev> {
20357    pub fn new(prev: Prev) -> Self {
20358        Self {
20359            prev: Some(prev),
20360            header_offset: None,
20361        }
20362    }
20363    pub fn end_nested(mut self) -> Prev {
20364        let mut prev = self.prev.take().unwrap();
20365        if let Some(header_offset) = &self.header_offset {
20366            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20367        }
20368        prev
20369    }
20370    pub fn nested_header(mut self) -> PushHeader<Self> {
20371        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
20372        PushHeader {
20373            prev: Some(self),
20374            header_offset: Some(header_offset),
20375        }
20376    }
20377    pub fn nested_modes(mut self) -> PushBitset<Self> {
20378        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
20379        PushBitset {
20380            prev: Some(self),
20381            header_offset: Some(header_offset),
20382        }
20383    }
20384    pub fn push_auto(mut self, value: u8) -> Self {
20385        push_header(self.as_vec_mut(), 3u16, 1 as u16);
20386        self.as_vec_mut().extend(value.to_ne_bytes());
20387        self
20388    }
20389    pub fn push_active(mut self, value: u32) -> Self {
20390        push_header(self.as_vec_mut(), 4u16, 4 as u16);
20391        self.as_vec_mut().extend(value.to_ne_bytes());
20392        self
20393    }
20394    pub fn nested_stats(mut self) -> PushFecStat<Self> {
20395        let header_offset = push_nested_header(self.as_vec_mut(), 5u16);
20396        PushFecStat {
20397            prev: Some(self),
20398            header_offset: Some(header_offset),
20399        }
20400    }
20401}
20402impl<Prev: Pusher> Drop for PushFec<Prev> {
20403    fn drop(&mut self) {
20404        if let Some(prev) = &mut self.prev {
20405            if let Some(header_offset) = &self.header_offset {
20406                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20407            }
20408        }
20409    }
20410}
20411pub struct PushModuleEeprom<Prev: Pusher> {
20412    pub(crate) prev: Option<Prev>,
20413    pub(crate) header_offset: Option<usize>,
20414}
20415impl<Prev: Pusher> Pusher for PushModuleEeprom<Prev> {
20416    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20417        self.prev.as_mut().unwrap().as_vec_mut()
20418    }
20419    fn as_vec(&self) -> &Vec<u8> {
20420        self.prev.as_ref().unwrap().as_vec()
20421    }
20422}
20423impl<Prev: Pusher> PushModuleEeprom<Prev> {
20424    pub fn new(prev: Prev) -> Self {
20425        Self {
20426            prev: Some(prev),
20427            header_offset: None,
20428        }
20429    }
20430    pub fn end_nested(mut self) -> Prev {
20431        let mut prev = self.prev.take().unwrap();
20432        if let Some(header_offset) = &self.header_offset {
20433            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20434        }
20435        prev
20436    }
20437    pub fn nested_header(mut self) -> PushHeader<Self> {
20438        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
20439        PushHeader {
20440            prev: Some(self),
20441            header_offset: Some(header_offset),
20442        }
20443    }
20444    pub fn push_offset(mut self, value: u32) -> Self {
20445        push_header(self.as_vec_mut(), 2u16, 4 as u16);
20446        self.as_vec_mut().extend(value.to_ne_bytes());
20447        self
20448    }
20449    pub fn push_length(mut self, value: u32) -> Self {
20450        push_header(self.as_vec_mut(), 3u16, 4 as u16);
20451        self.as_vec_mut().extend(value.to_ne_bytes());
20452        self
20453    }
20454    pub fn push_page(mut self, value: u8) -> Self {
20455        push_header(self.as_vec_mut(), 4u16, 1 as u16);
20456        self.as_vec_mut().extend(value.to_ne_bytes());
20457        self
20458    }
20459    pub fn push_bank(mut self, value: u8) -> Self {
20460        push_header(self.as_vec_mut(), 5u16, 1 as u16);
20461        self.as_vec_mut().extend(value.to_ne_bytes());
20462        self
20463    }
20464    pub fn push_i2c_address(mut self, value: u8) -> Self {
20465        push_header(self.as_vec_mut(), 6u16, 1 as u16);
20466        self.as_vec_mut().extend(value.to_ne_bytes());
20467        self
20468    }
20469    pub fn push_data(mut self, value: &[u8]) -> Self {
20470        push_header(self.as_vec_mut(), 7u16, value.len() as u16);
20471        self.as_vec_mut().extend(value);
20472        self
20473    }
20474}
20475impl<Prev: Pusher> Drop for PushModuleEeprom<Prev> {
20476    fn drop(&mut self) {
20477        if let Some(prev) = &mut self.prev {
20478            if let Some(header_offset) = &self.header_offset {
20479                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20480            }
20481        }
20482    }
20483}
20484pub struct PushStatsGrp<Prev: Pusher> {
20485    pub(crate) prev: Option<Prev>,
20486    pub(crate) header_offset: Option<usize>,
20487}
20488impl<Prev: Pusher> Pusher for PushStatsGrp<Prev> {
20489    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20490        self.prev.as_mut().unwrap().as_vec_mut()
20491    }
20492    fn as_vec(&self) -> &Vec<u8> {
20493        self.prev.as_ref().unwrap().as_vec()
20494    }
20495}
20496impl<Prev: Pusher> PushStatsGrp<Prev> {
20497    pub fn new(prev: Prev) -> Self {
20498        Self {
20499            prev: Some(prev),
20500            header_offset: None,
20501        }
20502    }
20503    pub fn end_nested(mut self) -> Prev {
20504        let mut prev = self.prev.take().unwrap();
20505        if let Some(header_offset) = &self.header_offset {
20506            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20507        }
20508        prev
20509    }
20510    pub fn push_pad(mut self, value: &[u8]) -> Self {
20511        push_header(self.as_vec_mut(), 1u16, value.len() as u16);
20512        self.as_vec_mut().extend(value);
20513        self
20514    }
20515    pub fn push_id(mut self, value: u32) -> Self {
20516        push_header(self.as_vec_mut(), 2u16, 4 as u16);
20517        self.as_vec_mut().extend(value.to_ne_bytes());
20518        self
20519    }
20520    pub fn push_ss_id(mut self, value: u32) -> Self {
20521        push_header(self.as_vec_mut(), 3u16, 4 as u16);
20522        self.as_vec_mut().extend(value.to_ne_bytes());
20523        self
20524    }
20525    pub fn push_stat(mut self, value: u64) -> Self {
20526        push_header(self.as_vec_mut(), 4u16, 8 as u16);
20527        self.as_vec_mut().extend(value.to_ne_bytes());
20528        self
20529    }
20530    pub fn nested_hist_rx(mut self) -> PushStatsGrpHist<Self> {
20531        let header_offset = push_nested_header(self.as_vec_mut(), 5u16);
20532        PushStatsGrpHist {
20533            prev: Some(self),
20534            header_offset: Some(header_offset),
20535        }
20536    }
20537    pub fn nested_hist_tx(mut self) -> PushStatsGrpHist<Self> {
20538        let header_offset = push_nested_header(self.as_vec_mut(), 6u16);
20539        PushStatsGrpHist {
20540            prev: Some(self),
20541            header_offset: Some(header_offset),
20542        }
20543    }
20544    pub fn push_hist_bkt_low(mut self, value: u32) -> Self {
20545        push_header(self.as_vec_mut(), 7u16, 4 as u16);
20546        self.as_vec_mut().extend(value.to_ne_bytes());
20547        self
20548    }
20549    pub fn push_hist_bkt_hi(mut self, value: u32) -> Self {
20550        push_header(self.as_vec_mut(), 8u16, 4 as u16);
20551        self.as_vec_mut().extend(value.to_ne_bytes());
20552        self
20553    }
20554    pub fn push_hist_val(mut self, value: u64) -> Self {
20555        push_header(self.as_vec_mut(), 9u16, 8 as u16);
20556        self.as_vec_mut().extend(value.to_ne_bytes());
20557        self
20558    }
20559}
20560impl<Prev: Pusher> Drop for PushStatsGrp<Prev> {
20561    fn drop(&mut self) {
20562        if let Some(prev) = &mut self.prev {
20563            if let Some(header_offset) = &self.header_offset {
20564                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20565            }
20566        }
20567    }
20568}
20569pub struct PushStatsGrpHist<Prev: Pusher> {
20570    pub(crate) prev: Option<Prev>,
20571    pub(crate) header_offset: Option<usize>,
20572}
20573impl<Prev: Pusher> Pusher for PushStatsGrpHist<Prev> {
20574    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20575        self.prev.as_mut().unwrap().as_vec_mut()
20576    }
20577    fn as_vec(&self) -> &Vec<u8> {
20578        self.prev.as_ref().unwrap().as_vec()
20579    }
20580}
20581impl<Prev: Pusher> PushStatsGrpHist<Prev> {
20582    pub fn new(prev: Prev) -> Self {
20583        Self {
20584            prev: Some(prev),
20585            header_offset: None,
20586        }
20587    }
20588    pub fn end_nested(mut self) -> Prev {
20589        let mut prev = self.prev.take().unwrap();
20590        if let Some(header_offset) = &self.header_offset {
20591            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20592        }
20593        prev
20594    }
20595    pub fn push_hist_bkt_low(mut self, value: u32) -> Self {
20596        push_header(self.as_vec_mut(), 7u16, 4 as u16);
20597        self.as_vec_mut().extend(value.to_ne_bytes());
20598        self
20599    }
20600    pub fn push_hist_bkt_hi(mut self, value: u32) -> Self {
20601        push_header(self.as_vec_mut(), 8u16, 4 as u16);
20602        self.as_vec_mut().extend(value.to_ne_bytes());
20603        self
20604    }
20605    pub fn push_hist_val(mut self, value: u64) -> Self {
20606        push_header(self.as_vec_mut(), 9u16, 8 as u16);
20607        self.as_vec_mut().extend(value.to_ne_bytes());
20608        self
20609    }
20610}
20611impl<Prev: Pusher> Drop for PushStatsGrpHist<Prev> {
20612    fn drop(&mut self) {
20613        if let Some(prev) = &mut self.prev {
20614            if let Some(header_offset) = &self.header_offset {
20615                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20616            }
20617        }
20618    }
20619}
20620pub struct PushStats<Prev: Pusher> {
20621    pub(crate) prev: Option<Prev>,
20622    pub(crate) header_offset: Option<usize>,
20623}
20624impl<Prev: Pusher> Pusher for PushStats<Prev> {
20625    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20626        self.prev.as_mut().unwrap().as_vec_mut()
20627    }
20628    fn as_vec(&self) -> &Vec<u8> {
20629        self.prev.as_ref().unwrap().as_vec()
20630    }
20631}
20632impl<Prev: Pusher> PushStats<Prev> {
20633    pub fn new(prev: Prev) -> Self {
20634        Self {
20635            prev: Some(prev),
20636            header_offset: None,
20637        }
20638    }
20639    pub fn end_nested(mut self) -> Prev {
20640        let mut prev = self.prev.take().unwrap();
20641        if let Some(header_offset) = &self.header_offset {
20642            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20643        }
20644        prev
20645    }
20646    pub fn push_pad(mut self, value: &[u8]) -> Self {
20647        push_header(self.as_vec_mut(), 1u16, value.len() as u16);
20648        self.as_vec_mut().extend(value);
20649        self
20650    }
20651    pub fn nested_header(mut self) -> PushHeader<Self> {
20652        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
20653        PushHeader {
20654            prev: Some(self),
20655            header_offset: Some(header_offset),
20656        }
20657    }
20658    pub fn nested_groups(mut self) -> PushBitset<Self> {
20659        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
20660        PushBitset {
20661            prev: Some(self),
20662            header_offset: Some(header_offset),
20663        }
20664    }
20665    pub fn nested_grp(mut self) -> PushStatsGrp<Self> {
20666        let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
20667        PushStatsGrp {
20668            prev: Some(self),
20669            header_offset: Some(header_offset),
20670        }
20671    }
20672    pub fn push_src(mut self, value: u32) -> Self {
20673        push_header(self.as_vec_mut(), 5u16, 4 as u16);
20674        self.as_vec_mut().extend(value.to_ne_bytes());
20675        self
20676    }
20677}
20678impl<Prev: Pusher> Drop for PushStats<Prev> {
20679    fn drop(&mut self) {
20680        if let Some(prev) = &mut self.prev {
20681            if let Some(header_offset) = &self.header_offset {
20682                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20683            }
20684        }
20685    }
20686}
20687pub struct PushPhcVclocks<Prev: Pusher> {
20688    pub(crate) prev: Option<Prev>,
20689    pub(crate) header_offset: Option<usize>,
20690}
20691impl<Prev: Pusher> Pusher for PushPhcVclocks<Prev> {
20692    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20693        self.prev.as_mut().unwrap().as_vec_mut()
20694    }
20695    fn as_vec(&self) -> &Vec<u8> {
20696        self.prev.as_ref().unwrap().as_vec()
20697    }
20698}
20699impl<Prev: Pusher> PushPhcVclocks<Prev> {
20700    pub fn new(prev: Prev) -> Self {
20701        Self {
20702            prev: Some(prev),
20703            header_offset: None,
20704        }
20705    }
20706    pub fn end_nested(mut self) -> Prev {
20707        let mut prev = self.prev.take().unwrap();
20708        if let Some(header_offset) = &self.header_offset {
20709            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20710        }
20711        prev
20712    }
20713    pub fn nested_header(mut self) -> PushHeader<Self> {
20714        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
20715        PushHeader {
20716            prev: Some(self),
20717            header_offset: Some(header_offset),
20718        }
20719    }
20720    pub fn push_num(mut self, value: u32) -> Self {
20721        push_header(self.as_vec_mut(), 2u16, 4 as u16);
20722        self.as_vec_mut().extend(value.to_ne_bytes());
20723        self
20724    }
20725    pub fn push_index(mut self, value: &[u8]) -> Self {
20726        push_header(self.as_vec_mut(), 3u16, value.len() as u16);
20727        self.as_vec_mut().extend(value);
20728        self
20729    }
20730}
20731impl<Prev: Pusher> Drop for PushPhcVclocks<Prev> {
20732    fn drop(&mut self) {
20733        if let Some(prev) = &mut self.prev {
20734            if let Some(header_offset) = &self.header_offset {
20735                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20736            }
20737        }
20738    }
20739}
20740pub struct PushModule<Prev: Pusher> {
20741    pub(crate) prev: Option<Prev>,
20742    pub(crate) header_offset: Option<usize>,
20743}
20744impl<Prev: Pusher> Pusher for PushModule<Prev> {
20745    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20746        self.prev.as_mut().unwrap().as_vec_mut()
20747    }
20748    fn as_vec(&self) -> &Vec<u8> {
20749        self.prev.as_ref().unwrap().as_vec()
20750    }
20751}
20752impl<Prev: Pusher> PushModule<Prev> {
20753    pub fn new(prev: Prev) -> Self {
20754        Self {
20755            prev: Some(prev),
20756            header_offset: None,
20757        }
20758    }
20759    pub fn end_nested(mut self) -> Prev {
20760        let mut prev = self.prev.take().unwrap();
20761        if let Some(header_offset) = &self.header_offset {
20762            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20763        }
20764        prev
20765    }
20766    pub fn nested_header(mut self) -> PushHeader<Self> {
20767        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
20768        PushHeader {
20769            prev: Some(self),
20770            header_offset: Some(header_offset),
20771        }
20772    }
20773    pub fn push_power_mode_policy(mut self, value: u8) -> Self {
20774        push_header(self.as_vec_mut(), 2u16, 1 as u16);
20775        self.as_vec_mut().extend(value.to_ne_bytes());
20776        self
20777    }
20778    pub fn push_power_mode(mut self, value: u8) -> Self {
20779        push_header(self.as_vec_mut(), 3u16, 1 as u16);
20780        self.as_vec_mut().extend(value.to_ne_bytes());
20781        self
20782    }
20783}
20784impl<Prev: Pusher> Drop for PushModule<Prev> {
20785    fn drop(&mut self) {
20786        if let Some(prev) = &mut self.prev {
20787            if let Some(header_offset) = &self.header_offset {
20788                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20789            }
20790        }
20791    }
20792}
20793pub struct PushC33PsePwLimit<Prev: Pusher> {
20794    pub(crate) prev: Option<Prev>,
20795    pub(crate) header_offset: Option<usize>,
20796}
20797impl<Prev: Pusher> Pusher for PushC33PsePwLimit<Prev> {
20798    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20799        self.prev.as_mut().unwrap().as_vec_mut()
20800    }
20801    fn as_vec(&self) -> &Vec<u8> {
20802        self.prev.as_ref().unwrap().as_vec()
20803    }
20804}
20805impl<Prev: Pusher> PushC33PsePwLimit<Prev> {
20806    pub fn new(prev: Prev) -> Self {
20807        Self {
20808            prev: Some(prev),
20809            header_offset: None,
20810        }
20811    }
20812    pub fn end_nested(mut self) -> Prev {
20813        let mut prev = self.prev.take().unwrap();
20814        if let Some(header_offset) = &self.header_offset {
20815            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20816        }
20817        prev
20818    }
20819    pub fn push_min(mut self, value: u32) -> Self {
20820        push_header(self.as_vec_mut(), 1u16, 4 as u16);
20821        self.as_vec_mut().extend(value.to_ne_bytes());
20822        self
20823    }
20824    pub fn push_max(mut self, value: u32) -> Self {
20825        push_header(self.as_vec_mut(), 2u16, 4 as u16);
20826        self.as_vec_mut().extend(value.to_ne_bytes());
20827        self
20828    }
20829}
20830impl<Prev: Pusher> Drop for PushC33PsePwLimit<Prev> {
20831    fn drop(&mut self) {
20832        if let Some(prev) = &mut self.prev {
20833            if let Some(header_offset) = &self.header_offset {
20834                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20835            }
20836        }
20837    }
20838}
20839pub struct PushPse<Prev: Pusher> {
20840    pub(crate) prev: Option<Prev>,
20841    pub(crate) header_offset: Option<usize>,
20842}
20843impl<Prev: Pusher> Pusher for PushPse<Prev> {
20844    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20845        self.prev.as_mut().unwrap().as_vec_mut()
20846    }
20847    fn as_vec(&self) -> &Vec<u8> {
20848        self.prev.as_ref().unwrap().as_vec()
20849    }
20850}
20851impl<Prev: Pusher> PushPse<Prev> {
20852    pub fn new(prev: Prev) -> Self {
20853        Self {
20854            prev: Some(prev),
20855            header_offset: None,
20856        }
20857    }
20858    pub fn end_nested(mut self) -> Prev {
20859        let mut prev = self.prev.take().unwrap();
20860        if let Some(header_offset) = &self.header_offset {
20861            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20862        }
20863        prev
20864    }
20865    pub fn nested_header(mut self) -> PushHeader<Self> {
20866        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
20867        PushHeader {
20868            prev: Some(self),
20869            header_offset: Some(header_offset),
20870        }
20871    }
20872    pub fn push_podl_pse_admin_state(mut self, value: u32) -> Self {
20873        push_header(self.as_vec_mut(), 2u16, 4 as u16);
20874        self.as_vec_mut().extend(value.to_ne_bytes());
20875        self
20876    }
20877    pub fn push_podl_pse_admin_control(mut self, value: u32) -> Self {
20878        push_header(self.as_vec_mut(), 3u16, 4 as u16);
20879        self.as_vec_mut().extend(value.to_ne_bytes());
20880        self
20881    }
20882    pub fn push_podl_pse_pw_d_status(mut self, value: u32) -> Self {
20883        push_header(self.as_vec_mut(), 4u16, 4 as u16);
20884        self.as_vec_mut().extend(value.to_ne_bytes());
20885        self
20886    }
20887    pub fn push_c33_pse_admin_state(mut self, value: u32) -> Self {
20888        push_header(self.as_vec_mut(), 5u16, 4 as u16);
20889        self.as_vec_mut().extend(value.to_ne_bytes());
20890        self
20891    }
20892    pub fn push_c33_pse_admin_control(mut self, value: u32) -> Self {
20893        push_header(self.as_vec_mut(), 6u16, 4 as u16);
20894        self.as_vec_mut().extend(value.to_ne_bytes());
20895        self
20896    }
20897    pub fn push_c33_pse_pw_d_status(mut self, value: u32) -> Self {
20898        push_header(self.as_vec_mut(), 7u16, 4 as u16);
20899        self.as_vec_mut().extend(value.to_ne_bytes());
20900        self
20901    }
20902    pub fn push_c33_pse_pw_class(mut self, value: u32) -> Self {
20903        push_header(self.as_vec_mut(), 8u16, 4 as u16);
20904        self.as_vec_mut().extend(value.to_ne_bytes());
20905        self
20906    }
20907    pub fn push_c33_pse_actual_pw(mut self, value: u32) -> Self {
20908        push_header(self.as_vec_mut(), 9u16, 4 as u16);
20909        self.as_vec_mut().extend(value.to_ne_bytes());
20910        self
20911    }
20912    #[doc = "Associated type: [`C33PseExtState`] (enum)"]
20913    pub fn push_c33_pse_ext_state(mut self, value: u32) -> Self {
20914        push_header(self.as_vec_mut(), 10u16, 4 as u16);
20915        self.as_vec_mut().extend(value.to_ne_bytes());
20916        self
20917    }
20918    pub fn push_c33_pse_ext_substate(mut self, value: u32) -> Self {
20919        push_header(self.as_vec_mut(), 11u16, 4 as u16);
20920        self.as_vec_mut().extend(value.to_ne_bytes());
20921        self
20922    }
20923    pub fn push_c33_pse_avail_pw_limit(mut self, value: u32) -> Self {
20924        push_header(self.as_vec_mut(), 12u16, 4 as u16);
20925        self.as_vec_mut().extend(value.to_ne_bytes());
20926        self
20927    }
20928    #[doc = "Attribute may repeat multiple times (treat it as array)"]
20929    pub fn nested_c33_pse_pw_limit_ranges(mut self) -> PushC33PsePwLimit<Self> {
20930        let header_offset = push_nested_header(self.as_vec_mut(), 13u16);
20931        PushC33PsePwLimit {
20932            prev: Some(self),
20933            header_offset: Some(header_offset),
20934        }
20935    }
20936    pub fn push_pse_pw_d_id(mut self, value: u32) -> Self {
20937        push_header(self.as_vec_mut(), 14u16, 4 as u16);
20938        self.as_vec_mut().extend(value.to_ne_bytes());
20939        self
20940    }
20941    pub fn push_pse_prio_max(mut self, value: u32) -> Self {
20942        push_header(self.as_vec_mut(), 15u16, 4 as u16);
20943        self.as_vec_mut().extend(value.to_ne_bytes());
20944        self
20945    }
20946    pub fn push_pse_prio(mut self, value: u32) -> Self {
20947        push_header(self.as_vec_mut(), 16u16, 4 as u16);
20948        self.as_vec_mut().extend(value.to_ne_bytes());
20949        self
20950    }
20951}
20952impl<Prev: Pusher> Drop for PushPse<Prev> {
20953    fn drop(&mut self) {
20954        if let Some(prev) = &mut self.prev {
20955            if let Some(header_offset) = &self.header_offset {
20956                finalize_nested_header(prev.as_vec_mut(), *header_offset);
20957            }
20958        }
20959    }
20960}
20961pub struct PushFlow<Prev: Pusher> {
20962    pub(crate) prev: Option<Prev>,
20963    pub(crate) header_offset: Option<usize>,
20964}
20965impl<Prev: Pusher> Pusher for PushFlow<Prev> {
20966    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20967        self.prev.as_mut().unwrap().as_vec_mut()
20968    }
20969    fn as_vec(&self) -> &Vec<u8> {
20970        self.prev.as_ref().unwrap().as_vec()
20971    }
20972}
20973impl<Prev: Pusher> PushFlow<Prev> {
20974    pub fn new(prev: Prev) -> Self {
20975        Self {
20976            prev: Some(prev),
20977            header_offset: None,
20978        }
20979    }
20980    pub fn end_nested(mut self) -> Prev {
20981        let mut prev = self.prev.take().unwrap();
20982        if let Some(header_offset) = &self.header_offset {
20983            finalize_nested_header(prev.as_vec_mut(), *header_offset);
20984        }
20985        prev
20986    }
20987    #[doc = "Associated type: [`RxfhFields`] (enum)"]
20988    pub fn push_ether(mut self, value: u32) -> Self {
20989        push_header(self.as_vec_mut(), 1u16, 4 as u16);
20990        self.as_vec_mut().extend(value.to_ne_bytes());
20991        self
20992    }
20993    #[doc = "Associated type: [`RxfhFields`] (enum)"]
20994    pub fn push_ip4(mut self, value: u32) -> Self {
20995        push_header(self.as_vec_mut(), 2u16, 4 as u16);
20996        self.as_vec_mut().extend(value.to_ne_bytes());
20997        self
20998    }
20999    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21000    pub fn push_ip6(mut self, value: u32) -> Self {
21001        push_header(self.as_vec_mut(), 3u16, 4 as u16);
21002        self.as_vec_mut().extend(value.to_ne_bytes());
21003        self
21004    }
21005    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21006    pub fn push_tcp4(mut self, value: u32) -> Self {
21007        push_header(self.as_vec_mut(), 4u16, 4 as u16);
21008        self.as_vec_mut().extend(value.to_ne_bytes());
21009        self
21010    }
21011    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21012    pub fn push_tcp6(mut self, value: u32) -> Self {
21013        push_header(self.as_vec_mut(), 5u16, 4 as u16);
21014        self.as_vec_mut().extend(value.to_ne_bytes());
21015        self
21016    }
21017    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21018    pub fn push_udp4(mut self, value: u32) -> Self {
21019        push_header(self.as_vec_mut(), 6u16, 4 as u16);
21020        self.as_vec_mut().extend(value.to_ne_bytes());
21021        self
21022    }
21023    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21024    pub fn push_udp6(mut self, value: u32) -> Self {
21025        push_header(self.as_vec_mut(), 7u16, 4 as u16);
21026        self.as_vec_mut().extend(value.to_ne_bytes());
21027        self
21028    }
21029    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21030    pub fn push_sctp4(mut self, value: u32) -> Self {
21031        push_header(self.as_vec_mut(), 8u16, 4 as u16);
21032        self.as_vec_mut().extend(value.to_ne_bytes());
21033        self
21034    }
21035    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21036    pub fn push_sctp6(mut self, value: u32) -> Self {
21037        push_header(self.as_vec_mut(), 9u16, 4 as u16);
21038        self.as_vec_mut().extend(value.to_ne_bytes());
21039        self
21040    }
21041    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21042    pub fn push_ah4(mut self, value: u32) -> Self {
21043        push_header(self.as_vec_mut(), 10u16, 4 as u16);
21044        self.as_vec_mut().extend(value.to_ne_bytes());
21045        self
21046    }
21047    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21048    pub fn push_ah6(mut self, value: u32) -> Self {
21049        push_header(self.as_vec_mut(), 11u16, 4 as u16);
21050        self.as_vec_mut().extend(value.to_ne_bytes());
21051        self
21052    }
21053    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21054    pub fn push_esp4(mut self, value: u32) -> Self {
21055        push_header(self.as_vec_mut(), 12u16, 4 as u16);
21056        self.as_vec_mut().extend(value.to_ne_bytes());
21057        self
21058    }
21059    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21060    pub fn push_esp6(mut self, value: u32) -> Self {
21061        push_header(self.as_vec_mut(), 13u16, 4 as u16);
21062        self.as_vec_mut().extend(value.to_ne_bytes());
21063        self
21064    }
21065    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21066    pub fn push_ah_esp4(mut self, value: u32) -> Self {
21067        push_header(self.as_vec_mut(), 14u16, 4 as u16);
21068        self.as_vec_mut().extend(value.to_ne_bytes());
21069        self
21070    }
21071    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21072    pub fn push_ah_esp6(mut self, value: u32) -> Self {
21073        push_header(self.as_vec_mut(), 15u16, 4 as u16);
21074        self.as_vec_mut().extend(value.to_ne_bytes());
21075        self
21076    }
21077    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21078    pub fn push_gtpu4(mut self, value: u32) -> Self {
21079        push_header(self.as_vec_mut(), 16u16, 4 as u16);
21080        self.as_vec_mut().extend(value.to_ne_bytes());
21081        self
21082    }
21083    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21084    pub fn push_gtpu6(mut self, value: u32) -> Self {
21085        push_header(self.as_vec_mut(), 17u16, 4 as u16);
21086        self.as_vec_mut().extend(value.to_ne_bytes());
21087        self
21088    }
21089    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21090    pub fn push_gtpc4(mut self, value: u32) -> Self {
21091        push_header(self.as_vec_mut(), 18u16, 4 as u16);
21092        self.as_vec_mut().extend(value.to_ne_bytes());
21093        self
21094    }
21095    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21096    pub fn push_gtpc6(mut self, value: u32) -> Self {
21097        push_header(self.as_vec_mut(), 19u16, 4 as u16);
21098        self.as_vec_mut().extend(value.to_ne_bytes());
21099        self
21100    }
21101    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21102    pub fn push_gtpc_teid4(mut self, value: u32) -> Self {
21103        push_header(self.as_vec_mut(), 20u16, 4 as u16);
21104        self.as_vec_mut().extend(value.to_ne_bytes());
21105        self
21106    }
21107    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21108    pub fn push_gtpc_teid6(mut self, value: u32) -> Self {
21109        push_header(self.as_vec_mut(), 21u16, 4 as u16);
21110        self.as_vec_mut().extend(value.to_ne_bytes());
21111        self
21112    }
21113    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21114    pub fn push_gtpu_eh4(mut self, value: u32) -> Self {
21115        push_header(self.as_vec_mut(), 22u16, 4 as u16);
21116        self.as_vec_mut().extend(value.to_ne_bytes());
21117        self
21118    }
21119    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21120    pub fn push_gtpu_eh6(mut self, value: u32) -> Self {
21121        push_header(self.as_vec_mut(), 23u16, 4 as u16);
21122        self.as_vec_mut().extend(value.to_ne_bytes());
21123        self
21124    }
21125    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21126    pub fn push_gtpu_ul4(mut self, value: u32) -> Self {
21127        push_header(self.as_vec_mut(), 24u16, 4 as u16);
21128        self.as_vec_mut().extend(value.to_ne_bytes());
21129        self
21130    }
21131    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21132    pub fn push_gtpu_ul6(mut self, value: u32) -> Self {
21133        push_header(self.as_vec_mut(), 25u16, 4 as u16);
21134        self.as_vec_mut().extend(value.to_ne_bytes());
21135        self
21136    }
21137    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21138    pub fn push_gtpu_dl4(mut self, value: u32) -> Self {
21139        push_header(self.as_vec_mut(), 26u16, 4 as u16);
21140        self.as_vec_mut().extend(value.to_ne_bytes());
21141        self
21142    }
21143    #[doc = "Associated type: [`RxfhFields`] (enum)"]
21144    pub fn push_gtpu_dl6(mut self, value: u32) -> Self {
21145        push_header(self.as_vec_mut(), 27u16, 4 as u16);
21146        self.as_vec_mut().extend(value.to_ne_bytes());
21147        self
21148    }
21149}
21150impl<Prev: Pusher> Drop for PushFlow<Prev> {
21151    fn drop(&mut self) {
21152        if let Some(prev) = &mut self.prev {
21153            if let Some(header_offset) = &self.header_offset {
21154                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21155            }
21156        }
21157    }
21158}
21159pub struct PushRss<Prev: Pusher> {
21160    pub(crate) prev: Option<Prev>,
21161    pub(crate) header_offset: Option<usize>,
21162}
21163impl<Prev: Pusher> Pusher for PushRss<Prev> {
21164    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21165        self.prev.as_mut().unwrap().as_vec_mut()
21166    }
21167    fn as_vec(&self) -> &Vec<u8> {
21168        self.prev.as_ref().unwrap().as_vec()
21169    }
21170}
21171impl<Prev: Pusher> PushRss<Prev> {
21172    pub fn new(prev: Prev) -> Self {
21173        Self {
21174            prev: Some(prev),
21175            header_offset: None,
21176        }
21177    }
21178    pub fn end_nested(mut self) -> Prev {
21179        let mut prev = self.prev.take().unwrap();
21180        if let Some(header_offset) = &self.header_offset {
21181            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21182        }
21183        prev
21184    }
21185    pub fn nested_header(mut self) -> PushHeader<Self> {
21186        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
21187        PushHeader {
21188            prev: Some(self),
21189            header_offset: Some(header_offset),
21190        }
21191    }
21192    pub fn push_context(mut self, value: u32) -> Self {
21193        push_header(self.as_vec_mut(), 2u16, 4 as u16);
21194        self.as_vec_mut().extend(value.to_ne_bytes());
21195        self
21196    }
21197    pub fn push_hfunc(mut self, value: u32) -> Self {
21198        push_header(self.as_vec_mut(), 3u16, 4 as u16);
21199        self.as_vec_mut().extend(value.to_ne_bytes());
21200        self
21201    }
21202    pub fn push_indir(mut self, value: &[u8]) -> Self {
21203        push_header(self.as_vec_mut(), 4u16, value.len() as u16);
21204        self.as_vec_mut().extend(value);
21205        self
21206    }
21207    pub fn push_hkey(mut self, value: &[u8]) -> Self {
21208        push_header(self.as_vec_mut(), 5u16, value.len() as u16);
21209        self.as_vec_mut().extend(value);
21210        self
21211    }
21212    #[doc = "Associated type: [`InputXfrm`] (enum)"]
21213    pub fn push_input_xfrm(mut self, value: u32) -> Self {
21214        push_header(self.as_vec_mut(), 6u16, 4 as u16);
21215        self.as_vec_mut().extend(value.to_ne_bytes());
21216        self
21217    }
21218    pub fn push_start_context(mut self, value: u32) -> Self {
21219        push_header(self.as_vec_mut(), 7u16, 4 as u16);
21220        self.as_vec_mut().extend(value.to_ne_bytes());
21221        self
21222    }
21223    pub fn nested_flow_hash(mut self) -> PushFlow<Self> {
21224        let header_offset = push_nested_header(self.as_vec_mut(), 8u16);
21225        PushFlow {
21226            prev: Some(self),
21227            header_offset: Some(header_offset),
21228        }
21229    }
21230}
21231impl<Prev: Pusher> Drop for PushRss<Prev> {
21232    fn drop(&mut self) {
21233        if let Some(prev) = &mut self.prev {
21234            if let Some(header_offset) = &self.header_offset {
21235                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21236            }
21237        }
21238    }
21239}
21240pub struct PushPlca<Prev: Pusher> {
21241    pub(crate) prev: Option<Prev>,
21242    pub(crate) header_offset: Option<usize>,
21243}
21244impl<Prev: Pusher> Pusher for PushPlca<Prev> {
21245    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21246        self.prev.as_mut().unwrap().as_vec_mut()
21247    }
21248    fn as_vec(&self) -> &Vec<u8> {
21249        self.prev.as_ref().unwrap().as_vec()
21250    }
21251}
21252impl<Prev: Pusher> PushPlca<Prev> {
21253    pub fn new(prev: Prev) -> Self {
21254        Self {
21255            prev: Some(prev),
21256            header_offset: None,
21257        }
21258    }
21259    pub fn end_nested(mut self) -> Prev {
21260        let mut prev = self.prev.take().unwrap();
21261        if let Some(header_offset) = &self.header_offset {
21262            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21263        }
21264        prev
21265    }
21266    pub fn nested_header(mut self) -> PushHeader<Self> {
21267        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
21268        PushHeader {
21269            prev: Some(self),
21270            header_offset: Some(header_offset),
21271        }
21272    }
21273    pub fn push_version(mut self, value: u16) -> Self {
21274        push_header(self.as_vec_mut(), 2u16, 2 as u16);
21275        self.as_vec_mut().extend(value.to_ne_bytes());
21276        self
21277    }
21278    pub fn push_enabled(mut self, value: u8) -> Self {
21279        push_header(self.as_vec_mut(), 3u16, 1 as u16);
21280        self.as_vec_mut().extend(value.to_ne_bytes());
21281        self
21282    }
21283    pub fn push_status(mut self, value: u8) -> Self {
21284        push_header(self.as_vec_mut(), 4u16, 1 as u16);
21285        self.as_vec_mut().extend(value.to_ne_bytes());
21286        self
21287    }
21288    pub fn push_node_cnt(mut self, value: u32) -> Self {
21289        push_header(self.as_vec_mut(), 5u16, 4 as u16);
21290        self.as_vec_mut().extend(value.to_ne_bytes());
21291        self
21292    }
21293    pub fn push_node_id(mut self, value: u32) -> Self {
21294        push_header(self.as_vec_mut(), 6u16, 4 as u16);
21295        self.as_vec_mut().extend(value.to_ne_bytes());
21296        self
21297    }
21298    pub fn push_to_tmr(mut self, value: u32) -> Self {
21299        push_header(self.as_vec_mut(), 7u16, 4 as u16);
21300        self.as_vec_mut().extend(value.to_ne_bytes());
21301        self
21302    }
21303    pub fn push_burst_cnt(mut self, value: u32) -> Self {
21304        push_header(self.as_vec_mut(), 8u16, 4 as u16);
21305        self.as_vec_mut().extend(value.to_ne_bytes());
21306        self
21307    }
21308    pub fn push_burst_tmr(mut self, value: u32) -> Self {
21309        push_header(self.as_vec_mut(), 9u16, 4 as u16);
21310        self.as_vec_mut().extend(value.to_ne_bytes());
21311        self
21312    }
21313}
21314impl<Prev: Pusher> Drop for PushPlca<Prev> {
21315    fn drop(&mut self) {
21316        if let Some(prev) = &mut self.prev {
21317            if let Some(header_offset) = &self.header_offset {
21318                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21319            }
21320        }
21321    }
21322}
21323pub struct PushModuleFwFlash<Prev: Pusher> {
21324    pub(crate) prev: Option<Prev>,
21325    pub(crate) header_offset: Option<usize>,
21326}
21327impl<Prev: Pusher> Pusher for PushModuleFwFlash<Prev> {
21328    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21329        self.prev.as_mut().unwrap().as_vec_mut()
21330    }
21331    fn as_vec(&self) -> &Vec<u8> {
21332        self.prev.as_ref().unwrap().as_vec()
21333    }
21334}
21335impl<Prev: Pusher> PushModuleFwFlash<Prev> {
21336    pub fn new(prev: Prev) -> Self {
21337        Self {
21338            prev: Some(prev),
21339            header_offset: None,
21340        }
21341    }
21342    pub fn end_nested(mut self) -> Prev {
21343        let mut prev = self.prev.take().unwrap();
21344        if let Some(header_offset) = &self.header_offset {
21345            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21346        }
21347        prev
21348    }
21349    pub fn nested_header(mut self) -> PushHeader<Self> {
21350        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
21351        PushHeader {
21352            prev: Some(self),
21353            header_offset: Some(header_offset),
21354        }
21355    }
21356    pub fn push_file_name(mut self, value: &CStr) -> Self {
21357        push_header(
21358            self.as_vec_mut(),
21359            2u16,
21360            value.to_bytes_with_nul().len() as u16,
21361        );
21362        self.as_vec_mut().extend(value.to_bytes_with_nul());
21363        self
21364    }
21365    pub fn push_file_name_bytes(mut self, value: &[u8]) -> Self {
21366        push_header(self.as_vec_mut(), 2u16, (value.len() + 1) as u16);
21367        self.as_vec_mut().extend(value);
21368        self.as_vec_mut().push(0);
21369        self
21370    }
21371    pub fn push_password(mut self, value: u32) -> Self {
21372        push_header(self.as_vec_mut(), 3u16, 4 as u16);
21373        self.as_vec_mut().extend(value.to_ne_bytes());
21374        self
21375    }
21376    #[doc = "Associated type: [`ModuleFwFlashStatus`] (enum)"]
21377    pub fn push_status(mut self, value: u32) -> Self {
21378        push_header(self.as_vec_mut(), 4u16, 4 as u16);
21379        self.as_vec_mut().extend(value.to_ne_bytes());
21380        self
21381    }
21382    pub fn push_status_msg(mut self, value: &CStr) -> Self {
21383        push_header(
21384            self.as_vec_mut(),
21385            5u16,
21386            value.to_bytes_with_nul().len() as u16,
21387        );
21388        self.as_vec_mut().extend(value.to_bytes_with_nul());
21389        self
21390    }
21391    pub fn push_status_msg_bytes(mut self, value: &[u8]) -> Self {
21392        push_header(self.as_vec_mut(), 5u16, (value.len() + 1) as u16);
21393        self.as_vec_mut().extend(value);
21394        self.as_vec_mut().push(0);
21395        self
21396    }
21397    pub fn push_done(mut self, value: u32) -> Self {
21398        push_header(self.as_vec_mut(), 6u16, 4 as u16);
21399        self.as_vec_mut().extend(value.to_ne_bytes());
21400        self
21401    }
21402    pub fn push_total(mut self, value: u32) -> Self {
21403        push_header(self.as_vec_mut(), 7u16, 4 as u16);
21404        self.as_vec_mut().extend(value.to_ne_bytes());
21405        self
21406    }
21407}
21408impl<Prev: Pusher> Drop for PushModuleFwFlash<Prev> {
21409    fn drop(&mut self) {
21410        if let Some(prev) = &mut self.prev {
21411            if let Some(header_offset) = &self.header_offset {
21412                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21413            }
21414        }
21415    }
21416}
21417pub struct PushPhy<Prev: Pusher> {
21418    pub(crate) prev: Option<Prev>,
21419    pub(crate) header_offset: Option<usize>,
21420}
21421impl<Prev: Pusher> Pusher for PushPhy<Prev> {
21422    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21423        self.prev.as_mut().unwrap().as_vec_mut()
21424    }
21425    fn as_vec(&self) -> &Vec<u8> {
21426        self.prev.as_ref().unwrap().as_vec()
21427    }
21428}
21429impl<Prev: Pusher> PushPhy<Prev> {
21430    pub fn new(prev: Prev) -> Self {
21431        Self {
21432            prev: Some(prev),
21433            header_offset: None,
21434        }
21435    }
21436    pub fn end_nested(mut self) -> Prev {
21437        let mut prev = self.prev.take().unwrap();
21438        if let Some(header_offset) = &self.header_offset {
21439            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21440        }
21441        prev
21442    }
21443    pub fn nested_header(mut self) -> PushHeader<Self> {
21444        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
21445        PushHeader {
21446            prev: Some(self),
21447            header_offset: Some(header_offset),
21448        }
21449    }
21450    pub fn push_index(mut self, value: u32) -> Self {
21451        push_header(self.as_vec_mut(), 2u16, 4 as u16);
21452        self.as_vec_mut().extend(value.to_ne_bytes());
21453        self
21454    }
21455    pub fn push_drvname(mut self, value: &CStr) -> Self {
21456        push_header(
21457            self.as_vec_mut(),
21458            3u16,
21459            value.to_bytes_with_nul().len() as u16,
21460        );
21461        self.as_vec_mut().extend(value.to_bytes_with_nul());
21462        self
21463    }
21464    pub fn push_drvname_bytes(mut self, value: &[u8]) -> Self {
21465        push_header(self.as_vec_mut(), 3u16, (value.len() + 1) as u16);
21466        self.as_vec_mut().extend(value);
21467        self.as_vec_mut().push(0);
21468        self
21469    }
21470    pub fn push_name(mut self, value: &CStr) -> Self {
21471        push_header(
21472            self.as_vec_mut(),
21473            4u16,
21474            value.to_bytes_with_nul().len() as u16,
21475        );
21476        self.as_vec_mut().extend(value.to_bytes_with_nul());
21477        self
21478    }
21479    pub fn push_name_bytes(mut self, value: &[u8]) -> Self {
21480        push_header(self.as_vec_mut(), 4u16, (value.len() + 1) as u16);
21481        self.as_vec_mut().extend(value);
21482        self.as_vec_mut().push(0);
21483        self
21484    }
21485    #[doc = "Associated type: [`PhyUpstreamType`] (enum)"]
21486    pub fn push_upstream_type(mut self, value: u32) -> Self {
21487        push_header(self.as_vec_mut(), 5u16, 4 as u16);
21488        self.as_vec_mut().extend(value.to_ne_bytes());
21489        self
21490    }
21491    pub fn push_upstream_index(mut self, value: u32) -> Self {
21492        push_header(self.as_vec_mut(), 6u16, 4 as u16);
21493        self.as_vec_mut().extend(value.to_ne_bytes());
21494        self
21495    }
21496    pub fn push_upstream_sfp_name(mut self, value: &CStr) -> Self {
21497        push_header(
21498            self.as_vec_mut(),
21499            7u16,
21500            value.to_bytes_with_nul().len() as u16,
21501        );
21502        self.as_vec_mut().extend(value.to_bytes_with_nul());
21503        self
21504    }
21505    pub fn push_upstream_sfp_name_bytes(mut self, value: &[u8]) -> Self {
21506        push_header(self.as_vec_mut(), 7u16, (value.len() + 1) as u16);
21507        self.as_vec_mut().extend(value);
21508        self.as_vec_mut().push(0);
21509        self
21510    }
21511    pub fn push_downstream_sfp_name(mut self, value: &CStr) -> Self {
21512        push_header(
21513            self.as_vec_mut(),
21514            8u16,
21515            value.to_bytes_with_nul().len() as u16,
21516        );
21517        self.as_vec_mut().extend(value.to_bytes_with_nul());
21518        self
21519    }
21520    pub fn push_downstream_sfp_name_bytes(mut self, value: &[u8]) -> Self {
21521        push_header(self.as_vec_mut(), 8u16, (value.len() + 1) as u16);
21522        self.as_vec_mut().extend(value);
21523        self.as_vec_mut().push(0);
21524        self
21525    }
21526}
21527impl<Prev: Pusher> Drop for PushPhy<Prev> {
21528    fn drop(&mut self) {
21529        if let Some(prev) = &mut self.prev {
21530            if let Some(header_offset) = &self.header_offset {
21531                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21532            }
21533        }
21534    }
21535}
21536pub struct PushTsconfig<Prev: Pusher> {
21537    pub(crate) prev: Option<Prev>,
21538    pub(crate) header_offset: Option<usize>,
21539}
21540impl<Prev: Pusher> Pusher for PushTsconfig<Prev> {
21541    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21542        self.prev.as_mut().unwrap().as_vec_mut()
21543    }
21544    fn as_vec(&self) -> &Vec<u8> {
21545        self.prev.as_ref().unwrap().as_vec()
21546    }
21547}
21548impl<Prev: Pusher> PushTsconfig<Prev> {
21549    pub fn new(prev: Prev) -> Self {
21550        Self {
21551            prev: Some(prev),
21552            header_offset: None,
21553        }
21554    }
21555    pub fn end_nested(mut self) -> Prev {
21556        let mut prev = self.prev.take().unwrap();
21557        if let Some(header_offset) = &self.header_offset {
21558            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21559        }
21560        prev
21561    }
21562    pub fn nested_header(mut self) -> PushHeader<Self> {
21563        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
21564        PushHeader {
21565            prev: Some(self),
21566            header_offset: Some(header_offset),
21567        }
21568    }
21569    pub fn nested_hwtstamp_provider(mut self) -> PushTsHwtstampProvider<Self> {
21570        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
21571        PushTsHwtstampProvider {
21572            prev: Some(self),
21573            header_offset: Some(header_offset),
21574        }
21575    }
21576    pub fn nested_tx_types(mut self) -> PushBitset<Self> {
21577        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
21578        PushBitset {
21579            prev: Some(self),
21580            header_offset: Some(header_offset),
21581        }
21582    }
21583    pub fn nested_rx_filters(mut self) -> PushBitset<Self> {
21584        let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
21585        PushBitset {
21586            prev: Some(self),
21587            header_offset: Some(header_offset),
21588        }
21589    }
21590    pub fn nested_hwtstamp_flags(mut self) -> PushBitset<Self> {
21591        let header_offset = push_nested_header(self.as_vec_mut(), 5u16);
21592        PushBitset {
21593            prev: Some(self),
21594            header_offset: Some(header_offset),
21595        }
21596    }
21597}
21598impl<Prev: Pusher> Drop for PushTsconfig<Prev> {
21599    fn drop(&mut self) {
21600        if let Some(prev) = &mut self.prev {
21601            if let Some(header_offset) = &self.header_offset {
21602                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21603            }
21604        }
21605    }
21606}
21607pub struct PushPseNtf<Prev: Pusher> {
21608    pub(crate) prev: Option<Prev>,
21609    pub(crate) header_offset: Option<usize>,
21610}
21611impl<Prev: Pusher> Pusher for PushPseNtf<Prev> {
21612    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21613        self.prev.as_mut().unwrap().as_vec_mut()
21614    }
21615    fn as_vec(&self) -> &Vec<u8> {
21616        self.prev.as_ref().unwrap().as_vec()
21617    }
21618}
21619impl<Prev: Pusher> PushPseNtf<Prev> {
21620    pub fn new(prev: Prev) -> Self {
21621        Self {
21622            prev: Some(prev),
21623            header_offset: None,
21624        }
21625    }
21626    pub fn end_nested(mut self) -> Prev {
21627        let mut prev = self.prev.take().unwrap();
21628        if let Some(header_offset) = &self.header_offset {
21629            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21630        }
21631        prev
21632    }
21633    pub fn nested_header(mut self) -> PushHeader<Self> {
21634        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
21635        PushHeader {
21636            prev: Some(self),
21637            header_offset: Some(header_offset),
21638        }
21639    }
21640    #[doc = "List of events reported by the PSE controller\n\nAssociated type: [`PseEvent`] (enum)"]
21641    pub fn push_events(mut self, value: u32) -> Self {
21642        push_header(self.as_vec_mut(), 2u16, 4 as u16);
21643        self.as_vec_mut().extend(value.to_ne_bytes());
21644        self
21645    }
21646}
21647impl<Prev: Pusher> Drop for PushPseNtf<Prev> {
21648    fn drop(&mut self) {
21649        if let Some(prev) = &mut self.prev {
21650            if let Some(header_offset) = &self.header_offset {
21651                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21652            }
21653        }
21654    }
21655}
21656pub struct PushMseCapabilities<Prev: Pusher> {
21657    pub(crate) prev: Option<Prev>,
21658    pub(crate) header_offset: Option<usize>,
21659}
21660impl<Prev: Pusher> Pusher for PushMseCapabilities<Prev> {
21661    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21662        self.prev.as_mut().unwrap().as_vec_mut()
21663    }
21664    fn as_vec(&self) -> &Vec<u8> {
21665        self.prev.as_ref().unwrap().as_vec()
21666    }
21667}
21668impl<Prev: Pusher> PushMseCapabilities<Prev> {
21669    pub fn new(prev: Prev) -> Self {
21670        Self {
21671            prev: Some(prev),
21672            header_offset: None,
21673        }
21674    }
21675    pub fn end_nested(mut self) -> Prev {
21676        let mut prev = self.prev.take().unwrap();
21677        if let Some(header_offset) = &self.header_offset {
21678            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21679        }
21680        prev
21681    }
21682    pub fn push_max_average_mse(mut self, value: u32) -> Self {
21683        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21684        self.as_vec_mut().extend(value.to_ne_bytes());
21685        self
21686    }
21687    pub fn push_max_peak_mse(mut self, value: u32) -> Self {
21688        push_header(self.as_vec_mut(), 2u16, 4 as u16);
21689        self.as_vec_mut().extend(value.to_ne_bytes());
21690        self
21691    }
21692    pub fn push_refresh_rate_ps(mut self, value: u32) -> Self {
21693        push_header(self.as_vec_mut(), 3u16, 4 as u16);
21694        self.as_vec_mut().extend(value.to_ne_bytes());
21695        self
21696    }
21697    pub fn push_num_symbols(mut self, value: u32) -> Self {
21698        push_header(self.as_vec_mut(), 4u16, 4 as u16);
21699        self.as_vec_mut().extend(value.to_ne_bytes());
21700        self
21701    }
21702}
21703impl<Prev: Pusher> Drop for PushMseCapabilities<Prev> {
21704    fn drop(&mut self) {
21705        if let Some(prev) = &mut self.prev {
21706            if let Some(header_offset) = &self.header_offset {
21707                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21708            }
21709        }
21710    }
21711}
21712pub struct PushMseSnapshot<Prev: Pusher> {
21713    pub(crate) prev: Option<Prev>,
21714    pub(crate) header_offset: Option<usize>,
21715}
21716impl<Prev: Pusher> Pusher for PushMseSnapshot<Prev> {
21717    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21718        self.prev.as_mut().unwrap().as_vec_mut()
21719    }
21720    fn as_vec(&self) -> &Vec<u8> {
21721        self.prev.as_ref().unwrap().as_vec()
21722    }
21723}
21724impl<Prev: Pusher> PushMseSnapshot<Prev> {
21725    pub fn new(prev: Prev) -> Self {
21726        Self {
21727            prev: Some(prev),
21728            header_offset: None,
21729        }
21730    }
21731    pub fn end_nested(mut self) -> Prev {
21732        let mut prev = self.prev.take().unwrap();
21733        if let Some(header_offset) = &self.header_offset {
21734            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21735        }
21736        prev
21737    }
21738    pub fn push_average_mse(mut self, value: u32) -> Self {
21739        push_header(self.as_vec_mut(), 1u16, 4 as u16);
21740        self.as_vec_mut().extend(value.to_ne_bytes());
21741        self
21742    }
21743    pub fn push_peak_mse(mut self, value: u32) -> Self {
21744        push_header(self.as_vec_mut(), 2u16, 4 as u16);
21745        self.as_vec_mut().extend(value.to_ne_bytes());
21746        self
21747    }
21748    pub fn push_worst_peak_mse(mut self, value: u32) -> Self {
21749        push_header(self.as_vec_mut(), 3u16, 4 as u16);
21750        self.as_vec_mut().extend(value.to_ne_bytes());
21751        self
21752    }
21753}
21754impl<Prev: Pusher> Drop for PushMseSnapshot<Prev> {
21755    fn drop(&mut self) {
21756        if let Some(prev) = &mut self.prev {
21757            if let Some(header_offset) = &self.header_offset {
21758                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21759            }
21760        }
21761    }
21762}
21763pub struct PushMse<Prev: Pusher> {
21764    pub(crate) prev: Option<Prev>,
21765    pub(crate) header_offset: Option<usize>,
21766}
21767impl<Prev: Pusher> Pusher for PushMse<Prev> {
21768    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21769        self.prev.as_mut().unwrap().as_vec_mut()
21770    }
21771    fn as_vec(&self) -> &Vec<u8> {
21772        self.prev.as_ref().unwrap().as_vec()
21773    }
21774}
21775impl<Prev: Pusher> PushMse<Prev> {
21776    pub fn new(prev: Prev) -> Self {
21777        Self {
21778            prev: Some(prev),
21779            header_offset: None,
21780        }
21781    }
21782    pub fn end_nested(mut self) -> Prev {
21783        let mut prev = self.prev.take().unwrap();
21784        if let Some(header_offset) = &self.header_offset {
21785            finalize_nested_header(prev.as_vec_mut(), *header_offset);
21786        }
21787        prev
21788    }
21789    pub fn nested_header(mut self) -> PushHeader<Self> {
21790        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
21791        PushHeader {
21792            prev: Some(self),
21793            header_offset: Some(header_offset),
21794        }
21795    }
21796    pub fn nested_capabilities(mut self) -> PushMseCapabilities<Self> {
21797        let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
21798        PushMseCapabilities {
21799            prev: Some(self),
21800            header_offset: Some(header_offset),
21801        }
21802    }
21803    pub fn nested_channel_a(mut self) -> PushMseSnapshot<Self> {
21804        let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
21805        PushMseSnapshot {
21806            prev: Some(self),
21807            header_offset: Some(header_offset),
21808        }
21809    }
21810    pub fn nested_channel_b(mut self) -> PushMseSnapshot<Self> {
21811        let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
21812        PushMseSnapshot {
21813            prev: Some(self),
21814            header_offset: Some(header_offset),
21815        }
21816    }
21817    pub fn nested_channel_c(mut self) -> PushMseSnapshot<Self> {
21818        let header_offset = push_nested_header(self.as_vec_mut(), 5u16);
21819        PushMseSnapshot {
21820            prev: Some(self),
21821            header_offset: Some(header_offset),
21822        }
21823    }
21824    pub fn nested_channel_d(mut self) -> PushMseSnapshot<Self> {
21825        let header_offset = push_nested_header(self.as_vec_mut(), 6u16);
21826        PushMseSnapshot {
21827            prev: Some(self),
21828            header_offset: Some(header_offset),
21829        }
21830    }
21831    pub fn nested_worst_channel(mut self) -> PushMseSnapshot<Self> {
21832        let header_offset = push_nested_header(self.as_vec_mut(), 7u16);
21833        PushMseSnapshot {
21834            prev: Some(self),
21835            header_offset: Some(header_offset),
21836        }
21837    }
21838    pub fn nested_link(mut self) -> PushMseSnapshot<Self> {
21839        let header_offset = push_nested_header(self.as_vec_mut(), 8u16);
21840        PushMseSnapshot {
21841            prev: Some(self),
21842            header_offset: Some(header_offset),
21843        }
21844    }
21845}
21846impl<Prev: Pusher> Drop for PushMse<Prev> {
21847    fn drop(&mut self) {
21848        if let Some(prev) = &mut self.prev {
21849            if let Some(header_offset) = &self.header_offset {
21850                finalize_nested_header(prev.as_vec_mut(), *header_offset);
21851            }
21852        }
21853    }
21854}
21855pub struct NotifGroup;
21856impl NotifGroup {
21857    pub const MONITOR: &str = "monitor";
21858    pub const MONITOR_CSTR: &CStr = c"monitor";
21859}
21860#[doc = "Get string set from the kernel.\n\nRequest attributes:\n- [.nested_header()](PushStrset::nested_header)\n- [.nested_stringsets()](PushStrset::nested_stringsets)\n- [.push_counts_only()](PushStrset::push_counts_only)\n\nReply attributes:\n- [.get_header()](IterableStrset::get_header)\n- [.get_stringsets()](IterableStrset::get_stringsets)\n\n"]
21861#[derive(Debug)]
21862pub struct OpStrsetGetDump<'r> {
21863    request: Request<'r>,
21864}
21865impl<'r> OpStrsetGetDump<'r> {
21866    pub fn new(mut request: Request<'r>) -> Self {
21867        Self::write_header(request.buf_mut());
21868        Self {
21869            request: request.set_dump(),
21870        }
21871    }
21872    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushStrset<&'buf mut Vec<u8>> {
21873        Self::write_header(buf);
21874        PushStrset::new(buf)
21875    }
21876    pub fn encode(&mut self) -> PushStrset<&mut Vec<u8>> {
21877        PushStrset::new(self.request.buf_mut())
21878    }
21879    pub fn into_encoder(self) -> PushStrset<RequestBuf<'r>> {
21880        PushStrset::new(self.request.buf)
21881    }
21882    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableStrset<'a> {
21883        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
21884        IterableStrset::with_loc(attrs, buf.as_ptr() as usize)
21885    }
21886    fn write_header<Prev: Pusher>(prev: &mut Prev) {
21887        let mut header = BuiltinNfgenmsg::new();
21888        header.cmd = 1u8;
21889        header.version = 1u8;
21890        prev.as_vec_mut().extend(header.as_slice());
21891    }
21892}
21893impl NetlinkRequest for OpStrsetGetDump<'_> {
21894    fn protocol(&self) -> Protocol {
21895        Protocol::Generic("ethtool".as_bytes())
21896    }
21897    fn flags(&self) -> u16 {
21898        self.request.flags
21899    }
21900    fn payload(&self) -> &[u8] {
21901        self.request.buf()
21902    }
21903    type ReplyType<'buf> = IterableStrset<'buf>;
21904    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
21905        Self::decode_request(buf)
21906    }
21907    fn lookup(
21908        buf: &[u8],
21909        offset: usize,
21910        missing_type: Option<u16>,
21911    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
21912        Self::decode_request(buf).lookup_attr(offset, missing_type)
21913    }
21914}
21915#[doc = "Get string set from the kernel.\n\nRequest attributes:\n- [.nested_header()](PushStrset::nested_header)\n- [.nested_stringsets()](PushStrset::nested_stringsets)\n- [.push_counts_only()](PushStrset::push_counts_only)\n\nReply attributes:\n- [.get_header()](IterableStrset::get_header)\n- [.get_stringsets()](IterableStrset::get_stringsets)\n\n"]
21916#[derive(Debug)]
21917pub struct OpStrsetGetDo<'r> {
21918    request: Request<'r>,
21919}
21920impl<'r> OpStrsetGetDo<'r> {
21921    pub fn new(mut request: Request<'r>) -> Self {
21922        Self::write_header(request.buf_mut());
21923        Self { request: request }
21924    }
21925    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushStrset<&'buf mut Vec<u8>> {
21926        Self::write_header(buf);
21927        PushStrset::new(buf)
21928    }
21929    pub fn encode(&mut self) -> PushStrset<&mut Vec<u8>> {
21930        PushStrset::new(self.request.buf_mut())
21931    }
21932    pub fn into_encoder(self) -> PushStrset<RequestBuf<'r>> {
21933        PushStrset::new(self.request.buf)
21934    }
21935    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableStrset<'a> {
21936        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
21937        IterableStrset::with_loc(attrs, buf.as_ptr() as usize)
21938    }
21939    fn write_header<Prev: Pusher>(prev: &mut Prev) {
21940        let mut header = BuiltinNfgenmsg::new();
21941        header.cmd = 1u8;
21942        header.version = 1u8;
21943        prev.as_vec_mut().extend(header.as_slice());
21944    }
21945}
21946impl NetlinkRequest for OpStrsetGetDo<'_> {
21947    fn protocol(&self) -> Protocol {
21948        Protocol::Generic("ethtool".as_bytes())
21949    }
21950    fn flags(&self) -> u16 {
21951        self.request.flags
21952    }
21953    fn payload(&self) -> &[u8] {
21954        self.request.buf()
21955    }
21956    type ReplyType<'buf> = IterableStrset<'buf>;
21957    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
21958        Self::decode_request(buf)
21959    }
21960    fn lookup(
21961        buf: &[u8],
21962        offset: usize,
21963        missing_type: Option<u16>,
21964    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
21965        Self::decode_request(buf).lookup_attr(offset, missing_type)
21966    }
21967}
21968#[doc = "Get link info.\n\nRequest attributes:\n- [.nested_header()](PushLinkinfo::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkinfo::get_header)\n- [.get_port()](IterableLinkinfo::get_port)\n- [.get_phyaddr()](IterableLinkinfo::get_phyaddr)\n- [.get_tp_mdix()](IterableLinkinfo::get_tp_mdix)\n- [.get_tp_mdix_ctrl()](IterableLinkinfo::get_tp_mdix_ctrl)\n- [.get_transceiver()](IterableLinkinfo::get_transceiver)\n\n"]
21969#[derive(Debug)]
21970pub struct OpLinkinfoGetDump<'r> {
21971    request: Request<'r>,
21972}
21973impl<'r> OpLinkinfoGetDump<'r> {
21974    pub fn new(mut request: Request<'r>) -> Self {
21975        Self::write_header(request.buf_mut());
21976        Self {
21977            request: request.set_dump(),
21978        }
21979    }
21980    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushLinkinfo<&'buf mut Vec<u8>> {
21981        Self::write_header(buf);
21982        PushLinkinfo::new(buf)
21983    }
21984    pub fn encode(&mut self) -> PushLinkinfo<&mut Vec<u8>> {
21985        PushLinkinfo::new(self.request.buf_mut())
21986    }
21987    pub fn into_encoder(self) -> PushLinkinfo<RequestBuf<'r>> {
21988        PushLinkinfo::new(self.request.buf)
21989    }
21990    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableLinkinfo<'a> {
21991        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
21992        IterableLinkinfo::with_loc(attrs, buf.as_ptr() as usize)
21993    }
21994    fn write_header<Prev: Pusher>(prev: &mut Prev) {
21995        let mut header = BuiltinNfgenmsg::new();
21996        header.cmd = 2u8;
21997        header.version = 1u8;
21998        prev.as_vec_mut().extend(header.as_slice());
21999    }
22000}
22001impl NetlinkRequest for OpLinkinfoGetDump<'_> {
22002    fn protocol(&self) -> Protocol {
22003        Protocol::Generic("ethtool".as_bytes())
22004    }
22005    fn flags(&self) -> u16 {
22006        self.request.flags
22007    }
22008    fn payload(&self) -> &[u8] {
22009        self.request.buf()
22010    }
22011    type ReplyType<'buf> = IterableLinkinfo<'buf>;
22012    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22013        Self::decode_request(buf)
22014    }
22015    fn lookup(
22016        buf: &[u8],
22017        offset: usize,
22018        missing_type: Option<u16>,
22019    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22020        Self::decode_request(buf).lookup_attr(offset, missing_type)
22021    }
22022}
22023#[doc = "Get link info.\n\nRequest attributes:\n- [.nested_header()](PushLinkinfo::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkinfo::get_header)\n- [.get_port()](IterableLinkinfo::get_port)\n- [.get_phyaddr()](IterableLinkinfo::get_phyaddr)\n- [.get_tp_mdix()](IterableLinkinfo::get_tp_mdix)\n- [.get_tp_mdix_ctrl()](IterableLinkinfo::get_tp_mdix_ctrl)\n- [.get_transceiver()](IterableLinkinfo::get_transceiver)\n\n"]
22024#[derive(Debug)]
22025pub struct OpLinkinfoGetDo<'r> {
22026    request: Request<'r>,
22027}
22028impl<'r> OpLinkinfoGetDo<'r> {
22029    pub fn new(mut request: Request<'r>) -> Self {
22030        Self::write_header(request.buf_mut());
22031        Self { request: request }
22032    }
22033    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushLinkinfo<&'buf mut Vec<u8>> {
22034        Self::write_header(buf);
22035        PushLinkinfo::new(buf)
22036    }
22037    pub fn encode(&mut self) -> PushLinkinfo<&mut Vec<u8>> {
22038        PushLinkinfo::new(self.request.buf_mut())
22039    }
22040    pub fn into_encoder(self) -> PushLinkinfo<RequestBuf<'r>> {
22041        PushLinkinfo::new(self.request.buf)
22042    }
22043    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableLinkinfo<'a> {
22044        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22045        IterableLinkinfo::with_loc(attrs, buf.as_ptr() as usize)
22046    }
22047    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22048        let mut header = BuiltinNfgenmsg::new();
22049        header.cmd = 2u8;
22050        header.version = 1u8;
22051        prev.as_vec_mut().extend(header.as_slice());
22052    }
22053}
22054impl NetlinkRequest for OpLinkinfoGetDo<'_> {
22055    fn protocol(&self) -> Protocol {
22056        Protocol::Generic("ethtool".as_bytes())
22057    }
22058    fn flags(&self) -> u16 {
22059        self.request.flags
22060    }
22061    fn payload(&self) -> &[u8] {
22062        self.request.buf()
22063    }
22064    type ReplyType<'buf> = IterableLinkinfo<'buf>;
22065    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22066        Self::decode_request(buf)
22067    }
22068    fn lookup(
22069        buf: &[u8],
22070        offset: usize,
22071        missing_type: Option<u16>,
22072    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22073        Self::decode_request(buf).lookup_attr(offset, missing_type)
22074    }
22075}
22076#[doc = "Set link info.\n\nRequest attributes:\n- [.nested_header()](PushLinkinfo::nested_header)\n- [.push_port()](PushLinkinfo::push_port)\n- [.push_phyaddr()](PushLinkinfo::push_phyaddr)\n- [.push_tp_mdix()](PushLinkinfo::push_tp_mdix)\n- [.push_tp_mdix_ctrl()](PushLinkinfo::push_tp_mdix_ctrl)\n- [.push_transceiver()](PushLinkinfo::push_transceiver)\n\n"]
22077#[derive(Debug)]
22078pub struct OpLinkinfoSetDo<'r> {
22079    request: Request<'r>,
22080}
22081impl<'r> OpLinkinfoSetDo<'r> {
22082    pub fn new(mut request: Request<'r>) -> Self {
22083        Self::write_header(request.buf_mut());
22084        Self { request: request }
22085    }
22086    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushLinkinfo<&'buf mut Vec<u8>> {
22087        Self::write_header(buf);
22088        PushLinkinfo::new(buf)
22089    }
22090    pub fn encode(&mut self) -> PushLinkinfo<&mut Vec<u8>> {
22091        PushLinkinfo::new(self.request.buf_mut())
22092    }
22093    pub fn into_encoder(self) -> PushLinkinfo<RequestBuf<'r>> {
22094        PushLinkinfo::new(self.request.buf)
22095    }
22096    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableLinkinfo<'a> {
22097        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22098        IterableLinkinfo::with_loc(attrs, buf.as_ptr() as usize)
22099    }
22100    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22101        let mut header = BuiltinNfgenmsg::new();
22102        header.cmd = 3u8;
22103        header.version = 1u8;
22104        prev.as_vec_mut().extend(header.as_slice());
22105    }
22106}
22107impl NetlinkRequest for OpLinkinfoSetDo<'_> {
22108    fn protocol(&self) -> Protocol {
22109        Protocol::Generic("ethtool".as_bytes())
22110    }
22111    fn flags(&self) -> u16 {
22112        self.request.flags
22113    }
22114    fn payload(&self) -> &[u8] {
22115        self.request.buf()
22116    }
22117    type ReplyType<'buf> = IterableLinkinfo<'buf>;
22118    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22119        Self::decode_request(buf)
22120    }
22121    fn lookup(
22122        buf: &[u8],
22123        offset: usize,
22124        missing_type: Option<u16>,
22125    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22126        Self::decode_request(buf).lookup_attr(offset, missing_type)
22127    }
22128}
22129#[doc = "Get link modes.\n\nRequest attributes:\n- [.nested_header()](PushLinkmodes::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkmodes::get_header)\n- [.get_autoneg()](IterableLinkmodes::get_autoneg)\n- [.get_ours()](IterableLinkmodes::get_ours)\n- [.get_peer()](IterableLinkmodes::get_peer)\n- [.get_speed()](IterableLinkmodes::get_speed)\n- [.get_duplex()](IterableLinkmodes::get_duplex)\n- [.get_master_slave_cfg()](IterableLinkmodes::get_master_slave_cfg)\n- [.get_master_slave_state()](IterableLinkmodes::get_master_slave_state)\n- [.get_lanes()](IterableLinkmodes::get_lanes)\n- [.get_rate_matching()](IterableLinkmodes::get_rate_matching)\n\n"]
22130#[derive(Debug)]
22131pub struct OpLinkmodesGetDump<'r> {
22132    request: Request<'r>,
22133}
22134impl<'r> OpLinkmodesGetDump<'r> {
22135    pub fn new(mut request: Request<'r>) -> Self {
22136        Self::write_header(request.buf_mut());
22137        Self {
22138            request: request.set_dump(),
22139        }
22140    }
22141    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushLinkmodes<&'buf mut Vec<u8>> {
22142        Self::write_header(buf);
22143        PushLinkmodes::new(buf)
22144    }
22145    pub fn encode(&mut self) -> PushLinkmodes<&mut Vec<u8>> {
22146        PushLinkmodes::new(self.request.buf_mut())
22147    }
22148    pub fn into_encoder(self) -> PushLinkmodes<RequestBuf<'r>> {
22149        PushLinkmodes::new(self.request.buf)
22150    }
22151    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableLinkmodes<'a> {
22152        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22153        IterableLinkmodes::with_loc(attrs, buf.as_ptr() as usize)
22154    }
22155    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22156        let mut header = BuiltinNfgenmsg::new();
22157        header.cmd = 5u8;
22158        header.version = 1u8;
22159        prev.as_vec_mut().extend(header.as_slice());
22160    }
22161}
22162impl NetlinkRequest for OpLinkmodesGetDump<'_> {
22163    fn protocol(&self) -> Protocol {
22164        Protocol::Generic("ethtool".as_bytes())
22165    }
22166    fn flags(&self) -> u16 {
22167        self.request.flags
22168    }
22169    fn payload(&self) -> &[u8] {
22170        self.request.buf()
22171    }
22172    type ReplyType<'buf> = IterableLinkmodes<'buf>;
22173    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22174        Self::decode_request(buf)
22175    }
22176    fn lookup(
22177        buf: &[u8],
22178        offset: usize,
22179        missing_type: Option<u16>,
22180    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22181        Self::decode_request(buf).lookup_attr(offset, missing_type)
22182    }
22183}
22184#[doc = "Get link modes.\n\nRequest attributes:\n- [.nested_header()](PushLinkmodes::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkmodes::get_header)\n- [.get_autoneg()](IterableLinkmodes::get_autoneg)\n- [.get_ours()](IterableLinkmodes::get_ours)\n- [.get_peer()](IterableLinkmodes::get_peer)\n- [.get_speed()](IterableLinkmodes::get_speed)\n- [.get_duplex()](IterableLinkmodes::get_duplex)\n- [.get_master_slave_cfg()](IterableLinkmodes::get_master_slave_cfg)\n- [.get_master_slave_state()](IterableLinkmodes::get_master_slave_state)\n- [.get_lanes()](IterableLinkmodes::get_lanes)\n- [.get_rate_matching()](IterableLinkmodes::get_rate_matching)\n\n"]
22185#[derive(Debug)]
22186pub struct OpLinkmodesGetDo<'r> {
22187    request: Request<'r>,
22188}
22189impl<'r> OpLinkmodesGetDo<'r> {
22190    pub fn new(mut request: Request<'r>) -> Self {
22191        Self::write_header(request.buf_mut());
22192        Self { request: request }
22193    }
22194    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushLinkmodes<&'buf mut Vec<u8>> {
22195        Self::write_header(buf);
22196        PushLinkmodes::new(buf)
22197    }
22198    pub fn encode(&mut self) -> PushLinkmodes<&mut Vec<u8>> {
22199        PushLinkmodes::new(self.request.buf_mut())
22200    }
22201    pub fn into_encoder(self) -> PushLinkmodes<RequestBuf<'r>> {
22202        PushLinkmodes::new(self.request.buf)
22203    }
22204    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableLinkmodes<'a> {
22205        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22206        IterableLinkmodes::with_loc(attrs, buf.as_ptr() as usize)
22207    }
22208    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22209        let mut header = BuiltinNfgenmsg::new();
22210        header.cmd = 5u8;
22211        header.version = 1u8;
22212        prev.as_vec_mut().extend(header.as_slice());
22213    }
22214}
22215impl NetlinkRequest for OpLinkmodesGetDo<'_> {
22216    fn protocol(&self) -> Protocol {
22217        Protocol::Generic("ethtool".as_bytes())
22218    }
22219    fn flags(&self) -> u16 {
22220        self.request.flags
22221    }
22222    fn payload(&self) -> &[u8] {
22223        self.request.buf()
22224    }
22225    type ReplyType<'buf> = IterableLinkmodes<'buf>;
22226    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22227        Self::decode_request(buf)
22228    }
22229    fn lookup(
22230        buf: &[u8],
22231        offset: usize,
22232        missing_type: Option<u16>,
22233    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22234        Self::decode_request(buf).lookup_attr(offset, missing_type)
22235    }
22236}
22237#[doc = "Set link modes.\n\nRequest attributes:\n- [.nested_header()](PushLinkmodes::nested_header)\n- [.push_autoneg()](PushLinkmodes::push_autoneg)\n- [.nested_ours()](PushLinkmodes::nested_ours)\n- [.nested_peer()](PushLinkmodes::nested_peer)\n- [.push_speed()](PushLinkmodes::push_speed)\n- [.push_duplex()](PushLinkmodes::push_duplex)\n- [.push_master_slave_cfg()](PushLinkmodes::push_master_slave_cfg)\n- [.push_master_slave_state()](PushLinkmodes::push_master_slave_state)\n- [.push_lanes()](PushLinkmodes::push_lanes)\n- [.push_rate_matching()](PushLinkmodes::push_rate_matching)\n\n"]
22238#[derive(Debug)]
22239pub struct OpLinkmodesSetDo<'r> {
22240    request: Request<'r>,
22241}
22242impl<'r> OpLinkmodesSetDo<'r> {
22243    pub fn new(mut request: Request<'r>) -> Self {
22244        Self::write_header(request.buf_mut());
22245        Self { request: request }
22246    }
22247    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushLinkmodes<&'buf mut Vec<u8>> {
22248        Self::write_header(buf);
22249        PushLinkmodes::new(buf)
22250    }
22251    pub fn encode(&mut self) -> PushLinkmodes<&mut Vec<u8>> {
22252        PushLinkmodes::new(self.request.buf_mut())
22253    }
22254    pub fn into_encoder(self) -> PushLinkmodes<RequestBuf<'r>> {
22255        PushLinkmodes::new(self.request.buf)
22256    }
22257    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableLinkmodes<'a> {
22258        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22259        IterableLinkmodes::with_loc(attrs, buf.as_ptr() as usize)
22260    }
22261    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22262        let mut header = BuiltinNfgenmsg::new();
22263        header.cmd = 6u8;
22264        header.version = 1u8;
22265        prev.as_vec_mut().extend(header.as_slice());
22266    }
22267}
22268impl NetlinkRequest for OpLinkmodesSetDo<'_> {
22269    fn protocol(&self) -> Protocol {
22270        Protocol::Generic("ethtool".as_bytes())
22271    }
22272    fn flags(&self) -> u16 {
22273        self.request.flags
22274    }
22275    fn payload(&self) -> &[u8] {
22276        self.request.buf()
22277    }
22278    type ReplyType<'buf> = IterableLinkmodes<'buf>;
22279    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22280        Self::decode_request(buf)
22281    }
22282    fn lookup(
22283        buf: &[u8],
22284        offset: usize,
22285        missing_type: Option<u16>,
22286    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22287        Self::decode_request(buf).lookup_attr(offset, missing_type)
22288    }
22289}
22290#[doc = "Get link state.\n\nRequest attributes:\n- [.nested_header()](PushLinkstate::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkstate::get_header)\n- [.get_link()](IterableLinkstate::get_link)\n- [.get_sqi()](IterableLinkstate::get_sqi)\n- [.get_sqi_max()](IterableLinkstate::get_sqi_max)\n- [.get_ext_state()](IterableLinkstate::get_ext_state)\n- [.get_ext_substate()](IterableLinkstate::get_ext_substate)\n- [.get_ext_down_cnt()](IterableLinkstate::get_ext_down_cnt)\n\n"]
22291#[derive(Debug)]
22292pub struct OpLinkstateGetDump<'r> {
22293    request: Request<'r>,
22294}
22295impl<'r> OpLinkstateGetDump<'r> {
22296    pub fn new(mut request: Request<'r>) -> Self {
22297        Self::write_header(request.buf_mut());
22298        Self {
22299            request: request.set_dump(),
22300        }
22301    }
22302    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushLinkstate<&'buf mut Vec<u8>> {
22303        Self::write_header(buf);
22304        PushLinkstate::new(buf)
22305    }
22306    pub fn encode(&mut self) -> PushLinkstate<&mut Vec<u8>> {
22307        PushLinkstate::new(self.request.buf_mut())
22308    }
22309    pub fn into_encoder(self) -> PushLinkstate<RequestBuf<'r>> {
22310        PushLinkstate::new(self.request.buf)
22311    }
22312    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableLinkstate<'a> {
22313        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22314        IterableLinkstate::with_loc(attrs, buf.as_ptr() as usize)
22315    }
22316    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22317        let mut header = BuiltinNfgenmsg::new();
22318        header.cmd = 8u8;
22319        header.version = 1u8;
22320        prev.as_vec_mut().extend(header.as_slice());
22321    }
22322}
22323impl NetlinkRequest for OpLinkstateGetDump<'_> {
22324    fn protocol(&self) -> Protocol {
22325        Protocol::Generic("ethtool".as_bytes())
22326    }
22327    fn flags(&self) -> u16 {
22328        self.request.flags
22329    }
22330    fn payload(&self) -> &[u8] {
22331        self.request.buf()
22332    }
22333    type ReplyType<'buf> = IterableLinkstate<'buf>;
22334    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22335        Self::decode_request(buf)
22336    }
22337    fn lookup(
22338        buf: &[u8],
22339        offset: usize,
22340        missing_type: Option<u16>,
22341    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22342        Self::decode_request(buf).lookup_attr(offset, missing_type)
22343    }
22344}
22345#[doc = "Get link state.\n\nRequest attributes:\n- [.nested_header()](PushLinkstate::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkstate::get_header)\n- [.get_link()](IterableLinkstate::get_link)\n- [.get_sqi()](IterableLinkstate::get_sqi)\n- [.get_sqi_max()](IterableLinkstate::get_sqi_max)\n- [.get_ext_state()](IterableLinkstate::get_ext_state)\n- [.get_ext_substate()](IterableLinkstate::get_ext_substate)\n- [.get_ext_down_cnt()](IterableLinkstate::get_ext_down_cnt)\n\n"]
22346#[derive(Debug)]
22347pub struct OpLinkstateGetDo<'r> {
22348    request: Request<'r>,
22349}
22350impl<'r> OpLinkstateGetDo<'r> {
22351    pub fn new(mut request: Request<'r>) -> Self {
22352        Self::write_header(request.buf_mut());
22353        Self { request: request }
22354    }
22355    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushLinkstate<&'buf mut Vec<u8>> {
22356        Self::write_header(buf);
22357        PushLinkstate::new(buf)
22358    }
22359    pub fn encode(&mut self) -> PushLinkstate<&mut Vec<u8>> {
22360        PushLinkstate::new(self.request.buf_mut())
22361    }
22362    pub fn into_encoder(self) -> PushLinkstate<RequestBuf<'r>> {
22363        PushLinkstate::new(self.request.buf)
22364    }
22365    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableLinkstate<'a> {
22366        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22367        IterableLinkstate::with_loc(attrs, buf.as_ptr() as usize)
22368    }
22369    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22370        let mut header = BuiltinNfgenmsg::new();
22371        header.cmd = 8u8;
22372        header.version = 1u8;
22373        prev.as_vec_mut().extend(header.as_slice());
22374    }
22375}
22376impl NetlinkRequest for OpLinkstateGetDo<'_> {
22377    fn protocol(&self) -> Protocol {
22378        Protocol::Generic("ethtool".as_bytes())
22379    }
22380    fn flags(&self) -> u16 {
22381        self.request.flags
22382    }
22383    fn payload(&self) -> &[u8] {
22384        self.request.buf()
22385    }
22386    type ReplyType<'buf> = IterableLinkstate<'buf>;
22387    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22388        Self::decode_request(buf)
22389    }
22390    fn lookup(
22391        buf: &[u8],
22392        offset: usize,
22393        missing_type: Option<u16>,
22394    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22395        Self::decode_request(buf).lookup_attr(offset, missing_type)
22396    }
22397}
22398#[doc = "Get debug message mask.\n\nRequest attributes:\n- [.nested_header()](PushDebug::nested_header)\n\nReply attributes:\n- [.get_header()](IterableDebug::get_header)\n- [.get_msgmask()](IterableDebug::get_msgmask)\n\n"]
22399#[derive(Debug)]
22400pub struct OpDebugGetDump<'r> {
22401    request: Request<'r>,
22402}
22403impl<'r> OpDebugGetDump<'r> {
22404    pub fn new(mut request: Request<'r>) -> Self {
22405        Self::write_header(request.buf_mut());
22406        Self {
22407            request: request.set_dump(),
22408        }
22409    }
22410    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDebug<&'buf mut Vec<u8>> {
22411        Self::write_header(buf);
22412        PushDebug::new(buf)
22413    }
22414    pub fn encode(&mut self) -> PushDebug<&mut Vec<u8>> {
22415        PushDebug::new(self.request.buf_mut())
22416    }
22417    pub fn into_encoder(self) -> PushDebug<RequestBuf<'r>> {
22418        PushDebug::new(self.request.buf)
22419    }
22420    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDebug<'a> {
22421        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22422        IterableDebug::with_loc(attrs, buf.as_ptr() as usize)
22423    }
22424    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22425        let mut header = BuiltinNfgenmsg::new();
22426        header.cmd = 9u8;
22427        header.version = 1u8;
22428        prev.as_vec_mut().extend(header.as_slice());
22429    }
22430}
22431impl NetlinkRequest for OpDebugGetDump<'_> {
22432    fn protocol(&self) -> Protocol {
22433        Protocol::Generic("ethtool".as_bytes())
22434    }
22435    fn flags(&self) -> u16 {
22436        self.request.flags
22437    }
22438    fn payload(&self) -> &[u8] {
22439        self.request.buf()
22440    }
22441    type ReplyType<'buf> = IterableDebug<'buf>;
22442    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22443        Self::decode_request(buf)
22444    }
22445    fn lookup(
22446        buf: &[u8],
22447        offset: usize,
22448        missing_type: Option<u16>,
22449    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22450        Self::decode_request(buf).lookup_attr(offset, missing_type)
22451    }
22452}
22453#[doc = "Get debug message mask.\n\nRequest attributes:\n- [.nested_header()](PushDebug::nested_header)\n\nReply attributes:\n- [.get_header()](IterableDebug::get_header)\n- [.get_msgmask()](IterableDebug::get_msgmask)\n\n"]
22454#[derive(Debug)]
22455pub struct OpDebugGetDo<'r> {
22456    request: Request<'r>,
22457}
22458impl<'r> OpDebugGetDo<'r> {
22459    pub fn new(mut request: Request<'r>) -> Self {
22460        Self::write_header(request.buf_mut());
22461        Self { request: request }
22462    }
22463    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDebug<&'buf mut Vec<u8>> {
22464        Self::write_header(buf);
22465        PushDebug::new(buf)
22466    }
22467    pub fn encode(&mut self) -> PushDebug<&mut Vec<u8>> {
22468        PushDebug::new(self.request.buf_mut())
22469    }
22470    pub fn into_encoder(self) -> PushDebug<RequestBuf<'r>> {
22471        PushDebug::new(self.request.buf)
22472    }
22473    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDebug<'a> {
22474        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22475        IterableDebug::with_loc(attrs, buf.as_ptr() as usize)
22476    }
22477    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22478        let mut header = BuiltinNfgenmsg::new();
22479        header.cmd = 9u8;
22480        header.version = 1u8;
22481        prev.as_vec_mut().extend(header.as_slice());
22482    }
22483}
22484impl NetlinkRequest for OpDebugGetDo<'_> {
22485    fn protocol(&self) -> Protocol {
22486        Protocol::Generic("ethtool".as_bytes())
22487    }
22488    fn flags(&self) -> u16 {
22489        self.request.flags
22490    }
22491    fn payload(&self) -> &[u8] {
22492        self.request.buf()
22493    }
22494    type ReplyType<'buf> = IterableDebug<'buf>;
22495    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22496        Self::decode_request(buf)
22497    }
22498    fn lookup(
22499        buf: &[u8],
22500        offset: usize,
22501        missing_type: Option<u16>,
22502    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22503        Self::decode_request(buf).lookup_attr(offset, missing_type)
22504    }
22505}
22506#[doc = "Set debug message mask.\n\nRequest attributes:\n- [.nested_header()](PushDebug::nested_header)\n- [.nested_msgmask()](PushDebug::nested_msgmask)\n\n"]
22507#[derive(Debug)]
22508pub struct OpDebugSetDo<'r> {
22509    request: Request<'r>,
22510}
22511impl<'r> OpDebugSetDo<'r> {
22512    pub fn new(mut request: Request<'r>) -> Self {
22513        Self::write_header(request.buf_mut());
22514        Self { request: request }
22515    }
22516    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDebug<&'buf mut Vec<u8>> {
22517        Self::write_header(buf);
22518        PushDebug::new(buf)
22519    }
22520    pub fn encode(&mut self) -> PushDebug<&mut Vec<u8>> {
22521        PushDebug::new(self.request.buf_mut())
22522    }
22523    pub fn into_encoder(self) -> PushDebug<RequestBuf<'r>> {
22524        PushDebug::new(self.request.buf)
22525    }
22526    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDebug<'a> {
22527        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22528        IterableDebug::with_loc(attrs, buf.as_ptr() as usize)
22529    }
22530    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22531        let mut header = BuiltinNfgenmsg::new();
22532        header.cmd = 10u8;
22533        header.version = 1u8;
22534        prev.as_vec_mut().extend(header.as_slice());
22535    }
22536}
22537impl NetlinkRequest for OpDebugSetDo<'_> {
22538    fn protocol(&self) -> Protocol {
22539        Protocol::Generic("ethtool".as_bytes())
22540    }
22541    fn flags(&self) -> u16 {
22542        self.request.flags
22543    }
22544    fn payload(&self) -> &[u8] {
22545        self.request.buf()
22546    }
22547    type ReplyType<'buf> = IterableDebug<'buf>;
22548    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22549        Self::decode_request(buf)
22550    }
22551    fn lookup(
22552        buf: &[u8],
22553        offset: usize,
22554        missing_type: Option<u16>,
22555    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22556        Self::decode_request(buf).lookup_attr(offset, missing_type)
22557    }
22558}
22559#[doc = "Get WOL params.\n\nRequest attributes:\n- [.nested_header()](PushWol::nested_header)\n\nReply attributes:\n- [.get_header()](IterableWol::get_header)\n- [.get_modes()](IterableWol::get_modes)\n- [.get_sopass()](IterableWol::get_sopass)\n\n"]
22560#[derive(Debug)]
22561pub struct OpWolGetDump<'r> {
22562    request: Request<'r>,
22563}
22564impl<'r> OpWolGetDump<'r> {
22565    pub fn new(mut request: Request<'r>) -> Self {
22566        Self::write_header(request.buf_mut());
22567        Self {
22568            request: request.set_dump(),
22569        }
22570    }
22571    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushWol<&'buf mut Vec<u8>> {
22572        Self::write_header(buf);
22573        PushWol::new(buf)
22574    }
22575    pub fn encode(&mut self) -> PushWol<&mut Vec<u8>> {
22576        PushWol::new(self.request.buf_mut())
22577    }
22578    pub fn into_encoder(self) -> PushWol<RequestBuf<'r>> {
22579        PushWol::new(self.request.buf)
22580    }
22581    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableWol<'a> {
22582        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22583        IterableWol::with_loc(attrs, buf.as_ptr() as usize)
22584    }
22585    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22586        let mut header = BuiltinNfgenmsg::new();
22587        header.cmd = 12u8;
22588        header.version = 1u8;
22589        prev.as_vec_mut().extend(header.as_slice());
22590    }
22591}
22592impl NetlinkRequest for OpWolGetDump<'_> {
22593    fn protocol(&self) -> Protocol {
22594        Protocol::Generic("ethtool".as_bytes())
22595    }
22596    fn flags(&self) -> u16 {
22597        self.request.flags
22598    }
22599    fn payload(&self) -> &[u8] {
22600        self.request.buf()
22601    }
22602    type ReplyType<'buf> = IterableWol<'buf>;
22603    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22604        Self::decode_request(buf)
22605    }
22606    fn lookup(
22607        buf: &[u8],
22608        offset: usize,
22609        missing_type: Option<u16>,
22610    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22611        Self::decode_request(buf).lookup_attr(offset, missing_type)
22612    }
22613}
22614#[doc = "Get WOL params.\n\nRequest attributes:\n- [.nested_header()](PushWol::nested_header)\n\nReply attributes:\n- [.get_header()](IterableWol::get_header)\n- [.get_modes()](IterableWol::get_modes)\n- [.get_sopass()](IterableWol::get_sopass)\n\n"]
22615#[derive(Debug)]
22616pub struct OpWolGetDo<'r> {
22617    request: Request<'r>,
22618}
22619impl<'r> OpWolGetDo<'r> {
22620    pub fn new(mut request: Request<'r>) -> Self {
22621        Self::write_header(request.buf_mut());
22622        Self { request: request }
22623    }
22624    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushWol<&'buf mut Vec<u8>> {
22625        Self::write_header(buf);
22626        PushWol::new(buf)
22627    }
22628    pub fn encode(&mut self) -> PushWol<&mut Vec<u8>> {
22629        PushWol::new(self.request.buf_mut())
22630    }
22631    pub fn into_encoder(self) -> PushWol<RequestBuf<'r>> {
22632        PushWol::new(self.request.buf)
22633    }
22634    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableWol<'a> {
22635        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22636        IterableWol::with_loc(attrs, buf.as_ptr() as usize)
22637    }
22638    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22639        let mut header = BuiltinNfgenmsg::new();
22640        header.cmd = 12u8;
22641        header.version = 1u8;
22642        prev.as_vec_mut().extend(header.as_slice());
22643    }
22644}
22645impl NetlinkRequest for OpWolGetDo<'_> {
22646    fn protocol(&self) -> Protocol {
22647        Protocol::Generic("ethtool".as_bytes())
22648    }
22649    fn flags(&self) -> u16 {
22650        self.request.flags
22651    }
22652    fn payload(&self) -> &[u8] {
22653        self.request.buf()
22654    }
22655    type ReplyType<'buf> = IterableWol<'buf>;
22656    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22657        Self::decode_request(buf)
22658    }
22659    fn lookup(
22660        buf: &[u8],
22661        offset: usize,
22662        missing_type: Option<u16>,
22663    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22664        Self::decode_request(buf).lookup_attr(offset, missing_type)
22665    }
22666}
22667#[doc = "Set WOL params.\n\nRequest attributes:\n- [.nested_header()](PushWol::nested_header)\n- [.nested_modes()](PushWol::nested_modes)\n- [.push_sopass()](PushWol::push_sopass)\n\n"]
22668#[derive(Debug)]
22669pub struct OpWolSetDo<'r> {
22670    request: Request<'r>,
22671}
22672impl<'r> OpWolSetDo<'r> {
22673    pub fn new(mut request: Request<'r>) -> Self {
22674        Self::write_header(request.buf_mut());
22675        Self { request: request }
22676    }
22677    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushWol<&'buf mut Vec<u8>> {
22678        Self::write_header(buf);
22679        PushWol::new(buf)
22680    }
22681    pub fn encode(&mut self) -> PushWol<&mut Vec<u8>> {
22682        PushWol::new(self.request.buf_mut())
22683    }
22684    pub fn into_encoder(self) -> PushWol<RequestBuf<'r>> {
22685        PushWol::new(self.request.buf)
22686    }
22687    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableWol<'a> {
22688        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22689        IterableWol::with_loc(attrs, buf.as_ptr() as usize)
22690    }
22691    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22692        let mut header = BuiltinNfgenmsg::new();
22693        header.cmd = 13u8;
22694        header.version = 1u8;
22695        prev.as_vec_mut().extend(header.as_slice());
22696    }
22697}
22698impl NetlinkRequest for OpWolSetDo<'_> {
22699    fn protocol(&self) -> Protocol {
22700        Protocol::Generic("ethtool".as_bytes())
22701    }
22702    fn flags(&self) -> u16 {
22703        self.request.flags
22704    }
22705    fn payload(&self) -> &[u8] {
22706        self.request.buf()
22707    }
22708    type ReplyType<'buf> = IterableWol<'buf>;
22709    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22710        Self::decode_request(buf)
22711    }
22712    fn lookup(
22713        buf: &[u8],
22714        offset: usize,
22715        missing_type: Option<u16>,
22716    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22717        Self::decode_request(buf).lookup_attr(offset, missing_type)
22718    }
22719}
22720#[doc = "Get features.\n\nRequest attributes:\n- [.nested_header()](PushFeatures::nested_header)\n\nReply attributes:\n- [.get_header()](IterableFeatures::get_header)\n- [.get_hw()](IterableFeatures::get_hw)\n- [.get_wanted()](IterableFeatures::get_wanted)\n- [.get_active()](IterableFeatures::get_active)\n- [.get_nochange()](IterableFeatures::get_nochange)\n\n"]
22721#[derive(Debug)]
22722pub struct OpFeaturesGetDump<'r> {
22723    request: Request<'r>,
22724}
22725impl<'r> OpFeaturesGetDump<'r> {
22726    pub fn new(mut request: Request<'r>) -> Self {
22727        Self::write_header(request.buf_mut());
22728        Self {
22729            request: request.set_dump(),
22730        }
22731    }
22732    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushFeatures<&'buf mut Vec<u8>> {
22733        Self::write_header(buf);
22734        PushFeatures::new(buf)
22735    }
22736    pub fn encode(&mut self) -> PushFeatures<&mut Vec<u8>> {
22737        PushFeatures::new(self.request.buf_mut())
22738    }
22739    pub fn into_encoder(self) -> PushFeatures<RequestBuf<'r>> {
22740        PushFeatures::new(self.request.buf)
22741    }
22742    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableFeatures<'a> {
22743        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22744        IterableFeatures::with_loc(attrs, buf.as_ptr() as usize)
22745    }
22746    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22747        let mut header = BuiltinNfgenmsg::new();
22748        header.cmd = 15u8;
22749        header.version = 1u8;
22750        prev.as_vec_mut().extend(header.as_slice());
22751    }
22752}
22753impl NetlinkRequest for OpFeaturesGetDump<'_> {
22754    fn protocol(&self) -> Protocol {
22755        Protocol::Generic("ethtool".as_bytes())
22756    }
22757    fn flags(&self) -> u16 {
22758        self.request.flags
22759    }
22760    fn payload(&self) -> &[u8] {
22761        self.request.buf()
22762    }
22763    type ReplyType<'buf> = IterableFeatures<'buf>;
22764    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22765        Self::decode_request(buf)
22766    }
22767    fn lookup(
22768        buf: &[u8],
22769        offset: usize,
22770        missing_type: Option<u16>,
22771    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22772        Self::decode_request(buf).lookup_attr(offset, missing_type)
22773    }
22774}
22775#[doc = "Get features.\n\nRequest attributes:\n- [.nested_header()](PushFeatures::nested_header)\n\nReply attributes:\n- [.get_header()](IterableFeatures::get_header)\n- [.get_hw()](IterableFeatures::get_hw)\n- [.get_wanted()](IterableFeatures::get_wanted)\n- [.get_active()](IterableFeatures::get_active)\n- [.get_nochange()](IterableFeatures::get_nochange)\n\n"]
22776#[derive(Debug)]
22777pub struct OpFeaturesGetDo<'r> {
22778    request: Request<'r>,
22779}
22780impl<'r> OpFeaturesGetDo<'r> {
22781    pub fn new(mut request: Request<'r>) -> Self {
22782        Self::write_header(request.buf_mut());
22783        Self { request: request }
22784    }
22785    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushFeatures<&'buf mut Vec<u8>> {
22786        Self::write_header(buf);
22787        PushFeatures::new(buf)
22788    }
22789    pub fn encode(&mut self) -> PushFeatures<&mut Vec<u8>> {
22790        PushFeatures::new(self.request.buf_mut())
22791    }
22792    pub fn into_encoder(self) -> PushFeatures<RequestBuf<'r>> {
22793        PushFeatures::new(self.request.buf)
22794    }
22795    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableFeatures<'a> {
22796        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22797        IterableFeatures::with_loc(attrs, buf.as_ptr() as usize)
22798    }
22799    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22800        let mut header = BuiltinNfgenmsg::new();
22801        header.cmd = 15u8;
22802        header.version = 1u8;
22803        prev.as_vec_mut().extend(header.as_slice());
22804    }
22805}
22806impl NetlinkRequest for OpFeaturesGetDo<'_> {
22807    fn protocol(&self) -> Protocol {
22808        Protocol::Generic("ethtool".as_bytes())
22809    }
22810    fn flags(&self) -> u16 {
22811        self.request.flags
22812    }
22813    fn payload(&self) -> &[u8] {
22814        self.request.buf()
22815    }
22816    type ReplyType<'buf> = IterableFeatures<'buf>;
22817    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22818        Self::decode_request(buf)
22819    }
22820    fn lookup(
22821        buf: &[u8],
22822        offset: usize,
22823        missing_type: Option<u16>,
22824    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22825        Self::decode_request(buf).lookup_attr(offset, missing_type)
22826    }
22827}
22828#[doc = "Set features.\n\nRequest attributes:\n- [.nested_header()](PushFeatures::nested_header)\n- [.nested_hw()](PushFeatures::nested_hw)\n- [.nested_wanted()](PushFeatures::nested_wanted)\n- [.nested_active()](PushFeatures::nested_active)\n- [.nested_nochange()](PushFeatures::nested_nochange)\n\nReply attributes:\n- [.get_header()](IterableFeatures::get_header)\n- [.get_hw()](IterableFeatures::get_hw)\n- [.get_wanted()](IterableFeatures::get_wanted)\n- [.get_active()](IterableFeatures::get_active)\n- [.get_nochange()](IterableFeatures::get_nochange)\n\n"]
22829#[derive(Debug)]
22830pub struct OpFeaturesSetDo<'r> {
22831    request: Request<'r>,
22832}
22833impl<'r> OpFeaturesSetDo<'r> {
22834    pub fn new(mut request: Request<'r>) -> Self {
22835        Self::write_header(request.buf_mut());
22836        Self { request: request }
22837    }
22838    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushFeatures<&'buf mut Vec<u8>> {
22839        Self::write_header(buf);
22840        PushFeatures::new(buf)
22841    }
22842    pub fn encode(&mut self) -> PushFeatures<&mut Vec<u8>> {
22843        PushFeatures::new(self.request.buf_mut())
22844    }
22845    pub fn into_encoder(self) -> PushFeatures<RequestBuf<'r>> {
22846        PushFeatures::new(self.request.buf)
22847    }
22848    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableFeatures<'a> {
22849        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22850        IterableFeatures::with_loc(attrs, buf.as_ptr() as usize)
22851    }
22852    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22853        let mut header = BuiltinNfgenmsg::new();
22854        header.cmd = 16u8;
22855        header.version = 1u8;
22856        prev.as_vec_mut().extend(header.as_slice());
22857    }
22858}
22859impl NetlinkRequest for OpFeaturesSetDo<'_> {
22860    fn protocol(&self) -> Protocol {
22861        Protocol::Generic("ethtool".as_bytes())
22862    }
22863    fn flags(&self) -> u16 {
22864        self.request.flags
22865    }
22866    fn payload(&self) -> &[u8] {
22867        self.request.buf()
22868    }
22869    type ReplyType<'buf> = IterableFeatures<'buf>;
22870    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22871        Self::decode_request(buf)
22872    }
22873    fn lookup(
22874        buf: &[u8],
22875        offset: usize,
22876        missing_type: Option<u16>,
22877    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22878        Self::decode_request(buf).lookup_attr(offset, missing_type)
22879    }
22880}
22881#[doc = "Get device private flags.\n\nRequest attributes:\n- [.nested_header()](PushPrivflags::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePrivflags::get_header)\n- [.get_flags()](IterablePrivflags::get_flags)\n\n"]
22882#[derive(Debug)]
22883pub struct OpPrivflagsGetDump<'r> {
22884    request: Request<'r>,
22885}
22886impl<'r> OpPrivflagsGetDump<'r> {
22887    pub fn new(mut request: Request<'r>) -> Self {
22888        Self::write_header(request.buf_mut());
22889        Self {
22890            request: request.set_dump(),
22891        }
22892    }
22893    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPrivflags<&'buf mut Vec<u8>> {
22894        Self::write_header(buf);
22895        PushPrivflags::new(buf)
22896    }
22897    pub fn encode(&mut self) -> PushPrivflags<&mut Vec<u8>> {
22898        PushPrivflags::new(self.request.buf_mut())
22899    }
22900    pub fn into_encoder(self) -> PushPrivflags<RequestBuf<'r>> {
22901        PushPrivflags::new(self.request.buf)
22902    }
22903    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePrivflags<'a> {
22904        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22905        IterablePrivflags::with_loc(attrs, buf.as_ptr() as usize)
22906    }
22907    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22908        let mut header = BuiltinNfgenmsg::new();
22909        header.cmd = 18u8;
22910        header.version = 1u8;
22911        prev.as_vec_mut().extend(header.as_slice());
22912    }
22913}
22914impl NetlinkRequest for OpPrivflagsGetDump<'_> {
22915    fn protocol(&self) -> Protocol {
22916        Protocol::Generic("ethtool".as_bytes())
22917    }
22918    fn flags(&self) -> u16 {
22919        self.request.flags
22920    }
22921    fn payload(&self) -> &[u8] {
22922        self.request.buf()
22923    }
22924    type ReplyType<'buf> = IterablePrivflags<'buf>;
22925    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22926        Self::decode_request(buf)
22927    }
22928    fn lookup(
22929        buf: &[u8],
22930        offset: usize,
22931        missing_type: Option<u16>,
22932    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22933        Self::decode_request(buf).lookup_attr(offset, missing_type)
22934    }
22935}
22936#[doc = "Get device private flags.\n\nRequest attributes:\n- [.nested_header()](PushPrivflags::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePrivflags::get_header)\n- [.get_flags()](IterablePrivflags::get_flags)\n\n"]
22937#[derive(Debug)]
22938pub struct OpPrivflagsGetDo<'r> {
22939    request: Request<'r>,
22940}
22941impl<'r> OpPrivflagsGetDo<'r> {
22942    pub fn new(mut request: Request<'r>) -> Self {
22943        Self::write_header(request.buf_mut());
22944        Self { request: request }
22945    }
22946    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPrivflags<&'buf mut Vec<u8>> {
22947        Self::write_header(buf);
22948        PushPrivflags::new(buf)
22949    }
22950    pub fn encode(&mut self) -> PushPrivflags<&mut Vec<u8>> {
22951        PushPrivflags::new(self.request.buf_mut())
22952    }
22953    pub fn into_encoder(self) -> PushPrivflags<RequestBuf<'r>> {
22954        PushPrivflags::new(self.request.buf)
22955    }
22956    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePrivflags<'a> {
22957        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
22958        IterablePrivflags::with_loc(attrs, buf.as_ptr() as usize)
22959    }
22960    fn write_header<Prev: Pusher>(prev: &mut Prev) {
22961        let mut header = BuiltinNfgenmsg::new();
22962        header.cmd = 18u8;
22963        header.version = 1u8;
22964        prev.as_vec_mut().extend(header.as_slice());
22965    }
22966}
22967impl NetlinkRequest for OpPrivflagsGetDo<'_> {
22968    fn protocol(&self) -> Protocol {
22969        Protocol::Generic("ethtool".as_bytes())
22970    }
22971    fn flags(&self) -> u16 {
22972        self.request.flags
22973    }
22974    fn payload(&self) -> &[u8] {
22975        self.request.buf()
22976    }
22977    type ReplyType<'buf> = IterablePrivflags<'buf>;
22978    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22979        Self::decode_request(buf)
22980    }
22981    fn lookup(
22982        buf: &[u8],
22983        offset: usize,
22984        missing_type: Option<u16>,
22985    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22986        Self::decode_request(buf).lookup_attr(offset, missing_type)
22987    }
22988}
22989#[doc = "Set device private flags.\n\nRequest attributes:\n- [.nested_header()](PushPrivflags::nested_header)\n- [.nested_flags()](PushPrivflags::nested_flags)\n\n"]
22990#[derive(Debug)]
22991pub struct OpPrivflagsSetDo<'r> {
22992    request: Request<'r>,
22993}
22994impl<'r> OpPrivflagsSetDo<'r> {
22995    pub fn new(mut request: Request<'r>) -> Self {
22996        Self::write_header(request.buf_mut());
22997        Self { request: request }
22998    }
22999    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPrivflags<&'buf mut Vec<u8>> {
23000        Self::write_header(buf);
23001        PushPrivflags::new(buf)
23002    }
23003    pub fn encode(&mut self) -> PushPrivflags<&mut Vec<u8>> {
23004        PushPrivflags::new(self.request.buf_mut())
23005    }
23006    pub fn into_encoder(self) -> PushPrivflags<RequestBuf<'r>> {
23007        PushPrivflags::new(self.request.buf)
23008    }
23009    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePrivflags<'a> {
23010        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23011        IterablePrivflags::with_loc(attrs, buf.as_ptr() as usize)
23012    }
23013    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23014        let mut header = BuiltinNfgenmsg::new();
23015        header.cmd = 19u8;
23016        header.version = 1u8;
23017        prev.as_vec_mut().extend(header.as_slice());
23018    }
23019}
23020impl NetlinkRequest for OpPrivflagsSetDo<'_> {
23021    fn protocol(&self) -> Protocol {
23022        Protocol::Generic("ethtool".as_bytes())
23023    }
23024    fn flags(&self) -> u16 {
23025        self.request.flags
23026    }
23027    fn payload(&self) -> &[u8] {
23028        self.request.buf()
23029    }
23030    type ReplyType<'buf> = IterablePrivflags<'buf>;
23031    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23032        Self::decode_request(buf)
23033    }
23034    fn lookup(
23035        buf: &[u8],
23036        offset: usize,
23037        missing_type: Option<u16>,
23038    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23039        Self::decode_request(buf).lookup_attr(offset, missing_type)
23040    }
23041}
23042#[doc = "Get ring params.\n\nRequest attributes:\n- [.nested_header()](PushRings::nested_header)\n\nReply attributes:\n- [.get_header()](IterableRings::get_header)\n- [.get_rx_max()](IterableRings::get_rx_max)\n- [.get_rx_mini_max()](IterableRings::get_rx_mini_max)\n- [.get_rx_jumbo_max()](IterableRings::get_rx_jumbo_max)\n- [.get_tx_max()](IterableRings::get_tx_max)\n- [.get_rx()](IterableRings::get_rx)\n- [.get_rx_mini()](IterableRings::get_rx_mini)\n- [.get_rx_jumbo()](IterableRings::get_rx_jumbo)\n- [.get_tx()](IterableRings::get_tx)\n- [.get_rx_buf_len()](IterableRings::get_rx_buf_len)\n- [.get_tcp_data_split()](IterableRings::get_tcp_data_split)\n- [.get_cqe_size()](IterableRings::get_cqe_size)\n- [.get_tx_push()](IterableRings::get_tx_push)\n- [.get_rx_push()](IterableRings::get_rx_push)\n- [.get_tx_push_buf_len()](IterableRings::get_tx_push_buf_len)\n- [.get_tx_push_buf_len_max()](IterableRings::get_tx_push_buf_len_max)\n- [.get_hds_thresh()](IterableRings::get_hds_thresh)\n- [.get_hds_thresh_max()](IterableRings::get_hds_thresh_max)\n\n"]
23043#[derive(Debug)]
23044pub struct OpRingsGetDump<'r> {
23045    request: Request<'r>,
23046}
23047impl<'r> OpRingsGetDump<'r> {
23048    pub fn new(mut request: Request<'r>) -> Self {
23049        Self::write_header(request.buf_mut());
23050        Self {
23051            request: request.set_dump(),
23052        }
23053    }
23054    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushRings<&'buf mut Vec<u8>> {
23055        Self::write_header(buf);
23056        PushRings::new(buf)
23057    }
23058    pub fn encode(&mut self) -> PushRings<&mut Vec<u8>> {
23059        PushRings::new(self.request.buf_mut())
23060    }
23061    pub fn into_encoder(self) -> PushRings<RequestBuf<'r>> {
23062        PushRings::new(self.request.buf)
23063    }
23064    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableRings<'a> {
23065        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23066        IterableRings::with_loc(attrs, buf.as_ptr() as usize)
23067    }
23068    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23069        let mut header = BuiltinNfgenmsg::new();
23070        header.cmd = 21u8;
23071        header.version = 1u8;
23072        prev.as_vec_mut().extend(header.as_slice());
23073    }
23074}
23075impl NetlinkRequest for OpRingsGetDump<'_> {
23076    fn protocol(&self) -> Protocol {
23077        Protocol::Generic("ethtool".as_bytes())
23078    }
23079    fn flags(&self) -> u16 {
23080        self.request.flags
23081    }
23082    fn payload(&self) -> &[u8] {
23083        self.request.buf()
23084    }
23085    type ReplyType<'buf> = IterableRings<'buf>;
23086    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23087        Self::decode_request(buf)
23088    }
23089    fn lookup(
23090        buf: &[u8],
23091        offset: usize,
23092        missing_type: Option<u16>,
23093    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23094        Self::decode_request(buf).lookup_attr(offset, missing_type)
23095    }
23096}
23097#[doc = "Get ring params.\n\nRequest attributes:\n- [.nested_header()](PushRings::nested_header)\n\nReply attributes:\n- [.get_header()](IterableRings::get_header)\n- [.get_rx_max()](IterableRings::get_rx_max)\n- [.get_rx_mini_max()](IterableRings::get_rx_mini_max)\n- [.get_rx_jumbo_max()](IterableRings::get_rx_jumbo_max)\n- [.get_tx_max()](IterableRings::get_tx_max)\n- [.get_rx()](IterableRings::get_rx)\n- [.get_rx_mini()](IterableRings::get_rx_mini)\n- [.get_rx_jumbo()](IterableRings::get_rx_jumbo)\n- [.get_tx()](IterableRings::get_tx)\n- [.get_rx_buf_len()](IterableRings::get_rx_buf_len)\n- [.get_tcp_data_split()](IterableRings::get_tcp_data_split)\n- [.get_cqe_size()](IterableRings::get_cqe_size)\n- [.get_tx_push()](IterableRings::get_tx_push)\n- [.get_rx_push()](IterableRings::get_rx_push)\n- [.get_tx_push_buf_len()](IterableRings::get_tx_push_buf_len)\n- [.get_tx_push_buf_len_max()](IterableRings::get_tx_push_buf_len_max)\n- [.get_hds_thresh()](IterableRings::get_hds_thresh)\n- [.get_hds_thresh_max()](IterableRings::get_hds_thresh_max)\n\n"]
23098#[derive(Debug)]
23099pub struct OpRingsGetDo<'r> {
23100    request: Request<'r>,
23101}
23102impl<'r> OpRingsGetDo<'r> {
23103    pub fn new(mut request: Request<'r>) -> Self {
23104        Self::write_header(request.buf_mut());
23105        Self { request: request }
23106    }
23107    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushRings<&'buf mut Vec<u8>> {
23108        Self::write_header(buf);
23109        PushRings::new(buf)
23110    }
23111    pub fn encode(&mut self) -> PushRings<&mut Vec<u8>> {
23112        PushRings::new(self.request.buf_mut())
23113    }
23114    pub fn into_encoder(self) -> PushRings<RequestBuf<'r>> {
23115        PushRings::new(self.request.buf)
23116    }
23117    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableRings<'a> {
23118        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23119        IterableRings::with_loc(attrs, buf.as_ptr() as usize)
23120    }
23121    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23122        let mut header = BuiltinNfgenmsg::new();
23123        header.cmd = 21u8;
23124        header.version = 1u8;
23125        prev.as_vec_mut().extend(header.as_slice());
23126    }
23127}
23128impl NetlinkRequest for OpRingsGetDo<'_> {
23129    fn protocol(&self) -> Protocol {
23130        Protocol::Generic("ethtool".as_bytes())
23131    }
23132    fn flags(&self) -> u16 {
23133        self.request.flags
23134    }
23135    fn payload(&self) -> &[u8] {
23136        self.request.buf()
23137    }
23138    type ReplyType<'buf> = IterableRings<'buf>;
23139    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23140        Self::decode_request(buf)
23141    }
23142    fn lookup(
23143        buf: &[u8],
23144        offset: usize,
23145        missing_type: Option<u16>,
23146    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23147        Self::decode_request(buf).lookup_attr(offset, missing_type)
23148    }
23149}
23150#[doc = "Set ring params.\n\nRequest attributes:\n- [.nested_header()](PushRings::nested_header)\n- [.push_rx_max()](PushRings::push_rx_max)\n- [.push_rx_mini_max()](PushRings::push_rx_mini_max)\n- [.push_rx_jumbo_max()](PushRings::push_rx_jumbo_max)\n- [.push_tx_max()](PushRings::push_tx_max)\n- [.push_rx()](PushRings::push_rx)\n- [.push_rx_mini()](PushRings::push_rx_mini)\n- [.push_rx_jumbo()](PushRings::push_rx_jumbo)\n- [.push_tx()](PushRings::push_tx)\n- [.push_rx_buf_len()](PushRings::push_rx_buf_len)\n- [.push_tcp_data_split()](PushRings::push_tcp_data_split)\n- [.push_cqe_size()](PushRings::push_cqe_size)\n- [.push_tx_push()](PushRings::push_tx_push)\n- [.push_rx_push()](PushRings::push_rx_push)\n- [.push_tx_push_buf_len()](PushRings::push_tx_push_buf_len)\n- [.push_tx_push_buf_len_max()](PushRings::push_tx_push_buf_len_max)\n- [.push_hds_thresh()](PushRings::push_hds_thresh)\n- [.push_hds_thresh_max()](PushRings::push_hds_thresh_max)\n\n"]
23151#[derive(Debug)]
23152pub struct OpRingsSetDo<'r> {
23153    request: Request<'r>,
23154}
23155impl<'r> OpRingsSetDo<'r> {
23156    pub fn new(mut request: Request<'r>) -> Self {
23157        Self::write_header(request.buf_mut());
23158        Self { request: request }
23159    }
23160    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushRings<&'buf mut Vec<u8>> {
23161        Self::write_header(buf);
23162        PushRings::new(buf)
23163    }
23164    pub fn encode(&mut self) -> PushRings<&mut Vec<u8>> {
23165        PushRings::new(self.request.buf_mut())
23166    }
23167    pub fn into_encoder(self) -> PushRings<RequestBuf<'r>> {
23168        PushRings::new(self.request.buf)
23169    }
23170    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableRings<'a> {
23171        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23172        IterableRings::with_loc(attrs, buf.as_ptr() as usize)
23173    }
23174    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23175        let mut header = BuiltinNfgenmsg::new();
23176        header.cmd = 22u8;
23177        header.version = 1u8;
23178        prev.as_vec_mut().extend(header.as_slice());
23179    }
23180}
23181impl NetlinkRequest for OpRingsSetDo<'_> {
23182    fn protocol(&self) -> Protocol {
23183        Protocol::Generic("ethtool".as_bytes())
23184    }
23185    fn flags(&self) -> u16 {
23186        self.request.flags
23187    }
23188    fn payload(&self) -> &[u8] {
23189        self.request.buf()
23190    }
23191    type ReplyType<'buf> = IterableRings<'buf>;
23192    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23193        Self::decode_request(buf)
23194    }
23195    fn lookup(
23196        buf: &[u8],
23197        offset: usize,
23198        missing_type: Option<u16>,
23199    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23200        Self::decode_request(buf).lookup_attr(offset, missing_type)
23201    }
23202}
23203#[doc = "Get channel params.\n\nRequest attributes:\n- [.nested_header()](PushChannels::nested_header)\n\nReply attributes:\n- [.get_header()](IterableChannels::get_header)\n- [.get_rx_max()](IterableChannels::get_rx_max)\n- [.get_tx_max()](IterableChannels::get_tx_max)\n- [.get_other_max()](IterableChannels::get_other_max)\n- [.get_combined_max()](IterableChannels::get_combined_max)\n- [.get_rx_count()](IterableChannels::get_rx_count)\n- [.get_tx_count()](IterableChannels::get_tx_count)\n- [.get_other_count()](IterableChannels::get_other_count)\n- [.get_combined_count()](IterableChannels::get_combined_count)\n\n"]
23204#[derive(Debug)]
23205pub struct OpChannelsGetDump<'r> {
23206    request: Request<'r>,
23207}
23208impl<'r> OpChannelsGetDump<'r> {
23209    pub fn new(mut request: Request<'r>) -> Self {
23210        Self::write_header(request.buf_mut());
23211        Self {
23212            request: request.set_dump(),
23213        }
23214    }
23215    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushChannels<&'buf mut Vec<u8>> {
23216        Self::write_header(buf);
23217        PushChannels::new(buf)
23218    }
23219    pub fn encode(&mut self) -> PushChannels<&mut Vec<u8>> {
23220        PushChannels::new(self.request.buf_mut())
23221    }
23222    pub fn into_encoder(self) -> PushChannels<RequestBuf<'r>> {
23223        PushChannels::new(self.request.buf)
23224    }
23225    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableChannels<'a> {
23226        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23227        IterableChannels::with_loc(attrs, buf.as_ptr() as usize)
23228    }
23229    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23230        let mut header = BuiltinNfgenmsg::new();
23231        header.cmd = 24u8;
23232        header.version = 1u8;
23233        prev.as_vec_mut().extend(header.as_slice());
23234    }
23235}
23236impl NetlinkRequest for OpChannelsGetDump<'_> {
23237    fn protocol(&self) -> Protocol {
23238        Protocol::Generic("ethtool".as_bytes())
23239    }
23240    fn flags(&self) -> u16 {
23241        self.request.flags
23242    }
23243    fn payload(&self) -> &[u8] {
23244        self.request.buf()
23245    }
23246    type ReplyType<'buf> = IterableChannels<'buf>;
23247    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23248        Self::decode_request(buf)
23249    }
23250    fn lookup(
23251        buf: &[u8],
23252        offset: usize,
23253        missing_type: Option<u16>,
23254    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23255        Self::decode_request(buf).lookup_attr(offset, missing_type)
23256    }
23257}
23258#[doc = "Get channel params.\n\nRequest attributes:\n- [.nested_header()](PushChannels::nested_header)\n\nReply attributes:\n- [.get_header()](IterableChannels::get_header)\n- [.get_rx_max()](IterableChannels::get_rx_max)\n- [.get_tx_max()](IterableChannels::get_tx_max)\n- [.get_other_max()](IterableChannels::get_other_max)\n- [.get_combined_max()](IterableChannels::get_combined_max)\n- [.get_rx_count()](IterableChannels::get_rx_count)\n- [.get_tx_count()](IterableChannels::get_tx_count)\n- [.get_other_count()](IterableChannels::get_other_count)\n- [.get_combined_count()](IterableChannels::get_combined_count)\n\n"]
23259#[derive(Debug)]
23260pub struct OpChannelsGetDo<'r> {
23261    request: Request<'r>,
23262}
23263impl<'r> OpChannelsGetDo<'r> {
23264    pub fn new(mut request: Request<'r>) -> Self {
23265        Self::write_header(request.buf_mut());
23266        Self { request: request }
23267    }
23268    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushChannels<&'buf mut Vec<u8>> {
23269        Self::write_header(buf);
23270        PushChannels::new(buf)
23271    }
23272    pub fn encode(&mut self) -> PushChannels<&mut Vec<u8>> {
23273        PushChannels::new(self.request.buf_mut())
23274    }
23275    pub fn into_encoder(self) -> PushChannels<RequestBuf<'r>> {
23276        PushChannels::new(self.request.buf)
23277    }
23278    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableChannels<'a> {
23279        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23280        IterableChannels::with_loc(attrs, buf.as_ptr() as usize)
23281    }
23282    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23283        let mut header = BuiltinNfgenmsg::new();
23284        header.cmd = 24u8;
23285        header.version = 1u8;
23286        prev.as_vec_mut().extend(header.as_slice());
23287    }
23288}
23289impl NetlinkRequest for OpChannelsGetDo<'_> {
23290    fn protocol(&self) -> Protocol {
23291        Protocol::Generic("ethtool".as_bytes())
23292    }
23293    fn flags(&self) -> u16 {
23294        self.request.flags
23295    }
23296    fn payload(&self) -> &[u8] {
23297        self.request.buf()
23298    }
23299    type ReplyType<'buf> = IterableChannels<'buf>;
23300    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23301        Self::decode_request(buf)
23302    }
23303    fn lookup(
23304        buf: &[u8],
23305        offset: usize,
23306        missing_type: Option<u16>,
23307    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23308        Self::decode_request(buf).lookup_attr(offset, missing_type)
23309    }
23310}
23311#[doc = "Set channel params.\n\nRequest attributes:\n- [.nested_header()](PushChannels::nested_header)\n- [.push_rx_max()](PushChannels::push_rx_max)\n- [.push_tx_max()](PushChannels::push_tx_max)\n- [.push_other_max()](PushChannels::push_other_max)\n- [.push_combined_max()](PushChannels::push_combined_max)\n- [.push_rx_count()](PushChannels::push_rx_count)\n- [.push_tx_count()](PushChannels::push_tx_count)\n- [.push_other_count()](PushChannels::push_other_count)\n- [.push_combined_count()](PushChannels::push_combined_count)\n\n"]
23312#[derive(Debug)]
23313pub struct OpChannelsSetDo<'r> {
23314    request: Request<'r>,
23315}
23316impl<'r> OpChannelsSetDo<'r> {
23317    pub fn new(mut request: Request<'r>) -> Self {
23318        Self::write_header(request.buf_mut());
23319        Self { request: request }
23320    }
23321    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushChannels<&'buf mut Vec<u8>> {
23322        Self::write_header(buf);
23323        PushChannels::new(buf)
23324    }
23325    pub fn encode(&mut self) -> PushChannels<&mut Vec<u8>> {
23326        PushChannels::new(self.request.buf_mut())
23327    }
23328    pub fn into_encoder(self) -> PushChannels<RequestBuf<'r>> {
23329        PushChannels::new(self.request.buf)
23330    }
23331    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableChannels<'a> {
23332        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23333        IterableChannels::with_loc(attrs, buf.as_ptr() as usize)
23334    }
23335    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23336        let mut header = BuiltinNfgenmsg::new();
23337        header.cmd = 25u8;
23338        header.version = 1u8;
23339        prev.as_vec_mut().extend(header.as_slice());
23340    }
23341}
23342impl NetlinkRequest for OpChannelsSetDo<'_> {
23343    fn protocol(&self) -> Protocol {
23344        Protocol::Generic("ethtool".as_bytes())
23345    }
23346    fn flags(&self) -> u16 {
23347        self.request.flags
23348    }
23349    fn payload(&self) -> &[u8] {
23350        self.request.buf()
23351    }
23352    type ReplyType<'buf> = IterableChannels<'buf>;
23353    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23354        Self::decode_request(buf)
23355    }
23356    fn lookup(
23357        buf: &[u8],
23358        offset: usize,
23359        missing_type: Option<u16>,
23360    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23361        Self::decode_request(buf).lookup_attr(offset, missing_type)
23362    }
23363}
23364#[doc = "Get coalesce params.\n\nRequest attributes:\n- [.nested_header()](PushCoalesce::nested_header)\n\nReply attributes:\n- [.get_header()](IterableCoalesce::get_header)\n- [.get_rx_usecs()](IterableCoalesce::get_rx_usecs)\n- [.get_rx_max_frames()](IterableCoalesce::get_rx_max_frames)\n- [.get_rx_usecs_irq()](IterableCoalesce::get_rx_usecs_irq)\n- [.get_rx_max_frames_irq()](IterableCoalesce::get_rx_max_frames_irq)\n- [.get_tx_usecs()](IterableCoalesce::get_tx_usecs)\n- [.get_tx_max_frames()](IterableCoalesce::get_tx_max_frames)\n- [.get_tx_usecs_irq()](IterableCoalesce::get_tx_usecs_irq)\n- [.get_tx_max_frames_irq()](IterableCoalesce::get_tx_max_frames_irq)\n- [.get_stats_block_usecs()](IterableCoalesce::get_stats_block_usecs)\n- [.get_use_adaptive_rx()](IterableCoalesce::get_use_adaptive_rx)\n- [.get_use_adaptive_tx()](IterableCoalesce::get_use_adaptive_tx)\n- [.get_pkt_rate_low()](IterableCoalesce::get_pkt_rate_low)\n- [.get_rx_usecs_low()](IterableCoalesce::get_rx_usecs_low)\n- [.get_rx_max_frames_low()](IterableCoalesce::get_rx_max_frames_low)\n- [.get_tx_usecs_low()](IterableCoalesce::get_tx_usecs_low)\n- [.get_tx_max_frames_low()](IterableCoalesce::get_tx_max_frames_low)\n- [.get_pkt_rate_high()](IterableCoalesce::get_pkt_rate_high)\n- [.get_rx_usecs_high()](IterableCoalesce::get_rx_usecs_high)\n- [.get_rx_max_frames_high()](IterableCoalesce::get_rx_max_frames_high)\n- [.get_tx_usecs_high()](IterableCoalesce::get_tx_usecs_high)\n- [.get_tx_max_frames_high()](IterableCoalesce::get_tx_max_frames_high)\n- [.get_rate_sample_interval()](IterableCoalesce::get_rate_sample_interval)\n- [.get_use_cqe_mode_tx()](IterableCoalesce::get_use_cqe_mode_tx)\n- [.get_use_cqe_mode_rx()](IterableCoalesce::get_use_cqe_mode_rx)\n- [.get_tx_aggr_max_bytes()](IterableCoalesce::get_tx_aggr_max_bytes)\n- [.get_tx_aggr_max_frames()](IterableCoalesce::get_tx_aggr_max_frames)\n- [.get_tx_aggr_time_usecs()](IterableCoalesce::get_tx_aggr_time_usecs)\n- [.get_rx_profile()](IterableCoalesce::get_rx_profile)\n- [.get_tx_profile()](IterableCoalesce::get_tx_profile)\n- [.get_rx_cqe_frames()](IterableCoalesce::get_rx_cqe_frames)\n- [.get_rx_cqe_nsecs()](IterableCoalesce::get_rx_cqe_nsecs)\n\n"]
23365#[derive(Debug)]
23366pub struct OpCoalesceGetDump<'r> {
23367    request: Request<'r>,
23368}
23369impl<'r> OpCoalesceGetDump<'r> {
23370    pub fn new(mut request: Request<'r>) -> Self {
23371        Self::write_header(request.buf_mut());
23372        Self {
23373            request: request.set_dump(),
23374        }
23375    }
23376    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushCoalesce<&'buf mut Vec<u8>> {
23377        Self::write_header(buf);
23378        PushCoalesce::new(buf)
23379    }
23380    pub fn encode(&mut self) -> PushCoalesce<&mut Vec<u8>> {
23381        PushCoalesce::new(self.request.buf_mut())
23382    }
23383    pub fn into_encoder(self) -> PushCoalesce<RequestBuf<'r>> {
23384        PushCoalesce::new(self.request.buf)
23385    }
23386    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableCoalesce<'a> {
23387        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23388        IterableCoalesce::with_loc(attrs, buf.as_ptr() as usize)
23389    }
23390    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23391        let mut header = BuiltinNfgenmsg::new();
23392        header.cmd = 27u8;
23393        header.version = 1u8;
23394        prev.as_vec_mut().extend(header.as_slice());
23395    }
23396}
23397impl NetlinkRequest for OpCoalesceGetDump<'_> {
23398    fn protocol(&self) -> Protocol {
23399        Protocol::Generic("ethtool".as_bytes())
23400    }
23401    fn flags(&self) -> u16 {
23402        self.request.flags
23403    }
23404    fn payload(&self) -> &[u8] {
23405        self.request.buf()
23406    }
23407    type ReplyType<'buf> = IterableCoalesce<'buf>;
23408    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23409        Self::decode_request(buf)
23410    }
23411    fn lookup(
23412        buf: &[u8],
23413        offset: usize,
23414        missing_type: Option<u16>,
23415    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23416        Self::decode_request(buf).lookup_attr(offset, missing_type)
23417    }
23418}
23419#[doc = "Get coalesce params.\n\nRequest attributes:\n- [.nested_header()](PushCoalesce::nested_header)\n\nReply attributes:\n- [.get_header()](IterableCoalesce::get_header)\n- [.get_rx_usecs()](IterableCoalesce::get_rx_usecs)\n- [.get_rx_max_frames()](IterableCoalesce::get_rx_max_frames)\n- [.get_rx_usecs_irq()](IterableCoalesce::get_rx_usecs_irq)\n- [.get_rx_max_frames_irq()](IterableCoalesce::get_rx_max_frames_irq)\n- [.get_tx_usecs()](IterableCoalesce::get_tx_usecs)\n- [.get_tx_max_frames()](IterableCoalesce::get_tx_max_frames)\n- [.get_tx_usecs_irq()](IterableCoalesce::get_tx_usecs_irq)\n- [.get_tx_max_frames_irq()](IterableCoalesce::get_tx_max_frames_irq)\n- [.get_stats_block_usecs()](IterableCoalesce::get_stats_block_usecs)\n- [.get_use_adaptive_rx()](IterableCoalesce::get_use_adaptive_rx)\n- [.get_use_adaptive_tx()](IterableCoalesce::get_use_adaptive_tx)\n- [.get_pkt_rate_low()](IterableCoalesce::get_pkt_rate_low)\n- [.get_rx_usecs_low()](IterableCoalesce::get_rx_usecs_low)\n- [.get_rx_max_frames_low()](IterableCoalesce::get_rx_max_frames_low)\n- [.get_tx_usecs_low()](IterableCoalesce::get_tx_usecs_low)\n- [.get_tx_max_frames_low()](IterableCoalesce::get_tx_max_frames_low)\n- [.get_pkt_rate_high()](IterableCoalesce::get_pkt_rate_high)\n- [.get_rx_usecs_high()](IterableCoalesce::get_rx_usecs_high)\n- [.get_rx_max_frames_high()](IterableCoalesce::get_rx_max_frames_high)\n- [.get_tx_usecs_high()](IterableCoalesce::get_tx_usecs_high)\n- [.get_tx_max_frames_high()](IterableCoalesce::get_tx_max_frames_high)\n- [.get_rate_sample_interval()](IterableCoalesce::get_rate_sample_interval)\n- [.get_use_cqe_mode_tx()](IterableCoalesce::get_use_cqe_mode_tx)\n- [.get_use_cqe_mode_rx()](IterableCoalesce::get_use_cqe_mode_rx)\n- [.get_tx_aggr_max_bytes()](IterableCoalesce::get_tx_aggr_max_bytes)\n- [.get_tx_aggr_max_frames()](IterableCoalesce::get_tx_aggr_max_frames)\n- [.get_tx_aggr_time_usecs()](IterableCoalesce::get_tx_aggr_time_usecs)\n- [.get_rx_profile()](IterableCoalesce::get_rx_profile)\n- [.get_tx_profile()](IterableCoalesce::get_tx_profile)\n- [.get_rx_cqe_frames()](IterableCoalesce::get_rx_cqe_frames)\n- [.get_rx_cqe_nsecs()](IterableCoalesce::get_rx_cqe_nsecs)\n\n"]
23420#[derive(Debug)]
23421pub struct OpCoalesceGetDo<'r> {
23422    request: Request<'r>,
23423}
23424impl<'r> OpCoalesceGetDo<'r> {
23425    pub fn new(mut request: Request<'r>) -> Self {
23426        Self::write_header(request.buf_mut());
23427        Self { request: request }
23428    }
23429    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushCoalesce<&'buf mut Vec<u8>> {
23430        Self::write_header(buf);
23431        PushCoalesce::new(buf)
23432    }
23433    pub fn encode(&mut self) -> PushCoalesce<&mut Vec<u8>> {
23434        PushCoalesce::new(self.request.buf_mut())
23435    }
23436    pub fn into_encoder(self) -> PushCoalesce<RequestBuf<'r>> {
23437        PushCoalesce::new(self.request.buf)
23438    }
23439    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableCoalesce<'a> {
23440        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23441        IterableCoalesce::with_loc(attrs, buf.as_ptr() as usize)
23442    }
23443    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23444        let mut header = BuiltinNfgenmsg::new();
23445        header.cmd = 27u8;
23446        header.version = 1u8;
23447        prev.as_vec_mut().extend(header.as_slice());
23448    }
23449}
23450impl NetlinkRequest for OpCoalesceGetDo<'_> {
23451    fn protocol(&self) -> Protocol {
23452        Protocol::Generic("ethtool".as_bytes())
23453    }
23454    fn flags(&self) -> u16 {
23455        self.request.flags
23456    }
23457    fn payload(&self) -> &[u8] {
23458        self.request.buf()
23459    }
23460    type ReplyType<'buf> = IterableCoalesce<'buf>;
23461    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23462        Self::decode_request(buf)
23463    }
23464    fn lookup(
23465        buf: &[u8],
23466        offset: usize,
23467        missing_type: Option<u16>,
23468    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23469        Self::decode_request(buf).lookup_attr(offset, missing_type)
23470    }
23471}
23472#[doc = "Set coalesce params.\n\nRequest attributes:\n- [.nested_header()](PushCoalesce::nested_header)\n- [.push_rx_usecs()](PushCoalesce::push_rx_usecs)\n- [.push_rx_max_frames()](PushCoalesce::push_rx_max_frames)\n- [.push_rx_usecs_irq()](PushCoalesce::push_rx_usecs_irq)\n- [.push_rx_max_frames_irq()](PushCoalesce::push_rx_max_frames_irq)\n- [.push_tx_usecs()](PushCoalesce::push_tx_usecs)\n- [.push_tx_max_frames()](PushCoalesce::push_tx_max_frames)\n- [.push_tx_usecs_irq()](PushCoalesce::push_tx_usecs_irq)\n- [.push_tx_max_frames_irq()](PushCoalesce::push_tx_max_frames_irq)\n- [.push_stats_block_usecs()](PushCoalesce::push_stats_block_usecs)\n- [.push_use_adaptive_rx()](PushCoalesce::push_use_adaptive_rx)\n- [.push_use_adaptive_tx()](PushCoalesce::push_use_adaptive_tx)\n- [.push_pkt_rate_low()](PushCoalesce::push_pkt_rate_low)\n- [.push_rx_usecs_low()](PushCoalesce::push_rx_usecs_low)\n- [.push_rx_max_frames_low()](PushCoalesce::push_rx_max_frames_low)\n- [.push_tx_usecs_low()](PushCoalesce::push_tx_usecs_low)\n- [.push_tx_max_frames_low()](PushCoalesce::push_tx_max_frames_low)\n- [.push_pkt_rate_high()](PushCoalesce::push_pkt_rate_high)\n- [.push_rx_usecs_high()](PushCoalesce::push_rx_usecs_high)\n- [.push_rx_max_frames_high()](PushCoalesce::push_rx_max_frames_high)\n- [.push_tx_usecs_high()](PushCoalesce::push_tx_usecs_high)\n- [.push_tx_max_frames_high()](PushCoalesce::push_tx_max_frames_high)\n- [.push_rate_sample_interval()](PushCoalesce::push_rate_sample_interval)\n- [.push_use_cqe_mode_tx()](PushCoalesce::push_use_cqe_mode_tx)\n- [.push_use_cqe_mode_rx()](PushCoalesce::push_use_cqe_mode_rx)\n- [.push_tx_aggr_max_bytes()](PushCoalesce::push_tx_aggr_max_bytes)\n- [.push_tx_aggr_max_frames()](PushCoalesce::push_tx_aggr_max_frames)\n- [.push_tx_aggr_time_usecs()](PushCoalesce::push_tx_aggr_time_usecs)\n- [.nested_rx_profile()](PushCoalesce::nested_rx_profile)\n- [.nested_tx_profile()](PushCoalesce::nested_tx_profile)\n- [.push_rx_cqe_frames()](PushCoalesce::push_rx_cqe_frames)\n- [.push_rx_cqe_nsecs()](PushCoalesce::push_rx_cqe_nsecs)\n\n"]
23473#[derive(Debug)]
23474pub struct OpCoalesceSetDo<'r> {
23475    request: Request<'r>,
23476}
23477impl<'r> OpCoalesceSetDo<'r> {
23478    pub fn new(mut request: Request<'r>) -> Self {
23479        Self::write_header(request.buf_mut());
23480        Self { request: request }
23481    }
23482    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushCoalesce<&'buf mut Vec<u8>> {
23483        Self::write_header(buf);
23484        PushCoalesce::new(buf)
23485    }
23486    pub fn encode(&mut self) -> PushCoalesce<&mut Vec<u8>> {
23487        PushCoalesce::new(self.request.buf_mut())
23488    }
23489    pub fn into_encoder(self) -> PushCoalesce<RequestBuf<'r>> {
23490        PushCoalesce::new(self.request.buf)
23491    }
23492    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableCoalesce<'a> {
23493        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23494        IterableCoalesce::with_loc(attrs, buf.as_ptr() as usize)
23495    }
23496    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23497        let mut header = BuiltinNfgenmsg::new();
23498        header.cmd = 28u8;
23499        header.version = 1u8;
23500        prev.as_vec_mut().extend(header.as_slice());
23501    }
23502}
23503impl NetlinkRequest for OpCoalesceSetDo<'_> {
23504    fn protocol(&self) -> Protocol {
23505        Protocol::Generic("ethtool".as_bytes())
23506    }
23507    fn flags(&self) -> u16 {
23508        self.request.flags
23509    }
23510    fn payload(&self) -> &[u8] {
23511        self.request.buf()
23512    }
23513    type ReplyType<'buf> = IterableCoalesce<'buf>;
23514    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23515        Self::decode_request(buf)
23516    }
23517    fn lookup(
23518        buf: &[u8],
23519        offset: usize,
23520        missing_type: Option<u16>,
23521    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23522        Self::decode_request(buf).lookup_attr(offset, missing_type)
23523    }
23524}
23525#[doc = "Get pause params.\n\nRequest attributes:\n- [.nested_header()](PushPause::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePause::get_header)\n- [.get_autoneg()](IterablePause::get_autoneg)\n- [.get_rx()](IterablePause::get_rx)\n- [.get_tx()](IterablePause::get_tx)\n- [.get_stats()](IterablePause::get_stats)\n- [.get_stats_src()](IterablePause::get_stats_src)\n\n"]
23526#[derive(Debug)]
23527pub struct OpPauseGetDump<'r> {
23528    request: Request<'r>,
23529}
23530impl<'r> OpPauseGetDump<'r> {
23531    pub fn new(mut request: Request<'r>) -> Self {
23532        Self::write_header(request.buf_mut());
23533        Self {
23534            request: request.set_dump(),
23535        }
23536    }
23537    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPause<&'buf mut Vec<u8>> {
23538        Self::write_header(buf);
23539        PushPause::new(buf)
23540    }
23541    pub fn encode(&mut self) -> PushPause<&mut Vec<u8>> {
23542        PushPause::new(self.request.buf_mut())
23543    }
23544    pub fn into_encoder(self) -> PushPause<RequestBuf<'r>> {
23545        PushPause::new(self.request.buf)
23546    }
23547    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePause<'a> {
23548        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23549        IterablePause::with_loc(attrs, buf.as_ptr() as usize)
23550    }
23551    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23552        let mut header = BuiltinNfgenmsg::new();
23553        header.cmd = 30u8;
23554        header.version = 1u8;
23555        prev.as_vec_mut().extend(header.as_slice());
23556    }
23557}
23558impl NetlinkRequest for OpPauseGetDump<'_> {
23559    fn protocol(&self) -> Protocol {
23560        Protocol::Generic("ethtool".as_bytes())
23561    }
23562    fn flags(&self) -> u16 {
23563        self.request.flags
23564    }
23565    fn payload(&self) -> &[u8] {
23566        self.request.buf()
23567    }
23568    type ReplyType<'buf> = IterablePause<'buf>;
23569    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23570        Self::decode_request(buf)
23571    }
23572    fn lookup(
23573        buf: &[u8],
23574        offset: usize,
23575        missing_type: Option<u16>,
23576    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23577        Self::decode_request(buf).lookup_attr(offset, missing_type)
23578    }
23579}
23580#[doc = "Get pause params.\n\nRequest attributes:\n- [.nested_header()](PushPause::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePause::get_header)\n- [.get_autoneg()](IterablePause::get_autoneg)\n- [.get_rx()](IterablePause::get_rx)\n- [.get_tx()](IterablePause::get_tx)\n- [.get_stats()](IterablePause::get_stats)\n- [.get_stats_src()](IterablePause::get_stats_src)\n\n"]
23581#[derive(Debug)]
23582pub struct OpPauseGetDo<'r> {
23583    request: Request<'r>,
23584}
23585impl<'r> OpPauseGetDo<'r> {
23586    pub fn new(mut request: Request<'r>) -> Self {
23587        Self::write_header(request.buf_mut());
23588        Self { request: request }
23589    }
23590    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPause<&'buf mut Vec<u8>> {
23591        Self::write_header(buf);
23592        PushPause::new(buf)
23593    }
23594    pub fn encode(&mut self) -> PushPause<&mut Vec<u8>> {
23595        PushPause::new(self.request.buf_mut())
23596    }
23597    pub fn into_encoder(self) -> PushPause<RequestBuf<'r>> {
23598        PushPause::new(self.request.buf)
23599    }
23600    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePause<'a> {
23601        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23602        IterablePause::with_loc(attrs, buf.as_ptr() as usize)
23603    }
23604    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23605        let mut header = BuiltinNfgenmsg::new();
23606        header.cmd = 30u8;
23607        header.version = 1u8;
23608        prev.as_vec_mut().extend(header.as_slice());
23609    }
23610}
23611impl NetlinkRequest for OpPauseGetDo<'_> {
23612    fn protocol(&self) -> Protocol {
23613        Protocol::Generic("ethtool".as_bytes())
23614    }
23615    fn flags(&self) -> u16 {
23616        self.request.flags
23617    }
23618    fn payload(&self) -> &[u8] {
23619        self.request.buf()
23620    }
23621    type ReplyType<'buf> = IterablePause<'buf>;
23622    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23623        Self::decode_request(buf)
23624    }
23625    fn lookup(
23626        buf: &[u8],
23627        offset: usize,
23628        missing_type: Option<u16>,
23629    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23630        Self::decode_request(buf).lookup_attr(offset, missing_type)
23631    }
23632}
23633#[doc = "Set pause params.\n\nRequest attributes:\n- [.nested_header()](PushPause::nested_header)\n- [.push_autoneg()](PushPause::push_autoneg)\n- [.push_rx()](PushPause::push_rx)\n- [.push_tx()](PushPause::push_tx)\n- [.nested_stats()](PushPause::nested_stats)\n- [.push_stats_src()](PushPause::push_stats_src)\n\n"]
23634#[derive(Debug)]
23635pub struct OpPauseSetDo<'r> {
23636    request: Request<'r>,
23637}
23638impl<'r> OpPauseSetDo<'r> {
23639    pub fn new(mut request: Request<'r>) -> Self {
23640        Self::write_header(request.buf_mut());
23641        Self { request: request }
23642    }
23643    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPause<&'buf mut Vec<u8>> {
23644        Self::write_header(buf);
23645        PushPause::new(buf)
23646    }
23647    pub fn encode(&mut self) -> PushPause<&mut Vec<u8>> {
23648        PushPause::new(self.request.buf_mut())
23649    }
23650    pub fn into_encoder(self) -> PushPause<RequestBuf<'r>> {
23651        PushPause::new(self.request.buf)
23652    }
23653    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePause<'a> {
23654        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23655        IterablePause::with_loc(attrs, buf.as_ptr() as usize)
23656    }
23657    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23658        let mut header = BuiltinNfgenmsg::new();
23659        header.cmd = 31u8;
23660        header.version = 1u8;
23661        prev.as_vec_mut().extend(header.as_slice());
23662    }
23663}
23664impl NetlinkRequest for OpPauseSetDo<'_> {
23665    fn protocol(&self) -> Protocol {
23666        Protocol::Generic("ethtool".as_bytes())
23667    }
23668    fn flags(&self) -> u16 {
23669        self.request.flags
23670    }
23671    fn payload(&self) -> &[u8] {
23672        self.request.buf()
23673    }
23674    type ReplyType<'buf> = IterablePause<'buf>;
23675    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23676        Self::decode_request(buf)
23677    }
23678    fn lookup(
23679        buf: &[u8],
23680        offset: usize,
23681        missing_type: Option<u16>,
23682    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23683        Self::decode_request(buf).lookup_attr(offset, missing_type)
23684    }
23685}
23686#[doc = "Get eee params.\n\nRequest attributes:\n- [.nested_header()](PushEee::nested_header)\n\nReply attributes:\n- [.get_header()](IterableEee::get_header)\n- [.get_modes_ours()](IterableEee::get_modes_ours)\n- [.get_modes_peer()](IterableEee::get_modes_peer)\n- [.get_active()](IterableEee::get_active)\n- [.get_enabled()](IterableEee::get_enabled)\n- [.get_tx_lpi_enabled()](IterableEee::get_tx_lpi_enabled)\n- [.get_tx_lpi_timer()](IterableEee::get_tx_lpi_timer)\n\n"]
23687#[derive(Debug)]
23688pub struct OpEeeGetDump<'r> {
23689    request: Request<'r>,
23690}
23691impl<'r> OpEeeGetDump<'r> {
23692    pub fn new(mut request: Request<'r>) -> Self {
23693        Self::write_header(request.buf_mut());
23694        Self {
23695            request: request.set_dump(),
23696        }
23697    }
23698    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushEee<&'buf mut Vec<u8>> {
23699        Self::write_header(buf);
23700        PushEee::new(buf)
23701    }
23702    pub fn encode(&mut self) -> PushEee<&mut Vec<u8>> {
23703        PushEee::new(self.request.buf_mut())
23704    }
23705    pub fn into_encoder(self) -> PushEee<RequestBuf<'r>> {
23706        PushEee::new(self.request.buf)
23707    }
23708    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableEee<'a> {
23709        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23710        IterableEee::with_loc(attrs, buf.as_ptr() as usize)
23711    }
23712    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23713        let mut header = BuiltinNfgenmsg::new();
23714        header.cmd = 33u8;
23715        header.version = 1u8;
23716        prev.as_vec_mut().extend(header.as_slice());
23717    }
23718}
23719impl NetlinkRequest for OpEeeGetDump<'_> {
23720    fn protocol(&self) -> Protocol {
23721        Protocol::Generic("ethtool".as_bytes())
23722    }
23723    fn flags(&self) -> u16 {
23724        self.request.flags
23725    }
23726    fn payload(&self) -> &[u8] {
23727        self.request.buf()
23728    }
23729    type ReplyType<'buf> = IterableEee<'buf>;
23730    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23731        Self::decode_request(buf)
23732    }
23733    fn lookup(
23734        buf: &[u8],
23735        offset: usize,
23736        missing_type: Option<u16>,
23737    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23738        Self::decode_request(buf).lookup_attr(offset, missing_type)
23739    }
23740}
23741#[doc = "Get eee params.\n\nRequest attributes:\n- [.nested_header()](PushEee::nested_header)\n\nReply attributes:\n- [.get_header()](IterableEee::get_header)\n- [.get_modes_ours()](IterableEee::get_modes_ours)\n- [.get_modes_peer()](IterableEee::get_modes_peer)\n- [.get_active()](IterableEee::get_active)\n- [.get_enabled()](IterableEee::get_enabled)\n- [.get_tx_lpi_enabled()](IterableEee::get_tx_lpi_enabled)\n- [.get_tx_lpi_timer()](IterableEee::get_tx_lpi_timer)\n\n"]
23742#[derive(Debug)]
23743pub struct OpEeeGetDo<'r> {
23744    request: Request<'r>,
23745}
23746impl<'r> OpEeeGetDo<'r> {
23747    pub fn new(mut request: Request<'r>) -> Self {
23748        Self::write_header(request.buf_mut());
23749        Self { request: request }
23750    }
23751    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushEee<&'buf mut Vec<u8>> {
23752        Self::write_header(buf);
23753        PushEee::new(buf)
23754    }
23755    pub fn encode(&mut self) -> PushEee<&mut Vec<u8>> {
23756        PushEee::new(self.request.buf_mut())
23757    }
23758    pub fn into_encoder(self) -> PushEee<RequestBuf<'r>> {
23759        PushEee::new(self.request.buf)
23760    }
23761    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableEee<'a> {
23762        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23763        IterableEee::with_loc(attrs, buf.as_ptr() as usize)
23764    }
23765    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23766        let mut header = BuiltinNfgenmsg::new();
23767        header.cmd = 33u8;
23768        header.version = 1u8;
23769        prev.as_vec_mut().extend(header.as_slice());
23770    }
23771}
23772impl NetlinkRequest for OpEeeGetDo<'_> {
23773    fn protocol(&self) -> Protocol {
23774        Protocol::Generic("ethtool".as_bytes())
23775    }
23776    fn flags(&self) -> u16 {
23777        self.request.flags
23778    }
23779    fn payload(&self) -> &[u8] {
23780        self.request.buf()
23781    }
23782    type ReplyType<'buf> = IterableEee<'buf>;
23783    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23784        Self::decode_request(buf)
23785    }
23786    fn lookup(
23787        buf: &[u8],
23788        offset: usize,
23789        missing_type: Option<u16>,
23790    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23791        Self::decode_request(buf).lookup_attr(offset, missing_type)
23792    }
23793}
23794#[doc = "Set eee params.\n\nRequest attributes:\n- [.nested_header()](PushEee::nested_header)\n- [.nested_modes_ours()](PushEee::nested_modes_ours)\n- [.nested_modes_peer()](PushEee::nested_modes_peer)\n- [.push_active()](PushEee::push_active)\n- [.push_enabled()](PushEee::push_enabled)\n- [.push_tx_lpi_enabled()](PushEee::push_tx_lpi_enabled)\n- [.push_tx_lpi_timer()](PushEee::push_tx_lpi_timer)\n\n"]
23795#[derive(Debug)]
23796pub struct OpEeeSetDo<'r> {
23797    request: Request<'r>,
23798}
23799impl<'r> OpEeeSetDo<'r> {
23800    pub fn new(mut request: Request<'r>) -> Self {
23801        Self::write_header(request.buf_mut());
23802        Self { request: request }
23803    }
23804    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushEee<&'buf mut Vec<u8>> {
23805        Self::write_header(buf);
23806        PushEee::new(buf)
23807    }
23808    pub fn encode(&mut self) -> PushEee<&mut Vec<u8>> {
23809        PushEee::new(self.request.buf_mut())
23810    }
23811    pub fn into_encoder(self) -> PushEee<RequestBuf<'r>> {
23812        PushEee::new(self.request.buf)
23813    }
23814    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableEee<'a> {
23815        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23816        IterableEee::with_loc(attrs, buf.as_ptr() as usize)
23817    }
23818    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23819        let mut header = BuiltinNfgenmsg::new();
23820        header.cmd = 34u8;
23821        header.version = 1u8;
23822        prev.as_vec_mut().extend(header.as_slice());
23823    }
23824}
23825impl NetlinkRequest for OpEeeSetDo<'_> {
23826    fn protocol(&self) -> Protocol {
23827        Protocol::Generic("ethtool".as_bytes())
23828    }
23829    fn flags(&self) -> u16 {
23830        self.request.flags
23831    }
23832    fn payload(&self) -> &[u8] {
23833        self.request.buf()
23834    }
23835    type ReplyType<'buf> = IterableEee<'buf>;
23836    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23837        Self::decode_request(buf)
23838    }
23839    fn lookup(
23840        buf: &[u8],
23841        offset: usize,
23842        missing_type: Option<u16>,
23843    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23844        Self::decode_request(buf).lookup_attr(offset, missing_type)
23845    }
23846}
23847#[doc = "Get tsinfo params.\n\nRequest attributes:\n- [.nested_header()](PushTsinfo::nested_header)\n- [.nested_hwtstamp_provider()](PushTsinfo::nested_hwtstamp_provider)\n\nReply attributes:\n- [.get_header()](IterableTsinfo::get_header)\n- [.get_timestamping()](IterableTsinfo::get_timestamping)\n- [.get_tx_types()](IterableTsinfo::get_tx_types)\n- [.get_rx_filters()](IterableTsinfo::get_rx_filters)\n- [.get_phc_index()](IterableTsinfo::get_phc_index)\n- [.get_stats()](IterableTsinfo::get_stats)\n- [.get_hwtstamp_provider()](IterableTsinfo::get_hwtstamp_provider)\n- [.get_hwtstamp_source()](IterableTsinfo::get_hwtstamp_source)\n- [.get_hwtstamp_phyindex()](IterableTsinfo::get_hwtstamp_phyindex)\n\n"]
23848#[derive(Debug)]
23849pub struct OpTsinfoGetDump<'r> {
23850    request: Request<'r>,
23851}
23852impl<'r> OpTsinfoGetDump<'r> {
23853    pub fn new(mut request: Request<'r>) -> Self {
23854        Self::write_header(request.buf_mut());
23855        Self {
23856            request: request.set_dump(),
23857        }
23858    }
23859    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushTsinfo<&'buf mut Vec<u8>> {
23860        Self::write_header(buf);
23861        PushTsinfo::new(buf)
23862    }
23863    pub fn encode(&mut self) -> PushTsinfo<&mut Vec<u8>> {
23864        PushTsinfo::new(self.request.buf_mut())
23865    }
23866    pub fn into_encoder(self) -> PushTsinfo<RequestBuf<'r>> {
23867        PushTsinfo::new(self.request.buf)
23868    }
23869    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableTsinfo<'a> {
23870        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23871        IterableTsinfo::with_loc(attrs, buf.as_ptr() as usize)
23872    }
23873    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23874        let mut header = BuiltinNfgenmsg::new();
23875        header.cmd = 36u8;
23876        header.version = 1u8;
23877        prev.as_vec_mut().extend(header.as_slice());
23878    }
23879}
23880impl NetlinkRequest for OpTsinfoGetDump<'_> {
23881    fn protocol(&self) -> Protocol {
23882        Protocol::Generic("ethtool".as_bytes())
23883    }
23884    fn flags(&self) -> u16 {
23885        self.request.flags
23886    }
23887    fn payload(&self) -> &[u8] {
23888        self.request.buf()
23889    }
23890    type ReplyType<'buf> = IterableTsinfo<'buf>;
23891    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23892        Self::decode_request(buf)
23893    }
23894    fn lookup(
23895        buf: &[u8],
23896        offset: usize,
23897        missing_type: Option<u16>,
23898    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23899        Self::decode_request(buf).lookup_attr(offset, missing_type)
23900    }
23901}
23902#[doc = "Get tsinfo params.\n\nRequest attributes:\n- [.nested_header()](PushTsinfo::nested_header)\n- [.nested_hwtstamp_provider()](PushTsinfo::nested_hwtstamp_provider)\n\nReply attributes:\n- [.get_header()](IterableTsinfo::get_header)\n- [.get_timestamping()](IterableTsinfo::get_timestamping)\n- [.get_tx_types()](IterableTsinfo::get_tx_types)\n- [.get_rx_filters()](IterableTsinfo::get_rx_filters)\n- [.get_phc_index()](IterableTsinfo::get_phc_index)\n- [.get_stats()](IterableTsinfo::get_stats)\n- [.get_hwtstamp_provider()](IterableTsinfo::get_hwtstamp_provider)\n- [.get_hwtstamp_source()](IterableTsinfo::get_hwtstamp_source)\n- [.get_hwtstamp_phyindex()](IterableTsinfo::get_hwtstamp_phyindex)\n\n"]
23903#[derive(Debug)]
23904pub struct OpTsinfoGetDo<'r> {
23905    request: Request<'r>,
23906}
23907impl<'r> OpTsinfoGetDo<'r> {
23908    pub fn new(mut request: Request<'r>) -> Self {
23909        Self::write_header(request.buf_mut());
23910        Self { request: request }
23911    }
23912    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushTsinfo<&'buf mut Vec<u8>> {
23913        Self::write_header(buf);
23914        PushTsinfo::new(buf)
23915    }
23916    pub fn encode(&mut self) -> PushTsinfo<&mut Vec<u8>> {
23917        PushTsinfo::new(self.request.buf_mut())
23918    }
23919    pub fn into_encoder(self) -> PushTsinfo<RequestBuf<'r>> {
23920        PushTsinfo::new(self.request.buf)
23921    }
23922    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableTsinfo<'a> {
23923        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23924        IterableTsinfo::with_loc(attrs, buf.as_ptr() as usize)
23925    }
23926    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23927        let mut header = BuiltinNfgenmsg::new();
23928        header.cmd = 36u8;
23929        header.version = 1u8;
23930        prev.as_vec_mut().extend(header.as_slice());
23931    }
23932}
23933impl NetlinkRequest for OpTsinfoGetDo<'_> {
23934    fn protocol(&self) -> Protocol {
23935        Protocol::Generic("ethtool".as_bytes())
23936    }
23937    fn flags(&self) -> u16 {
23938        self.request.flags
23939    }
23940    fn payload(&self) -> &[u8] {
23941        self.request.buf()
23942    }
23943    type ReplyType<'buf> = IterableTsinfo<'buf>;
23944    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23945        Self::decode_request(buf)
23946    }
23947    fn lookup(
23948        buf: &[u8],
23949        offset: usize,
23950        missing_type: Option<u16>,
23951    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23952        Self::decode_request(buf).lookup_attr(offset, missing_type)
23953    }
23954}
23955#[doc = "Cable test.\n\nRequest attributes:\n- [.nested_header()](PushCableTest::nested_header)\n\n"]
23956#[derive(Debug)]
23957pub struct OpCableTestActDo<'r> {
23958    request: Request<'r>,
23959}
23960impl<'r> OpCableTestActDo<'r> {
23961    pub fn new(mut request: Request<'r>) -> Self {
23962        Self::write_header(request.buf_mut());
23963        Self { request: request }
23964    }
23965    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushCableTest<&'buf mut Vec<u8>> {
23966        Self::write_header(buf);
23967        PushCableTest::new(buf)
23968    }
23969    pub fn encode(&mut self) -> PushCableTest<&mut Vec<u8>> {
23970        PushCableTest::new(self.request.buf_mut())
23971    }
23972    pub fn into_encoder(self) -> PushCableTest<RequestBuf<'r>> {
23973        PushCableTest::new(self.request.buf)
23974    }
23975    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableCableTest<'a> {
23976        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
23977        IterableCableTest::with_loc(attrs, buf.as_ptr() as usize)
23978    }
23979    fn write_header<Prev: Pusher>(prev: &mut Prev) {
23980        let mut header = BuiltinNfgenmsg::new();
23981        header.cmd = 37u8;
23982        header.version = 1u8;
23983        prev.as_vec_mut().extend(header.as_slice());
23984    }
23985}
23986impl NetlinkRequest for OpCableTestActDo<'_> {
23987    fn protocol(&self) -> Protocol {
23988        Protocol::Generic("ethtool".as_bytes())
23989    }
23990    fn flags(&self) -> u16 {
23991        self.request.flags
23992    }
23993    fn payload(&self) -> &[u8] {
23994        self.request.buf()
23995    }
23996    type ReplyType<'buf> = IterableCableTest<'buf>;
23997    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23998        Self::decode_request(buf)
23999    }
24000    fn lookup(
24001        buf: &[u8],
24002        offset: usize,
24003        missing_type: Option<u16>,
24004    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24005        Self::decode_request(buf).lookup_attr(offset, missing_type)
24006    }
24007}
24008#[doc = "Cable test TDR.\n\nRequest attributes:\n- [.nested_header()](PushCableTestTdr::nested_header)\n\n"]
24009#[derive(Debug)]
24010pub struct OpCableTestTdrActDo<'r> {
24011    request: Request<'r>,
24012}
24013impl<'r> OpCableTestTdrActDo<'r> {
24014    pub fn new(mut request: Request<'r>) -> Self {
24015        Self::write_header(request.buf_mut());
24016        Self { request: request }
24017    }
24018    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushCableTestTdr<&'buf mut Vec<u8>> {
24019        Self::write_header(buf);
24020        PushCableTestTdr::new(buf)
24021    }
24022    pub fn encode(&mut self) -> PushCableTestTdr<&mut Vec<u8>> {
24023        PushCableTestTdr::new(self.request.buf_mut())
24024    }
24025    pub fn into_encoder(self) -> PushCableTestTdr<RequestBuf<'r>> {
24026        PushCableTestTdr::new(self.request.buf)
24027    }
24028    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableCableTestTdr<'a> {
24029        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24030        IterableCableTestTdr::with_loc(attrs, buf.as_ptr() as usize)
24031    }
24032    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24033        let mut header = BuiltinNfgenmsg::new();
24034        header.cmd = 39u8;
24035        header.version = 1u8;
24036        prev.as_vec_mut().extend(header.as_slice());
24037    }
24038}
24039impl NetlinkRequest for OpCableTestTdrActDo<'_> {
24040    fn protocol(&self) -> Protocol {
24041        Protocol::Generic("ethtool".as_bytes())
24042    }
24043    fn flags(&self) -> u16 {
24044        self.request.flags
24045    }
24046    fn payload(&self) -> &[u8] {
24047        self.request.buf()
24048    }
24049    type ReplyType<'buf> = IterableCableTestTdr<'buf>;
24050    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24051        Self::decode_request(buf)
24052    }
24053    fn lookup(
24054        buf: &[u8],
24055        offset: usize,
24056        missing_type: Option<u16>,
24057    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24058        Self::decode_request(buf).lookup_attr(offset, missing_type)
24059    }
24060}
24061#[doc = "Get tsinfo params.\n\nRequest attributes:\n- [.nested_header()](PushTunnelInfo::nested_header)\n\nReply attributes:\n- [.get_header()](IterableTunnelInfo::get_header)\n- [.get_udp_ports()](IterableTunnelInfo::get_udp_ports)\n\n"]
24062#[derive(Debug)]
24063pub struct OpTunnelInfoGetDump<'r> {
24064    request: Request<'r>,
24065}
24066impl<'r> OpTunnelInfoGetDump<'r> {
24067    pub fn new(mut request: Request<'r>) -> Self {
24068        Self::write_header(request.buf_mut());
24069        Self {
24070            request: request.set_dump(),
24071        }
24072    }
24073    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushTunnelInfo<&'buf mut Vec<u8>> {
24074        Self::write_header(buf);
24075        PushTunnelInfo::new(buf)
24076    }
24077    pub fn encode(&mut self) -> PushTunnelInfo<&mut Vec<u8>> {
24078        PushTunnelInfo::new(self.request.buf_mut())
24079    }
24080    pub fn into_encoder(self) -> PushTunnelInfo<RequestBuf<'r>> {
24081        PushTunnelInfo::new(self.request.buf)
24082    }
24083    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableTunnelInfo<'a> {
24084        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24085        IterableTunnelInfo::with_loc(attrs, buf.as_ptr() as usize)
24086    }
24087    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24088        let mut header = BuiltinNfgenmsg::new();
24089        header.cmd = 41u8;
24090        header.version = 1u8;
24091        prev.as_vec_mut().extend(header.as_slice());
24092    }
24093}
24094impl NetlinkRequest for OpTunnelInfoGetDump<'_> {
24095    fn protocol(&self) -> Protocol {
24096        Protocol::Generic("ethtool".as_bytes())
24097    }
24098    fn flags(&self) -> u16 {
24099        self.request.flags
24100    }
24101    fn payload(&self) -> &[u8] {
24102        self.request.buf()
24103    }
24104    type ReplyType<'buf> = IterableTunnelInfo<'buf>;
24105    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24106        Self::decode_request(buf)
24107    }
24108    fn lookup(
24109        buf: &[u8],
24110        offset: usize,
24111        missing_type: Option<u16>,
24112    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24113        Self::decode_request(buf).lookup_attr(offset, missing_type)
24114    }
24115}
24116#[doc = "Get tsinfo params.\n\nRequest attributes:\n- [.nested_header()](PushTunnelInfo::nested_header)\n\nReply attributes:\n- [.get_header()](IterableTunnelInfo::get_header)\n- [.get_udp_ports()](IterableTunnelInfo::get_udp_ports)\n\n"]
24117#[derive(Debug)]
24118pub struct OpTunnelInfoGetDo<'r> {
24119    request: Request<'r>,
24120}
24121impl<'r> OpTunnelInfoGetDo<'r> {
24122    pub fn new(mut request: Request<'r>) -> Self {
24123        Self::write_header(request.buf_mut());
24124        Self { request: request }
24125    }
24126    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushTunnelInfo<&'buf mut Vec<u8>> {
24127        Self::write_header(buf);
24128        PushTunnelInfo::new(buf)
24129    }
24130    pub fn encode(&mut self) -> PushTunnelInfo<&mut Vec<u8>> {
24131        PushTunnelInfo::new(self.request.buf_mut())
24132    }
24133    pub fn into_encoder(self) -> PushTunnelInfo<RequestBuf<'r>> {
24134        PushTunnelInfo::new(self.request.buf)
24135    }
24136    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableTunnelInfo<'a> {
24137        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24138        IterableTunnelInfo::with_loc(attrs, buf.as_ptr() as usize)
24139    }
24140    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24141        let mut header = BuiltinNfgenmsg::new();
24142        header.cmd = 41u8;
24143        header.version = 1u8;
24144        prev.as_vec_mut().extend(header.as_slice());
24145    }
24146}
24147impl NetlinkRequest for OpTunnelInfoGetDo<'_> {
24148    fn protocol(&self) -> Protocol {
24149        Protocol::Generic("ethtool".as_bytes())
24150    }
24151    fn flags(&self) -> u16 {
24152        self.request.flags
24153    }
24154    fn payload(&self) -> &[u8] {
24155        self.request.buf()
24156    }
24157    type ReplyType<'buf> = IterableTunnelInfo<'buf>;
24158    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24159        Self::decode_request(buf)
24160    }
24161    fn lookup(
24162        buf: &[u8],
24163        offset: usize,
24164        missing_type: Option<u16>,
24165    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24166        Self::decode_request(buf).lookup_attr(offset, missing_type)
24167    }
24168}
24169#[doc = "Get FEC params.\n\nRequest attributes:\n- [.nested_header()](PushFec::nested_header)\n\nReply attributes:\n- [.get_header()](IterableFec::get_header)\n- [.get_modes()](IterableFec::get_modes)\n- [.get_auto()](IterableFec::get_auto)\n- [.get_active()](IterableFec::get_active)\n- [.get_stats()](IterableFec::get_stats)\n\n"]
24170#[derive(Debug)]
24171pub struct OpFecGetDump<'r> {
24172    request: Request<'r>,
24173}
24174impl<'r> OpFecGetDump<'r> {
24175    pub fn new(mut request: Request<'r>) -> Self {
24176        Self::write_header(request.buf_mut());
24177        Self {
24178            request: request.set_dump(),
24179        }
24180    }
24181    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushFec<&'buf mut Vec<u8>> {
24182        Self::write_header(buf);
24183        PushFec::new(buf)
24184    }
24185    pub fn encode(&mut self) -> PushFec<&mut Vec<u8>> {
24186        PushFec::new(self.request.buf_mut())
24187    }
24188    pub fn into_encoder(self) -> PushFec<RequestBuf<'r>> {
24189        PushFec::new(self.request.buf)
24190    }
24191    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableFec<'a> {
24192        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24193        IterableFec::with_loc(attrs, buf.as_ptr() as usize)
24194    }
24195    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24196        let mut header = BuiltinNfgenmsg::new();
24197        header.cmd = 42u8;
24198        header.version = 1u8;
24199        prev.as_vec_mut().extend(header.as_slice());
24200    }
24201}
24202impl NetlinkRequest for OpFecGetDump<'_> {
24203    fn protocol(&self) -> Protocol {
24204        Protocol::Generic("ethtool".as_bytes())
24205    }
24206    fn flags(&self) -> u16 {
24207        self.request.flags
24208    }
24209    fn payload(&self) -> &[u8] {
24210        self.request.buf()
24211    }
24212    type ReplyType<'buf> = IterableFec<'buf>;
24213    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24214        Self::decode_request(buf)
24215    }
24216    fn lookup(
24217        buf: &[u8],
24218        offset: usize,
24219        missing_type: Option<u16>,
24220    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24221        Self::decode_request(buf).lookup_attr(offset, missing_type)
24222    }
24223}
24224#[doc = "Get FEC params.\n\nRequest attributes:\n- [.nested_header()](PushFec::nested_header)\n\nReply attributes:\n- [.get_header()](IterableFec::get_header)\n- [.get_modes()](IterableFec::get_modes)\n- [.get_auto()](IterableFec::get_auto)\n- [.get_active()](IterableFec::get_active)\n- [.get_stats()](IterableFec::get_stats)\n\n"]
24225#[derive(Debug)]
24226pub struct OpFecGetDo<'r> {
24227    request: Request<'r>,
24228}
24229impl<'r> OpFecGetDo<'r> {
24230    pub fn new(mut request: Request<'r>) -> Self {
24231        Self::write_header(request.buf_mut());
24232        Self { request: request }
24233    }
24234    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushFec<&'buf mut Vec<u8>> {
24235        Self::write_header(buf);
24236        PushFec::new(buf)
24237    }
24238    pub fn encode(&mut self) -> PushFec<&mut Vec<u8>> {
24239        PushFec::new(self.request.buf_mut())
24240    }
24241    pub fn into_encoder(self) -> PushFec<RequestBuf<'r>> {
24242        PushFec::new(self.request.buf)
24243    }
24244    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableFec<'a> {
24245        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24246        IterableFec::with_loc(attrs, buf.as_ptr() as usize)
24247    }
24248    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24249        let mut header = BuiltinNfgenmsg::new();
24250        header.cmd = 42u8;
24251        header.version = 1u8;
24252        prev.as_vec_mut().extend(header.as_slice());
24253    }
24254}
24255impl NetlinkRequest for OpFecGetDo<'_> {
24256    fn protocol(&self) -> Protocol {
24257        Protocol::Generic("ethtool".as_bytes())
24258    }
24259    fn flags(&self) -> u16 {
24260        self.request.flags
24261    }
24262    fn payload(&self) -> &[u8] {
24263        self.request.buf()
24264    }
24265    type ReplyType<'buf> = IterableFec<'buf>;
24266    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24267        Self::decode_request(buf)
24268    }
24269    fn lookup(
24270        buf: &[u8],
24271        offset: usize,
24272        missing_type: Option<u16>,
24273    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24274        Self::decode_request(buf).lookup_attr(offset, missing_type)
24275    }
24276}
24277#[doc = "Set FEC params.\n\nRequest attributes:\n- [.nested_header()](PushFec::nested_header)\n- [.nested_modes()](PushFec::nested_modes)\n- [.push_auto()](PushFec::push_auto)\n- [.push_active()](PushFec::push_active)\n- [.nested_stats()](PushFec::nested_stats)\n\n"]
24278#[derive(Debug)]
24279pub struct OpFecSetDo<'r> {
24280    request: Request<'r>,
24281}
24282impl<'r> OpFecSetDo<'r> {
24283    pub fn new(mut request: Request<'r>) -> Self {
24284        Self::write_header(request.buf_mut());
24285        Self { request: request }
24286    }
24287    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushFec<&'buf mut Vec<u8>> {
24288        Self::write_header(buf);
24289        PushFec::new(buf)
24290    }
24291    pub fn encode(&mut self) -> PushFec<&mut Vec<u8>> {
24292        PushFec::new(self.request.buf_mut())
24293    }
24294    pub fn into_encoder(self) -> PushFec<RequestBuf<'r>> {
24295        PushFec::new(self.request.buf)
24296    }
24297    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableFec<'a> {
24298        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24299        IterableFec::with_loc(attrs, buf.as_ptr() as usize)
24300    }
24301    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24302        let mut header = BuiltinNfgenmsg::new();
24303        header.cmd = 43u8;
24304        header.version = 1u8;
24305        prev.as_vec_mut().extend(header.as_slice());
24306    }
24307}
24308impl NetlinkRequest for OpFecSetDo<'_> {
24309    fn protocol(&self) -> Protocol {
24310        Protocol::Generic("ethtool".as_bytes())
24311    }
24312    fn flags(&self) -> u16 {
24313        self.request.flags
24314    }
24315    fn payload(&self) -> &[u8] {
24316        self.request.buf()
24317    }
24318    type ReplyType<'buf> = IterableFec<'buf>;
24319    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24320        Self::decode_request(buf)
24321    }
24322    fn lookup(
24323        buf: &[u8],
24324        offset: usize,
24325        missing_type: Option<u16>,
24326    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24327        Self::decode_request(buf).lookup_attr(offset, missing_type)
24328    }
24329}
24330#[doc = "Get module EEPROM params.\n\nRequest attributes:\n- [.nested_header()](PushModuleEeprom::nested_header)\n- [.push_offset()](PushModuleEeprom::push_offset)\n- [.push_length()](PushModuleEeprom::push_length)\n- [.push_page()](PushModuleEeprom::push_page)\n- [.push_bank()](PushModuleEeprom::push_bank)\n- [.push_i2c_address()](PushModuleEeprom::push_i2c_address)\n\nReply attributes:\n- [.get_header()](IterableModuleEeprom::get_header)\n- [.get_data()](IterableModuleEeprom::get_data)\n\n"]
24331#[derive(Debug)]
24332pub struct OpModuleEepromGetDump<'r> {
24333    request: Request<'r>,
24334}
24335impl<'r> OpModuleEepromGetDump<'r> {
24336    pub fn new(mut request: Request<'r>) -> Self {
24337        Self::write_header(request.buf_mut());
24338        Self {
24339            request: request.set_dump(),
24340        }
24341    }
24342    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushModuleEeprom<&'buf mut Vec<u8>> {
24343        Self::write_header(buf);
24344        PushModuleEeprom::new(buf)
24345    }
24346    pub fn encode(&mut self) -> PushModuleEeprom<&mut Vec<u8>> {
24347        PushModuleEeprom::new(self.request.buf_mut())
24348    }
24349    pub fn into_encoder(self) -> PushModuleEeprom<RequestBuf<'r>> {
24350        PushModuleEeprom::new(self.request.buf)
24351    }
24352    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableModuleEeprom<'a> {
24353        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24354        IterableModuleEeprom::with_loc(attrs, buf.as_ptr() as usize)
24355    }
24356    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24357        let mut header = BuiltinNfgenmsg::new();
24358        header.cmd = 45u8;
24359        header.version = 1u8;
24360        prev.as_vec_mut().extend(header.as_slice());
24361    }
24362}
24363impl NetlinkRequest for OpModuleEepromGetDump<'_> {
24364    fn protocol(&self) -> Protocol {
24365        Protocol::Generic("ethtool".as_bytes())
24366    }
24367    fn flags(&self) -> u16 {
24368        self.request.flags
24369    }
24370    fn payload(&self) -> &[u8] {
24371        self.request.buf()
24372    }
24373    type ReplyType<'buf> = IterableModuleEeprom<'buf>;
24374    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24375        Self::decode_request(buf)
24376    }
24377    fn lookup(
24378        buf: &[u8],
24379        offset: usize,
24380        missing_type: Option<u16>,
24381    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24382        Self::decode_request(buf).lookup_attr(offset, missing_type)
24383    }
24384}
24385#[doc = "Get module EEPROM params.\n\nRequest attributes:\n- [.nested_header()](PushModuleEeprom::nested_header)\n- [.push_offset()](PushModuleEeprom::push_offset)\n- [.push_length()](PushModuleEeprom::push_length)\n- [.push_page()](PushModuleEeprom::push_page)\n- [.push_bank()](PushModuleEeprom::push_bank)\n- [.push_i2c_address()](PushModuleEeprom::push_i2c_address)\n\nReply attributes:\n- [.get_header()](IterableModuleEeprom::get_header)\n- [.get_data()](IterableModuleEeprom::get_data)\n\n"]
24386#[derive(Debug)]
24387pub struct OpModuleEepromGetDo<'r> {
24388    request: Request<'r>,
24389}
24390impl<'r> OpModuleEepromGetDo<'r> {
24391    pub fn new(mut request: Request<'r>) -> Self {
24392        Self::write_header(request.buf_mut());
24393        Self { request: request }
24394    }
24395    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushModuleEeprom<&'buf mut Vec<u8>> {
24396        Self::write_header(buf);
24397        PushModuleEeprom::new(buf)
24398    }
24399    pub fn encode(&mut self) -> PushModuleEeprom<&mut Vec<u8>> {
24400        PushModuleEeprom::new(self.request.buf_mut())
24401    }
24402    pub fn into_encoder(self) -> PushModuleEeprom<RequestBuf<'r>> {
24403        PushModuleEeprom::new(self.request.buf)
24404    }
24405    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableModuleEeprom<'a> {
24406        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24407        IterableModuleEeprom::with_loc(attrs, buf.as_ptr() as usize)
24408    }
24409    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24410        let mut header = BuiltinNfgenmsg::new();
24411        header.cmd = 45u8;
24412        header.version = 1u8;
24413        prev.as_vec_mut().extend(header.as_slice());
24414    }
24415}
24416impl NetlinkRequest for OpModuleEepromGetDo<'_> {
24417    fn protocol(&self) -> Protocol {
24418        Protocol::Generic("ethtool".as_bytes())
24419    }
24420    fn flags(&self) -> u16 {
24421        self.request.flags
24422    }
24423    fn payload(&self) -> &[u8] {
24424        self.request.buf()
24425    }
24426    type ReplyType<'buf> = IterableModuleEeprom<'buf>;
24427    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24428        Self::decode_request(buf)
24429    }
24430    fn lookup(
24431        buf: &[u8],
24432        offset: usize,
24433        missing_type: Option<u16>,
24434    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24435        Self::decode_request(buf).lookup_attr(offset, missing_type)
24436    }
24437}
24438#[doc = "Get statistics.\n\nRequest attributes:\n- [.nested_header()](PushStats::nested_header)\n- [.nested_groups()](PushStats::nested_groups)\n\nReply attributes:\n- [.get_header()](IterableStats::get_header)\n- [.get_groups()](IterableStats::get_groups)\n- [.get_grp()](IterableStats::get_grp)\n- [.get_src()](IterableStats::get_src)\n\n"]
24439#[derive(Debug)]
24440pub struct OpStatsGetDump<'r> {
24441    request: Request<'r>,
24442}
24443impl<'r> OpStatsGetDump<'r> {
24444    pub fn new(mut request: Request<'r>) -> Self {
24445        Self::write_header(request.buf_mut());
24446        Self {
24447            request: request.set_dump(),
24448        }
24449    }
24450    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushStats<&'buf mut Vec<u8>> {
24451        Self::write_header(buf);
24452        PushStats::new(buf)
24453    }
24454    pub fn encode(&mut self) -> PushStats<&mut Vec<u8>> {
24455        PushStats::new(self.request.buf_mut())
24456    }
24457    pub fn into_encoder(self) -> PushStats<RequestBuf<'r>> {
24458        PushStats::new(self.request.buf)
24459    }
24460    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableStats<'a> {
24461        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24462        IterableStats::with_loc(attrs, buf.as_ptr() as usize)
24463    }
24464    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24465        let mut header = BuiltinNfgenmsg::new();
24466        header.cmd = 46u8;
24467        header.version = 1u8;
24468        prev.as_vec_mut().extend(header.as_slice());
24469    }
24470}
24471impl NetlinkRequest for OpStatsGetDump<'_> {
24472    fn protocol(&self) -> Protocol {
24473        Protocol::Generic("ethtool".as_bytes())
24474    }
24475    fn flags(&self) -> u16 {
24476        self.request.flags
24477    }
24478    fn payload(&self) -> &[u8] {
24479        self.request.buf()
24480    }
24481    type ReplyType<'buf> = IterableStats<'buf>;
24482    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24483        Self::decode_request(buf)
24484    }
24485    fn lookup(
24486        buf: &[u8],
24487        offset: usize,
24488        missing_type: Option<u16>,
24489    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24490        Self::decode_request(buf).lookup_attr(offset, missing_type)
24491    }
24492}
24493#[doc = "Get statistics.\n\nRequest attributes:\n- [.nested_header()](PushStats::nested_header)\n- [.nested_groups()](PushStats::nested_groups)\n\nReply attributes:\n- [.get_header()](IterableStats::get_header)\n- [.get_groups()](IterableStats::get_groups)\n- [.get_grp()](IterableStats::get_grp)\n- [.get_src()](IterableStats::get_src)\n\n"]
24494#[derive(Debug)]
24495pub struct OpStatsGetDo<'r> {
24496    request: Request<'r>,
24497}
24498impl<'r> OpStatsGetDo<'r> {
24499    pub fn new(mut request: Request<'r>) -> Self {
24500        Self::write_header(request.buf_mut());
24501        Self { request: request }
24502    }
24503    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushStats<&'buf mut Vec<u8>> {
24504        Self::write_header(buf);
24505        PushStats::new(buf)
24506    }
24507    pub fn encode(&mut self) -> PushStats<&mut Vec<u8>> {
24508        PushStats::new(self.request.buf_mut())
24509    }
24510    pub fn into_encoder(self) -> PushStats<RequestBuf<'r>> {
24511        PushStats::new(self.request.buf)
24512    }
24513    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableStats<'a> {
24514        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24515        IterableStats::with_loc(attrs, buf.as_ptr() as usize)
24516    }
24517    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24518        let mut header = BuiltinNfgenmsg::new();
24519        header.cmd = 46u8;
24520        header.version = 1u8;
24521        prev.as_vec_mut().extend(header.as_slice());
24522    }
24523}
24524impl NetlinkRequest for OpStatsGetDo<'_> {
24525    fn protocol(&self) -> Protocol {
24526        Protocol::Generic("ethtool".as_bytes())
24527    }
24528    fn flags(&self) -> u16 {
24529        self.request.flags
24530    }
24531    fn payload(&self) -> &[u8] {
24532        self.request.buf()
24533    }
24534    type ReplyType<'buf> = IterableStats<'buf>;
24535    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24536        Self::decode_request(buf)
24537    }
24538    fn lookup(
24539        buf: &[u8],
24540        offset: usize,
24541        missing_type: Option<u16>,
24542    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24543        Self::decode_request(buf).lookup_attr(offset, missing_type)
24544    }
24545}
24546#[doc = "Get PHC VCLOCKs.\n\nRequest attributes:\n- [.nested_header()](PushPhcVclocks::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePhcVclocks::get_header)\n- [.get_num()](IterablePhcVclocks::get_num)\n\n"]
24547#[derive(Debug)]
24548pub struct OpPhcVclocksGetDump<'r> {
24549    request: Request<'r>,
24550}
24551impl<'r> OpPhcVclocksGetDump<'r> {
24552    pub fn new(mut request: Request<'r>) -> Self {
24553        Self::write_header(request.buf_mut());
24554        Self {
24555            request: request.set_dump(),
24556        }
24557    }
24558    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPhcVclocks<&'buf mut Vec<u8>> {
24559        Self::write_header(buf);
24560        PushPhcVclocks::new(buf)
24561    }
24562    pub fn encode(&mut self) -> PushPhcVclocks<&mut Vec<u8>> {
24563        PushPhcVclocks::new(self.request.buf_mut())
24564    }
24565    pub fn into_encoder(self) -> PushPhcVclocks<RequestBuf<'r>> {
24566        PushPhcVclocks::new(self.request.buf)
24567    }
24568    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePhcVclocks<'a> {
24569        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24570        IterablePhcVclocks::with_loc(attrs, buf.as_ptr() as usize)
24571    }
24572    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24573        let mut header = BuiltinNfgenmsg::new();
24574        header.cmd = 47u8;
24575        header.version = 1u8;
24576        prev.as_vec_mut().extend(header.as_slice());
24577    }
24578}
24579impl NetlinkRequest for OpPhcVclocksGetDump<'_> {
24580    fn protocol(&self) -> Protocol {
24581        Protocol::Generic("ethtool".as_bytes())
24582    }
24583    fn flags(&self) -> u16 {
24584        self.request.flags
24585    }
24586    fn payload(&self) -> &[u8] {
24587        self.request.buf()
24588    }
24589    type ReplyType<'buf> = IterablePhcVclocks<'buf>;
24590    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24591        Self::decode_request(buf)
24592    }
24593    fn lookup(
24594        buf: &[u8],
24595        offset: usize,
24596        missing_type: Option<u16>,
24597    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24598        Self::decode_request(buf).lookup_attr(offset, missing_type)
24599    }
24600}
24601#[doc = "Get PHC VCLOCKs.\n\nRequest attributes:\n- [.nested_header()](PushPhcVclocks::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePhcVclocks::get_header)\n- [.get_num()](IterablePhcVclocks::get_num)\n\n"]
24602#[derive(Debug)]
24603pub struct OpPhcVclocksGetDo<'r> {
24604    request: Request<'r>,
24605}
24606impl<'r> OpPhcVclocksGetDo<'r> {
24607    pub fn new(mut request: Request<'r>) -> Self {
24608        Self::write_header(request.buf_mut());
24609        Self { request: request }
24610    }
24611    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPhcVclocks<&'buf mut Vec<u8>> {
24612        Self::write_header(buf);
24613        PushPhcVclocks::new(buf)
24614    }
24615    pub fn encode(&mut self) -> PushPhcVclocks<&mut Vec<u8>> {
24616        PushPhcVclocks::new(self.request.buf_mut())
24617    }
24618    pub fn into_encoder(self) -> PushPhcVclocks<RequestBuf<'r>> {
24619        PushPhcVclocks::new(self.request.buf)
24620    }
24621    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePhcVclocks<'a> {
24622        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24623        IterablePhcVclocks::with_loc(attrs, buf.as_ptr() as usize)
24624    }
24625    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24626        let mut header = BuiltinNfgenmsg::new();
24627        header.cmd = 47u8;
24628        header.version = 1u8;
24629        prev.as_vec_mut().extend(header.as_slice());
24630    }
24631}
24632impl NetlinkRequest for OpPhcVclocksGetDo<'_> {
24633    fn protocol(&self) -> Protocol {
24634        Protocol::Generic("ethtool".as_bytes())
24635    }
24636    fn flags(&self) -> u16 {
24637        self.request.flags
24638    }
24639    fn payload(&self) -> &[u8] {
24640        self.request.buf()
24641    }
24642    type ReplyType<'buf> = IterablePhcVclocks<'buf>;
24643    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24644        Self::decode_request(buf)
24645    }
24646    fn lookup(
24647        buf: &[u8],
24648        offset: usize,
24649        missing_type: Option<u16>,
24650    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24651        Self::decode_request(buf).lookup_attr(offset, missing_type)
24652    }
24653}
24654#[doc = "Get module params.\n\nRequest attributes:\n- [.nested_header()](PushModule::nested_header)\n\nReply attributes:\n- [.get_header()](IterableModule::get_header)\n- [.get_power_mode_policy()](IterableModule::get_power_mode_policy)\n- [.get_power_mode()](IterableModule::get_power_mode)\n\n"]
24655#[derive(Debug)]
24656pub struct OpModuleGetDump<'r> {
24657    request: Request<'r>,
24658}
24659impl<'r> OpModuleGetDump<'r> {
24660    pub fn new(mut request: Request<'r>) -> Self {
24661        Self::write_header(request.buf_mut());
24662        Self {
24663            request: request.set_dump(),
24664        }
24665    }
24666    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushModule<&'buf mut Vec<u8>> {
24667        Self::write_header(buf);
24668        PushModule::new(buf)
24669    }
24670    pub fn encode(&mut self) -> PushModule<&mut Vec<u8>> {
24671        PushModule::new(self.request.buf_mut())
24672    }
24673    pub fn into_encoder(self) -> PushModule<RequestBuf<'r>> {
24674        PushModule::new(self.request.buf)
24675    }
24676    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableModule<'a> {
24677        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24678        IterableModule::with_loc(attrs, buf.as_ptr() as usize)
24679    }
24680    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24681        let mut header = BuiltinNfgenmsg::new();
24682        header.cmd = 48u8;
24683        header.version = 1u8;
24684        prev.as_vec_mut().extend(header.as_slice());
24685    }
24686}
24687impl NetlinkRequest for OpModuleGetDump<'_> {
24688    fn protocol(&self) -> Protocol {
24689        Protocol::Generic("ethtool".as_bytes())
24690    }
24691    fn flags(&self) -> u16 {
24692        self.request.flags
24693    }
24694    fn payload(&self) -> &[u8] {
24695        self.request.buf()
24696    }
24697    type ReplyType<'buf> = IterableModule<'buf>;
24698    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24699        Self::decode_request(buf)
24700    }
24701    fn lookup(
24702        buf: &[u8],
24703        offset: usize,
24704        missing_type: Option<u16>,
24705    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24706        Self::decode_request(buf).lookup_attr(offset, missing_type)
24707    }
24708}
24709#[doc = "Get module params.\n\nRequest attributes:\n- [.nested_header()](PushModule::nested_header)\n\nReply attributes:\n- [.get_header()](IterableModule::get_header)\n- [.get_power_mode_policy()](IterableModule::get_power_mode_policy)\n- [.get_power_mode()](IterableModule::get_power_mode)\n\n"]
24710#[derive(Debug)]
24711pub struct OpModuleGetDo<'r> {
24712    request: Request<'r>,
24713}
24714impl<'r> OpModuleGetDo<'r> {
24715    pub fn new(mut request: Request<'r>) -> Self {
24716        Self::write_header(request.buf_mut());
24717        Self { request: request }
24718    }
24719    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushModule<&'buf mut Vec<u8>> {
24720        Self::write_header(buf);
24721        PushModule::new(buf)
24722    }
24723    pub fn encode(&mut self) -> PushModule<&mut Vec<u8>> {
24724        PushModule::new(self.request.buf_mut())
24725    }
24726    pub fn into_encoder(self) -> PushModule<RequestBuf<'r>> {
24727        PushModule::new(self.request.buf)
24728    }
24729    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableModule<'a> {
24730        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24731        IterableModule::with_loc(attrs, buf.as_ptr() as usize)
24732    }
24733    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24734        let mut header = BuiltinNfgenmsg::new();
24735        header.cmd = 48u8;
24736        header.version = 1u8;
24737        prev.as_vec_mut().extend(header.as_slice());
24738    }
24739}
24740impl NetlinkRequest for OpModuleGetDo<'_> {
24741    fn protocol(&self) -> Protocol {
24742        Protocol::Generic("ethtool".as_bytes())
24743    }
24744    fn flags(&self) -> u16 {
24745        self.request.flags
24746    }
24747    fn payload(&self) -> &[u8] {
24748        self.request.buf()
24749    }
24750    type ReplyType<'buf> = IterableModule<'buf>;
24751    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24752        Self::decode_request(buf)
24753    }
24754    fn lookup(
24755        buf: &[u8],
24756        offset: usize,
24757        missing_type: Option<u16>,
24758    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24759        Self::decode_request(buf).lookup_attr(offset, missing_type)
24760    }
24761}
24762#[doc = "Set module params.\n\nRequest attributes:\n- [.nested_header()](PushModule::nested_header)\n- [.push_power_mode_policy()](PushModule::push_power_mode_policy)\n- [.push_power_mode()](PushModule::push_power_mode)\n\n"]
24763#[derive(Debug)]
24764pub struct OpModuleSetDo<'r> {
24765    request: Request<'r>,
24766}
24767impl<'r> OpModuleSetDo<'r> {
24768    pub fn new(mut request: Request<'r>) -> Self {
24769        Self::write_header(request.buf_mut());
24770        Self { request: request }
24771    }
24772    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushModule<&'buf mut Vec<u8>> {
24773        Self::write_header(buf);
24774        PushModule::new(buf)
24775    }
24776    pub fn encode(&mut self) -> PushModule<&mut Vec<u8>> {
24777        PushModule::new(self.request.buf_mut())
24778    }
24779    pub fn into_encoder(self) -> PushModule<RequestBuf<'r>> {
24780        PushModule::new(self.request.buf)
24781    }
24782    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableModule<'a> {
24783        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24784        IterableModule::with_loc(attrs, buf.as_ptr() as usize)
24785    }
24786    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24787        let mut header = BuiltinNfgenmsg::new();
24788        header.cmd = 49u8;
24789        header.version = 1u8;
24790        prev.as_vec_mut().extend(header.as_slice());
24791    }
24792}
24793impl NetlinkRequest for OpModuleSetDo<'_> {
24794    fn protocol(&self) -> Protocol {
24795        Protocol::Generic("ethtool".as_bytes())
24796    }
24797    fn flags(&self) -> u16 {
24798        self.request.flags
24799    }
24800    fn payload(&self) -> &[u8] {
24801        self.request.buf()
24802    }
24803    type ReplyType<'buf> = IterableModule<'buf>;
24804    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24805        Self::decode_request(buf)
24806    }
24807    fn lookup(
24808        buf: &[u8],
24809        offset: usize,
24810        missing_type: Option<u16>,
24811    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24812        Self::decode_request(buf).lookup_attr(offset, missing_type)
24813    }
24814}
24815#[doc = "Get Power Sourcing Equipment params.\n\nRequest attributes:\n- [.nested_header()](PushPse::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePse::get_header)\n- [.get_podl_pse_admin_state()](IterablePse::get_podl_pse_admin_state)\n- [.get_podl_pse_admin_control()](IterablePse::get_podl_pse_admin_control)\n- [.get_podl_pse_pw_d_status()](IterablePse::get_podl_pse_pw_d_status)\n- [.get_c33_pse_admin_state()](IterablePse::get_c33_pse_admin_state)\n- [.get_c33_pse_admin_control()](IterablePse::get_c33_pse_admin_control)\n- [.get_c33_pse_pw_d_status()](IterablePse::get_c33_pse_pw_d_status)\n- [.get_c33_pse_pw_class()](IterablePse::get_c33_pse_pw_class)\n- [.get_c33_pse_actual_pw()](IterablePse::get_c33_pse_actual_pw)\n- [.get_c33_pse_ext_state()](IterablePse::get_c33_pse_ext_state)\n- [.get_c33_pse_ext_substate()](IterablePse::get_c33_pse_ext_substate)\n- [.get_c33_pse_avail_pw_limit()](IterablePse::get_c33_pse_avail_pw_limit)\n- [.get_c33_pse_pw_limit_ranges()](IterablePse::get_c33_pse_pw_limit_ranges)\n- [.get_pse_pw_d_id()](IterablePse::get_pse_pw_d_id)\n- [.get_pse_prio_max()](IterablePse::get_pse_prio_max)\n- [.get_pse_prio()](IterablePse::get_pse_prio)\n\n"]
24816#[derive(Debug)]
24817pub struct OpPseGetDump<'r> {
24818    request: Request<'r>,
24819}
24820impl<'r> OpPseGetDump<'r> {
24821    pub fn new(mut request: Request<'r>) -> Self {
24822        Self::write_header(request.buf_mut());
24823        Self {
24824            request: request.set_dump(),
24825        }
24826    }
24827    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPse<&'buf mut Vec<u8>> {
24828        Self::write_header(buf);
24829        PushPse::new(buf)
24830    }
24831    pub fn encode(&mut self) -> PushPse<&mut Vec<u8>> {
24832        PushPse::new(self.request.buf_mut())
24833    }
24834    pub fn into_encoder(self) -> PushPse<RequestBuf<'r>> {
24835        PushPse::new(self.request.buf)
24836    }
24837    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePse<'a> {
24838        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24839        IterablePse::with_loc(attrs, buf.as_ptr() as usize)
24840    }
24841    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24842        let mut header = BuiltinNfgenmsg::new();
24843        header.cmd = 51u8;
24844        header.version = 1u8;
24845        prev.as_vec_mut().extend(header.as_slice());
24846    }
24847}
24848impl NetlinkRequest for OpPseGetDump<'_> {
24849    fn protocol(&self) -> Protocol {
24850        Protocol::Generic("ethtool".as_bytes())
24851    }
24852    fn flags(&self) -> u16 {
24853        self.request.flags
24854    }
24855    fn payload(&self) -> &[u8] {
24856        self.request.buf()
24857    }
24858    type ReplyType<'buf> = IterablePse<'buf>;
24859    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24860        Self::decode_request(buf)
24861    }
24862    fn lookup(
24863        buf: &[u8],
24864        offset: usize,
24865        missing_type: Option<u16>,
24866    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24867        Self::decode_request(buf).lookup_attr(offset, missing_type)
24868    }
24869}
24870#[doc = "Get Power Sourcing Equipment params.\n\nRequest attributes:\n- [.nested_header()](PushPse::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePse::get_header)\n- [.get_podl_pse_admin_state()](IterablePse::get_podl_pse_admin_state)\n- [.get_podl_pse_admin_control()](IterablePse::get_podl_pse_admin_control)\n- [.get_podl_pse_pw_d_status()](IterablePse::get_podl_pse_pw_d_status)\n- [.get_c33_pse_admin_state()](IterablePse::get_c33_pse_admin_state)\n- [.get_c33_pse_admin_control()](IterablePse::get_c33_pse_admin_control)\n- [.get_c33_pse_pw_d_status()](IterablePse::get_c33_pse_pw_d_status)\n- [.get_c33_pse_pw_class()](IterablePse::get_c33_pse_pw_class)\n- [.get_c33_pse_actual_pw()](IterablePse::get_c33_pse_actual_pw)\n- [.get_c33_pse_ext_state()](IterablePse::get_c33_pse_ext_state)\n- [.get_c33_pse_ext_substate()](IterablePse::get_c33_pse_ext_substate)\n- [.get_c33_pse_avail_pw_limit()](IterablePse::get_c33_pse_avail_pw_limit)\n- [.get_c33_pse_pw_limit_ranges()](IterablePse::get_c33_pse_pw_limit_ranges)\n- [.get_pse_pw_d_id()](IterablePse::get_pse_pw_d_id)\n- [.get_pse_prio_max()](IterablePse::get_pse_prio_max)\n- [.get_pse_prio()](IterablePse::get_pse_prio)\n\n"]
24871#[derive(Debug)]
24872pub struct OpPseGetDo<'r> {
24873    request: Request<'r>,
24874}
24875impl<'r> OpPseGetDo<'r> {
24876    pub fn new(mut request: Request<'r>) -> Self {
24877        Self::write_header(request.buf_mut());
24878        Self { request: request }
24879    }
24880    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPse<&'buf mut Vec<u8>> {
24881        Self::write_header(buf);
24882        PushPse::new(buf)
24883    }
24884    pub fn encode(&mut self) -> PushPse<&mut Vec<u8>> {
24885        PushPse::new(self.request.buf_mut())
24886    }
24887    pub fn into_encoder(self) -> PushPse<RequestBuf<'r>> {
24888        PushPse::new(self.request.buf)
24889    }
24890    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePse<'a> {
24891        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24892        IterablePse::with_loc(attrs, buf.as_ptr() as usize)
24893    }
24894    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24895        let mut header = BuiltinNfgenmsg::new();
24896        header.cmd = 51u8;
24897        header.version = 1u8;
24898        prev.as_vec_mut().extend(header.as_slice());
24899    }
24900}
24901impl NetlinkRequest for OpPseGetDo<'_> {
24902    fn protocol(&self) -> Protocol {
24903        Protocol::Generic("ethtool".as_bytes())
24904    }
24905    fn flags(&self) -> u16 {
24906        self.request.flags
24907    }
24908    fn payload(&self) -> &[u8] {
24909        self.request.buf()
24910    }
24911    type ReplyType<'buf> = IterablePse<'buf>;
24912    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24913        Self::decode_request(buf)
24914    }
24915    fn lookup(
24916        buf: &[u8],
24917        offset: usize,
24918        missing_type: Option<u16>,
24919    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24920        Self::decode_request(buf).lookup_attr(offset, missing_type)
24921    }
24922}
24923#[doc = "Set Power Sourcing Equipment params.\n\nRequest attributes:\n- [.nested_header()](PushPse::nested_header)\n- [.push_podl_pse_admin_control()](PushPse::push_podl_pse_admin_control)\n- [.push_c33_pse_admin_control()](PushPse::push_c33_pse_admin_control)\n- [.push_c33_pse_avail_pw_limit()](PushPse::push_c33_pse_avail_pw_limit)\n- [.push_pse_prio()](PushPse::push_pse_prio)\n\n"]
24924#[derive(Debug)]
24925pub struct OpPseSetDo<'r> {
24926    request: Request<'r>,
24927}
24928impl<'r> OpPseSetDo<'r> {
24929    pub fn new(mut request: Request<'r>) -> Self {
24930        Self::write_header(request.buf_mut());
24931        Self { request: request }
24932    }
24933    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPse<&'buf mut Vec<u8>> {
24934        Self::write_header(buf);
24935        PushPse::new(buf)
24936    }
24937    pub fn encode(&mut self) -> PushPse<&mut Vec<u8>> {
24938        PushPse::new(self.request.buf_mut())
24939    }
24940    pub fn into_encoder(self) -> PushPse<RequestBuf<'r>> {
24941        PushPse::new(self.request.buf)
24942    }
24943    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePse<'a> {
24944        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
24945        IterablePse::with_loc(attrs, buf.as_ptr() as usize)
24946    }
24947    fn write_header<Prev: Pusher>(prev: &mut Prev) {
24948        let mut header = BuiltinNfgenmsg::new();
24949        header.cmd = 52u8;
24950        header.version = 1u8;
24951        prev.as_vec_mut().extend(header.as_slice());
24952    }
24953}
24954impl NetlinkRequest for OpPseSetDo<'_> {
24955    fn protocol(&self) -> Protocol {
24956        Protocol::Generic("ethtool".as_bytes())
24957    }
24958    fn flags(&self) -> u16 {
24959        self.request.flags
24960    }
24961    fn payload(&self) -> &[u8] {
24962        self.request.buf()
24963    }
24964    type ReplyType<'buf> = IterablePse<'buf>;
24965    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
24966        Self::decode_request(buf)
24967    }
24968    fn lookup(
24969        buf: &[u8],
24970        offset: usize,
24971        missing_type: Option<u16>,
24972    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
24973        Self::decode_request(buf).lookup_attr(offset, missing_type)
24974    }
24975}
24976#[doc = "Get RSS params.\n\nRequest attributes:\n- [.nested_header()](PushRss::nested_header)\n- [.push_start_context()](PushRss::push_start_context)\n\nReply attributes:\n- [.get_header()](IterableRss::get_header)\n- [.get_context()](IterableRss::get_context)\n- [.get_hfunc()](IterableRss::get_hfunc)\n- [.get_indir()](IterableRss::get_indir)\n- [.get_hkey()](IterableRss::get_hkey)\n- [.get_input_xfrm()](IterableRss::get_input_xfrm)\n- [.get_flow_hash()](IterableRss::get_flow_hash)\n\n"]
24977#[derive(Debug)]
24978pub struct OpRssGetDump<'r> {
24979    request: Request<'r>,
24980}
24981impl<'r> OpRssGetDump<'r> {
24982    pub fn new(mut request: Request<'r>) -> Self {
24983        Self::write_header(request.buf_mut());
24984        Self {
24985            request: request.set_dump(),
24986        }
24987    }
24988    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushRss<&'buf mut Vec<u8>> {
24989        Self::write_header(buf);
24990        PushRss::new(buf)
24991    }
24992    pub fn encode(&mut self) -> PushRss<&mut Vec<u8>> {
24993        PushRss::new(self.request.buf_mut())
24994    }
24995    pub fn into_encoder(self) -> PushRss<RequestBuf<'r>> {
24996        PushRss::new(self.request.buf)
24997    }
24998    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableRss<'a> {
24999        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25000        IterableRss::with_loc(attrs, buf.as_ptr() as usize)
25001    }
25002    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25003        let mut header = BuiltinNfgenmsg::new();
25004        header.cmd = 53u8;
25005        header.version = 1u8;
25006        prev.as_vec_mut().extend(header.as_slice());
25007    }
25008}
25009impl NetlinkRequest for OpRssGetDump<'_> {
25010    fn protocol(&self) -> Protocol {
25011        Protocol::Generic("ethtool".as_bytes())
25012    }
25013    fn flags(&self) -> u16 {
25014        self.request.flags
25015    }
25016    fn payload(&self) -> &[u8] {
25017        self.request.buf()
25018    }
25019    type ReplyType<'buf> = IterableRss<'buf>;
25020    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25021        Self::decode_request(buf)
25022    }
25023    fn lookup(
25024        buf: &[u8],
25025        offset: usize,
25026        missing_type: Option<u16>,
25027    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25028        Self::decode_request(buf).lookup_attr(offset, missing_type)
25029    }
25030}
25031#[doc = "Get RSS params.\n\nRequest attributes:\n- [.nested_header()](PushRss::nested_header)\n- [.push_context()](PushRss::push_context)\n\nReply attributes:\n- [.get_header()](IterableRss::get_header)\n- [.get_context()](IterableRss::get_context)\n- [.get_hfunc()](IterableRss::get_hfunc)\n- [.get_indir()](IterableRss::get_indir)\n- [.get_hkey()](IterableRss::get_hkey)\n- [.get_input_xfrm()](IterableRss::get_input_xfrm)\n- [.get_flow_hash()](IterableRss::get_flow_hash)\n\n"]
25032#[derive(Debug)]
25033pub struct OpRssGetDo<'r> {
25034    request: Request<'r>,
25035}
25036impl<'r> OpRssGetDo<'r> {
25037    pub fn new(mut request: Request<'r>) -> Self {
25038        Self::write_header(request.buf_mut());
25039        Self { request: request }
25040    }
25041    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushRss<&'buf mut Vec<u8>> {
25042        Self::write_header(buf);
25043        PushRss::new(buf)
25044    }
25045    pub fn encode(&mut self) -> PushRss<&mut Vec<u8>> {
25046        PushRss::new(self.request.buf_mut())
25047    }
25048    pub fn into_encoder(self) -> PushRss<RequestBuf<'r>> {
25049        PushRss::new(self.request.buf)
25050    }
25051    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableRss<'a> {
25052        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25053        IterableRss::with_loc(attrs, buf.as_ptr() as usize)
25054    }
25055    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25056        let mut header = BuiltinNfgenmsg::new();
25057        header.cmd = 53u8;
25058        header.version = 1u8;
25059        prev.as_vec_mut().extend(header.as_slice());
25060    }
25061}
25062impl NetlinkRequest for OpRssGetDo<'_> {
25063    fn protocol(&self) -> Protocol {
25064        Protocol::Generic("ethtool".as_bytes())
25065    }
25066    fn flags(&self) -> u16 {
25067        self.request.flags
25068    }
25069    fn payload(&self) -> &[u8] {
25070        self.request.buf()
25071    }
25072    type ReplyType<'buf> = IterableRss<'buf>;
25073    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25074        Self::decode_request(buf)
25075    }
25076    fn lookup(
25077        buf: &[u8],
25078        offset: usize,
25079        missing_type: Option<u16>,
25080    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25081        Self::decode_request(buf).lookup_attr(offset, missing_type)
25082    }
25083}
25084#[doc = "Get PLCA params.\n\nRequest attributes:\n- [.nested_header()](PushPlca::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePlca::get_header)\n- [.get_version()](IterablePlca::get_version)\n- [.get_enabled()](IterablePlca::get_enabled)\n- [.get_status()](IterablePlca::get_status)\n- [.get_node_cnt()](IterablePlca::get_node_cnt)\n- [.get_node_id()](IterablePlca::get_node_id)\n- [.get_to_tmr()](IterablePlca::get_to_tmr)\n- [.get_burst_cnt()](IterablePlca::get_burst_cnt)\n- [.get_burst_tmr()](IterablePlca::get_burst_tmr)\n\n"]
25085#[derive(Debug)]
25086pub struct OpPlcaGetCfgDump<'r> {
25087    request: Request<'r>,
25088}
25089impl<'r> OpPlcaGetCfgDump<'r> {
25090    pub fn new(mut request: Request<'r>) -> Self {
25091        Self::write_header(request.buf_mut());
25092        Self {
25093            request: request.set_dump(),
25094        }
25095    }
25096    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPlca<&'buf mut Vec<u8>> {
25097        Self::write_header(buf);
25098        PushPlca::new(buf)
25099    }
25100    pub fn encode(&mut self) -> PushPlca<&mut Vec<u8>> {
25101        PushPlca::new(self.request.buf_mut())
25102    }
25103    pub fn into_encoder(self) -> PushPlca<RequestBuf<'r>> {
25104        PushPlca::new(self.request.buf)
25105    }
25106    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePlca<'a> {
25107        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25108        IterablePlca::with_loc(attrs, buf.as_ptr() as usize)
25109    }
25110    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25111        let mut header = BuiltinNfgenmsg::new();
25112        header.cmd = 54u8;
25113        header.version = 1u8;
25114        prev.as_vec_mut().extend(header.as_slice());
25115    }
25116}
25117impl NetlinkRequest for OpPlcaGetCfgDump<'_> {
25118    fn protocol(&self) -> Protocol {
25119        Protocol::Generic("ethtool".as_bytes())
25120    }
25121    fn flags(&self) -> u16 {
25122        self.request.flags
25123    }
25124    fn payload(&self) -> &[u8] {
25125        self.request.buf()
25126    }
25127    type ReplyType<'buf> = IterablePlca<'buf>;
25128    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25129        Self::decode_request(buf)
25130    }
25131    fn lookup(
25132        buf: &[u8],
25133        offset: usize,
25134        missing_type: Option<u16>,
25135    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25136        Self::decode_request(buf).lookup_attr(offset, missing_type)
25137    }
25138}
25139#[doc = "Get PLCA params.\n\nRequest attributes:\n- [.nested_header()](PushPlca::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePlca::get_header)\n- [.get_version()](IterablePlca::get_version)\n- [.get_enabled()](IterablePlca::get_enabled)\n- [.get_status()](IterablePlca::get_status)\n- [.get_node_cnt()](IterablePlca::get_node_cnt)\n- [.get_node_id()](IterablePlca::get_node_id)\n- [.get_to_tmr()](IterablePlca::get_to_tmr)\n- [.get_burst_cnt()](IterablePlca::get_burst_cnt)\n- [.get_burst_tmr()](IterablePlca::get_burst_tmr)\n\n"]
25140#[derive(Debug)]
25141pub struct OpPlcaGetCfgDo<'r> {
25142    request: Request<'r>,
25143}
25144impl<'r> OpPlcaGetCfgDo<'r> {
25145    pub fn new(mut request: Request<'r>) -> Self {
25146        Self::write_header(request.buf_mut());
25147        Self { request: request }
25148    }
25149    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPlca<&'buf mut Vec<u8>> {
25150        Self::write_header(buf);
25151        PushPlca::new(buf)
25152    }
25153    pub fn encode(&mut self) -> PushPlca<&mut Vec<u8>> {
25154        PushPlca::new(self.request.buf_mut())
25155    }
25156    pub fn into_encoder(self) -> PushPlca<RequestBuf<'r>> {
25157        PushPlca::new(self.request.buf)
25158    }
25159    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePlca<'a> {
25160        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25161        IterablePlca::with_loc(attrs, buf.as_ptr() as usize)
25162    }
25163    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25164        let mut header = BuiltinNfgenmsg::new();
25165        header.cmd = 54u8;
25166        header.version = 1u8;
25167        prev.as_vec_mut().extend(header.as_slice());
25168    }
25169}
25170impl NetlinkRequest for OpPlcaGetCfgDo<'_> {
25171    fn protocol(&self) -> Protocol {
25172        Protocol::Generic("ethtool".as_bytes())
25173    }
25174    fn flags(&self) -> u16 {
25175        self.request.flags
25176    }
25177    fn payload(&self) -> &[u8] {
25178        self.request.buf()
25179    }
25180    type ReplyType<'buf> = IterablePlca<'buf>;
25181    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25182        Self::decode_request(buf)
25183    }
25184    fn lookup(
25185        buf: &[u8],
25186        offset: usize,
25187        missing_type: Option<u16>,
25188    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25189        Self::decode_request(buf).lookup_attr(offset, missing_type)
25190    }
25191}
25192#[doc = "Set PLCA params.\n\nRequest attributes:\n- [.nested_header()](PushPlca::nested_header)\n- [.push_version()](PushPlca::push_version)\n- [.push_enabled()](PushPlca::push_enabled)\n- [.push_status()](PushPlca::push_status)\n- [.push_node_cnt()](PushPlca::push_node_cnt)\n- [.push_node_id()](PushPlca::push_node_id)\n- [.push_to_tmr()](PushPlca::push_to_tmr)\n- [.push_burst_cnt()](PushPlca::push_burst_cnt)\n- [.push_burst_tmr()](PushPlca::push_burst_tmr)\n\n"]
25193#[derive(Debug)]
25194pub struct OpPlcaSetCfgDo<'r> {
25195    request: Request<'r>,
25196}
25197impl<'r> OpPlcaSetCfgDo<'r> {
25198    pub fn new(mut request: Request<'r>) -> Self {
25199        Self::write_header(request.buf_mut());
25200        Self { request: request }
25201    }
25202    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPlca<&'buf mut Vec<u8>> {
25203        Self::write_header(buf);
25204        PushPlca::new(buf)
25205    }
25206    pub fn encode(&mut self) -> PushPlca<&mut Vec<u8>> {
25207        PushPlca::new(self.request.buf_mut())
25208    }
25209    pub fn into_encoder(self) -> PushPlca<RequestBuf<'r>> {
25210        PushPlca::new(self.request.buf)
25211    }
25212    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePlca<'a> {
25213        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25214        IterablePlca::with_loc(attrs, buf.as_ptr() as usize)
25215    }
25216    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25217        let mut header = BuiltinNfgenmsg::new();
25218        header.cmd = 55u8;
25219        header.version = 1u8;
25220        prev.as_vec_mut().extend(header.as_slice());
25221    }
25222}
25223impl NetlinkRequest for OpPlcaSetCfgDo<'_> {
25224    fn protocol(&self) -> Protocol {
25225        Protocol::Generic("ethtool".as_bytes())
25226    }
25227    fn flags(&self) -> u16 {
25228        self.request.flags
25229    }
25230    fn payload(&self) -> &[u8] {
25231        self.request.buf()
25232    }
25233    type ReplyType<'buf> = IterablePlca<'buf>;
25234    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25235        Self::decode_request(buf)
25236    }
25237    fn lookup(
25238        buf: &[u8],
25239        offset: usize,
25240        missing_type: Option<u16>,
25241    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25242        Self::decode_request(buf).lookup_attr(offset, missing_type)
25243    }
25244}
25245#[doc = "Get PLCA status params.\n\nRequest attributes:\n- [.nested_header()](PushPlca::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePlca::get_header)\n- [.get_version()](IterablePlca::get_version)\n- [.get_enabled()](IterablePlca::get_enabled)\n- [.get_status()](IterablePlca::get_status)\n- [.get_node_cnt()](IterablePlca::get_node_cnt)\n- [.get_node_id()](IterablePlca::get_node_id)\n- [.get_to_tmr()](IterablePlca::get_to_tmr)\n- [.get_burst_cnt()](IterablePlca::get_burst_cnt)\n- [.get_burst_tmr()](IterablePlca::get_burst_tmr)\n\n"]
25246#[derive(Debug)]
25247pub struct OpPlcaGetStatusDump<'r> {
25248    request: Request<'r>,
25249}
25250impl<'r> OpPlcaGetStatusDump<'r> {
25251    pub fn new(mut request: Request<'r>) -> Self {
25252        Self::write_header(request.buf_mut());
25253        Self {
25254            request: request.set_dump(),
25255        }
25256    }
25257    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPlca<&'buf mut Vec<u8>> {
25258        Self::write_header(buf);
25259        PushPlca::new(buf)
25260    }
25261    pub fn encode(&mut self) -> PushPlca<&mut Vec<u8>> {
25262        PushPlca::new(self.request.buf_mut())
25263    }
25264    pub fn into_encoder(self) -> PushPlca<RequestBuf<'r>> {
25265        PushPlca::new(self.request.buf)
25266    }
25267    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePlca<'a> {
25268        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25269        IterablePlca::with_loc(attrs, buf.as_ptr() as usize)
25270    }
25271    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25272        let mut header = BuiltinNfgenmsg::new();
25273        header.cmd = 56u8;
25274        header.version = 1u8;
25275        prev.as_vec_mut().extend(header.as_slice());
25276    }
25277}
25278impl NetlinkRequest for OpPlcaGetStatusDump<'_> {
25279    fn protocol(&self) -> Protocol {
25280        Protocol::Generic("ethtool".as_bytes())
25281    }
25282    fn flags(&self) -> u16 {
25283        self.request.flags
25284    }
25285    fn payload(&self) -> &[u8] {
25286        self.request.buf()
25287    }
25288    type ReplyType<'buf> = IterablePlca<'buf>;
25289    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25290        Self::decode_request(buf)
25291    }
25292    fn lookup(
25293        buf: &[u8],
25294        offset: usize,
25295        missing_type: Option<u16>,
25296    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25297        Self::decode_request(buf).lookup_attr(offset, missing_type)
25298    }
25299}
25300#[doc = "Get PLCA status params.\n\nRequest attributes:\n- [.nested_header()](PushPlca::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePlca::get_header)\n- [.get_version()](IterablePlca::get_version)\n- [.get_enabled()](IterablePlca::get_enabled)\n- [.get_status()](IterablePlca::get_status)\n- [.get_node_cnt()](IterablePlca::get_node_cnt)\n- [.get_node_id()](IterablePlca::get_node_id)\n- [.get_to_tmr()](IterablePlca::get_to_tmr)\n- [.get_burst_cnt()](IterablePlca::get_burst_cnt)\n- [.get_burst_tmr()](IterablePlca::get_burst_tmr)\n\n"]
25301#[derive(Debug)]
25302pub struct OpPlcaGetStatusDo<'r> {
25303    request: Request<'r>,
25304}
25305impl<'r> OpPlcaGetStatusDo<'r> {
25306    pub fn new(mut request: Request<'r>) -> Self {
25307        Self::write_header(request.buf_mut());
25308        Self { request: request }
25309    }
25310    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPlca<&'buf mut Vec<u8>> {
25311        Self::write_header(buf);
25312        PushPlca::new(buf)
25313    }
25314    pub fn encode(&mut self) -> PushPlca<&mut Vec<u8>> {
25315        PushPlca::new(self.request.buf_mut())
25316    }
25317    pub fn into_encoder(self) -> PushPlca<RequestBuf<'r>> {
25318        PushPlca::new(self.request.buf)
25319    }
25320    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePlca<'a> {
25321        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25322        IterablePlca::with_loc(attrs, buf.as_ptr() as usize)
25323    }
25324    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25325        let mut header = BuiltinNfgenmsg::new();
25326        header.cmd = 56u8;
25327        header.version = 1u8;
25328        prev.as_vec_mut().extend(header.as_slice());
25329    }
25330}
25331impl NetlinkRequest for OpPlcaGetStatusDo<'_> {
25332    fn protocol(&self) -> Protocol {
25333        Protocol::Generic("ethtool".as_bytes())
25334    }
25335    fn flags(&self) -> u16 {
25336        self.request.flags
25337    }
25338    fn payload(&self) -> &[u8] {
25339        self.request.buf()
25340    }
25341    type ReplyType<'buf> = IterablePlca<'buf>;
25342    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25343        Self::decode_request(buf)
25344    }
25345    fn lookup(
25346        buf: &[u8],
25347        offset: usize,
25348        missing_type: Option<u16>,
25349    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25350        Self::decode_request(buf).lookup_attr(offset, missing_type)
25351    }
25352}
25353#[doc = "Get MAC Merge configuration and state\n\nRequest attributes:\n- [.nested_header()](PushMm::nested_header)\n\nReply attributes:\n- [.get_header()](IterableMm::get_header)\n- [.get_pmac_enabled()](IterableMm::get_pmac_enabled)\n- [.get_tx_enabled()](IterableMm::get_tx_enabled)\n- [.get_tx_active()](IterableMm::get_tx_active)\n- [.get_tx_min_frag_size()](IterableMm::get_tx_min_frag_size)\n- [.get_rx_min_frag_size()](IterableMm::get_rx_min_frag_size)\n- [.get_verify_enabled()](IterableMm::get_verify_enabled)\n- [.get_verify_time()](IterableMm::get_verify_time)\n- [.get_max_verify_time()](IterableMm::get_max_verify_time)\n- [.get_stats()](IterableMm::get_stats)\n\n"]
25354#[derive(Debug)]
25355pub struct OpMmGetDump<'r> {
25356    request: Request<'r>,
25357}
25358impl<'r> OpMmGetDump<'r> {
25359    pub fn new(mut request: Request<'r>) -> Self {
25360        Self::write_header(request.buf_mut());
25361        Self {
25362            request: request.set_dump(),
25363        }
25364    }
25365    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushMm<&'buf mut Vec<u8>> {
25366        Self::write_header(buf);
25367        PushMm::new(buf)
25368    }
25369    pub fn encode(&mut self) -> PushMm<&mut Vec<u8>> {
25370        PushMm::new(self.request.buf_mut())
25371    }
25372    pub fn into_encoder(self) -> PushMm<RequestBuf<'r>> {
25373        PushMm::new(self.request.buf)
25374    }
25375    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableMm<'a> {
25376        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25377        IterableMm::with_loc(attrs, buf.as_ptr() as usize)
25378    }
25379    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25380        let mut header = BuiltinNfgenmsg::new();
25381        header.cmd = 58u8;
25382        header.version = 1u8;
25383        prev.as_vec_mut().extend(header.as_slice());
25384    }
25385}
25386impl NetlinkRequest for OpMmGetDump<'_> {
25387    fn protocol(&self) -> Protocol {
25388        Protocol::Generic("ethtool".as_bytes())
25389    }
25390    fn flags(&self) -> u16 {
25391        self.request.flags
25392    }
25393    fn payload(&self) -> &[u8] {
25394        self.request.buf()
25395    }
25396    type ReplyType<'buf> = IterableMm<'buf>;
25397    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25398        Self::decode_request(buf)
25399    }
25400    fn lookup(
25401        buf: &[u8],
25402        offset: usize,
25403        missing_type: Option<u16>,
25404    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25405        Self::decode_request(buf).lookup_attr(offset, missing_type)
25406    }
25407}
25408#[doc = "Get MAC Merge configuration and state\n\nRequest attributes:\n- [.nested_header()](PushMm::nested_header)\n\nReply attributes:\n- [.get_header()](IterableMm::get_header)\n- [.get_pmac_enabled()](IterableMm::get_pmac_enabled)\n- [.get_tx_enabled()](IterableMm::get_tx_enabled)\n- [.get_tx_active()](IterableMm::get_tx_active)\n- [.get_tx_min_frag_size()](IterableMm::get_tx_min_frag_size)\n- [.get_rx_min_frag_size()](IterableMm::get_rx_min_frag_size)\n- [.get_verify_enabled()](IterableMm::get_verify_enabled)\n- [.get_verify_time()](IterableMm::get_verify_time)\n- [.get_max_verify_time()](IterableMm::get_max_verify_time)\n- [.get_stats()](IterableMm::get_stats)\n\n"]
25409#[derive(Debug)]
25410pub struct OpMmGetDo<'r> {
25411    request: Request<'r>,
25412}
25413impl<'r> OpMmGetDo<'r> {
25414    pub fn new(mut request: Request<'r>) -> Self {
25415        Self::write_header(request.buf_mut());
25416        Self { request: request }
25417    }
25418    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushMm<&'buf mut Vec<u8>> {
25419        Self::write_header(buf);
25420        PushMm::new(buf)
25421    }
25422    pub fn encode(&mut self) -> PushMm<&mut Vec<u8>> {
25423        PushMm::new(self.request.buf_mut())
25424    }
25425    pub fn into_encoder(self) -> PushMm<RequestBuf<'r>> {
25426        PushMm::new(self.request.buf)
25427    }
25428    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableMm<'a> {
25429        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25430        IterableMm::with_loc(attrs, buf.as_ptr() as usize)
25431    }
25432    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25433        let mut header = BuiltinNfgenmsg::new();
25434        header.cmd = 58u8;
25435        header.version = 1u8;
25436        prev.as_vec_mut().extend(header.as_slice());
25437    }
25438}
25439impl NetlinkRequest for OpMmGetDo<'_> {
25440    fn protocol(&self) -> Protocol {
25441        Protocol::Generic("ethtool".as_bytes())
25442    }
25443    fn flags(&self) -> u16 {
25444        self.request.flags
25445    }
25446    fn payload(&self) -> &[u8] {
25447        self.request.buf()
25448    }
25449    type ReplyType<'buf> = IterableMm<'buf>;
25450    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25451        Self::decode_request(buf)
25452    }
25453    fn lookup(
25454        buf: &[u8],
25455        offset: usize,
25456        missing_type: Option<u16>,
25457    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25458        Self::decode_request(buf).lookup_attr(offset, missing_type)
25459    }
25460}
25461#[doc = "Set MAC Merge configuration\n\nRequest attributes:\n- [.nested_header()](PushMm::nested_header)\n- [.push_pmac_enabled()](PushMm::push_pmac_enabled)\n- [.push_tx_enabled()](PushMm::push_tx_enabled)\n- [.push_tx_min_frag_size()](PushMm::push_tx_min_frag_size)\n- [.push_verify_enabled()](PushMm::push_verify_enabled)\n- [.push_verify_time()](PushMm::push_verify_time)\n\n"]
25462#[derive(Debug)]
25463pub struct OpMmSetDo<'r> {
25464    request: Request<'r>,
25465}
25466impl<'r> OpMmSetDo<'r> {
25467    pub fn new(mut request: Request<'r>) -> Self {
25468        Self::write_header(request.buf_mut());
25469        Self { request: request }
25470    }
25471    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushMm<&'buf mut Vec<u8>> {
25472        Self::write_header(buf);
25473        PushMm::new(buf)
25474    }
25475    pub fn encode(&mut self) -> PushMm<&mut Vec<u8>> {
25476        PushMm::new(self.request.buf_mut())
25477    }
25478    pub fn into_encoder(self) -> PushMm<RequestBuf<'r>> {
25479        PushMm::new(self.request.buf)
25480    }
25481    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableMm<'a> {
25482        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25483        IterableMm::with_loc(attrs, buf.as_ptr() as usize)
25484    }
25485    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25486        let mut header = BuiltinNfgenmsg::new();
25487        header.cmd = 59u8;
25488        header.version = 1u8;
25489        prev.as_vec_mut().extend(header.as_slice());
25490    }
25491}
25492impl NetlinkRequest for OpMmSetDo<'_> {
25493    fn protocol(&self) -> Protocol {
25494        Protocol::Generic("ethtool".as_bytes())
25495    }
25496    fn flags(&self) -> u16 {
25497        self.request.flags
25498    }
25499    fn payload(&self) -> &[u8] {
25500        self.request.buf()
25501    }
25502    type ReplyType<'buf> = IterableMm<'buf>;
25503    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25504        Self::decode_request(buf)
25505    }
25506    fn lookup(
25507        buf: &[u8],
25508        offset: usize,
25509        missing_type: Option<u16>,
25510    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25511        Self::decode_request(buf).lookup_attr(offset, missing_type)
25512    }
25513}
25514#[doc = "Flash transceiver module firmware.\n\nRequest attributes:\n- [.nested_header()](PushModuleFwFlash::nested_header)\n- [.push_file_name()](PushModuleFwFlash::push_file_name)\n- [.push_password()](PushModuleFwFlash::push_password)\n\n"]
25515#[derive(Debug)]
25516pub struct OpModuleFwFlashActDo<'r> {
25517    request: Request<'r>,
25518}
25519impl<'r> OpModuleFwFlashActDo<'r> {
25520    pub fn new(mut request: Request<'r>) -> Self {
25521        Self::write_header(request.buf_mut());
25522        Self { request: request }
25523    }
25524    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushModuleFwFlash<&'buf mut Vec<u8>> {
25525        Self::write_header(buf);
25526        PushModuleFwFlash::new(buf)
25527    }
25528    pub fn encode(&mut self) -> PushModuleFwFlash<&mut Vec<u8>> {
25529        PushModuleFwFlash::new(self.request.buf_mut())
25530    }
25531    pub fn into_encoder(self) -> PushModuleFwFlash<RequestBuf<'r>> {
25532        PushModuleFwFlash::new(self.request.buf)
25533    }
25534    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableModuleFwFlash<'a> {
25535        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25536        IterableModuleFwFlash::with_loc(attrs, buf.as_ptr() as usize)
25537    }
25538    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25539        let mut header = BuiltinNfgenmsg::new();
25540        header.cmd = 61u8;
25541        header.version = 1u8;
25542        prev.as_vec_mut().extend(header.as_slice());
25543    }
25544}
25545impl NetlinkRequest for OpModuleFwFlashActDo<'_> {
25546    fn protocol(&self) -> Protocol {
25547        Protocol::Generic("ethtool".as_bytes())
25548    }
25549    fn flags(&self) -> u16 {
25550        self.request.flags
25551    }
25552    fn payload(&self) -> &[u8] {
25553        self.request.buf()
25554    }
25555    type ReplyType<'buf> = IterableModuleFwFlash<'buf>;
25556    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25557        Self::decode_request(buf)
25558    }
25559    fn lookup(
25560        buf: &[u8],
25561        offset: usize,
25562        missing_type: Option<u16>,
25563    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25564        Self::decode_request(buf).lookup_attr(offset, missing_type)
25565    }
25566}
25567#[doc = "Get PHY devices attached to an interface\n\nRequest attributes:\n- [.nested_header()](PushPhy::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePhy::get_header)\n- [.get_index()](IterablePhy::get_index)\n- [.get_drvname()](IterablePhy::get_drvname)\n- [.get_name()](IterablePhy::get_name)\n- [.get_upstream_type()](IterablePhy::get_upstream_type)\n- [.get_upstream_index()](IterablePhy::get_upstream_index)\n- [.get_upstream_sfp_name()](IterablePhy::get_upstream_sfp_name)\n- [.get_downstream_sfp_name()](IterablePhy::get_downstream_sfp_name)\n\n"]
25568#[derive(Debug)]
25569pub struct OpPhyGetDump<'r> {
25570    request: Request<'r>,
25571}
25572impl<'r> OpPhyGetDump<'r> {
25573    pub fn new(mut request: Request<'r>) -> Self {
25574        Self::write_header(request.buf_mut());
25575        Self {
25576            request: request.set_dump(),
25577        }
25578    }
25579    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPhy<&'buf mut Vec<u8>> {
25580        Self::write_header(buf);
25581        PushPhy::new(buf)
25582    }
25583    pub fn encode(&mut self) -> PushPhy<&mut Vec<u8>> {
25584        PushPhy::new(self.request.buf_mut())
25585    }
25586    pub fn into_encoder(self) -> PushPhy<RequestBuf<'r>> {
25587        PushPhy::new(self.request.buf)
25588    }
25589    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePhy<'a> {
25590        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25591        IterablePhy::with_loc(attrs, buf.as_ptr() as usize)
25592    }
25593    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25594        let mut header = BuiltinNfgenmsg::new();
25595        header.cmd = 63u8;
25596        header.version = 1u8;
25597        prev.as_vec_mut().extend(header.as_slice());
25598    }
25599}
25600impl NetlinkRequest for OpPhyGetDump<'_> {
25601    fn protocol(&self) -> Protocol {
25602        Protocol::Generic("ethtool".as_bytes())
25603    }
25604    fn flags(&self) -> u16 {
25605        self.request.flags
25606    }
25607    fn payload(&self) -> &[u8] {
25608        self.request.buf()
25609    }
25610    type ReplyType<'buf> = IterablePhy<'buf>;
25611    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25612        Self::decode_request(buf)
25613    }
25614    fn lookup(
25615        buf: &[u8],
25616        offset: usize,
25617        missing_type: Option<u16>,
25618    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25619        Self::decode_request(buf).lookup_attr(offset, missing_type)
25620    }
25621}
25622#[doc = "Get PHY devices attached to an interface\n\nRequest attributes:\n- [.nested_header()](PushPhy::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePhy::get_header)\n- [.get_index()](IterablePhy::get_index)\n- [.get_drvname()](IterablePhy::get_drvname)\n- [.get_name()](IterablePhy::get_name)\n- [.get_upstream_type()](IterablePhy::get_upstream_type)\n- [.get_upstream_index()](IterablePhy::get_upstream_index)\n- [.get_upstream_sfp_name()](IterablePhy::get_upstream_sfp_name)\n- [.get_downstream_sfp_name()](IterablePhy::get_downstream_sfp_name)\n\n"]
25623#[derive(Debug)]
25624pub struct OpPhyGetDo<'r> {
25625    request: Request<'r>,
25626}
25627impl<'r> OpPhyGetDo<'r> {
25628    pub fn new(mut request: Request<'r>) -> Self {
25629        Self::write_header(request.buf_mut());
25630        Self { request: request }
25631    }
25632    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushPhy<&'buf mut Vec<u8>> {
25633        Self::write_header(buf);
25634        PushPhy::new(buf)
25635    }
25636    pub fn encode(&mut self) -> PushPhy<&mut Vec<u8>> {
25637        PushPhy::new(self.request.buf_mut())
25638    }
25639    pub fn into_encoder(self) -> PushPhy<RequestBuf<'r>> {
25640        PushPhy::new(self.request.buf)
25641    }
25642    pub fn decode_request<'a>(buf: &'a [u8]) -> IterablePhy<'a> {
25643        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25644        IterablePhy::with_loc(attrs, buf.as_ptr() as usize)
25645    }
25646    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25647        let mut header = BuiltinNfgenmsg::new();
25648        header.cmd = 63u8;
25649        header.version = 1u8;
25650        prev.as_vec_mut().extend(header.as_slice());
25651    }
25652}
25653impl NetlinkRequest for OpPhyGetDo<'_> {
25654    fn protocol(&self) -> Protocol {
25655        Protocol::Generic("ethtool".as_bytes())
25656    }
25657    fn flags(&self) -> u16 {
25658        self.request.flags
25659    }
25660    fn payload(&self) -> &[u8] {
25661        self.request.buf()
25662    }
25663    type ReplyType<'buf> = IterablePhy<'buf>;
25664    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25665        Self::decode_request(buf)
25666    }
25667    fn lookup(
25668        buf: &[u8],
25669        offset: usize,
25670        missing_type: Option<u16>,
25671    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25672        Self::decode_request(buf).lookup_attr(offset, missing_type)
25673    }
25674}
25675#[doc = "Get hwtstamp config.\n\nRequest attributes:\n- [.nested_header()](PushTsconfig::nested_header)\n\nReply attributes:\n- [.get_header()](IterableTsconfig::get_header)\n- [.get_hwtstamp_provider()](IterableTsconfig::get_hwtstamp_provider)\n- [.get_tx_types()](IterableTsconfig::get_tx_types)\n- [.get_rx_filters()](IterableTsconfig::get_rx_filters)\n- [.get_hwtstamp_flags()](IterableTsconfig::get_hwtstamp_flags)\n\n"]
25676#[derive(Debug)]
25677pub struct OpTsconfigGetDump<'r> {
25678    request: Request<'r>,
25679}
25680impl<'r> OpTsconfigGetDump<'r> {
25681    pub fn new(mut request: Request<'r>) -> Self {
25682        Self::write_header(request.buf_mut());
25683        Self {
25684            request: request.set_dump(),
25685        }
25686    }
25687    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushTsconfig<&'buf mut Vec<u8>> {
25688        Self::write_header(buf);
25689        PushTsconfig::new(buf)
25690    }
25691    pub fn encode(&mut self) -> PushTsconfig<&mut Vec<u8>> {
25692        PushTsconfig::new(self.request.buf_mut())
25693    }
25694    pub fn into_encoder(self) -> PushTsconfig<RequestBuf<'r>> {
25695        PushTsconfig::new(self.request.buf)
25696    }
25697    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableTsconfig<'a> {
25698        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25699        IterableTsconfig::with_loc(attrs, buf.as_ptr() as usize)
25700    }
25701    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25702        let mut header = BuiltinNfgenmsg::new();
25703        header.cmd = 65u8;
25704        header.version = 1u8;
25705        prev.as_vec_mut().extend(header.as_slice());
25706    }
25707}
25708impl NetlinkRequest for OpTsconfigGetDump<'_> {
25709    fn protocol(&self) -> Protocol {
25710        Protocol::Generic("ethtool".as_bytes())
25711    }
25712    fn flags(&self) -> u16 {
25713        self.request.flags
25714    }
25715    fn payload(&self) -> &[u8] {
25716        self.request.buf()
25717    }
25718    type ReplyType<'buf> = IterableTsconfig<'buf>;
25719    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25720        Self::decode_request(buf)
25721    }
25722    fn lookup(
25723        buf: &[u8],
25724        offset: usize,
25725        missing_type: Option<u16>,
25726    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25727        Self::decode_request(buf).lookup_attr(offset, missing_type)
25728    }
25729}
25730#[doc = "Get hwtstamp config.\n\nRequest attributes:\n- [.nested_header()](PushTsconfig::nested_header)\n\nReply attributes:\n- [.get_header()](IterableTsconfig::get_header)\n- [.get_hwtstamp_provider()](IterableTsconfig::get_hwtstamp_provider)\n- [.get_tx_types()](IterableTsconfig::get_tx_types)\n- [.get_rx_filters()](IterableTsconfig::get_rx_filters)\n- [.get_hwtstamp_flags()](IterableTsconfig::get_hwtstamp_flags)\n\n"]
25731#[derive(Debug)]
25732pub struct OpTsconfigGetDo<'r> {
25733    request: Request<'r>,
25734}
25735impl<'r> OpTsconfigGetDo<'r> {
25736    pub fn new(mut request: Request<'r>) -> Self {
25737        Self::write_header(request.buf_mut());
25738        Self { request: request }
25739    }
25740    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushTsconfig<&'buf mut Vec<u8>> {
25741        Self::write_header(buf);
25742        PushTsconfig::new(buf)
25743    }
25744    pub fn encode(&mut self) -> PushTsconfig<&mut Vec<u8>> {
25745        PushTsconfig::new(self.request.buf_mut())
25746    }
25747    pub fn into_encoder(self) -> PushTsconfig<RequestBuf<'r>> {
25748        PushTsconfig::new(self.request.buf)
25749    }
25750    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableTsconfig<'a> {
25751        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25752        IterableTsconfig::with_loc(attrs, buf.as_ptr() as usize)
25753    }
25754    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25755        let mut header = BuiltinNfgenmsg::new();
25756        header.cmd = 65u8;
25757        header.version = 1u8;
25758        prev.as_vec_mut().extend(header.as_slice());
25759    }
25760}
25761impl NetlinkRequest for OpTsconfigGetDo<'_> {
25762    fn protocol(&self) -> Protocol {
25763        Protocol::Generic("ethtool".as_bytes())
25764    }
25765    fn flags(&self) -> u16 {
25766        self.request.flags
25767    }
25768    fn payload(&self) -> &[u8] {
25769        self.request.buf()
25770    }
25771    type ReplyType<'buf> = IterableTsconfig<'buf>;
25772    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25773        Self::decode_request(buf)
25774    }
25775    fn lookup(
25776        buf: &[u8],
25777        offset: usize,
25778        missing_type: Option<u16>,
25779    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25780        Self::decode_request(buf).lookup_attr(offset, missing_type)
25781    }
25782}
25783#[doc = "Set hwtstamp config.\n\nRequest attributes:\n- [.nested_header()](PushTsconfig::nested_header)\n- [.nested_hwtstamp_provider()](PushTsconfig::nested_hwtstamp_provider)\n- [.nested_tx_types()](PushTsconfig::nested_tx_types)\n- [.nested_rx_filters()](PushTsconfig::nested_rx_filters)\n- [.nested_hwtstamp_flags()](PushTsconfig::nested_hwtstamp_flags)\n\nReply attributes:\n- [.get_header()](IterableTsconfig::get_header)\n- [.get_hwtstamp_provider()](IterableTsconfig::get_hwtstamp_provider)\n- [.get_tx_types()](IterableTsconfig::get_tx_types)\n- [.get_rx_filters()](IterableTsconfig::get_rx_filters)\n- [.get_hwtstamp_flags()](IterableTsconfig::get_hwtstamp_flags)\n\n"]
25784#[derive(Debug)]
25785pub struct OpTsconfigSetDo<'r> {
25786    request: Request<'r>,
25787}
25788impl<'r> OpTsconfigSetDo<'r> {
25789    pub fn new(mut request: Request<'r>) -> Self {
25790        Self::write_header(request.buf_mut());
25791        Self { request: request }
25792    }
25793    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushTsconfig<&'buf mut Vec<u8>> {
25794        Self::write_header(buf);
25795        PushTsconfig::new(buf)
25796    }
25797    pub fn encode(&mut self) -> PushTsconfig<&mut Vec<u8>> {
25798        PushTsconfig::new(self.request.buf_mut())
25799    }
25800    pub fn into_encoder(self) -> PushTsconfig<RequestBuf<'r>> {
25801        PushTsconfig::new(self.request.buf)
25802    }
25803    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableTsconfig<'a> {
25804        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25805        IterableTsconfig::with_loc(attrs, buf.as_ptr() as usize)
25806    }
25807    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25808        let mut header = BuiltinNfgenmsg::new();
25809        header.cmd = 66u8;
25810        header.version = 1u8;
25811        prev.as_vec_mut().extend(header.as_slice());
25812    }
25813}
25814impl NetlinkRequest for OpTsconfigSetDo<'_> {
25815    fn protocol(&self) -> Protocol {
25816        Protocol::Generic("ethtool".as_bytes())
25817    }
25818    fn flags(&self) -> u16 {
25819        self.request.flags
25820    }
25821    fn payload(&self) -> &[u8] {
25822        self.request.buf()
25823    }
25824    type ReplyType<'buf> = IterableTsconfig<'buf>;
25825    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25826        Self::decode_request(buf)
25827    }
25828    fn lookup(
25829        buf: &[u8],
25830        offset: usize,
25831        missing_type: Option<u16>,
25832    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25833        Self::decode_request(buf).lookup_attr(offset, missing_type)
25834    }
25835}
25836#[doc = "Set RSS params.\n\nRequest attributes:\n- [.nested_header()](PushRss::nested_header)\n- [.push_context()](PushRss::push_context)\n- [.push_hfunc()](PushRss::push_hfunc)\n- [.push_indir()](PushRss::push_indir)\n- [.push_hkey()](PushRss::push_hkey)\n- [.push_input_xfrm()](PushRss::push_input_xfrm)\n- [.nested_flow_hash()](PushRss::nested_flow_hash)\n\n"]
25837#[derive(Debug)]
25838pub struct OpRssSetDo<'r> {
25839    request: Request<'r>,
25840}
25841impl<'r> OpRssSetDo<'r> {
25842    pub fn new(mut request: Request<'r>) -> Self {
25843        Self::write_header(request.buf_mut());
25844        Self { request: request }
25845    }
25846    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushRss<&'buf mut Vec<u8>> {
25847        Self::write_header(buf);
25848        PushRss::new(buf)
25849    }
25850    pub fn encode(&mut self) -> PushRss<&mut Vec<u8>> {
25851        PushRss::new(self.request.buf_mut())
25852    }
25853    pub fn into_encoder(self) -> PushRss<RequestBuf<'r>> {
25854        PushRss::new(self.request.buf)
25855    }
25856    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableRss<'a> {
25857        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25858        IterableRss::with_loc(attrs, buf.as_ptr() as usize)
25859    }
25860    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25861        let mut header = BuiltinNfgenmsg::new();
25862        header.cmd = 68u8;
25863        header.version = 1u8;
25864        prev.as_vec_mut().extend(header.as_slice());
25865    }
25866}
25867impl NetlinkRequest for OpRssSetDo<'_> {
25868    fn protocol(&self) -> Protocol {
25869        Protocol::Generic("ethtool".as_bytes())
25870    }
25871    fn flags(&self) -> u16 {
25872        self.request.flags
25873    }
25874    fn payload(&self) -> &[u8] {
25875        self.request.buf()
25876    }
25877    type ReplyType<'buf> = IterableRss<'buf>;
25878    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25879        Self::decode_request(buf)
25880    }
25881    fn lookup(
25882        buf: &[u8],
25883        offset: usize,
25884        missing_type: Option<u16>,
25885    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25886        Self::decode_request(buf).lookup_attr(offset, missing_type)
25887    }
25888}
25889#[doc = "Create an RSS context.\n\nRequest attributes:\n- [.nested_header()](PushRss::nested_header)\n- [.push_context()](PushRss::push_context)\n- [.push_hfunc()](PushRss::push_hfunc)\n- [.push_indir()](PushRss::push_indir)\n- [.push_hkey()](PushRss::push_hkey)\n- [.push_input_xfrm()](PushRss::push_input_xfrm)\n\nReply attributes:\n- [.get_header()](IterableRss::get_header)\n- [.get_context()](IterableRss::get_context)\n- [.get_hfunc()](IterableRss::get_hfunc)\n- [.get_indir()](IterableRss::get_indir)\n- [.get_hkey()](IterableRss::get_hkey)\n- [.get_input_xfrm()](IterableRss::get_input_xfrm)\n\n"]
25890#[derive(Debug)]
25891pub struct OpRssCreateActDo<'r> {
25892    request: Request<'r>,
25893}
25894impl<'r> OpRssCreateActDo<'r> {
25895    pub fn new(mut request: Request<'r>) -> Self {
25896        Self::write_header(request.buf_mut());
25897        Self { request: request }
25898    }
25899    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushRss<&'buf mut Vec<u8>> {
25900        Self::write_header(buf);
25901        PushRss::new(buf)
25902    }
25903    pub fn encode(&mut self) -> PushRss<&mut Vec<u8>> {
25904        PushRss::new(self.request.buf_mut())
25905    }
25906    pub fn into_encoder(self) -> PushRss<RequestBuf<'r>> {
25907        PushRss::new(self.request.buf)
25908    }
25909    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableRss<'a> {
25910        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25911        IterableRss::with_loc(attrs, buf.as_ptr() as usize)
25912    }
25913    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25914        let mut header = BuiltinNfgenmsg::new();
25915        header.cmd = 70u8;
25916        header.version = 1u8;
25917        prev.as_vec_mut().extend(header.as_slice());
25918    }
25919}
25920impl NetlinkRequest for OpRssCreateActDo<'_> {
25921    fn protocol(&self) -> Protocol {
25922        Protocol::Generic("ethtool".as_bytes())
25923    }
25924    fn flags(&self) -> u16 {
25925        self.request.flags
25926    }
25927    fn payload(&self) -> &[u8] {
25928        self.request.buf()
25929    }
25930    type ReplyType<'buf> = IterableRss<'buf>;
25931    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25932        Self::decode_request(buf)
25933    }
25934    fn lookup(
25935        buf: &[u8],
25936        offset: usize,
25937        missing_type: Option<u16>,
25938    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25939        Self::decode_request(buf).lookup_attr(offset, missing_type)
25940    }
25941}
25942#[doc = "Delete an RSS context.\n\nRequest attributes:\n- [.nested_header()](PushRss::nested_header)\n- [.push_context()](PushRss::push_context)\n\n"]
25943#[derive(Debug)]
25944pub struct OpRssDeleteActDo<'r> {
25945    request: Request<'r>,
25946}
25947impl<'r> OpRssDeleteActDo<'r> {
25948    pub fn new(mut request: Request<'r>) -> Self {
25949        Self::write_header(request.buf_mut());
25950        Self { request: request }
25951    }
25952    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushRss<&'buf mut Vec<u8>> {
25953        Self::write_header(buf);
25954        PushRss::new(buf)
25955    }
25956    pub fn encode(&mut self) -> PushRss<&mut Vec<u8>> {
25957        PushRss::new(self.request.buf_mut())
25958    }
25959    pub fn into_encoder(self) -> PushRss<RequestBuf<'r>> {
25960        PushRss::new(self.request.buf)
25961    }
25962    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableRss<'a> {
25963        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
25964        IterableRss::with_loc(attrs, buf.as_ptr() as usize)
25965    }
25966    fn write_header<Prev: Pusher>(prev: &mut Prev) {
25967        let mut header = BuiltinNfgenmsg::new();
25968        header.cmd = 72u8;
25969        header.version = 1u8;
25970        prev.as_vec_mut().extend(header.as_slice());
25971    }
25972}
25973impl NetlinkRequest for OpRssDeleteActDo<'_> {
25974    fn protocol(&self) -> Protocol {
25975        Protocol::Generic("ethtool".as_bytes())
25976    }
25977    fn flags(&self) -> u16 {
25978        self.request.flags
25979    }
25980    fn payload(&self) -> &[u8] {
25981        self.request.buf()
25982    }
25983    type ReplyType<'buf> = IterableRss<'buf>;
25984    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
25985        Self::decode_request(buf)
25986    }
25987    fn lookup(
25988        buf: &[u8],
25989        offset: usize,
25990        missing_type: Option<u16>,
25991    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
25992        Self::decode_request(buf).lookup_attr(offset, missing_type)
25993    }
25994}
25995#[doc = "Get PHY MSE measurement data and capabilities.\n\nRequest attributes:\n- [.nested_header()](PushMse::nested_header)\n\nReply attributes:\n- [.get_header()](IterableMse::get_header)\n- [.get_capabilities()](IterableMse::get_capabilities)\n- [.get_channel_a()](IterableMse::get_channel_a)\n- [.get_channel_b()](IterableMse::get_channel_b)\n- [.get_channel_c()](IterableMse::get_channel_c)\n- [.get_channel_d()](IterableMse::get_channel_d)\n- [.get_worst_channel()](IterableMse::get_worst_channel)\n- [.get_link()](IterableMse::get_link)\n\n"]
25996#[derive(Debug)]
25997pub struct OpMseGetDump<'r> {
25998    request: Request<'r>,
25999}
26000impl<'r> OpMseGetDump<'r> {
26001    pub fn new(mut request: Request<'r>) -> Self {
26002        Self::write_header(request.buf_mut());
26003        Self {
26004            request: request.set_dump(),
26005        }
26006    }
26007    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushMse<&'buf mut Vec<u8>> {
26008        Self::write_header(buf);
26009        PushMse::new(buf)
26010    }
26011    pub fn encode(&mut self) -> PushMse<&mut Vec<u8>> {
26012        PushMse::new(self.request.buf_mut())
26013    }
26014    pub fn into_encoder(self) -> PushMse<RequestBuf<'r>> {
26015        PushMse::new(self.request.buf)
26016    }
26017    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableMse<'a> {
26018        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
26019        IterableMse::with_loc(attrs, buf.as_ptr() as usize)
26020    }
26021    fn write_header<Prev: Pusher>(prev: &mut Prev) {
26022        let mut header = BuiltinNfgenmsg::new();
26023        header.cmd = 74u8;
26024        header.version = 1u8;
26025        prev.as_vec_mut().extend(header.as_slice());
26026    }
26027}
26028impl NetlinkRequest for OpMseGetDump<'_> {
26029    fn protocol(&self) -> Protocol {
26030        Protocol::Generic("ethtool".as_bytes())
26031    }
26032    fn flags(&self) -> u16 {
26033        self.request.flags
26034    }
26035    fn payload(&self) -> &[u8] {
26036        self.request.buf()
26037    }
26038    type ReplyType<'buf> = IterableMse<'buf>;
26039    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
26040        Self::decode_request(buf)
26041    }
26042    fn lookup(
26043        buf: &[u8],
26044        offset: usize,
26045        missing_type: Option<u16>,
26046    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
26047        Self::decode_request(buf).lookup_attr(offset, missing_type)
26048    }
26049}
26050#[doc = "Get PHY MSE measurement data and capabilities.\n\nRequest attributes:\n- [.nested_header()](PushMse::nested_header)\n\nReply attributes:\n- [.get_header()](IterableMse::get_header)\n- [.get_capabilities()](IterableMse::get_capabilities)\n- [.get_channel_a()](IterableMse::get_channel_a)\n- [.get_channel_b()](IterableMse::get_channel_b)\n- [.get_channel_c()](IterableMse::get_channel_c)\n- [.get_channel_d()](IterableMse::get_channel_d)\n- [.get_worst_channel()](IterableMse::get_worst_channel)\n- [.get_link()](IterableMse::get_link)\n\n"]
26051#[derive(Debug)]
26052pub struct OpMseGetDo<'r> {
26053    request: Request<'r>,
26054}
26055impl<'r> OpMseGetDo<'r> {
26056    pub fn new(mut request: Request<'r>) -> Self {
26057        Self::write_header(request.buf_mut());
26058        Self { request: request }
26059    }
26060    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushMse<&'buf mut Vec<u8>> {
26061        Self::write_header(buf);
26062        PushMse::new(buf)
26063    }
26064    pub fn encode(&mut self) -> PushMse<&mut Vec<u8>> {
26065        PushMse::new(self.request.buf_mut())
26066    }
26067    pub fn into_encoder(self) -> PushMse<RequestBuf<'r>> {
26068        PushMse::new(self.request.buf)
26069    }
26070    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableMse<'a> {
26071        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
26072        IterableMse::with_loc(attrs, buf.as_ptr() as usize)
26073    }
26074    fn write_header<Prev: Pusher>(prev: &mut Prev) {
26075        let mut header = BuiltinNfgenmsg::new();
26076        header.cmd = 74u8;
26077        header.version = 1u8;
26078        prev.as_vec_mut().extend(header.as_slice());
26079    }
26080}
26081impl NetlinkRequest for OpMseGetDo<'_> {
26082    fn protocol(&self) -> Protocol {
26083        Protocol::Generic("ethtool".as_bytes())
26084    }
26085    fn flags(&self) -> u16 {
26086        self.request.flags
26087    }
26088    fn payload(&self) -> &[u8] {
26089        self.request.buf()
26090    }
26091    type ReplyType<'buf> = IterableMse<'buf>;
26092    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
26093        Self::decode_request(buf)
26094    }
26095    fn lookup(
26096        buf: &[u8],
26097        offset: usize,
26098        missing_type: Option<u16>,
26099    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
26100        Self::decode_request(buf).lookup_attr(offset, missing_type)
26101    }
26102}
26103use crate::traits::LookupFn;
26104use crate::utils::RequestBuf;
26105#[derive(Debug)]
26106pub struct Request<'buf> {
26107    buf: RequestBuf<'buf>,
26108    flags: u16,
26109    writeback: Option<&'buf mut Option<RequestInfo>>,
26110}
26111#[allow(unused)]
26112#[derive(Debug, Clone)]
26113pub struct RequestInfo {
26114    protocol: Protocol,
26115    flags: u16,
26116    name: &'static str,
26117    lookup: LookupFn,
26118}
26119impl Request<'static> {
26120    pub fn new() -> Self {
26121        Self::new_from_buf(Vec::new())
26122    }
26123    pub fn new_from_buf(buf: Vec<u8>) -> Self {
26124        Self {
26125            flags: 0,
26126            buf: RequestBuf::Own(buf),
26127            writeback: None,
26128        }
26129    }
26130    pub fn into_buf(self) -> Vec<u8> {
26131        match self.buf {
26132            RequestBuf::Own(buf) => buf,
26133            _ => unreachable!(),
26134        }
26135    }
26136}
26137impl<'buf> Request<'buf> {
26138    pub fn new_with_buf(buf: &'buf mut Vec<u8>) -> Self {
26139        buf.clear();
26140        Self::new_extend(buf)
26141    }
26142    pub fn new_extend(buf: &'buf mut Vec<u8>) -> Self {
26143        Self {
26144            flags: 0,
26145            buf: RequestBuf::Ref(buf),
26146            writeback: None,
26147        }
26148    }
26149    fn do_writeback(&mut self, protocol: Protocol, name: &'static str, lookup: LookupFn) {
26150        let Some(writeback) = &mut self.writeback else {
26151            return;
26152        };
26153        **writeback = Some(RequestInfo {
26154            protocol,
26155            flags: self.flags,
26156            name,
26157            lookup,
26158        })
26159    }
26160    pub fn buf(&self) -> &Vec<u8> {
26161        self.buf.buf()
26162    }
26163    pub fn buf_mut(&mut self) -> &mut Vec<u8> {
26164        self.buf.buf_mut()
26165    }
26166    #[doc = "Set `NLM_F_CREATE` flag"]
26167    pub fn set_create(mut self) -> Self {
26168        self.flags |= consts::NLM_F_CREATE as u16;
26169        self
26170    }
26171    #[doc = "Set `NLM_F_EXCL` flag"]
26172    pub fn set_excl(mut self) -> Self {
26173        self.flags |= consts::NLM_F_EXCL as u16;
26174        self
26175    }
26176    #[doc = "Set `NLM_F_REPLACE` flag"]
26177    pub fn set_replace(mut self) -> Self {
26178        self.flags |= consts::NLM_F_REPLACE as u16;
26179        self
26180    }
26181    #[doc = "Set `NLM_F_CREATE` and `NLM_F_REPLACE` flag"]
26182    pub fn set_change(self) -> Self {
26183        self.set_create().set_replace()
26184    }
26185    #[doc = "Set `NLM_F_APPEND` flag"]
26186    pub fn set_append(mut self) -> Self {
26187        self.flags |= consts::NLM_F_APPEND as u16;
26188        self
26189    }
26190    #[doc = "Set `self.flags |= flags`"]
26191    pub fn set_flags(mut self, flags: u16) -> Self {
26192        self.flags |= flags;
26193        self
26194    }
26195    #[doc = "Set `self.flags ^= self.flags & flags`"]
26196    pub fn unset_flags(mut self, flags: u16) -> Self {
26197        self.flags ^= self.flags & flags;
26198        self
26199    }
26200    #[doc = "Set `NLM_F_DUMP` flag"]
26201    fn set_dump(mut self) -> Self {
26202        self.flags |= consts::NLM_F_DUMP as u16;
26203        self
26204    }
26205    #[doc = "Get string set from the kernel.\n\nRequest attributes:\n- [.nested_header()](PushStrset::nested_header)\n- [.nested_stringsets()](PushStrset::nested_stringsets)\n- [.push_counts_only()](PushStrset::push_counts_only)\n\nReply attributes:\n- [.get_header()](IterableStrset::get_header)\n- [.get_stringsets()](IterableStrset::get_stringsets)\n\n"]
26206    pub fn op_strset_get_dump(self) -> OpStrsetGetDump<'buf> {
26207        let mut res = OpStrsetGetDump::new(self);
26208        res.request.do_writeback(
26209            res.protocol(),
26210            "op-strset-get-dump",
26211            OpStrsetGetDump::lookup,
26212        );
26213        res
26214    }
26215    #[doc = "Get string set from the kernel.\n\nRequest attributes:\n- [.nested_header()](PushStrset::nested_header)\n- [.nested_stringsets()](PushStrset::nested_stringsets)\n- [.push_counts_only()](PushStrset::push_counts_only)\n\nReply attributes:\n- [.get_header()](IterableStrset::get_header)\n- [.get_stringsets()](IterableStrset::get_stringsets)\n\n"]
26216    pub fn op_strset_get_do(self) -> OpStrsetGetDo<'buf> {
26217        let mut res = OpStrsetGetDo::new(self);
26218        res.request
26219            .do_writeback(res.protocol(), "op-strset-get-do", OpStrsetGetDo::lookup);
26220        res
26221    }
26222    #[doc = "Get link info.\n\nRequest attributes:\n- [.nested_header()](PushLinkinfo::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkinfo::get_header)\n- [.get_port()](IterableLinkinfo::get_port)\n- [.get_phyaddr()](IterableLinkinfo::get_phyaddr)\n- [.get_tp_mdix()](IterableLinkinfo::get_tp_mdix)\n- [.get_tp_mdix_ctrl()](IterableLinkinfo::get_tp_mdix_ctrl)\n- [.get_transceiver()](IterableLinkinfo::get_transceiver)\n\n"]
26223    pub fn op_linkinfo_get_dump(self) -> OpLinkinfoGetDump<'buf> {
26224        let mut res = OpLinkinfoGetDump::new(self);
26225        res.request.do_writeback(
26226            res.protocol(),
26227            "op-linkinfo-get-dump",
26228            OpLinkinfoGetDump::lookup,
26229        );
26230        res
26231    }
26232    #[doc = "Get link info.\n\nRequest attributes:\n- [.nested_header()](PushLinkinfo::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkinfo::get_header)\n- [.get_port()](IterableLinkinfo::get_port)\n- [.get_phyaddr()](IterableLinkinfo::get_phyaddr)\n- [.get_tp_mdix()](IterableLinkinfo::get_tp_mdix)\n- [.get_tp_mdix_ctrl()](IterableLinkinfo::get_tp_mdix_ctrl)\n- [.get_transceiver()](IterableLinkinfo::get_transceiver)\n\n"]
26233    pub fn op_linkinfo_get_do(self) -> OpLinkinfoGetDo<'buf> {
26234        let mut res = OpLinkinfoGetDo::new(self);
26235        res.request.do_writeback(
26236            res.protocol(),
26237            "op-linkinfo-get-do",
26238            OpLinkinfoGetDo::lookup,
26239        );
26240        res
26241    }
26242    #[doc = "Set link info.\n\nRequest attributes:\n- [.nested_header()](PushLinkinfo::nested_header)\n- [.push_port()](PushLinkinfo::push_port)\n- [.push_phyaddr()](PushLinkinfo::push_phyaddr)\n- [.push_tp_mdix()](PushLinkinfo::push_tp_mdix)\n- [.push_tp_mdix_ctrl()](PushLinkinfo::push_tp_mdix_ctrl)\n- [.push_transceiver()](PushLinkinfo::push_transceiver)\n\n"]
26243    pub fn op_linkinfo_set_do(self) -> OpLinkinfoSetDo<'buf> {
26244        let mut res = OpLinkinfoSetDo::new(self);
26245        res.request.do_writeback(
26246            res.protocol(),
26247            "op-linkinfo-set-do",
26248            OpLinkinfoSetDo::lookup,
26249        );
26250        res
26251    }
26252    #[doc = "Get link modes.\n\nRequest attributes:\n- [.nested_header()](PushLinkmodes::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkmodes::get_header)\n- [.get_autoneg()](IterableLinkmodes::get_autoneg)\n- [.get_ours()](IterableLinkmodes::get_ours)\n- [.get_peer()](IterableLinkmodes::get_peer)\n- [.get_speed()](IterableLinkmodes::get_speed)\n- [.get_duplex()](IterableLinkmodes::get_duplex)\n- [.get_master_slave_cfg()](IterableLinkmodes::get_master_slave_cfg)\n- [.get_master_slave_state()](IterableLinkmodes::get_master_slave_state)\n- [.get_lanes()](IterableLinkmodes::get_lanes)\n- [.get_rate_matching()](IterableLinkmodes::get_rate_matching)\n\n"]
26253    pub fn op_linkmodes_get_dump(self) -> OpLinkmodesGetDump<'buf> {
26254        let mut res = OpLinkmodesGetDump::new(self);
26255        res.request.do_writeback(
26256            res.protocol(),
26257            "op-linkmodes-get-dump",
26258            OpLinkmodesGetDump::lookup,
26259        );
26260        res
26261    }
26262    #[doc = "Get link modes.\n\nRequest attributes:\n- [.nested_header()](PushLinkmodes::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkmodes::get_header)\n- [.get_autoneg()](IterableLinkmodes::get_autoneg)\n- [.get_ours()](IterableLinkmodes::get_ours)\n- [.get_peer()](IterableLinkmodes::get_peer)\n- [.get_speed()](IterableLinkmodes::get_speed)\n- [.get_duplex()](IterableLinkmodes::get_duplex)\n- [.get_master_slave_cfg()](IterableLinkmodes::get_master_slave_cfg)\n- [.get_master_slave_state()](IterableLinkmodes::get_master_slave_state)\n- [.get_lanes()](IterableLinkmodes::get_lanes)\n- [.get_rate_matching()](IterableLinkmodes::get_rate_matching)\n\n"]
26263    pub fn op_linkmodes_get_do(self) -> OpLinkmodesGetDo<'buf> {
26264        let mut res = OpLinkmodesGetDo::new(self);
26265        res.request.do_writeback(
26266            res.protocol(),
26267            "op-linkmodes-get-do",
26268            OpLinkmodesGetDo::lookup,
26269        );
26270        res
26271    }
26272    #[doc = "Set link modes.\n\nRequest attributes:\n- [.nested_header()](PushLinkmodes::nested_header)\n- [.push_autoneg()](PushLinkmodes::push_autoneg)\n- [.nested_ours()](PushLinkmodes::nested_ours)\n- [.nested_peer()](PushLinkmodes::nested_peer)\n- [.push_speed()](PushLinkmodes::push_speed)\n- [.push_duplex()](PushLinkmodes::push_duplex)\n- [.push_master_slave_cfg()](PushLinkmodes::push_master_slave_cfg)\n- [.push_master_slave_state()](PushLinkmodes::push_master_slave_state)\n- [.push_lanes()](PushLinkmodes::push_lanes)\n- [.push_rate_matching()](PushLinkmodes::push_rate_matching)\n\n"]
26273    pub fn op_linkmodes_set_do(self) -> OpLinkmodesSetDo<'buf> {
26274        let mut res = OpLinkmodesSetDo::new(self);
26275        res.request.do_writeback(
26276            res.protocol(),
26277            "op-linkmodes-set-do",
26278            OpLinkmodesSetDo::lookup,
26279        );
26280        res
26281    }
26282    #[doc = "Get link state.\n\nRequest attributes:\n- [.nested_header()](PushLinkstate::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkstate::get_header)\n- [.get_link()](IterableLinkstate::get_link)\n- [.get_sqi()](IterableLinkstate::get_sqi)\n- [.get_sqi_max()](IterableLinkstate::get_sqi_max)\n- [.get_ext_state()](IterableLinkstate::get_ext_state)\n- [.get_ext_substate()](IterableLinkstate::get_ext_substate)\n- [.get_ext_down_cnt()](IterableLinkstate::get_ext_down_cnt)\n\n"]
26283    pub fn op_linkstate_get_dump(self) -> OpLinkstateGetDump<'buf> {
26284        let mut res = OpLinkstateGetDump::new(self);
26285        res.request.do_writeback(
26286            res.protocol(),
26287            "op-linkstate-get-dump",
26288            OpLinkstateGetDump::lookup,
26289        );
26290        res
26291    }
26292    #[doc = "Get link state.\n\nRequest attributes:\n- [.nested_header()](PushLinkstate::nested_header)\n\nReply attributes:\n- [.get_header()](IterableLinkstate::get_header)\n- [.get_link()](IterableLinkstate::get_link)\n- [.get_sqi()](IterableLinkstate::get_sqi)\n- [.get_sqi_max()](IterableLinkstate::get_sqi_max)\n- [.get_ext_state()](IterableLinkstate::get_ext_state)\n- [.get_ext_substate()](IterableLinkstate::get_ext_substate)\n- [.get_ext_down_cnt()](IterableLinkstate::get_ext_down_cnt)\n\n"]
26293    pub fn op_linkstate_get_do(self) -> OpLinkstateGetDo<'buf> {
26294        let mut res = OpLinkstateGetDo::new(self);
26295        res.request.do_writeback(
26296            res.protocol(),
26297            "op-linkstate-get-do",
26298            OpLinkstateGetDo::lookup,
26299        );
26300        res
26301    }
26302    #[doc = "Get debug message mask.\n\nRequest attributes:\n- [.nested_header()](PushDebug::nested_header)\n\nReply attributes:\n- [.get_header()](IterableDebug::get_header)\n- [.get_msgmask()](IterableDebug::get_msgmask)\n\n"]
26303    pub fn op_debug_get_dump(self) -> OpDebugGetDump<'buf> {
26304        let mut res = OpDebugGetDump::new(self);
26305        res.request
26306            .do_writeback(res.protocol(), "op-debug-get-dump", OpDebugGetDump::lookup);
26307        res
26308    }
26309    #[doc = "Get debug message mask.\n\nRequest attributes:\n- [.nested_header()](PushDebug::nested_header)\n\nReply attributes:\n- [.get_header()](IterableDebug::get_header)\n- [.get_msgmask()](IterableDebug::get_msgmask)\n\n"]
26310    pub fn op_debug_get_do(self) -> OpDebugGetDo<'buf> {
26311        let mut res = OpDebugGetDo::new(self);
26312        res.request
26313            .do_writeback(res.protocol(), "op-debug-get-do", OpDebugGetDo::lookup);
26314        res
26315    }
26316    #[doc = "Set debug message mask.\n\nRequest attributes:\n- [.nested_header()](PushDebug::nested_header)\n- [.nested_msgmask()](PushDebug::nested_msgmask)\n\n"]
26317    pub fn op_debug_set_do(self) -> OpDebugSetDo<'buf> {
26318        let mut res = OpDebugSetDo::new(self);
26319        res.request
26320            .do_writeback(res.protocol(), "op-debug-set-do", OpDebugSetDo::lookup);
26321        res
26322    }
26323    #[doc = "Get WOL params.\n\nRequest attributes:\n- [.nested_header()](PushWol::nested_header)\n\nReply attributes:\n- [.get_header()](IterableWol::get_header)\n- [.get_modes()](IterableWol::get_modes)\n- [.get_sopass()](IterableWol::get_sopass)\n\n"]
26324    pub fn op_wol_get_dump(self) -> OpWolGetDump<'buf> {
26325        let mut res = OpWolGetDump::new(self);
26326        res.request
26327            .do_writeback(res.protocol(), "op-wol-get-dump", OpWolGetDump::lookup);
26328        res
26329    }
26330    #[doc = "Get WOL params.\n\nRequest attributes:\n- [.nested_header()](PushWol::nested_header)\n\nReply attributes:\n- [.get_header()](IterableWol::get_header)\n- [.get_modes()](IterableWol::get_modes)\n- [.get_sopass()](IterableWol::get_sopass)\n\n"]
26331    pub fn op_wol_get_do(self) -> OpWolGetDo<'buf> {
26332        let mut res = OpWolGetDo::new(self);
26333        res.request
26334            .do_writeback(res.protocol(), "op-wol-get-do", OpWolGetDo::lookup);
26335        res
26336    }
26337    #[doc = "Set WOL params.\n\nRequest attributes:\n- [.nested_header()](PushWol::nested_header)\n- [.nested_modes()](PushWol::nested_modes)\n- [.push_sopass()](PushWol::push_sopass)\n\n"]
26338    pub fn op_wol_set_do(self) -> OpWolSetDo<'buf> {
26339        let mut res = OpWolSetDo::new(self);
26340        res.request
26341            .do_writeback(res.protocol(), "op-wol-set-do", OpWolSetDo::lookup);
26342        res
26343    }
26344    #[doc = "Get features.\n\nRequest attributes:\n- [.nested_header()](PushFeatures::nested_header)\n\nReply attributes:\n- [.get_header()](IterableFeatures::get_header)\n- [.get_hw()](IterableFeatures::get_hw)\n- [.get_wanted()](IterableFeatures::get_wanted)\n- [.get_active()](IterableFeatures::get_active)\n- [.get_nochange()](IterableFeatures::get_nochange)\n\n"]
26345    pub fn op_features_get_dump(self) -> OpFeaturesGetDump<'buf> {
26346        let mut res = OpFeaturesGetDump::new(self);
26347        res.request.do_writeback(
26348            res.protocol(),
26349            "op-features-get-dump",
26350            OpFeaturesGetDump::lookup,
26351        );
26352        res
26353    }
26354    #[doc = "Get features.\n\nRequest attributes:\n- [.nested_header()](PushFeatures::nested_header)\n\nReply attributes:\n- [.get_header()](IterableFeatures::get_header)\n- [.get_hw()](IterableFeatures::get_hw)\n- [.get_wanted()](IterableFeatures::get_wanted)\n- [.get_active()](IterableFeatures::get_active)\n- [.get_nochange()](IterableFeatures::get_nochange)\n\n"]
26355    pub fn op_features_get_do(self) -> OpFeaturesGetDo<'buf> {
26356        let mut res = OpFeaturesGetDo::new(self);
26357        res.request.do_writeback(
26358            res.protocol(),
26359            "op-features-get-do",
26360            OpFeaturesGetDo::lookup,
26361        );
26362        res
26363    }
26364    #[doc = "Set features.\n\nRequest attributes:\n- [.nested_header()](PushFeatures::nested_header)\n- [.nested_hw()](PushFeatures::nested_hw)\n- [.nested_wanted()](PushFeatures::nested_wanted)\n- [.nested_active()](PushFeatures::nested_active)\n- [.nested_nochange()](PushFeatures::nested_nochange)\n\nReply attributes:\n- [.get_header()](IterableFeatures::get_header)\n- [.get_hw()](IterableFeatures::get_hw)\n- [.get_wanted()](IterableFeatures::get_wanted)\n- [.get_active()](IterableFeatures::get_active)\n- [.get_nochange()](IterableFeatures::get_nochange)\n\n"]
26365    pub fn op_features_set_do(self) -> OpFeaturesSetDo<'buf> {
26366        let mut res = OpFeaturesSetDo::new(self);
26367        res.request.do_writeback(
26368            res.protocol(),
26369            "op-features-set-do",
26370            OpFeaturesSetDo::lookup,
26371        );
26372        res
26373    }
26374    #[doc = "Get device private flags.\n\nRequest attributes:\n- [.nested_header()](PushPrivflags::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePrivflags::get_header)\n- [.get_flags()](IterablePrivflags::get_flags)\n\n"]
26375    pub fn op_privflags_get_dump(self) -> OpPrivflagsGetDump<'buf> {
26376        let mut res = OpPrivflagsGetDump::new(self);
26377        res.request.do_writeback(
26378            res.protocol(),
26379            "op-privflags-get-dump",
26380            OpPrivflagsGetDump::lookup,
26381        );
26382        res
26383    }
26384    #[doc = "Get device private flags.\n\nRequest attributes:\n- [.nested_header()](PushPrivflags::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePrivflags::get_header)\n- [.get_flags()](IterablePrivflags::get_flags)\n\n"]
26385    pub fn op_privflags_get_do(self) -> OpPrivflagsGetDo<'buf> {
26386        let mut res = OpPrivflagsGetDo::new(self);
26387        res.request.do_writeback(
26388            res.protocol(),
26389            "op-privflags-get-do",
26390            OpPrivflagsGetDo::lookup,
26391        );
26392        res
26393    }
26394    #[doc = "Set device private flags.\n\nRequest attributes:\n- [.nested_header()](PushPrivflags::nested_header)\n- [.nested_flags()](PushPrivflags::nested_flags)\n\n"]
26395    pub fn op_privflags_set_do(self) -> OpPrivflagsSetDo<'buf> {
26396        let mut res = OpPrivflagsSetDo::new(self);
26397        res.request.do_writeback(
26398            res.protocol(),
26399            "op-privflags-set-do",
26400            OpPrivflagsSetDo::lookup,
26401        );
26402        res
26403    }
26404    #[doc = "Get ring params.\n\nRequest attributes:\n- [.nested_header()](PushRings::nested_header)\n\nReply attributes:\n- [.get_header()](IterableRings::get_header)\n- [.get_rx_max()](IterableRings::get_rx_max)\n- [.get_rx_mini_max()](IterableRings::get_rx_mini_max)\n- [.get_rx_jumbo_max()](IterableRings::get_rx_jumbo_max)\n- [.get_tx_max()](IterableRings::get_tx_max)\n- [.get_rx()](IterableRings::get_rx)\n- [.get_rx_mini()](IterableRings::get_rx_mini)\n- [.get_rx_jumbo()](IterableRings::get_rx_jumbo)\n- [.get_tx()](IterableRings::get_tx)\n- [.get_rx_buf_len()](IterableRings::get_rx_buf_len)\n- [.get_tcp_data_split()](IterableRings::get_tcp_data_split)\n- [.get_cqe_size()](IterableRings::get_cqe_size)\n- [.get_tx_push()](IterableRings::get_tx_push)\n- [.get_rx_push()](IterableRings::get_rx_push)\n- [.get_tx_push_buf_len()](IterableRings::get_tx_push_buf_len)\n- [.get_tx_push_buf_len_max()](IterableRings::get_tx_push_buf_len_max)\n- [.get_hds_thresh()](IterableRings::get_hds_thresh)\n- [.get_hds_thresh_max()](IterableRings::get_hds_thresh_max)\n\n"]
26405    pub fn op_rings_get_dump(self) -> OpRingsGetDump<'buf> {
26406        let mut res = OpRingsGetDump::new(self);
26407        res.request
26408            .do_writeback(res.protocol(), "op-rings-get-dump", OpRingsGetDump::lookup);
26409        res
26410    }
26411    #[doc = "Get ring params.\n\nRequest attributes:\n- [.nested_header()](PushRings::nested_header)\n\nReply attributes:\n- [.get_header()](IterableRings::get_header)\n- [.get_rx_max()](IterableRings::get_rx_max)\n- [.get_rx_mini_max()](IterableRings::get_rx_mini_max)\n- [.get_rx_jumbo_max()](IterableRings::get_rx_jumbo_max)\n- [.get_tx_max()](IterableRings::get_tx_max)\n- [.get_rx()](IterableRings::get_rx)\n- [.get_rx_mini()](IterableRings::get_rx_mini)\n- [.get_rx_jumbo()](IterableRings::get_rx_jumbo)\n- [.get_tx()](IterableRings::get_tx)\n- [.get_rx_buf_len()](IterableRings::get_rx_buf_len)\n- [.get_tcp_data_split()](IterableRings::get_tcp_data_split)\n- [.get_cqe_size()](IterableRings::get_cqe_size)\n- [.get_tx_push()](IterableRings::get_tx_push)\n- [.get_rx_push()](IterableRings::get_rx_push)\n- [.get_tx_push_buf_len()](IterableRings::get_tx_push_buf_len)\n- [.get_tx_push_buf_len_max()](IterableRings::get_tx_push_buf_len_max)\n- [.get_hds_thresh()](IterableRings::get_hds_thresh)\n- [.get_hds_thresh_max()](IterableRings::get_hds_thresh_max)\n\n"]
26412    pub fn op_rings_get_do(self) -> OpRingsGetDo<'buf> {
26413        let mut res = OpRingsGetDo::new(self);
26414        res.request
26415            .do_writeback(res.protocol(), "op-rings-get-do", OpRingsGetDo::lookup);
26416        res
26417    }
26418    #[doc = "Set ring params.\n\nRequest attributes:\n- [.nested_header()](PushRings::nested_header)\n- [.push_rx_max()](PushRings::push_rx_max)\n- [.push_rx_mini_max()](PushRings::push_rx_mini_max)\n- [.push_rx_jumbo_max()](PushRings::push_rx_jumbo_max)\n- [.push_tx_max()](PushRings::push_tx_max)\n- [.push_rx()](PushRings::push_rx)\n- [.push_rx_mini()](PushRings::push_rx_mini)\n- [.push_rx_jumbo()](PushRings::push_rx_jumbo)\n- [.push_tx()](PushRings::push_tx)\n- [.push_rx_buf_len()](PushRings::push_rx_buf_len)\n- [.push_tcp_data_split()](PushRings::push_tcp_data_split)\n- [.push_cqe_size()](PushRings::push_cqe_size)\n- [.push_tx_push()](PushRings::push_tx_push)\n- [.push_rx_push()](PushRings::push_rx_push)\n- [.push_tx_push_buf_len()](PushRings::push_tx_push_buf_len)\n- [.push_tx_push_buf_len_max()](PushRings::push_tx_push_buf_len_max)\n- [.push_hds_thresh()](PushRings::push_hds_thresh)\n- [.push_hds_thresh_max()](PushRings::push_hds_thresh_max)\n\n"]
26419    pub fn op_rings_set_do(self) -> OpRingsSetDo<'buf> {
26420        let mut res = OpRingsSetDo::new(self);
26421        res.request
26422            .do_writeback(res.protocol(), "op-rings-set-do", OpRingsSetDo::lookup);
26423        res
26424    }
26425    #[doc = "Get channel params.\n\nRequest attributes:\n- [.nested_header()](PushChannels::nested_header)\n\nReply attributes:\n- [.get_header()](IterableChannels::get_header)\n- [.get_rx_max()](IterableChannels::get_rx_max)\n- [.get_tx_max()](IterableChannels::get_tx_max)\n- [.get_other_max()](IterableChannels::get_other_max)\n- [.get_combined_max()](IterableChannels::get_combined_max)\n- [.get_rx_count()](IterableChannels::get_rx_count)\n- [.get_tx_count()](IterableChannels::get_tx_count)\n- [.get_other_count()](IterableChannels::get_other_count)\n- [.get_combined_count()](IterableChannels::get_combined_count)\n\n"]
26426    pub fn op_channels_get_dump(self) -> OpChannelsGetDump<'buf> {
26427        let mut res = OpChannelsGetDump::new(self);
26428        res.request.do_writeback(
26429            res.protocol(),
26430            "op-channels-get-dump",
26431            OpChannelsGetDump::lookup,
26432        );
26433        res
26434    }
26435    #[doc = "Get channel params.\n\nRequest attributes:\n- [.nested_header()](PushChannels::nested_header)\n\nReply attributes:\n- [.get_header()](IterableChannels::get_header)\n- [.get_rx_max()](IterableChannels::get_rx_max)\n- [.get_tx_max()](IterableChannels::get_tx_max)\n- [.get_other_max()](IterableChannels::get_other_max)\n- [.get_combined_max()](IterableChannels::get_combined_max)\n- [.get_rx_count()](IterableChannels::get_rx_count)\n- [.get_tx_count()](IterableChannels::get_tx_count)\n- [.get_other_count()](IterableChannels::get_other_count)\n- [.get_combined_count()](IterableChannels::get_combined_count)\n\n"]
26436    pub fn op_channels_get_do(self) -> OpChannelsGetDo<'buf> {
26437        let mut res = OpChannelsGetDo::new(self);
26438        res.request.do_writeback(
26439            res.protocol(),
26440            "op-channels-get-do",
26441            OpChannelsGetDo::lookup,
26442        );
26443        res
26444    }
26445    #[doc = "Set channel params.\n\nRequest attributes:\n- [.nested_header()](PushChannels::nested_header)\n- [.push_rx_max()](PushChannels::push_rx_max)\n- [.push_tx_max()](PushChannels::push_tx_max)\n- [.push_other_max()](PushChannels::push_other_max)\n- [.push_combined_max()](PushChannels::push_combined_max)\n- [.push_rx_count()](PushChannels::push_rx_count)\n- [.push_tx_count()](PushChannels::push_tx_count)\n- [.push_other_count()](PushChannels::push_other_count)\n- [.push_combined_count()](PushChannels::push_combined_count)\n\n"]
26446    pub fn op_channels_set_do(self) -> OpChannelsSetDo<'buf> {
26447        let mut res = OpChannelsSetDo::new(self);
26448        res.request.do_writeback(
26449            res.protocol(),
26450            "op-channels-set-do",
26451            OpChannelsSetDo::lookup,
26452        );
26453        res
26454    }
26455    #[doc = "Get coalesce params.\n\nRequest attributes:\n- [.nested_header()](PushCoalesce::nested_header)\n\nReply attributes:\n- [.get_header()](IterableCoalesce::get_header)\n- [.get_rx_usecs()](IterableCoalesce::get_rx_usecs)\n- [.get_rx_max_frames()](IterableCoalesce::get_rx_max_frames)\n- [.get_rx_usecs_irq()](IterableCoalesce::get_rx_usecs_irq)\n- [.get_rx_max_frames_irq()](IterableCoalesce::get_rx_max_frames_irq)\n- [.get_tx_usecs()](IterableCoalesce::get_tx_usecs)\n- [.get_tx_max_frames()](IterableCoalesce::get_tx_max_frames)\n- [.get_tx_usecs_irq()](IterableCoalesce::get_tx_usecs_irq)\n- [.get_tx_max_frames_irq()](IterableCoalesce::get_tx_max_frames_irq)\n- [.get_stats_block_usecs()](IterableCoalesce::get_stats_block_usecs)\n- [.get_use_adaptive_rx()](IterableCoalesce::get_use_adaptive_rx)\n- [.get_use_adaptive_tx()](IterableCoalesce::get_use_adaptive_tx)\n- [.get_pkt_rate_low()](IterableCoalesce::get_pkt_rate_low)\n- [.get_rx_usecs_low()](IterableCoalesce::get_rx_usecs_low)\n- [.get_rx_max_frames_low()](IterableCoalesce::get_rx_max_frames_low)\n- [.get_tx_usecs_low()](IterableCoalesce::get_tx_usecs_low)\n- [.get_tx_max_frames_low()](IterableCoalesce::get_tx_max_frames_low)\n- [.get_pkt_rate_high()](IterableCoalesce::get_pkt_rate_high)\n- [.get_rx_usecs_high()](IterableCoalesce::get_rx_usecs_high)\n- [.get_rx_max_frames_high()](IterableCoalesce::get_rx_max_frames_high)\n- [.get_tx_usecs_high()](IterableCoalesce::get_tx_usecs_high)\n- [.get_tx_max_frames_high()](IterableCoalesce::get_tx_max_frames_high)\n- [.get_rate_sample_interval()](IterableCoalesce::get_rate_sample_interval)\n- [.get_use_cqe_mode_tx()](IterableCoalesce::get_use_cqe_mode_tx)\n- [.get_use_cqe_mode_rx()](IterableCoalesce::get_use_cqe_mode_rx)\n- [.get_tx_aggr_max_bytes()](IterableCoalesce::get_tx_aggr_max_bytes)\n- [.get_tx_aggr_max_frames()](IterableCoalesce::get_tx_aggr_max_frames)\n- [.get_tx_aggr_time_usecs()](IterableCoalesce::get_tx_aggr_time_usecs)\n- [.get_rx_profile()](IterableCoalesce::get_rx_profile)\n- [.get_tx_profile()](IterableCoalesce::get_tx_profile)\n- [.get_rx_cqe_frames()](IterableCoalesce::get_rx_cqe_frames)\n- [.get_rx_cqe_nsecs()](IterableCoalesce::get_rx_cqe_nsecs)\n\n"]
26456    pub fn op_coalesce_get_dump(self) -> OpCoalesceGetDump<'buf> {
26457        let mut res = OpCoalesceGetDump::new(self);
26458        res.request.do_writeback(
26459            res.protocol(),
26460            "op-coalesce-get-dump",
26461            OpCoalesceGetDump::lookup,
26462        );
26463        res
26464    }
26465    #[doc = "Get coalesce params.\n\nRequest attributes:\n- [.nested_header()](PushCoalesce::nested_header)\n\nReply attributes:\n- [.get_header()](IterableCoalesce::get_header)\n- [.get_rx_usecs()](IterableCoalesce::get_rx_usecs)\n- [.get_rx_max_frames()](IterableCoalesce::get_rx_max_frames)\n- [.get_rx_usecs_irq()](IterableCoalesce::get_rx_usecs_irq)\n- [.get_rx_max_frames_irq()](IterableCoalesce::get_rx_max_frames_irq)\n- [.get_tx_usecs()](IterableCoalesce::get_tx_usecs)\n- [.get_tx_max_frames()](IterableCoalesce::get_tx_max_frames)\n- [.get_tx_usecs_irq()](IterableCoalesce::get_tx_usecs_irq)\n- [.get_tx_max_frames_irq()](IterableCoalesce::get_tx_max_frames_irq)\n- [.get_stats_block_usecs()](IterableCoalesce::get_stats_block_usecs)\n- [.get_use_adaptive_rx()](IterableCoalesce::get_use_adaptive_rx)\n- [.get_use_adaptive_tx()](IterableCoalesce::get_use_adaptive_tx)\n- [.get_pkt_rate_low()](IterableCoalesce::get_pkt_rate_low)\n- [.get_rx_usecs_low()](IterableCoalesce::get_rx_usecs_low)\n- [.get_rx_max_frames_low()](IterableCoalesce::get_rx_max_frames_low)\n- [.get_tx_usecs_low()](IterableCoalesce::get_tx_usecs_low)\n- [.get_tx_max_frames_low()](IterableCoalesce::get_tx_max_frames_low)\n- [.get_pkt_rate_high()](IterableCoalesce::get_pkt_rate_high)\n- [.get_rx_usecs_high()](IterableCoalesce::get_rx_usecs_high)\n- [.get_rx_max_frames_high()](IterableCoalesce::get_rx_max_frames_high)\n- [.get_tx_usecs_high()](IterableCoalesce::get_tx_usecs_high)\n- [.get_tx_max_frames_high()](IterableCoalesce::get_tx_max_frames_high)\n- [.get_rate_sample_interval()](IterableCoalesce::get_rate_sample_interval)\n- [.get_use_cqe_mode_tx()](IterableCoalesce::get_use_cqe_mode_tx)\n- [.get_use_cqe_mode_rx()](IterableCoalesce::get_use_cqe_mode_rx)\n- [.get_tx_aggr_max_bytes()](IterableCoalesce::get_tx_aggr_max_bytes)\n- [.get_tx_aggr_max_frames()](IterableCoalesce::get_tx_aggr_max_frames)\n- [.get_tx_aggr_time_usecs()](IterableCoalesce::get_tx_aggr_time_usecs)\n- [.get_rx_profile()](IterableCoalesce::get_rx_profile)\n- [.get_tx_profile()](IterableCoalesce::get_tx_profile)\n- [.get_rx_cqe_frames()](IterableCoalesce::get_rx_cqe_frames)\n- [.get_rx_cqe_nsecs()](IterableCoalesce::get_rx_cqe_nsecs)\n\n"]
26466    pub fn op_coalesce_get_do(self) -> OpCoalesceGetDo<'buf> {
26467        let mut res = OpCoalesceGetDo::new(self);
26468        res.request.do_writeback(
26469            res.protocol(),
26470            "op-coalesce-get-do",
26471            OpCoalesceGetDo::lookup,
26472        );
26473        res
26474    }
26475    #[doc = "Set coalesce params.\n\nRequest attributes:\n- [.nested_header()](PushCoalesce::nested_header)\n- [.push_rx_usecs()](PushCoalesce::push_rx_usecs)\n- [.push_rx_max_frames()](PushCoalesce::push_rx_max_frames)\n- [.push_rx_usecs_irq()](PushCoalesce::push_rx_usecs_irq)\n- [.push_rx_max_frames_irq()](PushCoalesce::push_rx_max_frames_irq)\n- [.push_tx_usecs()](PushCoalesce::push_tx_usecs)\n- [.push_tx_max_frames()](PushCoalesce::push_tx_max_frames)\n- [.push_tx_usecs_irq()](PushCoalesce::push_tx_usecs_irq)\n- [.push_tx_max_frames_irq()](PushCoalesce::push_tx_max_frames_irq)\n- [.push_stats_block_usecs()](PushCoalesce::push_stats_block_usecs)\n- [.push_use_adaptive_rx()](PushCoalesce::push_use_adaptive_rx)\n- [.push_use_adaptive_tx()](PushCoalesce::push_use_adaptive_tx)\n- [.push_pkt_rate_low()](PushCoalesce::push_pkt_rate_low)\n- [.push_rx_usecs_low()](PushCoalesce::push_rx_usecs_low)\n- [.push_rx_max_frames_low()](PushCoalesce::push_rx_max_frames_low)\n- [.push_tx_usecs_low()](PushCoalesce::push_tx_usecs_low)\n- [.push_tx_max_frames_low()](PushCoalesce::push_tx_max_frames_low)\n- [.push_pkt_rate_high()](PushCoalesce::push_pkt_rate_high)\n- [.push_rx_usecs_high()](PushCoalesce::push_rx_usecs_high)\n- [.push_rx_max_frames_high()](PushCoalesce::push_rx_max_frames_high)\n- [.push_tx_usecs_high()](PushCoalesce::push_tx_usecs_high)\n- [.push_tx_max_frames_high()](PushCoalesce::push_tx_max_frames_high)\n- [.push_rate_sample_interval()](PushCoalesce::push_rate_sample_interval)\n- [.push_use_cqe_mode_tx()](PushCoalesce::push_use_cqe_mode_tx)\n- [.push_use_cqe_mode_rx()](PushCoalesce::push_use_cqe_mode_rx)\n- [.push_tx_aggr_max_bytes()](PushCoalesce::push_tx_aggr_max_bytes)\n- [.push_tx_aggr_max_frames()](PushCoalesce::push_tx_aggr_max_frames)\n- [.push_tx_aggr_time_usecs()](PushCoalesce::push_tx_aggr_time_usecs)\n- [.nested_rx_profile()](PushCoalesce::nested_rx_profile)\n- [.nested_tx_profile()](PushCoalesce::nested_tx_profile)\n- [.push_rx_cqe_frames()](PushCoalesce::push_rx_cqe_frames)\n- [.push_rx_cqe_nsecs()](PushCoalesce::push_rx_cqe_nsecs)\n\n"]
26476    pub fn op_coalesce_set_do(self) -> OpCoalesceSetDo<'buf> {
26477        let mut res = OpCoalesceSetDo::new(self);
26478        res.request.do_writeback(
26479            res.protocol(),
26480            "op-coalesce-set-do",
26481            OpCoalesceSetDo::lookup,
26482        );
26483        res
26484    }
26485    #[doc = "Get pause params.\n\nRequest attributes:\n- [.nested_header()](PushPause::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePause::get_header)\n- [.get_autoneg()](IterablePause::get_autoneg)\n- [.get_rx()](IterablePause::get_rx)\n- [.get_tx()](IterablePause::get_tx)\n- [.get_stats()](IterablePause::get_stats)\n- [.get_stats_src()](IterablePause::get_stats_src)\n\n"]
26486    pub fn op_pause_get_dump(self) -> OpPauseGetDump<'buf> {
26487        let mut res = OpPauseGetDump::new(self);
26488        res.request
26489            .do_writeback(res.protocol(), "op-pause-get-dump", OpPauseGetDump::lookup);
26490        res
26491    }
26492    #[doc = "Get pause params.\n\nRequest attributes:\n- [.nested_header()](PushPause::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePause::get_header)\n- [.get_autoneg()](IterablePause::get_autoneg)\n- [.get_rx()](IterablePause::get_rx)\n- [.get_tx()](IterablePause::get_tx)\n- [.get_stats()](IterablePause::get_stats)\n- [.get_stats_src()](IterablePause::get_stats_src)\n\n"]
26493    pub fn op_pause_get_do(self) -> OpPauseGetDo<'buf> {
26494        let mut res = OpPauseGetDo::new(self);
26495        res.request
26496            .do_writeback(res.protocol(), "op-pause-get-do", OpPauseGetDo::lookup);
26497        res
26498    }
26499    #[doc = "Set pause params.\n\nRequest attributes:\n- [.nested_header()](PushPause::nested_header)\n- [.push_autoneg()](PushPause::push_autoneg)\n- [.push_rx()](PushPause::push_rx)\n- [.push_tx()](PushPause::push_tx)\n- [.nested_stats()](PushPause::nested_stats)\n- [.push_stats_src()](PushPause::push_stats_src)\n\n"]
26500    pub fn op_pause_set_do(self) -> OpPauseSetDo<'buf> {
26501        let mut res = OpPauseSetDo::new(self);
26502        res.request
26503            .do_writeback(res.protocol(), "op-pause-set-do", OpPauseSetDo::lookup);
26504        res
26505    }
26506    #[doc = "Get eee params.\n\nRequest attributes:\n- [.nested_header()](PushEee::nested_header)\n\nReply attributes:\n- [.get_header()](IterableEee::get_header)\n- [.get_modes_ours()](IterableEee::get_modes_ours)\n- [.get_modes_peer()](IterableEee::get_modes_peer)\n- [.get_active()](IterableEee::get_active)\n- [.get_enabled()](IterableEee::get_enabled)\n- [.get_tx_lpi_enabled()](IterableEee::get_tx_lpi_enabled)\n- [.get_tx_lpi_timer()](IterableEee::get_tx_lpi_timer)\n\n"]
26507    pub fn op_eee_get_dump(self) -> OpEeeGetDump<'buf> {
26508        let mut res = OpEeeGetDump::new(self);
26509        res.request
26510            .do_writeback(res.protocol(), "op-eee-get-dump", OpEeeGetDump::lookup);
26511        res
26512    }
26513    #[doc = "Get eee params.\n\nRequest attributes:\n- [.nested_header()](PushEee::nested_header)\n\nReply attributes:\n- [.get_header()](IterableEee::get_header)\n- [.get_modes_ours()](IterableEee::get_modes_ours)\n- [.get_modes_peer()](IterableEee::get_modes_peer)\n- [.get_active()](IterableEee::get_active)\n- [.get_enabled()](IterableEee::get_enabled)\n- [.get_tx_lpi_enabled()](IterableEee::get_tx_lpi_enabled)\n- [.get_tx_lpi_timer()](IterableEee::get_tx_lpi_timer)\n\n"]
26514    pub fn op_eee_get_do(self) -> OpEeeGetDo<'buf> {
26515        let mut res = OpEeeGetDo::new(self);
26516        res.request
26517            .do_writeback(res.protocol(), "op-eee-get-do", OpEeeGetDo::lookup);
26518        res
26519    }
26520    #[doc = "Set eee params.\n\nRequest attributes:\n- [.nested_header()](PushEee::nested_header)\n- [.nested_modes_ours()](PushEee::nested_modes_ours)\n- [.nested_modes_peer()](PushEee::nested_modes_peer)\n- [.push_active()](PushEee::push_active)\n- [.push_enabled()](PushEee::push_enabled)\n- [.push_tx_lpi_enabled()](PushEee::push_tx_lpi_enabled)\n- [.push_tx_lpi_timer()](PushEee::push_tx_lpi_timer)\n\n"]
26521    pub fn op_eee_set_do(self) -> OpEeeSetDo<'buf> {
26522        let mut res = OpEeeSetDo::new(self);
26523        res.request
26524            .do_writeback(res.protocol(), "op-eee-set-do", OpEeeSetDo::lookup);
26525        res
26526    }
26527    #[doc = "Get tsinfo params.\n\nRequest attributes:\n- [.nested_header()](PushTsinfo::nested_header)\n- [.nested_hwtstamp_provider()](PushTsinfo::nested_hwtstamp_provider)\n\nReply attributes:\n- [.get_header()](IterableTsinfo::get_header)\n- [.get_timestamping()](IterableTsinfo::get_timestamping)\n- [.get_tx_types()](IterableTsinfo::get_tx_types)\n- [.get_rx_filters()](IterableTsinfo::get_rx_filters)\n- [.get_phc_index()](IterableTsinfo::get_phc_index)\n- [.get_stats()](IterableTsinfo::get_stats)\n- [.get_hwtstamp_provider()](IterableTsinfo::get_hwtstamp_provider)\n- [.get_hwtstamp_source()](IterableTsinfo::get_hwtstamp_source)\n- [.get_hwtstamp_phyindex()](IterableTsinfo::get_hwtstamp_phyindex)\n\n"]
26528    pub fn op_tsinfo_get_dump(self) -> OpTsinfoGetDump<'buf> {
26529        let mut res = OpTsinfoGetDump::new(self);
26530        res.request.do_writeback(
26531            res.protocol(),
26532            "op-tsinfo-get-dump",
26533            OpTsinfoGetDump::lookup,
26534        );
26535        res
26536    }
26537    #[doc = "Get tsinfo params.\n\nRequest attributes:\n- [.nested_header()](PushTsinfo::nested_header)\n- [.nested_hwtstamp_provider()](PushTsinfo::nested_hwtstamp_provider)\n\nReply attributes:\n- [.get_header()](IterableTsinfo::get_header)\n- [.get_timestamping()](IterableTsinfo::get_timestamping)\n- [.get_tx_types()](IterableTsinfo::get_tx_types)\n- [.get_rx_filters()](IterableTsinfo::get_rx_filters)\n- [.get_phc_index()](IterableTsinfo::get_phc_index)\n- [.get_stats()](IterableTsinfo::get_stats)\n- [.get_hwtstamp_provider()](IterableTsinfo::get_hwtstamp_provider)\n- [.get_hwtstamp_source()](IterableTsinfo::get_hwtstamp_source)\n- [.get_hwtstamp_phyindex()](IterableTsinfo::get_hwtstamp_phyindex)\n\n"]
26538    pub fn op_tsinfo_get_do(self) -> OpTsinfoGetDo<'buf> {
26539        let mut res = OpTsinfoGetDo::new(self);
26540        res.request
26541            .do_writeback(res.protocol(), "op-tsinfo-get-do", OpTsinfoGetDo::lookup);
26542        res
26543    }
26544    #[doc = "Cable test.\n\nRequest attributes:\n- [.nested_header()](PushCableTest::nested_header)\n\n"]
26545    pub fn op_cable_test_act_do(self) -> OpCableTestActDo<'buf> {
26546        let mut res = OpCableTestActDo::new(self);
26547        res.request.do_writeback(
26548            res.protocol(),
26549            "op-cable-test-act-do",
26550            OpCableTestActDo::lookup,
26551        );
26552        res
26553    }
26554    #[doc = "Cable test TDR.\n\nRequest attributes:\n- [.nested_header()](PushCableTestTdr::nested_header)\n\n"]
26555    pub fn op_cable_test_tdr_act_do(self) -> OpCableTestTdrActDo<'buf> {
26556        let mut res = OpCableTestTdrActDo::new(self);
26557        res.request.do_writeback(
26558            res.protocol(),
26559            "op-cable-test-tdr-act-do",
26560            OpCableTestTdrActDo::lookup,
26561        );
26562        res
26563    }
26564    #[doc = "Get tsinfo params.\n\nRequest attributes:\n- [.nested_header()](PushTunnelInfo::nested_header)\n\nReply attributes:\n- [.get_header()](IterableTunnelInfo::get_header)\n- [.get_udp_ports()](IterableTunnelInfo::get_udp_ports)\n\n"]
26565    pub fn op_tunnel_info_get_dump(self) -> OpTunnelInfoGetDump<'buf> {
26566        let mut res = OpTunnelInfoGetDump::new(self);
26567        res.request.do_writeback(
26568            res.protocol(),
26569            "op-tunnel-info-get-dump",
26570            OpTunnelInfoGetDump::lookup,
26571        );
26572        res
26573    }
26574    #[doc = "Get tsinfo params.\n\nRequest attributes:\n- [.nested_header()](PushTunnelInfo::nested_header)\n\nReply attributes:\n- [.get_header()](IterableTunnelInfo::get_header)\n- [.get_udp_ports()](IterableTunnelInfo::get_udp_ports)\n\n"]
26575    pub fn op_tunnel_info_get_do(self) -> OpTunnelInfoGetDo<'buf> {
26576        let mut res = OpTunnelInfoGetDo::new(self);
26577        res.request.do_writeback(
26578            res.protocol(),
26579            "op-tunnel-info-get-do",
26580            OpTunnelInfoGetDo::lookup,
26581        );
26582        res
26583    }
26584    #[doc = "Get FEC params.\n\nRequest attributes:\n- [.nested_header()](PushFec::nested_header)\n\nReply attributes:\n- [.get_header()](IterableFec::get_header)\n- [.get_modes()](IterableFec::get_modes)\n- [.get_auto()](IterableFec::get_auto)\n- [.get_active()](IterableFec::get_active)\n- [.get_stats()](IterableFec::get_stats)\n\n"]
26585    pub fn op_fec_get_dump(self) -> OpFecGetDump<'buf> {
26586        let mut res = OpFecGetDump::new(self);
26587        res.request
26588            .do_writeback(res.protocol(), "op-fec-get-dump", OpFecGetDump::lookup);
26589        res
26590    }
26591    #[doc = "Get FEC params.\n\nRequest attributes:\n- [.nested_header()](PushFec::nested_header)\n\nReply attributes:\n- [.get_header()](IterableFec::get_header)\n- [.get_modes()](IterableFec::get_modes)\n- [.get_auto()](IterableFec::get_auto)\n- [.get_active()](IterableFec::get_active)\n- [.get_stats()](IterableFec::get_stats)\n\n"]
26592    pub fn op_fec_get_do(self) -> OpFecGetDo<'buf> {
26593        let mut res = OpFecGetDo::new(self);
26594        res.request
26595            .do_writeback(res.protocol(), "op-fec-get-do", OpFecGetDo::lookup);
26596        res
26597    }
26598    #[doc = "Set FEC params.\n\nRequest attributes:\n- [.nested_header()](PushFec::nested_header)\n- [.nested_modes()](PushFec::nested_modes)\n- [.push_auto()](PushFec::push_auto)\n- [.push_active()](PushFec::push_active)\n- [.nested_stats()](PushFec::nested_stats)\n\n"]
26599    pub fn op_fec_set_do(self) -> OpFecSetDo<'buf> {
26600        let mut res = OpFecSetDo::new(self);
26601        res.request
26602            .do_writeback(res.protocol(), "op-fec-set-do", OpFecSetDo::lookup);
26603        res
26604    }
26605    #[doc = "Get module EEPROM params.\n\nRequest attributes:\n- [.nested_header()](PushModuleEeprom::nested_header)\n- [.push_offset()](PushModuleEeprom::push_offset)\n- [.push_length()](PushModuleEeprom::push_length)\n- [.push_page()](PushModuleEeprom::push_page)\n- [.push_bank()](PushModuleEeprom::push_bank)\n- [.push_i2c_address()](PushModuleEeprom::push_i2c_address)\n\nReply attributes:\n- [.get_header()](IterableModuleEeprom::get_header)\n- [.get_data()](IterableModuleEeprom::get_data)\n\n"]
26606    pub fn op_module_eeprom_get_dump(self) -> OpModuleEepromGetDump<'buf> {
26607        let mut res = OpModuleEepromGetDump::new(self);
26608        res.request.do_writeback(
26609            res.protocol(),
26610            "op-module-eeprom-get-dump",
26611            OpModuleEepromGetDump::lookup,
26612        );
26613        res
26614    }
26615    #[doc = "Get module EEPROM params.\n\nRequest attributes:\n- [.nested_header()](PushModuleEeprom::nested_header)\n- [.push_offset()](PushModuleEeprom::push_offset)\n- [.push_length()](PushModuleEeprom::push_length)\n- [.push_page()](PushModuleEeprom::push_page)\n- [.push_bank()](PushModuleEeprom::push_bank)\n- [.push_i2c_address()](PushModuleEeprom::push_i2c_address)\n\nReply attributes:\n- [.get_header()](IterableModuleEeprom::get_header)\n- [.get_data()](IterableModuleEeprom::get_data)\n\n"]
26616    pub fn op_module_eeprom_get_do(self) -> OpModuleEepromGetDo<'buf> {
26617        let mut res = OpModuleEepromGetDo::new(self);
26618        res.request.do_writeback(
26619            res.protocol(),
26620            "op-module-eeprom-get-do",
26621            OpModuleEepromGetDo::lookup,
26622        );
26623        res
26624    }
26625    #[doc = "Get statistics.\n\nRequest attributes:\n- [.nested_header()](PushStats::nested_header)\n- [.nested_groups()](PushStats::nested_groups)\n\nReply attributes:\n- [.get_header()](IterableStats::get_header)\n- [.get_groups()](IterableStats::get_groups)\n- [.get_grp()](IterableStats::get_grp)\n- [.get_src()](IterableStats::get_src)\n\n"]
26626    pub fn op_stats_get_dump(self) -> OpStatsGetDump<'buf> {
26627        let mut res = OpStatsGetDump::new(self);
26628        res.request
26629            .do_writeback(res.protocol(), "op-stats-get-dump", OpStatsGetDump::lookup);
26630        res
26631    }
26632    #[doc = "Get statistics.\n\nRequest attributes:\n- [.nested_header()](PushStats::nested_header)\n- [.nested_groups()](PushStats::nested_groups)\n\nReply attributes:\n- [.get_header()](IterableStats::get_header)\n- [.get_groups()](IterableStats::get_groups)\n- [.get_grp()](IterableStats::get_grp)\n- [.get_src()](IterableStats::get_src)\n\n"]
26633    pub fn op_stats_get_do(self) -> OpStatsGetDo<'buf> {
26634        let mut res = OpStatsGetDo::new(self);
26635        res.request
26636            .do_writeback(res.protocol(), "op-stats-get-do", OpStatsGetDo::lookup);
26637        res
26638    }
26639    #[doc = "Get PHC VCLOCKs.\n\nRequest attributes:\n- [.nested_header()](PushPhcVclocks::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePhcVclocks::get_header)\n- [.get_num()](IterablePhcVclocks::get_num)\n\n"]
26640    pub fn op_phc_vclocks_get_dump(self) -> OpPhcVclocksGetDump<'buf> {
26641        let mut res = OpPhcVclocksGetDump::new(self);
26642        res.request.do_writeback(
26643            res.protocol(),
26644            "op-phc-vclocks-get-dump",
26645            OpPhcVclocksGetDump::lookup,
26646        );
26647        res
26648    }
26649    #[doc = "Get PHC VCLOCKs.\n\nRequest attributes:\n- [.nested_header()](PushPhcVclocks::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePhcVclocks::get_header)\n- [.get_num()](IterablePhcVclocks::get_num)\n\n"]
26650    pub fn op_phc_vclocks_get_do(self) -> OpPhcVclocksGetDo<'buf> {
26651        let mut res = OpPhcVclocksGetDo::new(self);
26652        res.request.do_writeback(
26653            res.protocol(),
26654            "op-phc-vclocks-get-do",
26655            OpPhcVclocksGetDo::lookup,
26656        );
26657        res
26658    }
26659    #[doc = "Get module params.\n\nRequest attributes:\n- [.nested_header()](PushModule::nested_header)\n\nReply attributes:\n- [.get_header()](IterableModule::get_header)\n- [.get_power_mode_policy()](IterableModule::get_power_mode_policy)\n- [.get_power_mode()](IterableModule::get_power_mode)\n\n"]
26660    pub fn op_module_get_dump(self) -> OpModuleGetDump<'buf> {
26661        let mut res = OpModuleGetDump::new(self);
26662        res.request.do_writeback(
26663            res.protocol(),
26664            "op-module-get-dump",
26665            OpModuleGetDump::lookup,
26666        );
26667        res
26668    }
26669    #[doc = "Get module params.\n\nRequest attributes:\n- [.nested_header()](PushModule::nested_header)\n\nReply attributes:\n- [.get_header()](IterableModule::get_header)\n- [.get_power_mode_policy()](IterableModule::get_power_mode_policy)\n- [.get_power_mode()](IterableModule::get_power_mode)\n\n"]
26670    pub fn op_module_get_do(self) -> OpModuleGetDo<'buf> {
26671        let mut res = OpModuleGetDo::new(self);
26672        res.request
26673            .do_writeback(res.protocol(), "op-module-get-do", OpModuleGetDo::lookup);
26674        res
26675    }
26676    #[doc = "Set module params.\n\nRequest attributes:\n- [.nested_header()](PushModule::nested_header)\n- [.push_power_mode_policy()](PushModule::push_power_mode_policy)\n- [.push_power_mode()](PushModule::push_power_mode)\n\n"]
26677    pub fn op_module_set_do(self) -> OpModuleSetDo<'buf> {
26678        let mut res = OpModuleSetDo::new(self);
26679        res.request
26680            .do_writeback(res.protocol(), "op-module-set-do", OpModuleSetDo::lookup);
26681        res
26682    }
26683    #[doc = "Get Power Sourcing Equipment params.\n\nRequest attributes:\n- [.nested_header()](PushPse::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePse::get_header)\n- [.get_podl_pse_admin_state()](IterablePse::get_podl_pse_admin_state)\n- [.get_podl_pse_admin_control()](IterablePse::get_podl_pse_admin_control)\n- [.get_podl_pse_pw_d_status()](IterablePse::get_podl_pse_pw_d_status)\n- [.get_c33_pse_admin_state()](IterablePse::get_c33_pse_admin_state)\n- [.get_c33_pse_admin_control()](IterablePse::get_c33_pse_admin_control)\n- [.get_c33_pse_pw_d_status()](IterablePse::get_c33_pse_pw_d_status)\n- [.get_c33_pse_pw_class()](IterablePse::get_c33_pse_pw_class)\n- [.get_c33_pse_actual_pw()](IterablePse::get_c33_pse_actual_pw)\n- [.get_c33_pse_ext_state()](IterablePse::get_c33_pse_ext_state)\n- [.get_c33_pse_ext_substate()](IterablePse::get_c33_pse_ext_substate)\n- [.get_c33_pse_avail_pw_limit()](IterablePse::get_c33_pse_avail_pw_limit)\n- [.get_c33_pse_pw_limit_ranges()](IterablePse::get_c33_pse_pw_limit_ranges)\n- [.get_pse_pw_d_id()](IterablePse::get_pse_pw_d_id)\n- [.get_pse_prio_max()](IterablePse::get_pse_prio_max)\n- [.get_pse_prio()](IterablePse::get_pse_prio)\n\n"]
26684    pub fn op_pse_get_dump(self) -> OpPseGetDump<'buf> {
26685        let mut res = OpPseGetDump::new(self);
26686        res.request
26687            .do_writeback(res.protocol(), "op-pse-get-dump", OpPseGetDump::lookup);
26688        res
26689    }
26690    #[doc = "Get Power Sourcing Equipment params.\n\nRequest attributes:\n- [.nested_header()](PushPse::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePse::get_header)\n- [.get_podl_pse_admin_state()](IterablePse::get_podl_pse_admin_state)\n- [.get_podl_pse_admin_control()](IterablePse::get_podl_pse_admin_control)\n- [.get_podl_pse_pw_d_status()](IterablePse::get_podl_pse_pw_d_status)\n- [.get_c33_pse_admin_state()](IterablePse::get_c33_pse_admin_state)\n- [.get_c33_pse_admin_control()](IterablePse::get_c33_pse_admin_control)\n- [.get_c33_pse_pw_d_status()](IterablePse::get_c33_pse_pw_d_status)\n- [.get_c33_pse_pw_class()](IterablePse::get_c33_pse_pw_class)\n- [.get_c33_pse_actual_pw()](IterablePse::get_c33_pse_actual_pw)\n- [.get_c33_pse_ext_state()](IterablePse::get_c33_pse_ext_state)\n- [.get_c33_pse_ext_substate()](IterablePse::get_c33_pse_ext_substate)\n- [.get_c33_pse_avail_pw_limit()](IterablePse::get_c33_pse_avail_pw_limit)\n- [.get_c33_pse_pw_limit_ranges()](IterablePse::get_c33_pse_pw_limit_ranges)\n- [.get_pse_pw_d_id()](IterablePse::get_pse_pw_d_id)\n- [.get_pse_prio_max()](IterablePse::get_pse_prio_max)\n- [.get_pse_prio()](IterablePse::get_pse_prio)\n\n"]
26691    pub fn op_pse_get_do(self) -> OpPseGetDo<'buf> {
26692        let mut res = OpPseGetDo::new(self);
26693        res.request
26694            .do_writeback(res.protocol(), "op-pse-get-do", OpPseGetDo::lookup);
26695        res
26696    }
26697    #[doc = "Set Power Sourcing Equipment params.\n\nRequest attributes:\n- [.nested_header()](PushPse::nested_header)\n- [.push_podl_pse_admin_control()](PushPse::push_podl_pse_admin_control)\n- [.push_c33_pse_admin_control()](PushPse::push_c33_pse_admin_control)\n- [.push_c33_pse_avail_pw_limit()](PushPse::push_c33_pse_avail_pw_limit)\n- [.push_pse_prio()](PushPse::push_pse_prio)\n\n"]
26698    pub fn op_pse_set_do(self) -> OpPseSetDo<'buf> {
26699        let mut res = OpPseSetDo::new(self);
26700        res.request
26701            .do_writeback(res.protocol(), "op-pse-set-do", OpPseSetDo::lookup);
26702        res
26703    }
26704    #[doc = "Get RSS params.\n\nRequest attributes:\n- [.nested_header()](PushRss::nested_header)\n- [.push_start_context()](PushRss::push_start_context)\n\nReply attributes:\n- [.get_header()](IterableRss::get_header)\n- [.get_context()](IterableRss::get_context)\n- [.get_hfunc()](IterableRss::get_hfunc)\n- [.get_indir()](IterableRss::get_indir)\n- [.get_hkey()](IterableRss::get_hkey)\n- [.get_input_xfrm()](IterableRss::get_input_xfrm)\n- [.get_flow_hash()](IterableRss::get_flow_hash)\n\n"]
26705    pub fn op_rss_get_dump(self) -> OpRssGetDump<'buf> {
26706        let mut res = OpRssGetDump::new(self);
26707        res.request
26708            .do_writeback(res.protocol(), "op-rss-get-dump", OpRssGetDump::lookup);
26709        res
26710    }
26711    #[doc = "Get RSS params.\n\nRequest attributes:\n- [.nested_header()](PushRss::nested_header)\n- [.push_context()](PushRss::push_context)\n\nReply attributes:\n- [.get_header()](IterableRss::get_header)\n- [.get_context()](IterableRss::get_context)\n- [.get_hfunc()](IterableRss::get_hfunc)\n- [.get_indir()](IterableRss::get_indir)\n- [.get_hkey()](IterableRss::get_hkey)\n- [.get_input_xfrm()](IterableRss::get_input_xfrm)\n- [.get_flow_hash()](IterableRss::get_flow_hash)\n\n"]
26712    pub fn op_rss_get_do(self) -> OpRssGetDo<'buf> {
26713        let mut res = OpRssGetDo::new(self);
26714        res.request
26715            .do_writeback(res.protocol(), "op-rss-get-do", OpRssGetDo::lookup);
26716        res
26717    }
26718    #[doc = "Get PLCA params.\n\nRequest attributes:\n- [.nested_header()](PushPlca::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePlca::get_header)\n- [.get_version()](IterablePlca::get_version)\n- [.get_enabled()](IterablePlca::get_enabled)\n- [.get_status()](IterablePlca::get_status)\n- [.get_node_cnt()](IterablePlca::get_node_cnt)\n- [.get_node_id()](IterablePlca::get_node_id)\n- [.get_to_tmr()](IterablePlca::get_to_tmr)\n- [.get_burst_cnt()](IterablePlca::get_burst_cnt)\n- [.get_burst_tmr()](IterablePlca::get_burst_tmr)\n\n"]
26719    pub fn op_plca_get_cfg_dump(self) -> OpPlcaGetCfgDump<'buf> {
26720        let mut res = OpPlcaGetCfgDump::new(self);
26721        res.request.do_writeback(
26722            res.protocol(),
26723            "op-plca-get-cfg-dump",
26724            OpPlcaGetCfgDump::lookup,
26725        );
26726        res
26727    }
26728    #[doc = "Get PLCA params.\n\nRequest attributes:\n- [.nested_header()](PushPlca::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePlca::get_header)\n- [.get_version()](IterablePlca::get_version)\n- [.get_enabled()](IterablePlca::get_enabled)\n- [.get_status()](IterablePlca::get_status)\n- [.get_node_cnt()](IterablePlca::get_node_cnt)\n- [.get_node_id()](IterablePlca::get_node_id)\n- [.get_to_tmr()](IterablePlca::get_to_tmr)\n- [.get_burst_cnt()](IterablePlca::get_burst_cnt)\n- [.get_burst_tmr()](IterablePlca::get_burst_tmr)\n\n"]
26729    pub fn op_plca_get_cfg_do(self) -> OpPlcaGetCfgDo<'buf> {
26730        let mut res = OpPlcaGetCfgDo::new(self);
26731        res.request
26732            .do_writeback(res.protocol(), "op-plca-get-cfg-do", OpPlcaGetCfgDo::lookup);
26733        res
26734    }
26735    #[doc = "Set PLCA params.\n\nRequest attributes:\n- [.nested_header()](PushPlca::nested_header)\n- [.push_version()](PushPlca::push_version)\n- [.push_enabled()](PushPlca::push_enabled)\n- [.push_status()](PushPlca::push_status)\n- [.push_node_cnt()](PushPlca::push_node_cnt)\n- [.push_node_id()](PushPlca::push_node_id)\n- [.push_to_tmr()](PushPlca::push_to_tmr)\n- [.push_burst_cnt()](PushPlca::push_burst_cnt)\n- [.push_burst_tmr()](PushPlca::push_burst_tmr)\n\n"]
26736    pub fn op_plca_set_cfg_do(self) -> OpPlcaSetCfgDo<'buf> {
26737        let mut res = OpPlcaSetCfgDo::new(self);
26738        res.request
26739            .do_writeback(res.protocol(), "op-plca-set-cfg-do", OpPlcaSetCfgDo::lookup);
26740        res
26741    }
26742    #[doc = "Get PLCA status params.\n\nRequest attributes:\n- [.nested_header()](PushPlca::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePlca::get_header)\n- [.get_version()](IterablePlca::get_version)\n- [.get_enabled()](IterablePlca::get_enabled)\n- [.get_status()](IterablePlca::get_status)\n- [.get_node_cnt()](IterablePlca::get_node_cnt)\n- [.get_node_id()](IterablePlca::get_node_id)\n- [.get_to_tmr()](IterablePlca::get_to_tmr)\n- [.get_burst_cnt()](IterablePlca::get_burst_cnt)\n- [.get_burst_tmr()](IterablePlca::get_burst_tmr)\n\n"]
26743    pub fn op_plca_get_status_dump(self) -> OpPlcaGetStatusDump<'buf> {
26744        let mut res = OpPlcaGetStatusDump::new(self);
26745        res.request.do_writeback(
26746            res.protocol(),
26747            "op-plca-get-status-dump",
26748            OpPlcaGetStatusDump::lookup,
26749        );
26750        res
26751    }
26752    #[doc = "Get PLCA status params.\n\nRequest attributes:\n- [.nested_header()](PushPlca::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePlca::get_header)\n- [.get_version()](IterablePlca::get_version)\n- [.get_enabled()](IterablePlca::get_enabled)\n- [.get_status()](IterablePlca::get_status)\n- [.get_node_cnt()](IterablePlca::get_node_cnt)\n- [.get_node_id()](IterablePlca::get_node_id)\n- [.get_to_tmr()](IterablePlca::get_to_tmr)\n- [.get_burst_cnt()](IterablePlca::get_burst_cnt)\n- [.get_burst_tmr()](IterablePlca::get_burst_tmr)\n\n"]
26753    pub fn op_plca_get_status_do(self) -> OpPlcaGetStatusDo<'buf> {
26754        let mut res = OpPlcaGetStatusDo::new(self);
26755        res.request.do_writeback(
26756            res.protocol(),
26757            "op-plca-get-status-do",
26758            OpPlcaGetStatusDo::lookup,
26759        );
26760        res
26761    }
26762    #[doc = "Get MAC Merge configuration and state\n\nRequest attributes:\n- [.nested_header()](PushMm::nested_header)\n\nReply attributes:\n- [.get_header()](IterableMm::get_header)\n- [.get_pmac_enabled()](IterableMm::get_pmac_enabled)\n- [.get_tx_enabled()](IterableMm::get_tx_enabled)\n- [.get_tx_active()](IterableMm::get_tx_active)\n- [.get_tx_min_frag_size()](IterableMm::get_tx_min_frag_size)\n- [.get_rx_min_frag_size()](IterableMm::get_rx_min_frag_size)\n- [.get_verify_enabled()](IterableMm::get_verify_enabled)\n- [.get_verify_time()](IterableMm::get_verify_time)\n- [.get_max_verify_time()](IterableMm::get_max_verify_time)\n- [.get_stats()](IterableMm::get_stats)\n\n"]
26763    pub fn op_mm_get_dump(self) -> OpMmGetDump<'buf> {
26764        let mut res = OpMmGetDump::new(self);
26765        res.request
26766            .do_writeback(res.protocol(), "op-mm-get-dump", OpMmGetDump::lookup);
26767        res
26768    }
26769    #[doc = "Get MAC Merge configuration and state\n\nRequest attributes:\n- [.nested_header()](PushMm::nested_header)\n\nReply attributes:\n- [.get_header()](IterableMm::get_header)\n- [.get_pmac_enabled()](IterableMm::get_pmac_enabled)\n- [.get_tx_enabled()](IterableMm::get_tx_enabled)\n- [.get_tx_active()](IterableMm::get_tx_active)\n- [.get_tx_min_frag_size()](IterableMm::get_tx_min_frag_size)\n- [.get_rx_min_frag_size()](IterableMm::get_rx_min_frag_size)\n- [.get_verify_enabled()](IterableMm::get_verify_enabled)\n- [.get_verify_time()](IterableMm::get_verify_time)\n- [.get_max_verify_time()](IterableMm::get_max_verify_time)\n- [.get_stats()](IterableMm::get_stats)\n\n"]
26770    pub fn op_mm_get_do(self) -> OpMmGetDo<'buf> {
26771        let mut res = OpMmGetDo::new(self);
26772        res.request
26773            .do_writeback(res.protocol(), "op-mm-get-do", OpMmGetDo::lookup);
26774        res
26775    }
26776    #[doc = "Set MAC Merge configuration\n\nRequest attributes:\n- [.nested_header()](PushMm::nested_header)\n- [.push_pmac_enabled()](PushMm::push_pmac_enabled)\n- [.push_tx_enabled()](PushMm::push_tx_enabled)\n- [.push_tx_min_frag_size()](PushMm::push_tx_min_frag_size)\n- [.push_verify_enabled()](PushMm::push_verify_enabled)\n- [.push_verify_time()](PushMm::push_verify_time)\n\n"]
26777    pub fn op_mm_set_do(self) -> OpMmSetDo<'buf> {
26778        let mut res = OpMmSetDo::new(self);
26779        res.request
26780            .do_writeback(res.protocol(), "op-mm-set-do", OpMmSetDo::lookup);
26781        res
26782    }
26783    #[doc = "Flash transceiver module firmware.\n\nRequest attributes:\n- [.nested_header()](PushModuleFwFlash::nested_header)\n- [.push_file_name()](PushModuleFwFlash::push_file_name)\n- [.push_password()](PushModuleFwFlash::push_password)\n\n"]
26784    pub fn op_module_fw_flash_act_do(self) -> OpModuleFwFlashActDo<'buf> {
26785        let mut res = OpModuleFwFlashActDo::new(self);
26786        res.request.do_writeback(
26787            res.protocol(),
26788            "op-module-fw-flash-act-do",
26789            OpModuleFwFlashActDo::lookup,
26790        );
26791        res
26792    }
26793    #[doc = "Get PHY devices attached to an interface\n\nRequest attributes:\n- [.nested_header()](PushPhy::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePhy::get_header)\n- [.get_index()](IterablePhy::get_index)\n- [.get_drvname()](IterablePhy::get_drvname)\n- [.get_name()](IterablePhy::get_name)\n- [.get_upstream_type()](IterablePhy::get_upstream_type)\n- [.get_upstream_index()](IterablePhy::get_upstream_index)\n- [.get_upstream_sfp_name()](IterablePhy::get_upstream_sfp_name)\n- [.get_downstream_sfp_name()](IterablePhy::get_downstream_sfp_name)\n\n"]
26794    pub fn op_phy_get_dump(self) -> OpPhyGetDump<'buf> {
26795        let mut res = OpPhyGetDump::new(self);
26796        res.request
26797            .do_writeback(res.protocol(), "op-phy-get-dump", OpPhyGetDump::lookup);
26798        res
26799    }
26800    #[doc = "Get PHY devices attached to an interface\n\nRequest attributes:\n- [.nested_header()](PushPhy::nested_header)\n\nReply attributes:\n- [.get_header()](IterablePhy::get_header)\n- [.get_index()](IterablePhy::get_index)\n- [.get_drvname()](IterablePhy::get_drvname)\n- [.get_name()](IterablePhy::get_name)\n- [.get_upstream_type()](IterablePhy::get_upstream_type)\n- [.get_upstream_index()](IterablePhy::get_upstream_index)\n- [.get_upstream_sfp_name()](IterablePhy::get_upstream_sfp_name)\n- [.get_downstream_sfp_name()](IterablePhy::get_downstream_sfp_name)\n\n"]
26801    pub fn op_phy_get_do(self) -> OpPhyGetDo<'buf> {
26802        let mut res = OpPhyGetDo::new(self);
26803        res.request
26804            .do_writeback(res.protocol(), "op-phy-get-do", OpPhyGetDo::lookup);
26805        res
26806    }
26807    #[doc = "Get hwtstamp config.\n\nRequest attributes:\n- [.nested_header()](PushTsconfig::nested_header)\n\nReply attributes:\n- [.get_header()](IterableTsconfig::get_header)\n- [.get_hwtstamp_provider()](IterableTsconfig::get_hwtstamp_provider)\n- [.get_tx_types()](IterableTsconfig::get_tx_types)\n- [.get_rx_filters()](IterableTsconfig::get_rx_filters)\n- [.get_hwtstamp_flags()](IterableTsconfig::get_hwtstamp_flags)\n\n"]
26808    pub fn op_tsconfig_get_dump(self) -> OpTsconfigGetDump<'buf> {
26809        let mut res = OpTsconfigGetDump::new(self);
26810        res.request.do_writeback(
26811            res.protocol(),
26812            "op-tsconfig-get-dump",
26813            OpTsconfigGetDump::lookup,
26814        );
26815        res
26816    }
26817    #[doc = "Get hwtstamp config.\n\nRequest attributes:\n- [.nested_header()](PushTsconfig::nested_header)\n\nReply attributes:\n- [.get_header()](IterableTsconfig::get_header)\n- [.get_hwtstamp_provider()](IterableTsconfig::get_hwtstamp_provider)\n- [.get_tx_types()](IterableTsconfig::get_tx_types)\n- [.get_rx_filters()](IterableTsconfig::get_rx_filters)\n- [.get_hwtstamp_flags()](IterableTsconfig::get_hwtstamp_flags)\n\n"]
26818    pub fn op_tsconfig_get_do(self) -> OpTsconfigGetDo<'buf> {
26819        let mut res = OpTsconfigGetDo::new(self);
26820        res.request.do_writeback(
26821            res.protocol(),
26822            "op-tsconfig-get-do",
26823            OpTsconfigGetDo::lookup,
26824        );
26825        res
26826    }
26827    #[doc = "Set hwtstamp config.\n\nRequest attributes:\n- [.nested_header()](PushTsconfig::nested_header)\n- [.nested_hwtstamp_provider()](PushTsconfig::nested_hwtstamp_provider)\n- [.nested_tx_types()](PushTsconfig::nested_tx_types)\n- [.nested_rx_filters()](PushTsconfig::nested_rx_filters)\n- [.nested_hwtstamp_flags()](PushTsconfig::nested_hwtstamp_flags)\n\nReply attributes:\n- [.get_header()](IterableTsconfig::get_header)\n- [.get_hwtstamp_provider()](IterableTsconfig::get_hwtstamp_provider)\n- [.get_tx_types()](IterableTsconfig::get_tx_types)\n- [.get_rx_filters()](IterableTsconfig::get_rx_filters)\n- [.get_hwtstamp_flags()](IterableTsconfig::get_hwtstamp_flags)\n\n"]
26828    pub fn op_tsconfig_set_do(self) -> OpTsconfigSetDo<'buf> {
26829        let mut res = OpTsconfigSetDo::new(self);
26830        res.request.do_writeback(
26831            res.protocol(),
26832            "op-tsconfig-set-do",
26833            OpTsconfigSetDo::lookup,
26834        );
26835        res
26836    }
26837    #[doc = "Set RSS params.\n\nRequest attributes:\n- [.nested_header()](PushRss::nested_header)\n- [.push_context()](PushRss::push_context)\n- [.push_hfunc()](PushRss::push_hfunc)\n- [.push_indir()](PushRss::push_indir)\n- [.push_hkey()](PushRss::push_hkey)\n- [.push_input_xfrm()](PushRss::push_input_xfrm)\n- [.nested_flow_hash()](PushRss::nested_flow_hash)\n\n"]
26838    pub fn op_rss_set_do(self) -> OpRssSetDo<'buf> {
26839        let mut res = OpRssSetDo::new(self);
26840        res.request
26841            .do_writeback(res.protocol(), "op-rss-set-do", OpRssSetDo::lookup);
26842        res
26843    }
26844    #[doc = "Create an RSS context.\n\nRequest attributes:\n- [.nested_header()](PushRss::nested_header)\n- [.push_context()](PushRss::push_context)\n- [.push_hfunc()](PushRss::push_hfunc)\n- [.push_indir()](PushRss::push_indir)\n- [.push_hkey()](PushRss::push_hkey)\n- [.push_input_xfrm()](PushRss::push_input_xfrm)\n\nReply attributes:\n- [.get_header()](IterableRss::get_header)\n- [.get_context()](IterableRss::get_context)\n- [.get_hfunc()](IterableRss::get_hfunc)\n- [.get_indir()](IterableRss::get_indir)\n- [.get_hkey()](IterableRss::get_hkey)\n- [.get_input_xfrm()](IterableRss::get_input_xfrm)\n\n"]
26845    pub fn op_rss_create_act_do(self) -> OpRssCreateActDo<'buf> {
26846        let mut res = OpRssCreateActDo::new(self);
26847        res.request.do_writeback(
26848            res.protocol(),
26849            "op-rss-create-act-do",
26850            OpRssCreateActDo::lookup,
26851        );
26852        res
26853    }
26854    #[doc = "Delete an RSS context.\n\nRequest attributes:\n- [.nested_header()](PushRss::nested_header)\n- [.push_context()](PushRss::push_context)\n\n"]
26855    pub fn op_rss_delete_act_do(self) -> OpRssDeleteActDo<'buf> {
26856        let mut res = OpRssDeleteActDo::new(self);
26857        res.request.do_writeback(
26858            res.protocol(),
26859            "op-rss-delete-act-do",
26860            OpRssDeleteActDo::lookup,
26861        );
26862        res
26863    }
26864    #[doc = "Get PHY MSE measurement data and capabilities.\n\nRequest attributes:\n- [.nested_header()](PushMse::nested_header)\n\nReply attributes:\n- [.get_header()](IterableMse::get_header)\n- [.get_capabilities()](IterableMse::get_capabilities)\n- [.get_channel_a()](IterableMse::get_channel_a)\n- [.get_channel_b()](IterableMse::get_channel_b)\n- [.get_channel_c()](IterableMse::get_channel_c)\n- [.get_channel_d()](IterableMse::get_channel_d)\n- [.get_worst_channel()](IterableMse::get_worst_channel)\n- [.get_link()](IterableMse::get_link)\n\n"]
26865    pub fn op_mse_get_dump(self) -> OpMseGetDump<'buf> {
26866        let mut res = OpMseGetDump::new(self);
26867        res.request
26868            .do_writeback(res.protocol(), "op-mse-get-dump", OpMseGetDump::lookup);
26869        res
26870    }
26871    #[doc = "Get PHY MSE measurement data and capabilities.\n\nRequest attributes:\n- [.nested_header()](PushMse::nested_header)\n\nReply attributes:\n- [.get_header()](IterableMse::get_header)\n- [.get_capabilities()](IterableMse::get_capabilities)\n- [.get_channel_a()](IterableMse::get_channel_a)\n- [.get_channel_b()](IterableMse::get_channel_b)\n- [.get_channel_c()](IterableMse::get_channel_c)\n- [.get_channel_d()](IterableMse::get_channel_d)\n- [.get_worst_channel()](IterableMse::get_worst_channel)\n- [.get_link()](IterableMse::get_link)\n\n"]
26872    pub fn op_mse_get_do(self) -> OpMseGetDo<'buf> {
26873        let mut res = OpMseGetDo::new(self);
26874        res.request
26875            .do_writeback(res.protocol(), "op-mse-get-do", OpMseGetDo::lookup);
26876        res
26877    }
26878}
26879#[cfg(test)]
26880mod generated_tests {
26881    use super::*;
26882    #[test]
26883    fn tests() {
26884        let _ = IterableChannels::get_combined_count;
26885        let _ = IterableChannels::get_combined_max;
26886        let _ = IterableChannels::get_header;
26887        let _ = IterableChannels::get_other_count;
26888        let _ = IterableChannels::get_other_max;
26889        let _ = IterableChannels::get_rx_count;
26890        let _ = IterableChannels::get_rx_max;
26891        let _ = IterableChannels::get_tx_count;
26892        let _ = IterableChannels::get_tx_max;
26893        let _ = IterableCoalesce::get_header;
26894        let _ = IterableCoalesce::get_pkt_rate_high;
26895        let _ = IterableCoalesce::get_pkt_rate_low;
26896        let _ = IterableCoalesce::get_rate_sample_interval;
26897        let _ = IterableCoalesce::get_rx_cqe_frames;
26898        let _ = IterableCoalesce::get_rx_cqe_nsecs;
26899        let _ = IterableCoalesce::get_rx_max_frames;
26900        let _ = IterableCoalesce::get_rx_max_frames_high;
26901        let _ = IterableCoalesce::get_rx_max_frames_irq;
26902        let _ = IterableCoalesce::get_rx_max_frames_low;
26903        let _ = IterableCoalesce::get_rx_profile;
26904        let _ = IterableCoalesce::get_rx_usecs;
26905        let _ = IterableCoalesce::get_rx_usecs_high;
26906        let _ = IterableCoalesce::get_rx_usecs_irq;
26907        let _ = IterableCoalesce::get_rx_usecs_low;
26908        let _ = IterableCoalesce::get_stats_block_usecs;
26909        let _ = IterableCoalesce::get_tx_aggr_max_bytes;
26910        let _ = IterableCoalesce::get_tx_aggr_max_frames;
26911        let _ = IterableCoalesce::get_tx_aggr_time_usecs;
26912        let _ = IterableCoalesce::get_tx_max_frames;
26913        let _ = IterableCoalesce::get_tx_max_frames_high;
26914        let _ = IterableCoalesce::get_tx_max_frames_irq;
26915        let _ = IterableCoalesce::get_tx_max_frames_low;
26916        let _ = IterableCoalesce::get_tx_profile;
26917        let _ = IterableCoalesce::get_tx_usecs;
26918        let _ = IterableCoalesce::get_tx_usecs_high;
26919        let _ = IterableCoalesce::get_tx_usecs_irq;
26920        let _ = IterableCoalesce::get_tx_usecs_low;
26921        let _ = IterableCoalesce::get_use_adaptive_rx;
26922        let _ = IterableCoalesce::get_use_adaptive_tx;
26923        let _ = IterableCoalesce::get_use_cqe_mode_rx;
26924        let _ = IterableCoalesce::get_use_cqe_mode_tx;
26925        let _ = IterableDebug::get_header;
26926        let _ = IterableDebug::get_msgmask;
26927        let _ = IterableEee::get_active;
26928        let _ = IterableEee::get_enabled;
26929        let _ = IterableEee::get_header;
26930        let _ = IterableEee::get_modes_ours;
26931        let _ = IterableEee::get_modes_peer;
26932        let _ = IterableEee::get_tx_lpi_enabled;
26933        let _ = IterableEee::get_tx_lpi_timer;
26934        let _ = IterableFeatures::get_active;
26935        let _ = IterableFeatures::get_header;
26936        let _ = IterableFeatures::get_hw;
26937        let _ = IterableFeatures::get_nochange;
26938        let _ = IterableFeatures::get_wanted;
26939        let _ = IterableFec::get_active;
26940        let _ = IterableFec::get_auto;
26941        let _ = IterableFec::get_header;
26942        let _ = IterableFec::get_modes;
26943        let _ = IterableFec::get_stats;
26944        let _ = IterableLinkinfo::get_header;
26945        let _ = IterableLinkinfo::get_phyaddr;
26946        let _ = IterableLinkinfo::get_port;
26947        let _ = IterableLinkinfo::get_tp_mdix;
26948        let _ = IterableLinkinfo::get_tp_mdix_ctrl;
26949        let _ = IterableLinkinfo::get_transceiver;
26950        let _ = IterableLinkmodes::get_autoneg;
26951        let _ = IterableLinkmodes::get_duplex;
26952        let _ = IterableLinkmodes::get_header;
26953        let _ = IterableLinkmodes::get_lanes;
26954        let _ = IterableLinkmodes::get_master_slave_cfg;
26955        let _ = IterableLinkmodes::get_master_slave_state;
26956        let _ = IterableLinkmodes::get_ours;
26957        let _ = IterableLinkmodes::get_peer;
26958        let _ = IterableLinkmodes::get_rate_matching;
26959        let _ = IterableLinkmodes::get_speed;
26960        let _ = IterableLinkstate::get_ext_down_cnt;
26961        let _ = IterableLinkstate::get_ext_state;
26962        let _ = IterableLinkstate::get_ext_substate;
26963        let _ = IterableLinkstate::get_header;
26964        let _ = IterableLinkstate::get_link;
26965        let _ = IterableLinkstate::get_sqi;
26966        let _ = IterableLinkstate::get_sqi_max;
26967        let _ = IterableMm::get_header;
26968        let _ = IterableMm::get_max_verify_time;
26969        let _ = IterableMm::get_pmac_enabled;
26970        let _ = IterableMm::get_rx_min_frag_size;
26971        let _ = IterableMm::get_stats;
26972        let _ = IterableMm::get_tx_active;
26973        let _ = IterableMm::get_tx_enabled;
26974        let _ = IterableMm::get_tx_min_frag_size;
26975        let _ = IterableMm::get_verify_enabled;
26976        let _ = IterableMm::get_verify_time;
26977        let _ = IterableModule::get_header;
26978        let _ = IterableModule::get_power_mode;
26979        let _ = IterableModule::get_power_mode_policy;
26980        let _ = IterableModuleEeprom::get_data;
26981        let _ = IterableModuleEeprom::get_header;
26982        let _ = IterableMse::get_capabilities;
26983        let _ = IterableMse::get_channel_a;
26984        let _ = IterableMse::get_channel_b;
26985        let _ = IterableMse::get_channel_c;
26986        let _ = IterableMse::get_channel_d;
26987        let _ = IterableMse::get_header;
26988        let _ = IterableMse::get_link;
26989        let _ = IterableMse::get_worst_channel;
26990        let _ = IterablePause::get_autoneg;
26991        let _ = IterablePause::get_header;
26992        let _ = IterablePause::get_rx;
26993        let _ = IterablePause::get_stats;
26994        let _ = IterablePause::get_stats_src;
26995        let _ = IterablePause::get_tx;
26996        let _ = IterablePhcVclocks::get_header;
26997        let _ = IterablePhcVclocks::get_num;
26998        let _ = IterablePhy::get_downstream_sfp_name;
26999        let _ = IterablePhy::get_drvname;
27000        let _ = IterablePhy::get_header;
27001        let _ = IterablePhy::get_index;
27002        let _ = IterablePhy::get_name;
27003        let _ = IterablePhy::get_upstream_index;
27004        let _ = IterablePhy::get_upstream_sfp_name;
27005        let _ = IterablePhy::get_upstream_type;
27006        let _ = IterablePlca::get_burst_cnt;
27007        let _ = IterablePlca::get_burst_tmr;
27008        let _ = IterablePlca::get_enabled;
27009        let _ = IterablePlca::get_header;
27010        let _ = IterablePlca::get_node_cnt;
27011        let _ = IterablePlca::get_node_id;
27012        let _ = IterablePlca::get_status;
27013        let _ = IterablePlca::get_to_tmr;
27014        let _ = IterablePlca::get_version;
27015        let _ = IterablePrivflags::get_flags;
27016        let _ = IterablePrivflags::get_header;
27017        let _ = IterablePse::get_c33_pse_actual_pw;
27018        let _ = IterablePse::get_c33_pse_admin_control;
27019        let _ = IterablePse::get_c33_pse_admin_state;
27020        let _ = IterablePse::get_c33_pse_avail_pw_limit;
27021        let _ = IterablePse::get_c33_pse_ext_state;
27022        let _ = IterablePse::get_c33_pse_ext_substate;
27023        let _ = IterablePse::get_c33_pse_pw_class;
27024        let _ = IterablePse::get_c33_pse_pw_d_status;
27025        let _ = IterablePse::get_c33_pse_pw_limit_ranges;
27026        let _ = IterablePse::get_header;
27027        let _ = IterablePse::get_podl_pse_admin_control;
27028        let _ = IterablePse::get_podl_pse_admin_state;
27029        let _ = IterablePse::get_podl_pse_pw_d_status;
27030        let _ = IterablePse::get_pse_prio;
27031        let _ = IterablePse::get_pse_prio_max;
27032        let _ = IterablePse::get_pse_pw_d_id;
27033        let _ = IterableRings::get_cqe_size;
27034        let _ = IterableRings::get_hds_thresh;
27035        let _ = IterableRings::get_hds_thresh_max;
27036        let _ = IterableRings::get_header;
27037        let _ = IterableRings::get_rx;
27038        let _ = IterableRings::get_rx_buf_len;
27039        let _ = IterableRings::get_rx_jumbo;
27040        let _ = IterableRings::get_rx_jumbo_max;
27041        let _ = IterableRings::get_rx_max;
27042        let _ = IterableRings::get_rx_mini;
27043        let _ = IterableRings::get_rx_mini_max;
27044        let _ = IterableRings::get_rx_push;
27045        let _ = IterableRings::get_tcp_data_split;
27046        let _ = IterableRings::get_tx;
27047        let _ = IterableRings::get_tx_max;
27048        let _ = IterableRings::get_tx_push;
27049        let _ = IterableRings::get_tx_push_buf_len;
27050        let _ = IterableRings::get_tx_push_buf_len_max;
27051        let _ = IterableRss::get_context;
27052        let _ = IterableRss::get_flow_hash;
27053        let _ = IterableRss::get_header;
27054        let _ = IterableRss::get_hfunc;
27055        let _ = IterableRss::get_hkey;
27056        let _ = IterableRss::get_indir;
27057        let _ = IterableRss::get_input_xfrm;
27058        let _ = IterableStats::get_groups;
27059        let _ = IterableStats::get_grp;
27060        let _ = IterableStats::get_header;
27061        let _ = IterableStats::get_src;
27062        let _ = IterableStrset::get_header;
27063        let _ = IterableStrset::get_stringsets;
27064        let _ = IterableTsconfig::get_header;
27065        let _ = IterableTsconfig::get_hwtstamp_flags;
27066        let _ = IterableTsconfig::get_hwtstamp_provider;
27067        let _ = IterableTsconfig::get_rx_filters;
27068        let _ = IterableTsconfig::get_tx_types;
27069        let _ = IterableTsinfo::get_header;
27070        let _ = IterableTsinfo::get_hwtstamp_phyindex;
27071        let _ = IterableTsinfo::get_hwtstamp_provider;
27072        let _ = IterableTsinfo::get_hwtstamp_source;
27073        let _ = IterableTsinfo::get_phc_index;
27074        let _ = IterableTsinfo::get_rx_filters;
27075        let _ = IterableTsinfo::get_stats;
27076        let _ = IterableTsinfo::get_timestamping;
27077        let _ = IterableTsinfo::get_tx_types;
27078        let _ = IterableTunnelInfo::get_header;
27079        let _ = IterableTunnelInfo::get_udp_ports;
27080        let _ = IterableWol::get_header;
27081        let _ = IterableWol::get_modes;
27082        let _ = IterableWol::get_sopass;
27083        let _ = PushCableTest::<&mut Vec<u8>>::nested_header;
27084        let _ = PushCableTestTdr::<&mut Vec<u8>>::nested_header;
27085        let _ = PushChannels::<&mut Vec<u8>>::nested_header;
27086        let _ = PushChannels::<&mut Vec<u8>>::push_combined_count;
27087        let _ = PushChannels::<&mut Vec<u8>>::push_combined_max;
27088        let _ = PushChannels::<&mut Vec<u8>>::push_other_count;
27089        let _ = PushChannels::<&mut Vec<u8>>::push_other_max;
27090        let _ = PushChannels::<&mut Vec<u8>>::push_rx_count;
27091        let _ = PushChannels::<&mut Vec<u8>>::push_rx_max;
27092        let _ = PushChannels::<&mut Vec<u8>>::push_tx_count;
27093        let _ = PushChannels::<&mut Vec<u8>>::push_tx_max;
27094        let _ = PushCoalesce::<&mut Vec<u8>>::nested_header;
27095        let _ = PushCoalesce::<&mut Vec<u8>>::nested_rx_profile;
27096        let _ = PushCoalesce::<&mut Vec<u8>>::nested_tx_profile;
27097        let _ = PushCoalesce::<&mut Vec<u8>>::push_pkt_rate_high;
27098        let _ = PushCoalesce::<&mut Vec<u8>>::push_pkt_rate_low;
27099        let _ = PushCoalesce::<&mut Vec<u8>>::push_rate_sample_interval;
27100        let _ = PushCoalesce::<&mut Vec<u8>>::push_rx_cqe_frames;
27101        let _ = PushCoalesce::<&mut Vec<u8>>::push_rx_cqe_nsecs;
27102        let _ = PushCoalesce::<&mut Vec<u8>>::push_rx_max_frames;
27103        let _ = PushCoalesce::<&mut Vec<u8>>::push_rx_max_frames_high;
27104        let _ = PushCoalesce::<&mut Vec<u8>>::push_rx_max_frames_irq;
27105        let _ = PushCoalesce::<&mut Vec<u8>>::push_rx_max_frames_low;
27106        let _ = PushCoalesce::<&mut Vec<u8>>::push_rx_usecs;
27107        let _ = PushCoalesce::<&mut Vec<u8>>::push_rx_usecs_high;
27108        let _ = PushCoalesce::<&mut Vec<u8>>::push_rx_usecs_irq;
27109        let _ = PushCoalesce::<&mut Vec<u8>>::push_rx_usecs_low;
27110        let _ = PushCoalesce::<&mut Vec<u8>>::push_stats_block_usecs;
27111        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_aggr_max_bytes;
27112        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_aggr_max_frames;
27113        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_aggr_time_usecs;
27114        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_max_frames;
27115        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_max_frames_high;
27116        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_max_frames_irq;
27117        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_max_frames_low;
27118        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_usecs;
27119        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_usecs_high;
27120        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_usecs_irq;
27121        let _ = PushCoalesce::<&mut Vec<u8>>::push_tx_usecs_low;
27122        let _ = PushCoalesce::<&mut Vec<u8>>::push_use_adaptive_rx;
27123        let _ = PushCoalesce::<&mut Vec<u8>>::push_use_adaptive_tx;
27124        let _ = PushCoalesce::<&mut Vec<u8>>::push_use_cqe_mode_rx;
27125        let _ = PushCoalesce::<&mut Vec<u8>>::push_use_cqe_mode_tx;
27126        let _ = PushDebug::<&mut Vec<u8>>::nested_header;
27127        let _ = PushDebug::<&mut Vec<u8>>::nested_msgmask;
27128        let _ = PushEee::<&mut Vec<u8>>::nested_header;
27129        let _ = PushEee::<&mut Vec<u8>>::nested_modes_ours;
27130        let _ = PushEee::<&mut Vec<u8>>::nested_modes_peer;
27131        let _ = PushEee::<&mut Vec<u8>>::push_active;
27132        let _ = PushEee::<&mut Vec<u8>>::push_enabled;
27133        let _ = PushEee::<&mut Vec<u8>>::push_tx_lpi_enabled;
27134        let _ = PushEee::<&mut Vec<u8>>::push_tx_lpi_timer;
27135        let _ = PushFeatures::<&mut Vec<u8>>::nested_active;
27136        let _ = PushFeatures::<&mut Vec<u8>>::nested_header;
27137        let _ = PushFeatures::<&mut Vec<u8>>::nested_hw;
27138        let _ = PushFeatures::<&mut Vec<u8>>::nested_nochange;
27139        let _ = PushFeatures::<&mut Vec<u8>>::nested_wanted;
27140        let _ = PushFec::<&mut Vec<u8>>::nested_header;
27141        let _ = PushFec::<&mut Vec<u8>>::nested_modes;
27142        let _ = PushFec::<&mut Vec<u8>>::nested_stats;
27143        let _ = PushFec::<&mut Vec<u8>>::push_active;
27144        let _ = PushFec::<&mut Vec<u8>>::push_auto;
27145        let _ = PushLinkinfo::<&mut Vec<u8>>::nested_header;
27146        let _ = PushLinkinfo::<&mut Vec<u8>>::push_phyaddr;
27147        let _ = PushLinkinfo::<&mut Vec<u8>>::push_port;
27148        let _ = PushLinkinfo::<&mut Vec<u8>>::push_tp_mdix;
27149        let _ = PushLinkinfo::<&mut Vec<u8>>::push_tp_mdix_ctrl;
27150        let _ = PushLinkinfo::<&mut Vec<u8>>::push_transceiver;
27151        let _ = PushLinkmodes::<&mut Vec<u8>>::nested_header;
27152        let _ = PushLinkmodes::<&mut Vec<u8>>::nested_ours;
27153        let _ = PushLinkmodes::<&mut Vec<u8>>::nested_peer;
27154        let _ = PushLinkmodes::<&mut Vec<u8>>::push_autoneg;
27155        let _ = PushLinkmodes::<&mut Vec<u8>>::push_duplex;
27156        let _ = PushLinkmodes::<&mut Vec<u8>>::push_lanes;
27157        let _ = PushLinkmodes::<&mut Vec<u8>>::push_master_slave_cfg;
27158        let _ = PushLinkmodes::<&mut Vec<u8>>::push_master_slave_state;
27159        let _ = PushLinkmodes::<&mut Vec<u8>>::push_rate_matching;
27160        let _ = PushLinkmodes::<&mut Vec<u8>>::push_speed;
27161        let _ = PushLinkstate::<&mut Vec<u8>>::nested_header;
27162        let _ = PushMm::<&mut Vec<u8>>::nested_header;
27163        let _ = PushMm::<&mut Vec<u8>>::push_pmac_enabled;
27164        let _ = PushMm::<&mut Vec<u8>>::push_tx_enabled;
27165        let _ = PushMm::<&mut Vec<u8>>::push_tx_min_frag_size;
27166        let _ = PushMm::<&mut Vec<u8>>::push_verify_enabled;
27167        let _ = PushMm::<&mut Vec<u8>>::push_verify_time;
27168        let _ = PushModule::<&mut Vec<u8>>::nested_header;
27169        let _ = PushModule::<&mut Vec<u8>>::push_power_mode;
27170        let _ = PushModule::<&mut Vec<u8>>::push_power_mode_policy;
27171        let _ = PushModuleEeprom::<&mut Vec<u8>>::nested_header;
27172        let _ = PushModuleEeprom::<&mut Vec<u8>>::push_bank;
27173        let _ = PushModuleEeprom::<&mut Vec<u8>>::push_i2c_address;
27174        let _ = PushModuleEeprom::<&mut Vec<u8>>::push_length;
27175        let _ = PushModuleEeprom::<&mut Vec<u8>>::push_offset;
27176        let _ = PushModuleEeprom::<&mut Vec<u8>>::push_page;
27177        let _ = PushModuleFwFlash::<&mut Vec<u8>>::nested_header;
27178        let _ = PushModuleFwFlash::<&mut Vec<u8>>::push_file_name;
27179        let _ = PushModuleFwFlash::<&mut Vec<u8>>::push_password;
27180        let _ = PushMse::<&mut Vec<u8>>::nested_header;
27181        let _ = PushPause::<&mut Vec<u8>>::nested_header;
27182        let _ = PushPause::<&mut Vec<u8>>::nested_stats;
27183        let _ = PushPause::<&mut Vec<u8>>::push_autoneg;
27184        let _ = PushPause::<&mut Vec<u8>>::push_rx;
27185        let _ = PushPause::<&mut Vec<u8>>::push_stats_src;
27186        let _ = PushPause::<&mut Vec<u8>>::push_tx;
27187        let _ = PushPhcVclocks::<&mut Vec<u8>>::nested_header;
27188        let _ = PushPhy::<&mut Vec<u8>>::nested_header;
27189        let _ = PushPlca::<&mut Vec<u8>>::nested_header;
27190        let _ = PushPlca::<&mut Vec<u8>>::push_burst_cnt;
27191        let _ = PushPlca::<&mut Vec<u8>>::push_burst_tmr;
27192        let _ = PushPlca::<&mut Vec<u8>>::push_enabled;
27193        let _ = PushPlca::<&mut Vec<u8>>::push_node_cnt;
27194        let _ = PushPlca::<&mut Vec<u8>>::push_node_id;
27195        let _ = PushPlca::<&mut Vec<u8>>::push_status;
27196        let _ = PushPlca::<&mut Vec<u8>>::push_to_tmr;
27197        let _ = PushPlca::<&mut Vec<u8>>::push_version;
27198        let _ = PushPrivflags::<&mut Vec<u8>>::nested_flags;
27199        let _ = PushPrivflags::<&mut Vec<u8>>::nested_header;
27200        let _ = PushPse::<&mut Vec<u8>>::nested_header;
27201        let _ = PushPse::<&mut Vec<u8>>::push_c33_pse_admin_control;
27202        let _ = PushPse::<&mut Vec<u8>>::push_c33_pse_avail_pw_limit;
27203        let _ = PushPse::<&mut Vec<u8>>::push_podl_pse_admin_control;
27204        let _ = PushPse::<&mut Vec<u8>>::push_pse_prio;
27205        let _ = PushRings::<&mut Vec<u8>>::nested_header;
27206        let _ = PushRings::<&mut Vec<u8>>::push_cqe_size;
27207        let _ = PushRings::<&mut Vec<u8>>::push_hds_thresh;
27208        let _ = PushRings::<&mut Vec<u8>>::push_hds_thresh_max;
27209        let _ = PushRings::<&mut Vec<u8>>::push_rx;
27210        let _ = PushRings::<&mut Vec<u8>>::push_rx_buf_len;
27211        let _ = PushRings::<&mut Vec<u8>>::push_rx_jumbo;
27212        let _ = PushRings::<&mut Vec<u8>>::push_rx_jumbo_max;
27213        let _ = PushRings::<&mut Vec<u8>>::push_rx_max;
27214        let _ = PushRings::<&mut Vec<u8>>::push_rx_mini;
27215        let _ = PushRings::<&mut Vec<u8>>::push_rx_mini_max;
27216        let _ = PushRings::<&mut Vec<u8>>::push_rx_push;
27217        let _ = PushRings::<&mut Vec<u8>>::push_tcp_data_split;
27218        let _ = PushRings::<&mut Vec<u8>>::push_tx;
27219        let _ = PushRings::<&mut Vec<u8>>::push_tx_max;
27220        let _ = PushRings::<&mut Vec<u8>>::push_tx_push;
27221        let _ = PushRings::<&mut Vec<u8>>::push_tx_push_buf_len;
27222        let _ = PushRings::<&mut Vec<u8>>::push_tx_push_buf_len_max;
27223        let _ = PushRss::<&mut Vec<u8>>::nested_flow_hash;
27224        let _ = PushRss::<&mut Vec<u8>>::nested_header;
27225        let _ = PushRss::<&mut Vec<u8>>::push_context;
27226        let _ = PushRss::<&mut Vec<u8>>::push_hfunc;
27227        let _ = PushRss::<&mut Vec<u8>>::push_hkey;
27228        let _ = PushRss::<&mut Vec<u8>>::push_indir;
27229        let _ = PushRss::<&mut Vec<u8>>::push_input_xfrm;
27230        let _ = PushRss::<&mut Vec<u8>>::push_start_context;
27231        let _ = PushStats::<&mut Vec<u8>>::nested_groups;
27232        let _ = PushStats::<&mut Vec<u8>>::nested_header;
27233        let _ = PushStrset::<&mut Vec<u8>>::nested_header;
27234        let _ = PushStrset::<&mut Vec<u8>>::nested_stringsets;
27235        let _ = PushStrset::<&mut Vec<u8>>::push_counts_only;
27236        let _ = PushTsconfig::<&mut Vec<u8>>::nested_header;
27237        let _ = PushTsconfig::<&mut Vec<u8>>::nested_hwtstamp_flags;
27238        let _ = PushTsconfig::<&mut Vec<u8>>::nested_hwtstamp_provider;
27239        let _ = PushTsconfig::<&mut Vec<u8>>::nested_rx_filters;
27240        let _ = PushTsconfig::<&mut Vec<u8>>::nested_tx_types;
27241        let _ = PushTsinfo::<&mut Vec<u8>>::nested_header;
27242        let _ = PushTsinfo::<&mut Vec<u8>>::nested_hwtstamp_provider;
27243        let _ = PushTunnelInfo::<&mut Vec<u8>>::nested_header;
27244        let _ = PushWol::<&mut Vec<u8>>::nested_header;
27245        let _ = PushWol::<&mut Vec<u8>>::nested_modes;
27246        let _ = PushWol::<&mut Vec<u8>>::push_sopass;
27247    }
27248}