1#![doc = "Partial family for Devlink\\."]
2#![allow(clippy::all)]
3#![allow(unused_imports)]
4#![allow(unused_assignments)]
5#![allow(non_snake_case)]
6#![allow(unused_variables)]
7#![allow(irrefutable_let_patterns)]
8#![allow(unreachable_code)]
9#![allow(unreachable_patterns)]
10use crate::builtin::{BuiltinBitfield32, BuiltinNfgenmsg, Nlmsghdr, PushDummy};
11use crate::{
12 consts,
13 traits::{NetlinkRequest, Protocol},
14 utils::*,
15};
16pub const PROTONAME: &str = "devlink";
17pub const PROTONAME_CSTR: &CStr = c"devlink";
18#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
19#[derive(Debug, Clone, Copy)]
20pub enum SbPoolType {
21 Ingress = 0,
22 Egress = 1,
23}
24impl SbPoolType {
25 pub fn from_value(value: u64) -> Option<Self> {
26 Some(match value {
27 0 => Self::Ingress,
28 1 => Self::Egress,
29 _ => return None,
30 })
31 }
32}
33#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
34#[derive(Debug, Clone, Copy)]
35pub enum PortType {
36 Notset = 0,
37 Auto = 1,
38 Eth = 2,
39 Ib = 3,
40}
41impl PortType {
42 pub fn from_value(value: u64) -> Option<Self> {
43 Some(match value {
44 0 => Self::Notset,
45 1 => Self::Auto,
46 2 => Self::Eth,
47 3 => Self::Ib,
48 _ => return None,
49 })
50 }
51}
52#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
53#[derive(Debug, Clone, Copy)]
54pub enum PortFlavour {
55 Physical = 0,
56 Cpu = 1,
57 Dsa = 2,
58 PciPf = 3,
59 PciVf = 4,
60 Virtual = 5,
61 Unused = 6,
62 PciSf = 7,
63}
64impl PortFlavour {
65 pub fn from_value(value: u64) -> Option<Self> {
66 Some(match value {
67 0 => Self::Physical,
68 1 => Self::Cpu,
69 2 => Self::Dsa,
70 3 => Self::PciPf,
71 4 => Self::PciVf,
72 5 => Self::Virtual,
73 6 => Self::Unused,
74 7 => Self::PciSf,
75 _ => return None,
76 })
77 }
78}
79#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
80#[derive(Debug, Clone, Copy)]
81pub enum PortFnState {
82 Inactive = 0,
83 Active = 1,
84}
85impl PortFnState {
86 pub fn from_value(value: u64) -> Option<Self> {
87 Some(match value {
88 0 => Self::Inactive,
89 1 => Self::Active,
90 _ => return None,
91 })
92 }
93}
94#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
95#[derive(Debug, Clone, Copy)]
96pub enum PortFnOpstate {
97 Detached = 0,
98 Attached = 1,
99}
100impl PortFnOpstate {
101 pub fn from_value(value: u64) -> Option<Self> {
102 Some(match value {
103 0 => Self::Detached,
104 1 => Self::Attached,
105 _ => return None,
106 })
107 }
108}
109#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
110#[derive(Debug, Clone, Copy)]
111pub enum PortFnAttrCap {
112 RoceBit = 0,
113 MigratableBit = 1,
114 IpsecCryptoBit = 2,
115 IpsecPacketBit = 3,
116}
117impl PortFnAttrCap {
118 pub fn from_value(value: u64) -> Option<Self> {
119 Some(match value {
120 0 => Self::RoceBit,
121 1 => Self::MigratableBit,
122 2 => Self::IpsecCryptoBit,
123 3 => Self::IpsecPacketBit,
124 _ => return None,
125 })
126 }
127}
128#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
129#[derive(Debug, Clone, Copy)]
130pub enum RateType {
131 Leaf = 0,
132 Node = 1,
133}
134impl RateType {
135 pub fn from_value(value: u64) -> Option<Self> {
136 Some(match value {
137 0 => Self::Leaf,
138 1 => Self::Node,
139 _ => return None,
140 })
141 }
142}
143#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
144#[derive(Debug, Clone, Copy)]
145pub enum SbThresholdType {
146 Static = 0,
147 Dynamic = 1,
148}
149impl SbThresholdType {
150 pub fn from_value(value: u64) -> Option<Self> {
151 Some(match value {
152 0 => Self::Static,
153 1 => Self::Dynamic,
154 _ => return None,
155 })
156 }
157}
158#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
159#[derive(Debug, Clone, Copy)]
160pub enum EswitchMode {
161 Legacy = 0,
162 Switchdev = 1,
163 SwitchdevInactive = 2,
164}
165impl EswitchMode {
166 pub fn from_value(value: u64) -> Option<Self> {
167 Some(match value {
168 0 => Self::Legacy,
169 1 => Self::Switchdev,
170 2 => Self::SwitchdevInactive,
171 _ => return None,
172 })
173 }
174}
175#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
176#[derive(Debug, Clone, Copy)]
177pub enum EswitchInlineMode {
178 None = 0,
179 Link = 1,
180 Network = 2,
181 Transport = 3,
182}
183impl EswitchInlineMode {
184 pub fn from_value(value: u64) -> Option<Self> {
185 Some(match value {
186 0 => Self::None,
187 1 => Self::Link,
188 2 => Self::Network,
189 3 => Self::Transport,
190 _ => return None,
191 })
192 }
193}
194#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
195#[derive(Debug, Clone, Copy)]
196pub enum EswitchEncapMode {
197 None = 0,
198 Basic = 1,
199}
200impl EswitchEncapMode {
201 pub fn from_value(value: u64) -> Option<Self> {
202 Some(match value {
203 0 => Self::None,
204 1 => Self::Basic,
205 _ => return None,
206 })
207 }
208}
209#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
210#[derive(Debug, Clone, Copy)]
211pub enum DpipeHeaderId {
212 Ethernet = 0,
213 Ipv4 = 1,
214 Ipv6 = 2,
215}
216impl DpipeHeaderId {
217 pub fn from_value(value: u64) -> Option<Self> {
218 Some(match value {
219 0 => Self::Ethernet,
220 1 => Self::Ipv4,
221 2 => Self::Ipv6,
222 _ => return None,
223 })
224 }
225}
226#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
227#[derive(Debug, Clone, Copy)]
228pub enum DpipeMatchType {
229 FieldExact = 0,
230}
231impl DpipeMatchType {
232 pub fn from_value(value: u64) -> Option<Self> {
233 Some(match value {
234 0 => Self::FieldExact,
235 _ => return None,
236 })
237 }
238}
239#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
240#[derive(Debug, Clone, Copy)]
241pub enum DpipeActionType {
242 FieldModify = 0,
243}
244impl DpipeActionType {
245 pub fn from_value(value: u64) -> Option<Self> {
246 Some(match value {
247 0 => Self::FieldModify,
248 _ => return None,
249 })
250 }
251}
252#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
253#[derive(Debug, Clone, Copy)]
254pub enum DpipeFieldMappingType {
255 None = 0,
256 Ifindex = 1,
257}
258impl DpipeFieldMappingType {
259 pub fn from_value(value: u64) -> Option<Self> {
260 Some(match value {
261 0 => Self::None,
262 1 => Self::Ifindex,
263 _ => return None,
264 })
265 }
266}
267#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
268#[derive(Debug, Clone, Copy)]
269pub enum ResourceUnit {
270 Entry = 0,
271}
272impl ResourceUnit {
273 pub fn from_value(value: u64) -> Option<Self> {
274 Some(match value {
275 0 => Self::Entry,
276 _ => return None,
277 })
278 }
279}
280#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
281#[derive(Debug, Clone, Copy)]
282pub enum ReloadAction {
283 DriverReinit = 1,
284 FwActivate = 2,
285}
286impl ReloadAction {
287 pub fn from_value(value: u64) -> Option<Self> {
288 Some(match value {
289 1 => Self::DriverReinit,
290 2 => Self::FwActivate,
291 _ => return None,
292 })
293 }
294}
295#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
296#[derive(Debug, Clone, Copy)]
297pub enum ParamCmode {
298 Runtime = 0,
299 Driverinit = 1,
300 Permanent = 2,
301}
302impl ParamCmode {
303 pub fn from_value(value: u64) -> Option<Self> {
304 Some(match value {
305 0 => Self::Runtime,
306 1 => Self::Driverinit,
307 2 => Self::Permanent,
308 _ => return None,
309 })
310 }
311}
312#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
313#[derive(Debug, Clone, Copy)]
314pub enum FlashOverwrite {
315 SettingsBit = 0,
316 IdentifiersBit = 1,
317}
318impl FlashOverwrite {
319 pub fn from_value(value: u64) -> Option<Self> {
320 Some(match value {
321 0 => Self::SettingsBit,
322 1 => Self::IdentifiersBit,
323 _ => return None,
324 })
325 }
326}
327#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
328#[derive(Debug, Clone, Copy)]
329pub enum TrapAction {
330 Drop = 0,
331 Trap = 1,
332 Mirror = 2,
333}
334impl TrapAction {
335 pub fn from_value(value: u64) -> Option<Self> {
336 Some(match value {
337 0 => Self::Drop,
338 1 => Self::Trap,
339 2 => Self::Mirror,
340 _ => return None,
341 })
342 }
343}
344#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
345#[derive(Debug, Clone, Copy)]
346pub enum TrapType {
347 Drop = 0,
348 Exception = 1,
349 Control = 2,
350}
351impl TrapType {
352 pub fn from_value(value: u64) -> Option<Self> {
353 Some(match value {
354 0 => Self::Drop,
355 1 => Self::Exception,
356 2 => Self::Control,
357 _ => return None,
358 })
359 }
360}
361#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
362#[derive(Debug, Clone, Copy)]
363pub enum VarAttrType {
364 U8 = 1,
365 U16 = 2,
366 U32 = 3,
367 U64 = 4,
368 String = 5,
369 Flag = 6,
370 NulString = 10,
371 Binary = 11,
372}
373impl VarAttrType {
374 pub fn from_value(value: u64) -> Option<Self> {
375 Some(match value {
376 1 => Self::U8,
377 2 => Self::U16,
378 3 => Self::U32,
379 4 => Self::U64,
380 5 => Self::String,
381 6 => Self::Flag,
382 10 => Self::NulString,
383 11 => Self::Binary,
384 _ => return None,
385 })
386 }
387}
388pub const RATE_TC_INDEX_MAX: u64 = 7u64;
389#[derive(Clone)]
390pub enum Devlink<'a> {
391 BusName(&'a CStr),
392 DevName(&'a CStr),
393 PortIndex(u32),
394 #[doc = "Associated type: [`PortType`] (enum)"]
395 PortType(u16),
396 PortDesiredType(u16),
397 PortNetdevIfindex(u32),
398 PortNetdevName(&'a CStr),
399 PortIbdevName(&'a CStr),
400 PortSplitCount(u32),
401 PortSplitGroup(u32),
402 SbIndex(u32),
403 SbSize(u32),
404 SbIngressPoolCount(u16),
405 SbEgressPoolCount(u16),
406 SbIngressTcCount(u16),
407 SbEgressTcCount(u16),
408 SbPoolIndex(u16),
409 #[doc = "Associated type: [`SbPoolType`] (enum)"]
410 SbPoolType(u8),
411 SbPoolSize(u32),
412 #[doc = "Associated type: [`SbThresholdType`] (enum)"]
413 SbPoolThresholdType(u8),
414 SbThreshold(u32),
415 SbTcIndex(u16),
416 SbOccCur(u32),
417 SbOccMax(u32),
418 #[doc = "Associated type: [`EswitchMode`] (enum)"]
419 EswitchMode(u16),
420 #[doc = "Associated type: [`EswitchInlineMode`] (enum)"]
421 EswitchInlineMode(u8),
422 DpipeTables(IterableDlDpipeTables<'a>),
423 #[doc = "Attribute may repeat multiple times (treat it as array)"]
424 DpipeTable(IterableDlDpipeTable<'a>),
425 DpipeTableName(&'a CStr),
426 DpipeTableSize(u64),
427 DpipeTableMatches(IterableDlDpipeTableMatches<'a>),
428 DpipeTableActions(IterableDlDpipeTableActions<'a>),
429 DpipeTableCountersEnabled(u8),
430 DpipeEntries(IterableDlDpipeEntries<'a>),
431 #[doc = "Attribute may repeat multiple times (treat it as array)"]
432 DpipeEntry(IterableDlDpipeEntry<'a>),
433 DpipeEntryIndex(u64),
434 DpipeEntryMatchValues(IterableDlDpipeEntryMatchValues<'a>),
435 DpipeEntryActionValues(IterableDlDpipeEntryActionValues<'a>),
436 DpipeEntryCounter(u64),
437 #[doc = "Attribute may repeat multiple times (treat it as array)"]
438 DpipeMatch(IterableDlDpipeMatch<'a>),
439 #[doc = "Attribute may repeat multiple times (treat it as array)"]
440 DpipeMatchValue(IterableDlDpipeMatchValue<'a>),
441 #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
442 DpipeMatchType(u32),
443 #[doc = "Attribute may repeat multiple times (treat it as array)"]
444 DpipeAction(IterableDlDpipeAction<'a>),
445 #[doc = "Attribute may repeat multiple times (treat it as array)"]
446 DpipeActionValue(IterableDlDpipeActionValue<'a>),
447 #[doc = "Associated type: [`DpipeActionType`] (enum)"]
448 DpipeActionType(u32),
449 DpipeValue(&'a [u8]),
450 DpipeValueMask(&'a [u8]),
451 DpipeValueMapping(u32),
452 DpipeHeaders(IterableDlDpipeHeaders<'a>),
453 #[doc = "Attribute may repeat multiple times (treat it as array)"]
454 DpipeHeader(IterableDlDpipeHeader<'a>),
455 DpipeHeaderName(&'a CStr),
456 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
457 DpipeHeaderId(u32),
458 DpipeHeaderFields(IterableDlDpipeHeaderFields<'a>),
459 DpipeHeaderGlobal(u8),
460 DpipeHeaderIndex(u32),
461 #[doc = "Attribute may repeat multiple times (treat it as array)"]
462 DpipeField(IterableDlDpipeField<'a>),
463 DpipeFieldName(&'a CStr),
464 DpipeFieldId(u32),
465 DpipeFieldBitwidth(u32),
466 #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
467 DpipeFieldMappingType(u32),
468 Pad(&'a [u8]),
469 #[doc = "Associated type: [`EswitchEncapMode`] (enum)"]
470 EswitchEncapMode(u8),
471 ResourceList(IterableDlResourceList<'a>),
472 #[doc = "Attribute may repeat multiple times (treat it as array)"]
473 Resource(IterableDlResource<'a>),
474 ResourceName(&'a CStr),
475 ResourceId(u64),
476 ResourceSize(u64),
477 ResourceSizeNew(u64),
478 ResourceSizeValid(u8),
479 ResourceSizeMin(u64),
480 ResourceSizeMax(u64),
481 ResourceSizeGran(u64),
482 #[doc = "Associated type: [`ResourceUnit`] (enum)"]
483 ResourceUnit(u8),
484 ResourceOcc(u64),
485 DpipeTableResourceId(u64),
486 DpipeTableResourceUnits(u64),
487 #[doc = "Associated type: [`PortFlavour`] (enum)"]
488 PortFlavour(u16),
489 PortNumber(u32),
490 PortSplitSubportNumber(u32),
491 Param(IterableDlParam<'a>),
492 ParamName(&'a CStr),
493 ParamGeneric(()),
494 #[doc = "Associated type: [`VarAttrType`] (enum)"]
495 ParamType(u8),
496 #[doc = "Associated type: [`ParamCmode`] (enum)"]
497 ParamValueCmode(u8),
498 RegionName(&'a CStr),
499 RegionSize(u64),
500 RegionSnapshots(IterableDlRegionSnapshots<'a>),
501 RegionSnapshot(IterableDlRegionSnapshot<'a>),
502 RegionSnapshotId(u32),
503 RegionChunks(IterableDlRegionChunks<'a>),
504 RegionChunk(IterableDlRegionChunk<'a>),
505 RegionChunkData(&'a [u8]),
506 RegionChunkAddr(u64),
507 RegionChunkLen(u64),
508 InfoDriverName(&'a CStr),
509 InfoSerialNumber(&'a CStr),
510 #[doc = "Attribute may repeat multiple times (treat it as array)"]
511 InfoVersionFixed(IterableDlInfoVersion<'a>),
512 #[doc = "Attribute may repeat multiple times (treat it as array)"]
513 InfoVersionRunning(IterableDlInfoVersion<'a>),
514 #[doc = "Attribute may repeat multiple times (treat it as array)"]
515 InfoVersionStored(IterableDlInfoVersion<'a>),
516 InfoVersionName(&'a CStr),
517 InfoVersionValue(&'a CStr),
518 SbPoolCellSize(u32),
519 Fmsg(IterableDlFmsg<'a>),
520 FmsgObjNestStart(()),
521 FmsgPairNestStart(()),
522 FmsgArrNestStart(()),
523 FmsgNestEnd(()),
524 FmsgObjName(&'a CStr),
525 #[doc = "Associated type: [`VarAttrType`] (enum)"]
526 FmsgObjValueType(u8),
527 HealthReporter(IterableDlHealthReporter<'a>),
528 HealthReporterName(&'a CStr),
529 HealthReporterState(u8),
530 HealthReporterErrCount(u64),
531 HealthReporterRecoverCount(u64),
532 HealthReporterDumpTs(u64),
533 HealthReporterGracefulPeriod(u64),
534 HealthReporterAutoRecover(u8),
535 FlashUpdateFileName(&'a CStr),
536 FlashUpdateComponent(&'a CStr),
537 FlashUpdateStatusMsg(&'a CStr),
538 FlashUpdateStatusDone(u64),
539 FlashUpdateStatusTotal(u64),
540 PortPciPfNumber(u16),
541 PortPciVfNumber(u16),
542 Stats(IterableDlAttrStats<'a>),
543 TrapName(&'a CStr),
544 #[doc = "Associated type: [`TrapAction`] (enum)"]
545 TrapAction(u8),
546 #[doc = "Associated type: [`TrapType`] (enum)"]
547 TrapType(u8),
548 TrapGeneric(()),
549 TrapMetadata(IterableDlTrapMetadata<'a>),
550 TrapGroupName(&'a CStr),
551 ReloadFailed(u8),
552 HealthReporterDumpTsNs(u64),
553 NetnsFd(u32),
554 NetnsPid(u32),
555 NetnsId(u32),
556 HealthReporterAutoDump(u8),
557 TrapPolicerId(u32),
558 TrapPolicerRate(u64),
559 TrapPolicerBurst(u64),
560 PortFunction(IterableDlPortFunction<'a>),
561 InfoBoardSerialNumber(&'a CStr),
562 PortLanes(u32),
563 PortSplittable(u8),
564 PortExternal(u8),
565 PortControllerNumber(u32),
566 FlashUpdateStatusTimeout(u64),
567 #[doc = "Associated type: [`FlashOverwrite`] (1 bit per enumeration)"]
568 FlashUpdateOverwriteMask(BuiltinBitfield32),
569 #[doc = "Associated type: [`ReloadAction`] (enum)"]
570 ReloadAction(u8),
571 #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
572 ReloadActionsPerformed(BuiltinBitfield32),
573 #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
574 ReloadLimits(BuiltinBitfield32),
575 DevStats(IterableDlDevStats<'a>),
576 ReloadStats(IterableDlReloadStats<'a>),
577 #[doc = "Attribute may repeat multiple times (treat it as array)"]
578 ReloadStatsEntry(IterableDlReloadStatsEntry<'a>),
579 ReloadStatsLimit(u8),
580 ReloadStatsValue(u32),
581 RemoteReloadStats(IterableDlReloadStats<'a>),
582 #[doc = "Attribute may repeat multiple times (treat it as array)"]
583 ReloadActionInfo(IterableDlReloadActInfo<'a>),
584 #[doc = "Attribute may repeat multiple times (treat it as array)"]
585 ReloadActionStats(IterableDlReloadActStats<'a>),
586 PortPciSfNumber(u32),
587 #[doc = "Associated type: [`RateType`] (enum)"]
588 RateType(u16),
589 RateTxShare(u64),
590 RateTxMax(u64),
591 RateNodeName(&'a CStr),
592 RateParentNodeName(&'a CStr),
593 RegionMaxSnapshots(u32),
594 LinecardIndex(u32),
595 LinecardState(u8),
596 LinecardType(&'a CStr),
597 LinecardSupportedTypes(IterableDlLinecardSupportedTypes<'a>),
598 Selftests(IterableDlSelftestId<'a>),
599 RateTxPriority(u32),
600 RateTxWeight(u32),
601 RegionDirect(()),
602 #[doc = "Attribute may repeat multiple times (treat it as array)"]
603 RateTcBws(IterableDlRateTcBws<'a>),
604 #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
605 HealthReporterBurstPeriod(u64),
606 #[doc = "Request restoring parameter to its default value\\."]
607 ParamResetDefault(()),
608}
609impl<'a> IterableDevlink<'a> {
610 pub fn get_bus_name(&self) -> Result<&'a CStr, ErrorContext> {
611 let mut iter = self.clone();
612 iter.pos = 0;
613 for attr in iter {
614 if let Devlink::BusName(val) = attr? {
615 return Ok(val);
616 }
617 }
618 Err(ErrorContext::new_missing(
619 "Devlink",
620 "BusName",
621 self.orig_loc,
622 self.buf.as_ptr() as usize,
623 ))
624 }
625 pub fn get_dev_name(&self) -> Result<&'a CStr, ErrorContext> {
626 let mut iter = self.clone();
627 iter.pos = 0;
628 for attr in iter {
629 if let Devlink::DevName(val) = attr? {
630 return Ok(val);
631 }
632 }
633 Err(ErrorContext::new_missing(
634 "Devlink",
635 "DevName",
636 self.orig_loc,
637 self.buf.as_ptr() as usize,
638 ))
639 }
640 pub fn get_port_index(&self) -> Result<u32, ErrorContext> {
641 let mut iter = self.clone();
642 iter.pos = 0;
643 for attr in iter {
644 if let Devlink::PortIndex(val) = attr? {
645 return Ok(val);
646 }
647 }
648 Err(ErrorContext::new_missing(
649 "Devlink",
650 "PortIndex",
651 self.orig_loc,
652 self.buf.as_ptr() as usize,
653 ))
654 }
655 #[doc = "Associated type: [`PortType`] (enum)"]
656 pub fn get_port_type(&self) -> Result<u16, ErrorContext> {
657 let mut iter = self.clone();
658 iter.pos = 0;
659 for attr in iter {
660 if let Devlink::PortType(val) = attr? {
661 return Ok(val);
662 }
663 }
664 Err(ErrorContext::new_missing(
665 "Devlink",
666 "PortType",
667 self.orig_loc,
668 self.buf.as_ptr() as usize,
669 ))
670 }
671 pub fn get_port_desired_type(&self) -> Result<u16, ErrorContext> {
672 let mut iter = self.clone();
673 iter.pos = 0;
674 for attr in iter {
675 if let Devlink::PortDesiredType(val) = attr? {
676 return Ok(val);
677 }
678 }
679 Err(ErrorContext::new_missing(
680 "Devlink",
681 "PortDesiredType",
682 self.orig_loc,
683 self.buf.as_ptr() as usize,
684 ))
685 }
686 pub fn get_port_netdev_ifindex(&self) -> Result<u32, ErrorContext> {
687 let mut iter = self.clone();
688 iter.pos = 0;
689 for attr in iter {
690 if let Devlink::PortNetdevIfindex(val) = attr? {
691 return Ok(val);
692 }
693 }
694 Err(ErrorContext::new_missing(
695 "Devlink",
696 "PortNetdevIfindex",
697 self.orig_loc,
698 self.buf.as_ptr() as usize,
699 ))
700 }
701 pub fn get_port_netdev_name(&self) -> Result<&'a CStr, ErrorContext> {
702 let mut iter = self.clone();
703 iter.pos = 0;
704 for attr in iter {
705 if let Devlink::PortNetdevName(val) = attr? {
706 return Ok(val);
707 }
708 }
709 Err(ErrorContext::new_missing(
710 "Devlink",
711 "PortNetdevName",
712 self.orig_loc,
713 self.buf.as_ptr() as usize,
714 ))
715 }
716 pub fn get_port_ibdev_name(&self) -> Result<&'a CStr, ErrorContext> {
717 let mut iter = self.clone();
718 iter.pos = 0;
719 for attr in iter {
720 if let Devlink::PortIbdevName(val) = attr? {
721 return Ok(val);
722 }
723 }
724 Err(ErrorContext::new_missing(
725 "Devlink",
726 "PortIbdevName",
727 self.orig_loc,
728 self.buf.as_ptr() as usize,
729 ))
730 }
731 pub fn get_port_split_count(&self) -> Result<u32, ErrorContext> {
732 let mut iter = self.clone();
733 iter.pos = 0;
734 for attr in iter {
735 if let Devlink::PortSplitCount(val) = attr? {
736 return Ok(val);
737 }
738 }
739 Err(ErrorContext::new_missing(
740 "Devlink",
741 "PortSplitCount",
742 self.orig_loc,
743 self.buf.as_ptr() as usize,
744 ))
745 }
746 pub fn get_port_split_group(&self) -> Result<u32, ErrorContext> {
747 let mut iter = self.clone();
748 iter.pos = 0;
749 for attr in iter {
750 if let Devlink::PortSplitGroup(val) = attr? {
751 return Ok(val);
752 }
753 }
754 Err(ErrorContext::new_missing(
755 "Devlink",
756 "PortSplitGroup",
757 self.orig_loc,
758 self.buf.as_ptr() as usize,
759 ))
760 }
761 pub fn get_sb_index(&self) -> Result<u32, ErrorContext> {
762 let mut iter = self.clone();
763 iter.pos = 0;
764 for attr in iter {
765 if let Devlink::SbIndex(val) = attr? {
766 return Ok(val);
767 }
768 }
769 Err(ErrorContext::new_missing(
770 "Devlink",
771 "SbIndex",
772 self.orig_loc,
773 self.buf.as_ptr() as usize,
774 ))
775 }
776 pub fn get_sb_size(&self) -> Result<u32, ErrorContext> {
777 let mut iter = self.clone();
778 iter.pos = 0;
779 for attr in iter {
780 if let Devlink::SbSize(val) = attr? {
781 return Ok(val);
782 }
783 }
784 Err(ErrorContext::new_missing(
785 "Devlink",
786 "SbSize",
787 self.orig_loc,
788 self.buf.as_ptr() as usize,
789 ))
790 }
791 pub fn get_sb_ingress_pool_count(&self) -> Result<u16, ErrorContext> {
792 let mut iter = self.clone();
793 iter.pos = 0;
794 for attr in iter {
795 if let Devlink::SbIngressPoolCount(val) = attr? {
796 return Ok(val);
797 }
798 }
799 Err(ErrorContext::new_missing(
800 "Devlink",
801 "SbIngressPoolCount",
802 self.orig_loc,
803 self.buf.as_ptr() as usize,
804 ))
805 }
806 pub fn get_sb_egress_pool_count(&self) -> Result<u16, ErrorContext> {
807 let mut iter = self.clone();
808 iter.pos = 0;
809 for attr in iter {
810 if let Devlink::SbEgressPoolCount(val) = attr? {
811 return Ok(val);
812 }
813 }
814 Err(ErrorContext::new_missing(
815 "Devlink",
816 "SbEgressPoolCount",
817 self.orig_loc,
818 self.buf.as_ptr() as usize,
819 ))
820 }
821 pub fn get_sb_ingress_tc_count(&self) -> Result<u16, ErrorContext> {
822 let mut iter = self.clone();
823 iter.pos = 0;
824 for attr in iter {
825 if let Devlink::SbIngressTcCount(val) = attr? {
826 return Ok(val);
827 }
828 }
829 Err(ErrorContext::new_missing(
830 "Devlink",
831 "SbIngressTcCount",
832 self.orig_loc,
833 self.buf.as_ptr() as usize,
834 ))
835 }
836 pub fn get_sb_egress_tc_count(&self) -> Result<u16, ErrorContext> {
837 let mut iter = self.clone();
838 iter.pos = 0;
839 for attr in iter {
840 if let Devlink::SbEgressTcCount(val) = attr? {
841 return Ok(val);
842 }
843 }
844 Err(ErrorContext::new_missing(
845 "Devlink",
846 "SbEgressTcCount",
847 self.orig_loc,
848 self.buf.as_ptr() as usize,
849 ))
850 }
851 pub fn get_sb_pool_index(&self) -> Result<u16, ErrorContext> {
852 let mut iter = self.clone();
853 iter.pos = 0;
854 for attr in iter {
855 if let Devlink::SbPoolIndex(val) = attr? {
856 return Ok(val);
857 }
858 }
859 Err(ErrorContext::new_missing(
860 "Devlink",
861 "SbPoolIndex",
862 self.orig_loc,
863 self.buf.as_ptr() as usize,
864 ))
865 }
866 #[doc = "Associated type: [`SbPoolType`] (enum)"]
867 pub fn get_sb_pool_type(&self) -> Result<u8, ErrorContext> {
868 let mut iter = self.clone();
869 iter.pos = 0;
870 for attr in iter {
871 if let Devlink::SbPoolType(val) = attr? {
872 return Ok(val);
873 }
874 }
875 Err(ErrorContext::new_missing(
876 "Devlink",
877 "SbPoolType",
878 self.orig_loc,
879 self.buf.as_ptr() as usize,
880 ))
881 }
882 pub fn get_sb_pool_size(&self) -> Result<u32, ErrorContext> {
883 let mut iter = self.clone();
884 iter.pos = 0;
885 for attr in iter {
886 if let Devlink::SbPoolSize(val) = attr? {
887 return Ok(val);
888 }
889 }
890 Err(ErrorContext::new_missing(
891 "Devlink",
892 "SbPoolSize",
893 self.orig_loc,
894 self.buf.as_ptr() as usize,
895 ))
896 }
897 #[doc = "Associated type: [`SbThresholdType`] (enum)"]
898 pub fn get_sb_pool_threshold_type(&self) -> Result<u8, ErrorContext> {
899 let mut iter = self.clone();
900 iter.pos = 0;
901 for attr in iter {
902 if let Devlink::SbPoolThresholdType(val) = attr? {
903 return Ok(val);
904 }
905 }
906 Err(ErrorContext::new_missing(
907 "Devlink",
908 "SbPoolThresholdType",
909 self.orig_loc,
910 self.buf.as_ptr() as usize,
911 ))
912 }
913 pub fn get_sb_threshold(&self) -> Result<u32, ErrorContext> {
914 let mut iter = self.clone();
915 iter.pos = 0;
916 for attr in iter {
917 if let Devlink::SbThreshold(val) = attr? {
918 return Ok(val);
919 }
920 }
921 Err(ErrorContext::new_missing(
922 "Devlink",
923 "SbThreshold",
924 self.orig_loc,
925 self.buf.as_ptr() as usize,
926 ))
927 }
928 pub fn get_sb_tc_index(&self) -> Result<u16, ErrorContext> {
929 let mut iter = self.clone();
930 iter.pos = 0;
931 for attr in iter {
932 if let Devlink::SbTcIndex(val) = attr? {
933 return Ok(val);
934 }
935 }
936 Err(ErrorContext::new_missing(
937 "Devlink",
938 "SbTcIndex",
939 self.orig_loc,
940 self.buf.as_ptr() as usize,
941 ))
942 }
943 pub fn get_sb_occ_cur(&self) -> Result<u32, ErrorContext> {
944 let mut iter = self.clone();
945 iter.pos = 0;
946 for attr in iter {
947 if let Devlink::SbOccCur(val) = attr? {
948 return Ok(val);
949 }
950 }
951 Err(ErrorContext::new_missing(
952 "Devlink",
953 "SbOccCur",
954 self.orig_loc,
955 self.buf.as_ptr() as usize,
956 ))
957 }
958 pub fn get_sb_occ_max(&self) -> Result<u32, ErrorContext> {
959 let mut iter = self.clone();
960 iter.pos = 0;
961 for attr in iter {
962 if let Devlink::SbOccMax(val) = attr? {
963 return Ok(val);
964 }
965 }
966 Err(ErrorContext::new_missing(
967 "Devlink",
968 "SbOccMax",
969 self.orig_loc,
970 self.buf.as_ptr() as usize,
971 ))
972 }
973 #[doc = "Associated type: [`EswitchMode`] (enum)"]
974 pub fn get_eswitch_mode(&self) -> Result<u16, ErrorContext> {
975 let mut iter = self.clone();
976 iter.pos = 0;
977 for attr in iter {
978 if let Devlink::EswitchMode(val) = attr? {
979 return Ok(val);
980 }
981 }
982 Err(ErrorContext::new_missing(
983 "Devlink",
984 "EswitchMode",
985 self.orig_loc,
986 self.buf.as_ptr() as usize,
987 ))
988 }
989 #[doc = "Associated type: [`EswitchInlineMode`] (enum)"]
990 pub fn get_eswitch_inline_mode(&self) -> Result<u8, ErrorContext> {
991 let mut iter = self.clone();
992 iter.pos = 0;
993 for attr in iter {
994 if let Devlink::EswitchInlineMode(val) = attr? {
995 return Ok(val);
996 }
997 }
998 Err(ErrorContext::new_missing(
999 "Devlink",
1000 "EswitchInlineMode",
1001 self.orig_loc,
1002 self.buf.as_ptr() as usize,
1003 ))
1004 }
1005 pub fn get_dpipe_tables(&self) -> Result<IterableDlDpipeTables<'a>, ErrorContext> {
1006 let mut iter = self.clone();
1007 iter.pos = 0;
1008 for attr in iter {
1009 if let Devlink::DpipeTables(val) = attr? {
1010 return Ok(val);
1011 }
1012 }
1013 Err(ErrorContext::new_missing(
1014 "Devlink",
1015 "DpipeTables",
1016 self.orig_loc,
1017 self.buf.as_ptr() as usize,
1018 ))
1019 }
1020 #[doc = "Attribute may repeat multiple times (treat it as array)"]
1021 pub fn get_dpipe_table(
1022 &self,
1023 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeTable<'a>> {
1024 MultiAttrIterable::new(self.clone(), |variant| {
1025 if let Devlink::DpipeTable(val) = variant {
1026 Some(val)
1027 } else {
1028 None
1029 }
1030 })
1031 }
1032 pub fn get_dpipe_table_name(&self) -> Result<&'a CStr, ErrorContext> {
1033 let mut iter = self.clone();
1034 iter.pos = 0;
1035 for attr in iter {
1036 if let Devlink::DpipeTableName(val) = attr? {
1037 return Ok(val);
1038 }
1039 }
1040 Err(ErrorContext::new_missing(
1041 "Devlink",
1042 "DpipeTableName",
1043 self.orig_loc,
1044 self.buf.as_ptr() as usize,
1045 ))
1046 }
1047 pub fn get_dpipe_table_size(&self) -> Result<u64, ErrorContext> {
1048 let mut iter = self.clone();
1049 iter.pos = 0;
1050 for attr in iter {
1051 if let Devlink::DpipeTableSize(val) = attr? {
1052 return Ok(val);
1053 }
1054 }
1055 Err(ErrorContext::new_missing(
1056 "Devlink",
1057 "DpipeTableSize",
1058 self.orig_loc,
1059 self.buf.as_ptr() as usize,
1060 ))
1061 }
1062 pub fn get_dpipe_table_matches(&self) -> Result<IterableDlDpipeTableMatches<'a>, ErrorContext> {
1063 let mut iter = self.clone();
1064 iter.pos = 0;
1065 for attr in iter {
1066 if let Devlink::DpipeTableMatches(val) = attr? {
1067 return Ok(val);
1068 }
1069 }
1070 Err(ErrorContext::new_missing(
1071 "Devlink",
1072 "DpipeTableMatches",
1073 self.orig_loc,
1074 self.buf.as_ptr() as usize,
1075 ))
1076 }
1077 pub fn get_dpipe_table_actions(&self) -> Result<IterableDlDpipeTableActions<'a>, ErrorContext> {
1078 let mut iter = self.clone();
1079 iter.pos = 0;
1080 for attr in iter {
1081 if let Devlink::DpipeTableActions(val) = attr? {
1082 return Ok(val);
1083 }
1084 }
1085 Err(ErrorContext::new_missing(
1086 "Devlink",
1087 "DpipeTableActions",
1088 self.orig_loc,
1089 self.buf.as_ptr() as usize,
1090 ))
1091 }
1092 pub fn get_dpipe_table_counters_enabled(&self) -> Result<u8, ErrorContext> {
1093 let mut iter = self.clone();
1094 iter.pos = 0;
1095 for attr in iter {
1096 if let Devlink::DpipeTableCountersEnabled(val) = attr? {
1097 return Ok(val);
1098 }
1099 }
1100 Err(ErrorContext::new_missing(
1101 "Devlink",
1102 "DpipeTableCountersEnabled",
1103 self.orig_loc,
1104 self.buf.as_ptr() as usize,
1105 ))
1106 }
1107 pub fn get_dpipe_entries(&self) -> Result<IterableDlDpipeEntries<'a>, ErrorContext> {
1108 let mut iter = self.clone();
1109 iter.pos = 0;
1110 for attr in iter {
1111 if let Devlink::DpipeEntries(val) = attr? {
1112 return Ok(val);
1113 }
1114 }
1115 Err(ErrorContext::new_missing(
1116 "Devlink",
1117 "DpipeEntries",
1118 self.orig_loc,
1119 self.buf.as_ptr() as usize,
1120 ))
1121 }
1122 #[doc = "Attribute may repeat multiple times (treat it as array)"]
1123 pub fn get_dpipe_entry(
1124 &self,
1125 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeEntry<'a>> {
1126 MultiAttrIterable::new(self.clone(), |variant| {
1127 if let Devlink::DpipeEntry(val) = variant {
1128 Some(val)
1129 } else {
1130 None
1131 }
1132 })
1133 }
1134 pub fn get_dpipe_entry_index(&self) -> Result<u64, ErrorContext> {
1135 let mut iter = self.clone();
1136 iter.pos = 0;
1137 for attr in iter {
1138 if let Devlink::DpipeEntryIndex(val) = attr? {
1139 return Ok(val);
1140 }
1141 }
1142 Err(ErrorContext::new_missing(
1143 "Devlink",
1144 "DpipeEntryIndex",
1145 self.orig_loc,
1146 self.buf.as_ptr() as usize,
1147 ))
1148 }
1149 pub fn get_dpipe_entry_match_values(
1150 &self,
1151 ) -> Result<IterableDlDpipeEntryMatchValues<'a>, ErrorContext> {
1152 let mut iter = self.clone();
1153 iter.pos = 0;
1154 for attr in iter {
1155 if let Devlink::DpipeEntryMatchValues(val) = attr? {
1156 return Ok(val);
1157 }
1158 }
1159 Err(ErrorContext::new_missing(
1160 "Devlink",
1161 "DpipeEntryMatchValues",
1162 self.orig_loc,
1163 self.buf.as_ptr() as usize,
1164 ))
1165 }
1166 pub fn get_dpipe_entry_action_values(
1167 &self,
1168 ) -> Result<IterableDlDpipeEntryActionValues<'a>, ErrorContext> {
1169 let mut iter = self.clone();
1170 iter.pos = 0;
1171 for attr in iter {
1172 if let Devlink::DpipeEntryActionValues(val) = attr? {
1173 return Ok(val);
1174 }
1175 }
1176 Err(ErrorContext::new_missing(
1177 "Devlink",
1178 "DpipeEntryActionValues",
1179 self.orig_loc,
1180 self.buf.as_ptr() as usize,
1181 ))
1182 }
1183 pub fn get_dpipe_entry_counter(&self) -> Result<u64, ErrorContext> {
1184 let mut iter = self.clone();
1185 iter.pos = 0;
1186 for attr in iter {
1187 if let Devlink::DpipeEntryCounter(val) = attr? {
1188 return Ok(val);
1189 }
1190 }
1191 Err(ErrorContext::new_missing(
1192 "Devlink",
1193 "DpipeEntryCounter",
1194 self.orig_loc,
1195 self.buf.as_ptr() as usize,
1196 ))
1197 }
1198 #[doc = "Attribute may repeat multiple times (treat it as array)"]
1199 pub fn get_dpipe_match(
1200 &self,
1201 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeMatch<'a>> {
1202 MultiAttrIterable::new(self.clone(), |variant| {
1203 if let Devlink::DpipeMatch(val) = variant {
1204 Some(val)
1205 } else {
1206 None
1207 }
1208 })
1209 }
1210 #[doc = "Attribute may repeat multiple times (treat it as array)"]
1211 pub fn get_dpipe_match_value(
1212 &self,
1213 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeMatchValue<'a>> {
1214 MultiAttrIterable::new(self.clone(), |variant| {
1215 if let Devlink::DpipeMatchValue(val) = variant {
1216 Some(val)
1217 } else {
1218 None
1219 }
1220 })
1221 }
1222 #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
1223 pub fn get_dpipe_match_type(&self) -> Result<u32, ErrorContext> {
1224 let mut iter = self.clone();
1225 iter.pos = 0;
1226 for attr in iter {
1227 if let Devlink::DpipeMatchType(val) = attr? {
1228 return Ok(val);
1229 }
1230 }
1231 Err(ErrorContext::new_missing(
1232 "Devlink",
1233 "DpipeMatchType",
1234 self.orig_loc,
1235 self.buf.as_ptr() as usize,
1236 ))
1237 }
1238 #[doc = "Attribute may repeat multiple times (treat it as array)"]
1239 pub fn get_dpipe_action(
1240 &self,
1241 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeAction<'a>> {
1242 MultiAttrIterable::new(self.clone(), |variant| {
1243 if let Devlink::DpipeAction(val) = variant {
1244 Some(val)
1245 } else {
1246 None
1247 }
1248 })
1249 }
1250 #[doc = "Attribute may repeat multiple times (treat it as array)"]
1251 pub fn get_dpipe_action_value(
1252 &self,
1253 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeActionValue<'a>> {
1254 MultiAttrIterable::new(self.clone(), |variant| {
1255 if let Devlink::DpipeActionValue(val) = variant {
1256 Some(val)
1257 } else {
1258 None
1259 }
1260 })
1261 }
1262 #[doc = "Associated type: [`DpipeActionType`] (enum)"]
1263 pub fn get_dpipe_action_type(&self) -> Result<u32, ErrorContext> {
1264 let mut iter = self.clone();
1265 iter.pos = 0;
1266 for attr in iter {
1267 if let Devlink::DpipeActionType(val) = attr? {
1268 return Ok(val);
1269 }
1270 }
1271 Err(ErrorContext::new_missing(
1272 "Devlink",
1273 "DpipeActionType",
1274 self.orig_loc,
1275 self.buf.as_ptr() as usize,
1276 ))
1277 }
1278 pub fn get_dpipe_value(&self) -> Result<&'a [u8], ErrorContext> {
1279 let mut iter = self.clone();
1280 iter.pos = 0;
1281 for attr in iter {
1282 if let Devlink::DpipeValue(val) = attr? {
1283 return Ok(val);
1284 }
1285 }
1286 Err(ErrorContext::new_missing(
1287 "Devlink",
1288 "DpipeValue",
1289 self.orig_loc,
1290 self.buf.as_ptr() as usize,
1291 ))
1292 }
1293 pub fn get_dpipe_value_mask(&self) -> Result<&'a [u8], ErrorContext> {
1294 let mut iter = self.clone();
1295 iter.pos = 0;
1296 for attr in iter {
1297 if let Devlink::DpipeValueMask(val) = attr? {
1298 return Ok(val);
1299 }
1300 }
1301 Err(ErrorContext::new_missing(
1302 "Devlink",
1303 "DpipeValueMask",
1304 self.orig_loc,
1305 self.buf.as_ptr() as usize,
1306 ))
1307 }
1308 pub fn get_dpipe_value_mapping(&self) -> Result<u32, ErrorContext> {
1309 let mut iter = self.clone();
1310 iter.pos = 0;
1311 for attr in iter {
1312 if let Devlink::DpipeValueMapping(val) = attr? {
1313 return Ok(val);
1314 }
1315 }
1316 Err(ErrorContext::new_missing(
1317 "Devlink",
1318 "DpipeValueMapping",
1319 self.orig_loc,
1320 self.buf.as_ptr() as usize,
1321 ))
1322 }
1323 pub fn get_dpipe_headers(&self) -> Result<IterableDlDpipeHeaders<'a>, ErrorContext> {
1324 let mut iter = self.clone();
1325 iter.pos = 0;
1326 for attr in iter {
1327 if let Devlink::DpipeHeaders(val) = attr? {
1328 return Ok(val);
1329 }
1330 }
1331 Err(ErrorContext::new_missing(
1332 "Devlink",
1333 "DpipeHeaders",
1334 self.orig_loc,
1335 self.buf.as_ptr() as usize,
1336 ))
1337 }
1338 #[doc = "Attribute may repeat multiple times (treat it as array)"]
1339 pub fn get_dpipe_header(
1340 &self,
1341 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeHeader<'a>> {
1342 MultiAttrIterable::new(self.clone(), |variant| {
1343 if let Devlink::DpipeHeader(val) = variant {
1344 Some(val)
1345 } else {
1346 None
1347 }
1348 })
1349 }
1350 pub fn get_dpipe_header_name(&self) -> Result<&'a CStr, ErrorContext> {
1351 let mut iter = self.clone();
1352 iter.pos = 0;
1353 for attr in iter {
1354 if let Devlink::DpipeHeaderName(val) = attr? {
1355 return Ok(val);
1356 }
1357 }
1358 Err(ErrorContext::new_missing(
1359 "Devlink",
1360 "DpipeHeaderName",
1361 self.orig_loc,
1362 self.buf.as_ptr() as usize,
1363 ))
1364 }
1365 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
1366 pub fn get_dpipe_header_id(&self) -> Result<u32, ErrorContext> {
1367 let mut iter = self.clone();
1368 iter.pos = 0;
1369 for attr in iter {
1370 if let Devlink::DpipeHeaderId(val) = attr? {
1371 return Ok(val);
1372 }
1373 }
1374 Err(ErrorContext::new_missing(
1375 "Devlink",
1376 "DpipeHeaderId",
1377 self.orig_loc,
1378 self.buf.as_ptr() as usize,
1379 ))
1380 }
1381 pub fn get_dpipe_header_fields(&self) -> Result<IterableDlDpipeHeaderFields<'a>, ErrorContext> {
1382 let mut iter = self.clone();
1383 iter.pos = 0;
1384 for attr in iter {
1385 if let Devlink::DpipeHeaderFields(val) = attr? {
1386 return Ok(val);
1387 }
1388 }
1389 Err(ErrorContext::new_missing(
1390 "Devlink",
1391 "DpipeHeaderFields",
1392 self.orig_loc,
1393 self.buf.as_ptr() as usize,
1394 ))
1395 }
1396 pub fn get_dpipe_header_global(&self) -> Result<u8, ErrorContext> {
1397 let mut iter = self.clone();
1398 iter.pos = 0;
1399 for attr in iter {
1400 if let Devlink::DpipeHeaderGlobal(val) = attr? {
1401 return Ok(val);
1402 }
1403 }
1404 Err(ErrorContext::new_missing(
1405 "Devlink",
1406 "DpipeHeaderGlobal",
1407 self.orig_loc,
1408 self.buf.as_ptr() as usize,
1409 ))
1410 }
1411 pub fn get_dpipe_header_index(&self) -> Result<u32, ErrorContext> {
1412 let mut iter = self.clone();
1413 iter.pos = 0;
1414 for attr in iter {
1415 if let Devlink::DpipeHeaderIndex(val) = attr? {
1416 return Ok(val);
1417 }
1418 }
1419 Err(ErrorContext::new_missing(
1420 "Devlink",
1421 "DpipeHeaderIndex",
1422 self.orig_loc,
1423 self.buf.as_ptr() as usize,
1424 ))
1425 }
1426 #[doc = "Attribute may repeat multiple times (treat it as array)"]
1427 pub fn get_dpipe_field(
1428 &self,
1429 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlDpipeField<'a>> {
1430 MultiAttrIterable::new(self.clone(), |variant| {
1431 if let Devlink::DpipeField(val) = variant {
1432 Some(val)
1433 } else {
1434 None
1435 }
1436 })
1437 }
1438 pub fn get_dpipe_field_name(&self) -> Result<&'a CStr, ErrorContext> {
1439 let mut iter = self.clone();
1440 iter.pos = 0;
1441 for attr in iter {
1442 if let Devlink::DpipeFieldName(val) = attr? {
1443 return Ok(val);
1444 }
1445 }
1446 Err(ErrorContext::new_missing(
1447 "Devlink",
1448 "DpipeFieldName",
1449 self.orig_loc,
1450 self.buf.as_ptr() as usize,
1451 ))
1452 }
1453 pub fn get_dpipe_field_id(&self) -> Result<u32, ErrorContext> {
1454 let mut iter = self.clone();
1455 iter.pos = 0;
1456 for attr in iter {
1457 if let Devlink::DpipeFieldId(val) = attr? {
1458 return Ok(val);
1459 }
1460 }
1461 Err(ErrorContext::new_missing(
1462 "Devlink",
1463 "DpipeFieldId",
1464 self.orig_loc,
1465 self.buf.as_ptr() as usize,
1466 ))
1467 }
1468 pub fn get_dpipe_field_bitwidth(&self) -> Result<u32, ErrorContext> {
1469 let mut iter = self.clone();
1470 iter.pos = 0;
1471 for attr in iter {
1472 if let Devlink::DpipeFieldBitwidth(val) = attr? {
1473 return Ok(val);
1474 }
1475 }
1476 Err(ErrorContext::new_missing(
1477 "Devlink",
1478 "DpipeFieldBitwidth",
1479 self.orig_loc,
1480 self.buf.as_ptr() as usize,
1481 ))
1482 }
1483 #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
1484 pub fn get_dpipe_field_mapping_type(&self) -> Result<u32, ErrorContext> {
1485 let mut iter = self.clone();
1486 iter.pos = 0;
1487 for attr in iter {
1488 if let Devlink::DpipeFieldMappingType(val) = attr? {
1489 return Ok(val);
1490 }
1491 }
1492 Err(ErrorContext::new_missing(
1493 "Devlink",
1494 "DpipeFieldMappingType",
1495 self.orig_loc,
1496 self.buf.as_ptr() as usize,
1497 ))
1498 }
1499 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
1500 let mut iter = self.clone();
1501 iter.pos = 0;
1502 for attr in iter {
1503 if let Devlink::Pad(val) = attr? {
1504 return Ok(val);
1505 }
1506 }
1507 Err(ErrorContext::new_missing(
1508 "Devlink",
1509 "Pad",
1510 self.orig_loc,
1511 self.buf.as_ptr() as usize,
1512 ))
1513 }
1514 #[doc = "Associated type: [`EswitchEncapMode`] (enum)"]
1515 pub fn get_eswitch_encap_mode(&self) -> Result<u8, ErrorContext> {
1516 let mut iter = self.clone();
1517 iter.pos = 0;
1518 for attr in iter {
1519 if let Devlink::EswitchEncapMode(val) = attr? {
1520 return Ok(val);
1521 }
1522 }
1523 Err(ErrorContext::new_missing(
1524 "Devlink",
1525 "EswitchEncapMode",
1526 self.orig_loc,
1527 self.buf.as_ptr() as usize,
1528 ))
1529 }
1530 pub fn get_resource_list(&self) -> Result<IterableDlResourceList<'a>, ErrorContext> {
1531 let mut iter = self.clone();
1532 iter.pos = 0;
1533 for attr in iter {
1534 if let Devlink::ResourceList(val) = attr? {
1535 return Ok(val);
1536 }
1537 }
1538 Err(ErrorContext::new_missing(
1539 "Devlink",
1540 "ResourceList",
1541 self.orig_loc,
1542 self.buf.as_ptr() as usize,
1543 ))
1544 }
1545 #[doc = "Attribute may repeat multiple times (treat it as array)"]
1546 pub fn get_resource(&self) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlResource<'a>> {
1547 MultiAttrIterable::new(self.clone(), |variant| {
1548 if let Devlink::Resource(val) = variant {
1549 Some(val)
1550 } else {
1551 None
1552 }
1553 })
1554 }
1555 pub fn get_resource_name(&self) -> Result<&'a CStr, ErrorContext> {
1556 let mut iter = self.clone();
1557 iter.pos = 0;
1558 for attr in iter {
1559 if let Devlink::ResourceName(val) = attr? {
1560 return Ok(val);
1561 }
1562 }
1563 Err(ErrorContext::new_missing(
1564 "Devlink",
1565 "ResourceName",
1566 self.orig_loc,
1567 self.buf.as_ptr() as usize,
1568 ))
1569 }
1570 pub fn get_resource_id(&self) -> Result<u64, ErrorContext> {
1571 let mut iter = self.clone();
1572 iter.pos = 0;
1573 for attr in iter {
1574 if let Devlink::ResourceId(val) = attr? {
1575 return Ok(val);
1576 }
1577 }
1578 Err(ErrorContext::new_missing(
1579 "Devlink",
1580 "ResourceId",
1581 self.orig_loc,
1582 self.buf.as_ptr() as usize,
1583 ))
1584 }
1585 pub fn get_resource_size(&self) -> Result<u64, ErrorContext> {
1586 let mut iter = self.clone();
1587 iter.pos = 0;
1588 for attr in iter {
1589 if let Devlink::ResourceSize(val) = attr? {
1590 return Ok(val);
1591 }
1592 }
1593 Err(ErrorContext::new_missing(
1594 "Devlink",
1595 "ResourceSize",
1596 self.orig_loc,
1597 self.buf.as_ptr() as usize,
1598 ))
1599 }
1600 pub fn get_resource_size_new(&self) -> Result<u64, ErrorContext> {
1601 let mut iter = self.clone();
1602 iter.pos = 0;
1603 for attr in iter {
1604 if let Devlink::ResourceSizeNew(val) = attr? {
1605 return Ok(val);
1606 }
1607 }
1608 Err(ErrorContext::new_missing(
1609 "Devlink",
1610 "ResourceSizeNew",
1611 self.orig_loc,
1612 self.buf.as_ptr() as usize,
1613 ))
1614 }
1615 pub fn get_resource_size_valid(&self) -> Result<u8, ErrorContext> {
1616 let mut iter = self.clone();
1617 iter.pos = 0;
1618 for attr in iter {
1619 if let Devlink::ResourceSizeValid(val) = attr? {
1620 return Ok(val);
1621 }
1622 }
1623 Err(ErrorContext::new_missing(
1624 "Devlink",
1625 "ResourceSizeValid",
1626 self.orig_loc,
1627 self.buf.as_ptr() as usize,
1628 ))
1629 }
1630 pub fn get_resource_size_min(&self) -> Result<u64, ErrorContext> {
1631 let mut iter = self.clone();
1632 iter.pos = 0;
1633 for attr in iter {
1634 if let Devlink::ResourceSizeMin(val) = attr? {
1635 return Ok(val);
1636 }
1637 }
1638 Err(ErrorContext::new_missing(
1639 "Devlink",
1640 "ResourceSizeMin",
1641 self.orig_loc,
1642 self.buf.as_ptr() as usize,
1643 ))
1644 }
1645 pub fn get_resource_size_max(&self) -> Result<u64, ErrorContext> {
1646 let mut iter = self.clone();
1647 iter.pos = 0;
1648 for attr in iter {
1649 if let Devlink::ResourceSizeMax(val) = attr? {
1650 return Ok(val);
1651 }
1652 }
1653 Err(ErrorContext::new_missing(
1654 "Devlink",
1655 "ResourceSizeMax",
1656 self.orig_loc,
1657 self.buf.as_ptr() as usize,
1658 ))
1659 }
1660 pub fn get_resource_size_gran(&self) -> Result<u64, ErrorContext> {
1661 let mut iter = self.clone();
1662 iter.pos = 0;
1663 for attr in iter {
1664 if let Devlink::ResourceSizeGran(val) = attr? {
1665 return Ok(val);
1666 }
1667 }
1668 Err(ErrorContext::new_missing(
1669 "Devlink",
1670 "ResourceSizeGran",
1671 self.orig_loc,
1672 self.buf.as_ptr() as usize,
1673 ))
1674 }
1675 #[doc = "Associated type: [`ResourceUnit`] (enum)"]
1676 pub fn get_resource_unit(&self) -> Result<u8, ErrorContext> {
1677 let mut iter = self.clone();
1678 iter.pos = 0;
1679 for attr in iter {
1680 if let Devlink::ResourceUnit(val) = attr? {
1681 return Ok(val);
1682 }
1683 }
1684 Err(ErrorContext::new_missing(
1685 "Devlink",
1686 "ResourceUnit",
1687 self.orig_loc,
1688 self.buf.as_ptr() as usize,
1689 ))
1690 }
1691 pub fn get_resource_occ(&self) -> Result<u64, ErrorContext> {
1692 let mut iter = self.clone();
1693 iter.pos = 0;
1694 for attr in iter {
1695 if let Devlink::ResourceOcc(val) = attr? {
1696 return Ok(val);
1697 }
1698 }
1699 Err(ErrorContext::new_missing(
1700 "Devlink",
1701 "ResourceOcc",
1702 self.orig_loc,
1703 self.buf.as_ptr() as usize,
1704 ))
1705 }
1706 pub fn get_dpipe_table_resource_id(&self) -> Result<u64, ErrorContext> {
1707 let mut iter = self.clone();
1708 iter.pos = 0;
1709 for attr in iter {
1710 if let Devlink::DpipeTableResourceId(val) = attr? {
1711 return Ok(val);
1712 }
1713 }
1714 Err(ErrorContext::new_missing(
1715 "Devlink",
1716 "DpipeTableResourceId",
1717 self.orig_loc,
1718 self.buf.as_ptr() as usize,
1719 ))
1720 }
1721 pub fn get_dpipe_table_resource_units(&self) -> Result<u64, ErrorContext> {
1722 let mut iter = self.clone();
1723 iter.pos = 0;
1724 for attr in iter {
1725 if let Devlink::DpipeTableResourceUnits(val) = attr? {
1726 return Ok(val);
1727 }
1728 }
1729 Err(ErrorContext::new_missing(
1730 "Devlink",
1731 "DpipeTableResourceUnits",
1732 self.orig_loc,
1733 self.buf.as_ptr() as usize,
1734 ))
1735 }
1736 #[doc = "Associated type: [`PortFlavour`] (enum)"]
1737 pub fn get_port_flavour(&self) -> Result<u16, ErrorContext> {
1738 let mut iter = self.clone();
1739 iter.pos = 0;
1740 for attr in iter {
1741 if let Devlink::PortFlavour(val) = attr? {
1742 return Ok(val);
1743 }
1744 }
1745 Err(ErrorContext::new_missing(
1746 "Devlink",
1747 "PortFlavour",
1748 self.orig_loc,
1749 self.buf.as_ptr() as usize,
1750 ))
1751 }
1752 pub fn get_port_number(&self) -> Result<u32, ErrorContext> {
1753 let mut iter = self.clone();
1754 iter.pos = 0;
1755 for attr in iter {
1756 if let Devlink::PortNumber(val) = attr? {
1757 return Ok(val);
1758 }
1759 }
1760 Err(ErrorContext::new_missing(
1761 "Devlink",
1762 "PortNumber",
1763 self.orig_loc,
1764 self.buf.as_ptr() as usize,
1765 ))
1766 }
1767 pub fn get_port_split_subport_number(&self) -> Result<u32, ErrorContext> {
1768 let mut iter = self.clone();
1769 iter.pos = 0;
1770 for attr in iter {
1771 if let Devlink::PortSplitSubportNumber(val) = attr? {
1772 return Ok(val);
1773 }
1774 }
1775 Err(ErrorContext::new_missing(
1776 "Devlink",
1777 "PortSplitSubportNumber",
1778 self.orig_loc,
1779 self.buf.as_ptr() as usize,
1780 ))
1781 }
1782 pub fn get_param(&self) -> Result<IterableDlParam<'a>, ErrorContext> {
1783 let mut iter = self.clone();
1784 iter.pos = 0;
1785 for attr in iter {
1786 if let Devlink::Param(val) = attr? {
1787 return Ok(val);
1788 }
1789 }
1790 Err(ErrorContext::new_missing(
1791 "Devlink",
1792 "Param",
1793 self.orig_loc,
1794 self.buf.as_ptr() as usize,
1795 ))
1796 }
1797 pub fn get_param_name(&self) -> Result<&'a CStr, ErrorContext> {
1798 let mut iter = self.clone();
1799 iter.pos = 0;
1800 for attr in iter {
1801 if let Devlink::ParamName(val) = attr? {
1802 return Ok(val);
1803 }
1804 }
1805 Err(ErrorContext::new_missing(
1806 "Devlink",
1807 "ParamName",
1808 self.orig_loc,
1809 self.buf.as_ptr() as usize,
1810 ))
1811 }
1812 pub fn get_param_generic(&self) -> Result<(), ErrorContext> {
1813 let mut iter = self.clone();
1814 iter.pos = 0;
1815 for attr in iter {
1816 if let Devlink::ParamGeneric(val) = attr? {
1817 return Ok(val);
1818 }
1819 }
1820 Err(ErrorContext::new_missing(
1821 "Devlink",
1822 "ParamGeneric",
1823 self.orig_loc,
1824 self.buf.as_ptr() as usize,
1825 ))
1826 }
1827 #[doc = "Associated type: [`VarAttrType`] (enum)"]
1828 pub fn get_param_type(&self) -> Result<u8, ErrorContext> {
1829 let mut iter = self.clone();
1830 iter.pos = 0;
1831 for attr in iter {
1832 if let Devlink::ParamType(val) = attr? {
1833 return Ok(val);
1834 }
1835 }
1836 Err(ErrorContext::new_missing(
1837 "Devlink",
1838 "ParamType",
1839 self.orig_loc,
1840 self.buf.as_ptr() as usize,
1841 ))
1842 }
1843 #[doc = "Associated type: [`ParamCmode`] (enum)"]
1844 pub fn get_param_value_cmode(&self) -> Result<u8, ErrorContext> {
1845 let mut iter = self.clone();
1846 iter.pos = 0;
1847 for attr in iter {
1848 if let Devlink::ParamValueCmode(val) = attr? {
1849 return Ok(val);
1850 }
1851 }
1852 Err(ErrorContext::new_missing(
1853 "Devlink",
1854 "ParamValueCmode",
1855 self.orig_loc,
1856 self.buf.as_ptr() as usize,
1857 ))
1858 }
1859 pub fn get_region_name(&self) -> Result<&'a CStr, ErrorContext> {
1860 let mut iter = self.clone();
1861 iter.pos = 0;
1862 for attr in iter {
1863 if let Devlink::RegionName(val) = attr? {
1864 return Ok(val);
1865 }
1866 }
1867 Err(ErrorContext::new_missing(
1868 "Devlink",
1869 "RegionName",
1870 self.orig_loc,
1871 self.buf.as_ptr() as usize,
1872 ))
1873 }
1874 pub fn get_region_size(&self) -> Result<u64, ErrorContext> {
1875 let mut iter = self.clone();
1876 iter.pos = 0;
1877 for attr in iter {
1878 if let Devlink::RegionSize(val) = attr? {
1879 return Ok(val);
1880 }
1881 }
1882 Err(ErrorContext::new_missing(
1883 "Devlink",
1884 "RegionSize",
1885 self.orig_loc,
1886 self.buf.as_ptr() as usize,
1887 ))
1888 }
1889 pub fn get_region_snapshots(&self) -> Result<IterableDlRegionSnapshots<'a>, ErrorContext> {
1890 let mut iter = self.clone();
1891 iter.pos = 0;
1892 for attr in iter {
1893 if let Devlink::RegionSnapshots(val) = attr? {
1894 return Ok(val);
1895 }
1896 }
1897 Err(ErrorContext::new_missing(
1898 "Devlink",
1899 "RegionSnapshots",
1900 self.orig_loc,
1901 self.buf.as_ptr() as usize,
1902 ))
1903 }
1904 pub fn get_region_snapshot(&self) -> Result<IterableDlRegionSnapshot<'a>, ErrorContext> {
1905 let mut iter = self.clone();
1906 iter.pos = 0;
1907 for attr in iter {
1908 if let Devlink::RegionSnapshot(val) = attr? {
1909 return Ok(val);
1910 }
1911 }
1912 Err(ErrorContext::new_missing(
1913 "Devlink",
1914 "RegionSnapshot",
1915 self.orig_loc,
1916 self.buf.as_ptr() as usize,
1917 ))
1918 }
1919 pub fn get_region_snapshot_id(&self) -> Result<u32, ErrorContext> {
1920 let mut iter = self.clone();
1921 iter.pos = 0;
1922 for attr in iter {
1923 if let Devlink::RegionSnapshotId(val) = attr? {
1924 return Ok(val);
1925 }
1926 }
1927 Err(ErrorContext::new_missing(
1928 "Devlink",
1929 "RegionSnapshotId",
1930 self.orig_loc,
1931 self.buf.as_ptr() as usize,
1932 ))
1933 }
1934 pub fn get_region_chunks(&self) -> Result<IterableDlRegionChunks<'a>, ErrorContext> {
1935 let mut iter = self.clone();
1936 iter.pos = 0;
1937 for attr in iter {
1938 if let Devlink::RegionChunks(val) = attr? {
1939 return Ok(val);
1940 }
1941 }
1942 Err(ErrorContext::new_missing(
1943 "Devlink",
1944 "RegionChunks",
1945 self.orig_loc,
1946 self.buf.as_ptr() as usize,
1947 ))
1948 }
1949 pub fn get_region_chunk(&self) -> Result<IterableDlRegionChunk<'a>, ErrorContext> {
1950 let mut iter = self.clone();
1951 iter.pos = 0;
1952 for attr in iter {
1953 if let Devlink::RegionChunk(val) = attr? {
1954 return Ok(val);
1955 }
1956 }
1957 Err(ErrorContext::new_missing(
1958 "Devlink",
1959 "RegionChunk",
1960 self.orig_loc,
1961 self.buf.as_ptr() as usize,
1962 ))
1963 }
1964 pub fn get_region_chunk_data(&self) -> Result<&'a [u8], ErrorContext> {
1965 let mut iter = self.clone();
1966 iter.pos = 0;
1967 for attr in iter {
1968 if let Devlink::RegionChunkData(val) = attr? {
1969 return Ok(val);
1970 }
1971 }
1972 Err(ErrorContext::new_missing(
1973 "Devlink",
1974 "RegionChunkData",
1975 self.orig_loc,
1976 self.buf.as_ptr() as usize,
1977 ))
1978 }
1979 pub fn get_region_chunk_addr(&self) -> Result<u64, ErrorContext> {
1980 let mut iter = self.clone();
1981 iter.pos = 0;
1982 for attr in iter {
1983 if let Devlink::RegionChunkAddr(val) = attr? {
1984 return Ok(val);
1985 }
1986 }
1987 Err(ErrorContext::new_missing(
1988 "Devlink",
1989 "RegionChunkAddr",
1990 self.orig_loc,
1991 self.buf.as_ptr() as usize,
1992 ))
1993 }
1994 pub fn get_region_chunk_len(&self) -> Result<u64, ErrorContext> {
1995 let mut iter = self.clone();
1996 iter.pos = 0;
1997 for attr in iter {
1998 if let Devlink::RegionChunkLen(val) = attr? {
1999 return Ok(val);
2000 }
2001 }
2002 Err(ErrorContext::new_missing(
2003 "Devlink",
2004 "RegionChunkLen",
2005 self.orig_loc,
2006 self.buf.as_ptr() as usize,
2007 ))
2008 }
2009 pub fn get_info_driver_name(&self) -> Result<&'a CStr, ErrorContext> {
2010 let mut iter = self.clone();
2011 iter.pos = 0;
2012 for attr in iter {
2013 if let Devlink::InfoDriverName(val) = attr? {
2014 return Ok(val);
2015 }
2016 }
2017 Err(ErrorContext::new_missing(
2018 "Devlink",
2019 "InfoDriverName",
2020 self.orig_loc,
2021 self.buf.as_ptr() as usize,
2022 ))
2023 }
2024 pub fn get_info_serial_number(&self) -> Result<&'a CStr, ErrorContext> {
2025 let mut iter = self.clone();
2026 iter.pos = 0;
2027 for attr in iter {
2028 if let Devlink::InfoSerialNumber(val) = attr? {
2029 return Ok(val);
2030 }
2031 }
2032 Err(ErrorContext::new_missing(
2033 "Devlink",
2034 "InfoSerialNumber",
2035 self.orig_loc,
2036 self.buf.as_ptr() as usize,
2037 ))
2038 }
2039 #[doc = "Attribute may repeat multiple times (treat it as array)"]
2040 pub fn get_info_version_fixed(
2041 &self,
2042 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlInfoVersion<'a>> {
2043 MultiAttrIterable::new(self.clone(), |variant| {
2044 if let Devlink::InfoVersionFixed(val) = variant {
2045 Some(val)
2046 } else {
2047 None
2048 }
2049 })
2050 }
2051 #[doc = "Attribute may repeat multiple times (treat it as array)"]
2052 pub fn get_info_version_running(
2053 &self,
2054 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlInfoVersion<'a>> {
2055 MultiAttrIterable::new(self.clone(), |variant| {
2056 if let Devlink::InfoVersionRunning(val) = variant {
2057 Some(val)
2058 } else {
2059 None
2060 }
2061 })
2062 }
2063 #[doc = "Attribute may repeat multiple times (treat it as array)"]
2064 pub fn get_info_version_stored(
2065 &self,
2066 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlInfoVersion<'a>> {
2067 MultiAttrIterable::new(self.clone(), |variant| {
2068 if let Devlink::InfoVersionStored(val) = variant {
2069 Some(val)
2070 } else {
2071 None
2072 }
2073 })
2074 }
2075 pub fn get_info_version_name(&self) -> Result<&'a CStr, ErrorContext> {
2076 let mut iter = self.clone();
2077 iter.pos = 0;
2078 for attr in iter {
2079 if let Devlink::InfoVersionName(val) = attr? {
2080 return Ok(val);
2081 }
2082 }
2083 Err(ErrorContext::new_missing(
2084 "Devlink",
2085 "InfoVersionName",
2086 self.orig_loc,
2087 self.buf.as_ptr() as usize,
2088 ))
2089 }
2090 pub fn get_info_version_value(&self) -> Result<&'a CStr, ErrorContext> {
2091 let mut iter = self.clone();
2092 iter.pos = 0;
2093 for attr in iter {
2094 if let Devlink::InfoVersionValue(val) = attr? {
2095 return Ok(val);
2096 }
2097 }
2098 Err(ErrorContext::new_missing(
2099 "Devlink",
2100 "InfoVersionValue",
2101 self.orig_loc,
2102 self.buf.as_ptr() as usize,
2103 ))
2104 }
2105 pub fn get_sb_pool_cell_size(&self) -> Result<u32, ErrorContext> {
2106 let mut iter = self.clone();
2107 iter.pos = 0;
2108 for attr in iter {
2109 if let Devlink::SbPoolCellSize(val) = attr? {
2110 return Ok(val);
2111 }
2112 }
2113 Err(ErrorContext::new_missing(
2114 "Devlink",
2115 "SbPoolCellSize",
2116 self.orig_loc,
2117 self.buf.as_ptr() as usize,
2118 ))
2119 }
2120 pub fn get_fmsg(&self) -> Result<IterableDlFmsg<'a>, ErrorContext> {
2121 let mut iter = self.clone();
2122 iter.pos = 0;
2123 for attr in iter {
2124 if let Devlink::Fmsg(val) = attr? {
2125 return Ok(val);
2126 }
2127 }
2128 Err(ErrorContext::new_missing(
2129 "Devlink",
2130 "Fmsg",
2131 self.orig_loc,
2132 self.buf.as_ptr() as usize,
2133 ))
2134 }
2135 pub fn get_fmsg_obj_nest_start(&self) -> Result<(), ErrorContext> {
2136 let mut iter = self.clone();
2137 iter.pos = 0;
2138 for attr in iter {
2139 if let Devlink::FmsgObjNestStart(val) = attr? {
2140 return Ok(val);
2141 }
2142 }
2143 Err(ErrorContext::new_missing(
2144 "Devlink",
2145 "FmsgObjNestStart",
2146 self.orig_loc,
2147 self.buf.as_ptr() as usize,
2148 ))
2149 }
2150 pub fn get_fmsg_pair_nest_start(&self) -> Result<(), ErrorContext> {
2151 let mut iter = self.clone();
2152 iter.pos = 0;
2153 for attr in iter {
2154 if let Devlink::FmsgPairNestStart(val) = attr? {
2155 return Ok(val);
2156 }
2157 }
2158 Err(ErrorContext::new_missing(
2159 "Devlink",
2160 "FmsgPairNestStart",
2161 self.orig_loc,
2162 self.buf.as_ptr() as usize,
2163 ))
2164 }
2165 pub fn get_fmsg_arr_nest_start(&self) -> Result<(), ErrorContext> {
2166 let mut iter = self.clone();
2167 iter.pos = 0;
2168 for attr in iter {
2169 if let Devlink::FmsgArrNestStart(val) = attr? {
2170 return Ok(val);
2171 }
2172 }
2173 Err(ErrorContext::new_missing(
2174 "Devlink",
2175 "FmsgArrNestStart",
2176 self.orig_loc,
2177 self.buf.as_ptr() as usize,
2178 ))
2179 }
2180 pub fn get_fmsg_nest_end(&self) -> Result<(), ErrorContext> {
2181 let mut iter = self.clone();
2182 iter.pos = 0;
2183 for attr in iter {
2184 if let Devlink::FmsgNestEnd(val) = attr? {
2185 return Ok(val);
2186 }
2187 }
2188 Err(ErrorContext::new_missing(
2189 "Devlink",
2190 "FmsgNestEnd",
2191 self.orig_loc,
2192 self.buf.as_ptr() as usize,
2193 ))
2194 }
2195 pub fn get_fmsg_obj_name(&self) -> Result<&'a CStr, ErrorContext> {
2196 let mut iter = self.clone();
2197 iter.pos = 0;
2198 for attr in iter {
2199 if let Devlink::FmsgObjName(val) = attr? {
2200 return Ok(val);
2201 }
2202 }
2203 Err(ErrorContext::new_missing(
2204 "Devlink",
2205 "FmsgObjName",
2206 self.orig_loc,
2207 self.buf.as_ptr() as usize,
2208 ))
2209 }
2210 #[doc = "Associated type: [`VarAttrType`] (enum)"]
2211 pub fn get_fmsg_obj_value_type(&self) -> Result<u8, ErrorContext> {
2212 let mut iter = self.clone();
2213 iter.pos = 0;
2214 for attr in iter {
2215 if let Devlink::FmsgObjValueType(val) = attr? {
2216 return Ok(val);
2217 }
2218 }
2219 Err(ErrorContext::new_missing(
2220 "Devlink",
2221 "FmsgObjValueType",
2222 self.orig_loc,
2223 self.buf.as_ptr() as usize,
2224 ))
2225 }
2226 pub fn get_health_reporter(&self) -> Result<IterableDlHealthReporter<'a>, ErrorContext> {
2227 let mut iter = self.clone();
2228 iter.pos = 0;
2229 for attr in iter {
2230 if let Devlink::HealthReporter(val) = attr? {
2231 return Ok(val);
2232 }
2233 }
2234 Err(ErrorContext::new_missing(
2235 "Devlink",
2236 "HealthReporter",
2237 self.orig_loc,
2238 self.buf.as_ptr() as usize,
2239 ))
2240 }
2241 pub fn get_health_reporter_name(&self) -> Result<&'a CStr, ErrorContext> {
2242 let mut iter = self.clone();
2243 iter.pos = 0;
2244 for attr in iter {
2245 if let Devlink::HealthReporterName(val) = attr? {
2246 return Ok(val);
2247 }
2248 }
2249 Err(ErrorContext::new_missing(
2250 "Devlink",
2251 "HealthReporterName",
2252 self.orig_loc,
2253 self.buf.as_ptr() as usize,
2254 ))
2255 }
2256 pub fn get_health_reporter_state(&self) -> Result<u8, ErrorContext> {
2257 let mut iter = self.clone();
2258 iter.pos = 0;
2259 for attr in iter {
2260 if let Devlink::HealthReporterState(val) = attr? {
2261 return Ok(val);
2262 }
2263 }
2264 Err(ErrorContext::new_missing(
2265 "Devlink",
2266 "HealthReporterState",
2267 self.orig_loc,
2268 self.buf.as_ptr() as usize,
2269 ))
2270 }
2271 pub fn get_health_reporter_err_count(&self) -> Result<u64, ErrorContext> {
2272 let mut iter = self.clone();
2273 iter.pos = 0;
2274 for attr in iter {
2275 if let Devlink::HealthReporterErrCount(val) = attr? {
2276 return Ok(val);
2277 }
2278 }
2279 Err(ErrorContext::new_missing(
2280 "Devlink",
2281 "HealthReporterErrCount",
2282 self.orig_loc,
2283 self.buf.as_ptr() as usize,
2284 ))
2285 }
2286 pub fn get_health_reporter_recover_count(&self) -> Result<u64, ErrorContext> {
2287 let mut iter = self.clone();
2288 iter.pos = 0;
2289 for attr in iter {
2290 if let Devlink::HealthReporterRecoverCount(val) = attr? {
2291 return Ok(val);
2292 }
2293 }
2294 Err(ErrorContext::new_missing(
2295 "Devlink",
2296 "HealthReporterRecoverCount",
2297 self.orig_loc,
2298 self.buf.as_ptr() as usize,
2299 ))
2300 }
2301 pub fn get_health_reporter_dump_ts(&self) -> Result<u64, ErrorContext> {
2302 let mut iter = self.clone();
2303 iter.pos = 0;
2304 for attr in iter {
2305 if let Devlink::HealthReporterDumpTs(val) = attr? {
2306 return Ok(val);
2307 }
2308 }
2309 Err(ErrorContext::new_missing(
2310 "Devlink",
2311 "HealthReporterDumpTs",
2312 self.orig_loc,
2313 self.buf.as_ptr() as usize,
2314 ))
2315 }
2316 pub fn get_health_reporter_graceful_period(&self) -> Result<u64, ErrorContext> {
2317 let mut iter = self.clone();
2318 iter.pos = 0;
2319 for attr in iter {
2320 if let Devlink::HealthReporterGracefulPeriod(val) = attr? {
2321 return Ok(val);
2322 }
2323 }
2324 Err(ErrorContext::new_missing(
2325 "Devlink",
2326 "HealthReporterGracefulPeriod",
2327 self.orig_loc,
2328 self.buf.as_ptr() as usize,
2329 ))
2330 }
2331 pub fn get_health_reporter_auto_recover(&self) -> Result<u8, ErrorContext> {
2332 let mut iter = self.clone();
2333 iter.pos = 0;
2334 for attr in iter {
2335 if let Devlink::HealthReporterAutoRecover(val) = attr? {
2336 return Ok(val);
2337 }
2338 }
2339 Err(ErrorContext::new_missing(
2340 "Devlink",
2341 "HealthReporterAutoRecover",
2342 self.orig_loc,
2343 self.buf.as_ptr() as usize,
2344 ))
2345 }
2346 pub fn get_flash_update_file_name(&self) -> Result<&'a CStr, ErrorContext> {
2347 let mut iter = self.clone();
2348 iter.pos = 0;
2349 for attr in iter {
2350 if let Devlink::FlashUpdateFileName(val) = attr? {
2351 return Ok(val);
2352 }
2353 }
2354 Err(ErrorContext::new_missing(
2355 "Devlink",
2356 "FlashUpdateFileName",
2357 self.orig_loc,
2358 self.buf.as_ptr() as usize,
2359 ))
2360 }
2361 pub fn get_flash_update_component(&self) -> Result<&'a CStr, ErrorContext> {
2362 let mut iter = self.clone();
2363 iter.pos = 0;
2364 for attr in iter {
2365 if let Devlink::FlashUpdateComponent(val) = attr? {
2366 return Ok(val);
2367 }
2368 }
2369 Err(ErrorContext::new_missing(
2370 "Devlink",
2371 "FlashUpdateComponent",
2372 self.orig_loc,
2373 self.buf.as_ptr() as usize,
2374 ))
2375 }
2376 pub fn get_flash_update_status_msg(&self) -> Result<&'a CStr, ErrorContext> {
2377 let mut iter = self.clone();
2378 iter.pos = 0;
2379 for attr in iter {
2380 if let Devlink::FlashUpdateStatusMsg(val) = attr? {
2381 return Ok(val);
2382 }
2383 }
2384 Err(ErrorContext::new_missing(
2385 "Devlink",
2386 "FlashUpdateStatusMsg",
2387 self.orig_loc,
2388 self.buf.as_ptr() as usize,
2389 ))
2390 }
2391 pub fn get_flash_update_status_done(&self) -> Result<u64, ErrorContext> {
2392 let mut iter = self.clone();
2393 iter.pos = 0;
2394 for attr in iter {
2395 if let Devlink::FlashUpdateStatusDone(val) = attr? {
2396 return Ok(val);
2397 }
2398 }
2399 Err(ErrorContext::new_missing(
2400 "Devlink",
2401 "FlashUpdateStatusDone",
2402 self.orig_loc,
2403 self.buf.as_ptr() as usize,
2404 ))
2405 }
2406 pub fn get_flash_update_status_total(&self) -> Result<u64, ErrorContext> {
2407 let mut iter = self.clone();
2408 iter.pos = 0;
2409 for attr in iter {
2410 if let Devlink::FlashUpdateStatusTotal(val) = attr? {
2411 return Ok(val);
2412 }
2413 }
2414 Err(ErrorContext::new_missing(
2415 "Devlink",
2416 "FlashUpdateStatusTotal",
2417 self.orig_loc,
2418 self.buf.as_ptr() as usize,
2419 ))
2420 }
2421 pub fn get_port_pci_pf_number(&self) -> Result<u16, ErrorContext> {
2422 let mut iter = self.clone();
2423 iter.pos = 0;
2424 for attr in iter {
2425 if let Devlink::PortPciPfNumber(val) = attr? {
2426 return Ok(val);
2427 }
2428 }
2429 Err(ErrorContext::new_missing(
2430 "Devlink",
2431 "PortPciPfNumber",
2432 self.orig_loc,
2433 self.buf.as_ptr() as usize,
2434 ))
2435 }
2436 pub fn get_port_pci_vf_number(&self) -> Result<u16, ErrorContext> {
2437 let mut iter = self.clone();
2438 iter.pos = 0;
2439 for attr in iter {
2440 if let Devlink::PortPciVfNumber(val) = attr? {
2441 return Ok(val);
2442 }
2443 }
2444 Err(ErrorContext::new_missing(
2445 "Devlink",
2446 "PortPciVfNumber",
2447 self.orig_loc,
2448 self.buf.as_ptr() as usize,
2449 ))
2450 }
2451 pub fn get_stats(&self) -> Result<IterableDlAttrStats<'a>, ErrorContext> {
2452 let mut iter = self.clone();
2453 iter.pos = 0;
2454 for attr in iter {
2455 if let Devlink::Stats(val) = attr? {
2456 return Ok(val);
2457 }
2458 }
2459 Err(ErrorContext::new_missing(
2460 "Devlink",
2461 "Stats",
2462 self.orig_loc,
2463 self.buf.as_ptr() as usize,
2464 ))
2465 }
2466 pub fn get_trap_name(&self) -> Result<&'a CStr, ErrorContext> {
2467 let mut iter = self.clone();
2468 iter.pos = 0;
2469 for attr in iter {
2470 if let Devlink::TrapName(val) = attr? {
2471 return Ok(val);
2472 }
2473 }
2474 Err(ErrorContext::new_missing(
2475 "Devlink",
2476 "TrapName",
2477 self.orig_loc,
2478 self.buf.as_ptr() as usize,
2479 ))
2480 }
2481 #[doc = "Associated type: [`TrapAction`] (enum)"]
2482 pub fn get_trap_action(&self) -> Result<u8, ErrorContext> {
2483 let mut iter = self.clone();
2484 iter.pos = 0;
2485 for attr in iter {
2486 if let Devlink::TrapAction(val) = attr? {
2487 return Ok(val);
2488 }
2489 }
2490 Err(ErrorContext::new_missing(
2491 "Devlink",
2492 "TrapAction",
2493 self.orig_loc,
2494 self.buf.as_ptr() as usize,
2495 ))
2496 }
2497 #[doc = "Associated type: [`TrapType`] (enum)"]
2498 pub fn get_trap_type(&self) -> Result<u8, ErrorContext> {
2499 let mut iter = self.clone();
2500 iter.pos = 0;
2501 for attr in iter {
2502 if let Devlink::TrapType(val) = attr? {
2503 return Ok(val);
2504 }
2505 }
2506 Err(ErrorContext::new_missing(
2507 "Devlink",
2508 "TrapType",
2509 self.orig_loc,
2510 self.buf.as_ptr() as usize,
2511 ))
2512 }
2513 pub fn get_trap_generic(&self) -> Result<(), ErrorContext> {
2514 let mut iter = self.clone();
2515 iter.pos = 0;
2516 for attr in iter {
2517 if let Devlink::TrapGeneric(val) = attr? {
2518 return Ok(val);
2519 }
2520 }
2521 Err(ErrorContext::new_missing(
2522 "Devlink",
2523 "TrapGeneric",
2524 self.orig_loc,
2525 self.buf.as_ptr() as usize,
2526 ))
2527 }
2528 pub fn get_trap_metadata(&self) -> Result<IterableDlTrapMetadata<'a>, ErrorContext> {
2529 let mut iter = self.clone();
2530 iter.pos = 0;
2531 for attr in iter {
2532 if let Devlink::TrapMetadata(val) = attr? {
2533 return Ok(val);
2534 }
2535 }
2536 Err(ErrorContext::new_missing(
2537 "Devlink",
2538 "TrapMetadata",
2539 self.orig_loc,
2540 self.buf.as_ptr() as usize,
2541 ))
2542 }
2543 pub fn get_trap_group_name(&self) -> Result<&'a CStr, ErrorContext> {
2544 let mut iter = self.clone();
2545 iter.pos = 0;
2546 for attr in iter {
2547 if let Devlink::TrapGroupName(val) = attr? {
2548 return Ok(val);
2549 }
2550 }
2551 Err(ErrorContext::new_missing(
2552 "Devlink",
2553 "TrapGroupName",
2554 self.orig_loc,
2555 self.buf.as_ptr() as usize,
2556 ))
2557 }
2558 pub fn get_reload_failed(&self) -> Result<u8, ErrorContext> {
2559 let mut iter = self.clone();
2560 iter.pos = 0;
2561 for attr in iter {
2562 if let Devlink::ReloadFailed(val) = attr? {
2563 return Ok(val);
2564 }
2565 }
2566 Err(ErrorContext::new_missing(
2567 "Devlink",
2568 "ReloadFailed",
2569 self.orig_loc,
2570 self.buf.as_ptr() as usize,
2571 ))
2572 }
2573 pub fn get_health_reporter_dump_ts_ns(&self) -> Result<u64, ErrorContext> {
2574 let mut iter = self.clone();
2575 iter.pos = 0;
2576 for attr in iter {
2577 if let Devlink::HealthReporterDumpTsNs(val) = attr? {
2578 return Ok(val);
2579 }
2580 }
2581 Err(ErrorContext::new_missing(
2582 "Devlink",
2583 "HealthReporterDumpTsNs",
2584 self.orig_loc,
2585 self.buf.as_ptr() as usize,
2586 ))
2587 }
2588 pub fn get_netns_fd(&self) -> Result<u32, ErrorContext> {
2589 let mut iter = self.clone();
2590 iter.pos = 0;
2591 for attr in iter {
2592 if let Devlink::NetnsFd(val) = attr? {
2593 return Ok(val);
2594 }
2595 }
2596 Err(ErrorContext::new_missing(
2597 "Devlink",
2598 "NetnsFd",
2599 self.orig_loc,
2600 self.buf.as_ptr() as usize,
2601 ))
2602 }
2603 pub fn get_netns_pid(&self) -> Result<u32, ErrorContext> {
2604 let mut iter = self.clone();
2605 iter.pos = 0;
2606 for attr in iter {
2607 if let Devlink::NetnsPid(val) = attr? {
2608 return Ok(val);
2609 }
2610 }
2611 Err(ErrorContext::new_missing(
2612 "Devlink",
2613 "NetnsPid",
2614 self.orig_loc,
2615 self.buf.as_ptr() as usize,
2616 ))
2617 }
2618 pub fn get_netns_id(&self) -> Result<u32, ErrorContext> {
2619 let mut iter = self.clone();
2620 iter.pos = 0;
2621 for attr in iter {
2622 if let Devlink::NetnsId(val) = attr? {
2623 return Ok(val);
2624 }
2625 }
2626 Err(ErrorContext::new_missing(
2627 "Devlink",
2628 "NetnsId",
2629 self.orig_loc,
2630 self.buf.as_ptr() as usize,
2631 ))
2632 }
2633 pub fn get_health_reporter_auto_dump(&self) -> Result<u8, ErrorContext> {
2634 let mut iter = self.clone();
2635 iter.pos = 0;
2636 for attr in iter {
2637 if let Devlink::HealthReporterAutoDump(val) = attr? {
2638 return Ok(val);
2639 }
2640 }
2641 Err(ErrorContext::new_missing(
2642 "Devlink",
2643 "HealthReporterAutoDump",
2644 self.orig_loc,
2645 self.buf.as_ptr() as usize,
2646 ))
2647 }
2648 pub fn get_trap_policer_id(&self) -> Result<u32, ErrorContext> {
2649 let mut iter = self.clone();
2650 iter.pos = 0;
2651 for attr in iter {
2652 if let Devlink::TrapPolicerId(val) = attr? {
2653 return Ok(val);
2654 }
2655 }
2656 Err(ErrorContext::new_missing(
2657 "Devlink",
2658 "TrapPolicerId",
2659 self.orig_loc,
2660 self.buf.as_ptr() as usize,
2661 ))
2662 }
2663 pub fn get_trap_policer_rate(&self) -> Result<u64, ErrorContext> {
2664 let mut iter = self.clone();
2665 iter.pos = 0;
2666 for attr in iter {
2667 if let Devlink::TrapPolicerRate(val) = attr? {
2668 return Ok(val);
2669 }
2670 }
2671 Err(ErrorContext::new_missing(
2672 "Devlink",
2673 "TrapPolicerRate",
2674 self.orig_loc,
2675 self.buf.as_ptr() as usize,
2676 ))
2677 }
2678 pub fn get_trap_policer_burst(&self) -> Result<u64, ErrorContext> {
2679 let mut iter = self.clone();
2680 iter.pos = 0;
2681 for attr in iter {
2682 if let Devlink::TrapPolicerBurst(val) = attr? {
2683 return Ok(val);
2684 }
2685 }
2686 Err(ErrorContext::new_missing(
2687 "Devlink",
2688 "TrapPolicerBurst",
2689 self.orig_loc,
2690 self.buf.as_ptr() as usize,
2691 ))
2692 }
2693 pub fn get_port_function(&self) -> Result<IterableDlPortFunction<'a>, ErrorContext> {
2694 let mut iter = self.clone();
2695 iter.pos = 0;
2696 for attr in iter {
2697 if let Devlink::PortFunction(val) = attr? {
2698 return Ok(val);
2699 }
2700 }
2701 Err(ErrorContext::new_missing(
2702 "Devlink",
2703 "PortFunction",
2704 self.orig_loc,
2705 self.buf.as_ptr() as usize,
2706 ))
2707 }
2708 pub fn get_info_board_serial_number(&self) -> Result<&'a CStr, ErrorContext> {
2709 let mut iter = self.clone();
2710 iter.pos = 0;
2711 for attr in iter {
2712 if let Devlink::InfoBoardSerialNumber(val) = attr? {
2713 return Ok(val);
2714 }
2715 }
2716 Err(ErrorContext::new_missing(
2717 "Devlink",
2718 "InfoBoardSerialNumber",
2719 self.orig_loc,
2720 self.buf.as_ptr() as usize,
2721 ))
2722 }
2723 pub fn get_port_lanes(&self) -> Result<u32, ErrorContext> {
2724 let mut iter = self.clone();
2725 iter.pos = 0;
2726 for attr in iter {
2727 if let Devlink::PortLanes(val) = attr? {
2728 return Ok(val);
2729 }
2730 }
2731 Err(ErrorContext::new_missing(
2732 "Devlink",
2733 "PortLanes",
2734 self.orig_loc,
2735 self.buf.as_ptr() as usize,
2736 ))
2737 }
2738 pub fn get_port_splittable(&self) -> Result<u8, ErrorContext> {
2739 let mut iter = self.clone();
2740 iter.pos = 0;
2741 for attr in iter {
2742 if let Devlink::PortSplittable(val) = attr? {
2743 return Ok(val);
2744 }
2745 }
2746 Err(ErrorContext::new_missing(
2747 "Devlink",
2748 "PortSplittable",
2749 self.orig_loc,
2750 self.buf.as_ptr() as usize,
2751 ))
2752 }
2753 pub fn get_port_external(&self) -> Result<u8, ErrorContext> {
2754 let mut iter = self.clone();
2755 iter.pos = 0;
2756 for attr in iter {
2757 if let Devlink::PortExternal(val) = attr? {
2758 return Ok(val);
2759 }
2760 }
2761 Err(ErrorContext::new_missing(
2762 "Devlink",
2763 "PortExternal",
2764 self.orig_loc,
2765 self.buf.as_ptr() as usize,
2766 ))
2767 }
2768 pub fn get_port_controller_number(&self) -> Result<u32, ErrorContext> {
2769 let mut iter = self.clone();
2770 iter.pos = 0;
2771 for attr in iter {
2772 if let Devlink::PortControllerNumber(val) = attr? {
2773 return Ok(val);
2774 }
2775 }
2776 Err(ErrorContext::new_missing(
2777 "Devlink",
2778 "PortControllerNumber",
2779 self.orig_loc,
2780 self.buf.as_ptr() as usize,
2781 ))
2782 }
2783 pub fn get_flash_update_status_timeout(&self) -> Result<u64, ErrorContext> {
2784 let mut iter = self.clone();
2785 iter.pos = 0;
2786 for attr in iter {
2787 if let Devlink::FlashUpdateStatusTimeout(val) = attr? {
2788 return Ok(val);
2789 }
2790 }
2791 Err(ErrorContext::new_missing(
2792 "Devlink",
2793 "FlashUpdateStatusTimeout",
2794 self.orig_loc,
2795 self.buf.as_ptr() as usize,
2796 ))
2797 }
2798 #[doc = "Associated type: [`FlashOverwrite`] (1 bit per enumeration)"]
2799 pub fn get_flash_update_overwrite_mask(&self) -> Result<BuiltinBitfield32, ErrorContext> {
2800 let mut iter = self.clone();
2801 iter.pos = 0;
2802 for attr in iter {
2803 if let Devlink::FlashUpdateOverwriteMask(val) = attr? {
2804 return Ok(val);
2805 }
2806 }
2807 Err(ErrorContext::new_missing(
2808 "Devlink",
2809 "FlashUpdateOverwriteMask",
2810 self.orig_loc,
2811 self.buf.as_ptr() as usize,
2812 ))
2813 }
2814 #[doc = "Associated type: [`ReloadAction`] (enum)"]
2815 pub fn get_reload_action(&self) -> Result<u8, ErrorContext> {
2816 let mut iter = self.clone();
2817 iter.pos = 0;
2818 for attr in iter {
2819 if let Devlink::ReloadAction(val) = attr? {
2820 return Ok(val);
2821 }
2822 }
2823 Err(ErrorContext::new_missing(
2824 "Devlink",
2825 "ReloadAction",
2826 self.orig_loc,
2827 self.buf.as_ptr() as usize,
2828 ))
2829 }
2830 #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
2831 pub fn get_reload_actions_performed(&self) -> Result<BuiltinBitfield32, ErrorContext> {
2832 let mut iter = self.clone();
2833 iter.pos = 0;
2834 for attr in iter {
2835 if let Devlink::ReloadActionsPerformed(val) = attr? {
2836 return Ok(val);
2837 }
2838 }
2839 Err(ErrorContext::new_missing(
2840 "Devlink",
2841 "ReloadActionsPerformed",
2842 self.orig_loc,
2843 self.buf.as_ptr() as usize,
2844 ))
2845 }
2846 #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
2847 pub fn get_reload_limits(&self) -> Result<BuiltinBitfield32, ErrorContext> {
2848 let mut iter = self.clone();
2849 iter.pos = 0;
2850 for attr in iter {
2851 if let Devlink::ReloadLimits(val) = attr? {
2852 return Ok(val);
2853 }
2854 }
2855 Err(ErrorContext::new_missing(
2856 "Devlink",
2857 "ReloadLimits",
2858 self.orig_loc,
2859 self.buf.as_ptr() as usize,
2860 ))
2861 }
2862 pub fn get_dev_stats(&self) -> Result<IterableDlDevStats<'a>, ErrorContext> {
2863 let mut iter = self.clone();
2864 iter.pos = 0;
2865 for attr in iter {
2866 if let Devlink::DevStats(val) = attr? {
2867 return Ok(val);
2868 }
2869 }
2870 Err(ErrorContext::new_missing(
2871 "Devlink",
2872 "DevStats",
2873 self.orig_loc,
2874 self.buf.as_ptr() as usize,
2875 ))
2876 }
2877 pub fn get_reload_stats(&self) -> Result<IterableDlReloadStats<'a>, ErrorContext> {
2878 let mut iter = self.clone();
2879 iter.pos = 0;
2880 for attr in iter {
2881 if let Devlink::ReloadStats(val) = attr? {
2882 return Ok(val);
2883 }
2884 }
2885 Err(ErrorContext::new_missing(
2886 "Devlink",
2887 "ReloadStats",
2888 self.orig_loc,
2889 self.buf.as_ptr() as usize,
2890 ))
2891 }
2892 #[doc = "Attribute may repeat multiple times (treat it as array)"]
2893 pub fn get_reload_stats_entry(
2894 &self,
2895 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlReloadStatsEntry<'a>> {
2896 MultiAttrIterable::new(self.clone(), |variant| {
2897 if let Devlink::ReloadStatsEntry(val) = variant {
2898 Some(val)
2899 } else {
2900 None
2901 }
2902 })
2903 }
2904 pub fn get_reload_stats_limit(&self) -> Result<u8, ErrorContext> {
2905 let mut iter = self.clone();
2906 iter.pos = 0;
2907 for attr in iter {
2908 if let Devlink::ReloadStatsLimit(val) = attr? {
2909 return Ok(val);
2910 }
2911 }
2912 Err(ErrorContext::new_missing(
2913 "Devlink",
2914 "ReloadStatsLimit",
2915 self.orig_loc,
2916 self.buf.as_ptr() as usize,
2917 ))
2918 }
2919 pub fn get_reload_stats_value(&self) -> Result<u32, ErrorContext> {
2920 let mut iter = self.clone();
2921 iter.pos = 0;
2922 for attr in iter {
2923 if let Devlink::ReloadStatsValue(val) = attr? {
2924 return Ok(val);
2925 }
2926 }
2927 Err(ErrorContext::new_missing(
2928 "Devlink",
2929 "ReloadStatsValue",
2930 self.orig_loc,
2931 self.buf.as_ptr() as usize,
2932 ))
2933 }
2934 pub fn get_remote_reload_stats(&self) -> Result<IterableDlReloadStats<'a>, ErrorContext> {
2935 let mut iter = self.clone();
2936 iter.pos = 0;
2937 for attr in iter {
2938 if let Devlink::RemoteReloadStats(val) = attr? {
2939 return Ok(val);
2940 }
2941 }
2942 Err(ErrorContext::new_missing(
2943 "Devlink",
2944 "RemoteReloadStats",
2945 self.orig_loc,
2946 self.buf.as_ptr() as usize,
2947 ))
2948 }
2949 #[doc = "Attribute may repeat multiple times (treat it as array)"]
2950 pub fn get_reload_action_info(
2951 &self,
2952 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlReloadActInfo<'a>> {
2953 MultiAttrIterable::new(self.clone(), |variant| {
2954 if let Devlink::ReloadActionInfo(val) = variant {
2955 Some(val)
2956 } else {
2957 None
2958 }
2959 })
2960 }
2961 #[doc = "Attribute may repeat multiple times (treat it as array)"]
2962 pub fn get_reload_action_stats(
2963 &self,
2964 ) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlReloadActStats<'a>> {
2965 MultiAttrIterable::new(self.clone(), |variant| {
2966 if let Devlink::ReloadActionStats(val) = variant {
2967 Some(val)
2968 } else {
2969 None
2970 }
2971 })
2972 }
2973 pub fn get_port_pci_sf_number(&self) -> Result<u32, ErrorContext> {
2974 let mut iter = self.clone();
2975 iter.pos = 0;
2976 for attr in iter {
2977 if let Devlink::PortPciSfNumber(val) = attr? {
2978 return Ok(val);
2979 }
2980 }
2981 Err(ErrorContext::new_missing(
2982 "Devlink",
2983 "PortPciSfNumber",
2984 self.orig_loc,
2985 self.buf.as_ptr() as usize,
2986 ))
2987 }
2988 #[doc = "Associated type: [`RateType`] (enum)"]
2989 pub fn get_rate_type(&self) -> Result<u16, ErrorContext> {
2990 let mut iter = self.clone();
2991 iter.pos = 0;
2992 for attr in iter {
2993 if let Devlink::RateType(val) = attr? {
2994 return Ok(val);
2995 }
2996 }
2997 Err(ErrorContext::new_missing(
2998 "Devlink",
2999 "RateType",
3000 self.orig_loc,
3001 self.buf.as_ptr() as usize,
3002 ))
3003 }
3004 pub fn get_rate_tx_share(&self) -> Result<u64, ErrorContext> {
3005 let mut iter = self.clone();
3006 iter.pos = 0;
3007 for attr in iter {
3008 if let Devlink::RateTxShare(val) = attr? {
3009 return Ok(val);
3010 }
3011 }
3012 Err(ErrorContext::new_missing(
3013 "Devlink",
3014 "RateTxShare",
3015 self.orig_loc,
3016 self.buf.as_ptr() as usize,
3017 ))
3018 }
3019 pub fn get_rate_tx_max(&self) -> Result<u64, ErrorContext> {
3020 let mut iter = self.clone();
3021 iter.pos = 0;
3022 for attr in iter {
3023 if let Devlink::RateTxMax(val) = attr? {
3024 return Ok(val);
3025 }
3026 }
3027 Err(ErrorContext::new_missing(
3028 "Devlink",
3029 "RateTxMax",
3030 self.orig_loc,
3031 self.buf.as_ptr() as usize,
3032 ))
3033 }
3034 pub fn get_rate_node_name(&self) -> Result<&'a CStr, ErrorContext> {
3035 let mut iter = self.clone();
3036 iter.pos = 0;
3037 for attr in iter {
3038 if let Devlink::RateNodeName(val) = attr? {
3039 return Ok(val);
3040 }
3041 }
3042 Err(ErrorContext::new_missing(
3043 "Devlink",
3044 "RateNodeName",
3045 self.orig_loc,
3046 self.buf.as_ptr() as usize,
3047 ))
3048 }
3049 pub fn get_rate_parent_node_name(&self) -> Result<&'a CStr, ErrorContext> {
3050 let mut iter = self.clone();
3051 iter.pos = 0;
3052 for attr in iter {
3053 if let Devlink::RateParentNodeName(val) = attr? {
3054 return Ok(val);
3055 }
3056 }
3057 Err(ErrorContext::new_missing(
3058 "Devlink",
3059 "RateParentNodeName",
3060 self.orig_loc,
3061 self.buf.as_ptr() as usize,
3062 ))
3063 }
3064 pub fn get_region_max_snapshots(&self) -> Result<u32, ErrorContext> {
3065 let mut iter = self.clone();
3066 iter.pos = 0;
3067 for attr in iter {
3068 if let Devlink::RegionMaxSnapshots(val) = attr? {
3069 return Ok(val);
3070 }
3071 }
3072 Err(ErrorContext::new_missing(
3073 "Devlink",
3074 "RegionMaxSnapshots",
3075 self.orig_loc,
3076 self.buf.as_ptr() as usize,
3077 ))
3078 }
3079 pub fn get_linecard_index(&self) -> Result<u32, ErrorContext> {
3080 let mut iter = self.clone();
3081 iter.pos = 0;
3082 for attr in iter {
3083 if let Devlink::LinecardIndex(val) = attr? {
3084 return Ok(val);
3085 }
3086 }
3087 Err(ErrorContext::new_missing(
3088 "Devlink",
3089 "LinecardIndex",
3090 self.orig_loc,
3091 self.buf.as_ptr() as usize,
3092 ))
3093 }
3094 pub fn get_linecard_state(&self) -> Result<u8, ErrorContext> {
3095 let mut iter = self.clone();
3096 iter.pos = 0;
3097 for attr in iter {
3098 if let Devlink::LinecardState(val) = attr? {
3099 return Ok(val);
3100 }
3101 }
3102 Err(ErrorContext::new_missing(
3103 "Devlink",
3104 "LinecardState",
3105 self.orig_loc,
3106 self.buf.as_ptr() as usize,
3107 ))
3108 }
3109 pub fn get_linecard_type(&self) -> Result<&'a CStr, ErrorContext> {
3110 let mut iter = self.clone();
3111 iter.pos = 0;
3112 for attr in iter {
3113 if let Devlink::LinecardType(val) = attr? {
3114 return Ok(val);
3115 }
3116 }
3117 Err(ErrorContext::new_missing(
3118 "Devlink",
3119 "LinecardType",
3120 self.orig_loc,
3121 self.buf.as_ptr() as usize,
3122 ))
3123 }
3124 pub fn get_linecard_supported_types(
3125 &self,
3126 ) -> Result<IterableDlLinecardSupportedTypes<'a>, ErrorContext> {
3127 let mut iter = self.clone();
3128 iter.pos = 0;
3129 for attr in iter {
3130 if let Devlink::LinecardSupportedTypes(val) = attr? {
3131 return Ok(val);
3132 }
3133 }
3134 Err(ErrorContext::new_missing(
3135 "Devlink",
3136 "LinecardSupportedTypes",
3137 self.orig_loc,
3138 self.buf.as_ptr() as usize,
3139 ))
3140 }
3141 pub fn get_selftests(&self) -> Result<IterableDlSelftestId<'a>, ErrorContext> {
3142 let mut iter = self.clone();
3143 iter.pos = 0;
3144 for attr in iter {
3145 if let Devlink::Selftests(val) = attr? {
3146 return Ok(val);
3147 }
3148 }
3149 Err(ErrorContext::new_missing(
3150 "Devlink",
3151 "Selftests",
3152 self.orig_loc,
3153 self.buf.as_ptr() as usize,
3154 ))
3155 }
3156 pub fn get_rate_tx_priority(&self) -> Result<u32, ErrorContext> {
3157 let mut iter = self.clone();
3158 iter.pos = 0;
3159 for attr in iter {
3160 if let Devlink::RateTxPriority(val) = attr? {
3161 return Ok(val);
3162 }
3163 }
3164 Err(ErrorContext::new_missing(
3165 "Devlink",
3166 "RateTxPriority",
3167 self.orig_loc,
3168 self.buf.as_ptr() as usize,
3169 ))
3170 }
3171 pub fn get_rate_tx_weight(&self) -> Result<u32, ErrorContext> {
3172 let mut iter = self.clone();
3173 iter.pos = 0;
3174 for attr in iter {
3175 if let Devlink::RateTxWeight(val) = attr? {
3176 return Ok(val);
3177 }
3178 }
3179 Err(ErrorContext::new_missing(
3180 "Devlink",
3181 "RateTxWeight",
3182 self.orig_loc,
3183 self.buf.as_ptr() as usize,
3184 ))
3185 }
3186 pub fn get_region_direct(&self) -> Result<(), ErrorContext> {
3187 let mut iter = self.clone();
3188 iter.pos = 0;
3189 for attr in iter {
3190 if let Devlink::RegionDirect(val) = attr? {
3191 return Ok(val);
3192 }
3193 }
3194 Err(ErrorContext::new_missing(
3195 "Devlink",
3196 "RegionDirect",
3197 self.orig_loc,
3198 self.buf.as_ptr() as usize,
3199 ))
3200 }
3201 #[doc = "Attribute may repeat multiple times (treat it as array)"]
3202 pub fn get_rate_tc_bws(&self) -> MultiAttrIterable<Self, Devlink<'a>, IterableDlRateTcBws<'a>> {
3203 MultiAttrIterable::new(self.clone(), |variant| {
3204 if let Devlink::RateTcBws(val) = variant {
3205 Some(val)
3206 } else {
3207 None
3208 }
3209 })
3210 }
3211 #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
3212 pub fn get_health_reporter_burst_period(&self) -> Result<u64, ErrorContext> {
3213 let mut iter = self.clone();
3214 iter.pos = 0;
3215 for attr in iter {
3216 if let Devlink::HealthReporterBurstPeriod(val) = attr? {
3217 return Ok(val);
3218 }
3219 }
3220 Err(ErrorContext::new_missing(
3221 "Devlink",
3222 "HealthReporterBurstPeriod",
3223 self.orig_loc,
3224 self.buf.as_ptr() as usize,
3225 ))
3226 }
3227 #[doc = "Request restoring parameter to its default value\\."]
3228 pub fn get_param_reset_default(&self) -> Result<(), ErrorContext> {
3229 let mut iter = self.clone();
3230 iter.pos = 0;
3231 for attr in iter {
3232 if let Devlink::ParamResetDefault(val) = attr? {
3233 return Ok(val);
3234 }
3235 }
3236 Err(ErrorContext::new_missing(
3237 "Devlink",
3238 "ParamResetDefault",
3239 self.orig_loc,
3240 self.buf.as_ptr() as usize,
3241 ))
3242 }
3243}
3244impl Devlink<'_> {
3245 pub fn new<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
3246 IterableDevlink::with_loc(buf, buf.as_ptr() as usize)
3247 }
3248 fn attr_from_type(r#type: u16) -> Option<&'static str> {
3249 let res = match r#type {
3250 1u16 => "BusName",
3251 2u16 => "DevName",
3252 3u16 => "PortIndex",
3253 4u16 => "PortType",
3254 5u16 => "PortDesiredType",
3255 6u16 => "PortNetdevIfindex",
3256 7u16 => "PortNetdevName",
3257 8u16 => "PortIbdevName",
3258 9u16 => "PortSplitCount",
3259 10u16 => "PortSplitGroup",
3260 11u16 => "SbIndex",
3261 12u16 => "SbSize",
3262 13u16 => "SbIngressPoolCount",
3263 14u16 => "SbEgressPoolCount",
3264 15u16 => "SbIngressTcCount",
3265 16u16 => "SbEgressTcCount",
3266 17u16 => "SbPoolIndex",
3267 18u16 => "SbPoolType",
3268 19u16 => "SbPoolSize",
3269 20u16 => "SbPoolThresholdType",
3270 21u16 => "SbThreshold",
3271 22u16 => "SbTcIndex",
3272 23u16 => "SbOccCur",
3273 24u16 => "SbOccMax",
3274 25u16 => "EswitchMode",
3275 26u16 => "EswitchInlineMode",
3276 27u16 => "DpipeTables",
3277 28u16 => "DpipeTable",
3278 29u16 => "DpipeTableName",
3279 30u16 => "DpipeTableSize",
3280 31u16 => "DpipeTableMatches",
3281 32u16 => "DpipeTableActions",
3282 33u16 => "DpipeTableCountersEnabled",
3283 34u16 => "DpipeEntries",
3284 35u16 => "DpipeEntry",
3285 36u16 => "DpipeEntryIndex",
3286 37u16 => "DpipeEntryMatchValues",
3287 38u16 => "DpipeEntryActionValues",
3288 39u16 => "DpipeEntryCounter",
3289 40u16 => "DpipeMatch",
3290 41u16 => "DpipeMatchValue",
3291 42u16 => "DpipeMatchType",
3292 43u16 => "DpipeAction",
3293 44u16 => "DpipeActionValue",
3294 45u16 => "DpipeActionType",
3295 46u16 => "DpipeValue",
3296 47u16 => "DpipeValueMask",
3297 48u16 => "DpipeValueMapping",
3298 49u16 => "DpipeHeaders",
3299 50u16 => "DpipeHeader",
3300 51u16 => "DpipeHeaderName",
3301 52u16 => "DpipeHeaderId",
3302 53u16 => "DpipeHeaderFields",
3303 54u16 => "DpipeHeaderGlobal",
3304 55u16 => "DpipeHeaderIndex",
3305 56u16 => "DpipeField",
3306 57u16 => "DpipeFieldName",
3307 58u16 => "DpipeFieldId",
3308 59u16 => "DpipeFieldBitwidth",
3309 60u16 => "DpipeFieldMappingType",
3310 61u16 => "Pad",
3311 62u16 => "EswitchEncapMode",
3312 63u16 => "ResourceList",
3313 64u16 => "Resource",
3314 65u16 => "ResourceName",
3315 66u16 => "ResourceId",
3316 67u16 => "ResourceSize",
3317 68u16 => "ResourceSizeNew",
3318 69u16 => "ResourceSizeValid",
3319 70u16 => "ResourceSizeMin",
3320 71u16 => "ResourceSizeMax",
3321 72u16 => "ResourceSizeGran",
3322 73u16 => "ResourceUnit",
3323 74u16 => "ResourceOcc",
3324 75u16 => "DpipeTableResourceId",
3325 76u16 => "DpipeTableResourceUnits",
3326 77u16 => "PortFlavour",
3327 78u16 => "PortNumber",
3328 79u16 => "PortSplitSubportNumber",
3329 80u16 => "Param",
3330 81u16 => "ParamName",
3331 82u16 => "ParamGeneric",
3332 83u16 => "ParamType",
3333 87u16 => "ParamValueCmode",
3334 88u16 => "RegionName",
3335 89u16 => "RegionSize",
3336 90u16 => "RegionSnapshots",
3337 91u16 => "RegionSnapshot",
3338 92u16 => "RegionSnapshotId",
3339 93u16 => "RegionChunks",
3340 94u16 => "RegionChunk",
3341 95u16 => "RegionChunkData",
3342 96u16 => "RegionChunkAddr",
3343 97u16 => "RegionChunkLen",
3344 98u16 => "InfoDriverName",
3345 99u16 => "InfoSerialNumber",
3346 100u16 => "InfoVersionFixed",
3347 101u16 => "InfoVersionRunning",
3348 102u16 => "InfoVersionStored",
3349 103u16 => "InfoVersionName",
3350 104u16 => "InfoVersionValue",
3351 105u16 => "SbPoolCellSize",
3352 106u16 => "Fmsg",
3353 107u16 => "FmsgObjNestStart",
3354 108u16 => "FmsgPairNestStart",
3355 109u16 => "FmsgArrNestStart",
3356 110u16 => "FmsgNestEnd",
3357 111u16 => "FmsgObjName",
3358 112u16 => "FmsgObjValueType",
3359 114u16 => "HealthReporter",
3360 115u16 => "HealthReporterName",
3361 116u16 => "HealthReporterState",
3362 117u16 => "HealthReporterErrCount",
3363 118u16 => "HealthReporterRecoverCount",
3364 119u16 => "HealthReporterDumpTs",
3365 120u16 => "HealthReporterGracefulPeriod",
3366 121u16 => "HealthReporterAutoRecover",
3367 122u16 => "FlashUpdateFileName",
3368 123u16 => "FlashUpdateComponent",
3369 124u16 => "FlashUpdateStatusMsg",
3370 125u16 => "FlashUpdateStatusDone",
3371 126u16 => "FlashUpdateStatusTotal",
3372 127u16 => "PortPciPfNumber",
3373 128u16 => "PortPciVfNumber",
3374 129u16 => "Stats",
3375 130u16 => "TrapName",
3376 131u16 => "TrapAction",
3377 132u16 => "TrapType",
3378 133u16 => "TrapGeneric",
3379 134u16 => "TrapMetadata",
3380 135u16 => "TrapGroupName",
3381 136u16 => "ReloadFailed",
3382 137u16 => "HealthReporterDumpTsNs",
3383 138u16 => "NetnsFd",
3384 139u16 => "NetnsPid",
3385 140u16 => "NetnsId",
3386 141u16 => "HealthReporterAutoDump",
3387 142u16 => "TrapPolicerId",
3388 143u16 => "TrapPolicerRate",
3389 144u16 => "TrapPolicerBurst",
3390 145u16 => "PortFunction",
3391 146u16 => "InfoBoardSerialNumber",
3392 147u16 => "PortLanes",
3393 148u16 => "PortSplittable",
3394 149u16 => "PortExternal",
3395 150u16 => "PortControllerNumber",
3396 151u16 => "FlashUpdateStatusTimeout",
3397 152u16 => "FlashUpdateOverwriteMask",
3398 153u16 => "ReloadAction",
3399 154u16 => "ReloadActionsPerformed",
3400 155u16 => "ReloadLimits",
3401 156u16 => "DevStats",
3402 157u16 => "ReloadStats",
3403 158u16 => "ReloadStatsEntry",
3404 159u16 => "ReloadStatsLimit",
3405 160u16 => "ReloadStatsValue",
3406 161u16 => "RemoteReloadStats",
3407 162u16 => "ReloadActionInfo",
3408 163u16 => "ReloadActionStats",
3409 164u16 => "PortPciSfNumber",
3410 165u16 => "RateType",
3411 166u16 => "RateTxShare",
3412 167u16 => "RateTxMax",
3413 168u16 => "RateNodeName",
3414 169u16 => "RateParentNodeName",
3415 170u16 => "RegionMaxSnapshots",
3416 171u16 => "LinecardIndex",
3417 172u16 => "LinecardState",
3418 173u16 => "LinecardType",
3419 174u16 => "LinecardSupportedTypes",
3420 176u16 => "Selftests",
3421 177u16 => "RateTxPriority",
3422 178u16 => "RateTxWeight",
3423 179u16 => "RegionDirect",
3424 180u16 => "RateTcBws",
3425 181u16 => "HealthReporterBurstPeriod",
3426 183u16 => "ParamResetDefault",
3427 _ => return None,
3428 };
3429 Some(res)
3430 }
3431}
3432#[derive(Clone, Copy, Default)]
3433pub struct IterableDevlink<'a> {
3434 buf: &'a [u8],
3435 pos: usize,
3436 orig_loc: usize,
3437}
3438impl<'a> IterableDevlink<'a> {
3439 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
3440 Self {
3441 buf,
3442 pos: 0,
3443 orig_loc,
3444 }
3445 }
3446 pub fn get_buf(&self) -> &'a [u8] {
3447 self.buf
3448 }
3449}
3450impl<'a> Iterator for IterableDevlink<'a> {
3451 type Item = Result<Devlink<'a>, ErrorContext>;
3452 fn next(&mut self) -> Option<Self::Item> {
3453 let pos = self.pos;
3454 let mut r#type;
3455 loop {
3456 r#type = None;
3457 if self.buf.len() == self.pos {
3458 return None;
3459 }
3460 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
3461 break;
3462 };
3463 r#type = Some(header.r#type);
3464 let res = match header.r#type {
3465 1u16 => Devlink::BusName({
3466 let res = CStr::from_bytes_with_nul(next).ok();
3467 let Some(val) = res else { break };
3468 val
3469 }),
3470 2u16 => Devlink::DevName({
3471 let res = CStr::from_bytes_with_nul(next).ok();
3472 let Some(val) = res else { break };
3473 val
3474 }),
3475 3u16 => Devlink::PortIndex({
3476 let res = parse_u32(next);
3477 let Some(val) = res else { break };
3478 val
3479 }),
3480 4u16 => Devlink::PortType({
3481 let res = parse_u16(next);
3482 let Some(val) = res else { break };
3483 val
3484 }),
3485 5u16 => Devlink::PortDesiredType({
3486 let res = parse_u16(next);
3487 let Some(val) = res else { break };
3488 val
3489 }),
3490 6u16 => Devlink::PortNetdevIfindex({
3491 let res = parse_u32(next);
3492 let Some(val) = res else { break };
3493 val
3494 }),
3495 7u16 => Devlink::PortNetdevName({
3496 let res = CStr::from_bytes_with_nul(next).ok();
3497 let Some(val) = res else { break };
3498 val
3499 }),
3500 8u16 => Devlink::PortIbdevName({
3501 let res = CStr::from_bytes_with_nul(next).ok();
3502 let Some(val) = res else { break };
3503 val
3504 }),
3505 9u16 => Devlink::PortSplitCount({
3506 let res = parse_u32(next);
3507 let Some(val) = res else { break };
3508 val
3509 }),
3510 10u16 => Devlink::PortSplitGroup({
3511 let res = parse_u32(next);
3512 let Some(val) = res else { break };
3513 val
3514 }),
3515 11u16 => Devlink::SbIndex({
3516 let res = parse_u32(next);
3517 let Some(val) = res else { break };
3518 val
3519 }),
3520 12u16 => Devlink::SbSize({
3521 let res = parse_u32(next);
3522 let Some(val) = res else { break };
3523 val
3524 }),
3525 13u16 => Devlink::SbIngressPoolCount({
3526 let res = parse_u16(next);
3527 let Some(val) = res else { break };
3528 val
3529 }),
3530 14u16 => Devlink::SbEgressPoolCount({
3531 let res = parse_u16(next);
3532 let Some(val) = res else { break };
3533 val
3534 }),
3535 15u16 => Devlink::SbIngressTcCount({
3536 let res = parse_u16(next);
3537 let Some(val) = res else { break };
3538 val
3539 }),
3540 16u16 => Devlink::SbEgressTcCount({
3541 let res = parse_u16(next);
3542 let Some(val) = res else { break };
3543 val
3544 }),
3545 17u16 => Devlink::SbPoolIndex({
3546 let res = parse_u16(next);
3547 let Some(val) = res else { break };
3548 val
3549 }),
3550 18u16 => Devlink::SbPoolType({
3551 let res = parse_u8(next);
3552 let Some(val) = res else { break };
3553 val
3554 }),
3555 19u16 => Devlink::SbPoolSize({
3556 let res = parse_u32(next);
3557 let Some(val) = res else { break };
3558 val
3559 }),
3560 20u16 => Devlink::SbPoolThresholdType({
3561 let res = parse_u8(next);
3562 let Some(val) = res else { break };
3563 val
3564 }),
3565 21u16 => Devlink::SbThreshold({
3566 let res = parse_u32(next);
3567 let Some(val) = res else { break };
3568 val
3569 }),
3570 22u16 => Devlink::SbTcIndex({
3571 let res = parse_u16(next);
3572 let Some(val) = res else { break };
3573 val
3574 }),
3575 23u16 => Devlink::SbOccCur({
3576 let res = parse_u32(next);
3577 let Some(val) = res else { break };
3578 val
3579 }),
3580 24u16 => Devlink::SbOccMax({
3581 let res = parse_u32(next);
3582 let Some(val) = res else { break };
3583 val
3584 }),
3585 25u16 => Devlink::EswitchMode({
3586 let res = parse_u16(next);
3587 let Some(val) = res else { break };
3588 val
3589 }),
3590 26u16 => Devlink::EswitchInlineMode({
3591 let res = parse_u8(next);
3592 let Some(val) = res else { break };
3593 val
3594 }),
3595 27u16 => Devlink::DpipeTables({
3596 let res = Some(IterableDlDpipeTables::with_loc(next, self.orig_loc));
3597 let Some(val) = res else { break };
3598 val
3599 }),
3600 28u16 => Devlink::DpipeTable({
3601 let res = Some(IterableDlDpipeTable::with_loc(next, self.orig_loc));
3602 let Some(val) = res else { break };
3603 val
3604 }),
3605 29u16 => Devlink::DpipeTableName({
3606 let res = CStr::from_bytes_with_nul(next).ok();
3607 let Some(val) = res else { break };
3608 val
3609 }),
3610 30u16 => Devlink::DpipeTableSize({
3611 let res = parse_u64(next);
3612 let Some(val) = res else { break };
3613 val
3614 }),
3615 31u16 => Devlink::DpipeTableMatches({
3616 let res = Some(IterableDlDpipeTableMatches::with_loc(next, self.orig_loc));
3617 let Some(val) = res else { break };
3618 val
3619 }),
3620 32u16 => Devlink::DpipeTableActions({
3621 let res = Some(IterableDlDpipeTableActions::with_loc(next, self.orig_loc));
3622 let Some(val) = res else { break };
3623 val
3624 }),
3625 33u16 => Devlink::DpipeTableCountersEnabled({
3626 let res = parse_u8(next);
3627 let Some(val) = res else { break };
3628 val
3629 }),
3630 34u16 => Devlink::DpipeEntries({
3631 let res = Some(IterableDlDpipeEntries::with_loc(next, self.orig_loc));
3632 let Some(val) = res else { break };
3633 val
3634 }),
3635 35u16 => Devlink::DpipeEntry({
3636 let res = Some(IterableDlDpipeEntry::with_loc(next, self.orig_loc));
3637 let Some(val) = res else { break };
3638 val
3639 }),
3640 36u16 => Devlink::DpipeEntryIndex({
3641 let res = parse_u64(next);
3642 let Some(val) = res else { break };
3643 val
3644 }),
3645 37u16 => Devlink::DpipeEntryMatchValues({
3646 let res = Some(IterableDlDpipeEntryMatchValues::with_loc(
3647 next,
3648 self.orig_loc,
3649 ));
3650 let Some(val) = res else { break };
3651 val
3652 }),
3653 38u16 => Devlink::DpipeEntryActionValues({
3654 let res = Some(IterableDlDpipeEntryActionValues::with_loc(
3655 next,
3656 self.orig_loc,
3657 ));
3658 let Some(val) = res else { break };
3659 val
3660 }),
3661 39u16 => Devlink::DpipeEntryCounter({
3662 let res = parse_u64(next);
3663 let Some(val) = res else { break };
3664 val
3665 }),
3666 40u16 => Devlink::DpipeMatch({
3667 let res = Some(IterableDlDpipeMatch::with_loc(next, self.orig_loc));
3668 let Some(val) = res else { break };
3669 val
3670 }),
3671 41u16 => Devlink::DpipeMatchValue({
3672 let res = Some(IterableDlDpipeMatchValue::with_loc(next, self.orig_loc));
3673 let Some(val) = res else { break };
3674 val
3675 }),
3676 42u16 => Devlink::DpipeMatchType({
3677 let res = parse_u32(next);
3678 let Some(val) = res else { break };
3679 val
3680 }),
3681 43u16 => Devlink::DpipeAction({
3682 let res = Some(IterableDlDpipeAction::with_loc(next, self.orig_loc));
3683 let Some(val) = res else { break };
3684 val
3685 }),
3686 44u16 => Devlink::DpipeActionValue({
3687 let res = Some(IterableDlDpipeActionValue::with_loc(next, self.orig_loc));
3688 let Some(val) = res else { break };
3689 val
3690 }),
3691 45u16 => Devlink::DpipeActionType({
3692 let res = parse_u32(next);
3693 let Some(val) = res else { break };
3694 val
3695 }),
3696 46u16 => Devlink::DpipeValue({
3697 let res = Some(next);
3698 let Some(val) = res else { break };
3699 val
3700 }),
3701 47u16 => Devlink::DpipeValueMask({
3702 let res = Some(next);
3703 let Some(val) = res else { break };
3704 val
3705 }),
3706 48u16 => Devlink::DpipeValueMapping({
3707 let res = parse_u32(next);
3708 let Some(val) = res else { break };
3709 val
3710 }),
3711 49u16 => Devlink::DpipeHeaders({
3712 let res = Some(IterableDlDpipeHeaders::with_loc(next, self.orig_loc));
3713 let Some(val) = res else { break };
3714 val
3715 }),
3716 50u16 => Devlink::DpipeHeader({
3717 let res = Some(IterableDlDpipeHeader::with_loc(next, self.orig_loc));
3718 let Some(val) = res else { break };
3719 val
3720 }),
3721 51u16 => Devlink::DpipeHeaderName({
3722 let res = CStr::from_bytes_with_nul(next).ok();
3723 let Some(val) = res else { break };
3724 val
3725 }),
3726 52u16 => Devlink::DpipeHeaderId({
3727 let res = parse_u32(next);
3728 let Some(val) = res else { break };
3729 val
3730 }),
3731 53u16 => Devlink::DpipeHeaderFields({
3732 let res = Some(IterableDlDpipeHeaderFields::with_loc(next, self.orig_loc));
3733 let Some(val) = res else { break };
3734 val
3735 }),
3736 54u16 => Devlink::DpipeHeaderGlobal({
3737 let res = parse_u8(next);
3738 let Some(val) = res else { break };
3739 val
3740 }),
3741 55u16 => Devlink::DpipeHeaderIndex({
3742 let res = parse_u32(next);
3743 let Some(val) = res else { break };
3744 val
3745 }),
3746 56u16 => Devlink::DpipeField({
3747 let res = Some(IterableDlDpipeField::with_loc(next, self.orig_loc));
3748 let Some(val) = res else { break };
3749 val
3750 }),
3751 57u16 => Devlink::DpipeFieldName({
3752 let res = CStr::from_bytes_with_nul(next).ok();
3753 let Some(val) = res else { break };
3754 val
3755 }),
3756 58u16 => Devlink::DpipeFieldId({
3757 let res = parse_u32(next);
3758 let Some(val) = res else { break };
3759 val
3760 }),
3761 59u16 => Devlink::DpipeFieldBitwidth({
3762 let res = parse_u32(next);
3763 let Some(val) = res else { break };
3764 val
3765 }),
3766 60u16 => Devlink::DpipeFieldMappingType({
3767 let res = parse_u32(next);
3768 let Some(val) = res else { break };
3769 val
3770 }),
3771 61u16 => Devlink::Pad({
3772 let res = Some(next);
3773 let Some(val) = res else { break };
3774 val
3775 }),
3776 62u16 => Devlink::EswitchEncapMode({
3777 let res = parse_u8(next);
3778 let Some(val) = res else { break };
3779 val
3780 }),
3781 63u16 => Devlink::ResourceList({
3782 let res = Some(IterableDlResourceList::with_loc(next, self.orig_loc));
3783 let Some(val) = res else { break };
3784 val
3785 }),
3786 64u16 => Devlink::Resource({
3787 let res = Some(IterableDlResource::with_loc(next, self.orig_loc));
3788 let Some(val) = res else { break };
3789 val
3790 }),
3791 65u16 => Devlink::ResourceName({
3792 let res = CStr::from_bytes_with_nul(next).ok();
3793 let Some(val) = res else { break };
3794 val
3795 }),
3796 66u16 => Devlink::ResourceId({
3797 let res = parse_u64(next);
3798 let Some(val) = res else { break };
3799 val
3800 }),
3801 67u16 => Devlink::ResourceSize({
3802 let res = parse_u64(next);
3803 let Some(val) = res else { break };
3804 val
3805 }),
3806 68u16 => Devlink::ResourceSizeNew({
3807 let res = parse_u64(next);
3808 let Some(val) = res else { break };
3809 val
3810 }),
3811 69u16 => Devlink::ResourceSizeValid({
3812 let res = parse_u8(next);
3813 let Some(val) = res else { break };
3814 val
3815 }),
3816 70u16 => Devlink::ResourceSizeMin({
3817 let res = parse_u64(next);
3818 let Some(val) = res else { break };
3819 val
3820 }),
3821 71u16 => Devlink::ResourceSizeMax({
3822 let res = parse_u64(next);
3823 let Some(val) = res else { break };
3824 val
3825 }),
3826 72u16 => Devlink::ResourceSizeGran({
3827 let res = parse_u64(next);
3828 let Some(val) = res else { break };
3829 val
3830 }),
3831 73u16 => Devlink::ResourceUnit({
3832 let res = parse_u8(next);
3833 let Some(val) = res else { break };
3834 val
3835 }),
3836 74u16 => Devlink::ResourceOcc({
3837 let res = parse_u64(next);
3838 let Some(val) = res else { break };
3839 val
3840 }),
3841 75u16 => Devlink::DpipeTableResourceId({
3842 let res = parse_u64(next);
3843 let Some(val) = res else { break };
3844 val
3845 }),
3846 76u16 => Devlink::DpipeTableResourceUnits({
3847 let res = parse_u64(next);
3848 let Some(val) = res else { break };
3849 val
3850 }),
3851 77u16 => Devlink::PortFlavour({
3852 let res = parse_u16(next);
3853 let Some(val) = res else { break };
3854 val
3855 }),
3856 78u16 => Devlink::PortNumber({
3857 let res = parse_u32(next);
3858 let Some(val) = res else { break };
3859 val
3860 }),
3861 79u16 => Devlink::PortSplitSubportNumber({
3862 let res = parse_u32(next);
3863 let Some(val) = res else { break };
3864 val
3865 }),
3866 80u16 => Devlink::Param({
3867 let res = Some(IterableDlParam::with_loc(next, self.orig_loc));
3868 let Some(val) = res else { break };
3869 val
3870 }),
3871 81u16 => Devlink::ParamName({
3872 let res = CStr::from_bytes_with_nul(next).ok();
3873 let Some(val) = res else { break };
3874 val
3875 }),
3876 82u16 => Devlink::ParamGeneric(()),
3877 83u16 => Devlink::ParamType({
3878 let res = parse_u8(next);
3879 let Some(val) = res else { break };
3880 val
3881 }),
3882 87u16 => Devlink::ParamValueCmode({
3883 let res = parse_u8(next);
3884 let Some(val) = res else { break };
3885 val
3886 }),
3887 88u16 => Devlink::RegionName({
3888 let res = CStr::from_bytes_with_nul(next).ok();
3889 let Some(val) = res else { break };
3890 val
3891 }),
3892 89u16 => Devlink::RegionSize({
3893 let res = parse_u64(next);
3894 let Some(val) = res else { break };
3895 val
3896 }),
3897 90u16 => Devlink::RegionSnapshots({
3898 let res = Some(IterableDlRegionSnapshots::with_loc(next, self.orig_loc));
3899 let Some(val) = res else { break };
3900 val
3901 }),
3902 91u16 => Devlink::RegionSnapshot({
3903 let res = Some(IterableDlRegionSnapshot::with_loc(next, self.orig_loc));
3904 let Some(val) = res else { break };
3905 val
3906 }),
3907 92u16 => Devlink::RegionSnapshotId({
3908 let res = parse_u32(next);
3909 let Some(val) = res else { break };
3910 val
3911 }),
3912 93u16 => Devlink::RegionChunks({
3913 let res = Some(IterableDlRegionChunks::with_loc(next, self.orig_loc));
3914 let Some(val) = res else { break };
3915 val
3916 }),
3917 94u16 => Devlink::RegionChunk({
3918 let res = Some(IterableDlRegionChunk::with_loc(next, self.orig_loc));
3919 let Some(val) = res else { break };
3920 val
3921 }),
3922 95u16 => Devlink::RegionChunkData({
3923 let res = Some(next);
3924 let Some(val) = res else { break };
3925 val
3926 }),
3927 96u16 => Devlink::RegionChunkAddr({
3928 let res = parse_u64(next);
3929 let Some(val) = res else { break };
3930 val
3931 }),
3932 97u16 => Devlink::RegionChunkLen({
3933 let res = parse_u64(next);
3934 let Some(val) = res else { break };
3935 val
3936 }),
3937 98u16 => Devlink::InfoDriverName({
3938 let res = CStr::from_bytes_with_nul(next).ok();
3939 let Some(val) = res else { break };
3940 val
3941 }),
3942 99u16 => Devlink::InfoSerialNumber({
3943 let res = CStr::from_bytes_with_nul(next).ok();
3944 let Some(val) = res else { break };
3945 val
3946 }),
3947 100u16 => Devlink::InfoVersionFixed({
3948 let res = Some(IterableDlInfoVersion::with_loc(next, self.orig_loc));
3949 let Some(val) = res else { break };
3950 val
3951 }),
3952 101u16 => Devlink::InfoVersionRunning({
3953 let res = Some(IterableDlInfoVersion::with_loc(next, self.orig_loc));
3954 let Some(val) = res else { break };
3955 val
3956 }),
3957 102u16 => Devlink::InfoVersionStored({
3958 let res = Some(IterableDlInfoVersion::with_loc(next, self.orig_loc));
3959 let Some(val) = res else { break };
3960 val
3961 }),
3962 103u16 => Devlink::InfoVersionName({
3963 let res = CStr::from_bytes_with_nul(next).ok();
3964 let Some(val) = res else { break };
3965 val
3966 }),
3967 104u16 => Devlink::InfoVersionValue({
3968 let res = CStr::from_bytes_with_nul(next).ok();
3969 let Some(val) = res else { break };
3970 val
3971 }),
3972 105u16 => Devlink::SbPoolCellSize({
3973 let res = parse_u32(next);
3974 let Some(val) = res else { break };
3975 val
3976 }),
3977 106u16 => Devlink::Fmsg({
3978 let res = Some(IterableDlFmsg::with_loc(next, self.orig_loc));
3979 let Some(val) = res else { break };
3980 val
3981 }),
3982 107u16 => Devlink::FmsgObjNestStart(()),
3983 108u16 => Devlink::FmsgPairNestStart(()),
3984 109u16 => Devlink::FmsgArrNestStart(()),
3985 110u16 => Devlink::FmsgNestEnd(()),
3986 111u16 => Devlink::FmsgObjName({
3987 let res = CStr::from_bytes_with_nul(next).ok();
3988 let Some(val) = res else { break };
3989 val
3990 }),
3991 112u16 => Devlink::FmsgObjValueType({
3992 let res = parse_u8(next);
3993 let Some(val) = res else { break };
3994 val
3995 }),
3996 114u16 => Devlink::HealthReporter({
3997 let res = Some(IterableDlHealthReporter::with_loc(next, self.orig_loc));
3998 let Some(val) = res else { break };
3999 val
4000 }),
4001 115u16 => Devlink::HealthReporterName({
4002 let res = CStr::from_bytes_with_nul(next).ok();
4003 let Some(val) = res else { break };
4004 val
4005 }),
4006 116u16 => Devlink::HealthReporterState({
4007 let res = parse_u8(next);
4008 let Some(val) = res else { break };
4009 val
4010 }),
4011 117u16 => Devlink::HealthReporterErrCount({
4012 let res = parse_u64(next);
4013 let Some(val) = res else { break };
4014 val
4015 }),
4016 118u16 => Devlink::HealthReporterRecoverCount({
4017 let res = parse_u64(next);
4018 let Some(val) = res else { break };
4019 val
4020 }),
4021 119u16 => Devlink::HealthReporterDumpTs({
4022 let res = parse_u64(next);
4023 let Some(val) = res else { break };
4024 val
4025 }),
4026 120u16 => Devlink::HealthReporterGracefulPeriod({
4027 let res = parse_u64(next);
4028 let Some(val) = res else { break };
4029 val
4030 }),
4031 121u16 => Devlink::HealthReporterAutoRecover({
4032 let res = parse_u8(next);
4033 let Some(val) = res else { break };
4034 val
4035 }),
4036 122u16 => Devlink::FlashUpdateFileName({
4037 let res = CStr::from_bytes_with_nul(next).ok();
4038 let Some(val) = res else { break };
4039 val
4040 }),
4041 123u16 => Devlink::FlashUpdateComponent({
4042 let res = CStr::from_bytes_with_nul(next).ok();
4043 let Some(val) = res else { break };
4044 val
4045 }),
4046 124u16 => Devlink::FlashUpdateStatusMsg({
4047 let res = CStr::from_bytes_with_nul(next).ok();
4048 let Some(val) = res else { break };
4049 val
4050 }),
4051 125u16 => Devlink::FlashUpdateStatusDone({
4052 let res = parse_u64(next);
4053 let Some(val) = res else { break };
4054 val
4055 }),
4056 126u16 => Devlink::FlashUpdateStatusTotal({
4057 let res = parse_u64(next);
4058 let Some(val) = res else { break };
4059 val
4060 }),
4061 127u16 => Devlink::PortPciPfNumber({
4062 let res = parse_u16(next);
4063 let Some(val) = res else { break };
4064 val
4065 }),
4066 128u16 => Devlink::PortPciVfNumber({
4067 let res = parse_u16(next);
4068 let Some(val) = res else { break };
4069 val
4070 }),
4071 129u16 => Devlink::Stats({
4072 let res = Some(IterableDlAttrStats::with_loc(next, self.orig_loc));
4073 let Some(val) = res else { break };
4074 val
4075 }),
4076 130u16 => Devlink::TrapName({
4077 let res = CStr::from_bytes_with_nul(next).ok();
4078 let Some(val) = res else { break };
4079 val
4080 }),
4081 131u16 => Devlink::TrapAction({
4082 let res = parse_u8(next);
4083 let Some(val) = res else { break };
4084 val
4085 }),
4086 132u16 => Devlink::TrapType({
4087 let res = parse_u8(next);
4088 let Some(val) = res else { break };
4089 val
4090 }),
4091 133u16 => Devlink::TrapGeneric(()),
4092 134u16 => Devlink::TrapMetadata({
4093 let res = Some(IterableDlTrapMetadata::with_loc(next, self.orig_loc));
4094 let Some(val) = res else { break };
4095 val
4096 }),
4097 135u16 => Devlink::TrapGroupName({
4098 let res = CStr::from_bytes_with_nul(next).ok();
4099 let Some(val) = res else { break };
4100 val
4101 }),
4102 136u16 => Devlink::ReloadFailed({
4103 let res = parse_u8(next);
4104 let Some(val) = res else { break };
4105 val
4106 }),
4107 137u16 => Devlink::HealthReporterDumpTsNs({
4108 let res = parse_u64(next);
4109 let Some(val) = res else { break };
4110 val
4111 }),
4112 138u16 => Devlink::NetnsFd({
4113 let res = parse_u32(next);
4114 let Some(val) = res else { break };
4115 val
4116 }),
4117 139u16 => Devlink::NetnsPid({
4118 let res = parse_u32(next);
4119 let Some(val) = res else { break };
4120 val
4121 }),
4122 140u16 => Devlink::NetnsId({
4123 let res = parse_u32(next);
4124 let Some(val) = res else { break };
4125 val
4126 }),
4127 141u16 => Devlink::HealthReporterAutoDump({
4128 let res = parse_u8(next);
4129 let Some(val) = res else { break };
4130 val
4131 }),
4132 142u16 => Devlink::TrapPolicerId({
4133 let res = parse_u32(next);
4134 let Some(val) = res else { break };
4135 val
4136 }),
4137 143u16 => Devlink::TrapPolicerRate({
4138 let res = parse_u64(next);
4139 let Some(val) = res else { break };
4140 val
4141 }),
4142 144u16 => Devlink::TrapPolicerBurst({
4143 let res = parse_u64(next);
4144 let Some(val) = res else { break };
4145 val
4146 }),
4147 145u16 => Devlink::PortFunction({
4148 let res = Some(IterableDlPortFunction::with_loc(next, self.orig_loc));
4149 let Some(val) = res else { break };
4150 val
4151 }),
4152 146u16 => Devlink::InfoBoardSerialNumber({
4153 let res = CStr::from_bytes_with_nul(next).ok();
4154 let Some(val) = res else { break };
4155 val
4156 }),
4157 147u16 => Devlink::PortLanes({
4158 let res = parse_u32(next);
4159 let Some(val) = res else { break };
4160 val
4161 }),
4162 148u16 => Devlink::PortSplittable({
4163 let res = parse_u8(next);
4164 let Some(val) = res else { break };
4165 val
4166 }),
4167 149u16 => Devlink::PortExternal({
4168 let res = parse_u8(next);
4169 let Some(val) = res else { break };
4170 val
4171 }),
4172 150u16 => Devlink::PortControllerNumber({
4173 let res = parse_u32(next);
4174 let Some(val) = res else { break };
4175 val
4176 }),
4177 151u16 => Devlink::FlashUpdateStatusTimeout({
4178 let res = parse_u64(next);
4179 let Some(val) = res else { break };
4180 val
4181 }),
4182 152u16 => Devlink::FlashUpdateOverwriteMask({
4183 let res = BuiltinBitfield32::new_from_slice(next);
4184 let Some(val) = res else { break };
4185 val
4186 }),
4187 153u16 => Devlink::ReloadAction({
4188 let res = parse_u8(next);
4189 let Some(val) = res else { break };
4190 val
4191 }),
4192 154u16 => Devlink::ReloadActionsPerformed({
4193 let res = BuiltinBitfield32::new_from_slice(next);
4194 let Some(val) = res else { break };
4195 val
4196 }),
4197 155u16 => Devlink::ReloadLimits({
4198 let res = BuiltinBitfield32::new_from_slice(next);
4199 let Some(val) = res else { break };
4200 val
4201 }),
4202 156u16 => Devlink::DevStats({
4203 let res = Some(IterableDlDevStats::with_loc(next, self.orig_loc));
4204 let Some(val) = res else { break };
4205 val
4206 }),
4207 157u16 => Devlink::ReloadStats({
4208 let res = Some(IterableDlReloadStats::with_loc(next, self.orig_loc));
4209 let Some(val) = res else { break };
4210 val
4211 }),
4212 158u16 => Devlink::ReloadStatsEntry({
4213 let res = Some(IterableDlReloadStatsEntry::with_loc(next, self.orig_loc));
4214 let Some(val) = res else { break };
4215 val
4216 }),
4217 159u16 => Devlink::ReloadStatsLimit({
4218 let res = parse_u8(next);
4219 let Some(val) = res else { break };
4220 val
4221 }),
4222 160u16 => Devlink::ReloadStatsValue({
4223 let res = parse_u32(next);
4224 let Some(val) = res else { break };
4225 val
4226 }),
4227 161u16 => Devlink::RemoteReloadStats({
4228 let res = Some(IterableDlReloadStats::with_loc(next, self.orig_loc));
4229 let Some(val) = res else { break };
4230 val
4231 }),
4232 162u16 => Devlink::ReloadActionInfo({
4233 let res = Some(IterableDlReloadActInfo::with_loc(next, self.orig_loc));
4234 let Some(val) = res else { break };
4235 val
4236 }),
4237 163u16 => Devlink::ReloadActionStats({
4238 let res = Some(IterableDlReloadActStats::with_loc(next, self.orig_loc));
4239 let Some(val) = res else { break };
4240 val
4241 }),
4242 164u16 => Devlink::PortPciSfNumber({
4243 let res = parse_u32(next);
4244 let Some(val) = res else { break };
4245 val
4246 }),
4247 165u16 => Devlink::RateType({
4248 let res = parse_u16(next);
4249 let Some(val) = res else { break };
4250 val
4251 }),
4252 166u16 => Devlink::RateTxShare({
4253 let res = parse_u64(next);
4254 let Some(val) = res else { break };
4255 val
4256 }),
4257 167u16 => Devlink::RateTxMax({
4258 let res = parse_u64(next);
4259 let Some(val) = res else { break };
4260 val
4261 }),
4262 168u16 => Devlink::RateNodeName({
4263 let res = CStr::from_bytes_with_nul(next).ok();
4264 let Some(val) = res else { break };
4265 val
4266 }),
4267 169u16 => Devlink::RateParentNodeName({
4268 let res = CStr::from_bytes_with_nul(next).ok();
4269 let Some(val) = res else { break };
4270 val
4271 }),
4272 170u16 => Devlink::RegionMaxSnapshots({
4273 let res = parse_u32(next);
4274 let Some(val) = res else { break };
4275 val
4276 }),
4277 171u16 => Devlink::LinecardIndex({
4278 let res = parse_u32(next);
4279 let Some(val) = res else { break };
4280 val
4281 }),
4282 172u16 => Devlink::LinecardState({
4283 let res = parse_u8(next);
4284 let Some(val) = res else { break };
4285 val
4286 }),
4287 173u16 => Devlink::LinecardType({
4288 let res = CStr::from_bytes_with_nul(next).ok();
4289 let Some(val) = res else { break };
4290 val
4291 }),
4292 174u16 => Devlink::LinecardSupportedTypes({
4293 let res = Some(IterableDlLinecardSupportedTypes::with_loc(
4294 next,
4295 self.orig_loc,
4296 ));
4297 let Some(val) = res else { break };
4298 val
4299 }),
4300 176u16 => Devlink::Selftests({
4301 let res = Some(IterableDlSelftestId::with_loc(next, self.orig_loc));
4302 let Some(val) = res else { break };
4303 val
4304 }),
4305 177u16 => Devlink::RateTxPriority({
4306 let res = parse_u32(next);
4307 let Some(val) = res else { break };
4308 val
4309 }),
4310 178u16 => Devlink::RateTxWeight({
4311 let res = parse_u32(next);
4312 let Some(val) = res else { break };
4313 val
4314 }),
4315 179u16 => Devlink::RegionDirect(()),
4316 180u16 => Devlink::RateTcBws({
4317 let res = Some(IterableDlRateTcBws::with_loc(next, self.orig_loc));
4318 let Some(val) = res else { break };
4319 val
4320 }),
4321 181u16 => Devlink::HealthReporterBurstPeriod({
4322 let res = parse_u64(next);
4323 let Some(val) = res else { break };
4324 val
4325 }),
4326 183u16 => Devlink::ParamResetDefault(()),
4327 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4328 n => continue,
4329 };
4330 return Some(Ok(res));
4331 }
4332 Some(Err(ErrorContext::new(
4333 "Devlink",
4334 r#type.and_then(|t| Devlink::attr_from_type(t)),
4335 self.orig_loc,
4336 self.buf.as_ptr().wrapping_add(pos) as usize,
4337 )))
4338 }
4339}
4340impl<'a> std::fmt::Debug for IterableDevlink<'_> {
4341 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4342 let mut fmt = f.debug_struct("Devlink");
4343 for attr in self.clone() {
4344 let attr = match attr {
4345 Ok(a) => a,
4346 Err(err) => {
4347 fmt.finish()?;
4348 f.write_str("Err(")?;
4349 err.fmt(f)?;
4350 return f.write_str(")");
4351 }
4352 };
4353 match attr {
4354 Devlink::BusName(val) => fmt.field("BusName", &val),
4355 Devlink::DevName(val) => fmt.field("DevName", &val),
4356 Devlink::PortIndex(val) => fmt.field("PortIndex", &val),
4357 Devlink::PortType(val) => {
4358 fmt.field("PortType", &FormatEnum(val.into(), PortType::from_value))
4359 }
4360 Devlink::PortDesiredType(val) => fmt.field("PortDesiredType", &val),
4361 Devlink::PortNetdevIfindex(val) => fmt.field("PortNetdevIfindex", &val),
4362 Devlink::PortNetdevName(val) => fmt.field("PortNetdevName", &val),
4363 Devlink::PortIbdevName(val) => fmt.field("PortIbdevName", &val),
4364 Devlink::PortSplitCount(val) => fmt.field("PortSplitCount", &val),
4365 Devlink::PortSplitGroup(val) => fmt.field("PortSplitGroup", &val),
4366 Devlink::SbIndex(val) => fmt.field("SbIndex", &val),
4367 Devlink::SbSize(val) => fmt.field("SbSize", &val),
4368 Devlink::SbIngressPoolCount(val) => fmt.field("SbIngressPoolCount", &val),
4369 Devlink::SbEgressPoolCount(val) => fmt.field("SbEgressPoolCount", &val),
4370 Devlink::SbIngressTcCount(val) => fmt.field("SbIngressTcCount", &val),
4371 Devlink::SbEgressTcCount(val) => fmt.field("SbEgressTcCount", &val),
4372 Devlink::SbPoolIndex(val) => fmt.field("SbPoolIndex", &val),
4373 Devlink::SbPoolType(val) => fmt.field(
4374 "SbPoolType",
4375 &FormatEnum(val.into(), SbPoolType::from_value),
4376 ),
4377 Devlink::SbPoolSize(val) => fmt.field("SbPoolSize", &val),
4378 Devlink::SbPoolThresholdType(val) => fmt.field(
4379 "SbPoolThresholdType",
4380 &FormatEnum(val.into(), SbThresholdType::from_value),
4381 ),
4382 Devlink::SbThreshold(val) => fmt.field("SbThreshold", &val),
4383 Devlink::SbTcIndex(val) => fmt.field("SbTcIndex", &val),
4384 Devlink::SbOccCur(val) => fmt.field("SbOccCur", &val),
4385 Devlink::SbOccMax(val) => fmt.field("SbOccMax", &val),
4386 Devlink::EswitchMode(val) => fmt.field(
4387 "EswitchMode",
4388 &FormatEnum(val.into(), EswitchMode::from_value),
4389 ),
4390 Devlink::EswitchInlineMode(val) => fmt.field(
4391 "EswitchInlineMode",
4392 &FormatEnum(val.into(), EswitchInlineMode::from_value),
4393 ),
4394 Devlink::DpipeTables(val) => fmt.field("DpipeTables", &val),
4395 Devlink::DpipeTable(val) => fmt.field("DpipeTable", &val),
4396 Devlink::DpipeTableName(val) => fmt.field("DpipeTableName", &val),
4397 Devlink::DpipeTableSize(val) => fmt.field("DpipeTableSize", &val),
4398 Devlink::DpipeTableMatches(val) => fmt.field("DpipeTableMatches", &val),
4399 Devlink::DpipeTableActions(val) => fmt.field("DpipeTableActions", &val),
4400 Devlink::DpipeTableCountersEnabled(val) => {
4401 fmt.field("DpipeTableCountersEnabled", &val)
4402 }
4403 Devlink::DpipeEntries(val) => fmt.field("DpipeEntries", &val),
4404 Devlink::DpipeEntry(val) => fmt.field("DpipeEntry", &val),
4405 Devlink::DpipeEntryIndex(val) => fmt.field("DpipeEntryIndex", &val),
4406 Devlink::DpipeEntryMatchValues(val) => fmt.field("DpipeEntryMatchValues", &val),
4407 Devlink::DpipeEntryActionValues(val) => fmt.field("DpipeEntryActionValues", &val),
4408 Devlink::DpipeEntryCounter(val) => fmt.field("DpipeEntryCounter", &val),
4409 Devlink::DpipeMatch(val) => fmt.field("DpipeMatch", &val),
4410 Devlink::DpipeMatchValue(val) => fmt.field("DpipeMatchValue", &val),
4411 Devlink::DpipeMatchType(val) => fmt.field(
4412 "DpipeMatchType",
4413 &FormatEnum(val.into(), DpipeMatchType::from_value),
4414 ),
4415 Devlink::DpipeAction(val) => fmt.field("DpipeAction", &val),
4416 Devlink::DpipeActionValue(val) => fmt.field("DpipeActionValue", &val),
4417 Devlink::DpipeActionType(val) => fmt.field(
4418 "DpipeActionType",
4419 &FormatEnum(val.into(), DpipeActionType::from_value),
4420 ),
4421 Devlink::DpipeValue(val) => fmt.field("DpipeValue", &val),
4422 Devlink::DpipeValueMask(val) => fmt.field("DpipeValueMask", &val),
4423 Devlink::DpipeValueMapping(val) => fmt.field("DpipeValueMapping", &val),
4424 Devlink::DpipeHeaders(val) => fmt.field("DpipeHeaders", &val),
4425 Devlink::DpipeHeader(val) => fmt.field("DpipeHeader", &val),
4426 Devlink::DpipeHeaderName(val) => fmt.field("DpipeHeaderName", &val),
4427 Devlink::DpipeHeaderId(val) => fmt.field(
4428 "DpipeHeaderId",
4429 &FormatEnum(val.into(), DpipeHeaderId::from_value),
4430 ),
4431 Devlink::DpipeHeaderFields(val) => fmt.field("DpipeHeaderFields", &val),
4432 Devlink::DpipeHeaderGlobal(val) => fmt.field("DpipeHeaderGlobal", &val),
4433 Devlink::DpipeHeaderIndex(val) => fmt.field("DpipeHeaderIndex", &val),
4434 Devlink::DpipeField(val) => fmt.field("DpipeField", &val),
4435 Devlink::DpipeFieldName(val) => fmt.field("DpipeFieldName", &val),
4436 Devlink::DpipeFieldId(val) => fmt.field("DpipeFieldId", &val),
4437 Devlink::DpipeFieldBitwidth(val) => fmt.field("DpipeFieldBitwidth", &val),
4438 Devlink::DpipeFieldMappingType(val) => fmt.field(
4439 "DpipeFieldMappingType",
4440 &FormatEnum(val.into(), DpipeFieldMappingType::from_value),
4441 ),
4442 Devlink::Pad(val) => fmt.field("Pad", &val),
4443 Devlink::EswitchEncapMode(val) => fmt.field(
4444 "EswitchEncapMode",
4445 &FormatEnum(val.into(), EswitchEncapMode::from_value),
4446 ),
4447 Devlink::ResourceList(val) => fmt.field("ResourceList", &val),
4448 Devlink::Resource(val) => fmt.field("Resource", &val),
4449 Devlink::ResourceName(val) => fmt.field("ResourceName", &val),
4450 Devlink::ResourceId(val) => fmt.field("ResourceId", &val),
4451 Devlink::ResourceSize(val) => fmt.field("ResourceSize", &val),
4452 Devlink::ResourceSizeNew(val) => fmt.field("ResourceSizeNew", &val),
4453 Devlink::ResourceSizeValid(val) => fmt.field("ResourceSizeValid", &val),
4454 Devlink::ResourceSizeMin(val) => fmt.field("ResourceSizeMin", &val),
4455 Devlink::ResourceSizeMax(val) => fmt.field("ResourceSizeMax", &val),
4456 Devlink::ResourceSizeGran(val) => fmt.field("ResourceSizeGran", &val),
4457 Devlink::ResourceUnit(val) => fmt.field(
4458 "ResourceUnit",
4459 &FormatEnum(val.into(), ResourceUnit::from_value),
4460 ),
4461 Devlink::ResourceOcc(val) => fmt.field("ResourceOcc", &val),
4462 Devlink::DpipeTableResourceId(val) => fmt.field("DpipeTableResourceId", &val),
4463 Devlink::DpipeTableResourceUnits(val) => fmt.field("DpipeTableResourceUnits", &val),
4464 Devlink::PortFlavour(val) => fmt.field(
4465 "PortFlavour",
4466 &FormatEnum(val.into(), PortFlavour::from_value),
4467 ),
4468 Devlink::PortNumber(val) => fmt.field("PortNumber", &val),
4469 Devlink::PortSplitSubportNumber(val) => fmt.field("PortSplitSubportNumber", &val),
4470 Devlink::Param(val) => fmt.field("Param", &val),
4471 Devlink::ParamName(val) => fmt.field("ParamName", &val),
4472 Devlink::ParamGeneric(val) => fmt.field("ParamGeneric", &val),
4473 Devlink::ParamType(val) => fmt.field(
4474 "ParamType",
4475 &FormatEnum(val.into(), VarAttrType::from_value),
4476 ),
4477 Devlink::ParamValueCmode(val) => fmt.field(
4478 "ParamValueCmode",
4479 &FormatEnum(val.into(), ParamCmode::from_value),
4480 ),
4481 Devlink::RegionName(val) => fmt.field("RegionName", &val),
4482 Devlink::RegionSize(val) => fmt.field("RegionSize", &val),
4483 Devlink::RegionSnapshots(val) => fmt.field("RegionSnapshots", &val),
4484 Devlink::RegionSnapshot(val) => fmt.field("RegionSnapshot", &val),
4485 Devlink::RegionSnapshotId(val) => fmt.field("RegionSnapshotId", &val),
4486 Devlink::RegionChunks(val) => fmt.field("RegionChunks", &val),
4487 Devlink::RegionChunk(val) => fmt.field("RegionChunk", &val),
4488 Devlink::RegionChunkData(val) => fmt.field("RegionChunkData", &val),
4489 Devlink::RegionChunkAddr(val) => fmt.field("RegionChunkAddr", &val),
4490 Devlink::RegionChunkLen(val) => fmt.field("RegionChunkLen", &val),
4491 Devlink::InfoDriverName(val) => fmt.field("InfoDriverName", &val),
4492 Devlink::InfoSerialNumber(val) => fmt.field("InfoSerialNumber", &val),
4493 Devlink::InfoVersionFixed(val) => fmt.field("InfoVersionFixed", &val),
4494 Devlink::InfoVersionRunning(val) => fmt.field("InfoVersionRunning", &val),
4495 Devlink::InfoVersionStored(val) => fmt.field("InfoVersionStored", &val),
4496 Devlink::InfoVersionName(val) => fmt.field("InfoVersionName", &val),
4497 Devlink::InfoVersionValue(val) => fmt.field("InfoVersionValue", &val),
4498 Devlink::SbPoolCellSize(val) => fmt.field("SbPoolCellSize", &val),
4499 Devlink::Fmsg(val) => fmt.field("Fmsg", &val),
4500 Devlink::FmsgObjNestStart(val) => fmt.field("FmsgObjNestStart", &val),
4501 Devlink::FmsgPairNestStart(val) => fmt.field("FmsgPairNestStart", &val),
4502 Devlink::FmsgArrNestStart(val) => fmt.field("FmsgArrNestStart", &val),
4503 Devlink::FmsgNestEnd(val) => fmt.field("FmsgNestEnd", &val),
4504 Devlink::FmsgObjName(val) => fmt.field("FmsgObjName", &val),
4505 Devlink::FmsgObjValueType(val) => fmt.field(
4506 "FmsgObjValueType",
4507 &FormatEnum(val.into(), VarAttrType::from_value),
4508 ),
4509 Devlink::HealthReporter(val) => fmt.field("HealthReporter", &val),
4510 Devlink::HealthReporterName(val) => fmt.field("HealthReporterName", &val),
4511 Devlink::HealthReporterState(val) => fmt.field("HealthReporterState", &val),
4512 Devlink::HealthReporterErrCount(val) => fmt.field("HealthReporterErrCount", &val),
4513 Devlink::HealthReporterRecoverCount(val) => {
4514 fmt.field("HealthReporterRecoverCount", &val)
4515 }
4516 Devlink::HealthReporterDumpTs(val) => fmt.field("HealthReporterDumpTs", &val),
4517 Devlink::HealthReporterGracefulPeriod(val) => {
4518 fmt.field("HealthReporterGracefulPeriod", &val)
4519 }
4520 Devlink::HealthReporterAutoRecover(val) => {
4521 fmt.field("HealthReporterAutoRecover", &val)
4522 }
4523 Devlink::FlashUpdateFileName(val) => fmt.field("FlashUpdateFileName", &val),
4524 Devlink::FlashUpdateComponent(val) => fmt.field("FlashUpdateComponent", &val),
4525 Devlink::FlashUpdateStatusMsg(val) => fmt.field("FlashUpdateStatusMsg", &val),
4526 Devlink::FlashUpdateStatusDone(val) => fmt.field("FlashUpdateStatusDone", &val),
4527 Devlink::FlashUpdateStatusTotal(val) => fmt.field("FlashUpdateStatusTotal", &val),
4528 Devlink::PortPciPfNumber(val) => fmt.field("PortPciPfNumber", &val),
4529 Devlink::PortPciVfNumber(val) => fmt.field("PortPciVfNumber", &val),
4530 Devlink::Stats(val) => fmt.field("Stats", &val),
4531 Devlink::TrapName(val) => fmt.field("TrapName", &val),
4532 Devlink::TrapAction(val) => fmt.field(
4533 "TrapAction",
4534 &FormatEnum(val.into(), TrapAction::from_value),
4535 ),
4536 Devlink::TrapType(val) => {
4537 fmt.field("TrapType", &FormatEnum(val.into(), TrapType::from_value))
4538 }
4539 Devlink::TrapGeneric(val) => fmt.field("TrapGeneric", &val),
4540 Devlink::TrapMetadata(val) => fmt.field("TrapMetadata", &val),
4541 Devlink::TrapGroupName(val) => fmt.field("TrapGroupName", &val),
4542 Devlink::ReloadFailed(val) => fmt.field("ReloadFailed", &val),
4543 Devlink::HealthReporterDumpTsNs(val) => fmt.field("HealthReporterDumpTsNs", &val),
4544 Devlink::NetnsFd(val) => fmt.field("NetnsFd", &val),
4545 Devlink::NetnsPid(val) => fmt.field("NetnsPid", &val),
4546 Devlink::NetnsId(val) => fmt.field("NetnsId", &val),
4547 Devlink::HealthReporterAutoDump(val) => fmt.field("HealthReporterAutoDump", &val),
4548 Devlink::TrapPolicerId(val) => fmt.field("TrapPolicerId", &val),
4549 Devlink::TrapPolicerRate(val) => fmt.field("TrapPolicerRate", &val),
4550 Devlink::TrapPolicerBurst(val) => fmt.field("TrapPolicerBurst", &val),
4551 Devlink::PortFunction(val) => fmt.field("PortFunction", &val),
4552 Devlink::InfoBoardSerialNumber(val) => fmt.field("InfoBoardSerialNumber", &val),
4553 Devlink::PortLanes(val) => fmt.field("PortLanes", &val),
4554 Devlink::PortSplittable(val) => fmt.field("PortSplittable", &val),
4555 Devlink::PortExternal(val) => fmt.field("PortExternal", &val),
4556 Devlink::PortControllerNumber(val) => fmt.field("PortControllerNumber", &val),
4557 Devlink::FlashUpdateStatusTimeout(val) => {
4558 fmt.field("FlashUpdateStatusTimeout", &val)
4559 }
4560 Devlink::FlashUpdateOverwriteMask(val) => fmt.field(
4561 "FlashUpdateOverwriteMask",
4562 &FormatFlags(val.value.into(), |val| {
4563 FlashOverwrite::from_value(val.trailing_zeros().into())
4564 }),
4565 ),
4566 Devlink::ReloadAction(val) => fmt.field(
4567 "ReloadAction",
4568 &FormatEnum(val.into(), ReloadAction::from_value),
4569 ),
4570 Devlink::ReloadActionsPerformed(val) => fmt.field(
4571 "ReloadActionsPerformed",
4572 &FormatFlags(val.value.into(), |val| {
4573 ReloadAction::from_value(val.trailing_zeros().into())
4574 }),
4575 ),
4576 Devlink::ReloadLimits(val) => fmt.field(
4577 "ReloadLimits",
4578 &FormatFlags(val.value.into(), |val| {
4579 ReloadAction::from_value(val.trailing_zeros().into())
4580 }),
4581 ),
4582 Devlink::DevStats(val) => fmt.field("DevStats", &val),
4583 Devlink::ReloadStats(val) => fmt.field("ReloadStats", &val),
4584 Devlink::ReloadStatsEntry(val) => fmt.field("ReloadStatsEntry", &val),
4585 Devlink::ReloadStatsLimit(val) => fmt.field("ReloadStatsLimit", &val),
4586 Devlink::ReloadStatsValue(val) => fmt.field("ReloadStatsValue", &val),
4587 Devlink::RemoteReloadStats(val) => fmt.field("RemoteReloadStats", &val),
4588 Devlink::ReloadActionInfo(val) => fmt.field("ReloadActionInfo", &val),
4589 Devlink::ReloadActionStats(val) => fmt.field("ReloadActionStats", &val),
4590 Devlink::PortPciSfNumber(val) => fmt.field("PortPciSfNumber", &val),
4591 Devlink::RateType(val) => {
4592 fmt.field("RateType", &FormatEnum(val.into(), RateType::from_value))
4593 }
4594 Devlink::RateTxShare(val) => fmt.field("RateTxShare", &val),
4595 Devlink::RateTxMax(val) => fmt.field("RateTxMax", &val),
4596 Devlink::RateNodeName(val) => fmt.field("RateNodeName", &val),
4597 Devlink::RateParentNodeName(val) => fmt.field("RateParentNodeName", &val),
4598 Devlink::RegionMaxSnapshots(val) => fmt.field("RegionMaxSnapshots", &val),
4599 Devlink::LinecardIndex(val) => fmt.field("LinecardIndex", &val),
4600 Devlink::LinecardState(val) => fmt.field("LinecardState", &val),
4601 Devlink::LinecardType(val) => fmt.field("LinecardType", &val),
4602 Devlink::LinecardSupportedTypes(val) => fmt.field("LinecardSupportedTypes", &val),
4603 Devlink::Selftests(val) => fmt.field("Selftests", &val),
4604 Devlink::RateTxPriority(val) => fmt.field("RateTxPriority", &val),
4605 Devlink::RateTxWeight(val) => fmt.field("RateTxWeight", &val),
4606 Devlink::RegionDirect(val) => fmt.field("RegionDirect", &val),
4607 Devlink::RateTcBws(val) => fmt.field("RateTcBws", &val),
4608 Devlink::HealthReporterBurstPeriod(val) => {
4609 fmt.field("HealthReporterBurstPeriod", &val)
4610 }
4611 Devlink::ParamResetDefault(val) => fmt.field("ParamResetDefault", &val),
4612 };
4613 }
4614 fmt.finish()
4615 }
4616}
4617impl IterableDevlink<'_> {
4618 pub fn lookup_attr(
4619 &self,
4620 offset: usize,
4621 missing_type: Option<u16>,
4622 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4623 let mut stack = Vec::new();
4624 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4625 if missing_type.is_some() && cur == offset {
4626 stack.push(("Devlink", offset));
4627 return (stack, missing_type.and_then(|t| Devlink::attr_from_type(t)));
4628 }
4629 if cur > offset || cur + self.buf.len() < offset {
4630 return (stack, None);
4631 }
4632 let mut attrs = self.clone();
4633 let mut last_off = cur + attrs.pos;
4634 let mut missing = None;
4635 while let Some(attr) = attrs.next() {
4636 let Ok(attr) = attr else { break };
4637 match attr {
4638 Devlink::BusName(val) => {
4639 if last_off == offset {
4640 stack.push(("BusName", last_off));
4641 break;
4642 }
4643 }
4644 Devlink::DevName(val) => {
4645 if last_off == offset {
4646 stack.push(("DevName", last_off));
4647 break;
4648 }
4649 }
4650 Devlink::PortIndex(val) => {
4651 if last_off == offset {
4652 stack.push(("PortIndex", last_off));
4653 break;
4654 }
4655 }
4656 Devlink::PortType(val) => {
4657 if last_off == offset {
4658 stack.push(("PortType", last_off));
4659 break;
4660 }
4661 }
4662 Devlink::PortDesiredType(val) => {
4663 if last_off == offset {
4664 stack.push(("PortDesiredType", last_off));
4665 break;
4666 }
4667 }
4668 Devlink::PortNetdevIfindex(val) => {
4669 if last_off == offset {
4670 stack.push(("PortNetdevIfindex", last_off));
4671 break;
4672 }
4673 }
4674 Devlink::PortNetdevName(val) => {
4675 if last_off == offset {
4676 stack.push(("PortNetdevName", last_off));
4677 break;
4678 }
4679 }
4680 Devlink::PortIbdevName(val) => {
4681 if last_off == offset {
4682 stack.push(("PortIbdevName", last_off));
4683 break;
4684 }
4685 }
4686 Devlink::PortSplitCount(val) => {
4687 if last_off == offset {
4688 stack.push(("PortSplitCount", last_off));
4689 break;
4690 }
4691 }
4692 Devlink::PortSplitGroup(val) => {
4693 if last_off == offset {
4694 stack.push(("PortSplitGroup", last_off));
4695 break;
4696 }
4697 }
4698 Devlink::SbIndex(val) => {
4699 if last_off == offset {
4700 stack.push(("SbIndex", last_off));
4701 break;
4702 }
4703 }
4704 Devlink::SbSize(val) => {
4705 if last_off == offset {
4706 stack.push(("SbSize", last_off));
4707 break;
4708 }
4709 }
4710 Devlink::SbIngressPoolCount(val) => {
4711 if last_off == offset {
4712 stack.push(("SbIngressPoolCount", last_off));
4713 break;
4714 }
4715 }
4716 Devlink::SbEgressPoolCount(val) => {
4717 if last_off == offset {
4718 stack.push(("SbEgressPoolCount", last_off));
4719 break;
4720 }
4721 }
4722 Devlink::SbIngressTcCount(val) => {
4723 if last_off == offset {
4724 stack.push(("SbIngressTcCount", last_off));
4725 break;
4726 }
4727 }
4728 Devlink::SbEgressTcCount(val) => {
4729 if last_off == offset {
4730 stack.push(("SbEgressTcCount", last_off));
4731 break;
4732 }
4733 }
4734 Devlink::SbPoolIndex(val) => {
4735 if last_off == offset {
4736 stack.push(("SbPoolIndex", last_off));
4737 break;
4738 }
4739 }
4740 Devlink::SbPoolType(val) => {
4741 if last_off == offset {
4742 stack.push(("SbPoolType", last_off));
4743 break;
4744 }
4745 }
4746 Devlink::SbPoolSize(val) => {
4747 if last_off == offset {
4748 stack.push(("SbPoolSize", last_off));
4749 break;
4750 }
4751 }
4752 Devlink::SbPoolThresholdType(val) => {
4753 if last_off == offset {
4754 stack.push(("SbPoolThresholdType", last_off));
4755 break;
4756 }
4757 }
4758 Devlink::SbThreshold(val) => {
4759 if last_off == offset {
4760 stack.push(("SbThreshold", last_off));
4761 break;
4762 }
4763 }
4764 Devlink::SbTcIndex(val) => {
4765 if last_off == offset {
4766 stack.push(("SbTcIndex", last_off));
4767 break;
4768 }
4769 }
4770 Devlink::SbOccCur(val) => {
4771 if last_off == offset {
4772 stack.push(("SbOccCur", last_off));
4773 break;
4774 }
4775 }
4776 Devlink::SbOccMax(val) => {
4777 if last_off == offset {
4778 stack.push(("SbOccMax", last_off));
4779 break;
4780 }
4781 }
4782 Devlink::EswitchMode(val) => {
4783 if last_off == offset {
4784 stack.push(("EswitchMode", last_off));
4785 break;
4786 }
4787 }
4788 Devlink::EswitchInlineMode(val) => {
4789 if last_off == offset {
4790 stack.push(("EswitchInlineMode", last_off));
4791 break;
4792 }
4793 }
4794 Devlink::DpipeTables(val) => {
4795 (stack, missing) = val.lookup_attr(offset, missing_type);
4796 if !stack.is_empty() {
4797 break;
4798 }
4799 }
4800 Devlink::DpipeTable(val) => {
4801 (stack, missing) = val.lookup_attr(offset, missing_type);
4802 if !stack.is_empty() {
4803 break;
4804 }
4805 }
4806 Devlink::DpipeTableName(val) => {
4807 if last_off == offset {
4808 stack.push(("DpipeTableName", last_off));
4809 break;
4810 }
4811 }
4812 Devlink::DpipeTableSize(val) => {
4813 if last_off == offset {
4814 stack.push(("DpipeTableSize", last_off));
4815 break;
4816 }
4817 }
4818 Devlink::DpipeTableMatches(val) => {
4819 (stack, missing) = val.lookup_attr(offset, missing_type);
4820 if !stack.is_empty() {
4821 break;
4822 }
4823 }
4824 Devlink::DpipeTableActions(val) => {
4825 (stack, missing) = val.lookup_attr(offset, missing_type);
4826 if !stack.is_empty() {
4827 break;
4828 }
4829 }
4830 Devlink::DpipeTableCountersEnabled(val) => {
4831 if last_off == offset {
4832 stack.push(("DpipeTableCountersEnabled", last_off));
4833 break;
4834 }
4835 }
4836 Devlink::DpipeEntries(val) => {
4837 (stack, missing) = val.lookup_attr(offset, missing_type);
4838 if !stack.is_empty() {
4839 break;
4840 }
4841 }
4842 Devlink::DpipeEntry(val) => {
4843 (stack, missing) = val.lookup_attr(offset, missing_type);
4844 if !stack.is_empty() {
4845 break;
4846 }
4847 }
4848 Devlink::DpipeEntryIndex(val) => {
4849 if last_off == offset {
4850 stack.push(("DpipeEntryIndex", last_off));
4851 break;
4852 }
4853 }
4854 Devlink::DpipeEntryMatchValues(val) => {
4855 (stack, missing) = val.lookup_attr(offset, missing_type);
4856 if !stack.is_empty() {
4857 break;
4858 }
4859 }
4860 Devlink::DpipeEntryActionValues(val) => {
4861 (stack, missing) = val.lookup_attr(offset, missing_type);
4862 if !stack.is_empty() {
4863 break;
4864 }
4865 }
4866 Devlink::DpipeEntryCounter(val) => {
4867 if last_off == offset {
4868 stack.push(("DpipeEntryCounter", last_off));
4869 break;
4870 }
4871 }
4872 Devlink::DpipeMatch(val) => {
4873 (stack, missing) = val.lookup_attr(offset, missing_type);
4874 if !stack.is_empty() {
4875 break;
4876 }
4877 }
4878 Devlink::DpipeMatchValue(val) => {
4879 (stack, missing) = val.lookup_attr(offset, missing_type);
4880 if !stack.is_empty() {
4881 break;
4882 }
4883 }
4884 Devlink::DpipeMatchType(val) => {
4885 if last_off == offset {
4886 stack.push(("DpipeMatchType", last_off));
4887 break;
4888 }
4889 }
4890 Devlink::DpipeAction(val) => {
4891 (stack, missing) = val.lookup_attr(offset, missing_type);
4892 if !stack.is_empty() {
4893 break;
4894 }
4895 }
4896 Devlink::DpipeActionValue(val) => {
4897 (stack, missing) = val.lookup_attr(offset, missing_type);
4898 if !stack.is_empty() {
4899 break;
4900 }
4901 }
4902 Devlink::DpipeActionType(val) => {
4903 if last_off == offset {
4904 stack.push(("DpipeActionType", last_off));
4905 break;
4906 }
4907 }
4908 Devlink::DpipeValue(val) => {
4909 if last_off == offset {
4910 stack.push(("DpipeValue", last_off));
4911 break;
4912 }
4913 }
4914 Devlink::DpipeValueMask(val) => {
4915 if last_off == offset {
4916 stack.push(("DpipeValueMask", last_off));
4917 break;
4918 }
4919 }
4920 Devlink::DpipeValueMapping(val) => {
4921 if last_off == offset {
4922 stack.push(("DpipeValueMapping", last_off));
4923 break;
4924 }
4925 }
4926 Devlink::DpipeHeaders(val) => {
4927 (stack, missing) = val.lookup_attr(offset, missing_type);
4928 if !stack.is_empty() {
4929 break;
4930 }
4931 }
4932 Devlink::DpipeHeader(val) => {
4933 (stack, missing) = val.lookup_attr(offset, missing_type);
4934 if !stack.is_empty() {
4935 break;
4936 }
4937 }
4938 Devlink::DpipeHeaderName(val) => {
4939 if last_off == offset {
4940 stack.push(("DpipeHeaderName", last_off));
4941 break;
4942 }
4943 }
4944 Devlink::DpipeHeaderId(val) => {
4945 if last_off == offset {
4946 stack.push(("DpipeHeaderId", last_off));
4947 break;
4948 }
4949 }
4950 Devlink::DpipeHeaderFields(val) => {
4951 (stack, missing) = val.lookup_attr(offset, missing_type);
4952 if !stack.is_empty() {
4953 break;
4954 }
4955 }
4956 Devlink::DpipeHeaderGlobal(val) => {
4957 if last_off == offset {
4958 stack.push(("DpipeHeaderGlobal", last_off));
4959 break;
4960 }
4961 }
4962 Devlink::DpipeHeaderIndex(val) => {
4963 if last_off == offset {
4964 stack.push(("DpipeHeaderIndex", last_off));
4965 break;
4966 }
4967 }
4968 Devlink::DpipeField(val) => {
4969 (stack, missing) = val.lookup_attr(offset, missing_type);
4970 if !stack.is_empty() {
4971 break;
4972 }
4973 }
4974 Devlink::DpipeFieldName(val) => {
4975 if last_off == offset {
4976 stack.push(("DpipeFieldName", last_off));
4977 break;
4978 }
4979 }
4980 Devlink::DpipeFieldId(val) => {
4981 if last_off == offset {
4982 stack.push(("DpipeFieldId", last_off));
4983 break;
4984 }
4985 }
4986 Devlink::DpipeFieldBitwidth(val) => {
4987 if last_off == offset {
4988 stack.push(("DpipeFieldBitwidth", last_off));
4989 break;
4990 }
4991 }
4992 Devlink::DpipeFieldMappingType(val) => {
4993 if last_off == offset {
4994 stack.push(("DpipeFieldMappingType", last_off));
4995 break;
4996 }
4997 }
4998 Devlink::Pad(val) => {
4999 if last_off == offset {
5000 stack.push(("Pad", last_off));
5001 break;
5002 }
5003 }
5004 Devlink::EswitchEncapMode(val) => {
5005 if last_off == offset {
5006 stack.push(("EswitchEncapMode", last_off));
5007 break;
5008 }
5009 }
5010 Devlink::ResourceList(val) => {
5011 (stack, missing) = val.lookup_attr(offset, missing_type);
5012 if !stack.is_empty() {
5013 break;
5014 }
5015 }
5016 Devlink::Resource(val) => {
5017 (stack, missing) = val.lookup_attr(offset, missing_type);
5018 if !stack.is_empty() {
5019 break;
5020 }
5021 }
5022 Devlink::ResourceName(val) => {
5023 if last_off == offset {
5024 stack.push(("ResourceName", last_off));
5025 break;
5026 }
5027 }
5028 Devlink::ResourceId(val) => {
5029 if last_off == offset {
5030 stack.push(("ResourceId", last_off));
5031 break;
5032 }
5033 }
5034 Devlink::ResourceSize(val) => {
5035 if last_off == offset {
5036 stack.push(("ResourceSize", last_off));
5037 break;
5038 }
5039 }
5040 Devlink::ResourceSizeNew(val) => {
5041 if last_off == offset {
5042 stack.push(("ResourceSizeNew", last_off));
5043 break;
5044 }
5045 }
5046 Devlink::ResourceSizeValid(val) => {
5047 if last_off == offset {
5048 stack.push(("ResourceSizeValid", last_off));
5049 break;
5050 }
5051 }
5052 Devlink::ResourceSizeMin(val) => {
5053 if last_off == offset {
5054 stack.push(("ResourceSizeMin", last_off));
5055 break;
5056 }
5057 }
5058 Devlink::ResourceSizeMax(val) => {
5059 if last_off == offset {
5060 stack.push(("ResourceSizeMax", last_off));
5061 break;
5062 }
5063 }
5064 Devlink::ResourceSizeGran(val) => {
5065 if last_off == offset {
5066 stack.push(("ResourceSizeGran", last_off));
5067 break;
5068 }
5069 }
5070 Devlink::ResourceUnit(val) => {
5071 if last_off == offset {
5072 stack.push(("ResourceUnit", last_off));
5073 break;
5074 }
5075 }
5076 Devlink::ResourceOcc(val) => {
5077 if last_off == offset {
5078 stack.push(("ResourceOcc", last_off));
5079 break;
5080 }
5081 }
5082 Devlink::DpipeTableResourceId(val) => {
5083 if last_off == offset {
5084 stack.push(("DpipeTableResourceId", last_off));
5085 break;
5086 }
5087 }
5088 Devlink::DpipeTableResourceUnits(val) => {
5089 if last_off == offset {
5090 stack.push(("DpipeTableResourceUnits", last_off));
5091 break;
5092 }
5093 }
5094 Devlink::PortFlavour(val) => {
5095 if last_off == offset {
5096 stack.push(("PortFlavour", last_off));
5097 break;
5098 }
5099 }
5100 Devlink::PortNumber(val) => {
5101 if last_off == offset {
5102 stack.push(("PortNumber", last_off));
5103 break;
5104 }
5105 }
5106 Devlink::PortSplitSubportNumber(val) => {
5107 if last_off == offset {
5108 stack.push(("PortSplitSubportNumber", last_off));
5109 break;
5110 }
5111 }
5112 Devlink::Param(val) => {
5113 (stack, missing) = val.lookup_attr(offset, missing_type);
5114 if !stack.is_empty() {
5115 break;
5116 }
5117 }
5118 Devlink::ParamName(val) => {
5119 if last_off == offset {
5120 stack.push(("ParamName", last_off));
5121 break;
5122 }
5123 }
5124 Devlink::ParamGeneric(val) => {
5125 if last_off == offset {
5126 stack.push(("ParamGeneric", last_off));
5127 break;
5128 }
5129 }
5130 Devlink::ParamType(val) => {
5131 if last_off == offset {
5132 stack.push(("ParamType", last_off));
5133 break;
5134 }
5135 }
5136 Devlink::ParamValueCmode(val) => {
5137 if last_off == offset {
5138 stack.push(("ParamValueCmode", last_off));
5139 break;
5140 }
5141 }
5142 Devlink::RegionName(val) => {
5143 if last_off == offset {
5144 stack.push(("RegionName", last_off));
5145 break;
5146 }
5147 }
5148 Devlink::RegionSize(val) => {
5149 if last_off == offset {
5150 stack.push(("RegionSize", last_off));
5151 break;
5152 }
5153 }
5154 Devlink::RegionSnapshots(val) => {
5155 (stack, missing) = val.lookup_attr(offset, missing_type);
5156 if !stack.is_empty() {
5157 break;
5158 }
5159 }
5160 Devlink::RegionSnapshot(val) => {
5161 (stack, missing) = val.lookup_attr(offset, missing_type);
5162 if !stack.is_empty() {
5163 break;
5164 }
5165 }
5166 Devlink::RegionSnapshotId(val) => {
5167 if last_off == offset {
5168 stack.push(("RegionSnapshotId", last_off));
5169 break;
5170 }
5171 }
5172 Devlink::RegionChunks(val) => {
5173 (stack, missing) = val.lookup_attr(offset, missing_type);
5174 if !stack.is_empty() {
5175 break;
5176 }
5177 }
5178 Devlink::RegionChunk(val) => {
5179 (stack, missing) = val.lookup_attr(offset, missing_type);
5180 if !stack.is_empty() {
5181 break;
5182 }
5183 }
5184 Devlink::RegionChunkData(val) => {
5185 if last_off == offset {
5186 stack.push(("RegionChunkData", last_off));
5187 break;
5188 }
5189 }
5190 Devlink::RegionChunkAddr(val) => {
5191 if last_off == offset {
5192 stack.push(("RegionChunkAddr", last_off));
5193 break;
5194 }
5195 }
5196 Devlink::RegionChunkLen(val) => {
5197 if last_off == offset {
5198 stack.push(("RegionChunkLen", last_off));
5199 break;
5200 }
5201 }
5202 Devlink::InfoDriverName(val) => {
5203 if last_off == offset {
5204 stack.push(("InfoDriverName", last_off));
5205 break;
5206 }
5207 }
5208 Devlink::InfoSerialNumber(val) => {
5209 if last_off == offset {
5210 stack.push(("InfoSerialNumber", last_off));
5211 break;
5212 }
5213 }
5214 Devlink::InfoVersionFixed(val) => {
5215 (stack, missing) = val.lookup_attr(offset, missing_type);
5216 if !stack.is_empty() {
5217 break;
5218 }
5219 }
5220 Devlink::InfoVersionRunning(val) => {
5221 (stack, missing) = val.lookup_attr(offset, missing_type);
5222 if !stack.is_empty() {
5223 break;
5224 }
5225 }
5226 Devlink::InfoVersionStored(val) => {
5227 (stack, missing) = val.lookup_attr(offset, missing_type);
5228 if !stack.is_empty() {
5229 break;
5230 }
5231 }
5232 Devlink::InfoVersionName(val) => {
5233 if last_off == offset {
5234 stack.push(("InfoVersionName", last_off));
5235 break;
5236 }
5237 }
5238 Devlink::InfoVersionValue(val) => {
5239 if last_off == offset {
5240 stack.push(("InfoVersionValue", last_off));
5241 break;
5242 }
5243 }
5244 Devlink::SbPoolCellSize(val) => {
5245 if last_off == offset {
5246 stack.push(("SbPoolCellSize", last_off));
5247 break;
5248 }
5249 }
5250 Devlink::Fmsg(val) => {
5251 (stack, missing) = val.lookup_attr(offset, missing_type);
5252 if !stack.is_empty() {
5253 break;
5254 }
5255 }
5256 Devlink::FmsgObjNestStart(val) => {
5257 if last_off == offset {
5258 stack.push(("FmsgObjNestStart", last_off));
5259 break;
5260 }
5261 }
5262 Devlink::FmsgPairNestStart(val) => {
5263 if last_off == offset {
5264 stack.push(("FmsgPairNestStart", last_off));
5265 break;
5266 }
5267 }
5268 Devlink::FmsgArrNestStart(val) => {
5269 if last_off == offset {
5270 stack.push(("FmsgArrNestStart", last_off));
5271 break;
5272 }
5273 }
5274 Devlink::FmsgNestEnd(val) => {
5275 if last_off == offset {
5276 stack.push(("FmsgNestEnd", last_off));
5277 break;
5278 }
5279 }
5280 Devlink::FmsgObjName(val) => {
5281 if last_off == offset {
5282 stack.push(("FmsgObjName", last_off));
5283 break;
5284 }
5285 }
5286 Devlink::FmsgObjValueType(val) => {
5287 if last_off == offset {
5288 stack.push(("FmsgObjValueType", last_off));
5289 break;
5290 }
5291 }
5292 Devlink::HealthReporter(val) => {
5293 (stack, missing) = val.lookup_attr(offset, missing_type);
5294 if !stack.is_empty() {
5295 break;
5296 }
5297 }
5298 Devlink::HealthReporterName(val) => {
5299 if last_off == offset {
5300 stack.push(("HealthReporterName", last_off));
5301 break;
5302 }
5303 }
5304 Devlink::HealthReporterState(val) => {
5305 if last_off == offset {
5306 stack.push(("HealthReporterState", last_off));
5307 break;
5308 }
5309 }
5310 Devlink::HealthReporterErrCount(val) => {
5311 if last_off == offset {
5312 stack.push(("HealthReporterErrCount", last_off));
5313 break;
5314 }
5315 }
5316 Devlink::HealthReporterRecoverCount(val) => {
5317 if last_off == offset {
5318 stack.push(("HealthReporterRecoverCount", last_off));
5319 break;
5320 }
5321 }
5322 Devlink::HealthReporterDumpTs(val) => {
5323 if last_off == offset {
5324 stack.push(("HealthReporterDumpTs", last_off));
5325 break;
5326 }
5327 }
5328 Devlink::HealthReporterGracefulPeriod(val) => {
5329 if last_off == offset {
5330 stack.push(("HealthReporterGracefulPeriod", last_off));
5331 break;
5332 }
5333 }
5334 Devlink::HealthReporterAutoRecover(val) => {
5335 if last_off == offset {
5336 stack.push(("HealthReporterAutoRecover", last_off));
5337 break;
5338 }
5339 }
5340 Devlink::FlashUpdateFileName(val) => {
5341 if last_off == offset {
5342 stack.push(("FlashUpdateFileName", last_off));
5343 break;
5344 }
5345 }
5346 Devlink::FlashUpdateComponent(val) => {
5347 if last_off == offset {
5348 stack.push(("FlashUpdateComponent", last_off));
5349 break;
5350 }
5351 }
5352 Devlink::FlashUpdateStatusMsg(val) => {
5353 if last_off == offset {
5354 stack.push(("FlashUpdateStatusMsg", last_off));
5355 break;
5356 }
5357 }
5358 Devlink::FlashUpdateStatusDone(val) => {
5359 if last_off == offset {
5360 stack.push(("FlashUpdateStatusDone", last_off));
5361 break;
5362 }
5363 }
5364 Devlink::FlashUpdateStatusTotal(val) => {
5365 if last_off == offset {
5366 stack.push(("FlashUpdateStatusTotal", last_off));
5367 break;
5368 }
5369 }
5370 Devlink::PortPciPfNumber(val) => {
5371 if last_off == offset {
5372 stack.push(("PortPciPfNumber", last_off));
5373 break;
5374 }
5375 }
5376 Devlink::PortPciVfNumber(val) => {
5377 if last_off == offset {
5378 stack.push(("PortPciVfNumber", last_off));
5379 break;
5380 }
5381 }
5382 Devlink::Stats(val) => {
5383 (stack, missing) = val.lookup_attr(offset, missing_type);
5384 if !stack.is_empty() {
5385 break;
5386 }
5387 }
5388 Devlink::TrapName(val) => {
5389 if last_off == offset {
5390 stack.push(("TrapName", last_off));
5391 break;
5392 }
5393 }
5394 Devlink::TrapAction(val) => {
5395 if last_off == offset {
5396 stack.push(("TrapAction", last_off));
5397 break;
5398 }
5399 }
5400 Devlink::TrapType(val) => {
5401 if last_off == offset {
5402 stack.push(("TrapType", last_off));
5403 break;
5404 }
5405 }
5406 Devlink::TrapGeneric(val) => {
5407 if last_off == offset {
5408 stack.push(("TrapGeneric", last_off));
5409 break;
5410 }
5411 }
5412 Devlink::TrapMetadata(val) => {
5413 (stack, missing) = val.lookup_attr(offset, missing_type);
5414 if !stack.is_empty() {
5415 break;
5416 }
5417 }
5418 Devlink::TrapGroupName(val) => {
5419 if last_off == offset {
5420 stack.push(("TrapGroupName", last_off));
5421 break;
5422 }
5423 }
5424 Devlink::ReloadFailed(val) => {
5425 if last_off == offset {
5426 stack.push(("ReloadFailed", last_off));
5427 break;
5428 }
5429 }
5430 Devlink::HealthReporterDumpTsNs(val) => {
5431 if last_off == offset {
5432 stack.push(("HealthReporterDumpTsNs", last_off));
5433 break;
5434 }
5435 }
5436 Devlink::NetnsFd(val) => {
5437 if last_off == offset {
5438 stack.push(("NetnsFd", last_off));
5439 break;
5440 }
5441 }
5442 Devlink::NetnsPid(val) => {
5443 if last_off == offset {
5444 stack.push(("NetnsPid", last_off));
5445 break;
5446 }
5447 }
5448 Devlink::NetnsId(val) => {
5449 if last_off == offset {
5450 stack.push(("NetnsId", last_off));
5451 break;
5452 }
5453 }
5454 Devlink::HealthReporterAutoDump(val) => {
5455 if last_off == offset {
5456 stack.push(("HealthReporterAutoDump", last_off));
5457 break;
5458 }
5459 }
5460 Devlink::TrapPolicerId(val) => {
5461 if last_off == offset {
5462 stack.push(("TrapPolicerId", last_off));
5463 break;
5464 }
5465 }
5466 Devlink::TrapPolicerRate(val) => {
5467 if last_off == offset {
5468 stack.push(("TrapPolicerRate", last_off));
5469 break;
5470 }
5471 }
5472 Devlink::TrapPolicerBurst(val) => {
5473 if last_off == offset {
5474 stack.push(("TrapPolicerBurst", last_off));
5475 break;
5476 }
5477 }
5478 Devlink::PortFunction(val) => {
5479 (stack, missing) = val.lookup_attr(offset, missing_type);
5480 if !stack.is_empty() {
5481 break;
5482 }
5483 }
5484 Devlink::InfoBoardSerialNumber(val) => {
5485 if last_off == offset {
5486 stack.push(("InfoBoardSerialNumber", last_off));
5487 break;
5488 }
5489 }
5490 Devlink::PortLanes(val) => {
5491 if last_off == offset {
5492 stack.push(("PortLanes", last_off));
5493 break;
5494 }
5495 }
5496 Devlink::PortSplittable(val) => {
5497 if last_off == offset {
5498 stack.push(("PortSplittable", last_off));
5499 break;
5500 }
5501 }
5502 Devlink::PortExternal(val) => {
5503 if last_off == offset {
5504 stack.push(("PortExternal", last_off));
5505 break;
5506 }
5507 }
5508 Devlink::PortControllerNumber(val) => {
5509 if last_off == offset {
5510 stack.push(("PortControllerNumber", last_off));
5511 break;
5512 }
5513 }
5514 Devlink::FlashUpdateStatusTimeout(val) => {
5515 if last_off == offset {
5516 stack.push(("FlashUpdateStatusTimeout", last_off));
5517 break;
5518 }
5519 }
5520 Devlink::FlashUpdateOverwriteMask(val) => {
5521 if last_off == offset {
5522 stack.push(("FlashUpdateOverwriteMask", last_off));
5523 break;
5524 }
5525 }
5526 Devlink::ReloadAction(val) => {
5527 if last_off == offset {
5528 stack.push(("ReloadAction", last_off));
5529 break;
5530 }
5531 }
5532 Devlink::ReloadActionsPerformed(val) => {
5533 if last_off == offset {
5534 stack.push(("ReloadActionsPerformed", last_off));
5535 break;
5536 }
5537 }
5538 Devlink::ReloadLimits(val) => {
5539 if last_off == offset {
5540 stack.push(("ReloadLimits", last_off));
5541 break;
5542 }
5543 }
5544 Devlink::DevStats(val) => {
5545 (stack, missing) = val.lookup_attr(offset, missing_type);
5546 if !stack.is_empty() {
5547 break;
5548 }
5549 }
5550 Devlink::ReloadStats(val) => {
5551 (stack, missing) = val.lookup_attr(offset, missing_type);
5552 if !stack.is_empty() {
5553 break;
5554 }
5555 }
5556 Devlink::ReloadStatsEntry(val) => {
5557 (stack, missing) = val.lookup_attr(offset, missing_type);
5558 if !stack.is_empty() {
5559 break;
5560 }
5561 }
5562 Devlink::ReloadStatsLimit(val) => {
5563 if last_off == offset {
5564 stack.push(("ReloadStatsLimit", last_off));
5565 break;
5566 }
5567 }
5568 Devlink::ReloadStatsValue(val) => {
5569 if last_off == offset {
5570 stack.push(("ReloadStatsValue", last_off));
5571 break;
5572 }
5573 }
5574 Devlink::RemoteReloadStats(val) => {
5575 (stack, missing) = val.lookup_attr(offset, missing_type);
5576 if !stack.is_empty() {
5577 break;
5578 }
5579 }
5580 Devlink::ReloadActionInfo(val) => {
5581 (stack, missing) = val.lookup_attr(offset, missing_type);
5582 if !stack.is_empty() {
5583 break;
5584 }
5585 }
5586 Devlink::ReloadActionStats(val) => {
5587 (stack, missing) = val.lookup_attr(offset, missing_type);
5588 if !stack.is_empty() {
5589 break;
5590 }
5591 }
5592 Devlink::PortPciSfNumber(val) => {
5593 if last_off == offset {
5594 stack.push(("PortPciSfNumber", last_off));
5595 break;
5596 }
5597 }
5598 Devlink::RateType(val) => {
5599 if last_off == offset {
5600 stack.push(("RateType", last_off));
5601 break;
5602 }
5603 }
5604 Devlink::RateTxShare(val) => {
5605 if last_off == offset {
5606 stack.push(("RateTxShare", last_off));
5607 break;
5608 }
5609 }
5610 Devlink::RateTxMax(val) => {
5611 if last_off == offset {
5612 stack.push(("RateTxMax", last_off));
5613 break;
5614 }
5615 }
5616 Devlink::RateNodeName(val) => {
5617 if last_off == offset {
5618 stack.push(("RateNodeName", last_off));
5619 break;
5620 }
5621 }
5622 Devlink::RateParentNodeName(val) => {
5623 if last_off == offset {
5624 stack.push(("RateParentNodeName", last_off));
5625 break;
5626 }
5627 }
5628 Devlink::RegionMaxSnapshots(val) => {
5629 if last_off == offset {
5630 stack.push(("RegionMaxSnapshots", last_off));
5631 break;
5632 }
5633 }
5634 Devlink::LinecardIndex(val) => {
5635 if last_off == offset {
5636 stack.push(("LinecardIndex", last_off));
5637 break;
5638 }
5639 }
5640 Devlink::LinecardState(val) => {
5641 if last_off == offset {
5642 stack.push(("LinecardState", last_off));
5643 break;
5644 }
5645 }
5646 Devlink::LinecardType(val) => {
5647 if last_off == offset {
5648 stack.push(("LinecardType", last_off));
5649 break;
5650 }
5651 }
5652 Devlink::LinecardSupportedTypes(val) => {
5653 (stack, missing) = val.lookup_attr(offset, missing_type);
5654 if !stack.is_empty() {
5655 break;
5656 }
5657 }
5658 Devlink::Selftests(val) => {
5659 (stack, missing) = val.lookup_attr(offset, missing_type);
5660 if !stack.is_empty() {
5661 break;
5662 }
5663 }
5664 Devlink::RateTxPriority(val) => {
5665 if last_off == offset {
5666 stack.push(("RateTxPriority", last_off));
5667 break;
5668 }
5669 }
5670 Devlink::RateTxWeight(val) => {
5671 if last_off == offset {
5672 stack.push(("RateTxWeight", last_off));
5673 break;
5674 }
5675 }
5676 Devlink::RegionDirect(val) => {
5677 if last_off == offset {
5678 stack.push(("RegionDirect", last_off));
5679 break;
5680 }
5681 }
5682 Devlink::RateTcBws(val) => {
5683 (stack, missing) = val.lookup_attr(offset, missing_type);
5684 if !stack.is_empty() {
5685 break;
5686 }
5687 }
5688 Devlink::HealthReporterBurstPeriod(val) => {
5689 if last_off == offset {
5690 stack.push(("HealthReporterBurstPeriod", last_off));
5691 break;
5692 }
5693 }
5694 Devlink::ParamResetDefault(val) => {
5695 if last_off == offset {
5696 stack.push(("ParamResetDefault", last_off));
5697 break;
5698 }
5699 }
5700 _ => {}
5701 };
5702 last_off = cur + attrs.pos;
5703 }
5704 if !stack.is_empty() {
5705 stack.push(("Devlink", cur));
5706 }
5707 (stack, missing)
5708 }
5709}
5710#[derive(Clone)]
5711pub enum DlDevStats<'a> {
5712 ReloadStats(IterableDlReloadStats<'a>),
5713 RemoteReloadStats(IterableDlReloadStats<'a>),
5714}
5715impl<'a> IterableDlDevStats<'a> {
5716 pub fn get_reload_stats(&self) -> Result<IterableDlReloadStats<'a>, ErrorContext> {
5717 let mut iter = self.clone();
5718 iter.pos = 0;
5719 for attr in iter {
5720 if let DlDevStats::ReloadStats(val) = attr? {
5721 return Ok(val);
5722 }
5723 }
5724 Err(ErrorContext::new_missing(
5725 "DlDevStats",
5726 "ReloadStats",
5727 self.orig_loc,
5728 self.buf.as_ptr() as usize,
5729 ))
5730 }
5731 pub fn get_remote_reload_stats(&self) -> Result<IterableDlReloadStats<'a>, ErrorContext> {
5732 let mut iter = self.clone();
5733 iter.pos = 0;
5734 for attr in iter {
5735 if let DlDevStats::RemoteReloadStats(val) = attr? {
5736 return Ok(val);
5737 }
5738 }
5739 Err(ErrorContext::new_missing(
5740 "DlDevStats",
5741 "RemoteReloadStats",
5742 self.orig_loc,
5743 self.buf.as_ptr() as usize,
5744 ))
5745 }
5746}
5747impl DlDevStats<'_> {
5748 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDevStats<'a> {
5749 IterableDlDevStats::with_loc(buf, buf.as_ptr() as usize)
5750 }
5751 fn attr_from_type(r#type: u16) -> Option<&'static str> {
5752 Devlink::attr_from_type(r#type)
5753 }
5754}
5755#[derive(Clone, Copy, Default)]
5756pub struct IterableDlDevStats<'a> {
5757 buf: &'a [u8],
5758 pos: usize,
5759 orig_loc: usize,
5760}
5761impl<'a> IterableDlDevStats<'a> {
5762 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5763 Self {
5764 buf,
5765 pos: 0,
5766 orig_loc,
5767 }
5768 }
5769 pub fn get_buf(&self) -> &'a [u8] {
5770 self.buf
5771 }
5772}
5773impl<'a> Iterator for IterableDlDevStats<'a> {
5774 type Item = Result<DlDevStats<'a>, ErrorContext>;
5775 fn next(&mut self) -> Option<Self::Item> {
5776 let pos = self.pos;
5777 let mut r#type;
5778 loop {
5779 r#type = None;
5780 if self.buf.len() == self.pos {
5781 return None;
5782 }
5783 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5784 break;
5785 };
5786 r#type = Some(header.r#type);
5787 let res = match header.r#type {
5788 157u16 => DlDevStats::ReloadStats({
5789 let res = Some(IterableDlReloadStats::with_loc(next, self.orig_loc));
5790 let Some(val) = res else { break };
5791 val
5792 }),
5793 161u16 => DlDevStats::RemoteReloadStats({
5794 let res = Some(IterableDlReloadStats::with_loc(next, self.orig_loc));
5795 let Some(val) = res else { break };
5796 val
5797 }),
5798 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5799 n => continue,
5800 };
5801 return Some(Ok(res));
5802 }
5803 Some(Err(ErrorContext::new(
5804 "DlDevStats",
5805 r#type.and_then(|t| DlDevStats::attr_from_type(t)),
5806 self.orig_loc,
5807 self.buf.as_ptr().wrapping_add(pos) as usize,
5808 )))
5809 }
5810}
5811impl<'a> std::fmt::Debug for IterableDlDevStats<'_> {
5812 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5813 let mut fmt = f.debug_struct("DlDevStats");
5814 for attr in self.clone() {
5815 let attr = match attr {
5816 Ok(a) => a,
5817 Err(err) => {
5818 fmt.finish()?;
5819 f.write_str("Err(")?;
5820 err.fmt(f)?;
5821 return f.write_str(")");
5822 }
5823 };
5824 match attr {
5825 DlDevStats::ReloadStats(val) => fmt.field("ReloadStats", &val),
5826 DlDevStats::RemoteReloadStats(val) => fmt.field("RemoteReloadStats", &val),
5827 };
5828 }
5829 fmt.finish()
5830 }
5831}
5832impl IterableDlDevStats<'_> {
5833 pub fn lookup_attr(
5834 &self,
5835 offset: usize,
5836 missing_type: Option<u16>,
5837 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5838 let mut stack = Vec::new();
5839 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5840 if missing_type.is_some() && cur == offset {
5841 stack.push(("DlDevStats", offset));
5842 return (
5843 stack,
5844 missing_type.and_then(|t| DlDevStats::attr_from_type(t)),
5845 );
5846 }
5847 if cur > offset || cur + self.buf.len() < offset {
5848 return (stack, None);
5849 }
5850 let mut attrs = self.clone();
5851 let mut last_off = cur + attrs.pos;
5852 let mut missing = None;
5853 while let Some(attr) = attrs.next() {
5854 let Ok(attr) = attr else { break };
5855 match attr {
5856 DlDevStats::ReloadStats(val) => {
5857 (stack, missing) = val.lookup_attr(offset, missing_type);
5858 if !stack.is_empty() {
5859 break;
5860 }
5861 }
5862 DlDevStats::RemoteReloadStats(val) => {
5863 (stack, missing) = val.lookup_attr(offset, missing_type);
5864 if !stack.is_empty() {
5865 break;
5866 }
5867 }
5868 _ => {}
5869 };
5870 last_off = cur + attrs.pos;
5871 }
5872 if !stack.is_empty() {
5873 stack.push(("DlDevStats", cur));
5874 }
5875 (stack, missing)
5876 }
5877}
5878#[derive(Clone)]
5879pub enum DlReloadStats<'a> {
5880 #[doc = "Attribute may repeat multiple times (treat it as array)"]
5881 ReloadActionInfo(IterableDlReloadActInfo<'a>),
5882}
5883impl<'a> IterableDlReloadStats<'a> {
5884 #[doc = "Attribute may repeat multiple times (treat it as array)"]
5885 pub fn get_reload_action_info(
5886 &self,
5887 ) -> MultiAttrIterable<Self, DlReloadStats<'a>, IterableDlReloadActInfo<'a>> {
5888 MultiAttrIterable::new(self.clone(), |variant| {
5889 if let DlReloadStats::ReloadActionInfo(val) = variant {
5890 Some(val)
5891 } else {
5892 None
5893 }
5894 })
5895 }
5896}
5897impl DlReloadStats<'_> {
5898 pub fn new<'a>(buf: &'a [u8]) -> IterableDlReloadStats<'a> {
5899 IterableDlReloadStats::with_loc(buf, buf.as_ptr() as usize)
5900 }
5901 fn attr_from_type(r#type: u16) -> Option<&'static str> {
5902 Devlink::attr_from_type(r#type)
5903 }
5904}
5905#[derive(Clone, Copy, Default)]
5906pub struct IterableDlReloadStats<'a> {
5907 buf: &'a [u8],
5908 pos: usize,
5909 orig_loc: usize,
5910}
5911impl<'a> IterableDlReloadStats<'a> {
5912 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5913 Self {
5914 buf,
5915 pos: 0,
5916 orig_loc,
5917 }
5918 }
5919 pub fn get_buf(&self) -> &'a [u8] {
5920 self.buf
5921 }
5922}
5923impl<'a> Iterator for IterableDlReloadStats<'a> {
5924 type Item = Result<DlReloadStats<'a>, ErrorContext>;
5925 fn next(&mut self) -> Option<Self::Item> {
5926 let pos = self.pos;
5927 let mut r#type;
5928 loop {
5929 r#type = None;
5930 if self.buf.len() == self.pos {
5931 return None;
5932 }
5933 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5934 break;
5935 };
5936 r#type = Some(header.r#type);
5937 let res = match header.r#type {
5938 162u16 => DlReloadStats::ReloadActionInfo({
5939 let res = Some(IterableDlReloadActInfo::with_loc(next, self.orig_loc));
5940 let Some(val) = res else { break };
5941 val
5942 }),
5943 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5944 n => continue,
5945 };
5946 return Some(Ok(res));
5947 }
5948 Some(Err(ErrorContext::new(
5949 "DlReloadStats",
5950 r#type.and_then(|t| DlReloadStats::attr_from_type(t)),
5951 self.orig_loc,
5952 self.buf.as_ptr().wrapping_add(pos) as usize,
5953 )))
5954 }
5955}
5956impl<'a> std::fmt::Debug for IterableDlReloadStats<'_> {
5957 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5958 let mut fmt = f.debug_struct("DlReloadStats");
5959 for attr in self.clone() {
5960 let attr = match attr {
5961 Ok(a) => a,
5962 Err(err) => {
5963 fmt.finish()?;
5964 f.write_str("Err(")?;
5965 err.fmt(f)?;
5966 return f.write_str(")");
5967 }
5968 };
5969 match attr {
5970 DlReloadStats::ReloadActionInfo(val) => fmt.field("ReloadActionInfo", &val),
5971 };
5972 }
5973 fmt.finish()
5974 }
5975}
5976impl IterableDlReloadStats<'_> {
5977 pub fn lookup_attr(
5978 &self,
5979 offset: usize,
5980 missing_type: Option<u16>,
5981 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5982 let mut stack = Vec::new();
5983 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5984 if missing_type.is_some() && cur == offset {
5985 stack.push(("DlReloadStats", offset));
5986 return (
5987 stack,
5988 missing_type.and_then(|t| DlReloadStats::attr_from_type(t)),
5989 );
5990 }
5991 if cur > offset || cur + self.buf.len() < offset {
5992 return (stack, None);
5993 }
5994 let mut attrs = self.clone();
5995 let mut last_off = cur + attrs.pos;
5996 let mut missing = None;
5997 while let Some(attr) = attrs.next() {
5998 let Ok(attr) = attr else { break };
5999 match attr {
6000 DlReloadStats::ReloadActionInfo(val) => {
6001 (stack, missing) = val.lookup_attr(offset, missing_type);
6002 if !stack.is_empty() {
6003 break;
6004 }
6005 }
6006 _ => {}
6007 };
6008 last_off = cur + attrs.pos;
6009 }
6010 if !stack.is_empty() {
6011 stack.push(("DlReloadStats", cur));
6012 }
6013 (stack, missing)
6014 }
6015}
6016#[derive(Clone)]
6017pub enum DlReloadActInfo<'a> {
6018 #[doc = "Associated type: [`ReloadAction`] (enum)"]
6019 ReloadAction(u8),
6020 #[doc = "Attribute may repeat multiple times (treat it as array)"]
6021 ReloadActionStats(IterableDlReloadActStats<'a>),
6022}
6023impl<'a> IterableDlReloadActInfo<'a> {
6024 #[doc = "Associated type: [`ReloadAction`] (enum)"]
6025 pub fn get_reload_action(&self) -> Result<u8, ErrorContext> {
6026 let mut iter = self.clone();
6027 iter.pos = 0;
6028 for attr in iter {
6029 if let DlReloadActInfo::ReloadAction(val) = attr? {
6030 return Ok(val);
6031 }
6032 }
6033 Err(ErrorContext::new_missing(
6034 "DlReloadActInfo",
6035 "ReloadAction",
6036 self.orig_loc,
6037 self.buf.as_ptr() as usize,
6038 ))
6039 }
6040 #[doc = "Attribute may repeat multiple times (treat it as array)"]
6041 pub fn get_reload_action_stats(
6042 &self,
6043 ) -> MultiAttrIterable<Self, DlReloadActInfo<'a>, IterableDlReloadActStats<'a>> {
6044 MultiAttrIterable::new(self.clone(), |variant| {
6045 if let DlReloadActInfo::ReloadActionStats(val) = variant {
6046 Some(val)
6047 } else {
6048 None
6049 }
6050 })
6051 }
6052}
6053impl DlReloadActInfo<'_> {
6054 pub fn new<'a>(buf: &'a [u8]) -> IterableDlReloadActInfo<'a> {
6055 IterableDlReloadActInfo::with_loc(buf, buf.as_ptr() as usize)
6056 }
6057 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6058 Devlink::attr_from_type(r#type)
6059 }
6060}
6061#[derive(Clone, Copy, Default)]
6062pub struct IterableDlReloadActInfo<'a> {
6063 buf: &'a [u8],
6064 pos: usize,
6065 orig_loc: usize,
6066}
6067impl<'a> IterableDlReloadActInfo<'a> {
6068 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6069 Self {
6070 buf,
6071 pos: 0,
6072 orig_loc,
6073 }
6074 }
6075 pub fn get_buf(&self) -> &'a [u8] {
6076 self.buf
6077 }
6078}
6079impl<'a> Iterator for IterableDlReloadActInfo<'a> {
6080 type Item = Result<DlReloadActInfo<'a>, ErrorContext>;
6081 fn next(&mut self) -> Option<Self::Item> {
6082 let pos = self.pos;
6083 let mut r#type;
6084 loop {
6085 r#type = None;
6086 if self.buf.len() == self.pos {
6087 return None;
6088 }
6089 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6090 break;
6091 };
6092 r#type = Some(header.r#type);
6093 let res = match header.r#type {
6094 153u16 => DlReloadActInfo::ReloadAction({
6095 let res = parse_u8(next);
6096 let Some(val) = res else { break };
6097 val
6098 }),
6099 163u16 => DlReloadActInfo::ReloadActionStats({
6100 let res = Some(IterableDlReloadActStats::with_loc(next, self.orig_loc));
6101 let Some(val) = res else { break };
6102 val
6103 }),
6104 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6105 n => continue,
6106 };
6107 return Some(Ok(res));
6108 }
6109 Some(Err(ErrorContext::new(
6110 "DlReloadActInfo",
6111 r#type.and_then(|t| DlReloadActInfo::attr_from_type(t)),
6112 self.orig_loc,
6113 self.buf.as_ptr().wrapping_add(pos) as usize,
6114 )))
6115 }
6116}
6117impl<'a> std::fmt::Debug for IterableDlReloadActInfo<'_> {
6118 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6119 let mut fmt = f.debug_struct("DlReloadActInfo");
6120 for attr in self.clone() {
6121 let attr = match attr {
6122 Ok(a) => a,
6123 Err(err) => {
6124 fmt.finish()?;
6125 f.write_str("Err(")?;
6126 err.fmt(f)?;
6127 return f.write_str(")");
6128 }
6129 };
6130 match attr {
6131 DlReloadActInfo::ReloadAction(val) => fmt.field(
6132 "ReloadAction",
6133 &FormatEnum(val.into(), ReloadAction::from_value),
6134 ),
6135 DlReloadActInfo::ReloadActionStats(val) => fmt.field("ReloadActionStats", &val),
6136 };
6137 }
6138 fmt.finish()
6139 }
6140}
6141impl IterableDlReloadActInfo<'_> {
6142 pub fn lookup_attr(
6143 &self,
6144 offset: usize,
6145 missing_type: Option<u16>,
6146 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6147 let mut stack = Vec::new();
6148 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6149 if missing_type.is_some() && cur == offset {
6150 stack.push(("DlReloadActInfo", offset));
6151 return (
6152 stack,
6153 missing_type.and_then(|t| DlReloadActInfo::attr_from_type(t)),
6154 );
6155 }
6156 if cur > offset || cur + self.buf.len() < offset {
6157 return (stack, None);
6158 }
6159 let mut attrs = self.clone();
6160 let mut last_off = cur + attrs.pos;
6161 let mut missing = None;
6162 while let Some(attr) = attrs.next() {
6163 let Ok(attr) = attr else { break };
6164 match attr {
6165 DlReloadActInfo::ReloadAction(val) => {
6166 if last_off == offset {
6167 stack.push(("ReloadAction", last_off));
6168 break;
6169 }
6170 }
6171 DlReloadActInfo::ReloadActionStats(val) => {
6172 (stack, missing) = val.lookup_attr(offset, missing_type);
6173 if !stack.is_empty() {
6174 break;
6175 }
6176 }
6177 _ => {}
6178 };
6179 last_off = cur + attrs.pos;
6180 }
6181 if !stack.is_empty() {
6182 stack.push(("DlReloadActInfo", cur));
6183 }
6184 (stack, missing)
6185 }
6186}
6187#[derive(Clone)]
6188pub enum DlReloadActStats<'a> {
6189 #[doc = "Attribute may repeat multiple times (treat it as array)"]
6190 ReloadStatsEntry(IterableDlReloadStatsEntry<'a>),
6191}
6192impl<'a> IterableDlReloadActStats<'a> {
6193 #[doc = "Attribute may repeat multiple times (treat it as array)"]
6194 pub fn get_reload_stats_entry(
6195 &self,
6196 ) -> MultiAttrIterable<Self, DlReloadActStats<'a>, IterableDlReloadStatsEntry<'a>> {
6197 MultiAttrIterable::new(self.clone(), |variant| {
6198 if let DlReloadActStats::ReloadStatsEntry(val) = variant {
6199 Some(val)
6200 } else {
6201 None
6202 }
6203 })
6204 }
6205}
6206impl DlReloadActStats<'_> {
6207 pub fn new<'a>(buf: &'a [u8]) -> IterableDlReloadActStats<'a> {
6208 IterableDlReloadActStats::with_loc(buf, buf.as_ptr() as usize)
6209 }
6210 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6211 Devlink::attr_from_type(r#type)
6212 }
6213}
6214#[derive(Clone, Copy, Default)]
6215pub struct IterableDlReloadActStats<'a> {
6216 buf: &'a [u8],
6217 pos: usize,
6218 orig_loc: usize,
6219}
6220impl<'a> IterableDlReloadActStats<'a> {
6221 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6222 Self {
6223 buf,
6224 pos: 0,
6225 orig_loc,
6226 }
6227 }
6228 pub fn get_buf(&self) -> &'a [u8] {
6229 self.buf
6230 }
6231}
6232impl<'a> Iterator for IterableDlReloadActStats<'a> {
6233 type Item = Result<DlReloadActStats<'a>, ErrorContext>;
6234 fn next(&mut self) -> Option<Self::Item> {
6235 let pos = self.pos;
6236 let mut r#type;
6237 loop {
6238 r#type = None;
6239 if self.buf.len() == self.pos {
6240 return None;
6241 }
6242 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6243 break;
6244 };
6245 r#type = Some(header.r#type);
6246 let res = match header.r#type {
6247 158u16 => DlReloadActStats::ReloadStatsEntry({
6248 let res = Some(IterableDlReloadStatsEntry::with_loc(next, self.orig_loc));
6249 let Some(val) = res else { break };
6250 val
6251 }),
6252 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6253 n => continue,
6254 };
6255 return Some(Ok(res));
6256 }
6257 Some(Err(ErrorContext::new(
6258 "DlReloadActStats",
6259 r#type.and_then(|t| DlReloadActStats::attr_from_type(t)),
6260 self.orig_loc,
6261 self.buf.as_ptr().wrapping_add(pos) as usize,
6262 )))
6263 }
6264}
6265impl<'a> std::fmt::Debug for IterableDlReloadActStats<'_> {
6266 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6267 let mut fmt = f.debug_struct("DlReloadActStats");
6268 for attr in self.clone() {
6269 let attr = match attr {
6270 Ok(a) => a,
6271 Err(err) => {
6272 fmt.finish()?;
6273 f.write_str("Err(")?;
6274 err.fmt(f)?;
6275 return f.write_str(")");
6276 }
6277 };
6278 match attr {
6279 DlReloadActStats::ReloadStatsEntry(val) => fmt.field("ReloadStatsEntry", &val),
6280 };
6281 }
6282 fmt.finish()
6283 }
6284}
6285impl IterableDlReloadActStats<'_> {
6286 pub fn lookup_attr(
6287 &self,
6288 offset: usize,
6289 missing_type: Option<u16>,
6290 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6291 let mut stack = Vec::new();
6292 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6293 if missing_type.is_some() && cur == offset {
6294 stack.push(("DlReloadActStats", offset));
6295 return (
6296 stack,
6297 missing_type.and_then(|t| DlReloadActStats::attr_from_type(t)),
6298 );
6299 }
6300 if cur > offset || cur + self.buf.len() < offset {
6301 return (stack, None);
6302 }
6303 let mut attrs = self.clone();
6304 let mut last_off = cur + attrs.pos;
6305 let mut missing = None;
6306 while let Some(attr) = attrs.next() {
6307 let Ok(attr) = attr else { break };
6308 match attr {
6309 DlReloadActStats::ReloadStatsEntry(val) => {
6310 (stack, missing) = val.lookup_attr(offset, missing_type);
6311 if !stack.is_empty() {
6312 break;
6313 }
6314 }
6315 _ => {}
6316 };
6317 last_off = cur + attrs.pos;
6318 }
6319 if !stack.is_empty() {
6320 stack.push(("DlReloadActStats", cur));
6321 }
6322 (stack, missing)
6323 }
6324}
6325#[derive(Clone)]
6326pub enum DlReloadStatsEntry {
6327 ReloadStatsLimit(u8),
6328 ReloadStatsValue(u32),
6329}
6330impl<'a> IterableDlReloadStatsEntry<'a> {
6331 pub fn get_reload_stats_limit(&self) -> Result<u8, ErrorContext> {
6332 let mut iter = self.clone();
6333 iter.pos = 0;
6334 for attr in iter {
6335 if let DlReloadStatsEntry::ReloadStatsLimit(val) = attr? {
6336 return Ok(val);
6337 }
6338 }
6339 Err(ErrorContext::new_missing(
6340 "DlReloadStatsEntry",
6341 "ReloadStatsLimit",
6342 self.orig_loc,
6343 self.buf.as_ptr() as usize,
6344 ))
6345 }
6346 pub fn get_reload_stats_value(&self) -> Result<u32, ErrorContext> {
6347 let mut iter = self.clone();
6348 iter.pos = 0;
6349 for attr in iter {
6350 if let DlReloadStatsEntry::ReloadStatsValue(val) = attr? {
6351 return Ok(val);
6352 }
6353 }
6354 Err(ErrorContext::new_missing(
6355 "DlReloadStatsEntry",
6356 "ReloadStatsValue",
6357 self.orig_loc,
6358 self.buf.as_ptr() as usize,
6359 ))
6360 }
6361}
6362impl DlReloadStatsEntry {
6363 pub fn new<'a>(buf: &'a [u8]) -> IterableDlReloadStatsEntry<'a> {
6364 IterableDlReloadStatsEntry::with_loc(buf, buf.as_ptr() as usize)
6365 }
6366 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6367 Devlink::attr_from_type(r#type)
6368 }
6369}
6370#[derive(Clone, Copy, Default)]
6371pub struct IterableDlReloadStatsEntry<'a> {
6372 buf: &'a [u8],
6373 pos: usize,
6374 orig_loc: usize,
6375}
6376impl<'a> IterableDlReloadStatsEntry<'a> {
6377 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6378 Self {
6379 buf,
6380 pos: 0,
6381 orig_loc,
6382 }
6383 }
6384 pub fn get_buf(&self) -> &'a [u8] {
6385 self.buf
6386 }
6387}
6388impl<'a> Iterator for IterableDlReloadStatsEntry<'a> {
6389 type Item = Result<DlReloadStatsEntry, ErrorContext>;
6390 fn next(&mut self) -> Option<Self::Item> {
6391 let pos = self.pos;
6392 let mut r#type;
6393 loop {
6394 r#type = None;
6395 if self.buf.len() == self.pos {
6396 return None;
6397 }
6398 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6399 break;
6400 };
6401 r#type = Some(header.r#type);
6402 let res = match header.r#type {
6403 159u16 => DlReloadStatsEntry::ReloadStatsLimit({
6404 let res = parse_u8(next);
6405 let Some(val) = res else { break };
6406 val
6407 }),
6408 160u16 => DlReloadStatsEntry::ReloadStatsValue({
6409 let res = parse_u32(next);
6410 let Some(val) = res else { break };
6411 val
6412 }),
6413 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6414 n => continue,
6415 };
6416 return Some(Ok(res));
6417 }
6418 Some(Err(ErrorContext::new(
6419 "DlReloadStatsEntry",
6420 r#type.and_then(|t| DlReloadStatsEntry::attr_from_type(t)),
6421 self.orig_loc,
6422 self.buf.as_ptr().wrapping_add(pos) as usize,
6423 )))
6424 }
6425}
6426impl std::fmt::Debug for IterableDlReloadStatsEntry<'_> {
6427 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6428 let mut fmt = f.debug_struct("DlReloadStatsEntry");
6429 for attr in self.clone() {
6430 let attr = match attr {
6431 Ok(a) => a,
6432 Err(err) => {
6433 fmt.finish()?;
6434 f.write_str("Err(")?;
6435 err.fmt(f)?;
6436 return f.write_str(")");
6437 }
6438 };
6439 match attr {
6440 DlReloadStatsEntry::ReloadStatsLimit(val) => fmt.field("ReloadStatsLimit", &val),
6441 DlReloadStatsEntry::ReloadStatsValue(val) => fmt.field("ReloadStatsValue", &val),
6442 };
6443 }
6444 fmt.finish()
6445 }
6446}
6447impl IterableDlReloadStatsEntry<'_> {
6448 pub fn lookup_attr(
6449 &self,
6450 offset: usize,
6451 missing_type: Option<u16>,
6452 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6453 let mut stack = Vec::new();
6454 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6455 if missing_type.is_some() && cur == offset {
6456 stack.push(("DlReloadStatsEntry", offset));
6457 return (
6458 stack,
6459 missing_type.and_then(|t| DlReloadStatsEntry::attr_from_type(t)),
6460 );
6461 }
6462 if cur > offset || cur + self.buf.len() < offset {
6463 return (stack, None);
6464 }
6465 let mut attrs = self.clone();
6466 let mut last_off = cur + attrs.pos;
6467 while let Some(attr) = attrs.next() {
6468 let Ok(attr) = attr else { break };
6469 match attr {
6470 DlReloadStatsEntry::ReloadStatsLimit(val) => {
6471 if last_off == offset {
6472 stack.push(("ReloadStatsLimit", last_off));
6473 break;
6474 }
6475 }
6476 DlReloadStatsEntry::ReloadStatsValue(val) => {
6477 if last_off == offset {
6478 stack.push(("ReloadStatsValue", last_off));
6479 break;
6480 }
6481 }
6482 _ => {}
6483 };
6484 last_off = cur + attrs.pos;
6485 }
6486 if !stack.is_empty() {
6487 stack.push(("DlReloadStatsEntry", cur));
6488 }
6489 (stack, None)
6490 }
6491}
6492#[derive(Clone)]
6493pub enum DlInfoVersion<'a> {
6494 InfoVersionName(&'a CStr),
6495 InfoVersionValue(&'a CStr),
6496}
6497impl<'a> IterableDlInfoVersion<'a> {
6498 pub fn get_info_version_name(&self) -> Result<&'a CStr, ErrorContext> {
6499 let mut iter = self.clone();
6500 iter.pos = 0;
6501 for attr in iter {
6502 if let DlInfoVersion::InfoVersionName(val) = attr? {
6503 return Ok(val);
6504 }
6505 }
6506 Err(ErrorContext::new_missing(
6507 "DlInfoVersion",
6508 "InfoVersionName",
6509 self.orig_loc,
6510 self.buf.as_ptr() as usize,
6511 ))
6512 }
6513 pub fn get_info_version_value(&self) -> Result<&'a CStr, ErrorContext> {
6514 let mut iter = self.clone();
6515 iter.pos = 0;
6516 for attr in iter {
6517 if let DlInfoVersion::InfoVersionValue(val) = attr? {
6518 return Ok(val);
6519 }
6520 }
6521 Err(ErrorContext::new_missing(
6522 "DlInfoVersion",
6523 "InfoVersionValue",
6524 self.orig_loc,
6525 self.buf.as_ptr() as usize,
6526 ))
6527 }
6528}
6529impl DlInfoVersion<'_> {
6530 pub fn new<'a>(buf: &'a [u8]) -> IterableDlInfoVersion<'a> {
6531 IterableDlInfoVersion::with_loc(buf, buf.as_ptr() as usize)
6532 }
6533 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6534 Devlink::attr_from_type(r#type)
6535 }
6536}
6537#[derive(Clone, Copy, Default)]
6538pub struct IterableDlInfoVersion<'a> {
6539 buf: &'a [u8],
6540 pos: usize,
6541 orig_loc: usize,
6542}
6543impl<'a> IterableDlInfoVersion<'a> {
6544 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6545 Self {
6546 buf,
6547 pos: 0,
6548 orig_loc,
6549 }
6550 }
6551 pub fn get_buf(&self) -> &'a [u8] {
6552 self.buf
6553 }
6554}
6555impl<'a> Iterator for IterableDlInfoVersion<'a> {
6556 type Item = Result<DlInfoVersion<'a>, ErrorContext>;
6557 fn next(&mut self) -> Option<Self::Item> {
6558 let pos = self.pos;
6559 let mut r#type;
6560 loop {
6561 r#type = None;
6562 if self.buf.len() == self.pos {
6563 return None;
6564 }
6565 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6566 break;
6567 };
6568 r#type = Some(header.r#type);
6569 let res = match header.r#type {
6570 103u16 => DlInfoVersion::InfoVersionName({
6571 let res = CStr::from_bytes_with_nul(next).ok();
6572 let Some(val) = res else { break };
6573 val
6574 }),
6575 104u16 => DlInfoVersion::InfoVersionValue({
6576 let res = CStr::from_bytes_with_nul(next).ok();
6577 let Some(val) = res else { break };
6578 val
6579 }),
6580 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6581 n => continue,
6582 };
6583 return Some(Ok(res));
6584 }
6585 Some(Err(ErrorContext::new(
6586 "DlInfoVersion",
6587 r#type.and_then(|t| DlInfoVersion::attr_from_type(t)),
6588 self.orig_loc,
6589 self.buf.as_ptr().wrapping_add(pos) as usize,
6590 )))
6591 }
6592}
6593impl<'a> std::fmt::Debug for IterableDlInfoVersion<'_> {
6594 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6595 let mut fmt = f.debug_struct("DlInfoVersion");
6596 for attr in self.clone() {
6597 let attr = match attr {
6598 Ok(a) => a,
6599 Err(err) => {
6600 fmt.finish()?;
6601 f.write_str("Err(")?;
6602 err.fmt(f)?;
6603 return f.write_str(")");
6604 }
6605 };
6606 match attr {
6607 DlInfoVersion::InfoVersionName(val) => fmt.field("InfoVersionName", &val),
6608 DlInfoVersion::InfoVersionValue(val) => fmt.field("InfoVersionValue", &val),
6609 };
6610 }
6611 fmt.finish()
6612 }
6613}
6614impl IterableDlInfoVersion<'_> {
6615 pub fn lookup_attr(
6616 &self,
6617 offset: usize,
6618 missing_type: Option<u16>,
6619 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6620 let mut stack = Vec::new();
6621 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6622 if missing_type.is_some() && cur == offset {
6623 stack.push(("DlInfoVersion", offset));
6624 return (
6625 stack,
6626 missing_type.and_then(|t| DlInfoVersion::attr_from_type(t)),
6627 );
6628 }
6629 if cur > offset || cur + self.buf.len() < offset {
6630 return (stack, None);
6631 }
6632 let mut attrs = self.clone();
6633 let mut last_off = cur + attrs.pos;
6634 while let Some(attr) = attrs.next() {
6635 let Ok(attr) = attr else { break };
6636 match attr {
6637 DlInfoVersion::InfoVersionName(val) => {
6638 if last_off == offset {
6639 stack.push(("InfoVersionName", last_off));
6640 break;
6641 }
6642 }
6643 DlInfoVersion::InfoVersionValue(val) => {
6644 if last_off == offset {
6645 stack.push(("InfoVersionValue", last_off));
6646 break;
6647 }
6648 }
6649 _ => {}
6650 };
6651 last_off = cur + attrs.pos;
6652 }
6653 if !stack.is_empty() {
6654 stack.push(("DlInfoVersion", cur));
6655 }
6656 (stack, None)
6657 }
6658}
6659#[derive(Clone)]
6660pub enum DlPortFunction<'a> {
6661 HwAddr(&'a [u8]),
6662 #[doc = "Associated type: [`PortFnState`] (enum)"]
6663 State(u8),
6664 #[doc = "Associated type: [`PortFnOpstate`] (enum)"]
6665 Opstate(u8),
6666 #[doc = "Associated type: [`PortFnAttrCap`] (1 bit per enumeration)"]
6667 Caps(BuiltinBitfield32),
6668}
6669impl<'a> IterableDlPortFunction<'a> {
6670 pub fn get_hw_addr(&self) -> Result<&'a [u8], ErrorContext> {
6671 let mut iter = self.clone();
6672 iter.pos = 0;
6673 for attr in iter {
6674 if let DlPortFunction::HwAddr(val) = attr? {
6675 return Ok(val);
6676 }
6677 }
6678 Err(ErrorContext::new_missing(
6679 "DlPortFunction",
6680 "HwAddr",
6681 self.orig_loc,
6682 self.buf.as_ptr() as usize,
6683 ))
6684 }
6685 #[doc = "Associated type: [`PortFnState`] (enum)"]
6686 pub fn get_state(&self) -> Result<u8, ErrorContext> {
6687 let mut iter = self.clone();
6688 iter.pos = 0;
6689 for attr in iter {
6690 if let DlPortFunction::State(val) = attr? {
6691 return Ok(val);
6692 }
6693 }
6694 Err(ErrorContext::new_missing(
6695 "DlPortFunction",
6696 "State",
6697 self.orig_loc,
6698 self.buf.as_ptr() as usize,
6699 ))
6700 }
6701 #[doc = "Associated type: [`PortFnOpstate`] (enum)"]
6702 pub fn get_opstate(&self) -> Result<u8, ErrorContext> {
6703 let mut iter = self.clone();
6704 iter.pos = 0;
6705 for attr in iter {
6706 if let DlPortFunction::Opstate(val) = attr? {
6707 return Ok(val);
6708 }
6709 }
6710 Err(ErrorContext::new_missing(
6711 "DlPortFunction",
6712 "Opstate",
6713 self.orig_loc,
6714 self.buf.as_ptr() as usize,
6715 ))
6716 }
6717 #[doc = "Associated type: [`PortFnAttrCap`] (1 bit per enumeration)"]
6718 pub fn get_caps(&self) -> Result<BuiltinBitfield32, ErrorContext> {
6719 let mut iter = self.clone();
6720 iter.pos = 0;
6721 for attr in iter {
6722 if let DlPortFunction::Caps(val) = attr? {
6723 return Ok(val);
6724 }
6725 }
6726 Err(ErrorContext::new_missing(
6727 "DlPortFunction",
6728 "Caps",
6729 self.orig_loc,
6730 self.buf.as_ptr() as usize,
6731 ))
6732 }
6733}
6734impl DlPortFunction<'_> {
6735 pub fn new<'a>(buf: &'a [u8]) -> IterableDlPortFunction<'a> {
6736 IterableDlPortFunction::with_loc(buf, buf.as_ptr() as usize)
6737 }
6738 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6739 let res = match r#type {
6740 1u16 => "HwAddr",
6741 2u16 => "State",
6742 3u16 => "Opstate",
6743 4u16 => "Caps",
6744 _ => return None,
6745 };
6746 Some(res)
6747 }
6748}
6749#[derive(Clone, Copy, Default)]
6750pub struct IterableDlPortFunction<'a> {
6751 buf: &'a [u8],
6752 pos: usize,
6753 orig_loc: usize,
6754}
6755impl<'a> IterableDlPortFunction<'a> {
6756 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6757 Self {
6758 buf,
6759 pos: 0,
6760 orig_loc,
6761 }
6762 }
6763 pub fn get_buf(&self) -> &'a [u8] {
6764 self.buf
6765 }
6766}
6767impl<'a> Iterator for IterableDlPortFunction<'a> {
6768 type Item = Result<DlPortFunction<'a>, ErrorContext>;
6769 fn next(&mut self) -> Option<Self::Item> {
6770 let pos = self.pos;
6771 let mut r#type;
6772 loop {
6773 r#type = None;
6774 if self.buf.len() == self.pos {
6775 return None;
6776 }
6777 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6778 break;
6779 };
6780 r#type = Some(header.r#type);
6781 let res = match header.r#type {
6782 1u16 => DlPortFunction::HwAddr({
6783 let res = Some(next);
6784 let Some(val) = res else { break };
6785 val
6786 }),
6787 2u16 => DlPortFunction::State({
6788 let res = parse_u8(next);
6789 let Some(val) = res else { break };
6790 val
6791 }),
6792 3u16 => DlPortFunction::Opstate({
6793 let res = parse_u8(next);
6794 let Some(val) = res else { break };
6795 val
6796 }),
6797 4u16 => DlPortFunction::Caps({
6798 let res = BuiltinBitfield32::new_from_slice(next);
6799 let Some(val) = res else { break };
6800 val
6801 }),
6802 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6803 n => continue,
6804 };
6805 return Some(Ok(res));
6806 }
6807 Some(Err(ErrorContext::new(
6808 "DlPortFunction",
6809 r#type.and_then(|t| DlPortFunction::attr_from_type(t)),
6810 self.orig_loc,
6811 self.buf.as_ptr().wrapping_add(pos) as usize,
6812 )))
6813 }
6814}
6815impl<'a> std::fmt::Debug for IterableDlPortFunction<'_> {
6816 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6817 let mut fmt = f.debug_struct("DlPortFunction");
6818 for attr in self.clone() {
6819 let attr = match attr {
6820 Ok(a) => a,
6821 Err(err) => {
6822 fmt.finish()?;
6823 f.write_str("Err(")?;
6824 err.fmt(f)?;
6825 return f.write_str(")");
6826 }
6827 };
6828 match attr {
6829 DlPortFunction::HwAddr(val) => fmt.field("HwAddr", &val),
6830 DlPortFunction::State(val) => {
6831 fmt.field("State", &FormatEnum(val.into(), PortFnState::from_value))
6832 }
6833 DlPortFunction::Opstate(val) => fmt.field(
6834 "Opstate",
6835 &FormatEnum(val.into(), PortFnOpstate::from_value),
6836 ),
6837 DlPortFunction::Caps(val) => fmt.field(
6838 "Caps",
6839 &FormatFlags(val.value.into(), |val| {
6840 PortFnAttrCap::from_value(val.trailing_zeros().into())
6841 }),
6842 ),
6843 };
6844 }
6845 fmt.finish()
6846 }
6847}
6848impl IterableDlPortFunction<'_> {
6849 pub fn lookup_attr(
6850 &self,
6851 offset: usize,
6852 missing_type: Option<u16>,
6853 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6854 let mut stack = Vec::new();
6855 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6856 if missing_type.is_some() && cur == offset {
6857 stack.push(("DlPortFunction", offset));
6858 return (
6859 stack,
6860 missing_type.and_then(|t| DlPortFunction::attr_from_type(t)),
6861 );
6862 }
6863 if cur > offset || cur + self.buf.len() < offset {
6864 return (stack, None);
6865 }
6866 let mut attrs = self.clone();
6867 let mut last_off = cur + attrs.pos;
6868 while let Some(attr) = attrs.next() {
6869 let Ok(attr) = attr else { break };
6870 match attr {
6871 DlPortFunction::HwAddr(val) => {
6872 if last_off == offset {
6873 stack.push(("HwAddr", last_off));
6874 break;
6875 }
6876 }
6877 DlPortFunction::State(val) => {
6878 if last_off == offset {
6879 stack.push(("State", last_off));
6880 break;
6881 }
6882 }
6883 DlPortFunction::Opstate(val) => {
6884 if last_off == offset {
6885 stack.push(("Opstate", last_off));
6886 break;
6887 }
6888 }
6889 DlPortFunction::Caps(val) => {
6890 if last_off == offset {
6891 stack.push(("Caps", last_off));
6892 break;
6893 }
6894 }
6895 _ => {}
6896 };
6897 last_off = cur + attrs.pos;
6898 }
6899 if !stack.is_empty() {
6900 stack.push(("DlPortFunction", cur));
6901 }
6902 (stack, None)
6903 }
6904}
6905#[derive(Clone)]
6906pub enum DlDpipeTables<'a> {
6907 #[doc = "Attribute may repeat multiple times (treat it as array)"]
6908 DpipeTable(IterableDlDpipeTable<'a>),
6909}
6910impl<'a> IterableDlDpipeTables<'a> {
6911 #[doc = "Attribute may repeat multiple times (treat it as array)"]
6912 pub fn get_dpipe_table(
6913 &self,
6914 ) -> MultiAttrIterable<Self, DlDpipeTables<'a>, IterableDlDpipeTable<'a>> {
6915 MultiAttrIterable::new(self.clone(), |variant| {
6916 if let DlDpipeTables::DpipeTable(val) = variant {
6917 Some(val)
6918 } else {
6919 None
6920 }
6921 })
6922 }
6923}
6924impl DlDpipeTables<'_> {
6925 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeTables<'a> {
6926 IterableDlDpipeTables::with_loc(buf, buf.as_ptr() as usize)
6927 }
6928 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6929 Devlink::attr_from_type(r#type)
6930 }
6931}
6932#[derive(Clone, Copy, Default)]
6933pub struct IterableDlDpipeTables<'a> {
6934 buf: &'a [u8],
6935 pos: usize,
6936 orig_loc: usize,
6937}
6938impl<'a> IterableDlDpipeTables<'a> {
6939 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6940 Self {
6941 buf,
6942 pos: 0,
6943 orig_loc,
6944 }
6945 }
6946 pub fn get_buf(&self) -> &'a [u8] {
6947 self.buf
6948 }
6949}
6950impl<'a> Iterator for IterableDlDpipeTables<'a> {
6951 type Item = Result<DlDpipeTables<'a>, ErrorContext>;
6952 fn next(&mut self) -> Option<Self::Item> {
6953 let pos = self.pos;
6954 let mut r#type;
6955 loop {
6956 r#type = None;
6957 if self.buf.len() == self.pos {
6958 return None;
6959 }
6960 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6961 break;
6962 };
6963 r#type = Some(header.r#type);
6964 let res = match header.r#type {
6965 28u16 => DlDpipeTables::DpipeTable({
6966 let res = Some(IterableDlDpipeTable::with_loc(next, self.orig_loc));
6967 let Some(val) = res else { break };
6968 val
6969 }),
6970 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6971 n => continue,
6972 };
6973 return Some(Ok(res));
6974 }
6975 Some(Err(ErrorContext::new(
6976 "DlDpipeTables",
6977 r#type.and_then(|t| DlDpipeTables::attr_from_type(t)),
6978 self.orig_loc,
6979 self.buf.as_ptr().wrapping_add(pos) as usize,
6980 )))
6981 }
6982}
6983impl<'a> std::fmt::Debug for IterableDlDpipeTables<'_> {
6984 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6985 let mut fmt = f.debug_struct("DlDpipeTables");
6986 for attr in self.clone() {
6987 let attr = match attr {
6988 Ok(a) => a,
6989 Err(err) => {
6990 fmt.finish()?;
6991 f.write_str("Err(")?;
6992 err.fmt(f)?;
6993 return f.write_str(")");
6994 }
6995 };
6996 match attr {
6997 DlDpipeTables::DpipeTable(val) => fmt.field("DpipeTable", &val),
6998 };
6999 }
7000 fmt.finish()
7001 }
7002}
7003impl IterableDlDpipeTables<'_> {
7004 pub fn lookup_attr(
7005 &self,
7006 offset: usize,
7007 missing_type: Option<u16>,
7008 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7009 let mut stack = Vec::new();
7010 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7011 if missing_type.is_some() && cur == offset {
7012 stack.push(("DlDpipeTables", offset));
7013 return (
7014 stack,
7015 missing_type.and_then(|t| DlDpipeTables::attr_from_type(t)),
7016 );
7017 }
7018 if cur > offset || cur + self.buf.len() < offset {
7019 return (stack, None);
7020 }
7021 let mut attrs = self.clone();
7022 let mut last_off = cur + attrs.pos;
7023 let mut missing = None;
7024 while let Some(attr) = attrs.next() {
7025 let Ok(attr) = attr else { break };
7026 match attr {
7027 DlDpipeTables::DpipeTable(val) => {
7028 (stack, missing) = val.lookup_attr(offset, missing_type);
7029 if !stack.is_empty() {
7030 break;
7031 }
7032 }
7033 _ => {}
7034 };
7035 last_off = cur + attrs.pos;
7036 }
7037 if !stack.is_empty() {
7038 stack.push(("DlDpipeTables", cur));
7039 }
7040 (stack, missing)
7041 }
7042}
7043#[derive(Clone)]
7044pub enum DlDpipeTable<'a> {
7045 DpipeTableName(&'a CStr),
7046 DpipeTableSize(u64),
7047 DpipeTableMatches(IterableDlDpipeTableMatches<'a>),
7048 DpipeTableActions(IterableDlDpipeTableActions<'a>),
7049 DpipeTableCountersEnabled(u8),
7050 DpipeTableResourceId(u64),
7051 DpipeTableResourceUnits(u64),
7052}
7053impl<'a> IterableDlDpipeTable<'a> {
7054 pub fn get_dpipe_table_name(&self) -> Result<&'a CStr, ErrorContext> {
7055 let mut iter = self.clone();
7056 iter.pos = 0;
7057 for attr in iter {
7058 if let DlDpipeTable::DpipeTableName(val) = attr? {
7059 return Ok(val);
7060 }
7061 }
7062 Err(ErrorContext::new_missing(
7063 "DlDpipeTable",
7064 "DpipeTableName",
7065 self.orig_loc,
7066 self.buf.as_ptr() as usize,
7067 ))
7068 }
7069 pub fn get_dpipe_table_size(&self) -> Result<u64, ErrorContext> {
7070 let mut iter = self.clone();
7071 iter.pos = 0;
7072 for attr in iter {
7073 if let DlDpipeTable::DpipeTableSize(val) = attr? {
7074 return Ok(val);
7075 }
7076 }
7077 Err(ErrorContext::new_missing(
7078 "DlDpipeTable",
7079 "DpipeTableSize",
7080 self.orig_loc,
7081 self.buf.as_ptr() as usize,
7082 ))
7083 }
7084 pub fn get_dpipe_table_matches(&self) -> Result<IterableDlDpipeTableMatches<'a>, ErrorContext> {
7085 let mut iter = self.clone();
7086 iter.pos = 0;
7087 for attr in iter {
7088 if let DlDpipeTable::DpipeTableMatches(val) = attr? {
7089 return Ok(val);
7090 }
7091 }
7092 Err(ErrorContext::new_missing(
7093 "DlDpipeTable",
7094 "DpipeTableMatches",
7095 self.orig_loc,
7096 self.buf.as_ptr() as usize,
7097 ))
7098 }
7099 pub fn get_dpipe_table_actions(&self) -> Result<IterableDlDpipeTableActions<'a>, ErrorContext> {
7100 let mut iter = self.clone();
7101 iter.pos = 0;
7102 for attr in iter {
7103 if let DlDpipeTable::DpipeTableActions(val) = attr? {
7104 return Ok(val);
7105 }
7106 }
7107 Err(ErrorContext::new_missing(
7108 "DlDpipeTable",
7109 "DpipeTableActions",
7110 self.orig_loc,
7111 self.buf.as_ptr() as usize,
7112 ))
7113 }
7114 pub fn get_dpipe_table_counters_enabled(&self) -> Result<u8, ErrorContext> {
7115 let mut iter = self.clone();
7116 iter.pos = 0;
7117 for attr in iter {
7118 if let DlDpipeTable::DpipeTableCountersEnabled(val) = attr? {
7119 return Ok(val);
7120 }
7121 }
7122 Err(ErrorContext::new_missing(
7123 "DlDpipeTable",
7124 "DpipeTableCountersEnabled",
7125 self.orig_loc,
7126 self.buf.as_ptr() as usize,
7127 ))
7128 }
7129 pub fn get_dpipe_table_resource_id(&self) -> Result<u64, ErrorContext> {
7130 let mut iter = self.clone();
7131 iter.pos = 0;
7132 for attr in iter {
7133 if let DlDpipeTable::DpipeTableResourceId(val) = attr? {
7134 return Ok(val);
7135 }
7136 }
7137 Err(ErrorContext::new_missing(
7138 "DlDpipeTable",
7139 "DpipeTableResourceId",
7140 self.orig_loc,
7141 self.buf.as_ptr() as usize,
7142 ))
7143 }
7144 pub fn get_dpipe_table_resource_units(&self) -> Result<u64, ErrorContext> {
7145 let mut iter = self.clone();
7146 iter.pos = 0;
7147 for attr in iter {
7148 if let DlDpipeTable::DpipeTableResourceUnits(val) = attr? {
7149 return Ok(val);
7150 }
7151 }
7152 Err(ErrorContext::new_missing(
7153 "DlDpipeTable",
7154 "DpipeTableResourceUnits",
7155 self.orig_loc,
7156 self.buf.as_ptr() as usize,
7157 ))
7158 }
7159}
7160impl DlDpipeTable<'_> {
7161 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeTable<'a> {
7162 IterableDlDpipeTable::with_loc(buf, buf.as_ptr() as usize)
7163 }
7164 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7165 Devlink::attr_from_type(r#type)
7166 }
7167}
7168#[derive(Clone, Copy, Default)]
7169pub struct IterableDlDpipeTable<'a> {
7170 buf: &'a [u8],
7171 pos: usize,
7172 orig_loc: usize,
7173}
7174impl<'a> IterableDlDpipeTable<'a> {
7175 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7176 Self {
7177 buf,
7178 pos: 0,
7179 orig_loc,
7180 }
7181 }
7182 pub fn get_buf(&self) -> &'a [u8] {
7183 self.buf
7184 }
7185}
7186impl<'a> Iterator for IterableDlDpipeTable<'a> {
7187 type Item = Result<DlDpipeTable<'a>, ErrorContext>;
7188 fn next(&mut self) -> Option<Self::Item> {
7189 let pos = self.pos;
7190 let mut r#type;
7191 loop {
7192 r#type = None;
7193 if self.buf.len() == self.pos {
7194 return None;
7195 }
7196 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7197 break;
7198 };
7199 r#type = Some(header.r#type);
7200 let res = match header.r#type {
7201 29u16 => DlDpipeTable::DpipeTableName({
7202 let res = CStr::from_bytes_with_nul(next).ok();
7203 let Some(val) = res else { break };
7204 val
7205 }),
7206 30u16 => DlDpipeTable::DpipeTableSize({
7207 let res = parse_u64(next);
7208 let Some(val) = res else { break };
7209 val
7210 }),
7211 31u16 => DlDpipeTable::DpipeTableMatches({
7212 let res = Some(IterableDlDpipeTableMatches::with_loc(next, self.orig_loc));
7213 let Some(val) = res else { break };
7214 val
7215 }),
7216 32u16 => DlDpipeTable::DpipeTableActions({
7217 let res = Some(IterableDlDpipeTableActions::with_loc(next, self.orig_loc));
7218 let Some(val) = res else { break };
7219 val
7220 }),
7221 33u16 => DlDpipeTable::DpipeTableCountersEnabled({
7222 let res = parse_u8(next);
7223 let Some(val) = res else { break };
7224 val
7225 }),
7226 75u16 => DlDpipeTable::DpipeTableResourceId({
7227 let res = parse_u64(next);
7228 let Some(val) = res else { break };
7229 val
7230 }),
7231 76u16 => DlDpipeTable::DpipeTableResourceUnits({
7232 let res = parse_u64(next);
7233 let Some(val) = res else { break };
7234 val
7235 }),
7236 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7237 n => continue,
7238 };
7239 return Some(Ok(res));
7240 }
7241 Some(Err(ErrorContext::new(
7242 "DlDpipeTable",
7243 r#type.and_then(|t| DlDpipeTable::attr_from_type(t)),
7244 self.orig_loc,
7245 self.buf.as_ptr().wrapping_add(pos) as usize,
7246 )))
7247 }
7248}
7249impl<'a> std::fmt::Debug for IterableDlDpipeTable<'_> {
7250 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7251 let mut fmt = f.debug_struct("DlDpipeTable");
7252 for attr in self.clone() {
7253 let attr = match attr {
7254 Ok(a) => a,
7255 Err(err) => {
7256 fmt.finish()?;
7257 f.write_str("Err(")?;
7258 err.fmt(f)?;
7259 return f.write_str(")");
7260 }
7261 };
7262 match attr {
7263 DlDpipeTable::DpipeTableName(val) => fmt.field("DpipeTableName", &val),
7264 DlDpipeTable::DpipeTableSize(val) => fmt.field("DpipeTableSize", &val),
7265 DlDpipeTable::DpipeTableMatches(val) => fmt.field("DpipeTableMatches", &val),
7266 DlDpipeTable::DpipeTableActions(val) => fmt.field("DpipeTableActions", &val),
7267 DlDpipeTable::DpipeTableCountersEnabled(val) => {
7268 fmt.field("DpipeTableCountersEnabled", &val)
7269 }
7270 DlDpipeTable::DpipeTableResourceId(val) => fmt.field("DpipeTableResourceId", &val),
7271 DlDpipeTable::DpipeTableResourceUnits(val) => {
7272 fmt.field("DpipeTableResourceUnits", &val)
7273 }
7274 };
7275 }
7276 fmt.finish()
7277 }
7278}
7279impl IterableDlDpipeTable<'_> {
7280 pub fn lookup_attr(
7281 &self,
7282 offset: usize,
7283 missing_type: Option<u16>,
7284 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7285 let mut stack = Vec::new();
7286 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7287 if missing_type.is_some() && cur == offset {
7288 stack.push(("DlDpipeTable", offset));
7289 return (
7290 stack,
7291 missing_type.and_then(|t| DlDpipeTable::attr_from_type(t)),
7292 );
7293 }
7294 if cur > offset || cur + self.buf.len() < offset {
7295 return (stack, None);
7296 }
7297 let mut attrs = self.clone();
7298 let mut last_off = cur + attrs.pos;
7299 let mut missing = None;
7300 while let Some(attr) = attrs.next() {
7301 let Ok(attr) = attr else { break };
7302 match attr {
7303 DlDpipeTable::DpipeTableName(val) => {
7304 if last_off == offset {
7305 stack.push(("DpipeTableName", last_off));
7306 break;
7307 }
7308 }
7309 DlDpipeTable::DpipeTableSize(val) => {
7310 if last_off == offset {
7311 stack.push(("DpipeTableSize", last_off));
7312 break;
7313 }
7314 }
7315 DlDpipeTable::DpipeTableMatches(val) => {
7316 (stack, missing) = val.lookup_attr(offset, missing_type);
7317 if !stack.is_empty() {
7318 break;
7319 }
7320 }
7321 DlDpipeTable::DpipeTableActions(val) => {
7322 (stack, missing) = val.lookup_attr(offset, missing_type);
7323 if !stack.is_empty() {
7324 break;
7325 }
7326 }
7327 DlDpipeTable::DpipeTableCountersEnabled(val) => {
7328 if last_off == offset {
7329 stack.push(("DpipeTableCountersEnabled", last_off));
7330 break;
7331 }
7332 }
7333 DlDpipeTable::DpipeTableResourceId(val) => {
7334 if last_off == offset {
7335 stack.push(("DpipeTableResourceId", last_off));
7336 break;
7337 }
7338 }
7339 DlDpipeTable::DpipeTableResourceUnits(val) => {
7340 if last_off == offset {
7341 stack.push(("DpipeTableResourceUnits", last_off));
7342 break;
7343 }
7344 }
7345 _ => {}
7346 };
7347 last_off = cur + attrs.pos;
7348 }
7349 if !stack.is_empty() {
7350 stack.push(("DlDpipeTable", cur));
7351 }
7352 (stack, missing)
7353 }
7354}
7355#[derive(Clone)]
7356pub enum DlDpipeTableMatches<'a> {
7357 #[doc = "Attribute may repeat multiple times (treat it as array)"]
7358 DpipeMatch(IterableDlDpipeMatch<'a>),
7359}
7360impl<'a> IterableDlDpipeTableMatches<'a> {
7361 #[doc = "Attribute may repeat multiple times (treat it as array)"]
7362 pub fn get_dpipe_match(
7363 &self,
7364 ) -> MultiAttrIterable<Self, DlDpipeTableMatches<'a>, IterableDlDpipeMatch<'a>> {
7365 MultiAttrIterable::new(self.clone(), |variant| {
7366 if let DlDpipeTableMatches::DpipeMatch(val) = variant {
7367 Some(val)
7368 } else {
7369 None
7370 }
7371 })
7372 }
7373}
7374impl DlDpipeTableMatches<'_> {
7375 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeTableMatches<'a> {
7376 IterableDlDpipeTableMatches::with_loc(buf, buf.as_ptr() as usize)
7377 }
7378 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7379 Devlink::attr_from_type(r#type)
7380 }
7381}
7382#[derive(Clone, Copy, Default)]
7383pub struct IterableDlDpipeTableMatches<'a> {
7384 buf: &'a [u8],
7385 pos: usize,
7386 orig_loc: usize,
7387}
7388impl<'a> IterableDlDpipeTableMatches<'a> {
7389 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7390 Self {
7391 buf,
7392 pos: 0,
7393 orig_loc,
7394 }
7395 }
7396 pub fn get_buf(&self) -> &'a [u8] {
7397 self.buf
7398 }
7399}
7400impl<'a> Iterator for IterableDlDpipeTableMatches<'a> {
7401 type Item = Result<DlDpipeTableMatches<'a>, ErrorContext>;
7402 fn next(&mut self) -> Option<Self::Item> {
7403 let pos = self.pos;
7404 let mut r#type;
7405 loop {
7406 r#type = None;
7407 if self.buf.len() == self.pos {
7408 return None;
7409 }
7410 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7411 break;
7412 };
7413 r#type = Some(header.r#type);
7414 let res = match header.r#type {
7415 40u16 => DlDpipeTableMatches::DpipeMatch({
7416 let res = Some(IterableDlDpipeMatch::with_loc(next, self.orig_loc));
7417 let Some(val) = res else { break };
7418 val
7419 }),
7420 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7421 n => continue,
7422 };
7423 return Some(Ok(res));
7424 }
7425 Some(Err(ErrorContext::new(
7426 "DlDpipeTableMatches",
7427 r#type.and_then(|t| DlDpipeTableMatches::attr_from_type(t)),
7428 self.orig_loc,
7429 self.buf.as_ptr().wrapping_add(pos) as usize,
7430 )))
7431 }
7432}
7433impl<'a> std::fmt::Debug for IterableDlDpipeTableMatches<'_> {
7434 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7435 let mut fmt = f.debug_struct("DlDpipeTableMatches");
7436 for attr in self.clone() {
7437 let attr = match attr {
7438 Ok(a) => a,
7439 Err(err) => {
7440 fmt.finish()?;
7441 f.write_str("Err(")?;
7442 err.fmt(f)?;
7443 return f.write_str(")");
7444 }
7445 };
7446 match attr {
7447 DlDpipeTableMatches::DpipeMatch(val) => fmt.field("DpipeMatch", &val),
7448 };
7449 }
7450 fmt.finish()
7451 }
7452}
7453impl IterableDlDpipeTableMatches<'_> {
7454 pub fn lookup_attr(
7455 &self,
7456 offset: usize,
7457 missing_type: Option<u16>,
7458 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7459 let mut stack = Vec::new();
7460 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7461 if missing_type.is_some() && cur == offset {
7462 stack.push(("DlDpipeTableMatches", offset));
7463 return (
7464 stack,
7465 missing_type.and_then(|t| DlDpipeTableMatches::attr_from_type(t)),
7466 );
7467 }
7468 if cur > offset || cur + self.buf.len() < offset {
7469 return (stack, None);
7470 }
7471 let mut attrs = self.clone();
7472 let mut last_off = cur + attrs.pos;
7473 let mut missing = None;
7474 while let Some(attr) = attrs.next() {
7475 let Ok(attr) = attr else { break };
7476 match attr {
7477 DlDpipeTableMatches::DpipeMatch(val) => {
7478 (stack, missing) = val.lookup_attr(offset, missing_type);
7479 if !stack.is_empty() {
7480 break;
7481 }
7482 }
7483 _ => {}
7484 };
7485 last_off = cur + attrs.pos;
7486 }
7487 if !stack.is_empty() {
7488 stack.push(("DlDpipeTableMatches", cur));
7489 }
7490 (stack, missing)
7491 }
7492}
7493#[derive(Clone)]
7494pub enum DlDpipeTableActions<'a> {
7495 #[doc = "Attribute may repeat multiple times (treat it as array)"]
7496 DpipeAction(IterableDlDpipeAction<'a>),
7497}
7498impl<'a> IterableDlDpipeTableActions<'a> {
7499 #[doc = "Attribute may repeat multiple times (treat it as array)"]
7500 pub fn get_dpipe_action(
7501 &self,
7502 ) -> MultiAttrIterable<Self, DlDpipeTableActions<'a>, IterableDlDpipeAction<'a>> {
7503 MultiAttrIterable::new(self.clone(), |variant| {
7504 if let DlDpipeTableActions::DpipeAction(val) = variant {
7505 Some(val)
7506 } else {
7507 None
7508 }
7509 })
7510 }
7511}
7512impl DlDpipeTableActions<'_> {
7513 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeTableActions<'a> {
7514 IterableDlDpipeTableActions::with_loc(buf, buf.as_ptr() as usize)
7515 }
7516 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7517 Devlink::attr_from_type(r#type)
7518 }
7519}
7520#[derive(Clone, Copy, Default)]
7521pub struct IterableDlDpipeTableActions<'a> {
7522 buf: &'a [u8],
7523 pos: usize,
7524 orig_loc: usize,
7525}
7526impl<'a> IterableDlDpipeTableActions<'a> {
7527 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7528 Self {
7529 buf,
7530 pos: 0,
7531 orig_loc,
7532 }
7533 }
7534 pub fn get_buf(&self) -> &'a [u8] {
7535 self.buf
7536 }
7537}
7538impl<'a> Iterator for IterableDlDpipeTableActions<'a> {
7539 type Item = Result<DlDpipeTableActions<'a>, ErrorContext>;
7540 fn next(&mut self) -> Option<Self::Item> {
7541 let pos = self.pos;
7542 let mut r#type;
7543 loop {
7544 r#type = None;
7545 if self.buf.len() == self.pos {
7546 return None;
7547 }
7548 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7549 break;
7550 };
7551 r#type = Some(header.r#type);
7552 let res = match header.r#type {
7553 43u16 => DlDpipeTableActions::DpipeAction({
7554 let res = Some(IterableDlDpipeAction::with_loc(next, self.orig_loc));
7555 let Some(val) = res else { break };
7556 val
7557 }),
7558 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7559 n => continue,
7560 };
7561 return Some(Ok(res));
7562 }
7563 Some(Err(ErrorContext::new(
7564 "DlDpipeTableActions",
7565 r#type.and_then(|t| DlDpipeTableActions::attr_from_type(t)),
7566 self.orig_loc,
7567 self.buf.as_ptr().wrapping_add(pos) as usize,
7568 )))
7569 }
7570}
7571impl<'a> std::fmt::Debug for IterableDlDpipeTableActions<'_> {
7572 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7573 let mut fmt = f.debug_struct("DlDpipeTableActions");
7574 for attr in self.clone() {
7575 let attr = match attr {
7576 Ok(a) => a,
7577 Err(err) => {
7578 fmt.finish()?;
7579 f.write_str("Err(")?;
7580 err.fmt(f)?;
7581 return f.write_str(")");
7582 }
7583 };
7584 match attr {
7585 DlDpipeTableActions::DpipeAction(val) => fmt.field("DpipeAction", &val),
7586 };
7587 }
7588 fmt.finish()
7589 }
7590}
7591impl IterableDlDpipeTableActions<'_> {
7592 pub fn lookup_attr(
7593 &self,
7594 offset: usize,
7595 missing_type: Option<u16>,
7596 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7597 let mut stack = Vec::new();
7598 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7599 if missing_type.is_some() && cur == offset {
7600 stack.push(("DlDpipeTableActions", offset));
7601 return (
7602 stack,
7603 missing_type.and_then(|t| DlDpipeTableActions::attr_from_type(t)),
7604 );
7605 }
7606 if cur > offset || cur + self.buf.len() < offset {
7607 return (stack, None);
7608 }
7609 let mut attrs = self.clone();
7610 let mut last_off = cur + attrs.pos;
7611 let mut missing = None;
7612 while let Some(attr) = attrs.next() {
7613 let Ok(attr) = attr else { break };
7614 match attr {
7615 DlDpipeTableActions::DpipeAction(val) => {
7616 (stack, missing) = val.lookup_attr(offset, missing_type);
7617 if !stack.is_empty() {
7618 break;
7619 }
7620 }
7621 _ => {}
7622 };
7623 last_off = cur + attrs.pos;
7624 }
7625 if !stack.is_empty() {
7626 stack.push(("DlDpipeTableActions", cur));
7627 }
7628 (stack, missing)
7629 }
7630}
7631#[derive(Clone)]
7632pub enum DlDpipeEntries<'a> {
7633 #[doc = "Attribute may repeat multiple times (treat it as array)"]
7634 DpipeEntry(IterableDlDpipeEntry<'a>),
7635}
7636impl<'a> IterableDlDpipeEntries<'a> {
7637 #[doc = "Attribute may repeat multiple times (treat it as array)"]
7638 pub fn get_dpipe_entry(
7639 &self,
7640 ) -> MultiAttrIterable<Self, DlDpipeEntries<'a>, IterableDlDpipeEntry<'a>> {
7641 MultiAttrIterable::new(self.clone(), |variant| {
7642 if let DlDpipeEntries::DpipeEntry(val) = variant {
7643 Some(val)
7644 } else {
7645 None
7646 }
7647 })
7648 }
7649}
7650impl DlDpipeEntries<'_> {
7651 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeEntries<'a> {
7652 IterableDlDpipeEntries::with_loc(buf, buf.as_ptr() as usize)
7653 }
7654 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7655 Devlink::attr_from_type(r#type)
7656 }
7657}
7658#[derive(Clone, Copy, Default)]
7659pub struct IterableDlDpipeEntries<'a> {
7660 buf: &'a [u8],
7661 pos: usize,
7662 orig_loc: usize,
7663}
7664impl<'a> IterableDlDpipeEntries<'a> {
7665 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7666 Self {
7667 buf,
7668 pos: 0,
7669 orig_loc,
7670 }
7671 }
7672 pub fn get_buf(&self) -> &'a [u8] {
7673 self.buf
7674 }
7675}
7676impl<'a> Iterator for IterableDlDpipeEntries<'a> {
7677 type Item = Result<DlDpipeEntries<'a>, ErrorContext>;
7678 fn next(&mut self) -> Option<Self::Item> {
7679 let pos = self.pos;
7680 let mut r#type;
7681 loop {
7682 r#type = None;
7683 if self.buf.len() == self.pos {
7684 return None;
7685 }
7686 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7687 break;
7688 };
7689 r#type = Some(header.r#type);
7690 let res = match header.r#type {
7691 35u16 => DlDpipeEntries::DpipeEntry({
7692 let res = Some(IterableDlDpipeEntry::with_loc(next, self.orig_loc));
7693 let Some(val) = res else { break };
7694 val
7695 }),
7696 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7697 n => continue,
7698 };
7699 return Some(Ok(res));
7700 }
7701 Some(Err(ErrorContext::new(
7702 "DlDpipeEntries",
7703 r#type.and_then(|t| DlDpipeEntries::attr_from_type(t)),
7704 self.orig_loc,
7705 self.buf.as_ptr().wrapping_add(pos) as usize,
7706 )))
7707 }
7708}
7709impl<'a> std::fmt::Debug for IterableDlDpipeEntries<'_> {
7710 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7711 let mut fmt = f.debug_struct("DlDpipeEntries");
7712 for attr in self.clone() {
7713 let attr = match attr {
7714 Ok(a) => a,
7715 Err(err) => {
7716 fmt.finish()?;
7717 f.write_str("Err(")?;
7718 err.fmt(f)?;
7719 return f.write_str(")");
7720 }
7721 };
7722 match attr {
7723 DlDpipeEntries::DpipeEntry(val) => fmt.field("DpipeEntry", &val),
7724 };
7725 }
7726 fmt.finish()
7727 }
7728}
7729impl IterableDlDpipeEntries<'_> {
7730 pub fn lookup_attr(
7731 &self,
7732 offset: usize,
7733 missing_type: Option<u16>,
7734 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7735 let mut stack = Vec::new();
7736 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7737 if missing_type.is_some() && cur == offset {
7738 stack.push(("DlDpipeEntries", offset));
7739 return (
7740 stack,
7741 missing_type.and_then(|t| DlDpipeEntries::attr_from_type(t)),
7742 );
7743 }
7744 if cur > offset || cur + self.buf.len() < offset {
7745 return (stack, None);
7746 }
7747 let mut attrs = self.clone();
7748 let mut last_off = cur + attrs.pos;
7749 let mut missing = None;
7750 while let Some(attr) = attrs.next() {
7751 let Ok(attr) = attr else { break };
7752 match attr {
7753 DlDpipeEntries::DpipeEntry(val) => {
7754 (stack, missing) = val.lookup_attr(offset, missing_type);
7755 if !stack.is_empty() {
7756 break;
7757 }
7758 }
7759 _ => {}
7760 };
7761 last_off = cur + attrs.pos;
7762 }
7763 if !stack.is_empty() {
7764 stack.push(("DlDpipeEntries", cur));
7765 }
7766 (stack, missing)
7767 }
7768}
7769#[derive(Clone)]
7770pub enum DlDpipeEntry<'a> {
7771 DpipeEntryIndex(u64),
7772 DpipeEntryMatchValues(IterableDlDpipeEntryMatchValues<'a>),
7773 DpipeEntryActionValues(IterableDlDpipeEntryActionValues<'a>),
7774 DpipeEntryCounter(u64),
7775}
7776impl<'a> IterableDlDpipeEntry<'a> {
7777 pub fn get_dpipe_entry_index(&self) -> Result<u64, ErrorContext> {
7778 let mut iter = self.clone();
7779 iter.pos = 0;
7780 for attr in iter {
7781 if let DlDpipeEntry::DpipeEntryIndex(val) = attr? {
7782 return Ok(val);
7783 }
7784 }
7785 Err(ErrorContext::new_missing(
7786 "DlDpipeEntry",
7787 "DpipeEntryIndex",
7788 self.orig_loc,
7789 self.buf.as_ptr() as usize,
7790 ))
7791 }
7792 pub fn get_dpipe_entry_match_values(
7793 &self,
7794 ) -> Result<IterableDlDpipeEntryMatchValues<'a>, ErrorContext> {
7795 let mut iter = self.clone();
7796 iter.pos = 0;
7797 for attr in iter {
7798 if let DlDpipeEntry::DpipeEntryMatchValues(val) = attr? {
7799 return Ok(val);
7800 }
7801 }
7802 Err(ErrorContext::new_missing(
7803 "DlDpipeEntry",
7804 "DpipeEntryMatchValues",
7805 self.orig_loc,
7806 self.buf.as_ptr() as usize,
7807 ))
7808 }
7809 pub fn get_dpipe_entry_action_values(
7810 &self,
7811 ) -> Result<IterableDlDpipeEntryActionValues<'a>, ErrorContext> {
7812 let mut iter = self.clone();
7813 iter.pos = 0;
7814 for attr in iter {
7815 if let DlDpipeEntry::DpipeEntryActionValues(val) = attr? {
7816 return Ok(val);
7817 }
7818 }
7819 Err(ErrorContext::new_missing(
7820 "DlDpipeEntry",
7821 "DpipeEntryActionValues",
7822 self.orig_loc,
7823 self.buf.as_ptr() as usize,
7824 ))
7825 }
7826 pub fn get_dpipe_entry_counter(&self) -> Result<u64, ErrorContext> {
7827 let mut iter = self.clone();
7828 iter.pos = 0;
7829 for attr in iter {
7830 if let DlDpipeEntry::DpipeEntryCounter(val) = attr? {
7831 return Ok(val);
7832 }
7833 }
7834 Err(ErrorContext::new_missing(
7835 "DlDpipeEntry",
7836 "DpipeEntryCounter",
7837 self.orig_loc,
7838 self.buf.as_ptr() as usize,
7839 ))
7840 }
7841}
7842impl DlDpipeEntry<'_> {
7843 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeEntry<'a> {
7844 IterableDlDpipeEntry::with_loc(buf, buf.as_ptr() as usize)
7845 }
7846 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7847 Devlink::attr_from_type(r#type)
7848 }
7849}
7850#[derive(Clone, Copy, Default)]
7851pub struct IterableDlDpipeEntry<'a> {
7852 buf: &'a [u8],
7853 pos: usize,
7854 orig_loc: usize,
7855}
7856impl<'a> IterableDlDpipeEntry<'a> {
7857 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7858 Self {
7859 buf,
7860 pos: 0,
7861 orig_loc,
7862 }
7863 }
7864 pub fn get_buf(&self) -> &'a [u8] {
7865 self.buf
7866 }
7867}
7868impl<'a> Iterator for IterableDlDpipeEntry<'a> {
7869 type Item = Result<DlDpipeEntry<'a>, ErrorContext>;
7870 fn next(&mut self) -> Option<Self::Item> {
7871 let pos = self.pos;
7872 let mut r#type;
7873 loop {
7874 r#type = None;
7875 if self.buf.len() == self.pos {
7876 return None;
7877 }
7878 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7879 break;
7880 };
7881 r#type = Some(header.r#type);
7882 let res = match header.r#type {
7883 36u16 => DlDpipeEntry::DpipeEntryIndex({
7884 let res = parse_u64(next);
7885 let Some(val) = res else { break };
7886 val
7887 }),
7888 37u16 => DlDpipeEntry::DpipeEntryMatchValues({
7889 let res = Some(IterableDlDpipeEntryMatchValues::with_loc(
7890 next,
7891 self.orig_loc,
7892 ));
7893 let Some(val) = res else { break };
7894 val
7895 }),
7896 38u16 => DlDpipeEntry::DpipeEntryActionValues({
7897 let res = Some(IterableDlDpipeEntryActionValues::with_loc(
7898 next,
7899 self.orig_loc,
7900 ));
7901 let Some(val) = res else { break };
7902 val
7903 }),
7904 39u16 => DlDpipeEntry::DpipeEntryCounter({
7905 let res = parse_u64(next);
7906 let Some(val) = res else { break };
7907 val
7908 }),
7909 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7910 n => continue,
7911 };
7912 return Some(Ok(res));
7913 }
7914 Some(Err(ErrorContext::new(
7915 "DlDpipeEntry",
7916 r#type.and_then(|t| DlDpipeEntry::attr_from_type(t)),
7917 self.orig_loc,
7918 self.buf.as_ptr().wrapping_add(pos) as usize,
7919 )))
7920 }
7921}
7922impl<'a> std::fmt::Debug for IterableDlDpipeEntry<'_> {
7923 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7924 let mut fmt = f.debug_struct("DlDpipeEntry");
7925 for attr in self.clone() {
7926 let attr = match attr {
7927 Ok(a) => a,
7928 Err(err) => {
7929 fmt.finish()?;
7930 f.write_str("Err(")?;
7931 err.fmt(f)?;
7932 return f.write_str(")");
7933 }
7934 };
7935 match attr {
7936 DlDpipeEntry::DpipeEntryIndex(val) => fmt.field("DpipeEntryIndex", &val),
7937 DlDpipeEntry::DpipeEntryMatchValues(val) => {
7938 fmt.field("DpipeEntryMatchValues", &val)
7939 }
7940 DlDpipeEntry::DpipeEntryActionValues(val) => {
7941 fmt.field("DpipeEntryActionValues", &val)
7942 }
7943 DlDpipeEntry::DpipeEntryCounter(val) => fmt.field("DpipeEntryCounter", &val),
7944 };
7945 }
7946 fmt.finish()
7947 }
7948}
7949impl IterableDlDpipeEntry<'_> {
7950 pub fn lookup_attr(
7951 &self,
7952 offset: usize,
7953 missing_type: Option<u16>,
7954 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7955 let mut stack = Vec::new();
7956 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7957 if missing_type.is_some() && cur == offset {
7958 stack.push(("DlDpipeEntry", offset));
7959 return (
7960 stack,
7961 missing_type.and_then(|t| DlDpipeEntry::attr_from_type(t)),
7962 );
7963 }
7964 if cur > offset || cur + self.buf.len() < offset {
7965 return (stack, None);
7966 }
7967 let mut attrs = self.clone();
7968 let mut last_off = cur + attrs.pos;
7969 let mut missing = None;
7970 while let Some(attr) = attrs.next() {
7971 let Ok(attr) = attr else { break };
7972 match attr {
7973 DlDpipeEntry::DpipeEntryIndex(val) => {
7974 if last_off == offset {
7975 stack.push(("DpipeEntryIndex", last_off));
7976 break;
7977 }
7978 }
7979 DlDpipeEntry::DpipeEntryMatchValues(val) => {
7980 (stack, missing) = val.lookup_attr(offset, missing_type);
7981 if !stack.is_empty() {
7982 break;
7983 }
7984 }
7985 DlDpipeEntry::DpipeEntryActionValues(val) => {
7986 (stack, missing) = val.lookup_attr(offset, missing_type);
7987 if !stack.is_empty() {
7988 break;
7989 }
7990 }
7991 DlDpipeEntry::DpipeEntryCounter(val) => {
7992 if last_off == offset {
7993 stack.push(("DpipeEntryCounter", last_off));
7994 break;
7995 }
7996 }
7997 _ => {}
7998 };
7999 last_off = cur + attrs.pos;
8000 }
8001 if !stack.is_empty() {
8002 stack.push(("DlDpipeEntry", cur));
8003 }
8004 (stack, missing)
8005 }
8006}
8007#[derive(Clone)]
8008pub enum DlDpipeEntryMatchValues<'a> {
8009 #[doc = "Attribute may repeat multiple times (treat it as array)"]
8010 DpipeMatchValue(IterableDlDpipeMatchValue<'a>),
8011}
8012impl<'a> IterableDlDpipeEntryMatchValues<'a> {
8013 #[doc = "Attribute may repeat multiple times (treat it as array)"]
8014 pub fn get_dpipe_match_value(
8015 &self,
8016 ) -> MultiAttrIterable<Self, DlDpipeEntryMatchValues<'a>, IterableDlDpipeMatchValue<'a>> {
8017 MultiAttrIterable::new(self.clone(), |variant| {
8018 if let DlDpipeEntryMatchValues::DpipeMatchValue(val) = variant {
8019 Some(val)
8020 } else {
8021 None
8022 }
8023 })
8024 }
8025}
8026impl DlDpipeEntryMatchValues<'_> {
8027 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeEntryMatchValues<'a> {
8028 IterableDlDpipeEntryMatchValues::with_loc(buf, buf.as_ptr() as usize)
8029 }
8030 fn attr_from_type(r#type: u16) -> Option<&'static str> {
8031 Devlink::attr_from_type(r#type)
8032 }
8033}
8034#[derive(Clone, Copy, Default)]
8035pub struct IterableDlDpipeEntryMatchValues<'a> {
8036 buf: &'a [u8],
8037 pos: usize,
8038 orig_loc: usize,
8039}
8040impl<'a> IterableDlDpipeEntryMatchValues<'a> {
8041 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8042 Self {
8043 buf,
8044 pos: 0,
8045 orig_loc,
8046 }
8047 }
8048 pub fn get_buf(&self) -> &'a [u8] {
8049 self.buf
8050 }
8051}
8052impl<'a> Iterator for IterableDlDpipeEntryMatchValues<'a> {
8053 type Item = Result<DlDpipeEntryMatchValues<'a>, ErrorContext>;
8054 fn next(&mut self) -> Option<Self::Item> {
8055 let pos = self.pos;
8056 let mut r#type;
8057 loop {
8058 r#type = None;
8059 if self.buf.len() == self.pos {
8060 return None;
8061 }
8062 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8063 break;
8064 };
8065 r#type = Some(header.r#type);
8066 let res = match header.r#type {
8067 41u16 => DlDpipeEntryMatchValues::DpipeMatchValue({
8068 let res = Some(IterableDlDpipeMatchValue::with_loc(next, self.orig_loc));
8069 let Some(val) = res else { break };
8070 val
8071 }),
8072 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8073 n => continue,
8074 };
8075 return Some(Ok(res));
8076 }
8077 Some(Err(ErrorContext::new(
8078 "DlDpipeEntryMatchValues",
8079 r#type.and_then(|t| DlDpipeEntryMatchValues::attr_from_type(t)),
8080 self.orig_loc,
8081 self.buf.as_ptr().wrapping_add(pos) as usize,
8082 )))
8083 }
8084}
8085impl<'a> std::fmt::Debug for IterableDlDpipeEntryMatchValues<'_> {
8086 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8087 let mut fmt = f.debug_struct("DlDpipeEntryMatchValues");
8088 for attr in self.clone() {
8089 let attr = match attr {
8090 Ok(a) => a,
8091 Err(err) => {
8092 fmt.finish()?;
8093 f.write_str("Err(")?;
8094 err.fmt(f)?;
8095 return f.write_str(")");
8096 }
8097 };
8098 match attr {
8099 DlDpipeEntryMatchValues::DpipeMatchValue(val) => fmt.field("DpipeMatchValue", &val),
8100 };
8101 }
8102 fmt.finish()
8103 }
8104}
8105impl IterableDlDpipeEntryMatchValues<'_> {
8106 pub fn lookup_attr(
8107 &self,
8108 offset: usize,
8109 missing_type: Option<u16>,
8110 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8111 let mut stack = Vec::new();
8112 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8113 if missing_type.is_some() && cur == offset {
8114 stack.push(("DlDpipeEntryMatchValues", offset));
8115 return (
8116 stack,
8117 missing_type.and_then(|t| DlDpipeEntryMatchValues::attr_from_type(t)),
8118 );
8119 }
8120 if cur > offset || cur + self.buf.len() < offset {
8121 return (stack, None);
8122 }
8123 let mut attrs = self.clone();
8124 let mut last_off = cur + attrs.pos;
8125 let mut missing = None;
8126 while let Some(attr) = attrs.next() {
8127 let Ok(attr) = attr else { break };
8128 match attr {
8129 DlDpipeEntryMatchValues::DpipeMatchValue(val) => {
8130 (stack, missing) = val.lookup_attr(offset, missing_type);
8131 if !stack.is_empty() {
8132 break;
8133 }
8134 }
8135 _ => {}
8136 };
8137 last_off = cur + attrs.pos;
8138 }
8139 if !stack.is_empty() {
8140 stack.push(("DlDpipeEntryMatchValues", cur));
8141 }
8142 (stack, missing)
8143 }
8144}
8145#[derive(Clone)]
8146pub enum DlDpipeEntryActionValues<'a> {
8147 #[doc = "Attribute may repeat multiple times (treat it as array)"]
8148 DpipeActionValue(IterableDlDpipeActionValue<'a>),
8149}
8150impl<'a> IterableDlDpipeEntryActionValues<'a> {
8151 #[doc = "Attribute may repeat multiple times (treat it as array)"]
8152 pub fn get_dpipe_action_value(
8153 &self,
8154 ) -> MultiAttrIterable<Self, DlDpipeEntryActionValues<'a>, IterableDlDpipeActionValue<'a>> {
8155 MultiAttrIterable::new(self.clone(), |variant| {
8156 if let DlDpipeEntryActionValues::DpipeActionValue(val) = variant {
8157 Some(val)
8158 } else {
8159 None
8160 }
8161 })
8162 }
8163}
8164impl DlDpipeEntryActionValues<'_> {
8165 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeEntryActionValues<'a> {
8166 IterableDlDpipeEntryActionValues::with_loc(buf, buf.as_ptr() as usize)
8167 }
8168 fn attr_from_type(r#type: u16) -> Option<&'static str> {
8169 Devlink::attr_from_type(r#type)
8170 }
8171}
8172#[derive(Clone, Copy, Default)]
8173pub struct IterableDlDpipeEntryActionValues<'a> {
8174 buf: &'a [u8],
8175 pos: usize,
8176 orig_loc: usize,
8177}
8178impl<'a> IterableDlDpipeEntryActionValues<'a> {
8179 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8180 Self {
8181 buf,
8182 pos: 0,
8183 orig_loc,
8184 }
8185 }
8186 pub fn get_buf(&self) -> &'a [u8] {
8187 self.buf
8188 }
8189}
8190impl<'a> Iterator for IterableDlDpipeEntryActionValues<'a> {
8191 type Item = Result<DlDpipeEntryActionValues<'a>, ErrorContext>;
8192 fn next(&mut self) -> Option<Self::Item> {
8193 let pos = self.pos;
8194 let mut r#type;
8195 loop {
8196 r#type = None;
8197 if self.buf.len() == self.pos {
8198 return None;
8199 }
8200 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8201 break;
8202 };
8203 r#type = Some(header.r#type);
8204 let res = match header.r#type {
8205 44u16 => DlDpipeEntryActionValues::DpipeActionValue({
8206 let res = Some(IterableDlDpipeActionValue::with_loc(next, self.orig_loc));
8207 let Some(val) = res else { break };
8208 val
8209 }),
8210 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8211 n => continue,
8212 };
8213 return Some(Ok(res));
8214 }
8215 Some(Err(ErrorContext::new(
8216 "DlDpipeEntryActionValues",
8217 r#type.and_then(|t| DlDpipeEntryActionValues::attr_from_type(t)),
8218 self.orig_loc,
8219 self.buf.as_ptr().wrapping_add(pos) as usize,
8220 )))
8221 }
8222}
8223impl<'a> std::fmt::Debug for IterableDlDpipeEntryActionValues<'_> {
8224 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8225 let mut fmt = f.debug_struct("DlDpipeEntryActionValues");
8226 for attr in self.clone() {
8227 let attr = match attr {
8228 Ok(a) => a,
8229 Err(err) => {
8230 fmt.finish()?;
8231 f.write_str("Err(")?;
8232 err.fmt(f)?;
8233 return f.write_str(")");
8234 }
8235 };
8236 match attr {
8237 DlDpipeEntryActionValues::DpipeActionValue(val) => {
8238 fmt.field("DpipeActionValue", &val)
8239 }
8240 };
8241 }
8242 fmt.finish()
8243 }
8244}
8245impl IterableDlDpipeEntryActionValues<'_> {
8246 pub fn lookup_attr(
8247 &self,
8248 offset: usize,
8249 missing_type: Option<u16>,
8250 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8251 let mut stack = Vec::new();
8252 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8253 if missing_type.is_some() && cur == offset {
8254 stack.push(("DlDpipeEntryActionValues", offset));
8255 return (
8256 stack,
8257 missing_type.and_then(|t| DlDpipeEntryActionValues::attr_from_type(t)),
8258 );
8259 }
8260 if cur > offset || cur + self.buf.len() < offset {
8261 return (stack, None);
8262 }
8263 let mut attrs = self.clone();
8264 let mut last_off = cur + attrs.pos;
8265 let mut missing = None;
8266 while let Some(attr) = attrs.next() {
8267 let Ok(attr) = attr else { break };
8268 match attr {
8269 DlDpipeEntryActionValues::DpipeActionValue(val) => {
8270 (stack, missing) = val.lookup_attr(offset, missing_type);
8271 if !stack.is_empty() {
8272 break;
8273 }
8274 }
8275 _ => {}
8276 };
8277 last_off = cur + attrs.pos;
8278 }
8279 if !stack.is_empty() {
8280 stack.push(("DlDpipeEntryActionValues", cur));
8281 }
8282 (stack, missing)
8283 }
8284}
8285#[derive(Clone)]
8286pub enum DlDpipeMatch {
8287 #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
8288 DpipeMatchType(u32),
8289 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
8290 DpipeHeaderId(u32),
8291 DpipeHeaderGlobal(u8),
8292 DpipeHeaderIndex(u32),
8293 DpipeFieldId(u32),
8294}
8295impl<'a> IterableDlDpipeMatch<'a> {
8296 #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
8297 pub fn get_dpipe_match_type(&self) -> Result<u32, ErrorContext> {
8298 let mut iter = self.clone();
8299 iter.pos = 0;
8300 for attr in iter {
8301 if let DlDpipeMatch::DpipeMatchType(val) = attr? {
8302 return Ok(val);
8303 }
8304 }
8305 Err(ErrorContext::new_missing(
8306 "DlDpipeMatch",
8307 "DpipeMatchType",
8308 self.orig_loc,
8309 self.buf.as_ptr() as usize,
8310 ))
8311 }
8312 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
8313 pub fn get_dpipe_header_id(&self) -> Result<u32, ErrorContext> {
8314 let mut iter = self.clone();
8315 iter.pos = 0;
8316 for attr in iter {
8317 if let DlDpipeMatch::DpipeHeaderId(val) = attr? {
8318 return Ok(val);
8319 }
8320 }
8321 Err(ErrorContext::new_missing(
8322 "DlDpipeMatch",
8323 "DpipeHeaderId",
8324 self.orig_loc,
8325 self.buf.as_ptr() as usize,
8326 ))
8327 }
8328 pub fn get_dpipe_header_global(&self) -> Result<u8, ErrorContext> {
8329 let mut iter = self.clone();
8330 iter.pos = 0;
8331 for attr in iter {
8332 if let DlDpipeMatch::DpipeHeaderGlobal(val) = attr? {
8333 return Ok(val);
8334 }
8335 }
8336 Err(ErrorContext::new_missing(
8337 "DlDpipeMatch",
8338 "DpipeHeaderGlobal",
8339 self.orig_loc,
8340 self.buf.as_ptr() as usize,
8341 ))
8342 }
8343 pub fn get_dpipe_header_index(&self) -> Result<u32, ErrorContext> {
8344 let mut iter = self.clone();
8345 iter.pos = 0;
8346 for attr in iter {
8347 if let DlDpipeMatch::DpipeHeaderIndex(val) = attr? {
8348 return Ok(val);
8349 }
8350 }
8351 Err(ErrorContext::new_missing(
8352 "DlDpipeMatch",
8353 "DpipeHeaderIndex",
8354 self.orig_loc,
8355 self.buf.as_ptr() as usize,
8356 ))
8357 }
8358 pub fn get_dpipe_field_id(&self) -> Result<u32, ErrorContext> {
8359 let mut iter = self.clone();
8360 iter.pos = 0;
8361 for attr in iter {
8362 if let DlDpipeMatch::DpipeFieldId(val) = attr? {
8363 return Ok(val);
8364 }
8365 }
8366 Err(ErrorContext::new_missing(
8367 "DlDpipeMatch",
8368 "DpipeFieldId",
8369 self.orig_loc,
8370 self.buf.as_ptr() as usize,
8371 ))
8372 }
8373}
8374impl DlDpipeMatch {
8375 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeMatch<'a> {
8376 IterableDlDpipeMatch::with_loc(buf, buf.as_ptr() as usize)
8377 }
8378 fn attr_from_type(r#type: u16) -> Option<&'static str> {
8379 Devlink::attr_from_type(r#type)
8380 }
8381}
8382#[derive(Clone, Copy, Default)]
8383pub struct IterableDlDpipeMatch<'a> {
8384 buf: &'a [u8],
8385 pos: usize,
8386 orig_loc: usize,
8387}
8388impl<'a> IterableDlDpipeMatch<'a> {
8389 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8390 Self {
8391 buf,
8392 pos: 0,
8393 orig_loc,
8394 }
8395 }
8396 pub fn get_buf(&self) -> &'a [u8] {
8397 self.buf
8398 }
8399}
8400impl<'a> Iterator for IterableDlDpipeMatch<'a> {
8401 type Item = Result<DlDpipeMatch, ErrorContext>;
8402 fn next(&mut self) -> Option<Self::Item> {
8403 let pos = self.pos;
8404 let mut r#type;
8405 loop {
8406 r#type = None;
8407 if self.buf.len() == self.pos {
8408 return None;
8409 }
8410 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8411 break;
8412 };
8413 r#type = Some(header.r#type);
8414 let res = match header.r#type {
8415 42u16 => DlDpipeMatch::DpipeMatchType({
8416 let res = parse_u32(next);
8417 let Some(val) = res else { break };
8418 val
8419 }),
8420 52u16 => DlDpipeMatch::DpipeHeaderId({
8421 let res = parse_u32(next);
8422 let Some(val) = res else { break };
8423 val
8424 }),
8425 54u16 => DlDpipeMatch::DpipeHeaderGlobal({
8426 let res = parse_u8(next);
8427 let Some(val) = res else { break };
8428 val
8429 }),
8430 55u16 => DlDpipeMatch::DpipeHeaderIndex({
8431 let res = parse_u32(next);
8432 let Some(val) = res else { break };
8433 val
8434 }),
8435 58u16 => DlDpipeMatch::DpipeFieldId({
8436 let res = parse_u32(next);
8437 let Some(val) = res else { break };
8438 val
8439 }),
8440 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8441 n => continue,
8442 };
8443 return Some(Ok(res));
8444 }
8445 Some(Err(ErrorContext::new(
8446 "DlDpipeMatch",
8447 r#type.and_then(|t| DlDpipeMatch::attr_from_type(t)),
8448 self.orig_loc,
8449 self.buf.as_ptr().wrapping_add(pos) as usize,
8450 )))
8451 }
8452}
8453impl std::fmt::Debug for IterableDlDpipeMatch<'_> {
8454 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8455 let mut fmt = f.debug_struct("DlDpipeMatch");
8456 for attr in self.clone() {
8457 let attr = match attr {
8458 Ok(a) => a,
8459 Err(err) => {
8460 fmt.finish()?;
8461 f.write_str("Err(")?;
8462 err.fmt(f)?;
8463 return f.write_str(")");
8464 }
8465 };
8466 match attr {
8467 DlDpipeMatch::DpipeMatchType(val) => fmt.field(
8468 "DpipeMatchType",
8469 &FormatEnum(val.into(), DpipeMatchType::from_value),
8470 ),
8471 DlDpipeMatch::DpipeHeaderId(val) => fmt.field(
8472 "DpipeHeaderId",
8473 &FormatEnum(val.into(), DpipeHeaderId::from_value),
8474 ),
8475 DlDpipeMatch::DpipeHeaderGlobal(val) => fmt.field("DpipeHeaderGlobal", &val),
8476 DlDpipeMatch::DpipeHeaderIndex(val) => fmt.field("DpipeHeaderIndex", &val),
8477 DlDpipeMatch::DpipeFieldId(val) => fmt.field("DpipeFieldId", &val),
8478 };
8479 }
8480 fmt.finish()
8481 }
8482}
8483impl IterableDlDpipeMatch<'_> {
8484 pub fn lookup_attr(
8485 &self,
8486 offset: usize,
8487 missing_type: Option<u16>,
8488 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8489 let mut stack = Vec::new();
8490 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8491 if missing_type.is_some() && cur == offset {
8492 stack.push(("DlDpipeMatch", offset));
8493 return (
8494 stack,
8495 missing_type.and_then(|t| DlDpipeMatch::attr_from_type(t)),
8496 );
8497 }
8498 if cur > offset || cur + self.buf.len() < offset {
8499 return (stack, None);
8500 }
8501 let mut attrs = self.clone();
8502 let mut last_off = cur + attrs.pos;
8503 while let Some(attr) = attrs.next() {
8504 let Ok(attr) = attr else { break };
8505 match attr {
8506 DlDpipeMatch::DpipeMatchType(val) => {
8507 if last_off == offset {
8508 stack.push(("DpipeMatchType", last_off));
8509 break;
8510 }
8511 }
8512 DlDpipeMatch::DpipeHeaderId(val) => {
8513 if last_off == offset {
8514 stack.push(("DpipeHeaderId", last_off));
8515 break;
8516 }
8517 }
8518 DlDpipeMatch::DpipeHeaderGlobal(val) => {
8519 if last_off == offset {
8520 stack.push(("DpipeHeaderGlobal", last_off));
8521 break;
8522 }
8523 }
8524 DlDpipeMatch::DpipeHeaderIndex(val) => {
8525 if last_off == offset {
8526 stack.push(("DpipeHeaderIndex", last_off));
8527 break;
8528 }
8529 }
8530 DlDpipeMatch::DpipeFieldId(val) => {
8531 if last_off == offset {
8532 stack.push(("DpipeFieldId", last_off));
8533 break;
8534 }
8535 }
8536 _ => {}
8537 };
8538 last_off = cur + attrs.pos;
8539 }
8540 if !stack.is_empty() {
8541 stack.push(("DlDpipeMatch", cur));
8542 }
8543 (stack, None)
8544 }
8545}
8546#[derive(Clone)]
8547pub enum DlDpipeMatchValue<'a> {
8548 #[doc = "Attribute may repeat multiple times (treat it as array)"]
8549 DpipeMatch(IterableDlDpipeMatch<'a>),
8550 DpipeValue(&'a [u8]),
8551 DpipeValueMask(&'a [u8]),
8552 DpipeValueMapping(u32),
8553}
8554impl<'a> IterableDlDpipeMatchValue<'a> {
8555 #[doc = "Attribute may repeat multiple times (treat it as array)"]
8556 pub fn get_dpipe_match(
8557 &self,
8558 ) -> MultiAttrIterable<Self, DlDpipeMatchValue<'a>, IterableDlDpipeMatch<'a>> {
8559 MultiAttrIterable::new(self.clone(), |variant| {
8560 if let DlDpipeMatchValue::DpipeMatch(val) = variant {
8561 Some(val)
8562 } else {
8563 None
8564 }
8565 })
8566 }
8567 pub fn get_dpipe_value(&self) -> Result<&'a [u8], ErrorContext> {
8568 let mut iter = self.clone();
8569 iter.pos = 0;
8570 for attr in iter {
8571 if let DlDpipeMatchValue::DpipeValue(val) = attr? {
8572 return Ok(val);
8573 }
8574 }
8575 Err(ErrorContext::new_missing(
8576 "DlDpipeMatchValue",
8577 "DpipeValue",
8578 self.orig_loc,
8579 self.buf.as_ptr() as usize,
8580 ))
8581 }
8582 pub fn get_dpipe_value_mask(&self) -> Result<&'a [u8], ErrorContext> {
8583 let mut iter = self.clone();
8584 iter.pos = 0;
8585 for attr in iter {
8586 if let DlDpipeMatchValue::DpipeValueMask(val) = attr? {
8587 return Ok(val);
8588 }
8589 }
8590 Err(ErrorContext::new_missing(
8591 "DlDpipeMatchValue",
8592 "DpipeValueMask",
8593 self.orig_loc,
8594 self.buf.as_ptr() as usize,
8595 ))
8596 }
8597 pub fn get_dpipe_value_mapping(&self) -> Result<u32, ErrorContext> {
8598 let mut iter = self.clone();
8599 iter.pos = 0;
8600 for attr in iter {
8601 if let DlDpipeMatchValue::DpipeValueMapping(val) = attr? {
8602 return Ok(val);
8603 }
8604 }
8605 Err(ErrorContext::new_missing(
8606 "DlDpipeMatchValue",
8607 "DpipeValueMapping",
8608 self.orig_loc,
8609 self.buf.as_ptr() as usize,
8610 ))
8611 }
8612}
8613impl DlDpipeMatchValue<'_> {
8614 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeMatchValue<'a> {
8615 IterableDlDpipeMatchValue::with_loc(buf, buf.as_ptr() as usize)
8616 }
8617 fn attr_from_type(r#type: u16) -> Option<&'static str> {
8618 Devlink::attr_from_type(r#type)
8619 }
8620}
8621#[derive(Clone, Copy, Default)]
8622pub struct IterableDlDpipeMatchValue<'a> {
8623 buf: &'a [u8],
8624 pos: usize,
8625 orig_loc: usize,
8626}
8627impl<'a> IterableDlDpipeMatchValue<'a> {
8628 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8629 Self {
8630 buf,
8631 pos: 0,
8632 orig_loc,
8633 }
8634 }
8635 pub fn get_buf(&self) -> &'a [u8] {
8636 self.buf
8637 }
8638}
8639impl<'a> Iterator for IterableDlDpipeMatchValue<'a> {
8640 type Item = Result<DlDpipeMatchValue<'a>, ErrorContext>;
8641 fn next(&mut self) -> Option<Self::Item> {
8642 let pos = self.pos;
8643 let mut r#type;
8644 loop {
8645 r#type = None;
8646 if self.buf.len() == self.pos {
8647 return None;
8648 }
8649 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8650 break;
8651 };
8652 r#type = Some(header.r#type);
8653 let res = match header.r#type {
8654 40u16 => DlDpipeMatchValue::DpipeMatch({
8655 let res = Some(IterableDlDpipeMatch::with_loc(next, self.orig_loc));
8656 let Some(val) = res else { break };
8657 val
8658 }),
8659 46u16 => DlDpipeMatchValue::DpipeValue({
8660 let res = Some(next);
8661 let Some(val) = res else { break };
8662 val
8663 }),
8664 47u16 => DlDpipeMatchValue::DpipeValueMask({
8665 let res = Some(next);
8666 let Some(val) = res else { break };
8667 val
8668 }),
8669 48u16 => DlDpipeMatchValue::DpipeValueMapping({
8670 let res = parse_u32(next);
8671 let Some(val) = res else { break };
8672 val
8673 }),
8674 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8675 n => continue,
8676 };
8677 return Some(Ok(res));
8678 }
8679 Some(Err(ErrorContext::new(
8680 "DlDpipeMatchValue",
8681 r#type.and_then(|t| DlDpipeMatchValue::attr_from_type(t)),
8682 self.orig_loc,
8683 self.buf.as_ptr().wrapping_add(pos) as usize,
8684 )))
8685 }
8686}
8687impl<'a> std::fmt::Debug for IterableDlDpipeMatchValue<'_> {
8688 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8689 let mut fmt = f.debug_struct("DlDpipeMatchValue");
8690 for attr in self.clone() {
8691 let attr = match attr {
8692 Ok(a) => a,
8693 Err(err) => {
8694 fmt.finish()?;
8695 f.write_str("Err(")?;
8696 err.fmt(f)?;
8697 return f.write_str(")");
8698 }
8699 };
8700 match attr {
8701 DlDpipeMatchValue::DpipeMatch(val) => fmt.field("DpipeMatch", &val),
8702 DlDpipeMatchValue::DpipeValue(val) => fmt.field("DpipeValue", &val),
8703 DlDpipeMatchValue::DpipeValueMask(val) => fmt.field("DpipeValueMask", &val),
8704 DlDpipeMatchValue::DpipeValueMapping(val) => fmt.field("DpipeValueMapping", &val),
8705 };
8706 }
8707 fmt.finish()
8708 }
8709}
8710impl IterableDlDpipeMatchValue<'_> {
8711 pub fn lookup_attr(
8712 &self,
8713 offset: usize,
8714 missing_type: Option<u16>,
8715 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8716 let mut stack = Vec::new();
8717 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8718 if missing_type.is_some() && cur == offset {
8719 stack.push(("DlDpipeMatchValue", offset));
8720 return (
8721 stack,
8722 missing_type.and_then(|t| DlDpipeMatchValue::attr_from_type(t)),
8723 );
8724 }
8725 if cur > offset || cur + self.buf.len() < offset {
8726 return (stack, None);
8727 }
8728 let mut attrs = self.clone();
8729 let mut last_off = cur + attrs.pos;
8730 let mut missing = None;
8731 while let Some(attr) = attrs.next() {
8732 let Ok(attr) = attr else { break };
8733 match attr {
8734 DlDpipeMatchValue::DpipeMatch(val) => {
8735 (stack, missing) = val.lookup_attr(offset, missing_type);
8736 if !stack.is_empty() {
8737 break;
8738 }
8739 }
8740 DlDpipeMatchValue::DpipeValue(val) => {
8741 if last_off == offset {
8742 stack.push(("DpipeValue", last_off));
8743 break;
8744 }
8745 }
8746 DlDpipeMatchValue::DpipeValueMask(val) => {
8747 if last_off == offset {
8748 stack.push(("DpipeValueMask", last_off));
8749 break;
8750 }
8751 }
8752 DlDpipeMatchValue::DpipeValueMapping(val) => {
8753 if last_off == offset {
8754 stack.push(("DpipeValueMapping", last_off));
8755 break;
8756 }
8757 }
8758 _ => {}
8759 };
8760 last_off = cur + attrs.pos;
8761 }
8762 if !stack.is_empty() {
8763 stack.push(("DlDpipeMatchValue", cur));
8764 }
8765 (stack, missing)
8766 }
8767}
8768#[derive(Clone)]
8769pub enum DlDpipeAction {
8770 #[doc = "Associated type: [`DpipeActionType`] (enum)"]
8771 DpipeActionType(u32),
8772 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
8773 DpipeHeaderId(u32),
8774 DpipeHeaderGlobal(u8),
8775 DpipeHeaderIndex(u32),
8776 DpipeFieldId(u32),
8777}
8778impl<'a> IterableDlDpipeAction<'a> {
8779 #[doc = "Associated type: [`DpipeActionType`] (enum)"]
8780 pub fn get_dpipe_action_type(&self) -> Result<u32, ErrorContext> {
8781 let mut iter = self.clone();
8782 iter.pos = 0;
8783 for attr in iter {
8784 if let DlDpipeAction::DpipeActionType(val) = attr? {
8785 return Ok(val);
8786 }
8787 }
8788 Err(ErrorContext::new_missing(
8789 "DlDpipeAction",
8790 "DpipeActionType",
8791 self.orig_loc,
8792 self.buf.as_ptr() as usize,
8793 ))
8794 }
8795 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
8796 pub fn get_dpipe_header_id(&self) -> Result<u32, ErrorContext> {
8797 let mut iter = self.clone();
8798 iter.pos = 0;
8799 for attr in iter {
8800 if let DlDpipeAction::DpipeHeaderId(val) = attr? {
8801 return Ok(val);
8802 }
8803 }
8804 Err(ErrorContext::new_missing(
8805 "DlDpipeAction",
8806 "DpipeHeaderId",
8807 self.orig_loc,
8808 self.buf.as_ptr() as usize,
8809 ))
8810 }
8811 pub fn get_dpipe_header_global(&self) -> Result<u8, ErrorContext> {
8812 let mut iter = self.clone();
8813 iter.pos = 0;
8814 for attr in iter {
8815 if let DlDpipeAction::DpipeHeaderGlobal(val) = attr? {
8816 return Ok(val);
8817 }
8818 }
8819 Err(ErrorContext::new_missing(
8820 "DlDpipeAction",
8821 "DpipeHeaderGlobal",
8822 self.orig_loc,
8823 self.buf.as_ptr() as usize,
8824 ))
8825 }
8826 pub fn get_dpipe_header_index(&self) -> Result<u32, ErrorContext> {
8827 let mut iter = self.clone();
8828 iter.pos = 0;
8829 for attr in iter {
8830 if let DlDpipeAction::DpipeHeaderIndex(val) = attr? {
8831 return Ok(val);
8832 }
8833 }
8834 Err(ErrorContext::new_missing(
8835 "DlDpipeAction",
8836 "DpipeHeaderIndex",
8837 self.orig_loc,
8838 self.buf.as_ptr() as usize,
8839 ))
8840 }
8841 pub fn get_dpipe_field_id(&self) -> Result<u32, ErrorContext> {
8842 let mut iter = self.clone();
8843 iter.pos = 0;
8844 for attr in iter {
8845 if let DlDpipeAction::DpipeFieldId(val) = attr? {
8846 return Ok(val);
8847 }
8848 }
8849 Err(ErrorContext::new_missing(
8850 "DlDpipeAction",
8851 "DpipeFieldId",
8852 self.orig_loc,
8853 self.buf.as_ptr() as usize,
8854 ))
8855 }
8856}
8857impl DlDpipeAction {
8858 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeAction<'a> {
8859 IterableDlDpipeAction::with_loc(buf, buf.as_ptr() as usize)
8860 }
8861 fn attr_from_type(r#type: u16) -> Option<&'static str> {
8862 Devlink::attr_from_type(r#type)
8863 }
8864}
8865#[derive(Clone, Copy, Default)]
8866pub struct IterableDlDpipeAction<'a> {
8867 buf: &'a [u8],
8868 pos: usize,
8869 orig_loc: usize,
8870}
8871impl<'a> IterableDlDpipeAction<'a> {
8872 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
8873 Self {
8874 buf,
8875 pos: 0,
8876 orig_loc,
8877 }
8878 }
8879 pub fn get_buf(&self) -> &'a [u8] {
8880 self.buf
8881 }
8882}
8883impl<'a> Iterator for IterableDlDpipeAction<'a> {
8884 type Item = Result<DlDpipeAction, ErrorContext>;
8885 fn next(&mut self) -> Option<Self::Item> {
8886 let pos = self.pos;
8887 let mut r#type;
8888 loop {
8889 r#type = None;
8890 if self.buf.len() == self.pos {
8891 return None;
8892 }
8893 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8894 break;
8895 };
8896 r#type = Some(header.r#type);
8897 let res = match header.r#type {
8898 45u16 => DlDpipeAction::DpipeActionType({
8899 let res = parse_u32(next);
8900 let Some(val) = res else { break };
8901 val
8902 }),
8903 52u16 => DlDpipeAction::DpipeHeaderId({
8904 let res = parse_u32(next);
8905 let Some(val) = res else { break };
8906 val
8907 }),
8908 54u16 => DlDpipeAction::DpipeHeaderGlobal({
8909 let res = parse_u8(next);
8910 let Some(val) = res else { break };
8911 val
8912 }),
8913 55u16 => DlDpipeAction::DpipeHeaderIndex({
8914 let res = parse_u32(next);
8915 let Some(val) = res else { break };
8916 val
8917 }),
8918 58u16 => DlDpipeAction::DpipeFieldId({
8919 let res = parse_u32(next);
8920 let Some(val) = res else { break };
8921 val
8922 }),
8923 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8924 n => continue,
8925 };
8926 return Some(Ok(res));
8927 }
8928 Some(Err(ErrorContext::new(
8929 "DlDpipeAction",
8930 r#type.and_then(|t| DlDpipeAction::attr_from_type(t)),
8931 self.orig_loc,
8932 self.buf.as_ptr().wrapping_add(pos) as usize,
8933 )))
8934 }
8935}
8936impl std::fmt::Debug for IterableDlDpipeAction<'_> {
8937 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8938 let mut fmt = f.debug_struct("DlDpipeAction");
8939 for attr in self.clone() {
8940 let attr = match attr {
8941 Ok(a) => a,
8942 Err(err) => {
8943 fmt.finish()?;
8944 f.write_str("Err(")?;
8945 err.fmt(f)?;
8946 return f.write_str(")");
8947 }
8948 };
8949 match attr {
8950 DlDpipeAction::DpipeActionType(val) => fmt.field(
8951 "DpipeActionType",
8952 &FormatEnum(val.into(), DpipeActionType::from_value),
8953 ),
8954 DlDpipeAction::DpipeHeaderId(val) => fmt.field(
8955 "DpipeHeaderId",
8956 &FormatEnum(val.into(), DpipeHeaderId::from_value),
8957 ),
8958 DlDpipeAction::DpipeHeaderGlobal(val) => fmt.field("DpipeHeaderGlobal", &val),
8959 DlDpipeAction::DpipeHeaderIndex(val) => fmt.field("DpipeHeaderIndex", &val),
8960 DlDpipeAction::DpipeFieldId(val) => fmt.field("DpipeFieldId", &val),
8961 };
8962 }
8963 fmt.finish()
8964 }
8965}
8966impl IterableDlDpipeAction<'_> {
8967 pub fn lookup_attr(
8968 &self,
8969 offset: usize,
8970 missing_type: Option<u16>,
8971 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8972 let mut stack = Vec::new();
8973 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8974 if missing_type.is_some() && cur == offset {
8975 stack.push(("DlDpipeAction", offset));
8976 return (
8977 stack,
8978 missing_type.and_then(|t| DlDpipeAction::attr_from_type(t)),
8979 );
8980 }
8981 if cur > offset || cur + self.buf.len() < offset {
8982 return (stack, None);
8983 }
8984 let mut attrs = self.clone();
8985 let mut last_off = cur + attrs.pos;
8986 while let Some(attr) = attrs.next() {
8987 let Ok(attr) = attr else { break };
8988 match attr {
8989 DlDpipeAction::DpipeActionType(val) => {
8990 if last_off == offset {
8991 stack.push(("DpipeActionType", last_off));
8992 break;
8993 }
8994 }
8995 DlDpipeAction::DpipeHeaderId(val) => {
8996 if last_off == offset {
8997 stack.push(("DpipeHeaderId", last_off));
8998 break;
8999 }
9000 }
9001 DlDpipeAction::DpipeHeaderGlobal(val) => {
9002 if last_off == offset {
9003 stack.push(("DpipeHeaderGlobal", last_off));
9004 break;
9005 }
9006 }
9007 DlDpipeAction::DpipeHeaderIndex(val) => {
9008 if last_off == offset {
9009 stack.push(("DpipeHeaderIndex", last_off));
9010 break;
9011 }
9012 }
9013 DlDpipeAction::DpipeFieldId(val) => {
9014 if last_off == offset {
9015 stack.push(("DpipeFieldId", last_off));
9016 break;
9017 }
9018 }
9019 _ => {}
9020 };
9021 last_off = cur + attrs.pos;
9022 }
9023 if !stack.is_empty() {
9024 stack.push(("DlDpipeAction", cur));
9025 }
9026 (stack, None)
9027 }
9028}
9029#[derive(Clone)]
9030pub enum DlDpipeActionValue<'a> {
9031 #[doc = "Attribute may repeat multiple times (treat it as array)"]
9032 DpipeAction(IterableDlDpipeAction<'a>),
9033 DpipeValue(&'a [u8]),
9034 DpipeValueMask(&'a [u8]),
9035 DpipeValueMapping(u32),
9036}
9037impl<'a> IterableDlDpipeActionValue<'a> {
9038 #[doc = "Attribute may repeat multiple times (treat it as array)"]
9039 pub fn get_dpipe_action(
9040 &self,
9041 ) -> MultiAttrIterable<Self, DlDpipeActionValue<'a>, IterableDlDpipeAction<'a>> {
9042 MultiAttrIterable::new(self.clone(), |variant| {
9043 if let DlDpipeActionValue::DpipeAction(val) = variant {
9044 Some(val)
9045 } else {
9046 None
9047 }
9048 })
9049 }
9050 pub fn get_dpipe_value(&self) -> Result<&'a [u8], ErrorContext> {
9051 let mut iter = self.clone();
9052 iter.pos = 0;
9053 for attr in iter {
9054 if let DlDpipeActionValue::DpipeValue(val) = attr? {
9055 return Ok(val);
9056 }
9057 }
9058 Err(ErrorContext::new_missing(
9059 "DlDpipeActionValue",
9060 "DpipeValue",
9061 self.orig_loc,
9062 self.buf.as_ptr() as usize,
9063 ))
9064 }
9065 pub fn get_dpipe_value_mask(&self) -> Result<&'a [u8], ErrorContext> {
9066 let mut iter = self.clone();
9067 iter.pos = 0;
9068 for attr in iter {
9069 if let DlDpipeActionValue::DpipeValueMask(val) = attr? {
9070 return Ok(val);
9071 }
9072 }
9073 Err(ErrorContext::new_missing(
9074 "DlDpipeActionValue",
9075 "DpipeValueMask",
9076 self.orig_loc,
9077 self.buf.as_ptr() as usize,
9078 ))
9079 }
9080 pub fn get_dpipe_value_mapping(&self) -> Result<u32, ErrorContext> {
9081 let mut iter = self.clone();
9082 iter.pos = 0;
9083 for attr in iter {
9084 if let DlDpipeActionValue::DpipeValueMapping(val) = attr? {
9085 return Ok(val);
9086 }
9087 }
9088 Err(ErrorContext::new_missing(
9089 "DlDpipeActionValue",
9090 "DpipeValueMapping",
9091 self.orig_loc,
9092 self.buf.as_ptr() as usize,
9093 ))
9094 }
9095}
9096impl DlDpipeActionValue<'_> {
9097 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeActionValue<'a> {
9098 IterableDlDpipeActionValue::with_loc(buf, buf.as_ptr() as usize)
9099 }
9100 fn attr_from_type(r#type: u16) -> Option<&'static str> {
9101 Devlink::attr_from_type(r#type)
9102 }
9103}
9104#[derive(Clone, Copy, Default)]
9105pub struct IterableDlDpipeActionValue<'a> {
9106 buf: &'a [u8],
9107 pos: usize,
9108 orig_loc: usize,
9109}
9110impl<'a> IterableDlDpipeActionValue<'a> {
9111 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9112 Self {
9113 buf,
9114 pos: 0,
9115 orig_loc,
9116 }
9117 }
9118 pub fn get_buf(&self) -> &'a [u8] {
9119 self.buf
9120 }
9121}
9122impl<'a> Iterator for IterableDlDpipeActionValue<'a> {
9123 type Item = Result<DlDpipeActionValue<'a>, ErrorContext>;
9124 fn next(&mut self) -> Option<Self::Item> {
9125 let pos = self.pos;
9126 let mut r#type;
9127 loop {
9128 r#type = None;
9129 if self.buf.len() == self.pos {
9130 return None;
9131 }
9132 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9133 break;
9134 };
9135 r#type = Some(header.r#type);
9136 let res = match header.r#type {
9137 43u16 => DlDpipeActionValue::DpipeAction({
9138 let res = Some(IterableDlDpipeAction::with_loc(next, self.orig_loc));
9139 let Some(val) = res else { break };
9140 val
9141 }),
9142 46u16 => DlDpipeActionValue::DpipeValue({
9143 let res = Some(next);
9144 let Some(val) = res else { break };
9145 val
9146 }),
9147 47u16 => DlDpipeActionValue::DpipeValueMask({
9148 let res = Some(next);
9149 let Some(val) = res else { break };
9150 val
9151 }),
9152 48u16 => DlDpipeActionValue::DpipeValueMapping({
9153 let res = parse_u32(next);
9154 let Some(val) = res else { break };
9155 val
9156 }),
9157 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9158 n => continue,
9159 };
9160 return Some(Ok(res));
9161 }
9162 Some(Err(ErrorContext::new(
9163 "DlDpipeActionValue",
9164 r#type.and_then(|t| DlDpipeActionValue::attr_from_type(t)),
9165 self.orig_loc,
9166 self.buf.as_ptr().wrapping_add(pos) as usize,
9167 )))
9168 }
9169}
9170impl<'a> std::fmt::Debug for IterableDlDpipeActionValue<'_> {
9171 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9172 let mut fmt = f.debug_struct("DlDpipeActionValue");
9173 for attr in self.clone() {
9174 let attr = match attr {
9175 Ok(a) => a,
9176 Err(err) => {
9177 fmt.finish()?;
9178 f.write_str("Err(")?;
9179 err.fmt(f)?;
9180 return f.write_str(")");
9181 }
9182 };
9183 match attr {
9184 DlDpipeActionValue::DpipeAction(val) => fmt.field("DpipeAction", &val),
9185 DlDpipeActionValue::DpipeValue(val) => fmt.field("DpipeValue", &val),
9186 DlDpipeActionValue::DpipeValueMask(val) => fmt.field("DpipeValueMask", &val),
9187 DlDpipeActionValue::DpipeValueMapping(val) => fmt.field("DpipeValueMapping", &val),
9188 };
9189 }
9190 fmt.finish()
9191 }
9192}
9193impl IterableDlDpipeActionValue<'_> {
9194 pub fn lookup_attr(
9195 &self,
9196 offset: usize,
9197 missing_type: Option<u16>,
9198 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9199 let mut stack = Vec::new();
9200 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9201 if missing_type.is_some() && cur == offset {
9202 stack.push(("DlDpipeActionValue", offset));
9203 return (
9204 stack,
9205 missing_type.and_then(|t| DlDpipeActionValue::attr_from_type(t)),
9206 );
9207 }
9208 if cur > offset || cur + self.buf.len() < offset {
9209 return (stack, None);
9210 }
9211 let mut attrs = self.clone();
9212 let mut last_off = cur + attrs.pos;
9213 let mut missing = None;
9214 while let Some(attr) = attrs.next() {
9215 let Ok(attr) = attr else { break };
9216 match attr {
9217 DlDpipeActionValue::DpipeAction(val) => {
9218 (stack, missing) = val.lookup_attr(offset, missing_type);
9219 if !stack.is_empty() {
9220 break;
9221 }
9222 }
9223 DlDpipeActionValue::DpipeValue(val) => {
9224 if last_off == offset {
9225 stack.push(("DpipeValue", last_off));
9226 break;
9227 }
9228 }
9229 DlDpipeActionValue::DpipeValueMask(val) => {
9230 if last_off == offset {
9231 stack.push(("DpipeValueMask", last_off));
9232 break;
9233 }
9234 }
9235 DlDpipeActionValue::DpipeValueMapping(val) => {
9236 if last_off == offset {
9237 stack.push(("DpipeValueMapping", last_off));
9238 break;
9239 }
9240 }
9241 _ => {}
9242 };
9243 last_off = cur + attrs.pos;
9244 }
9245 if !stack.is_empty() {
9246 stack.push(("DlDpipeActionValue", cur));
9247 }
9248 (stack, missing)
9249 }
9250}
9251#[derive(Clone)]
9252pub enum DlDpipeHeaders<'a> {
9253 #[doc = "Attribute may repeat multiple times (treat it as array)"]
9254 DpipeHeader(IterableDlDpipeHeader<'a>),
9255}
9256impl<'a> IterableDlDpipeHeaders<'a> {
9257 #[doc = "Attribute may repeat multiple times (treat it as array)"]
9258 pub fn get_dpipe_header(
9259 &self,
9260 ) -> MultiAttrIterable<Self, DlDpipeHeaders<'a>, IterableDlDpipeHeader<'a>> {
9261 MultiAttrIterable::new(self.clone(), |variant| {
9262 if let DlDpipeHeaders::DpipeHeader(val) = variant {
9263 Some(val)
9264 } else {
9265 None
9266 }
9267 })
9268 }
9269}
9270impl DlDpipeHeaders<'_> {
9271 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeHeaders<'a> {
9272 IterableDlDpipeHeaders::with_loc(buf, buf.as_ptr() as usize)
9273 }
9274 fn attr_from_type(r#type: u16) -> Option<&'static str> {
9275 Devlink::attr_from_type(r#type)
9276 }
9277}
9278#[derive(Clone, Copy, Default)]
9279pub struct IterableDlDpipeHeaders<'a> {
9280 buf: &'a [u8],
9281 pos: usize,
9282 orig_loc: usize,
9283}
9284impl<'a> IterableDlDpipeHeaders<'a> {
9285 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9286 Self {
9287 buf,
9288 pos: 0,
9289 orig_loc,
9290 }
9291 }
9292 pub fn get_buf(&self) -> &'a [u8] {
9293 self.buf
9294 }
9295}
9296impl<'a> Iterator for IterableDlDpipeHeaders<'a> {
9297 type Item = Result<DlDpipeHeaders<'a>, ErrorContext>;
9298 fn next(&mut self) -> Option<Self::Item> {
9299 let pos = self.pos;
9300 let mut r#type;
9301 loop {
9302 r#type = None;
9303 if self.buf.len() == self.pos {
9304 return None;
9305 }
9306 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9307 break;
9308 };
9309 r#type = Some(header.r#type);
9310 let res = match header.r#type {
9311 50u16 => DlDpipeHeaders::DpipeHeader({
9312 let res = Some(IterableDlDpipeHeader::with_loc(next, self.orig_loc));
9313 let Some(val) = res else { break };
9314 val
9315 }),
9316 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9317 n => continue,
9318 };
9319 return Some(Ok(res));
9320 }
9321 Some(Err(ErrorContext::new(
9322 "DlDpipeHeaders",
9323 r#type.and_then(|t| DlDpipeHeaders::attr_from_type(t)),
9324 self.orig_loc,
9325 self.buf.as_ptr().wrapping_add(pos) as usize,
9326 )))
9327 }
9328}
9329impl<'a> std::fmt::Debug for IterableDlDpipeHeaders<'_> {
9330 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9331 let mut fmt = f.debug_struct("DlDpipeHeaders");
9332 for attr in self.clone() {
9333 let attr = match attr {
9334 Ok(a) => a,
9335 Err(err) => {
9336 fmt.finish()?;
9337 f.write_str("Err(")?;
9338 err.fmt(f)?;
9339 return f.write_str(")");
9340 }
9341 };
9342 match attr {
9343 DlDpipeHeaders::DpipeHeader(val) => fmt.field("DpipeHeader", &val),
9344 };
9345 }
9346 fmt.finish()
9347 }
9348}
9349impl IterableDlDpipeHeaders<'_> {
9350 pub fn lookup_attr(
9351 &self,
9352 offset: usize,
9353 missing_type: Option<u16>,
9354 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9355 let mut stack = Vec::new();
9356 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9357 if missing_type.is_some() && cur == offset {
9358 stack.push(("DlDpipeHeaders", offset));
9359 return (
9360 stack,
9361 missing_type.and_then(|t| DlDpipeHeaders::attr_from_type(t)),
9362 );
9363 }
9364 if cur > offset || cur + self.buf.len() < offset {
9365 return (stack, None);
9366 }
9367 let mut attrs = self.clone();
9368 let mut last_off = cur + attrs.pos;
9369 let mut missing = None;
9370 while let Some(attr) = attrs.next() {
9371 let Ok(attr) = attr else { break };
9372 match attr {
9373 DlDpipeHeaders::DpipeHeader(val) => {
9374 (stack, missing) = val.lookup_attr(offset, missing_type);
9375 if !stack.is_empty() {
9376 break;
9377 }
9378 }
9379 _ => {}
9380 };
9381 last_off = cur + attrs.pos;
9382 }
9383 if !stack.is_empty() {
9384 stack.push(("DlDpipeHeaders", cur));
9385 }
9386 (stack, missing)
9387 }
9388}
9389#[derive(Clone)]
9390pub enum DlDpipeHeader<'a> {
9391 DpipeHeaderName(&'a CStr),
9392 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
9393 DpipeHeaderId(u32),
9394 DpipeHeaderFields(IterableDlDpipeHeaderFields<'a>),
9395 DpipeHeaderGlobal(u8),
9396}
9397impl<'a> IterableDlDpipeHeader<'a> {
9398 pub fn get_dpipe_header_name(&self) -> Result<&'a CStr, ErrorContext> {
9399 let mut iter = self.clone();
9400 iter.pos = 0;
9401 for attr in iter {
9402 if let DlDpipeHeader::DpipeHeaderName(val) = attr? {
9403 return Ok(val);
9404 }
9405 }
9406 Err(ErrorContext::new_missing(
9407 "DlDpipeHeader",
9408 "DpipeHeaderName",
9409 self.orig_loc,
9410 self.buf.as_ptr() as usize,
9411 ))
9412 }
9413 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
9414 pub fn get_dpipe_header_id(&self) -> Result<u32, ErrorContext> {
9415 let mut iter = self.clone();
9416 iter.pos = 0;
9417 for attr in iter {
9418 if let DlDpipeHeader::DpipeHeaderId(val) = attr? {
9419 return Ok(val);
9420 }
9421 }
9422 Err(ErrorContext::new_missing(
9423 "DlDpipeHeader",
9424 "DpipeHeaderId",
9425 self.orig_loc,
9426 self.buf.as_ptr() as usize,
9427 ))
9428 }
9429 pub fn get_dpipe_header_fields(&self) -> Result<IterableDlDpipeHeaderFields<'a>, ErrorContext> {
9430 let mut iter = self.clone();
9431 iter.pos = 0;
9432 for attr in iter {
9433 if let DlDpipeHeader::DpipeHeaderFields(val) = attr? {
9434 return Ok(val);
9435 }
9436 }
9437 Err(ErrorContext::new_missing(
9438 "DlDpipeHeader",
9439 "DpipeHeaderFields",
9440 self.orig_loc,
9441 self.buf.as_ptr() as usize,
9442 ))
9443 }
9444 pub fn get_dpipe_header_global(&self) -> Result<u8, ErrorContext> {
9445 let mut iter = self.clone();
9446 iter.pos = 0;
9447 for attr in iter {
9448 if let DlDpipeHeader::DpipeHeaderGlobal(val) = attr? {
9449 return Ok(val);
9450 }
9451 }
9452 Err(ErrorContext::new_missing(
9453 "DlDpipeHeader",
9454 "DpipeHeaderGlobal",
9455 self.orig_loc,
9456 self.buf.as_ptr() as usize,
9457 ))
9458 }
9459}
9460impl DlDpipeHeader<'_> {
9461 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeHeader<'a> {
9462 IterableDlDpipeHeader::with_loc(buf, buf.as_ptr() as usize)
9463 }
9464 fn attr_from_type(r#type: u16) -> Option<&'static str> {
9465 Devlink::attr_from_type(r#type)
9466 }
9467}
9468#[derive(Clone, Copy, Default)]
9469pub struct IterableDlDpipeHeader<'a> {
9470 buf: &'a [u8],
9471 pos: usize,
9472 orig_loc: usize,
9473}
9474impl<'a> IterableDlDpipeHeader<'a> {
9475 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9476 Self {
9477 buf,
9478 pos: 0,
9479 orig_loc,
9480 }
9481 }
9482 pub fn get_buf(&self) -> &'a [u8] {
9483 self.buf
9484 }
9485}
9486impl<'a> Iterator for IterableDlDpipeHeader<'a> {
9487 type Item = Result<DlDpipeHeader<'a>, ErrorContext>;
9488 fn next(&mut self) -> Option<Self::Item> {
9489 let pos = self.pos;
9490 let mut r#type;
9491 loop {
9492 r#type = None;
9493 if self.buf.len() == self.pos {
9494 return None;
9495 }
9496 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9497 break;
9498 };
9499 r#type = Some(header.r#type);
9500 let res = match header.r#type {
9501 51u16 => DlDpipeHeader::DpipeHeaderName({
9502 let res = CStr::from_bytes_with_nul(next).ok();
9503 let Some(val) = res else { break };
9504 val
9505 }),
9506 52u16 => DlDpipeHeader::DpipeHeaderId({
9507 let res = parse_u32(next);
9508 let Some(val) = res else { break };
9509 val
9510 }),
9511 53u16 => DlDpipeHeader::DpipeHeaderFields({
9512 let res = Some(IterableDlDpipeHeaderFields::with_loc(next, self.orig_loc));
9513 let Some(val) = res else { break };
9514 val
9515 }),
9516 54u16 => DlDpipeHeader::DpipeHeaderGlobal({
9517 let res = parse_u8(next);
9518 let Some(val) = res else { break };
9519 val
9520 }),
9521 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9522 n => continue,
9523 };
9524 return Some(Ok(res));
9525 }
9526 Some(Err(ErrorContext::new(
9527 "DlDpipeHeader",
9528 r#type.and_then(|t| DlDpipeHeader::attr_from_type(t)),
9529 self.orig_loc,
9530 self.buf.as_ptr().wrapping_add(pos) as usize,
9531 )))
9532 }
9533}
9534impl<'a> std::fmt::Debug for IterableDlDpipeHeader<'_> {
9535 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9536 let mut fmt = f.debug_struct("DlDpipeHeader");
9537 for attr in self.clone() {
9538 let attr = match attr {
9539 Ok(a) => a,
9540 Err(err) => {
9541 fmt.finish()?;
9542 f.write_str("Err(")?;
9543 err.fmt(f)?;
9544 return f.write_str(")");
9545 }
9546 };
9547 match attr {
9548 DlDpipeHeader::DpipeHeaderName(val) => fmt.field("DpipeHeaderName", &val),
9549 DlDpipeHeader::DpipeHeaderId(val) => fmt.field(
9550 "DpipeHeaderId",
9551 &FormatEnum(val.into(), DpipeHeaderId::from_value),
9552 ),
9553 DlDpipeHeader::DpipeHeaderFields(val) => fmt.field("DpipeHeaderFields", &val),
9554 DlDpipeHeader::DpipeHeaderGlobal(val) => fmt.field("DpipeHeaderGlobal", &val),
9555 };
9556 }
9557 fmt.finish()
9558 }
9559}
9560impl IterableDlDpipeHeader<'_> {
9561 pub fn lookup_attr(
9562 &self,
9563 offset: usize,
9564 missing_type: Option<u16>,
9565 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9566 let mut stack = Vec::new();
9567 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9568 if missing_type.is_some() && cur == offset {
9569 stack.push(("DlDpipeHeader", offset));
9570 return (
9571 stack,
9572 missing_type.and_then(|t| DlDpipeHeader::attr_from_type(t)),
9573 );
9574 }
9575 if cur > offset || cur + self.buf.len() < offset {
9576 return (stack, None);
9577 }
9578 let mut attrs = self.clone();
9579 let mut last_off = cur + attrs.pos;
9580 let mut missing = None;
9581 while let Some(attr) = attrs.next() {
9582 let Ok(attr) = attr else { break };
9583 match attr {
9584 DlDpipeHeader::DpipeHeaderName(val) => {
9585 if last_off == offset {
9586 stack.push(("DpipeHeaderName", last_off));
9587 break;
9588 }
9589 }
9590 DlDpipeHeader::DpipeHeaderId(val) => {
9591 if last_off == offset {
9592 stack.push(("DpipeHeaderId", last_off));
9593 break;
9594 }
9595 }
9596 DlDpipeHeader::DpipeHeaderFields(val) => {
9597 (stack, missing) = val.lookup_attr(offset, missing_type);
9598 if !stack.is_empty() {
9599 break;
9600 }
9601 }
9602 DlDpipeHeader::DpipeHeaderGlobal(val) => {
9603 if last_off == offset {
9604 stack.push(("DpipeHeaderGlobal", last_off));
9605 break;
9606 }
9607 }
9608 _ => {}
9609 };
9610 last_off = cur + attrs.pos;
9611 }
9612 if !stack.is_empty() {
9613 stack.push(("DlDpipeHeader", cur));
9614 }
9615 (stack, missing)
9616 }
9617}
9618#[derive(Clone)]
9619pub enum DlDpipeHeaderFields<'a> {
9620 #[doc = "Attribute may repeat multiple times (treat it as array)"]
9621 DpipeField(IterableDlDpipeField<'a>),
9622}
9623impl<'a> IterableDlDpipeHeaderFields<'a> {
9624 #[doc = "Attribute may repeat multiple times (treat it as array)"]
9625 pub fn get_dpipe_field(
9626 &self,
9627 ) -> MultiAttrIterable<Self, DlDpipeHeaderFields<'a>, IterableDlDpipeField<'a>> {
9628 MultiAttrIterable::new(self.clone(), |variant| {
9629 if let DlDpipeHeaderFields::DpipeField(val) = variant {
9630 Some(val)
9631 } else {
9632 None
9633 }
9634 })
9635 }
9636}
9637impl DlDpipeHeaderFields<'_> {
9638 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeHeaderFields<'a> {
9639 IterableDlDpipeHeaderFields::with_loc(buf, buf.as_ptr() as usize)
9640 }
9641 fn attr_from_type(r#type: u16) -> Option<&'static str> {
9642 Devlink::attr_from_type(r#type)
9643 }
9644}
9645#[derive(Clone, Copy, Default)]
9646pub struct IterableDlDpipeHeaderFields<'a> {
9647 buf: &'a [u8],
9648 pos: usize,
9649 orig_loc: usize,
9650}
9651impl<'a> IterableDlDpipeHeaderFields<'a> {
9652 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9653 Self {
9654 buf,
9655 pos: 0,
9656 orig_loc,
9657 }
9658 }
9659 pub fn get_buf(&self) -> &'a [u8] {
9660 self.buf
9661 }
9662}
9663impl<'a> Iterator for IterableDlDpipeHeaderFields<'a> {
9664 type Item = Result<DlDpipeHeaderFields<'a>, ErrorContext>;
9665 fn next(&mut self) -> Option<Self::Item> {
9666 let pos = self.pos;
9667 let mut r#type;
9668 loop {
9669 r#type = None;
9670 if self.buf.len() == self.pos {
9671 return None;
9672 }
9673 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9674 break;
9675 };
9676 r#type = Some(header.r#type);
9677 let res = match header.r#type {
9678 56u16 => DlDpipeHeaderFields::DpipeField({
9679 let res = Some(IterableDlDpipeField::with_loc(next, self.orig_loc));
9680 let Some(val) = res else { break };
9681 val
9682 }),
9683 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9684 n => continue,
9685 };
9686 return Some(Ok(res));
9687 }
9688 Some(Err(ErrorContext::new(
9689 "DlDpipeHeaderFields",
9690 r#type.and_then(|t| DlDpipeHeaderFields::attr_from_type(t)),
9691 self.orig_loc,
9692 self.buf.as_ptr().wrapping_add(pos) as usize,
9693 )))
9694 }
9695}
9696impl<'a> std::fmt::Debug for IterableDlDpipeHeaderFields<'_> {
9697 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9698 let mut fmt = f.debug_struct("DlDpipeHeaderFields");
9699 for attr in self.clone() {
9700 let attr = match attr {
9701 Ok(a) => a,
9702 Err(err) => {
9703 fmt.finish()?;
9704 f.write_str("Err(")?;
9705 err.fmt(f)?;
9706 return f.write_str(")");
9707 }
9708 };
9709 match attr {
9710 DlDpipeHeaderFields::DpipeField(val) => fmt.field("DpipeField", &val),
9711 };
9712 }
9713 fmt.finish()
9714 }
9715}
9716impl IterableDlDpipeHeaderFields<'_> {
9717 pub fn lookup_attr(
9718 &self,
9719 offset: usize,
9720 missing_type: Option<u16>,
9721 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9722 let mut stack = Vec::new();
9723 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9724 if missing_type.is_some() && cur == offset {
9725 stack.push(("DlDpipeHeaderFields", offset));
9726 return (
9727 stack,
9728 missing_type.and_then(|t| DlDpipeHeaderFields::attr_from_type(t)),
9729 );
9730 }
9731 if cur > offset || cur + self.buf.len() < offset {
9732 return (stack, None);
9733 }
9734 let mut attrs = self.clone();
9735 let mut last_off = cur + attrs.pos;
9736 let mut missing = None;
9737 while let Some(attr) = attrs.next() {
9738 let Ok(attr) = attr else { break };
9739 match attr {
9740 DlDpipeHeaderFields::DpipeField(val) => {
9741 (stack, missing) = val.lookup_attr(offset, missing_type);
9742 if !stack.is_empty() {
9743 break;
9744 }
9745 }
9746 _ => {}
9747 };
9748 last_off = cur + attrs.pos;
9749 }
9750 if !stack.is_empty() {
9751 stack.push(("DlDpipeHeaderFields", cur));
9752 }
9753 (stack, missing)
9754 }
9755}
9756#[derive(Clone)]
9757pub enum DlDpipeField<'a> {
9758 DpipeFieldName(&'a CStr),
9759 DpipeFieldId(u32),
9760 DpipeFieldBitwidth(u32),
9761 #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
9762 DpipeFieldMappingType(u32),
9763}
9764impl<'a> IterableDlDpipeField<'a> {
9765 pub fn get_dpipe_field_name(&self) -> Result<&'a CStr, ErrorContext> {
9766 let mut iter = self.clone();
9767 iter.pos = 0;
9768 for attr in iter {
9769 if let DlDpipeField::DpipeFieldName(val) = attr? {
9770 return Ok(val);
9771 }
9772 }
9773 Err(ErrorContext::new_missing(
9774 "DlDpipeField",
9775 "DpipeFieldName",
9776 self.orig_loc,
9777 self.buf.as_ptr() as usize,
9778 ))
9779 }
9780 pub fn get_dpipe_field_id(&self) -> Result<u32, ErrorContext> {
9781 let mut iter = self.clone();
9782 iter.pos = 0;
9783 for attr in iter {
9784 if let DlDpipeField::DpipeFieldId(val) = attr? {
9785 return Ok(val);
9786 }
9787 }
9788 Err(ErrorContext::new_missing(
9789 "DlDpipeField",
9790 "DpipeFieldId",
9791 self.orig_loc,
9792 self.buf.as_ptr() as usize,
9793 ))
9794 }
9795 pub fn get_dpipe_field_bitwidth(&self) -> Result<u32, ErrorContext> {
9796 let mut iter = self.clone();
9797 iter.pos = 0;
9798 for attr in iter {
9799 if let DlDpipeField::DpipeFieldBitwidth(val) = attr? {
9800 return Ok(val);
9801 }
9802 }
9803 Err(ErrorContext::new_missing(
9804 "DlDpipeField",
9805 "DpipeFieldBitwidth",
9806 self.orig_loc,
9807 self.buf.as_ptr() as usize,
9808 ))
9809 }
9810 #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
9811 pub fn get_dpipe_field_mapping_type(&self) -> Result<u32, ErrorContext> {
9812 let mut iter = self.clone();
9813 iter.pos = 0;
9814 for attr in iter {
9815 if let DlDpipeField::DpipeFieldMappingType(val) = attr? {
9816 return Ok(val);
9817 }
9818 }
9819 Err(ErrorContext::new_missing(
9820 "DlDpipeField",
9821 "DpipeFieldMappingType",
9822 self.orig_loc,
9823 self.buf.as_ptr() as usize,
9824 ))
9825 }
9826}
9827impl DlDpipeField<'_> {
9828 pub fn new<'a>(buf: &'a [u8]) -> IterableDlDpipeField<'a> {
9829 IterableDlDpipeField::with_loc(buf, buf.as_ptr() as usize)
9830 }
9831 fn attr_from_type(r#type: u16) -> Option<&'static str> {
9832 Devlink::attr_from_type(r#type)
9833 }
9834}
9835#[derive(Clone, Copy, Default)]
9836pub struct IterableDlDpipeField<'a> {
9837 buf: &'a [u8],
9838 pos: usize,
9839 orig_loc: usize,
9840}
9841impl<'a> IterableDlDpipeField<'a> {
9842 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9843 Self {
9844 buf,
9845 pos: 0,
9846 orig_loc,
9847 }
9848 }
9849 pub fn get_buf(&self) -> &'a [u8] {
9850 self.buf
9851 }
9852}
9853impl<'a> Iterator for IterableDlDpipeField<'a> {
9854 type Item = Result<DlDpipeField<'a>, ErrorContext>;
9855 fn next(&mut self) -> Option<Self::Item> {
9856 let pos = self.pos;
9857 let mut r#type;
9858 loop {
9859 r#type = None;
9860 if self.buf.len() == self.pos {
9861 return None;
9862 }
9863 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9864 break;
9865 };
9866 r#type = Some(header.r#type);
9867 let res = match header.r#type {
9868 57u16 => DlDpipeField::DpipeFieldName({
9869 let res = CStr::from_bytes_with_nul(next).ok();
9870 let Some(val) = res else { break };
9871 val
9872 }),
9873 58u16 => DlDpipeField::DpipeFieldId({
9874 let res = parse_u32(next);
9875 let Some(val) = res else { break };
9876 val
9877 }),
9878 59u16 => DlDpipeField::DpipeFieldBitwidth({
9879 let res = parse_u32(next);
9880 let Some(val) = res else { break };
9881 val
9882 }),
9883 60u16 => DlDpipeField::DpipeFieldMappingType({
9884 let res = parse_u32(next);
9885 let Some(val) = res else { break };
9886 val
9887 }),
9888 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9889 n => continue,
9890 };
9891 return Some(Ok(res));
9892 }
9893 Some(Err(ErrorContext::new(
9894 "DlDpipeField",
9895 r#type.and_then(|t| DlDpipeField::attr_from_type(t)),
9896 self.orig_loc,
9897 self.buf.as_ptr().wrapping_add(pos) as usize,
9898 )))
9899 }
9900}
9901impl<'a> std::fmt::Debug for IterableDlDpipeField<'_> {
9902 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9903 let mut fmt = f.debug_struct("DlDpipeField");
9904 for attr in self.clone() {
9905 let attr = match attr {
9906 Ok(a) => a,
9907 Err(err) => {
9908 fmt.finish()?;
9909 f.write_str("Err(")?;
9910 err.fmt(f)?;
9911 return f.write_str(")");
9912 }
9913 };
9914 match attr {
9915 DlDpipeField::DpipeFieldName(val) => fmt.field("DpipeFieldName", &val),
9916 DlDpipeField::DpipeFieldId(val) => fmt.field("DpipeFieldId", &val),
9917 DlDpipeField::DpipeFieldBitwidth(val) => fmt.field("DpipeFieldBitwidth", &val),
9918 DlDpipeField::DpipeFieldMappingType(val) => fmt.field(
9919 "DpipeFieldMappingType",
9920 &FormatEnum(val.into(), DpipeFieldMappingType::from_value),
9921 ),
9922 };
9923 }
9924 fmt.finish()
9925 }
9926}
9927impl IterableDlDpipeField<'_> {
9928 pub fn lookup_attr(
9929 &self,
9930 offset: usize,
9931 missing_type: Option<u16>,
9932 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9933 let mut stack = Vec::new();
9934 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9935 if missing_type.is_some() && cur == offset {
9936 stack.push(("DlDpipeField", offset));
9937 return (
9938 stack,
9939 missing_type.and_then(|t| DlDpipeField::attr_from_type(t)),
9940 );
9941 }
9942 if cur > offset || cur + self.buf.len() < offset {
9943 return (stack, None);
9944 }
9945 let mut attrs = self.clone();
9946 let mut last_off = cur + attrs.pos;
9947 while let Some(attr) = attrs.next() {
9948 let Ok(attr) = attr else { break };
9949 match attr {
9950 DlDpipeField::DpipeFieldName(val) => {
9951 if last_off == offset {
9952 stack.push(("DpipeFieldName", last_off));
9953 break;
9954 }
9955 }
9956 DlDpipeField::DpipeFieldId(val) => {
9957 if last_off == offset {
9958 stack.push(("DpipeFieldId", last_off));
9959 break;
9960 }
9961 }
9962 DlDpipeField::DpipeFieldBitwidth(val) => {
9963 if last_off == offset {
9964 stack.push(("DpipeFieldBitwidth", last_off));
9965 break;
9966 }
9967 }
9968 DlDpipeField::DpipeFieldMappingType(val) => {
9969 if last_off == offset {
9970 stack.push(("DpipeFieldMappingType", last_off));
9971 break;
9972 }
9973 }
9974 _ => {}
9975 };
9976 last_off = cur + attrs.pos;
9977 }
9978 if !stack.is_empty() {
9979 stack.push(("DlDpipeField", cur));
9980 }
9981 (stack, None)
9982 }
9983}
9984#[derive(Clone)]
9985pub enum DlResource<'a> {
9986 ResourceName(&'a CStr),
9987 ResourceId(u64),
9988 ResourceSize(u64),
9989 ResourceSizeNew(u64),
9990 ResourceSizeValid(u8),
9991 ResourceSizeMin(u64),
9992 ResourceSizeMax(u64),
9993 ResourceSizeGran(u64),
9994 #[doc = "Associated type: [`ResourceUnit`] (enum)"]
9995 ResourceUnit(u8),
9996 ResourceOcc(u64),
9997}
9998impl<'a> IterableDlResource<'a> {
9999 pub fn get_resource_name(&self) -> Result<&'a CStr, ErrorContext> {
10000 let mut iter = self.clone();
10001 iter.pos = 0;
10002 for attr in iter {
10003 if let DlResource::ResourceName(val) = attr? {
10004 return Ok(val);
10005 }
10006 }
10007 Err(ErrorContext::new_missing(
10008 "DlResource",
10009 "ResourceName",
10010 self.orig_loc,
10011 self.buf.as_ptr() as usize,
10012 ))
10013 }
10014 pub fn get_resource_id(&self) -> Result<u64, ErrorContext> {
10015 let mut iter = self.clone();
10016 iter.pos = 0;
10017 for attr in iter {
10018 if let DlResource::ResourceId(val) = attr? {
10019 return Ok(val);
10020 }
10021 }
10022 Err(ErrorContext::new_missing(
10023 "DlResource",
10024 "ResourceId",
10025 self.orig_loc,
10026 self.buf.as_ptr() as usize,
10027 ))
10028 }
10029 pub fn get_resource_size(&self) -> Result<u64, ErrorContext> {
10030 let mut iter = self.clone();
10031 iter.pos = 0;
10032 for attr in iter {
10033 if let DlResource::ResourceSize(val) = attr? {
10034 return Ok(val);
10035 }
10036 }
10037 Err(ErrorContext::new_missing(
10038 "DlResource",
10039 "ResourceSize",
10040 self.orig_loc,
10041 self.buf.as_ptr() as usize,
10042 ))
10043 }
10044 pub fn get_resource_size_new(&self) -> Result<u64, ErrorContext> {
10045 let mut iter = self.clone();
10046 iter.pos = 0;
10047 for attr in iter {
10048 if let DlResource::ResourceSizeNew(val) = attr? {
10049 return Ok(val);
10050 }
10051 }
10052 Err(ErrorContext::new_missing(
10053 "DlResource",
10054 "ResourceSizeNew",
10055 self.orig_loc,
10056 self.buf.as_ptr() as usize,
10057 ))
10058 }
10059 pub fn get_resource_size_valid(&self) -> Result<u8, ErrorContext> {
10060 let mut iter = self.clone();
10061 iter.pos = 0;
10062 for attr in iter {
10063 if let DlResource::ResourceSizeValid(val) = attr? {
10064 return Ok(val);
10065 }
10066 }
10067 Err(ErrorContext::new_missing(
10068 "DlResource",
10069 "ResourceSizeValid",
10070 self.orig_loc,
10071 self.buf.as_ptr() as usize,
10072 ))
10073 }
10074 pub fn get_resource_size_min(&self) -> Result<u64, ErrorContext> {
10075 let mut iter = self.clone();
10076 iter.pos = 0;
10077 for attr in iter {
10078 if let DlResource::ResourceSizeMin(val) = attr? {
10079 return Ok(val);
10080 }
10081 }
10082 Err(ErrorContext::new_missing(
10083 "DlResource",
10084 "ResourceSizeMin",
10085 self.orig_loc,
10086 self.buf.as_ptr() as usize,
10087 ))
10088 }
10089 pub fn get_resource_size_max(&self) -> Result<u64, ErrorContext> {
10090 let mut iter = self.clone();
10091 iter.pos = 0;
10092 for attr in iter {
10093 if let DlResource::ResourceSizeMax(val) = attr? {
10094 return Ok(val);
10095 }
10096 }
10097 Err(ErrorContext::new_missing(
10098 "DlResource",
10099 "ResourceSizeMax",
10100 self.orig_loc,
10101 self.buf.as_ptr() as usize,
10102 ))
10103 }
10104 pub fn get_resource_size_gran(&self) -> Result<u64, ErrorContext> {
10105 let mut iter = self.clone();
10106 iter.pos = 0;
10107 for attr in iter {
10108 if let DlResource::ResourceSizeGran(val) = attr? {
10109 return Ok(val);
10110 }
10111 }
10112 Err(ErrorContext::new_missing(
10113 "DlResource",
10114 "ResourceSizeGran",
10115 self.orig_loc,
10116 self.buf.as_ptr() as usize,
10117 ))
10118 }
10119 #[doc = "Associated type: [`ResourceUnit`] (enum)"]
10120 pub fn get_resource_unit(&self) -> Result<u8, ErrorContext> {
10121 let mut iter = self.clone();
10122 iter.pos = 0;
10123 for attr in iter {
10124 if let DlResource::ResourceUnit(val) = attr? {
10125 return Ok(val);
10126 }
10127 }
10128 Err(ErrorContext::new_missing(
10129 "DlResource",
10130 "ResourceUnit",
10131 self.orig_loc,
10132 self.buf.as_ptr() as usize,
10133 ))
10134 }
10135 pub fn get_resource_occ(&self) -> Result<u64, ErrorContext> {
10136 let mut iter = self.clone();
10137 iter.pos = 0;
10138 for attr in iter {
10139 if let DlResource::ResourceOcc(val) = attr? {
10140 return Ok(val);
10141 }
10142 }
10143 Err(ErrorContext::new_missing(
10144 "DlResource",
10145 "ResourceOcc",
10146 self.orig_loc,
10147 self.buf.as_ptr() as usize,
10148 ))
10149 }
10150}
10151impl DlResource<'_> {
10152 pub fn new<'a>(buf: &'a [u8]) -> IterableDlResource<'a> {
10153 IterableDlResource::with_loc(buf, buf.as_ptr() as usize)
10154 }
10155 fn attr_from_type(r#type: u16) -> Option<&'static str> {
10156 Devlink::attr_from_type(r#type)
10157 }
10158}
10159#[derive(Clone, Copy, Default)]
10160pub struct IterableDlResource<'a> {
10161 buf: &'a [u8],
10162 pos: usize,
10163 orig_loc: usize,
10164}
10165impl<'a> IterableDlResource<'a> {
10166 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10167 Self {
10168 buf,
10169 pos: 0,
10170 orig_loc,
10171 }
10172 }
10173 pub fn get_buf(&self) -> &'a [u8] {
10174 self.buf
10175 }
10176}
10177impl<'a> Iterator for IterableDlResource<'a> {
10178 type Item = Result<DlResource<'a>, ErrorContext>;
10179 fn next(&mut self) -> Option<Self::Item> {
10180 let pos = self.pos;
10181 let mut r#type;
10182 loop {
10183 r#type = None;
10184 if self.buf.len() == self.pos {
10185 return None;
10186 }
10187 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10188 break;
10189 };
10190 r#type = Some(header.r#type);
10191 let res = match header.r#type {
10192 65u16 => DlResource::ResourceName({
10193 let res = CStr::from_bytes_with_nul(next).ok();
10194 let Some(val) = res else { break };
10195 val
10196 }),
10197 66u16 => DlResource::ResourceId({
10198 let res = parse_u64(next);
10199 let Some(val) = res else { break };
10200 val
10201 }),
10202 67u16 => DlResource::ResourceSize({
10203 let res = parse_u64(next);
10204 let Some(val) = res else { break };
10205 val
10206 }),
10207 68u16 => DlResource::ResourceSizeNew({
10208 let res = parse_u64(next);
10209 let Some(val) = res else { break };
10210 val
10211 }),
10212 69u16 => DlResource::ResourceSizeValid({
10213 let res = parse_u8(next);
10214 let Some(val) = res else { break };
10215 val
10216 }),
10217 70u16 => DlResource::ResourceSizeMin({
10218 let res = parse_u64(next);
10219 let Some(val) = res else { break };
10220 val
10221 }),
10222 71u16 => DlResource::ResourceSizeMax({
10223 let res = parse_u64(next);
10224 let Some(val) = res else { break };
10225 val
10226 }),
10227 72u16 => DlResource::ResourceSizeGran({
10228 let res = parse_u64(next);
10229 let Some(val) = res else { break };
10230 val
10231 }),
10232 73u16 => DlResource::ResourceUnit({
10233 let res = parse_u8(next);
10234 let Some(val) = res else { break };
10235 val
10236 }),
10237 74u16 => DlResource::ResourceOcc({
10238 let res = parse_u64(next);
10239 let Some(val) = res else { break };
10240 val
10241 }),
10242 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10243 n => continue,
10244 };
10245 return Some(Ok(res));
10246 }
10247 Some(Err(ErrorContext::new(
10248 "DlResource",
10249 r#type.and_then(|t| DlResource::attr_from_type(t)),
10250 self.orig_loc,
10251 self.buf.as_ptr().wrapping_add(pos) as usize,
10252 )))
10253 }
10254}
10255impl<'a> std::fmt::Debug for IterableDlResource<'_> {
10256 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10257 let mut fmt = f.debug_struct("DlResource");
10258 for attr in self.clone() {
10259 let attr = match attr {
10260 Ok(a) => a,
10261 Err(err) => {
10262 fmt.finish()?;
10263 f.write_str("Err(")?;
10264 err.fmt(f)?;
10265 return f.write_str(")");
10266 }
10267 };
10268 match attr {
10269 DlResource::ResourceName(val) => fmt.field("ResourceName", &val),
10270 DlResource::ResourceId(val) => fmt.field("ResourceId", &val),
10271 DlResource::ResourceSize(val) => fmt.field("ResourceSize", &val),
10272 DlResource::ResourceSizeNew(val) => fmt.field("ResourceSizeNew", &val),
10273 DlResource::ResourceSizeValid(val) => fmt.field("ResourceSizeValid", &val),
10274 DlResource::ResourceSizeMin(val) => fmt.field("ResourceSizeMin", &val),
10275 DlResource::ResourceSizeMax(val) => fmt.field("ResourceSizeMax", &val),
10276 DlResource::ResourceSizeGran(val) => fmt.field("ResourceSizeGran", &val),
10277 DlResource::ResourceUnit(val) => fmt.field(
10278 "ResourceUnit",
10279 &FormatEnum(val.into(), ResourceUnit::from_value),
10280 ),
10281 DlResource::ResourceOcc(val) => fmt.field("ResourceOcc", &val),
10282 };
10283 }
10284 fmt.finish()
10285 }
10286}
10287impl IterableDlResource<'_> {
10288 pub fn lookup_attr(
10289 &self,
10290 offset: usize,
10291 missing_type: Option<u16>,
10292 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10293 let mut stack = Vec::new();
10294 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10295 if missing_type.is_some() && cur == offset {
10296 stack.push(("DlResource", offset));
10297 return (
10298 stack,
10299 missing_type.and_then(|t| DlResource::attr_from_type(t)),
10300 );
10301 }
10302 if cur > offset || cur + self.buf.len() < offset {
10303 return (stack, None);
10304 }
10305 let mut attrs = self.clone();
10306 let mut last_off = cur + attrs.pos;
10307 while let Some(attr) = attrs.next() {
10308 let Ok(attr) = attr else { break };
10309 match attr {
10310 DlResource::ResourceName(val) => {
10311 if last_off == offset {
10312 stack.push(("ResourceName", last_off));
10313 break;
10314 }
10315 }
10316 DlResource::ResourceId(val) => {
10317 if last_off == offset {
10318 stack.push(("ResourceId", last_off));
10319 break;
10320 }
10321 }
10322 DlResource::ResourceSize(val) => {
10323 if last_off == offset {
10324 stack.push(("ResourceSize", last_off));
10325 break;
10326 }
10327 }
10328 DlResource::ResourceSizeNew(val) => {
10329 if last_off == offset {
10330 stack.push(("ResourceSizeNew", last_off));
10331 break;
10332 }
10333 }
10334 DlResource::ResourceSizeValid(val) => {
10335 if last_off == offset {
10336 stack.push(("ResourceSizeValid", last_off));
10337 break;
10338 }
10339 }
10340 DlResource::ResourceSizeMin(val) => {
10341 if last_off == offset {
10342 stack.push(("ResourceSizeMin", last_off));
10343 break;
10344 }
10345 }
10346 DlResource::ResourceSizeMax(val) => {
10347 if last_off == offset {
10348 stack.push(("ResourceSizeMax", last_off));
10349 break;
10350 }
10351 }
10352 DlResource::ResourceSizeGran(val) => {
10353 if last_off == offset {
10354 stack.push(("ResourceSizeGran", last_off));
10355 break;
10356 }
10357 }
10358 DlResource::ResourceUnit(val) => {
10359 if last_off == offset {
10360 stack.push(("ResourceUnit", last_off));
10361 break;
10362 }
10363 }
10364 DlResource::ResourceOcc(val) => {
10365 if last_off == offset {
10366 stack.push(("ResourceOcc", last_off));
10367 break;
10368 }
10369 }
10370 _ => {}
10371 };
10372 last_off = cur + attrs.pos;
10373 }
10374 if !stack.is_empty() {
10375 stack.push(("DlResource", cur));
10376 }
10377 (stack, None)
10378 }
10379}
10380#[derive(Clone)]
10381pub enum DlResourceList<'a> {
10382 #[doc = "Attribute may repeat multiple times (treat it as array)"]
10383 Resource(IterableDlResource<'a>),
10384}
10385impl<'a> IterableDlResourceList<'a> {
10386 #[doc = "Attribute may repeat multiple times (treat it as array)"]
10387 pub fn get_resource(
10388 &self,
10389 ) -> MultiAttrIterable<Self, DlResourceList<'a>, IterableDlResource<'a>> {
10390 MultiAttrIterable::new(self.clone(), |variant| {
10391 if let DlResourceList::Resource(val) = variant {
10392 Some(val)
10393 } else {
10394 None
10395 }
10396 })
10397 }
10398}
10399impl DlResourceList<'_> {
10400 pub fn new<'a>(buf: &'a [u8]) -> IterableDlResourceList<'a> {
10401 IterableDlResourceList::with_loc(buf, buf.as_ptr() as usize)
10402 }
10403 fn attr_from_type(r#type: u16) -> Option<&'static str> {
10404 Devlink::attr_from_type(r#type)
10405 }
10406}
10407#[derive(Clone, Copy, Default)]
10408pub struct IterableDlResourceList<'a> {
10409 buf: &'a [u8],
10410 pos: usize,
10411 orig_loc: usize,
10412}
10413impl<'a> IterableDlResourceList<'a> {
10414 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10415 Self {
10416 buf,
10417 pos: 0,
10418 orig_loc,
10419 }
10420 }
10421 pub fn get_buf(&self) -> &'a [u8] {
10422 self.buf
10423 }
10424}
10425impl<'a> Iterator for IterableDlResourceList<'a> {
10426 type Item = Result<DlResourceList<'a>, ErrorContext>;
10427 fn next(&mut self) -> Option<Self::Item> {
10428 let pos = self.pos;
10429 let mut r#type;
10430 loop {
10431 r#type = None;
10432 if self.buf.len() == self.pos {
10433 return None;
10434 }
10435 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10436 break;
10437 };
10438 r#type = Some(header.r#type);
10439 let res = match header.r#type {
10440 64u16 => DlResourceList::Resource({
10441 let res = Some(IterableDlResource::with_loc(next, self.orig_loc));
10442 let Some(val) = res else { break };
10443 val
10444 }),
10445 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10446 n => continue,
10447 };
10448 return Some(Ok(res));
10449 }
10450 Some(Err(ErrorContext::new(
10451 "DlResourceList",
10452 r#type.and_then(|t| DlResourceList::attr_from_type(t)),
10453 self.orig_loc,
10454 self.buf.as_ptr().wrapping_add(pos) as usize,
10455 )))
10456 }
10457}
10458impl<'a> std::fmt::Debug for IterableDlResourceList<'_> {
10459 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10460 let mut fmt = f.debug_struct("DlResourceList");
10461 for attr in self.clone() {
10462 let attr = match attr {
10463 Ok(a) => a,
10464 Err(err) => {
10465 fmt.finish()?;
10466 f.write_str("Err(")?;
10467 err.fmt(f)?;
10468 return f.write_str(")");
10469 }
10470 };
10471 match attr {
10472 DlResourceList::Resource(val) => fmt.field("Resource", &val),
10473 };
10474 }
10475 fmt.finish()
10476 }
10477}
10478impl IterableDlResourceList<'_> {
10479 pub fn lookup_attr(
10480 &self,
10481 offset: usize,
10482 missing_type: Option<u16>,
10483 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10484 let mut stack = Vec::new();
10485 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10486 if missing_type.is_some() && cur == offset {
10487 stack.push(("DlResourceList", offset));
10488 return (
10489 stack,
10490 missing_type.and_then(|t| DlResourceList::attr_from_type(t)),
10491 );
10492 }
10493 if cur > offset || cur + self.buf.len() < offset {
10494 return (stack, None);
10495 }
10496 let mut attrs = self.clone();
10497 let mut last_off = cur + attrs.pos;
10498 let mut missing = None;
10499 while let Some(attr) = attrs.next() {
10500 let Ok(attr) = attr else { break };
10501 match attr {
10502 DlResourceList::Resource(val) => {
10503 (stack, missing) = val.lookup_attr(offset, missing_type);
10504 if !stack.is_empty() {
10505 break;
10506 }
10507 }
10508 _ => {}
10509 };
10510 last_off = cur + attrs.pos;
10511 }
10512 if !stack.is_empty() {
10513 stack.push(("DlResourceList", cur));
10514 }
10515 (stack, missing)
10516 }
10517}
10518#[derive(Clone)]
10519pub enum DlParam<'a> {
10520 ParamName(&'a CStr),
10521 ParamGeneric(()),
10522 #[doc = "Associated type: [`VarAttrType`] (enum)"]
10523 ParamType(u8),
10524}
10525impl<'a> IterableDlParam<'a> {
10526 pub fn get_param_name(&self) -> Result<&'a CStr, ErrorContext> {
10527 let mut iter = self.clone();
10528 iter.pos = 0;
10529 for attr in iter {
10530 if let DlParam::ParamName(val) = attr? {
10531 return Ok(val);
10532 }
10533 }
10534 Err(ErrorContext::new_missing(
10535 "DlParam",
10536 "ParamName",
10537 self.orig_loc,
10538 self.buf.as_ptr() as usize,
10539 ))
10540 }
10541 pub fn get_param_generic(&self) -> Result<(), ErrorContext> {
10542 let mut iter = self.clone();
10543 iter.pos = 0;
10544 for attr in iter {
10545 if let DlParam::ParamGeneric(val) = attr? {
10546 return Ok(val);
10547 }
10548 }
10549 Err(ErrorContext::new_missing(
10550 "DlParam",
10551 "ParamGeneric",
10552 self.orig_loc,
10553 self.buf.as_ptr() as usize,
10554 ))
10555 }
10556 #[doc = "Associated type: [`VarAttrType`] (enum)"]
10557 pub fn get_param_type(&self) -> Result<u8, ErrorContext> {
10558 let mut iter = self.clone();
10559 iter.pos = 0;
10560 for attr in iter {
10561 if let DlParam::ParamType(val) = attr? {
10562 return Ok(val);
10563 }
10564 }
10565 Err(ErrorContext::new_missing(
10566 "DlParam",
10567 "ParamType",
10568 self.orig_loc,
10569 self.buf.as_ptr() as usize,
10570 ))
10571 }
10572}
10573impl DlParam<'_> {
10574 pub fn new<'a>(buf: &'a [u8]) -> IterableDlParam<'a> {
10575 IterableDlParam::with_loc(buf, buf.as_ptr() as usize)
10576 }
10577 fn attr_from_type(r#type: u16) -> Option<&'static str> {
10578 Devlink::attr_from_type(r#type)
10579 }
10580}
10581#[derive(Clone, Copy, Default)]
10582pub struct IterableDlParam<'a> {
10583 buf: &'a [u8],
10584 pos: usize,
10585 orig_loc: usize,
10586}
10587impl<'a> IterableDlParam<'a> {
10588 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10589 Self {
10590 buf,
10591 pos: 0,
10592 orig_loc,
10593 }
10594 }
10595 pub fn get_buf(&self) -> &'a [u8] {
10596 self.buf
10597 }
10598}
10599impl<'a> Iterator for IterableDlParam<'a> {
10600 type Item = Result<DlParam<'a>, ErrorContext>;
10601 fn next(&mut self) -> Option<Self::Item> {
10602 let pos = self.pos;
10603 let mut r#type;
10604 loop {
10605 r#type = None;
10606 if self.buf.len() == self.pos {
10607 return None;
10608 }
10609 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10610 break;
10611 };
10612 r#type = Some(header.r#type);
10613 let res = match header.r#type {
10614 81u16 => DlParam::ParamName({
10615 let res = CStr::from_bytes_with_nul(next).ok();
10616 let Some(val) = res else { break };
10617 val
10618 }),
10619 82u16 => DlParam::ParamGeneric(()),
10620 83u16 => DlParam::ParamType({
10621 let res = parse_u8(next);
10622 let Some(val) = res else { break };
10623 val
10624 }),
10625 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10626 n => continue,
10627 };
10628 return Some(Ok(res));
10629 }
10630 Some(Err(ErrorContext::new(
10631 "DlParam",
10632 r#type.and_then(|t| DlParam::attr_from_type(t)),
10633 self.orig_loc,
10634 self.buf.as_ptr().wrapping_add(pos) as usize,
10635 )))
10636 }
10637}
10638impl<'a> std::fmt::Debug for IterableDlParam<'_> {
10639 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10640 let mut fmt = f.debug_struct("DlParam");
10641 for attr in self.clone() {
10642 let attr = match attr {
10643 Ok(a) => a,
10644 Err(err) => {
10645 fmt.finish()?;
10646 f.write_str("Err(")?;
10647 err.fmt(f)?;
10648 return f.write_str(")");
10649 }
10650 };
10651 match attr {
10652 DlParam::ParamName(val) => fmt.field("ParamName", &val),
10653 DlParam::ParamGeneric(val) => fmt.field("ParamGeneric", &val),
10654 DlParam::ParamType(val) => fmt.field(
10655 "ParamType",
10656 &FormatEnum(val.into(), VarAttrType::from_value),
10657 ),
10658 };
10659 }
10660 fmt.finish()
10661 }
10662}
10663impl IterableDlParam<'_> {
10664 pub fn lookup_attr(
10665 &self,
10666 offset: usize,
10667 missing_type: Option<u16>,
10668 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10669 let mut stack = Vec::new();
10670 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10671 if missing_type.is_some() && cur == offset {
10672 stack.push(("DlParam", offset));
10673 return (stack, missing_type.and_then(|t| DlParam::attr_from_type(t)));
10674 }
10675 if cur > offset || cur + self.buf.len() < offset {
10676 return (stack, None);
10677 }
10678 let mut attrs = self.clone();
10679 let mut last_off = cur + attrs.pos;
10680 while let Some(attr) = attrs.next() {
10681 let Ok(attr) = attr else { break };
10682 match attr {
10683 DlParam::ParamName(val) => {
10684 if last_off == offset {
10685 stack.push(("ParamName", last_off));
10686 break;
10687 }
10688 }
10689 DlParam::ParamGeneric(val) => {
10690 if last_off == offset {
10691 stack.push(("ParamGeneric", last_off));
10692 break;
10693 }
10694 }
10695 DlParam::ParamType(val) => {
10696 if last_off == offset {
10697 stack.push(("ParamType", last_off));
10698 break;
10699 }
10700 }
10701 _ => {}
10702 };
10703 last_off = cur + attrs.pos;
10704 }
10705 if !stack.is_empty() {
10706 stack.push(("DlParam", cur));
10707 }
10708 (stack, None)
10709 }
10710}
10711#[derive(Clone)]
10712pub enum DlRegionSnapshots<'a> {
10713 RegionSnapshot(IterableDlRegionSnapshot<'a>),
10714}
10715impl<'a> IterableDlRegionSnapshots<'a> {
10716 pub fn get_region_snapshot(&self) -> Result<IterableDlRegionSnapshot<'a>, ErrorContext> {
10717 let mut iter = self.clone();
10718 iter.pos = 0;
10719 for attr in iter {
10720 if let DlRegionSnapshots::RegionSnapshot(val) = attr? {
10721 return Ok(val);
10722 }
10723 }
10724 Err(ErrorContext::new_missing(
10725 "DlRegionSnapshots",
10726 "RegionSnapshot",
10727 self.orig_loc,
10728 self.buf.as_ptr() as usize,
10729 ))
10730 }
10731}
10732impl DlRegionSnapshots<'_> {
10733 pub fn new<'a>(buf: &'a [u8]) -> IterableDlRegionSnapshots<'a> {
10734 IterableDlRegionSnapshots::with_loc(buf, buf.as_ptr() as usize)
10735 }
10736 fn attr_from_type(r#type: u16) -> Option<&'static str> {
10737 Devlink::attr_from_type(r#type)
10738 }
10739}
10740#[derive(Clone, Copy, Default)]
10741pub struct IterableDlRegionSnapshots<'a> {
10742 buf: &'a [u8],
10743 pos: usize,
10744 orig_loc: usize,
10745}
10746impl<'a> IterableDlRegionSnapshots<'a> {
10747 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10748 Self {
10749 buf,
10750 pos: 0,
10751 orig_loc,
10752 }
10753 }
10754 pub fn get_buf(&self) -> &'a [u8] {
10755 self.buf
10756 }
10757}
10758impl<'a> Iterator for IterableDlRegionSnapshots<'a> {
10759 type Item = Result<DlRegionSnapshots<'a>, ErrorContext>;
10760 fn next(&mut self) -> Option<Self::Item> {
10761 let pos = self.pos;
10762 let mut r#type;
10763 loop {
10764 r#type = None;
10765 if self.buf.len() == self.pos {
10766 return None;
10767 }
10768 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10769 break;
10770 };
10771 r#type = Some(header.r#type);
10772 let res = match header.r#type {
10773 91u16 => DlRegionSnapshots::RegionSnapshot({
10774 let res = Some(IterableDlRegionSnapshot::with_loc(next, self.orig_loc));
10775 let Some(val) = res else { break };
10776 val
10777 }),
10778 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10779 n => continue,
10780 };
10781 return Some(Ok(res));
10782 }
10783 Some(Err(ErrorContext::new(
10784 "DlRegionSnapshots",
10785 r#type.and_then(|t| DlRegionSnapshots::attr_from_type(t)),
10786 self.orig_loc,
10787 self.buf.as_ptr().wrapping_add(pos) as usize,
10788 )))
10789 }
10790}
10791impl<'a> std::fmt::Debug for IterableDlRegionSnapshots<'_> {
10792 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10793 let mut fmt = f.debug_struct("DlRegionSnapshots");
10794 for attr in self.clone() {
10795 let attr = match attr {
10796 Ok(a) => a,
10797 Err(err) => {
10798 fmt.finish()?;
10799 f.write_str("Err(")?;
10800 err.fmt(f)?;
10801 return f.write_str(")");
10802 }
10803 };
10804 match attr {
10805 DlRegionSnapshots::RegionSnapshot(val) => fmt.field("RegionSnapshot", &val),
10806 };
10807 }
10808 fmt.finish()
10809 }
10810}
10811impl IterableDlRegionSnapshots<'_> {
10812 pub fn lookup_attr(
10813 &self,
10814 offset: usize,
10815 missing_type: Option<u16>,
10816 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10817 let mut stack = Vec::new();
10818 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10819 if missing_type.is_some() && cur == offset {
10820 stack.push(("DlRegionSnapshots", offset));
10821 return (
10822 stack,
10823 missing_type.and_then(|t| DlRegionSnapshots::attr_from_type(t)),
10824 );
10825 }
10826 if cur > offset || cur + self.buf.len() < offset {
10827 return (stack, None);
10828 }
10829 let mut attrs = self.clone();
10830 let mut last_off = cur + attrs.pos;
10831 let mut missing = None;
10832 while let Some(attr) = attrs.next() {
10833 let Ok(attr) = attr else { break };
10834 match attr {
10835 DlRegionSnapshots::RegionSnapshot(val) => {
10836 (stack, missing) = val.lookup_attr(offset, missing_type);
10837 if !stack.is_empty() {
10838 break;
10839 }
10840 }
10841 _ => {}
10842 };
10843 last_off = cur + attrs.pos;
10844 }
10845 if !stack.is_empty() {
10846 stack.push(("DlRegionSnapshots", cur));
10847 }
10848 (stack, missing)
10849 }
10850}
10851#[derive(Clone)]
10852pub enum DlRegionSnapshot {
10853 RegionSnapshotId(u32),
10854}
10855impl<'a> IterableDlRegionSnapshot<'a> {
10856 pub fn get_region_snapshot_id(&self) -> Result<u32, ErrorContext> {
10857 let mut iter = self.clone();
10858 iter.pos = 0;
10859 for attr in iter {
10860 if let DlRegionSnapshot::RegionSnapshotId(val) = attr? {
10861 return Ok(val);
10862 }
10863 }
10864 Err(ErrorContext::new_missing(
10865 "DlRegionSnapshot",
10866 "RegionSnapshotId",
10867 self.orig_loc,
10868 self.buf.as_ptr() as usize,
10869 ))
10870 }
10871}
10872impl DlRegionSnapshot {
10873 pub fn new<'a>(buf: &'a [u8]) -> IterableDlRegionSnapshot<'a> {
10874 IterableDlRegionSnapshot::with_loc(buf, buf.as_ptr() as usize)
10875 }
10876 fn attr_from_type(r#type: u16) -> Option<&'static str> {
10877 Devlink::attr_from_type(r#type)
10878 }
10879}
10880#[derive(Clone, Copy, Default)]
10881pub struct IterableDlRegionSnapshot<'a> {
10882 buf: &'a [u8],
10883 pos: usize,
10884 orig_loc: usize,
10885}
10886impl<'a> IterableDlRegionSnapshot<'a> {
10887 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10888 Self {
10889 buf,
10890 pos: 0,
10891 orig_loc,
10892 }
10893 }
10894 pub fn get_buf(&self) -> &'a [u8] {
10895 self.buf
10896 }
10897}
10898impl<'a> Iterator for IterableDlRegionSnapshot<'a> {
10899 type Item = Result<DlRegionSnapshot, ErrorContext>;
10900 fn next(&mut self) -> Option<Self::Item> {
10901 let pos = self.pos;
10902 let mut r#type;
10903 loop {
10904 r#type = None;
10905 if self.buf.len() == self.pos {
10906 return None;
10907 }
10908 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10909 break;
10910 };
10911 r#type = Some(header.r#type);
10912 let res = match header.r#type {
10913 92u16 => DlRegionSnapshot::RegionSnapshotId({
10914 let res = parse_u32(next);
10915 let Some(val) = res else { break };
10916 val
10917 }),
10918 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10919 n => continue,
10920 };
10921 return Some(Ok(res));
10922 }
10923 Some(Err(ErrorContext::new(
10924 "DlRegionSnapshot",
10925 r#type.and_then(|t| DlRegionSnapshot::attr_from_type(t)),
10926 self.orig_loc,
10927 self.buf.as_ptr().wrapping_add(pos) as usize,
10928 )))
10929 }
10930}
10931impl std::fmt::Debug for IterableDlRegionSnapshot<'_> {
10932 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10933 let mut fmt = f.debug_struct("DlRegionSnapshot");
10934 for attr in self.clone() {
10935 let attr = match attr {
10936 Ok(a) => a,
10937 Err(err) => {
10938 fmt.finish()?;
10939 f.write_str("Err(")?;
10940 err.fmt(f)?;
10941 return f.write_str(")");
10942 }
10943 };
10944 match attr {
10945 DlRegionSnapshot::RegionSnapshotId(val) => fmt.field("RegionSnapshotId", &val),
10946 };
10947 }
10948 fmt.finish()
10949 }
10950}
10951impl IterableDlRegionSnapshot<'_> {
10952 pub fn lookup_attr(
10953 &self,
10954 offset: usize,
10955 missing_type: Option<u16>,
10956 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10957 let mut stack = Vec::new();
10958 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10959 if missing_type.is_some() && cur == offset {
10960 stack.push(("DlRegionSnapshot", offset));
10961 return (
10962 stack,
10963 missing_type.and_then(|t| DlRegionSnapshot::attr_from_type(t)),
10964 );
10965 }
10966 if cur > offset || cur + self.buf.len() < offset {
10967 return (stack, None);
10968 }
10969 let mut attrs = self.clone();
10970 let mut last_off = cur + attrs.pos;
10971 while let Some(attr) = attrs.next() {
10972 let Ok(attr) = attr else { break };
10973 match attr {
10974 DlRegionSnapshot::RegionSnapshotId(val) => {
10975 if last_off == offset {
10976 stack.push(("RegionSnapshotId", last_off));
10977 break;
10978 }
10979 }
10980 _ => {}
10981 };
10982 last_off = cur + attrs.pos;
10983 }
10984 if !stack.is_empty() {
10985 stack.push(("DlRegionSnapshot", cur));
10986 }
10987 (stack, None)
10988 }
10989}
10990#[derive(Clone)]
10991pub enum DlRegionChunks<'a> {
10992 RegionChunk(IterableDlRegionChunk<'a>),
10993}
10994impl<'a> IterableDlRegionChunks<'a> {
10995 pub fn get_region_chunk(&self) -> Result<IterableDlRegionChunk<'a>, ErrorContext> {
10996 let mut iter = self.clone();
10997 iter.pos = 0;
10998 for attr in iter {
10999 if let DlRegionChunks::RegionChunk(val) = attr? {
11000 return Ok(val);
11001 }
11002 }
11003 Err(ErrorContext::new_missing(
11004 "DlRegionChunks",
11005 "RegionChunk",
11006 self.orig_loc,
11007 self.buf.as_ptr() as usize,
11008 ))
11009 }
11010}
11011impl DlRegionChunks<'_> {
11012 pub fn new<'a>(buf: &'a [u8]) -> IterableDlRegionChunks<'a> {
11013 IterableDlRegionChunks::with_loc(buf, buf.as_ptr() as usize)
11014 }
11015 fn attr_from_type(r#type: u16) -> Option<&'static str> {
11016 Devlink::attr_from_type(r#type)
11017 }
11018}
11019#[derive(Clone, Copy, Default)]
11020pub struct IterableDlRegionChunks<'a> {
11021 buf: &'a [u8],
11022 pos: usize,
11023 orig_loc: usize,
11024}
11025impl<'a> IterableDlRegionChunks<'a> {
11026 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11027 Self {
11028 buf,
11029 pos: 0,
11030 orig_loc,
11031 }
11032 }
11033 pub fn get_buf(&self) -> &'a [u8] {
11034 self.buf
11035 }
11036}
11037impl<'a> Iterator for IterableDlRegionChunks<'a> {
11038 type Item = Result<DlRegionChunks<'a>, ErrorContext>;
11039 fn next(&mut self) -> Option<Self::Item> {
11040 let pos = self.pos;
11041 let mut r#type;
11042 loop {
11043 r#type = None;
11044 if self.buf.len() == self.pos {
11045 return None;
11046 }
11047 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11048 break;
11049 };
11050 r#type = Some(header.r#type);
11051 let res = match header.r#type {
11052 94u16 => DlRegionChunks::RegionChunk({
11053 let res = Some(IterableDlRegionChunk::with_loc(next, self.orig_loc));
11054 let Some(val) = res else { break };
11055 val
11056 }),
11057 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11058 n => continue,
11059 };
11060 return Some(Ok(res));
11061 }
11062 Some(Err(ErrorContext::new(
11063 "DlRegionChunks",
11064 r#type.and_then(|t| DlRegionChunks::attr_from_type(t)),
11065 self.orig_loc,
11066 self.buf.as_ptr().wrapping_add(pos) as usize,
11067 )))
11068 }
11069}
11070impl<'a> std::fmt::Debug for IterableDlRegionChunks<'_> {
11071 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11072 let mut fmt = f.debug_struct("DlRegionChunks");
11073 for attr in self.clone() {
11074 let attr = match attr {
11075 Ok(a) => a,
11076 Err(err) => {
11077 fmt.finish()?;
11078 f.write_str("Err(")?;
11079 err.fmt(f)?;
11080 return f.write_str(")");
11081 }
11082 };
11083 match attr {
11084 DlRegionChunks::RegionChunk(val) => fmt.field("RegionChunk", &val),
11085 };
11086 }
11087 fmt.finish()
11088 }
11089}
11090impl IterableDlRegionChunks<'_> {
11091 pub fn lookup_attr(
11092 &self,
11093 offset: usize,
11094 missing_type: Option<u16>,
11095 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11096 let mut stack = Vec::new();
11097 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11098 if missing_type.is_some() && cur == offset {
11099 stack.push(("DlRegionChunks", offset));
11100 return (
11101 stack,
11102 missing_type.and_then(|t| DlRegionChunks::attr_from_type(t)),
11103 );
11104 }
11105 if cur > offset || cur + self.buf.len() < offset {
11106 return (stack, None);
11107 }
11108 let mut attrs = self.clone();
11109 let mut last_off = cur + attrs.pos;
11110 let mut missing = None;
11111 while let Some(attr) = attrs.next() {
11112 let Ok(attr) = attr else { break };
11113 match attr {
11114 DlRegionChunks::RegionChunk(val) => {
11115 (stack, missing) = val.lookup_attr(offset, missing_type);
11116 if !stack.is_empty() {
11117 break;
11118 }
11119 }
11120 _ => {}
11121 };
11122 last_off = cur + attrs.pos;
11123 }
11124 if !stack.is_empty() {
11125 stack.push(("DlRegionChunks", cur));
11126 }
11127 (stack, missing)
11128 }
11129}
11130#[derive(Clone)]
11131pub enum DlRegionChunk<'a> {
11132 RegionChunkData(&'a [u8]),
11133 RegionChunkAddr(u64),
11134}
11135impl<'a> IterableDlRegionChunk<'a> {
11136 pub fn get_region_chunk_data(&self) -> Result<&'a [u8], ErrorContext> {
11137 let mut iter = self.clone();
11138 iter.pos = 0;
11139 for attr in iter {
11140 if let DlRegionChunk::RegionChunkData(val) = attr? {
11141 return Ok(val);
11142 }
11143 }
11144 Err(ErrorContext::new_missing(
11145 "DlRegionChunk",
11146 "RegionChunkData",
11147 self.orig_loc,
11148 self.buf.as_ptr() as usize,
11149 ))
11150 }
11151 pub fn get_region_chunk_addr(&self) -> Result<u64, ErrorContext> {
11152 let mut iter = self.clone();
11153 iter.pos = 0;
11154 for attr in iter {
11155 if let DlRegionChunk::RegionChunkAddr(val) = attr? {
11156 return Ok(val);
11157 }
11158 }
11159 Err(ErrorContext::new_missing(
11160 "DlRegionChunk",
11161 "RegionChunkAddr",
11162 self.orig_loc,
11163 self.buf.as_ptr() as usize,
11164 ))
11165 }
11166}
11167impl DlRegionChunk<'_> {
11168 pub fn new<'a>(buf: &'a [u8]) -> IterableDlRegionChunk<'a> {
11169 IterableDlRegionChunk::with_loc(buf, buf.as_ptr() as usize)
11170 }
11171 fn attr_from_type(r#type: u16) -> Option<&'static str> {
11172 Devlink::attr_from_type(r#type)
11173 }
11174}
11175#[derive(Clone, Copy, Default)]
11176pub struct IterableDlRegionChunk<'a> {
11177 buf: &'a [u8],
11178 pos: usize,
11179 orig_loc: usize,
11180}
11181impl<'a> IterableDlRegionChunk<'a> {
11182 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11183 Self {
11184 buf,
11185 pos: 0,
11186 orig_loc,
11187 }
11188 }
11189 pub fn get_buf(&self) -> &'a [u8] {
11190 self.buf
11191 }
11192}
11193impl<'a> Iterator for IterableDlRegionChunk<'a> {
11194 type Item = Result<DlRegionChunk<'a>, ErrorContext>;
11195 fn next(&mut self) -> Option<Self::Item> {
11196 let pos = self.pos;
11197 let mut r#type;
11198 loop {
11199 r#type = None;
11200 if self.buf.len() == self.pos {
11201 return None;
11202 }
11203 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11204 break;
11205 };
11206 r#type = Some(header.r#type);
11207 let res = match header.r#type {
11208 95u16 => DlRegionChunk::RegionChunkData({
11209 let res = Some(next);
11210 let Some(val) = res else { break };
11211 val
11212 }),
11213 96u16 => DlRegionChunk::RegionChunkAddr({
11214 let res = parse_u64(next);
11215 let Some(val) = res else { break };
11216 val
11217 }),
11218 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11219 n => continue,
11220 };
11221 return Some(Ok(res));
11222 }
11223 Some(Err(ErrorContext::new(
11224 "DlRegionChunk",
11225 r#type.and_then(|t| DlRegionChunk::attr_from_type(t)),
11226 self.orig_loc,
11227 self.buf.as_ptr().wrapping_add(pos) as usize,
11228 )))
11229 }
11230}
11231impl<'a> std::fmt::Debug for IterableDlRegionChunk<'_> {
11232 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11233 let mut fmt = f.debug_struct("DlRegionChunk");
11234 for attr in self.clone() {
11235 let attr = match attr {
11236 Ok(a) => a,
11237 Err(err) => {
11238 fmt.finish()?;
11239 f.write_str("Err(")?;
11240 err.fmt(f)?;
11241 return f.write_str(")");
11242 }
11243 };
11244 match attr {
11245 DlRegionChunk::RegionChunkData(val) => fmt.field("RegionChunkData", &val),
11246 DlRegionChunk::RegionChunkAddr(val) => fmt.field("RegionChunkAddr", &val),
11247 };
11248 }
11249 fmt.finish()
11250 }
11251}
11252impl IterableDlRegionChunk<'_> {
11253 pub fn lookup_attr(
11254 &self,
11255 offset: usize,
11256 missing_type: Option<u16>,
11257 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11258 let mut stack = Vec::new();
11259 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11260 if missing_type.is_some() && cur == offset {
11261 stack.push(("DlRegionChunk", offset));
11262 return (
11263 stack,
11264 missing_type.and_then(|t| DlRegionChunk::attr_from_type(t)),
11265 );
11266 }
11267 if cur > offset || cur + self.buf.len() < offset {
11268 return (stack, None);
11269 }
11270 let mut attrs = self.clone();
11271 let mut last_off = cur + attrs.pos;
11272 while let Some(attr) = attrs.next() {
11273 let Ok(attr) = attr else { break };
11274 match attr {
11275 DlRegionChunk::RegionChunkData(val) => {
11276 if last_off == offset {
11277 stack.push(("RegionChunkData", last_off));
11278 break;
11279 }
11280 }
11281 DlRegionChunk::RegionChunkAddr(val) => {
11282 if last_off == offset {
11283 stack.push(("RegionChunkAddr", last_off));
11284 break;
11285 }
11286 }
11287 _ => {}
11288 };
11289 last_off = cur + attrs.pos;
11290 }
11291 if !stack.is_empty() {
11292 stack.push(("DlRegionChunk", cur));
11293 }
11294 (stack, None)
11295 }
11296}
11297#[derive(Clone)]
11298pub enum DlFmsg<'a> {
11299 FmsgObjNestStart(()),
11300 FmsgPairNestStart(()),
11301 FmsgArrNestStart(()),
11302 FmsgNestEnd(()),
11303 FmsgObjName(&'a CStr),
11304}
11305impl<'a> IterableDlFmsg<'a> {
11306 pub fn get_fmsg_obj_nest_start(&self) -> Result<(), ErrorContext> {
11307 let mut iter = self.clone();
11308 iter.pos = 0;
11309 for attr in iter {
11310 if let DlFmsg::FmsgObjNestStart(val) = attr? {
11311 return Ok(val);
11312 }
11313 }
11314 Err(ErrorContext::new_missing(
11315 "DlFmsg",
11316 "FmsgObjNestStart",
11317 self.orig_loc,
11318 self.buf.as_ptr() as usize,
11319 ))
11320 }
11321 pub fn get_fmsg_pair_nest_start(&self) -> Result<(), ErrorContext> {
11322 let mut iter = self.clone();
11323 iter.pos = 0;
11324 for attr in iter {
11325 if let DlFmsg::FmsgPairNestStart(val) = attr? {
11326 return Ok(val);
11327 }
11328 }
11329 Err(ErrorContext::new_missing(
11330 "DlFmsg",
11331 "FmsgPairNestStart",
11332 self.orig_loc,
11333 self.buf.as_ptr() as usize,
11334 ))
11335 }
11336 pub fn get_fmsg_arr_nest_start(&self) -> Result<(), ErrorContext> {
11337 let mut iter = self.clone();
11338 iter.pos = 0;
11339 for attr in iter {
11340 if let DlFmsg::FmsgArrNestStart(val) = attr? {
11341 return Ok(val);
11342 }
11343 }
11344 Err(ErrorContext::new_missing(
11345 "DlFmsg",
11346 "FmsgArrNestStart",
11347 self.orig_loc,
11348 self.buf.as_ptr() as usize,
11349 ))
11350 }
11351 pub fn get_fmsg_nest_end(&self) -> Result<(), ErrorContext> {
11352 let mut iter = self.clone();
11353 iter.pos = 0;
11354 for attr in iter {
11355 if let DlFmsg::FmsgNestEnd(val) = attr? {
11356 return Ok(val);
11357 }
11358 }
11359 Err(ErrorContext::new_missing(
11360 "DlFmsg",
11361 "FmsgNestEnd",
11362 self.orig_loc,
11363 self.buf.as_ptr() as usize,
11364 ))
11365 }
11366 pub fn get_fmsg_obj_name(&self) -> Result<&'a CStr, ErrorContext> {
11367 let mut iter = self.clone();
11368 iter.pos = 0;
11369 for attr in iter {
11370 if let DlFmsg::FmsgObjName(val) = attr? {
11371 return Ok(val);
11372 }
11373 }
11374 Err(ErrorContext::new_missing(
11375 "DlFmsg",
11376 "FmsgObjName",
11377 self.orig_loc,
11378 self.buf.as_ptr() as usize,
11379 ))
11380 }
11381}
11382impl DlFmsg<'_> {
11383 pub fn new<'a>(buf: &'a [u8]) -> IterableDlFmsg<'a> {
11384 IterableDlFmsg::with_loc(buf, buf.as_ptr() as usize)
11385 }
11386 fn attr_from_type(r#type: u16) -> Option<&'static str> {
11387 Devlink::attr_from_type(r#type)
11388 }
11389}
11390#[derive(Clone, Copy, Default)]
11391pub struct IterableDlFmsg<'a> {
11392 buf: &'a [u8],
11393 pos: usize,
11394 orig_loc: usize,
11395}
11396impl<'a> IterableDlFmsg<'a> {
11397 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11398 Self {
11399 buf,
11400 pos: 0,
11401 orig_loc,
11402 }
11403 }
11404 pub fn get_buf(&self) -> &'a [u8] {
11405 self.buf
11406 }
11407}
11408impl<'a> Iterator for IterableDlFmsg<'a> {
11409 type Item = Result<DlFmsg<'a>, ErrorContext>;
11410 fn next(&mut self) -> Option<Self::Item> {
11411 let pos = self.pos;
11412 let mut r#type;
11413 loop {
11414 r#type = None;
11415 if self.buf.len() == self.pos {
11416 return None;
11417 }
11418 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11419 break;
11420 };
11421 r#type = Some(header.r#type);
11422 let res = match header.r#type {
11423 107u16 => DlFmsg::FmsgObjNestStart(()),
11424 108u16 => DlFmsg::FmsgPairNestStart(()),
11425 109u16 => DlFmsg::FmsgArrNestStart(()),
11426 110u16 => DlFmsg::FmsgNestEnd(()),
11427 111u16 => DlFmsg::FmsgObjName({
11428 let res = CStr::from_bytes_with_nul(next).ok();
11429 let Some(val) = res else { break };
11430 val
11431 }),
11432 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11433 n => continue,
11434 };
11435 return Some(Ok(res));
11436 }
11437 Some(Err(ErrorContext::new(
11438 "DlFmsg",
11439 r#type.and_then(|t| DlFmsg::attr_from_type(t)),
11440 self.orig_loc,
11441 self.buf.as_ptr().wrapping_add(pos) as usize,
11442 )))
11443 }
11444}
11445impl<'a> std::fmt::Debug for IterableDlFmsg<'_> {
11446 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11447 let mut fmt = f.debug_struct("DlFmsg");
11448 for attr in self.clone() {
11449 let attr = match attr {
11450 Ok(a) => a,
11451 Err(err) => {
11452 fmt.finish()?;
11453 f.write_str("Err(")?;
11454 err.fmt(f)?;
11455 return f.write_str(")");
11456 }
11457 };
11458 match attr {
11459 DlFmsg::FmsgObjNestStart(val) => fmt.field("FmsgObjNestStart", &val),
11460 DlFmsg::FmsgPairNestStart(val) => fmt.field("FmsgPairNestStart", &val),
11461 DlFmsg::FmsgArrNestStart(val) => fmt.field("FmsgArrNestStart", &val),
11462 DlFmsg::FmsgNestEnd(val) => fmt.field("FmsgNestEnd", &val),
11463 DlFmsg::FmsgObjName(val) => fmt.field("FmsgObjName", &val),
11464 };
11465 }
11466 fmt.finish()
11467 }
11468}
11469impl IterableDlFmsg<'_> {
11470 pub fn lookup_attr(
11471 &self,
11472 offset: usize,
11473 missing_type: Option<u16>,
11474 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11475 let mut stack = Vec::new();
11476 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11477 if missing_type.is_some() && cur == offset {
11478 stack.push(("DlFmsg", offset));
11479 return (stack, missing_type.and_then(|t| DlFmsg::attr_from_type(t)));
11480 }
11481 if cur > offset || cur + self.buf.len() < offset {
11482 return (stack, None);
11483 }
11484 let mut attrs = self.clone();
11485 let mut last_off = cur + attrs.pos;
11486 while let Some(attr) = attrs.next() {
11487 let Ok(attr) = attr else { break };
11488 match attr {
11489 DlFmsg::FmsgObjNestStart(val) => {
11490 if last_off == offset {
11491 stack.push(("FmsgObjNestStart", last_off));
11492 break;
11493 }
11494 }
11495 DlFmsg::FmsgPairNestStart(val) => {
11496 if last_off == offset {
11497 stack.push(("FmsgPairNestStart", last_off));
11498 break;
11499 }
11500 }
11501 DlFmsg::FmsgArrNestStart(val) => {
11502 if last_off == offset {
11503 stack.push(("FmsgArrNestStart", last_off));
11504 break;
11505 }
11506 }
11507 DlFmsg::FmsgNestEnd(val) => {
11508 if last_off == offset {
11509 stack.push(("FmsgNestEnd", last_off));
11510 break;
11511 }
11512 }
11513 DlFmsg::FmsgObjName(val) => {
11514 if last_off == offset {
11515 stack.push(("FmsgObjName", last_off));
11516 break;
11517 }
11518 }
11519 _ => {}
11520 };
11521 last_off = cur + attrs.pos;
11522 }
11523 if !stack.is_empty() {
11524 stack.push(("DlFmsg", cur));
11525 }
11526 (stack, None)
11527 }
11528}
11529#[derive(Clone)]
11530pub enum DlHealthReporter<'a> {
11531 HealthReporterName(&'a CStr),
11532 HealthReporterState(u8),
11533 HealthReporterErrCount(u64),
11534 HealthReporterRecoverCount(u64),
11535 HealthReporterDumpTs(u64),
11536 HealthReporterGracefulPeriod(u64),
11537 HealthReporterAutoRecover(u8),
11538 HealthReporterDumpTsNs(u64),
11539 HealthReporterAutoDump(u8),
11540 #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
11541 HealthReporterBurstPeriod(u64),
11542}
11543impl<'a> IterableDlHealthReporter<'a> {
11544 pub fn get_health_reporter_name(&self) -> Result<&'a CStr, ErrorContext> {
11545 let mut iter = self.clone();
11546 iter.pos = 0;
11547 for attr in iter {
11548 if let DlHealthReporter::HealthReporterName(val) = attr? {
11549 return Ok(val);
11550 }
11551 }
11552 Err(ErrorContext::new_missing(
11553 "DlHealthReporter",
11554 "HealthReporterName",
11555 self.orig_loc,
11556 self.buf.as_ptr() as usize,
11557 ))
11558 }
11559 pub fn get_health_reporter_state(&self) -> Result<u8, ErrorContext> {
11560 let mut iter = self.clone();
11561 iter.pos = 0;
11562 for attr in iter {
11563 if let DlHealthReporter::HealthReporterState(val) = attr? {
11564 return Ok(val);
11565 }
11566 }
11567 Err(ErrorContext::new_missing(
11568 "DlHealthReporter",
11569 "HealthReporterState",
11570 self.orig_loc,
11571 self.buf.as_ptr() as usize,
11572 ))
11573 }
11574 pub fn get_health_reporter_err_count(&self) -> Result<u64, ErrorContext> {
11575 let mut iter = self.clone();
11576 iter.pos = 0;
11577 for attr in iter {
11578 if let DlHealthReporter::HealthReporterErrCount(val) = attr? {
11579 return Ok(val);
11580 }
11581 }
11582 Err(ErrorContext::new_missing(
11583 "DlHealthReporter",
11584 "HealthReporterErrCount",
11585 self.orig_loc,
11586 self.buf.as_ptr() as usize,
11587 ))
11588 }
11589 pub fn get_health_reporter_recover_count(&self) -> Result<u64, ErrorContext> {
11590 let mut iter = self.clone();
11591 iter.pos = 0;
11592 for attr in iter {
11593 if let DlHealthReporter::HealthReporterRecoverCount(val) = attr? {
11594 return Ok(val);
11595 }
11596 }
11597 Err(ErrorContext::new_missing(
11598 "DlHealthReporter",
11599 "HealthReporterRecoverCount",
11600 self.orig_loc,
11601 self.buf.as_ptr() as usize,
11602 ))
11603 }
11604 pub fn get_health_reporter_dump_ts(&self) -> Result<u64, ErrorContext> {
11605 let mut iter = self.clone();
11606 iter.pos = 0;
11607 for attr in iter {
11608 if let DlHealthReporter::HealthReporterDumpTs(val) = attr? {
11609 return Ok(val);
11610 }
11611 }
11612 Err(ErrorContext::new_missing(
11613 "DlHealthReporter",
11614 "HealthReporterDumpTs",
11615 self.orig_loc,
11616 self.buf.as_ptr() as usize,
11617 ))
11618 }
11619 pub fn get_health_reporter_graceful_period(&self) -> Result<u64, ErrorContext> {
11620 let mut iter = self.clone();
11621 iter.pos = 0;
11622 for attr in iter {
11623 if let DlHealthReporter::HealthReporterGracefulPeriod(val) = attr? {
11624 return Ok(val);
11625 }
11626 }
11627 Err(ErrorContext::new_missing(
11628 "DlHealthReporter",
11629 "HealthReporterGracefulPeriod",
11630 self.orig_loc,
11631 self.buf.as_ptr() as usize,
11632 ))
11633 }
11634 pub fn get_health_reporter_auto_recover(&self) -> Result<u8, ErrorContext> {
11635 let mut iter = self.clone();
11636 iter.pos = 0;
11637 for attr in iter {
11638 if let DlHealthReporter::HealthReporterAutoRecover(val) = attr? {
11639 return Ok(val);
11640 }
11641 }
11642 Err(ErrorContext::new_missing(
11643 "DlHealthReporter",
11644 "HealthReporterAutoRecover",
11645 self.orig_loc,
11646 self.buf.as_ptr() as usize,
11647 ))
11648 }
11649 pub fn get_health_reporter_dump_ts_ns(&self) -> Result<u64, ErrorContext> {
11650 let mut iter = self.clone();
11651 iter.pos = 0;
11652 for attr in iter {
11653 if let DlHealthReporter::HealthReporterDumpTsNs(val) = attr? {
11654 return Ok(val);
11655 }
11656 }
11657 Err(ErrorContext::new_missing(
11658 "DlHealthReporter",
11659 "HealthReporterDumpTsNs",
11660 self.orig_loc,
11661 self.buf.as_ptr() as usize,
11662 ))
11663 }
11664 pub fn get_health_reporter_auto_dump(&self) -> Result<u8, ErrorContext> {
11665 let mut iter = self.clone();
11666 iter.pos = 0;
11667 for attr in iter {
11668 if let DlHealthReporter::HealthReporterAutoDump(val) = attr? {
11669 return Ok(val);
11670 }
11671 }
11672 Err(ErrorContext::new_missing(
11673 "DlHealthReporter",
11674 "HealthReporterAutoDump",
11675 self.orig_loc,
11676 self.buf.as_ptr() as usize,
11677 ))
11678 }
11679 #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
11680 pub fn get_health_reporter_burst_period(&self) -> Result<u64, ErrorContext> {
11681 let mut iter = self.clone();
11682 iter.pos = 0;
11683 for attr in iter {
11684 if let DlHealthReporter::HealthReporterBurstPeriod(val) = attr? {
11685 return Ok(val);
11686 }
11687 }
11688 Err(ErrorContext::new_missing(
11689 "DlHealthReporter",
11690 "HealthReporterBurstPeriod",
11691 self.orig_loc,
11692 self.buf.as_ptr() as usize,
11693 ))
11694 }
11695}
11696impl DlHealthReporter<'_> {
11697 pub fn new<'a>(buf: &'a [u8]) -> IterableDlHealthReporter<'a> {
11698 IterableDlHealthReporter::with_loc(buf, buf.as_ptr() as usize)
11699 }
11700 fn attr_from_type(r#type: u16) -> Option<&'static str> {
11701 Devlink::attr_from_type(r#type)
11702 }
11703}
11704#[derive(Clone, Copy, Default)]
11705pub struct IterableDlHealthReporter<'a> {
11706 buf: &'a [u8],
11707 pos: usize,
11708 orig_loc: usize,
11709}
11710impl<'a> IterableDlHealthReporter<'a> {
11711 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11712 Self {
11713 buf,
11714 pos: 0,
11715 orig_loc,
11716 }
11717 }
11718 pub fn get_buf(&self) -> &'a [u8] {
11719 self.buf
11720 }
11721}
11722impl<'a> Iterator for IterableDlHealthReporter<'a> {
11723 type Item = Result<DlHealthReporter<'a>, ErrorContext>;
11724 fn next(&mut self) -> Option<Self::Item> {
11725 let pos = self.pos;
11726 let mut r#type;
11727 loop {
11728 r#type = None;
11729 if self.buf.len() == self.pos {
11730 return None;
11731 }
11732 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11733 break;
11734 };
11735 r#type = Some(header.r#type);
11736 let res = match header.r#type {
11737 115u16 => DlHealthReporter::HealthReporterName({
11738 let res = CStr::from_bytes_with_nul(next).ok();
11739 let Some(val) = res else { break };
11740 val
11741 }),
11742 116u16 => DlHealthReporter::HealthReporterState({
11743 let res = parse_u8(next);
11744 let Some(val) = res else { break };
11745 val
11746 }),
11747 117u16 => DlHealthReporter::HealthReporterErrCount({
11748 let res = parse_u64(next);
11749 let Some(val) = res else { break };
11750 val
11751 }),
11752 118u16 => DlHealthReporter::HealthReporterRecoverCount({
11753 let res = parse_u64(next);
11754 let Some(val) = res else { break };
11755 val
11756 }),
11757 119u16 => DlHealthReporter::HealthReporterDumpTs({
11758 let res = parse_u64(next);
11759 let Some(val) = res else { break };
11760 val
11761 }),
11762 120u16 => DlHealthReporter::HealthReporterGracefulPeriod({
11763 let res = parse_u64(next);
11764 let Some(val) = res else { break };
11765 val
11766 }),
11767 121u16 => DlHealthReporter::HealthReporterAutoRecover({
11768 let res = parse_u8(next);
11769 let Some(val) = res else { break };
11770 val
11771 }),
11772 137u16 => DlHealthReporter::HealthReporterDumpTsNs({
11773 let res = parse_u64(next);
11774 let Some(val) = res else { break };
11775 val
11776 }),
11777 141u16 => DlHealthReporter::HealthReporterAutoDump({
11778 let res = parse_u8(next);
11779 let Some(val) = res else { break };
11780 val
11781 }),
11782 181u16 => DlHealthReporter::HealthReporterBurstPeriod({
11783 let res = parse_u64(next);
11784 let Some(val) = res else { break };
11785 val
11786 }),
11787 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11788 n => continue,
11789 };
11790 return Some(Ok(res));
11791 }
11792 Some(Err(ErrorContext::new(
11793 "DlHealthReporter",
11794 r#type.and_then(|t| DlHealthReporter::attr_from_type(t)),
11795 self.orig_loc,
11796 self.buf.as_ptr().wrapping_add(pos) as usize,
11797 )))
11798 }
11799}
11800impl<'a> std::fmt::Debug for IterableDlHealthReporter<'_> {
11801 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11802 let mut fmt = f.debug_struct("DlHealthReporter");
11803 for attr in self.clone() {
11804 let attr = match attr {
11805 Ok(a) => a,
11806 Err(err) => {
11807 fmt.finish()?;
11808 f.write_str("Err(")?;
11809 err.fmt(f)?;
11810 return f.write_str(")");
11811 }
11812 };
11813 match attr {
11814 DlHealthReporter::HealthReporterName(val) => fmt.field("HealthReporterName", &val),
11815 DlHealthReporter::HealthReporterState(val) => {
11816 fmt.field("HealthReporterState", &val)
11817 }
11818 DlHealthReporter::HealthReporterErrCount(val) => {
11819 fmt.field("HealthReporterErrCount", &val)
11820 }
11821 DlHealthReporter::HealthReporterRecoverCount(val) => {
11822 fmt.field("HealthReporterRecoverCount", &val)
11823 }
11824 DlHealthReporter::HealthReporterDumpTs(val) => {
11825 fmt.field("HealthReporterDumpTs", &val)
11826 }
11827 DlHealthReporter::HealthReporterGracefulPeriod(val) => {
11828 fmt.field("HealthReporterGracefulPeriod", &val)
11829 }
11830 DlHealthReporter::HealthReporterAutoRecover(val) => {
11831 fmt.field("HealthReporterAutoRecover", &val)
11832 }
11833 DlHealthReporter::HealthReporterDumpTsNs(val) => {
11834 fmt.field("HealthReporterDumpTsNs", &val)
11835 }
11836 DlHealthReporter::HealthReporterAutoDump(val) => {
11837 fmt.field("HealthReporterAutoDump", &val)
11838 }
11839 DlHealthReporter::HealthReporterBurstPeriod(val) => {
11840 fmt.field("HealthReporterBurstPeriod", &val)
11841 }
11842 };
11843 }
11844 fmt.finish()
11845 }
11846}
11847impl IterableDlHealthReporter<'_> {
11848 pub fn lookup_attr(
11849 &self,
11850 offset: usize,
11851 missing_type: Option<u16>,
11852 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11853 let mut stack = Vec::new();
11854 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11855 if missing_type.is_some() && cur == offset {
11856 stack.push(("DlHealthReporter", offset));
11857 return (
11858 stack,
11859 missing_type.and_then(|t| DlHealthReporter::attr_from_type(t)),
11860 );
11861 }
11862 if cur > offset || cur + self.buf.len() < offset {
11863 return (stack, None);
11864 }
11865 let mut attrs = self.clone();
11866 let mut last_off = cur + attrs.pos;
11867 while let Some(attr) = attrs.next() {
11868 let Ok(attr) = attr else { break };
11869 match attr {
11870 DlHealthReporter::HealthReporterName(val) => {
11871 if last_off == offset {
11872 stack.push(("HealthReporterName", last_off));
11873 break;
11874 }
11875 }
11876 DlHealthReporter::HealthReporterState(val) => {
11877 if last_off == offset {
11878 stack.push(("HealthReporterState", last_off));
11879 break;
11880 }
11881 }
11882 DlHealthReporter::HealthReporterErrCount(val) => {
11883 if last_off == offset {
11884 stack.push(("HealthReporterErrCount", last_off));
11885 break;
11886 }
11887 }
11888 DlHealthReporter::HealthReporterRecoverCount(val) => {
11889 if last_off == offset {
11890 stack.push(("HealthReporterRecoverCount", last_off));
11891 break;
11892 }
11893 }
11894 DlHealthReporter::HealthReporterDumpTs(val) => {
11895 if last_off == offset {
11896 stack.push(("HealthReporterDumpTs", last_off));
11897 break;
11898 }
11899 }
11900 DlHealthReporter::HealthReporterGracefulPeriod(val) => {
11901 if last_off == offset {
11902 stack.push(("HealthReporterGracefulPeriod", last_off));
11903 break;
11904 }
11905 }
11906 DlHealthReporter::HealthReporterAutoRecover(val) => {
11907 if last_off == offset {
11908 stack.push(("HealthReporterAutoRecover", last_off));
11909 break;
11910 }
11911 }
11912 DlHealthReporter::HealthReporterDumpTsNs(val) => {
11913 if last_off == offset {
11914 stack.push(("HealthReporterDumpTsNs", last_off));
11915 break;
11916 }
11917 }
11918 DlHealthReporter::HealthReporterAutoDump(val) => {
11919 if last_off == offset {
11920 stack.push(("HealthReporterAutoDump", last_off));
11921 break;
11922 }
11923 }
11924 DlHealthReporter::HealthReporterBurstPeriod(val) => {
11925 if last_off == offset {
11926 stack.push(("HealthReporterBurstPeriod", last_off));
11927 break;
11928 }
11929 }
11930 _ => {}
11931 };
11932 last_off = cur + attrs.pos;
11933 }
11934 if !stack.is_empty() {
11935 stack.push(("DlHealthReporter", cur));
11936 }
11937 (stack, None)
11938 }
11939}
11940#[derive(Clone)]
11941pub enum DlAttrStats {
11942 StatsRxPackets(u64),
11943 StatsRxBytes(u64),
11944 StatsRxDropped(u64),
11945}
11946impl<'a> IterableDlAttrStats<'a> {
11947 pub fn get_stats_rx_packets(&self) -> Result<u64, ErrorContext> {
11948 let mut iter = self.clone();
11949 iter.pos = 0;
11950 for attr in iter {
11951 if let DlAttrStats::StatsRxPackets(val) = attr? {
11952 return Ok(val);
11953 }
11954 }
11955 Err(ErrorContext::new_missing(
11956 "DlAttrStats",
11957 "StatsRxPackets",
11958 self.orig_loc,
11959 self.buf.as_ptr() as usize,
11960 ))
11961 }
11962 pub fn get_stats_rx_bytes(&self) -> Result<u64, ErrorContext> {
11963 let mut iter = self.clone();
11964 iter.pos = 0;
11965 for attr in iter {
11966 if let DlAttrStats::StatsRxBytes(val) = attr? {
11967 return Ok(val);
11968 }
11969 }
11970 Err(ErrorContext::new_missing(
11971 "DlAttrStats",
11972 "StatsRxBytes",
11973 self.orig_loc,
11974 self.buf.as_ptr() as usize,
11975 ))
11976 }
11977 pub fn get_stats_rx_dropped(&self) -> Result<u64, ErrorContext> {
11978 let mut iter = self.clone();
11979 iter.pos = 0;
11980 for attr in iter {
11981 if let DlAttrStats::StatsRxDropped(val) = attr? {
11982 return Ok(val);
11983 }
11984 }
11985 Err(ErrorContext::new_missing(
11986 "DlAttrStats",
11987 "StatsRxDropped",
11988 self.orig_loc,
11989 self.buf.as_ptr() as usize,
11990 ))
11991 }
11992}
11993impl DlAttrStats {
11994 pub fn new<'a>(buf: &'a [u8]) -> IterableDlAttrStats<'a> {
11995 IterableDlAttrStats::with_loc(buf, buf.as_ptr() as usize)
11996 }
11997 fn attr_from_type(r#type: u16) -> Option<&'static str> {
11998 let res = match r#type {
11999 0u16 => "StatsRxPackets",
12000 1u16 => "StatsRxBytes",
12001 2u16 => "StatsRxDropped",
12002 _ => return None,
12003 };
12004 Some(res)
12005 }
12006}
12007#[derive(Clone, Copy, Default)]
12008pub struct IterableDlAttrStats<'a> {
12009 buf: &'a [u8],
12010 pos: usize,
12011 orig_loc: usize,
12012}
12013impl<'a> IterableDlAttrStats<'a> {
12014 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12015 Self {
12016 buf,
12017 pos: 0,
12018 orig_loc,
12019 }
12020 }
12021 pub fn get_buf(&self) -> &'a [u8] {
12022 self.buf
12023 }
12024}
12025impl<'a> Iterator for IterableDlAttrStats<'a> {
12026 type Item = Result<DlAttrStats, ErrorContext>;
12027 fn next(&mut self) -> Option<Self::Item> {
12028 let pos = self.pos;
12029 let mut r#type;
12030 loop {
12031 r#type = None;
12032 if self.buf.len() == self.pos {
12033 return None;
12034 }
12035 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12036 break;
12037 };
12038 r#type = Some(header.r#type);
12039 let res = match header.r#type {
12040 0u16 => DlAttrStats::StatsRxPackets({
12041 let res = parse_u64(next);
12042 let Some(val) = res else { break };
12043 val
12044 }),
12045 1u16 => DlAttrStats::StatsRxBytes({
12046 let res = parse_u64(next);
12047 let Some(val) = res else { break };
12048 val
12049 }),
12050 2u16 => DlAttrStats::StatsRxDropped({
12051 let res = parse_u64(next);
12052 let Some(val) = res else { break };
12053 val
12054 }),
12055 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12056 n => continue,
12057 };
12058 return Some(Ok(res));
12059 }
12060 Some(Err(ErrorContext::new(
12061 "DlAttrStats",
12062 r#type.and_then(|t| DlAttrStats::attr_from_type(t)),
12063 self.orig_loc,
12064 self.buf.as_ptr().wrapping_add(pos) as usize,
12065 )))
12066 }
12067}
12068impl std::fmt::Debug for IterableDlAttrStats<'_> {
12069 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12070 let mut fmt = f.debug_struct("DlAttrStats");
12071 for attr in self.clone() {
12072 let attr = match attr {
12073 Ok(a) => a,
12074 Err(err) => {
12075 fmt.finish()?;
12076 f.write_str("Err(")?;
12077 err.fmt(f)?;
12078 return f.write_str(")");
12079 }
12080 };
12081 match attr {
12082 DlAttrStats::StatsRxPackets(val) => fmt.field("StatsRxPackets", &val),
12083 DlAttrStats::StatsRxBytes(val) => fmt.field("StatsRxBytes", &val),
12084 DlAttrStats::StatsRxDropped(val) => fmt.field("StatsRxDropped", &val),
12085 };
12086 }
12087 fmt.finish()
12088 }
12089}
12090impl IterableDlAttrStats<'_> {
12091 pub fn lookup_attr(
12092 &self,
12093 offset: usize,
12094 missing_type: Option<u16>,
12095 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12096 let mut stack = Vec::new();
12097 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12098 if missing_type.is_some() && cur == offset {
12099 stack.push(("DlAttrStats", offset));
12100 return (
12101 stack,
12102 missing_type.and_then(|t| DlAttrStats::attr_from_type(t)),
12103 );
12104 }
12105 if cur > offset || cur + self.buf.len() < offset {
12106 return (stack, None);
12107 }
12108 let mut attrs = self.clone();
12109 let mut last_off = cur + attrs.pos;
12110 while let Some(attr) = attrs.next() {
12111 let Ok(attr) = attr else { break };
12112 match attr {
12113 DlAttrStats::StatsRxPackets(val) => {
12114 if last_off == offset {
12115 stack.push(("StatsRxPackets", last_off));
12116 break;
12117 }
12118 }
12119 DlAttrStats::StatsRxBytes(val) => {
12120 if last_off == offset {
12121 stack.push(("StatsRxBytes", last_off));
12122 break;
12123 }
12124 }
12125 DlAttrStats::StatsRxDropped(val) => {
12126 if last_off == offset {
12127 stack.push(("StatsRxDropped", last_off));
12128 break;
12129 }
12130 }
12131 _ => {}
12132 };
12133 last_off = cur + attrs.pos;
12134 }
12135 if !stack.is_empty() {
12136 stack.push(("DlAttrStats", cur));
12137 }
12138 (stack, None)
12139 }
12140}
12141#[derive(Clone)]
12142pub enum DlTrapMetadata {
12143 TrapMetadataTypeInPort(()),
12144 TrapMetadataTypeFaCookie(()),
12145}
12146impl<'a> IterableDlTrapMetadata<'a> {
12147 pub fn get_trap_metadata_type_in_port(&self) -> Result<(), ErrorContext> {
12148 let mut iter = self.clone();
12149 iter.pos = 0;
12150 for attr in iter {
12151 if let DlTrapMetadata::TrapMetadataTypeInPort(val) = attr? {
12152 return Ok(val);
12153 }
12154 }
12155 Err(ErrorContext::new_missing(
12156 "DlTrapMetadata",
12157 "TrapMetadataTypeInPort",
12158 self.orig_loc,
12159 self.buf.as_ptr() as usize,
12160 ))
12161 }
12162 pub fn get_trap_metadata_type_fa_cookie(&self) -> Result<(), ErrorContext> {
12163 let mut iter = self.clone();
12164 iter.pos = 0;
12165 for attr in iter {
12166 if let DlTrapMetadata::TrapMetadataTypeFaCookie(val) = attr? {
12167 return Ok(val);
12168 }
12169 }
12170 Err(ErrorContext::new_missing(
12171 "DlTrapMetadata",
12172 "TrapMetadataTypeFaCookie",
12173 self.orig_loc,
12174 self.buf.as_ptr() as usize,
12175 ))
12176 }
12177}
12178impl DlTrapMetadata {
12179 pub fn new<'a>(buf: &'a [u8]) -> IterableDlTrapMetadata<'a> {
12180 IterableDlTrapMetadata::with_loc(buf, buf.as_ptr() as usize)
12181 }
12182 fn attr_from_type(r#type: u16) -> Option<&'static str> {
12183 let res = match r#type {
12184 0u16 => "TrapMetadataTypeInPort",
12185 1u16 => "TrapMetadataTypeFaCookie",
12186 _ => return None,
12187 };
12188 Some(res)
12189 }
12190}
12191#[derive(Clone, Copy, Default)]
12192pub struct IterableDlTrapMetadata<'a> {
12193 buf: &'a [u8],
12194 pos: usize,
12195 orig_loc: usize,
12196}
12197impl<'a> IterableDlTrapMetadata<'a> {
12198 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12199 Self {
12200 buf,
12201 pos: 0,
12202 orig_loc,
12203 }
12204 }
12205 pub fn get_buf(&self) -> &'a [u8] {
12206 self.buf
12207 }
12208}
12209impl<'a> Iterator for IterableDlTrapMetadata<'a> {
12210 type Item = Result<DlTrapMetadata, ErrorContext>;
12211 fn next(&mut self) -> Option<Self::Item> {
12212 let pos = self.pos;
12213 let mut r#type;
12214 loop {
12215 r#type = None;
12216 if self.buf.len() == self.pos {
12217 return None;
12218 }
12219 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12220 break;
12221 };
12222 r#type = Some(header.r#type);
12223 let res = match header.r#type {
12224 0u16 => DlTrapMetadata::TrapMetadataTypeInPort(()),
12225 1u16 => DlTrapMetadata::TrapMetadataTypeFaCookie(()),
12226 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12227 n => continue,
12228 };
12229 return Some(Ok(res));
12230 }
12231 Some(Err(ErrorContext::new(
12232 "DlTrapMetadata",
12233 r#type.and_then(|t| DlTrapMetadata::attr_from_type(t)),
12234 self.orig_loc,
12235 self.buf.as_ptr().wrapping_add(pos) as usize,
12236 )))
12237 }
12238}
12239impl std::fmt::Debug for IterableDlTrapMetadata<'_> {
12240 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12241 let mut fmt = f.debug_struct("DlTrapMetadata");
12242 for attr in self.clone() {
12243 let attr = match attr {
12244 Ok(a) => a,
12245 Err(err) => {
12246 fmt.finish()?;
12247 f.write_str("Err(")?;
12248 err.fmt(f)?;
12249 return f.write_str(")");
12250 }
12251 };
12252 match attr {
12253 DlTrapMetadata::TrapMetadataTypeInPort(val) => {
12254 fmt.field("TrapMetadataTypeInPort", &val)
12255 }
12256 DlTrapMetadata::TrapMetadataTypeFaCookie(val) => {
12257 fmt.field("TrapMetadataTypeFaCookie", &val)
12258 }
12259 };
12260 }
12261 fmt.finish()
12262 }
12263}
12264impl IterableDlTrapMetadata<'_> {
12265 pub fn lookup_attr(
12266 &self,
12267 offset: usize,
12268 missing_type: Option<u16>,
12269 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12270 let mut stack = Vec::new();
12271 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12272 if missing_type.is_some() && cur == offset {
12273 stack.push(("DlTrapMetadata", offset));
12274 return (
12275 stack,
12276 missing_type.and_then(|t| DlTrapMetadata::attr_from_type(t)),
12277 );
12278 }
12279 if cur > offset || cur + self.buf.len() < offset {
12280 return (stack, None);
12281 }
12282 let mut attrs = self.clone();
12283 let mut last_off = cur + attrs.pos;
12284 while let Some(attr) = attrs.next() {
12285 let Ok(attr) = attr else { break };
12286 match attr {
12287 DlTrapMetadata::TrapMetadataTypeInPort(val) => {
12288 if last_off == offset {
12289 stack.push(("TrapMetadataTypeInPort", last_off));
12290 break;
12291 }
12292 }
12293 DlTrapMetadata::TrapMetadataTypeFaCookie(val) => {
12294 if last_off == offset {
12295 stack.push(("TrapMetadataTypeFaCookie", last_off));
12296 break;
12297 }
12298 }
12299 _ => {}
12300 };
12301 last_off = cur + attrs.pos;
12302 }
12303 if !stack.is_empty() {
12304 stack.push(("DlTrapMetadata", cur));
12305 }
12306 (stack, None)
12307 }
12308}
12309#[derive(Clone)]
12310pub enum DlLinecardSupportedTypes<'a> {
12311 LinecardType(&'a CStr),
12312}
12313impl<'a> IterableDlLinecardSupportedTypes<'a> {
12314 pub fn get_linecard_type(&self) -> Result<&'a CStr, ErrorContext> {
12315 let mut iter = self.clone();
12316 iter.pos = 0;
12317 for attr in iter {
12318 if let DlLinecardSupportedTypes::LinecardType(val) = attr? {
12319 return Ok(val);
12320 }
12321 }
12322 Err(ErrorContext::new_missing(
12323 "DlLinecardSupportedTypes",
12324 "LinecardType",
12325 self.orig_loc,
12326 self.buf.as_ptr() as usize,
12327 ))
12328 }
12329}
12330impl DlLinecardSupportedTypes<'_> {
12331 pub fn new<'a>(buf: &'a [u8]) -> IterableDlLinecardSupportedTypes<'a> {
12332 IterableDlLinecardSupportedTypes::with_loc(buf, buf.as_ptr() as usize)
12333 }
12334 fn attr_from_type(r#type: u16) -> Option<&'static str> {
12335 Devlink::attr_from_type(r#type)
12336 }
12337}
12338#[derive(Clone, Copy, Default)]
12339pub struct IterableDlLinecardSupportedTypes<'a> {
12340 buf: &'a [u8],
12341 pos: usize,
12342 orig_loc: usize,
12343}
12344impl<'a> IterableDlLinecardSupportedTypes<'a> {
12345 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12346 Self {
12347 buf,
12348 pos: 0,
12349 orig_loc,
12350 }
12351 }
12352 pub fn get_buf(&self) -> &'a [u8] {
12353 self.buf
12354 }
12355}
12356impl<'a> Iterator for IterableDlLinecardSupportedTypes<'a> {
12357 type Item = Result<DlLinecardSupportedTypes<'a>, ErrorContext>;
12358 fn next(&mut self) -> Option<Self::Item> {
12359 let pos = self.pos;
12360 let mut r#type;
12361 loop {
12362 r#type = None;
12363 if self.buf.len() == self.pos {
12364 return None;
12365 }
12366 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12367 break;
12368 };
12369 r#type = Some(header.r#type);
12370 let res = match header.r#type {
12371 173u16 => DlLinecardSupportedTypes::LinecardType({
12372 let res = CStr::from_bytes_with_nul(next).ok();
12373 let Some(val) = res else { break };
12374 val
12375 }),
12376 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12377 n => continue,
12378 };
12379 return Some(Ok(res));
12380 }
12381 Some(Err(ErrorContext::new(
12382 "DlLinecardSupportedTypes",
12383 r#type.and_then(|t| DlLinecardSupportedTypes::attr_from_type(t)),
12384 self.orig_loc,
12385 self.buf.as_ptr().wrapping_add(pos) as usize,
12386 )))
12387 }
12388}
12389impl<'a> std::fmt::Debug for IterableDlLinecardSupportedTypes<'_> {
12390 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12391 let mut fmt = f.debug_struct("DlLinecardSupportedTypes");
12392 for attr in self.clone() {
12393 let attr = match attr {
12394 Ok(a) => a,
12395 Err(err) => {
12396 fmt.finish()?;
12397 f.write_str("Err(")?;
12398 err.fmt(f)?;
12399 return f.write_str(")");
12400 }
12401 };
12402 match attr {
12403 DlLinecardSupportedTypes::LinecardType(val) => fmt.field("LinecardType", &val),
12404 };
12405 }
12406 fmt.finish()
12407 }
12408}
12409impl IterableDlLinecardSupportedTypes<'_> {
12410 pub fn lookup_attr(
12411 &self,
12412 offset: usize,
12413 missing_type: Option<u16>,
12414 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12415 let mut stack = Vec::new();
12416 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12417 if missing_type.is_some() && cur == offset {
12418 stack.push(("DlLinecardSupportedTypes", offset));
12419 return (
12420 stack,
12421 missing_type.and_then(|t| DlLinecardSupportedTypes::attr_from_type(t)),
12422 );
12423 }
12424 if cur > offset || cur + self.buf.len() < offset {
12425 return (stack, None);
12426 }
12427 let mut attrs = self.clone();
12428 let mut last_off = cur + attrs.pos;
12429 while let Some(attr) = attrs.next() {
12430 let Ok(attr) = attr else { break };
12431 match attr {
12432 DlLinecardSupportedTypes::LinecardType(val) => {
12433 if last_off == offset {
12434 stack.push(("LinecardType", last_off));
12435 break;
12436 }
12437 }
12438 _ => {}
12439 };
12440 last_off = cur + attrs.pos;
12441 }
12442 if !stack.is_empty() {
12443 stack.push(("DlLinecardSupportedTypes", cur));
12444 }
12445 (stack, None)
12446 }
12447}
12448#[derive(Clone)]
12449pub enum DlSelftestId {
12450 Flash(()),
12451}
12452impl<'a> IterableDlSelftestId<'a> {
12453 pub fn get_flash(&self) -> Result<(), ErrorContext> {
12454 let mut iter = self.clone();
12455 iter.pos = 0;
12456 for attr in iter {
12457 if let DlSelftestId::Flash(val) = attr? {
12458 return Ok(val);
12459 }
12460 }
12461 Err(ErrorContext::new_missing(
12462 "DlSelftestId",
12463 "Flash",
12464 self.orig_loc,
12465 self.buf.as_ptr() as usize,
12466 ))
12467 }
12468}
12469impl DlSelftestId {
12470 pub fn new<'a>(buf: &'a [u8]) -> IterableDlSelftestId<'a> {
12471 IterableDlSelftestId::with_loc(buf, buf.as_ptr() as usize)
12472 }
12473 fn attr_from_type(r#type: u16) -> Option<&'static str> {
12474 let res = match r#type {
12475 1u16 => "Flash",
12476 _ => return None,
12477 };
12478 Some(res)
12479 }
12480}
12481#[derive(Clone, Copy, Default)]
12482pub struct IterableDlSelftestId<'a> {
12483 buf: &'a [u8],
12484 pos: usize,
12485 orig_loc: usize,
12486}
12487impl<'a> IterableDlSelftestId<'a> {
12488 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12489 Self {
12490 buf,
12491 pos: 0,
12492 orig_loc,
12493 }
12494 }
12495 pub fn get_buf(&self) -> &'a [u8] {
12496 self.buf
12497 }
12498}
12499impl<'a> Iterator for IterableDlSelftestId<'a> {
12500 type Item = Result<DlSelftestId, ErrorContext>;
12501 fn next(&mut self) -> Option<Self::Item> {
12502 let pos = self.pos;
12503 let mut r#type;
12504 loop {
12505 r#type = None;
12506 if self.buf.len() == self.pos {
12507 return None;
12508 }
12509 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12510 break;
12511 };
12512 r#type = Some(header.r#type);
12513 let res = match header.r#type {
12514 1u16 => DlSelftestId::Flash(()),
12515 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12516 n => continue,
12517 };
12518 return Some(Ok(res));
12519 }
12520 Some(Err(ErrorContext::new(
12521 "DlSelftestId",
12522 r#type.and_then(|t| DlSelftestId::attr_from_type(t)),
12523 self.orig_loc,
12524 self.buf.as_ptr().wrapping_add(pos) as usize,
12525 )))
12526 }
12527}
12528impl std::fmt::Debug for IterableDlSelftestId<'_> {
12529 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12530 let mut fmt = f.debug_struct("DlSelftestId");
12531 for attr in self.clone() {
12532 let attr = match attr {
12533 Ok(a) => a,
12534 Err(err) => {
12535 fmt.finish()?;
12536 f.write_str("Err(")?;
12537 err.fmt(f)?;
12538 return f.write_str(")");
12539 }
12540 };
12541 match attr {
12542 DlSelftestId::Flash(val) => fmt.field("Flash", &val),
12543 };
12544 }
12545 fmt.finish()
12546 }
12547}
12548impl IterableDlSelftestId<'_> {
12549 pub fn lookup_attr(
12550 &self,
12551 offset: usize,
12552 missing_type: Option<u16>,
12553 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12554 let mut stack = Vec::new();
12555 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12556 if missing_type.is_some() && cur == offset {
12557 stack.push(("DlSelftestId", offset));
12558 return (
12559 stack,
12560 missing_type.and_then(|t| DlSelftestId::attr_from_type(t)),
12561 );
12562 }
12563 if cur > offset || cur + self.buf.len() < offset {
12564 return (stack, None);
12565 }
12566 let mut attrs = self.clone();
12567 let mut last_off = cur + attrs.pos;
12568 while let Some(attr) = attrs.next() {
12569 let Ok(attr) = attr else { break };
12570 match attr {
12571 DlSelftestId::Flash(val) => {
12572 if last_off == offset {
12573 stack.push(("Flash", last_off));
12574 break;
12575 }
12576 }
12577 _ => {}
12578 };
12579 last_off = cur + attrs.pos;
12580 }
12581 if !stack.is_empty() {
12582 stack.push(("DlSelftestId", cur));
12583 }
12584 (stack, None)
12585 }
12586}
12587#[derive(Clone)]
12588pub enum DlRateTcBws {
12589 Index(u8),
12590 #[doc = "Specifies the bandwidth share assigned to the Traffic Class\\.\nThe bandwidth for the traffic class is determined\nin proportion to the sum of the shares of all configured classes\\.\n"]
12591 Bw(u32),
12592}
12593impl<'a> IterableDlRateTcBws<'a> {
12594 pub fn get_index(&self) -> Result<u8, ErrorContext> {
12595 let mut iter = self.clone();
12596 iter.pos = 0;
12597 for attr in iter {
12598 if let DlRateTcBws::Index(val) = attr? {
12599 return Ok(val);
12600 }
12601 }
12602 Err(ErrorContext::new_missing(
12603 "DlRateTcBws",
12604 "Index",
12605 self.orig_loc,
12606 self.buf.as_ptr() as usize,
12607 ))
12608 }
12609 #[doc = "Specifies the bandwidth share assigned to the Traffic Class\\.\nThe bandwidth for the traffic class is determined\nin proportion to the sum of the shares of all configured classes\\.\n"]
12610 pub fn get_bw(&self) -> Result<u32, ErrorContext> {
12611 let mut iter = self.clone();
12612 iter.pos = 0;
12613 for attr in iter {
12614 if let DlRateTcBws::Bw(val) = attr? {
12615 return Ok(val);
12616 }
12617 }
12618 Err(ErrorContext::new_missing(
12619 "DlRateTcBws",
12620 "Bw",
12621 self.orig_loc,
12622 self.buf.as_ptr() as usize,
12623 ))
12624 }
12625}
12626impl DlRateTcBws {
12627 pub fn new<'a>(buf: &'a [u8]) -> IterableDlRateTcBws<'a> {
12628 IterableDlRateTcBws::with_loc(buf, buf.as_ptr() as usize)
12629 }
12630 fn attr_from_type(r#type: u16) -> Option<&'static str> {
12631 let res = match r#type {
12632 1u16 => "Index",
12633 2u16 => "Bw",
12634 _ => return None,
12635 };
12636 Some(res)
12637 }
12638}
12639#[derive(Clone, Copy, Default)]
12640pub struct IterableDlRateTcBws<'a> {
12641 buf: &'a [u8],
12642 pos: usize,
12643 orig_loc: usize,
12644}
12645impl<'a> IterableDlRateTcBws<'a> {
12646 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12647 Self {
12648 buf,
12649 pos: 0,
12650 orig_loc,
12651 }
12652 }
12653 pub fn get_buf(&self) -> &'a [u8] {
12654 self.buf
12655 }
12656}
12657impl<'a> Iterator for IterableDlRateTcBws<'a> {
12658 type Item = Result<DlRateTcBws, ErrorContext>;
12659 fn next(&mut self) -> Option<Self::Item> {
12660 let pos = self.pos;
12661 let mut r#type;
12662 loop {
12663 r#type = None;
12664 if self.buf.len() == self.pos {
12665 return None;
12666 }
12667 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12668 break;
12669 };
12670 r#type = Some(header.r#type);
12671 let res = match header.r#type {
12672 1u16 => DlRateTcBws::Index({
12673 let res = parse_u8(next);
12674 let Some(val) = res else { break };
12675 val
12676 }),
12677 2u16 => DlRateTcBws::Bw({
12678 let res = parse_u32(next);
12679 let Some(val) = res else { break };
12680 val
12681 }),
12682 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12683 n => continue,
12684 };
12685 return Some(Ok(res));
12686 }
12687 Some(Err(ErrorContext::new(
12688 "DlRateTcBws",
12689 r#type.and_then(|t| DlRateTcBws::attr_from_type(t)),
12690 self.orig_loc,
12691 self.buf.as_ptr().wrapping_add(pos) as usize,
12692 )))
12693 }
12694}
12695impl std::fmt::Debug for IterableDlRateTcBws<'_> {
12696 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12697 let mut fmt = f.debug_struct("DlRateTcBws");
12698 for attr in self.clone() {
12699 let attr = match attr {
12700 Ok(a) => a,
12701 Err(err) => {
12702 fmt.finish()?;
12703 f.write_str("Err(")?;
12704 err.fmt(f)?;
12705 return f.write_str(")");
12706 }
12707 };
12708 match attr {
12709 DlRateTcBws::Index(val) => fmt.field("Index", &val),
12710 DlRateTcBws::Bw(val) => fmt.field("Bw", &val),
12711 };
12712 }
12713 fmt.finish()
12714 }
12715}
12716impl IterableDlRateTcBws<'_> {
12717 pub fn lookup_attr(
12718 &self,
12719 offset: usize,
12720 missing_type: Option<u16>,
12721 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12722 let mut stack = Vec::new();
12723 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12724 if missing_type.is_some() && cur == offset {
12725 stack.push(("DlRateTcBws", offset));
12726 return (
12727 stack,
12728 missing_type.and_then(|t| DlRateTcBws::attr_from_type(t)),
12729 );
12730 }
12731 if cur > offset || cur + self.buf.len() < offset {
12732 return (stack, None);
12733 }
12734 let mut attrs = self.clone();
12735 let mut last_off = cur + attrs.pos;
12736 while let Some(attr) = attrs.next() {
12737 let Ok(attr) = attr else { break };
12738 match attr {
12739 DlRateTcBws::Index(val) => {
12740 if last_off == offset {
12741 stack.push(("Index", last_off));
12742 break;
12743 }
12744 }
12745 DlRateTcBws::Bw(val) => {
12746 if last_off == offset {
12747 stack.push(("Bw", last_off));
12748 break;
12749 }
12750 }
12751 _ => {}
12752 };
12753 last_off = cur + attrs.pos;
12754 }
12755 if !stack.is_empty() {
12756 stack.push(("DlRateTcBws", cur));
12757 }
12758 (stack, None)
12759 }
12760}
12761pub struct PushDevlink<Prev: Rec> {
12762 pub(crate) prev: Option<Prev>,
12763 pub(crate) header_offset: Option<usize>,
12764}
12765impl<Prev: Rec> Rec for PushDevlink<Prev> {
12766 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
12767 self.prev.as_mut().unwrap().as_rec_mut()
12768 }
12769 fn as_rec(&self) -> &Vec<u8> {
12770 self.prev.as_ref().unwrap().as_rec()
12771 }
12772}
12773impl<Prev: Rec> PushDevlink<Prev> {
12774 pub fn new(prev: Prev) -> Self {
12775 Self {
12776 prev: Some(prev),
12777 header_offset: None,
12778 }
12779 }
12780 pub fn end_nested(mut self) -> Prev {
12781 let mut prev = self.prev.take().unwrap();
12782 if let Some(header_offset) = &self.header_offset {
12783 finalize_nested_header(prev.as_rec_mut(), *header_offset);
12784 }
12785 prev
12786 }
12787 pub fn push_bus_name(mut self, value: &CStr) -> Self {
12788 push_header(
12789 self.as_rec_mut(),
12790 1u16,
12791 value.to_bytes_with_nul().len() as u16,
12792 );
12793 self.as_rec_mut().extend(value.to_bytes_with_nul());
12794 self
12795 }
12796 pub fn push_bus_name_bytes(mut self, value: &[u8]) -> Self {
12797 push_header(self.as_rec_mut(), 1u16, (value.len() + 1) as u16);
12798 self.as_rec_mut().extend(value);
12799 self.as_rec_mut().push(0);
12800 self
12801 }
12802 pub fn push_dev_name(mut self, value: &CStr) -> Self {
12803 push_header(
12804 self.as_rec_mut(),
12805 2u16,
12806 value.to_bytes_with_nul().len() as u16,
12807 );
12808 self.as_rec_mut().extend(value.to_bytes_with_nul());
12809 self
12810 }
12811 pub fn push_dev_name_bytes(mut self, value: &[u8]) -> Self {
12812 push_header(self.as_rec_mut(), 2u16, (value.len() + 1) as u16);
12813 self.as_rec_mut().extend(value);
12814 self.as_rec_mut().push(0);
12815 self
12816 }
12817 pub fn push_port_index(mut self, value: u32) -> Self {
12818 push_header(self.as_rec_mut(), 3u16, 4 as u16);
12819 self.as_rec_mut().extend(value.to_ne_bytes());
12820 self
12821 }
12822 #[doc = "Associated type: [`PortType`] (enum)"]
12823 pub fn push_port_type(mut self, value: u16) -> Self {
12824 push_header(self.as_rec_mut(), 4u16, 2 as u16);
12825 self.as_rec_mut().extend(value.to_ne_bytes());
12826 self
12827 }
12828 pub fn push_port_desired_type(mut self, value: u16) -> Self {
12829 push_header(self.as_rec_mut(), 5u16, 2 as u16);
12830 self.as_rec_mut().extend(value.to_ne_bytes());
12831 self
12832 }
12833 pub fn push_port_netdev_ifindex(mut self, value: u32) -> Self {
12834 push_header(self.as_rec_mut(), 6u16, 4 as u16);
12835 self.as_rec_mut().extend(value.to_ne_bytes());
12836 self
12837 }
12838 pub fn push_port_netdev_name(mut self, value: &CStr) -> Self {
12839 push_header(
12840 self.as_rec_mut(),
12841 7u16,
12842 value.to_bytes_with_nul().len() as u16,
12843 );
12844 self.as_rec_mut().extend(value.to_bytes_with_nul());
12845 self
12846 }
12847 pub fn push_port_netdev_name_bytes(mut self, value: &[u8]) -> Self {
12848 push_header(self.as_rec_mut(), 7u16, (value.len() + 1) as u16);
12849 self.as_rec_mut().extend(value);
12850 self.as_rec_mut().push(0);
12851 self
12852 }
12853 pub fn push_port_ibdev_name(mut self, value: &CStr) -> Self {
12854 push_header(
12855 self.as_rec_mut(),
12856 8u16,
12857 value.to_bytes_with_nul().len() as u16,
12858 );
12859 self.as_rec_mut().extend(value.to_bytes_with_nul());
12860 self
12861 }
12862 pub fn push_port_ibdev_name_bytes(mut self, value: &[u8]) -> Self {
12863 push_header(self.as_rec_mut(), 8u16, (value.len() + 1) as u16);
12864 self.as_rec_mut().extend(value);
12865 self.as_rec_mut().push(0);
12866 self
12867 }
12868 pub fn push_port_split_count(mut self, value: u32) -> Self {
12869 push_header(self.as_rec_mut(), 9u16, 4 as u16);
12870 self.as_rec_mut().extend(value.to_ne_bytes());
12871 self
12872 }
12873 pub fn push_port_split_group(mut self, value: u32) -> Self {
12874 push_header(self.as_rec_mut(), 10u16, 4 as u16);
12875 self.as_rec_mut().extend(value.to_ne_bytes());
12876 self
12877 }
12878 pub fn push_sb_index(mut self, value: u32) -> Self {
12879 push_header(self.as_rec_mut(), 11u16, 4 as u16);
12880 self.as_rec_mut().extend(value.to_ne_bytes());
12881 self
12882 }
12883 pub fn push_sb_size(mut self, value: u32) -> Self {
12884 push_header(self.as_rec_mut(), 12u16, 4 as u16);
12885 self.as_rec_mut().extend(value.to_ne_bytes());
12886 self
12887 }
12888 pub fn push_sb_ingress_pool_count(mut self, value: u16) -> Self {
12889 push_header(self.as_rec_mut(), 13u16, 2 as u16);
12890 self.as_rec_mut().extend(value.to_ne_bytes());
12891 self
12892 }
12893 pub fn push_sb_egress_pool_count(mut self, value: u16) -> Self {
12894 push_header(self.as_rec_mut(), 14u16, 2 as u16);
12895 self.as_rec_mut().extend(value.to_ne_bytes());
12896 self
12897 }
12898 pub fn push_sb_ingress_tc_count(mut self, value: u16) -> Self {
12899 push_header(self.as_rec_mut(), 15u16, 2 as u16);
12900 self.as_rec_mut().extend(value.to_ne_bytes());
12901 self
12902 }
12903 pub fn push_sb_egress_tc_count(mut self, value: u16) -> Self {
12904 push_header(self.as_rec_mut(), 16u16, 2 as u16);
12905 self.as_rec_mut().extend(value.to_ne_bytes());
12906 self
12907 }
12908 pub fn push_sb_pool_index(mut self, value: u16) -> Self {
12909 push_header(self.as_rec_mut(), 17u16, 2 as u16);
12910 self.as_rec_mut().extend(value.to_ne_bytes());
12911 self
12912 }
12913 #[doc = "Associated type: [`SbPoolType`] (enum)"]
12914 pub fn push_sb_pool_type(mut self, value: u8) -> Self {
12915 push_header(self.as_rec_mut(), 18u16, 1 as u16);
12916 self.as_rec_mut().extend(value.to_ne_bytes());
12917 self
12918 }
12919 pub fn push_sb_pool_size(mut self, value: u32) -> Self {
12920 push_header(self.as_rec_mut(), 19u16, 4 as u16);
12921 self.as_rec_mut().extend(value.to_ne_bytes());
12922 self
12923 }
12924 #[doc = "Associated type: [`SbThresholdType`] (enum)"]
12925 pub fn push_sb_pool_threshold_type(mut self, value: u8) -> Self {
12926 push_header(self.as_rec_mut(), 20u16, 1 as u16);
12927 self.as_rec_mut().extend(value.to_ne_bytes());
12928 self
12929 }
12930 pub fn push_sb_threshold(mut self, value: u32) -> Self {
12931 push_header(self.as_rec_mut(), 21u16, 4 as u16);
12932 self.as_rec_mut().extend(value.to_ne_bytes());
12933 self
12934 }
12935 pub fn push_sb_tc_index(mut self, value: u16) -> Self {
12936 push_header(self.as_rec_mut(), 22u16, 2 as u16);
12937 self.as_rec_mut().extend(value.to_ne_bytes());
12938 self
12939 }
12940 pub fn push_sb_occ_cur(mut self, value: u32) -> Self {
12941 push_header(self.as_rec_mut(), 23u16, 4 as u16);
12942 self.as_rec_mut().extend(value.to_ne_bytes());
12943 self
12944 }
12945 pub fn push_sb_occ_max(mut self, value: u32) -> Self {
12946 push_header(self.as_rec_mut(), 24u16, 4 as u16);
12947 self.as_rec_mut().extend(value.to_ne_bytes());
12948 self
12949 }
12950 #[doc = "Associated type: [`EswitchMode`] (enum)"]
12951 pub fn push_eswitch_mode(mut self, value: u16) -> Self {
12952 push_header(self.as_rec_mut(), 25u16, 2 as u16);
12953 self.as_rec_mut().extend(value.to_ne_bytes());
12954 self
12955 }
12956 #[doc = "Associated type: [`EswitchInlineMode`] (enum)"]
12957 pub fn push_eswitch_inline_mode(mut self, value: u8) -> Self {
12958 push_header(self.as_rec_mut(), 26u16, 1 as u16);
12959 self.as_rec_mut().extend(value.to_ne_bytes());
12960 self
12961 }
12962 pub fn nested_dpipe_tables(mut self) -> PushDlDpipeTables<Self> {
12963 let header_offset = push_nested_header(self.as_rec_mut(), 27u16);
12964 PushDlDpipeTables {
12965 prev: Some(self),
12966 header_offset: Some(header_offset),
12967 }
12968 }
12969 #[doc = "Attribute may repeat multiple times (treat it as array)"]
12970 pub fn nested_dpipe_table(mut self) -> PushDlDpipeTable<Self> {
12971 let header_offset = push_nested_header(self.as_rec_mut(), 28u16);
12972 PushDlDpipeTable {
12973 prev: Some(self),
12974 header_offset: Some(header_offset),
12975 }
12976 }
12977 pub fn push_dpipe_table_name(mut self, value: &CStr) -> Self {
12978 push_header(
12979 self.as_rec_mut(),
12980 29u16,
12981 value.to_bytes_with_nul().len() as u16,
12982 );
12983 self.as_rec_mut().extend(value.to_bytes_with_nul());
12984 self
12985 }
12986 pub fn push_dpipe_table_name_bytes(mut self, value: &[u8]) -> Self {
12987 push_header(self.as_rec_mut(), 29u16, (value.len() + 1) as u16);
12988 self.as_rec_mut().extend(value);
12989 self.as_rec_mut().push(0);
12990 self
12991 }
12992 pub fn push_dpipe_table_size(mut self, value: u64) -> Self {
12993 push_header(self.as_rec_mut(), 30u16, 8 as u16);
12994 self.as_rec_mut().extend(value.to_ne_bytes());
12995 self
12996 }
12997 pub fn nested_dpipe_table_matches(mut self) -> PushDlDpipeTableMatches<Self> {
12998 let header_offset = push_nested_header(self.as_rec_mut(), 31u16);
12999 PushDlDpipeTableMatches {
13000 prev: Some(self),
13001 header_offset: Some(header_offset),
13002 }
13003 }
13004 pub fn nested_dpipe_table_actions(mut self) -> PushDlDpipeTableActions<Self> {
13005 let header_offset = push_nested_header(self.as_rec_mut(), 32u16);
13006 PushDlDpipeTableActions {
13007 prev: Some(self),
13008 header_offset: Some(header_offset),
13009 }
13010 }
13011 pub fn push_dpipe_table_counters_enabled(mut self, value: u8) -> Self {
13012 push_header(self.as_rec_mut(), 33u16, 1 as u16);
13013 self.as_rec_mut().extend(value.to_ne_bytes());
13014 self
13015 }
13016 pub fn nested_dpipe_entries(mut self) -> PushDlDpipeEntries<Self> {
13017 let header_offset = push_nested_header(self.as_rec_mut(), 34u16);
13018 PushDlDpipeEntries {
13019 prev: Some(self),
13020 header_offset: Some(header_offset),
13021 }
13022 }
13023 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13024 pub fn nested_dpipe_entry(mut self) -> PushDlDpipeEntry<Self> {
13025 let header_offset = push_nested_header(self.as_rec_mut(), 35u16);
13026 PushDlDpipeEntry {
13027 prev: Some(self),
13028 header_offset: Some(header_offset),
13029 }
13030 }
13031 pub fn push_dpipe_entry_index(mut self, value: u64) -> Self {
13032 push_header(self.as_rec_mut(), 36u16, 8 as u16);
13033 self.as_rec_mut().extend(value.to_ne_bytes());
13034 self
13035 }
13036 pub fn nested_dpipe_entry_match_values(mut self) -> PushDlDpipeEntryMatchValues<Self> {
13037 let header_offset = push_nested_header(self.as_rec_mut(), 37u16);
13038 PushDlDpipeEntryMatchValues {
13039 prev: Some(self),
13040 header_offset: Some(header_offset),
13041 }
13042 }
13043 pub fn nested_dpipe_entry_action_values(mut self) -> PushDlDpipeEntryActionValues<Self> {
13044 let header_offset = push_nested_header(self.as_rec_mut(), 38u16);
13045 PushDlDpipeEntryActionValues {
13046 prev: Some(self),
13047 header_offset: Some(header_offset),
13048 }
13049 }
13050 pub fn push_dpipe_entry_counter(mut self, value: u64) -> Self {
13051 push_header(self.as_rec_mut(), 39u16, 8 as u16);
13052 self.as_rec_mut().extend(value.to_ne_bytes());
13053 self
13054 }
13055 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13056 pub fn nested_dpipe_match(mut self) -> PushDlDpipeMatch<Self> {
13057 let header_offset = push_nested_header(self.as_rec_mut(), 40u16);
13058 PushDlDpipeMatch {
13059 prev: Some(self),
13060 header_offset: Some(header_offset),
13061 }
13062 }
13063 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13064 pub fn nested_dpipe_match_value(mut self) -> PushDlDpipeMatchValue<Self> {
13065 let header_offset = push_nested_header(self.as_rec_mut(), 41u16);
13066 PushDlDpipeMatchValue {
13067 prev: Some(self),
13068 header_offset: Some(header_offset),
13069 }
13070 }
13071 #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
13072 pub fn push_dpipe_match_type(mut self, value: u32) -> Self {
13073 push_header(self.as_rec_mut(), 42u16, 4 as u16);
13074 self.as_rec_mut().extend(value.to_ne_bytes());
13075 self
13076 }
13077 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13078 pub fn nested_dpipe_action(mut self) -> PushDlDpipeAction<Self> {
13079 let header_offset = push_nested_header(self.as_rec_mut(), 43u16);
13080 PushDlDpipeAction {
13081 prev: Some(self),
13082 header_offset: Some(header_offset),
13083 }
13084 }
13085 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13086 pub fn nested_dpipe_action_value(mut self) -> PushDlDpipeActionValue<Self> {
13087 let header_offset = push_nested_header(self.as_rec_mut(), 44u16);
13088 PushDlDpipeActionValue {
13089 prev: Some(self),
13090 header_offset: Some(header_offset),
13091 }
13092 }
13093 #[doc = "Associated type: [`DpipeActionType`] (enum)"]
13094 pub fn push_dpipe_action_type(mut self, value: u32) -> Self {
13095 push_header(self.as_rec_mut(), 45u16, 4 as u16);
13096 self.as_rec_mut().extend(value.to_ne_bytes());
13097 self
13098 }
13099 pub fn push_dpipe_value(mut self, value: &[u8]) -> Self {
13100 push_header(self.as_rec_mut(), 46u16, value.len() as u16);
13101 self.as_rec_mut().extend(value);
13102 self
13103 }
13104 pub fn push_dpipe_value_mask(mut self, value: &[u8]) -> Self {
13105 push_header(self.as_rec_mut(), 47u16, value.len() as u16);
13106 self.as_rec_mut().extend(value);
13107 self
13108 }
13109 pub fn push_dpipe_value_mapping(mut self, value: u32) -> Self {
13110 push_header(self.as_rec_mut(), 48u16, 4 as u16);
13111 self.as_rec_mut().extend(value.to_ne_bytes());
13112 self
13113 }
13114 pub fn nested_dpipe_headers(mut self) -> PushDlDpipeHeaders<Self> {
13115 let header_offset = push_nested_header(self.as_rec_mut(), 49u16);
13116 PushDlDpipeHeaders {
13117 prev: Some(self),
13118 header_offset: Some(header_offset),
13119 }
13120 }
13121 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13122 pub fn nested_dpipe_header(mut self) -> PushDlDpipeHeader<Self> {
13123 let header_offset = push_nested_header(self.as_rec_mut(), 50u16);
13124 PushDlDpipeHeader {
13125 prev: Some(self),
13126 header_offset: Some(header_offset),
13127 }
13128 }
13129 pub fn push_dpipe_header_name(mut self, value: &CStr) -> Self {
13130 push_header(
13131 self.as_rec_mut(),
13132 51u16,
13133 value.to_bytes_with_nul().len() as u16,
13134 );
13135 self.as_rec_mut().extend(value.to_bytes_with_nul());
13136 self
13137 }
13138 pub fn push_dpipe_header_name_bytes(mut self, value: &[u8]) -> Self {
13139 push_header(self.as_rec_mut(), 51u16, (value.len() + 1) as u16);
13140 self.as_rec_mut().extend(value);
13141 self.as_rec_mut().push(0);
13142 self
13143 }
13144 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
13145 pub fn push_dpipe_header_id(mut self, value: u32) -> Self {
13146 push_header(self.as_rec_mut(), 52u16, 4 as u16);
13147 self.as_rec_mut().extend(value.to_ne_bytes());
13148 self
13149 }
13150 pub fn nested_dpipe_header_fields(mut self) -> PushDlDpipeHeaderFields<Self> {
13151 let header_offset = push_nested_header(self.as_rec_mut(), 53u16);
13152 PushDlDpipeHeaderFields {
13153 prev: Some(self),
13154 header_offset: Some(header_offset),
13155 }
13156 }
13157 pub fn push_dpipe_header_global(mut self, value: u8) -> Self {
13158 push_header(self.as_rec_mut(), 54u16, 1 as u16);
13159 self.as_rec_mut().extend(value.to_ne_bytes());
13160 self
13161 }
13162 pub fn push_dpipe_header_index(mut self, value: u32) -> Self {
13163 push_header(self.as_rec_mut(), 55u16, 4 as u16);
13164 self.as_rec_mut().extend(value.to_ne_bytes());
13165 self
13166 }
13167 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13168 pub fn nested_dpipe_field(mut self) -> PushDlDpipeField<Self> {
13169 let header_offset = push_nested_header(self.as_rec_mut(), 56u16);
13170 PushDlDpipeField {
13171 prev: Some(self),
13172 header_offset: Some(header_offset),
13173 }
13174 }
13175 pub fn push_dpipe_field_name(mut self, value: &CStr) -> Self {
13176 push_header(
13177 self.as_rec_mut(),
13178 57u16,
13179 value.to_bytes_with_nul().len() as u16,
13180 );
13181 self.as_rec_mut().extend(value.to_bytes_with_nul());
13182 self
13183 }
13184 pub fn push_dpipe_field_name_bytes(mut self, value: &[u8]) -> Self {
13185 push_header(self.as_rec_mut(), 57u16, (value.len() + 1) as u16);
13186 self.as_rec_mut().extend(value);
13187 self.as_rec_mut().push(0);
13188 self
13189 }
13190 pub fn push_dpipe_field_id(mut self, value: u32) -> Self {
13191 push_header(self.as_rec_mut(), 58u16, 4 as u16);
13192 self.as_rec_mut().extend(value.to_ne_bytes());
13193 self
13194 }
13195 pub fn push_dpipe_field_bitwidth(mut self, value: u32) -> Self {
13196 push_header(self.as_rec_mut(), 59u16, 4 as u16);
13197 self.as_rec_mut().extend(value.to_ne_bytes());
13198 self
13199 }
13200 #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
13201 pub fn push_dpipe_field_mapping_type(mut self, value: u32) -> Self {
13202 push_header(self.as_rec_mut(), 60u16, 4 as u16);
13203 self.as_rec_mut().extend(value.to_ne_bytes());
13204 self
13205 }
13206 pub fn push_pad(mut self, value: &[u8]) -> Self {
13207 push_header(self.as_rec_mut(), 61u16, value.len() as u16);
13208 self.as_rec_mut().extend(value);
13209 self
13210 }
13211 #[doc = "Associated type: [`EswitchEncapMode`] (enum)"]
13212 pub fn push_eswitch_encap_mode(mut self, value: u8) -> Self {
13213 push_header(self.as_rec_mut(), 62u16, 1 as u16);
13214 self.as_rec_mut().extend(value.to_ne_bytes());
13215 self
13216 }
13217 pub fn nested_resource_list(mut self) -> PushDlResourceList<Self> {
13218 let header_offset = push_nested_header(self.as_rec_mut(), 63u16);
13219 PushDlResourceList {
13220 prev: Some(self),
13221 header_offset: Some(header_offset),
13222 }
13223 }
13224 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13225 pub fn nested_resource(mut self) -> PushDlResource<Self> {
13226 let header_offset = push_nested_header(self.as_rec_mut(), 64u16);
13227 PushDlResource {
13228 prev: Some(self),
13229 header_offset: Some(header_offset),
13230 }
13231 }
13232 pub fn push_resource_name(mut self, value: &CStr) -> Self {
13233 push_header(
13234 self.as_rec_mut(),
13235 65u16,
13236 value.to_bytes_with_nul().len() as u16,
13237 );
13238 self.as_rec_mut().extend(value.to_bytes_with_nul());
13239 self
13240 }
13241 pub fn push_resource_name_bytes(mut self, value: &[u8]) -> Self {
13242 push_header(self.as_rec_mut(), 65u16, (value.len() + 1) as u16);
13243 self.as_rec_mut().extend(value);
13244 self.as_rec_mut().push(0);
13245 self
13246 }
13247 pub fn push_resource_id(mut self, value: u64) -> Self {
13248 push_header(self.as_rec_mut(), 66u16, 8 as u16);
13249 self.as_rec_mut().extend(value.to_ne_bytes());
13250 self
13251 }
13252 pub fn push_resource_size(mut self, value: u64) -> Self {
13253 push_header(self.as_rec_mut(), 67u16, 8 as u16);
13254 self.as_rec_mut().extend(value.to_ne_bytes());
13255 self
13256 }
13257 pub fn push_resource_size_new(mut self, value: u64) -> Self {
13258 push_header(self.as_rec_mut(), 68u16, 8 as u16);
13259 self.as_rec_mut().extend(value.to_ne_bytes());
13260 self
13261 }
13262 pub fn push_resource_size_valid(mut self, value: u8) -> Self {
13263 push_header(self.as_rec_mut(), 69u16, 1 as u16);
13264 self.as_rec_mut().extend(value.to_ne_bytes());
13265 self
13266 }
13267 pub fn push_resource_size_min(mut self, value: u64) -> Self {
13268 push_header(self.as_rec_mut(), 70u16, 8 as u16);
13269 self.as_rec_mut().extend(value.to_ne_bytes());
13270 self
13271 }
13272 pub fn push_resource_size_max(mut self, value: u64) -> Self {
13273 push_header(self.as_rec_mut(), 71u16, 8 as u16);
13274 self.as_rec_mut().extend(value.to_ne_bytes());
13275 self
13276 }
13277 pub fn push_resource_size_gran(mut self, value: u64) -> Self {
13278 push_header(self.as_rec_mut(), 72u16, 8 as u16);
13279 self.as_rec_mut().extend(value.to_ne_bytes());
13280 self
13281 }
13282 #[doc = "Associated type: [`ResourceUnit`] (enum)"]
13283 pub fn push_resource_unit(mut self, value: u8) -> Self {
13284 push_header(self.as_rec_mut(), 73u16, 1 as u16);
13285 self.as_rec_mut().extend(value.to_ne_bytes());
13286 self
13287 }
13288 pub fn push_resource_occ(mut self, value: u64) -> Self {
13289 push_header(self.as_rec_mut(), 74u16, 8 as u16);
13290 self.as_rec_mut().extend(value.to_ne_bytes());
13291 self
13292 }
13293 pub fn push_dpipe_table_resource_id(mut self, value: u64) -> Self {
13294 push_header(self.as_rec_mut(), 75u16, 8 as u16);
13295 self.as_rec_mut().extend(value.to_ne_bytes());
13296 self
13297 }
13298 pub fn push_dpipe_table_resource_units(mut self, value: u64) -> Self {
13299 push_header(self.as_rec_mut(), 76u16, 8 as u16);
13300 self.as_rec_mut().extend(value.to_ne_bytes());
13301 self
13302 }
13303 #[doc = "Associated type: [`PortFlavour`] (enum)"]
13304 pub fn push_port_flavour(mut self, value: u16) -> Self {
13305 push_header(self.as_rec_mut(), 77u16, 2 as u16);
13306 self.as_rec_mut().extend(value.to_ne_bytes());
13307 self
13308 }
13309 pub fn push_port_number(mut self, value: u32) -> Self {
13310 push_header(self.as_rec_mut(), 78u16, 4 as u16);
13311 self.as_rec_mut().extend(value.to_ne_bytes());
13312 self
13313 }
13314 pub fn push_port_split_subport_number(mut self, value: u32) -> Self {
13315 push_header(self.as_rec_mut(), 79u16, 4 as u16);
13316 self.as_rec_mut().extend(value.to_ne_bytes());
13317 self
13318 }
13319 pub fn nested_param(mut self) -> PushDlParam<Self> {
13320 let header_offset = push_nested_header(self.as_rec_mut(), 80u16);
13321 PushDlParam {
13322 prev: Some(self),
13323 header_offset: Some(header_offset),
13324 }
13325 }
13326 pub fn push_param_name(mut self, value: &CStr) -> Self {
13327 push_header(
13328 self.as_rec_mut(),
13329 81u16,
13330 value.to_bytes_with_nul().len() as u16,
13331 );
13332 self.as_rec_mut().extend(value.to_bytes_with_nul());
13333 self
13334 }
13335 pub fn push_param_name_bytes(mut self, value: &[u8]) -> Self {
13336 push_header(self.as_rec_mut(), 81u16, (value.len() + 1) as u16);
13337 self.as_rec_mut().extend(value);
13338 self.as_rec_mut().push(0);
13339 self
13340 }
13341 pub fn push_param_generic(mut self, value: ()) -> Self {
13342 push_header(self.as_rec_mut(), 82u16, 0 as u16);
13343 self
13344 }
13345 #[doc = "Associated type: [`VarAttrType`] (enum)"]
13346 pub fn push_param_type(mut self, value: u8) -> Self {
13347 push_header(self.as_rec_mut(), 83u16, 1 as u16);
13348 self.as_rec_mut().extend(value.to_ne_bytes());
13349 self
13350 }
13351 #[doc = "Associated type: [`ParamCmode`] (enum)"]
13352 pub fn push_param_value_cmode(mut self, value: u8) -> Self {
13353 push_header(self.as_rec_mut(), 87u16, 1 as u16);
13354 self.as_rec_mut().extend(value.to_ne_bytes());
13355 self
13356 }
13357 pub fn push_region_name(mut self, value: &CStr) -> Self {
13358 push_header(
13359 self.as_rec_mut(),
13360 88u16,
13361 value.to_bytes_with_nul().len() as u16,
13362 );
13363 self.as_rec_mut().extend(value.to_bytes_with_nul());
13364 self
13365 }
13366 pub fn push_region_name_bytes(mut self, value: &[u8]) -> Self {
13367 push_header(self.as_rec_mut(), 88u16, (value.len() + 1) as u16);
13368 self.as_rec_mut().extend(value);
13369 self.as_rec_mut().push(0);
13370 self
13371 }
13372 pub fn push_region_size(mut self, value: u64) -> Self {
13373 push_header(self.as_rec_mut(), 89u16, 8 as u16);
13374 self.as_rec_mut().extend(value.to_ne_bytes());
13375 self
13376 }
13377 pub fn nested_region_snapshots(mut self) -> PushDlRegionSnapshots<Self> {
13378 let header_offset = push_nested_header(self.as_rec_mut(), 90u16);
13379 PushDlRegionSnapshots {
13380 prev: Some(self),
13381 header_offset: Some(header_offset),
13382 }
13383 }
13384 pub fn nested_region_snapshot(mut self) -> PushDlRegionSnapshot<Self> {
13385 let header_offset = push_nested_header(self.as_rec_mut(), 91u16);
13386 PushDlRegionSnapshot {
13387 prev: Some(self),
13388 header_offset: Some(header_offset),
13389 }
13390 }
13391 pub fn push_region_snapshot_id(mut self, value: u32) -> Self {
13392 push_header(self.as_rec_mut(), 92u16, 4 as u16);
13393 self.as_rec_mut().extend(value.to_ne_bytes());
13394 self
13395 }
13396 pub fn nested_region_chunks(mut self) -> PushDlRegionChunks<Self> {
13397 let header_offset = push_nested_header(self.as_rec_mut(), 93u16);
13398 PushDlRegionChunks {
13399 prev: Some(self),
13400 header_offset: Some(header_offset),
13401 }
13402 }
13403 pub fn nested_region_chunk(mut self) -> PushDlRegionChunk<Self> {
13404 let header_offset = push_nested_header(self.as_rec_mut(), 94u16);
13405 PushDlRegionChunk {
13406 prev: Some(self),
13407 header_offset: Some(header_offset),
13408 }
13409 }
13410 pub fn push_region_chunk_data(mut self, value: &[u8]) -> Self {
13411 push_header(self.as_rec_mut(), 95u16, value.len() as u16);
13412 self.as_rec_mut().extend(value);
13413 self
13414 }
13415 pub fn push_region_chunk_addr(mut self, value: u64) -> Self {
13416 push_header(self.as_rec_mut(), 96u16, 8 as u16);
13417 self.as_rec_mut().extend(value.to_ne_bytes());
13418 self
13419 }
13420 pub fn push_region_chunk_len(mut self, value: u64) -> Self {
13421 push_header(self.as_rec_mut(), 97u16, 8 as u16);
13422 self.as_rec_mut().extend(value.to_ne_bytes());
13423 self
13424 }
13425 pub fn push_info_driver_name(mut self, value: &CStr) -> Self {
13426 push_header(
13427 self.as_rec_mut(),
13428 98u16,
13429 value.to_bytes_with_nul().len() as u16,
13430 );
13431 self.as_rec_mut().extend(value.to_bytes_with_nul());
13432 self
13433 }
13434 pub fn push_info_driver_name_bytes(mut self, value: &[u8]) -> Self {
13435 push_header(self.as_rec_mut(), 98u16, (value.len() + 1) as u16);
13436 self.as_rec_mut().extend(value);
13437 self.as_rec_mut().push(0);
13438 self
13439 }
13440 pub fn push_info_serial_number(mut self, value: &CStr) -> Self {
13441 push_header(
13442 self.as_rec_mut(),
13443 99u16,
13444 value.to_bytes_with_nul().len() as u16,
13445 );
13446 self.as_rec_mut().extend(value.to_bytes_with_nul());
13447 self
13448 }
13449 pub fn push_info_serial_number_bytes(mut self, value: &[u8]) -> Self {
13450 push_header(self.as_rec_mut(), 99u16, (value.len() + 1) as u16);
13451 self.as_rec_mut().extend(value);
13452 self.as_rec_mut().push(0);
13453 self
13454 }
13455 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13456 pub fn nested_info_version_fixed(mut self) -> PushDlInfoVersion<Self> {
13457 let header_offset = push_nested_header(self.as_rec_mut(), 100u16);
13458 PushDlInfoVersion {
13459 prev: Some(self),
13460 header_offset: Some(header_offset),
13461 }
13462 }
13463 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13464 pub fn nested_info_version_running(mut self) -> PushDlInfoVersion<Self> {
13465 let header_offset = push_nested_header(self.as_rec_mut(), 101u16);
13466 PushDlInfoVersion {
13467 prev: Some(self),
13468 header_offset: Some(header_offset),
13469 }
13470 }
13471 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13472 pub fn nested_info_version_stored(mut self) -> PushDlInfoVersion<Self> {
13473 let header_offset = push_nested_header(self.as_rec_mut(), 102u16);
13474 PushDlInfoVersion {
13475 prev: Some(self),
13476 header_offset: Some(header_offset),
13477 }
13478 }
13479 pub fn push_info_version_name(mut self, value: &CStr) -> Self {
13480 push_header(
13481 self.as_rec_mut(),
13482 103u16,
13483 value.to_bytes_with_nul().len() as u16,
13484 );
13485 self.as_rec_mut().extend(value.to_bytes_with_nul());
13486 self
13487 }
13488 pub fn push_info_version_name_bytes(mut self, value: &[u8]) -> Self {
13489 push_header(self.as_rec_mut(), 103u16, (value.len() + 1) as u16);
13490 self.as_rec_mut().extend(value);
13491 self.as_rec_mut().push(0);
13492 self
13493 }
13494 pub fn push_info_version_value(mut self, value: &CStr) -> Self {
13495 push_header(
13496 self.as_rec_mut(),
13497 104u16,
13498 value.to_bytes_with_nul().len() as u16,
13499 );
13500 self.as_rec_mut().extend(value.to_bytes_with_nul());
13501 self
13502 }
13503 pub fn push_info_version_value_bytes(mut self, value: &[u8]) -> Self {
13504 push_header(self.as_rec_mut(), 104u16, (value.len() + 1) as u16);
13505 self.as_rec_mut().extend(value);
13506 self.as_rec_mut().push(0);
13507 self
13508 }
13509 pub fn push_sb_pool_cell_size(mut self, value: u32) -> Self {
13510 push_header(self.as_rec_mut(), 105u16, 4 as u16);
13511 self.as_rec_mut().extend(value.to_ne_bytes());
13512 self
13513 }
13514 pub fn nested_fmsg(mut self) -> PushDlFmsg<Self> {
13515 let header_offset = push_nested_header(self.as_rec_mut(), 106u16);
13516 PushDlFmsg {
13517 prev: Some(self),
13518 header_offset: Some(header_offset),
13519 }
13520 }
13521 pub fn push_fmsg_obj_nest_start(mut self, value: ()) -> Self {
13522 push_header(self.as_rec_mut(), 107u16, 0 as u16);
13523 self
13524 }
13525 pub fn push_fmsg_pair_nest_start(mut self, value: ()) -> Self {
13526 push_header(self.as_rec_mut(), 108u16, 0 as u16);
13527 self
13528 }
13529 pub fn push_fmsg_arr_nest_start(mut self, value: ()) -> Self {
13530 push_header(self.as_rec_mut(), 109u16, 0 as u16);
13531 self
13532 }
13533 pub fn push_fmsg_nest_end(mut self, value: ()) -> Self {
13534 push_header(self.as_rec_mut(), 110u16, 0 as u16);
13535 self
13536 }
13537 pub fn push_fmsg_obj_name(mut self, value: &CStr) -> Self {
13538 push_header(
13539 self.as_rec_mut(),
13540 111u16,
13541 value.to_bytes_with_nul().len() as u16,
13542 );
13543 self.as_rec_mut().extend(value.to_bytes_with_nul());
13544 self
13545 }
13546 pub fn push_fmsg_obj_name_bytes(mut self, value: &[u8]) -> Self {
13547 push_header(self.as_rec_mut(), 111u16, (value.len() + 1) as u16);
13548 self.as_rec_mut().extend(value);
13549 self.as_rec_mut().push(0);
13550 self
13551 }
13552 #[doc = "Associated type: [`VarAttrType`] (enum)"]
13553 pub fn push_fmsg_obj_value_type(mut self, value: u8) -> Self {
13554 push_header(self.as_rec_mut(), 112u16, 1 as u16);
13555 self.as_rec_mut().extend(value.to_ne_bytes());
13556 self
13557 }
13558 pub fn nested_health_reporter(mut self) -> PushDlHealthReporter<Self> {
13559 let header_offset = push_nested_header(self.as_rec_mut(), 114u16);
13560 PushDlHealthReporter {
13561 prev: Some(self),
13562 header_offset: Some(header_offset),
13563 }
13564 }
13565 pub fn push_health_reporter_name(mut self, value: &CStr) -> Self {
13566 push_header(
13567 self.as_rec_mut(),
13568 115u16,
13569 value.to_bytes_with_nul().len() as u16,
13570 );
13571 self.as_rec_mut().extend(value.to_bytes_with_nul());
13572 self
13573 }
13574 pub fn push_health_reporter_name_bytes(mut self, value: &[u8]) -> Self {
13575 push_header(self.as_rec_mut(), 115u16, (value.len() + 1) as u16);
13576 self.as_rec_mut().extend(value);
13577 self.as_rec_mut().push(0);
13578 self
13579 }
13580 pub fn push_health_reporter_state(mut self, value: u8) -> Self {
13581 push_header(self.as_rec_mut(), 116u16, 1 as u16);
13582 self.as_rec_mut().extend(value.to_ne_bytes());
13583 self
13584 }
13585 pub fn push_health_reporter_err_count(mut self, value: u64) -> Self {
13586 push_header(self.as_rec_mut(), 117u16, 8 as u16);
13587 self.as_rec_mut().extend(value.to_ne_bytes());
13588 self
13589 }
13590 pub fn push_health_reporter_recover_count(mut self, value: u64) -> Self {
13591 push_header(self.as_rec_mut(), 118u16, 8 as u16);
13592 self.as_rec_mut().extend(value.to_ne_bytes());
13593 self
13594 }
13595 pub fn push_health_reporter_dump_ts(mut self, value: u64) -> Self {
13596 push_header(self.as_rec_mut(), 119u16, 8 as u16);
13597 self.as_rec_mut().extend(value.to_ne_bytes());
13598 self
13599 }
13600 pub fn push_health_reporter_graceful_period(mut self, value: u64) -> Self {
13601 push_header(self.as_rec_mut(), 120u16, 8 as u16);
13602 self.as_rec_mut().extend(value.to_ne_bytes());
13603 self
13604 }
13605 pub fn push_health_reporter_auto_recover(mut self, value: u8) -> Self {
13606 push_header(self.as_rec_mut(), 121u16, 1 as u16);
13607 self.as_rec_mut().extend(value.to_ne_bytes());
13608 self
13609 }
13610 pub fn push_flash_update_file_name(mut self, value: &CStr) -> Self {
13611 push_header(
13612 self.as_rec_mut(),
13613 122u16,
13614 value.to_bytes_with_nul().len() as u16,
13615 );
13616 self.as_rec_mut().extend(value.to_bytes_with_nul());
13617 self
13618 }
13619 pub fn push_flash_update_file_name_bytes(mut self, value: &[u8]) -> Self {
13620 push_header(self.as_rec_mut(), 122u16, (value.len() + 1) as u16);
13621 self.as_rec_mut().extend(value);
13622 self.as_rec_mut().push(0);
13623 self
13624 }
13625 pub fn push_flash_update_component(mut self, value: &CStr) -> Self {
13626 push_header(
13627 self.as_rec_mut(),
13628 123u16,
13629 value.to_bytes_with_nul().len() as u16,
13630 );
13631 self.as_rec_mut().extend(value.to_bytes_with_nul());
13632 self
13633 }
13634 pub fn push_flash_update_component_bytes(mut self, value: &[u8]) -> Self {
13635 push_header(self.as_rec_mut(), 123u16, (value.len() + 1) as u16);
13636 self.as_rec_mut().extend(value);
13637 self.as_rec_mut().push(0);
13638 self
13639 }
13640 pub fn push_flash_update_status_msg(mut self, value: &CStr) -> Self {
13641 push_header(
13642 self.as_rec_mut(),
13643 124u16,
13644 value.to_bytes_with_nul().len() as u16,
13645 );
13646 self.as_rec_mut().extend(value.to_bytes_with_nul());
13647 self
13648 }
13649 pub fn push_flash_update_status_msg_bytes(mut self, value: &[u8]) -> Self {
13650 push_header(self.as_rec_mut(), 124u16, (value.len() + 1) as u16);
13651 self.as_rec_mut().extend(value);
13652 self.as_rec_mut().push(0);
13653 self
13654 }
13655 pub fn push_flash_update_status_done(mut self, value: u64) -> Self {
13656 push_header(self.as_rec_mut(), 125u16, 8 as u16);
13657 self.as_rec_mut().extend(value.to_ne_bytes());
13658 self
13659 }
13660 pub fn push_flash_update_status_total(mut self, value: u64) -> Self {
13661 push_header(self.as_rec_mut(), 126u16, 8 as u16);
13662 self.as_rec_mut().extend(value.to_ne_bytes());
13663 self
13664 }
13665 pub fn push_port_pci_pf_number(mut self, value: u16) -> Self {
13666 push_header(self.as_rec_mut(), 127u16, 2 as u16);
13667 self.as_rec_mut().extend(value.to_ne_bytes());
13668 self
13669 }
13670 pub fn push_port_pci_vf_number(mut self, value: u16) -> Self {
13671 push_header(self.as_rec_mut(), 128u16, 2 as u16);
13672 self.as_rec_mut().extend(value.to_ne_bytes());
13673 self
13674 }
13675 pub fn nested_stats(mut self) -> PushDlAttrStats<Self> {
13676 let header_offset = push_nested_header(self.as_rec_mut(), 129u16);
13677 PushDlAttrStats {
13678 prev: Some(self),
13679 header_offset: Some(header_offset),
13680 }
13681 }
13682 pub fn push_trap_name(mut self, value: &CStr) -> Self {
13683 push_header(
13684 self.as_rec_mut(),
13685 130u16,
13686 value.to_bytes_with_nul().len() as u16,
13687 );
13688 self.as_rec_mut().extend(value.to_bytes_with_nul());
13689 self
13690 }
13691 pub fn push_trap_name_bytes(mut self, value: &[u8]) -> Self {
13692 push_header(self.as_rec_mut(), 130u16, (value.len() + 1) as u16);
13693 self.as_rec_mut().extend(value);
13694 self.as_rec_mut().push(0);
13695 self
13696 }
13697 #[doc = "Associated type: [`TrapAction`] (enum)"]
13698 pub fn push_trap_action(mut self, value: u8) -> Self {
13699 push_header(self.as_rec_mut(), 131u16, 1 as u16);
13700 self.as_rec_mut().extend(value.to_ne_bytes());
13701 self
13702 }
13703 #[doc = "Associated type: [`TrapType`] (enum)"]
13704 pub fn push_trap_type(mut self, value: u8) -> Self {
13705 push_header(self.as_rec_mut(), 132u16, 1 as u16);
13706 self.as_rec_mut().extend(value.to_ne_bytes());
13707 self
13708 }
13709 pub fn push_trap_generic(mut self, value: ()) -> Self {
13710 push_header(self.as_rec_mut(), 133u16, 0 as u16);
13711 self
13712 }
13713 pub fn nested_trap_metadata(mut self) -> PushDlTrapMetadata<Self> {
13714 let header_offset = push_nested_header(self.as_rec_mut(), 134u16);
13715 PushDlTrapMetadata {
13716 prev: Some(self),
13717 header_offset: Some(header_offset),
13718 }
13719 }
13720 pub fn push_trap_group_name(mut self, value: &CStr) -> Self {
13721 push_header(
13722 self.as_rec_mut(),
13723 135u16,
13724 value.to_bytes_with_nul().len() as u16,
13725 );
13726 self.as_rec_mut().extend(value.to_bytes_with_nul());
13727 self
13728 }
13729 pub fn push_trap_group_name_bytes(mut self, value: &[u8]) -> Self {
13730 push_header(self.as_rec_mut(), 135u16, (value.len() + 1) as u16);
13731 self.as_rec_mut().extend(value);
13732 self.as_rec_mut().push(0);
13733 self
13734 }
13735 pub fn push_reload_failed(mut self, value: u8) -> Self {
13736 push_header(self.as_rec_mut(), 136u16, 1 as u16);
13737 self.as_rec_mut().extend(value.to_ne_bytes());
13738 self
13739 }
13740 pub fn push_health_reporter_dump_ts_ns(mut self, value: u64) -> Self {
13741 push_header(self.as_rec_mut(), 137u16, 8 as u16);
13742 self.as_rec_mut().extend(value.to_ne_bytes());
13743 self
13744 }
13745 pub fn push_netns_fd(mut self, value: u32) -> Self {
13746 push_header(self.as_rec_mut(), 138u16, 4 as u16);
13747 self.as_rec_mut().extend(value.to_ne_bytes());
13748 self
13749 }
13750 pub fn push_netns_pid(mut self, value: u32) -> Self {
13751 push_header(self.as_rec_mut(), 139u16, 4 as u16);
13752 self.as_rec_mut().extend(value.to_ne_bytes());
13753 self
13754 }
13755 pub fn push_netns_id(mut self, value: u32) -> Self {
13756 push_header(self.as_rec_mut(), 140u16, 4 as u16);
13757 self.as_rec_mut().extend(value.to_ne_bytes());
13758 self
13759 }
13760 pub fn push_health_reporter_auto_dump(mut self, value: u8) -> Self {
13761 push_header(self.as_rec_mut(), 141u16, 1 as u16);
13762 self.as_rec_mut().extend(value.to_ne_bytes());
13763 self
13764 }
13765 pub fn push_trap_policer_id(mut self, value: u32) -> Self {
13766 push_header(self.as_rec_mut(), 142u16, 4 as u16);
13767 self.as_rec_mut().extend(value.to_ne_bytes());
13768 self
13769 }
13770 pub fn push_trap_policer_rate(mut self, value: u64) -> Self {
13771 push_header(self.as_rec_mut(), 143u16, 8 as u16);
13772 self.as_rec_mut().extend(value.to_ne_bytes());
13773 self
13774 }
13775 pub fn push_trap_policer_burst(mut self, value: u64) -> Self {
13776 push_header(self.as_rec_mut(), 144u16, 8 as u16);
13777 self.as_rec_mut().extend(value.to_ne_bytes());
13778 self
13779 }
13780 pub fn nested_port_function(mut self) -> PushDlPortFunction<Self> {
13781 let header_offset = push_nested_header(self.as_rec_mut(), 145u16);
13782 PushDlPortFunction {
13783 prev: Some(self),
13784 header_offset: Some(header_offset),
13785 }
13786 }
13787 pub fn push_info_board_serial_number(mut self, value: &CStr) -> Self {
13788 push_header(
13789 self.as_rec_mut(),
13790 146u16,
13791 value.to_bytes_with_nul().len() as u16,
13792 );
13793 self.as_rec_mut().extend(value.to_bytes_with_nul());
13794 self
13795 }
13796 pub fn push_info_board_serial_number_bytes(mut self, value: &[u8]) -> Self {
13797 push_header(self.as_rec_mut(), 146u16, (value.len() + 1) as u16);
13798 self.as_rec_mut().extend(value);
13799 self.as_rec_mut().push(0);
13800 self
13801 }
13802 pub fn push_port_lanes(mut self, value: u32) -> Self {
13803 push_header(self.as_rec_mut(), 147u16, 4 as u16);
13804 self.as_rec_mut().extend(value.to_ne_bytes());
13805 self
13806 }
13807 pub fn push_port_splittable(mut self, value: u8) -> Self {
13808 push_header(self.as_rec_mut(), 148u16, 1 as u16);
13809 self.as_rec_mut().extend(value.to_ne_bytes());
13810 self
13811 }
13812 pub fn push_port_external(mut self, value: u8) -> Self {
13813 push_header(self.as_rec_mut(), 149u16, 1 as u16);
13814 self.as_rec_mut().extend(value.to_ne_bytes());
13815 self
13816 }
13817 pub fn push_port_controller_number(mut self, value: u32) -> Self {
13818 push_header(self.as_rec_mut(), 150u16, 4 as u16);
13819 self.as_rec_mut().extend(value.to_ne_bytes());
13820 self
13821 }
13822 pub fn push_flash_update_status_timeout(mut self, value: u64) -> Self {
13823 push_header(self.as_rec_mut(), 151u16, 8 as u16);
13824 self.as_rec_mut().extend(value.to_ne_bytes());
13825 self
13826 }
13827 #[doc = "Associated type: [`FlashOverwrite`] (1 bit per enumeration)"]
13828 pub fn push_flash_update_overwrite_mask(mut self, value: BuiltinBitfield32) -> Self {
13829 push_header(self.as_rec_mut(), 152u16, value.as_slice().len() as u16);
13830 self.as_rec_mut().extend(value.as_slice());
13831 self
13832 }
13833 #[doc = "Associated type: [`ReloadAction`] (enum)"]
13834 pub fn push_reload_action(mut self, value: u8) -> Self {
13835 push_header(self.as_rec_mut(), 153u16, 1 as u16);
13836 self.as_rec_mut().extend(value.to_ne_bytes());
13837 self
13838 }
13839 #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
13840 pub fn push_reload_actions_performed(mut self, value: BuiltinBitfield32) -> Self {
13841 push_header(self.as_rec_mut(), 154u16, value.as_slice().len() as u16);
13842 self.as_rec_mut().extend(value.as_slice());
13843 self
13844 }
13845 #[doc = "Associated type: [`ReloadAction`] (1 bit per enumeration)"]
13846 pub fn push_reload_limits(mut self, value: BuiltinBitfield32) -> Self {
13847 push_header(self.as_rec_mut(), 155u16, value.as_slice().len() as u16);
13848 self.as_rec_mut().extend(value.as_slice());
13849 self
13850 }
13851 pub fn nested_dev_stats(mut self) -> PushDlDevStats<Self> {
13852 let header_offset = push_nested_header(self.as_rec_mut(), 156u16);
13853 PushDlDevStats {
13854 prev: Some(self),
13855 header_offset: Some(header_offset),
13856 }
13857 }
13858 pub fn nested_reload_stats(mut self) -> PushDlReloadStats<Self> {
13859 let header_offset = push_nested_header(self.as_rec_mut(), 157u16);
13860 PushDlReloadStats {
13861 prev: Some(self),
13862 header_offset: Some(header_offset),
13863 }
13864 }
13865 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13866 pub fn nested_reload_stats_entry(mut self) -> PushDlReloadStatsEntry<Self> {
13867 let header_offset = push_nested_header(self.as_rec_mut(), 158u16);
13868 PushDlReloadStatsEntry {
13869 prev: Some(self),
13870 header_offset: Some(header_offset),
13871 }
13872 }
13873 pub fn push_reload_stats_limit(mut self, value: u8) -> Self {
13874 push_header(self.as_rec_mut(), 159u16, 1 as u16);
13875 self.as_rec_mut().extend(value.to_ne_bytes());
13876 self
13877 }
13878 pub fn push_reload_stats_value(mut self, value: u32) -> Self {
13879 push_header(self.as_rec_mut(), 160u16, 4 as u16);
13880 self.as_rec_mut().extend(value.to_ne_bytes());
13881 self
13882 }
13883 pub fn nested_remote_reload_stats(mut self) -> PushDlReloadStats<Self> {
13884 let header_offset = push_nested_header(self.as_rec_mut(), 161u16);
13885 PushDlReloadStats {
13886 prev: Some(self),
13887 header_offset: Some(header_offset),
13888 }
13889 }
13890 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13891 pub fn nested_reload_action_info(mut self) -> PushDlReloadActInfo<Self> {
13892 let header_offset = push_nested_header(self.as_rec_mut(), 162u16);
13893 PushDlReloadActInfo {
13894 prev: Some(self),
13895 header_offset: Some(header_offset),
13896 }
13897 }
13898 #[doc = "Attribute may repeat multiple times (treat it as array)"]
13899 pub fn nested_reload_action_stats(mut self) -> PushDlReloadActStats<Self> {
13900 let header_offset = push_nested_header(self.as_rec_mut(), 163u16);
13901 PushDlReloadActStats {
13902 prev: Some(self),
13903 header_offset: Some(header_offset),
13904 }
13905 }
13906 pub fn push_port_pci_sf_number(mut self, value: u32) -> Self {
13907 push_header(self.as_rec_mut(), 164u16, 4 as u16);
13908 self.as_rec_mut().extend(value.to_ne_bytes());
13909 self
13910 }
13911 #[doc = "Associated type: [`RateType`] (enum)"]
13912 pub fn push_rate_type(mut self, value: u16) -> Self {
13913 push_header(self.as_rec_mut(), 165u16, 2 as u16);
13914 self.as_rec_mut().extend(value.to_ne_bytes());
13915 self
13916 }
13917 pub fn push_rate_tx_share(mut self, value: u64) -> Self {
13918 push_header(self.as_rec_mut(), 166u16, 8 as u16);
13919 self.as_rec_mut().extend(value.to_ne_bytes());
13920 self
13921 }
13922 pub fn push_rate_tx_max(mut self, value: u64) -> Self {
13923 push_header(self.as_rec_mut(), 167u16, 8 as u16);
13924 self.as_rec_mut().extend(value.to_ne_bytes());
13925 self
13926 }
13927 pub fn push_rate_node_name(mut self, value: &CStr) -> Self {
13928 push_header(
13929 self.as_rec_mut(),
13930 168u16,
13931 value.to_bytes_with_nul().len() as u16,
13932 );
13933 self.as_rec_mut().extend(value.to_bytes_with_nul());
13934 self
13935 }
13936 pub fn push_rate_node_name_bytes(mut self, value: &[u8]) -> Self {
13937 push_header(self.as_rec_mut(), 168u16, (value.len() + 1) as u16);
13938 self.as_rec_mut().extend(value);
13939 self.as_rec_mut().push(0);
13940 self
13941 }
13942 pub fn push_rate_parent_node_name(mut self, value: &CStr) -> Self {
13943 push_header(
13944 self.as_rec_mut(),
13945 169u16,
13946 value.to_bytes_with_nul().len() as u16,
13947 );
13948 self.as_rec_mut().extend(value.to_bytes_with_nul());
13949 self
13950 }
13951 pub fn push_rate_parent_node_name_bytes(mut self, value: &[u8]) -> Self {
13952 push_header(self.as_rec_mut(), 169u16, (value.len() + 1) as u16);
13953 self.as_rec_mut().extend(value);
13954 self.as_rec_mut().push(0);
13955 self
13956 }
13957 pub fn push_region_max_snapshots(mut self, value: u32) -> Self {
13958 push_header(self.as_rec_mut(), 170u16, 4 as u16);
13959 self.as_rec_mut().extend(value.to_ne_bytes());
13960 self
13961 }
13962 pub fn push_linecard_index(mut self, value: u32) -> Self {
13963 push_header(self.as_rec_mut(), 171u16, 4 as u16);
13964 self.as_rec_mut().extend(value.to_ne_bytes());
13965 self
13966 }
13967 pub fn push_linecard_state(mut self, value: u8) -> Self {
13968 push_header(self.as_rec_mut(), 172u16, 1 as u16);
13969 self.as_rec_mut().extend(value.to_ne_bytes());
13970 self
13971 }
13972 pub fn push_linecard_type(mut self, value: &CStr) -> Self {
13973 push_header(
13974 self.as_rec_mut(),
13975 173u16,
13976 value.to_bytes_with_nul().len() as u16,
13977 );
13978 self.as_rec_mut().extend(value.to_bytes_with_nul());
13979 self
13980 }
13981 pub fn push_linecard_type_bytes(mut self, value: &[u8]) -> Self {
13982 push_header(self.as_rec_mut(), 173u16, (value.len() + 1) as u16);
13983 self.as_rec_mut().extend(value);
13984 self.as_rec_mut().push(0);
13985 self
13986 }
13987 pub fn nested_linecard_supported_types(mut self) -> PushDlLinecardSupportedTypes<Self> {
13988 let header_offset = push_nested_header(self.as_rec_mut(), 174u16);
13989 PushDlLinecardSupportedTypes {
13990 prev: Some(self),
13991 header_offset: Some(header_offset),
13992 }
13993 }
13994 pub fn nested_selftests(mut self) -> PushDlSelftestId<Self> {
13995 let header_offset = push_nested_header(self.as_rec_mut(), 176u16);
13996 PushDlSelftestId {
13997 prev: Some(self),
13998 header_offset: Some(header_offset),
13999 }
14000 }
14001 pub fn push_rate_tx_priority(mut self, value: u32) -> Self {
14002 push_header(self.as_rec_mut(), 177u16, 4 as u16);
14003 self.as_rec_mut().extend(value.to_ne_bytes());
14004 self
14005 }
14006 pub fn push_rate_tx_weight(mut self, value: u32) -> Self {
14007 push_header(self.as_rec_mut(), 178u16, 4 as u16);
14008 self.as_rec_mut().extend(value.to_ne_bytes());
14009 self
14010 }
14011 pub fn push_region_direct(mut self, value: ()) -> Self {
14012 push_header(self.as_rec_mut(), 179u16, 0 as u16);
14013 self
14014 }
14015 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14016 pub fn nested_rate_tc_bws(mut self) -> PushDlRateTcBws<Self> {
14017 let header_offset = push_nested_header(self.as_rec_mut(), 180u16);
14018 PushDlRateTcBws {
14019 prev: Some(self),
14020 header_offset: Some(header_offset),
14021 }
14022 }
14023 #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
14024 pub fn push_health_reporter_burst_period(mut self, value: u64) -> Self {
14025 push_header(self.as_rec_mut(), 181u16, 8 as u16);
14026 self.as_rec_mut().extend(value.to_ne_bytes());
14027 self
14028 }
14029 #[doc = "Request restoring parameter to its default value\\."]
14030 pub fn push_param_reset_default(mut self, value: ()) -> Self {
14031 push_header(self.as_rec_mut(), 183u16, 0 as u16);
14032 self
14033 }
14034}
14035impl<Prev: Rec> Drop for PushDevlink<Prev> {
14036 fn drop(&mut self) {
14037 if let Some(prev) = &mut self.prev {
14038 if let Some(header_offset) = &self.header_offset {
14039 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14040 }
14041 }
14042 }
14043}
14044pub struct PushDlDevStats<Prev: Rec> {
14045 pub(crate) prev: Option<Prev>,
14046 pub(crate) header_offset: Option<usize>,
14047}
14048impl<Prev: Rec> Rec for PushDlDevStats<Prev> {
14049 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14050 self.prev.as_mut().unwrap().as_rec_mut()
14051 }
14052 fn as_rec(&self) -> &Vec<u8> {
14053 self.prev.as_ref().unwrap().as_rec()
14054 }
14055}
14056impl<Prev: Rec> PushDlDevStats<Prev> {
14057 pub fn new(prev: Prev) -> Self {
14058 Self {
14059 prev: Some(prev),
14060 header_offset: None,
14061 }
14062 }
14063 pub fn end_nested(mut self) -> Prev {
14064 let mut prev = self.prev.take().unwrap();
14065 if let Some(header_offset) = &self.header_offset {
14066 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14067 }
14068 prev
14069 }
14070 pub fn nested_reload_stats(mut self) -> PushDlReloadStats<Self> {
14071 let header_offset = push_nested_header(self.as_rec_mut(), 157u16);
14072 PushDlReloadStats {
14073 prev: Some(self),
14074 header_offset: Some(header_offset),
14075 }
14076 }
14077 pub fn nested_remote_reload_stats(mut self) -> PushDlReloadStats<Self> {
14078 let header_offset = push_nested_header(self.as_rec_mut(), 161u16);
14079 PushDlReloadStats {
14080 prev: Some(self),
14081 header_offset: Some(header_offset),
14082 }
14083 }
14084}
14085impl<Prev: Rec> Drop for PushDlDevStats<Prev> {
14086 fn drop(&mut self) {
14087 if let Some(prev) = &mut self.prev {
14088 if let Some(header_offset) = &self.header_offset {
14089 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14090 }
14091 }
14092 }
14093}
14094pub struct PushDlReloadStats<Prev: Rec> {
14095 pub(crate) prev: Option<Prev>,
14096 pub(crate) header_offset: Option<usize>,
14097}
14098impl<Prev: Rec> Rec for PushDlReloadStats<Prev> {
14099 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14100 self.prev.as_mut().unwrap().as_rec_mut()
14101 }
14102 fn as_rec(&self) -> &Vec<u8> {
14103 self.prev.as_ref().unwrap().as_rec()
14104 }
14105}
14106impl<Prev: Rec> PushDlReloadStats<Prev> {
14107 pub fn new(prev: Prev) -> Self {
14108 Self {
14109 prev: Some(prev),
14110 header_offset: None,
14111 }
14112 }
14113 pub fn end_nested(mut self) -> Prev {
14114 let mut prev = self.prev.take().unwrap();
14115 if let Some(header_offset) = &self.header_offset {
14116 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14117 }
14118 prev
14119 }
14120 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14121 pub fn nested_reload_action_info(mut self) -> PushDlReloadActInfo<Self> {
14122 let header_offset = push_nested_header(self.as_rec_mut(), 162u16);
14123 PushDlReloadActInfo {
14124 prev: Some(self),
14125 header_offset: Some(header_offset),
14126 }
14127 }
14128}
14129impl<Prev: Rec> Drop for PushDlReloadStats<Prev> {
14130 fn drop(&mut self) {
14131 if let Some(prev) = &mut self.prev {
14132 if let Some(header_offset) = &self.header_offset {
14133 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14134 }
14135 }
14136 }
14137}
14138pub struct PushDlReloadActInfo<Prev: Rec> {
14139 pub(crate) prev: Option<Prev>,
14140 pub(crate) header_offset: Option<usize>,
14141}
14142impl<Prev: Rec> Rec for PushDlReloadActInfo<Prev> {
14143 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14144 self.prev.as_mut().unwrap().as_rec_mut()
14145 }
14146 fn as_rec(&self) -> &Vec<u8> {
14147 self.prev.as_ref().unwrap().as_rec()
14148 }
14149}
14150impl<Prev: Rec> PushDlReloadActInfo<Prev> {
14151 pub fn new(prev: Prev) -> Self {
14152 Self {
14153 prev: Some(prev),
14154 header_offset: None,
14155 }
14156 }
14157 pub fn end_nested(mut self) -> Prev {
14158 let mut prev = self.prev.take().unwrap();
14159 if let Some(header_offset) = &self.header_offset {
14160 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14161 }
14162 prev
14163 }
14164 #[doc = "Associated type: [`ReloadAction`] (enum)"]
14165 pub fn push_reload_action(mut self, value: u8) -> Self {
14166 push_header(self.as_rec_mut(), 153u16, 1 as u16);
14167 self.as_rec_mut().extend(value.to_ne_bytes());
14168 self
14169 }
14170 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14171 pub fn nested_reload_action_stats(mut self) -> PushDlReloadActStats<Self> {
14172 let header_offset = push_nested_header(self.as_rec_mut(), 163u16);
14173 PushDlReloadActStats {
14174 prev: Some(self),
14175 header_offset: Some(header_offset),
14176 }
14177 }
14178}
14179impl<Prev: Rec> Drop for PushDlReloadActInfo<Prev> {
14180 fn drop(&mut self) {
14181 if let Some(prev) = &mut self.prev {
14182 if let Some(header_offset) = &self.header_offset {
14183 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14184 }
14185 }
14186 }
14187}
14188pub struct PushDlReloadActStats<Prev: Rec> {
14189 pub(crate) prev: Option<Prev>,
14190 pub(crate) header_offset: Option<usize>,
14191}
14192impl<Prev: Rec> Rec for PushDlReloadActStats<Prev> {
14193 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14194 self.prev.as_mut().unwrap().as_rec_mut()
14195 }
14196 fn as_rec(&self) -> &Vec<u8> {
14197 self.prev.as_ref().unwrap().as_rec()
14198 }
14199}
14200impl<Prev: Rec> PushDlReloadActStats<Prev> {
14201 pub fn new(prev: Prev) -> Self {
14202 Self {
14203 prev: Some(prev),
14204 header_offset: None,
14205 }
14206 }
14207 pub fn end_nested(mut self) -> Prev {
14208 let mut prev = self.prev.take().unwrap();
14209 if let Some(header_offset) = &self.header_offset {
14210 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14211 }
14212 prev
14213 }
14214 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14215 pub fn nested_reload_stats_entry(mut self) -> PushDlReloadStatsEntry<Self> {
14216 let header_offset = push_nested_header(self.as_rec_mut(), 158u16);
14217 PushDlReloadStatsEntry {
14218 prev: Some(self),
14219 header_offset: Some(header_offset),
14220 }
14221 }
14222}
14223impl<Prev: Rec> Drop for PushDlReloadActStats<Prev> {
14224 fn drop(&mut self) {
14225 if let Some(prev) = &mut self.prev {
14226 if let Some(header_offset) = &self.header_offset {
14227 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14228 }
14229 }
14230 }
14231}
14232pub struct PushDlReloadStatsEntry<Prev: Rec> {
14233 pub(crate) prev: Option<Prev>,
14234 pub(crate) header_offset: Option<usize>,
14235}
14236impl<Prev: Rec> Rec for PushDlReloadStatsEntry<Prev> {
14237 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14238 self.prev.as_mut().unwrap().as_rec_mut()
14239 }
14240 fn as_rec(&self) -> &Vec<u8> {
14241 self.prev.as_ref().unwrap().as_rec()
14242 }
14243}
14244impl<Prev: Rec> PushDlReloadStatsEntry<Prev> {
14245 pub fn new(prev: Prev) -> Self {
14246 Self {
14247 prev: Some(prev),
14248 header_offset: None,
14249 }
14250 }
14251 pub fn end_nested(mut self) -> Prev {
14252 let mut prev = self.prev.take().unwrap();
14253 if let Some(header_offset) = &self.header_offset {
14254 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14255 }
14256 prev
14257 }
14258 pub fn push_reload_stats_limit(mut self, value: u8) -> Self {
14259 push_header(self.as_rec_mut(), 159u16, 1 as u16);
14260 self.as_rec_mut().extend(value.to_ne_bytes());
14261 self
14262 }
14263 pub fn push_reload_stats_value(mut self, value: u32) -> Self {
14264 push_header(self.as_rec_mut(), 160u16, 4 as u16);
14265 self.as_rec_mut().extend(value.to_ne_bytes());
14266 self
14267 }
14268}
14269impl<Prev: Rec> Drop for PushDlReloadStatsEntry<Prev> {
14270 fn drop(&mut self) {
14271 if let Some(prev) = &mut self.prev {
14272 if let Some(header_offset) = &self.header_offset {
14273 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14274 }
14275 }
14276 }
14277}
14278pub struct PushDlInfoVersion<Prev: Rec> {
14279 pub(crate) prev: Option<Prev>,
14280 pub(crate) header_offset: Option<usize>,
14281}
14282impl<Prev: Rec> Rec for PushDlInfoVersion<Prev> {
14283 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14284 self.prev.as_mut().unwrap().as_rec_mut()
14285 }
14286 fn as_rec(&self) -> &Vec<u8> {
14287 self.prev.as_ref().unwrap().as_rec()
14288 }
14289}
14290impl<Prev: Rec> PushDlInfoVersion<Prev> {
14291 pub fn new(prev: Prev) -> Self {
14292 Self {
14293 prev: Some(prev),
14294 header_offset: None,
14295 }
14296 }
14297 pub fn end_nested(mut self) -> Prev {
14298 let mut prev = self.prev.take().unwrap();
14299 if let Some(header_offset) = &self.header_offset {
14300 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14301 }
14302 prev
14303 }
14304 pub fn push_info_version_name(mut self, value: &CStr) -> Self {
14305 push_header(
14306 self.as_rec_mut(),
14307 103u16,
14308 value.to_bytes_with_nul().len() as u16,
14309 );
14310 self.as_rec_mut().extend(value.to_bytes_with_nul());
14311 self
14312 }
14313 pub fn push_info_version_name_bytes(mut self, value: &[u8]) -> Self {
14314 push_header(self.as_rec_mut(), 103u16, (value.len() + 1) as u16);
14315 self.as_rec_mut().extend(value);
14316 self.as_rec_mut().push(0);
14317 self
14318 }
14319 pub fn push_info_version_value(mut self, value: &CStr) -> Self {
14320 push_header(
14321 self.as_rec_mut(),
14322 104u16,
14323 value.to_bytes_with_nul().len() as u16,
14324 );
14325 self.as_rec_mut().extend(value.to_bytes_with_nul());
14326 self
14327 }
14328 pub fn push_info_version_value_bytes(mut self, value: &[u8]) -> Self {
14329 push_header(self.as_rec_mut(), 104u16, (value.len() + 1) as u16);
14330 self.as_rec_mut().extend(value);
14331 self.as_rec_mut().push(0);
14332 self
14333 }
14334}
14335impl<Prev: Rec> Drop for PushDlInfoVersion<Prev> {
14336 fn drop(&mut self) {
14337 if let Some(prev) = &mut self.prev {
14338 if let Some(header_offset) = &self.header_offset {
14339 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14340 }
14341 }
14342 }
14343}
14344pub struct PushDlPortFunction<Prev: Rec> {
14345 pub(crate) prev: Option<Prev>,
14346 pub(crate) header_offset: Option<usize>,
14347}
14348impl<Prev: Rec> Rec for PushDlPortFunction<Prev> {
14349 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14350 self.prev.as_mut().unwrap().as_rec_mut()
14351 }
14352 fn as_rec(&self) -> &Vec<u8> {
14353 self.prev.as_ref().unwrap().as_rec()
14354 }
14355}
14356impl<Prev: Rec> PushDlPortFunction<Prev> {
14357 pub fn new(prev: Prev) -> Self {
14358 Self {
14359 prev: Some(prev),
14360 header_offset: None,
14361 }
14362 }
14363 pub fn end_nested(mut self) -> Prev {
14364 let mut prev = self.prev.take().unwrap();
14365 if let Some(header_offset) = &self.header_offset {
14366 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14367 }
14368 prev
14369 }
14370 pub fn push_hw_addr(mut self, value: &[u8]) -> Self {
14371 push_header(self.as_rec_mut(), 1u16, value.len() as u16);
14372 self.as_rec_mut().extend(value);
14373 self
14374 }
14375 #[doc = "Associated type: [`PortFnState`] (enum)"]
14376 pub fn push_state(mut self, value: u8) -> Self {
14377 push_header(self.as_rec_mut(), 2u16, 1 as u16);
14378 self.as_rec_mut().extend(value.to_ne_bytes());
14379 self
14380 }
14381 #[doc = "Associated type: [`PortFnOpstate`] (enum)"]
14382 pub fn push_opstate(mut self, value: u8) -> Self {
14383 push_header(self.as_rec_mut(), 3u16, 1 as u16);
14384 self.as_rec_mut().extend(value.to_ne_bytes());
14385 self
14386 }
14387 #[doc = "Associated type: [`PortFnAttrCap`] (1 bit per enumeration)"]
14388 pub fn push_caps(mut self, value: BuiltinBitfield32) -> Self {
14389 push_header(self.as_rec_mut(), 4u16, value.as_slice().len() as u16);
14390 self.as_rec_mut().extend(value.as_slice());
14391 self
14392 }
14393}
14394impl<Prev: Rec> Drop for PushDlPortFunction<Prev> {
14395 fn drop(&mut self) {
14396 if let Some(prev) = &mut self.prev {
14397 if let Some(header_offset) = &self.header_offset {
14398 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14399 }
14400 }
14401 }
14402}
14403pub struct PushDlDpipeTables<Prev: Rec> {
14404 pub(crate) prev: Option<Prev>,
14405 pub(crate) header_offset: Option<usize>,
14406}
14407impl<Prev: Rec> Rec for PushDlDpipeTables<Prev> {
14408 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14409 self.prev.as_mut().unwrap().as_rec_mut()
14410 }
14411 fn as_rec(&self) -> &Vec<u8> {
14412 self.prev.as_ref().unwrap().as_rec()
14413 }
14414}
14415impl<Prev: Rec> PushDlDpipeTables<Prev> {
14416 pub fn new(prev: Prev) -> Self {
14417 Self {
14418 prev: Some(prev),
14419 header_offset: None,
14420 }
14421 }
14422 pub fn end_nested(mut self) -> Prev {
14423 let mut prev = self.prev.take().unwrap();
14424 if let Some(header_offset) = &self.header_offset {
14425 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14426 }
14427 prev
14428 }
14429 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14430 pub fn nested_dpipe_table(mut self) -> PushDlDpipeTable<Self> {
14431 let header_offset = push_nested_header(self.as_rec_mut(), 28u16);
14432 PushDlDpipeTable {
14433 prev: Some(self),
14434 header_offset: Some(header_offset),
14435 }
14436 }
14437}
14438impl<Prev: Rec> Drop for PushDlDpipeTables<Prev> {
14439 fn drop(&mut self) {
14440 if let Some(prev) = &mut self.prev {
14441 if let Some(header_offset) = &self.header_offset {
14442 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14443 }
14444 }
14445 }
14446}
14447pub struct PushDlDpipeTable<Prev: Rec> {
14448 pub(crate) prev: Option<Prev>,
14449 pub(crate) header_offset: Option<usize>,
14450}
14451impl<Prev: Rec> Rec for PushDlDpipeTable<Prev> {
14452 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14453 self.prev.as_mut().unwrap().as_rec_mut()
14454 }
14455 fn as_rec(&self) -> &Vec<u8> {
14456 self.prev.as_ref().unwrap().as_rec()
14457 }
14458}
14459impl<Prev: Rec> PushDlDpipeTable<Prev> {
14460 pub fn new(prev: Prev) -> Self {
14461 Self {
14462 prev: Some(prev),
14463 header_offset: None,
14464 }
14465 }
14466 pub fn end_nested(mut self) -> Prev {
14467 let mut prev = self.prev.take().unwrap();
14468 if let Some(header_offset) = &self.header_offset {
14469 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14470 }
14471 prev
14472 }
14473 pub fn push_dpipe_table_name(mut self, value: &CStr) -> Self {
14474 push_header(
14475 self.as_rec_mut(),
14476 29u16,
14477 value.to_bytes_with_nul().len() as u16,
14478 );
14479 self.as_rec_mut().extend(value.to_bytes_with_nul());
14480 self
14481 }
14482 pub fn push_dpipe_table_name_bytes(mut self, value: &[u8]) -> Self {
14483 push_header(self.as_rec_mut(), 29u16, (value.len() + 1) as u16);
14484 self.as_rec_mut().extend(value);
14485 self.as_rec_mut().push(0);
14486 self
14487 }
14488 pub fn push_dpipe_table_size(mut self, value: u64) -> Self {
14489 push_header(self.as_rec_mut(), 30u16, 8 as u16);
14490 self.as_rec_mut().extend(value.to_ne_bytes());
14491 self
14492 }
14493 pub fn nested_dpipe_table_matches(mut self) -> PushDlDpipeTableMatches<Self> {
14494 let header_offset = push_nested_header(self.as_rec_mut(), 31u16);
14495 PushDlDpipeTableMatches {
14496 prev: Some(self),
14497 header_offset: Some(header_offset),
14498 }
14499 }
14500 pub fn nested_dpipe_table_actions(mut self) -> PushDlDpipeTableActions<Self> {
14501 let header_offset = push_nested_header(self.as_rec_mut(), 32u16);
14502 PushDlDpipeTableActions {
14503 prev: Some(self),
14504 header_offset: Some(header_offset),
14505 }
14506 }
14507 pub fn push_dpipe_table_counters_enabled(mut self, value: u8) -> Self {
14508 push_header(self.as_rec_mut(), 33u16, 1 as u16);
14509 self.as_rec_mut().extend(value.to_ne_bytes());
14510 self
14511 }
14512 pub fn push_dpipe_table_resource_id(mut self, value: u64) -> Self {
14513 push_header(self.as_rec_mut(), 75u16, 8 as u16);
14514 self.as_rec_mut().extend(value.to_ne_bytes());
14515 self
14516 }
14517 pub fn push_dpipe_table_resource_units(mut self, value: u64) -> Self {
14518 push_header(self.as_rec_mut(), 76u16, 8 as u16);
14519 self.as_rec_mut().extend(value.to_ne_bytes());
14520 self
14521 }
14522}
14523impl<Prev: Rec> Drop for PushDlDpipeTable<Prev> {
14524 fn drop(&mut self) {
14525 if let Some(prev) = &mut self.prev {
14526 if let Some(header_offset) = &self.header_offset {
14527 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14528 }
14529 }
14530 }
14531}
14532pub struct PushDlDpipeTableMatches<Prev: Rec> {
14533 pub(crate) prev: Option<Prev>,
14534 pub(crate) header_offset: Option<usize>,
14535}
14536impl<Prev: Rec> Rec for PushDlDpipeTableMatches<Prev> {
14537 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14538 self.prev.as_mut().unwrap().as_rec_mut()
14539 }
14540 fn as_rec(&self) -> &Vec<u8> {
14541 self.prev.as_ref().unwrap().as_rec()
14542 }
14543}
14544impl<Prev: Rec> PushDlDpipeTableMatches<Prev> {
14545 pub fn new(prev: Prev) -> Self {
14546 Self {
14547 prev: Some(prev),
14548 header_offset: None,
14549 }
14550 }
14551 pub fn end_nested(mut self) -> Prev {
14552 let mut prev = self.prev.take().unwrap();
14553 if let Some(header_offset) = &self.header_offset {
14554 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14555 }
14556 prev
14557 }
14558 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14559 pub fn nested_dpipe_match(mut self) -> PushDlDpipeMatch<Self> {
14560 let header_offset = push_nested_header(self.as_rec_mut(), 40u16);
14561 PushDlDpipeMatch {
14562 prev: Some(self),
14563 header_offset: Some(header_offset),
14564 }
14565 }
14566}
14567impl<Prev: Rec> Drop for PushDlDpipeTableMatches<Prev> {
14568 fn drop(&mut self) {
14569 if let Some(prev) = &mut self.prev {
14570 if let Some(header_offset) = &self.header_offset {
14571 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14572 }
14573 }
14574 }
14575}
14576pub struct PushDlDpipeTableActions<Prev: Rec> {
14577 pub(crate) prev: Option<Prev>,
14578 pub(crate) header_offset: Option<usize>,
14579}
14580impl<Prev: Rec> Rec for PushDlDpipeTableActions<Prev> {
14581 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14582 self.prev.as_mut().unwrap().as_rec_mut()
14583 }
14584 fn as_rec(&self) -> &Vec<u8> {
14585 self.prev.as_ref().unwrap().as_rec()
14586 }
14587}
14588impl<Prev: Rec> PushDlDpipeTableActions<Prev> {
14589 pub fn new(prev: Prev) -> Self {
14590 Self {
14591 prev: Some(prev),
14592 header_offset: None,
14593 }
14594 }
14595 pub fn end_nested(mut self) -> Prev {
14596 let mut prev = self.prev.take().unwrap();
14597 if let Some(header_offset) = &self.header_offset {
14598 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14599 }
14600 prev
14601 }
14602 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14603 pub fn nested_dpipe_action(mut self) -> PushDlDpipeAction<Self> {
14604 let header_offset = push_nested_header(self.as_rec_mut(), 43u16);
14605 PushDlDpipeAction {
14606 prev: Some(self),
14607 header_offset: Some(header_offset),
14608 }
14609 }
14610}
14611impl<Prev: Rec> Drop for PushDlDpipeTableActions<Prev> {
14612 fn drop(&mut self) {
14613 if let Some(prev) = &mut self.prev {
14614 if let Some(header_offset) = &self.header_offset {
14615 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14616 }
14617 }
14618 }
14619}
14620pub struct PushDlDpipeEntries<Prev: Rec> {
14621 pub(crate) prev: Option<Prev>,
14622 pub(crate) header_offset: Option<usize>,
14623}
14624impl<Prev: Rec> Rec for PushDlDpipeEntries<Prev> {
14625 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14626 self.prev.as_mut().unwrap().as_rec_mut()
14627 }
14628 fn as_rec(&self) -> &Vec<u8> {
14629 self.prev.as_ref().unwrap().as_rec()
14630 }
14631}
14632impl<Prev: Rec> PushDlDpipeEntries<Prev> {
14633 pub fn new(prev: Prev) -> Self {
14634 Self {
14635 prev: Some(prev),
14636 header_offset: None,
14637 }
14638 }
14639 pub fn end_nested(mut self) -> Prev {
14640 let mut prev = self.prev.take().unwrap();
14641 if let Some(header_offset) = &self.header_offset {
14642 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14643 }
14644 prev
14645 }
14646 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14647 pub fn nested_dpipe_entry(mut self) -> PushDlDpipeEntry<Self> {
14648 let header_offset = push_nested_header(self.as_rec_mut(), 35u16);
14649 PushDlDpipeEntry {
14650 prev: Some(self),
14651 header_offset: Some(header_offset),
14652 }
14653 }
14654}
14655impl<Prev: Rec> Drop for PushDlDpipeEntries<Prev> {
14656 fn drop(&mut self) {
14657 if let Some(prev) = &mut self.prev {
14658 if let Some(header_offset) = &self.header_offset {
14659 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14660 }
14661 }
14662 }
14663}
14664pub struct PushDlDpipeEntry<Prev: Rec> {
14665 pub(crate) prev: Option<Prev>,
14666 pub(crate) header_offset: Option<usize>,
14667}
14668impl<Prev: Rec> Rec for PushDlDpipeEntry<Prev> {
14669 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14670 self.prev.as_mut().unwrap().as_rec_mut()
14671 }
14672 fn as_rec(&self) -> &Vec<u8> {
14673 self.prev.as_ref().unwrap().as_rec()
14674 }
14675}
14676impl<Prev: Rec> PushDlDpipeEntry<Prev> {
14677 pub fn new(prev: Prev) -> Self {
14678 Self {
14679 prev: Some(prev),
14680 header_offset: None,
14681 }
14682 }
14683 pub fn end_nested(mut self) -> Prev {
14684 let mut prev = self.prev.take().unwrap();
14685 if let Some(header_offset) = &self.header_offset {
14686 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14687 }
14688 prev
14689 }
14690 pub fn push_dpipe_entry_index(mut self, value: u64) -> Self {
14691 push_header(self.as_rec_mut(), 36u16, 8 as u16);
14692 self.as_rec_mut().extend(value.to_ne_bytes());
14693 self
14694 }
14695 pub fn nested_dpipe_entry_match_values(mut self) -> PushDlDpipeEntryMatchValues<Self> {
14696 let header_offset = push_nested_header(self.as_rec_mut(), 37u16);
14697 PushDlDpipeEntryMatchValues {
14698 prev: Some(self),
14699 header_offset: Some(header_offset),
14700 }
14701 }
14702 pub fn nested_dpipe_entry_action_values(mut self) -> PushDlDpipeEntryActionValues<Self> {
14703 let header_offset = push_nested_header(self.as_rec_mut(), 38u16);
14704 PushDlDpipeEntryActionValues {
14705 prev: Some(self),
14706 header_offset: Some(header_offset),
14707 }
14708 }
14709 pub fn push_dpipe_entry_counter(mut self, value: u64) -> Self {
14710 push_header(self.as_rec_mut(), 39u16, 8 as u16);
14711 self.as_rec_mut().extend(value.to_ne_bytes());
14712 self
14713 }
14714}
14715impl<Prev: Rec> Drop for PushDlDpipeEntry<Prev> {
14716 fn drop(&mut self) {
14717 if let Some(prev) = &mut self.prev {
14718 if let Some(header_offset) = &self.header_offset {
14719 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14720 }
14721 }
14722 }
14723}
14724pub struct PushDlDpipeEntryMatchValues<Prev: Rec> {
14725 pub(crate) prev: Option<Prev>,
14726 pub(crate) header_offset: Option<usize>,
14727}
14728impl<Prev: Rec> Rec for PushDlDpipeEntryMatchValues<Prev> {
14729 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14730 self.prev.as_mut().unwrap().as_rec_mut()
14731 }
14732 fn as_rec(&self) -> &Vec<u8> {
14733 self.prev.as_ref().unwrap().as_rec()
14734 }
14735}
14736impl<Prev: Rec> PushDlDpipeEntryMatchValues<Prev> {
14737 pub fn new(prev: Prev) -> Self {
14738 Self {
14739 prev: Some(prev),
14740 header_offset: None,
14741 }
14742 }
14743 pub fn end_nested(mut self) -> Prev {
14744 let mut prev = self.prev.take().unwrap();
14745 if let Some(header_offset) = &self.header_offset {
14746 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14747 }
14748 prev
14749 }
14750 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14751 pub fn nested_dpipe_match_value(mut self) -> PushDlDpipeMatchValue<Self> {
14752 let header_offset = push_nested_header(self.as_rec_mut(), 41u16);
14753 PushDlDpipeMatchValue {
14754 prev: Some(self),
14755 header_offset: Some(header_offset),
14756 }
14757 }
14758}
14759impl<Prev: Rec> Drop for PushDlDpipeEntryMatchValues<Prev> {
14760 fn drop(&mut self) {
14761 if let Some(prev) = &mut self.prev {
14762 if let Some(header_offset) = &self.header_offset {
14763 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14764 }
14765 }
14766 }
14767}
14768pub struct PushDlDpipeEntryActionValues<Prev: Rec> {
14769 pub(crate) prev: Option<Prev>,
14770 pub(crate) header_offset: Option<usize>,
14771}
14772impl<Prev: Rec> Rec for PushDlDpipeEntryActionValues<Prev> {
14773 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14774 self.prev.as_mut().unwrap().as_rec_mut()
14775 }
14776 fn as_rec(&self) -> &Vec<u8> {
14777 self.prev.as_ref().unwrap().as_rec()
14778 }
14779}
14780impl<Prev: Rec> PushDlDpipeEntryActionValues<Prev> {
14781 pub fn new(prev: Prev) -> Self {
14782 Self {
14783 prev: Some(prev),
14784 header_offset: None,
14785 }
14786 }
14787 pub fn end_nested(mut self) -> Prev {
14788 let mut prev = self.prev.take().unwrap();
14789 if let Some(header_offset) = &self.header_offset {
14790 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14791 }
14792 prev
14793 }
14794 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14795 pub fn nested_dpipe_action_value(mut self) -> PushDlDpipeActionValue<Self> {
14796 let header_offset = push_nested_header(self.as_rec_mut(), 44u16);
14797 PushDlDpipeActionValue {
14798 prev: Some(self),
14799 header_offset: Some(header_offset),
14800 }
14801 }
14802}
14803impl<Prev: Rec> Drop for PushDlDpipeEntryActionValues<Prev> {
14804 fn drop(&mut self) {
14805 if let Some(prev) = &mut self.prev {
14806 if let Some(header_offset) = &self.header_offset {
14807 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14808 }
14809 }
14810 }
14811}
14812pub struct PushDlDpipeMatch<Prev: Rec> {
14813 pub(crate) prev: Option<Prev>,
14814 pub(crate) header_offset: Option<usize>,
14815}
14816impl<Prev: Rec> Rec for PushDlDpipeMatch<Prev> {
14817 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14818 self.prev.as_mut().unwrap().as_rec_mut()
14819 }
14820 fn as_rec(&self) -> &Vec<u8> {
14821 self.prev.as_ref().unwrap().as_rec()
14822 }
14823}
14824impl<Prev: Rec> PushDlDpipeMatch<Prev> {
14825 pub fn new(prev: Prev) -> Self {
14826 Self {
14827 prev: Some(prev),
14828 header_offset: None,
14829 }
14830 }
14831 pub fn end_nested(mut self) -> Prev {
14832 let mut prev = self.prev.take().unwrap();
14833 if let Some(header_offset) = &self.header_offset {
14834 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14835 }
14836 prev
14837 }
14838 #[doc = "Associated type: [`DpipeMatchType`] (enum)"]
14839 pub fn push_dpipe_match_type(mut self, value: u32) -> Self {
14840 push_header(self.as_rec_mut(), 42u16, 4 as u16);
14841 self.as_rec_mut().extend(value.to_ne_bytes());
14842 self
14843 }
14844 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
14845 pub fn push_dpipe_header_id(mut self, value: u32) -> Self {
14846 push_header(self.as_rec_mut(), 52u16, 4 as u16);
14847 self.as_rec_mut().extend(value.to_ne_bytes());
14848 self
14849 }
14850 pub fn push_dpipe_header_global(mut self, value: u8) -> Self {
14851 push_header(self.as_rec_mut(), 54u16, 1 as u16);
14852 self.as_rec_mut().extend(value.to_ne_bytes());
14853 self
14854 }
14855 pub fn push_dpipe_header_index(mut self, value: u32) -> Self {
14856 push_header(self.as_rec_mut(), 55u16, 4 as u16);
14857 self.as_rec_mut().extend(value.to_ne_bytes());
14858 self
14859 }
14860 pub fn push_dpipe_field_id(mut self, value: u32) -> Self {
14861 push_header(self.as_rec_mut(), 58u16, 4 as u16);
14862 self.as_rec_mut().extend(value.to_ne_bytes());
14863 self
14864 }
14865}
14866impl<Prev: Rec> Drop for PushDlDpipeMatch<Prev> {
14867 fn drop(&mut self) {
14868 if let Some(prev) = &mut self.prev {
14869 if let Some(header_offset) = &self.header_offset {
14870 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14871 }
14872 }
14873 }
14874}
14875pub struct PushDlDpipeMatchValue<Prev: Rec> {
14876 pub(crate) prev: Option<Prev>,
14877 pub(crate) header_offset: Option<usize>,
14878}
14879impl<Prev: Rec> Rec for PushDlDpipeMatchValue<Prev> {
14880 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14881 self.prev.as_mut().unwrap().as_rec_mut()
14882 }
14883 fn as_rec(&self) -> &Vec<u8> {
14884 self.prev.as_ref().unwrap().as_rec()
14885 }
14886}
14887impl<Prev: Rec> PushDlDpipeMatchValue<Prev> {
14888 pub fn new(prev: Prev) -> Self {
14889 Self {
14890 prev: Some(prev),
14891 header_offset: None,
14892 }
14893 }
14894 pub fn end_nested(mut self) -> Prev {
14895 let mut prev = self.prev.take().unwrap();
14896 if let Some(header_offset) = &self.header_offset {
14897 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14898 }
14899 prev
14900 }
14901 #[doc = "Attribute may repeat multiple times (treat it as array)"]
14902 pub fn nested_dpipe_match(mut self) -> PushDlDpipeMatch<Self> {
14903 let header_offset = push_nested_header(self.as_rec_mut(), 40u16);
14904 PushDlDpipeMatch {
14905 prev: Some(self),
14906 header_offset: Some(header_offset),
14907 }
14908 }
14909 pub fn push_dpipe_value(mut self, value: &[u8]) -> Self {
14910 push_header(self.as_rec_mut(), 46u16, value.len() as u16);
14911 self.as_rec_mut().extend(value);
14912 self
14913 }
14914 pub fn push_dpipe_value_mask(mut self, value: &[u8]) -> Self {
14915 push_header(self.as_rec_mut(), 47u16, value.len() as u16);
14916 self.as_rec_mut().extend(value);
14917 self
14918 }
14919 pub fn push_dpipe_value_mapping(mut self, value: u32) -> Self {
14920 push_header(self.as_rec_mut(), 48u16, 4 as u16);
14921 self.as_rec_mut().extend(value.to_ne_bytes());
14922 self
14923 }
14924}
14925impl<Prev: Rec> Drop for PushDlDpipeMatchValue<Prev> {
14926 fn drop(&mut self) {
14927 if let Some(prev) = &mut self.prev {
14928 if let Some(header_offset) = &self.header_offset {
14929 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14930 }
14931 }
14932 }
14933}
14934pub struct PushDlDpipeAction<Prev: Rec> {
14935 pub(crate) prev: Option<Prev>,
14936 pub(crate) header_offset: Option<usize>,
14937}
14938impl<Prev: Rec> Rec for PushDlDpipeAction<Prev> {
14939 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
14940 self.prev.as_mut().unwrap().as_rec_mut()
14941 }
14942 fn as_rec(&self) -> &Vec<u8> {
14943 self.prev.as_ref().unwrap().as_rec()
14944 }
14945}
14946impl<Prev: Rec> PushDlDpipeAction<Prev> {
14947 pub fn new(prev: Prev) -> Self {
14948 Self {
14949 prev: Some(prev),
14950 header_offset: None,
14951 }
14952 }
14953 pub fn end_nested(mut self) -> Prev {
14954 let mut prev = self.prev.take().unwrap();
14955 if let Some(header_offset) = &self.header_offset {
14956 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14957 }
14958 prev
14959 }
14960 #[doc = "Associated type: [`DpipeActionType`] (enum)"]
14961 pub fn push_dpipe_action_type(mut self, value: u32) -> Self {
14962 push_header(self.as_rec_mut(), 45u16, 4 as u16);
14963 self.as_rec_mut().extend(value.to_ne_bytes());
14964 self
14965 }
14966 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
14967 pub fn push_dpipe_header_id(mut self, value: u32) -> Self {
14968 push_header(self.as_rec_mut(), 52u16, 4 as u16);
14969 self.as_rec_mut().extend(value.to_ne_bytes());
14970 self
14971 }
14972 pub fn push_dpipe_header_global(mut self, value: u8) -> Self {
14973 push_header(self.as_rec_mut(), 54u16, 1 as u16);
14974 self.as_rec_mut().extend(value.to_ne_bytes());
14975 self
14976 }
14977 pub fn push_dpipe_header_index(mut self, value: u32) -> Self {
14978 push_header(self.as_rec_mut(), 55u16, 4 as u16);
14979 self.as_rec_mut().extend(value.to_ne_bytes());
14980 self
14981 }
14982 pub fn push_dpipe_field_id(mut self, value: u32) -> Self {
14983 push_header(self.as_rec_mut(), 58u16, 4 as u16);
14984 self.as_rec_mut().extend(value.to_ne_bytes());
14985 self
14986 }
14987}
14988impl<Prev: Rec> Drop for PushDlDpipeAction<Prev> {
14989 fn drop(&mut self) {
14990 if let Some(prev) = &mut self.prev {
14991 if let Some(header_offset) = &self.header_offset {
14992 finalize_nested_header(prev.as_rec_mut(), *header_offset);
14993 }
14994 }
14995 }
14996}
14997pub struct PushDlDpipeActionValue<Prev: Rec> {
14998 pub(crate) prev: Option<Prev>,
14999 pub(crate) header_offset: Option<usize>,
15000}
15001impl<Prev: Rec> Rec for PushDlDpipeActionValue<Prev> {
15002 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15003 self.prev.as_mut().unwrap().as_rec_mut()
15004 }
15005 fn as_rec(&self) -> &Vec<u8> {
15006 self.prev.as_ref().unwrap().as_rec()
15007 }
15008}
15009impl<Prev: Rec> PushDlDpipeActionValue<Prev> {
15010 pub fn new(prev: Prev) -> Self {
15011 Self {
15012 prev: Some(prev),
15013 header_offset: None,
15014 }
15015 }
15016 pub fn end_nested(mut self) -> Prev {
15017 let mut prev = self.prev.take().unwrap();
15018 if let Some(header_offset) = &self.header_offset {
15019 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15020 }
15021 prev
15022 }
15023 #[doc = "Attribute may repeat multiple times (treat it as array)"]
15024 pub fn nested_dpipe_action(mut self) -> PushDlDpipeAction<Self> {
15025 let header_offset = push_nested_header(self.as_rec_mut(), 43u16);
15026 PushDlDpipeAction {
15027 prev: Some(self),
15028 header_offset: Some(header_offset),
15029 }
15030 }
15031 pub fn push_dpipe_value(mut self, value: &[u8]) -> Self {
15032 push_header(self.as_rec_mut(), 46u16, value.len() as u16);
15033 self.as_rec_mut().extend(value);
15034 self
15035 }
15036 pub fn push_dpipe_value_mask(mut self, value: &[u8]) -> Self {
15037 push_header(self.as_rec_mut(), 47u16, value.len() as u16);
15038 self.as_rec_mut().extend(value);
15039 self
15040 }
15041 pub fn push_dpipe_value_mapping(mut self, value: u32) -> Self {
15042 push_header(self.as_rec_mut(), 48u16, 4 as u16);
15043 self.as_rec_mut().extend(value.to_ne_bytes());
15044 self
15045 }
15046}
15047impl<Prev: Rec> Drop for PushDlDpipeActionValue<Prev> {
15048 fn drop(&mut self) {
15049 if let Some(prev) = &mut self.prev {
15050 if let Some(header_offset) = &self.header_offset {
15051 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15052 }
15053 }
15054 }
15055}
15056pub struct PushDlDpipeHeaders<Prev: Rec> {
15057 pub(crate) prev: Option<Prev>,
15058 pub(crate) header_offset: Option<usize>,
15059}
15060impl<Prev: Rec> Rec for PushDlDpipeHeaders<Prev> {
15061 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15062 self.prev.as_mut().unwrap().as_rec_mut()
15063 }
15064 fn as_rec(&self) -> &Vec<u8> {
15065 self.prev.as_ref().unwrap().as_rec()
15066 }
15067}
15068impl<Prev: Rec> PushDlDpipeHeaders<Prev> {
15069 pub fn new(prev: Prev) -> Self {
15070 Self {
15071 prev: Some(prev),
15072 header_offset: None,
15073 }
15074 }
15075 pub fn end_nested(mut self) -> Prev {
15076 let mut prev = self.prev.take().unwrap();
15077 if let Some(header_offset) = &self.header_offset {
15078 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15079 }
15080 prev
15081 }
15082 #[doc = "Attribute may repeat multiple times (treat it as array)"]
15083 pub fn nested_dpipe_header(mut self) -> PushDlDpipeHeader<Self> {
15084 let header_offset = push_nested_header(self.as_rec_mut(), 50u16);
15085 PushDlDpipeHeader {
15086 prev: Some(self),
15087 header_offset: Some(header_offset),
15088 }
15089 }
15090}
15091impl<Prev: Rec> Drop for PushDlDpipeHeaders<Prev> {
15092 fn drop(&mut self) {
15093 if let Some(prev) = &mut self.prev {
15094 if let Some(header_offset) = &self.header_offset {
15095 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15096 }
15097 }
15098 }
15099}
15100pub struct PushDlDpipeHeader<Prev: Rec> {
15101 pub(crate) prev: Option<Prev>,
15102 pub(crate) header_offset: Option<usize>,
15103}
15104impl<Prev: Rec> Rec for PushDlDpipeHeader<Prev> {
15105 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15106 self.prev.as_mut().unwrap().as_rec_mut()
15107 }
15108 fn as_rec(&self) -> &Vec<u8> {
15109 self.prev.as_ref().unwrap().as_rec()
15110 }
15111}
15112impl<Prev: Rec> PushDlDpipeHeader<Prev> {
15113 pub fn new(prev: Prev) -> Self {
15114 Self {
15115 prev: Some(prev),
15116 header_offset: None,
15117 }
15118 }
15119 pub fn end_nested(mut self) -> Prev {
15120 let mut prev = self.prev.take().unwrap();
15121 if let Some(header_offset) = &self.header_offset {
15122 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15123 }
15124 prev
15125 }
15126 pub fn push_dpipe_header_name(mut self, value: &CStr) -> Self {
15127 push_header(
15128 self.as_rec_mut(),
15129 51u16,
15130 value.to_bytes_with_nul().len() as u16,
15131 );
15132 self.as_rec_mut().extend(value.to_bytes_with_nul());
15133 self
15134 }
15135 pub fn push_dpipe_header_name_bytes(mut self, value: &[u8]) -> Self {
15136 push_header(self.as_rec_mut(), 51u16, (value.len() + 1) as u16);
15137 self.as_rec_mut().extend(value);
15138 self.as_rec_mut().push(0);
15139 self
15140 }
15141 #[doc = "Associated type: [`DpipeHeaderId`] (enum)"]
15142 pub fn push_dpipe_header_id(mut self, value: u32) -> Self {
15143 push_header(self.as_rec_mut(), 52u16, 4 as u16);
15144 self.as_rec_mut().extend(value.to_ne_bytes());
15145 self
15146 }
15147 pub fn nested_dpipe_header_fields(mut self) -> PushDlDpipeHeaderFields<Self> {
15148 let header_offset = push_nested_header(self.as_rec_mut(), 53u16);
15149 PushDlDpipeHeaderFields {
15150 prev: Some(self),
15151 header_offset: Some(header_offset),
15152 }
15153 }
15154 pub fn push_dpipe_header_global(mut self, value: u8) -> Self {
15155 push_header(self.as_rec_mut(), 54u16, 1 as u16);
15156 self.as_rec_mut().extend(value.to_ne_bytes());
15157 self
15158 }
15159}
15160impl<Prev: Rec> Drop for PushDlDpipeHeader<Prev> {
15161 fn drop(&mut self) {
15162 if let Some(prev) = &mut self.prev {
15163 if let Some(header_offset) = &self.header_offset {
15164 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15165 }
15166 }
15167 }
15168}
15169pub struct PushDlDpipeHeaderFields<Prev: Rec> {
15170 pub(crate) prev: Option<Prev>,
15171 pub(crate) header_offset: Option<usize>,
15172}
15173impl<Prev: Rec> Rec for PushDlDpipeHeaderFields<Prev> {
15174 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15175 self.prev.as_mut().unwrap().as_rec_mut()
15176 }
15177 fn as_rec(&self) -> &Vec<u8> {
15178 self.prev.as_ref().unwrap().as_rec()
15179 }
15180}
15181impl<Prev: Rec> PushDlDpipeHeaderFields<Prev> {
15182 pub fn new(prev: Prev) -> Self {
15183 Self {
15184 prev: Some(prev),
15185 header_offset: None,
15186 }
15187 }
15188 pub fn end_nested(mut self) -> Prev {
15189 let mut prev = self.prev.take().unwrap();
15190 if let Some(header_offset) = &self.header_offset {
15191 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15192 }
15193 prev
15194 }
15195 #[doc = "Attribute may repeat multiple times (treat it as array)"]
15196 pub fn nested_dpipe_field(mut self) -> PushDlDpipeField<Self> {
15197 let header_offset = push_nested_header(self.as_rec_mut(), 56u16);
15198 PushDlDpipeField {
15199 prev: Some(self),
15200 header_offset: Some(header_offset),
15201 }
15202 }
15203}
15204impl<Prev: Rec> Drop for PushDlDpipeHeaderFields<Prev> {
15205 fn drop(&mut self) {
15206 if let Some(prev) = &mut self.prev {
15207 if let Some(header_offset) = &self.header_offset {
15208 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15209 }
15210 }
15211 }
15212}
15213pub struct PushDlDpipeField<Prev: Rec> {
15214 pub(crate) prev: Option<Prev>,
15215 pub(crate) header_offset: Option<usize>,
15216}
15217impl<Prev: Rec> Rec for PushDlDpipeField<Prev> {
15218 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15219 self.prev.as_mut().unwrap().as_rec_mut()
15220 }
15221 fn as_rec(&self) -> &Vec<u8> {
15222 self.prev.as_ref().unwrap().as_rec()
15223 }
15224}
15225impl<Prev: Rec> PushDlDpipeField<Prev> {
15226 pub fn new(prev: Prev) -> Self {
15227 Self {
15228 prev: Some(prev),
15229 header_offset: None,
15230 }
15231 }
15232 pub fn end_nested(mut self) -> Prev {
15233 let mut prev = self.prev.take().unwrap();
15234 if let Some(header_offset) = &self.header_offset {
15235 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15236 }
15237 prev
15238 }
15239 pub fn push_dpipe_field_name(mut self, value: &CStr) -> Self {
15240 push_header(
15241 self.as_rec_mut(),
15242 57u16,
15243 value.to_bytes_with_nul().len() as u16,
15244 );
15245 self.as_rec_mut().extend(value.to_bytes_with_nul());
15246 self
15247 }
15248 pub fn push_dpipe_field_name_bytes(mut self, value: &[u8]) -> Self {
15249 push_header(self.as_rec_mut(), 57u16, (value.len() + 1) as u16);
15250 self.as_rec_mut().extend(value);
15251 self.as_rec_mut().push(0);
15252 self
15253 }
15254 pub fn push_dpipe_field_id(mut self, value: u32) -> Self {
15255 push_header(self.as_rec_mut(), 58u16, 4 as u16);
15256 self.as_rec_mut().extend(value.to_ne_bytes());
15257 self
15258 }
15259 pub fn push_dpipe_field_bitwidth(mut self, value: u32) -> Self {
15260 push_header(self.as_rec_mut(), 59u16, 4 as u16);
15261 self.as_rec_mut().extend(value.to_ne_bytes());
15262 self
15263 }
15264 #[doc = "Associated type: [`DpipeFieldMappingType`] (enum)"]
15265 pub fn push_dpipe_field_mapping_type(mut self, value: u32) -> Self {
15266 push_header(self.as_rec_mut(), 60u16, 4 as u16);
15267 self.as_rec_mut().extend(value.to_ne_bytes());
15268 self
15269 }
15270}
15271impl<Prev: Rec> Drop for PushDlDpipeField<Prev> {
15272 fn drop(&mut self) {
15273 if let Some(prev) = &mut self.prev {
15274 if let Some(header_offset) = &self.header_offset {
15275 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15276 }
15277 }
15278 }
15279}
15280pub struct PushDlResource<Prev: Rec> {
15281 pub(crate) prev: Option<Prev>,
15282 pub(crate) header_offset: Option<usize>,
15283}
15284impl<Prev: Rec> Rec for PushDlResource<Prev> {
15285 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15286 self.prev.as_mut().unwrap().as_rec_mut()
15287 }
15288 fn as_rec(&self) -> &Vec<u8> {
15289 self.prev.as_ref().unwrap().as_rec()
15290 }
15291}
15292impl<Prev: Rec> PushDlResource<Prev> {
15293 pub fn new(prev: Prev) -> Self {
15294 Self {
15295 prev: Some(prev),
15296 header_offset: None,
15297 }
15298 }
15299 pub fn end_nested(mut self) -> Prev {
15300 let mut prev = self.prev.take().unwrap();
15301 if let Some(header_offset) = &self.header_offset {
15302 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15303 }
15304 prev
15305 }
15306 pub fn push_resource_name(mut self, value: &CStr) -> Self {
15307 push_header(
15308 self.as_rec_mut(),
15309 65u16,
15310 value.to_bytes_with_nul().len() as u16,
15311 );
15312 self.as_rec_mut().extend(value.to_bytes_with_nul());
15313 self
15314 }
15315 pub fn push_resource_name_bytes(mut self, value: &[u8]) -> Self {
15316 push_header(self.as_rec_mut(), 65u16, (value.len() + 1) as u16);
15317 self.as_rec_mut().extend(value);
15318 self.as_rec_mut().push(0);
15319 self
15320 }
15321 pub fn push_resource_id(mut self, value: u64) -> Self {
15322 push_header(self.as_rec_mut(), 66u16, 8 as u16);
15323 self.as_rec_mut().extend(value.to_ne_bytes());
15324 self
15325 }
15326 pub fn push_resource_size(mut self, value: u64) -> Self {
15327 push_header(self.as_rec_mut(), 67u16, 8 as u16);
15328 self.as_rec_mut().extend(value.to_ne_bytes());
15329 self
15330 }
15331 pub fn push_resource_size_new(mut self, value: u64) -> Self {
15332 push_header(self.as_rec_mut(), 68u16, 8 as u16);
15333 self.as_rec_mut().extend(value.to_ne_bytes());
15334 self
15335 }
15336 pub fn push_resource_size_valid(mut self, value: u8) -> Self {
15337 push_header(self.as_rec_mut(), 69u16, 1 as u16);
15338 self.as_rec_mut().extend(value.to_ne_bytes());
15339 self
15340 }
15341 pub fn push_resource_size_min(mut self, value: u64) -> Self {
15342 push_header(self.as_rec_mut(), 70u16, 8 as u16);
15343 self.as_rec_mut().extend(value.to_ne_bytes());
15344 self
15345 }
15346 pub fn push_resource_size_max(mut self, value: u64) -> Self {
15347 push_header(self.as_rec_mut(), 71u16, 8 as u16);
15348 self.as_rec_mut().extend(value.to_ne_bytes());
15349 self
15350 }
15351 pub fn push_resource_size_gran(mut self, value: u64) -> Self {
15352 push_header(self.as_rec_mut(), 72u16, 8 as u16);
15353 self.as_rec_mut().extend(value.to_ne_bytes());
15354 self
15355 }
15356 #[doc = "Associated type: [`ResourceUnit`] (enum)"]
15357 pub fn push_resource_unit(mut self, value: u8) -> Self {
15358 push_header(self.as_rec_mut(), 73u16, 1 as u16);
15359 self.as_rec_mut().extend(value.to_ne_bytes());
15360 self
15361 }
15362 pub fn push_resource_occ(mut self, value: u64) -> Self {
15363 push_header(self.as_rec_mut(), 74u16, 8 as u16);
15364 self.as_rec_mut().extend(value.to_ne_bytes());
15365 self
15366 }
15367}
15368impl<Prev: Rec> Drop for PushDlResource<Prev> {
15369 fn drop(&mut self) {
15370 if let Some(prev) = &mut self.prev {
15371 if let Some(header_offset) = &self.header_offset {
15372 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15373 }
15374 }
15375 }
15376}
15377pub struct PushDlResourceList<Prev: Rec> {
15378 pub(crate) prev: Option<Prev>,
15379 pub(crate) header_offset: Option<usize>,
15380}
15381impl<Prev: Rec> Rec for PushDlResourceList<Prev> {
15382 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15383 self.prev.as_mut().unwrap().as_rec_mut()
15384 }
15385 fn as_rec(&self) -> &Vec<u8> {
15386 self.prev.as_ref().unwrap().as_rec()
15387 }
15388}
15389impl<Prev: Rec> PushDlResourceList<Prev> {
15390 pub fn new(prev: Prev) -> Self {
15391 Self {
15392 prev: Some(prev),
15393 header_offset: None,
15394 }
15395 }
15396 pub fn end_nested(mut self) -> Prev {
15397 let mut prev = self.prev.take().unwrap();
15398 if let Some(header_offset) = &self.header_offset {
15399 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15400 }
15401 prev
15402 }
15403 #[doc = "Attribute may repeat multiple times (treat it as array)"]
15404 pub fn nested_resource(mut self) -> PushDlResource<Self> {
15405 let header_offset = push_nested_header(self.as_rec_mut(), 64u16);
15406 PushDlResource {
15407 prev: Some(self),
15408 header_offset: Some(header_offset),
15409 }
15410 }
15411}
15412impl<Prev: Rec> Drop for PushDlResourceList<Prev> {
15413 fn drop(&mut self) {
15414 if let Some(prev) = &mut self.prev {
15415 if let Some(header_offset) = &self.header_offset {
15416 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15417 }
15418 }
15419 }
15420}
15421pub struct PushDlParam<Prev: Rec> {
15422 pub(crate) prev: Option<Prev>,
15423 pub(crate) header_offset: Option<usize>,
15424}
15425impl<Prev: Rec> Rec for PushDlParam<Prev> {
15426 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15427 self.prev.as_mut().unwrap().as_rec_mut()
15428 }
15429 fn as_rec(&self) -> &Vec<u8> {
15430 self.prev.as_ref().unwrap().as_rec()
15431 }
15432}
15433impl<Prev: Rec> PushDlParam<Prev> {
15434 pub fn new(prev: Prev) -> Self {
15435 Self {
15436 prev: Some(prev),
15437 header_offset: None,
15438 }
15439 }
15440 pub fn end_nested(mut self) -> Prev {
15441 let mut prev = self.prev.take().unwrap();
15442 if let Some(header_offset) = &self.header_offset {
15443 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15444 }
15445 prev
15446 }
15447 pub fn push_param_name(mut self, value: &CStr) -> Self {
15448 push_header(
15449 self.as_rec_mut(),
15450 81u16,
15451 value.to_bytes_with_nul().len() as u16,
15452 );
15453 self.as_rec_mut().extend(value.to_bytes_with_nul());
15454 self
15455 }
15456 pub fn push_param_name_bytes(mut self, value: &[u8]) -> Self {
15457 push_header(self.as_rec_mut(), 81u16, (value.len() + 1) as u16);
15458 self.as_rec_mut().extend(value);
15459 self.as_rec_mut().push(0);
15460 self
15461 }
15462 pub fn push_param_generic(mut self, value: ()) -> Self {
15463 push_header(self.as_rec_mut(), 82u16, 0 as u16);
15464 self
15465 }
15466 #[doc = "Associated type: [`VarAttrType`] (enum)"]
15467 pub fn push_param_type(mut self, value: u8) -> Self {
15468 push_header(self.as_rec_mut(), 83u16, 1 as u16);
15469 self.as_rec_mut().extend(value.to_ne_bytes());
15470 self
15471 }
15472}
15473impl<Prev: Rec> Drop for PushDlParam<Prev> {
15474 fn drop(&mut self) {
15475 if let Some(prev) = &mut self.prev {
15476 if let Some(header_offset) = &self.header_offset {
15477 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15478 }
15479 }
15480 }
15481}
15482pub struct PushDlRegionSnapshots<Prev: Rec> {
15483 pub(crate) prev: Option<Prev>,
15484 pub(crate) header_offset: Option<usize>,
15485}
15486impl<Prev: Rec> Rec for PushDlRegionSnapshots<Prev> {
15487 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15488 self.prev.as_mut().unwrap().as_rec_mut()
15489 }
15490 fn as_rec(&self) -> &Vec<u8> {
15491 self.prev.as_ref().unwrap().as_rec()
15492 }
15493}
15494impl<Prev: Rec> PushDlRegionSnapshots<Prev> {
15495 pub fn new(prev: Prev) -> Self {
15496 Self {
15497 prev: Some(prev),
15498 header_offset: None,
15499 }
15500 }
15501 pub fn end_nested(mut self) -> Prev {
15502 let mut prev = self.prev.take().unwrap();
15503 if let Some(header_offset) = &self.header_offset {
15504 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15505 }
15506 prev
15507 }
15508 pub fn nested_region_snapshot(mut self) -> PushDlRegionSnapshot<Self> {
15509 let header_offset = push_nested_header(self.as_rec_mut(), 91u16);
15510 PushDlRegionSnapshot {
15511 prev: Some(self),
15512 header_offset: Some(header_offset),
15513 }
15514 }
15515}
15516impl<Prev: Rec> Drop for PushDlRegionSnapshots<Prev> {
15517 fn drop(&mut self) {
15518 if let Some(prev) = &mut self.prev {
15519 if let Some(header_offset) = &self.header_offset {
15520 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15521 }
15522 }
15523 }
15524}
15525pub struct PushDlRegionSnapshot<Prev: Rec> {
15526 pub(crate) prev: Option<Prev>,
15527 pub(crate) header_offset: Option<usize>,
15528}
15529impl<Prev: Rec> Rec for PushDlRegionSnapshot<Prev> {
15530 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15531 self.prev.as_mut().unwrap().as_rec_mut()
15532 }
15533 fn as_rec(&self) -> &Vec<u8> {
15534 self.prev.as_ref().unwrap().as_rec()
15535 }
15536}
15537impl<Prev: Rec> PushDlRegionSnapshot<Prev> {
15538 pub fn new(prev: Prev) -> Self {
15539 Self {
15540 prev: Some(prev),
15541 header_offset: None,
15542 }
15543 }
15544 pub fn end_nested(mut self) -> Prev {
15545 let mut prev = self.prev.take().unwrap();
15546 if let Some(header_offset) = &self.header_offset {
15547 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15548 }
15549 prev
15550 }
15551 pub fn push_region_snapshot_id(mut self, value: u32) -> Self {
15552 push_header(self.as_rec_mut(), 92u16, 4 as u16);
15553 self.as_rec_mut().extend(value.to_ne_bytes());
15554 self
15555 }
15556}
15557impl<Prev: Rec> Drop for PushDlRegionSnapshot<Prev> {
15558 fn drop(&mut self) {
15559 if let Some(prev) = &mut self.prev {
15560 if let Some(header_offset) = &self.header_offset {
15561 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15562 }
15563 }
15564 }
15565}
15566pub struct PushDlRegionChunks<Prev: Rec> {
15567 pub(crate) prev: Option<Prev>,
15568 pub(crate) header_offset: Option<usize>,
15569}
15570impl<Prev: Rec> Rec for PushDlRegionChunks<Prev> {
15571 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15572 self.prev.as_mut().unwrap().as_rec_mut()
15573 }
15574 fn as_rec(&self) -> &Vec<u8> {
15575 self.prev.as_ref().unwrap().as_rec()
15576 }
15577}
15578impl<Prev: Rec> PushDlRegionChunks<Prev> {
15579 pub fn new(prev: Prev) -> Self {
15580 Self {
15581 prev: Some(prev),
15582 header_offset: None,
15583 }
15584 }
15585 pub fn end_nested(mut self) -> Prev {
15586 let mut prev = self.prev.take().unwrap();
15587 if let Some(header_offset) = &self.header_offset {
15588 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15589 }
15590 prev
15591 }
15592 pub fn nested_region_chunk(mut self) -> PushDlRegionChunk<Self> {
15593 let header_offset = push_nested_header(self.as_rec_mut(), 94u16);
15594 PushDlRegionChunk {
15595 prev: Some(self),
15596 header_offset: Some(header_offset),
15597 }
15598 }
15599}
15600impl<Prev: Rec> Drop for PushDlRegionChunks<Prev> {
15601 fn drop(&mut self) {
15602 if let Some(prev) = &mut self.prev {
15603 if let Some(header_offset) = &self.header_offset {
15604 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15605 }
15606 }
15607 }
15608}
15609pub struct PushDlRegionChunk<Prev: Rec> {
15610 pub(crate) prev: Option<Prev>,
15611 pub(crate) header_offset: Option<usize>,
15612}
15613impl<Prev: Rec> Rec for PushDlRegionChunk<Prev> {
15614 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15615 self.prev.as_mut().unwrap().as_rec_mut()
15616 }
15617 fn as_rec(&self) -> &Vec<u8> {
15618 self.prev.as_ref().unwrap().as_rec()
15619 }
15620}
15621impl<Prev: Rec> PushDlRegionChunk<Prev> {
15622 pub fn new(prev: Prev) -> Self {
15623 Self {
15624 prev: Some(prev),
15625 header_offset: None,
15626 }
15627 }
15628 pub fn end_nested(mut self) -> Prev {
15629 let mut prev = self.prev.take().unwrap();
15630 if let Some(header_offset) = &self.header_offset {
15631 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15632 }
15633 prev
15634 }
15635 pub fn push_region_chunk_data(mut self, value: &[u8]) -> Self {
15636 push_header(self.as_rec_mut(), 95u16, value.len() as u16);
15637 self.as_rec_mut().extend(value);
15638 self
15639 }
15640 pub fn push_region_chunk_addr(mut self, value: u64) -> Self {
15641 push_header(self.as_rec_mut(), 96u16, 8 as u16);
15642 self.as_rec_mut().extend(value.to_ne_bytes());
15643 self
15644 }
15645}
15646impl<Prev: Rec> Drop for PushDlRegionChunk<Prev> {
15647 fn drop(&mut self) {
15648 if let Some(prev) = &mut self.prev {
15649 if let Some(header_offset) = &self.header_offset {
15650 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15651 }
15652 }
15653 }
15654}
15655pub struct PushDlFmsg<Prev: Rec> {
15656 pub(crate) prev: Option<Prev>,
15657 pub(crate) header_offset: Option<usize>,
15658}
15659impl<Prev: Rec> Rec for PushDlFmsg<Prev> {
15660 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15661 self.prev.as_mut().unwrap().as_rec_mut()
15662 }
15663 fn as_rec(&self) -> &Vec<u8> {
15664 self.prev.as_ref().unwrap().as_rec()
15665 }
15666}
15667impl<Prev: Rec> PushDlFmsg<Prev> {
15668 pub fn new(prev: Prev) -> Self {
15669 Self {
15670 prev: Some(prev),
15671 header_offset: None,
15672 }
15673 }
15674 pub fn end_nested(mut self) -> Prev {
15675 let mut prev = self.prev.take().unwrap();
15676 if let Some(header_offset) = &self.header_offset {
15677 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15678 }
15679 prev
15680 }
15681 pub fn push_fmsg_obj_nest_start(mut self, value: ()) -> Self {
15682 push_header(self.as_rec_mut(), 107u16, 0 as u16);
15683 self
15684 }
15685 pub fn push_fmsg_pair_nest_start(mut self, value: ()) -> Self {
15686 push_header(self.as_rec_mut(), 108u16, 0 as u16);
15687 self
15688 }
15689 pub fn push_fmsg_arr_nest_start(mut self, value: ()) -> Self {
15690 push_header(self.as_rec_mut(), 109u16, 0 as u16);
15691 self
15692 }
15693 pub fn push_fmsg_nest_end(mut self, value: ()) -> Self {
15694 push_header(self.as_rec_mut(), 110u16, 0 as u16);
15695 self
15696 }
15697 pub fn push_fmsg_obj_name(mut self, value: &CStr) -> Self {
15698 push_header(
15699 self.as_rec_mut(),
15700 111u16,
15701 value.to_bytes_with_nul().len() as u16,
15702 );
15703 self.as_rec_mut().extend(value.to_bytes_with_nul());
15704 self
15705 }
15706 pub fn push_fmsg_obj_name_bytes(mut self, value: &[u8]) -> Self {
15707 push_header(self.as_rec_mut(), 111u16, (value.len() + 1) as u16);
15708 self.as_rec_mut().extend(value);
15709 self.as_rec_mut().push(0);
15710 self
15711 }
15712}
15713impl<Prev: Rec> Drop for PushDlFmsg<Prev> {
15714 fn drop(&mut self) {
15715 if let Some(prev) = &mut self.prev {
15716 if let Some(header_offset) = &self.header_offset {
15717 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15718 }
15719 }
15720 }
15721}
15722pub struct PushDlHealthReporter<Prev: Rec> {
15723 pub(crate) prev: Option<Prev>,
15724 pub(crate) header_offset: Option<usize>,
15725}
15726impl<Prev: Rec> Rec for PushDlHealthReporter<Prev> {
15727 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15728 self.prev.as_mut().unwrap().as_rec_mut()
15729 }
15730 fn as_rec(&self) -> &Vec<u8> {
15731 self.prev.as_ref().unwrap().as_rec()
15732 }
15733}
15734impl<Prev: Rec> PushDlHealthReporter<Prev> {
15735 pub fn new(prev: Prev) -> Self {
15736 Self {
15737 prev: Some(prev),
15738 header_offset: None,
15739 }
15740 }
15741 pub fn end_nested(mut self) -> Prev {
15742 let mut prev = self.prev.take().unwrap();
15743 if let Some(header_offset) = &self.header_offset {
15744 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15745 }
15746 prev
15747 }
15748 pub fn push_health_reporter_name(mut self, value: &CStr) -> Self {
15749 push_header(
15750 self.as_rec_mut(),
15751 115u16,
15752 value.to_bytes_with_nul().len() as u16,
15753 );
15754 self.as_rec_mut().extend(value.to_bytes_with_nul());
15755 self
15756 }
15757 pub fn push_health_reporter_name_bytes(mut self, value: &[u8]) -> Self {
15758 push_header(self.as_rec_mut(), 115u16, (value.len() + 1) as u16);
15759 self.as_rec_mut().extend(value);
15760 self.as_rec_mut().push(0);
15761 self
15762 }
15763 pub fn push_health_reporter_state(mut self, value: u8) -> Self {
15764 push_header(self.as_rec_mut(), 116u16, 1 as u16);
15765 self.as_rec_mut().extend(value.to_ne_bytes());
15766 self
15767 }
15768 pub fn push_health_reporter_err_count(mut self, value: u64) -> Self {
15769 push_header(self.as_rec_mut(), 117u16, 8 as u16);
15770 self.as_rec_mut().extend(value.to_ne_bytes());
15771 self
15772 }
15773 pub fn push_health_reporter_recover_count(mut self, value: u64) -> Self {
15774 push_header(self.as_rec_mut(), 118u16, 8 as u16);
15775 self.as_rec_mut().extend(value.to_ne_bytes());
15776 self
15777 }
15778 pub fn push_health_reporter_dump_ts(mut self, value: u64) -> Self {
15779 push_header(self.as_rec_mut(), 119u16, 8 as u16);
15780 self.as_rec_mut().extend(value.to_ne_bytes());
15781 self
15782 }
15783 pub fn push_health_reporter_graceful_period(mut self, value: u64) -> Self {
15784 push_header(self.as_rec_mut(), 120u16, 8 as u16);
15785 self.as_rec_mut().extend(value.to_ne_bytes());
15786 self
15787 }
15788 pub fn push_health_reporter_auto_recover(mut self, value: u8) -> Self {
15789 push_header(self.as_rec_mut(), 121u16, 1 as u16);
15790 self.as_rec_mut().extend(value.to_ne_bytes());
15791 self
15792 }
15793 pub fn push_health_reporter_dump_ts_ns(mut self, value: u64) -> Self {
15794 push_header(self.as_rec_mut(), 137u16, 8 as u16);
15795 self.as_rec_mut().extend(value.to_ne_bytes());
15796 self
15797 }
15798 pub fn push_health_reporter_auto_dump(mut self, value: u8) -> Self {
15799 push_header(self.as_rec_mut(), 141u16, 1 as u16);
15800 self.as_rec_mut().extend(value.to_ne_bytes());
15801 self
15802 }
15803 #[doc = "Time (in msec) for recoveries before starting the grace period\\."]
15804 pub fn push_health_reporter_burst_period(mut self, value: u64) -> Self {
15805 push_header(self.as_rec_mut(), 181u16, 8 as u16);
15806 self.as_rec_mut().extend(value.to_ne_bytes());
15807 self
15808 }
15809}
15810impl<Prev: Rec> Drop for PushDlHealthReporter<Prev> {
15811 fn drop(&mut self) {
15812 if let Some(prev) = &mut self.prev {
15813 if let Some(header_offset) = &self.header_offset {
15814 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15815 }
15816 }
15817 }
15818}
15819pub struct PushDlAttrStats<Prev: Rec> {
15820 pub(crate) prev: Option<Prev>,
15821 pub(crate) header_offset: Option<usize>,
15822}
15823impl<Prev: Rec> Rec for PushDlAttrStats<Prev> {
15824 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15825 self.prev.as_mut().unwrap().as_rec_mut()
15826 }
15827 fn as_rec(&self) -> &Vec<u8> {
15828 self.prev.as_ref().unwrap().as_rec()
15829 }
15830}
15831impl<Prev: Rec> PushDlAttrStats<Prev> {
15832 pub fn new(prev: Prev) -> Self {
15833 Self {
15834 prev: Some(prev),
15835 header_offset: None,
15836 }
15837 }
15838 pub fn end_nested(mut self) -> Prev {
15839 let mut prev = self.prev.take().unwrap();
15840 if let Some(header_offset) = &self.header_offset {
15841 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15842 }
15843 prev
15844 }
15845 pub fn push_stats_rx_packets(mut self, value: u64) -> Self {
15846 push_header(self.as_rec_mut(), 0u16, 8 as u16);
15847 self.as_rec_mut().extend(value.to_ne_bytes());
15848 self
15849 }
15850 pub fn push_stats_rx_bytes(mut self, value: u64) -> Self {
15851 push_header(self.as_rec_mut(), 1u16, 8 as u16);
15852 self.as_rec_mut().extend(value.to_ne_bytes());
15853 self
15854 }
15855 pub fn push_stats_rx_dropped(mut self, value: u64) -> Self {
15856 push_header(self.as_rec_mut(), 2u16, 8 as u16);
15857 self.as_rec_mut().extend(value.to_ne_bytes());
15858 self
15859 }
15860}
15861impl<Prev: Rec> Drop for PushDlAttrStats<Prev> {
15862 fn drop(&mut self) {
15863 if let Some(prev) = &mut self.prev {
15864 if let Some(header_offset) = &self.header_offset {
15865 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15866 }
15867 }
15868 }
15869}
15870pub struct PushDlTrapMetadata<Prev: Rec> {
15871 pub(crate) prev: Option<Prev>,
15872 pub(crate) header_offset: Option<usize>,
15873}
15874impl<Prev: Rec> Rec for PushDlTrapMetadata<Prev> {
15875 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15876 self.prev.as_mut().unwrap().as_rec_mut()
15877 }
15878 fn as_rec(&self) -> &Vec<u8> {
15879 self.prev.as_ref().unwrap().as_rec()
15880 }
15881}
15882impl<Prev: Rec> PushDlTrapMetadata<Prev> {
15883 pub fn new(prev: Prev) -> Self {
15884 Self {
15885 prev: Some(prev),
15886 header_offset: None,
15887 }
15888 }
15889 pub fn end_nested(mut self) -> Prev {
15890 let mut prev = self.prev.take().unwrap();
15891 if let Some(header_offset) = &self.header_offset {
15892 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15893 }
15894 prev
15895 }
15896 pub fn push_trap_metadata_type_in_port(mut self, value: ()) -> Self {
15897 push_header(self.as_rec_mut(), 0u16, 0 as u16);
15898 self
15899 }
15900 pub fn push_trap_metadata_type_fa_cookie(mut self, value: ()) -> Self {
15901 push_header(self.as_rec_mut(), 1u16, 0 as u16);
15902 self
15903 }
15904}
15905impl<Prev: Rec> Drop for PushDlTrapMetadata<Prev> {
15906 fn drop(&mut self) {
15907 if let Some(prev) = &mut self.prev {
15908 if let Some(header_offset) = &self.header_offset {
15909 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15910 }
15911 }
15912 }
15913}
15914pub struct PushDlLinecardSupportedTypes<Prev: Rec> {
15915 pub(crate) prev: Option<Prev>,
15916 pub(crate) header_offset: Option<usize>,
15917}
15918impl<Prev: Rec> Rec for PushDlLinecardSupportedTypes<Prev> {
15919 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15920 self.prev.as_mut().unwrap().as_rec_mut()
15921 }
15922 fn as_rec(&self) -> &Vec<u8> {
15923 self.prev.as_ref().unwrap().as_rec()
15924 }
15925}
15926impl<Prev: Rec> PushDlLinecardSupportedTypes<Prev> {
15927 pub fn new(prev: Prev) -> Self {
15928 Self {
15929 prev: Some(prev),
15930 header_offset: None,
15931 }
15932 }
15933 pub fn end_nested(mut self) -> Prev {
15934 let mut prev = self.prev.take().unwrap();
15935 if let Some(header_offset) = &self.header_offset {
15936 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15937 }
15938 prev
15939 }
15940 pub fn push_linecard_type(mut self, value: &CStr) -> Self {
15941 push_header(
15942 self.as_rec_mut(),
15943 173u16,
15944 value.to_bytes_with_nul().len() as u16,
15945 );
15946 self.as_rec_mut().extend(value.to_bytes_with_nul());
15947 self
15948 }
15949 pub fn push_linecard_type_bytes(mut self, value: &[u8]) -> Self {
15950 push_header(self.as_rec_mut(), 173u16, (value.len() + 1) as u16);
15951 self.as_rec_mut().extend(value);
15952 self.as_rec_mut().push(0);
15953 self
15954 }
15955}
15956impl<Prev: Rec> Drop for PushDlLinecardSupportedTypes<Prev> {
15957 fn drop(&mut self) {
15958 if let Some(prev) = &mut self.prev {
15959 if let Some(header_offset) = &self.header_offset {
15960 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15961 }
15962 }
15963 }
15964}
15965pub struct PushDlSelftestId<Prev: Rec> {
15966 pub(crate) prev: Option<Prev>,
15967 pub(crate) header_offset: Option<usize>,
15968}
15969impl<Prev: Rec> Rec for PushDlSelftestId<Prev> {
15970 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
15971 self.prev.as_mut().unwrap().as_rec_mut()
15972 }
15973 fn as_rec(&self) -> &Vec<u8> {
15974 self.prev.as_ref().unwrap().as_rec()
15975 }
15976}
15977impl<Prev: Rec> PushDlSelftestId<Prev> {
15978 pub fn new(prev: Prev) -> Self {
15979 Self {
15980 prev: Some(prev),
15981 header_offset: None,
15982 }
15983 }
15984 pub fn end_nested(mut self) -> Prev {
15985 let mut prev = self.prev.take().unwrap();
15986 if let Some(header_offset) = &self.header_offset {
15987 finalize_nested_header(prev.as_rec_mut(), *header_offset);
15988 }
15989 prev
15990 }
15991 pub fn push_flash(mut self, value: ()) -> Self {
15992 push_header(self.as_rec_mut(), 1u16, 0 as u16);
15993 self
15994 }
15995}
15996impl<Prev: Rec> Drop for PushDlSelftestId<Prev> {
15997 fn drop(&mut self) {
15998 if let Some(prev) = &mut self.prev {
15999 if let Some(header_offset) = &self.header_offset {
16000 finalize_nested_header(prev.as_rec_mut(), *header_offset);
16001 }
16002 }
16003 }
16004}
16005pub struct PushDlRateTcBws<Prev: Rec> {
16006 pub(crate) prev: Option<Prev>,
16007 pub(crate) header_offset: Option<usize>,
16008}
16009impl<Prev: Rec> Rec for PushDlRateTcBws<Prev> {
16010 fn as_rec_mut(&mut self) -> &mut Vec<u8> {
16011 self.prev.as_mut().unwrap().as_rec_mut()
16012 }
16013 fn as_rec(&self) -> &Vec<u8> {
16014 self.prev.as_ref().unwrap().as_rec()
16015 }
16016}
16017impl<Prev: Rec> PushDlRateTcBws<Prev> {
16018 pub fn new(prev: Prev) -> Self {
16019 Self {
16020 prev: Some(prev),
16021 header_offset: None,
16022 }
16023 }
16024 pub fn end_nested(mut self) -> Prev {
16025 let mut prev = self.prev.take().unwrap();
16026 if let Some(header_offset) = &self.header_offset {
16027 finalize_nested_header(prev.as_rec_mut(), *header_offset);
16028 }
16029 prev
16030 }
16031 pub fn push_index(mut self, value: u8) -> Self {
16032 push_header(self.as_rec_mut(), 1u16, 1 as u16);
16033 self.as_rec_mut().extend(value.to_ne_bytes());
16034 self
16035 }
16036 #[doc = "Specifies the bandwidth share assigned to the Traffic Class\\.\nThe bandwidth for the traffic class is determined\nin proportion to the sum of the shares of all configured classes\\.\n"]
16037 pub fn push_bw(mut self, value: u32) -> Self {
16038 push_header(self.as_rec_mut(), 2u16, 4 as u16);
16039 self.as_rec_mut().extend(value.to_ne_bytes());
16040 self
16041 }
16042}
16043impl<Prev: Rec> Drop for PushDlRateTcBws<Prev> {
16044 fn drop(&mut self) {
16045 if let Some(prev) = &mut self.prev {
16046 if let Some(header_offset) = &self.header_offset {
16047 finalize_nested_header(prev.as_rec_mut(), *header_offset);
16048 }
16049 }
16050 }
16051}
16052#[doc = "Get devlink instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_failed()](IterableDevlink::get_reload_failed)\n- [.get_dev_stats()](IterableDevlink::get_dev_stats)\n"]
16053#[derive(Debug)]
16054pub struct OpGetDump<'r> {
16055 request: Request<'r>,
16056}
16057impl<'r> OpGetDump<'r> {
16058 pub fn new(mut request: Request<'r>) -> Self {
16059 Self::write_header(request.buf_mut());
16060 Self {
16061 request: request.set_dump(),
16062 }
16063 }
16064 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16065 Self::write_header(buf);
16066 PushDevlink::new(buf)
16067 }
16068 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16069 PushDevlink::new(self.request.buf_mut())
16070 }
16071 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16072 PushDevlink::new(self.request.buf)
16073 }
16074 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16075 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16076 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16077 }
16078 fn write_header<Prev: Rec>(prev: &mut Prev) {
16079 let mut header = BuiltinNfgenmsg::new();
16080 header.cmd = 1u8;
16081 header.version = 1u8;
16082 prev.as_rec_mut().extend(header.as_slice());
16083 }
16084}
16085impl NetlinkRequest for OpGetDump<'_> {
16086 fn protocol(&self) -> Protocol {
16087 Protocol::Generic("devlink".as_bytes())
16088 }
16089 fn flags(&self) -> u16 {
16090 self.request.flags
16091 }
16092 fn payload(&self) -> &[u8] {
16093 self.request.buf()
16094 }
16095 type ReplyType<'buf> = IterableDevlink<'buf>;
16096 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16097 Self::decode_request(buf)
16098 }
16099 fn lookup(
16100 buf: &[u8],
16101 offset: usize,
16102 missing_type: Option<u16>,
16103 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16104 Self::decode_request(buf).lookup_attr(offset, missing_type)
16105 }
16106}
16107#[doc = "Get devlink instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_failed()](IterableDevlink::get_reload_failed)\n- [.get_dev_stats()](IterableDevlink::get_dev_stats)\n"]
16108#[derive(Debug)]
16109pub struct OpGetDo<'r> {
16110 request: Request<'r>,
16111}
16112impl<'r> OpGetDo<'r> {
16113 pub fn new(mut request: Request<'r>) -> Self {
16114 Self::write_header(request.buf_mut());
16115 Self { request: request }
16116 }
16117 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16118 Self::write_header(buf);
16119 PushDevlink::new(buf)
16120 }
16121 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16122 PushDevlink::new(self.request.buf_mut())
16123 }
16124 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16125 PushDevlink::new(self.request.buf)
16126 }
16127 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16128 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16129 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16130 }
16131 fn write_header<Prev: Rec>(prev: &mut Prev) {
16132 let mut header = BuiltinNfgenmsg::new();
16133 header.cmd = 1u8;
16134 header.version = 1u8;
16135 prev.as_rec_mut().extend(header.as_slice());
16136 }
16137}
16138impl NetlinkRequest for OpGetDo<'_> {
16139 fn protocol(&self) -> Protocol {
16140 Protocol::Generic("devlink".as_bytes())
16141 }
16142 fn flags(&self) -> u16 {
16143 self.request.flags
16144 }
16145 fn payload(&self) -> &[u8] {
16146 self.request.buf()
16147 }
16148 type ReplyType<'buf> = IterableDevlink<'buf>;
16149 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16150 Self::decode_request(buf)
16151 }
16152 fn lookup(
16153 buf: &[u8],
16154 offset: usize,
16155 missing_type: Option<u16>,
16156 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16157 Self::decode_request(buf).lookup_attr(offset, missing_type)
16158 }
16159}
16160#[doc = "Get devlink port instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
16161#[derive(Debug)]
16162pub struct OpPortGetDump<'r> {
16163 request: Request<'r>,
16164}
16165impl<'r> OpPortGetDump<'r> {
16166 pub fn new(mut request: Request<'r>) -> Self {
16167 Self::write_header(request.buf_mut());
16168 Self {
16169 request: request.set_dump(),
16170 }
16171 }
16172 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16173 Self::write_header(buf);
16174 PushDevlink::new(buf)
16175 }
16176 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16177 PushDevlink::new(self.request.buf_mut())
16178 }
16179 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16180 PushDevlink::new(self.request.buf)
16181 }
16182 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16183 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16184 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16185 }
16186 fn write_header<Prev: Rec>(prev: &mut Prev) {
16187 let mut header = BuiltinNfgenmsg::new();
16188 header.cmd = 5u8;
16189 header.version = 1u8;
16190 prev.as_rec_mut().extend(header.as_slice());
16191 }
16192}
16193impl NetlinkRequest for OpPortGetDump<'_> {
16194 fn protocol(&self) -> Protocol {
16195 Protocol::Generic("devlink".as_bytes())
16196 }
16197 fn flags(&self) -> u16 {
16198 self.request.flags
16199 }
16200 fn payload(&self) -> &[u8] {
16201 self.request.buf()
16202 }
16203 type ReplyType<'buf> = IterableDevlink<'buf>;
16204 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16205 Self::decode_request(buf)
16206 }
16207 fn lookup(
16208 buf: &[u8],
16209 offset: usize,
16210 missing_type: Option<u16>,
16211 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16212 Self::decode_request(buf).lookup_attr(offset, missing_type)
16213 }
16214}
16215#[doc = "Get devlink port instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
16216#[derive(Debug)]
16217pub struct OpPortGetDo<'r> {
16218 request: Request<'r>,
16219}
16220impl<'r> OpPortGetDo<'r> {
16221 pub fn new(mut request: Request<'r>) -> Self {
16222 Self::write_header(request.buf_mut());
16223 Self { request: request }
16224 }
16225 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16226 Self::write_header(buf);
16227 PushDevlink::new(buf)
16228 }
16229 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16230 PushDevlink::new(self.request.buf_mut())
16231 }
16232 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16233 PushDevlink::new(self.request.buf)
16234 }
16235 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16236 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16237 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16238 }
16239 fn write_header<Prev: Rec>(prev: &mut Prev) {
16240 let mut header = BuiltinNfgenmsg::new();
16241 header.cmd = 5u8;
16242 header.version = 1u8;
16243 prev.as_rec_mut().extend(header.as_slice());
16244 }
16245}
16246impl NetlinkRequest for OpPortGetDo<'_> {
16247 fn protocol(&self) -> Protocol {
16248 Protocol::Generic("devlink".as_bytes())
16249 }
16250 fn flags(&self) -> u16 {
16251 self.request.flags
16252 }
16253 fn payload(&self) -> &[u8] {
16254 self.request.buf()
16255 }
16256 type ReplyType<'buf> = IterableDevlink<'buf>;
16257 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16258 Self::decode_request(buf)
16259 }
16260 fn lookup(
16261 buf: &[u8],
16262 offset: usize,
16263 missing_type: Option<u16>,
16264 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16265 Self::decode_request(buf).lookup_attr(offset, missing_type)
16266 }
16267}
16268#[doc = "Set devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_type()](PushDevlink::push_port_type)\n- [.nested_port_function()](PushDevlink::nested_port_function)\n"]
16269#[derive(Debug)]
16270pub struct OpPortSetDo<'r> {
16271 request: Request<'r>,
16272}
16273impl<'r> OpPortSetDo<'r> {
16274 pub fn new(mut request: Request<'r>) -> Self {
16275 Self::write_header(request.buf_mut());
16276 Self { request: request }
16277 }
16278 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16279 Self::write_header(buf);
16280 PushDevlink::new(buf)
16281 }
16282 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16283 PushDevlink::new(self.request.buf_mut())
16284 }
16285 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16286 PushDevlink::new(self.request.buf)
16287 }
16288 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16289 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16290 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16291 }
16292 fn write_header<Prev: Rec>(prev: &mut Prev) {
16293 let mut header = BuiltinNfgenmsg::new();
16294 header.cmd = 6u8;
16295 header.version = 1u8;
16296 prev.as_rec_mut().extend(header.as_slice());
16297 }
16298}
16299impl NetlinkRequest for OpPortSetDo<'_> {
16300 fn protocol(&self) -> Protocol {
16301 Protocol::Generic("devlink".as_bytes())
16302 }
16303 fn flags(&self) -> u16 {
16304 self.request.flags
16305 }
16306 fn payload(&self) -> &[u8] {
16307 self.request.buf()
16308 }
16309 type ReplyType<'buf> = IterableDevlink<'buf>;
16310 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16311 Self::decode_request(buf)
16312 }
16313 fn lookup(
16314 buf: &[u8],
16315 offset: usize,
16316 missing_type: Option<u16>,
16317 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16318 Self::decode_request(buf).lookup_attr(offset, missing_type)
16319 }
16320}
16321#[doc = "Create devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_flavour()](PushDevlink::push_port_flavour)\n- [.push_port_pci_pf_number()](PushDevlink::push_port_pci_pf_number)\n- [.push_port_controller_number()](PushDevlink::push_port_controller_number)\n- [.push_port_pci_sf_number()](PushDevlink::push_port_pci_sf_number)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
16322#[derive(Debug)]
16323pub struct OpPortNewDo<'r> {
16324 request: Request<'r>,
16325}
16326impl<'r> OpPortNewDo<'r> {
16327 pub fn new(mut request: Request<'r>) -> Self {
16328 Self::write_header(request.buf_mut());
16329 Self { request: request }
16330 }
16331 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16332 Self::write_header(buf);
16333 PushDevlink::new(buf)
16334 }
16335 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16336 PushDevlink::new(self.request.buf_mut())
16337 }
16338 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16339 PushDevlink::new(self.request.buf)
16340 }
16341 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16342 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16343 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16344 }
16345 fn write_header<Prev: Rec>(prev: &mut Prev) {
16346 let mut header = BuiltinNfgenmsg::new();
16347 header.cmd = 7u8;
16348 header.version = 1u8;
16349 prev.as_rec_mut().extend(header.as_slice());
16350 }
16351}
16352impl NetlinkRequest for OpPortNewDo<'_> {
16353 fn protocol(&self) -> Protocol {
16354 Protocol::Generic("devlink".as_bytes())
16355 }
16356 fn flags(&self) -> u16 {
16357 self.request.flags
16358 }
16359 fn payload(&self) -> &[u8] {
16360 self.request.buf()
16361 }
16362 type ReplyType<'buf> = IterableDevlink<'buf>;
16363 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16364 Self::decode_request(buf)
16365 }
16366 fn lookup(
16367 buf: &[u8],
16368 offset: usize,
16369 missing_type: Option<u16>,
16370 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16371 Self::decode_request(buf).lookup_attr(offset, missing_type)
16372 }
16373}
16374#[doc = "Delete devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
16375#[derive(Debug)]
16376pub struct OpPortDelDo<'r> {
16377 request: Request<'r>,
16378}
16379impl<'r> OpPortDelDo<'r> {
16380 pub fn new(mut request: Request<'r>) -> Self {
16381 Self::write_header(request.buf_mut());
16382 Self { request: request }
16383 }
16384 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16385 Self::write_header(buf);
16386 PushDevlink::new(buf)
16387 }
16388 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16389 PushDevlink::new(self.request.buf_mut())
16390 }
16391 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16392 PushDevlink::new(self.request.buf)
16393 }
16394 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16395 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16396 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16397 }
16398 fn write_header<Prev: Rec>(prev: &mut Prev) {
16399 let mut header = BuiltinNfgenmsg::new();
16400 header.cmd = 8u8;
16401 header.version = 1u8;
16402 prev.as_rec_mut().extend(header.as_slice());
16403 }
16404}
16405impl NetlinkRequest for OpPortDelDo<'_> {
16406 fn protocol(&self) -> Protocol {
16407 Protocol::Generic("devlink".as_bytes())
16408 }
16409 fn flags(&self) -> u16 {
16410 self.request.flags
16411 }
16412 fn payload(&self) -> &[u8] {
16413 self.request.buf()
16414 }
16415 type ReplyType<'buf> = IterableDevlink<'buf>;
16416 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16417 Self::decode_request(buf)
16418 }
16419 fn lookup(
16420 buf: &[u8],
16421 offset: usize,
16422 missing_type: Option<u16>,
16423 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16424 Self::decode_request(buf).lookup_attr(offset, missing_type)
16425 }
16426}
16427#[doc = "Split devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_split_count()](PushDevlink::push_port_split_count)\n"]
16428#[derive(Debug)]
16429pub struct OpPortSplitDo<'r> {
16430 request: Request<'r>,
16431}
16432impl<'r> OpPortSplitDo<'r> {
16433 pub fn new(mut request: Request<'r>) -> Self {
16434 Self::write_header(request.buf_mut());
16435 Self { request: request }
16436 }
16437 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16438 Self::write_header(buf);
16439 PushDevlink::new(buf)
16440 }
16441 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16442 PushDevlink::new(self.request.buf_mut())
16443 }
16444 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16445 PushDevlink::new(self.request.buf)
16446 }
16447 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16448 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16449 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16450 }
16451 fn write_header<Prev: Rec>(prev: &mut Prev) {
16452 let mut header = BuiltinNfgenmsg::new();
16453 header.cmd = 9u8;
16454 header.version = 1u8;
16455 prev.as_rec_mut().extend(header.as_slice());
16456 }
16457}
16458impl NetlinkRequest for OpPortSplitDo<'_> {
16459 fn protocol(&self) -> Protocol {
16460 Protocol::Generic("devlink".as_bytes())
16461 }
16462 fn flags(&self) -> u16 {
16463 self.request.flags
16464 }
16465 fn payload(&self) -> &[u8] {
16466 self.request.buf()
16467 }
16468 type ReplyType<'buf> = IterableDevlink<'buf>;
16469 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16470 Self::decode_request(buf)
16471 }
16472 fn lookup(
16473 buf: &[u8],
16474 offset: usize,
16475 missing_type: Option<u16>,
16476 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16477 Self::decode_request(buf).lookup_attr(offset, missing_type)
16478 }
16479}
16480#[doc = "Unplit devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
16481#[derive(Debug)]
16482pub struct OpPortUnsplitDo<'r> {
16483 request: Request<'r>,
16484}
16485impl<'r> OpPortUnsplitDo<'r> {
16486 pub fn new(mut request: Request<'r>) -> Self {
16487 Self::write_header(request.buf_mut());
16488 Self { request: request }
16489 }
16490 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16491 Self::write_header(buf);
16492 PushDevlink::new(buf)
16493 }
16494 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16495 PushDevlink::new(self.request.buf_mut())
16496 }
16497 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16498 PushDevlink::new(self.request.buf)
16499 }
16500 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16501 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16502 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16503 }
16504 fn write_header<Prev: Rec>(prev: &mut Prev) {
16505 let mut header = BuiltinNfgenmsg::new();
16506 header.cmd = 10u8;
16507 header.version = 1u8;
16508 prev.as_rec_mut().extend(header.as_slice());
16509 }
16510}
16511impl NetlinkRequest for OpPortUnsplitDo<'_> {
16512 fn protocol(&self) -> Protocol {
16513 Protocol::Generic("devlink".as_bytes())
16514 }
16515 fn flags(&self) -> u16 {
16516 self.request.flags
16517 }
16518 fn payload(&self) -> &[u8] {
16519 self.request.buf()
16520 }
16521 type ReplyType<'buf> = IterableDevlink<'buf>;
16522 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16523 Self::decode_request(buf)
16524 }
16525 fn lookup(
16526 buf: &[u8],
16527 offset: usize,
16528 missing_type: Option<u16>,
16529 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16530 Self::decode_request(buf).lookup_attr(offset, missing_type)
16531 }
16532}
16533#[doc = "Get shared buffer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n"]
16534#[derive(Debug)]
16535pub struct OpSbGetDump<'r> {
16536 request: Request<'r>,
16537}
16538impl<'r> OpSbGetDump<'r> {
16539 pub fn new(mut request: Request<'r>) -> Self {
16540 Self::write_header(request.buf_mut());
16541 Self {
16542 request: request.set_dump(),
16543 }
16544 }
16545 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16546 Self::write_header(buf);
16547 PushDevlink::new(buf)
16548 }
16549 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16550 PushDevlink::new(self.request.buf_mut())
16551 }
16552 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16553 PushDevlink::new(self.request.buf)
16554 }
16555 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16556 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16557 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16558 }
16559 fn write_header<Prev: Rec>(prev: &mut Prev) {
16560 let mut header = BuiltinNfgenmsg::new();
16561 header.cmd = 11u8;
16562 header.version = 1u8;
16563 prev.as_rec_mut().extend(header.as_slice());
16564 }
16565}
16566impl NetlinkRequest for OpSbGetDump<'_> {
16567 fn protocol(&self) -> Protocol {
16568 Protocol::Generic("devlink".as_bytes())
16569 }
16570 fn flags(&self) -> u16 {
16571 self.request.flags
16572 }
16573 fn payload(&self) -> &[u8] {
16574 self.request.buf()
16575 }
16576 type ReplyType<'buf> = IterableDevlink<'buf>;
16577 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16578 Self::decode_request(buf)
16579 }
16580 fn lookup(
16581 buf: &[u8],
16582 offset: usize,
16583 missing_type: Option<u16>,
16584 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16585 Self::decode_request(buf).lookup_attr(offset, missing_type)
16586 }
16587}
16588#[doc = "Get shared buffer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n"]
16589#[derive(Debug)]
16590pub struct OpSbGetDo<'r> {
16591 request: Request<'r>,
16592}
16593impl<'r> OpSbGetDo<'r> {
16594 pub fn new(mut request: Request<'r>) -> Self {
16595 Self::write_header(request.buf_mut());
16596 Self { request: request }
16597 }
16598 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16599 Self::write_header(buf);
16600 PushDevlink::new(buf)
16601 }
16602 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16603 PushDevlink::new(self.request.buf_mut())
16604 }
16605 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16606 PushDevlink::new(self.request.buf)
16607 }
16608 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16609 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16610 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16611 }
16612 fn write_header<Prev: Rec>(prev: &mut Prev) {
16613 let mut header = BuiltinNfgenmsg::new();
16614 header.cmd = 11u8;
16615 header.version = 1u8;
16616 prev.as_rec_mut().extend(header.as_slice());
16617 }
16618}
16619impl NetlinkRequest for OpSbGetDo<'_> {
16620 fn protocol(&self) -> Protocol {
16621 Protocol::Generic("devlink".as_bytes())
16622 }
16623 fn flags(&self) -> u16 {
16624 self.request.flags
16625 }
16626 fn payload(&self) -> &[u8] {
16627 self.request.buf()
16628 }
16629 type ReplyType<'buf> = IterableDevlink<'buf>;
16630 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16631 Self::decode_request(buf)
16632 }
16633 fn lookup(
16634 buf: &[u8],
16635 offset: usize,
16636 missing_type: Option<u16>,
16637 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16638 Self::decode_request(buf).lookup_attr(offset, missing_type)
16639 }
16640}
16641#[doc = "Get shared buffer pool instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
16642#[derive(Debug)]
16643pub struct OpSbPoolGetDump<'r> {
16644 request: Request<'r>,
16645}
16646impl<'r> OpSbPoolGetDump<'r> {
16647 pub fn new(mut request: Request<'r>) -> Self {
16648 Self::write_header(request.buf_mut());
16649 Self {
16650 request: request.set_dump(),
16651 }
16652 }
16653 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16654 Self::write_header(buf);
16655 PushDevlink::new(buf)
16656 }
16657 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16658 PushDevlink::new(self.request.buf_mut())
16659 }
16660 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16661 PushDevlink::new(self.request.buf)
16662 }
16663 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16664 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16665 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16666 }
16667 fn write_header<Prev: Rec>(prev: &mut Prev) {
16668 let mut header = BuiltinNfgenmsg::new();
16669 header.cmd = 15u8;
16670 header.version = 1u8;
16671 prev.as_rec_mut().extend(header.as_slice());
16672 }
16673}
16674impl NetlinkRequest for OpSbPoolGetDump<'_> {
16675 fn protocol(&self) -> Protocol {
16676 Protocol::Generic("devlink".as_bytes())
16677 }
16678 fn flags(&self) -> u16 {
16679 self.request.flags
16680 }
16681 fn payload(&self) -> &[u8] {
16682 self.request.buf()
16683 }
16684 type ReplyType<'buf> = IterableDevlink<'buf>;
16685 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16686 Self::decode_request(buf)
16687 }
16688 fn lookup(
16689 buf: &[u8],
16690 offset: usize,
16691 missing_type: Option<u16>,
16692 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16693 Self::decode_request(buf).lookup_attr(offset, missing_type)
16694 }
16695}
16696#[doc = "Get shared buffer pool instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
16697#[derive(Debug)]
16698pub struct OpSbPoolGetDo<'r> {
16699 request: Request<'r>,
16700}
16701impl<'r> OpSbPoolGetDo<'r> {
16702 pub fn new(mut request: Request<'r>) -> Self {
16703 Self::write_header(request.buf_mut());
16704 Self { request: request }
16705 }
16706 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16707 Self::write_header(buf);
16708 PushDevlink::new(buf)
16709 }
16710 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16711 PushDevlink::new(self.request.buf_mut())
16712 }
16713 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16714 PushDevlink::new(self.request.buf)
16715 }
16716 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16717 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16718 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16719 }
16720 fn write_header<Prev: Rec>(prev: &mut Prev) {
16721 let mut header = BuiltinNfgenmsg::new();
16722 header.cmd = 15u8;
16723 header.version = 1u8;
16724 prev.as_rec_mut().extend(header.as_slice());
16725 }
16726}
16727impl NetlinkRequest for OpSbPoolGetDo<'_> {
16728 fn protocol(&self) -> Protocol {
16729 Protocol::Generic("devlink".as_bytes())
16730 }
16731 fn flags(&self) -> u16 {
16732 self.request.flags
16733 }
16734 fn payload(&self) -> &[u8] {
16735 self.request.buf()
16736 }
16737 type ReplyType<'buf> = IterableDevlink<'buf>;
16738 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16739 Self::decode_request(buf)
16740 }
16741 fn lookup(
16742 buf: &[u8],
16743 offset: usize,
16744 missing_type: Option<u16>,
16745 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16746 Self::decode_request(buf).lookup_attr(offset, missing_type)
16747 }
16748}
16749#[doc = "Set shared buffer pool instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_pool_size()](PushDevlink::push_sb_pool_size)\n- [.push_sb_pool_threshold_type()](PushDevlink::push_sb_pool_threshold_type)\n"]
16750#[derive(Debug)]
16751pub struct OpSbPoolSetDo<'r> {
16752 request: Request<'r>,
16753}
16754impl<'r> OpSbPoolSetDo<'r> {
16755 pub fn new(mut request: Request<'r>) -> Self {
16756 Self::write_header(request.buf_mut());
16757 Self { request: request }
16758 }
16759 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16760 Self::write_header(buf);
16761 PushDevlink::new(buf)
16762 }
16763 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16764 PushDevlink::new(self.request.buf_mut())
16765 }
16766 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16767 PushDevlink::new(self.request.buf)
16768 }
16769 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16770 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16771 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16772 }
16773 fn write_header<Prev: Rec>(prev: &mut Prev) {
16774 let mut header = BuiltinNfgenmsg::new();
16775 header.cmd = 16u8;
16776 header.version = 1u8;
16777 prev.as_rec_mut().extend(header.as_slice());
16778 }
16779}
16780impl NetlinkRequest for OpSbPoolSetDo<'_> {
16781 fn protocol(&self) -> Protocol {
16782 Protocol::Generic("devlink".as_bytes())
16783 }
16784 fn flags(&self) -> u16 {
16785 self.request.flags
16786 }
16787 fn payload(&self) -> &[u8] {
16788 self.request.buf()
16789 }
16790 type ReplyType<'buf> = IterableDevlink<'buf>;
16791 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16792 Self::decode_request(buf)
16793 }
16794 fn lookup(
16795 buf: &[u8],
16796 offset: usize,
16797 missing_type: Option<u16>,
16798 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16799 Self::decode_request(buf).lookup_attr(offset, missing_type)
16800 }
16801}
16802#[doc = "Get shared buffer port\\-pool combinations and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
16803#[derive(Debug)]
16804pub struct OpSbPortPoolGetDump<'r> {
16805 request: Request<'r>,
16806}
16807impl<'r> OpSbPortPoolGetDump<'r> {
16808 pub fn new(mut request: Request<'r>) -> Self {
16809 Self::write_header(request.buf_mut());
16810 Self {
16811 request: request.set_dump(),
16812 }
16813 }
16814 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16815 Self::write_header(buf);
16816 PushDevlink::new(buf)
16817 }
16818 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16819 PushDevlink::new(self.request.buf_mut())
16820 }
16821 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16822 PushDevlink::new(self.request.buf)
16823 }
16824 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16825 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16826 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16827 }
16828 fn write_header<Prev: Rec>(prev: &mut Prev) {
16829 let mut header = BuiltinNfgenmsg::new();
16830 header.cmd = 19u8;
16831 header.version = 1u8;
16832 prev.as_rec_mut().extend(header.as_slice());
16833 }
16834}
16835impl NetlinkRequest for OpSbPortPoolGetDump<'_> {
16836 fn protocol(&self) -> Protocol {
16837 Protocol::Generic("devlink".as_bytes())
16838 }
16839 fn flags(&self) -> u16 {
16840 self.request.flags
16841 }
16842 fn payload(&self) -> &[u8] {
16843 self.request.buf()
16844 }
16845 type ReplyType<'buf> = IterableDevlink<'buf>;
16846 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16847 Self::decode_request(buf)
16848 }
16849 fn lookup(
16850 buf: &[u8],
16851 offset: usize,
16852 missing_type: Option<u16>,
16853 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16854 Self::decode_request(buf).lookup_attr(offset, missing_type)
16855 }
16856}
16857#[doc = "Get shared buffer port\\-pool combinations and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
16858#[derive(Debug)]
16859pub struct OpSbPortPoolGetDo<'r> {
16860 request: Request<'r>,
16861}
16862impl<'r> OpSbPortPoolGetDo<'r> {
16863 pub fn new(mut request: Request<'r>) -> Self {
16864 Self::write_header(request.buf_mut());
16865 Self { request: request }
16866 }
16867 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16868 Self::write_header(buf);
16869 PushDevlink::new(buf)
16870 }
16871 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16872 PushDevlink::new(self.request.buf_mut())
16873 }
16874 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16875 PushDevlink::new(self.request.buf)
16876 }
16877 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16878 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16879 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16880 }
16881 fn write_header<Prev: Rec>(prev: &mut Prev) {
16882 let mut header = BuiltinNfgenmsg::new();
16883 header.cmd = 19u8;
16884 header.version = 1u8;
16885 prev.as_rec_mut().extend(header.as_slice());
16886 }
16887}
16888impl NetlinkRequest for OpSbPortPoolGetDo<'_> {
16889 fn protocol(&self) -> Protocol {
16890 Protocol::Generic("devlink".as_bytes())
16891 }
16892 fn flags(&self) -> u16 {
16893 self.request.flags
16894 }
16895 fn payload(&self) -> &[u8] {
16896 self.request.buf()
16897 }
16898 type ReplyType<'buf> = IterableDevlink<'buf>;
16899 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16900 Self::decode_request(buf)
16901 }
16902 fn lookup(
16903 buf: &[u8],
16904 offset: usize,
16905 missing_type: Option<u16>,
16906 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16907 Self::decode_request(buf).lookup_attr(offset, missing_type)
16908 }
16909}
16910#[doc = "Set shared buffer port\\-pool combinations and threshold\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_threshold()](PushDevlink::push_sb_threshold)\n"]
16911#[derive(Debug)]
16912pub struct OpSbPortPoolSetDo<'r> {
16913 request: Request<'r>,
16914}
16915impl<'r> OpSbPortPoolSetDo<'r> {
16916 pub fn new(mut request: Request<'r>) -> Self {
16917 Self::write_header(request.buf_mut());
16918 Self { request: request }
16919 }
16920 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16921 Self::write_header(buf);
16922 PushDevlink::new(buf)
16923 }
16924 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16925 PushDevlink::new(self.request.buf_mut())
16926 }
16927 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16928 PushDevlink::new(self.request.buf)
16929 }
16930 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16931 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16932 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16933 }
16934 fn write_header<Prev: Rec>(prev: &mut Prev) {
16935 let mut header = BuiltinNfgenmsg::new();
16936 header.cmd = 20u8;
16937 header.version = 1u8;
16938 prev.as_rec_mut().extend(header.as_slice());
16939 }
16940}
16941impl NetlinkRequest for OpSbPortPoolSetDo<'_> {
16942 fn protocol(&self) -> Protocol {
16943 Protocol::Generic("devlink".as_bytes())
16944 }
16945 fn flags(&self) -> u16 {
16946 self.request.flags
16947 }
16948 fn payload(&self) -> &[u8] {
16949 self.request.buf()
16950 }
16951 type ReplyType<'buf> = IterableDevlink<'buf>;
16952 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
16953 Self::decode_request(buf)
16954 }
16955 fn lookup(
16956 buf: &[u8],
16957 offset: usize,
16958 missing_type: Option<u16>,
16959 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16960 Self::decode_request(buf).lookup_attr(offset, missing_type)
16961 }
16962}
16963#[doc = "Get shared buffer port\\-TC to pool bindings and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_type()](IterableDevlink::get_sb_pool_type)\n- [.get_sb_tc_index()](IterableDevlink::get_sb_tc_index)\n"]
16964#[derive(Debug)]
16965pub struct OpSbTcPoolBindGetDump<'r> {
16966 request: Request<'r>,
16967}
16968impl<'r> OpSbTcPoolBindGetDump<'r> {
16969 pub fn new(mut request: Request<'r>) -> Self {
16970 Self::write_header(request.buf_mut());
16971 Self {
16972 request: request.set_dump(),
16973 }
16974 }
16975 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
16976 Self::write_header(buf);
16977 PushDevlink::new(buf)
16978 }
16979 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
16980 PushDevlink::new(self.request.buf_mut())
16981 }
16982 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
16983 PushDevlink::new(self.request.buf)
16984 }
16985 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
16986 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
16987 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
16988 }
16989 fn write_header<Prev: Rec>(prev: &mut Prev) {
16990 let mut header = BuiltinNfgenmsg::new();
16991 header.cmd = 23u8;
16992 header.version = 1u8;
16993 prev.as_rec_mut().extend(header.as_slice());
16994 }
16995}
16996impl NetlinkRequest for OpSbTcPoolBindGetDump<'_> {
16997 fn protocol(&self) -> Protocol {
16998 Protocol::Generic("devlink".as_bytes())
16999 }
17000 fn flags(&self) -> u16 {
17001 self.request.flags
17002 }
17003 fn payload(&self) -> &[u8] {
17004 self.request.buf()
17005 }
17006 type ReplyType<'buf> = IterableDevlink<'buf>;
17007 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17008 Self::decode_request(buf)
17009 }
17010 fn lookup(
17011 buf: &[u8],
17012 offset: usize,
17013 missing_type: Option<u16>,
17014 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17015 Self::decode_request(buf).lookup_attr(offset, missing_type)
17016 }
17017}
17018#[doc = "Get shared buffer port\\-TC to pool bindings and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_type()](PushDevlink::push_sb_pool_type)\n- [.push_sb_tc_index()](PushDevlink::push_sb_tc_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_type()](IterableDevlink::get_sb_pool_type)\n- [.get_sb_tc_index()](IterableDevlink::get_sb_tc_index)\n"]
17019#[derive(Debug)]
17020pub struct OpSbTcPoolBindGetDo<'r> {
17021 request: Request<'r>,
17022}
17023impl<'r> OpSbTcPoolBindGetDo<'r> {
17024 pub fn new(mut request: Request<'r>) -> Self {
17025 Self::write_header(request.buf_mut());
17026 Self { request: request }
17027 }
17028 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17029 Self::write_header(buf);
17030 PushDevlink::new(buf)
17031 }
17032 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17033 PushDevlink::new(self.request.buf_mut())
17034 }
17035 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17036 PushDevlink::new(self.request.buf)
17037 }
17038 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17039 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17040 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17041 }
17042 fn write_header<Prev: Rec>(prev: &mut Prev) {
17043 let mut header = BuiltinNfgenmsg::new();
17044 header.cmd = 23u8;
17045 header.version = 1u8;
17046 prev.as_rec_mut().extend(header.as_slice());
17047 }
17048}
17049impl NetlinkRequest for OpSbTcPoolBindGetDo<'_> {
17050 fn protocol(&self) -> Protocol {
17051 Protocol::Generic("devlink".as_bytes())
17052 }
17053 fn flags(&self) -> u16 {
17054 self.request.flags
17055 }
17056 fn payload(&self) -> &[u8] {
17057 self.request.buf()
17058 }
17059 type ReplyType<'buf> = IterableDevlink<'buf>;
17060 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17061 Self::decode_request(buf)
17062 }
17063 fn lookup(
17064 buf: &[u8],
17065 offset: usize,
17066 missing_type: Option<u16>,
17067 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17068 Self::decode_request(buf).lookup_attr(offset, missing_type)
17069 }
17070}
17071#[doc = "Set shared buffer port\\-TC to pool bindings and threshold\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_pool_type()](PushDevlink::push_sb_pool_type)\n- [.push_sb_threshold()](PushDevlink::push_sb_threshold)\n- [.push_sb_tc_index()](PushDevlink::push_sb_tc_index)\n"]
17072#[derive(Debug)]
17073pub struct OpSbTcPoolBindSetDo<'r> {
17074 request: Request<'r>,
17075}
17076impl<'r> OpSbTcPoolBindSetDo<'r> {
17077 pub fn new(mut request: Request<'r>) -> Self {
17078 Self::write_header(request.buf_mut());
17079 Self { request: request }
17080 }
17081 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17082 Self::write_header(buf);
17083 PushDevlink::new(buf)
17084 }
17085 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17086 PushDevlink::new(self.request.buf_mut())
17087 }
17088 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17089 PushDevlink::new(self.request.buf)
17090 }
17091 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17092 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17093 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17094 }
17095 fn write_header<Prev: Rec>(prev: &mut Prev) {
17096 let mut header = BuiltinNfgenmsg::new();
17097 header.cmd = 24u8;
17098 header.version = 1u8;
17099 prev.as_rec_mut().extend(header.as_slice());
17100 }
17101}
17102impl NetlinkRequest for OpSbTcPoolBindSetDo<'_> {
17103 fn protocol(&self) -> Protocol {
17104 Protocol::Generic("devlink".as_bytes())
17105 }
17106 fn flags(&self) -> u16 {
17107 self.request.flags
17108 }
17109 fn payload(&self) -> &[u8] {
17110 self.request.buf()
17111 }
17112 type ReplyType<'buf> = IterableDevlink<'buf>;
17113 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17114 Self::decode_request(buf)
17115 }
17116 fn lookup(
17117 buf: &[u8],
17118 offset: usize,
17119 missing_type: Option<u16>,
17120 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17121 Self::decode_request(buf).lookup_attr(offset, missing_type)
17122 }
17123}
17124#[doc = "Take occupancy snapshot of shared buffer\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n"]
17125#[derive(Debug)]
17126pub struct OpSbOccSnapshotDo<'r> {
17127 request: Request<'r>,
17128}
17129impl<'r> OpSbOccSnapshotDo<'r> {
17130 pub fn new(mut request: Request<'r>) -> Self {
17131 Self::write_header(request.buf_mut());
17132 Self { request: request }
17133 }
17134 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17135 Self::write_header(buf);
17136 PushDevlink::new(buf)
17137 }
17138 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17139 PushDevlink::new(self.request.buf_mut())
17140 }
17141 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17142 PushDevlink::new(self.request.buf)
17143 }
17144 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17145 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17146 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17147 }
17148 fn write_header<Prev: Rec>(prev: &mut Prev) {
17149 let mut header = BuiltinNfgenmsg::new();
17150 header.cmd = 27u8;
17151 header.version = 1u8;
17152 prev.as_rec_mut().extend(header.as_slice());
17153 }
17154}
17155impl NetlinkRequest for OpSbOccSnapshotDo<'_> {
17156 fn protocol(&self) -> Protocol {
17157 Protocol::Generic("devlink".as_bytes())
17158 }
17159 fn flags(&self) -> u16 {
17160 self.request.flags
17161 }
17162 fn payload(&self) -> &[u8] {
17163 self.request.buf()
17164 }
17165 type ReplyType<'buf> = IterableDevlink<'buf>;
17166 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17167 Self::decode_request(buf)
17168 }
17169 fn lookup(
17170 buf: &[u8],
17171 offset: usize,
17172 missing_type: Option<u16>,
17173 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17174 Self::decode_request(buf).lookup_attr(offset, missing_type)
17175 }
17176}
17177#[doc = "Clear occupancy watermarks of shared buffer\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n"]
17178#[derive(Debug)]
17179pub struct OpSbOccMaxClearDo<'r> {
17180 request: Request<'r>,
17181}
17182impl<'r> OpSbOccMaxClearDo<'r> {
17183 pub fn new(mut request: Request<'r>) -> Self {
17184 Self::write_header(request.buf_mut());
17185 Self { request: request }
17186 }
17187 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17188 Self::write_header(buf);
17189 PushDevlink::new(buf)
17190 }
17191 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17192 PushDevlink::new(self.request.buf_mut())
17193 }
17194 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17195 PushDevlink::new(self.request.buf)
17196 }
17197 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17198 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17199 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17200 }
17201 fn write_header<Prev: Rec>(prev: &mut Prev) {
17202 let mut header = BuiltinNfgenmsg::new();
17203 header.cmd = 28u8;
17204 header.version = 1u8;
17205 prev.as_rec_mut().extend(header.as_slice());
17206 }
17207}
17208impl NetlinkRequest for OpSbOccMaxClearDo<'_> {
17209 fn protocol(&self) -> Protocol {
17210 Protocol::Generic("devlink".as_bytes())
17211 }
17212 fn flags(&self) -> u16 {
17213 self.request.flags
17214 }
17215 fn payload(&self) -> &[u8] {
17216 self.request.buf()
17217 }
17218 type ReplyType<'buf> = IterableDevlink<'buf>;
17219 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17220 Self::decode_request(buf)
17221 }
17222 fn lookup(
17223 buf: &[u8],
17224 offset: usize,
17225 missing_type: Option<u16>,
17226 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17227 Self::decode_request(buf).lookup_attr(offset, missing_type)
17228 }
17229}
17230#[doc = "Get eswitch attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_eswitch_mode()](IterableDevlink::get_eswitch_mode)\n- [.get_eswitch_inline_mode()](IterableDevlink::get_eswitch_inline_mode)\n- [.get_eswitch_encap_mode()](IterableDevlink::get_eswitch_encap_mode)\n"]
17231#[derive(Debug)]
17232pub struct OpEswitchGetDo<'r> {
17233 request: Request<'r>,
17234}
17235impl<'r> OpEswitchGetDo<'r> {
17236 pub fn new(mut request: Request<'r>) -> Self {
17237 Self::write_header(request.buf_mut());
17238 Self { request: request }
17239 }
17240 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17241 Self::write_header(buf);
17242 PushDevlink::new(buf)
17243 }
17244 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17245 PushDevlink::new(self.request.buf_mut())
17246 }
17247 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17248 PushDevlink::new(self.request.buf)
17249 }
17250 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17251 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17252 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17253 }
17254 fn write_header<Prev: Rec>(prev: &mut Prev) {
17255 let mut header = BuiltinNfgenmsg::new();
17256 header.cmd = 29u8;
17257 header.version = 1u8;
17258 prev.as_rec_mut().extend(header.as_slice());
17259 }
17260}
17261impl NetlinkRequest for OpEswitchGetDo<'_> {
17262 fn protocol(&self) -> Protocol {
17263 Protocol::Generic("devlink".as_bytes())
17264 }
17265 fn flags(&self) -> u16 {
17266 self.request.flags
17267 }
17268 fn payload(&self) -> &[u8] {
17269 self.request.buf()
17270 }
17271 type ReplyType<'buf> = IterableDevlink<'buf>;
17272 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17273 Self::decode_request(buf)
17274 }
17275 fn lookup(
17276 buf: &[u8],
17277 offset: usize,
17278 missing_type: Option<u16>,
17279 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17280 Self::decode_request(buf).lookup_attr(offset, missing_type)
17281 }
17282}
17283#[doc = "Set eswitch attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_eswitch_mode()](PushDevlink::push_eswitch_mode)\n- [.push_eswitch_inline_mode()](PushDevlink::push_eswitch_inline_mode)\n- [.push_eswitch_encap_mode()](PushDevlink::push_eswitch_encap_mode)\n"]
17284#[derive(Debug)]
17285pub struct OpEswitchSetDo<'r> {
17286 request: Request<'r>,
17287}
17288impl<'r> OpEswitchSetDo<'r> {
17289 pub fn new(mut request: Request<'r>) -> Self {
17290 Self::write_header(request.buf_mut());
17291 Self { request: request }
17292 }
17293 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17294 Self::write_header(buf);
17295 PushDevlink::new(buf)
17296 }
17297 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17298 PushDevlink::new(self.request.buf_mut())
17299 }
17300 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17301 PushDevlink::new(self.request.buf)
17302 }
17303 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17304 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17305 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17306 }
17307 fn write_header<Prev: Rec>(prev: &mut Prev) {
17308 let mut header = BuiltinNfgenmsg::new();
17309 header.cmd = 30u8;
17310 header.version = 1u8;
17311 prev.as_rec_mut().extend(header.as_slice());
17312 }
17313}
17314impl NetlinkRequest for OpEswitchSetDo<'_> {
17315 fn protocol(&self) -> Protocol {
17316 Protocol::Generic("devlink".as_bytes())
17317 }
17318 fn flags(&self) -> u16 {
17319 self.request.flags
17320 }
17321 fn payload(&self) -> &[u8] {
17322 self.request.buf()
17323 }
17324 type ReplyType<'buf> = IterableDevlink<'buf>;
17325 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17326 Self::decode_request(buf)
17327 }
17328 fn lookup(
17329 buf: &[u8],
17330 offset: usize,
17331 missing_type: Option<u16>,
17332 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17333 Self::decode_request(buf).lookup_attr(offset, missing_type)
17334 }
17335}
17336#[doc = "Get dpipe table attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_tables()](IterableDevlink::get_dpipe_tables)\n"]
17337#[derive(Debug)]
17338pub struct OpDpipeTableGetDo<'r> {
17339 request: Request<'r>,
17340}
17341impl<'r> OpDpipeTableGetDo<'r> {
17342 pub fn new(mut request: Request<'r>) -> Self {
17343 Self::write_header(request.buf_mut());
17344 Self { request: request }
17345 }
17346 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17347 Self::write_header(buf);
17348 PushDevlink::new(buf)
17349 }
17350 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17351 PushDevlink::new(self.request.buf_mut())
17352 }
17353 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17354 PushDevlink::new(self.request.buf)
17355 }
17356 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17357 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17358 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17359 }
17360 fn write_header<Prev: Rec>(prev: &mut Prev) {
17361 let mut header = BuiltinNfgenmsg::new();
17362 header.cmd = 31u8;
17363 header.version = 1u8;
17364 prev.as_rec_mut().extend(header.as_slice());
17365 }
17366}
17367impl NetlinkRequest for OpDpipeTableGetDo<'_> {
17368 fn protocol(&self) -> Protocol {
17369 Protocol::Generic("devlink".as_bytes())
17370 }
17371 fn flags(&self) -> u16 {
17372 self.request.flags
17373 }
17374 fn payload(&self) -> &[u8] {
17375 self.request.buf()
17376 }
17377 type ReplyType<'buf> = IterableDevlink<'buf>;
17378 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17379 Self::decode_request(buf)
17380 }
17381 fn lookup(
17382 buf: &[u8],
17383 offset: usize,
17384 missing_type: Option<u16>,
17385 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17386 Self::decode_request(buf).lookup_attr(offset, missing_type)
17387 }
17388}
17389#[doc = "Get dpipe entries attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_entries()](IterableDevlink::get_dpipe_entries)\n"]
17390#[derive(Debug)]
17391pub struct OpDpipeEntriesGetDo<'r> {
17392 request: Request<'r>,
17393}
17394impl<'r> OpDpipeEntriesGetDo<'r> {
17395 pub fn new(mut request: Request<'r>) -> Self {
17396 Self::write_header(request.buf_mut());
17397 Self { request: request }
17398 }
17399 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17400 Self::write_header(buf);
17401 PushDevlink::new(buf)
17402 }
17403 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17404 PushDevlink::new(self.request.buf_mut())
17405 }
17406 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17407 PushDevlink::new(self.request.buf)
17408 }
17409 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17410 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17411 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17412 }
17413 fn write_header<Prev: Rec>(prev: &mut Prev) {
17414 let mut header = BuiltinNfgenmsg::new();
17415 header.cmd = 32u8;
17416 header.version = 1u8;
17417 prev.as_rec_mut().extend(header.as_slice());
17418 }
17419}
17420impl NetlinkRequest for OpDpipeEntriesGetDo<'_> {
17421 fn protocol(&self) -> Protocol {
17422 Protocol::Generic("devlink".as_bytes())
17423 }
17424 fn flags(&self) -> u16 {
17425 self.request.flags
17426 }
17427 fn payload(&self) -> &[u8] {
17428 self.request.buf()
17429 }
17430 type ReplyType<'buf> = IterableDevlink<'buf>;
17431 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17432 Self::decode_request(buf)
17433 }
17434 fn lookup(
17435 buf: &[u8],
17436 offset: usize,
17437 missing_type: Option<u16>,
17438 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17439 Self::decode_request(buf).lookup_attr(offset, missing_type)
17440 }
17441}
17442#[doc = "Get dpipe headers attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_headers()](IterableDevlink::get_dpipe_headers)\n"]
17443#[derive(Debug)]
17444pub struct OpDpipeHeadersGetDo<'r> {
17445 request: Request<'r>,
17446}
17447impl<'r> OpDpipeHeadersGetDo<'r> {
17448 pub fn new(mut request: Request<'r>) -> Self {
17449 Self::write_header(request.buf_mut());
17450 Self { request: request }
17451 }
17452 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17453 Self::write_header(buf);
17454 PushDevlink::new(buf)
17455 }
17456 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17457 PushDevlink::new(self.request.buf_mut())
17458 }
17459 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17460 PushDevlink::new(self.request.buf)
17461 }
17462 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17463 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17464 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17465 }
17466 fn write_header<Prev: Rec>(prev: &mut Prev) {
17467 let mut header = BuiltinNfgenmsg::new();
17468 header.cmd = 33u8;
17469 header.version = 1u8;
17470 prev.as_rec_mut().extend(header.as_slice());
17471 }
17472}
17473impl NetlinkRequest for OpDpipeHeadersGetDo<'_> {
17474 fn protocol(&self) -> Protocol {
17475 Protocol::Generic("devlink".as_bytes())
17476 }
17477 fn flags(&self) -> u16 {
17478 self.request.flags
17479 }
17480 fn payload(&self) -> &[u8] {
17481 self.request.buf()
17482 }
17483 type ReplyType<'buf> = IterableDevlink<'buf>;
17484 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17485 Self::decode_request(buf)
17486 }
17487 fn lookup(
17488 buf: &[u8],
17489 offset: usize,
17490 missing_type: Option<u16>,
17491 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17492 Self::decode_request(buf).lookup_attr(offset, missing_type)
17493 }
17494}
17495#[doc = "Set dpipe counter attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n- [.push_dpipe_table_counters_enabled()](PushDevlink::push_dpipe_table_counters_enabled)\n"]
17496#[derive(Debug)]
17497pub struct OpDpipeTableCountersSetDo<'r> {
17498 request: Request<'r>,
17499}
17500impl<'r> OpDpipeTableCountersSetDo<'r> {
17501 pub fn new(mut request: Request<'r>) -> Self {
17502 Self::write_header(request.buf_mut());
17503 Self { request: request }
17504 }
17505 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17506 Self::write_header(buf);
17507 PushDevlink::new(buf)
17508 }
17509 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17510 PushDevlink::new(self.request.buf_mut())
17511 }
17512 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17513 PushDevlink::new(self.request.buf)
17514 }
17515 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17516 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17517 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17518 }
17519 fn write_header<Prev: Rec>(prev: &mut Prev) {
17520 let mut header = BuiltinNfgenmsg::new();
17521 header.cmd = 34u8;
17522 header.version = 1u8;
17523 prev.as_rec_mut().extend(header.as_slice());
17524 }
17525}
17526impl NetlinkRequest for OpDpipeTableCountersSetDo<'_> {
17527 fn protocol(&self) -> Protocol {
17528 Protocol::Generic("devlink".as_bytes())
17529 }
17530 fn flags(&self) -> u16 {
17531 self.request.flags
17532 }
17533 fn payload(&self) -> &[u8] {
17534 self.request.buf()
17535 }
17536 type ReplyType<'buf> = IterableDevlink<'buf>;
17537 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17538 Self::decode_request(buf)
17539 }
17540 fn lookup(
17541 buf: &[u8],
17542 offset: usize,
17543 missing_type: Option<u16>,
17544 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17545 Self::decode_request(buf).lookup_attr(offset, missing_type)
17546 }
17547}
17548#[doc = "Set resource attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_resource_id()](PushDevlink::push_resource_id)\n- [.push_resource_size()](PushDevlink::push_resource_size)\n"]
17549#[derive(Debug)]
17550pub struct OpResourceSetDo<'r> {
17551 request: Request<'r>,
17552}
17553impl<'r> OpResourceSetDo<'r> {
17554 pub fn new(mut request: Request<'r>) -> Self {
17555 Self::write_header(request.buf_mut());
17556 Self { request: request }
17557 }
17558 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17559 Self::write_header(buf);
17560 PushDevlink::new(buf)
17561 }
17562 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17563 PushDevlink::new(self.request.buf_mut())
17564 }
17565 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17566 PushDevlink::new(self.request.buf)
17567 }
17568 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17569 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17570 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17571 }
17572 fn write_header<Prev: Rec>(prev: &mut Prev) {
17573 let mut header = BuiltinNfgenmsg::new();
17574 header.cmd = 35u8;
17575 header.version = 1u8;
17576 prev.as_rec_mut().extend(header.as_slice());
17577 }
17578}
17579impl NetlinkRequest for OpResourceSetDo<'_> {
17580 fn protocol(&self) -> Protocol {
17581 Protocol::Generic("devlink".as_bytes())
17582 }
17583 fn flags(&self) -> u16 {
17584 self.request.flags
17585 }
17586 fn payload(&self) -> &[u8] {
17587 self.request.buf()
17588 }
17589 type ReplyType<'buf> = IterableDevlink<'buf>;
17590 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17591 Self::decode_request(buf)
17592 }
17593 fn lookup(
17594 buf: &[u8],
17595 offset: usize,
17596 missing_type: Option<u16>,
17597 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17598 Self::decode_request(buf).lookup_attr(offset, missing_type)
17599 }
17600}
17601#[doc = "Get resource attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_resource_list()](IterableDevlink::get_resource_list)\n"]
17602#[derive(Debug)]
17603pub struct OpResourceDumpDo<'r> {
17604 request: Request<'r>,
17605}
17606impl<'r> OpResourceDumpDo<'r> {
17607 pub fn new(mut request: Request<'r>) -> Self {
17608 Self::write_header(request.buf_mut());
17609 Self { request: request }
17610 }
17611 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17612 Self::write_header(buf);
17613 PushDevlink::new(buf)
17614 }
17615 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17616 PushDevlink::new(self.request.buf_mut())
17617 }
17618 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17619 PushDevlink::new(self.request.buf)
17620 }
17621 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17622 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17623 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17624 }
17625 fn write_header<Prev: Rec>(prev: &mut Prev) {
17626 let mut header = BuiltinNfgenmsg::new();
17627 header.cmd = 36u8;
17628 header.version = 1u8;
17629 prev.as_rec_mut().extend(header.as_slice());
17630 }
17631}
17632impl NetlinkRequest for OpResourceDumpDo<'_> {
17633 fn protocol(&self) -> Protocol {
17634 Protocol::Generic("devlink".as_bytes())
17635 }
17636 fn flags(&self) -> u16 {
17637 self.request.flags
17638 }
17639 fn payload(&self) -> &[u8] {
17640 self.request.buf()
17641 }
17642 type ReplyType<'buf> = IterableDevlink<'buf>;
17643 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17644 Self::decode_request(buf)
17645 }
17646 fn lookup(
17647 buf: &[u8],
17648 offset: usize,
17649 missing_type: Option<u16>,
17650 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17651 Self::decode_request(buf).lookup_attr(offset, missing_type)
17652 }
17653}
17654#[doc = "Reload devlink\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_netns_fd()](PushDevlink::push_netns_fd)\n- [.push_netns_pid()](PushDevlink::push_netns_pid)\n- [.push_netns_id()](PushDevlink::push_netns_id)\n- [.push_reload_action()](PushDevlink::push_reload_action)\n- [.push_reload_limits()](PushDevlink::push_reload_limits)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_actions_performed()](IterableDevlink::get_reload_actions_performed)\n"]
17655#[derive(Debug)]
17656pub struct OpReloadDo<'r> {
17657 request: Request<'r>,
17658}
17659impl<'r> OpReloadDo<'r> {
17660 pub fn new(mut request: Request<'r>) -> Self {
17661 Self::write_header(request.buf_mut());
17662 Self { request: request }
17663 }
17664 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17665 Self::write_header(buf);
17666 PushDevlink::new(buf)
17667 }
17668 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17669 PushDevlink::new(self.request.buf_mut())
17670 }
17671 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17672 PushDevlink::new(self.request.buf)
17673 }
17674 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17675 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17676 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17677 }
17678 fn write_header<Prev: Rec>(prev: &mut Prev) {
17679 let mut header = BuiltinNfgenmsg::new();
17680 header.cmd = 37u8;
17681 header.version = 1u8;
17682 prev.as_rec_mut().extend(header.as_slice());
17683 }
17684}
17685impl NetlinkRequest for OpReloadDo<'_> {
17686 fn protocol(&self) -> Protocol {
17687 Protocol::Generic("devlink".as_bytes())
17688 }
17689 fn flags(&self) -> u16 {
17690 self.request.flags
17691 }
17692 fn payload(&self) -> &[u8] {
17693 self.request.buf()
17694 }
17695 type ReplyType<'buf> = IterableDevlink<'buf>;
17696 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17697 Self::decode_request(buf)
17698 }
17699 fn lookup(
17700 buf: &[u8],
17701 offset: usize,
17702 missing_type: Option<u16>,
17703 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17704 Self::decode_request(buf).lookup_attr(offset, missing_type)
17705 }
17706}
17707#[doc = "Get param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_param_name()](IterableDevlink::get_param_name)\n"]
17708#[derive(Debug)]
17709pub struct OpParamGetDump<'r> {
17710 request: Request<'r>,
17711}
17712impl<'r> OpParamGetDump<'r> {
17713 pub fn new(mut request: Request<'r>) -> Self {
17714 Self::write_header(request.buf_mut());
17715 Self {
17716 request: request.set_dump(),
17717 }
17718 }
17719 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17720 Self::write_header(buf);
17721 PushDevlink::new(buf)
17722 }
17723 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17724 PushDevlink::new(self.request.buf_mut())
17725 }
17726 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17727 PushDevlink::new(self.request.buf)
17728 }
17729 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17730 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17731 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17732 }
17733 fn write_header<Prev: Rec>(prev: &mut Prev) {
17734 let mut header = BuiltinNfgenmsg::new();
17735 header.cmd = 38u8;
17736 header.version = 1u8;
17737 prev.as_rec_mut().extend(header.as_slice());
17738 }
17739}
17740impl NetlinkRequest for OpParamGetDump<'_> {
17741 fn protocol(&self) -> Protocol {
17742 Protocol::Generic("devlink".as_bytes())
17743 }
17744 fn flags(&self) -> u16 {
17745 self.request.flags
17746 }
17747 fn payload(&self) -> &[u8] {
17748 self.request.buf()
17749 }
17750 type ReplyType<'buf> = IterableDevlink<'buf>;
17751 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17752 Self::decode_request(buf)
17753 }
17754 fn lookup(
17755 buf: &[u8],
17756 offset: usize,
17757 missing_type: Option<u16>,
17758 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17759 Self::decode_request(buf).lookup_attr(offset, missing_type)
17760 }
17761}
17762#[doc = "Get param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_param_name()](PushDevlink::push_param_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_param_name()](IterableDevlink::get_param_name)\n"]
17763#[derive(Debug)]
17764pub struct OpParamGetDo<'r> {
17765 request: Request<'r>,
17766}
17767impl<'r> OpParamGetDo<'r> {
17768 pub fn new(mut request: Request<'r>) -> Self {
17769 Self::write_header(request.buf_mut());
17770 Self { request: request }
17771 }
17772 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17773 Self::write_header(buf);
17774 PushDevlink::new(buf)
17775 }
17776 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17777 PushDevlink::new(self.request.buf_mut())
17778 }
17779 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17780 PushDevlink::new(self.request.buf)
17781 }
17782 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17783 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17784 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17785 }
17786 fn write_header<Prev: Rec>(prev: &mut Prev) {
17787 let mut header = BuiltinNfgenmsg::new();
17788 header.cmd = 38u8;
17789 header.version = 1u8;
17790 prev.as_rec_mut().extend(header.as_slice());
17791 }
17792}
17793impl NetlinkRequest for OpParamGetDo<'_> {
17794 fn protocol(&self) -> Protocol {
17795 Protocol::Generic("devlink".as_bytes())
17796 }
17797 fn flags(&self) -> u16 {
17798 self.request.flags
17799 }
17800 fn payload(&self) -> &[u8] {
17801 self.request.buf()
17802 }
17803 type ReplyType<'buf> = IterableDevlink<'buf>;
17804 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17805 Self::decode_request(buf)
17806 }
17807 fn lookup(
17808 buf: &[u8],
17809 offset: usize,
17810 missing_type: Option<u16>,
17811 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17812 Self::decode_request(buf).lookup_attr(offset, missing_type)
17813 }
17814}
17815#[doc = "Set param instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_param_name()](PushDevlink::push_param_name)\n- [.push_param_type()](PushDevlink::push_param_type)\n- [.push_param_value_cmode()](PushDevlink::push_param_value_cmode)\n- [.push_param_reset_default()](PushDevlink::push_param_reset_default)\n"]
17816#[derive(Debug)]
17817pub struct OpParamSetDo<'r> {
17818 request: Request<'r>,
17819}
17820impl<'r> OpParamSetDo<'r> {
17821 pub fn new(mut request: Request<'r>) -> Self {
17822 Self::write_header(request.buf_mut());
17823 Self { request: request }
17824 }
17825 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17826 Self::write_header(buf);
17827 PushDevlink::new(buf)
17828 }
17829 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17830 PushDevlink::new(self.request.buf_mut())
17831 }
17832 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17833 PushDevlink::new(self.request.buf)
17834 }
17835 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17836 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17837 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17838 }
17839 fn write_header<Prev: Rec>(prev: &mut Prev) {
17840 let mut header = BuiltinNfgenmsg::new();
17841 header.cmd = 39u8;
17842 header.version = 1u8;
17843 prev.as_rec_mut().extend(header.as_slice());
17844 }
17845}
17846impl NetlinkRequest for OpParamSetDo<'_> {
17847 fn protocol(&self) -> Protocol {
17848 Protocol::Generic("devlink".as_bytes())
17849 }
17850 fn flags(&self) -> u16 {
17851 self.request.flags
17852 }
17853 fn payload(&self) -> &[u8] {
17854 self.request.buf()
17855 }
17856 type ReplyType<'buf> = IterableDevlink<'buf>;
17857 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17858 Self::decode_request(buf)
17859 }
17860 fn lookup(
17861 buf: &[u8],
17862 offset: usize,
17863 missing_type: Option<u16>,
17864 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17865 Self::decode_request(buf).lookup_attr(offset, missing_type)
17866 }
17867}
17868#[doc = "Get region instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
17869#[derive(Debug)]
17870pub struct OpRegionGetDump<'r> {
17871 request: Request<'r>,
17872}
17873impl<'r> OpRegionGetDump<'r> {
17874 pub fn new(mut request: Request<'r>) -> Self {
17875 Self::write_header(request.buf_mut());
17876 Self {
17877 request: request.set_dump(),
17878 }
17879 }
17880 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17881 Self::write_header(buf);
17882 PushDevlink::new(buf)
17883 }
17884 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17885 PushDevlink::new(self.request.buf_mut())
17886 }
17887 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17888 PushDevlink::new(self.request.buf)
17889 }
17890 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17891 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17892 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17893 }
17894 fn write_header<Prev: Rec>(prev: &mut Prev) {
17895 let mut header = BuiltinNfgenmsg::new();
17896 header.cmd = 42u8;
17897 header.version = 1u8;
17898 prev.as_rec_mut().extend(header.as_slice());
17899 }
17900}
17901impl NetlinkRequest for OpRegionGetDump<'_> {
17902 fn protocol(&self) -> Protocol {
17903 Protocol::Generic("devlink".as_bytes())
17904 }
17905 fn flags(&self) -> u16 {
17906 self.request.flags
17907 }
17908 fn payload(&self) -> &[u8] {
17909 self.request.buf()
17910 }
17911 type ReplyType<'buf> = IterableDevlink<'buf>;
17912 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17913 Self::decode_request(buf)
17914 }
17915 fn lookup(
17916 buf: &[u8],
17917 offset: usize,
17918 missing_type: Option<u16>,
17919 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17920 Self::decode_request(buf).lookup_attr(offset, missing_type)
17921 }
17922}
17923#[doc = "Get region instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
17924#[derive(Debug)]
17925pub struct OpRegionGetDo<'r> {
17926 request: Request<'r>,
17927}
17928impl<'r> OpRegionGetDo<'r> {
17929 pub fn new(mut request: Request<'r>) -> Self {
17930 Self::write_header(request.buf_mut());
17931 Self { request: request }
17932 }
17933 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17934 Self::write_header(buf);
17935 PushDevlink::new(buf)
17936 }
17937 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17938 PushDevlink::new(self.request.buf_mut())
17939 }
17940 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17941 PushDevlink::new(self.request.buf)
17942 }
17943 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17944 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17945 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17946 }
17947 fn write_header<Prev: Rec>(prev: &mut Prev) {
17948 let mut header = BuiltinNfgenmsg::new();
17949 header.cmd = 42u8;
17950 header.version = 1u8;
17951 prev.as_rec_mut().extend(header.as_slice());
17952 }
17953}
17954impl NetlinkRequest for OpRegionGetDo<'_> {
17955 fn protocol(&self) -> Protocol {
17956 Protocol::Generic("devlink".as_bytes())
17957 }
17958 fn flags(&self) -> u16 {
17959 self.request.flags
17960 }
17961 fn payload(&self) -> &[u8] {
17962 self.request.buf()
17963 }
17964 type ReplyType<'buf> = IterableDevlink<'buf>;
17965 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
17966 Self::decode_request(buf)
17967 }
17968 fn lookup(
17969 buf: &[u8],
17970 offset: usize,
17971 missing_type: Option<u16>,
17972 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17973 Self::decode_request(buf).lookup_attr(offset, missing_type)
17974 }
17975}
17976#[doc = "Create region snapshot\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n- [.get_region_snapshot_id()](IterableDevlink::get_region_snapshot_id)\n"]
17977#[derive(Debug)]
17978pub struct OpRegionNewDo<'r> {
17979 request: Request<'r>,
17980}
17981impl<'r> OpRegionNewDo<'r> {
17982 pub fn new(mut request: Request<'r>) -> Self {
17983 Self::write_header(request.buf_mut());
17984 Self { request: request }
17985 }
17986 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
17987 Self::write_header(buf);
17988 PushDevlink::new(buf)
17989 }
17990 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
17991 PushDevlink::new(self.request.buf_mut())
17992 }
17993 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
17994 PushDevlink::new(self.request.buf)
17995 }
17996 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
17997 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
17998 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
17999 }
18000 fn write_header<Prev: Rec>(prev: &mut Prev) {
18001 let mut header = BuiltinNfgenmsg::new();
18002 header.cmd = 44u8;
18003 header.version = 1u8;
18004 prev.as_rec_mut().extend(header.as_slice());
18005 }
18006}
18007impl NetlinkRequest for OpRegionNewDo<'_> {
18008 fn protocol(&self) -> Protocol {
18009 Protocol::Generic("devlink".as_bytes())
18010 }
18011 fn flags(&self) -> u16 {
18012 self.request.flags
18013 }
18014 fn payload(&self) -> &[u8] {
18015 self.request.buf()
18016 }
18017 type ReplyType<'buf> = IterableDevlink<'buf>;
18018 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18019 Self::decode_request(buf)
18020 }
18021 fn lookup(
18022 buf: &[u8],
18023 offset: usize,
18024 missing_type: Option<u16>,
18025 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18026 Self::decode_request(buf).lookup_attr(offset, missing_type)
18027 }
18028}
18029#[doc = "Delete region snapshot\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n"]
18030#[derive(Debug)]
18031pub struct OpRegionDelDo<'r> {
18032 request: Request<'r>,
18033}
18034impl<'r> OpRegionDelDo<'r> {
18035 pub fn new(mut request: Request<'r>) -> Self {
18036 Self::write_header(request.buf_mut());
18037 Self { request: request }
18038 }
18039 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18040 Self::write_header(buf);
18041 PushDevlink::new(buf)
18042 }
18043 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18044 PushDevlink::new(self.request.buf_mut())
18045 }
18046 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18047 PushDevlink::new(self.request.buf)
18048 }
18049 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18050 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18051 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18052 }
18053 fn write_header<Prev: Rec>(prev: &mut Prev) {
18054 let mut header = BuiltinNfgenmsg::new();
18055 header.cmd = 45u8;
18056 header.version = 1u8;
18057 prev.as_rec_mut().extend(header.as_slice());
18058 }
18059}
18060impl NetlinkRequest for OpRegionDelDo<'_> {
18061 fn protocol(&self) -> Protocol {
18062 Protocol::Generic("devlink".as_bytes())
18063 }
18064 fn flags(&self) -> u16 {
18065 self.request.flags
18066 }
18067 fn payload(&self) -> &[u8] {
18068 self.request.buf()
18069 }
18070 type ReplyType<'buf> = IterableDevlink<'buf>;
18071 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18072 Self::decode_request(buf)
18073 }
18074 fn lookup(
18075 buf: &[u8],
18076 offset: usize,
18077 missing_type: Option<u16>,
18078 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18079 Self::decode_request(buf).lookup_attr(offset, missing_type)
18080 }
18081}
18082#[doc = "Read region data\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n- [.push_region_chunk_addr()](PushDevlink::push_region_chunk_addr)\n- [.push_region_chunk_len()](PushDevlink::push_region_chunk_len)\n- [.push_region_direct()](PushDevlink::push_region_direct)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
18083#[derive(Debug)]
18084pub struct OpRegionReadDump<'r> {
18085 request: Request<'r>,
18086}
18087impl<'r> OpRegionReadDump<'r> {
18088 pub fn new(mut request: Request<'r>) -> Self {
18089 Self::write_header(request.buf_mut());
18090 Self {
18091 request: request.set_dump(),
18092 }
18093 }
18094 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18095 Self::write_header(buf);
18096 PushDevlink::new(buf)
18097 }
18098 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18099 PushDevlink::new(self.request.buf_mut())
18100 }
18101 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18102 PushDevlink::new(self.request.buf)
18103 }
18104 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18105 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18106 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18107 }
18108 fn write_header<Prev: Rec>(prev: &mut Prev) {
18109 let mut header = BuiltinNfgenmsg::new();
18110 header.cmd = 46u8;
18111 header.version = 1u8;
18112 prev.as_rec_mut().extend(header.as_slice());
18113 }
18114}
18115impl NetlinkRequest for OpRegionReadDump<'_> {
18116 fn protocol(&self) -> Protocol {
18117 Protocol::Generic("devlink".as_bytes())
18118 }
18119 fn flags(&self) -> u16 {
18120 self.request.flags
18121 }
18122 fn payload(&self) -> &[u8] {
18123 self.request.buf()
18124 }
18125 type ReplyType<'buf> = IterableDevlink<'buf>;
18126 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18127 Self::decode_request(buf)
18128 }
18129 fn lookup(
18130 buf: &[u8],
18131 offset: usize,
18132 missing_type: Option<u16>,
18133 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18134 Self::decode_request(buf).lookup_attr(offset, missing_type)
18135 }
18136}
18137#[doc = "Get port param instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
18138#[derive(Debug)]
18139pub struct OpPortParamGetDump<'r> {
18140 request: Request<'r>,
18141}
18142impl<'r> OpPortParamGetDump<'r> {
18143 pub fn new(mut request: Request<'r>) -> Self {
18144 Self::write_header(request.buf_mut());
18145 Self {
18146 request: request.set_dump(),
18147 }
18148 }
18149 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18150 Self::write_header(buf);
18151 PushDevlink::new(buf)
18152 }
18153 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18154 PushDevlink::new(self.request.buf_mut())
18155 }
18156 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18157 PushDevlink::new(self.request.buf)
18158 }
18159 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18160 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18161 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18162 }
18163 fn write_header<Prev: Rec>(prev: &mut Prev) {
18164 let mut header = BuiltinNfgenmsg::new();
18165 header.cmd = 47u8;
18166 header.version = 1u8;
18167 prev.as_rec_mut().extend(header.as_slice());
18168 }
18169}
18170impl NetlinkRequest for OpPortParamGetDump<'_> {
18171 fn protocol(&self) -> Protocol {
18172 Protocol::Generic("devlink".as_bytes())
18173 }
18174 fn flags(&self) -> u16 {
18175 self.request.flags
18176 }
18177 fn payload(&self) -> &[u8] {
18178 self.request.buf()
18179 }
18180 type ReplyType<'buf> = IterableDevlink<'buf>;
18181 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18182 Self::decode_request(buf)
18183 }
18184 fn lookup(
18185 buf: &[u8],
18186 offset: usize,
18187 missing_type: Option<u16>,
18188 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18189 Self::decode_request(buf).lookup_attr(offset, missing_type)
18190 }
18191}
18192#[doc = "Get port param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
18193#[derive(Debug)]
18194pub struct OpPortParamGetDo<'r> {
18195 request: Request<'r>,
18196}
18197impl<'r> OpPortParamGetDo<'r> {
18198 pub fn new(mut request: Request<'r>) -> Self {
18199 Self::write_header(request.buf_mut());
18200 Self { request: request }
18201 }
18202 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18203 Self::write_header(buf);
18204 PushDevlink::new(buf)
18205 }
18206 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18207 PushDevlink::new(self.request.buf_mut())
18208 }
18209 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18210 PushDevlink::new(self.request.buf)
18211 }
18212 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18213 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18214 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18215 }
18216 fn write_header<Prev: Rec>(prev: &mut Prev) {
18217 let mut header = BuiltinNfgenmsg::new();
18218 header.cmd = 47u8;
18219 header.version = 1u8;
18220 prev.as_rec_mut().extend(header.as_slice());
18221 }
18222}
18223impl NetlinkRequest for OpPortParamGetDo<'_> {
18224 fn protocol(&self) -> Protocol {
18225 Protocol::Generic("devlink".as_bytes())
18226 }
18227 fn flags(&self) -> u16 {
18228 self.request.flags
18229 }
18230 fn payload(&self) -> &[u8] {
18231 self.request.buf()
18232 }
18233 type ReplyType<'buf> = IterableDevlink<'buf>;
18234 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18235 Self::decode_request(buf)
18236 }
18237 fn lookup(
18238 buf: &[u8],
18239 offset: usize,
18240 missing_type: Option<u16>,
18241 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18242 Self::decode_request(buf).lookup_attr(offset, missing_type)
18243 }
18244}
18245#[doc = "Set port param instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
18246#[derive(Debug)]
18247pub struct OpPortParamSetDo<'r> {
18248 request: Request<'r>,
18249}
18250impl<'r> OpPortParamSetDo<'r> {
18251 pub fn new(mut request: Request<'r>) -> Self {
18252 Self::write_header(request.buf_mut());
18253 Self { request: request }
18254 }
18255 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18256 Self::write_header(buf);
18257 PushDevlink::new(buf)
18258 }
18259 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18260 PushDevlink::new(self.request.buf_mut())
18261 }
18262 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18263 PushDevlink::new(self.request.buf)
18264 }
18265 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18266 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18267 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18268 }
18269 fn write_header<Prev: Rec>(prev: &mut Prev) {
18270 let mut header = BuiltinNfgenmsg::new();
18271 header.cmd = 48u8;
18272 header.version = 1u8;
18273 prev.as_rec_mut().extend(header.as_slice());
18274 }
18275}
18276impl NetlinkRequest for OpPortParamSetDo<'_> {
18277 fn protocol(&self) -> Protocol {
18278 Protocol::Generic("devlink".as_bytes())
18279 }
18280 fn flags(&self) -> u16 {
18281 self.request.flags
18282 }
18283 fn payload(&self) -> &[u8] {
18284 self.request.buf()
18285 }
18286 type ReplyType<'buf> = IterableDevlink<'buf>;
18287 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18288 Self::decode_request(buf)
18289 }
18290 fn lookup(
18291 buf: &[u8],
18292 offset: usize,
18293 missing_type: Option<u16>,
18294 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18295 Self::decode_request(buf).lookup_attr(offset, missing_type)
18296 }
18297}
18298#[doc = "Get device information, like driver name, hardware and firmware versions\netc\\.\n\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_info_driver_name()](IterableDevlink::get_info_driver_name)\n- [.get_info_serial_number()](IterableDevlink::get_info_serial_number)\n- [.get_info_version_fixed()](IterableDevlink::get_info_version_fixed)\n- [.get_info_version_running()](IterableDevlink::get_info_version_running)\n- [.get_info_version_stored()](IterableDevlink::get_info_version_stored)\n- [.get_info_board_serial_number()](IterableDevlink::get_info_board_serial_number)\n"]
18299#[derive(Debug)]
18300pub struct OpInfoGetDump<'r> {
18301 request: Request<'r>,
18302}
18303impl<'r> OpInfoGetDump<'r> {
18304 pub fn new(mut request: Request<'r>) -> Self {
18305 Self::write_header(request.buf_mut());
18306 Self {
18307 request: request.set_dump(),
18308 }
18309 }
18310 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18311 Self::write_header(buf);
18312 PushDevlink::new(buf)
18313 }
18314 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18315 PushDevlink::new(self.request.buf_mut())
18316 }
18317 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18318 PushDevlink::new(self.request.buf)
18319 }
18320 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18321 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18322 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18323 }
18324 fn write_header<Prev: Rec>(prev: &mut Prev) {
18325 let mut header = BuiltinNfgenmsg::new();
18326 header.cmd = 51u8;
18327 header.version = 1u8;
18328 prev.as_rec_mut().extend(header.as_slice());
18329 }
18330}
18331impl NetlinkRequest for OpInfoGetDump<'_> {
18332 fn protocol(&self) -> Protocol {
18333 Protocol::Generic("devlink".as_bytes())
18334 }
18335 fn flags(&self) -> u16 {
18336 self.request.flags
18337 }
18338 fn payload(&self) -> &[u8] {
18339 self.request.buf()
18340 }
18341 type ReplyType<'buf> = IterableDevlink<'buf>;
18342 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18343 Self::decode_request(buf)
18344 }
18345 fn lookup(
18346 buf: &[u8],
18347 offset: usize,
18348 missing_type: Option<u16>,
18349 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18350 Self::decode_request(buf).lookup_attr(offset, missing_type)
18351 }
18352}
18353#[doc = "Get device information, like driver name, hardware and firmware versions\netc\\.\n\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_info_driver_name()](IterableDevlink::get_info_driver_name)\n- [.get_info_serial_number()](IterableDevlink::get_info_serial_number)\n- [.get_info_version_fixed()](IterableDevlink::get_info_version_fixed)\n- [.get_info_version_running()](IterableDevlink::get_info_version_running)\n- [.get_info_version_stored()](IterableDevlink::get_info_version_stored)\n- [.get_info_board_serial_number()](IterableDevlink::get_info_board_serial_number)\n"]
18354#[derive(Debug)]
18355pub struct OpInfoGetDo<'r> {
18356 request: Request<'r>,
18357}
18358impl<'r> OpInfoGetDo<'r> {
18359 pub fn new(mut request: Request<'r>) -> Self {
18360 Self::write_header(request.buf_mut());
18361 Self { request: request }
18362 }
18363 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18364 Self::write_header(buf);
18365 PushDevlink::new(buf)
18366 }
18367 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18368 PushDevlink::new(self.request.buf_mut())
18369 }
18370 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18371 PushDevlink::new(self.request.buf)
18372 }
18373 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18374 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18375 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18376 }
18377 fn write_header<Prev: Rec>(prev: &mut Prev) {
18378 let mut header = BuiltinNfgenmsg::new();
18379 header.cmd = 51u8;
18380 header.version = 1u8;
18381 prev.as_rec_mut().extend(header.as_slice());
18382 }
18383}
18384impl NetlinkRequest for OpInfoGetDo<'_> {
18385 fn protocol(&self) -> Protocol {
18386 Protocol::Generic("devlink".as_bytes())
18387 }
18388 fn flags(&self) -> u16 {
18389 self.request.flags
18390 }
18391 fn payload(&self) -> &[u8] {
18392 self.request.buf()
18393 }
18394 type ReplyType<'buf> = IterableDevlink<'buf>;
18395 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18396 Self::decode_request(buf)
18397 }
18398 fn lookup(
18399 buf: &[u8],
18400 offset: usize,
18401 missing_type: Option<u16>,
18402 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18403 Self::decode_request(buf).lookup_attr(offset, missing_type)
18404 }
18405}
18406#[doc = "Get health reporter instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_health_reporter_name()](IterableDevlink::get_health_reporter_name)\n"]
18407#[derive(Debug)]
18408pub struct OpHealthReporterGetDump<'r> {
18409 request: Request<'r>,
18410}
18411impl<'r> OpHealthReporterGetDump<'r> {
18412 pub fn new(mut request: Request<'r>) -> Self {
18413 Self::write_header(request.buf_mut());
18414 Self {
18415 request: request.set_dump(),
18416 }
18417 }
18418 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18419 Self::write_header(buf);
18420 PushDevlink::new(buf)
18421 }
18422 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18423 PushDevlink::new(self.request.buf_mut())
18424 }
18425 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18426 PushDevlink::new(self.request.buf)
18427 }
18428 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18429 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18430 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18431 }
18432 fn write_header<Prev: Rec>(prev: &mut Prev) {
18433 let mut header = BuiltinNfgenmsg::new();
18434 header.cmd = 52u8;
18435 header.version = 1u8;
18436 prev.as_rec_mut().extend(header.as_slice());
18437 }
18438}
18439impl NetlinkRequest for OpHealthReporterGetDump<'_> {
18440 fn protocol(&self) -> Protocol {
18441 Protocol::Generic("devlink".as_bytes())
18442 }
18443 fn flags(&self) -> u16 {
18444 self.request.flags
18445 }
18446 fn payload(&self) -> &[u8] {
18447 self.request.buf()
18448 }
18449 type ReplyType<'buf> = IterableDevlink<'buf>;
18450 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18451 Self::decode_request(buf)
18452 }
18453 fn lookup(
18454 buf: &[u8],
18455 offset: usize,
18456 missing_type: Option<u16>,
18457 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18458 Self::decode_request(buf).lookup_attr(offset, missing_type)
18459 }
18460}
18461#[doc = "Get health reporter instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_health_reporter_name()](IterableDevlink::get_health_reporter_name)\n"]
18462#[derive(Debug)]
18463pub struct OpHealthReporterGetDo<'r> {
18464 request: Request<'r>,
18465}
18466impl<'r> OpHealthReporterGetDo<'r> {
18467 pub fn new(mut request: Request<'r>) -> Self {
18468 Self::write_header(request.buf_mut());
18469 Self { request: request }
18470 }
18471 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18472 Self::write_header(buf);
18473 PushDevlink::new(buf)
18474 }
18475 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18476 PushDevlink::new(self.request.buf_mut())
18477 }
18478 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18479 PushDevlink::new(self.request.buf)
18480 }
18481 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18482 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18483 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18484 }
18485 fn write_header<Prev: Rec>(prev: &mut Prev) {
18486 let mut header = BuiltinNfgenmsg::new();
18487 header.cmd = 52u8;
18488 header.version = 1u8;
18489 prev.as_rec_mut().extend(header.as_slice());
18490 }
18491}
18492impl NetlinkRequest for OpHealthReporterGetDo<'_> {
18493 fn protocol(&self) -> Protocol {
18494 Protocol::Generic("devlink".as_bytes())
18495 }
18496 fn flags(&self) -> u16 {
18497 self.request.flags
18498 }
18499 fn payload(&self) -> &[u8] {
18500 self.request.buf()
18501 }
18502 type ReplyType<'buf> = IterableDevlink<'buf>;
18503 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18504 Self::decode_request(buf)
18505 }
18506 fn lookup(
18507 buf: &[u8],
18508 offset: usize,
18509 missing_type: Option<u16>,
18510 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18511 Self::decode_request(buf).lookup_attr(offset, missing_type)
18512 }
18513}
18514#[doc = "Set health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n- [.push_health_reporter_graceful_period()](PushDevlink::push_health_reporter_graceful_period)\n- [.push_health_reporter_auto_recover()](PushDevlink::push_health_reporter_auto_recover)\n- [.push_health_reporter_auto_dump()](PushDevlink::push_health_reporter_auto_dump)\n- [.push_health_reporter_burst_period()](PushDevlink::push_health_reporter_burst_period)\n"]
18515#[derive(Debug)]
18516pub struct OpHealthReporterSetDo<'r> {
18517 request: Request<'r>,
18518}
18519impl<'r> OpHealthReporterSetDo<'r> {
18520 pub fn new(mut request: Request<'r>) -> Self {
18521 Self::write_header(request.buf_mut());
18522 Self { request: request }
18523 }
18524 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18525 Self::write_header(buf);
18526 PushDevlink::new(buf)
18527 }
18528 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18529 PushDevlink::new(self.request.buf_mut())
18530 }
18531 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18532 PushDevlink::new(self.request.buf)
18533 }
18534 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18535 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18536 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18537 }
18538 fn write_header<Prev: Rec>(prev: &mut Prev) {
18539 let mut header = BuiltinNfgenmsg::new();
18540 header.cmd = 53u8;
18541 header.version = 1u8;
18542 prev.as_rec_mut().extend(header.as_slice());
18543 }
18544}
18545impl NetlinkRequest for OpHealthReporterSetDo<'_> {
18546 fn protocol(&self) -> Protocol {
18547 Protocol::Generic("devlink".as_bytes())
18548 }
18549 fn flags(&self) -> u16 {
18550 self.request.flags
18551 }
18552 fn payload(&self) -> &[u8] {
18553 self.request.buf()
18554 }
18555 type ReplyType<'buf> = IterableDevlink<'buf>;
18556 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18557 Self::decode_request(buf)
18558 }
18559 fn lookup(
18560 buf: &[u8],
18561 offset: usize,
18562 missing_type: Option<u16>,
18563 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18564 Self::decode_request(buf).lookup_attr(offset, missing_type)
18565 }
18566}
18567#[doc = "Recover health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
18568#[derive(Debug)]
18569pub struct OpHealthReporterRecoverDo<'r> {
18570 request: Request<'r>,
18571}
18572impl<'r> OpHealthReporterRecoverDo<'r> {
18573 pub fn new(mut request: Request<'r>) -> Self {
18574 Self::write_header(request.buf_mut());
18575 Self { request: request }
18576 }
18577 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18578 Self::write_header(buf);
18579 PushDevlink::new(buf)
18580 }
18581 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18582 PushDevlink::new(self.request.buf_mut())
18583 }
18584 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18585 PushDevlink::new(self.request.buf)
18586 }
18587 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18588 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18589 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18590 }
18591 fn write_header<Prev: Rec>(prev: &mut Prev) {
18592 let mut header = BuiltinNfgenmsg::new();
18593 header.cmd = 54u8;
18594 header.version = 1u8;
18595 prev.as_rec_mut().extend(header.as_slice());
18596 }
18597}
18598impl NetlinkRequest for OpHealthReporterRecoverDo<'_> {
18599 fn protocol(&self) -> Protocol {
18600 Protocol::Generic("devlink".as_bytes())
18601 }
18602 fn flags(&self) -> u16 {
18603 self.request.flags
18604 }
18605 fn payload(&self) -> &[u8] {
18606 self.request.buf()
18607 }
18608 type ReplyType<'buf> = IterableDevlink<'buf>;
18609 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18610 Self::decode_request(buf)
18611 }
18612 fn lookup(
18613 buf: &[u8],
18614 offset: usize,
18615 missing_type: Option<u16>,
18616 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18617 Self::decode_request(buf).lookup_attr(offset, missing_type)
18618 }
18619}
18620#[doc = "Diagnose health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
18621#[derive(Debug)]
18622pub struct OpHealthReporterDiagnoseDo<'r> {
18623 request: Request<'r>,
18624}
18625impl<'r> OpHealthReporterDiagnoseDo<'r> {
18626 pub fn new(mut request: Request<'r>) -> Self {
18627 Self::write_header(request.buf_mut());
18628 Self { request: request }
18629 }
18630 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18631 Self::write_header(buf);
18632 PushDevlink::new(buf)
18633 }
18634 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18635 PushDevlink::new(self.request.buf_mut())
18636 }
18637 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18638 PushDevlink::new(self.request.buf)
18639 }
18640 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18641 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18642 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18643 }
18644 fn write_header<Prev: Rec>(prev: &mut Prev) {
18645 let mut header = BuiltinNfgenmsg::new();
18646 header.cmd = 55u8;
18647 header.version = 1u8;
18648 prev.as_rec_mut().extend(header.as_slice());
18649 }
18650}
18651impl NetlinkRequest for OpHealthReporterDiagnoseDo<'_> {
18652 fn protocol(&self) -> Protocol {
18653 Protocol::Generic("devlink".as_bytes())
18654 }
18655 fn flags(&self) -> u16 {
18656 self.request.flags
18657 }
18658 fn payload(&self) -> &[u8] {
18659 self.request.buf()
18660 }
18661 type ReplyType<'buf> = IterableDevlink<'buf>;
18662 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18663 Self::decode_request(buf)
18664 }
18665 fn lookup(
18666 buf: &[u8],
18667 offset: usize,
18668 missing_type: Option<u16>,
18669 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18670 Self::decode_request(buf).lookup_attr(offset, missing_type)
18671 }
18672}
18673#[doc = "Dump health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n\nReply attributes:\n- [.get_fmsg()](IterableDevlink::get_fmsg)\n"]
18674#[derive(Debug)]
18675pub struct OpHealthReporterDumpGetDump<'r> {
18676 request: Request<'r>,
18677}
18678impl<'r> OpHealthReporterDumpGetDump<'r> {
18679 pub fn new(mut request: Request<'r>) -> Self {
18680 Self::write_header(request.buf_mut());
18681 Self {
18682 request: request.set_dump(),
18683 }
18684 }
18685 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18686 Self::write_header(buf);
18687 PushDevlink::new(buf)
18688 }
18689 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18690 PushDevlink::new(self.request.buf_mut())
18691 }
18692 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18693 PushDevlink::new(self.request.buf)
18694 }
18695 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18696 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18697 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18698 }
18699 fn write_header<Prev: Rec>(prev: &mut Prev) {
18700 let mut header = BuiltinNfgenmsg::new();
18701 header.cmd = 56u8;
18702 header.version = 1u8;
18703 prev.as_rec_mut().extend(header.as_slice());
18704 }
18705}
18706impl NetlinkRequest for OpHealthReporterDumpGetDump<'_> {
18707 fn protocol(&self) -> Protocol {
18708 Protocol::Generic("devlink".as_bytes())
18709 }
18710 fn flags(&self) -> u16 {
18711 self.request.flags
18712 }
18713 fn payload(&self) -> &[u8] {
18714 self.request.buf()
18715 }
18716 type ReplyType<'buf> = IterableDevlink<'buf>;
18717 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18718 Self::decode_request(buf)
18719 }
18720 fn lookup(
18721 buf: &[u8],
18722 offset: usize,
18723 missing_type: Option<u16>,
18724 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18725 Self::decode_request(buf).lookup_attr(offset, missing_type)
18726 }
18727}
18728#[doc = "Clear dump of health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
18729#[derive(Debug)]
18730pub struct OpHealthReporterDumpClearDo<'r> {
18731 request: Request<'r>,
18732}
18733impl<'r> OpHealthReporterDumpClearDo<'r> {
18734 pub fn new(mut request: Request<'r>) -> Self {
18735 Self::write_header(request.buf_mut());
18736 Self { request: request }
18737 }
18738 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18739 Self::write_header(buf);
18740 PushDevlink::new(buf)
18741 }
18742 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18743 PushDevlink::new(self.request.buf_mut())
18744 }
18745 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18746 PushDevlink::new(self.request.buf)
18747 }
18748 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18749 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18750 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18751 }
18752 fn write_header<Prev: Rec>(prev: &mut Prev) {
18753 let mut header = BuiltinNfgenmsg::new();
18754 header.cmd = 57u8;
18755 header.version = 1u8;
18756 prev.as_rec_mut().extend(header.as_slice());
18757 }
18758}
18759impl NetlinkRequest for OpHealthReporterDumpClearDo<'_> {
18760 fn protocol(&self) -> Protocol {
18761 Protocol::Generic("devlink".as_bytes())
18762 }
18763 fn flags(&self) -> u16 {
18764 self.request.flags
18765 }
18766 fn payload(&self) -> &[u8] {
18767 self.request.buf()
18768 }
18769 type ReplyType<'buf> = IterableDevlink<'buf>;
18770 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18771 Self::decode_request(buf)
18772 }
18773 fn lookup(
18774 buf: &[u8],
18775 offset: usize,
18776 missing_type: Option<u16>,
18777 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18778 Self::decode_request(buf).lookup_attr(offset, missing_type)
18779 }
18780}
18781#[doc = "Flash update devlink instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_flash_update_file_name()](PushDevlink::push_flash_update_file_name)\n- [.push_flash_update_component()](PushDevlink::push_flash_update_component)\n- [.push_flash_update_overwrite_mask()](PushDevlink::push_flash_update_overwrite_mask)\n"]
18782#[derive(Debug)]
18783pub struct OpFlashUpdateDo<'r> {
18784 request: Request<'r>,
18785}
18786impl<'r> OpFlashUpdateDo<'r> {
18787 pub fn new(mut request: Request<'r>) -> Self {
18788 Self::write_header(request.buf_mut());
18789 Self { request: request }
18790 }
18791 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18792 Self::write_header(buf);
18793 PushDevlink::new(buf)
18794 }
18795 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18796 PushDevlink::new(self.request.buf_mut())
18797 }
18798 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18799 PushDevlink::new(self.request.buf)
18800 }
18801 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18802 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18803 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18804 }
18805 fn write_header<Prev: Rec>(prev: &mut Prev) {
18806 let mut header = BuiltinNfgenmsg::new();
18807 header.cmd = 58u8;
18808 header.version = 1u8;
18809 prev.as_rec_mut().extend(header.as_slice());
18810 }
18811}
18812impl NetlinkRequest for OpFlashUpdateDo<'_> {
18813 fn protocol(&self) -> Protocol {
18814 Protocol::Generic("devlink".as_bytes())
18815 }
18816 fn flags(&self) -> u16 {
18817 self.request.flags
18818 }
18819 fn payload(&self) -> &[u8] {
18820 self.request.buf()
18821 }
18822 type ReplyType<'buf> = IterableDevlink<'buf>;
18823 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18824 Self::decode_request(buf)
18825 }
18826 fn lookup(
18827 buf: &[u8],
18828 offset: usize,
18829 missing_type: Option<u16>,
18830 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18831 Self::decode_request(buf).lookup_attr(offset, missing_type)
18832 }
18833}
18834#[doc = "Get trap instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_name()](IterableDevlink::get_trap_name)\n"]
18835#[derive(Debug)]
18836pub struct OpTrapGetDump<'r> {
18837 request: Request<'r>,
18838}
18839impl<'r> OpTrapGetDump<'r> {
18840 pub fn new(mut request: Request<'r>) -> Self {
18841 Self::write_header(request.buf_mut());
18842 Self {
18843 request: request.set_dump(),
18844 }
18845 }
18846 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18847 Self::write_header(buf);
18848 PushDevlink::new(buf)
18849 }
18850 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18851 PushDevlink::new(self.request.buf_mut())
18852 }
18853 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18854 PushDevlink::new(self.request.buf)
18855 }
18856 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18857 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18858 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18859 }
18860 fn write_header<Prev: Rec>(prev: &mut Prev) {
18861 let mut header = BuiltinNfgenmsg::new();
18862 header.cmd = 61u8;
18863 header.version = 1u8;
18864 prev.as_rec_mut().extend(header.as_slice());
18865 }
18866}
18867impl NetlinkRequest for OpTrapGetDump<'_> {
18868 fn protocol(&self) -> Protocol {
18869 Protocol::Generic("devlink".as_bytes())
18870 }
18871 fn flags(&self) -> u16 {
18872 self.request.flags
18873 }
18874 fn payload(&self) -> &[u8] {
18875 self.request.buf()
18876 }
18877 type ReplyType<'buf> = IterableDevlink<'buf>;
18878 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18879 Self::decode_request(buf)
18880 }
18881 fn lookup(
18882 buf: &[u8],
18883 offset: usize,
18884 missing_type: Option<u16>,
18885 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18886 Self::decode_request(buf).lookup_attr(offset, missing_type)
18887 }
18888}
18889#[doc = "Get trap instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_name()](PushDevlink::push_trap_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_name()](IterableDevlink::get_trap_name)\n"]
18890#[derive(Debug)]
18891pub struct OpTrapGetDo<'r> {
18892 request: Request<'r>,
18893}
18894impl<'r> OpTrapGetDo<'r> {
18895 pub fn new(mut request: Request<'r>) -> Self {
18896 Self::write_header(request.buf_mut());
18897 Self { request: request }
18898 }
18899 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18900 Self::write_header(buf);
18901 PushDevlink::new(buf)
18902 }
18903 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18904 PushDevlink::new(self.request.buf_mut())
18905 }
18906 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18907 PushDevlink::new(self.request.buf)
18908 }
18909 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18910 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18911 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18912 }
18913 fn write_header<Prev: Rec>(prev: &mut Prev) {
18914 let mut header = BuiltinNfgenmsg::new();
18915 header.cmd = 61u8;
18916 header.version = 1u8;
18917 prev.as_rec_mut().extend(header.as_slice());
18918 }
18919}
18920impl NetlinkRequest for OpTrapGetDo<'_> {
18921 fn protocol(&self) -> Protocol {
18922 Protocol::Generic("devlink".as_bytes())
18923 }
18924 fn flags(&self) -> u16 {
18925 self.request.flags
18926 }
18927 fn payload(&self) -> &[u8] {
18928 self.request.buf()
18929 }
18930 type ReplyType<'buf> = IterableDevlink<'buf>;
18931 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18932 Self::decode_request(buf)
18933 }
18934 fn lookup(
18935 buf: &[u8],
18936 offset: usize,
18937 missing_type: Option<u16>,
18938 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18939 Self::decode_request(buf).lookup_attr(offset, missing_type)
18940 }
18941}
18942#[doc = "Set trap instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_name()](PushDevlink::push_trap_name)\n- [.push_trap_action()](PushDevlink::push_trap_action)\n"]
18943#[derive(Debug)]
18944pub struct OpTrapSetDo<'r> {
18945 request: Request<'r>,
18946}
18947impl<'r> OpTrapSetDo<'r> {
18948 pub fn new(mut request: Request<'r>) -> Self {
18949 Self::write_header(request.buf_mut());
18950 Self { request: request }
18951 }
18952 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
18953 Self::write_header(buf);
18954 PushDevlink::new(buf)
18955 }
18956 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
18957 PushDevlink::new(self.request.buf_mut())
18958 }
18959 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
18960 PushDevlink::new(self.request.buf)
18961 }
18962 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
18963 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
18964 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
18965 }
18966 fn write_header<Prev: Rec>(prev: &mut Prev) {
18967 let mut header = BuiltinNfgenmsg::new();
18968 header.cmd = 62u8;
18969 header.version = 1u8;
18970 prev.as_rec_mut().extend(header.as_slice());
18971 }
18972}
18973impl NetlinkRequest for OpTrapSetDo<'_> {
18974 fn protocol(&self) -> Protocol {
18975 Protocol::Generic("devlink".as_bytes())
18976 }
18977 fn flags(&self) -> u16 {
18978 self.request.flags
18979 }
18980 fn payload(&self) -> &[u8] {
18981 self.request.buf()
18982 }
18983 type ReplyType<'buf> = IterableDevlink<'buf>;
18984 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
18985 Self::decode_request(buf)
18986 }
18987 fn lookup(
18988 buf: &[u8],
18989 offset: usize,
18990 missing_type: Option<u16>,
18991 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18992 Self::decode_request(buf).lookup_attr(offset, missing_type)
18993 }
18994}
18995#[doc = "Get trap group instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_group_name()](IterableDevlink::get_trap_group_name)\n"]
18996#[derive(Debug)]
18997pub struct OpTrapGroupGetDump<'r> {
18998 request: Request<'r>,
18999}
19000impl<'r> OpTrapGroupGetDump<'r> {
19001 pub fn new(mut request: Request<'r>) -> Self {
19002 Self::write_header(request.buf_mut());
19003 Self {
19004 request: request.set_dump(),
19005 }
19006 }
19007 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19008 Self::write_header(buf);
19009 PushDevlink::new(buf)
19010 }
19011 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19012 PushDevlink::new(self.request.buf_mut())
19013 }
19014 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19015 PushDevlink::new(self.request.buf)
19016 }
19017 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19018 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19019 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19020 }
19021 fn write_header<Prev: Rec>(prev: &mut Prev) {
19022 let mut header = BuiltinNfgenmsg::new();
19023 header.cmd = 65u8;
19024 header.version = 1u8;
19025 prev.as_rec_mut().extend(header.as_slice());
19026 }
19027}
19028impl NetlinkRequest for OpTrapGroupGetDump<'_> {
19029 fn protocol(&self) -> Protocol {
19030 Protocol::Generic("devlink".as_bytes())
19031 }
19032 fn flags(&self) -> u16 {
19033 self.request.flags
19034 }
19035 fn payload(&self) -> &[u8] {
19036 self.request.buf()
19037 }
19038 type ReplyType<'buf> = IterableDevlink<'buf>;
19039 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19040 Self::decode_request(buf)
19041 }
19042 fn lookup(
19043 buf: &[u8],
19044 offset: usize,
19045 missing_type: Option<u16>,
19046 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19047 Self::decode_request(buf).lookup_attr(offset, missing_type)
19048 }
19049}
19050#[doc = "Get trap group instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_group_name()](PushDevlink::push_trap_group_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_group_name()](IterableDevlink::get_trap_group_name)\n"]
19051#[derive(Debug)]
19052pub struct OpTrapGroupGetDo<'r> {
19053 request: Request<'r>,
19054}
19055impl<'r> OpTrapGroupGetDo<'r> {
19056 pub fn new(mut request: Request<'r>) -> Self {
19057 Self::write_header(request.buf_mut());
19058 Self { request: request }
19059 }
19060 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19061 Self::write_header(buf);
19062 PushDevlink::new(buf)
19063 }
19064 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19065 PushDevlink::new(self.request.buf_mut())
19066 }
19067 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19068 PushDevlink::new(self.request.buf)
19069 }
19070 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19071 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19072 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19073 }
19074 fn write_header<Prev: Rec>(prev: &mut Prev) {
19075 let mut header = BuiltinNfgenmsg::new();
19076 header.cmd = 65u8;
19077 header.version = 1u8;
19078 prev.as_rec_mut().extend(header.as_slice());
19079 }
19080}
19081impl NetlinkRequest for OpTrapGroupGetDo<'_> {
19082 fn protocol(&self) -> Protocol {
19083 Protocol::Generic("devlink".as_bytes())
19084 }
19085 fn flags(&self) -> u16 {
19086 self.request.flags
19087 }
19088 fn payload(&self) -> &[u8] {
19089 self.request.buf()
19090 }
19091 type ReplyType<'buf> = IterableDevlink<'buf>;
19092 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19093 Self::decode_request(buf)
19094 }
19095 fn lookup(
19096 buf: &[u8],
19097 offset: usize,
19098 missing_type: Option<u16>,
19099 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19100 Self::decode_request(buf).lookup_attr(offset, missing_type)
19101 }
19102}
19103#[doc = "Set trap group instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_action()](PushDevlink::push_trap_action)\n- [.push_trap_group_name()](PushDevlink::push_trap_group_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n"]
19104#[derive(Debug)]
19105pub struct OpTrapGroupSetDo<'r> {
19106 request: Request<'r>,
19107}
19108impl<'r> OpTrapGroupSetDo<'r> {
19109 pub fn new(mut request: Request<'r>) -> Self {
19110 Self::write_header(request.buf_mut());
19111 Self { request: request }
19112 }
19113 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19114 Self::write_header(buf);
19115 PushDevlink::new(buf)
19116 }
19117 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19118 PushDevlink::new(self.request.buf_mut())
19119 }
19120 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19121 PushDevlink::new(self.request.buf)
19122 }
19123 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19124 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19125 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19126 }
19127 fn write_header<Prev: Rec>(prev: &mut Prev) {
19128 let mut header = BuiltinNfgenmsg::new();
19129 header.cmd = 66u8;
19130 header.version = 1u8;
19131 prev.as_rec_mut().extend(header.as_slice());
19132 }
19133}
19134impl NetlinkRequest for OpTrapGroupSetDo<'_> {
19135 fn protocol(&self) -> Protocol {
19136 Protocol::Generic("devlink".as_bytes())
19137 }
19138 fn flags(&self) -> u16 {
19139 self.request.flags
19140 }
19141 fn payload(&self) -> &[u8] {
19142 self.request.buf()
19143 }
19144 type ReplyType<'buf> = IterableDevlink<'buf>;
19145 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19146 Self::decode_request(buf)
19147 }
19148 fn lookup(
19149 buf: &[u8],
19150 offset: usize,
19151 missing_type: Option<u16>,
19152 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19153 Self::decode_request(buf).lookup_attr(offset, missing_type)
19154 }
19155}
19156#[doc = "Get trap policer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_policer_id()](IterableDevlink::get_trap_policer_id)\n"]
19157#[derive(Debug)]
19158pub struct OpTrapPolicerGetDump<'r> {
19159 request: Request<'r>,
19160}
19161impl<'r> OpTrapPolicerGetDump<'r> {
19162 pub fn new(mut request: Request<'r>) -> Self {
19163 Self::write_header(request.buf_mut());
19164 Self {
19165 request: request.set_dump(),
19166 }
19167 }
19168 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19169 Self::write_header(buf);
19170 PushDevlink::new(buf)
19171 }
19172 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19173 PushDevlink::new(self.request.buf_mut())
19174 }
19175 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19176 PushDevlink::new(self.request.buf)
19177 }
19178 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19179 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19180 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19181 }
19182 fn write_header<Prev: Rec>(prev: &mut Prev) {
19183 let mut header = BuiltinNfgenmsg::new();
19184 header.cmd = 69u8;
19185 header.version = 1u8;
19186 prev.as_rec_mut().extend(header.as_slice());
19187 }
19188}
19189impl NetlinkRequest for OpTrapPolicerGetDump<'_> {
19190 fn protocol(&self) -> Protocol {
19191 Protocol::Generic("devlink".as_bytes())
19192 }
19193 fn flags(&self) -> u16 {
19194 self.request.flags
19195 }
19196 fn payload(&self) -> &[u8] {
19197 self.request.buf()
19198 }
19199 type ReplyType<'buf> = IterableDevlink<'buf>;
19200 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19201 Self::decode_request(buf)
19202 }
19203 fn lookup(
19204 buf: &[u8],
19205 offset: usize,
19206 missing_type: Option<u16>,
19207 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19208 Self::decode_request(buf).lookup_attr(offset, missing_type)
19209 }
19210}
19211#[doc = "Get trap policer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_policer_id()](IterableDevlink::get_trap_policer_id)\n"]
19212#[derive(Debug)]
19213pub struct OpTrapPolicerGetDo<'r> {
19214 request: Request<'r>,
19215}
19216impl<'r> OpTrapPolicerGetDo<'r> {
19217 pub fn new(mut request: Request<'r>) -> Self {
19218 Self::write_header(request.buf_mut());
19219 Self { request: request }
19220 }
19221 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19222 Self::write_header(buf);
19223 PushDevlink::new(buf)
19224 }
19225 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19226 PushDevlink::new(self.request.buf_mut())
19227 }
19228 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19229 PushDevlink::new(self.request.buf)
19230 }
19231 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19232 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19233 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19234 }
19235 fn write_header<Prev: Rec>(prev: &mut Prev) {
19236 let mut header = BuiltinNfgenmsg::new();
19237 header.cmd = 69u8;
19238 header.version = 1u8;
19239 prev.as_rec_mut().extend(header.as_slice());
19240 }
19241}
19242impl NetlinkRequest for OpTrapPolicerGetDo<'_> {
19243 fn protocol(&self) -> Protocol {
19244 Protocol::Generic("devlink".as_bytes())
19245 }
19246 fn flags(&self) -> u16 {
19247 self.request.flags
19248 }
19249 fn payload(&self) -> &[u8] {
19250 self.request.buf()
19251 }
19252 type ReplyType<'buf> = IterableDevlink<'buf>;
19253 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19254 Self::decode_request(buf)
19255 }
19256 fn lookup(
19257 buf: &[u8],
19258 offset: usize,
19259 missing_type: Option<u16>,
19260 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19261 Self::decode_request(buf).lookup_attr(offset, missing_type)
19262 }
19263}
19264#[doc = "Get trap policer instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n- [.push_trap_policer_rate()](PushDevlink::push_trap_policer_rate)\n- [.push_trap_policer_burst()](PushDevlink::push_trap_policer_burst)\n"]
19265#[derive(Debug)]
19266pub struct OpTrapPolicerSetDo<'r> {
19267 request: Request<'r>,
19268}
19269impl<'r> OpTrapPolicerSetDo<'r> {
19270 pub fn new(mut request: Request<'r>) -> Self {
19271 Self::write_header(request.buf_mut());
19272 Self { request: request }
19273 }
19274 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19275 Self::write_header(buf);
19276 PushDevlink::new(buf)
19277 }
19278 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19279 PushDevlink::new(self.request.buf_mut())
19280 }
19281 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19282 PushDevlink::new(self.request.buf)
19283 }
19284 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19285 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19286 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19287 }
19288 fn write_header<Prev: Rec>(prev: &mut Prev) {
19289 let mut header = BuiltinNfgenmsg::new();
19290 header.cmd = 70u8;
19291 header.version = 1u8;
19292 prev.as_rec_mut().extend(header.as_slice());
19293 }
19294}
19295impl NetlinkRequest for OpTrapPolicerSetDo<'_> {
19296 fn protocol(&self) -> Protocol {
19297 Protocol::Generic("devlink".as_bytes())
19298 }
19299 fn flags(&self) -> u16 {
19300 self.request.flags
19301 }
19302 fn payload(&self) -> &[u8] {
19303 self.request.buf()
19304 }
19305 type ReplyType<'buf> = IterableDevlink<'buf>;
19306 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19307 Self::decode_request(buf)
19308 }
19309 fn lookup(
19310 buf: &[u8],
19311 offset: usize,
19312 missing_type: Option<u16>,
19313 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19314 Self::decode_request(buf).lookup_attr(offset, missing_type)
19315 }
19316}
19317#[doc = "Test health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
19318#[derive(Debug)]
19319pub struct OpHealthReporterTestDo<'r> {
19320 request: Request<'r>,
19321}
19322impl<'r> OpHealthReporterTestDo<'r> {
19323 pub fn new(mut request: Request<'r>) -> Self {
19324 Self::write_header(request.buf_mut());
19325 Self { request: request }
19326 }
19327 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19328 Self::write_header(buf);
19329 PushDevlink::new(buf)
19330 }
19331 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19332 PushDevlink::new(self.request.buf_mut())
19333 }
19334 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19335 PushDevlink::new(self.request.buf)
19336 }
19337 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19338 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19339 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19340 }
19341 fn write_header<Prev: Rec>(prev: &mut Prev) {
19342 let mut header = BuiltinNfgenmsg::new();
19343 header.cmd = 73u8;
19344 header.version = 1u8;
19345 prev.as_rec_mut().extend(header.as_slice());
19346 }
19347}
19348impl NetlinkRequest for OpHealthReporterTestDo<'_> {
19349 fn protocol(&self) -> Protocol {
19350 Protocol::Generic("devlink".as_bytes())
19351 }
19352 fn flags(&self) -> u16 {
19353 self.request.flags
19354 }
19355 fn payload(&self) -> &[u8] {
19356 self.request.buf()
19357 }
19358 type ReplyType<'buf> = IterableDevlink<'buf>;
19359 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19360 Self::decode_request(buf)
19361 }
19362 fn lookup(
19363 buf: &[u8],
19364 offset: usize,
19365 missing_type: Option<u16>,
19366 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19367 Self::decode_request(buf).lookup_attr(offset, missing_type)
19368 }
19369}
19370#[doc = "Get rate instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_rate_node_name()](IterableDevlink::get_rate_node_name)\n"]
19371#[derive(Debug)]
19372pub struct OpRateGetDump<'r> {
19373 request: Request<'r>,
19374}
19375impl<'r> OpRateGetDump<'r> {
19376 pub fn new(mut request: Request<'r>) -> Self {
19377 Self::write_header(request.buf_mut());
19378 Self {
19379 request: request.set_dump(),
19380 }
19381 }
19382 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19383 Self::write_header(buf);
19384 PushDevlink::new(buf)
19385 }
19386 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19387 PushDevlink::new(self.request.buf_mut())
19388 }
19389 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19390 PushDevlink::new(self.request.buf)
19391 }
19392 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19393 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19394 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19395 }
19396 fn write_header<Prev: Rec>(prev: &mut Prev) {
19397 let mut header = BuiltinNfgenmsg::new();
19398 header.cmd = 74u8;
19399 header.version = 1u8;
19400 prev.as_rec_mut().extend(header.as_slice());
19401 }
19402}
19403impl NetlinkRequest for OpRateGetDump<'_> {
19404 fn protocol(&self) -> Protocol {
19405 Protocol::Generic("devlink".as_bytes())
19406 }
19407 fn flags(&self) -> u16 {
19408 self.request.flags
19409 }
19410 fn payload(&self) -> &[u8] {
19411 self.request.buf()
19412 }
19413 type ReplyType<'buf> = IterableDevlink<'buf>;
19414 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19415 Self::decode_request(buf)
19416 }
19417 fn lookup(
19418 buf: &[u8],
19419 offset: usize,
19420 missing_type: Option<u16>,
19421 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19422 Self::decode_request(buf).lookup_attr(offset, missing_type)
19423 }
19424}
19425#[doc = "Get rate instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_rate_node_name()](IterableDevlink::get_rate_node_name)\n"]
19426#[derive(Debug)]
19427pub struct OpRateGetDo<'r> {
19428 request: Request<'r>,
19429}
19430impl<'r> OpRateGetDo<'r> {
19431 pub fn new(mut request: Request<'r>) -> Self {
19432 Self::write_header(request.buf_mut());
19433 Self { request: request }
19434 }
19435 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19436 Self::write_header(buf);
19437 PushDevlink::new(buf)
19438 }
19439 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19440 PushDevlink::new(self.request.buf_mut())
19441 }
19442 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19443 PushDevlink::new(self.request.buf)
19444 }
19445 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19446 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19447 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19448 }
19449 fn write_header<Prev: Rec>(prev: &mut Prev) {
19450 let mut header = BuiltinNfgenmsg::new();
19451 header.cmd = 74u8;
19452 header.version = 1u8;
19453 prev.as_rec_mut().extend(header.as_slice());
19454 }
19455}
19456impl NetlinkRequest for OpRateGetDo<'_> {
19457 fn protocol(&self) -> Protocol {
19458 Protocol::Generic("devlink".as_bytes())
19459 }
19460 fn flags(&self) -> u16 {
19461 self.request.flags
19462 }
19463 fn payload(&self) -> &[u8] {
19464 self.request.buf()
19465 }
19466 type ReplyType<'buf> = IterableDevlink<'buf>;
19467 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19468 Self::decode_request(buf)
19469 }
19470 fn lookup(
19471 buf: &[u8],
19472 offset: usize,
19473 missing_type: Option<u16>,
19474 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19475 Self::decode_request(buf).lookup_attr(offset, missing_type)
19476 }
19477}
19478#[doc = "Set rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_tx_share()](PushDevlink::push_rate_tx_share)\n- [.push_rate_tx_max()](PushDevlink::push_rate_tx_max)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n- [.push_rate_parent_node_name()](PushDevlink::push_rate_parent_node_name)\n- [.push_rate_tx_priority()](PushDevlink::push_rate_tx_priority)\n- [.push_rate_tx_weight()](PushDevlink::push_rate_tx_weight)\n- [.nested_rate_tc_bws()](PushDevlink::nested_rate_tc_bws)\n"]
19479#[derive(Debug)]
19480pub struct OpRateSetDo<'r> {
19481 request: Request<'r>,
19482}
19483impl<'r> OpRateSetDo<'r> {
19484 pub fn new(mut request: Request<'r>) -> Self {
19485 Self::write_header(request.buf_mut());
19486 Self { request: request }
19487 }
19488 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19489 Self::write_header(buf);
19490 PushDevlink::new(buf)
19491 }
19492 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19493 PushDevlink::new(self.request.buf_mut())
19494 }
19495 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19496 PushDevlink::new(self.request.buf)
19497 }
19498 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19499 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19500 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19501 }
19502 fn write_header<Prev: Rec>(prev: &mut Prev) {
19503 let mut header = BuiltinNfgenmsg::new();
19504 header.cmd = 75u8;
19505 header.version = 1u8;
19506 prev.as_rec_mut().extend(header.as_slice());
19507 }
19508}
19509impl NetlinkRequest for OpRateSetDo<'_> {
19510 fn protocol(&self) -> Protocol {
19511 Protocol::Generic("devlink".as_bytes())
19512 }
19513 fn flags(&self) -> u16 {
19514 self.request.flags
19515 }
19516 fn payload(&self) -> &[u8] {
19517 self.request.buf()
19518 }
19519 type ReplyType<'buf> = IterableDevlink<'buf>;
19520 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19521 Self::decode_request(buf)
19522 }
19523 fn lookup(
19524 buf: &[u8],
19525 offset: usize,
19526 missing_type: Option<u16>,
19527 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19528 Self::decode_request(buf).lookup_attr(offset, missing_type)
19529 }
19530}
19531#[doc = "Create rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_tx_share()](PushDevlink::push_rate_tx_share)\n- [.push_rate_tx_max()](PushDevlink::push_rate_tx_max)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n- [.push_rate_parent_node_name()](PushDevlink::push_rate_parent_node_name)\n- [.push_rate_tx_priority()](PushDevlink::push_rate_tx_priority)\n- [.push_rate_tx_weight()](PushDevlink::push_rate_tx_weight)\n- [.nested_rate_tc_bws()](PushDevlink::nested_rate_tc_bws)\n"]
19532#[derive(Debug)]
19533pub struct OpRateNewDo<'r> {
19534 request: Request<'r>,
19535}
19536impl<'r> OpRateNewDo<'r> {
19537 pub fn new(mut request: Request<'r>) -> Self {
19538 Self::write_header(request.buf_mut());
19539 Self { request: request }
19540 }
19541 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19542 Self::write_header(buf);
19543 PushDevlink::new(buf)
19544 }
19545 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19546 PushDevlink::new(self.request.buf_mut())
19547 }
19548 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19549 PushDevlink::new(self.request.buf)
19550 }
19551 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19552 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19553 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19554 }
19555 fn write_header<Prev: Rec>(prev: &mut Prev) {
19556 let mut header = BuiltinNfgenmsg::new();
19557 header.cmd = 76u8;
19558 header.version = 1u8;
19559 prev.as_rec_mut().extend(header.as_slice());
19560 }
19561}
19562impl NetlinkRequest for OpRateNewDo<'_> {
19563 fn protocol(&self) -> Protocol {
19564 Protocol::Generic("devlink".as_bytes())
19565 }
19566 fn flags(&self) -> u16 {
19567 self.request.flags
19568 }
19569 fn payload(&self) -> &[u8] {
19570 self.request.buf()
19571 }
19572 type ReplyType<'buf> = IterableDevlink<'buf>;
19573 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19574 Self::decode_request(buf)
19575 }
19576 fn lookup(
19577 buf: &[u8],
19578 offset: usize,
19579 missing_type: Option<u16>,
19580 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19581 Self::decode_request(buf).lookup_attr(offset, missing_type)
19582 }
19583}
19584#[doc = "Delete rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n"]
19585#[derive(Debug)]
19586pub struct OpRateDelDo<'r> {
19587 request: Request<'r>,
19588}
19589impl<'r> OpRateDelDo<'r> {
19590 pub fn new(mut request: Request<'r>) -> Self {
19591 Self::write_header(request.buf_mut());
19592 Self { request: request }
19593 }
19594 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19595 Self::write_header(buf);
19596 PushDevlink::new(buf)
19597 }
19598 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19599 PushDevlink::new(self.request.buf_mut())
19600 }
19601 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19602 PushDevlink::new(self.request.buf)
19603 }
19604 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19605 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19606 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19607 }
19608 fn write_header<Prev: Rec>(prev: &mut Prev) {
19609 let mut header = BuiltinNfgenmsg::new();
19610 header.cmd = 77u8;
19611 header.version = 1u8;
19612 prev.as_rec_mut().extend(header.as_slice());
19613 }
19614}
19615impl NetlinkRequest for OpRateDelDo<'_> {
19616 fn protocol(&self) -> Protocol {
19617 Protocol::Generic("devlink".as_bytes())
19618 }
19619 fn flags(&self) -> u16 {
19620 self.request.flags
19621 }
19622 fn payload(&self) -> &[u8] {
19623 self.request.buf()
19624 }
19625 type ReplyType<'buf> = IterableDevlink<'buf>;
19626 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19627 Self::decode_request(buf)
19628 }
19629 fn lookup(
19630 buf: &[u8],
19631 offset: usize,
19632 missing_type: Option<u16>,
19633 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19634 Self::decode_request(buf).lookup_attr(offset, missing_type)
19635 }
19636}
19637#[doc = "Get line card instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_linecard_index()](IterableDevlink::get_linecard_index)\n"]
19638#[derive(Debug)]
19639pub struct OpLinecardGetDump<'r> {
19640 request: Request<'r>,
19641}
19642impl<'r> OpLinecardGetDump<'r> {
19643 pub fn new(mut request: Request<'r>) -> Self {
19644 Self::write_header(request.buf_mut());
19645 Self {
19646 request: request.set_dump(),
19647 }
19648 }
19649 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19650 Self::write_header(buf);
19651 PushDevlink::new(buf)
19652 }
19653 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19654 PushDevlink::new(self.request.buf_mut())
19655 }
19656 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19657 PushDevlink::new(self.request.buf)
19658 }
19659 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19660 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19661 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19662 }
19663 fn write_header<Prev: Rec>(prev: &mut Prev) {
19664 let mut header = BuiltinNfgenmsg::new();
19665 header.cmd = 78u8;
19666 header.version = 1u8;
19667 prev.as_rec_mut().extend(header.as_slice());
19668 }
19669}
19670impl NetlinkRequest for OpLinecardGetDump<'_> {
19671 fn protocol(&self) -> Protocol {
19672 Protocol::Generic("devlink".as_bytes())
19673 }
19674 fn flags(&self) -> u16 {
19675 self.request.flags
19676 }
19677 fn payload(&self) -> &[u8] {
19678 self.request.buf()
19679 }
19680 type ReplyType<'buf> = IterableDevlink<'buf>;
19681 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19682 Self::decode_request(buf)
19683 }
19684 fn lookup(
19685 buf: &[u8],
19686 offset: usize,
19687 missing_type: Option<u16>,
19688 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19689 Self::decode_request(buf).lookup_attr(offset, missing_type)
19690 }
19691}
19692#[doc = "Get line card instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_linecard_index()](PushDevlink::push_linecard_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_linecard_index()](IterableDevlink::get_linecard_index)\n"]
19693#[derive(Debug)]
19694pub struct OpLinecardGetDo<'r> {
19695 request: Request<'r>,
19696}
19697impl<'r> OpLinecardGetDo<'r> {
19698 pub fn new(mut request: Request<'r>) -> Self {
19699 Self::write_header(request.buf_mut());
19700 Self { request: request }
19701 }
19702 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19703 Self::write_header(buf);
19704 PushDevlink::new(buf)
19705 }
19706 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19707 PushDevlink::new(self.request.buf_mut())
19708 }
19709 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19710 PushDevlink::new(self.request.buf)
19711 }
19712 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19713 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19714 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19715 }
19716 fn write_header<Prev: Rec>(prev: &mut Prev) {
19717 let mut header = BuiltinNfgenmsg::new();
19718 header.cmd = 78u8;
19719 header.version = 1u8;
19720 prev.as_rec_mut().extend(header.as_slice());
19721 }
19722}
19723impl NetlinkRequest for OpLinecardGetDo<'_> {
19724 fn protocol(&self) -> Protocol {
19725 Protocol::Generic("devlink".as_bytes())
19726 }
19727 fn flags(&self) -> u16 {
19728 self.request.flags
19729 }
19730 fn payload(&self) -> &[u8] {
19731 self.request.buf()
19732 }
19733 type ReplyType<'buf> = IterableDevlink<'buf>;
19734 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19735 Self::decode_request(buf)
19736 }
19737 fn lookup(
19738 buf: &[u8],
19739 offset: usize,
19740 missing_type: Option<u16>,
19741 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19742 Self::decode_request(buf).lookup_attr(offset, missing_type)
19743 }
19744}
19745#[doc = "Set line card instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_linecard_index()](PushDevlink::push_linecard_index)\n- [.push_linecard_type()](PushDevlink::push_linecard_type)\n"]
19746#[derive(Debug)]
19747pub struct OpLinecardSetDo<'r> {
19748 request: Request<'r>,
19749}
19750impl<'r> OpLinecardSetDo<'r> {
19751 pub fn new(mut request: Request<'r>) -> Self {
19752 Self::write_header(request.buf_mut());
19753 Self { request: request }
19754 }
19755 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19756 Self::write_header(buf);
19757 PushDevlink::new(buf)
19758 }
19759 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19760 PushDevlink::new(self.request.buf_mut())
19761 }
19762 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19763 PushDevlink::new(self.request.buf)
19764 }
19765 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19766 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19767 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19768 }
19769 fn write_header<Prev: Rec>(prev: &mut Prev) {
19770 let mut header = BuiltinNfgenmsg::new();
19771 header.cmd = 79u8;
19772 header.version = 1u8;
19773 prev.as_rec_mut().extend(header.as_slice());
19774 }
19775}
19776impl NetlinkRequest for OpLinecardSetDo<'_> {
19777 fn protocol(&self) -> Protocol {
19778 Protocol::Generic("devlink".as_bytes())
19779 }
19780 fn flags(&self) -> u16 {
19781 self.request.flags
19782 }
19783 fn payload(&self) -> &[u8] {
19784 self.request.buf()
19785 }
19786 type ReplyType<'buf> = IterableDevlink<'buf>;
19787 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19788 Self::decode_request(buf)
19789 }
19790 fn lookup(
19791 buf: &[u8],
19792 offset: usize,
19793 missing_type: Option<u16>,
19794 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19795 Self::decode_request(buf).lookup_attr(offset, missing_type)
19796 }
19797}
19798#[doc = "Get device selftest instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n"]
19799#[derive(Debug)]
19800pub struct OpSelftestsGetDump<'r> {
19801 request: Request<'r>,
19802}
19803impl<'r> OpSelftestsGetDump<'r> {
19804 pub fn new(mut request: Request<'r>) -> Self {
19805 Self::write_header(request.buf_mut());
19806 Self {
19807 request: request.set_dump(),
19808 }
19809 }
19810 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19811 Self::write_header(buf);
19812 PushDevlink::new(buf)
19813 }
19814 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19815 PushDevlink::new(self.request.buf_mut())
19816 }
19817 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19818 PushDevlink::new(self.request.buf)
19819 }
19820 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19821 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19822 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19823 }
19824 fn write_header<Prev: Rec>(prev: &mut Prev) {
19825 let mut header = BuiltinNfgenmsg::new();
19826 header.cmd = 82u8;
19827 header.version = 1u8;
19828 prev.as_rec_mut().extend(header.as_slice());
19829 }
19830}
19831impl NetlinkRequest for OpSelftestsGetDump<'_> {
19832 fn protocol(&self) -> Protocol {
19833 Protocol::Generic("devlink".as_bytes())
19834 }
19835 fn flags(&self) -> u16 {
19836 self.request.flags
19837 }
19838 fn payload(&self) -> &[u8] {
19839 self.request.buf()
19840 }
19841 type ReplyType<'buf> = IterableDevlink<'buf>;
19842 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19843 Self::decode_request(buf)
19844 }
19845 fn lookup(
19846 buf: &[u8],
19847 offset: usize,
19848 missing_type: Option<u16>,
19849 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19850 Self::decode_request(buf).lookup_attr(offset, missing_type)
19851 }
19852}
19853#[doc = "Get device selftest instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n"]
19854#[derive(Debug)]
19855pub struct OpSelftestsGetDo<'r> {
19856 request: Request<'r>,
19857}
19858impl<'r> OpSelftestsGetDo<'r> {
19859 pub fn new(mut request: Request<'r>) -> Self {
19860 Self::write_header(request.buf_mut());
19861 Self { request: request }
19862 }
19863 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19864 Self::write_header(buf);
19865 PushDevlink::new(buf)
19866 }
19867 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19868 PushDevlink::new(self.request.buf_mut())
19869 }
19870 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19871 PushDevlink::new(self.request.buf)
19872 }
19873 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19874 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19875 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19876 }
19877 fn write_header<Prev: Rec>(prev: &mut Prev) {
19878 let mut header = BuiltinNfgenmsg::new();
19879 header.cmd = 82u8;
19880 header.version = 1u8;
19881 prev.as_rec_mut().extend(header.as_slice());
19882 }
19883}
19884impl NetlinkRequest for OpSelftestsGetDo<'_> {
19885 fn protocol(&self) -> Protocol {
19886 Protocol::Generic("devlink".as_bytes())
19887 }
19888 fn flags(&self) -> u16 {
19889 self.request.flags
19890 }
19891 fn payload(&self) -> &[u8] {
19892 self.request.buf()
19893 }
19894 type ReplyType<'buf> = IterableDevlink<'buf>;
19895 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19896 Self::decode_request(buf)
19897 }
19898 fn lookup(
19899 buf: &[u8],
19900 offset: usize,
19901 missing_type: Option<u16>,
19902 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19903 Self::decode_request(buf).lookup_attr(offset, missing_type)
19904 }
19905}
19906#[doc = "Run device selftest instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.nested_selftests()](PushDevlink::nested_selftests)\n"]
19907#[derive(Debug)]
19908pub struct OpSelftestsRunDo<'r> {
19909 request: Request<'r>,
19910}
19911impl<'r> OpSelftestsRunDo<'r> {
19912 pub fn new(mut request: Request<'r>) -> Self {
19913 Self::write_header(request.buf_mut());
19914 Self { request: request }
19915 }
19916 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19917 Self::write_header(buf);
19918 PushDevlink::new(buf)
19919 }
19920 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19921 PushDevlink::new(self.request.buf_mut())
19922 }
19923 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19924 PushDevlink::new(self.request.buf)
19925 }
19926 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19927 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19928 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19929 }
19930 fn write_header<Prev: Rec>(prev: &mut Prev) {
19931 let mut header = BuiltinNfgenmsg::new();
19932 header.cmd = 83u8;
19933 header.version = 1u8;
19934 prev.as_rec_mut().extend(header.as_slice());
19935 }
19936}
19937impl NetlinkRequest for OpSelftestsRunDo<'_> {
19938 fn protocol(&self) -> Protocol {
19939 Protocol::Generic("devlink".as_bytes())
19940 }
19941 fn flags(&self) -> u16 {
19942 self.request.flags
19943 }
19944 fn payload(&self) -> &[u8] {
19945 self.request.buf()
19946 }
19947 type ReplyType<'buf> = IterableDevlink<'buf>;
19948 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
19949 Self::decode_request(buf)
19950 }
19951 fn lookup(
19952 buf: &[u8],
19953 offset: usize,
19954 missing_type: Option<u16>,
19955 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
19956 Self::decode_request(buf).lookup_attr(offset, missing_type)
19957 }
19958}
19959#[doc = "Set notification messages socket filter\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
19960#[derive(Debug)]
19961pub struct OpNotifyFilterSetDo<'r> {
19962 request: Request<'r>,
19963}
19964impl<'r> OpNotifyFilterSetDo<'r> {
19965 pub fn new(mut request: Request<'r>) -> Self {
19966 Self::write_header(request.buf_mut());
19967 Self { request: request }
19968 }
19969 pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushDevlink<&'buf mut Vec<u8>> {
19970 Self::write_header(buf);
19971 PushDevlink::new(buf)
19972 }
19973 pub fn encode(&mut self) -> PushDevlink<&mut Vec<u8>> {
19974 PushDevlink::new(self.request.buf_mut())
19975 }
19976 pub fn into_encoder(self) -> PushDevlink<RequestBuf<'r>> {
19977 PushDevlink::new(self.request.buf)
19978 }
19979 pub fn decode_request<'a>(buf: &'a [u8]) -> IterableDevlink<'a> {
19980 let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
19981 IterableDevlink::with_loc(attrs, buf.as_ptr() as usize)
19982 }
19983 fn write_header<Prev: Rec>(prev: &mut Prev) {
19984 let mut header = BuiltinNfgenmsg::new();
19985 header.cmd = 84u8;
19986 header.version = 1u8;
19987 prev.as_rec_mut().extend(header.as_slice());
19988 }
19989}
19990impl NetlinkRequest for OpNotifyFilterSetDo<'_> {
19991 fn protocol(&self) -> Protocol {
19992 Protocol::Generic("devlink".as_bytes())
19993 }
19994 fn flags(&self) -> u16 {
19995 self.request.flags
19996 }
19997 fn payload(&self) -> &[u8] {
19998 self.request.buf()
19999 }
20000 type ReplyType<'buf> = IterableDevlink<'buf>;
20001 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
20002 Self::decode_request(buf)
20003 }
20004 fn lookup(
20005 buf: &[u8],
20006 offset: usize,
20007 missing_type: Option<u16>,
20008 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
20009 Self::decode_request(buf).lookup_attr(offset, missing_type)
20010 }
20011}
20012use crate::traits::LookupFn;
20013use crate::utils::RequestBuf;
20014#[derive(Debug)]
20015pub struct Request<'buf> {
20016 buf: RequestBuf<'buf>,
20017 flags: u16,
20018 writeback: Option<&'buf mut Option<RequestInfo>>,
20019}
20020#[allow(unused)]
20021#[derive(Debug, Clone)]
20022pub struct RequestInfo {
20023 protocol: Protocol,
20024 flags: u16,
20025 name: &'static str,
20026 lookup: LookupFn,
20027}
20028impl Request<'static> {
20029 pub fn new() -> Self {
20030 Self::new_from_buf(Vec::new())
20031 }
20032 pub fn new_from_buf(buf: Vec<u8>) -> Self {
20033 Self {
20034 flags: 0,
20035 buf: RequestBuf::Own(buf),
20036 writeback: None,
20037 }
20038 }
20039 pub fn into_buf(self) -> Vec<u8> {
20040 match self.buf {
20041 RequestBuf::Own(buf) => buf,
20042 _ => unreachable!(),
20043 }
20044 }
20045}
20046impl<'buf> Request<'buf> {
20047 pub fn new_with_buf(buf: &'buf mut Vec<u8>) -> Self {
20048 buf.clear();
20049 Self::new_extend(buf)
20050 }
20051 pub fn new_extend(buf: &'buf mut Vec<u8>) -> Self {
20052 Self {
20053 flags: 0,
20054 buf: RequestBuf::Ref(buf),
20055 writeback: None,
20056 }
20057 }
20058 fn do_writeback(&mut self, protocol: Protocol, name: &'static str, lookup: LookupFn) {
20059 let Some(writeback) = &mut self.writeback else {
20060 return;
20061 };
20062 **writeback = Some(RequestInfo {
20063 protocol,
20064 flags: self.flags,
20065 name,
20066 lookup,
20067 })
20068 }
20069 pub fn buf(&self) -> &Vec<u8> {
20070 self.buf.buf()
20071 }
20072 pub fn buf_mut(&mut self) -> &mut Vec<u8> {
20073 self.buf.buf_mut()
20074 }
20075 #[doc = "Set `NLM_F_CREATE` flag"]
20076 pub fn set_create(mut self) -> Self {
20077 self.flags |= consts::NLM_F_CREATE as u16;
20078 self
20079 }
20080 #[doc = "Set `NLM_F_EXCL` flag"]
20081 pub fn set_excl(mut self) -> Self {
20082 self.flags |= consts::NLM_F_EXCL as u16;
20083 self
20084 }
20085 #[doc = "Set `NLM_F_REPLACE` flag"]
20086 pub fn set_replace(mut self) -> Self {
20087 self.flags |= consts::NLM_F_REPLACE as u16;
20088 self
20089 }
20090 #[doc = "Set `NLM_F_CREATE` and `NLM_F_REPLACE` flag"]
20091 pub fn set_change(self) -> Self {
20092 self.set_create().set_replace()
20093 }
20094 #[doc = "Set `NLM_F_APPEND` flag"]
20095 pub fn set_append(mut self) -> Self {
20096 self.flags |= consts::NLM_F_APPEND as u16;
20097 self
20098 }
20099 #[doc = "Set `self.flags |= flags`"]
20100 pub fn set_flags(mut self, flags: u16) -> Self {
20101 self.flags |= flags;
20102 self
20103 }
20104 #[doc = "Set `self.flags ^= self.flags & flags`"]
20105 pub fn unset_flags(mut self, flags: u16) -> Self {
20106 self.flags ^= self.flags & flags;
20107 self
20108 }
20109 #[doc = "Set `NLM_F_DUMP` flag"]
20110 fn set_dump(mut self) -> Self {
20111 self.flags |= consts::NLM_F_DUMP as u16;
20112 self
20113 }
20114 #[doc = "Get devlink instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_failed()](IterableDevlink::get_reload_failed)\n- [.get_dev_stats()](IterableDevlink::get_dev_stats)\n"]
20115 pub fn op_get_dump(self) -> OpGetDump<'buf> {
20116 let mut res = OpGetDump::new(self);
20117 res.request
20118 .do_writeback(res.protocol(), "op-get-dump", OpGetDump::lookup);
20119 res
20120 }
20121 #[doc = "Get devlink instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_failed()](IterableDevlink::get_reload_failed)\n- [.get_dev_stats()](IterableDevlink::get_dev_stats)\n"]
20122 pub fn op_get_do(self) -> OpGetDo<'buf> {
20123 let mut res = OpGetDo::new(self);
20124 res.request
20125 .do_writeback(res.protocol(), "op-get-do", OpGetDo::lookup);
20126 res
20127 }
20128 #[doc = "Get devlink port instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
20129 pub fn op_port_get_dump(self) -> OpPortGetDump<'buf> {
20130 let mut res = OpPortGetDump::new(self);
20131 res.request
20132 .do_writeback(res.protocol(), "op-port-get-dump", OpPortGetDump::lookup);
20133 res
20134 }
20135 #[doc = "Get devlink port instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
20136 pub fn op_port_get_do(self) -> OpPortGetDo<'buf> {
20137 let mut res = OpPortGetDo::new(self);
20138 res.request
20139 .do_writeback(res.protocol(), "op-port-get-do", OpPortGetDo::lookup);
20140 res
20141 }
20142 #[doc = "Set devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_type()](PushDevlink::push_port_type)\n- [.nested_port_function()](PushDevlink::nested_port_function)\n"]
20143 pub fn op_port_set_do(self) -> OpPortSetDo<'buf> {
20144 let mut res = OpPortSetDo::new(self);
20145 res.request
20146 .do_writeback(res.protocol(), "op-port-set-do", OpPortSetDo::lookup);
20147 res
20148 }
20149 #[doc = "Create devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_flavour()](PushDevlink::push_port_flavour)\n- [.push_port_pci_pf_number()](PushDevlink::push_port_pci_pf_number)\n- [.push_port_controller_number()](PushDevlink::push_port_controller_number)\n- [.push_port_pci_sf_number()](PushDevlink::push_port_pci_sf_number)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
20150 pub fn op_port_new_do(self) -> OpPortNewDo<'buf> {
20151 let mut res = OpPortNewDo::new(self);
20152 res.request
20153 .do_writeback(res.protocol(), "op-port-new-do", OpPortNewDo::lookup);
20154 res
20155 }
20156 #[doc = "Delete devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
20157 pub fn op_port_del_do(self) -> OpPortDelDo<'buf> {
20158 let mut res = OpPortDelDo::new(self);
20159 res.request
20160 .do_writeback(res.protocol(), "op-port-del-do", OpPortDelDo::lookup);
20161 res
20162 }
20163 #[doc = "Split devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_port_split_count()](PushDevlink::push_port_split_count)\n"]
20164 pub fn op_port_split_do(self) -> OpPortSplitDo<'buf> {
20165 let mut res = OpPortSplitDo::new(self);
20166 res.request
20167 .do_writeback(res.protocol(), "op-port-split-do", OpPortSplitDo::lookup);
20168 res
20169 }
20170 #[doc = "Unplit devlink port instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
20171 pub fn op_port_unsplit_do(self) -> OpPortUnsplitDo<'buf> {
20172 let mut res = OpPortUnsplitDo::new(self);
20173 res.request.do_writeback(
20174 res.protocol(),
20175 "op-port-unsplit-do",
20176 OpPortUnsplitDo::lookup,
20177 );
20178 res
20179 }
20180 #[doc = "Get shared buffer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n"]
20181 pub fn op_sb_get_dump(self) -> OpSbGetDump<'buf> {
20182 let mut res = OpSbGetDump::new(self);
20183 res.request
20184 .do_writeback(res.protocol(), "op-sb-get-dump", OpSbGetDump::lookup);
20185 res
20186 }
20187 #[doc = "Get shared buffer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n"]
20188 pub fn op_sb_get_do(self) -> OpSbGetDo<'buf> {
20189 let mut res = OpSbGetDo::new(self);
20190 res.request
20191 .do_writeback(res.protocol(), "op-sb-get-do", OpSbGetDo::lookup);
20192 res
20193 }
20194 #[doc = "Get shared buffer pool instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
20195 pub fn op_sb_pool_get_dump(self) -> OpSbPoolGetDump<'buf> {
20196 let mut res = OpSbPoolGetDump::new(self);
20197 res.request.do_writeback(
20198 res.protocol(),
20199 "op-sb-pool-get-dump",
20200 OpSbPoolGetDump::lookup,
20201 );
20202 res
20203 }
20204 #[doc = "Get shared buffer pool instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
20205 pub fn op_sb_pool_get_do(self) -> OpSbPoolGetDo<'buf> {
20206 let mut res = OpSbPoolGetDo::new(self);
20207 res.request
20208 .do_writeback(res.protocol(), "op-sb-pool-get-do", OpSbPoolGetDo::lookup);
20209 res
20210 }
20211 #[doc = "Set shared buffer pool instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_pool_size()](PushDevlink::push_sb_pool_size)\n- [.push_sb_pool_threshold_type()](PushDevlink::push_sb_pool_threshold_type)\n"]
20212 pub fn op_sb_pool_set_do(self) -> OpSbPoolSetDo<'buf> {
20213 let mut res = OpSbPoolSetDo::new(self);
20214 res.request
20215 .do_writeback(res.protocol(), "op-sb-pool-set-do", OpSbPoolSetDo::lookup);
20216 res
20217 }
20218 #[doc = "Get shared buffer port\\-pool combinations and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
20219 pub fn op_sb_port_pool_get_dump(self) -> OpSbPortPoolGetDump<'buf> {
20220 let mut res = OpSbPortPoolGetDump::new(self);
20221 res.request.do_writeback(
20222 res.protocol(),
20223 "op-sb-port-pool-get-dump",
20224 OpSbPortPoolGetDump::lookup,
20225 );
20226 res
20227 }
20228 #[doc = "Get shared buffer port\\-pool combinations and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_index()](IterableDevlink::get_sb_pool_index)\n"]
20229 pub fn op_sb_port_pool_get_do(self) -> OpSbPortPoolGetDo<'buf> {
20230 let mut res = OpSbPortPoolGetDo::new(self);
20231 res.request.do_writeback(
20232 res.protocol(),
20233 "op-sb-port-pool-get-do",
20234 OpSbPortPoolGetDo::lookup,
20235 );
20236 res
20237 }
20238 #[doc = "Set shared buffer port\\-pool combinations and threshold\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_threshold()](PushDevlink::push_sb_threshold)\n"]
20239 pub fn op_sb_port_pool_set_do(self) -> OpSbPortPoolSetDo<'buf> {
20240 let mut res = OpSbPortPoolSetDo::new(self);
20241 res.request.do_writeback(
20242 res.protocol(),
20243 "op-sb-port-pool-set-do",
20244 OpSbPortPoolSetDo::lookup,
20245 );
20246 res
20247 }
20248 #[doc = "Get shared buffer port\\-TC to pool bindings and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_type()](IterableDevlink::get_sb_pool_type)\n- [.get_sb_tc_index()](IterableDevlink::get_sb_tc_index)\n"]
20249 pub fn op_sb_tc_pool_bind_get_dump(self) -> OpSbTcPoolBindGetDump<'buf> {
20250 let mut res = OpSbTcPoolBindGetDump::new(self);
20251 res.request.do_writeback(
20252 res.protocol(),
20253 "op-sb-tc-pool-bind-get-dump",
20254 OpSbTcPoolBindGetDump::lookup,
20255 );
20256 res
20257 }
20258 #[doc = "Get shared buffer port\\-TC to pool bindings and threshold\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_type()](PushDevlink::push_sb_pool_type)\n- [.push_sb_tc_index()](PushDevlink::push_sb_tc_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_sb_index()](IterableDevlink::get_sb_index)\n- [.get_sb_pool_type()](IterableDevlink::get_sb_pool_type)\n- [.get_sb_tc_index()](IterableDevlink::get_sb_tc_index)\n"]
20259 pub fn op_sb_tc_pool_bind_get_do(self) -> OpSbTcPoolBindGetDo<'buf> {
20260 let mut res = OpSbTcPoolBindGetDo::new(self);
20261 res.request.do_writeback(
20262 res.protocol(),
20263 "op-sb-tc-pool-bind-get-do",
20264 OpSbTcPoolBindGetDo::lookup,
20265 );
20266 res
20267 }
20268 #[doc = "Set shared buffer port\\-TC to pool bindings and threshold\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n- [.push_sb_pool_index()](PushDevlink::push_sb_pool_index)\n- [.push_sb_pool_type()](PushDevlink::push_sb_pool_type)\n- [.push_sb_threshold()](PushDevlink::push_sb_threshold)\n- [.push_sb_tc_index()](PushDevlink::push_sb_tc_index)\n"]
20269 pub fn op_sb_tc_pool_bind_set_do(self) -> OpSbTcPoolBindSetDo<'buf> {
20270 let mut res = OpSbTcPoolBindSetDo::new(self);
20271 res.request.do_writeback(
20272 res.protocol(),
20273 "op-sb-tc-pool-bind-set-do",
20274 OpSbTcPoolBindSetDo::lookup,
20275 );
20276 res
20277 }
20278 #[doc = "Take occupancy snapshot of shared buffer\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n"]
20279 pub fn op_sb_occ_snapshot_do(self) -> OpSbOccSnapshotDo<'buf> {
20280 let mut res = OpSbOccSnapshotDo::new(self);
20281 res.request.do_writeback(
20282 res.protocol(),
20283 "op-sb-occ-snapshot-do",
20284 OpSbOccSnapshotDo::lookup,
20285 );
20286 res
20287 }
20288 #[doc = "Clear occupancy watermarks of shared buffer\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_sb_index()](PushDevlink::push_sb_index)\n"]
20289 pub fn op_sb_occ_max_clear_do(self) -> OpSbOccMaxClearDo<'buf> {
20290 let mut res = OpSbOccMaxClearDo::new(self);
20291 res.request.do_writeback(
20292 res.protocol(),
20293 "op-sb-occ-max-clear-do",
20294 OpSbOccMaxClearDo::lookup,
20295 );
20296 res
20297 }
20298 #[doc = "Get eswitch attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_eswitch_mode()](IterableDevlink::get_eswitch_mode)\n- [.get_eswitch_inline_mode()](IterableDevlink::get_eswitch_inline_mode)\n- [.get_eswitch_encap_mode()](IterableDevlink::get_eswitch_encap_mode)\n"]
20299 pub fn op_eswitch_get_do(self) -> OpEswitchGetDo<'buf> {
20300 let mut res = OpEswitchGetDo::new(self);
20301 res.request
20302 .do_writeback(res.protocol(), "op-eswitch-get-do", OpEswitchGetDo::lookup);
20303 res
20304 }
20305 #[doc = "Set eswitch attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_eswitch_mode()](PushDevlink::push_eswitch_mode)\n- [.push_eswitch_inline_mode()](PushDevlink::push_eswitch_inline_mode)\n- [.push_eswitch_encap_mode()](PushDevlink::push_eswitch_encap_mode)\n"]
20306 pub fn op_eswitch_set_do(self) -> OpEswitchSetDo<'buf> {
20307 let mut res = OpEswitchSetDo::new(self);
20308 res.request
20309 .do_writeback(res.protocol(), "op-eswitch-set-do", OpEswitchSetDo::lookup);
20310 res
20311 }
20312 #[doc = "Get dpipe table attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_tables()](IterableDevlink::get_dpipe_tables)\n"]
20313 pub fn op_dpipe_table_get_do(self) -> OpDpipeTableGetDo<'buf> {
20314 let mut res = OpDpipeTableGetDo::new(self);
20315 res.request.do_writeback(
20316 res.protocol(),
20317 "op-dpipe-table-get-do",
20318 OpDpipeTableGetDo::lookup,
20319 );
20320 res
20321 }
20322 #[doc = "Get dpipe entries attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_entries()](IterableDevlink::get_dpipe_entries)\n"]
20323 pub fn op_dpipe_entries_get_do(self) -> OpDpipeEntriesGetDo<'buf> {
20324 let mut res = OpDpipeEntriesGetDo::new(self);
20325 res.request.do_writeback(
20326 res.protocol(),
20327 "op-dpipe-entries-get-do",
20328 OpDpipeEntriesGetDo::lookup,
20329 );
20330 res
20331 }
20332 #[doc = "Get dpipe headers attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_dpipe_headers()](IterableDevlink::get_dpipe_headers)\n"]
20333 pub fn op_dpipe_headers_get_do(self) -> OpDpipeHeadersGetDo<'buf> {
20334 let mut res = OpDpipeHeadersGetDo::new(self);
20335 res.request.do_writeback(
20336 res.protocol(),
20337 "op-dpipe-headers-get-do",
20338 OpDpipeHeadersGetDo::lookup,
20339 );
20340 res
20341 }
20342 #[doc = "Set dpipe counter attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_dpipe_table_name()](PushDevlink::push_dpipe_table_name)\n- [.push_dpipe_table_counters_enabled()](PushDevlink::push_dpipe_table_counters_enabled)\n"]
20343 pub fn op_dpipe_table_counters_set_do(self) -> OpDpipeTableCountersSetDo<'buf> {
20344 let mut res = OpDpipeTableCountersSetDo::new(self);
20345 res.request.do_writeback(
20346 res.protocol(),
20347 "op-dpipe-table-counters-set-do",
20348 OpDpipeTableCountersSetDo::lookup,
20349 );
20350 res
20351 }
20352 #[doc = "Set resource attributes\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_resource_id()](PushDevlink::push_resource_id)\n- [.push_resource_size()](PushDevlink::push_resource_size)\n"]
20353 pub fn op_resource_set_do(self) -> OpResourceSetDo<'buf> {
20354 let mut res = OpResourceSetDo::new(self);
20355 res.request.do_writeback(
20356 res.protocol(),
20357 "op-resource-set-do",
20358 OpResourceSetDo::lookup,
20359 );
20360 res
20361 }
20362 #[doc = "Get resource attributes\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_resource_list()](IterableDevlink::get_resource_list)\n"]
20363 pub fn op_resource_dump_do(self) -> OpResourceDumpDo<'buf> {
20364 let mut res = OpResourceDumpDo::new(self);
20365 res.request.do_writeback(
20366 res.protocol(),
20367 "op-resource-dump-do",
20368 OpResourceDumpDo::lookup,
20369 );
20370 res
20371 }
20372 #[doc = "Reload devlink\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_netns_fd()](PushDevlink::push_netns_fd)\n- [.push_netns_pid()](PushDevlink::push_netns_pid)\n- [.push_netns_id()](PushDevlink::push_netns_id)\n- [.push_reload_action()](PushDevlink::push_reload_action)\n- [.push_reload_limits()](PushDevlink::push_reload_limits)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_reload_actions_performed()](IterableDevlink::get_reload_actions_performed)\n"]
20373 pub fn op_reload_do(self) -> OpReloadDo<'buf> {
20374 let mut res = OpReloadDo::new(self);
20375 res.request
20376 .do_writeback(res.protocol(), "op-reload-do", OpReloadDo::lookup);
20377 res
20378 }
20379 #[doc = "Get param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_param_name()](IterableDevlink::get_param_name)\n"]
20380 pub fn op_param_get_dump(self) -> OpParamGetDump<'buf> {
20381 let mut res = OpParamGetDump::new(self);
20382 res.request
20383 .do_writeback(res.protocol(), "op-param-get-dump", OpParamGetDump::lookup);
20384 res
20385 }
20386 #[doc = "Get param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_param_name()](PushDevlink::push_param_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_param_name()](IterableDevlink::get_param_name)\n"]
20387 pub fn op_param_get_do(self) -> OpParamGetDo<'buf> {
20388 let mut res = OpParamGetDo::new(self);
20389 res.request
20390 .do_writeback(res.protocol(), "op-param-get-do", OpParamGetDo::lookup);
20391 res
20392 }
20393 #[doc = "Set param instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_param_name()](PushDevlink::push_param_name)\n- [.push_param_type()](PushDevlink::push_param_type)\n- [.push_param_value_cmode()](PushDevlink::push_param_value_cmode)\n- [.push_param_reset_default()](PushDevlink::push_param_reset_default)\n"]
20394 pub fn op_param_set_do(self) -> OpParamSetDo<'buf> {
20395 let mut res = OpParamSetDo::new(self);
20396 res.request
20397 .do_writeback(res.protocol(), "op-param-set-do", OpParamSetDo::lookup);
20398 res
20399 }
20400 #[doc = "Get region instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
20401 pub fn op_region_get_dump(self) -> OpRegionGetDump<'buf> {
20402 let mut res = OpRegionGetDump::new(self);
20403 res.request.do_writeback(
20404 res.protocol(),
20405 "op-region-get-dump",
20406 OpRegionGetDump::lookup,
20407 );
20408 res
20409 }
20410 #[doc = "Get region instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
20411 pub fn op_region_get_do(self) -> OpRegionGetDo<'buf> {
20412 let mut res = OpRegionGetDo::new(self);
20413 res.request
20414 .do_writeback(res.protocol(), "op-region-get-do", OpRegionGetDo::lookup);
20415 res
20416 }
20417 #[doc = "Create region snapshot\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n- [.get_region_snapshot_id()](IterableDevlink::get_region_snapshot_id)\n"]
20418 pub fn op_region_new_do(self) -> OpRegionNewDo<'buf> {
20419 let mut res = OpRegionNewDo::new(self);
20420 res.request
20421 .do_writeback(res.protocol(), "op-region-new-do", OpRegionNewDo::lookup);
20422 res
20423 }
20424 #[doc = "Delete region snapshot\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n"]
20425 pub fn op_region_del_do(self) -> OpRegionDelDo<'buf> {
20426 let mut res = OpRegionDelDo::new(self);
20427 res.request
20428 .do_writeback(res.protocol(), "op-region-del-do", OpRegionDelDo::lookup);
20429 res
20430 }
20431 #[doc = "Read region data\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_region_name()](PushDevlink::push_region_name)\n- [.push_region_snapshot_id()](PushDevlink::push_region_snapshot_id)\n- [.push_region_chunk_addr()](PushDevlink::push_region_chunk_addr)\n- [.push_region_chunk_len()](PushDevlink::push_region_chunk_len)\n- [.push_region_direct()](PushDevlink::push_region_direct)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_region_name()](IterableDevlink::get_region_name)\n"]
20432 pub fn op_region_read_dump(self) -> OpRegionReadDump<'buf> {
20433 let mut res = OpRegionReadDump::new(self);
20434 res.request.do_writeback(
20435 res.protocol(),
20436 "op-region-read-dump",
20437 OpRegionReadDump::lookup,
20438 );
20439 res
20440 }
20441 #[doc = "Get port param instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
20442 pub fn op_port_param_get_dump(self) -> OpPortParamGetDump<'buf> {
20443 let mut res = OpPortParamGetDump::new(self);
20444 res.request.do_writeback(
20445 res.protocol(),
20446 "op-port-param-get-dump",
20447 OpPortParamGetDump::lookup,
20448 );
20449 res
20450 }
20451 #[doc = "Get port param instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n"]
20452 pub fn op_port_param_get_do(self) -> OpPortParamGetDo<'buf> {
20453 let mut res = OpPortParamGetDo::new(self);
20454 res.request.do_writeback(
20455 res.protocol(),
20456 "op-port-param-get-do",
20457 OpPortParamGetDo::lookup,
20458 );
20459 res
20460 }
20461 #[doc = "Set port param instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
20462 pub fn op_port_param_set_do(self) -> OpPortParamSetDo<'buf> {
20463 let mut res = OpPortParamSetDo::new(self);
20464 res.request.do_writeback(
20465 res.protocol(),
20466 "op-port-param-set-do",
20467 OpPortParamSetDo::lookup,
20468 );
20469 res
20470 }
20471 #[doc = "Get device information, like driver name, hardware and firmware versions\netc\\.\n\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_info_driver_name()](IterableDevlink::get_info_driver_name)\n- [.get_info_serial_number()](IterableDevlink::get_info_serial_number)\n- [.get_info_version_fixed()](IterableDevlink::get_info_version_fixed)\n- [.get_info_version_running()](IterableDevlink::get_info_version_running)\n- [.get_info_version_stored()](IterableDevlink::get_info_version_stored)\n- [.get_info_board_serial_number()](IterableDevlink::get_info_board_serial_number)\n"]
20472 pub fn op_info_get_dump(self) -> OpInfoGetDump<'buf> {
20473 let mut res = OpInfoGetDump::new(self);
20474 res.request
20475 .do_writeback(res.protocol(), "op-info-get-dump", OpInfoGetDump::lookup);
20476 res
20477 }
20478 #[doc = "Get device information, like driver name, hardware and firmware versions\netc\\.\n\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_info_driver_name()](IterableDevlink::get_info_driver_name)\n- [.get_info_serial_number()](IterableDevlink::get_info_serial_number)\n- [.get_info_version_fixed()](IterableDevlink::get_info_version_fixed)\n- [.get_info_version_running()](IterableDevlink::get_info_version_running)\n- [.get_info_version_stored()](IterableDevlink::get_info_version_stored)\n- [.get_info_board_serial_number()](IterableDevlink::get_info_board_serial_number)\n"]
20479 pub fn op_info_get_do(self) -> OpInfoGetDo<'buf> {
20480 let mut res = OpInfoGetDo::new(self);
20481 res.request
20482 .do_writeback(res.protocol(), "op-info-get-do", OpInfoGetDo::lookup);
20483 res
20484 }
20485 #[doc = "Get health reporter instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_health_reporter_name()](IterableDevlink::get_health_reporter_name)\n"]
20486 pub fn op_health_reporter_get_dump(self) -> OpHealthReporterGetDump<'buf> {
20487 let mut res = OpHealthReporterGetDump::new(self);
20488 res.request.do_writeback(
20489 res.protocol(),
20490 "op-health-reporter-get-dump",
20491 OpHealthReporterGetDump::lookup,
20492 );
20493 res
20494 }
20495 #[doc = "Get health reporter instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_health_reporter_name()](IterableDevlink::get_health_reporter_name)\n"]
20496 pub fn op_health_reporter_get_do(self) -> OpHealthReporterGetDo<'buf> {
20497 let mut res = OpHealthReporterGetDo::new(self);
20498 res.request.do_writeback(
20499 res.protocol(),
20500 "op-health-reporter-get-do",
20501 OpHealthReporterGetDo::lookup,
20502 );
20503 res
20504 }
20505 #[doc = "Set health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n- [.push_health_reporter_graceful_period()](PushDevlink::push_health_reporter_graceful_period)\n- [.push_health_reporter_auto_recover()](PushDevlink::push_health_reporter_auto_recover)\n- [.push_health_reporter_auto_dump()](PushDevlink::push_health_reporter_auto_dump)\n- [.push_health_reporter_burst_period()](PushDevlink::push_health_reporter_burst_period)\n"]
20506 pub fn op_health_reporter_set_do(self) -> OpHealthReporterSetDo<'buf> {
20507 let mut res = OpHealthReporterSetDo::new(self);
20508 res.request.do_writeback(
20509 res.protocol(),
20510 "op-health-reporter-set-do",
20511 OpHealthReporterSetDo::lookup,
20512 );
20513 res
20514 }
20515 #[doc = "Recover health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
20516 pub fn op_health_reporter_recover_do(self) -> OpHealthReporterRecoverDo<'buf> {
20517 let mut res = OpHealthReporterRecoverDo::new(self);
20518 res.request.do_writeback(
20519 res.protocol(),
20520 "op-health-reporter-recover-do",
20521 OpHealthReporterRecoverDo::lookup,
20522 );
20523 res
20524 }
20525 #[doc = "Diagnose health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
20526 pub fn op_health_reporter_diagnose_do(self) -> OpHealthReporterDiagnoseDo<'buf> {
20527 let mut res = OpHealthReporterDiagnoseDo::new(self);
20528 res.request.do_writeback(
20529 res.protocol(),
20530 "op-health-reporter-diagnose-do",
20531 OpHealthReporterDiagnoseDo::lookup,
20532 );
20533 res
20534 }
20535 #[doc = "Dump health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n\nReply attributes:\n- [.get_fmsg()](IterableDevlink::get_fmsg)\n"]
20536 pub fn op_health_reporter_dump_get_dump(self) -> OpHealthReporterDumpGetDump<'buf> {
20537 let mut res = OpHealthReporterDumpGetDump::new(self);
20538 res.request.do_writeback(
20539 res.protocol(),
20540 "op-health-reporter-dump-get-dump",
20541 OpHealthReporterDumpGetDump::lookup,
20542 );
20543 res
20544 }
20545 #[doc = "Clear dump of health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
20546 pub fn op_health_reporter_dump_clear_do(self) -> OpHealthReporterDumpClearDo<'buf> {
20547 let mut res = OpHealthReporterDumpClearDo::new(self);
20548 res.request.do_writeback(
20549 res.protocol(),
20550 "op-health-reporter-dump-clear-do",
20551 OpHealthReporterDumpClearDo::lookup,
20552 );
20553 res
20554 }
20555 #[doc = "Flash update devlink instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_flash_update_file_name()](PushDevlink::push_flash_update_file_name)\n- [.push_flash_update_component()](PushDevlink::push_flash_update_component)\n- [.push_flash_update_overwrite_mask()](PushDevlink::push_flash_update_overwrite_mask)\n"]
20556 pub fn op_flash_update_do(self) -> OpFlashUpdateDo<'buf> {
20557 let mut res = OpFlashUpdateDo::new(self);
20558 res.request.do_writeback(
20559 res.protocol(),
20560 "op-flash-update-do",
20561 OpFlashUpdateDo::lookup,
20562 );
20563 res
20564 }
20565 #[doc = "Get trap instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_name()](IterableDevlink::get_trap_name)\n"]
20566 pub fn op_trap_get_dump(self) -> OpTrapGetDump<'buf> {
20567 let mut res = OpTrapGetDump::new(self);
20568 res.request
20569 .do_writeback(res.protocol(), "op-trap-get-dump", OpTrapGetDump::lookup);
20570 res
20571 }
20572 #[doc = "Get trap instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_name()](PushDevlink::push_trap_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_name()](IterableDevlink::get_trap_name)\n"]
20573 pub fn op_trap_get_do(self) -> OpTrapGetDo<'buf> {
20574 let mut res = OpTrapGetDo::new(self);
20575 res.request
20576 .do_writeback(res.protocol(), "op-trap-get-do", OpTrapGetDo::lookup);
20577 res
20578 }
20579 #[doc = "Set trap instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_name()](PushDevlink::push_trap_name)\n- [.push_trap_action()](PushDevlink::push_trap_action)\n"]
20580 pub fn op_trap_set_do(self) -> OpTrapSetDo<'buf> {
20581 let mut res = OpTrapSetDo::new(self);
20582 res.request
20583 .do_writeback(res.protocol(), "op-trap-set-do", OpTrapSetDo::lookup);
20584 res
20585 }
20586 #[doc = "Get trap group instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_group_name()](IterableDevlink::get_trap_group_name)\n"]
20587 pub fn op_trap_group_get_dump(self) -> OpTrapGroupGetDump<'buf> {
20588 let mut res = OpTrapGroupGetDump::new(self);
20589 res.request.do_writeback(
20590 res.protocol(),
20591 "op-trap-group-get-dump",
20592 OpTrapGroupGetDump::lookup,
20593 );
20594 res
20595 }
20596 #[doc = "Get trap group instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_group_name()](PushDevlink::push_trap_group_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_group_name()](IterableDevlink::get_trap_group_name)\n"]
20597 pub fn op_trap_group_get_do(self) -> OpTrapGroupGetDo<'buf> {
20598 let mut res = OpTrapGroupGetDo::new(self);
20599 res.request.do_writeback(
20600 res.protocol(),
20601 "op-trap-group-get-do",
20602 OpTrapGroupGetDo::lookup,
20603 );
20604 res
20605 }
20606 #[doc = "Set trap group instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_action()](PushDevlink::push_trap_action)\n- [.push_trap_group_name()](PushDevlink::push_trap_group_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n"]
20607 pub fn op_trap_group_set_do(self) -> OpTrapGroupSetDo<'buf> {
20608 let mut res = OpTrapGroupSetDo::new(self);
20609 res.request.do_writeback(
20610 res.protocol(),
20611 "op-trap-group-set-do",
20612 OpTrapGroupSetDo::lookup,
20613 );
20614 res
20615 }
20616 #[doc = "Get trap policer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_policer_id()](IterableDevlink::get_trap_policer_id)\n"]
20617 pub fn op_trap_policer_get_dump(self) -> OpTrapPolicerGetDump<'buf> {
20618 let mut res = OpTrapPolicerGetDump::new(self);
20619 res.request.do_writeback(
20620 res.protocol(),
20621 "op-trap-policer-get-dump",
20622 OpTrapPolicerGetDump::lookup,
20623 );
20624 res
20625 }
20626 #[doc = "Get trap policer instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_trap_policer_id()](IterableDevlink::get_trap_policer_id)\n"]
20627 pub fn op_trap_policer_get_do(self) -> OpTrapPolicerGetDo<'buf> {
20628 let mut res = OpTrapPolicerGetDo::new(self);
20629 res.request.do_writeback(
20630 res.protocol(),
20631 "op-trap-policer-get-do",
20632 OpTrapPolicerGetDo::lookup,
20633 );
20634 res
20635 }
20636 #[doc = "Get trap policer instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_trap_policer_id()](PushDevlink::push_trap_policer_id)\n- [.push_trap_policer_rate()](PushDevlink::push_trap_policer_rate)\n- [.push_trap_policer_burst()](PushDevlink::push_trap_policer_burst)\n"]
20637 pub fn op_trap_policer_set_do(self) -> OpTrapPolicerSetDo<'buf> {
20638 let mut res = OpTrapPolicerSetDo::new(self);
20639 res.request.do_writeback(
20640 res.protocol(),
20641 "op-trap-policer-set-do",
20642 OpTrapPolicerSetDo::lookup,
20643 );
20644 res
20645 }
20646 #[doc = "Test health reporter instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_health_reporter_name()](PushDevlink::push_health_reporter_name)\n"]
20647 pub fn op_health_reporter_test_do(self) -> OpHealthReporterTestDo<'buf> {
20648 let mut res = OpHealthReporterTestDo::new(self);
20649 res.request.do_writeback(
20650 res.protocol(),
20651 "op-health-reporter-test-do",
20652 OpHealthReporterTestDo::lookup,
20653 );
20654 res
20655 }
20656 #[doc = "Get rate instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_rate_node_name()](IterableDevlink::get_rate_node_name)\n"]
20657 pub fn op_rate_get_dump(self) -> OpRateGetDump<'buf> {
20658 let mut res = OpRateGetDump::new(self);
20659 res.request
20660 .do_writeback(res.protocol(), "op-rate-get-dump", OpRateGetDump::lookup);
20661 res
20662 }
20663 #[doc = "Get rate instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_port_index()](IterableDevlink::get_port_index)\n- [.get_rate_node_name()](IterableDevlink::get_rate_node_name)\n"]
20664 pub fn op_rate_get_do(self) -> OpRateGetDo<'buf> {
20665 let mut res = OpRateGetDo::new(self);
20666 res.request
20667 .do_writeback(res.protocol(), "op-rate-get-do", OpRateGetDo::lookup);
20668 res
20669 }
20670 #[doc = "Set rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_tx_share()](PushDevlink::push_rate_tx_share)\n- [.push_rate_tx_max()](PushDevlink::push_rate_tx_max)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n- [.push_rate_parent_node_name()](PushDevlink::push_rate_parent_node_name)\n- [.push_rate_tx_priority()](PushDevlink::push_rate_tx_priority)\n- [.push_rate_tx_weight()](PushDevlink::push_rate_tx_weight)\n- [.nested_rate_tc_bws()](PushDevlink::nested_rate_tc_bws)\n"]
20671 pub fn op_rate_set_do(self) -> OpRateSetDo<'buf> {
20672 let mut res = OpRateSetDo::new(self);
20673 res.request
20674 .do_writeback(res.protocol(), "op-rate-set-do", OpRateSetDo::lookup);
20675 res
20676 }
20677 #[doc = "Create rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_tx_share()](PushDevlink::push_rate_tx_share)\n- [.push_rate_tx_max()](PushDevlink::push_rate_tx_max)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n- [.push_rate_parent_node_name()](PushDevlink::push_rate_parent_node_name)\n- [.push_rate_tx_priority()](PushDevlink::push_rate_tx_priority)\n- [.push_rate_tx_weight()](PushDevlink::push_rate_tx_weight)\n- [.nested_rate_tc_bws()](PushDevlink::nested_rate_tc_bws)\n"]
20678 pub fn op_rate_new_do(self) -> OpRateNewDo<'buf> {
20679 let mut res = OpRateNewDo::new(self);
20680 res.request
20681 .do_writeback(res.protocol(), "op-rate-new-do", OpRateNewDo::lookup);
20682 res
20683 }
20684 #[doc = "Delete rate instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_rate_node_name()](PushDevlink::push_rate_node_name)\n"]
20685 pub fn op_rate_del_do(self) -> OpRateDelDo<'buf> {
20686 let mut res = OpRateDelDo::new(self);
20687 res.request
20688 .do_writeback(res.protocol(), "op-rate-del-do", OpRateDelDo::lookup);
20689 res
20690 }
20691 #[doc = "Get line card instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_linecard_index()](IterableDevlink::get_linecard_index)\n"]
20692 pub fn op_linecard_get_dump(self) -> OpLinecardGetDump<'buf> {
20693 let mut res = OpLinecardGetDump::new(self);
20694 res.request.do_writeback(
20695 res.protocol(),
20696 "op-linecard-get-dump",
20697 OpLinecardGetDump::lookup,
20698 );
20699 res
20700 }
20701 #[doc = "Get line card instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_linecard_index()](PushDevlink::push_linecard_index)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n- [.get_linecard_index()](IterableDevlink::get_linecard_index)\n"]
20702 pub fn op_linecard_get_do(self) -> OpLinecardGetDo<'buf> {
20703 let mut res = OpLinecardGetDo::new(self);
20704 res.request.do_writeback(
20705 res.protocol(),
20706 "op-linecard-get-do",
20707 OpLinecardGetDo::lookup,
20708 );
20709 res
20710 }
20711 #[doc = "Set line card instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_linecard_index()](PushDevlink::push_linecard_index)\n- [.push_linecard_type()](PushDevlink::push_linecard_type)\n"]
20712 pub fn op_linecard_set_do(self) -> OpLinecardSetDo<'buf> {
20713 let mut res = OpLinecardSetDo::new(self);
20714 res.request.do_writeback(
20715 res.protocol(),
20716 "op-linecard-set-do",
20717 OpLinecardSetDo::lookup,
20718 );
20719 res
20720 }
20721 #[doc = "Get device selftest instances\\.\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n"]
20722 pub fn op_selftests_get_dump(self) -> OpSelftestsGetDump<'buf> {
20723 let mut res = OpSelftestsGetDump::new(self);
20724 res.request.do_writeback(
20725 res.protocol(),
20726 "op-selftests-get-dump",
20727 OpSelftestsGetDump::lookup,
20728 );
20729 res
20730 }
20731 #[doc = "Get device selftest instances\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n\nReply attributes:\n- [.get_bus_name()](IterableDevlink::get_bus_name)\n- [.get_dev_name()](IterableDevlink::get_dev_name)\n"]
20732 pub fn op_selftests_get_do(self) -> OpSelftestsGetDo<'buf> {
20733 let mut res = OpSelftestsGetDo::new(self);
20734 res.request.do_writeback(
20735 res.protocol(),
20736 "op-selftests-get-do",
20737 OpSelftestsGetDo::lookup,
20738 );
20739 res
20740 }
20741 #[doc = "Run device selftest instances\\.\nFlags: admin-perm\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.nested_selftests()](PushDevlink::nested_selftests)\n"]
20742 pub fn op_selftests_run_do(self) -> OpSelftestsRunDo<'buf> {
20743 let mut res = OpSelftestsRunDo::new(self);
20744 res.request.do_writeback(
20745 res.protocol(),
20746 "op-selftests-run-do",
20747 OpSelftestsRunDo::lookup,
20748 );
20749 res
20750 }
20751 #[doc = "Set notification messages socket filter\\.\nRequest attributes:\n- [.push_bus_name()](PushDevlink::push_bus_name)\n- [.push_dev_name()](PushDevlink::push_dev_name)\n- [.push_port_index()](PushDevlink::push_port_index)\n"]
20752 pub fn op_notify_filter_set_do(self) -> OpNotifyFilterSetDo<'buf> {
20753 let mut res = OpNotifyFilterSetDo::new(self);
20754 res.request.do_writeback(
20755 res.protocol(),
20756 "op-notify-filter-set-do",
20757 OpNotifyFilterSetDo::lookup,
20758 );
20759 res
20760 }
20761}
20762#[cfg(test)]
20763mod generated_tests {
20764 use super::*;
20765 #[test]
20766 fn tests() {
20767 let _ = IterableDevlink::get_bus_name;
20768 let _ = IterableDevlink::get_dev_name;
20769 let _ = IterableDevlink::get_dev_stats;
20770 let _ = IterableDevlink::get_dpipe_entries;
20771 let _ = IterableDevlink::get_dpipe_headers;
20772 let _ = IterableDevlink::get_dpipe_tables;
20773 let _ = IterableDevlink::get_eswitch_encap_mode;
20774 let _ = IterableDevlink::get_eswitch_inline_mode;
20775 let _ = IterableDevlink::get_eswitch_mode;
20776 let _ = IterableDevlink::get_fmsg;
20777 let _ = IterableDevlink::get_health_reporter_name;
20778 let _ = IterableDevlink::get_info_board_serial_number;
20779 let _ = IterableDevlink::get_info_driver_name;
20780 let _ = IterableDevlink::get_info_serial_number;
20781 let _ = IterableDevlink::get_info_version_fixed;
20782 let _ = IterableDevlink::get_info_version_running;
20783 let _ = IterableDevlink::get_info_version_stored;
20784 let _ = IterableDevlink::get_linecard_index;
20785 let _ = IterableDevlink::get_param_name;
20786 let _ = IterableDevlink::get_port_index;
20787 let _ = IterableDevlink::get_rate_node_name;
20788 let _ = IterableDevlink::get_region_name;
20789 let _ = IterableDevlink::get_region_snapshot_id;
20790 let _ = IterableDevlink::get_reload_actions_performed;
20791 let _ = IterableDevlink::get_reload_failed;
20792 let _ = IterableDevlink::get_resource_list;
20793 let _ = IterableDevlink::get_sb_index;
20794 let _ = IterableDevlink::get_sb_pool_index;
20795 let _ = IterableDevlink::get_sb_pool_type;
20796 let _ = IterableDevlink::get_sb_tc_index;
20797 let _ = IterableDevlink::get_trap_group_name;
20798 let _ = IterableDevlink::get_trap_name;
20799 let _ = IterableDevlink::get_trap_policer_id;
20800 let _ = PushDevlink::<&mut Vec<u8>>::nested_port_function;
20801 let _ = PushDevlink::<&mut Vec<u8>>::nested_rate_tc_bws;
20802 let _ = PushDevlink::<&mut Vec<u8>>::nested_selftests;
20803 let _ = PushDevlink::<&mut Vec<u8>>::push_bus_name;
20804 let _ = PushDevlink::<&mut Vec<u8>>::push_dev_name;
20805 let _ = PushDevlink::<&mut Vec<u8>>::push_dpipe_table_counters_enabled;
20806 let _ = PushDevlink::<&mut Vec<u8>>::push_dpipe_table_name;
20807 let _ = PushDevlink::<&mut Vec<u8>>::push_eswitch_encap_mode;
20808 let _ = PushDevlink::<&mut Vec<u8>>::push_eswitch_inline_mode;
20809 let _ = PushDevlink::<&mut Vec<u8>>::push_eswitch_mode;
20810 let _ = PushDevlink::<&mut Vec<u8>>::push_flash_update_component;
20811 let _ = PushDevlink::<&mut Vec<u8>>::push_flash_update_file_name;
20812 let _ = PushDevlink::<&mut Vec<u8>>::push_flash_update_overwrite_mask;
20813 let _ = PushDevlink::<&mut Vec<u8>>::push_health_reporter_auto_dump;
20814 let _ = PushDevlink::<&mut Vec<u8>>::push_health_reporter_auto_recover;
20815 let _ = PushDevlink::<&mut Vec<u8>>::push_health_reporter_burst_period;
20816 let _ = PushDevlink::<&mut Vec<u8>>::push_health_reporter_graceful_period;
20817 let _ = PushDevlink::<&mut Vec<u8>>::push_health_reporter_name;
20818 let _ = PushDevlink::<&mut Vec<u8>>::push_linecard_index;
20819 let _ = PushDevlink::<&mut Vec<u8>>::push_linecard_type;
20820 let _ = PushDevlink::<&mut Vec<u8>>::push_netns_fd;
20821 let _ = PushDevlink::<&mut Vec<u8>>::push_netns_id;
20822 let _ = PushDevlink::<&mut Vec<u8>>::push_netns_pid;
20823 let _ = PushDevlink::<&mut Vec<u8>>::push_param_name;
20824 let _ = PushDevlink::<&mut Vec<u8>>::push_param_reset_default;
20825 let _ = PushDevlink::<&mut Vec<u8>>::push_param_type;
20826 let _ = PushDevlink::<&mut Vec<u8>>::push_param_value_cmode;
20827 let _ = PushDevlink::<&mut Vec<u8>>::push_port_controller_number;
20828 let _ = PushDevlink::<&mut Vec<u8>>::push_port_flavour;
20829 let _ = PushDevlink::<&mut Vec<u8>>::push_port_index;
20830 let _ = PushDevlink::<&mut Vec<u8>>::push_port_pci_pf_number;
20831 let _ = PushDevlink::<&mut Vec<u8>>::push_port_pci_sf_number;
20832 let _ = PushDevlink::<&mut Vec<u8>>::push_port_split_count;
20833 let _ = PushDevlink::<&mut Vec<u8>>::push_port_type;
20834 let _ = PushDevlink::<&mut Vec<u8>>::push_rate_node_name;
20835 let _ = PushDevlink::<&mut Vec<u8>>::push_rate_parent_node_name;
20836 let _ = PushDevlink::<&mut Vec<u8>>::push_rate_tx_max;
20837 let _ = PushDevlink::<&mut Vec<u8>>::push_rate_tx_priority;
20838 let _ = PushDevlink::<&mut Vec<u8>>::push_rate_tx_share;
20839 let _ = PushDevlink::<&mut Vec<u8>>::push_rate_tx_weight;
20840 let _ = PushDevlink::<&mut Vec<u8>>::push_region_chunk_addr;
20841 let _ = PushDevlink::<&mut Vec<u8>>::push_region_chunk_len;
20842 let _ = PushDevlink::<&mut Vec<u8>>::push_region_direct;
20843 let _ = PushDevlink::<&mut Vec<u8>>::push_region_name;
20844 let _ = PushDevlink::<&mut Vec<u8>>::push_region_snapshot_id;
20845 let _ = PushDevlink::<&mut Vec<u8>>::push_reload_action;
20846 let _ = PushDevlink::<&mut Vec<u8>>::push_reload_limits;
20847 let _ = PushDevlink::<&mut Vec<u8>>::push_resource_id;
20848 let _ = PushDevlink::<&mut Vec<u8>>::push_resource_size;
20849 let _ = PushDevlink::<&mut Vec<u8>>::push_sb_index;
20850 let _ = PushDevlink::<&mut Vec<u8>>::push_sb_pool_index;
20851 let _ = PushDevlink::<&mut Vec<u8>>::push_sb_pool_size;
20852 let _ = PushDevlink::<&mut Vec<u8>>::push_sb_pool_threshold_type;
20853 let _ = PushDevlink::<&mut Vec<u8>>::push_sb_pool_type;
20854 let _ = PushDevlink::<&mut Vec<u8>>::push_sb_tc_index;
20855 let _ = PushDevlink::<&mut Vec<u8>>::push_sb_threshold;
20856 let _ = PushDevlink::<&mut Vec<u8>>::push_trap_action;
20857 let _ = PushDevlink::<&mut Vec<u8>>::push_trap_group_name;
20858 let _ = PushDevlink::<&mut Vec<u8>>::push_trap_name;
20859 let _ = PushDevlink::<&mut Vec<u8>>::push_trap_policer_burst;
20860 let _ = PushDevlink::<&mut Vec<u8>>::push_trap_policer_id;
20861 let _ = PushDevlink::<&mut Vec<u8>>::push_trap_policer_rate;
20862 }
20863}