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}