1#![doc = "Link configuration over rtnetlink.\n"]
2#![allow(clippy::all)]
3#![allow(unused_imports)]
4#![allow(unused_assignments)]
5#![allow(non_snake_case)]
6#![allow(unused_variables)]
7#![allow(irrefutable_let_patterns)]
8#![allow(unreachable_code)]
9#![allow(unreachable_patterns)]
10use crate::builtin::{BuiltinBitfield32, BuiltinNfgenmsg, Nlmsghdr, PushDummy};
11use crate::{
12 consts,
13 traits::{NetlinkRequest, Protocol},
14 utils::*,
15};
16pub const PROTONAME: &str = "rt-link";
17pub const PROTONAME_CSTR: &CStr = c"rt-link";
18pub const PROTONUM: u16 = 0u16;
19#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
20#[derive(Debug, Clone, Copy)]
21pub enum IfinfoFlags {
22 Up = 1 << 0,
23 Broadcast = 1 << 1,
24 Debug = 1 << 2,
25 Loopback = 1 << 3,
26 PointToPoint = 1 << 4,
27 NoTrailers = 1 << 5,
28 Running = 1 << 6,
29 NoArp = 1 << 7,
30 Promisc = 1 << 8,
31 AllMulti = 1 << 9,
32 Master = 1 << 10,
33 Slave = 1 << 11,
34 Multicast = 1 << 12,
35 Portsel = 1 << 13,
36 AutoMedia = 1 << 14,
37 Dynamic = 1 << 15,
38 LowerUp = 1 << 16,
39 Dormant = 1 << 17,
40 Echo = 1 << 18,
41}
42impl IfinfoFlags {
43 pub fn from_value(value: u64) -> Option<Self> {
44 Some(match value {
45 n if n == 1 << 0 => Self::Up,
46 n if n == 1 << 1 => Self::Broadcast,
47 n if n == 1 << 2 => Self::Debug,
48 n if n == 1 << 3 => Self::Loopback,
49 n if n == 1 << 4 => Self::PointToPoint,
50 n if n == 1 << 5 => Self::NoTrailers,
51 n if n == 1 << 6 => Self::Running,
52 n if n == 1 << 7 => Self::NoArp,
53 n if n == 1 << 8 => Self::Promisc,
54 n if n == 1 << 9 => Self::AllMulti,
55 n if n == 1 << 10 => Self::Master,
56 n if n == 1 << 11 => Self::Slave,
57 n if n == 1 << 12 => Self::Multicast,
58 n if n == 1 << 13 => Self::Portsel,
59 n if n == 1 << 14 => Self::AutoMedia,
60 n if n == 1 << 15 => Self::Dynamic,
61 n if n == 1 << 16 => Self::LowerUp,
62 n if n == 1 << 17 => Self::Dormant,
63 n if n == 1 << 18 => Self::Echo,
64 _ => return None,
65 })
66 }
67}
68#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
69#[derive(Debug, Clone, Copy)]
70pub enum VlanProtocols {
71 _8021q = 33024,
72 _8021ad = 34984,
73}
74impl VlanProtocols {
75 pub fn from_value(value: u64) -> Option<Self> {
76 Some(match value {
77 33024 => Self::_8021q,
78 34984 => Self::_8021ad,
79 _ => return None,
80 })
81 }
82}
83#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
84#[derive(Debug, Clone, Copy)]
85pub enum Ipv4Devconf {
86 Forwarding = 0,
87 McForwarding = 1,
88 ProxyArp = 2,
89 AcceptRedirects = 3,
90 SecureRedirects = 4,
91 SendRedirects = 5,
92 SharedMedia = 6,
93 RpFilter = 7,
94 AcceptSourceRoute = 8,
95 BootpRelay = 9,
96 LogMartians = 10,
97 Tag = 11,
98 Arpfilter = 12,
99 MediumId = 13,
100 Noxfrm = 14,
101 Nopolicy = 15,
102 ForceIgmpVersion = 16,
103 ArpAnnounce = 17,
104 ArpIgnore = 18,
105 PromoteSecondaries = 19,
106 ArpAccept = 20,
107 ArpNotify = 21,
108 AcceptLocal = 22,
109 SrcVmark = 23,
110 ProxyArpPvlan = 24,
111 RouteLocalnet = 25,
112 Igmpv2UnsolicitedReportInterval = 26,
113 Igmpv3UnsolicitedReportInterval = 27,
114 IgnoreRoutesWithLinkdown = 28,
115 DropUnicastInL2Multicast = 29,
116 DropGratuitousArp = 30,
117 BcForwarding = 31,
118 ArpEvictNocarrier = 32,
119}
120impl Ipv4Devconf {
121 pub fn from_value(value: u64) -> Option<Self> {
122 Some(match value {
123 0 => Self::Forwarding,
124 1 => Self::McForwarding,
125 2 => Self::ProxyArp,
126 3 => Self::AcceptRedirects,
127 4 => Self::SecureRedirects,
128 5 => Self::SendRedirects,
129 6 => Self::SharedMedia,
130 7 => Self::RpFilter,
131 8 => Self::AcceptSourceRoute,
132 9 => Self::BootpRelay,
133 10 => Self::LogMartians,
134 11 => Self::Tag,
135 12 => Self::Arpfilter,
136 13 => Self::MediumId,
137 14 => Self::Noxfrm,
138 15 => Self::Nopolicy,
139 16 => Self::ForceIgmpVersion,
140 17 => Self::ArpAnnounce,
141 18 => Self::ArpIgnore,
142 19 => Self::PromoteSecondaries,
143 20 => Self::ArpAccept,
144 21 => Self::ArpNotify,
145 22 => Self::AcceptLocal,
146 23 => Self::SrcVmark,
147 24 => Self::ProxyArpPvlan,
148 25 => Self::RouteLocalnet,
149 26 => Self::Igmpv2UnsolicitedReportInterval,
150 27 => Self::Igmpv3UnsolicitedReportInterval,
151 28 => Self::IgnoreRoutesWithLinkdown,
152 29 => Self::DropUnicastInL2Multicast,
153 30 => Self::DropGratuitousArp,
154 31 => Self::BcForwarding,
155 32 => Self::ArpEvictNocarrier,
156 _ => return None,
157 })
158 }
159}
160#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
161#[derive(Debug, Clone, Copy)]
162pub enum Ipv6Devconf {
163 Forwarding = 0,
164 Hoplimit = 1,
165 Mtu6 = 2,
166 AcceptRa = 3,
167 AcceptRedirects = 4,
168 Autoconf = 5,
169 DadTransmits = 6,
170 RtrSolicits = 7,
171 RtrSolicitInterval = 8,
172 RtrSolicitDelay = 9,
173 UseTempaddr = 10,
174 TempValidLft = 11,
175 TempPreferedLft = 12,
176 RegenMaxRetry = 13,
177 MaxDesyncFactor = 14,
178 MaxAddresses = 15,
179 ForceMldVersion = 16,
180 AcceptRaDefrtr = 17,
181 AcceptRaPinfo = 18,
182 AcceptRaRtrPref = 19,
183 RtrProbeInterval = 20,
184 AcceptRaRtInfoMaxPlen = 21,
185 ProxyNdp = 22,
186 OptimisticDad = 23,
187 AcceptSourceRoute = 24,
188 McForwarding = 25,
189 DisableIpv6 = 26,
190 AcceptDad = 27,
191 ForceTllao = 28,
192 NdiscNotify = 29,
193 Mldv1UnsolicitedReportInterval = 30,
194 Mldv2UnsolicitedReportInterval = 31,
195 SuppressFragNdisc = 32,
196 AcceptRaFromLocal = 33,
197 UseOptimistic = 34,
198 AcceptRaMtu = 35,
199 StableSecret = 36,
200 UseOifAddrsOnly = 37,
201 AcceptRaMinHopLimit = 38,
202 IgnoreRoutesWithLinkdown = 39,
203 DropUnicastInL2Multicast = 40,
204 DropUnsolicitedNa = 41,
205 KeepAddrOnDown = 42,
206 RtrSolicitMaxInterval = 43,
207 Seg6Enabled = 44,
208 Seg6RequireHmac = 45,
209 EnhancedDad = 46,
210 AddrGenMode = 47,
211 DisablePolicy = 48,
212 AcceptRaRtInfoMinPlen = 49,
213 NdiscTclass = 50,
214 RplSegEnabled = 51,
215 RaDefrtrMetric = 52,
216 Ioam6Enabled = 53,
217 Ioam6Id = 54,
218 Ioam6IdWide = 55,
219 NdiscEvictNocarrier = 56,
220 AcceptUntrackedNa = 57,
221}
222impl Ipv6Devconf {
223 pub fn from_value(value: u64) -> Option<Self> {
224 Some(match value {
225 0 => Self::Forwarding,
226 1 => Self::Hoplimit,
227 2 => Self::Mtu6,
228 3 => Self::AcceptRa,
229 4 => Self::AcceptRedirects,
230 5 => Self::Autoconf,
231 6 => Self::DadTransmits,
232 7 => Self::RtrSolicits,
233 8 => Self::RtrSolicitInterval,
234 9 => Self::RtrSolicitDelay,
235 10 => Self::UseTempaddr,
236 11 => Self::TempValidLft,
237 12 => Self::TempPreferedLft,
238 13 => Self::RegenMaxRetry,
239 14 => Self::MaxDesyncFactor,
240 15 => Self::MaxAddresses,
241 16 => Self::ForceMldVersion,
242 17 => Self::AcceptRaDefrtr,
243 18 => Self::AcceptRaPinfo,
244 19 => Self::AcceptRaRtrPref,
245 20 => Self::RtrProbeInterval,
246 21 => Self::AcceptRaRtInfoMaxPlen,
247 22 => Self::ProxyNdp,
248 23 => Self::OptimisticDad,
249 24 => Self::AcceptSourceRoute,
250 25 => Self::McForwarding,
251 26 => Self::DisableIpv6,
252 27 => Self::AcceptDad,
253 28 => Self::ForceTllao,
254 29 => Self::NdiscNotify,
255 30 => Self::Mldv1UnsolicitedReportInterval,
256 31 => Self::Mldv2UnsolicitedReportInterval,
257 32 => Self::SuppressFragNdisc,
258 33 => Self::AcceptRaFromLocal,
259 34 => Self::UseOptimistic,
260 35 => Self::AcceptRaMtu,
261 36 => Self::StableSecret,
262 37 => Self::UseOifAddrsOnly,
263 38 => Self::AcceptRaMinHopLimit,
264 39 => Self::IgnoreRoutesWithLinkdown,
265 40 => Self::DropUnicastInL2Multicast,
266 41 => Self::DropUnsolicitedNa,
267 42 => Self::KeepAddrOnDown,
268 43 => Self::RtrSolicitMaxInterval,
269 44 => Self::Seg6Enabled,
270 45 => Self::Seg6RequireHmac,
271 46 => Self::EnhancedDad,
272 47 => Self::AddrGenMode,
273 48 => Self::DisablePolicy,
274 49 => Self::AcceptRaRtInfoMinPlen,
275 50 => Self::NdiscTclass,
276 51 => Self::RplSegEnabled,
277 52 => Self::RaDefrtrMetric,
278 53 => Self::Ioam6Enabled,
279 54 => Self::Ioam6Id,
280 55 => Self::Ioam6IdWide,
281 56 => Self::NdiscEvictNocarrier,
282 57 => Self::AcceptUntrackedNa,
283 _ => return None,
284 })
285 }
286}
287#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
288#[derive(Debug, Clone, Copy)]
289pub enum IflaIcmp6Stats {
290 Num = 0,
291 Inmsgs = 1,
292 Inerrors = 2,
293 Outmsgs = 3,
294 Outerrors = 4,
295 Csumerrors = 5,
296 Ratelimithost = 6,
297}
298impl IflaIcmp6Stats {
299 pub fn from_value(value: u64) -> Option<Self> {
300 Some(match value {
301 0 => Self::Num,
302 1 => Self::Inmsgs,
303 2 => Self::Inerrors,
304 3 => Self::Outmsgs,
305 4 => Self::Outerrors,
306 5 => Self::Csumerrors,
307 6 => Self::Ratelimithost,
308 _ => return None,
309 })
310 }
311}
312#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
313#[derive(Debug, Clone, Copy)]
314pub enum IflaInet6Stats {
315 Num = 0,
316 Inpkts = 1,
317 Inoctets = 2,
318 Indelivers = 3,
319 Outforwdatagrams = 4,
320 Outpkts = 5,
321 Outoctets = 6,
322 Inhdrerrors = 7,
323 Intoobigerrors = 8,
324 Innoroutes = 9,
325 Inaddrerrors = 10,
326 Inunknownprotos = 11,
327 Intruncatedpkts = 12,
328 Indiscards = 13,
329 Outdiscards = 14,
330 Outnoroutes = 15,
331 Reasmtimeout = 16,
332 Reasmreqds = 17,
333 Reasmoks = 18,
334 Reasmfails = 19,
335 Fragoks = 20,
336 Fragfails = 21,
337 Fragcreates = 22,
338 Inmcastpkts = 23,
339 Outmcastpkts = 24,
340 Inbcastpkts = 25,
341 Outbcastpkts = 26,
342 Inmcastoctets = 27,
343 Outmcastoctets = 28,
344 Inbcastoctets = 29,
345 Outbcastoctets = 30,
346 Csumerrors = 31,
347 Noectpkts = 32,
348 Ect1Pkts = 33,
349 Ect0Pkts = 34,
350 Cepkts = 35,
351 ReasmOverlaps = 36,
352}
353impl IflaInet6Stats {
354 pub fn from_value(value: u64) -> Option<Self> {
355 Some(match value {
356 0 => Self::Num,
357 1 => Self::Inpkts,
358 2 => Self::Inoctets,
359 3 => Self::Indelivers,
360 4 => Self::Outforwdatagrams,
361 5 => Self::Outpkts,
362 6 => Self::Outoctets,
363 7 => Self::Inhdrerrors,
364 8 => Self::Intoobigerrors,
365 9 => Self::Innoroutes,
366 10 => Self::Inaddrerrors,
367 11 => Self::Inunknownprotos,
368 12 => Self::Intruncatedpkts,
369 13 => Self::Indiscards,
370 14 => Self::Outdiscards,
371 15 => Self::Outnoroutes,
372 16 => Self::Reasmtimeout,
373 17 => Self::Reasmreqds,
374 18 => Self::Reasmoks,
375 19 => Self::Reasmfails,
376 20 => Self::Fragoks,
377 21 => Self::Fragfails,
378 22 => Self::Fragcreates,
379 23 => Self::Inmcastpkts,
380 24 => Self::Outmcastpkts,
381 25 => Self::Inbcastpkts,
382 26 => Self::Outbcastpkts,
383 27 => Self::Inmcastoctets,
384 28 => Self::Outmcastoctets,
385 29 => Self::Inbcastoctets,
386 30 => Self::Outbcastoctets,
387 31 => Self::Csumerrors,
388 32 => Self::Noectpkts,
389 33 => Self::Ect1Pkts,
390 34 => Self::Ect0Pkts,
391 35 => Self::Cepkts,
392 36 => Self::ReasmOverlaps,
393 _ => return None,
394 })
395 }
396}
397#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
398#[derive(Debug, Clone, Copy)]
399pub enum VlanFlags {
400 ReorderHdr = 1 << 0,
401 Gvrp = 1 << 1,
402 LooseBinding = 1 << 2,
403 Mvrp = 1 << 3,
404 BridgeBinding = 1 << 4,
405}
406impl VlanFlags {
407 pub fn from_value(value: u64) -> Option<Self> {
408 Some(match value {
409 n if n == 1 << 0 => Self::ReorderHdr,
410 n if n == 1 << 1 => Self::Gvrp,
411 n if n == 1 << 2 => Self::LooseBinding,
412 n if n == 1 << 3 => Self::Mvrp,
413 n if n == 1 << 4 => Self::BridgeBinding,
414 _ => return None,
415 })
416 }
417}
418#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
419#[derive(Debug, Clone, Copy)]
420pub enum IflaVfLinkStateEnum {
421 Auto = 0,
422 Enable = 1,
423 Disable = 2,
424}
425impl IflaVfLinkStateEnum {
426 pub fn from_value(value: u64) -> Option<Self> {
427 Some(match value {
428 0 => Self::Auto,
429 1 => Self::Enable,
430 2 => Self::Disable,
431 _ => return None,
432 })
433 }
434}
435#[doc = "Flags - defines an integer enumeration, with values for each entry occupying a bit, starting from bit 0, (e.g. 1, 2, 4, 8)"]
436#[derive(Debug, Clone, Copy)]
437pub enum RtextFilter {
438 Vf = 1 << 0,
439 Brvlan = 1 << 1,
440 BrvlanCompressed = 1 << 2,
441 SkipStats = 1 << 3,
442 Mrp = 1 << 4,
443 CfmConfig = 1 << 5,
444 CfmStatus = 1 << 6,
445 Mst = 1 << 7,
446}
447impl RtextFilter {
448 pub fn from_value(value: u64) -> Option<Self> {
449 Some(match value {
450 n if n == 1 << 0 => Self::Vf,
451 n if n == 1 << 1 => Self::Brvlan,
452 n if n == 1 << 2 => Self::BrvlanCompressed,
453 n if n == 1 << 3 => Self::SkipStats,
454 n if n == 1 << 4 => Self::Mrp,
455 n if n == 1 << 5 => Self::CfmConfig,
456 n if n == 1 << 6 => Self::CfmStatus,
457 n if n == 1 << 7 => Self::Mst,
458 _ => return None,
459 })
460 }
461}
462#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
463#[derive(Debug, Clone, Copy)]
464pub enum NetkitPolicy {
465 Forward = 0,
466 Blackhole = 2,
467}
468impl NetkitPolicy {
469 pub fn from_value(value: u64) -> Option<Self> {
470 Some(match value {
471 0 => Self::Forward,
472 2 => Self::Blackhole,
473 _ => return None,
474 })
475 }
476}
477#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
478#[derive(Debug, Clone, Copy)]
479pub enum NetkitMode {
480 L2 = 0,
481 L3 = 1,
482}
483impl NetkitMode {
484 pub fn from_value(value: u64) -> Option<Self> {
485 Some(match value {
486 0 => Self::L2,
487 1 => Self::L3,
488 _ => return None,
489 })
490 }
491}
492#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
493#[derive(Debug, Clone, Copy)]
494pub enum NetkitScrub {
495 None = 0,
496 Default = 1,
497}
498impl NetkitScrub {
499 pub fn from_value(value: u64) -> Option<Self> {
500 Some(match value {
501 0 => Self::None,
502 1 => Self::Default,
503 _ => return None,
504 })
505 }
506}
507#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
508#[derive(Debug, Clone, Copy)]
509pub enum NetkitPairing {
510 Pair = 0,
511 Single = 1,
512}
513impl NetkitPairing {
514 pub fn from_value(value: u64) -> Option<Self> {
515 Some(match value {
516 0 => Self::Pair,
517 1 => Self::Single,
518 _ => return None,
519 })
520 }
521}
522#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
523#[derive(Debug, Clone, Copy)]
524pub enum OvpnMode {
525 P2p = 0,
526 Mp = 1,
527}
528impl OvpnMode {
529 pub fn from_value(value: u64) -> Option<Self> {
530 Some(match value {
531 0 => Self::P2p,
532 1 => Self::Mp,
533 _ => return None,
534 })
535 }
536}
537#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
538#[derive(Debug, Clone, Copy)]
539pub enum BrStpMode {
540 Auto = 0,
541 User = 1,
542 Kernel = 2,
543}
544impl BrStpMode {
545 pub fn from_value(value: u64) -> Option<Self> {
546 Some(match value {
547 0 => Self::Auto,
548 1 => Self::User,
549 2 => Self::Kernel,
550 _ => return None,
551 })
552 }
553}
554#[derive(Debug)]
555#[repr(C, packed(4))]
556pub struct Rtgenmsg {
557 pub family: u8,
558}
559impl Clone for Rtgenmsg {
560 fn clone(&self) -> Self {
561 Self::new_from_array(*self.as_array())
562 }
563}
564#[doc = "Create zero-initialized struct"]
565impl Default for Rtgenmsg {
566 fn default() -> Self {
567 Self::new()
568 }
569}
570impl Rtgenmsg {
571 #[doc = "Create zero-initialized struct"]
572 pub fn new() -> Self {
573 Self::new_from_array([0u8; Self::len()])
574 }
575 #[doc = "Copy from contents from slice"]
576 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
577 if other.len() != Self::len() {
578 return None;
579 }
580 let mut buf = [0u8; Self::len()];
581 buf.clone_from_slice(other);
582 Some(Self::new_from_array(buf))
583 }
584 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
585 pub fn new_from_zeroed(other: &[u8]) -> Self {
586 let mut buf = [0u8; Self::len()];
587 let len = buf.len().min(other.len());
588 buf[..len].clone_from_slice(&other[..len]);
589 Self::new_from_array(buf)
590 }
591 pub fn new_from_array(buf: [u8; 1usize]) -> Self {
592 unsafe { std::mem::transmute(buf) }
593 }
594 pub fn as_slice(&self) -> &[u8] {
595 unsafe {
596 let ptr: *const u8 = std::mem::transmute(self as *const Self);
597 std::slice::from_raw_parts(ptr, Self::len())
598 }
599 }
600 pub fn from_slice(buf: &[u8]) -> &Self {
601 assert!(buf.len() >= Self::len());
602 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
603 unsafe { std::mem::transmute(buf.as_ptr()) }
604 }
605 pub fn as_array(&self) -> &[u8; 1usize] {
606 unsafe { std::mem::transmute(self) }
607 }
608 pub fn from_array(buf: &[u8; 1usize]) -> &Self {
609 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
610 unsafe { std::mem::transmute(buf) }
611 }
612 pub fn into_array(self) -> [u8; 1usize] {
613 unsafe { std::mem::transmute(self) }
614 }
615 pub const fn len() -> usize {
616 const _: () = assert!(std::mem::size_of::<Rtgenmsg>() == 1usize);
617 1usize
618 }
619}
620#[repr(C, packed(4))]
621pub struct Ifinfomsg {
622 pub ifi_family: u8,
623 pub _pad: [u8; 1usize],
624 pub ifi_type: u16,
625 pub ifi_index: i32,
626 #[doc = "Associated type: [`IfinfoFlags`] (1 bit per enumeration)"]
627 pub ifi_flags: u32,
628 pub ifi_change: u32,
629}
630impl Clone for Ifinfomsg {
631 fn clone(&self) -> Self {
632 Self::new_from_array(*self.as_array())
633 }
634}
635#[doc = "Create zero-initialized struct"]
636impl Default for Ifinfomsg {
637 fn default() -> Self {
638 Self::new()
639 }
640}
641impl Ifinfomsg {
642 #[doc = "Create zero-initialized struct"]
643 pub fn new() -> Self {
644 Self::new_from_array([0u8; Self::len()])
645 }
646 #[doc = "Copy from contents from slice"]
647 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
648 if other.len() != Self::len() {
649 return None;
650 }
651 let mut buf = [0u8; Self::len()];
652 buf.clone_from_slice(other);
653 Some(Self::new_from_array(buf))
654 }
655 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
656 pub fn new_from_zeroed(other: &[u8]) -> Self {
657 let mut buf = [0u8; Self::len()];
658 let len = buf.len().min(other.len());
659 buf[..len].clone_from_slice(&other[..len]);
660 Self::new_from_array(buf)
661 }
662 pub fn new_from_array(buf: [u8; 16usize]) -> Self {
663 unsafe { std::mem::transmute(buf) }
664 }
665 pub fn as_slice(&self) -> &[u8] {
666 unsafe {
667 let ptr: *const u8 = std::mem::transmute(self as *const Self);
668 std::slice::from_raw_parts(ptr, Self::len())
669 }
670 }
671 pub fn from_slice(buf: &[u8]) -> &Self {
672 assert!(buf.len() >= Self::len());
673 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
674 unsafe { std::mem::transmute(buf.as_ptr()) }
675 }
676 pub fn as_array(&self) -> &[u8; 16usize] {
677 unsafe { std::mem::transmute(self) }
678 }
679 pub fn from_array(buf: &[u8; 16usize]) -> &Self {
680 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
681 unsafe { std::mem::transmute(buf) }
682 }
683 pub fn into_array(self) -> [u8; 16usize] {
684 unsafe { std::mem::transmute(self) }
685 }
686 pub const fn len() -> usize {
687 const _: () = assert!(std::mem::size_of::<Ifinfomsg>() == 16usize);
688 16usize
689 }
690}
691impl std::fmt::Debug for Ifinfomsg {
692 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
693 fmt.debug_struct("Ifinfomsg")
694 .field("ifi_family", &self.ifi_family)
695 .field("ifi_type", &self.ifi_type)
696 .field("ifi_index", &self.ifi_index)
697 .field(
698 "ifi_flags",
699 &FormatFlags(self.ifi_flags.into(), IfinfoFlags::from_value),
700 )
701 .field("ifi_change", &self.ifi_change)
702 .finish()
703 }
704}
705#[derive(Debug)]
706#[repr(C, packed(4))]
707pub struct IflaBridgeId {
708 pub prio: u16,
709 pub addr: [u8; 6usize],
710}
711impl Clone for IflaBridgeId {
712 fn clone(&self) -> Self {
713 Self::new_from_array(*self.as_array())
714 }
715}
716#[doc = "Create zero-initialized struct"]
717impl Default for IflaBridgeId {
718 fn default() -> Self {
719 Self::new()
720 }
721}
722impl IflaBridgeId {
723 #[doc = "Create zero-initialized struct"]
724 pub fn new() -> Self {
725 Self::new_from_array([0u8; Self::len()])
726 }
727 #[doc = "Copy from contents from slice"]
728 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
729 if other.len() != Self::len() {
730 return None;
731 }
732 let mut buf = [0u8; Self::len()];
733 buf.clone_from_slice(other);
734 Some(Self::new_from_array(buf))
735 }
736 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
737 pub fn new_from_zeroed(other: &[u8]) -> Self {
738 let mut buf = [0u8; Self::len()];
739 let len = buf.len().min(other.len());
740 buf[..len].clone_from_slice(&other[..len]);
741 Self::new_from_array(buf)
742 }
743 pub fn new_from_array(buf: [u8; 8usize]) -> Self {
744 unsafe { std::mem::transmute(buf) }
745 }
746 pub fn as_slice(&self) -> &[u8] {
747 unsafe {
748 let ptr: *const u8 = std::mem::transmute(self as *const Self);
749 std::slice::from_raw_parts(ptr, Self::len())
750 }
751 }
752 pub fn from_slice(buf: &[u8]) -> &Self {
753 assert!(buf.len() >= Self::len());
754 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
755 unsafe { std::mem::transmute(buf.as_ptr()) }
756 }
757 pub fn as_array(&self) -> &[u8; 8usize] {
758 unsafe { std::mem::transmute(self) }
759 }
760 pub fn from_array(buf: &[u8; 8usize]) -> &Self {
761 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
762 unsafe { std::mem::transmute(buf) }
763 }
764 pub fn into_array(self) -> [u8; 8usize] {
765 unsafe { std::mem::transmute(self) }
766 }
767 pub const fn len() -> usize {
768 const _: () = assert!(std::mem::size_of::<IflaBridgeId>() == 8usize);
769 8usize
770 }
771}
772#[derive(Debug)]
773#[repr(C, packed(4))]
774pub struct IflaCacheinfo {
775 pub max_reasm_len: u32,
776 pub tstamp: u32,
777 pub reachable_time: i32,
778 pub retrans_time: u32,
779}
780impl Clone for IflaCacheinfo {
781 fn clone(&self) -> Self {
782 Self::new_from_array(*self.as_array())
783 }
784}
785#[doc = "Create zero-initialized struct"]
786impl Default for IflaCacheinfo {
787 fn default() -> Self {
788 Self::new()
789 }
790}
791impl IflaCacheinfo {
792 #[doc = "Create zero-initialized struct"]
793 pub fn new() -> Self {
794 Self::new_from_array([0u8; Self::len()])
795 }
796 #[doc = "Copy from contents from slice"]
797 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
798 if other.len() != Self::len() {
799 return None;
800 }
801 let mut buf = [0u8; Self::len()];
802 buf.clone_from_slice(other);
803 Some(Self::new_from_array(buf))
804 }
805 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
806 pub fn new_from_zeroed(other: &[u8]) -> Self {
807 let mut buf = [0u8; Self::len()];
808 let len = buf.len().min(other.len());
809 buf[..len].clone_from_slice(&other[..len]);
810 Self::new_from_array(buf)
811 }
812 pub fn new_from_array(buf: [u8; 16usize]) -> Self {
813 unsafe { std::mem::transmute(buf) }
814 }
815 pub fn as_slice(&self) -> &[u8] {
816 unsafe {
817 let ptr: *const u8 = std::mem::transmute(self as *const Self);
818 std::slice::from_raw_parts(ptr, Self::len())
819 }
820 }
821 pub fn from_slice(buf: &[u8]) -> &Self {
822 assert!(buf.len() >= Self::len());
823 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
824 unsafe { std::mem::transmute(buf.as_ptr()) }
825 }
826 pub fn as_array(&self) -> &[u8; 16usize] {
827 unsafe { std::mem::transmute(self) }
828 }
829 pub fn from_array(buf: &[u8; 16usize]) -> &Self {
830 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
831 unsafe { std::mem::transmute(buf) }
832 }
833 pub fn into_array(self) -> [u8; 16usize] {
834 unsafe { std::mem::transmute(self) }
835 }
836 pub const fn len() -> usize {
837 const _: () = assert!(std::mem::size_of::<IflaCacheinfo>() == 16usize);
838 16usize
839 }
840}
841#[derive(Debug)]
842#[repr(C, packed(4))]
843pub struct RtnlLinkStats {
844 pub rx_packets: u32,
845 pub tx_packets: u32,
846 pub rx_bytes: u32,
847 pub tx_bytes: u32,
848 pub rx_errors: u32,
849 pub tx_errors: u32,
850 pub rx_dropped: u32,
851 pub tx_dropped: u32,
852 pub multicast: u32,
853 pub collisions: u32,
854 pub rx_length_errors: u32,
855 pub rx_over_errors: u32,
856 pub rx_crc_errors: u32,
857 pub rx_frame_errors: u32,
858 pub rx_fifo_errors: u32,
859 pub rx_missed_errors: u32,
860 pub tx_aborted_errors: u32,
861 pub tx_carrier_errors: u32,
862 pub tx_fifo_errors: u32,
863 pub tx_heartbeat_errors: u32,
864 pub tx_window_errors: u32,
865 pub rx_compressed: u32,
866 pub tx_compressed: u32,
867 pub rx_nohandler: u32,
868}
869impl Clone for RtnlLinkStats {
870 fn clone(&self) -> Self {
871 Self::new_from_array(*self.as_array())
872 }
873}
874#[doc = "Create zero-initialized struct"]
875impl Default for RtnlLinkStats {
876 fn default() -> Self {
877 Self::new()
878 }
879}
880impl RtnlLinkStats {
881 #[doc = "Create zero-initialized struct"]
882 pub fn new() -> Self {
883 Self::new_from_array([0u8; Self::len()])
884 }
885 #[doc = "Copy from contents from slice"]
886 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
887 if other.len() != Self::len() {
888 return None;
889 }
890 let mut buf = [0u8; Self::len()];
891 buf.clone_from_slice(other);
892 Some(Self::new_from_array(buf))
893 }
894 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
895 pub fn new_from_zeroed(other: &[u8]) -> Self {
896 let mut buf = [0u8; Self::len()];
897 let len = buf.len().min(other.len());
898 buf[..len].clone_from_slice(&other[..len]);
899 Self::new_from_array(buf)
900 }
901 pub fn new_from_array(buf: [u8; 96usize]) -> Self {
902 unsafe { std::mem::transmute(buf) }
903 }
904 pub fn as_slice(&self) -> &[u8] {
905 unsafe {
906 let ptr: *const u8 = std::mem::transmute(self as *const Self);
907 std::slice::from_raw_parts(ptr, Self::len())
908 }
909 }
910 pub fn from_slice(buf: &[u8]) -> &Self {
911 assert!(buf.len() >= Self::len());
912 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
913 unsafe { std::mem::transmute(buf.as_ptr()) }
914 }
915 pub fn as_array(&self) -> &[u8; 96usize] {
916 unsafe { std::mem::transmute(self) }
917 }
918 pub fn from_array(buf: &[u8; 96usize]) -> &Self {
919 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
920 unsafe { std::mem::transmute(buf) }
921 }
922 pub fn into_array(self) -> [u8; 96usize] {
923 unsafe { std::mem::transmute(self) }
924 }
925 pub const fn len() -> usize {
926 const _: () = assert!(std::mem::size_of::<RtnlLinkStats>() == 96usize);
927 96usize
928 }
929}
930#[repr(C, packed(4))]
931pub struct RtnlLinkStats64 {
932 pub rx_packets: u64,
933 pub tx_packets: u64,
934 pub rx_bytes: u64,
935 pub tx_bytes: u64,
936 pub rx_errors: u64,
937 pub tx_errors: u64,
938 pub rx_dropped: u64,
939 pub tx_dropped: u64,
940 pub multicast: u64,
941 pub collisions: u64,
942 pub rx_length_errors: u64,
943 pub rx_over_errors: u64,
944 pub rx_crc_errors: u64,
945 pub rx_frame_errors: u64,
946 pub rx_fifo_errors: u64,
947 pub rx_missed_errors: u64,
948 pub tx_aborted_errors: u64,
949 pub tx_carrier_errors: u64,
950 pub tx_fifo_errors: u64,
951 pub tx_heartbeat_errors: u64,
952 pub tx_window_errors: u64,
953 pub rx_compressed: u64,
954 pub tx_compressed: u64,
955 pub rx_nohandler: u64,
956 pub rx_otherhost_dropped: u64,
957}
958impl Clone for RtnlLinkStats64 {
959 fn clone(&self) -> Self {
960 Self::new_from_array(*self.as_array())
961 }
962}
963#[doc = "Create zero-initialized struct"]
964impl Default for RtnlLinkStats64 {
965 fn default() -> Self {
966 Self::new()
967 }
968}
969impl RtnlLinkStats64 {
970 #[doc = "Create zero-initialized struct"]
971 pub fn new() -> Self {
972 Self::new_from_array([0u8; Self::len()])
973 }
974 #[doc = "Copy from contents from slice"]
975 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
976 if other.len() != Self::len() {
977 return None;
978 }
979 let mut buf = [0u8; Self::len()];
980 buf.clone_from_slice(other);
981 Some(Self::new_from_array(buf))
982 }
983 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
984 pub fn new_from_zeroed(other: &[u8]) -> Self {
985 let mut buf = [0u8; Self::len()];
986 let len = buf.len().min(other.len());
987 buf[..len].clone_from_slice(&other[..len]);
988 Self::new_from_array(buf)
989 }
990 pub fn new_from_array(buf: [u8; 200usize]) -> Self {
991 unsafe { std::mem::transmute(buf) }
992 }
993 pub fn as_slice(&self) -> &[u8] {
994 unsafe {
995 let ptr: *const u8 = std::mem::transmute(self as *const Self);
996 std::slice::from_raw_parts(ptr, Self::len())
997 }
998 }
999 pub fn from_slice(buf: &[u8]) -> &Self {
1000 assert!(buf.len() >= Self::len());
1001 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1002 unsafe { std::mem::transmute(buf.as_ptr()) }
1003 }
1004 pub fn as_array(&self) -> &[u8; 200usize] {
1005 unsafe { std::mem::transmute(self) }
1006 }
1007 pub fn from_array(buf: &[u8; 200usize]) -> &Self {
1008 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1009 unsafe { std::mem::transmute(buf) }
1010 }
1011 pub fn into_array(self) -> [u8; 200usize] {
1012 unsafe { std::mem::transmute(self) }
1013 }
1014 pub const fn len() -> usize {
1015 const _: () = assert!(std::mem::size_of::<RtnlLinkStats64>() == 200usize);
1016 200usize
1017 }
1018}
1019impl std::fmt::Debug for RtnlLinkStats64 {
1020 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1021 fmt.debug_struct("RtnlLinkStats64")
1022 .field("rx_packets", &{ self.rx_packets })
1023 .field("tx_packets", &{ self.tx_packets })
1024 .field("rx_bytes", &{ self.rx_bytes })
1025 .field("tx_bytes", &{ self.tx_bytes })
1026 .field("rx_errors", &{ self.rx_errors })
1027 .field("tx_errors", &{ self.tx_errors })
1028 .field("rx_dropped", &{ self.rx_dropped })
1029 .field("tx_dropped", &{ self.tx_dropped })
1030 .field("multicast", &{ self.multicast })
1031 .field("collisions", &{ self.collisions })
1032 .field("rx_length_errors", &{ self.rx_length_errors })
1033 .field("rx_over_errors", &{ self.rx_over_errors })
1034 .field("rx_crc_errors", &{ self.rx_crc_errors })
1035 .field("rx_frame_errors", &{ self.rx_frame_errors })
1036 .field("rx_fifo_errors", &{ self.rx_fifo_errors })
1037 .field("rx_missed_errors", &{ self.rx_missed_errors })
1038 .field("tx_aborted_errors", &{ self.tx_aborted_errors })
1039 .field("tx_carrier_errors", &{ self.tx_carrier_errors })
1040 .field("tx_fifo_errors", &{ self.tx_fifo_errors })
1041 .field("tx_heartbeat_errors", &{ self.tx_heartbeat_errors })
1042 .field("tx_window_errors", &{ self.tx_window_errors })
1043 .field("rx_compressed", &{ self.rx_compressed })
1044 .field("tx_compressed", &{ self.tx_compressed })
1045 .field("rx_nohandler", &{ self.rx_nohandler })
1046 .field("rx_otherhost_dropped", &{ self.rx_otherhost_dropped })
1047 .finish()
1048 }
1049}
1050#[repr(C, packed(4))]
1051pub struct RtnlLinkIfmap {
1052 pub mem_start: u64,
1053 pub mem_end: u64,
1054 pub base_addr: u64,
1055 pub irq: u16,
1056 pub dma: u8,
1057 pub port: u8,
1058 pub _pad_28: [u8; 4usize],
1059}
1060impl Clone for RtnlLinkIfmap {
1061 fn clone(&self) -> Self {
1062 Self::new_from_array(*self.as_array())
1063 }
1064}
1065#[doc = "Create zero-initialized struct"]
1066impl Default for RtnlLinkIfmap {
1067 fn default() -> Self {
1068 Self::new()
1069 }
1070}
1071impl RtnlLinkIfmap {
1072 #[doc = "Create zero-initialized struct"]
1073 pub fn new() -> Self {
1074 Self::new_from_array([0u8; Self::len()])
1075 }
1076 #[doc = "Copy from contents from slice"]
1077 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1078 if other.len() != Self::len() {
1079 return None;
1080 }
1081 let mut buf = [0u8; Self::len()];
1082 buf.clone_from_slice(other);
1083 Some(Self::new_from_array(buf))
1084 }
1085 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1086 pub fn new_from_zeroed(other: &[u8]) -> Self {
1087 let mut buf = [0u8; Self::len()];
1088 let len = buf.len().min(other.len());
1089 buf[..len].clone_from_slice(&other[..len]);
1090 Self::new_from_array(buf)
1091 }
1092 pub fn new_from_array(buf: [u8; 32usize]) -> Self {
1093 unsafe { std::mem::transmute(buf) }
1094 }
1095 pub fn as_slice(&self) -> &[u8] {
1096 unsafe {
1097 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1098 std::slice::from_raw_parts(ptr, Self::len())
1099 }
1100 }
1101 pub fn from_slice(buf: &[u8]) -> &Self {
1102 assert!(buf.len() >= Self::len());
1103 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1104 unsafe { std::mem::transmute(buf.as_ptr()) }
1105 }
1106 pub fn as_array(&self) -> &[u8; 32usize] {
1107 unsafe { std::mem::transmute(self) }
1108 }
1109 pub fn from_array(buf: &[u8; 32usize]) -> &Self {
1110 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1111 unsafe { std::mem::transmute(buf) }
1112 }
1113 pub fn into_array(self) -> [u8; 32usize] {
1114 unsafe { std::mem::transmute(self) }
1115 }
1116 pub const fn len() -> usize {
1117 const _: () = assert!(std::mem::size_of::<RtnlLinkIfmap>() == 32usize);
1118 32usize
1119 }
1120}
1121impl std::fmt::Debug for RtnlLinkIfmap {
1122 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1123 fmt.debug_struct("RtnlLinkIfmap")
1124 .field("mem_start", &{ self.mem_start })
1125 .field("mem_end", &{ self.mem_end })
1126 .field("base_addr", &{ self.base_addr })
1127 .field("irq", &self.irq)
1128 .field("dma", &self.dma)
1129 .field("port", &self.port)
1130 .finish()
1131 }
1132}
1133#[derive(Debug)]
1134#[repr(C, packed(4))]
1135pub struct BrBooloptMulti {
1136 pub optval: u32,
1137 pub optmask: u32,
1138}
1139impl Clone for BrBooloptMulti {
1140 fn clone(&self) -> Self {
1141 Self::new_from_array(*self.as_array())
1142 }
1143}
1144#[doc = "Create zero-initialized struct"]
1145impl Default for BrBooloptMulti {
1146 fn default() -> Self {
1147 Self::new()
1148 }
1149}
1150impl BrBooloptMulti {
1151 #[doc = "Create zero-initialized struct"]
1152 pub fn new() -> Self {
1153 Self::new_from_array([0u8; Self::len()])
1154 }
1155 #[doc = "Copy from contents from slice"]
1156 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1157 if other.len() != Self::len() {
1158 return None;
1159 }
1160 let mut buf = [0u8; Self::len()];
1161 buf.clone_from_slice(other);
1162 Some(Self::new_from_array(buf))
1163 }
1164 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1165 pub fn new_from_zeroed(other: &[u8]) -> Self {
1166 let mut buf = [0u8; Self::len()];
1167 let len = buf.len().min(other.len());
1168 buf[..len].clone_from_slice(&other[..len]);
1169 Self::new_from_array(buf)
1170 }
1171 pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1172 unsafe { std::mem::transmute(buf) }
1173 }
1174 pub fn as_slice(&self) -> &[u8] {
1175 unsafe {
1176 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1177 std::slice::from_raw_parts(ptr, Self::len())
1178 }
1179 }
1180 pub fn from_slice(buf: &[u8]) -> &Self {
1181 assert!(buf.len() >= Self::len());
1182 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1183 unsafe { std::mem::transmute(buf.as_ptr()) }
1184 }
1185 pub fn as_array(&self) -> &[u8; 8usize] {
1186 unsafe { std::mem::transmute(self) }
1187 }
1188 pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1189 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1190 unsafe { std::mem::transmute(buf) }
1191 }
1192 pub fn into_array(self) -> [u8; 8usize] {
1193 unsafe { std::mem::transmute(self) }
1194 }
1195 pub const fn len() -> usize {
1196 const _: () = assert!(std::mem::size_of::<BrBooloptMulti>() == 8usize);
1197 8usize
1198 }
1199}
1200#[repr(C, packed(4))]
1201pub struct IfStatsMsg {
1202 pub family: u8,
1203 pub _pad: [u8; 3usize],
1204 pub ifindex: u32,
1205 pub filter_mask: u32,
1206}
1207impl Clone for IfStatsMsg {
1208 fn clone(&self) -> Self {
1209 Self::new_from_array(*self.as_array())
1210 }
1211}
1212#[doc = "Create zero-initialized struct"]
1213impl Default for IfStatsMsg {
1214 fn default() -> Self {
1215 Self::new()
1216 }
1217}
1218impl IfStatsMsg {
1219 #[doc = "Create zero-initialized struct"]
1220 pub fn new() -> Self {
1221 Self::new_from_array([0u8; Self::len()])
1222 }
1223 #[doc = "Copy from contents from slice"]
1224 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1225 if other.len() != Self::len() {
1226 return None;
1227 }
1228 let mut buf = [0u8; Self::len()];
1229 buf.clone_from_slice(other);
1230 Some(Self::new_from_array(buf))
1231 }
1232 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1233 pub fn new_from_zeroed(other: &[u8]) -> Self {
1234 let mut buf = [0u8; Self::len()];
1235 let len = buf.len().min(other.len());
1236 buf[..len].clone_from_slice(&other[..len]);
1237 Self::new_from_array(buf)
1238 }
1239 pub fn new_from_array(buf: [u8; 12usize]) -> Self {
1240 unsafe { std::mem::transmute(buf) }
1241 }
1242 pub fn as_slice(&self) -> &[u8] {
1243 unsafe {
1244 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1245 std::slice::from_raw_parts(ptr, Self::len())
1246 }
1247 }
1248 pub fn from_slice(buf: &[u8]) -> &Self {
1249 assert!(buf.len() >= Self::len());
1250 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1251 unsafe { std::mem::transmute(buf.as_ptr()) }
1252 }
1253 pub fn as_array(&self) -> &[u8; 12usize] {
1254 unsafe { std::mem::transmute(self) }
1255 }
1256 pub fn from_array(buf: &[u8; 12usize]) -> &Self {
1257 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1258 unsafe { std::mem::transmute(buf) }
1259 }
1260 pub fn into_array(self) -> [u8; 12usize] {
1261 unsafe { std::mem::transmute(self) }
1262 }
1263 pub const fn len() -> usize {
1264 const _: () = assert!(std::mem::size_of::<IfStatsMsg>() == 12usize);
1265 12usize
1266 }
1267}
1268impl std::fmt::Debug for IfStatsMsg {
1269 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1270 fmt.debug_struct("IfStatsMsg")
1271 .field("family", &self.family)
1272 .field("ifindex", &self.ifindex)
1273 .field("filter_mask", &self.filter_mask)
1274 .finish()
1275 }
1276}
1277#[repr(C, packed(4))]
1278pub struct IflaVlanFlags {
1279 #[doc = "Associated type: [`VlanFlags`] (1 bit per enumeration)"]
1280 pub flags: u32,
1281 pub mask: u32,
1282}
1283impl Clone for IflaVlanFlags {
1284 fn clone(&self) -> Self {
1285 Self::new_from_array(*self.as_array())
1286 }
1287}
1288#[doc = "Create zero-initialized struct"]
1289impl Default for IflaVlanFlags {
1290 fn default() -> Self {
1291 Self::new()
1292 }
1293}
1294impl IflaVlanFlags {
1295 #[doc = "Create zero-initialized struct"]
1296 pub fn new() -> Self {
1297 Self::new_from_array([0u8; Self::len()])
1298 }
1299 #[doc = "Copy from contents from slice"]
1300 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1301 if other.len() != Self::len() {
1302 return None;
1303 }
1304 let mut buf = [0u8; Self::len()];
1305 buf.clone_from_slice(other);
1306 Some(Self::new_from_array(buf))
1307 }
1308 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1309 pub fn new_from_zeroed(other: &[u8]) -> Self {
1310 let mut buf = [0u8; Self::len()];
1311 let len = buf.len().min(other.len());
1312 buf[..len].clone_from_slice(&other[..len]);
1313 Self::new_from_array(buf)
1314 }
1315 pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1316 unsafe { std::mem::transmute(buf) }
1317 }
1318 pub fn as_slice(&self) -> &[u8] {
1319 unsafe {
1320 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1321 std::slice::from_raw_parts(ptr, Self::len())
1322 }
1323 }
1324 pub fn from_slice(buf: &[u8]) -> &Self {
1325 assert!(buf.len() >= Self::len());
1326 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1327 unsafe { std::mem::transmute(buf.as_ptr()) }
1328 }
1329 pub fn as_array(&self) -> &[u8; 8usize] {
1330 unsafe { std::mem::transmute(self) }
1331 }
1332 pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1333 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1334 unsafe { std::mem::transmute(buf) }
1335 }
1336 pub fn into_array(self) -> [u8; 8usize] {
1337 unsafe { std::mem::transmute(self) }
1338 }
1339 pub const fn len() -> usize {
1340 const _: () = assert!(std::mem::size_of::<IflaVlanFlags>() == 8usize);
1341 8usize
1342 }
1343}
1344impl std::fmt::Debug for IflaVlanFlags {
1345 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1346 fmt.debug_struct("IflaVlanFlags")
1347 .field(
1348 "flags",
1349 &FormatFlags(self.flags.into(), VlanFlags::from_value),
1350 )
1351 .field("mask", &FormatHex(self.mask.to_ne_bytes()))
1352 .finish()
1353 }
1354}
1355#[derive(Debug)]
1356#[repr(C, packed(4))]
1357pub struct IflaVlanQosMapping {
1358 pub from: u32,
1359 pub to: u32,
1360}
1361impl Clone for IflaVlanQosMapping {
1362 fn clone(&self) -> Self {
1363 Self::new_from_array(*self.as_array())
1364 }
1365}
1366#[doc = "Create zero-initialized struct"]
1367impl Default for IflaVlanQosMapping {
1368 fn default() -> Self {
1369 Self::new()
1370 }
1371}
1372impl IflaVlanQosMapping {
1373 #[doc = "Create zero-initialized struct"]
1374 pub fn new() -> Self {
1375 Self::new_from_array([0u8; Self::len()])
1376 }
1377 #[doc = "Copy from contents from slice"]
1378 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1379 if other.len() != Self::len() {
1380 return None;
1381 }
1382 let mut buf = [0u8; Self::len()];
1383 buf.clone_from_slice(other);
1384 Some(Self::new_from_array(buf))
1385 }
1386 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1387 pub fn new_from_zeroed(other: &[u8]) -> Self {
1388 let mut buf = [0u8; Self::len()];
1389 let len = buf.len().min(other.len());
1390 buf[..len].clone_from_slice(&other[..len]);
1391 Self::new_from_array(buf)
1392 }
1393 pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1394 unsafe { std::mem::transmute(buf) }
1395 }
1396 pub fn as_slice(&self) -> &[u8] {
1397 unsafe {
1398 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1399 std::slice::from_raw_parts(ptr, Self::len())
1400 }
1401 }
1402 pub fn from_slice(buf: &[u8]) -> &Self {
1403 assert!(buf.len() >= Self::len());
1404 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1405 unsafe { std::mem::transmute(buf.as_ptr()) }
1406 }
1407 pub fn as_array(&self) -> &[u8; 8usize] {
1408 unsafe { std::mem::transmute(self) }
1409 }
1410 pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1411 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1412 unsafe { std::mem::transmute(buf) }
1413 }
1414 pub fn into_array(self) -> [u8; 8usize] {
1415 unsafe { std::mem::transmute(self) }
1416 }
1417 pub const fn len() -> usize {
1418 const _: () = assert!(std::mem::size_of::<IflaVlanQosMapping>() == 8usize);
1419 8usize
1420 }
1421}
1422#[repr(C, packed(4))]
1423pub struct IflaGenevePortRange {
1424 pub _low_be: u16,
1425 pub _high_be: u16,
1426}
1427impl Clone for IflaGenevePortRange {
1428 fn clone(&self) -> Self {
1429 Self::new_from_array(*self.as_array())
1430 }
1431}
1432#[doc = "Create zero-initialized struct"]
1433impl Default for IflaGenevePortRange {
1434 fn default() -> Self {
1435 Self::new()
1436 }
1437}
1438impl IflaGenevePortRange {
1439 #[doc = "Create zero-initialized struct"]
1440 pub fn new() -> Self {
1441 Self::new_from_array([0u8; Self::len()])
1442 }
1443 #[doc = "Copy from contents from slice"]
1444 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1445 if other.len() != Self::len() {
1446 return None;
1447 }
1448 let mut buf = [0u8; Self::len()];
1449 buf.clone_from_slice(other);
1450 Some(Self::new_from_array(buf))
1451 }
1452 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1453 pub fn new_from_zeroed(other: &[u8]) -> Self {
1454 let mut buf = [0u8; Self::len()];
1455 let len = buf.len().min(other.len());
1456 buf[..len].clone_from_slice(&other[..len]);
1457 Self::new_from_array(buf)
1458 }
1459 pub fn new_from_array(buf: [u8; 4usize]) -> Self {
1460 unsafe { std::mem::transmute(buf) }
1461 }
1462 pub fn as_slice(&self) -> &[u8] {
1463 unsafe {
1464 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1465 std::slice::from_raw_parts(ptr, Self::len())
1466 }
1467 }
1468 pub fn from_slice(buf: &[u8]) -> &Self {
1469 assert!(buf.len() >= Self::len());
1470 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1471 unsafe { std::mem::transmute(buf.as_ptr()) }
1472 }
1473 pub fn as_array(&self) -> &[u8; 4usize] {
1474 unsafe { std::mem::transmute(self) }
1475 }
1476 pub fn from_array(buf: &[u8; 4usize]) -> &Self {
1477 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1478 unsafe { std::mem::transmute(buf) }
1479 }
1480 pub fn into_array(self) -> [u8; 4usize] {
1481 unsafe { std::mem::transmute(self) }
1482 }
1483 pub const fn len() -> usize {
1484 const _: () = assert!(std::mem::size_of::<IflaGenevePortRange>() == 4usize);
1485 4usize
1486 }
1487 pub fn low(&self) -> u16 {
1488 u16::from_be(self._low_be)
1489 }
1490 pub fn set_low(&mut self, value: u16) {
1491 self._low_be = value.to_be();
1492 }
1493 pub fn high(&self) -> u16 {
1494 u16::from_be(self._high_be)
1495 }
1496 pub fn set_high(&mut self, value: u16) {
1497 self._high_be = value.to_be();
1498 }
1499}
1500impl std::fmt::Debug for IflaGenevePortRange {
1501 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1502 fmt.debug_struct("IflaGenevePortRange")
1503 .field("low", &self.low())
1504 .field("high", &self.high())
1505 .finish()
1506 }
1507}
1508#[derive(Debug)]
1509#[repr(C, packed(4))]
1510pub struct IflaVfMac {
1511 pub vf: u32,
1512 pub mac: [u8; 32usize],
1513}
1514impl Clone for IflaVfMac {
1515 fn clone(&self) -> Self {
1516 Self::new_from_array(*self.as_array())
1517 }
1518}
1519#[doc = "Create zero-initialized struct"]
1520impl Default for IflaVfMac {
1521 fn default() -> Self {
1522 Self::new()
1523 }
1524}
1525impl IflaVfMac {
1526 #[doc = "Create zero-initialized struct"]
1527 pub fn new() -> Self {
1528 Self::new_from_array([0u8; Self::len()])
1529 }
1530 #[doc = "Copy from contents from slice"]
1531 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1532 if other.len() != Self::len() {
1533 return None;
1534 }
1535 let mut buf = [0u8; Self::len()];
1536 buf.clone_from_slice(other);
1537 Some(Self::new_from_array(buf))
1538 }
1539 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1540 pub fn new_from_zeroed(other: &[u8]) -> Self {
1541 let mut buf = [0u8; Self::len()];
1542 let len = buf.len().min(other.len());
1543 buf[..len].clone_from_slice(&other[..len]);
1544 Self::new_from_array(buf)
1545 }
1546 pub fn new_from_array(buf: [u8; 36usize]) -> Self {
1547 unsafe { std::mem::transmute(buf) }
1548 }
1549 pub fn as_slice(&self) -> &[u8] {
1550 unsafe {
1551 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1552 std::slice::from_raw_parts(ptr, Self::len())
1553 }
1554 }
1555 pub fn from_slice(buf: &[u8]) -> &Self {
1556 assert!(buf.len() >= Self::len());
1557 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1558 unsafe { std::mem::transmute(buf.as_ptr()) }
1559 }
1560 pub fn as_array(&self) -> &[u8; 36usize] {
1561 unsafe { std::mem::transmute(self) }
1562 }
1563 pub fn from_array(buf: &[u8; 36usize]) -> &Self {
1564 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1565 unsafe { std::mem::transmute(buf) }
1566 }
1567 pub fn into_array(self) -> [u8; 36usize] {
1568 unsafe { std::mem::transmute(self) }
1569 }
1570 pub const fn len() -> usize {
1571 const _: () = assert!(std::mem::size_of::<IflaVfMac>() == 36usize);
1572 36usize
1573 }
1574}
1575#[derive(Debug)]
1576#[repr(C, packed(4))]
1577pub struct IflaVfVlan {
1578 pub vf: u32,
1579 pub vlan: u32,
1580 pub qos: u32,
1581}
1582impl Clone for IflaVfVlan {
1583 fn clone(&self) -> Self {
1584 Self::new_from_array(*self.as_array())
1585 }
1586}
1587#[doc = "Create zero-initialized struct"]
1588impl Default for IflaVfVlan {
1589 fn default() -> Self {
1590 Self::new()
1591 }
1592}
1593impl IflaVfVlan {
1594 #[doc = "Create zero-initialized struct"]
1595 pub fn new() -> Self {
1596 Self::new_from_array([0u8; Self::len()])
1597 }
1598 #[doc = "Copy from contents from slice"]
1599 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1600 if other.len() != Self::len() {
1601 return None;
1602 }
1603 let mut buf = [0u8; Self::len()];
1604 buf.clone_from_slice(other);
1605 Some(Self::new_from_array(buf))
1606 }
1607 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1608 pub fn new_from_zeroed(other: &[u8]) -> Self {
1609 let mut buf = [0u8; Self::len()];
1610 let len = buf.len().min(other.len());
1611 buf[..len].clone_from_slice(&other[..len]);
1612 Self::new_from_array(buf)
1613 }
1614 pub fn new_from_array(buf: [u8; 12usize]) -> Self {
1615 unsafe { std::mem::transmute(buf) }
1616 }
1617 pub fn as_slice(&self) -> &[u8] {
1618 unsafe {
1619 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1620 std::slice::from_raw_parts(ptr, Self::len())
1621 }
1622 }
1623 pub fn from_slice(buf: &[u8]) -> &Self {
1624 assert!(buf.len() >= Self::len());
1625 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1626 unsafe { std::mem::transmute(buf.as_ptr()) }
1627 }
1628 pub fn as_array(&self) -> &[u8; 12usize] {
1629 unsafe { std::mem::transmute(self) }
1630 }
1631 pub fn from_array(buf: &[u8; 12usize]) -> &Self {
1632 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1633 unsafe { std::mem::transmute(buf) }
1634 }
1635 pub fn into_array(self) -> [u8; 12usize] {
1636 unsafe { std::mem::transmute(self) }
1637 }
1638 pub const fn len() -> usize {
1639 const _: () = assert!(std::mem::size_of::<IflaVfVlan>() == 12usize);
1640 12usize
1641 }
1642}
1643#[derive(Debug)]
1644#[repr(C, packed(4))]
1645pub struct IflaVfTxRate {
1646 pub vf: u32,
1647 pub rate: u32,
1648}
1649impl Clone for IflaVfTxRate {
1650 fn clone(&self) -> Self {
1651 Self::new_from_array(*self.as_array())
1652 }
1653}
1654#[doc = "Create zero-initialized struct"]
1655impl Default for IflaVfTxRate {
1656 fn default() -> Self {
1657 Self::new()
1658 }
1659}
1660impl IflaVfTxRate {
1661 #[doc = "Create zero-initialized struct"]
1662 pub fn new() -> Self {
1663 Self::new_from_array([0u8; Self::len()])
1664 }
1665 #[doc = "Copy from contents from slice"]
1666 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1667 if other.len() != Self::len() {
1668 return None;
1669 }
1670 let mut buf = [0u8; Self::len()];
1671 buf.clone_from_slice(other);
1672 Some(Self::new_from_array(buf))
1673 }
1674 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1675 pub fn new_from_zeroed(other: &[u8]) -> Self {
1676 let mut buf = [0u8; Self::len()];
1677 let len = buf.len().min(other.len());
1678 buf[..len].clone_from_slice(&other[..len]);
1679 Self::new_from_array(buf)
1680 }
1681 pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1682 unsafe { std::mem::transmute(buf) }
1683 }
1684 pub fn as_slice(&self) -> &[u8] {
1685 unsafe {
1686 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1687 std::slice::from_raw_parts(ptr, Self::len())
1688 }
1689 }
1690 pub fn from_slice(buf: &[u8]) -> &Self {
1691 assert!(buf.len() >= Self::len());
1692 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1693 unsafe { std::mem::transmute(buf.as_ptr()) }
1694 }
1695 pub fn as_array(&self) -> &[u8; 8usize] {
1696 unsafe { std::mem::transmute(self) }
1697 }
1698 pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1699 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1700 unsafe { std::mem::transmute(buf) }
1701 }
1702 pub fn into_array(self) -> [u8; 8usize] {
1703 unsafe { std::mem::transmute(self) }
1704 }
1705 pub const fn len() -> usize {
1706 const _: () = assert!(std::mem::size_of::<IflaVfTxRate>() == 8usize);
1707 8usize
1708 }
1709}
1710#[derive(Debug)]
1711#[repr(C, packed(4))]
1712pub struct IflaVfSpoofchk {
1713 pub vf: u32,
1714 pub setting: u32,
1715}
1716impl Clone for IflaVfSpoofchk {
1717 fn clone(&self) -> Self {
1718 Self::new_from_array(*self.as_array())
1719 }
1720}
1721#[doc = "Create zero-initialized struct"]
1722impl Default for IflaVfSpoofchk {
1723 fn default() -> Self {
1724 Self::new()
1725 }
1726}
1727impl IflaVfSpoofchk {
1728 #[doc = "Create zero-initialized struct"]
1729 pub fn new() -> Self {
1730 Self::new_from_array([0u8; Self::len()])
1731 }
1732 #[doc = "Copy from contents from slice"]
1733 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1734 if other.len() != Self::len() {
1735 return None;
1736 }
1737 let mut buf = [0u8; Self::len()];
1738 buf.clone_from_slice(other);
1739 Some(Self::new_from_array(buf))
1740 }
1741 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1742 pub fn new_from_zeroed(other: &[u8]) -> Self {
1743 let mut buf = [0u8; Self::len()];
1744 let len = buf.len().min(other.len());
1745 buf[..len].clone_from_slice(&other[..len]);
1746 Self::new_from_array(buf)
1747 }
1748 pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1749 unsafe { std::mem::transmute(buf) }
1750 }
1751 pub fn as_slice(&self) -> &[u8] {
1752 unsafe {
1753 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1754 std::slice::from_raw_parts(ptr, Self::len())
1755 }
1756 }
1757 pub fn from_slice(buf: &[u8]) -> &Self {
1758 assert!(buf.len() >= Self::len());
1759 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1760 unsafe { std::mem::transmute(buf.as_ptr()) }
1761 }
1762 pub fn as_array(&self) -> &[u8; 8usize] {
1763 unsafe { std::mem::transmute(self) }
1764 }
1765 pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1766 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1767 unsafe { std::mem::transmute(buf) }
1768 }
1769 pub fn into_array(self) -> [u8; 8usize] {
1770 unsafe { std::mem::transmute(self) }
1771 }
1772 pub const fn len() -> usize {
1773 const _: () = assert!(std::mem::size_of::<IflaVfSpoofchk>() == 8usize);
1774 8usize
1775 }
1776}
1777#[repr(C, packed(4))]
1778pub struct IflaVfLinkState {
1779 pub vf: u32,
1780 #[doc = "Associated type: [`IflaVfLinkStateEnum`] (enum)"]
1781 pub link_state: u32,
1782}
1783impl Clone for IflaVfLinkState {
1784 fn clone(&self) -> Self {
1785 Self::new_from_array(*self.as_array())
1786 }
1787}
1788#[doc = "Create zero-initialized struct"]
1789impl Default for IflaVfLinkState {
1790 fn default() -> Self {
1791 Self::new()
1792 }
1793}
1794impl IflaVfLinkState {
1795 #[doc = "Create zero-initialized struct"]
1796 pub fn new() -> Self {
1797 Self::new_from_array([0u8; Self::len()])
1798 }
1799 #[doc = "Copy from contents from slice"]
1800 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1801 if other.len() != Self::len() {
1802 return None;
1803 }
1804 let mut buf = [0u8; Self::len()];
1805 buf.clone_from_slice(other);
1806 Some(Self::new_from_array(buf))
1807 }
1808 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1809 pub fn new_from_zeroed(other: &[u8]) -> Self {
1810 let mut buf = [0u8; Self::len()];
1811 let len = buf.len().min(other.len());
1812 buf[..len].clone_from_slice(&other[..len]);
1813 Self::new_from_array(buf)
1814 }
1815 pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1816 unsafe { std::mem::transmute(buf) }
1817 }
1818 pub fn as_slice(&self) -> &[u8] {
1819 unsafe {
1820 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1821 std::slice::from_raw_parts(ptr, Self::len())
1822 }
1823 }
1824 pub fn from_slice(buf: &[u8]) -> &Self {
1825 assert!(buf.len() >= Self::len());
1826 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1827 unsafe { std::mem::transmute(buf.as_ptr()) }
1828 }
1829 pub fn as_array(&self) -> &[u8; 8usize] {
1830 unsafe { std::mem::transmute(self) }
1831 }
1832 pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1833 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1834 unsafe { std::mem::transmute(buf) }
1835 }
1836 pub fn into_array(self) -> [u8; 8usize] {
1837 unsafe { std::mem::transmute(self) }
1838 }
1839 pub const fn len() -> usize {
1840 const _: () = assert!(std::mem::size_of::<IflaVfLinkState>() == 8usize);
1841 8usize
1842 }
1843}
1844impl std::fmt::Debug for IflaVfLinkState {
1845 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1846 fmt.debug_struct("IflaVfLinkState")
1847 .field("vf", &self.vf)
1848 .field(
1849 "link_state",
1850 &FormatEnum(self.link_state.into(), IflaVfLinkStateEnum::from_value),
1851 )
1852 .finish()
1853 }
1854}
1855#[derive(Debug)]
1856#[repr(C, packed(4))]
1857pub struct IflaVfRate {
1858 pub vf: u32,
1859 pub min_tx_rate: u32,
1860 pub max_tx_rate: u32,
1861}
1862impl Clone for IflaVfRate {
1863 fn clone(&self) -> Self {
1864 Self::new_from_array(*self.as_array())
1865 }
1866}
1867#[doc = "Create zero-initialized struct"]
1868impl Default for IflaVfRate {
1869 fn default() -> Self {
1870 Self::new()
1871 }
1872}
1873impl IflaVfRate {
1874 #[doc = "Create zero-initialized struct"]
1875 pub fn new() -> Self {
1876 Self::new_from_array([0u8; Self::len()])
1877 }
1878 #[doc = "Copy from contents from slice"]
1879 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1880 if other.len() != Self::len() {
1881 return None;
1882 }
1883 let mut buf = [0u8; Self::len()];
1884 buf.clone_from_slice(other);
1885 Some(Self::new_from_array(buf))
1886 }
1887 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1888 pub fn new_from_zeroed(other: &[u8]) -> Self {
1889 let mut buf = [0u8; Self::len()];
1890 let len = buf.len().min(other.len());
1891 buf[..len].clone_from_slice(&other[..len]);
1892 Self::new_from_array(buf)
1893 }
1894 pub fn new_from_array(buf: [u8; 12usize]) -> Self {
1895 unsafe { std::mem::transmute(buf) }
1896 }
1897 pub fn as_slice(&self) -> &[u8] {
1898 unsafe {
1899 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1900 std::slice::from_raw_parts(ptr, Self::len())
1901 }
1902 }
1903 pub fn from_slice(buf: &[u8]) -> &Self {
1904 assert!(buf.len() >= Self::len());
1905 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1906 unsafe { std::mem::transmute(buf.as_ptr()) }
1907 }
1908 pub fn as_array(&self) -> &[u8; 12usize] {
1909 unsafe { std::mem::transmute(self) }
1910 }
1911 pub fn from_array(buf: &[u8; 12usize]) -> &Self {
1912 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1913 unsafe { std::mem::transmute(buf) }
1914 }
1915 pub fn into_array(self) -> [u8; 12usize] {
1916 unsafe { std::mem::transmute(self) }
1917 }
1918 pub const fn len() -> usize {
1919 const _: () = assert!(std::mem::size_of::<IflaVfRate>() == 12usize);
1920 12usize
1921 }
1922}
1923#[derive(Debug)]
1924#[repr(C, packed(4))]
1925pub struct IflaVfRssQueryEn {
1926 pub vf: u32,
1927 pub setting: u32,
1928}
1929impl Clone for IflaVfRssQueryEn {
1930 fn clone(&self) -> Self {
1931 Self::new_from_array(*self.as_array())
1932 }
1933}
1934#[doc = "Create zero-initialized struct"]
1935impl Default for IflaVfRssQueryEn {
1936 fn default() -> Self {
1937 Self::new()
1938 }
1939}
1940impl IflaVfRssQueryEn {
1941 #[doc = "Create zero-initialized struct"]
1942 pub fn new() -> Self {
1943 Self::new_from_array([0u8; Self::len()])
1944 }
1945 #[doc = "Copy from contents from slice"]
1946 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
1947 if other.len() != Self::len() {
1948 return None;
1949 }
1950 let mut buf = [0u8; Self::len()];
1951 buf.clone_from_slice(other);
1952 Some(Self::new_from_array(buf))
1953 }
1954 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
1955 pub fn new_from_zeroed(other: &[u8]) -> Self {
1956 let mut buf = [0u8; Self::len()];
1957 let len = buf.len().min(other.len());
1958 buf[..len].clone_from_slice(&other[..len]);
1959 Self::new_from_array(buf)
1960 }
1961 pub fn new_from_array(buf: [u8; 8usize]) -> Self {
1962 unsafe { std::mem::transmute(buf) }
1963 }
1964 pub fn as_slice(&self) -> &[u8] {
1965 unsafe {
1966 let ptr: *const u8 = std::mem::transmute(self as *const Self);
1967 std::slice::from_raw_parts(ptr, Self::len())
1968 }
1969 }
1970 pub fn from_slice(buf: &[u8]) -> &Self {
1971 assert!(buf.len() >= Self::len());
1972 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1973 unsafe { std::mem::transmute(buf.as_ptr()) }
1974 }
1975 pub fn as_array(&self) -> &[u8; 8usize] {
1976 unsafe { std::mem::transmute(self) }
1977 }
1978 pub fn from_array(buf: &[u8; 8usize]) -> &Self {
1979 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
1980 unsafe { std::mem::transmute(buf) }
1981 }
1982 pub fn into_array(self) -> [u8; 8usize] {
1983 unsafe { std::mem::transmute(self) }
1984 }
1985 pub const fn len() -> usize {
1986 const _: () = assert!(std::mem::size_of::<IflaVfRssQueryEn>() == 8usize);
1987 8usize
1988 }
1989}
1990#[derive(Debug)]
1991#[repr(C, packed(4))]
1992pub struct IflaVfTrust {
1993 pub vf: u32,
1994 pub setting: u32,
1995}
1996impl Clone for IflaVfTrust {
1997 fn clone(&self) -> Self {
1998 Self::new_from_array(*self.as_array())
1999 }
2000}
2001#[doc = "Create zero-initialized struct"]
2002impl Default for IflaVfTrust {
2003 fn default() -> Self {
2004 Self::new()
2005 }
2006}
2007impl IflaVfTrust {
2008 #[doc = "Create zero-initialized struct"]
2009 pub fn new() -> Self {
2010 Self::new_from_array([0u8; Self::len()])
2011 }
2012 #[doc = "Copy from contents from slice"]
2013 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
2014 if other.len() != Self::len() {
2015 return None;
2016 }
2017 let mut buf = [0u8; Self::len()];
2018 buf.clone_from_slice(other);
2019 Some(Self::new_from_array(buf))
2020 }
2021 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
2022 pub fn new_from_zeroed(other: &[u8]) -> Self {
2023 let mut buf = [0u8; Self::len()];
2024 let len = buf.len().min(other.len());
2025 buf[..len].clone_from_slice(&other[..len]);
2026 Self::new_from_array(buf)
2027 }
2028 pub fn new_from_array(buf: [u8; 8usize]) -> Self {
2029 unsafe { std::mem::transmute(buf) }
2030 }
2031 pub fn as_slice(&self) -> &[u8] {
2032 unsafe {
2033 let ptr: *const u8 = std::mem::transmute(self as *const Self);
2034 std::slice::from_raw_parts(ptr, Self::len())
2035 }
2036 }
2037 pub fn from_slice(buf: &[u8]) -> &Self {
2038 assert!(buf.len() >= Self::len());
2039 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2040 unsafe { std::mem::transmute(buf.as_ptr()) }
2041 }
2042 pub fn as_array(&self) -> &[u8; 8usize] {
2043 unsafe { std::mem::transmute(self) }
2044 }
2045 pub fn from_array(buf: &[u8; 8usize]) -> &Self {
2046 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2047 unsafe { std::mem::transmute(buf) }
2048 }
2049 pub fn into_array(self) -> [u8; 8usize] {
2050 unsafe { std::mem::transmute(self) }
2051 }
2052 pub const fn len() -> usize {
2053 const _: () = assert!(std::mem::size_of::<IflaVfTrust>() == 8usize);
2054 8usize
2055 }
2056}
2057#[repr(C, packed(4))]
2058pub struct IflaVfGuid {
2059 pub vf: u32,
2060 pub _pad_4: [u8; 4usize],
2061 pub guid: u64,
2062}
2063impl Clone for IflaVfGuid {
2064 fn clone(&self) -> Self {
2065 Self::new_from_array(*self.as_array())
2066 }
2067}
2068#[doc = "Create zero-initialized struct"]
2069impl Default for IflaVfGuid {
2070 fn default() -> Self {
2071 Self::new()
2072 }
2073}
2074impl IflaVfGuid {
2075 #[doc = "Create zero-initialized struct"]
2076 pub fn new() -> Self {
2077 Self::new_from_array([0u8; Self::len()])
2078 }
2079 #[doc = "Copy from contents from slice"]
2080 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
2081 if other.len() != Self::len() {
2082 return None;
2083 }
2084 let mut buf = [0u8; Self::len()];
2085 buf.clone_from_slice(other);
2086 Some(Self::new_from_array(buf))
2087 }
2088 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
2089 pub fn new_from_zeroed(other: &[u8]) -> Self {
2090 let mut buf = [0u8; Self::len()];
2091 let len = buf.len().min(other.len());
2092 buf[..len].clone_from_slice(&other[..len]);
2093 Self::new_from_array(buf)
2094 }
2095 pub fn new_from_array(buf: [u8; 16usize]) -> Self {
2096 unsafe { std::mem::transmute(buf) }
2097 }
2098 pub fn as_slice(&self) -> &[u8] {
2099 unsafe {
2100 let ptr: *const u8 = std::mem::transmute(self as *const Self);
2101 std::slice::from_raw_parts(ptr, Self::len())
2102 }
2103 }
2104 pub fn from_slice(buf: &[u8]) -> &Self {
2105 assert!(buf.len() >= Self::len());
2106 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2107 unsafe { std::mem::transmute(buf.as_ptr()) }
2108 }
2109 pub fn as_array(&self) -> &[u8; 16usize] {
2110 unsafe { std::mem::transmute(self) }
2111 }
2112 pub fn from_array(buf: &[u8; 16usize]) -> &Self {
2113 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2114 unsafe { std::mem::transmute(buf) }
2115 }
2116 pub fn into_array(self) -> [u8; 16usize] {
2117 unsafe { std::mem::transmute(self) }
2118 }
2119 pub const fn len() -> usize {
2120 const _: () = assert!(std::mem::size_of::<IflaVfGuid>() == 16usize);
2121 16usize
2122 }
2123}
2124impl std::fmt::Debug for IflaVfGuid {
2125 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
2126 fmt.debug_struct("IflaVfGuid")
2127 .field("vf", &self.vf)
2128 .field("guid", &{ self.guid })
2129 .finish()
2130 }
2131}
2132#[derive(Debug)]
2133#[repr(C, packed(4))]
2134pub struct IflaVfVlanInfo {
2135 pub vf: u32,
2136 pub vlan: u32,
2137 pub qos: u32,
2138 pub vlan_proto: u32,
2139}
2140impl Clone for IflaVfVlanInfo {
2141 fn clone(&self) -> Self {
2142 Self::new_from_array(*self.as_array())
2143 }
2144}
2145#[doc = "Create zero-initialized struct"]
2146impl Default for IflaVfVlanInfo {
2147 fn default() -> Self {
2148 Self::new()
2149 }
2150}
2151impl IflaVfVlanInfo {
2152 #[doc = "Create zero-initialized struct"]
2153 pub fn new() -> Self {
2154 Self::new_from_array([0u8; Self::len()])
2155 }
2156 #[doc = "Copy from contents from slice"]
2157 pub fn new_from_slice(other: &[u8]) -> Option<Self> {
2158 if other.len() != Self::len() {
2159 return None;
2160 }
2161 let mut buf = [0u8; Self::len()];
2162 buf.clone_from_slice(other);
2163 Some(Self::new_from_array(buf))
2164 }
2165 #[doc = "Copy from contents from another slice, padding with zeros or truncating when needed"]
2166 pub fn new_from_zeroed(other: &[u8]) -> Self {
2167 let mut buf = [0u8; Self::len()];
2168 let len = buf.len().min(other.len());
2169 buf[..len].clone_from_slice(&other[..len]);
2170 Self::new_from_array(buf)
2171 }
2172 pub fn new_from_array(buf: [u8; 16usize]) -> Self {
2173 unsafe { std::mem::transmute(buf) }
2174 }
2175 pub fn as_slice(&self) -> &[u8] {
2176 unsafe {
2177 let ptr: *const u8 = std::mem::transmute(self as *const Self);
2178 std::slice::from_raw_parts(ptr, Self::len())
2179 }
2180 }
2181 pub fn from_slice(buf: &[u8]) -> &Self {
2182 assert!(buf.len() >= Self::len());
2183 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2184 unsafe { std::mem::transmute(buf.as_ptr()) }
2185 }
2186 pub fn as_array(&self) -> &[u8; 16usize] {
2187 unsafe { std::mem::transmute(self) }
2188 }
2189 pub fn from_array(buf: &[u8; 16usize]) -> &Self {
2190 assert!(buf.as_ptr() as usize % std::mem::align_of::<Self>() == 0);
2191 unsafe { std::mem::transmute(buf) }
2192 }
2193 pub fn into_array(self) -> [u8; 16usize] {
2194 unsafe { std::mem::transmute(self) }
2195 }
2196 pub const fn len() -> usize {
2197 const _: () = assert!(std::mem::size_of::<IflaVfVlanInfo>() == 16usize);
2198 16usize
2199 }
2200}
2201#[derive(Clone)]
2202pub enum LinkAttrs<'a> {
2203 Address(&'a [u8]),
2204 Broadcast(&'a [u8]),
2205 Ifname(&'a CStr),
2206 Mtu(u32),
2207 Link(u32),
2208 Qdisc(&'a CStr),
2209 Stats(RtnlLinkStats),
2210 Master(u32),
2211 #[doc = "struct iw_event\n"]
2212 Wireless(&'a [u8]),
2213 #[doc = "A nest of ifla6-attrs or linkinfo-brport-attrs\n"]
2214 Protinfo(&'a [u8]),
2215 Txqlen(u32),
2216 Map(RtnlLinkIfmap),
2217 Weight(u32),
2218 Operstate(u8),
2219 Linkmode(u8),
2220 Linkinfo(IterableLinkinfoAttrs<'a>),
2221 NetNsPid(u32),
2222 Ifalias(&'a CStr),
2223 NumVf(u32),
2224 VfinfoList(IterableVfinfoListAttrs<'a>),
2225 Stats64(RtnlLinkStats64),
2226 VfPorts(IterableVfPortsAttrs<'a>),
2227 PortSelf(IterablePortSelfAttrs<'a>),
2228 AfSpec(IterableAfSpecAttrs<'a>),
2229 Group(u32),
2230 NetNsFd(u32),
2231 #[doc = "Associated type: [`RtextFilter`] (1 bit per enumeration)"]
2232 ExtMask(u32),
2233 Promiscuity(u32),
2234 NumTxQueues(u32),
2235 NumRxQueues(u32),
2236 Carrier(u8),
2237 PhysPortId(&'a [u8]),
2238 CarrierChanges(u32),
2239 PhysSwitchId(&'a [u8]),
2240 LinkNetnsid(i32),
2241 PhysPortName(&'a CStr),
2242 ProtoDown(u8),
2243 GsoMaxSegs(u32),
2244 GsoMaxSize(u32),
2245 Pad(&'a [u8]),
2246 Xdp(IterableXdpAttrs<'a>),
2247 Event(u32),
2248 NewNetnsid(i32),
2249 TargetNetnsid(i32),
2250 CarrierUpCount(u32),
2251 CarrierDownCount(u32),
2252 NewIfindex(i32),
2253 MinMtu(u32),
2254 MaxMtu(u32),
2255 PropList(IterablePropListLinkAttrs<'a>),
2256 AltIfname(&'a CStr),
2257 PermAddress(&'a [u8]),
2258 ProtoDownReason(&'a CStr),
2259 ParentDevName(&'a CStr),
2260 ParentDevBusName(&'a CStr),
2261 GroMaxSize(u32),
2262 TsoMaxSize(u32),
2263 TsoMaxSegs(u32),
2264 Allmulti(u32),
2265 DevlinkPort(&'a [u8]),
2266 GsoIpv4MaxSize(u32),
2267 GroIpv4MaxSize(u32),
2268 DpllPin(IterableLinkDpllPinAttrs<'a>),
2269 #[doc = "EDT offload horizon supported by the device (in nsec).\n"]
2270 MaxPacingOffloadHorizon(u32),
2271 NetnsImmutable(u8),
2272 Headroom(u16),
2273 Tailroom(u16),
2274}
2275impl<'a> IterableLinkAttrs<'a> {
2276 pub fn get_address(&self) -> Result<&'a [u8], ErrorContext> {
2277 let mut iter = self.clone();
2278 iter.pos = 0;
2279 for attr in iter {
2280 if let Ok(LinkAttrs::Address(val)) = attr {
2281 return Ok(val);
2282 }
2283 }
2284 Err(ErrorContext::new_missing(
2285 "LinkAttrs",
2286 "Address",
2287 self.orig_loc,
2288 self.buf.as_ptr() as usize,
2289 ))
2290 }
2291 pub fn get_broadcast(&self) -> Result<&'a [u8], ErrorContext> {
2292 let mut iter = self.clone();
2293 iter.pos = 0;
2294 for attr in iter {
2295 if let Ok(LinkAttrs::Broadcast(val)) = attr {
2296 return Ok(val);
2297 }
2298 }
2299 Err(ErrorContext::new_missing(
2300 "LinkAttrs",
2301 "Broadcast",
2302 self.orig_loc,
2303 self.buf.as_ptr() as usize,
2304 ))
2305 }
2306 pub fn get_ifname(&self) -> Result<&'a CStr, ErrorContext> {
2307 let mut iter = self.clone();
2308 iter.pos = 0;
2309 for attr in iter {
2310 if let Ok(LinkAttrs::Ifname(val)) = attr {
2311 return Ok(val);
2312 }
2313 }
2314 Err(ErrorContext::new_missing(
2315 "LinkAttrs",
2316 "Ifname",
2317 self.orig_loc,
2318 self.buf.as_ptr() as usize,
2319 ))
2320 }
2321 pub fn get_mtu(&self) -> Result<u32, ErrorContext> {
2322 let mut iter = self.clone();
2323 iter.pos = 0;
2324 for attr in iter {
2325 if let Ok(LinkAttrs::Mtu(val)) = attr {
2326 return Ok(val);
2327 }
2328 }
2329 Err(ErrorContext::new_missing(
2330 "LinkAttrs",
2331 "Mtu",
2332 self.orig_loc,
2333 self.buf.as_ptr() as usize,
2334 ))
2335 }
2336 pub fn get_link(&self) -> Result<u32, ErrorContext> {
2337 let mut iter = self.clone();
2338 iter.pos = 0;
2339 for attr in iter {
2340 if let Ok(LinkAttrs::Link(val)) = attr {
2341 return Ok(val);
2342 }
2343 }
2344 Err(ErrorContext::new_missing(
2345 "LinkAttrs",
2346 "Link",
2347 self.orig_loc,
2348 self.buf.as_ptr() as usize,
2349 ))
2350 }
2351 pub fn get_qdisc(&self) -> Result<&'a CStr, ErrorContext> {
2352 let mut iter = self.clone();
2353 iter.pos = 0;
2354 for attr in iter {
2355 if let Ok(LinkAttrs::Qdisc(val)) = attr {
2356 return Ok(val);
2357 }
2358 }
2359 Err(ErrorContext::new_missing(
2360 "LinkAttrs",
2361 "Qdisc",
2362 self.orig_loc,
2363 self.buf.as_ptr() as usize,
2364 ))
2365 }
2366 pub fn get_stats(&self) -> Result<RtnlLinkStats, ErrorContext> {
2367 let mut iter = self.clone();
2368 iter.pos = 0;
2369 for attr in iter {
2370 if let Ok(LinkAttrs::Stats(val)) = attr {
2371 return Ok(val);
2372 }
2373 }
2374 Err(ErrorContext::new_missing(
2375 "LinkAttrs",
2376 "Stats",
2377 self.orig_loc,
2378 self.buf.as_ptr() as usize,
2379 ))
2380 }
2381 pub fn get_master(&self) -> Result<u32, ErrorContext> {
2382 let mut iter = self.clone();
2383 iter.pos = 0;
2384 for attr in iter {
2385 if let Ok(LinkAttrs::Master(val)) = attr {
2386 return Ok(val);
2387 }
2388 }
2389 Err(ErrorContext::new_missing(
2390 "LinkAttrs",
2391 "Master",
2392 self.orig_loc,
2393 self.buf.as_ptr() as usize,
2394 ))
2395 }
2396 #[doc = "struct iw_event\n"]
2397 pub fn get_wireless(&self) -> Result<&'a [u8], ErrorContext> {
2398 let mut iter = self.clone();
2399 iter.pos = 0;
2400 for attr in iter {
2401 if let Ok(LinkAttrs::Wireless(val)) = attr {
2402 return Ok(val);
2403 }
2404 }
2405 Err(ErrorContext::new_missing(
2406 "LinkAttrs",
2407 "Wireless",
2408 self.orig_loc,
2409 self.buf.as_ptr() as usize,
2410 ))
2411 }
2412 #[doc = "A nest of ifla6-attrs or linkinfo-brport-attrs\n"]
2413 pub fn get_protinfo(&self) -> Result<&'a [u8], ErrorContext> {
2414 let mut iter = self.clone();
2415 iter.pos = 0;
2416 for attr in iter {
2417 if let Ok(LinkAttrs::Protinfo(val)) = attr {
2418 return Ok(val);
2419 }
2420 }
2421 Err(ErrorContext::new_missing(
2422 "LinkAttrs",
2423 "Protinfo",
2424 self.orig_loc,
2425 self.buf.as_ptr() as usize,
2426 ))
2427 }
2428 pub fn get_txqlen(&self) -> Result<u32, ErrorContext> {
2429 let mut iter = self.clone();
2430 iter.pos = 0;
2431 for attr in iter {
2432 if let Ok(LinkAttrs::Txqlen(val)) = attr {
2433 return Ok(val);
2434 }
2435 }
2436 Err(ErrorContext::new_missing(
2437 "LinkAttrs",
2438 "Txqlen",
2439 self.orig_loc,
2440 self.buf.as_ptr() as usize,
2441 ))
2442 }
2443 pub fn get_map(&self) -> Result<RtnlLinkIfmap, ErrorContext> {
2444 let mut iter = self.clone();
2445 iter.pos = 0;
2446 for attr in iter {
2447 if let Ok(LinkAttrs::Map(val)) = attr {
2448 return Ok(val);
2449 }
2450 }
2451 Err(ErrorContext::new_missing(
2452 "LinkAttrs",
2453 "Map",
2454 self.orig_loc,
2455 self.buf.as_ptr() as usize,
2456 ))
2457 }
2458 pub fn get_weight(&self) -> Result<u32, ErrorContext> {
2459 let mut iter = self.clone();
2460 iter.pos = 0;
2461 for attr in iter {
2462 if let Ok(LinkAttrs::Weight(val)) = attr {
2463 return Ok(val);
2464 }
2465 }
2466 Err(ErrorContext::new_missing(
2467 "LinkAttrs",
2468 "Weight",
2469 self.orig_loc,
2470 self.buf.as_ptr() as usize,
2471 ))
2472 }
2473 pub fn get_operstate(&self) -> Result<u8, ErrorContext> {
2474 let mut iter = self.clone();
2475 iter.pos = 0;
2476 for attr in iter {
2477 if let Ok(LinkAttrs::Operstate(val)) = attr {
2478 return Ok(val);
2479 }
2480 }
2481 Err(ErrorContext::new_missing(
2482 "LinkAttrs",
2483 "Operstate",
2484 self.orig_loc,
2485 self.buf.as_ptr() as usize,
2486 ))
2487 }
2488 pub fn get_linkmode(&self) -> Result<u8, ErrorContext> {
2489 let mut iter = self.clone();
2490 iter.pos = 0;
2491 for attr in iter {
2492 if let Ok(LinkAttrs::Linkmode(val)) = attr {
2493 return Ok(val);
2494 }
2495 }
2496 Err(ErrorContext::new_missing(
2497 "LinkAttrs",
2498 "Linkmode",
2499 self.orig_loc,
2500 self.buf.as_ptr() as usize,
2501 ))
2502 }
2503 pub fn get_linkinfo(&self) -> Result<IterableLinkinfoAttrs<'a>, ErrorContext> {
2504 let mut iter = self.clone();
2505 iter.pos = 0;
2506 for attr in iter {
2507 if let Ok(LinkAttrs::Linkinfo(val)) = attr {
2508 return Ok(val);
2509 }
2510 }
2511 Err(ErrorContext::new_missing(
2512 "LinkAttrs",
2513 "Linkinfo",
2514 self.orig_loc,
2515 self.buf.as_ptr() as usize,
2516 ))
2517 }
2518 pub fn get_net_ns_pid(&self) -> Result<u32, ErrorContext> {
2519 let mut iter = self.clone();
2520 iter.pos = 0;
2521 for attr in iter {
2522 if let Ok(LinkAttrs::NetNsPid(val)) = attr {
2523 return Ok(val);
2524 }
2525 }
2526 Err(ErrorContext::new_missing(
2527 "LinkAttrs",
2528 "NetNsPid",
2529 self.orig_loc,
2530 self.buf.as_ptr() as usize,
2531 ))
2532 }
2533 pub fn get_ifalias(&self) -> Result<&'a CStr, ErrorContext> {
2534 let mut iter = self.clone();
2535 iter.pos = 0;
2536 for attr in iter {
2537 if let Ok(LinkAttrs::Ifalias(val)) = attr {
2538 return Ok(val);
2539 }
2540 }
2541 Err(ErrorContext::new_missing(
2542 "LinkAttrs",
2543 "Ifalias",
2544 self.orig_loc,
2545 self.buf.as_ptr() as usize,
2546 ))
2547 }
2548 pub fn get_num_vf(&self) -> Result<u32, ErrorContext> {
2549 let mut iter = self.clone();
2550 iter.pos = 0;
2551 for attr in iter {
2552 if let Ok(LinkAttrs::NumVf(val)) = attr {
2553 return Ok(val);
2554 }
2555 }
2556 Err(ErrorContext::new_missing(
2557 "LinkAttrs",
2558 "NumVf",
2559 self.orig_loc,
2560 self.buf.as_ptr() as usize,
2561 ))
2562 }
2563 pub fn get_vfinfo_list(&self) -> Result<IterableVfinfoListAttrs<'a>, ErrorContext> {
2564 let mut iter = self.clone();
2565 iter.pos = 0;
2566 for attr in iter {
2567 if let Ok(LinkAttrs::VfinfoList(val)) = attr {
2568 return Ok(val);
2569 }
2570 }
2571 Err(ErrorContext::new_missing(
2572 "LinkAttrs",
2573 "VfinfoList",
2574 self.orig_loc,
2575 self.buf.as_ptr() as usize,
2576 ))
2577 }
2578 pub fn get_stats64(&self) -> Result<RtnlLinkStats64, ErrorContext> {
2579 let mut iter = self.clone();
2580 iter.pos = 0;
2581 for attr in iter {
2582 if let Ok(LinkAttrs::Stats64(val)) = attr {
2583 return Ok(val);
2584 }
2585 }
2586 Err(ErrorContext::new_missing(
2587 "LinkAttrs",
2588 "Stats64",
2589 self.orig_loc,
2590 self.buf.as_ptr() as usize,
2591 ))
2592 }
2593 pub fn get_vf_ports(&self) -> Result<IterableVfPortsAttrs<'a>, ErrorContext> {
2594 let mut iter = self.clone();
2595 iter.pos = 0;
2596 for attr in iter {
2597 if let Ok(LinkAttrs::VfPorts(val)) = attr {
2598 return Ok(val);
2599 }
2600 }
2601 Err(ErrorContext::new_missing(
2602 "LinkAttrs",
2603 "VfPorts",
2604 self.orig_loc,
2605 self.buf.as_ptr() as usize,
2606 ))
2607 }
2608 pub fn get_port_self(&self) -> Result<IterablePortSelfAttrs<'a>, ErrorContext> {
2609 let mut iter = self.clone();
2610 iter.pos = 0;
2611 for attr in iter {
2612 if let Ok(LinkAttrs::PortSelf(val)) = attr {
2613 return Ok(val);
2614 }
2615 }
2616 Err(ErrorContext::new_missing(
2617 "LinkAttrs",
2618 "PortSelf",
2619 self.orig_loc,
2620 self.buf.as_ptr() as usize,
2621 ))
2622 }
2623 pub fn get_af_spec(&self) -> Result<IterableAfSpecAttrs<'a>, ErrorContext> {
2624 let mut iter = self.clone();
2625 iter.pos = 0;
2626 for attr in iter {
2627 if let Ok(LinkAttrs::AfSpec(val)) = attr {
2628 return Ok(val);
2629 }
2630 }
2631 Err(ErrorContext::new_missing(
2632 "LinkAttrs",
2633 "AfSpec",
2634 self.orig_loc,
2635 self.buf.as_ptr() as usize,
2636 ))
2637 }
2638 pub fn get_group(&self) -> Result<u32, ErrorContext> {
2639 let mut iter = self.clone();
2640 iter.pos = 0;
2641 for attr in iter {
2642 if let Ok(LinkAttrs::Group(val)) = attr {
2643 return Ok(val);
2644 }
2645 }
2646 Err(ErrorContext::new_missing(
2647 "LinkAttrs",
2648 "Group",
2649 self.orig_loc,
2650 self.buf.as_ptr() as usize,
2651 ))
2652 }
2653 pub fn get_net_ns_fd(&self) -> Result<u32, ErrorContext> {
2654 let mut iter = self.clone();
2655 iter.pos = 0;
2656 for attr in iter {
2657 if let Ok(LinkAttrs::NetNsFd(val)) = attr {
2658 return Ok(val);
2659 }
2660 }
2661 Err(ErrorContext::new_missing(
2662 "LinkAttrs",
2663 "NetNsFd",
2664 self.orig_loc,
2665 self.buf.as_ptr() as usize,
2666 ))
2667 }
2668 #[doc = "Associated type: [`RtextFilter`] (1 bit per enumeration)"]
2669 pub fn get_ext_mask(&self) -> Result<u32, ErrorContext> {
2670 let mut iter = self.clone();
2671 iter.pos = 0;
2672 for attr in iter {
2673 if let Ok(LinkAttrs::ExtMask(val)) = attr {
2674 return Ok(val);
2675 }
2676 }
2677 Err(ErrorContext::new_missing(
2678 "LinkAttrs",
2679 "ExtMask",
2680 self.orig_loc,
2681 self.buf.as_ptr() as usize,
2682 ))
2683 }
2684 pub fn get_promiscuity(&self) -> Result<u32, ErrorContext> {
2685 let mut iter = self.clone();
2686 iter.pos = 0;
2687 for attr in iter {
2688 if let Ok(LinkAttrs::Promiscuity(val)) = attr {
2689 return Ok(val);
2690 }
2691 }
2692 Err(ErrorContext::new_missing(
2693 "LinkAttrs",
2694 "Promiscuity",
2695 self.orig_loc,
2696 self.buf.as_ptr() as usize,
2697 ))
2698 }
2699 pub fn get_num_tx_queues(&self) -> Result<u32, ErrorContext> {
2700 let mut iter = self.clone();
2701 iter.pos = 0;
2702 for attr in iter {
2703 if let Ok(LinkAttrs::NumTxQueues(val)) = attr {
2704 return Ok(val);
2705 }
2706 }
2707 Err(ErrorContext::new_missing(
2708 "LinkAttrs",
2709 "NumTxQueues",
2710 self.orig_loc,
2711 self.buf.as_ptr() as usize,
2712 ))
2713 }
2714 pub fn get_num_rx_queues(&self) -> Result<u32, ErrorContext> {
2715 let mut iter = self.clone();
2716 iter.pos = 0;
2717 for attr in iter {
2718 if let Ok(LinkAttrs::NumRxQueues(val)) = attr {
2719 return Ok(val);
2720 }
2721 }
2722 Err(ErrorContext::new_missing(
2723 "LinkAttrs",
2724 "NumRxQueues",
2725 self.orig_loc,
2726 self.buf.as_ptr() as usize,
2727 ))
2728 }
2729 pub fn get_carrier(&self) -> Result<u8, ErrorContext> {
2730 let mut iter = self.clone();
2731 iter.pos = 0;
2732 for attr in iter {
2733 if let Ok(LinkAttrs::Carrier(val)) = attr {
2734 return Ok(val);
2735 }
2736 }
2737 Err(ErrorContext::new_missing(
2738 "LinkAttrs",
2739 "Carrier",
2740 self.orig_loc,
2741 self.buf.as_ptr() as usize,
2742 ))
2743 }
2744 pub fn get_phys_port_id(&self) -> Result<&'a [u8], ErrorContext> {
2745 let mut iter = self.clone();
2746 iter.pos = 0;
2747 for attr in iter {
2748 if let Ok(LinkAttrs::PhysPortId(val)) = attr {
2749 return Ok(val);
2750 }
2751 }
2752 Err(ErrorContext::new_missing(
2753 "LinkAttrs",
2754 "PhysPortId",
2755 self.orig_loc,
2756 self.buf.as_ptr() as usize,
2757 ))
2758 }
2759 pub fn get_carrier_changes(&self) -> Result<u32, ErrorContext> {
2760 let mut iter = self.clone();
2761 iter.pos = 0;
2762 for attr in iter {
2763 if let Ok(LinkAttrs::CarrierChanges(val)) = attr {
2764 return Ok(val);
2765 }
2766 }
2767 Err(ErrorContext::new_missing(
2768 "LinkAttrs",
2769 "CarrierChanges",
2770 self.orig_loc,
2771 self.buf.as_ptr() as usize,
2772 ))
2773 }
2774 pub fn get_phys_switch_id(&self) -> Result<&'a [u8], ErrorContext> {
2775 let mut iter = self.clone();
2776 iter.pos = 0;
2777 for attr in iter {
2778 if let Ok(LinkAttrs::PhysSwitchId(val)) = attr {
2779 return Ok(val);
2780 }
2781 }
2782 Err(ErrorContext::new_missing(
2783 "LinkAttrs",
2784 "PhysSwitchId",
2785 self.orig_loc,
2786 self.buf.as_ptr() as usize,
2787 ))
2788 }
2789 pub fn get_link_netnsid(&self) -> Result<i32, ErrorContext> {
2790 let mut iter = self.clone();
2791 iter.pos = 0;
2792 for attr in iter {
2793 if let Ok(LinkAttrs::LinkNetnsid(val)) = attr {
2794 return Ok(val);
2795 }
2796 }
2797 Err(ErrorContext::new_missing(
2798 "LinkAttrs",
2799 "LinkNetnsid",
2800 self.orig_loc,
2801 self.buf.as_ptr() as usize,
2802 ))
2803 }
2804 pub fn get_phys_port_name(&self) -> Result<&'a CStr, ErrorContext> {
2805 let mut iter = self.clone();
2806 iter.pos = 0;
2807 for attr in iter {
2808 if let Ok(LinkAttrs::PhysPortName(val)) = attr {
2809 return Ok(val);
2810 }
2811 }
2812 Err(ErrorContext::new_missing(
2813 "LinkAttrs",
2814 "PhysPortName",
2815 self.orig_loc,
2816 self.buf.as_ptr() as usize,
2817 ))
2818 }
2819 pub fn get_proto_down(&self) -> Result<u8, ErrorContext> {
2820 let mut iter = self.clone();
2821 iter.pos = 0;
2822 for attr in iter {
2823 if let Ok(LinkAttrs::ProtoDown(val)) = attr {
2824 return Ok(val);
2825 }
2826 }
2827 Err(ErrorContext::new_missing(
2828 "LinkAttrs",
2829 "ProtoDown",
2830 self.orig_loc,
2831 self.buf.as_ptr() as usize,
2832 ))
2833 }
2834 pub fn get_gso_max_segs(&self) -> Result<u32, ErrorContext> {
2835 let mut iter = self.clone();
2836 iter.pos = 0;
2837 for attr in iter {
2838 if let Ok(LinkAttrs::GsoMaxSegs(val)) = attr {
2839 return Ok(val);
2840 }
2841 }
2842 Err(ErrorContext::new_missing(
2843 "LinkAttrs",
2844 "GsoMaxSegs",
2845 self.orig_loc,
2846 self.buf.as_ptr() as usize,
2847 ))
2848 }
2849 pub fn get_gso_max_size(&self) -> Result<u32, ErrorContext> {
2850 let mut iter = self.clone();
2851 iter.pos = 0;
2852 for attr in iter {
2853 if let Ok(LinkAttrs::GsoMaxSize(val)) = attr {
2854 return Ok(val);
2855 }
2856 }
2857 Err(ErrorContext::new_missing(
2858 "LinkAttrs",
2859 "GsoMaxSize",
2860 self.orig_loc,
2861 self.buf.as_ptr() as usize,
2862 ))
2863 }
2864 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
2865 let mut iter = self.clone();
2866 iter.pos = 0;
2867 for attr in iter {
2868 if let Ok(LinkAttrs::Pad(val)) = attr {
2869 return Ok(val);
2870 }
2871 }
2872 Err(ErrorContext::new_missing(
2873 "LinkAttrs",
2874 "Pad",
2875 self.orig_loc,
2876 self.buf.as_ptr() as usize,
2877 ))
2878 }
2879 pub fn get_xdp(&self) -> Result<IterableXdpAttrs<'a>, ErrorContext> {
2880 let mut iter = self.clone();
2881 iter.pos = 0;
2882 for attr in iter {
2883 if let Ok(LinkAttrs::Xdp(val)) = attr {
2884 return Ok(val);
2885 }
2886 }
2887 Err(ErrorContext::new_missing(
2888 "LinkAttrs",
2889 "Xdp",
2890 self.orig_loc,
2891 self.buf.as_ptr() as usize,
2892 ))
2893 }
2894 pub fn get_event(&self) -> Result<u32, ErrorContext> {
2895 let mut iter = self.clone();
2896 iter.pos = 0;
2897 for attr in iter {
2898 if let Ok(LinkAttrs::Event(val)) = attr {
2899 return Ok(val);
2900 }
2901 }
2902 Err(ErrorContext::new_missing(
2903 "LinkAttrs",
2904 "Event",
2905 self.orig_loc,
2906 self.buf.as_ptr() as usize,
2907 ))
2908 }
2909 pub fn get_new_netnsid(&self) -> Result<i32, ErrorContext> {
2910 let mut iter = self.clone();
2911 iter.pos = 0;
2912 for attr in iter {
2913 if let Ok(LinkAttrs::NewNetnsid(val)) = attr {
2914 return Ok(val);
2915 }
2916 }
2917 Err(ErrorContext::new_missing(
2918 "LinkAttrs",
2919 "NewNetnsid",
2920 self.orig_loc,
2921 self.buf.as_ptr() as usize,
2922 ))
2923 }
2924 pub fn get_target_netnsid(&self) -> Result<i32, ErrorContext> {
2925 let mut iter = self.clone();
2926 iter.pos = 0;
2927 for attr in iter {
2928 if let Ok(LinkAttrs::TargetNetnsid(val)) = attr {
2929 return Ok(val);
2930 }
2931 }
2932 Err(ErrorContext::new_missing(
2933 "LinkAttrs",
2934 "TargetNetnsid",
2935 self.orig_loc,
2936 self.buf.as_ptr() as usize,
2937 ))
2938 }
2939 pub fn get_carrier_up_count(&self) -> Result<u32, ErrorContext> {
2940 let mut iter = self.clone();
2941 iter.pos = 0;
2942 for attr in iter {
2943 if let Ok(LinkAttrs::CarrierUpCount(val)) = attr {
2944 return Ok(val);
2945 }
2946 }
2947 Err(ErrorContext::new_missing(
2948 "LinkAttrs",
2949 "CarrierUpCount",
2950 self.orig_loc,
2951 self.buf.as_ptr() as usize,
2952 ))
2953 }
2954 pub fn get_carrier_down_count(&self) -> Result<u32, ErrorContext> {
2955 let mut iter = self.clone();
2956 iter.pos = 0;
2957 for attr in iter {
2958 if let Ok(LinkAttrs::CarrierDownCount(val)) = attr {
2959 return Ok(val);
2960 }
2961 }
2962 Err(ErrorContext::new_missing(
2963 "LinkAttrs",
2964 "CarrierDownCount",
2965 self.orig_loc,
2966 self.buf.as_ptr() as usize,
2967 ))
2968 }
2969 pub fn get_new_ifindex(&self) -> Result<i32, ErrorContext> {
2970 let mut iter = self.clone();
2971 iter.pos = 0;
2972 for attr in iter {
2973 if let Ok(LinkAttrs::NewIfindex(val)) = attr {
2974 return Ok(val);
2975 }
2976 }
2977 Err(ErrorContext::new_missing(
2978 "LinkAttrs",
2979 "NewIfindex",
2980 self.orig_loc,
2981 self.buf.as_ptr() as usize,
2982 ))
2983 }
2984 pub fn get_min_mtu(&self) -> Result<u32, ErrorContext> {
2985 let mut iter = self.clone();
2986 iter.pos = 0;
2987 for attr in iter {
2988 if let Ok(LinkAttrs::MinMtu(val)) = attr {
2989 return Ok(val);
2990 }
2991 }
2992 Err(ErrorContext::new_missing(
2993 "LinkAttrs",
2994 "MinMtu",
2995 self.orig_loc,
2996 self.buf.as_ptr() as usize,
2997 ))
2998 }
2999 pub fn get_max_mtu(&self) -> Result<u32, ErrorContext> {
3000 let mut iter = self.clone();
3001 iter.pos = 0;
3002 for attr in iter {
3003 if let Ok(LinkAttrs::MaxMtu(val)) = attr {
3004 return Ok(val);
3005 }
3006 }
3007 Err(ErrorContext::new_missing(
3008 "LinkAttrs",
3009 "MaxMtu",
3010 self.orig_loc,
3011 self.buf.as_ptr() as usize,
3012 ))
3013 }
3014 pub fn get_prop_list(&self) -> Result<IterablePropListLinkAttrs<'a>, ErrorContext> {
3015 let mut iter = self.clone();
3016 iter.pos = 0;
3017 for attr in iter {
3018 if let Ok(LinkAttrs::PropList(val)) = attr {
3019 return Ok(val);
3020 }
3021 }
3022 Err(ErrorContext::new_missing(
3023 "LinkAttrs",
3024 "PropList",
3025 self.orig_loc,
3026 self.buf.as_ptr() as usize,
3027 ))
3028 }
3029 pub fn get_alt_ifname(&self) -> Result<&'a CStr, ErrorContext> {
3030 let mut iter = self.clone();
3031 iter.pos = 0;
3032 for attr in iter {
3033 if let Ok(LinkAttrs::AltIfname(val)) = attr {
3034 return Ok(val);
3035 }
3036 }
3037 Err(ErrorContext::new_missing(
3038 "LinkAttrs",
3039 "AltIfname",
3040 self.orig_loc,
3041 self.buf.as_ptr() as usize,
3042 ))
3043 }
3044 pub fn get_perm_address(&self) -> Result<&'a [u8], ErrorContext> {
3045 let mut iter = self.clone();
3046 iter.pos = 0;
3047 for attr in iter {
3048 if let Ok(LinkAttrs::PermAddress(val)) = attr {
3049 return Ok(val);
3050 }
3051 }
3052 Err(ErrorContext::new_missing(
3053 "LinkAttrs",
3054 "PermAddress",
3055 self.orig_loc,
3056 self.buf.as_ptr() as usize,
3057 ))
3058 }
3059 pub fn get_proto_down_reason(&self) -> Result<&'a CStr, ErrorContext> {
3060 let mut iter = self.clone();
3061 iter.pos = 0;
3062 for attr in iter {
3063 if let Ok(LinkAttrs::ProtoDownReason(val)) = attr {
3064 return Ok(val);
3065 }
3066 }
3067 Err(ErrorContext::new_missing(
3068 "LinkAttrs",
3069 "ProtoDownReason",
3070 self.orig_loc,
3071 self.buf.as_ptr() as usize,
3072 ))
3073 }
3074 pub fn get_parent_dev_name(&self) -> Result<&'a CStr, ErrorContext> {
3075 let mut iter = self.clone();
3076 iter.pos = 0;
3077 for attr in iter {
3078 if let Ok(LinkAttrs::ParentDevName(val)) = attr {
3079 return Ok(val);
3080 }
3081 }
3082 Err(ErrorContext::new_missing(
3083 "LinkAttrs",
3084 "ParentDevName",
3085 self.orig_loc,
3086 self.buf.as_ptr() as usize,
3087 ))
3088 }
3089 pub fn get_parent_dev_bus_name(&self) -> Result<&'a CStr, ErrorContext> {
3090 let mut iter = self.clone();
3091 iter.pos = 0;
3092 for attr in iter {
3093 if let Ok(LinkAttrs::ParentDevBusName(val)) = attr {
3094 return Ok(val);
3095 }
3096 }
3097 Err(ErrorContext::new_missing(
3098 "LinkAttrs",
3099 "ParentDevBusName",
3100 self.orig_loc,
3101 self.buf.as_ptr() as usize,
3102 ))
3103 }
3104 pub fn get_gro_max_size(&self) -> Result<u32, ErrorContext> {
3105 let mut iter = self.clone();
3106 iter.pos = 0;
3107 for attr in iter {
3108 if let Ok(LinkAttrs::GroMaxSize(val)) = attr {
3109 return Ok(val);
3110 }
3111 }
3112 Err(ErrorContext::new_missing(
3113 "LinkAttrs",
3114 "GroMaxSize",
3115 self.orig_loc,
3116 self.buf.as_ptr() as usize,
3117 ))
3118 }
3119 pub fn get_tso_max_size(&self) -> Result<u32, ErrorContext> {
3120 let mut iter = self.clone();
3121 iter.pos = 0;
3122 for attr in iter {
3123 if let Ok(LinkAttrs::TsoMaxSize(val)) = attr {
3124 return Ok(val);
3125 }
3126 }
3127 Err(ErrorContext::new_missing(
3128 "LinkAttrs",
3129 "TsoMaxSize",
3130 self.orig_loc,
3131 self.buf.as_ptr() as usize,
3132 ))
3133 }
3134 pub fn get_tso_max_segs(&self) -> Result<u32, ErrorContext> {
3135 let mut iter = self.clone();
3136 iter.pos = 0;
3137 for attr in iter {
3138 if let Ok(LinkAttrs::TsoMaxSegs(val)) = attr {
3139 return Ok(val);
3140 }
3141 }
3142 Err(ErrorContext::new_missing(
3143 "LinkAttrs",
3144 "TsoMaxSegs",
3145 self.orig_loc,
3146 self.buf.as_ptr() as usize,
3147 ))
3148 }
3149 pub fn get_allmulti(&self) -> Result<u32, ErrorContext> {
3150 let mut iter = self.clone();
3151 iter.pos = 0;
3152 for attr in iter {
3153 if let Ok(LinkAttrs::Allmulti(val)) = attr {
3154 return Ok(val);
3155 }
3156 }
3157 Err(ErrorContext::new_missing(
3158 "LinkAttrs",
3159 "Allmulti",
3160 self.orig_loc,
3161 self.buf.as_ptr() as usize,
3162 ))
3163 }
3164 pub fn get_devlink_port(&self) -> Result<&'a [u8], ErrorContext> {
3165 let mut iter = self.clone();
3166 iter.pos = 0;
3167 for attr in iter {
3168 if let Ok(LinkAttrs::DevlinkPort(val)) = attr {
3169 return Ok(val);
3170 }
3171 }
3172 Err(ErrorContext::new_missing(
3173 "LinkAttrs",
3174 "DevlinkPort",
3175 self.orig_loc,
3176 self.buf.as_ptr() as usize,
3177 ))
3178 }
3179 pub fn get_gso_ipv4_max_size(&self) -> Result<u32, ErrorContext> {
3180 let mut iter = self.clone();
3181 iter.pos = 0;
3182 for attr in iter {
3183 if let Ok(LinkAttrs::GsoIpv4MaxSize(val)) = attr {
3184 return Ok(val);
3185 }
3186 }
3187 Err(ErrorContext::new_missing(
3188 "LinkAttrs",
3189 "GsoIpv4MaxSize",
3190 self.orig_loc,
3191 self.buf.as_ptr() as usize,
3192 ))
3193 }
3194 pub fn get_gro_ipv4_max_size(&self) -> Result<u32, ErrorContext> {
3195 let mut iter = self.clone();
3196 iter.pos = 0;
3197 for attr in iter {
3198 if let Ok(LinkAttrs::GroIpv4MaxSize(val)) = attr {
3199 return Ok(val);
3200 }
3201 }
3202 Err(ErrorContext::new_missing(
3203 "LinkAttrs",
3204 "GroIpv4MaxSize",
3205 self.orig_loc,
3206 self.buf.as_ptr() as usize,
3207 ))
3208 }
3209 pub fn get_dpll_pin(&self) -> Result<IterableLinkDpllPinAttrs<'a>, ErrorContext> {
3210 let mut iter = self.clone();
3211 iter.pos = 0;
3212 for attr in iter {
3213 if let Ok(LinkAttrs::DpllPin(val)) = attr {
3214 return Ok(val);
3215 }
3216 }
3217 Err(ErrorContext::new_missing(
3218 "LinkAttrs",
3219 "DpllPin",
3220 self.orig_loc,
3221 self.buf.as_ptr() as usize,
3222 ))
3223 }
3224 #[doc = "EDT offload horizon supported by the device (in nsec).\n"]
3225 pub fn get_max_pacing_offload_horizon(&self) -> Result<u32, ErrorContext> {
3226 let mut iter = self.clone();
3227 iter.pos = 0;
3228 for attr in iter {
3229 if let Ok(LinkAttrs::MaxPacingOffloadHorizon(val)) = attr {
3230 return Ok(val);
3231 }
3232 }
3233 Err(ErrorContext::new_missing(
3234 "LinkAttrs",
3235 "MaxPacingOffloadHorizon",
3236 self.orig_loc,
3237 self.buf.as_ptr() as usize,
3238 ))
3239 }
3240 pub fn get_netns_immutable(&self) -> Result<u8, ErrorContext> {
3241 let mut iter = self.clone();
3242 iter.pos = 0;
3243 for attr in iter {
3244 if let Ok(LinkAttrs::NetnsImmutable(val)) = attr {
3245 return Ok(val);
3246 }
3247 }
3248 Err(ErrorContext::new_missing(
3249 "LinkAttrs",
3250 "NetnsImmutable",
3251 self.orig_loc,
3252 self.buf.as_ptr() as usize,
3253 ))
3254 }
3255 pub fn get_headroom(&self) -> Result<u16, ErrorContext> {
3256 let mut iter = self.clone();
3257 iter.pos = 0;
3258 for attr in iter {
3259 if let Ok(LinkAttrs::Headroom(val)) = attr {
3260 return Ok(val);
3261 }
3262 }
3263 Err(ErrorContext::new_missing(
3264 "LinkAttrs",
3265 "Headroom",
3266 self.orig_loc,
3267 self.buf.as_ptr() as usize,
3268 ))
3269 }
3270 pub fn get_tailroom(&self) -> Result<u16, ErrorContext> {
3271 let mut iter = self.clone();
3272 iter.pos = 0;
3273 for attr in iter {
3274 if let Ok(LinkAttrs::Tailroom(val)) = attr {
3275 return Ok(val);
3276 }
3277 }
3278 Err(ErrorContext::new_missing(
3279 "LinkAttrs",
3280 "Tailroom",
3281 self.orig_loc,
3282 self.buf.as_ptr() as usize,
3283 ))
3284 }
3285}
3286impl LinkAttrs<'_> {
3287 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkAttrs<'a> {
3288 IterableLinkAttrs::with_loc(buf, buf.as_ptr() as usize)
3289 }
3290 fn attr_from_type(r#type: u16) -> Option<&'static str> {
3291 let res = match r#type {
3292 1u16 => "Address",
3293 2u16 => "Broadcast",
3294 3u16 => "Ifname",
3295 4u16 => "Mtu",
3296 5u16 => "Link",
3297 6u16 => "Qdisc",
3298 7u16 => "Stats",
3299 8u16 => "Cost",
3300 9u16 => "Priority",
3301 10u16 => "Master",
3302 11u16 => "Wireless",
3303 12u16 => "Protinfo",
3304 13u16 => "Txqlen",
3305 14u16 => "Map",
3306 15u16 => "Weight",
3307 16u16 => "Operstate",
3308 17u16 => "Linkmode",
3309 18u16 => "Linkinfo",
3310 19u16 => "NetNsPid",
3311 20u16 => "Ifalias",
3312 21u16 => "NumVf",
3313 22u16 => "VfinfoList",
3314 23u16 => "Stats64",
3315 24u16 => "VfPorts",
3316 25u16 => "PortSelf",
3317 26u16 => "AfSpec",
3318 27u16 => "Group",
3319 28u16 => "NetNsFd",
3320 29u16 => "ExtMask",
3321 30u16 => "Promiscuity",
3322 31u16 => "NumTxQueues",
3323 32u16 => "NumRxQueues",
3324 33u16 => "Carrier",
3325 34u16 => "PhysPortId",
3326 35u16 => "CarrierChanges",
3327 36u16 => "PhysSwitchId",
3328 37u16 => "LinkNetnsid",
3329 38u16 => "PhysPortName",
3330 39u16 => "ProtoDown",
3331 40u16 => "GsoMaxSegs",
3332 41u16 => "GsoMaxSize",
3333 42u16 => "Pad",
3334 43u16 => "Xdp",
3335 44u16 => "Event",
3336 45u16 => "NewNetnsid",
3337 46u16 => "TargetNetnsid",
3338 47u16 => "CarrierUpCount",
3339 48u16 => "CarrierDownCount",
3340 49u16 => "NewIfindex",
3341 50u16 => "MinMtu",
3342 51u16 => "MaxMtu",
3343 52u16 => "PropList",
3344 53u16 => "AltIfname",
3345 54u16 => "PermAddress",
3346 55u16 => "ProtoDownReason",
3347 56u16 => "ParentDevName",
3348 57u16 => "ParentDevBusName",
3349 58u16 => "GroMaxSize",
3350 59u16 => "TsoMaxSize",
3351 60u16 => "TsoMaxSegs",
3352 61u16 => "Allmulti",
3353 62u16 => "DevlinkPort",
3354 63u16 => "GsoIpv4MaxSize",
3355 64u16 => "GroIpv4MaxSize",
3356 65u16 => "DpllPin",
3357 66u16 => "MaxPacingOffloadHorizon",
3358 67u16 => "NetnsImmutable",
3359 68u16 => "Headroom",
3360 69u16 => "Tailroom",
3361 _ => return None,
3362 };
3363 Some(res)
3364 }
3365}
3366#[derive(Clone, Copy, Default)]
3367pub struct IterableLinkAttrs<'a> {
3368 buf: &'a [u8],
3369 pos: usize,
3370 orig_loc: usize,
3371}
3372impl<'a> IterableLinkAttrs<'a> {
3373 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
3374 Self {
3375 buf,
3376 pos: 0,
3377 orig_loc,
3378 }
3379 }
3380 pub fn get_buf(&self) -> &'a [u8] {
3381 self.buf
3382 }
3383}
3384impl<'a> Iterator for IterableLinkAttrs<'a> {
3385 type Item = Result<LinkAttrs<'a>, ErrorContext>;
3386 fn next(&mut self) -> Option<Self::Item> {
3387 let mut pos;
3388 let mut r#type;
3389 loop {
3390 pos = self.pos;
3391 r#type = None;
3392 if self.buf.len() == self.pos {
3393 return None;
3394 }
3395 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
3396 self.pos = self.buf.len();
3397 break;
3398 };
3399 r#type = Some(header.r#type);
3400 let res = match header.r#type {
3401 1u16 => LinkAttrs::Address({
3402 let res = Some(next);
3403 let Some(val) = res else { break };
3404 val
3405 }),
3406 2u16 => LinkAttrs::Broadcast({
3407 let res = Some(next);
3408 let Some(val) = res else { break };
3409 val
3410 }),
3411 3u16 => LinkAttrs::Ifname({
3412 let res = CStr::from_bytes_with_nul(next).ok();
3413 let Some(val) = res else { break };
3414 val
3415 }),
3416 4u16 => LinkAttrs::Mtu({
3417 let res = parse_u32(next);
3418 let Some(val) = res else { break };
3419 val
3420 }),
3421 5u16 => LinkAttrs::Link({
3422 let res = parse_u32(next);
3423 let Some(val) = res else { break };
3424 val
3425 }),
3426 6u16 => LinkAttrs::Qdisc({
3427 let res = CStr::from_bytes_with_nul(next).ok();
3428 let Some(val) = res else { break };
3429 val
3430 }),
3431 7u16 => LinkAttrs::Stats({
3432 let res = Some(RtnlLinkStats::new_from_zeroed(next));
3433 let Some(val) = res else { break };
3434 val
3435 }),
3436 10u16 => LinkAttrs::Master({
3437 let res = parse_u32(next);
3438 let Some(val) = res else { break };
3439 val
3440 }),
3441 11u16 => LinkAttrs::Wireless({
3442 let res = Some(next);
3443 let Some(val) = res else { break };
3444 val
3445 }),
3446 12u16 => LinkAttrs::Protinfo({
3447 let res = Some(next);
3448 let Some(val) = res else { break };
3449 val
3450 }),
3451 13u16 => LinkAttrs::Txqlen({
3452 let res = parse_u32(next);
3453 let Some(val) = res else { break };
3454 val
3455 }),
3456 14u16 => LinkAttrs::Map({
3457 let res = Some(RtnlLinkIfmap::new_from_zeroed(next));
3458 let Some(val) = res else { break };
3459 val
3460 }),
3461 15u16 => LinkAttrs::Weight({
3462 let res = parse_u32(next);
3463 let Some(val) = res else { break };
3464 val
3465 }),
3466 16u16 => LinkAttrs::Operstate({
3467 let res = parse_u8(next);
3468 let Some(val) = res else { break };
3469 val
3470 }),
3471 17u16 => LinkAttrs::Linkmode({
3472 let res = parse_u8(next);
3473 let Some(val) = res else { break };
3474 val
3475 }),
3476 18u16 => LinkAttrs::Linkinfo({
3477 let res = Some(IterableLinkinfoAttrs::with_loc(next, self.orig_loc));
3478 let Some(val) = res else { break };
3479 val
3480 }),
3481 19u16 => LinkAttrs::NetNsPid({
3482 let res = parse_u32(next);
3483 let Some(val) = res else { break };
3484 val
3485 }),
3486 20u16 => LinkAttrs::Ifalias({
3487 let res = CStr::from_bytes_with_nul(next).ok();
3488 let Some(val) = res else { break };
3489 val
3490 }),
3491 21u16 => LinkAttrs::NumVf({
3492 let res = parse_u32(next);
3493 let Some(val) = res else { break };
3494 val
3495 }),
3496 22u16 => LinkAttrs::VfinfoList({
3497 let res = Some(IterableVfinfoListAttrs::with_loc(next, self.orig_loc));
3498 let Some(val) = res else { break };
3499 val
3500 }),
3501 23u16 => LinkAttrs::Stats64({
3502 let res = Some(RtnlLinkStats64::new_from_zeroed(next));
3503 let Some(val) = res else { break };
3504 val
3505 }),
3506 24u16 => LinkAttrs::VfPorts({
3507 let res = Some(IterableVfPortsAttrs::with_loc(next, self.orig_loc));
3508 let Some(val) = res else { break };
3509 val
3510 }),
3511 25u16 => LinkAttrs::PortSelf({
3512 let res = Some(IterablePortSelfAttrs::with_loc(next, self.orig_loc));
3513 let Some(val) = res else { break };
3514 val
3515 }),
3516 26u16 => LinkAttrs::AfSpec({
3517 let res = Some(IterableAfSpecAttrs::with_loc(next, self.orig_loc));
3518 let Some(val) = res else { break };
3519 val
3520 }),
3521 27u16 => LinkAttrs::Group({
3522 let res = parse_u32(next);
3523 let Some(val) = res else { break };
3524 val
3525 }),
3526 28u16 => LinkAttrs::NetNsFd({
3527 let res = parse_u32(next);
3528 let Some(val) = res else { break };
3529 val
3530 }),
3531 29u16 => LinkAttrs::ExtMask({
3532 let res = parse_u32(next);
3533 let Some(val) = res else { break };
3534 val
3535 }),
3536 30u16 => LinkAttrs::Promiscuity({
3537 let res = parse_u32(next);
3538 let Some(val) = res else { break };
3539 val
3540 }),
3541 31u16 => LinkAttrs::NumTxQueues({
3542 let res = parse_u32(next);
3543 let Some(val) = res else { break };
3544 val
3545 }),
3546 32u16 => LinkAttrs::NumRxQueues({
3547 let res = parse_u32(next);
3548 let Some(val) = res else { break };
3549 val
3550 }),
3551 33u16 => LinkAttrs::Carrier({
3552 let res = parse_u8(next);
3553 let Some(val) = res else { break };
3554 val
3555 }),
3556 34u16 => LinkAttrs::PhysPortId({
3557 let res = Some(next);
3558 let Some(val) = res else { break };
3559 val
3560 }),
3561 35u16 => LinkAttrs::CarrierChanges({
3562 let res = parse_u32(next);
3563 let Some(val) = res else { break };
3564 val
3565 }),
3566 36u16 => LinkAttrs::PhysSwitchId({
3567 let res = Some(next);
3568 let Some(val) = res else { break };
3569 val
3570 }),
3571 37u16 => LinkAttrs::LinkNetnsid({
3572 let res = parse_i32(next);
3573 let Some(val) = res else { break };
3574 val
3575 }),
3576 38u16 => LinkAttrs::PhysPortName({
3577 let res = CStr::from_bytes_with_nul(next).ok();
3578 let Some(val) = res else { break };
3579 val
3580 }),
3581 39u16 => LinkAttrs::ProtoDown({
3582 let res = parse_u8(next);
3583 let Some(val) = res else { break };
3584 val
3585 }),
3586 40u16 => LinkAttrs::GsoMaxSegs({
3587 let res = parse_u32(next);
3588 let Some(val) = res else { break };
3589 val
3590 }),
3591 41u16 => LinkAttrs::GsoMaxSize({
3592 let res = parse_u32(next);
3593 let Some(val) = res else { break };
3594 val
3595 }),
3596 42u16 => LinkAttrs::Pad({
3597 let res = Some(next);
3598 let Some(val) = res else { break };
3599 val
3600 }),
3601 43u16 => LinkAttrs::Xdp({
3602 let res = Some(IterableXdpAttrs::with_loc(next, self.orig_loc));
3603 let Some(val) = res else { break };
3604 val
3605 }),
3606 44u16 => LinkAttrs::Event({
3607 let res = parse_u32(next);
3608 let Some(val) = res else { break };
3609 val
3610 }),
3611 45u16 => LinkAttrs::NewNetnsid({
3612 let res = parse_i32(next);
3613 let Some(val) = res else { break };
3614 val
3615 }),
3616 46u16 => LinkAttrs::TargetNetnsid({
3617 let res = parse_i32(next);
3618 let Some(val) = res else { break };
3619 val
3620 }),
3621 47u16 => LinkAttrs::CarrierUpCount({
3622 let res = parse_u32(next);
3623 let Some(val) = res else { break };
3624 val
3625 }),
3626 48u16 => LinkAttrs::CarrierDownCount({
3627 let res = parse_u32(next);
3628 let Some(val) = res else { break };
3629 val
3630 }),
3631 49u16 => LinkAttrs::NewIfindex({
3632 let res = parse_i32(next);
3633 let Some(val) = res else { break };
3634 val
3635 }),
3636 50u16 => LinkAttrs::MinMtu({
3637 let res = parse_u32(next);
3638 let Some(val) = res else { break };
3639 val
3640 }),
3641 51u16 => LinkAttrs::MaxMtu({
3642 let res = parse_u32(next);
3643 let Some(val) = res else { break };
3644 val
3645 }),
3646 52u16 => LinkAttrs::PropList({
3647 let res = Some(IterablePropListLinkAttrs::with_loc(next, self.orig_loc));
3648 let Some(val) = res else { break };
3649 val
3650 }),
3651 53u16 => LinkAttrs::AltIfname({
3652 let res = CStr::from_bytes_with_nul(next).ok();
3653 let Some(val) = res else { break };
3654 val
3655 }),
3656 54u16 => LinkAttrs::PermAddress({
3657 let res = Some(next);
3658 let Some(val) = res else { break };
3659 val
3660 }),
3661 55u16 => LinkAttrs::ProtoDownReason({
3662 let res = CStr::from_bytes_with_nul(next).ok();
3663 let Some(val) = res else { break };
3664 val
3665 }),
3666 56u16 => LinkAttrs::ParentDevName({
3667 let res = CStr::from_bytes_with_nul(next).ok();
3668 let Some(val) = res else { break };
3669 val
3670 }),
3671 57u16 => LinkAttrs::ParentDevBusName({
3672 let res = CStr::from_bytes_with_nul(next).ok();
3673 let Some(val) = res else { break };
3674 val
3675 }),
3676 58u16 => LinkAttrs::GroMaxSize({
3677 let res = parse_u32(next);
3678 let Some(val) = res else { break };
3679 val
3680 }),
3681 59u16 => LinkAttrs::TsoMaxSize({
3682 let res = parse_u32(next);
3683 let Some(val) = res else { break };
3684 val
3685 }),
3686 60u16 => LinkAttrs::TsoMaxSegs({
3687 let res = parse_u32(next);
3688 let Some(val) = res else { break };
3689 val
3690 }),
3691 61u16 => LinkAttrs::Allmulti({
3692 let res = parse_u32(next);
3693 let Some(val) = res else { break };
3694 val
3695 }),
3696 62u16 => LinkAttrs::DevlinkPort({
3697 let res = Some(next);
3698 let Some(val) = res else { break };
3699 val
3700 }),
3701 63u16 => LinkAttrs::GsoIpv4MaxSize({
3702 let res = parse_u32(next);
3703 let Some(val) = res else { break };
3704 val
3705 }),
3706 64u16 => LinkAttrs::GroIpv4MaxSize({
3707 let res = parse_u32(next);
3708 let Some(val) = res else { break };
3709 val
3710 }),
3711 65u16 => LinkAttrs::DpllPin({
3712 let res = Some(IterableLinkDpllPinAttrs::with_loc(next, self.orig_loc));
3713 let Some(val) = res else { break };
3714 val
3715 }),
3716 66u16 => LinkAttrs::MaxPacingOffloadHorizon({
3717 let res = parse_u32(next);
3718 let Some(val) = res else { break };
3719 val
3720 }),
3721 67u16 => LinkAttrs::NetnsImmutable({
3722 let res = parse_u8(next);
3723 let Some(val) = res else { break };
3724 val
3725 }),
3726 68u16 => LinkAttrs::Headroom({
3727 let res = parse_u16(next);
3728 let Some(val) = res else { break };
3729 val
3730 }),
3731 69u16 => LinkAttrs::Tailroom({
3732 let res = parse_u16(next);
3733 let Some(val) = res else { break };
3734 val
3735 }),
3736 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
3737 n => continue,
3738 };
3739 return Some(Ok(res));
3740 }
3741 Some(Err(ErrorContext::new(
3742 "LinkAttrs",
3743 r#type.and_then(|t| LinkAttrs::attr_from_type(t)),
3744 self.orig_loc,
3745 self.buf.as_ptr().wrapping_add(pos) as usize,
3746 )))
3747 }
3748}
3749impl<'a> std::fmt::Debug for IterableLinkAttrs<'_> {
3750 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3751 let mut fmt = f.debug_struct("LinkAttrs");
3752 for attr in self.clone() {
3753 let attr = match attr {
3754 Ok(a) => a,
3755 Err(err) => {
3756 fmt.finish()?;
3757 f.write_str("Err(")?;
3758 err.fmt(f)?;
3759 return f.write_str(")");
3760 }
3761 };
3762 match attr {
3763 LinkAttrs::Address(val) => fmt.field("Address", &FormatMac(val)),
3764 LinkAttrs::Broadcast(val) => fmt.field("Broadcast", &FormatMac(val)),
3765 LinkAttrs::Ifname(val) => fmt.field("Ifname", &val),
3766 LinkAttrs::Mtu(val) => fmt.field("Mtu", &val),
3767 LinkAttrs::Link(val) => fmt.field("Link", &val),
3768 LinkAttrs::Qdisc(val) => fmt.field("Qdisc", &val),
3769 LinkAttrs::Stats(val) => fmt.field("Stats", &val),
3770 LinkAttrs::Master(val) => fmt.field("Master", &val),
3771 LinkAttrs::Wireless(val) => fmt.field("Wireless", &val),
3772 LinkAttrs::Protinfo(val) => fmt.field("Protinfo", &val),
3773 LinkAttrs::Txqlen(val) => fmt.field("Txqlen", &val),
3774 LinkAttrs::Map(val) => fmt.field("Map", &val),
3775 LinkAttrs::Weight(val) => fmt.field("Weight", &val),
3776 LinkAttrs::Operstate(val) => fmt.field("Operstate", &val),
3777 LinkAttrs::Linkmode(val) => fmt.field("Linkmode", &val),
3778 LinkAttrs::Linkinfo(val) => fmt.field("Linkinfo", &val),
3779 LinkAttrs::NetNsPid(val) => fmt.field("NetNsPid", &val),
3780 LinkAttrs::Ifalias(val) => fmt.field("Ifalias", &val),
3781 LinkAttrs::NumVf(val) => fmt.field("NumVf", &val),
3782 LinkAttrs::VfinfoList(val) => fmt.field("VfinfoList", &val),
3783 LinkAttrs::Stats64(val) => fmt.field("Stats64", &val),
3784 LinkAttrs::VfPorts(val) => fmt.field("VfPorts", &val),
3785 LinkAttrs::PortSelf(val) => fmt.field("PortSelf", &val),
3786 LinkAttrs::AfSpec(val) => fmt.field("AfSpec", &val),
3787 LinkAttrs::Group(val) => fmt.field("Group", &val),
3788 LinkAttrs::NetNsFd(val) => fmt.field("NetNsFd", &val),
3789 LinkAttrs::ExtMask(val) => {
3790 fmt.field("ExtMask", &FormatFlags(val.into(), RtextFilter::from_value))
3791 }
3792 LinkAttrs::Promiscuity(val) => fmt.field("Promiscuity", &val),
3793 LinkAttrs::NumTxQueues(val) => fmt.field("NumTxQueues", &val),
3794 LinkAttrs::NumRxQueues(val) => fmt.field("NumRxQueues", &val),
3795 LinkAttrs::Carrier(val) => fmt.field("Carrier", &val),
3796 LinkAttrs::PhysPortId(val) => fmt.field("PhysPortId", &val),
3797 LinkAttrs::CarrierChanges(val) => fmt.field("CarrierChanges", &val),
3798 LinkAttrs::PhysSwitchId(val) => fmt.field("PhysSwitchId", &val),
3799 LinkAttrs::LinkNetnsid(val) => fmt.field("LinkNetnsid", &val),
3800 LinkAttrs::PhysPortName(val) => fmt.field("PhysPortName", &val),
3801 LinkAttrs::ProtoDown(val) => fmt.field("ProtoDown", &val),
3802 LinkAttrs::GsoMaxSegs(val) => fmt.field("GsoMaxSegs", &val),
3803 LinkAttrs::GsoMaxSize(val) => fmt.field("GsoMaxSize", &val),
3804 LinkAttrs::Pad(val) => fmt.field("Pad", &val),
3805 LinkAttrs::Xdp(val) => fmt.field("Xdp", &val),
3806 LinkAttrs::Event(val) => fmt.field("Event", &val),
3807 LinkAttrs::NewNetnsid(val) => fmt.field("NewNetnsid", &val),
3808 LinkAttrs::TargetNetnsid(val) => fmt.field("TargetNetnsid", &val),
3809 LinkAttrs::CarrierUpCount(val) => fmt.field("CarrierUpCount", &val),
3810 LinkAttrs::CarrierDownCount(val) => fmt.field("CarrierDownCount", &val),
3811 LinkAttrs::NewIfindex(val) => fmt.field("NewIfindex", &val),
3812 LinkAttrs::MinMtu(val) => fmt.field("MinMtu", &val),
3813 LinkAttrs::MaxMtu(val) => fmt.field("MaxMtu", &val),
3814 LinkAttrs::PropList(val) => fmt.field("PropList", &val),
3815 LinkAttrs::AltIfname(val) => fmt.field("AltIfname", &val),
3816 LinkAttrs::PermAddress(val) => fmt.field("PermAddress", &FormatMac(val)),
3817 LinkAttrs::ProtoDownReason(val) => fmt.field("ProtoDownReason", &val),
3818 LinkAttrs::ParentDevName(val) => fmt.field("ParentDevName", &val),
3819 LinkAttrs::ParentDevBusName(val) => fmt.field("ParentDevBusName", &val),
3820 LinkAttrs::GroMaxSize(val) => fmt.field("GroMaxSize", &val),
3821 LinkAttrs::TsoMaxSize(val) => fmt.field("TsoMaxSize", &val),
3822 LinkAttrs::TsoMaxSegs(val) => fmt.field("TsoMaxSegs", &val),
3823 LinkAttrs::Allmulti(val) => fmt.field("Allmulti", &val),
3824 LinkAttrs::DevlinkPort(val) => fmt.field("DevlinkPort", &val),
3825 LinkAttrs::GsoIpv4MaxSize(val) => fmt.field("GsoIpv4MaxSize", &val),
3826 LinkAttrs::GroIpv4MaxSize(val) => fmt.field("GroIpv4MaxSize", &val),
3827 LinkAttrs::DpllPin(val) => fmt.field("DpllPin", &val),
3828 LinkAttrs::MaxPacingOffloadHorizon(val) => {
3829 fmt.field("MaxPacingOffloadHorizon", &val)
3830 }
3831 LinkAttrs::NetnsImmutable(val) => fmt.field("NetnsImmutable", &val),
3832 LinkAttrs::Headroom(val) => fmt.field("Headroom", &val),
3833 LinkAttrs::Tailroom(val) => fmt.field("Tailroom", &val),
3834 };
3835 }
3836 fmt.finish()
3837 }
3838}
3839impl IterableLinkAttrs<'_> {
3840 pub fn lookup_attr(
3841 &self,
3842 offset: usize,
3843 missing_type: Option<u16>,
3844 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
3845 let mut stack = Vec::new();
3846 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
3847 if missing_type.is_some() && cur == offset {
3848 stack.push(("LinkAttrs", offset));
3849 return (
3850 stack,
3851 missing_type.and_then(|t| LinkAttrs::attr_from_type(t)),
3852 );
3853 }
3854 if cur > offset || cur + self.buf.len() < offset {
3855 return (stack, None);
3856 }
3857 let mut attrs = self.clone();
3858 let mut last_off = cur + attrs.pos;
3859 let mut missing = None;
3860 while let Some(attr) = attrs.next() {
3861 let Ok(attr) = attr else { break };
3862 match attr {
3863 LinkAttrs::Address(val) => {
3864 if last_off == offset {
3865 stack.push(("Address", last_off));
3866 break;
3867 }
3868 }
3869 LinkAttrs::Broadcast(val) => {
3870 if last_off == offset {
3871 stack.push(("Broadcast", last_off));
3872 break;
3873 }
3874 }
3875 LinkAttrs::Ifname(val) => {
3876 if last_off == offset {
3877 stack.push(("Ifname", last_off));
3878 break;
3879 }
3880 }
3881 LinkAttrs::Mtu(val) => {
3882 if last_off == offset {
3883 stack.push(("Mtu", last_off));
3884 break;
3885 }
3886 }
3887 LinkAttrs::Link(val) => {
3888 if last_off == offset {
3889 stack.push(("Link", last_off));
3890 break;
3891 }
3892 }
3893 LinkAttrs::Qdisc(val) => {
3894 if last_off == offset {
3895 stack.push(("Qdisc", last_off));
3896 break;
3897 }
3898 }
3899 LinkAttrs::Stats(val) => {
3900 if last_off == offset {
3901 stack.push(("Stats", last_off));
3902 break;
3903 }
3904 }
3905 LinkAttrs::Master(val) => {
3906 if last_off == offset {
3907 stack.push(("Master", last_off));
3908 break;
3909 }
3910 }
3911 LinkAttrs::Wireless(val) => {
3912 if last_off == offset {
3913 stack.push(("Wireless", last_off));
3914 break;
3915 }
3916 }
3917 LinkAttrs::Protinfo(val) => {
3918 if last_off == offset {
3919 stack.push(("Protinfo", last_off));
3920 break;
3921 }
3922 }
3923 LinkAttrs::Txqlen(val) => {
3924 if last_off == offset {
3925 stack.push(("Txqlen", last_off));
3926 break;
3927 }
3928 }
3929 LinkAttrs::Map(val) => {
3930 if last_off == offset {
3931 stack.push(("Map", last_off));
3932 break;
3933 }
3934 }
3935 LinkAttrs::Weight(val) => {
3936 if last_off == offset {
3937 stack.push(("Weight", last_off));
3938 break;
3939 }
3940 }
3941 LinkAttrs::Operstate(val) => {
3942 if last_off == offset {
3943 stack.push(("Operstate", last_off));
3944 break;
3945 }
3946 }
3947 LinkAttrs::Linkmode(val) => {
3948 if last_off == offset {
3949 stack.push(("Linkmode", last_off));
3950 break;
3951 }
3952 }
3953 LinkAttrs::Linkinfo(val) => {
3954 (stack, missing) = val.lookup_attr(offset, missing_type);
3955 if !stack.is_empty() {
3956 break;
3957 }
3958 }
3959 LinkAttrs::NetNsPid(val) => {
3960 if last_off == offset {
3961 stack.push(("NetNsPid", last_off));
3962 break;
3963 }
3964 }
3965 LinkAttrs::Ifalias(val) => {
3966 if last_off == offset {
3967 stack.push(("Ifalias", last_off));
3968 break;
3969 }
3970 }
3971 LinkAttrs::NumVf(val) => {
3972 if last_off == offset {
3973 stack.push(("NumVf", last_off));
3974 break;
3975 }
3976 }
3977 LinkAttrs::VfinfoList(val) => {
3978 (stack, missing) = val.lookup_attr(offset, missing_type);
3979 if !stack.is_empty() {
3980 break;
3981 }
3982 }
3983 LinkAttrs::Stats64(val) => {
3984 if last_off == offset {
3985 stack.push(("Stats64", last_off));
3986 break;
3987 }
3988 }
3989 LinkAttrs::VfPorts(val) => {
3990 (stack, missing) = val.lookup_attr(offset, missing_type);
3991 if !stack.is_empty() {
3992 break;
3993 }
3994 }
3995 LinkAttrs::PortSelf(val) => {
3996 (stack, missing) = val.lookup_attr(offset, missing_type);
3997 if !stack.is_empty() {
3998 break;
3999 }
4000 }
4001 LinkAttrs::AfSpec(val) => {
4002 (stack, missing) = val.lookup_attr(offset, missing_type);
4003 if !stack.is_empty() {
4004 break;
4005 }
4006 }
4007 LinkAttrs::Group(val) => {
4008 if last_off == offset {
4009 stack.push(("Group", last_off));
4010 break;
4011 }
4012 }
4013 LinkAttrs::NetNsFd(val) => {
4014 if last_off == offset {
4015 stack.push(("NetNsFd", last_off));
4016 break;
4017 }
4018 }
4019 LinkAttrs::ExtMask(val) => {
4020 if last_off == offset {
4021 stack.push(("ExtMask", last_off));
4022 break;
4023 }
4024 }
4025 LinkAttrs::Promiscuity(val) => {
4026 if last_off == offset {
4027 stack.push(("Promiscuity", last_off));
4028 break;
4029 }
4030 }
4031 LinkAttrs::NumTxQueues(val) => {
4032 if last_off == offset {
4033 stack.push(("NumTxQueues", last_off));
4034 break;
4035 }
4036 }
4037 LinkAttrs::NumRxQueues(val) => {
4038 if last_off == offset {
4039 stack.push(("NumRxQueues", last_off));
4040 break;
4041 }
4042 }
4043 LinkAttrs::Carrier(val) => {
4044 if last_off == offset {
4045 stack.push(("Carrier", last_off));
4046 break;
4047 }
4048 }
4049 LinkAttrs::PhysPortId(val) => {
4050 if last_off == offset {
4051 stack.push(("PhysPortId", last_off));
4052 break;
4053 }
4054 }
4055 LinkAttrs::CarrierChanges(val) => {
4056 if last_off == offset {
4057 stack.push(("CarrierChanges", last_off));
4058 break;
4059 }
4060 }
4061 LinkAttrs::PhysSwitchId(val) => {
4062 if last_off == offset {
4063 stack.push(("PhysSwitchId", last_off));
4064 break;
4065 }
4066 }
4067 LinkAttrs::LinkNetnsid(val) => {
4068 if last_off == offset {
4069 stack.push(("LinkNetnsid", last_off));
4070 break;
4071 }
4072 }
4073 LinkAttrs::PhysPortName(val) => {
4074 if last_off == offset {
4075 stack.push(("PhysPortName", last_off));
4076 break;
4077 }
4078 }
4079 LinkAttrs::ProtoDown(val) => {
4080 if last_off == offset {
4081 stack.push(("ProtoDown", last_off));
4082 break;
4083 }
4084 }
4085 LinkAttrs::GsoMaxSegs(val) => {
4086 if last_off == offset {
4087 stack.push(("GsoMaxSegs", last_off));
4088 break;
4089 }
4090 }
4091 LinkAttrs::GsoMaxSize(val) => {
4092 if last_off == offset {
4093 stack.push(("GsoMaxSize", last_off));
4094 break;
4095 }
4096 }
4097 LinkAttrs::Pad(val) => {
4098 if last_off == offset {
4099 stack.push(("Pad", last_off));
4100 break;
4101 }
4102 }
4103 LinkAttrs::Xdp(val) => {
4104 (stack, missing) = val.lookup_attr(offset, missing_type);
4105 if !stack.is_empty() {
4106 break;
4107 }
4108 }
4109 LinkAttrs::Event(val) => {
4110 if last_off == offset {
4111 stack.push(("Event", last_off));
4112 break;
4113 }
4114 }
4115 LinkAttrs::NewNetnsid(val) => {
4116 if last_off == offset {
4117 stack.push(("NewNetnsid", last_off));
4118 break;
4119 }
4120 }
4121 LinkAttrs::TargetNetnsid(val) => {
4122 if last_off == offset {
4123 stack.push(("TargetNetnsid", last_off));
4124 break;
4125 }
4126 }
4127 LinkAttrs::CarrierUpCount(val) => {
4128 if last_off == offset {
4129 stack.push(("CarrierUpCount", last_off));
4130 break;
4131 }
4132 }
4133 LinkAttrs::CarrierDownCount(val) => {
4134 if last_off == offset {
4135 stack.push(("CarrierDownCount", last_off));
4136 break;
4137 }
4138 }
4139 LinkAttrs::NewIfindex(val) => {
4140 if last_off == offset {
4141 stack.push(("NewIfindex", last_off));
4142 break;
4143 }
4144 }
4145 LinkAttrs::MinMtu(val) => {
4146 if last_off == offset {
4147 stack.push(("MinMtu", last_off));
4148 break;
4149 }
4150 }
4151 LinkAttrs::MaxMtu(val) => {
4152 if last_off == offset {
4153 stack.push(("MaxMtu", last_off));
4154 break;
4155 }
4156 }
4157 LinkAttrs::PropList(val) => {
4158 (stack, missing) = val.lookup_attr(offset, missing_type);
4159 if !stack.is_empty() {
4160 break;
4161 }
4162 }
4163 LinkAttrs::AltIfname(val) => {
4164 if last_off == offset {
4165 stack.push(("AltIfname", last_off));
4166 break;
4167 }
4168 }
4169 LinkAttrs::PermAddress(val) => {
4170 if last_off == offset {
4171 stack.push(("PermAddress", last_off));
4172 break;
4173 }
4174 }
4175 LinkAttrs::ProtoDownReason(val) => {
4176 if last_off == offset {
4177 stack.push(("ProtoDownReason", last_off));
4178 break;
4179 }
4180 }
4181 LinkAttrs::ParentDevName(val) => {
4182 if last_off == offset {
4183 stack.push(("ParentDevName", last_off));
4184 break;
4185 }
4186 }
4187 LinkAttrs::ParentDevBusName(val) => {
4188 if last_off == offset {
4189 stack.push(("ParentDevBusName", last_off));
4190 break;
4191 }
4192 }
4193 LinkAttrs::GroMaxSize(val) => {
4194 if last_off == offset {
4195 stack.push(("GroMaxSize", last_off));
4196 break;
4197 }
4198 }
4199 LinkAttrs::TsoMaxSize(val) => {
4200 if last_off == offset {
4201 stack.push(("TsoMaxSize", last_off));
4202 break;
4203 }
4204 }
4205 LinkAttrs::TsoMaxSegs(val) => {
4206 if last_off == offset {
4207 stack.push(("TsoMaxSegs", last_off));
4208 break;
4209 }
4210 }
4211 LinkAttrs::Allmulti(val) => {
4212 if last_off == offset {
4213 stack.push(("Allmulti", last_off));
4214 break;
4215 }
4216 }
4217 LinkAttrs::DevlinkPort(val) => {
4218 if last_off == offset {
4219 stack.push(("DevlinkPort", last_off));
4220 break;
4221 }
4222 }
4223 LinkAttrs::GsoIpv4MaxSize(val) => {
4224 if last_off == offset {
4225 stack.push(("GsoIpv4MaxSize", last_off));
4226 break;
4227 }
4228 }
4229 LinkAttrs::GroIpv4MaxSize(val) => {
4230 if last_off == offset {
4231 stack.push(("GroIpv4MaxSize", last_off));
4232 break;
4233 }
4234 }
4235 LinkAttrs::DpllPin(val) => {
4236 (stack, missing) = val.lookup_attr(offset, missing_type);
4237 if !stack.is_empty() {
4238 break;
4239 }
4240 }
4241 LinkAttrs::MaxPacingOffloadHorizon(val) => {
4242 if last_off == offset {
4243 stack.push(("MaxPacingOffloadHorizon", last_off));
4244 break;
4245 }
4246 }
4247 LinkAttrs::NetnsImmutable(val) => {
4248 if last_off == offset {
4249 stack.push(("NetnsImmutable", last_off));
4250 break;
4251 }
4252 }
4253 LinkAttrs::Headroom(val) => {
4254 if last_off == offset {
4255 stack.push(("Headroom", last_off));
4256 break;
4257 }
4258 }
4259 LinkAttrs::Tailroom(val) => {
4260 if last_off == offset {
4261 stack.push(("Tailroom", last_off));
4262 break;
4263 }
4264 }
4265 _ => {}
4266 };
4267 last_off = cur + attrs.pos;
4268 }
4269 if !stack.is_empty() {
4270 stack.push(("LinkAttrs", cur));
4271 }
4272 (stack, missing)
4273 }
4274}
4275#[derive(Clone)]
4276pub enum PropListLinkAttrs<'a> {
4277 #[doc = "Attribute may repeat multiple times (treat it as array)"]
4278 AltIfname(&'a CStr),
4279}
4280impl<'a> IterablePropListLinkAttrs<'a> {
4281 #[doc = "Attribute may repeat multiple times (treat it as array)"]
4282 pub fn get_alt_ifname(&self) -> MultiAttrIterable<Self, PropListLinkAttrs<'a>, &'a CStr> {
4283 MultiAttrIterable::new(self.clone(), |variant| {
4284 if let PropListLinkAttrs::AltIfname(val) = variant {
4285 Some(val)
4286 } else {
4287 None
4288 }
4289 })
4290 }
4291}
4292impl PropListLinkAttrs<'_> {
4293 pub fn new<'a>(buf: &'a [u8]) -> IterablePropListLinkAttrs<'a> {
4294 IterablePropListLinkAttrs::with_loc(buf, buf.as_ptr() as usize)
4295 }
4296 fn attr_from_type(r#type: u16) -> Option<&'static str> {
4297 LinkAttrs::attr_from_type(r#type)
4298 }
4299}
4300#[derive(Clone, Copy, Default)]
4301pub struct IterablePropListLinkAttrs<'a> {
4302 buf: &'a [u8],
4303 pos: usize,
4304 orig_loc: usize,
4305}
4306impl<'a> IterablePropListLinkAttrs<'a> {
4307 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4308 Self {
4309 buf,
4310 pos: 0,
4311 orig_loc,
4312 }
4313 }
4314 pub fn get_buf(&self) -> &'a [u8] {
4315 self.buf
4316 }
4317}
4318impl<'a> Iterator for IterablePropListLinkAttrs<'a> {
4319 type Item = Result<PropListLinkAttrs<'a>, ErrorContext>;
4320 fn next(&mut self) -> Option<Self::Item> {
4321 let mut pos;
4322 let mut r#type;
4323 loop {
4324 pos = self.pos;
4325 r#type = None;
4326 if self.buf.len() == self.pos {
4327 return None;
4328 }
4329 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4330 self.pos = self.buf.len();
4331 break;
4332 };
4333 r#type = Some(header.r#type);
4334 let res = match header.r#type {
4335 53u16 => PropListLinkAttrs::AltIfname({
4336 let res = CStr::from_bytes_with_nul(next).ok();
4337 let Some(val) = res else { break };
4338 val
4339 }),
4340 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4341 n => continue,
4342 };
4343 return Some(Ok(res));
4344 }
4345 Some(Err(ErrorContext::new(
4346 "PropListLinkAttrs",
4347 r#type.and_then(|t| PropListLinkAttrs::attr_from_type(t)),
4348 self.orig_loc,
4349 self.buf.as_ptr().wrapping_add(pos) as usize,
4350 )))
4351 }
4352}
4353impl<'a> std::fmt::Debug for IterablePropListLinkAttrs<'_> {
4354 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4355 let mut fmt = f.debug_struct("PropListLinkAttrs");
4356 for attr in self.clone() {
4357 let attr = match attr {
4358 Ok(a) => a,
4359 Err(err) => {
4360 fmt.finish()?;
4361 f.write_str("Err(")?;
4362 err.fmt(f)?;
4363 return f.write_str(")");
4364 }
4365 };
4366 match attr {
4367 PropListLinkAttrs::AltIfname(val) => fmt.field("AltIfname", &val),
4368 };
4369 }
4370 fmt.finish()
4371 }
4372}
4373impl IterablePropListLinkAttrs<'_> {
4374 pub fn lookup_attr(
4375 &self,
4376 offset: usize,
4377 missing_type: Option<u16>,
4378 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4379 let mut stack = Vec::new();
4380 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4381 if missing_type.is_some() && cur == offset {
4382 stack.push(("PropListLinkAttrs", offset));
4383 return (
4384 stack,
4385 missing_type.and_then(|t| PropListLinkAttrs::attr_from_type(t)),
4386 );
4387 }
4388 if cur > offset || cur + self.buf.len() < offset {
4389 return (stack, None);
4390 }
4391 let mut attrs = self.clone();
4392 let mut last_off = cur + attrs.pos;
4393 while let Some(attr) = attrs.next() {
4394 let Ok(attr) = attr else { break };
4395 match attr {
4396 PropListLinkAttrs::AltIfname(val) => {
4397 if last_off == offset {
4398 stack.push(("AltIfname", last_off));
4399 break;
4400 }
4401 }
4402 _ => {}
4403 };
4404 last_off = cur + attrs.pos;
4405 }
4406 if !stack.is_empty() {
4407 stack.push(("PropListLinkAttrs", cur));
4408 }
4409 (stack, None)
4410 }
4411}
4412#[derive(Clone)]
4413pub enum AfSpecAttrs<'a> {
4414 Inet(IterableIflaAttrs<'a>),
4415 Inet6(IterableIfla6Attrs<'a>),
4416 Mctp(IterableMctpAttrs<'a>),
4417}
4418impl<'a> IterableAfSpecAttrs<'a> {
4419 pub fn get_inet(&self) -> Result<IterableIflaAttrs<'a>, ErrorContext> {
4420 let mut iter = self.clone();
4421 iter.pos = 0;
4422 for attr in iter {
4423 if let Ok(AfSpecAttrs::Inet(val)) = attr {
4424 return Ok(val);
4425 }
4426 }
4427 Err(ErrorContext::new_missing(
4428 "AfSpecAttrs",
4429 "Inet",
4430 self.orig_loc,
4431 self.buf.as_ptr() as usize,
4432 ))
4433 }
4434 pub fn get_inet6(&self) -> Result<IterableIfla6Attrs<'a>, ErrorContext> {
4435 let mut iter = self.clone();
4436 iter.pos = 0;
4437 for attr in iter {
4438 if let Ok(AfSpecAttrs::Inet6(val)) = attr {
4439 return Ok(val);
4440 }
4441 }
4442 Err(ErrorContext::new_missing(
4443 "AfSpecAttrs",
4444 "Inet6",
4445 self.orig_loc,
4446 self.buf.as_ptr() as usize,
4447 ))
4448 }
4449 pub fn get_mctp(&self) -> Result<IterableMctpAttrs<'a>, ErrorContext> {
4450 let mut iter = self.clone();
4451 iter.pos = 0;
4452 for attr in iter {
4453 if let Ok(AfSpecAttrs::Mctp(val)) = attr {
4454 return Ok(val);
4455 }
4456 }
4457 Err(ErrorContext::new_missing(
4458 "AfSpecAttrs",
4459 "Mctp",
4460 self.orig_loc,
4461 self.buf.as_ptr() as usize,
4462 ))
4463 }
4464}
4465impl AfSpecAttrs<'_> {
4466 pub fn new<'a>(buf: &'a [u8]) -> IterableAfSpecAttrs<'a> {
4467 IterableAfSpecAttrs::with_loc(buf, buf.as_ptr() as usize)
4468 }
4469 fn attr_from_type(r#type: u16) -> Option<&'static str> {
4470 let res = match r#type {
4471 2u16 => "Inet",
4472 10u16 => "Inet6",
4473 45u16 => "Mctp",
4474 _ => return None,
4475 };
4476 Some(res)
4477 }
4478}
4479#[derive(Clone, Copy, Default)]
4480pub struct IterableAfSpecAttrs<'a> {
4481 buf: &'a [u8],
4482 pos: usize,
4483 orig_loc: usize,
4484}
4485impl<'a> IterableAfSpecAttrs<'a> {
4486 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4487 Self {
4488 buf,
4489 pos: 0,
4490 orig_loc,
4491 }
4492 }
4493 pub fn get_buf(&self) -> &'a [u8] {
4494 self.buf
4495 }
4496}
4497impl<'a> Iterator for IterableAfSpecAttrs<'a> {
4498 type Item = Result<AfSpecAttrs<'a>, ErrorContext>;
4499 fn next(&mut self) -> Option<Self::Item> {
4500 let mut pos;
4501 let mut r#type;
4502 loop {
4503 pos = self.pos;
4504 r#type = None;
4505 if self.buf.len() == self.pos {
4506 return None;
4507 }
4508 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4509 self.pos = self.buf.len();
4510 break;
4511 };
4512 r#type = Some(header.r#type);
4513 let res = match header.r#type {
4514 2u16 => AfSpecAttrs::Inet({
4515 let res = Some(IterableIflaAttrs::with_loc(next, self.orig_loc));
4516 let Some(val) = res else { break };
4517 val
4518 }),
4519 10u16 => AfSpecAttrs::Inet6({
4520 let res = Some(IterableIfla6Attrs::with_loc(next, self.orig_loc));
4521 let Some(val) = res else { break };
4522 val
4523 }),
4524 45u16 => AfSpecAttrs::Mctp({
4525 let res = Some(IterableMctpAttrs::with_loc(next, self.orig_loc));
4526 let Some(val) = res else { break };
4527 val
4528 }),
4529 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4530 n => continue,
4531 };
4532 return Some(Ok(res));
4533 }
4534 Some(Err(ErrorContext::new(
4535 "AfSpecAttrs",
4536 r#type.and_then(|t| AfSpecAttrs::attr_from_type(t)),
4537 self.orig_loc,
4538 self.buf.as_ptr().wrapping_add(pos) as usize,
4539 )))
4540 }
4541}
4542impl<'a> std::fmt::Debug for IterableAfSpecAttrs<'_> {
4543 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4544 let mut fmt = f.debug_struct("AfSpecAttrs");
4545 for attr in self.clone() {
4546 let attr = match attr {
4547 Ok(a) => a,
4548 Err(err) => {
4549 fmt.finish()?;
4550 f.write_str("Err(")?;
4551 err.fmt(f)?;
4552 return f.write_str(")");
4553 }
4554 };
4555 match attr {
4556 AfSpecAttrs::Inet(val) => fmt.field("Inet", &val),
4557 AfSpecAttrs::Inet6(val) => fmt.field("Inet6", &val),
4558 AfSpecAttrs::Mctp(val) => fmt.field("Mctp", &val),
4559 };
4560 }
4561 fmt.finish()
4562 }
4563}
4564impl IterableAfSpecAttrs<'_> {
4565 pub fn lookup_attr(
4566 &self,
4567 offset: usize,
4568 missing_type: Option<u16>,
4569 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4570 let mut stack = Vec::new();
4571 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4572 if missing_type.is_some() && cur == offset {
4573 stack.push(("AfSpecAttrs", offset));
4574 return (
4575 stack,
4576 missing_type.and_then(|t| AfSpecAttrs::attr_from_type(t)),
4577 );
4578 }
4579 if cur > offset || cur + self.buf.len() < offset {
4580 return (stack, None);
4581 }
4582 let mut attrs = self.clone();
4583 let mut last_off = cur + attrs.pos;
4584 let mut missing = None;
4585 while let Some(attr) = attrs.next() {
4586 let Ok(attr) = attr else { break };
4587 match attr {
4588 AfSpecAttrs::Inet(val) => {
4589 (stack, missing) = val.lookup_attr(offset, missing_type);
4590 if !stack.is_empty() {
4591 break;
4592 }
4593 }
4594 AfSpecAttrs::Inet6(val) => {
4595 (stack, missing) = val.lookup_attr(offset, missing_type);
4596 if !stack.is_empty() {
4597 break;
4598 }
4599 }
4600 AfSpecAttrs::Mctp(val) => {
4601 (stack, missing) = val.lookup_attr(offset, missing_type);
4602 if !stack.is_empty() {
4603 break;
4604 }
4605 }
4606 _ => {}
4607 };
4608 last_off = cur + attrs.pos;
4609 }
4610 if !stack.is_empty() {
4611 stack.push(("AfSpecAttrs", cur));
4612 }
4613 (stack, missing)
4614 }
4615}
4616#[derive(Clone)]
4617pub enum VfinfoListAttrs<'a> {
4618 #[doc = "Attribute may repeat multiple times (treat it as array)"]
4619 Info(IterableVfinfoAttrs<'a>),
4620}
4621impl<'a> IterableVfinfoListAttrs<'a> {
4622 #[doc = "Attribute may repeat multiple times (treat it as array)"]
4623 pub fn get_info(
4624 &self,
4625 ) -> MultiAttrIterable<Self, VfinfoListAttrs<'a>, IterableVfinfoAttrs<'a>> {
4626 MultiAttrIterable::new(self.clone(), |variant| {
4627 if let VfinfoListAttrs::Info(val) = variant {
4628 Some(val)
4629 } else {
4630 None
4631 }
4632 })
4633 }
4634}
4635impl VfinfoListAttrs<'_> {
4636 pub fn new<'a>(buf: &'a [u8]) -> IterableVfinfoListAttrs<'a> {
4637 IterableVfinfoListAttrs::with_loc(buf, buf.as_ptr() as usize)
4638 }
4639 fn attr_from_type(r#type: u16) -> Option<&'static str> {
4640 let res = match r#type {
4641 1u16 => "Info",
4642 _ => return None,
4643 };
4644 Some(res)
4645 }
4646}
4647#[derive(Clone, Copy, Default)]
4648pub struct IterableVfinfoListAttrs<'a> {
4649 buf: &'a [u8],
4650 pos: usize,
4651 orig_loc: usize,
4652}
4653impl<'a> IterableVfinfoListAttrs<'a> {
4654 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
4655 Self {
4656 buf,
4657 pos: 0,
4658 orig_loc,
4659 }
4660 }
4661 pub fn get_buf(&self) -> &'a [u8] {
4662 self.buf
4663 }
4664}
4665impl<'a> Iterator for IterableVfinfoListAttrs<'a> {
4666 type Item = Result<VfinfoListAttrs<'a>, ErrorContext>;
4667 fn next(&mut self) -> Option<Self::Item> {
4668 let mut pos;
4669 let mut r#type;
4670 loop {
4671 pos = self.pos;
4672 r#type = None;
4673 if self.buf.len() == self.pos {
4674 return None;
4675 }
4676 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
4677 self.pos = self.buf.len();
4678 break;
4679 };
4680 r#type = Some(header.r#type);
4681 let res = match header.r#type {
4682 1u16 => VfinfoListAttrs::Info({
4683 let res = Some(IterableVfinfoAttrs::with_loc(next, self.orig_loc));
4684 let Some(val) = res else { break };
4685 val
4686 }),
4687 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
4688 n => continue,
4689 };
4690 return Some(Ok(res));
4691 }
4692 Some(Err(ErrorContext::new(
4693 "VfinfoListAttrs",
4694 r#type.and_then(|t| VfinfoListAttrs::attr_from_type(t)),
4695 self.orig_loc,
4696 self.buf.as_ptr().wrapping_add(pos) as usize,
4697 )))
4698 }
4699}
4700impl<'a> std::fmt::Debug for IterableVfinfoListAttrs<'_> {
4701 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
4702 let mut fmt = f.debug_struct("VfinfoListAttrs");
4703 for attr in self.clone() {
4704 let attr = match attr {
4705 Ok(a) => a,
4706 Err(err) => {
4707 fmt.finish()?;
4708 f.write_str("Err(")?;
4709 err.fmt(f)?;
4710 return f.write_str(")");
4711 }
4712 };
4713 match attr {
4714 VfinfoListAttrs::Info(val) => fmt.field("Info", &val),
4715 };
4716 }
4717 fmt.finish()
4718 }
4719}
4720impl IterableVfinfoListAttrs<'_> {
4721 pub fn lookup_attr(
4722 &self,
4723 offset: usize,
4724 missing_type: Option<u16>,
4725 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
4726 let mut stack = Vec::new();
4727 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
4728 if missing_type.is_some() && cur == offset {
4729 stack.push(("VfinfoListAttrs", offset));
4730 return (
4731 stack,
4732 missing_type.and_then(|t| VfinfoListAttrs::attr_from_type(t)),
4733 );
4734 }
4735 if cur > offset || cur + self.buf.len() < offset {
4736 return (stack, None);
4737 }
4738 let mut attrs = self.clone();
4739 let mut last_off = cur + attrs.pos;
4740 let mut missing = None;
4741 while let Some(attr) = attrs.next() {
4742 let Ok(attr) = attr else { break };
4743 match attr {
4744 VfinfoListAttrs::Info(val) => {
4745 (stack, missing) = val.lookup_attr(offset, missing_type);
4746 if !stack.is_empty() {
4747 break;
4748 }
4749 }
4750 _ => {}
4751 };
4752 last_off = cur + attrs.pos;
4753 }
4754 if !stack.is_empty() {
4755 stack.push(("VfinfoListAttrs", cur));
4756 }
4757 (stack, missing)
4758 }
4759}
4760#[derive(Clone)]
4761pub enum VfinfoAttrs<'a> {
4762 Mac(IflaVfMac),
4763 Vlan(IflaVfVlan),
4764 TxRate(IflaVfTxRate),
4765 Spoofchk(IflaVfSpoofchk),
4766 LinkState(IflaVfLinkState),
4767 Rate(IflaVfRate),
4768 RssQueryEn(IflaVfRssQueryEn),
4769 Stats(IterableVfStatsAttrs<'a>),
4770 Trust(IflaVfTrust),
4771 IbNodeGuid(IflaVfGuid),
4772 IbPortGuid(IflaVfGuid),
4773 VlanList(IterableVfVlanAttrs<'a>),
4774 Broadcast(&'a [u8]),
4775}
4776impl<'a> IterableVfinfoAttrs<'a> {
4777 pub fn get_mac(&self) -> Result<IflaVfMac, ErrorContext> {
4778 let mut iter = self.clone();
4779 iter.pos = 0;
4780 for attr in iter {
4781 if let Ok(VfinfoAttrs::Mac(val)) = attr {
4782 return Ok(val);
4783 }
4784 }
4785 Err(ErrorContext::new_missing(
4786 "VfinfoAttrs",
4787 "Mac",
4788 self.orig_loc,
4789 self.buf.as_ptr() as usize,
4790 ))
4791 }
4792 pub fn get_vlan(&self) -> Result<IflaVfVlan, ErrorContext> {
4793 let mut iter = self.clone();
4794 iter.pos = 0;
4795 for attr in iter {
4796 if let Ok(VfinfoAttrs::Vlan(val)) = attr {
4797 return Ok(val);
4798 }
4799 }
4800 Err(ErrorContext::new_missing(
4801 "VfinfoAttrs",
4802 "Vlan",
4803 self.orig_loc,
4804 self.buf.as_ptr() as usize,
4805 ))
4806 }
4807 pub fn get_tx_rate(&self) -> Result<IflaVfTxRate, ErrorContext> {
4808 let mut iter = self.clone();
4809 iter.pos = 0;
4810 for attr in iter {
4811 if let Ok(VfinfoAttrs::TxRate(val)) = attr {
4812 return Ok(val);
4813 }
4814 }
4815 Err(ErrorContext::new_missing(
4816 "VfinfoAttrs",
4817 "TxRate",
4818 self.orig_loc,
4819 self.buf.as_ptr() as usize,
4820 ))
4821 }
4822 pub fn get_spoofchk(&self) -> Result<IflaVfSpoofchk, ErrorContext> {
4823 let mut iter = self.clone();
4824 iter.pos = 0;
4825 for attr in iter {
4826 if let Ok(VfinfoAttrs::Spoofchk(val)) = attr {
4827 return Ok(val);
4828 }
4829 }
4830 Err(ErrorContext::new_missing(
4831 "VfinfoAttrs",
4832 "Spoofchk",
4833 self.orig_loc,
4834 self.buf.as_ptr() as usize,
4835 ))
4836 }
4837 pub fn get_link_state(&self) -> Result<IflaVfLinkState, ErrorContext> {
4838 let mut iter = self.clone();
4839 iter.pos = 0;
4840 for attr in iter {
4841 if let Ok(VfinfoAttrs::LinkState(val)) = attr {
4842 return Ok(val);
4843 }
4844 }
4845 Err(ErrorContext::new_missing(
4846 "VfinfoAttrs",
4847 "LinkState",
4848 self.orig_loc,
4849 self.buf.as_ptr() as usize,
4850 ))
4851 }
4852 pub fn get_rate(&self) -> Result<IflaVfRate, ErrorContext> {
4853 let mut iter = self.clone();
4854 iter.pos = 0;
4855 for attr in iter {
4856 if let Ok(VfinfoAttrs::Rate(val)) = attr {
4857 return Ok(val);
4858 }
4859 }
4860 Err(ErrorContext::new_missing(
4861 "VfinfoAttrs",
4862 "Rate",
4863 self.orig_loc,
4864 self.buf.as_ptr() as usize,
4865 ))
4866 }
4867 pub fn get_rss_query_en(&self) -> Result<IflaVfRssQueryEn, ErrorContext> {
4868 let mut iter = self.clone();
4869 iter.pos = 0;
4870 for attr in iter {
4871 if let Ok(VfinfoAttrs::RssQueryEn(val)) = attr {
4872 return Ok(val);
4873 }
4874 }
4875 Err(ErrorContext::new_missing(
4876 "VfinfoAttrs",
4877 "RssQueryEn",
4878 self.orig_loc,
4879 self.buf.as_ptr() as usize,
4880 ))
4881 }
4882 pub fn get_stats(&self) -> Result<IterableVfStatsAttrs<'a>, ErrorContext> {
4883 let mut iter = self.clone();
4884 iter.pos = 0;
4885 for attr in iter {
4886 if let Ok(VfinfoAttrs::Stats(val)) = attr {
4887 return Ok(val);
4888 }
4889 }
4890 Err(ErrorContext::new_missing(
4891 "VfinfoAttrs",
4892 "Stats",
4893 self.orig_loc,
4894 self.buf.as_ptr() as usize,
4895 ))
4896 }
4897 pub fn get_trust(&self) -> Result<IflaVfTrust, ErrorContext> {
4898 let mut iter = self.clone();
4899 iter.pos = 0;
4900 for attr in iter {
4901 if let Ok(VfinfoAttrs::Trust(val)) = attr {
4902 return Ok(val);
4903 }
4904 }
4905 Err(ErrorContext::new_missing(
4906 "VfinfoAttrs",
4907 "Trust",
4908 self.orig_loc,
4909 self.buf.as_ptr() as usize,
4910 ))
4911 }
4912 pub fn get_ib_node_guid(&self) -> Result<IflaVfGuid, ErrorContext> {
4913 let mut iter = self.clone();
4914 iter.pos = 0;
4915 for attr in iter {
4916 if let Ok(VfinfoAttrs::IbNodeGuid(val)) = attr {
4917 return Ok(val);
4918 }
4919 }
4920 Err(ErrorContext::new_missing(
4921 "VfinfoAttrs",
4922 "IbNodeGuid",
4923 self.orig_loc,
4924 self.buf.as_ptr() as usize,
4925 ))
4926 }
4927 pub fn get_ib_port_guid(&self) -> Result<IflaVfGuid, ErrorContext> {
4928 let mut iter = self.clone();
4929 iter.pos = 0;
4930 for attr in iter {
4931 if let Ok(VfinfoAttrs::IbPortGuid(val)) = attr {
4932 return Ok(val);
4933 }
4934 }
4935 Err(ErrorContext::new_missing(
4936 "VfinfoAttrs",
4937 "IbPortGuid",
4938 self.orig_loc,
4939 self.buf.as_ptr() as usize,
4940 ))
4941 }
4942 pub fn get_vlan_list(&self) -> Result<IterableVfVlanAttrs<'a>, ErrorContext> {
4943 let mut iter = self.clone();
4944 iter.pos = 0;
4945 for attr in iter {
4946 if let Ok(VfinfoAttrs::VlanList(val)) = attr {
4947 return Ok(val);
4948 }
4949 }
4950 Err(ErrorContext::new_missing(
4951 "VfinfoAttrs",
4952 "VlanList",
4953 self.orig_loc,
4954 self.buf.as_ptr() as usize,
4955 ))
4956 }
4957 pub fn get_broadcast(&self) -> Result<&'a [u8], ErrorContext> {
4958 let mut iter = self.clone();
4959 iter.pos = 0;
4960 for attr in iter {
4961 if let Ok(VfinfoAttrs::Broadcast(val)) = attr {
4962 return Ok(val);
4963 }
4964 }
4965 Err(ErrorContext::new_missing(
4966 "VfinfoAttrs",
4967 "Broadcast",
4968 self.orig_loc,
4969 self.buf.as_ptr() as usize,
4970 ))
4971 }
4972}
4973impl VfinfoAttrs<'_> {
4974 pub fn new<'a>(buf: &'a [u8]) -> IterableVfinfoAttrs<'a> {
4975 IterableVfinfoAttrs::with_loc(buf, buf.as_ptr() as usize)
4976 }
4977 fn attr_from_type(r#type: u16) -> Option<&'static str> {
4978 let res = match r#type {
4979 1u16 => "Mac",
4980 2u16 => "Vlan",
4981 3u16 => "TxRate",
4982 4u16 => "Spoofchk",
4983 5u16 => "LinkState",
4984 6u16 => "Rate",
4985 7u16 => "RssQueryEn",
4986 8u16 => "Stats",
4987 9u16 => "Trust",
4988 10u16 => "IbNodeGuid",
4989 11u16 => "IbPortGuid",
4990 12u16 => "VlanList",
4991 13u16 => "Broadcast",
4992 _ => return None,
4993 };
4994 Some(res)
4995 }
4996}
4997#[derive(Clone, Copy, Default)]
4998pub struct IterableVfinfoAttrs<'a> {
4999 buf: &'a [u8],
5000 pos: usize,
5001 orig_loc: usize,
5002}
5003impl<'a> IterableVfinfoAttrs<'a> {
5004 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5005 Self {
5006 buf,
5007 pos: 0,
5008 orig_loc,
5009 }
5010 }
5011 pub fn get_buf(&self) -> &'a [u8] {
5012 self.buf
5013 }
5014}
5015impl<'a> Iterator for IterableVfinfoAttrs<'a> {
5016 type Item = Result<VfinfoAttrs<'a>, ErrorContext>;
5017 fn next(&mut self) -> Option<Self::Item> {
5018 let mut pos;
5019 let mut r#type;
5020 loop {
5021 pos = self.pos;
5022 r#type = None;
5023 if self.buf.len() == self.pos {
5024 return None;
5025 }
5026 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5027 self.pos = self.buf.len();
5028 break;
5029 };
5030 r#type = Some(header.r#type);
5031 let res = match header.r#type {
5032 1u16 => VfinfoAttrs::Mac({
5033 let res = Some(IflaVfMac::new_from_zeroed(next));
5034 let Some(val) = res else { break };
5035 val
5036 }),
5037 2u16 => VfinfoAttrs::Vlan({
5038 let res = Some(IflaVfVlan::new_from_zeroed(next));
5039 let Some(val) = res else { break };
5040 val
5041 }),
5042 3u16 => VfinfoAttrs::TxRate({
5043 let res = Some(IflaVfTxRate::new_from_zeroed(next));
5044 let Some(val) = res else { break };
5045 val
5046 }),
5047 4u16 => VfinfoAttrs::Spoofchk({
5048 let res = Some(IflaVfSpoofchk::new_from_zeroed(next));
5049 let Some(val) = res else { break };
5050 val
5051 }),
5052 5u16 => VfinfoAttrs::LinkState({
5053 let res = Some(IflaVfLinkState::new_from_zeroed(next));
5054 let Some(val) = res else { break };
5055 val
5056 }),
5057 6u16 => VfinfoAttrs::Rate({
5058 let res = Some(IflaVfRate::new_from_zeroed(next));
5059 let Some(val) = res else { break };
5060 val
5061 }),
5062 7u16 => VfinfoAttrs::RssQueryEn({
5063 let res = Some(IflaVfRssQueryEn::new_from_zeroed(next));
5064 let Some(val) = res else { break };
5065 val
5066 }),
5067 8u16 => VfinfoAttrs::Stats({
5068 let res = Some(IterableVfStatsAttrs::with_loc(next, self.orig_loc));
5069 let Some(val) = res else { break };
5070 val
5071 }),
5072 9u16 => VfinfoAttrs::Trust({
5073 let res = Some(IflaVfTrust::new_from_zeroed(next));
5074 let Some(val) = res else { break };
5075 val
5076 }),
5077 10u16 => VfinfoAttrs::IbNodeGuid({
5078 let res = Some(IflaVfGuid::new_from_zeroed(next));
5079 let Some(val) = res else { break };
5080 val
5081 }),
5082 11u16 => VfinfoAttrs::IbPortGuid({
5083 let res = Some(IflaVfGuid::new_from_zeroed(next));
5084 let Some(val) = res else { break };
5085 val
5086 }),
5087 12u16 => VfinfoAttrs::VlanList({
5088 let res = Some(IterableVfVlanAttrs::with_loc(next, self.orig_loc));
5089 let Some(val) = res else { break };
5090 val
5091 }),
5092 13u16 => VfinfoAttrs::Broadcast({
5093 let res = Some(next);
5094 let Some(val) = res else { break };
5095 val
5096 }),
5097 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5098 n => continue,
5099 };
5100 return Some(Ok(res));
5101 }
5102 Some(Err(ErrorContext::new(
5103 "VfinfoAttrs",
5104 r#type.and_then(|t| VfinfoAttrs::attr_from_type(t)),
5105 self.orig_loc,
5106 self.buf.as_ptr().wrapping_add(pos) as usize,
5107 )))
5108 }
5109}
5110impl<'a> std::fmt::Debug for IterableVfinfoAttrs<'_> {
5111 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5112 let mut fmt = f.debug_struct("VfinfoAttrs");
5113 for attr in self.clone() {
5114 let attr = match attr {
5115 Ok(a) => a,
5116 Err(err) => {
5117 fmt.finish()?;
5118 f.write_str("Err(")?;
5119 err.fmt(f)?;
5120 return f.write_str(")");
5121 }
5122 };
5123 match attr {
5124 VfinfoAttrs::Mac(val) => fmt.field("Mac", &val),
5125 VfinfoAttrs::Vlan(val) => fmt.field("Vlan", &val),
5126 VfinfoAttrs::TxRate(val) => fmt.field("TxRate", &val),
5127 VfinfoAttrs::Spoofchk(val) => fmt.field("Spoofchk", &val),
5128 VfinfoAttrs::LinkState(val) => fmt.field("LinkState", &val),
5129 VfinfoAttrs::Rate(val) => fmt.field("Rate", &val),
5130 VfinfoAttrs::RssQueryEn(val) => fmt.field("RssQueryEn", &val),
5131 VfinfoAttrs::Stats(val) => fmt.field("Stats", &val),
5132 VfinfoAttrs::Trust(val) => fmt.field("Trust", &val),
5133 VfinfoAttrs::IbNodeGuid(val) => fmt.field("IbNodeGuid", &val),
5134 VfinfoAttrs::IbPortGuid(val) => fmt.field("IbPortGuid", &val),
5135 VfinfoAttrs::VlanList(val) => fmt.field("VlanList", &val),
5136 VfinfoAttrs::Broadcast(val) => fmt.field("Broadcast", &val),
5137 };
5138 }
5139 fmt.finish()
5140 }
5141}
5142impl IterableVfinfoAttrs<'_> {
5143 pub fn lookup_attr(
5144 &self,
5145 offset: usize,
5146 missing_type: Option<u16>,
5147 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5148 let mut stack = Vec::new();
5149 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5150 if missing_type.is_some() && cur == offset {
5151 stack.push(("VfinfoAttrs", offset));
5152 return (
5153 stack,
5154 missing_type.and_then(|t| VfinfoAttrs::attr_from_type(t)),
5155 );
5156 }
5157 if cur > offset || cur + self.buf.len() < offset {
5158 return (stack, None);
5159 }
5160 let mut attrs = self.clone();
5161 let mut last_off = cur + attrs.pos;
5162 let mut missing = None;
5163 while let Some(attr) = attrs.next() {
5164 let Ok(attr) = attr else { break };
5165 match attr {
5166 VfinfoAttrs::Mac(val) => {
5167 if last_off == offset {
5168 stack.push(("Mac", last_off));
5169 break;
5170 }
5171 }
5172 VfinfoAttrs::Vlan(val) => {
5173 if last_off == offset {
5174 stack.push(("Vlan", last_off));
5175 break;
5176 }
5177 }
5178 VfinfoAttrs::TxRate(val) => {
5179 if last_off == offset {
5180 stack.push(("TxRate", last_off));
5181 break;
5182 }
5183 }
5184 VfinfoAttrs::Spoofchk(val) => {
5185 if last_off == offset {
5186 stack.push(("Spoofchk", last_off));
5187 break;
5188 }
5189 }
5190 VfinfoAttrs::LinkState(val) => {
5191 if last_off == offset {
5192 stack.push(("LinkState", last_off));
5193 break;
5194 }
5195 }
5196 VfinfoAttrs::Rate(val) => {
5197 if last_off == offset {
5198 stack.push(("Rate", last_off));
5199 break;
5200 }
5201 }
5202 VfinfoAttrs::RssQueryEn(val) => {
5203 if last_off == offset {
5204 stack.push(("RssQueryEn", last_off));
5205 break;
5206 }
5207 }
5208 VfinfoAttrs::Stats(val) => {
5209 (stack, missing) = val.lookup_attr(offset, missing_type);
5210 if !stack.is_empty() {
5211 break;
5212 }
5213 }
5214 VfinfoAttrs::Trust(val) => {
5215 if last_off == offset {
5216 stack.push(("Trust", last_off));
5217 break;
5218 }
5219 }
5220 VfinfoAttrs::IbNodeGuid(val) => {
5221 if last_off == offset {
5222 stack.push(("IbNodeGuid", last_off));
5223 break;
5224 }
5225 }
5226 VfinfoAttrs::IbPortGuid(val) => {
5227 if last_off == offset {
5228 stack.push(("IbPortGuid", last_off));
5229 break;
5230 }
5231 }
5232 VfinfoAttrs::VlanList(val) => {
5233 (stack, missing) = val.lookup_attr(offset, missing_type);
5234 if !stack.is_empty() {
5235 break;
5236 }
5237 }
5238 VfinfoAttrs::Broadcast(val) => {
5239 if last_off == offset {
5240 stack.push(("Broadcast", last_off));
5241 break;
5242 }
5243 }
5244 _ => {}
5245 };
5246 last_off = cur + attrs.pos;
5247 }
5248 if !stack.is_empty() {
5249 stack.push(("VfinfoAttrs", cur));
5250 }
5251 (stack, missing)
5252 }
5253}
5254#[derive(Clone)]
5255pub enum VfStatsAttrs<'a> {
5256 RxPackets(u64),
5257 TxPackets(u64),
5258 RxBytes(u64),
5259 TxBytes(u64),
5260 Broadcast(u64),
5261 Multicast(u64),
5262 Pad(&'a [u8]),
5263 RxDropped(u64),
5264 TxDropped(u64),
5265}
5266impl<'a> IterableVfStatsAttrs<'a> {
5267 pub fn get_rx_packets(&self) -> Result<u64, ErrorContext> {
5268 let mut iter = self.clone();
5269 iter.pos = 0;
5270 for attr in iter {
5271 if let Ok(VfStatsAttrs::RxPackets(val)) = attr {
5272 return Ok(val);
5273 }
5274 }
5275 Err(ErrorContext::new_missing(
5276 "VfStatsAttrs",
5277 "RxPackets",
5278 self.orig_loc,
5279 self.buf.as_ptr() as usize,
5280 ))
5281 }
5282 pub fn get_tx_packets(&self) -> Result<u64, ErrorContext> {
5283 let mut iter = self.clone();
5284 iter.pos = 0;
5285 for attr in iter {
5286 if let Ok(VfStatsAttrs::TxPackets(val)) = attr {
5287 return Ok(val);
5288 }
5289 }
5290 Err(ErrorContext::new_missing(
5291 "VfStatsAttrs",
5292 "TxPackets",
5293 self.orig_loc,
5294 self.buf.as_ptr() as usize,
5295 ))
5296 }
5297 pub fn get_rx_bytes(&self) -> Result<u64, ErrorContext> {
5298 let mut iter = self.clone();
5299 iter.pos = 0;
5300 for attr in iter {
5301 if let Ok(VfStatsAttrs::RxBytes(val)) = attr {
5302 return Ok(val);
5303 }
5304 }
5305 Err(ErrorContext::new_missing(
5306 "VfStatsAttrs",
5307 "RxBytes",
5308 self.orig_loc,
5309 self.buf.as_ptr() as usize,
5310 ))
5311 }
5312 pub fn get_tx_bytes(&self) -> Result<u64, ErrorContext> {
5313 let mut iter = self.clone();
5314 iter.pos = 0;
5315 for attr in iter {
5316 if let Ok(VfStatsAttrs::TxBytes(val)) = attr {
5317 return Ok(val);
5318 }
5319 }
5320 Err(ErrorContext::new_missing(
5321 "VfStatsAttrs",
5322 "TxBytes",
5323 self.orig_loc,
5324 self.buf.as_ptr() as usize,
5325 ))
5326 }
5327 pub fn get_broadcast(&self) -> Result<u64, ErrorContext> {
5328 let mut iter = self.clone();
5329 iter.pos = 0;
5330 for attr in iter {
5331 if let Ok(VfStatsAttrs::Broadcast(val)) = attr {
5332 return Ok(val);
5333 }
5334 }
5335 Err(ErrorContext::new_missing(
5336 "VfStatsAttrs",
5337 "Broadcast",
5338 self.orig_loc,
5339 self.buf.as_ptr() as usize,
5340 ))
5341 }
5342 pub fn get_multicast(&self) -> Result<u64, ErrorContext> {
5343 let mut iter = self.clone();
5344 iter.pos = 0;
5345 for attr in iter {
5346 if let Ok(VfStatsAttrs::Multicast(val)) = attr {
5347 return Ok(val);
5348 }
5349 }
5350 Err(ErrorContext::new_missing(
5351 "VfStatsAttrs",
5352 "Multicast",
5353 self.orig_loc,
5354 self.buf.as_ptr() as usize,
5355 ))
5356 }
5357 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
5358 let mut iter = self.clone();
5359 iter.pos = 0;
5360 for attr in iter {
5361 if let Ok(VfStatsAttrs::Pad(val)) = attr {
5362 return Ok(val);
5363 }
5364 }
5365 Err(ErrorContext::new_missing(
5366 "VfStatsAttrs",
5367 "Pad",
5368 self.orig_loc,
5369 self.buf.as_ptr() as usize,
5370 ))
5371 }
5372 pub fn get_rx_dropped(&self) -> Result<u64, ErrorContext> {
5373 let mut iter = self.clone();
5374 iter.pos = 0;
5375 for attr in iter {
5376 if let Ok(VfStatsAttrs::RxDropped(val)) = attr {
5377 return Ok(val);
5378 }
5379 }
5380 Err(ErrorContext::new_missing(
5381 "VfStatsAttrs",
5382 "RxDropped",
5383 self.orig_loc,
5384 self.buf.as_ptr() as usize,
5385 ))
5386 }
5387 pub fn get_tx_dropped(&self) -> Result<u64, ErrorContext> {
5388 let mut iter = self.clone();
5389 iter.pos = 0;
5390 for attr in iter {
5391 if let Ok(VfStatsAttrs::TxDropped(val)) = attr {
5392 return Ok(val);
5393 }
5394 }
5395 Err(ErrorContext::new_missing(
5396 "VfStatsAttrs",
5397 "TxDropped",
5398 self.orig_loc,
5399 self.buf.as_ptr() as usize,
5400 ))
5401 }
5402}
5403impl VfStatsAttrs<'_> {
5404 pub fn new<'a>(buf: &'a [u8]) -> IterableVfStatsAttrs<'a> {
5405 IterableVfStatsAttrs::with_loc(buf, buf.as_ptr() as usize)
5406 }
5407 fn attr_from_type(r#type: u16) -> Option<&'static str> {
5408 let res = match r#type {
5409 0u16 => "RxPackets",
5410 1u16 => "TxPackets",
5411 2u16 => "RxBytes",
5412 3u16 => "TxBytes",
5413 4u16 => "Broadcast",
5414 5u16 => "Multicast",
5415 6u16 => "Pad",
5416 7u16 => "RxDropped",
5417 8u16 => "TxDropped",
5418 _ => return None,
5419 };
5420 Some(res)
5421 }
5422}
5423#[derive(Clone, Copy, Default)]
5424pub struct IterableVfStatsAttrs<'a> {
5425 buf: &'a [u8],
5426 pos: usize,
5427 orig_loc: usize,
5428}
5429impl<'a> IterableVfStatsAttrs<'a> {
5430 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5431 Self {
5432 buf,
5433 pos: 0,
5434 orig_loc,
5435 }
5436 }
5437 pub fn get_buf(&self) -> &'a [u8] {
5438 self.buf
5439 }
5440}
5441impl<'a> Iterator for IterableVfStatsAttrs<'a> {
5442 type Item = Result<VfStatsAttrs<'a>, ErrorContext>;
5443 fn next(&mut self) -> Option<Self::Item> {
5444 let mut pos;
5445 let mut r#type;
5446 loop {
5447 pos = self.pos;
5448 r#type = None;
5449 if self.buf.len() == self.pos {
5450 return None;
5451 }
5452 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5453 self.pos = self.buf.len();
5454 break;
5455 };
5456 r#type = Some(header.r#type);
5457 let res = match header.r#type {
5458 0u16 => VfStatsAttrs::RxPackets({
5459 let res = parse_u64(next);
5460 let Some(val) = res else { break };
5461 val
5462 }),
5463 1u16 => VfStatsAttrs::TxPackets({
5464 let res = parse_u64(next);
5465 let Some(val) = res else { break };
5466 val
5467 }),
5468 2u16 => VfStatsAttrs::RxBytes({
5469 let res = parse_u64(next);
5470 let Some(val) = res else { break };
5471 val
5472 }),
5473 3u16 => VfStatsAttrs::TxBytes({
5474 let res = parse_u64(next);
5475 let Some(val) = res else { break };
5476 val
5477 }),
5478 4u16 => VfStatsAttrs::Broadcast({
5479 let res = parse_u64(next);
5480 let Some(val) = res else { break };
5481 val
5482 }),
5483 5u16 => VfStatsAttrs::Multicast({
5484 let res = parse_u64(next);
5485 let Some(val) = res else { break };
5486 val
5487 }),
5488 6u16 => VfStatsAttrs::Pad({
5489 let res = Some(next);
5490 let Some(val) = res else { break };
5491 val
5492 }),
5493 7u16 => VfStatsAttrs::RxDropped({
5494 let res = parse_u64(next);
5495 let Some(val) = res else { break };
5496 val
5497 }),
5498 8u16 => VfStatsAttrs::TxDropped({
5499 let res = parse_u64(next);
5500 let Some(val) = res else { break };
5501 val
5502 }),
5503 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5504 n => continue,
5505 };
5506 return Some(Ok(res));
5507 }
5508 Some(Err(ErrorContext::new(
5509 "VfStatsAttrs",
5510 r#type.and_then(|t| VfStatsAttrs::attr_from_type(t)),
5511 self.orig_loc,
5512 self.buf.as_ptr().wrapping_add(pos) as usize,
5513 )))
5514 }
5515}
5516impl<'a> std::fmt::Debug for IterableVfStatsAttrs<'_> {
5517 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5518 let mut fmt = f.debug_struct("VfStatsAttrs");
5519 for attr in self.clone() {
5520 let attr = match attr {
5521 Ok(a) => a,
5522 Err(err) => {
5523 fmt.finish()?;
5524 f.write_str("Err(")?;
5525 err.fmt(f)?;
5526 return f.write_str(")");
5527 }
5528 };
5529 match attr {
5530 VfStatsAttrs::RxPackets(val) => fmt.field("RxPackets", &val),
5531 VfStatsAttrs::TxPackets(val) => fmt.field("TxPackets", &val),
5532 VfStatsAttrs::RxBytes(val) => fmt.field("RxBytes", &val),
5533 VfStatsAttrs::TxBytes(val) => fmt.field("TxBytes", &val),
5534 VfStatsAttrs::Broadcast(val) => fmt.field("Broadcast", &val),
5535 VfStatsAttrs::Multicast(val) => fmt.field("Multicast", &val),
5536 VfStatsAttrs::Pad(val) => fmt.field("Pad", &val),
5537 VfStatsAttrs::RxDropped(val) => fmt.field("RxDropped", &val),
5538 VfStatsAttrs::TxDropped(val) => fmt.field("TxDropped", &val),
5539 };
5540 }
5541 fmt.finish()
5542 }
5543}
5544impl IterableVfStatsAttrs<'_> {
5545 pub fn lookup_attr(
5546 &self,
5547 offset: usize,
5548 missing_type: Option<u16>,
5549 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5550 let mut stack = Vec::new();
5551 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5552 if missing_type.is_some() && cur == offset {
5553 stack.push(("VfStatsAttrs", offset));
5554 return (
5555 stack,
5556 missing_type.and_then(|t| VfStatsAttrs::attr_from_type(t)),
5557 );
5558 }
5559 if cur > offset || cur + self.buf.len() < offset {
5560 return (stack, None);
5561 }
5562 let mut attrs = self.clone();
5563 let mut last_off = cur + attrs.pos;
5564 while let Some(attr) = attrs.next() {
5565 let Ok(attr) = attr else { break };
5566 match attr {
5567 VfStatsAttrs::RxPackets(val) => {
5568 if last_off == offset {
5569 stack.push(("RxPackets", last_off));
5570 break;
5571 }
5572 }
5573 VfStatsAttrs::TxPackets(val) => {
5574 if last_off == offset {
5575 stack.push(("TxPackets", last_off));
5576 break;
5577 }
5578 }
5579 VfStatsAttrs::RxBytes(val) => {
5580 if last_off == offset {
5581 stack.push(("RxBytes", last_off));
5582 break;
5583 }
5584 }
5585 VfStatsAttrs::TxBytes(val) => {
5586 if last_off == offset {
5587 stack.push(("TxBytes", last_off));
5588 break;
5589 }
5590 }
5591 VfStatsAttrs::Broadcast(val) => {
5592 if last_off == offset {
5593 stack.push(("Broadcast", last_off));
5594 break;
5595 }
5596 }
5597 VfStatsAttrs::Multicast(val) => {
5598 if last_off == offset {
5599 stack.push(("Multicast", last_off));
5600 break;
5601 }
5602 }
5603 VfStatsAttrs::Pad(val) => {
5604 if last_off == offset {
5605 stack.push(("Pad", last_off));
5606 break;
5607 }
5608 }
5609 VfStatsAttrs::RxDropped(val) => {
5610 if last_off == offset {
5611 stack.push(("RxDropped", last_off));
5612 break;
5613 }
5614 }
5615 VfStatsAttrs::TxDropped(val) => {
5616 if last_off == offset {
5617 stack.push(("TxDropped", last_off));
5618 break;
5619 }
5620 }
5621 _ => {}
5622 };
5623 last_off = cur + attrs.pos;
5624 }
5625 if !stack.is_empty() {
5626 stack.push(("VfStatsAttrs", cur));
5627 }
5628 (stack, None)
5629 }
5630}
5631#[derive(Clone)]
5632pub enum VfVlanAttrs {
5633 #[doc = "Attribute may repeat multiple times (treat it as array)"]
5634 Info(IflaVfVlanInfo),
5635}
5636impl<'a> IterableVfVlanAttrs<'a> {
5637 #[doc = "Attribute may repeat multiple times (treat it as array)"]
5638 pub fn get_info(&self) -> MultiAttrIterable<Self, VfVlanAttrs, IflaVfVlanInfo> {
5639 MultiAttrIterable::new(self.clone(), |variant| {
5640 if let VfVlanAttrs::Info(val) = variant {
5641 Some(val)
5642 } else {
5643 None
5644 }
5645 })
5646 }
5647}
5648impl VfVlanAttrs {
5649 pub fn new<'a>(buf: &'a [u8]) -> IterableVfVlanAttrs<'a> {
5650 IterableVfVlanAttrs::with_loc(buf, buf.as_ptr() as usize)
5651 }
5652 fn attr_from_type(r#type: u16) -> Option<&'static str> {
5653 let res = match r#type {
5654 1u16 => "Info",
5655 _ => return None,
5656 };
5657 Some(res)
5658 }
5659}
5660#[derive(Clone, Copy, Default)]
5661pub struct IterableVfVlanAttrs<'a> {
5662 buf: &'a [u8],
5663 pos: usize,
5664 orig_loc: usize,
5665}
5666impl<'a> IterableVfVlanAttrs<'a> {
5667 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5668 Self {
5669 buf,
5670 pos: 0,
5671 orig_loc,
5672 }
5673 }
5674 pub fn get_buf(&self) -> &'a [u8] {
5675 self.buf
5676 }
5677}
5678impl<'a> Iterator for IterableVfVlanAttrs<'a> {
5679 type Item = Result<VfVlanAttrs, ErrorContext>;
5680 fn next(&mut self) -> Option<Self::Item> {
5681 let mut pos;
5682 let mut r#type;
5683 loop {
5684 pos = self.pos;
5685 r#type = None;
5686 if self.buf.len() == self.pos {
5687 return None;
5688 }
5689 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5690 self.pos = self.buf.len();
5691 break;
5692 };
5693 r#type = Some(header.r#type);
5694 let res = match header.r#type {
5695 1u16 => VfVlanAttrs::Info({
5696 let res = Some(IflaVfVlanInfo::new_from_zeroed(next));
5697 let Some(val) = res else { break };
5698 val
5699 }),
5700 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5701 n => continue,
5702 };
5703 return Some(Ok(res));
5704 }
5705 Some(Err(ErrorContext::new(
5706 "VfVlanAttrs",
5707 r#type.and_then(|t| VfVlanAttrs::attr_from_type(t)),
5708 self.orig_loc,
5709 self.buf.as_ptr().wrapping_add(pos) as usize,
5710 )))
5711 }
5712}
5713impl std::fmt::Debug for IterableVfVlanAttrs<'_> {
5714 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5715 let mut fmt = f.debug_struct("VfVlanAttrs");
5716 for attr in self.clone() {
5717 let attr = match attr {
5718 Ok(a) => a,
5719 Err(err) => {
5720 fmt.finish()?;
5721 f.write_str("Err(")?;
5722 err.fmt(f)?;
5723 return f.write_str(")");
5724 }
5725 };
5726 match attr {
5727 VfVlanAttrs::Info(val) => fmt.field("Info", &val),
5728 };
5729 }
5730 fmt.finish()
5731 }
5732}
5733impl IterableVfVlanAttrs<'_> {
5734 pub fn lookup_attr(
5735 &self,
5736 offset: usize,
5737 missing_type: Option<u16>,
5738 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5739 let mut stack = Vec::new();
5740 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5741 if missing_type.is_some() && cur == offset {
5742 stack.push(("VfVlanAttrs", offset));
5743 return (
5744 stack,
5745 missing_type.and_then(|t| VfVlanAttrs::attr_from_type(t)),
5746 );
5747 }
5748 if cur > offset || cur + self.buf.len() < offset {
5749 return (stack, None);
5750 }
5751 let mut attrs = self.clone();
5752 let mut last_off = cur + attrs.pos;
5753 while let Some(attr) = attrs.next() {
5754 let Ok(attr) = attr else { break };
5755 match attr {
5756 VfVlanAttrs::Info(val) => {
5757 if last_off == offset {
5758 stack.push(("Info", last_off));
5759 break;
5760 }
5761 }
5762 _ => {}
5763 };
5764 last_off = cur + attrs.pos;
5765 }
5766 if !stack.is_empty() {
5767 stack.push(("VfVlanAttrs", cur));
5768 }
5769 (stack, None)
5770 }
5771}
5772#[derive(Clone)]
5773pub enum VfPortsAttrs {}
5774impl<'a> IterableVfPortsAttrs<'a> {}
5775impl VfPortsAttrs {
5776 pub fn new<'a>(buf: &'a [u8]) -> IterableVfPortsAttrs<'a> {
5777 IterableVfPortsAttrs::with_loc(buf, buf.as_ptr() as usize)
5778 }
5779 fn attr_from_type(r#type: u16) -> Option<&'static str> {
5780 None
5781 }
5782}
5783#[derive(Clone, Copy, Default)]
5784pub struct IterableVfPortsAttrs<'a> {
5785 buf: &'a [u8],
5786 pos: usize,
5787 orig_loc: usize,
5788}
5789impl<'a> IterableVfPortsAttrs<'a> {
5790 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5791 Self {
5792 buf,
5793 pos: 0,
5794 orig_loc,
5795 }
5796 }
5797 pub fn get_buf(&self) -> &'a [u8] {
5798 self.buf
5799 }
5800}
5801impl<'a> Iterator for IterableVfPortsAttrs<'a> {
5802 type Item = Result<VfPortsAttrs, ErrorContext>;
5803 fn next(&mut self) -> Option<Self::Item> {
5804 let mut pos;
5805 let mut r#type;
5806 loop {
5807 pos = self.pos;
5808 r#type = None;
5809 if self.buf.len() == self.pos {
5810 return None;
5811 }
5812 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5813 self.pos = self.buf.len();
5814 break;
5815 };
5816 r#type = Some(header.r#type);
5817 let res = match header.r#type {
5818 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5819 n => continue,
5820 };
5821 return Some(Ok(res));
5822 }
5823 Some(Err(ErrorContext::new(
5824 "VfPortsAttrs",
5825 r#type.and_then(|t| VfPortsAttrs::attr_from_type(t)),
5826 self.orig_loc,
5827 self.buf.as_ptr().wrapping_add(pos) as usize,
5828 )))
5829 }
5830}
5831impl std::fmt::Debug for IterableVfPortsAttrs<'_> {
5832 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5833 let mut fmt = f.debug_struct("VfPortsAttrs");
5834 for attr in self.clone() {
5835 let attr = match attr {
5836 Ok(a) => a,
5837 Err(err) => {
5838 fmt.finish()?;
5839 f.write_str("Err(")?;
5840 err.fmt(f)?;
5841 return f.write_str(")");
5842 }
5843 };
5844 match attr {};
5845 }
5846 fmt.finish()
5847 }
5848}
5849impl IterableVfPortsAttrs<'_> {
5850 pub fn lookup_attr(
5851 &self,
5852 offset: usize,
5853 missing_type: Option<u16>,
5854 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5855 let mut stack = Vec::new();
5856 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5857 if missing_type.is_some() && cur == offset {
5858 stack.push(("VfPortsAttrs", offset));
5859 return (
5860 stack,
5861 missing_type.and_then(|t| VfPortsAttrs::attr_from_type(t)),
5862 );
5863 }
5864 (stack, None)
5865 }
5866}
5867#[derive(Clone)]
5868pub enum PortSelfAttrs {}
5869impl<'a> IterablePortSelfAttrs<'a> {}
5870impl PortSelfAttrs {
5871 pub fn new<'a>(buf: &'a [u8]) -> IterablePortSelfAttrs<'a> {
5872 IterablePortSelfAttrs::with_loc(buf, buf.as_ptr() as usize)
5873 }
5874 fn attr_from_type(r#type: u16) -> Option<&'static str> {
5875 None
5876 }
5877}
5878#[derive(Clone, Copy, Default)]
5879pub struct IterablePortSelfAttrs<'a> {
5880 buf: &'a [u8],
5881 pos: usize,
5882 orig_loc: usize,
5883}
5884impl<'a> IterablePortSelfAttrs<'a> {
5885 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
5886 Self {
5887 buf,
5888 pos: 0,
5889 orig_loc,
5890 }
5891 }
5892 pub fn get_buf(&self) -> &'a [u8] {
5893 self.buf
5894 }
5895}
5896impl<'a> Iterator for IterablePortSelfAttrs<'a> {
5897 type Item = Result<PortSelfAttrs, ErrorContext>;
5898 fn next(&mut self) -> Option<Self::Item> {
5899 let mut pos;
5900 let mut r#type;
5901 loop {
5902 pos = self.pos;
5903 r#type = None;
5904 if self.buf.len() == self.pos {
5905 return None;
5906 }
5907 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
5908 self.pos = self.buf.len();
5909 break;
5910 };
5911 r#type = Some(header.r#type);
5912 let res = match header.r#type {
5913 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
5914 n => continue,
5915 };
5916 return Some(Ok(res));
5917 }
5918 Some(Err(ErrorContext::new(
5919 "PortSelfAttrs",
5920 r#type.and_then(|t| PortSelfAttrs::attr_from_type(t)),
5921 self.orig_loc,
5922 self.buf.as_ptr().wrapping_add(pos) as usize,
5923 )))
5924 }
5925}
5926impl std::fmt::Debug for IterablePortSelfAttrs<'_> {
5927 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
5928 let mut fmt = f.debug_struct("PortSelfAttrs");
5929 for attr in self.clone() {
5930 let attr = match attr {
5931 Ok(a) => a,
5932 Err(err) => {
5933 fmt.finish()?;
5934 f.write_str("Err(")?;
5935 err.fmt(f)?;
5936 return f.write_str(")");
5937 }
5938 };
5939 match attr {};
5940 }
5941 fmt.finish()
5942 }
5943}
5944impl IterablePortSelfAttrs<'_> {
5945 pub fn lookup_attr(
5946 &self,
5947 offset: usize,
5948 missing_type: Option<u16>,
5949 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
5950 let mut stack = Vec::new();
5951 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
5952 if missing_type.is_some() && cur == offset {
5953 stack.push(("PortSelfAttrs", offset));
5954 return (
5955 stack,
5956 missing_type.and_then(|t| PortSelfAttrs::attr_from_type(t)),
5957 );
5958 }
5959 (stack, None)
5960 }
5961}
5962#[derive(Clone)]
5963pub enum LinkinfoAttrs<'a> {
5964 Kind(&'a CStr),
5965 Data(LinkinfoDataMsg<'a>),
5966 Xstats(&'a [u8]),
5967 SlaveKind(&'a CStr),
5968 SlaveData(LinkinfoMemberDataMsg<'a>),
5969}
5970impl<'a> IterableLinkinfoAttrs<'a> {
5971 pub fn get_kind(&self) -> Result<&'a CStr, ErrorContext> {
5972 let mut iter = self.clone();
5973 iter.pos = 0;
5974 for attr in iter {
5975 if let Ok(LinkinfoAttrs::Kind(val)) = attr {
5976 return Ok(val);
5977 }
5978 }
5979 Err(ErrorContext::new_missing(
5980 "LinkinfoAttrs",
5981 "Kind",
5982 self.orig_loc,
5983 self.buf.as_ptr() as usize,
5984 ))
5985 }
5986 pub fn get_data(&self) -> Result<LinkinfoDataMsg<'a>, ErrorContext> {
5987 let mut iter = self.clone();
5988 iter.pos = 0;
5989 for attr in iter {
5990 if let Ok(LinkinfoAttrs::Data(val)) = attr {
5991 return Ok(val);
5992 }
5993 }
5994 Err(ErrorContext::new_missing(
5995 "LinkinfoAttrs",
5996 "Data",
5997 self.orig_loc,
5998 self.buf.as_ptr() as usize,
5999 ))
6000 }
6001 pub fn get_xstats(&self) -> Result<&'a [u8], ErrorContext> {
6002 let mut iter = self.clone();
6003 iter.pos = 0;
6004 for attr in iter {
6005 if let Ok(LinkinfoAttrs::Xstats(val)) = attr {
6006 return Ok(val);
6007 }
6008 }
6009 Err(ErrorContext::new_missing(
6010 "LinkinfoAttrs",
6011 "Xstats",
6012 self.orig_loc,
6013 self.buf.as_ptr() as usize,
6014 ))
6015 }
6016 pub fn get_slave_kind(&self) -> Result<&'a CStr, ErrorContext> {
6017 let mut iter = self.clone();
6018 iter.pos = 0;
6019 for attr in iter {
6020 if let Ok(LinkinfoAttrs::SlaveKind(val)) = attr {
6021 return Ok(val);
6022 }
6023 }
6024 Err(ErrorContext::new_missing(
6025 "LinkinfoAttrs",
6026 "SlaveKind",
6027 self.orig_loc,
6028 self.buf.as_ptr() as usize,
6029 ))
6030 }
6031 pub fn get_slave_data(&self) -> Result<LinkinfoMemberDataMsg<'a>, ErrorContext> {
6032 let mut iter = self.clone();
6033 iter.pos = 0;
6034 for attr in iter {
6035 if let Ok(LinkinfoAttrs::SlaveData(val)) = attr {
6036 return Ok(val);
6037 }
6038 }
6039 Err(ErrorContext::new_missing(
6040 "LinkinfoAttrs",
6041 "SlaveData",
6042 self.orig_loc,
6043 self.buf.as_ptr() as usize,
6044 ))
6045 }
6046}
6047#[derive(Debug, Clone)]
6048pub enum LinkinfoDataMsg<'a> {
6049 Bond(IterableLinkinfoBondAttrs<'a>),
6050 Bridge(IterableLinkinfoBridgeAttrs<'a>),
6051 Erspan(IterableLinkinfoGreAttrs<'a>),
6052 Gre(IterableLinkinfoGreAttrs<'a>),
6053 Gretap(IterableLinkinfoGreAttrs<'a>),
6054 Ip6gre(IterableLinkinfoGre6Attrs<'a>),
6055 Geneve(IterableLinkinfoGeneveAttrs<'a>),
6056 Hsr(IterableLinkinfoHsrAttrs<'a>),
6057 Ipip(IterableLinkinfoIptunAttrs<'a>),
6058 Ip6tnl(IterableLinkinfoIp6tnlAttrs<'a>),
6059 Sit(IterableLinkinfoIptunAttrs<'a>),
6060 Tun(IterableLinkinfoTunAttrs<'a>),
6061 Vlan(IterableLinkinfoVlanAttrs<'a>),
6062 Vrf(IterableLinkinfoVrfAttrs<'a>),
6063 Vti(IterableLinkinfoVtiAttrs<'a>),
6064 Vti6(IterableLinkinfoVti6Attrs<'a>),
6065 Netkit(IterableLinkinfoNetkitAttrs<'a>),
6066 Ovpn(IterableLinkinfoOvpnAttrs<'a>),
6067}
6068impl<'a> LinkinfoDataMsg<'a> {
6069 fn select_with_loc(selector: &'a CStr, buf: &'a [u8], loc: usize) -> Option<Self> {
6070 match selector.to_bytes() {
6071 b"bond" => Some(LinkinfoDataMsg::Bond(IterableLinkinfoBondAttrs::with_loc(
6072 buf, loc,
6073 ))),
6074 b"bridge" => Some(LinkinfoDataMsg::Bridge(
6075 IterableLinkinfoBridgeAttrs::with_loc(buf, loc),
6076 )),
6077 b"erspan" => Some(LinkinfoDataMsg::Erspan(IterableLinkinfoGreAttrs::with_loc(
6078 buf, loc,
6079 ))),
6080 b"gre" => Some(LinkinfoDataMsg::Gre(IterableLinkinfoGreAttrs::with_loc(
6081 buf, loc,
6082 ))),
6083 b"gretap" => Some(LinkinfoDataMsg::Gretap(IterableLinkinfoGreAttrs::with_loc(
6084 buf, loc,
6085 ))),
6086 b"ip6gre" => Some(LinkinfoDataMsg::Ip6gre(
6087 IterableLinkinfoGre6Attrs::with_loc(buf, loc),
6088 )),
6089 b"geneve" => Some(LinkinfoDataMsg::Geneve(
6090 IterableLinkinfoGeneveAttrs::with_loc(buf, loc),
6091 )),
6092 b"hsr" => Some(LinkinfoDataMsg::Hsr(IterableLinkinfoHsrAttrs::with_loc(
6093 buf, loc,
6094 ))),
6095 b"ipip" => Some(LinkinfoDataMsg::Ipip(IterableLinkinfoIptunAttrs::with_loc(
6096 buf, loc,
6097 ))),
6098 b"ip6tnl" => Some(LinkinfoDataMsg::Ip6tnl(
6099 IterableLinkinfoIp6tnlAttrs::with_loc(buf, loc),
6100 )),
6101 b"sit" => Some(LinkinfoDataMsg::Sit(IterableLinkinfoIptunAttrs::with_loc(
6102 buf, loc,
6103 ))),
6104 b"tun" => Some(LinkinfoDataMsg::Tun(IterableLinkinfoTunAttrs::with_loc(
6105 buf, loc,
6106 ))),
6107 b"vlan" => Some(LinkinfoDataMsg::Vlan(IterableLinkinfoVlanAttrs::with_loc(
6108 buf, loc,
6109 ))),
6110 b"vrf" => Some(LinkinfoDataMsg::Vrf(IterableLinkinfoVrfAttrs::with_loc(
6111 buf, loc,
6112 ))),
6113 b"vti" => Some(LinkinfoDataMsg::Vti(IterableLinkinfoVtiAttrs::with_loc(
6114 buf, loc,
6115 ))),
6116 b"vti6" => Some(LinkinfoDataMsg::Vti6(IterableLinkinfoVti6Attrs::with_loc(
6117 buf, loc,
6118 ))),
6119 b"netkit" => Some(LinkinfoDataMsg::Netkit(
6120 IterableLinkinfoNetkitAttrs::with_loc(buf, loc),
6121 )),
6122 b"ovpn" => Some(LinkinfoDataMsg::Ovpn(IterableLinkinfoOvpnAttrs::with_loc(
6123 buf, loc,
6124 ))),
6125 _ => None,
6126 }
6127 }
6128}
6129#[derive(Debug, Clone)]
6130pub enum LinkinfoMemberDataMsg<'a> {
6131 Bridge(IterableLinkinfoBrportAttrs<'a>),
6132 Bond(IterableBondSlaveAttrs<'a>),
6133}
6134impl<'a> LinkinfoMemberDataMsg<'a> {
6135 fn select_with_loc(selector: &'a CStr, buf: &'a [u8], loc: usize) -> Option<Self> {
6136 match selector.to_bytes() {
6137 b"bridge" => Some(LinkinfoMemberDataMsg::Bridge(
6138 IterableLinkinfoBrportAttrs::with_loc(buf, loc),
6139 )),
6140 b"bond" => Some(LinkinfoMemberDataMsg::Bond(
6141 IterableBondSlaveAttrs::with_loc(buf, loc),
6142 )),
6143 _ => None,
6144 }
6145 }
6146}
6147impl LinkinfoAttrs<'_> {
6148 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoAttrs<'a> {
6149 IterableLinkinfoAttrs::with_loc(buf, buf.as_ptr() as usize)
6150 }
6151 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6152 let res = match r#type {
6153 1u16 => "Kind",
6154 2u16 => "Data",
6155 3u16 => "Xstats",
6156 4u16 => "SlaveKind",
6157 5u16 => "SlaveData",
6158 _ => return None,
6159 };
6160 Some(res)
6161 }
6162}
6163#[derive(Clone, Copy, Default)]
6164pub struct IterableLinkinfoAttrs<'a> {
6165 buf: &'a [u8],
6166 pos: usize,
6167 orig_loc: usize,
6168}
6169impl<'a> IterableLinkinfoAttrs<'a> {
6170 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6171 Self {
6172 buf,
6173 pos: 0,
6174 orig_loc,
6175 }
6176 }
6177 pub fn get_buf(&self) -> &'a [u8] {
6178 self.buf
6179 }
6180}
6181impl<'a> Iterator for IterableLinkinfoAttrs<'a> {
6182 type Item = Result<LinkinfoAttrs<'a>, ErrorContext>;
6183 fn next(&mut self) -> Option<Self::Item> {
6184 let mut pos;
6185 let mut r#type;
6186 loop {
6187 pos = self.pos;
6188 r#type = None;
6189 if self.buf.len() == self.pos {
6190 return None;
6191 }
6192 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
6193 self.pos = self.buf.len();
6194 break;
6195 };
6196 r#type = Some(header.r#type);
6197 let res = match header.r#type {
6198 1u16 => LinkinfoAttrs::Kind({
6199 let res = CStr::from_bytes_with_nul(next).ok();
6200 let Some(val) = res else { break };
6201 val
6202 }),
6203 2u16 => LinkinfoAttrs::Data({
6204 let res = {
6205 let Ok(selector) = self.get_kind() else { break };
6206 match LinkinfoDataMsg::select_with_loc(selector, next, self.orig_loc) {
6207 Some(sub) => Some(sub),
6208 None if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6209 None => continue,
6210 }
6211 };
6212 let Some(val) = res else { break };
6213 val
6214 }),
6215 3u16 => LinkinfoAttrs::Xstats({
6216 let res = Some(next);
6217 let Some(val) = res else { break };
6218 val
6219 }),
6220 4u16 => LinkinfoAttrs::SlaveKind({
6221 let res = CStr::from_bytes_with_nul(next).ok();
6222 let Some(val) = res else { break };
6223 val
6224 }),
6225 5u16 => LinkinfoAttrs::SlaveData({
6226 let res = {
6227 let Ok(selector) = self.get_slave_kind() else {
6228 break;
6229 };
6230 match LinkinfoMemberDataMsg::select_with_loc(selector, next, self.orig_loc)
6231 {
6232 Some(sub) => Some(sub),
6233 None if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6234 None => continue,
6235 }
6236 };
6237 let Some(val) = res else { break };
6238 val
6239 }),
6240 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
6241 n => continue,
6242 };
6243 return Some(Ok(res));
6244 }
6245 Some(Err(ErrorContext::new(
6246 "LinkinfoAttrs",
6247 r#type.and_then(|t| LinkinfoAttrs::attr_from_type(t)),
6248 self.orig_loc,
6249 self.buf.as_ptr().wrapping_add(pos) as usize,
6250 )))
6251 }
6252}
6253impl<'a> std::fmt::Debug for IterableLinkinfoAttrs<'_> {
6254 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
6255 let mut fmt = f.debug_struct("LinkinfoAttrs");
6256 for attr in self.clone() {
6257 let attr = match attr {
6258 Ok(a) => a,
6259 Err(err) => {
6260 fmt.finish()?;
6261 f.write_str("Err(")?;
6262 err.fmt(f)?;
6263 return f.write_str(")");
6264 }
6265 };
6266 match attr {
6267 LinkinfoAttrs::Kind(val) => fmt.field("Kind", &val),
6268 LinkinfoAttrs::Data(val) => fmt.field("Data", &val),
6269 LinkinfoAttrs::Xstats(val) => fmt.field("Xstats", &val),
6270 LinkinfoAttrs::SlaveKind(val) => fmt.field("SlaveKind", &val),
6271 LinkinfoAttrs::SlaveData(val) => fmt.field("SlaveData", &val),
6272 };
6273 }
6274 fmt.finish()
6275 }
6276}
6277impl IterableLinkinfoAttrs<'_> {
6278 pub fn lookup_attr(
6279 &self,
6280 offset: usize,
6281 missing_type: Option<u16>,
6282 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
6283 let mut stack = Vec::new();
6284 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
6285 if missing_type.is_some() && cur == offset {
6286 stack.push(("LinkinfoAttrs", offset));
6287 return (
6288 stack,
6289 missing_type.and_then(|t| LinkinfoAttrs::attr_from_type(t)),
6290 );
6291 }
6292 if cur > offset || cur + self.buf.len() < offset {
6293 return (stack, None);
6294 }
6295 let mut attrs = self.clone();
6296 let mut last_off = cur + attrs.pos;
6297 while let Some(attr) = attrs.next() {
6298 let Ok(attr) = attr else { break };
6299 match attr {
6300 LinkinfoAttrs::Kind(val) => {
6301 if last_off == offset {
6302 stack.push(("Kind", last_off));
6303 break;
6304 }
6305 }
6306 LinkinfoAttrs::Data(val) => {
6307 if last_off == offset {
6308 stack.push(("Data", last_off));
6309 break;
6310 }
6311 }
6312 LinkinfoAttrs::Xstats(val) => {
6313 if last_off == offset {
6314 stack.push(("Xstats", last_off));
6315 break;
6316 }
6317 }
6318 LinkinfoAttrs::SlaveKind(val) => {
6319 if last_off == offset {
6320 stack.push(("SlaveKind", last_off));
6321 break;
6322 }
6323 }
6324 LinkinfoAttrs::SlaveData(val) => {
6325 if last_off == offset {
6326 stack.push(("SlaveData", last_off));
6327 break;
6328 }
6329 }
6330 _ => {}
6331 };
6332 last_off = cur + attrs.pos;
6333 }
6334 if !stack.is_empty() {
6335 stack.push(("LinkinfoAttrs", cur));
6336 }
6337 (stack, None)
6338 }
6339}
6340#[derive(Clone)]
6341pub enum LinkinfoBondAttrs<'a> {
6342 Mode(u8),
6343 ActiveSlave(u32),
6344 Miimon(u32),
6345 Updelay(u32),
6346 Downdelay(u32),
6347 UseCarrier(u8),
6348 ArpInterval(u32),
6349 ArpIpTarget(IterableArrayIpv4Addr<'a>),
6350 ArpValidate(u32),
6351 ArpAllTargets(u32),
6352 Primary(u32),
6353 PrimaryReselect(u8),
6354 FailOverMac(u8),
6355 XmitHashPolicy(u8),
6356 ResendIgmp(u32),
6357 NumPeerNotif(u8),
6358 AllSlavesActive(u8),
6359 MinLinks(u32),
6360 LpInterval(u32),
6361 PacketsPerSlave(u32),
6362 AdLacpRate(u8),
6363 AdSelect(u8),
6364 AdInfo(IterableBondAdInfoAttrs<'a>),
6365 AdActorSysPrio(u16),
6366 AdUserPortKey(u16),
6367 AdActorSystem(&'a [u8]),
6368 TlbDynamicLb(u8),
6369 PeerNotifDelay(u32),
6370 AdLacpActive(u8),
6371 MissedMax(u8),
6372 NsIp6Target(IterableArrayBinary<'a>),
6373 CoupledControl(u8),
6374 BroadcastNeigh(u8),
6375 LacpStrict(u8),
6376}
6377impl<'a> IterableLinkinfoBondAttrs<'a> {
6378 pub fn get_mode(&self) -> Result<u8, ErrorContext> {
6379 let mut iter = self.clone();
6380 iter.pos = 0;
6381 for attr in iter {
6382 if let Ok(LinkinfoBondAttrs::Mode(val)) = attr {
6383 return Ok(val);
6384 }
6385 }
6386 Err(ErrorContext::new_missing(
6387 "LinkinfoBondAttrs",
6388 "Mode",
6389 self.orig_loc,
6390 self.buf.as_ptr() as usize,
6391 ))
6392 }
6393 pub fn get_active_slave(&self) -> Result<u32, ErrorContext> {
6394 let mut iter = self.clone();
6395 iter.pos = 0;
6396 for attr in iter {
6397 if let Ok(LinkinfoBondAttrs::ActiveSlave(val)) = attr {
6398 return Ok(val);
6399 }
6400 }
6401 Err(ErrorContext::new_missing(
6402 "LinkinfoBondAttrs",
6403 "ActiveSlave",
6404 self.orig_loc,
6405 self.buf.as_ptr() as usize,
6406 ))
6407 }
6408 pub fn get_miimon(&self) -> Result<u32, ErrorContext> {
6409 let mut iter = self.clone();
6410 iter.pos = 0;
6411 for attr in iter {
6412 if let Ok(LinkinfoBondAttrs::Miimon(val)) = attr {
6413 return Ok(val);
6414 }
6415 }
6416 Err(ErrorContext::new_missing(
6417 "LinkinfoBondAttrs",
6418 "Miimon",
6419 self.orig_loc,
6420 self.buf.as_ptr() as usize,
6421 ))
6422 }
6423 pub fn get_updelay(&self) -> Result<u32, ErrorContext> {
6424 let mut iter = self.clone();
6425 iter.pos = 0;
6426 for attr in iter {
6427 if let Ok(LinkinfoBondAttrs::Updelay(val)) = attr {
6428 return Ok(val);
6429 }
6430 }
6431 Err(ErrorContext::new_missing(
6432 "LinkinfoBondAttrs",
6433 "Updelay",
6434 self.orig_loc,
6435 self.buf.as_ptr() as usize,
6436 ))
6437 }
6438 pub fn get_downdelay(&self) -> Result<u32, ErrorContext> {
6439 let mut iter = self.clone();
6440 iter.pos = 0;
6441 for attr in iter {
6442 if let Ok(LinkinfoBondAttrs::Downdelay(val)) = attr {
6443 return Ok(val);
6444 }
6445 }
6446 Err(ErrorContext::new_missing(
6447 "LinkinfoBondAttrs",
6448 "Downdelay",
6449 self.orig_loc,
6450 self.buf.as_ptr() as usize,
6451 ))
6452 }
6453 pub fn get_use_carrier(&self) -> Result<u8, ErrorContext> {
6454 let mut iter = self.clone();
6455 iter.pos = 0;
6456 for attr in iter {
6457 if let Ok(LinkinfoBondAttrs::UseCarrier(val)) = attr {
6458 return Ok(val);
6459 }
6460 }
6461 Err(ErrorContext::new_missing(
6462 "LinkinfoBondAttrs",
6463 "UseCarrier",
6464 self.orig_loc,
6465 self.buf.as_ptr() as usize,
6466 ))
6467 }
6468 pub fn get_arp_interval(&self) -> Result<u32, ErrorContext> {
6469 let mut iter = self.clone();
6470 iter.pos = 0;
6471 for attr in iter {
6472 if let Ok(LinkinfoBondAttrs::ArpInterval(val)) = attr {
6473 return Ok(val);
6474 }
6475 }
6476 Err(ErrorContext::new_missing(
6477 "LinkinfoBondAttrs",
6478 "ArpInterval",
6479 self.orig_loc,
6480 self.buf.as_ptr() as usize,
6481 ))
6482 }
6483 pub fn get_arp_ip_target(
6484 &self,
6485 ) -> Result<ArrayIterable<IterableArrayIpv4Addr<'a>, std::net::Ipv4Addr>, ErrorContext> {
6486 for attr in self.clone() {
6487 if let Ok(LinkinfoBondAttrs::ArpIpTarget(val)) = attr {
6488 return Ok(ArrayIterable::new(val));
6489 }
6490 }
6491 Err(ErrorContext::new_missing(
6492 "LinkinfoBondAttrs",
6493 "ArpIpTarget",
6494 self.orig_loc,
6495 self.buf.as_ptr() as usize,
6496 ))
6497 }
6498 pub fn get_arp_validate(&self) -> Result<u32, ErrorContext> {
6499 let mut iter = self.clone();
6500 iter.pos = 0;
6501 for attr in iter {
6502 if let Ok(LinkinfoBondAttrs::ArpValidate(val)) = attr {
6503 return Ok(val);
6504 }
6505 }
6506 Err(ErrorContext::new_missing(
6507 "LinkinfoBondAttrs",
6508 "ArpValidate",
6509 self.orig_loc,
6510 self.buf.as_ptr() as usize,
6511 ))
6512 }
6513 pub fn get_arp_all_targets(&self) -> Result<u32, ErrorContext> {
6514 let mut iter = self.clone();
6515 iter.pos = 0;
6516 for attr in iter {
6517 if let Ok(LinkinfoBondAttrs::ArpAllTargets(val)) = attr {
6518 return Ok(val);
6519 }
6520 }
6521 Err(ErrorContext::new_missing(
6522 "LinkinfoBondAttrs",
6523 "ArpAllTargets",
6524 self.orig_loc,
6525 self.buf.as_ptr() as usize,
6526 ))
6527 }
6528 pub fn get_primary(&self) -> Result<u32, ErrorContext> {
6529 let mut iter = self.clone();
6530 iter.pos = 0;
6531 for attr in iter {
6532 if let Ok(LinkinfoBondAttrs::Primary(val)) = attr {
6533 return Ok(val);
6534 }
6535 }
6536 Err(ErrorContext::new_missing(
6537 "LinkinfoBondAttrs",
6538 "Primary",
6539 self.orig_loc,
6540 self.buf.as_ptr() as usize,
6541 ))
6542 }
6543 pub fn get_primary_reselect(&self) -> Result<u8, ErrorContext> {
6544 let mut iter = self.clone();
6545 iter.pos = 0;
6546 for attr in iter {
6547 if let Ok(LinkinfoBondAttrs::PrimaryReselect(val)) = attr {
6548 return Ok(val);
6549 }
6550 }
6551 Err(ErrorContext::new_missing(
6552 "LinkinfoBondAttrs",
6553 "PrimaryReselect",
6554 self.orig_loc,
6555 self.buf.as_ptr() as usize,
6556 ))
6557 }
6558 pub fn get_fail_over_mac(&self) -> Result<u8, ErrorContext> {
6559 let mut iter = self.clone();
6560 iter.pos = 0;
6561 for attr in iter {
6562 if let Ok(LinkinfoBondAttrs::FailOverMac(val)) = attr {
6563 return Ok(val);
6564 }
6565 }
6566 Err(ErrorContext::new_missing(
6567 "LinkinfoBondAttrs",
6568 "FailOverMac",
6569 self.orig_loc,
6570 self.buf.as_ptr() as usize,
6571 ))
6572 }
6573 pub fn get_xmit_hash_policy(&self) -> Result<u8, ErrorContext> {
6574 let mut iter = self.clone();
6575 iter.pos = 0;
6576 for attr in iter {
6577 if let Ok(LinkinfoBondAttrs::XmitHashPolicy(val)) = attr {
6578 return Ok(val);
6579 }
6580 }
6581 Err(ErrorContext::new_missing(
6582 "LinkinfoBondAttrs",
6583 "XmitHashPolicy",
6584 self.orig_loc,
6585 self.buf.as_ptr() as usize,
6586 ))
6587 }
6588 pub fn get_resend_igmp(&self) -> Result<u32, ErrorContext> {
6589 let mut iter = self.clone();
6590 iter.pos = 0;
6591 for attr in iter {
6592 if let Ok(LinkinfoBondAttrs::ResendIgmp(val)) = attr {
6593 return Ok(val);
6594 }
6595 }
6596 Err(ErrorContext::new_missing(
6597 "LinkinfoBondAttrs",
6598 "ResendIgmp",
6599 self.orig_loc,
6600 self.buf.as_ptr() as usize,
6601 ))
6602 }
6603 pub fn get_num_peer_notif(&self) -> Result<u8, ErrorContext> {
6604 let mut iter = self.clone();
6605 iter.pos = 0;
6606 for attr in iter {
6607 if let Ok(LinkinfoBondAttrs::NumPeerNotif(val)) = attr {
6608 return Ok(val);
6609 }
6610 }
6611 Err(ErrorContext::new_missing(
6612 "LinkinfoBondAttrs",
6613 "NumPeerNotif",
6614 self.orig_loc,
6615 self.buf.as_ptr() as usize,
6616 ))
6617 }
6618 pub fn get_all_slaves_active(&self) -> Result<u8, ErrorContext> {
6619 let mut iter = self.clone();
6620 iter.pos = 0;
6621 for attr in iter {
6622 if let Ok(LinkinfoBondAttrs::AllSlavesActive(val)) = attr {
6623 return Ok(val);
6624 }
6625 }
6626 Err(ErrorContext::new_missing(
6627 "LinkinfoBondAttrs",
6628 "AllSlavesActive",
6629 self.orig_loc,
6630 self.buf.as_ptr() as usize,
6631 ))
6632 }
6633 pub fn get_min_links(&self) -> Result<u32, ErrorContext> {
6634 let mut iter = self.clone();
6635 iter.pos = 0;
6636 for attr in iter {
6637 if let Ok(LinkinfoBondAttrs::MinLinks(val)) = attr {
6638 return Ok(val);
6639 }
6640 }
6641 Err(ErrorContext::new_missing(
6642 "LinkinfoBondAttrs",
6643 "MinLinks",
6644 self.orig_loc,
6645 self.buf.as_ptr() as usize,
6646 ))
6647 }
6648 pub fn get_lp_interval(&self) -> Result<u32, ErrorContext> {
6649 let mut iter = self.clone();
6650 iter.pos = 0;
6651 for attr in iter {
6652 if let Ok(LinkinfoBondAttrs::LpInterval(val)) = attr {
6653 return Ok(val);
6654 }
6655 }
6656 Err(ErrorContext::new_missing(
6657 "LinkinfoBondAttrs",
6658 "LpInterval",
6659 self.orig_loc,
6660 self.buf.as_ptr() as usize,
6661 ))
6662 }
6663 pub fn get_packets_per_slave(&self) -> Result<u32, ErrorContext> {
6664 let mut iter = self.clone();
6665 iter.pos = 0;
6666 for attr in iter {
6667 if let Ok(LinkinfoBondAttrs::PacketsPerSlave(val)) = attr {
6668 return Ok(val);
6669 }
6670 }
6671 Err(ErrorContext::new_missing(
6672 "LinkinfoBondAttrs",
6673 "PacketsPerSlave",
6674 self.orig_loc,
6675 self.buf.as_ptr() as usize,
6676 ))
6677 }
6678 pub fn get_ad_lacp_rate(&self) -> Result<u8, ErrorContext> {
6679 let mut iter = self.clone();
6680 iter.pos = 0;
6681 for attr in iter {
6682 if let Ok(LinkinfoBondAttrs::AdLacpRate(val)) = attr {
6683 return Ok(val);
6684 }
6685 }
6686 Err(ErrorContext::new_missing(
6687 "LinkinfoBondAttrs",
6688 "AdLacpRate",
6689 self.orig_loc,
6690 self.buf.as_ptr() as usize,
6691 ))
6692 }
6693 pub fn get_ad_select(&self) -> Result<u8, ErrorContext> {
6694 let mut iter = self.clone();
6695 iter.pos = 0;
6696 for attr in iter {
6697 if let Ok(LinkinfoBondAttrs::AdSelect(val)) = attr {
6698 return Ok(val);
6699 }
6700 }
6701 Err(ErrorContext::new_missing(
6702 "LinkinfoBondAttrs",
6703 "AdSelect",
6704 self.orig_loc,
6705 self.buf.as_ptr() as usize,
6706 ))
6707 }
6708 pub fn get_ad_info(&self) -> Result<IterableBondAdInfoAttrs<'a>, ErrorContext> {
6709 let mut iter = self.clone();
6710 iter.pos = 0;
6711 for attr in iter {
6712 if let Ok(LinkinfoBondAttrs::AdInfo(val)) = attr {
6713 return Ok(val);
6714 }
6715 }
6716 Err(ErrorContext::new_missing(
6717 "LinkinfoBondAttrs",
6718 "AdInfo",
6719 self.orig_loc,
6720 self.buf.as_ptr() as usize,
6721 ))
6722 }
6723 pub fn get_ad_actor_sys_prio(&self) -> Result<u16, ErrorContext> {
6724 let mut iter = self.clone();
6725 iter.pos = 0;
6726 for attr in iter {
6727 if let Ok(LinkinfoBondAttrs::AdActorSysPrio(val)) = attr {
6728 return Ok(val);
6729 }
6730 }
6731 Err(ErrorContext::new_missing(
6732 "LinkinfoBondAttrs",
6733 "AdActorSysPrio",
6734 self.orig_loc,
6735 self.buf.as_ptr() as usize,
6736 ))
6737 }
6738 pub fn get_ad_user_port_key(&self) -> Result<u16, ErrorContext> {
6739 let mut iter = self.clone();
6740 iter.pos = 0;
6741 for attr in iter {
6742 if let Ok(LinkinfoBondAttrs::AdUserPortKey(val)) = attr {
6743 return Ok(val);
6744 }
6745 }
6746 Err(ErrorContext::new_missing(
6747 "LinkinfoBondAttrs",
6748 "AdUserPortKey",
6749 self.orig_loc,
6750 self.buf.as_ptr() as usize,
6751 ))
6752 }
6753 pub fn get_ad_actor_system(&self) -> Result<&'a [u8], ErrorContext> {
6754 let mut iter = self.clone();
6755 iter.pos = 0;
6756 for attr in iter {
6757 if let Ok(LinkinfoBondAttrs::AdActorSystem(val)) = attr {
6758 return Ok(val);
6759 }
6760 }
6761 Err(ErrorContext::new_missing(
6762 "LinkinfoBondAttrs",
6763 "AdActorSystem",
6764 self.orig_loc,
6765 self.buf.as_ptr() as usize,
6766 ))
6767 }
6768 pub fn get_tlb_dynamic_lb(&self) -> Result<u8, ErrorContext> {
6769 let mut iter = self.clone();
6770 iter.pos = 0;
6771 for attr in iter {
6772 if let Ok(LinkinfoBondAttrs::TlbDynamicLb(val)) = attr {
6773 return Ok(val);
6774 }
6775 }
6776 Err(ErrorContext::new_missing(
6777 "LinkinfoBondAttrs",
6778 "TlbDynamicLb",
6779 self.orig_loc,
6780 self.buf.as_ptr() as usize,
6781 ))
6782 }
6783 pub fn get_peer_notif_delay(&self) -> Result<u32, ErrorContext> {
6784 let mut iter = self.clone();
6785 iter.pos = 0;
6786 for attr in iter {
6787 if let Ok(LinkinfoBondAttrs::PeerNotifDelay(val)) = attr {
6788 return Ok(val);
6789 }
6790 }
6791 Err(ErrorContext::new_missing(
6792 "LinkinfoBondAttrs",
6793 "PeerNotifDelay",
6794 self.orig_loc,
6795 self.buf.as_ptr() as usize,
6796 ))
6797 }
6798 pub fn get_ad_lacp_active(&self) -> Result<u8, ErrorContext> {
6799 let mut iter = self.clone();
6800 iter.pos = 0;
6801 for attr in iter {
6802 if let Ok(LinkinfoBondAttrs::AdLacpActive(val)) = attr {
6803 return Ok(val);
6804 }
6805 }
6806 Err(ErrorContext::new_missing(
6807 "LinkinfoBondAttrs",
6808 "AdLacpActive",
6809 self.orig_loc,
6810 self.buf.as_ptr() as usize,
6811 ))
6812 }
6813 pub fn get_missed_max(&self) -> Result<u8, ErrorContext> {
6814 let mut iter = self.clone();
6815 iter.pos = 0;
6816 for attr in iter {
6817 if let Ok(LinkinfoBondAttrs::MissedMax(val)) = attr {
6818 return Ok(val);
6819 }
6820 }
6821 Err(ErrorContext::new_missing(
6822 "LinkinfoBondAttrs",
6823 "MissedMax",
6824 self.orig_loc,
6825 self.buf.as_ptr() as usize,
6826 ))
6827 }
6828 pub fn get_ns_ip6_target(
6829 &self,
6830 ) -> Result<ArrayIterable<IterableArrayBinary<'a>, &'a [u8]>, ErrorContext> {
6831 for attr in self.clone() {
6832 if let Ok(LinkinfoBondAttrs::NsIp6Target(val)) = attr {
6833 return Ok(ArrayIterable::new(val));
6834 }
6835 }
6836 Err(ErrorContext::new_missing(
6837 "LinkinfoBondAttrs",
6838 "NsIp6Target",
6839 self.orig_loc,
6840 self.buf.as_ptr() as usize,
6841 ))
6842 }
6843 pub fn get_coupled_control(&self) -> Result<u8, ErrorContext> {
6844 let mut iter = self.clone();
6845 iter.pos = 0;
6846 for attr in iter {
6847 if let Ok(LinkinfoBondAttrs::CoupledControl(val)) = attr {
6848 return Ok(val);
6849 }
6850 }
6851 Err(ErrorContext::new_missing(
6852 "LinkinfoBondAttrs",
6853 "CoupledControl",
6854 self.orig_loc,
6855 self.buf.as_ptr() as usize,
6856 ))
6857 }
6858 pub fn get_broadcast_neigh(&self) -> Result<u8, ErrorContext> {
6859 let mut iter = self.clone();
6860 iter.pos = 0;
6861 for attr in iter {
6862 if let Ok(LinkinfoBondAttrs::BroadcastNeigh(val)) = attr {
6863 return Ok(val);
6864 }
6865 }
6866 Err(ErrorContext::new_missing(
6867 "LinkinfoBondAttrs",
6868 "BroadcastNeigh",
6869 self.orig_loc,
6870 self.buf.as_ptr() as usize,
6871 ))
6872 }
6873 pub fn get_lacp_strict(&self) -> Result<u8, ErrorContext> {
6874 let mut iter = self.clone();
6875 iter.pos = 0;
6876 for attr in iter {
6877 if let Ok(LinkinfoBondAttrs::LacpStrict(val)) = attr {
6878 return Ok(val);
6879 }
6880 }
6881 Err(ErrorContext::new_missing(
6882 "LinkinfoBondAttrs",
6883 "LacpStrict",
6884 self.orig_loc,
6885 self.buf.as_ptr() as usize,
6886 ))
6887 }
6888}
6889#[derive(Clone, Copy, Default)]
6890pub struct IterableArrayIpv4Addr<'a> {
6891 buf: &'a [u8],
6892 pos: usize,
6893 orig_loc: usize,
6894}
6895impl<'a> IterableArrayIpv4Addr<'a> {
6896 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6897 Self {
6898 buf,
6899 pos: 0,
6900 orig_loc,
6901 }
6902 }
6903 pub fn get_buf(&self) -> &'a [u8] {
6904 self.buf
6905 }
6906}
6907impl<'a> Iterator for IterableArrayIpv4Addr<'a> {
6908 type Item = Result<std::net::Ipv4Addr, ErrorContext>;
6909 fn next(&mut self) -> Option<Self::Item> {
6910 if self.buf.len() == self.pos {
6911 return None;
6912 }
6913 while let Some((header, next)) = chop_header(self.buf, &mut self.pos) {
6914 {
6915 let Some(res) = parse_be_u32(next).map(Ipv4Addr::from_bits) else {
6916 break;
6917 };
6918 return Some(Ok(res));
6919 }
6920 }
6921 let pos = self.pos;
6922 self.pos = self.buf.len();
6923 Some(Err(ErrorContext::new(
6924 "Ipv4Addr",
6925 None,
6926 self.orig_loc,
6927 self.buf.as_ptr().wrapping_add(pos) as usize,
6928 )))
6929 }
6930}
6931#[derive(Clone, Copy, Default)]
6932pub struct IterableArrayBinary<'a> {
6933 buf: &'a [u8],
6934 pos: usize,
6935 orig_loc: usize,
6936}
6937impl<'a> IterableArrayBinary<'a> {
6938 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
6939 Self {
6940 buf,
6941 pos: 0,
6942 orig_loc,
6943 }
6944 }
6945 pub fn get_buf(&self) -> &'a [u8] {
6946 self.buf
6947 }
6948}
6949impl<'a> Iterator for IterableArrayBinary<'a> {
6950 type Item = Result<&'a [u8], ErrorContext>;
6951 fn next(&mut self) -> Option<Self::Item> {
6952 if self.buf.len() == self.pos {
6953 return None;
6954 }
6955 while let Some((header, next)) = chop_header(self.buf, &mut self.pos) {
6956 {
6957 let Some(res) = Some(next) else { break };
6958 return Some(Ok(res));
6959 }
6960 }
6961 let pos = self.pos;
6962 self.pos = self.buf.len();
6963 Some(Err(ErrorContext::new(
6964 "Binary",
6965 None,
6966 self.orig_loc,
6967 self.buf.as_ptr().wrapping_add(pos) as usize,
6968 )))
6969 }
6970}
6971impl LinkinfoBondAttrs<'_> {
6972 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoBondAttrs<'a> {
6973 IterableLinkinfoBondAttrs::with_loc(buf, buf.as_ptr() as usize)
6974 }
6975 fn attr_from_type(r#type: u16) -> Option<&'static str> {
6976 let res = match r#type {
6977 1u16 => "Mode",
6978 2u16 => "ActiveSlave",
6979 3u16 => "Miimon",
6980 4u16 => "Updelay",
6981 5u16 => "Downdelay",
6982 6u16 => "UseCarrier",
6983 7u16 => "ArpInterval",
6984 8u16 => "ArpIpTarget",
6985 9u16 => "ArpValidate",
6986 10u16 => "ArpAllTargets",
6987 11u16 => "Primary",
6988 12u16 => "PrimaryReselect",
6989 13u16 => "FailOverMac",
6990 14u16 => "XmitHashPolicy",
6991 15u16 => "ResendIgmp",
6992 16u16 => "NumPeerNotif",
6993 17u16 => "AllSlavesActive",
6994 18u16 => "MinLinks",
6995 19u16 => "LpInterval",
6996 20u16 => "PacketsPerSlave",
6997 21u16 => "AdLacpRate",
6998 22u16 => "AdSelect",
6999 23u16 => "AdInfo",
7000 24u16 => "AdActorSysPrio",
7001 25u16 => "AdUserPortKey",
7002 26u16 => "AdActorSystem",
7003 27u16 => "TlbDynamicLb",
7004 28u16 => "PeerNotifDelay",
7005 29u16 => "AdLacpActive",
7006 30u16 => "MissedMax",
7007 31u16 => "NsIp6Target",
7008 32u16 => "CoupledControl",
7009 33u16 => "BroadcastNeigh",
7010 34u16 => "LacpStrict",
7011 _ => return None,
7012 };
7013 Some(res)
7014 }
7015}
7016#[derive(Clone, Copy, Default)]
7017pub struct IterableLinkinfoBondAttrs<'a> {
7018 buf: &'a [u8],
7019 pos: usize,
7020 orig_loc: usize,
7021}
7022impl<'a> IterableLinkinfoBondAttrs<'a> {
7023 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7024 Self {
7025 buf,
7026 pos: 0,
7027 orig_loc,
7028 }
7029 }
7030 pub fn get_buf(&self) -> &'a [u8] {
7031 self.buf
7032 }
7033}
7034impl<'a> Iterator for IterableLinkinfoBondAttrs<'a> {
7035 type Item = Result<LinkinfoBondAttrs<'a>, ErrorContext>;
7036 fn next(&mut self) -> Option<Self::Item> {
7037 let mut pos;
7038 let mut r#type;
7039 loop {
7040 pos = self.pos;
7041 r#type = None;
7042 if self.buf.len() == self.pos {
7043 return None;
7044 }
7045 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7046 self.pos = self.buf.len();
7047 break;
7048 };
7049 r#type = Some(header.r#type);
7050 let res = match header.r#type {
7051 1u16 => LinkinfoBondAttrs::Mode({
7052 let res = parse_u8(next);
7053 let Some(val) = res else { break };
7054 val
7055 }),
7056 2u16 => LinkinfoBondAttrs::ActiveSlave({
7057 let res = parse_u32(next);
7058 let Some(val) = res else { break };
7059 val
7060 }),
7061 3u16 => LinkinfoBondAttrs::Miimon({
7062 let res = parse_u32(next);
7063 let Some(val) = res else { break };
7064 val
7065 }),
7066 4u16 => LinkinfoBondAttrs::Updelay({
7067 let res = parse_u32(next);
7068 let Some(val) = res else { break };
7069 val
7070 }),
7071 5u16 => LinkinfoBondAttrs::Downdelay({
7072 let res = parse_u32(next);
7073 let Some(val) = res else { break };
7074 val
7075 }),
7076 6u16 => LinkinfoBondAttrs::UseCarrier({
7077 let res = parse_u8(next);
7078 let Some(val) = res else { break };
7079 val
7080 }),
7081 7u16 => LinkinfoBondAttrs::ArpInterval({
7082 let res = parse_u32(next);
7083 let Some(val) = res else { break };
7084 val
7085 }),
7086 8u16 => LinkinfoBondAttrs::ArpIpTarget({
7087 let res = Some(IterableArrayIpv4Addr::with_loc(next, self.orig_loc));
7088 let Some(val) = res else { break };
7089 val
7090 }),
7091 9u16 => LinkinfoBondAttrs::ArpValidate({
7092 let res = parse_u32(next);
7093 let Some(val) = res else { break };
7094 val
7095 }),
7096 10u16 => LinkinfoBondAttrs::ArpAllTargets({
7097 let res = parse_u32(next);
7098 let Some(val) = res else { break };
7099 val
7100 }),
7101 11u16 => LinkinfoBondAttrs::Primary({
7102 let res = parse_u32(next);
7103 let Some(val) = res else { break };
7104 val
7105 }),
7106 12u16 => LinkinfoBondAttrs::PrimaryReselect({
7107 let res = parse_u8(next);
7108 let Some(val) = res else { break };
7109 val
7110 }),
7111 13u16 => LinkinfoBondAttrs::FailOverMac({
7112 let res = parse_u8(next);
7113 let Some(val) = res else { break };
7114 val
7115 }),
7116 14u16 => LinkinfoBondAttrs::XmitHashPolicy({
7117 let res = parse_u8(next);
7118 let Some(val) = res else { break };
7119 val
7120 }),
7121 15u16 => LinkinfoBondAttrs::ResendIgmp({
7122 let res = parse_u32(next);
7123 let Some(val) = res else { break };
7124 val
7125 }),
7126 16u16 => LinkinfoBondAttrs::NumPeerNotif({
7127 let res = parse_u8(next);
7128 let Some(val) = res else { break };
7129 val
7130 }),
7131 17u16 => LinkinfoBondAttrs::AllSlavesActive({
7132 let res = parse_u8(next);
7133 let Some(val) = res else { break };
7134 val
7135 }),
7136 18u16 => LinkinfoBondAttrs::MinLinks({
7137 let res = parse_u32(next);
7138 let Some(val) = res else { break };
7139 val
7140 }),
7141 19u16 => LinkinfoBondAttrs::LpInterval({
7142 let res = parse_u32(next);
7143 let Some(val) = res else { break };
7144 val
7145 }),
7146 20u16 => LinkinfoBondAttrs::PacketsPerSlave({
7147 let res = parse_u32(next);
7148 let Some(val) = res else { break };
7149 val
7150 }),
7151 21u16 => LinkinfoBondAttrs::AdLacpRate({
7152 let res = parse_u8(next);
7153 let Some(val) = res else { break };
7154 val
7155 }),
7156 22u16 => LinkinfoBondAttrs::AdSelect({
7157 let res = parse_u8(next);
7158 let Some(val) = res else { break };
7159 val
7160 }),
7161 23u16 => LinkinfoBondAttrs::AdInfo({
7162 let res = Some(IterableBondAdInfoAttrs::with_loc(next, self.orig_loc));
7163 let Some(val) = res else { break };
7164 val
7165 }),
7166 24u16 => LinkinfoBondAttrs::AdActorSysPrio({
7167 let res = parse_u16(next);
7168 let Some(val) = res else { break };
7169 val
7170 }),
7171 25u16 => LinkinfoBondAttrs::AdUserPortKey({
7172 let res = parse_u16(next);
7173 let Some(val) = res else { break };
7174 val
7175 }),
7176 26u16 => LinkinfoBondAttrs::AdActorSystem({
7177 let res = Some(next);
7178 let Some(val) = res else { break };
7179 val
7180 }),
7181 27u16 => LinkinfoBondAttrs::TlbDynamicLb({
7182 let res = parse_u8(next);
7183 let Some(val) = res else { break };
7184 val
7185 }),
7186 28u16 => LinkinfoBondAttrs::PeerNotifDelay({
7187 let res = parse_u32(next);
7188 let Some(val) = res else { break };
7189 val
7190 }),
7191 29u16 => LinkinfoBondAttrs::AdLacpActive({
7192 let res = parse_u8(next);
7193 let Some(val) = res else { break };
7194 val
7195 }),
7196 30u16 => LinkinfoBondAttrs::MissedMax({
7197 let res = parse_u8(next);
7198 let Some(val) = res else { break };
7199 val
7200 }),
7201 31u16 => LinkinfoBondAttrs::NsIp6Target({
7202 let res = Some(IterableArrayBinary::with_loc(next, self.orig_loc));
7203 let Some(val) = res else { break };
7204 val
7205 }),
7206 32u16 => LinkinfoBondAttrs::CoupledControl({
7207 let res = parse_u8(next);
7208 let Some(val) = res else { break };
7209 val
7210 }),
7211 33u16 => LinkinfoBondAttrs::BroadcastNeigh({
7212 let res = parse_u8(next);
7213 let Some(val) = res else { break };
7214 val
7215 }),
7216 34u16 => LinkinfoBondAttrs::LacpStrict({
7217 let res = parse_u8(next);
7218 let Some(val) = res else { break };
7219 val
7220 }),
7221 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7222 n => continue,
7223 };
7224 return Some(Ok(res));
7225 }
7226 Some(Err(ErrorContext::new(
7227 "LinkinfoBondAttrs",
7228 r#type.and_then(|t| LinkinfoBondAttrs::attr_from_type(t)),
7229 self.orig_loc,
7230 self.buf.as_ptr().wrapping_add(pos) as usize,
7231 )))
7232 }
7233}
7234impl std::fmt::Debug for IterableArrayIpv4Addr<'_> {
7235 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7236 fmt.debug_list()
7237 .entries(self.clone().map(FlattenErrorContext))
7238 .finish()
7239 }
7240}
7241impl std::fmt::Debug for IterableArrayBinary<'_> {
7242 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7243 fmt.debug_list()
7244 .entries(self.clone().map(FlattenErrorContext))
7245 .finish()
7246 }
7247}
7248impl<'a> std::fmt::Debug for IterableLinkinfoBondAttrs<'_> {
7249 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7250 let mut fmt = f.debug_struct("LinkinfoBondAttrs");
7251 for attr in self.clone() {
7252 let attr = match attr {
7253 Ok(a) => a,
7254 Err(err) => {
7255 fmt.finish()?;
7256 f.write_str("Err(")?;
7257 err.fmt(f)?;
7258 return f.write_str(")");
7259 }
7260 };
7261 match attr {
7262 LinkinfoBondAttrs::Mode(val) => fmt.field("Mode", &val),
7263 LinkinfoBondAttrs::ActiveSlave(val) => fmt.field("ActiveSlave", &val),
7264 LinkinfoBondAttrs::Miimon(val) => fmt.field("Miimon", &val),
7265 LinkinfoBondAttrs::Updelay(val) => fmt.field("Updelay", &val),
7266 LinkinfoBondAttrs::Downdelay(val) => fmt.field("Downdelay", &val),
7267 LinkinfoBondAttrs::UseCarrier(val) => fmt.field("UseCarrier", &val),
7268 LinkinfoBondAttrs::ArpInterval(val) => fmt.field("ArpInterval", &val),
7269 LinkinfoBondAttrs::ArpIpTarget(val) => fmt.field("ArpIpTarget", &val),
7270 LinkinfoBondAttrs::ArpValidate(val) => fmt.field("ArpValidate", &val),
7271 LinkinfoBondAttrs::ArpAllTargets(val) => fmt.field("ArpAllTargets", &val),
7272 LinkinfoBondAttrs::Primary(val) => fmt.field("Primary", &val),
7273 LinkinfoBondAttrs::PrimaryReselect(val) => fmt.field("PrimaryReselect", &val),
7274 LinkinfoBondAttrs::FailOverMac(val) => fmt.field("FailOverMac", &val),
7275 LinkinfoBondAttrs::XmitHashPolicy(val) => fmt.field("XmitHashPolicy", &val),
7276 LinkinfoBondAttrs::ResendIgmp(val) => fmt.field("ResendIgmp", &val),
7277 LinkinfoBondAttrs::NumPeerNotif(val) => fmt.field("NumPeerNotif", &val),
7278 LinkinfoBondAttrs::AllSlavesActive(val) => fmt.field("AllSlavesActive", &val),
7279 LinkinfoBondAttrs::MinLinks(val) => fmt.field("MinLinks", &val),
7280 LinkinfoBondAttrs::LpInterval(val) => fmt.field("LpInterval", &val),
7281 LinkinfoBondAttrs::PacketsPerSlave(val) => fmt.field("PacketsPerSlave", &val),
7282 LinkinfoBondAttrs::AdLacpRate(val) => fmt.field("AdLacpRate", &val),
7283 LinkinfoBondAttrs::AdSelect(val) => fmt.field("AdSelect", &val),
7284 LinkinfoBondAttrs::AdInfo(val) => fmt.field("AdInfo", &val),
7285 LinkinfoBondAttrs::AdActorSysPrio(val) => fmt.field("AdActorSysPrio", &val),
7286 LinkinfoBondAttrs::AdUserPortKey(val) => fmt.field("AdUserPortKey", &val),
7287 LinkinfoBondAttrs::AdActorSystem(val) => {
7288 fmt.field("AdActorSystem", &FormatMac(val))
7289 }
7290 LinkinfoBondAttrs::TlbDynamicLb(val) => fmt.field("TlbDynamicLb", &val),
7291 LinkinfoBondAttrs::PeerNotifDelay(val) => fmt.field("PeerNotifDelay", &val),
7292 LinkinfoBondAttrs::AdLacpActive(val) => fmt.field("AdLacpActive", &val),
7293 LinkinfoBondAttrs::MissedMax(val) => fmt.field("MissedMax", &val),
7294 LinkinfoBondAttrs::NsIp6Target(val) => fmt.field("NsIp6Target", &val),
7295 LinkinfoBondAttrs::CoupledControl(val) => fmt.field("CoupledControl", &val),
7296 LinkinfoBondAttrs::BroadcastNeigh(val) => fmt.field("BroadcastNeigh", &val),
7297 LinkinfoBondAttrs::LacpStrict(val) => fmt.field("LacpStrict", &val),
7298 };
7299 }
7300 fmt.finish()
7301 }
7302}
7303impl IterableLinkinfoBondAttrs<'_> {
7304 pub fn lookup_attr(
7305 &self,
7306 offset: usize,
7307 missing_type: Option<u16>,
7308 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7309 let mut stack = Vec::new();
7310 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7311 if missing_type.is_some() && cur == offset {
7312 stack.push(("LinkinfoBondAttrs", offset));
7313 return (
7314 stack,
7315 missing_type.and_then(|t| LinkinfoBondAttrs::attr_from_type(t)),
7316 );
7317 }
7318 if cur > offset || cur + self.buf.len() < offset {
7319 return (stack, None);
7320 }
7321 let mut attrs = self.clone();
7322 let mut last_off = cur + attrs.pos;
7323 let mut missing = None;
7324 while let Some(attr) = attrs.next() {
7325 let Ok(attr) = attr else { break };
7326 match attr {
7327 LinkinfoBondAttrs::Mode(val) => {
7328 if last_off == offset {
7329 stack.push(("Mode", last_off));
7330 break;
7331 }
7332 }
7333 LinkinfoBondAttrs::ActiveSlave(val) => {
7334 if last_off == offset {
7335 stack.push(("ActiveSlave", last_off));
7336 break;
7337 }
7338 }
7339 LinkinfoBondAttrs::Miimon(val) => {
7340 if last_off == offset {
7341 stack.push(("Miimon", last_off));
7342 break;
7343 }
7344 }
7345 LinkinfoBondAttrs::Updelay(val) => {
7346 if last_off == offset {
7347 stack.push(("Updelay", last_off));
7348 break;
7349 }
7350 }
7351 LinkinfoBondAttrs::Downdelay(val) => {
7352 if last_off == offset {
7353 stack.push(("Downdelay", last_off));
7354 break;
7355 }
7356 }
7357 LinkinfoBondAttrs::UseCarrier(val) => {
7358 if last_off == offset {
7359 stack.push(("UseCarrier", last_off));
7360 break;
7361 }
7362 }
7363 LinkinfoBondAttrs::ArpInterval(val) => {
7364 if last_off == offset {
7365 stack.push(("ArpInterval", last_off));
7366 break;
7367 }
7368 }
7369 LinkinfoBondAttrs::ArpIpTarget(val) => {
7370 if last_off == offset {
7371 stack.push(("ArpIpTarget", last_off));
7372 break;
7373 }
7374 }
7375 LinkinfoBondAttrs::ArpValidate(val) => {
7376 if last_off == offset {
7377 stack.push(("ArpValidate", last_off));
7378 break;
7379 }
7380 }
7381 LinkinfoBondAttrs::ArpAllTargets(val) => {
7382 if last_off == offset {
7383 stack.push(("ArpAllTargets", last_off));
7384 break;
7385 }
7386 }
7387 LinkinfoBondAttrs::Primary(val) => {
7388 if last_off == offset {
7389 stack.push(("Primary", last_off));
7390 break;
7391 }
7392 }
7393 LinkinfoBondAttrs::PrimaryReselect(val) => {
7394 if last_off == offset {
7395 stack.push(("PrimaryReselect", last_off));
7396 break;
7397 }
7398 }
7399 LinkinfoBondAttrs::FailOverMac(val) => {
7400 if last_off == offset {
7401 stack.push(("FailOverMac", last_off));
7402 break;
7403 }
7404 }
7405 LinkinfoBondAttrs::XmitHashPolicy(val) => {
7406 if last_off == offset {
7407 stack.push(("XmitHashPolicy", last_off));
7408 break;
7409 }
7410 }
7411 LinkinfoBondAttrs::ResendIgmp(val) => {
7412 if last_off == offset {
7413 stack.push(("ResendIgmp", last_off));
7414 break;
7415 }
7416 }
7417 LinkinfoBondAttrs::NumPeerNotif(val) => {
7418 if last_off == offset {
7419 stack.push(("NumPeerNotif", last_off));
7420 break;
7421 }
7422 }
7423 LinkinfoBondAttrs::AllSlavesActive(val) => {
7424 if last_off == offset {
7425 stack.push(("AllSlavesActive", last_off));
7426 break;
7427 }
7428 }
7429 LinkinfoBondAttrs::MinLinks(val) => {
7430 if last_off == offset {
7431 stack.push(("MinLinks", last_off));
7432 break;
7433 }
7434 }
7435 LinkinfoBondAttrs::LpInterval(val) => {
7436 if last_off == offset {
7437 stack.push(("LpInterval", last_off));
7438 break;
7439 }
7440 }
7441 LinkinfoBondAttrs::PacketsPerSlave(val) => {
7442 if last_off == offset {
7443 stack.push(("PacketsPerSlave", last_off));
7444 break;
7445 }
7446 }
7447 LinkinfoBondAttrs::AdLacpRate(val) => {
7448 if last_off == offset {
7449 stack.push(("AdLacpRate", last_off));
7450 break;
7451 }
7452 }
7453 LinkinfoBondAttrs::AdSelect(val) => {
7454 if last_off == offset {
7455 stack.push(("AdSelect", last_off));
7456 break;
7457 }
7458 }
7459 LinkinfoBondAttrs::AdInfo(val) => {
7460 (stack, missing) = val.lookup_attr(offset, missing_type);
7461 if !stack.is_empty() {
7462 break;
7463 }
7464 }
7465 LinkinfoBondAttrs::AdActorSysPrio(val) => {
7466 if last_off == offset {
7467 stack.push(("AdActorSysPrio", last_off));
7468 break;
7469 }
7470 }
7471 LinkinfoBondAttrs::AdUserPortKey(val) => {
7472 if last_off == offset {
7473 stack.push(("AdUserPortKey", last_off));
7474 break;
7475 }
7476 }
7477 LinkinfoBondAttrs::AdActorSystem(val) => {
7478 if last_off == offset {
7479 stack.push(("AdActorSystem", last_off));
7480 break;
7481 }
7482 }
7483 LinkinfoBondAttrs::TlbDynamicLb(val) => {
7484 if last_off == offset {
7485 stack.push(("TlbDynamicLb", last_off));
7486 break;
7487 }
7488 }
7489 LinkinfoBondAttrs::PeerNotifDelay(val) => {
7490 if last_off == offset {
7491 stack.push(("PeerNotifDelay", last_off));
7492 break;
7493 }
7494 }
7495 LinkinfoBondAttrs::AdLacpActive(val) => {
7496 if last_off == offset {
7497 stack.push(("AdLacpActive", last_off));
7498 break;
7499 }
7500 }
7501 LinkinfoBondAttrs::MissedMax(val) => {
7502 if last_off == offset {
7503 stack.push(("MissedMax", last_off));
7504 break;
7505 }
7506 }
7507 LinkinfoBondAttrs::NsIp6Target(val) => {
7508 if last_off == offset {
7509 stack.push(("NsIp6Target", last_off));
7510 break;
7511 }
7512 }
7513 LinkinfoBondAttrs::CoupledControl(val) => {
7514 if last_off == offset {
7515 stack.push(("CoupledControl", last_off));
7516 break;
7517 }
7518 }
7519 LinkinfoBondAttrs::BroadcastNeigh(val) => {
7520 if last_off == offset {
7521 stack.push(("BroadcastNeigh", last_off));
7522 break;
7523 }
7524 }
7525 LinkinfoBondAttrs::LacpStrict(val) => {
7526 if last_off == offset {
7527 stack.push(("LacpStrict", last_off));
7528 break;
7529 }
7530 }
7531 _ => {}
7532 };
7533 last_off = cur + attrs.pos;
7534 }
7535 if !stack.is_empty() {
7536 stack.push(("LinkinfoBondAttrs", cur));
7537 }
7538 (stack, missing)
7539 }
7540}
7541#[derive(Clone)]
7542pub enum BondAdInfoAttrs<'a> {
7543 Aggregator(u16),
7544 NumPorts(u16),
7545 ActorKey(u16),
7546 PartnerKey(u16),
7547 PartnerMac(&'a [u8]),
7548}
7549impl<'a> IterableBondAdInfoAttrs<'a> {
7550 pub fn get_aggregator(&self) -> Result<u16, ErrorContext> {
7551 let mut iter = self.clone();
7552 iter.pos = 0;
7553 for attr in iter {
7554 if let Ok(BondAdInfoAttrs::Aggregator(val)) = attr {
7555 return Ok(val);
7556 }
7557 }
7558 Err(ErrorContext::new_missing(
7559 "BondAdInfoAttrs",
7560 "Aggregator",
7561 self.orig_loc,
7562 self.buf.as_ptr() as usize,
7563 ))
7564 }
7565 pub fn get_num_ports(&self) -> Result<u16, ErrorContext> {
7566 let mut iter = self.clone();
7567 iter.pos = 0;
7568 for attr in iter {
7569 if let Ok(BondAdInfoAttrs::NumPorts(val)) = attr {
7570 return Ok(val);
7571 }
7572 }
7573 Err(ErrorContext::new_missing(
7574 "BondAdInfoAttrs",
7575 "NumPorts",
7576 self.orig_loc,
7577 self.buf.as_ptr() as usize,
7578 ))
7579 }
7580 pub fn get_actor_key(&self) -> Result<u16, ErrorContext> {
7581 let mut iter = self.clone();
7582 iter.pos = 0;
7583 for attr in iter {
7584 if let Ok(BondAdInfoAttrs::ActorKey(val)) = attr {
7585 return Ok(val);
7586 }
7587 }
7588 Err(ErrorContext::new_missing(
7589 "BondAdInfoAttrs",
7590 "ActorKey",
7591 self.orig_loc,
7592 self.buf.as_ptr() as usize,
7593 ))
7594 }
7595 pub fn get_partner_key(&self) -> Result<u16, ErrorContext> {
7596 let mut iter = self.clone();
7597 iter.pos = 0;
7598 for attr in iter {
7599 if let Ok(BondAdInfoAttrs::PartnerKey(val)) = attr {
7600 return Ok(val);
7601 }
7602 }
7603 Err(ErrorContext::new_missing(
7604 "BondAdInfoAttrs",
7605 "PartnerKey",
7606 self.orig_loc,
7607 self.buf.as_ptr() as usize,
7608 ))
7609 }
7610 pub fn get_partner_mac(&self) -> Result<&'a [u8], ErrorContext> {
7611 let mut iter = self.clone();
7612 iter.pos = 0;
7613 for attr in iter {
7614 if let Ok(BondAdInfoAttrs::PartnerMac(val)) = attr {
7615 return Ok(val);
7616 }
7617 }
7618 Err(ErrorContext::new_missing(
7619 "BondAdInfoAttrs",
7620 "PartnerMac",
7621 self.orig_loc,
7622 self.buf.as_ptr() as usize,
7623 ))
7624 }
7625}
7626impl BondAdInfoAttrs<'_> {
7627 pub fn new<'a>(buf: &'a [u8]) -> IterableBondAdInfoAttrs<'a> {
7628 IterableBondAdInfoAttrs::with_loc(buf, buf.as_ptr() as usize)
7629 }
7630 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7631 let res = match r#type {
7632 1u16 => "Aggregator",
7633 2u16 => "NumPorts",
7634 3u16 => "ActorKey",
7635 4u16 => "PartnerKey",
7636 5u16 => "PartnerMac",
7637 _ => return None,
7638 };
7639 Some(res)
7640 }
7641}
7642#[derive(Clone, Copy, Default)]
7643pub struct IterableBondAdInfoAttrs<'a> {
7644 buf: &'a [u8],
7645 pos: usize,
7646 orig_loc: usize,
7647}
7648impl<'a> IterableBondAdInfoAttrs<'a> {
7649 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7650 Self {
7651 buf,
7652 pos: 0,
7653 orig_loc,
7654 }
7655 }
7656 pub fn get_buf(&self) -> &'a [u8] {
7657 self.buf
7658 }
7659}
7660impl<'a> Iterator for IterableBondAdInfoAttrs<'a> {
7661 type Item = Result<BondAdInfoAttrs<'a>, ErrorContext>;
7662 fn next(&mut self) -> Option<Self::Item> {
7663 let mut pos;
7664 let mut r#type;
7665 loop {
7666 pos = self.pos;
7667 r#type = None;
7668 if self.buf.len() == self.pos {
7669 return None;
7670 }
7671 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
7672 self.pos = self.buf.len();
7673 break;
7674 };
7675 r#type = Some(header.r#type);
7676 let res = match header.r#type {
7677 1u16 => BondAdInfoAttrs::Aggregator({
7678 let res = parse_u16(next);
7679 let Some(val) = res else { break };
7680 val
7681 }),
7682 2u16 => BondAdInfoAttrs::NumPorts({
7683 let res = parse_u16(next);
7684 let Some(val) = res else { break };
7685 val
7686 }),
7687 3u16 => BondAdInfoAttrs::ActorKey({
7688 let res = parse_u16(next);
7689 let Some(val) = res else { break };
7690 val
7691 }),
7692 4u16 => BondAdInfoAttrs::PartnerKey({
7693 let res = parse_u16(next);
7694 let Some(val) = res else { break };
7695 val
7696 }),
7697 5u16 => BondAdInfoAttrs::PartnerMac({
7698 let res = Some(next);
7699 let Some(val) = res else { break };
7700 val
7701 }),
7702 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
7703 n => continue,
7704 };
7705 return Some(Ok(res));
7706 }
7707 Some(Err(ErrorContext::new(
7708 "BondAdInfoAttrs",
7709 r#type.and_then(|t| BondAdInfoAttrs::attr_from_type(t)),
7710 self.orig_loc,
7711 self.buf.as_ptr().wrapping_add(pos) as usize,
7712 )))
7713 }
7714}
7715impl<'a> std::fmt::Debug for IterableBondAdInfoAttrs<'_> {
7716 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
7717 let mut fmt = f.debug_struct("BondAdInfoAttrs");
7718 for attr in self.clone() {
7719 let attr = match attr {
7720 Ok(a) => a,
7721 Err(err) => {
7722 fmt.finish()?;
7723 f.write_str("Err(")?;
7724 err.fmt(f)?;
7725 return f.write_str(")");
7726 }
7727 };
7728 match attr {
7729 BondAdInfoAttrs::Aggregator(val) => fmt.field("Aggregator", &val),
7730 BondAdInfoAttrs::NumPorts(val) => fmt.field("NumPorts", &val),
7731 BondAdInfoAttrs::ActorKey(val) => fmt.field("ActorKey", &val),
7732 BondAdInfoAttrs::PartnerKey(val) => fmt.field("PartnerKey", &val),
7733 BondAdInfoAttrs::PartnerMac(val) => fmt.field("PartnerMac", &FormatMac(val)),
7734 };
7735 }
7736 fmt.finish()
7737 }
7738}
7739impl IterableBondAdInfoAttrs<'_> {
7740 pub fn lookup_attr(
7741 &self,
7742 offset: usize,
7743 missing_type: Option<u16>,
7744 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
7745 let mut stack = Vec::new();
7746 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
7747 if missing_type.is_some() && cur == offset {
7748 stack.push(("BondAdInfoAttrs", offset));
7749 return (
7750 stack,
7751 missing_type.and_then(|t| BondAdInfoAttrs::attr_from_type(t)),
7752 );
7753 }
7754 if cur > offset || cur + self.buf.len() < offset {
7755 return (stack, None);
7756 }
7757 let mut attrs = self.clone();
7758 let mut last_off = cur + attrs.pos;
7759 while let Some(attr) = attrs.next() {
7760 let Ok(attr) = attr else { break };
7761 match attr {
7762 BondAdInfoAttrs::Aggregator(val) => {
7763 if last_off == offset {
7764 stack.push(("Aggregator", last_off));
7765 break;
7766 }
7767 }
7768 BondAdInfoAttrs::NumPorts(val) => {
7769 if last_off == offset {
7770 stack.push(("NumPorts", last_off));
7771 break;
7772 }
7773 }
7774 BondAdInfoAttrs::ActorKey(val) => {
7775 if last_off == offset {
7776 stack.push(("ActorKey", last_off));
7777 break;
7778 }
7779 }
7780 BondAdInfoAttrs::PartnerKey(val) => {
7781 if last_off == offset {
7782 stack.push(("PartnerKey", last_off));
7783 break;
7784 }
7785 }
7786 BondAdInfoAttrs::PartnerMac(val) => {
7787 if last_off == offset {
7788 stack.push(("PartnerMac", last_off));
7789 break;
7790 }
7791 }
7792 _ => {}
7793 };
7794 last_off = cur + attrs.pos;
7795 }
7796 if !stack.is_empty() {
7797 stack.push(("BondAdInfoAttrs", cur));
7798 }
7799 (stack, None)
7800 }
7801}
7802#[derive(Clone)]
7803pub enum BondSlaveAttrs<'a> {
7804 State(u8),
7805 MiiStatus(u8),
7806 LinkFailureCount(u32),
7807 PermHwaddr(&'a [u8]),
7808 QueueId(u16),
7809 AdAggregatorId(u16),
7810 AdActorOperPortState(u8),
7811 AdPartnerOperPortState(u16),
7812 Prio(u32),
7813}
7814impl<'a> IterableBondSlaveAttrs<'a> {
7815 pub fn get_state(&self) -> Result<u8, ErrorContext> {
7816 let mut iter = self.clone();
7817 iter.pos = 0;
7818 for attr in iter {
7819 if let Ok(BondSlaveAttrs::State(val)) = attr {
7820 return Ok(val);
7821 }
7822 }
7823 Err(ErrorContext::new_missing(
7824 "BondSlaveAttrs",
7825 "State",
7826 self.orig_loc,
7827 self.buf.as_ptr() as usize,
7828 ))
7829 }
7830 pub fn get_mii_status(&self) -> Result<u8, ErrorContext> {
7831 let mut iter = self.clone();
7832 iter.pos = 0;
7833 for attr in iter {
7834 if let Ok(BondSlaveAttrs::MiiStatus(val)) = attr {
7835 return Ok(val);
7836 }
7837 }
7838 Err(ErrorContext::new_missing(
7839 "BondSlaveAttrs",
7840 "MiiStatus",
7841 self.orig_loc,
7842 self.buf.as_ptr() as usize,
7843 ))
7844 }
7845 pub fn get_link_failure_count(&self) -> Result<u32, ErrorContext> {
7846 let mut iter = self.clone();
7847 iter.pos = 0;
7848 for attr in iter {
7849 if let Ok(BondSlaveAttrs::LinkFailureCount(val)) = attr {
7850 return Ok(val);
7851 }
7852 }
7853 Err(ErrorContext::new_missing(
7854 "BondSlaveAttrs",
7855 "LinkFailureCount",
7856 self.orig_loc,
7857 self.buf.as_ptr() as usize,
7858 ))
7859 }
7860 pub fn get_perm_hwaddr(&self) -> Result<&'a [u8], ErrorContext> {
7861 let mut iter = self.clone();
7862 iter.pos = 0;
7863 for attr in iter {
7864 if let Ok(BondSlaveAttrs::PermHwaddr(val)) = attr {
7865 return Ok(val);
7866 }
7867 }
7868 Err(ErrorContext::new_missing(
7869 "BondSlaveAttrs",
7870 "PermHwaddr",
7871 self.orig_loc,
7872 self.buf.as_ptr() as usize,
7873 ))
7874 }
7875 pub fn get_queue_id(&self) -> Result<u16, ErrorContext> {
7876 let mut iter = self.clone();
7877 iter.pos = 0;
7878 for attr in iter {
7879 if let Ok(BondSlaveAttrs::QueueId(val)) = attr {
7880 return Ok(val);
7881 }
7882 }
7883 Err(ErrorContext::new_missing(
7884 "BondSlaveAttrs",
7885 "QueueId",
7886 self.orig_loc,
7887 self.buf.as_ptr() as usize,
7888 ))
7889 }
7890 pub fn get_ad_aggregator_id(&self) -> Result<u16, ErrorContext> {
7891 let mut iter = self.clone();
7892 iter.pos = 0;
7893 for attr in iter {
7894 if let Ok(BondSlaveAttrs::AdAggregatorId(val)) = attr {
7895 return Ok(val);
7896 }
7897 }
7898 Err(ErrorContext::new_missing(
7899 "BondSlaveAttrs",
7900 "AdAggregatorId",
7901 self.orig_loc,
7902 self.buf.as_ptr() as usize,
7903 ))
7904 }
7905 pub fn get_ad_actor_oper_port_state(&self) -> Result<u8, ErrorContext> {
7906 let mut iter = self.clone();
7907 iter.pos = 0;
7908 for attr in iter {
7909 if let Ok(BondSlaveAttrs::AdActorOperPortState(val)) = attr {
7910 return Ok(val);
7911 }
7912 }
7913 Err(ErrorContext::new_missing(
7914 "BondSlaveAttrs",
7915 "AdActorOperPortState",
7916 self.orig_loc,
7917 self.buf.as_ptr() as usize,
7918 ))
7919 }
7920 pub fn get_ad_partner_oper_port_state(&self) -> Result<u16, ErrorContext> {
7921 let mut iter = self.clone();
7922 iter.pos = 0;
7923 for attr in iter {
7924 if let Ok(BondSlaveAttrs::AdPartnerOperPortState(val)) = attr {
7925 return Ok(val);
7926 }
7927 }
7928 Err(ErrorContext::new_missing(
7929 "BondSlaveAttrs",
7930 "AdPartnerOperPortState",
7931 self.orig_loc,
7932 self.buf.as_ptr() as usize,
7933 ))
7934 }
7935 pub fn get_prio(&self) -> Result<u32, ErrorContext> {
7936 let mut iter = self.clone();
7937 iter.pos = 0;
7938 for attr in iter {
7939 if let Ok(BondSlaveAttrs::Prio(val)) = attr {
7940 return Ok(val);
7941 }
7942 }
7943 Err(ErrorContext::new_missing(
7944 "BondSlaveAttrs",
7945 "Prio",
7946 self.orig_loc,
7947 self.buf.as_ptr() as usize,
7948 ))
7949 }
7950}
7951impl BondSlaveAttrs<'_> {
7952 pub fn new<'a>(buf: &'a [u8]) -> IterableBondSlaveAttrs<'a> {
7953 IterableBondSlaveAttrs::with_loc(buf, buf.as_ptr() as usize)
7954 }
7955 fn attr_from_type(r#type: u16) -> Option<&'static str> {
7956 let res = match r#type {
7957 1u16 => "State",
7958 2u16 => "MiiStatus",
7959 3u16 => "LinkFailureCount",
7960 4u16 => "PermHwaddr",
7961 5u16 => "QueueId",
7962 6u16 => "AdAggregatorId",
7963 7u16 => "AdActorOperPortState",
7964 8u16 => "AdPartnerOperPortState",
7965 9u16 => "Prio",
7966 _ => return None,
7967 };
7968 Some(res)
7969 }
7970}
7971#[derive(Clone, Copy, Default)]
7972pub struct IterableBondSlaveAttrs<'a> {
7973 buf: &'a [u8],
7974 pos: usize,
7975 orig_loc: usize,
7976}
7977impl<'a> IterableBondSlaveAttrs<'a> {
7978 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
7979 Self {
7980 buf,
7981 pos: 0,
7982 orig_loc,
7983 }
7984 }
7985 pub fn get_buf(&self) -> &'a [u8] {
7986 self.buf
7987 }
7988}
7989impl<'a> Iterator for IterableBondSlaveAttrs<'a> {
7990 type Item = Result<BondSlaveAttrs<'a>, ErrorContext>;
7991 fn next(&mut self) -> Option<Self::Item> {
7992 let mut pos;
7993 let mut r#type;
7994 loop {
7995 pos = self.pos;
7996 r#type = None;
7997 if self.buf.len() == self.pos {
7998 return None;
7999 }
8000 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
8001 self.pos = self.buf.len();
8002 break;
8003 };
8004 r#type = Some(header.r#type);
8005 let res = match header.r#type {
8006 1u16 => BondSlaveAttrs::State({
8007 let res = parse_u8(next);
8008 let Some(val) = res else { break };
8009 val
8010 }),
8011 2u16 => BondSlaveAttrs::MiiStatus({
8012 let res = parse_u8(next);
8013 let Some(val) = res else { break };
8014 val
8015 }),
8016 3u16 => BondSlaveAttrs::LinkFailureCount({
8017 let res = parse_u32(next);
8018 let Some(val) = res else { break };
8019 val
8020 }),
8021 4u16 => BondSlaveAttrs::PermHwaddr({
8022 let res = Some(next);
8023 let Some(val) = res else { break };
8024 val
8025 }),
8026 5u16 => BondSlaveAttrs::QueueId({
8027 let res = parse_u16(next);
8028 let Some(val) = res else { break };
8029 val
8030 }),
8031 6u16 => BondSlaveAttrs::AdAggregatorId({
8032 let res = parse_u16(next);
8033 let Some(val) = res else { break };
8034 val
8035 }),
8036 7u16 => BondSlaveAttrs::AdActorOperPortState({
8037 let res = parse_u8(next);
8038 let Some(val) = res else { break };
8039 val
8040 }),
8041 8u16 => BondSlaveAttrs::AdPartnerOperPortState({
8042 let res = parse_u16(next);
8043 let Some(val) = res else { break };
8044 val
8045 }),
8046 9u16 => BondSlaveAttrs::Prio({
8047 let res = parse_u32(next);
8048 let Some(val) = res else { break };
8049 val
8050 }),
8051 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
8052 n => continue,
8053 };
8054 return Some(Ok(res));
8055 }
8056 Some(Err(ErrorContext::new(
8057 "BondSlaveAttrs",
8058 r#type.and_then(|t| BondSlaveAttrs::attr_from_type(t)),
8059 self.orig_loc,
8060 self.buf.as_ptr().wrapping_add(pos) as usize,
8061 )))
8062 }
8063}
8064impl<'a> std::fmt::Debug for IterableBondSlaveAttrs<'_> {
8065 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
8066 let mut fmt = f.debug_struct("BondSlaveAttrs");
8067 for attr in self.clone() {
8068 let attr = match attr {
8069 Ok(a) => a,
8070 Err(err) => {
8071 fmt.finish()?;
8072 f.write_str("Err(")?;
8073 err.fmt(f)?;
8074 return f.write_str(")");
8075 }
8076 };
8077 match attr {
8078 BondSlaveAttrs::State(val) => fmt.field("State", &val),
8079 BondSlaveAttrs::MiiStatus(val) => fmt.field("MiiStatus", &val),
8080 BondSlaveAttrs::LinkFailureCount(val) => fmt.field("LinkFailureCount", &val),
8081 BondSlaveAttrs::PermHwaddr(val) => fmt.field("PermHwaddr", &FormatMac(val)),
8082 BondSlaveAttrs::QueueId(val) => fmt.field("QueueId", &val),
8083 BondSlaveAttrs::AdAggregatorId(val) => fmt.field("AdAggregatorId", &val),
8084 BondSlaveAttrs::AdActorOperPortState(val) => {
8085 fmt.field("AdActorOperPortState", &val)
8086 }
8087 BondSlaveAttrs::AdPartnerOperPortState(val) => {
8088 fmt.field("AdPartnerOperPortState", &val)
8089 }
8090 BondSlaveAttrs::Prio(val) => fmt.field("Prio", &val),
8091 };
8092 }
8093 fmt.finish()
8094 }
8095}
8096impl IterableBondSlaveAttrs<'_> {
8097 pub fn lookup_attr(
8098 &self,
8099 offset: usize,
8100 missing_type: Option<u16>,
8101 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
8102 let mut stack = Vec::new();
8103 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
8104 if missing_type.is_some() && cur == offset {
8105 stack.push(("BondSlaveAttrs", offset));
8106 return (
8107 stack,
8108 missing_type.and_then(|t| BondSlaveAttrs::attr_from_type(t)),
8109 );
8110 }
8111 if cur > offset || cur + self.buf.len() < offset {
8112 return (stack, None);
8113 }
8114 let mut attrs = self.clone();
8115 let mut last_off = cur + attrs.pos;
8116 while let Some(attr) = attrs.next() {
8117 let Ok(attr) = attr else { break };
8118 match attr {
8119 BondSlaveAttrs::State(val) => {
8120 if last_off == offset {
8121 stack.push(("State", last_off));
8122 break;
8123 }
8124 }
8125 BondSlaveAttrs::MiiStatus(val) => {
8126 if last_off == offset {
8127 stack.push(("MiiStatus", last_off));
8128 break;
8129 }
8130 }
8131 BondSlaveAttrs::LinkFailureCount(val) => {
8132 if last_off == offset {
8133 stack.push(("LinkFailureCount", last_off));
8134 break;
8135 }
8136 }
8137 BondSlaveAttrs::PermHwaddr(val) => {
8138 if last_off == offset {
8139 stack.push(("PermHwaddr", last_off));
8140 break;
8141 }
8142 }
8143 BondSlaveAttrs::QueueId(val) => {
8144 if last_off == offset {
8145 stack.push(("QueueId", last_off));
8146 break;
8147 }
8148 }
8149 BondSlaveAttrs::AdAggregatorId(val) => {
8150 if last_off == offset {
8151 stack.push(("AdAggregatorId", last_off));
8152 break;
8153 }
8154 }
8155 BondSlaveAttrs::AdActorOperPortState(val) => {
8156 if last_off == offset {
8157 stack.push(("AdActorOperPortState", last_off));
8158 break;
8159 }
8160 }
8161 BondSlaveAttrs::AdPartnerOperPortState(val) => {
8162 if last_off == offset {
8163 stack.push(("AdPartnerOperPortState", last_off));
8164 break;
8165 }
8166 }
8167 BondSlaveAttrs::Prio(val) => {
8168 if last_off == offset {
8169 stack.push(("Prio", last_off));
8170 break;
8171 }
8172 }
8173 _ => {}
8174 };
8175 last_off = cur + attrs.pos;
8176 }
8177 if !stack.is_empty() {
8178 stack.push(("BondSlaveAttrs", cur));
8179 }
8180 (stack, None)
8181 }
8182}
8183#[derive(Clone)]
8184pub enum LinkinfoBridgeAttrs<'a> {
8185 ForwardDelay(u32),
8186 HelloTime(u32),
8187 MaxAge(u32),
8188 AgeingTime(u32),
8189 StpState(u32),
8190 Priority(u16),
8191 VlanFiltering(u8),
8192 VlanProtocol(u16),
8193 GroupFwdMask(u16),
8194 RootId(IflaBridgeId),
8195 BridgeId(IflaBridgeId),
8196 RootPort(u16),
8197 RootPathCost(u32),
8198 TopologyChange(u8),
8199 TopologyChangeDetected(u8),
8200 HelloTimer(u64),
8201 TcnTimer(u64),
8202 TopologyChangeTimer(u64),
8203 GcTimer(u64),
8204 GroupAddr(&'a [u8]),
8205 FdbFlush(&'a [u8]),
8206 McastRouter(u8),
8207 McastSnooping(u8),
8208 McastQueryUseIfaddr(u8),
8209 McastQuerier(u8),
8210 McastHashElasticity(u32),
8211 McastHashMax(u32),
8212 McastLastMemberCnt(u32),
8213 McastStartupQueryCnt(u32),
8214 McastLastMemberIntvl(u64),
8215 McastMembershipIntvl(u64),
8216 McastQuerierIntvl(u64),
8217 McastQueryIntvl(u64),
8218 McastQueryResponseIntvl(u64),
8219 McastStartupQueryIntvl(u64),
8220 NfCallIptables(u8),
8221 NfCallIp6tables(u8),
8222 NfCallArptables(u8),
8223 VlanDefaultPvid(u16),
8224 Pad(&'a [u8]),
8225 VlanStatsEnabled(u8),
8226 McastStatsEnabled(u8),
8227 McastIgmpVersion(u8),
8228 McastMldVersion(u8),
8229 VlanStatsPerPort(u8),
8230 MultiBoolopt(BrBooloptMulti),
8231 McastQuerierState(&'a [u8]),
8232 FdbNLearned(u32),
8233 FdbMaxLearned(u32),
8234 #[doc = "Associated type: [`BrStpMode`] (enum)"]
8235 StpMode(u32),
8236}
8237impl<'a> IterableLinkinfoBridgeAttrs<'a> {
8238 pub fn get_forward_delay(&self) -> Result<u32, ErrorContext> {
8239 let mut iter = self.clone();
8240 iter.pos = 0;
8241 for attr in iter {
8242 if let Ok(LinkinfoBridgeAttrs::ForwardDelay(val)) = attr {
8243 return Ok(val);
8244 }
8245 }
8246 Err(ErrorContext::new_missing(
8247 "LinkinfoBridgeAttrs",
8248 "ForwardDelay",
8249 self.orig_loc,
8250 self.buf.as_ptr() as usize,
8251 ))
8252 }
8253 pub fn get_hello_time(&self) -> Result<u32, ErrorContext> {
8254 let mut iter = self.clone();
8255 iter.pos = 0;
8256 for attr in iter {
8257 if let Ok(LinkinfoBridgeAttrs::HelloTime(val)) = attr {
8258 return Ok(val);
8259 }
8260 }
8261 Err(ErrorContext::new_missing(
8262 "LinkinfoBridgeAttrs",
8263 "HelloTime",
8264 self.orig_loc,
8265 self.buf.as_ptr() as usize,
8266 ))
8267 }
8268 pub fn get_max_age(&self) -> Result<u32, ErrorContext> {
8269 let mut iter = self.clone();
8270 iter.pos = 0;
8271 for attr in iter {
8272 if let Ok(LinkinfoBridgeAttrs::MaxAge(val)) = attr {
8273 return Ok(val);
8274 }
8275 }
8276 Err(ErrorContext::new_missing(
8277 "LinkinfoBridgeAttrs",
8278 "MaxAge",
8279 self.orig_loc,
8280 self.buf.as_ptr() as usize,
8281 ))
8282 }
8283 pub fn get_ageing_time(&self) -> Result<u32, ErrorContext> {
8284 let mut iter = self.clone();
8285 iter.pos = 0;
8286 for attr in iter {
8287 if let Ok(LinkinfoBridgeAttrs::AgeingTime(val)) = attr {
8288 return Ok(val);
8289 }
8290 }
8291 Err(ErrorContext::new_missing(
8292 "LinkinfoBridgeAttrs",
8293 "AgeingTime",
8294 self.orig_loc,
8295 self.buf.as_ptr() as usize,
8296 ))
8297 }
8298 pub fn get_stp_state(&self) -> Result<u32, ErrorContext> {
8299 let mut iter = self.clone();
8300 iter.pos = 0;
8301 for attr in iter {
8302 if let Ok(LinkinfoBridgeAttrs::StpState(val)) = attr {
8303 return Ok(val);
8304 }
8305 }
8306 Err(ErrorContext::new_missing(
8307 "LinkinfoBridgeAttrs",
8308 "StpState",
8309 self.orig_loc,
8310 self.buf.as_ptr() as usize,
8311 ))
8312 }
8313 pub fn get_priority(&self) -> Result<u16, ErrorContext> {
8314 let mut iter = self.clone();
8315 iter.pos = 0;
8316 for attr in iter {
8317 if let Ok(LinkinfoBridgeAttrs::Priority(val)) = attr {
8318 return Ok(val);
8319 }
8320 }
8321 Err(ErrorContext::new_missing(
8322 "LinkinfoBridgeAttrs",
8323 "Priority",
8324 self.orig_loc,
8325 self.buf.as_ptr() as usize,
8326 ))
8327 }
8328 pub fn get_vlan_filtering(&self) -> Result<u8, ErrorContext> {
8329 let mut iter = self.clone();
8330 iter.pos = 0;
8331 for attr in iter {
8332 if let Ok(LinkinfoBridgeAttrs::VlanFiltering(val)) = attr {
8333 return Ok(val);
8334 }
8335 }
8336 Err(ErrorContext::new_missing(
8337 "LinkinfoBridgeAttrs",
8338 "VlanFiltering",
8339 self.orig_loc,
8340 self.buf.as_ptr() as usize,
8341 ))
8342 }
8343 pub fn get_vlan_protocol(&self) -> Result<u16, ErrorContext> {
8344 let mut iter = self.clone();
8345 iter.pos = 0;
8346 for attr in iter {
8347 if let Ok(LinkinfoBridgeAttrs::VlanProtocol(val)) = attr {
8348 return Ok(val);
8349 }
8350 }
8351 Err(ErrorContext::new_missing(
8352 "LinkinfoBridgeAttrs",
8353 "VlanProtocol",
8354 self.orig_loc,
8355 self.buf.as_ptr() as usize,
8356 ))
8357 }
8358 pub fn get_group_fwd_mask(&self) -> Result<u16, ErrorContext> {
8359 let mut iter = self.clone();
8360 iter.pos = 0;
8361 for attr in iter {
8362 if let Ok(LinkinfoBridgeAttrs::GroupFwdMask(val)) = attr {
8363 return Ok(val);
8364 }
8365 }
8366 Err(ErrorContext::new_missing(
8367 "LinkinfoBridgeAttrs",
8368 "GroupFwdMask",
8369 self.orig_loc,
8370 self.buf.as_ptr() as usize,
8371 ))
8372 }
8373 pub fn get_root_id(&self) -> Result<IflaBridgeId, ErrorContext> {
8374 let mut iter = self.clone();
8375 iter.pos = 0;
8376 for attr in iter {
8377 if let Ok(LinkinfoBridgeAttrs::RootId(val)) = attr {
8378 return Ok(val);
8379 }
8380 }
8381 Err(ErrorContext::new_missing(
8382 "LinkinfoBridgeAttrs",
8383 "RootId",
8384 self.orig_loc,
8385 self.buf.as_ptr() as usize,
8386 ))
8387 }
8388 pub fn get_bridge_id(&self) -> Result<IflaBridgeId, ErrorContext> {
8389 let mut iter = self.clone();
8390 iter.pos = 0;
8391 for attr in iter {
8392 if let Ok(LinkinfoBridgeAttrs::BridgeId(val)) = attr {
8393 return Ok(val);
8394 }
8395 }
8396 Err(ErrorContext::new_missing(
8397 "LinkinfoBridgeAttrs",
8398 "BridgeId",
8399 self.orig_loc,
8400 self.buf.as_ptr() as usize,
8401 ))
8402 }
8403 pub fn get_root_port(&self) -> Result<u16, ErrorContext> {
8404 let mut iter = self.clone();
8405 iter.pos = 0;
8406 for attr in iter {
8407 if let Ok(LinkinfoBridgeAttrs::RootPort(val)) = attr {
8408 return Ok(val);
8409 }
8410 }
8411 Err(ErrorContext::new_missing(
8412 "LinkinfoBridgeAttrs",
8413 "RootPort",
8414 self.orig_loc,
8415 self.buf.as_ptr() as usize,
8416 ))
8417 }
8418 pub fn get_root_path_cost(&self) -> Result<u32, ErrorContext> {
8419 let mut iter = self.clone();
8420 iter.pos = 0;
8421 for attr in iter {
8422 if let Ok(LinkinfoBridgeAttrs::RootPathCost(val)) = attr {
8423 return Ok(val);
8424 }
8425 }
8426 Err(ErrorContext::new_missing(
8427 "LinkinfoBridgeAttrs",
8428 "RootPathCost",
8429 self.orig_loc,
8430 self.buf.as_ptr() as usize,
8431 ))
8432 }
8433 pub fn get_topology_change(&self) -> Result<u8, ErrorContext> {
8434 let mut iter = self.clone();
8435 iter.pos = 0;
8436 for attr in iter {
8437 if let Ok(LinkinfoBridgeAttrs::TopologyChange(val)) = attr {
8438 return Ok(val);
8439 }
8440 }
8441 Err(ErrorContext::new_missing(
8442 "LinkinfoBridgeAttrs",
8443 "TopologyChange",
8444 self.orig_loc,
8445 self.buf.as_ptr() as usize,
8446 ))
8447 }
8448 pub fn get_topology_change_detected(&self) -> Result<u8, ErrorContext> {
8449 let mut iter = self.clone();
8450 iter.pos = 0;
8451 for attr in iter {
8452 if let Ok(LinkinfoBridgeAttrs::TopologyChangeDetected(val)) = attr {
8453 return Ok(val);
8454 }
8455 }
8456 Err(ErrorContext::new_missing(
8457 "LinkinfoBridgeAttrs",
8458 "TopologyChangeDetected",
8459 self.orig_loc,
8460 self.buf.as_ptr() as usize,
8461 ))
8462 }
8463 pub fn get_hello_timer(&self) -> Result<u64, ErrorContext> {
8464 let mut iter = self.clone();
8465 iter.pos = 0;
8466 for attr in iter {
8467 if let Ok(LinkinfoBridgeAttrs::HelloTimer(val)) = attr {
8468 return Ok(val);
8469 }
8470 }
8471 Err(ErrorContext::new_missing(
8472 "LinkinfoBridgeAttrs",
8473 "HelloTimer",
8474 self.orig_loc,
8475 self.buf.as_ptr() as usize,
8476 ))
8477 }
8478 pub fn get_tcn_timer(&self) -> Result<u64, ErrorContext> {
8479 let mut iter = self.clone();
8480 iter.pos = 0;
8481 for attr in iter {
8482 if let Ok(LinkinfoBridgeAttrs::TcnTimer(val)) = attr {
8483 return Ok(val);
8484 }
8485 }
8486 Err(ErrorContext::new_missing(
8487 "LinkinfoBridgeAttrs",
8488 "TcnTimer",
8489 self.orig_loc,
8490 self.buf.as_ptr() as usize,
8491 ))
8492 }
8493 pub fn get_topology_change_timer(&self) -> Result<u64, ErrorContext> {
8494 let mut iter = self.clone();
8495 iter.pos = 0;
8496 for attr in iter {
8497 if let Ok(LinkinfoBridgeAttrs::TopologyChangeTimer(val)) = attr {
8498 return Ok(val);
8499 }
8500 }
8501 Err(ErrorContext::new_missing(
8502 "LinkinfoBridgeAttrs",
8503 "TopologyChangeTimer",
8504 self.orig_loc,
8505 self.buf.as_ptr() as usize,
8506 ))
8507 }
8508 pub fn get_gc_timer(&self) -> Result<u64, ErrorContext> {
8509 let mut iter = self.clone();
8510 iter.pos = 0;
8511 for attr in iter {
8512 if let Ok(LinkinfoBridgeAttrs::GcTimer(val)) = attr {
8513 return Ok(val);
8514 }
8515 }
8516 Err(ErrorContext::new_missing(
8517 "LinkinfoBridgeAttrs",
8518 "GcTimer",
8519 self.orig_loc,
8520 self.buf.as_ptr() as usize,
8521 ))
8522 }
8523 pub fn get_group_addr(&self) -> Result<&'a [u8], ErrorContext> {
8524 let mut iter = self.clone();
8525 iter.pos = 0;
8526 for attr in iter {
8527 if let Ok(LinkinfoBridgeAttrs::GroupAddr(val)) = attr {
8528 return Ok(val);
8529 }
8530 }
8531 Err(ErrorContext::new_missing(
8532 "LinkinfoBridgeAttrs",
8533 "GroupAddr",
8534 self.orig_loc,
8535 self.buf.as_ptr() as usize,
8536 ))
8537 }
8538 pub fn get_fdb_flush(&self) -> Result<&'a [u8], ErrorContext> {
8539 let mut iter = self.clone();
8540 iter.pos = 0;
8541 for attr in iter {
8542 if let Ok(LinkinfoBridgeAttrs::FdbFlush(val)) = attr {
8543 return Ok(val);
8544 }
8545 }
8546 Err(ErrorContext::new_missing(
8547 "LinkinfoBridgeAttrs",
8548 "FdbFlush",
8549 self.orig_loc,
8550 self.buf.as_ptr() as usize,
8551 ))
8552 }
8553 pub fn get_mcast_router(&self) -> Result<u8, ErrorContext> {
8554 let mut iter = self.clone();
8555 iter.pos = 0;
8556 for attr in iter {
8557 if let Ok(LinkinfoBridgeAttrs::McastRouter(val)) = attr {
8558 return Ok(val);
8559 }
8560 }
8561 Err(ErrorContext::new_missing(
8562 "LinkinfoBridgeAttrs",
8563 "McastRouter",
8564 self.orig_loc,
8565 self.buf.as_ptr() as usize,
8566 ))
8567 }
8568 pub fn get_mcast_snooping(&self) -> Result<u8, ErrorContext> {
8569 let mut iter = self.clone();
8570 iter.pos = 0;
8571 for attr in iter {
8572 if let Ok(LinkinfoBridgeAttrs::McastSnooping(val)) = attr {
8573 return Ok(val);
8574 }
8575 }
8576 Err(ErrorContext::new_missing(
8577 "LinkinfoBridgeAttrs",
8578 "McastSnooping",
8579 self.orig_loc,
8580 self.buf.as_ptr() as usize,
8581 ))
8582 }
8583 pub fn get_mcast_query_use_ifaddr(&self) -> Result<u8, ErrorContext> {
8584 let mut iter = self.clone();
8585 iter.pos = 0;
8586 for attr in iter {
8587 if let Ok(LinkinfoBridgeAttrs::McastQueryUseIfaddr(val)) = attr {
8588 return Ok(val);
8589 }
8590 }
8591 Err(ErrorContext::new_missing(
8592 "LinkinfoBridgeAttrs",
8593 "McastQueryUseIfaddr",
8594 self.orig_loc,
8595 self.buf.as_ptr() as usize,
8596 ))
8597 }
8598 pub fn get_mcast_querier(&self) -> Result<u8, ErrorContext> {
8599 let mut iter = self.clone();
8600 iter.pos = 0;
8601 for attr in iter {
8602 if let Ok(LinkinfoBridgeAttrs::McastQuerier(val)) = attr {
8603 return Ok(val);
8604 }
8605 }
8606 Err(ErrorContext::new_missing(
8607 "LinkinfoBridgeAttrs",
8608 "McastQuerier",
8609 self.orig_loc,
8610 self.buf.as_ptr() as usize,
8611 ))
8612 }
8613 pub fn get_mcast_hash_elasticity(&self) -> Result<u32, ErrorContext> {
8614 let mut iter = self.clone();
8615 iter.pos = 0;
8616 for attr in iter {
8617 if let Ok(LinkinfoBridgeAttrs::McastHashElasticity(val)) = attr {
8618 return Ok(val);
8619 }
8620 }
8621 Err(ErrorContext::new_missing(
8622 "LinkinfoBridgeAttrs",
8623 "McastHashElasticity",
8624 self.orig_loc,
8625 self.buf.as_ptr() as usize,
8626 ))
8627 }
8628 pub fn get_mcast_hash_max(&self) -> Result<u32, ErrorContext> {
8629 let mut iter = self.clone();
8630 iter.pos = 0;
8631 for attr in iter {
8632 if let Ok(LinkinfoBridgeAttrs::McastHashMax(val)) = attr {
8633 return Ok(val);
8634 }
8635 }
8636 Err(ErrorContext::new_missing(
8637 "LinkinfoBridgeAttrs",
8638 "McastHashMax",
8639 self.orig_loc,
8640 self.buf.as_ptr() as usize,
8641 ))
8642 }
8643 pub fn get_mcast_last_member_cnt(&self) -> Result<u32, ErrorContext> {
8644 let mut iter = self.clone();
8645 iter.pos = 0;
8646 for attr in iter {
8647 if let Ok(LinkinfoBridgeAttrs::McastLastMemberCnt(val)) = attr {
8648 return Ok(val);
8649 }
8650 }
8651 Err(ErrorContext::new_missing(
8652 "LinkinfoBridgeAttrs",
8653 "McastLastMemberCnt",
8654 self.orig_loc,
8655 self.buf.as_ptr() as usize,
8656 ))
8657 }
8658 pub fn get_mcast_startup_query_cnt(&self) -> Result<u32, ErrorContext> {
8659 let mut iter = self.clone();
8660 iter.pos = 0;
8661 for attr in iter {
8662 if let Ok(LinkinfoBridgeAttrs::McastStartupQueryCnt(val)) = attr {
8663 return Ok(val);
8664 }
8665 }
8666 Err(ErrorContext::new_missing(
8667 "LinkinfoBridgeAttrs",
8668 "McastStartupQueryCnt",
8669 self.orig_loc,
8670 self.buf.as_ptr() as usize,
8671 ))
8672 }
8673 pub fn get_mcast_last_member_intvl(&self) -> Result<u64, ErrorContext> {
8674 let mut iter = self.clone();
8675 iter.pos = 0;
8676 for attr in iter {
8677 if let Ok(LinkinfoBridgeAttrs::McastLastMemberIntvl(val)) = attr {
8678 return Ok(val);
8679 }
8680 }
8681 Err(ErrorContext::new_missing(
8682 "LinkinfoBridgeAttrs",
8683 "McastLastMemberIntvl",
8684 self.orig_loc,
8685 self.buf.as_ptr() as usize,
8686 ))
8687 }
8688 pub fn get_mcast_membership_intvl(&self) -> Result<u64, ErrorContext> {
8689 let mut iter = self.clone();
8690 iter.pos = 0;
8691 for attr in iter {
8692 if let Ok(LinkinfoBridgeAttrs::McastMembershipIntvl(val)) = attr {
8693 return Ok(val);
8694 }
8695 }
8696 Err(ErrorContext::new_missing(
8697 "LinkinfoBridgeAttrs",
8698 "McastMembershipIntvl",
8699 self.orig_loc,
8700 self.buf.as_ptr() as usize,
8701 ))
8702 }
8703 pub fn get_mcast_querier_intvl(&self) -> Result<u64, ErrorContext> {
8704 let mut iter = self.clone();
8705 iter.pos = 0;
8706 for attr in iter {
8707 if let Ok(LinkinfoBridgeAttrs::McastQuerierIntvl(val)) = attr {
8708 return Ok(val);
8709 }
8710 }
8711 Err(ErrorContext::new_missing(
8712 "LinkinfoBridgeAttrs",
8713 "McastQuerierIntvl",
8714 self.orig_loc,
8715 self.buf.as_ptr() as usize,
8716 ))
8717 }
8718 pub fn get_mcast_query_intvl(&self) -> Result<u64, ErrorContext> {
8719 let mut iter = self.clone();
8720 iter.pos = 0;
8721 for attr in iter {
8722 if let Ok(LinkinfoBridgeAttrs::McastQueryIntvl(val)) = attr {
8723 return Ok(val);
8724 }
8725 }
8726 Err(ErrorContext::new_missing(
8727 "LinkinfoBridgeAttrs",
8728 "McastQueryIntvl",
8729 self.orig_loc,
8730 self.buf.as_ptr() as usize,
8731 ))
8732 }
8733 pub fn get_mcast_query_response_intvl(&self) -> Result<u64, ErrorContext> {
8734 let mut iter = self.clone();
8735 iter.pos = 0;
8736 for attr in iter {
8737 if let Ok(LinkinfoBridgeAttrs::McastQueryResponseIntvl(val)) = attr {
8738 return Ok(val);
8739 }
8740 }
8741 Err(ErrorContext::new_missing(
8742 "LinkinfoBridgeAttrs",
8743 "McastQueryResponseIntvl",
8744 self.orig_loc,
8745 self.buf.as_ptr() as usize,
8746 ))
8747 }
8748 pub fn get_mcast_startup_query_intvl(&self) -> Result<u64, ErrorContext> {
8749 let mut iter = self.clone();
8750 iter.pos = 0;
8751 for attr in iter {
8752 if let Ok(LinkinfoBridgeAttrs::McastStartupQueryIntvl(val)) = attr {
8753 return Ok(val);
8754 }
8755 }
8756 Err(ErrorContext::new_missing(
8757 "LinkinfoBridgeAttrs",
8758 "McastStartupQueryIntvl",
8759 self.orig_loc,
8760 self.buf.as_ptr() as usize,
8761 ))
8762 }
8763 pub fn get_nf_call_iptables(&self) -> Result<u8, ErrorContext> {
8764 let mut iter = self.clone();
8765 iter.pos = 0;
8766 for attr in iter {
8767 if let Ok(LinkinfoBridgeAttrs::NfCallIptables(val)) = attr {
8768 return Ok(val);
8769 }
8770 }
8771 Err(ErrorContext::new_missing(
8772 "LinkinfoBridgeAttrs",
8773 "NfCallIptables",
8774 self.orig_loc,
8775 self.buf.as_ptr() as usize,
8776 ))
8777 }
8778 pub fn get_nf_call_ip6tables(&self) -> Result<u8, ErrorContext> {
8779 let mut iter = self.clone();
8780 iter.pos = 0;
8781 for attr in iter {
8782 if let Ok(LinkinfoBridgeAttrs::NfCallIp6tables(val)) = attr {
8783 return Ok(val);
8784 }
8785 }
8786 Err(ErrorContext::new_missing(
8787 "LinkinfoBridgeAttrs",
8788 "NfCallIp6tables",
8789 self.orig_loc,
8790 self.buf.as_ptr() as usize,
8791 ))
8792 }
8793 pub fn get_nf_call_arptables(&self) -> Result<u8, ErrorContext> {
8794 let mut iter = self.clone();
8795 iter.pos = 0;
8796 for attr in iter {
8797 if let Ok(LinkinfoBridgeAttrs::NfCallArptables(val)) = attr {
8798 return Ok(val);
8799 }
8800 }
8801 Err(ErrorContext::new_missing(
8802 "LinkinfoBridgeAttrs",
8803 "NfCallArptables",
8804 self.orig_loc,
8805 self.buf.as_ptr() as usize,
8806 ))
8807 }
8808 pub fn get_vlan_default_pvid(&self) -> Result<u16, ErrorContext> {
8809 let mut iter = self.clone();
8810 iter.pos = 0;
8811 for attr in iter {
8812 if let Ok(LinkinfoBridgeAttrs::VlanDefaultPvid(val)) = attr {
8813 return Ok(val);
8814 }
8815 }
8816 Err(ErrorContext::new_missing(
8817 "LinkinfoBridgeAttrs",
8818 "VlanDefaultPvid",
8819 self.orig_loc,
8820 self.buf.as_ptr() as usize,
8821 ))
8822 }
8823 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
8824 let mut iter = self.clone();
8825 iter.pos = 0;
8826 for attr in iter {
8827 if let Ok(LinkinfoBridgeAttrs::Pad(val)) = attr {
8828 return Ok(val);
8829 }
8830 }
8831 Err(ErrorContext::new_missing(
8832 "LinkinfoBridgeAttrs",
8833 "Pad",
8834 self.orig_loc,
8835 self.buf.as_ptr() as usize,
8836 ))
8837 }
8838 pub fn get_vlan_stats_enabled(&self) -> Result<u8, ErrorContext> {
8839 let mut iter = self.clone();
8840 iter.pos = 0;
8841 for attr in iter {
8842 if let Ok(LinkinfoBridgeAttrs::VlanStatsEnabled(val)) = attr {
8843 return Ok(val);
8844 }
8845 }
8846 Err(ErrorContext::new_missing(
8847 "LinkinfoBridgeAttrs",
8848 "VlanStatsEnabled",
8849 self.orig_loc,
8850 self.buf.as_ptr() as usize,
8851 ))
8852 }
8853 pub fn get_mcast_stats_enabled(&self) -> Result<u8, ErrorContext> {
8854 let mut iter = self.clone();
8855 iter.pos = 0;
8856 for attr in iter {
8857 if let Ok(LinkinfoBridgeAttrs::McastStatsEnabled(val)) = attr {
8858 return Ok(val);
8859 }
8860 }
8861 Err(ErrorContext::new_missing(
8862 "LinkinfoBridgeAttrs",
8863 "McastStatsEnabled",
8864 self.orig_loc,
8865 self.buf.as_ptr() as usize,
8866 ))
8867 }
8868 pub fn get_mcast_igmp_version(&self) -> Result<u8, ErrorContext> {
8869 let mut iter = self.clone();
8870 iter.pos = 0;
8871 for attr in iter {
8872 if let Ok(LinkinfoBridgeAttrs::McastIgmpVersion(val)) = attr {
8873 return Ok(val);
8874 }
8875 }
8876 Err(ErrorContext::new_missing(
8877 "LinkinfoBridgeAttrs",
8878 "McastIgmpVersion",
8879 self.orig_loc,
8880 self.buf.as_ptr() as usize,
8881 ))
8882 }
8883 pub fn get_mcast_mld_version(&self) -> Result<u8, ErrorContext> {
8884 let mut iter = self.clone();
8885 iter.pos = 0;
8886 for attr in iter {
8887 if let Ok(LinkinfoBridgeAttrs::McastMldVersion(val)) = attr {
8888 return Ok(val);
8889 }
8890 }
8891 Err(ErrorContext::new_missing(
8892 "LinkinfoBridgeAttrs",
8893 "McastMldVersion",
8894 self.orig_loc,
8895 self.buf.as_ptr() as usize,
8896 ))
8897 }
8898 pub fn get_vlan_stats_per_port(&self) -> Result<u8, ErrorContext> {
8899 let mut iter = self.clone();
8900 iter.pos = 0;
8901 for attr in iter {
8902 if let Ok(LinkinfoBridgeAttrs::VlanStatsPerPort(val)) = attr {
8903 return Ok(val);
8904 }
8905 }
8906 Err(ErrorContext::new_missing(
8907 "LinkinfoBridgeAttrs",
8908 "VlanStatsPerPort",
8909 self.orig_loc,
8910 self.buf.as_ptr() as usize,
8911 ))
8912 }
8913 pub fn get_multi_boolopt(&self) -> Result<BrBooloptMulti, ErrorContext> {
8914 let mut iter = self.clone();
8915 iter.pos = 0;
8916 for attr in iter {
8917 if let Ok(LinkinfoBridgeAttrs::MultiBoolopt(val)) = attr {
8918 return Ok(val);
8919 }
8920 }
8921 Err(ErrorContext::new_missing(
8922 "LinkinfoBridgeAttrs",
8923 "MultiBoolopt",
8924 self.orig_loc,
8925 self.buf.as_ptr() as usize,
8926 ))
8927 }
8928 pub fn get_mcast_querier_state(&self) -> Result<&'a [u8], ErrorContext> {
8929 let mut iter = self.clone();
8930 iter.pos = 0;
8931 for attr in iter {
8932 if let Ok(LinkinfoBridgeAttrs::McastQuerierState(val)) = attr {
8933 return Ok(val);
8934 }
8935 }
8936 Err(ErrorContext::new_missing(
8937 "LinkinfoBridgeAttrs",
8938 "McastQuerierState",
8939 self.orig_loc,
8940 self.buf.as_ptr() as usize,
8941 ))
8942 }
8943 pub fn get_fdb_n_learned(&self) -> Result<u32, ErrorContext> {
8944 let mut iter = self.clone();
8945 iter.pos = 0;
8946 for attr in iter {
8947 if let Ok(LinkinfoBridgeAttrs::FdbNLearned(val)) = attr {
8948 return Ok(val);
8949 }
8950 }
8951 Err(ErrorContext::new_missing(
8952 "LinkinfoBridgeAttrs",
8953 "FdbNLearned",
8954 self.orig_loc,
8955 self.buf.as_ptr() as usize,
8956 ))
8957 }
8958 pub fn get_fdb_max_learned(&self) -> Result<u32, ErrorContext> {
8959 let mut iter = self.clone();
8960 iter.pos = 0;
8961 for attr in iter {
8962 if let Ok(LinkinfoBridgeAttrs::FdbMaxLearned(val)) = attr {
8963 return Ok(val);
8964 }
8965 }
8966 Err(ErrorContext::new_missing(
8967 "LinkinfoBridgeAttrs",
8968 "FdbMaxLearned",
8969 self.orig_loc,
8970 self.buf.as_ptr() as usize,
8971 ))
8972 }
8973 #[doc = "Associated type: [`BrStpMode`] (enum)"]
8974 pub fn get_stp_mode(&self) -> Result<u32, ErrorContext> {
8975 let mut iter = self.clone();
8976 iter.pos = 0;
8977 for attr in iter {
8978 if let Ok(LinkinfoBridgeAttrs::StpMode(val)) = attr {
8979 return Ok(val);
8980 }
8981 }
8982 Err(ErrorContext::new_missing(
8983 "LinkinfoBridgeAttrs",
8984 "StpMode",
8985 self.orig_loc,
8986 self.buf.as_ptr() as usize,
8987 ))
8988 }
8989}
8990impl LinkinfoBridgeAttrs<'_> {
8991 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoBridgeAttrs<'a> {
8992 IterableLinkinfoBridgeAttrs::with_loc(buf, buf.as_ptr() as usize)
8993 }
8994 fn attr_from_type(r#type: u16) -> Option<&'static str> {
8995 let res = match r#type {
8996 1u16 => "ForwardDelay",
8997 2u16 => "HelloTime",
8998 3u16 => "MaxAge",
8999 4u16 => "AgeingTime",
9000 5u16 => "StpState",
9001 6u16 => "Priority",
9002 7u16 => "VlanFiltering",
9003 8u16 => "VlanProtocol",
9004 9u16 => "GroupFwdMask",
9005 10u16 => "RootId",
9006 11u16 => "BridgeId",
9007 12u16 => "RootPort",
9008 13u16 => "RootPathCost",
9009 14u16 => "TopologyChange",
9010 15u16 => "TopologyChangeDetected",
9011 16u16 => "HelloTimer",
9012 17u16 => "TcnTimer",
9013 18u16 => "TopologyChangeTimer",
9014 19u16 => "GcTimer",
9015 20u16 => "GroupAddr",
9016 21u16 => "FdbFlush",
9017 22u16 => "McastRouter",
9018 23u16 => "McastSnooping",
9019 24u16 => "McastQueryUseIfaddr",
9020 25u16 => "McastQuerier",
9021 26u16 => "McastHashElasticity",
9022 27u16 => "McastHashMax",
9023 28u16 => "McastLastMemberCnt",
9024 29u16 => "McastStartupQueryCnt",
9025 30u16 => "McastLastMemberIntvl",
9026 31u16 => "McastMembershipIntvl",
9027 32u16 => "McastQuerierIntvl",
9028 33u16 => "McastQueryIntvl",
9029 34u16 => "McastQueryResponseIntvl",
9030 35u16 => "McastStartupQueryIntvl",
9031 36u16 => "NfCallIptables",
9032 37u16 => "NfCallIp6tables",
9033 38u16 => "NfCallArptables",
9034 39u16 => "VlanDefaultPvid",
9035 40u16 => "Pad",
9036 41u16 => "VlanStatsEnabled",
9037 42u16 => "McastStatsEnabled",
9038 43u16 => "McastIgmpVersion",
9039 44u16 => "McastMldVersion",
9040 45u16 => "VlanStatsPerPort",
9041 46u16 => "MultiBoolopt",
9042 47u16 => "McastQuerierState",
9043 48u16 => "FdbNLearned",
9044 49u16 => "FdbMaxLearned",
9045 50u16 => "StpMode",
9046 _ => return None,
9047 };
9048 Some(res)
9049 }
9050}
9051#[derive(Clone, Copy, Default)]
9052pub struct IterableLinkinfoBridgeAttrs<'a> {
9053 buf: &'a [u8],
9054 pos: usize,
9055 orig_loc: usize,
9056}
9057impl<'a> IterableLinkinfoBridgeAttrs<'a> {
9058 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
9059 Self {
9060 buf,
9061 pos: 0,
9062 orig_loc,
9063 }
9064 }
9065 pub fn get_buf(&self) -> &'a [u8] {
9066 self.buf
9067 }
9068}
9069impl<'a> Iterator for IterableLinkinfoBridgeAttrs<'a> {
9070 type Item = Result<LinkinfoBridgeAttrs<'a>, ErrorContext>;
9071 fn next(&mut self) -> Option<Self::Item> {
9072 let mut pos;
9073 let mut r#type;
9074 loop {
9075 pos = self.pos;
9076 r#type = None;
9077 if self.buf.len() == self.pos {
9078 return None;
9079 }
9080 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
9081 self.pos = self.buf.len();
9082 break;
9083 };
9084 r#type = Some(header.r#type);
9085 let res = match header.r#type {
9086 1u16 => LinkinfoBridgeAttrs::ForwardDelay({
9087 let res = parse_u32(next);
9088 let Some(val) = res else { break };
9089 val
9090 }),
9091 2u16 => LinkinfoBridgeAttrs::HelloTime({
9092 let res = parse_u32(next);
9093 let Some(val) = res else { break };
9094 val
9095 }),
9096 3u16 => LinkinfoBridgeAttrs::MaxAge({
9097 let res = parse_u32(next);
9098 let Some(val) = res else { break };
9099 val
9100 }),
9101 4u16 => LinkinfoBridgeAttrs::AgeingTime({
9102 let res = parse_u32(next);
9103 let Some(val) = res else { break };
9104 val
9105 }),
9106 5u16 => LinkinfoBridgeAttrs::StpState({
9107 let res = parse_u32(next);
9108 let Some(val) = res else { break };
9109 val
9110 }),
9111 6u16 => LinkinfoBridgeAttrs::Priority({
9112 let res = parse_u16(next);
9113 let Some(val) = res else { break };
9114 val
9115 }),
9116 7u16 => LinkinfoBridgeAttrs::VlanFiltering({
9117 let res = parse_u8(next);
9118 let Some(val) = res else { break };
9119 val
9120 }),
9121 8u16 => LinkinfoBridgeAttrs::VlanProtocol({
9122 let res = parse_u16(next);
9123 let Some(val) = res else { break };
9124 val
9125 }),
9126 9u16 => LinkinfoBridgeAttrs::GroupFwdMask({
9127 let res = parse_u16(next);
9128 let Some(val) = res else { break };
9129 val
9130 }),
9131 10u16 => LinkinfoBridgeAttrs::RootId({
9132 let res = Some(IflaBridgeId::new_from_zeroed(next));
9133 let Some(val) = res else { break };
9134 val
9135 }),
9136 11u16 => LinkinfoBridgeAttrs::BridgeId({
9137 let res = Some(IflaBridgeId::new_from_zeroed(next));
9138 let Some(val) = res else { break };
9139 val
9140 }),
9141 12u16 => LinkinfoBridgeAttrs::RootPort({
9142 let res = parse_u16(next);
9143 let Some(val) = res else { break };
9144 val
9145 }),
9146 13u16 => LinkinfoBridgeAttrs::RootPathCost({
9147 let res = parse_u32(next);
9148 let Some(val) = res else { break };
9149 val
9150 }),
9151 14u16 => LinkinfoBridgeAttrs::TopologyChange({
9152 let res = parse_u8(next);
9153 let Some(val) = res else { break };
9154 val
9155 }),
9156 15u16 => LinkinfoBridgeAttrs::TopologyChangeDetected({
9157 let res = parse_u8(next);
9158 let Some(val) = res else { break };
9159 val
9160 }),
9161 16u16 => LinkinfoBridgeAttrs::HelloTimer({
9162 let res = parse_u64(next);
9163 let Some(val) = res else { break };
9164 val
9165 }),
9166 17u16 => LinkinfoBridgeAttrs::TcnTimer({
9167 let res = parse_u64(next);
9168 let Some(val) = res else { break };
9169 val
9170 }),
9171 18u16 => LinkinfoBridgeAttrs::TopologyChangeTimer({
9172 let res = parse_u64(next);
9173 let Some(val) = res else { break };
9174 val
9175 }),
9176 19u16 => LinkinfoBridgeAttrs::GcTimer({
9177 let res = parse_u64(next);
9178 let Some(val) = res else { break };
9179 val
9180 }),
9181 20u16 => LinkinfoBridgeAttrs::GroupAddr({
9182 let res = Some(next);
9183 let Some(val) = res else { break };
9184 val
9185 }),
9186 21u16 => LinkinfoBridgeAttrs::FdbFlush({
9187 let res = Some(next);
9188 let Some(val) = res else { break };
9189 val
9190 }),
9191 22u16 => LinkinfoBridgeAttrs::McastRouter({
9192 let res = parse_u8(next);
9193 let Some(val) = res else { break };
9194 val
9195 }),
9196 23u16 => LinkinfoBridgeAttrs::McastSnooping({
9197 let res = parse_u8(next);
9198 let Some(val) = res else { break };
9199 val
9200 }),
9201 24u16 => LinkinfoBridgeAttrs::McastQueryUseIfaddr({
9202 let res = parse_u8(next);
9203 let Some(val) = res else { break };
9204 val
9205 }),
9206 25u16 => LinkinfoBridgeAttrs::McastQuerier({
9207 let res = parse_u8(next);
9208 let Some(val) = res else { break };
9209 val
9210 }),
9211 26u16 => LinkinfoBridgeAttrs::McastHashElasticity({
9212 let res = parse_u32(next);
9213 let Some(val) = res else { break };
9214 val
9215 }),
9216 27u16 => LinkinfoBridgeAttrs::McastHashMax({
9217 let res = parse_u32(next);
9218 let Some(val) = res else { break };
9219 val
9220 }),
9221 28u16 => LinkinfoBridgeAttrs::McastLastMemberCnt({
9222 let res = parse_u32(next);
9223 let Some(val) = res else { break };
9224 val
9225 }),
9226 29u16 => LinkinfoBridgeAttrs::McastStartupQueryCnt({
9227 let res = parse_u32(next);
9228 let Some(val) = res else { break };
9229 val
9230 }),
9231 30u16 => LinkinfoBridgeAttrs::McastLastMemberIntvl({
9232 let res = parse_u64(next);
9233 let Some(val) = res else { break };
9234 val
9235 }),
9236 31u16 => LinkinfoBridgeAttrs::McastMembershipIntvl({
9237 let res = parse_u64(next);
9238 let Some(val) = res else { break };
9239 val
9240 }),
9241 32u16 => LinkinfoBridgeAttrs::McastQuerierIntvl({
9242 let res = parse_u64(next);
9243 let Some(val) = res else { break };
9244 val
9245 }),
9246 33u16 => LinkinfoBridgeAttrs::McastQueryIntvl({
9247 let res = parse_u64(next);
9248 let Some(val) = res else { break };
9249 val
9250 }),
9251 34u16 => LinkinfoBridgeAttrs::McastQueryResponseIntvl({
9252 let res = parse_u64(next);
9253 let Some(val) = res else { break };
9254 val
9255 }),
9256 35u16 => LinkinfoBridgeAttrs::McastStartupQueryIntvl({
9257 let res = parse_u64(next);
9258 let Some(val) = res else { break };
9259 val
9260 }),
9261 36u16 => LinkinfoBridgeAttrs::NfCallIptables({
9262 let res = parse_u8(next);
9263 let Some(val) = res else { break };
9264 val
9265 }),
9266 37u16 => LinkinfoBridgeAttrs::NfCallIp6tables({
9267 let res = parse_u8(next);
9268 let Some(val) = res else { break };
9269 val
9270 }),
9271 38u16 => LinkinfoBridgeAttrs::NfCallArptables({
9272 let res = parse_u8(next);
9273 let Some(val) = res else { break };
9274 val
9275 }),
9276 39u16 => LinkinfoBridgeAttrs::VlanDefaultPvid({
9277 let res = parse_u16(next);
9278 let Some(val) = res else { break };
9279 val
9280 }),
9281 40u16 => LinkinfoBridgeAttrs::Pad({
9282 let res = Some(next);
9283 let Some(val) = res else { break };
9284 val
9285 }),
9286 41u16 => LinkinfoBridgeAttrs::VlanStatsEnabled({
9287 let res = parse_u8(next);
9288 let Some(val) = res else { break };
9289 val
9290 }),
9291 42u16 => LinkinfoBridgeAttrs::McastStatsEnabled({
9292 let res = parse_u8(next);
9293 let Some(val) = res else { break };
9294 val
9295 }),
9296 43u16 => LinkinfoBridgeAttrs::McastIgmpVersion({
9297 let res = parse_u8(next);
9298 let Some(val) = res else { break };
9299 val
9300 }),
9301 44u16 => LinkinfoBridgeAttrs::McastMldVersion({
9302 let res = parse_u8(next);
9303 let Some(val) = res else { break };
9304 val
9305 }),
9306 45u16 => LinkinfoBridgeAttrs::VlanStatsPerPort({
9307 let res = parse_u8(next);
9308 let Some(val) = res else { break };
9309 val
9310 }),
9311 46u16 => LinkinfoBridgeAttrs::MultiBoolopt({
9312 let res = Some(BrBooloptMulti::new_from_zeroed(next));
9313 let Some(val) = res else { break };
9314 val
9315 }),
9316 47u16 => LinkinfoBridgeAttrs::McastQuerierState({
9317 let res = Some(next);
9318 let Some(val) = res else { break };
9319 val
9320 }),
9321 48u16 => LinkinfoBridgeAttrs::FdbNLearned({
9322 let res = parse_u32(next);
9323 let Some(val) = res else { break };
9324 val
9325 }),
9326 49u16 => LinkinfoBridgeAttrs::FdbMaxLearned({
9327 let res = parse_u32(next);
9328 let Some(val) = res else { break };
9329 val
9330 }),
9331 50u16 => LinkinfoBridgeAttrs::StpMode({
9332 let res = parse_u32(next);
9333 let Some(val) = res else { break };
9334 val
9335 }),
9336 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
9337 n => continue,
9338 };
9339 return Some(Ok(res));
9340 }
9341 Some(Err(ErrorContext::new(
9342 "LinkinfoBridgeAttrs",
9343 r#type.and_then(|t| LinkinfoBridgeAttrs::attr_from_type(t)),
9344 self.orig_loc,
9345 self.buf.as_ptr().wrapping_add(pos) as usize,
9346 )))
9347 }
9348}
9349impl<'a> std::fmt::Debug for IterableLinkinfoBridgeAttrs<'_> {
9350 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9351 let mut fmt = f.debug_struct("LinkinfoBridgeAttrs");
9352 for attr in self.clone() {
9353 let attr = match attr {
9354 Ok(a) => a,
9355 Err(err) => {
9356 fmt.finish()?;
9357 f.write_str("Err(")?;
9358 err.fmt(f)?;
9359 return f.write_str(")");
9360 }
9361 };
9362 match attr {
9363 LinkinfoBridgeAttrs::ForwardDelay(val) => fmt.field("ForwardDelay", &val),
9364 LinkinfoBridgeAttrs::HelloTime(val) => fmt.field("HelloTime", &val),
9365 LinkinfoBridgeAttrs::MaxAge(val) => fmt.field("MaxAge", &val),
9366 LinkinfoBridgeAttrs::AgeingTime(val) => fmt.field("AgeingTime", &val),
9367 LinkinfoBridgeAttrs::StpState(val) => fmt.field("StpState", &val),
9368 LinkinfoBridgeAttrs::Priority(val) => fmt.field("Priority", &val),
9369 LinkinfoBridgeAttrs::VlanFiltering(val) => fmt.field("VlanFiltering", &val),
9370 LinkinfoBridgeAttrs::VlanProtocol(val) => fmt.field("VlanProtocol", &val),
9371 LinkinfoBridgeAttrs::GroupFwdMask(val) => fmt.field("GroupFwdMask", &val),
9372 LinkinfoBridgeAttrs::RootId(val) => fmt.field("RootId", &val),
9373 LinkinfoBridgeAttrs::BridgeId(val) => fmt.field("BridgeId", &val),
9374 LinkinfoBridgeAttrs::RootPort(val) => fmt.field("RootPort", &val),
9375 LinkinfoBridgeAttrs::RootPathCost(val) => fmt.field("RootPathCost", &val),
9376 LinkinfoBridgeAttrs::TopologyChange(val) => fmt.field("TopologyChange", &val),
9377 LinkinfoBridgeAttrs::TopologyChangeDetected(val) => {
9378 fmt.field("TopologyChangeDetected", &val)
9379 }
9380 LinkinfoBridgeAttrs::HelloTimer(val) => fmt.field("HelloTimer", &val),
9381 LinkinfoBridgeAttrs::TcnTimer(val) => fmt.field("TcnTimer", &val),
9382 LinkinfoBridgeAttrs::TopologyChangeTimer(val) => {
9383 fmt.field("TopologyChangeTimer", &val)
9384 }
9385 LinkinfoBridgeAttrs::GcTimer(val) => fmt.field("GcTimer", &val),
9386 LinkinfoBridgeAttrs::GroupAddr(val) => fmt.field("GroupAddr", &FormatMac(val)),
9387 LinkinfoBridgeAttrs::FdbFlush(val) => fmt.field("FdbFlush", &val),
9388 LinkinfoBridgeAttrs::McastRouter(val) => fmt.field("McastRouter", &val),
9389 LinkinfoBridgeAttrs::McastSnooping(val) => fmt.field("McastSnooping", &val),
9390 LinkinfoBridgeAttrs::McastQueryUseIfaddr(val) => {
9391 fmt.field("McastQueryUseIfaddr", &val)
9392 }
9393 LinkinfoBridgeAttrs::McastQuerier(val) => fmt.field("McastQuerier", &val),
9394 LinkinfoBridgeAttrs::McastHashElasticity(val) => {
9395 fmt.field("McastHashElasticity", &val)
9396 }
9397 LinkinfoBridgeAttrs::McastHashMax(val) => fmt.field("McastHashMax", &val),
9398 LinkinfoBridgeAttrs::McastLastMemberCnt(val) => {
9399 fmt.field("McastLastMemberCnt", &val)
9400 }
9401 LinkinfoBridgeAttrs::McastStartupQueryCnt(val) => {
9402 fmt.field("McastStartupQueryCnt", &val)
9403 }
9404 LinkinfoBridgeAttrs::McastLastMemberIntvl(val) => {
9405 fmt.field("McastLastMemberIntvl", &val)
9406 }
9407 LinkinfoBridgeAttrs::McastMembershipIntvl(val) => {
9408 fmt.field("McastMembershipIntvl", &val)
9409 }
9410 LinkinfoBridgeAttrs::McastQuerierIntvl(val) => fmt.field("McastQuerierIntvl", &val),
9411 LinkinfoBridgeAttrs::McastQueryIntvl(val) => fmt.field("McastQueryIntvl", &val),
9412 LinkinfoBridgeAttrs::McastQueryResponseIntvl(val) => {
9413 fmt.field("McastQueryResponseIntvl", &val)
9414 }
9415 LinkinfoBridgeAttrs::McastStartupQueryIntvl(val) => {
9416 fmt.field("McastStartupQueryIntvl", &val)
9417 }
9418 LinkinfoBridgeAttrs::NfCallIptables(val) => fmt.field("NfCallIptables", &val),
9419 LinkinfoBridgeAttrs::NfCallIp6tables(val) => fmt.field("NfCallIp6tables", &val),
9420 LinkinfoBridgeAttrs::NfCallArptables(val) => fmt.field("NfCallArptables", &val),
9421 LinkinfoBridgeAttrs::VlanDefaultPvid(val) => fmt.field("VlanDefaultPvid", &val),
9422 LinkinfoBridgeAttrs::Pad(val) => fmt.field("Pad", &val),
9423 LinkinfoBridgeAttrs::VlanStatsEnabled(val) => fmt.field("VlanStatsEnabled", &val),
9424 LinkinfoBridgeAttrs::McastStatsEnabled(val) => fmt.field("McastStatsEnabled", &val),
9425 LinkinfoBridgeAttrs::McastIgmpVersion(val) => fmt.field("McastIgmpVersion", &val),
9426 LinkinfoBridgeAttrs::McastMldVersion(val) => fmt.field("McastMldVersion", &val),
9427 LinkinfoBridgeAttrs::VlanStatsPerPort(val) => fmt.field("VlanStatsPerPort", &val),
9428 LinkinfoBridgeAttrs::MultiBoolopt(val) => fmt.field("MultiBoolopt", &val),
9429 LinkinfoBridgeAttrs::McastQuerierState(val) => fmt.field("McastQuerierState", &val),
9430 LinkinfoBridgeAttrs::FdbNLearned(val) => fmt.field("FdbNLearned", &val),
9431 LinkinfoBridgeAttrs::FdbMaxLearned(val) => fmt.field("FdbMaxLearned", &val),
9432 LinkinfoBridgeAttrs::StpMode(val) => {
9433 fmt.field("StpMode", &FormatEnum(val.into(), BrStpMode::from_value))
9434 }
9435 };
9436 }
9437 fmt.finish()
9438 }
9439}
9440impl IterableLinkinfoBridgeAttrs<'_> {
9441 pub fn lookup_attr(
9442 &self,
9443 offset: usize,
9444 missing_type: Option<u16>,
9445 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
9446 let mut stack = Vec::new();
9447 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
9448 if missing_type.is_some() && cur == offset {
9449 stack.push(("LinkinfoBridgeAttrs", offset));
9450 return (
9451 stack,
9452 missing_type.and_then(|t| LinkinfoBridgeAttrs::attr_from_type(t)),
9453 );
9454 }
9455 if cur > offset || cur + self.buf.len() < offset {
9456 return (stack, None);
9457 }
9458 let mut attrs = self.clone();
9459 let mut last_off = cur + attrs.pos;
9460 while let Some(attr) = attrs.next() {
9461 let Ok(attr) = attr else { break };
9462 match attr {
9463 LinkinfoBridgeAttrs::ForwardDelay(val) => {
9464 if last_off == offset {
9465 stack.push(("ForwardDelay", last_off));
9466 break;
9467 }
9468 }
9469 LinkinfoBridgeAttrs::HelloTime(val) => {
9470 if last_off == offset {
9471 stack.push(("HelloTime", last_off));
9472 break;
9473 }
9474 }
9475 LinkinfoBridgeAttrs::MaxAge(val) => {
9476 if last_off == offset {
9477 stack.push(("MaxAge", last_off));
9478 break;
9479 }
9480 }
9481 LinkinfoBridgeAttrs::AgeingTime(val) => {
9482 if last_off == offset {
9483 stack.push(("AgeingTime", last_off));
9484 break;
9485 }
9486 }
9487 LinkinfoBridgeAttrs::StpState(val) => {
9488 if last_off == offset {
9489 stack.push(("StpState", last_off));
9490 break;
9491 }
9492 }
9493 LinkinfoBridgeAttrs::Priority(val) => {
9494 if last_off == offset {
9495 stack.push(("Priority", last_off));
9496 break;
9497 }
9498 }
9499 LinkinfoBridgeAttrs::VlanFiltering(val) => {
9500 if last_off == offset {
9501 stack.push(("VlanFiltering", last_off));
9502 break;
9503 }
9504 }
9505 LinkinfoBridgeAttrs::VlanProtocol(val) => {
9506 if last_off == offset {
9507 stack.push(("VlanProtocol", last_off));
9508 break;
9509 }
9510 }
9511 LinkinfoBridgeAttrs::GroupFwdMask(val) => {
9512 if last_off == offset {
9513 stack.push(("GroupFwdMask", last_off));
9514 break;
9515 }
9516 }
9517 LinkinfoBridgeAttrs::RootId(val) => {
9518 if last_off == offset {
9519 stack.push(("RootId", last_off));
9520 break;
9521 }
9522 }
9523 LinkinfoBridgeAttrs::BridgeId(val) => {
9524 if last_off == offset {
9525 stack.push(("BridgeId", last_off));
9526 break;
9527 }
9528 }
9529 LinkinfoBridgeAttrs::RootPort(val) => {
9530 if last_off == offset {
9531 stack.push(("RootPort", last_off));
9532 break;
9533 }
9534 }
9535 LinkinfoBridgeAttrs::RootPathCost(val) => {
9536 if last_off == offset {
9537 stack.push(("RootPathCost", last_off));
9538 break;
9539 }
9540 }
9541 LinkinfoBridgeAttrs::TopologyChange(val) => {
9542 if last_off == offset {
9543 stack.push(("TopologyChange", last_off));
9544 break;
9545 }
9546 }
9547 LinkinfoBridgeAttrs::TopologyChangeDetected(val) => {
9548 if last_off == offset {
9549 stack.push(("TopologyChangeDetected", last_off));
9550 break;
9551 }
9552 }
9553 LinkinfoBridgeAttrs::HelloTimer(val) => {
9554 if last_off == offset {
9555 stack.push(("HelloTimer", last_off));
9556 break;
9557 }
9558 }
9559 LinkinfoBridgeAttrs::TcnTimer(val) => {
9560 if last_off == offset {
9561 stack.push(("TcnTimer", last_off));
9562 break;
9563 }
9564 }
9565 LinkinfoBridgeAttrs::TopologyChangeTimer(val) => {
9566 if last_off == offset {
9567 stack.push(("TopologyChangeTimer", last_off));
9568 break;
9569 }
9570 }
9571 LinkinfoBridgeAttrs::GcTimer(val) => {
9572 if last_off == offset {
9573 stack.push(("GcTimer", last_off));
9574 break;
9575 }
9576 }
9577 LinkinfoBridgeAttrs::GroupAddr(val) => {
9578 if last_off == offset {
9579 stack.push(("GroupAddr", last_off));
9580 break;
9581 }
9582 }
9583 LinkinfoBridgeAttrs::FdbFlush(val) => {
9584 if last_off == offset {
9585 stack.push(("FdbFlush", last_off));
9586 break;
9587 }
9588 }
9589 LinkinfoBridgeAttrs::McastRouter(val) => {
9590 if last_off == offset {
9591 stack.push(("McastRouter", last_off));
9592 break;
9593 }
9594 }
9595 LinkinfoBridgeAttrs::McastSnooping(val) => {
9596 if last_off == offset {
9597 stack.push(("McastSnooping", last_off));
9598 break;
9599 }
9600 }
9601 LinkinfoBridgeAttrs::McastQueryUseIfaddr(val) => {
9602 if last_off == offset {
9603 stack.push(("McastQueryUseIfaddr", last_off));
9604 break;
9605 }
9606 }
9607 LinkinfoBridgeAttrs::McastQuerier(val) => {
9608 if last_off == offset {
9609 stack.push(("McastQuerier", last_off));
9610 break;
9611 }
9612 }
9613 LinkinfoBridgeAttrs::McastHashElasticity(val) => {
9614 if last_off == offset {
9615 stack.push(("McastHashElasticity", last_off));
9616 break;
9617 }
9618 }
9619 LinkinfoBridgeAttrs::McastHashMax(val) => {
9620 if last_off == offset {
9621 stack.push(("McastHashMax", last_off));
9622 break;
9623 }
9624 }
9625 LinkinfoBridgeAttrs::McastLastMemberCnt(val) => {
9626 if last_off == offset {
9627 stack.push(("McastLastMemberCnt", last_off));
9628 break;
9629 }
9630 }
9631 LinkinfoBridgeAttrs::McastStartupQueryCnt(val) => {
9632 if last_off == offset {
9633 stack.push(("McastStartupQueryCnt", last_off));
9634 break;
9635 }
9636 }
9637 LinkinfoBridgeAttrs::McastLastMemberIntvl(val) => {
9638 if last_off == offset {
9639 stack.push(("McastLastMemberIntvl", last_off));
9640 break;
9641 }
9642 }
9643 LinkinfoBridgeAttrs::McastMembershipIntvl(val) => {
9644 if last_off == offset {
9645 stack.push(("McastMembershipIntvl", last_off));
9646 break;
9647 }
9648 }
9649 LinkinfoBridgeAttrs::McastQuerierIntvl(val) => {
9650 if last_off == offset {
9651 stack.push(("McastQuerierIntvl", last_off));
9652 break;
9653 }
9654 }
9655 LinkinfoBridgeAttrs::McastQueryIntvl(val) => {
9656 if last_off == offset {
9657 stack.push(("McastQueryIntvl", last_off));
9658 break;
9659 }
9660 }
9661 LinkinfoBridgeAttrs::McastQueryResponseIntvl(val) => {
9662 if last_off == offset {
9663 stack.push(("McastQueryResponseIntvl", last_off));
9664 break;
9665 }
9666 }
9667 LinkinfoBridgeAttrs::McastStartupQueryIntvl(val) => {
9668 if last_off == offset {
9669 stack.push(("McastStartupQueryIntvl", last_off));
9670 break;
9671 }
9672 }
9673 LinkinfoBridgeAttrs::NfCallIptables(val) => {
9674 if last_off == offset {
9675 stack.push(("NfCallIptables", last_off));
9676 break;
9677 }
9678 }
9679 LinkinfoBridgeAttrs::NfCallIp6tables(val) => {
9680 if last_off == offset {
9681 stack.push(("NfCallIp6tables", last_off));
9682 break;
9683 }
9684 }
9685 LinkinfoBridgeAttrs::NfCallArptables(val) => {
9686 if last_off == offset {
9687 stack.push(("NfCallArptables", last_off));
9688 break;
9689 }
9690 }
9691 LinkinfoBridgeAttrs::VlanDefaultPvid(val) => {
9692 if last_off == offset {
9693 stack.push(("VlanDefaultPvid", last_off));
9694 break;
9695 }
9696 }
9697 LinkinfoBridgeAttrs::Pad(val) => {
9698 if last_off == offset {
9699 stack.push(("Pad", last_off));
9700 break;
9701 }
9702 }
9703 LinkinfoBridgeAttrs::VlanStatsEnabled(val) => {
9704 if last_off == offset {
9705 stack.push(("VlanStatsEnabled", last_off));
9706 break;
9707 }
9708 }
9709 LinkinfoBridgeAttrs::McastStatsEnabled(val) => {
9710 if last_off == offset {
9711 stack.push(("McastStatsEnabled", last_off));
9712 break;
9713 }
9714 }
9715 LinkinfoBridgeAttrs::McastIgmpVersion(val) => {
9716 if last_off == offset {
9717 stack.push(("McastIgmpVersion", last_off));
9718 break;
9719 }
9720 }
9721 LinkinfoBridgeAttrs::McastMldVersion(val) => {
9722 if last_off == offset {
9723 stack.push(("McastMldVersion", last_off));
9724 break;
9725 }
9726 }
9727 LinkinfoBridgeAttrs::VlanStatsPerPort(val) => {
9728 if last_off == offset {
9729 stack.push(("VlanStatsPerPort", last_off));
9730 break;
9731 }
9732 }
9733 LinkinfoBridgeAttrs::MultiBoolopt(val) => {
9734 if last_off == offset {
9735 stack.push(("MultiBoolopt", last_off));
9736 break;
9737 }
9738 }
9739 LinkinfoBridgeAttrs::McastQuerierState(val) => {
9740 if last_off == offset {
9741 stack.push(("McastQuerierState", last_off));
9742 break;
9743 }
9744 }
9745 LinkinfoBridgeAttrs::FdbNLearned(val) => {
9746 if last_off == offset {
9747 stack.push(("FdbNLearned", last_off));
9748 break;
9749 }
9750 }
9751 LinkinfoBridgeAttrs::FdbMaxLearned(val) => {
9752 if last_off == offset {
9753 stack.push(("FdbMaxLearned", last_off));
9754 break;
9755 }
9756 }
9757 LinkinfoBridgeAttrs::StpMode(val) => {
9758 if last_off == offset {
9759 stack.push(("StpMode", last_off));
9760 break;
9761 }
9762 }
9763 _ => {}
9764 };
9765 last_off = cur + attrs.pos;
9766 }
9767 if !stack.is_empty() {
9768 stack.push(("LinkinfoBridgeAttrs", cur));
9769 }
9770 (stack, None)
9771 }
9772}
9773#[derive(Clone)]
9774pub enum LinkinfoBrportAttrs<'a> {
9775 State(u8),
9776 Priority(u16),
9777 Cost(u32),
9778 Mode(()),
9779 Guard(()),
9780 Protect(()),
9781 FastLeave(()),
9782 Learning(()),
9783 UnicastFlood(()),
9784 Proxyarp(()),
9785 LearningSync(()),
9786 ProxyarpWifi(()),
9787 RootId(IflaBridgeId),
9788 BridgeId(IflaBridgeId),
9789 DesignatedPort(u16),
9790 DesignatedCost(u16),
9791 Id(u16),
9792 No(u16),
9793 TopologyChangeAck(u8),
9794 ConfigPending(u8),
9795 MessageAgeTimer(u64),
9796 ForwardDelayTimer(u64),
9797 HoldTimer(u64),
9798 Flush(()),
9799 MulticastRouter(u8),
9800 Pad(&'a [u8]),
9801 McastFlood(()),
9802 McastToUcast(()),
9803 VlanTunnel(()),
9804 BcastFlood(()),
9805 GroupFwdMask(u16),
9806 NeighSuppress(()),
9807 Isolated(()),
9808 BackupPort(u32),
9809 MrpRingOpen(()),
9810 MrpInOpen(()),
9811 McastEhtHostsLimit(u32),
9812 McastEhtHostsCnt(u32),
9813 Locked(()),
9814 Mab(()),
9815 McastNGroups(u32),
9816 McastMaxGroups(u32),
9817 NeighVlanSuppress(()),
9818 BackupNhid(u32),
9819 NeighForwardGrat(u8),
9820}
9821impl<'a> IterableLinkinfoBrportAttrs<'a> {
9822 pub fn get_state(&self) -> Result<u8, ErrorContext> {
9823 let mut iter = self.clone();
9824 iter.pos = 0;
9825 for attr in iter {
9826 if let Ok(LinkinfoBrportAttrs::State(val)) = attr {
9827 return Ok(val);
9828 }
9829 }
9830 Err(ErrorContext::new_missing(
9831 "LinkinfoBrportAttrs",
9832 "State",
9833 self.orig_loc,
9834 self.buf.as_ptr() as usize,
9835 ))
9836 }
9837 pub fn get_priority(&self) -> Result<u16, ErrorContext> {
9838 let mut iter = self.clone();
9839 iter.pos = 0;
9840 for attr in iter {
9841 if let Ok(LinkinfoBrportAttrs::Priority(val)) = attr {
9842 return Ok(val);
9843 }
9844 }
9845 Err(ErrorContext::new_missing(
9846 "LinkinfoBrportAttrs",
9847 "Priority",
9848 self.orig_loc,
9849 self.buf.as_ptr() as usize,
9850 ))
9851 }
9852 pub fn get_cost(&self) -> Result<u32, ErrorContext> {
9853 let mut iter = self.clone();
9854 iter.pos = 0;
9855 for attr in iter {
9856 if let Ok(LinkinfoBrportAttrs::Cost(val)) = attr {
9857 return Ok(val);
9858 }
9859 }
9860 Err(ErrorContext::new_missing(
9861 "LinkinfoBrportAttrs",
9862 "Cost",
9863 self.orig_loc,
9864 self.buf.as_ptr() as usize,
9865 ))
9866 }
9867 pub fn get_mode(&self) -> Result<(), ErrorContext> {
9868 let mut iter = self.clone();
9869 iter.pos = 0;
9870 for attr in iter {
9871 if let Ok(LinkinfoBrportAttrs::Mode(val)) = attr {
9872 return Ok(val);
9873 }
9874 }
9875 Err(ErrorContext::new_missing(
9876 "LinkinfoBrportAttrs",
9877 "Mode",
9878 self.orig_loc,
9879 self.buf.as_ptr() as usize,
9880 ))
9881 }
9882 pub fn get_guard(&self) -> Result<(), ErrorContext> {
9883 let mut iter = self.clone();
9884 iter.pos = 0;
9885 for attr in iter {
9886 if let Ok(LinkinfoBrportAttrs::Guard(val)) = attr {
9887 return Ok(val);
9888 }
9889 }
9890 Err(ErrorContext::new_missing(
9891 "LinkinfoBrportAttrs",
9892 "Guard",
9893 self.orig_loc,
9894 self.buf.as_ptr() as usize,
9895 ))
9896 }
9897 pub fn get_protect(&self) -> Result<(), ErrorContext> {
9898 let mut iter = self.clone();
9899 iter.pos = 0;
9900 for attr in iter {
9901 if let Ok(LinkinfoBrportAttrs::Protect(val)) = attr {
9902 return Ok(val);
9903 }
9904 }
9905 Err(ErrorContext::new_missing(
9906 "LinkinfoBrportAttrs",
9907 "Protect",
9908 self.orig_loc,
9909 self.buf.as_ptr() as usize,
9910 ))
9911 }
9912 pub fn get_fast_leave(&self) -> Result<(), ErrorContext> {
9913 let mut iter = self.clone();
9914 iter.pos = 0;
9915 for attr in iter {
9916 if let Ok(LinkinfoBrportAttrs::FastLeave(val)) = attr {
9917 return Ok(val);
9918 }
9919 }
9920 Err(ErrorContext::new_missing(
9921 "LinkinfoBrportAttrs",
9922 "FastLeave",
9923 self.orig_loc,
9924 self.buf.as_ptr() as usize,
9925 ))
9926 }
9927 pub fn get_learning(&self) -> Result<(), ErrorContext> {
9928 let mut iter = self.clone();
9929 iter.pos = 0;
9930 for attr in iter {
9931 if let Ok(LinkinfoBrportAttrs::Learning(val)) = attr {
9932 return Ok(val);
9933 }
9934 }
9935 Err(ErrorContext::new_missing(
9936 "LinkinfoBrportAttrs",
9937 "Learning",
9938 self.orig_loc,
9939 self.buf.as_ptr() as usize,
9940 ))
9941 }
9942 pub fn get_unicast_flood(&self) -> Result<(), ErrorContext> {
9943 let mut iter = self.clone();
9944 iter.pos = 0;
9945 for attr in iter {
9946 if let Ok(LinkinfoBrportAttrs::UnicastFlood(val)) = attr {
9947 return Ok(val);
9948 }
9949 }
9950 Err(ErrorContext::new_missing(
9951 "LinkinfoBrportAttrs",
9952 "UnicastFlood",
9953 self.orig_loc,
9954 self.buf.as_ptr() as usize,
9955 ))
9956 }
9957 pub fn get_proxyarp(&self) -> Result<(), ErrorContext> {
9958 let mut iter = self.clone();
9959 iter.pos = 0;
9960 for attr in iter {
9961 if let Ok(LinkinfoBrportAttrs::Proxyarp(val)) = attr {
9962 return Ok(val);
9963 }
9964 }
9965 Err(ErrorContext::new_missing(
9966 "LinkinfoBrportAttrs",
9967 "Proxyarp",
9968 self.orig_loc,
9969 self.buf.as_ptr() as usize,
9970 ))
9971 }
9972 pub fn get_learning_sync(&self) -> Result<(), ErrorContext> {
9973 let mut iter = self.clone();
9974 iter.pos = 0;
9975 for attr in iter {
9976 if let Ok(LinkinfoBrportAttrs::LearningSync(val)) = attr {
9977 return Ok(val);
9978 }
9979 }
9980 Err(ErrorContext::new_missing(
9981 "LinkinfoBrportAttrs",
9982 "LearningSync",
9983 self.orig_loc,
9984 self.buf.as_ptr() as usize,
9985 ))
9986 }
9987 pub fn get_proxyarp_wifi(&self) -> Result<(), ErrorContext> {
9988 let mut iter = self.clone();
9989 iter.pos = 0;
9990 for attr in iter {
9991 if let Ok(LinkinfoBrportAttrs::ProxyarpWifi(val)) = attr {
9992 return Ok(val);
9993 }
9994 }
9995 Err(ErrorContext::new_missing(
9996 "LinkinfoBrportAttrs",
9997 "ProxyarpWifi",
9998 self.orig_loc,
9999 self.buf.as_ptr() as usize,
10000 ))
10001 }
10002 pub fn get_root_id(&self) -> Result<IflaBridgeId, ErrorContext> {
10003 let mut iter = self.clone();
10004 iter.pos = 0;
10005 for attr in iter {
10006 if let Ok(LinkinfoBrportAttrs::RootId(val)) = attr {
10007 return Ok(val);
10008 }
10009 }
10010 Err(ErrorContext::new_missing(
10011 "LinkinfoBrportAttrs",
10012 "RootId",
10013 self.orig_loc,
10014 self.buf.as_ptr() as usize,
10015 ))
10016 }
10017 pub fn get_bridge_id(&self) -> Result<IflaBridgeId, ErrorContext> {
10018 let mut iter = self.clone();
10019 iter.pos = 0;
10020 for attr in iter {
10021 if let Ok(LinkinfoBrportAttrs::BridgeId(val)) = attr {
10022 return Ok(val);
10023 }
10024 }
10025 Err(ErrorContext::new_missing(
10026 "LinkinfoBrportAttrs",
10027 "BridgeId",
10028 self.orig_loc,
10029 self.buf.as_ptr() as usize,
10030 ))
10031 }
10032 pub fn get_designated_port(&self) -> Result<u16, ErrorContext> {
10033 let mut iter = self.clone();
10034 iter.pos = 0;
10035 for attr in iter {
10036 if let Ok(LinkinfoBrportAttrs::DesignatedPort(val)) = attr {
10037 return Ok(val);
10038 }
10039 }
10040 Err(ErrorContext::new_missing(
10041 "LinkinfoBrportAttrs",
10042 "DesignatedPort",
10043 self.orig_loc,
10044 self.buf.as_ptr() as usize,
10045 ))
10046 }
10047 pub fn get_designated_cost(&self) -> Result<u16, ErrorContext> {
10048 let mut iter = self.clone();
10049 iter.pos = 0;
10050 for attr in iter {
10051 if let Ok(LinkinfoBrportAttrs::DesignatedCost(val)) = attr {
10052 return Ok(val);
10053 }
10054 }
10055 Err(ErrorContext::new_missing(
10056 "LinkinfoBrportAttrs",
10057 "DesignatedCost",
10058 self.orig_loc,
10059 self.buf.as_ptr() as usize,
10060 ))
10061 }
10062 pub fn get_id(&self) -> Result<u16, ErrorContext> {
10063 let mut iter = self.clone();
10064 iter.pos = 0;
10065 for attr in iter {
10066 if let Ok(LinkinfoBrportAttrs::Id(val)) = attr {
10067 return Ok(val);
10068 }
10069 }
10070 Err(ErrorContext::new_missing(
10071 "LinkinfoBrportAttrs",
10072 "Id",
10073 self.orig_loc,
10074 self.buf.as_ptr() as usize,
10075 ))
10076 }
10077 pub fn get_no(&self) -> Result<u16, ErrorContext> {
10078 let mut iter = self.clone();
10079 iter.pos = 0;
10080 for attr in iter {
10081 if let Ok(LinkinfoBrportAttrs::No(val)) = attr {
10082 return Ok(val);
10083 }
10084 }
10085 Err(ErrorContext::new_missing(
10086 "LinkinfoBrportAttrs",
10087 "No",
10088 self.orig_loc,
10089 self.buf.as_ptr() as usize,
10090 ))
10091 }
10092 pub fn get_topology_change_ack(&self) -> Result<u8, ErrorContext> {
10093 let mut iter = self.clone();
10094 iter.pos = 0;
10095 for attr in iter {
10096 if let Ok(LinkinfoBrportAttrs::TopologyChangeAck(val)) = attr {
10097 return Ok(val);
10098 }
10099 }
10100 Err(ErrorContext::new_missing(
10101 "LinkinfoBrportAttrs",
10102 "TopologyChangeAck",
10103 self.orig_loc,
10104 self.buf.as_ptr() as usize,
10105 ))
10106 }
10107 pub fn get_config_pending(&self) -> Result<u8, ErrorContext> {
10108 let mut iter = self.clone();
10109 iter.pos = 0;
10110 for attr in iter {
10111 if let Ok(LinkinfoBrportAttrs::ConfigPending(val)) = attr {
10112 return Ok(val);
10113 }
10114 }
10115 Err(ErrorContext::new_missing(
10116 "LinkinfoBrportAttrs",
10117 "ConfigPending",
10118 self.orig_loc,
10119 self.buf.as_ptr() as usize,
10120 ))
10121 }
10122 pub fn get_message_age_timer(&self) -> Result<u64, ErrorContext> {
10123 let mut iter = self.clone();
10124 iter.pos = 0;
10125 for attr in iter {
10126 if let Ok(LinkinfoBrportAttrs::MessageAgeTimer(val)) = attr {
10127 return Ok(val);
10128 }
10129 }
10130 Err(ErrorContext::new_missing(
10131 "LinkinfoBrportAttrs",
10132 "MessageAgeTimer",
10133 self.orig_loc,
10134 self.buf.as_ptr() as usize,
10135 ))
10136 }
10137 pub fn get_forward_delay_timer(&self) -> Result<u64, ErrorContext> {
10138 let mut iter = self.clone();
10139 iter.pos = 0;
10140 for attr in iter {
10141 if let Ok(LinkinfoBrportAttrs::ForwardDelayTimer(val)) = attr {
10142 return Ok(val);
10143 }
10144 }
10145 Err(ErrorContext::new_missing(
10146 "LinkinfoBrportAttrs",
10147 "ForwardDelayTimer",
10148 self.orig_loc,
10149 self.buf.as_ptr() as usize,
10150 ))
10151 }
10152 pub fn get_hold_timer(&self) -> Result<u64, ErrorContext> {
10153 let mut iter = self.clone();
10154 iter.pos = 0;
10155 for attr in iter {
10156 if let Ok(LinkinfoBrportAttrs::HoldTimer(val)) = attr {
10157 return Ok(val);
10158 }
10159 }
10160 Err(ErrorContext::new_missing(
10161 "LinkinfoBrportAttrs",
10162 "HoldTimer",
10163 self.orig_loc,
10164 self.buf.as_ptr() as usize,
10165 ))
10166 }
10167 pub fn get_flush(&self) -> Result<(), ErrorContext> {
10168 let mut iter = self.clone();
10169 iter.pos = 0;
10170 for attr in iter {
10171 if let Ok(LinkinfoBrportAttrs::Flush(val)) = attr {
10172 return Ok(val);
10173 }
10174 }
10175 Err(ErrorContext::new_missing(
10176 "LinkinfoBrportAttrs",
10177 "Flush",
10178 self.orig_loc,
10179 self.buf.as_ptr() as usize,
10180 ))
10181 }
10182 pub fn get_multicast_router(&self) -> Result<u8, ErrorContext> {
10183 let mut iter = self.clone();
10184 iter.pos = 0;
10185 for attr in iter {
10186 if let Ok(LinkinfoBrportAttrs::MulticastRouter(val)) = attr {
10187 return Ok(val);
10188 }
10189 }
10190 Err(ErrorContext::new_missing(
10191 "LinkinfoBrportAttrs",
10192 "MulticastRouter",
10193 self.orig_loc,
10194 self.buf.as_ptr() as usize,
10195 ))
10196 }
10197 pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
10198 let mut iter = self.clone();
10199 iter.pos = 0;
10200 for attr in iter {
10201 if let Ok(LinkinfoBrportAttrs::Pad(val)) = attr {
10202 return Ok(val);
10203 }
10204 }
10205 Err(ErrorContext::new_missing(
10206 "LinkinfoBrportAttrs",
10207 "Pad",
10208 self.orig_loc,
10209 self.buf.as_ptr() as usize,
10210 ))
10211 }
10212 pub fn get_mcast_flood(&self) -> Result<(), ErrorContext> {
10213 let mut iter = self.clone();
10214 iter.pos = 0;
10215 for attr in iter {
10216 if let Ok(LinkinfoBrportAttrs::McastFlood(val)) = attr {
10217 return Ok(val);
10218 }
10219 }
10220 Err(ErrorContext::new_missing(
10221 "LinkinfoBrportAttrs",
10222 "McastFlood",
10223 self.orig_loc,
10224 self.buf.as_ptr() as usize,
10225 ))
10226 }
10227 pub fn get_mcast_to_ucast(&self) -> Result<(), ErrorContext> {
10228 let mut iter = self.clone();
10229 iter.pos = 0;
10230 for attr in iter {
10231 if let Ok(LinkinfoBrportAttrs::McastToUcast(val)) = attr {
10232 return Ok(val);
10233 }
10234 }
10235 Err(ErrorContext::new_missing(
10236 "LinkinfoBrportAttrs",
10237 "McastToUcast",
10238 self.orig_loc,
10239 self.buf.as_ptr() as usize,
10240 ))
10241 }
10242 pub fn get_vlan_tunnel(&self) -> Result<(), ErrorContext> {
10243 let mut iter = self.clone();
10244 iter.pos = 0;
10245 for attr in iter {
10246 if let Ok(LinkinfoBrportAttrs::VlanTunnel(val)) = attr {
10247 return Ok(val);
10248 }
10249 }
10250 Err(ErrorContext::new_missing(
10251 "LinkinfoBrportAttrs",
10252 "VlanTunnel",
10253 self.orig_loc,
10254 self.buf.as_ptr() as usize,
10255 ))
10256 }
10257 pub fn get_bcast_flood(&self) -> Result<(), ErrorContext> {
10258 let mut iter = self.clone();
10259 iter.pos = 0;
10260 for attr in iter {
10261 if let Ok(LinkinfoBrportAttrs::BcastFlood(val)) = attr {
10262 return Ok(val);
10263 }
10264 }
10265 Err(ErrorContext::new_missing(
10266 "LinkinfoBrportAttrs",
10267 "BcastFlood",
10268 self.orig_loc,
10269 self.buf.as_ptr() as usize,
10270 ))
10271 }
10272 pub fn get_group_fwd_mask(&self) -> Result<u16, ErrorContext> {
10273 let mut iter = self.clone();
10274 iter.pos = 0;
10275 for attr in iter {
10276 if let Ok(LinkinfoBrportAttrs::GroupFwdMask(val)) = attr {
10277 return Ok(val);
10278 }
10279 }
10280 Err(ErrorContext::new_missing(
10281 "LinkinfoBrportAttrs",
10282 "GroupFwdMask",
10283 self.orig_loc,
10284 self.buf.as_ptr() as usize,
10285 ))
10286 }
10287 pub fn get_neigh_suppress(&self) -> Result<(), ErrorContext> {
10288 let mut iter = self.clone();
10289 iter.pos = 0;
10290 for attr in iter {
10291 if let Ok(LinkinfoBrportAttrs::NeighSuppress(val)) = attr {
10292 return Ok(val);
10293 }
10294 }
10295 Err(ErrorContext::new_missing(
10296 "LinkinfoBrportAttrs",
10297 "NeighSuppress",
10298 self.orig_loc,
10299 self.buf.as_ptr() as usize,
10300 ))
10301 }
10302 pub fn get_isolated(&self) -> Result<(), ErrorContext> {
10303 let mut iter = self.clone();
10304 iter.pos = 0;
10305 for attr in iter {
10306 if let Ok(LinkinfoBrportAttrs::Isolated(val)) = attr {
10307 return Ok(val);
10308 }
10309 }
10310 Err(ErrorContext::new_missing(
10311 "LinkinfoBrportAttrs",
10312 "Isolated",
10313 self.orig_loc,
10314 self.buf.as_ptr() as usize,
10315 ))
10316 }
10317 pub fn get_backup_port(&self) -> Result<u32, ErrorContext> {
10318 let mut iter = self.clone();
10319 iter.pos = 0;
10320 for attr in iter {
10321 if let Ok(LinkinfoBrportAttrs::BackupPort(val)) = attr {
10322 return Ok(val);
10323 }
10324 }
10325 Err(ErrorContext::new_missing(
10326 "LinkinfoBrportAttrs",
10327 "BackupPort",
10328 self.orig_loc,
10329 self.buf.as_ptr() as usize,
10330 ))
10331 }
10332 pub fn get_mrp_ring_open(&self) -> Result<(), ErrorContext> {
10333 let mut iter = self.clone();
10334 iter.pos = 0;
10335 for attr in iter {
10336 if let Ok(LinkinfoBrportAttrs::MrpRingOpen(val)) = attr {
10337 return Ok(val);
10338 }
10339 }
10340 Err(ErrorContext::new_missing(
10341 "LinkinfoBrportAttrs",
10342 "MrpRingOpen",
10343 self.orig_loc,
10344 self.buf.as_ptr() as usize,
10345 ))
10346 }
10347 pub fn get_mrp_in_open(&self) -> Result<(), ErrorContext> {
10348 let mut iter = self.clone();
10349 iter.pos = 0;
10350 for attr in iter {
10351 if let Ok(LinkinfoBrportAttrs::MrpInOpen(val)) = attr {
10352 return Ok(val);
10353 }
10354 }
10355 Err(ErrorContext::new_missing(
10356 "LinkinfoBrportAttrs",
10357 "MrpInOpen",
10358 self.orig_loc,
10359 self.buf.as_ptr() as usize,
10360 ))
10361 }
10362 pub fn get_mcast_eht_hosts_limit(&self) -> Result<u32, ErrorContext> {
10363 let mut iter = self.clone();
10364 iter.pos = 0;
10365 for attr in iter {
10366 if let Ok(LinkinfoBrportAttrs::McastEhtHostsLimit(val)) = attr {
10367 return Ok(val);
10368 }
10369 }
10370 Err(ErrorContext::new_missing(
10371 "LinkinfoBrportAttrs",
10372 "McastEhtHostsLimit",
10373 self.orig_loc,
10374 self.buf.as_ptr() as usize,
10375 ))
10376 }
10377 pub fn get_mcast_eht_hosts_cnt(&self) -> Result<u32, ErrorContext> {
10378 let mut iter = self.clone();
10379 iter.pos = 0;
10380 for attr in iter {
10381 if let Ok(LinkinfoBrportAttrs::McastEhtHostsCnt(val)) = attr {
10382 return Ok(val);
10383 }
10384 }
10385 Err(ErrorContext::new_missing(
10386 "LinkinfoBrportAttrs",
10387 "McastEhtHostsCnt",
10388 self.orig_loc,
10389 self.buf.as_ptr() as usize,
10390 ))
10391 }
10392 pub fn get_locked(&self) -> Result<(), ErrorContext> {
10393 let mut iter = self.clone();
10394 iter.pos = 0;
10395 for attr in iter {
10396 if let Ok(LinkinfoBrportAttrs::Locked(val)) = attr {
10397 return Ok(val);
10398 }
10399 }
10400 Err(ErrorContext::new_missing(
10401 "LinkinfoBrportAttrs",
10402 "Locked",
10403 self.orig_loc,
10404 self.buf.as_ptr() as usize,
10405 ))
10406 }
10407 pub fn get_mab(&self) -> Result<(), ErrorContext> {
10408 let mut iter = self.clone();
10409 iter.pos = 0;
10410 for attr in iter {
10411 if let Ok(LinkinfoBrportAttrs::Mab(val)) = attr {
10412 return Ok(val);
10413 }
10414 }
10415 Err(ErrorContext::new_missing(
10416 "LinkinfoBrportAttrs",
10417 "Mab",
10418 self.orig_loc,
10419 self.buf.as_ptr() as usize,
10420 ))
10421 }
10422 pub fn get_mcast_n_groups(&self) -> Result<u32, ErrorContext> {
10423 let mut iter = self.clone();
10424 iter.pos = 0;
10425 for attr in iter {
10426 if let Ok(LinkinfoBrportAttrs::McastNGroups(val)) = attr {
10427 return Ok(val);
10428 }
10429 }
10430 Err(ErrorContext::new_missing(
10431 "LinkinfoBrportAttrs",
10432 "McastNGroups",
10433 self.orig_loc,
10434 self.buf.as_ptr() as usize,
10435 ))
10436 }
10437 pub fn get_mcast_max_groups(&self) -> Result<u32, ErrorContext> {
10438 let mut iter = self.clone();
10439 iter.pos = 0;
10440 for attr in iter {
10441 if let Ok(LinkinfoBrportAttrs::McastMaxGroups(val)) = attr {
10442 return Ok(val);
10443 }
10444 }
10445 Err(ErrorContext::new_missing(
10446 "LinkinfoBrportAttrs",
10447 "McastMaxGroups",
10448 self.orig_loc,
10449 self.buf.as_ptr() as usize,
10450 ))
10451 }
10452 pub fn get_neigh_vlan_suppress(&self) -> Result<(), ErrorContext> {
10453 let mut iter = self.clone();
10454 iter.pos = 0;
10455 for attr in iter {
10456 if let Ok(LinkinfoBrportAttrs::NeighVlanSuppress(val)) = attr {
10457 return Ok(val);
10458 }
10459 }
10460 Err(ErrorContext::new_missing(
10461 "LinkinfoBrportAttrs",
10462 "NeighVlanSuppress",
10463 self.orig_loc,
10464 self.buf.as_ptr() as usize,
10465 ))
10466 }
10467 pub fn get_backup_nhid(&self) -> Result<u32, ErrorContext> {
10468 let mut iter = self.clone();
10469 iter.pos = 0;
10470 for attr in iter {
10471 if let Ok(LinkinfoBrportAttrs::BackupNhid(val)) = attr {
10472 return Ok(val);
10473 }
10474 }
10475 Err(ErrorContext::new_missing(
10476 "LinkinfoBrportAttrs",
10477 "BackupNhid",
10478 self.orig_loc,
10479 self.buf.as_ptr() as usize,
10480 ))
10481 }
10482 pub fn get_neigh_forward_grat(&self) -> Result<u8, ErrorContext> {
10483 let mut iter = self.clone();
10484 iter.pos = 0;
10485 for attr in iter {
10486 if let Ok(LinkinfoBrportAttrs::NeighForwardGrat(val)) = attr {
10487 return Ok(val);
10488 }
10489 }
10490 Err(ErrorContext::new_missing(
10491 "LinkinfoBrportAttrs",
10492 "NeighForwardGrat",
10493 self.orig_loc,
10494 self.buf.as_ptr() as usize,
10495 ))
10496 }
10497}
10498impl LinkinfoBrportAttrs<'_> {
10499 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoBrportAttrs<'a> {
10500 IterableLinkinfoBrportAttrs::with_loc(buf, buf.as_ptr() as usize)
10501 }
10502 fn attr_from_type(r#type: u16) -> Option<&'static str> {
10503 let res = match r#type {
10504 1u16 => "State",
10505 2u16 => "Priority",
10506 3u16 => "Cost",
10507 4u16 => "Mode",
10508 5u16 => "Guard",
10509 6u16 => "Protect",
10510 7u16 => "FastLeave",
10511 8u16 => "Learning",
10512 9u16 => "UnicastFlood",
10513 10u16 => "Proxyarp",
10514 11u16 => "LearningSync",
10515 12u16 => "ProxyarpWifi",
10516 13u16 => "RootId",
10517 14u16 => "BridgeId",
10518 15u16 => "DesignatedPort",
10519 16u16 => "DesignatedCost",
10520 17u16 => "Id",
10521 18u16 => "No",
10522 19u16 => "TopologyChangeAck",
10523 20u16 => "ConfigPending",
10524 21u16 => "MessageAgeTimer",
10525 22u16 => "ForwardDelayTimer",
10526 23u16 => "HoldTimer",
10527 24u16 => "Flush",
10528 25u16 => "MulticastRouter",
10529 26u16 => "Pad",
10530 27u16 => "McastFlood",
10531 28u16 => "McastToUcast",
10532 29u16 => "VlanTunnel",
10533 30u16 => "BcastFlood",
10534 31u16 => "GroupFwdMask",
10535 32u16 => "NeighSuppress",
10536 33u16 => "Isolated",
10537 34u16 => "BackupPort",
10538 35u16 => "MrpRingOpen",
10539 36u16 => "MrpInOpen",
10540 37u16 => "McastEhtHostsLimit",
10541 38u16 => "McastEhtHostsCnt",
10542 39u16 => "Locked",
10543 40u16 => "Mab",
10544 41u16 => "McastNGroups",
10545 42u16 => "McastMaxGroups",
10546 43u16 => "NeighVlanSuppress",
10547 44u16 => "BackupNhid",
10548 45u16 => "NeighForwardGrat",
10549 _ => return None,
10550 };
10551 Some(res)
10552 }
10553}
10554#[derive(Clone, Copy, Default)]
10555pub struct IterableLinkinfoBrportAttrs<'a> {
10556 buf: &'a [u8],
10557 pos: usize,
10558 orig_loc: usize,
10559}
10560impl<'a> IterableLinkinfoBrportAttrs<'a> {
10561 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
10562 Self {
10563 buf,
10564 pos: 0,
10565 orig_loc,
10566 }
10567 }
10568 pub fn get_buf(&self) -> &'a [u8] {
10569 self.buf
10570 }
10571}
10572impl<'a> Iterator for IterableLinkinfoBrportAttrs<'a> {
10573 type Item = Result<LinkinfoBrportAttrs<'a>, ErrorContext>;
10574 fn next(&mut self) -> Option<Self::Item> {
10575 let mut pos;
10576 let mut r#type;
10577 loop {
10578 pos = self.pos;
10579 r#type = None;
10580 if self.buf.len() == self.pos {
10581 return None;
10582 }
10583 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
10584 self.pos = self.buf.len();
10585 break;
10586 };
10587 r#type = Some(header.r#type);
10588 let res = match header.r#type {
10589 1u16 => LinkinfoBrportAttrs::State({
10590 let res = parse_u8(next);
10591 let Some(val) = res else { break };
10592 val
10593 }),
10594 2u16 => LinkinfoBrportAttrs::Priority({
10595 let res = parse_u16(next);
10596 let Some(val) = res else { break };
10597 val
10598 }),
10599 3u16 => LinkinfoBrportAttrs::Cost({
10600 let res = parse_u32(next);
10601 let Some(val) = res else { break };
10602 val
10603 }),
10604 4u16 => LinkinfoBrportAttrs::Mode(()),
10605 5u16 => LinkinfoBrportAttrs::Guard(()),
10606 6u16 => LinkinfoBrportAttrs::Protect(()),
10607 7u16 => LinkinfoBrportAttrs::FastLeave(()),
10608 8u16 => LinkinfoBrportAttrs::Learning(()),
10609 9u16 => LinkinfoBrportAttrs::UnicastFlood(()),
10610 10u16 => LinkinfoBrportAttrs::Proxyarp(()),
10611 11u16 => LinkinfoBrportAttrs::LearningSync(()),
10612 12u16 => LinkinfoBrportAttrs::ProxyarpWifi(()),
10613 13u16 => LinkinfoBrportAttrs::RootId({
10614 let res = Some(IflaBridgeId::new_from_zeroed(next));
10615 let Some(val) = res else { break };
10616 val
10617 }),
10618 14u16 => LinkinfoBrportAttrs::BridgeId({
10619 let res = Some(IflaBridgeId::new_from_zeroed(next));
10620 let Some(val) = res else { break };
10621 val
10622 }),
10623 15u16 => LinkinfoBrportAttrs::DesignatedPort({
10624 let res = parse_u16(next);
10625 let Some(val) = res else { break };
10626 val
10627 }),
10628 16u16 => LinkinfoBrportAttrs::DesignatedCost({
10629 let res = parse_u16(next);
10630 let Some(val) = res else { break };
10631 val
10632 }),
10633 17u16 => LinkinfoBrportAttrs::Id({
10634 let res = parse_u16(next);
10635 let Some(val) = res else { break };
10636 val
10637 }),
10638 18u16 => LinkinfoBrportAttrs::No({
10639 let res = parse_u16(next);
10640 let Some(val) = res else { break };
10641 val
10642 }),
10643 19u16 => LinkinfoBrportAttrs::TopologyChangeAck({
10644 let res = parse_u8(next);
10645 let Some(val) = res else { break };
10646 val
10647 }),
10648 20u16 => LinkinfoBrportAttrs::ConfigPending({
10649 let res = parse_u8(next);
10650 let Some(val) = res else { break };
10651 val
10652 }),
10653 21u16 => LinkinfoBrportAttrs::MessageAgeTimer({
10654 let res = parse_u64(next);
10655 let Some(val) = res else { break };
10656 val
10657 }),
10658 22u16 => LinkinfoBrportAttrs::ForwardDelayTimer({
10659 let res = parse_u64(next);
10660 let Some(val) = res else { break };
10661 val
10662 }),
10663 23u16 => LinkinfoBrportAttrs::HoldTimer({
10664 let res = parse_u64(next);
10665 let Some(val) = res else { break };
10666 val
10667 }),
10668 24u16 => LinkinfoBrportAttrs::Flush(()),
10669 25u16 => LinkinfoBrportAttrs::MulticastRouter({
10670 let res = parse_u8(next);
10671 let Some(val) = res else { break };
10672 val
10673 }),
10674 26u16 => LinkinfoBrportAttrs::Pad({
10675 let res = Some(next);
10676 let Some(val) = res else { break };
10677 val
10678 }),
10679 27u16 => LinkinfoBrportAttrs::McastFlood(()),
10680 28u16 => LinkinfoBrportAttrs::McastToUcast(()),
10681 29u16 => LinkinfoBrportAttrs::VlanTunnel(()),
10682 30u16 => LinkinfoBrportAttrs::BcastFlood(()),
10683 31u16 => LinkinfoBrportAttrs::GroupFwdMask({
10684 let res = parse_u16(next);
10685 let Some(val) = res else { break };
10686 val
10687 }),
10688 32u16 => LinkinfoBrportAttrs::NeighSuppress(()),
10689 33u16 => LinkinfoBrportAttrs::Isolated(()),
10690 34u16 => LinkinfoBrportAttrs::BackupPort({
10691 let res = parse_u32(next);
10692 let Some(val) = res else { break };
10693 val
10694 }),
10695 35u16 => LinkinfoBrportAttrs::MrpRingOpen(()),
10696 36u16 => LinkinfoBrportAttrs::MrpInOpen(()),
10697 37u16 => LinkinfoBrportAttrs::McastEhtHostsLimit({
10698 let res = parse_u32(next);
10699 let Some(val) = res else { break };
10700 val
10701 }),
10702 38u16 => LinkinfoBrportAttrs::McastEhtHostsCnt({
10703 let res = parse_u32(next);
10704 let Some(val) = res else { break };
10705 val
10706 }),
10707 39u16 => LinkinfoBrportAttrs::Locked(()),
10708 40u16 => LinkinfoBrportAttrs::Mab(()),
10709 41u16 => LinkinfoBrportAttrs::McastNGroups({
10710 let res = parse_u32(next);
10711 let Some(val) = res else { break };
10712 val
10713 }),
10714 42u16 => LinkinfoBrportAttrs::McastMaxGroups({
10715 let res = parse_u32(next);
10716 let Some(val) = res else { break };
10717 val
10718 }),
10719 43u16 => LinkinfoBrportAttrs::NeighVlanSuppress(()),
10720 44u16 => LinkinfoBrportAttrs::BackupNhid({
10721 let res = parse_u32(next);
10722 let Some(val) = res else { break };
10723 val
10724 }),
10725 45u16 => LinkinfoBrportAttrs::NeighForwardGrat({
10726 let res = parse_u8(next);
10727 let Some(val) = res else { break };
10728 val
10729 }),
10730 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
10731 n => continue,
10732 };
10733 return Some(Ok(res));
10734 }
10735 Some(Err(ErrorContext::new(
10736 "LinkinfoBrportAttrs",
10737 r#type.and_then(|t| LinkinfoBrportAttrs::attr_from_type(t)),
10738 self.orig_loc,
10739 self.buf.as_ptr().wrapping_add(pos) as usize,
10740 )))
10741 }
10742}
10743impl<'a> std::fmt::Debug for IterableLinkinfoBrportAttrs<'_> {
10744 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
10745 let mut fmt = f.debug_struct("LinkinfoBrportAttrs");
10746 for attr in self.clone() {
10747 let attr = match attr {
10748 Ok(a) => a,
10749 Err(err) => {
10750 fmt.finish()?;
10751 f.write_str("Err(")?;
10752 err.fmt(f)?;
10753 return f.write_str(")");
10754 }
10755 };
10756 match attr {
10757 LinkinfoBrportAttrs::State(val) => fmt.field("State", &val),
10758 LinkinfoBrportAttrs::Priority(val) => fmt.field("Priority", &val),
10759 LinkinfoBrportAttrs::Cost(val) => fmt.field("Cost", &val),
10760 LinkinfoBrportAttrs::Mode(val) => fmt.field("Mode", &val),
10761 LinkinfoBrportAttrs::Guard(val) => fmt.field("Guard", &val),
10762 LinkinfoBrportAttrs::Protect(val) => fmt.field("Protect", &val),
10763 LinkinfoBrportAttrs::FastLeave(val) => fmt.field("FastLeave", &val),
10764 LinkinfoBrportAttrs::Learning(val) => fmt.field("Learning", &val),
10765 LinkinfoBrportAttrs::UnicastFlood(val) => fmt.field("UnicastFlood", &val),
10766 LinkinfoBrportAttrs::Proxyarp(val) => fmt.field("Proxyarp", &val),
10767 LinkinfoBrportAttrs::LearningSync(val) => fmt.field("LearningSync", &val),
10768 LinkinfoBrportAttrs::ProxyarpWifi(val) => fmt.field("ProxyarpWifi", &val),
10769 LinkinfoBrportAttrs::RootId(val) => fmt.field("RootId", &val),
10770 LinkinfoBrportAttrs::BridgeId(val) => fmt.field("BridgeId", &val),
10771 LinkinfoBrportAttrs::DesignatedPort(val) => fmt.field("DesignatedPort", &val),
10772 LinkinfoBrportAttrs::DesignatedCost(val) => fmt.field("DesignatedCost", &val),
10773 LinkinfoBrportAttrs::Id(val) => fmt.field("Id", &val),
10774 LinkinfoBrportAttrs::No(val) => fmt.field("No", &val),
10775 LinkinfoBrportAttrs::TopologyChangeAck(val) => fmt.field("TopologyChangeAck", &val),
10776 LinkinfoBrportAttrs::ConfigPending(val) => fmt.field("ConfigPending", &val),
10777 LinkinfoBrportAttrs::MessageAgeTimer(val) => fmt.field("MessageAgeTimer", &val),
10778 LinkinfoBrportAttrs::ForwardDelayTimer(val) => fmt.field("ForwardDelayTimer", &val),
10779 LinkinfoBrportAttrs::HoldTimer(val) => fmt.field("HoldTimer", &val),
10780 LinkinfoBrportAttrs::Flush(val) => fmt.field("Flush", &val),
10781 LinkinfoBrportAttrs::MulticastRouter(val) => fmt.field("MulticastRouter", &val),
10782 LinkinfoBrportAttrs::Pad(val) => fmt.field("Pad", &val),
10783 LinkinfoBrportAttrs::McastFlood(val) => fmt.field("McastFlood", &val),
10784 LinkinfoBrportAttrs::McastToUcast(val) => fmt.field("McastToUcast", &val),
10785 LinkinfoBrportAttrs::VlanTunnel(val) => fmt.field("VlanTunnel", &val),
10786 LinkinfoBrportAttrs::BcastFlood(val) => fmt.field("BcastFlood", &val),
10787 LinkinfoBrportAttrs::GroupFwdMask(val) => fmt.field("GroupFwdMask", &val),
10788 LinkinfoBrportAttrs::NeighSuppress(val) => fmt.field("NeighSuppress", &val),
10789 LinkinfoBrportAttrs::Isolated(val) => fmt.field("Isolated", &val),
10790 LinkinfoBrportAttrs::BackupPort(val) => fmt.field("BackupPort", &val),
10791 LinkinfoBrportAttrs::MrpRingOpen(val) => fmt.field("MrpRingOpen", &val),
10792 LinkinfoBrportAttrs::MrpInOpen(val) => fmt.field("MrpInOpen", &val),
10793 LinkinfoBrportAttrs::McastEhtHostsLimit(val) => {
10794 fmt.field("McastEhtHostsLimit", &val)
10795 }
10796 LinkinfoBrportAttrs::McastEhtHostsCnt(val) => fmt.field("McastEhtHostsCnt", &val),
10797 LinkinfoBrportAttrs::Locked(val) => fmt.field("Locked", &val),
10798 LinkinfoBrportAttrs::Mab(val) => fmt.field("Mab", &val),
10799 LinkinfoBrportAttrs::McastNGroups(val) => fmt.field("McastNGroups", &val),
10800 LinkinfoBrportAttrs::McastMaxGroups(val) => fmt.field("McastMaxGroups", &val),
10801 LinkinfoBrportAttrs::NeighVlanSuppress(val) => fmt.field("NeighVlanSuppress", &val),
10802 LinkinfoBrportAttrs::BackupNhid(val) => fmt.field("BackupNhid", &val),
10803 LinkinfoBrportAttrs::NeighForwardGrat(val) => fmt.field("NeighForwardGrat", &val),
10804 };
10805 }
10806 fmt.finish()
10807 }
10808}
10809impl IterableLinkinfoBrportAttrs<'_> {
10810 pub fn lookup_attr(
10811 &self,
10812 offset: usize,
10813 missing_type: Option<u16>,
10814 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
10815 let mut stack = Vec::new();
10816 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
10817 if missing_type.is_some() && cur == offset {
10818 stack.push(("LinkinfoBrportAttrs", offset));
10819 return (
10820 stack,
10821 missing_type.and_then(|t| LinkinfoBrportAttrs::attr_from_type(t)),
10822 );
10823 }
10824 if cur > offset || cur + self.buf.len() < offset {
10825 return (stack, None);
10826 }
10827 let mut attrs = self.clone();
10828 let mut last_off = cur + attrs.pos;
10829 while let Some(attr) = attrs.next() {
10830 let Ok(attr) = attr else { break };
10831 match attr {
10832 LinkinfoBrportAttrs::State(val) => {
10833 if last_off == offset {
10834 stack.push(("State", last_off));
10835 break;
10836 }
10837 }
10838 LinkinfoBrportAttrs::Priority(val) => {
10839 if last_off == offset {
10840 stack.push(("Priority", last_off));
10841 break;
10842 }
10843 }
10844 LinkinfoBrportAttrs::Cost(val) => {
10845 if last_off == offset {
10846 stack.push(("Cost", last_off));
10847 break;
10848 }
10849 }
10850 LinkinfoBrportAttrs::Mode(val) => {
10851 if last_off == offset {
10852 stack.push(("Mode", last_off));
10853 break;
10854 }
10855 }
10856 LinkinfoBrportAttrs::Guard(val) => {
10857 if last_off == offset {
10858 stack.push(("Guard", last_off));
10859 break;
10860 }
10861 }
10862 LinkinfoBrportAttrs::Protect(val) => {
10863 if last_off == offset {
10864 stack.push(("Protect", last_off));
10865 break;
10866 }
10867 }
10868 LinkinfoBrportAttrs::FastLeave(val) => {
10869 if last_off == offset {
10870 stack.push(("FastLeave", last_off));
10871 break;
10872 }
10873 }
10874 LinkinfoBrportAttrs::Learning(val) => {
10875 if last_off == offset {
10876 stack.push(("Learning", last_off));
10877 break;
10878 }
10879 }
10880 LinkinfoBrportAttrs::UnicastFlood(val) => {
10881 if last_off == offset {
10882 stack.push(("UnicastFlood", last_off));
10883 break;
10884 }
10885 }
10886 LinkinfoBrportAttrs::Proxyarp(val) => {
10887 if last_off == offset {
10888 stack.push(("Proxyarp", last_off));
10889 break;
10890 }
10891 }
10892 LinkinfoBrportAttrs::LearningSync(val) => {
10893 if last_off == offset {
10894 stack.push(("LearningSync", last_off));
10895 break;
10896 }
10897 }
10898 LinkinfoBrportAttrs::ProxyarpWifi(val) => {
10899 if last_off == offset {
10900 stack.push(("ProxyarpWifi", last_off));
10901 break;
10902 }
10903 }
10904 LinkinfoBrportAttrs::RootId(val) => {
10905 if last_off == offset {
10906 stack.push(("RootId", last_off));
10907 break;
10908 }
10909 }
10910 LinkinfoBrportAttrs::BridgeId(val) => {
10911 if last_off == offset {
10912 stack.push(("BridgeId", last_off));
10913 break;
10914 }
10915 }
10916 LinkinfoBrportAttrs::DesignatedPort(val) => {
10917 if last_off == offset {
10918 stack.push(("DesignatedPort", last_off));
10919 break;
10920 }
10921 }
10922 LinkinfoBrportAttrs::DesignatedCost(val) => {
10923 if last_off == offset {
10924 stack.push(("DesignatedCost", last_off));
10925 break;
10926 }
10927 }
10928 LinkinfoBrportAttrs::Id(val) => {
10929 if last_off == offset {
10930 stack.push(("Id", last_off));
10931 break;
10932 }
10933 }
10934 LinkinfoBrportAttrs::No(val) => {
10935 if last_off == offset {
10936 stack.push(("No", last_off));
10937 break;
10938 }
10939 }
10940 LinkinfoBrportAttrs::TopologyChangeAck(val) => {
10941 if last_off == offset {
10942 stack.push(("TopologyChangeAck", last_off));
10943 break;
10944 }
10945 }
10946 LinkinfoBrportAttrs::ConfigPending(val) => {
10947 if last_off == offset {
10948 stack.push(("ConfigPending", last_off));
10949 break;
10950 }
10951 }
10952 LinkinfoBrportAttrs::MessageAgeTimer(val) => {
10953 if last_off == offset {
10954 stack.push(("MessageAgeTimer", last_off));
10955 break;
10956 }
10957 }
10958 LinkinfoBrportAttrs::ForwardDelayTimer(val) => {
10959 if last_off == offset {
10960 stack.push(("ForwardDelayTimer", last_off));
10961 break;
10962 }
10963 }
10964 LinkinfoBrportAttrs::HoldTimer(val) => {
10965 if last_off == offset {
10966 stack.push(("HoldTimer", last_off));
10967 break;
10968 }
10969 }
10970 LinkinfoBrportAttrs::Flush(val) => {
10971 if last_off == offset {
10972 stack.push(("Flush", last_off));
10973 break;
10974 }
10975 }
10976 LinkinfoBrportAttrs::MulticastRouter(val) => {
10977 if last_off == offset {
10978 stack.push(("MulticastRouter", last_off));
10979 break;
10980 }
10981 }
10982 LinkinfoBrportAttrs::Pad(val) => {
10983 if last_off == offset {
10984 stack.push(("Pad", last_off));
10985 break;
10986 }
10987 }
10988 LinkinfoBrportAttrs::McastFlood(val) => {
10989 if last_off == offset {
10990 stack.push(("McastFlood", last_off));
10991 break;
10992 }
10993 }
10994 LinkinfoBrportAttrs::McastToUcast(val) => {
10995 if last_off == offset {
10996 stack.push(("McastToUcast", last_off));
10997 break;
10998 }
10999 }
11000 LinkinfoBrportAttrs::VlanTunnel(val) => {
11001 if last_off == offset {
11002 stack.push(("VlanTunnel", last_off));
11003 break;
11004 }
11005 }
11006 LinkinfoBrportAttrs::BcastFlood(val) => {
11007 if last_off == offset {
11008 stack.push(("BcastFlood", last_off));
11009 break;
11010 }
11011 }
11012 LinkinfoBrportAttrs::GroupFwdMask(val) => {
11013 if last_off == offset {
11014 stack.push(("GroupFwdMask", last_off));
11015 break;
11016 }
11017 }
11018 LinkinfoBrportAttrs::NeighSuppress(val) => {
11019 if last_off == offset {
11020 stack.push(("NeighSuppress", last_off));
11021 break;
11022 }
11023 }
11024 LinkinfoBrportAttrs::Isolated(val) => {
11025 if last_off == offset {
11026 stack.push(("Isolated", last_off));
11027 break;
11028 }
11029 }
11030 LinkinfoBrportAttrs::BackupPort(val) => {
11031 if last_off == offset {
11032 stack.push(("BackupPort", last_off));
11033 break;
11034 }
11035 }
11036 LinkinfoBrportAttrs::MrpRingOpen(val) => {
11037 if last_off == offset {
11038 stack.push(("MrpRingOpen", last_off));
11039 break;
11040 }
11041 }
11042 LinkinfoBrportAttrs::MrpInOpen(val) => {
11043 if last_off == offset {
11044 stack.push(("MrpInOpen", last_off));
11045 break;
11046 }
11047 }
11048 LinkinfoBrportAttrs::McastEhtHostsLimit(val) => {
11049 if last_off == offset {
11050 stack.push(("McastEhtHostsLimit", last_off));
11051 break;
11052 }
11053 }
11054 LinkinfoBrportAttrs::McastEhtHostsCnt(val) => {
11055 if last_off == offset {
11056 stack.push(("McastEhtHostsCnt", last_off));
11057 break;
11058 }
11059 }
11060 LinkinfoBrportAttrs::Locked(val) => {
11061 if last_off == offset {
11062 stack.push(("Locked", last_off));
11063 break;
11064 }
11065 }
11066 LinkinfoBrportAttrs::Mab(val) => {
11067 if last_off == offset {
11068 stack.push(("Mab", last_off));
11069 break;
11070 }
11071 }
11072 LinkinfoBrportAttrs::McastNGroups(val) => {
11073 if last_off == offset {
11074 stack.push(("McastNGroups", last_off));
11075 break;
11076 }
11077 }
11078 LinkinfoBrportAttrs::McastMaxGroups(val) => {
11079 if last_off == offset {
11080 stack.push(("McastMaxGroups", last_off));
11081 break;
11082 }
11083 }
11084 LinkinfoBrportAttrs::NeighVlanSuppress(val) => {
11085 if last_off == offset {
11086 stack.push(("NeighVlanSuppress", last_off));
11087 break;
11088 }
11089 }
11090 LinkinfoBrportAttrs::BackupNhid(val) => {
11091 if last_off == offset {
11092 stack.push(("BackupNhid", last_off));
11093 break;
11094 }
11095 }
11096 LinkinfoBrportAttrs::NeighForwardGrat(val) => {
11097 if last_off == offset {
11098 stack.push(("NeighForwardGrat", last_off));
11099 break;
11100 }
11101 }
11102 _ => {}
11103 };
11104 last_off = cur + attrs.pos;
11105 }
11106 if !stack.is_empty() {
11107 stack.push(("LinkinfoBrportAttrs", cur));
11108 }
11109 (stack, None)
11110 }
11111}
11112#[derive(Clone)]
11113pub enum LinkinfoGreAttrs {
11114 Link(u32),
11115 Iflags(u16),
11116 Oflags(u16),
11117 Ikey(u32),
11118 Okey(u32),
11119 Local(std::net::IpAddr),
11120 Remote(std::net::IpAddr),
11121 Ttl(u8),
11122 Tos(u8),
11123 Pmtudisc(u8),
11124 EncapLimit(u8),
11125 Flowinfo(u32),
11126 Flags(u32),
11127 EncapType(u16),
11128 EncapFlags(u16),
11129 EncapSport(u16),
11130 EncapDport(u16),
11131 CollectMetadata(()),
11132 IgnoreDf(u8),
11133 Fwmark(u32),
11134 ErspanIndex(u32),
11135 ErspanVer(u8),
11136 ErspanDir(u8),
11137 ErspanHwid(u16),
11138}
11139impl<'a> IterableLinkinfoGreAttrs<'a> {
11140 pub fn get_link(&self) -> Result<u32, ErrorContext> {
11141 let mut iter = self.clone();
11142 iter.pos = 0;
11143 for attr in iter {
11144 if let Ok(LinkinfoGreAttrs::Link(val)) = attr {
11145 return Ok(val);
11146 }
11147 }
11148 Err(ErrorContext::new_missing(
11149 "LinkinfoGreAttrs",
11150 "Link",
11151 self.orig_loc,
11152 self.buf.as_ptr() as usize,
11153 ))
11154 }
11155 pub fn get_iflags(&self) -> Result<u16, ErrorContext> {
11156 let mut iter = self.clone();
11157 iter.pos = 0;
11158 for attr in iter {
11159 if let Ok(LinkinfoGreAttrs::Iflags(val)) = attr {
11160 return Ok(val);
11161 }
11162 }
11163 Err(ErrorContext::new_missing(
11164 "LinkinfoGreAttrs",
11165 "Iflags",
11166 self.orig_loc,
11167 self.buf.as_ptr() as usize,
11168 ))
11169 }
11170 pub fn get_oflags(&self) -> Result<u16, ErrorContext> {
11171 let mut iter = self.clone();
11172 iter.pos = 0;
11173 for attr in iter {
11174 if let Ok(LinkinfoGreAttrs::Oflags(val)) = attr {
11175 return Ok(val);
11176 }
11177 }
11178 Err(ErrorContext::new_missing(
11179 "LinkinfoGreAttrs",
11180 "Oflags",
11181 self.orig_loc,
11182 self.buf.as_ptr() as usize,
11183 ))
11184 }
11185 pub fn get_ikey(&self) -> Result<u32, ErrorContext> {
11186 let mut iter = self.clone();
11187 iter.pos = 0;
11188 for attr in iter {
11189 if let Ok(LinkinfoGreAttrs::Ikey(val)) = attr {
11190 return Ok(val);
11191 }
11192 }
11193 Err(ErrorContext::new_missing(
11194 "LinkinfoGreAttrs",
11195 "Ikey",
11196 self.orig_loc,
11197 self.buf.as_ptr() as usize,
11198 ))
11199 }
11200 pub fn get_okey(&self) -> Result<u32, ErrorContext> {
11201 let mut iter = self.clone();
11202 iter.pos = 0;
11203 for attr in iter {
11204 if let Ok(LinkinfoGreAttrs::Okey(val)) = attr {
11205 return Ok(val);
11206 }
11207 }
11208 Err(ErrorContext::new_missing(
11209 "LinkinfoGreAttrs",
11210 "Okey",
11211 self.orig_loc,
11212 self.buf.as_ptr() as usize,
11213 ))
11214 }
11215 pub fn get_local(&self) -> Result<std::net::IpAddr, ErrorContext> {
11216 let mut iter = self.clone();
11217 iter.pos = 0;
11218 for attr in iter {
11219 if let Ok(LinkinfoGreAttrs::Local(val)) = attr {
11220 return Ok(val);
11221 }
11222 }
11223 Err(ErrorContext::new_missing(
11224 "LinkinfoGreAttrs",
11225 "Local",
11226 self.orig_loc,
11227 self.buf.as_ptr() as usize,
11228 ))
11229 }
11230 pub fn get_remote(&self) -> Result<std::net::IpAddr, ErrorContext> {
11231 let mut iter = self.clone();
11232 iter.pos = 0;
11233 for attr in iter {
11234 if let Ok(LinkinfoGreAttrs::Remote(val)) = attr {
11235 return Ok(val);
11236 }
11237 }
11238 Err(ErrorContext::new_missing(
11239 "LinkinfoGreAttrs",
11240 "Remote",
11241 self.orig_loc,
11242 self.buf.as_ptr() as usize,
11243 ))
11244 }
11245 pub fn get_ttl(&self) -> Result<u8, ErrorContext> {
11246 let mut iter = self.clone();
11247 iter.pos = 0;
11248 for attr in iter {
11249 if let Ok(LinkinfoGreAttrs::Ttl(val)) = attr {
11250 return Ok(val);
11251 }
11252 }
11253 Err(ErrorContext::new_missing(
11254 "LinkinfoGreAttrs",
11255 "Ttl",
11256 self.orig_loc,
11257 self.buf.as_ptr() as usize,
11258 ))
11259 }
11260 pub fn get_tos(&self) -> Result<u8, ErrorContext> {
11261 let mut iter = self.clone();
11262 iter.pos = 0;
11263 for attr in iter {
11264 if let Ok(LinkinfoGreAttrs::Tos(val)) = attr {
11265 return Ok(val);
11266 }
11267 }
11268 Err(ErrorContext::new_missing(
11269 "LinkinfoGreAttrs",
11270 "Tos",
11271 self.orig_loc,
11272 self.buf.as_ptr() as usize,
11273 ))
11274 }
11275 pub fn get_pmtudisc(&self) -> Result<u8, ErrorContext> {
11276 let mut iter = self.clone();
11277 iter.pos = 0;
11278 for attr in iter {
11279 if let Ok(LinkinfoGreAttrs::Pmtudisc(val)) = attr {
11280 return Ok(val);
11281 }
11282 }
11283 Err(ErrorContext::new_missing(
11284 "LinkinfoGreAttrs",
11285 "Pmtudisc",
11286 self.orig_loc,
11287 self.buf.as_ptr() as usize,
11288 ))
11289 }
11290 pub fn get_encap_limit(&self) -> Result<u8, ErrorContext> {
11291 let mut iter = self.clone();
11292 iter.pos = 0;
11293 for attr in iter {
11294 if let Ok(LinkinfoGreAttrs::EncapLimit(val)) = attr {
11295 return Ok(val);
11296 }
11297 }
11298 Err(ErrorContext::new_missing(
11299 "LinkinfoGreAttrs",
11300 "EncapLimit",
11301 self.orig_loc,
11302 self.buf.as_ptr() as usize,
11303 ))
11304 }
11305 pub fn get_flowinfo(&self) -> Result<u32, ErrorContext> {
11306 let mut iter = self.clone();
11307 iter.pos = 0;
11308 for attr in iter {
11309 if let Ok(LinkinfoGreAttrs::Flowinfo(val)) = attr {
11310 return Ok(val);
11311 }
11312 }
11313 Err(ErrorContext::new_missing(
11314 "LinkinfoGreAttrs",
11315 "Flowinfo",
11316 self.orig_loc,
11317 self.buf.as_ptr() as usize,
11318 ))
11319 }
11320 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
11321 let mut iter = self.clone();
11322 iter.pos = 0;
11323 for attr in iter {
11324 if let Ok(LinkinfoGreAttrs::Flags(val)) = attr {
11325 return Ok(val);
11326 }
11327 }
11328 Err(ErrorContext::new_missing(
11329 "LinkinfoGreAttrs",
11330 "Flags",
11331 self.orig_loc,
11332 self.buf.as_ptr() as usize,
11333 ))
11334 }
11335 pub fn get_encap_type(&self) -> Result<u16, ErrorContext> {
11336 let mut iter = self.clone();
11337 iter.pos = 0;
11338 for attr in iter {
11339 if let Ok(LinkinfoGreAttrs::EncapType(val)) = attr {
11340 return Ok(val);
11341 }
11342 }
11343 Err(ErrorContext::new_missing(
11344 "LinkinfoGreAttrs",
11345 "EncapType",
11346 self.orig_loc,
11347 self.buf.as_ptr() as usize,
11348 ))
11349 }
11350 pub fn get_encap_flags(&self) -> Result<u16, ErrorContext> {
11351 let mut iter = self.clone();
11352 iter.pos = 0;
11353 for attr in iter {
11354 if let Ok(LinkinfoGreAttrs::EncapFlags(val)) = attr {
11355 return Ok(val);
11356 }
11357 }
11358 Err(ErrorContext::new_missing(
11359 "LinkinfoGreAttrs",
11360 "EncapFlags",
11361 self.orig_loc,
11362 self.buf.as_ptr() as usize,
11363 ))
11364 }
11365 pub fn get_encap_sport(&self) -> Result<u16, ErrorContext> {
11366 let mut iter = self.clone();
11367 iter.pos = 0;
11368 for attr in iter {
11369 if let Ok(LinkinfoGreAttrs::EncapSport(val)) = attr {
11370 return Ok(val);
11371 }
11372 }
11373 Err(ErrorContext::new_missing(
11374 "LinkinfoGreAttrs",
11375 "EncapSport",
11376 self.orig_loc,
11377 self.buf.as_ptr() as usize,
11378 ))
11379 }
11380 pub fn get_encap_dport(&self) -> Result<u16, ErrorContext> {
11381 let mut iter = self.clone();
11382 iter.pos = 0;
11383 for attr in iter {
11384 if let Ok(LinkinfoGreAttrs::EncapDport(val)) = attr {
11385 return Ok(val);
11386 }
11387 }
11388 Err(ErrorContext::new_missing(
11389 "LinkinfoGreAttrs",
11390 "EncapDport",
11391 self.orig_loc,
11392 self.buf.as_ptr() as usize,
11393 ))
11394 }
11395 pub fn get_collect_metadata(&self) -> Result<(), ErrorContext> {
11396 let mut iter = self.clone();
11397 iter.pos = 0;
11398 for attr in iter {
11399 if let Ok(LinkinfoGreAttrs::CollectMetadata(val)) = attr {
11400 return Ok(val);
11401 }
11402 }
11403 Err(ErrorContext::new_missing(
11404 "LinkinfoGreAttrs",
11405 "CollectMetadata",
11406 self.orig_loc,
11407 self.buf.as_ptr() as usize,
11408 ))
11409 }
11410 pub fn get_ignore_df(&self) -> Result<u8, ErrorContext> {
11411 let mut iter = self.clone();
11412 iter.pos = 0;
11413 for attr in iter {
11414 if let Ok(LinkinfoGreAttrs::IgnoreDf(val)) = attr {
11415 return Ok(val);
11416 }
11417 }
11418 Err(ErrorContext::new_missing(
11419 "LinkinfoGreAttrs",
11420 "IgnoreDf",
11421 self.orig_loc,
11422 self.buf.as_ptr() as usize,
11423 ))
11424 }
11425 pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
11426 let mut iter = self.clone();
11427 iter.pos = 0;
11428 for attr in iter {
11429 if let Ok(LinkinfoGreAttrs::Fwmark(val)) = attr {
11430 return Ok(val);
11431 }
11432 }
11433 Err(ErrorContext::new_missing(
11434 "LinkinfoGreAttrs",
11435 "Fwmark",
11436 self.orig_loc,
11437 self.buf.as_ptr() as usize,
11438 ))
11439 }
11440 pub fn get_erspan_index(&self) -> Result<u32, ErrorContext> {
11441 let mut iter = self.clone();
11442 iter.pos = 0;
11443 for attr in iter {
11444 if let Ok(LinkinfoGreAttrs::ErspanIndex(val)) = attr {
11445 return Ok(val);
11446 }
11447 }
11448 Err(ErrorContext::new_missing(
11449 "LinkinfoGreAttrs",
11450 "ErspanIndex",
11451 self.orig_loc,
11452 self.buf.as_ptr() as usize,
11453 ))
11454 }
11455 pub fn get_erspan_ver(&self) -> Result<u8, ErrorContext> {
11456 let mut iter = self.clone();
11457 iter.pos = 0;
11458 for attr in iter {
11459 if let Ok(LinkinfoGreAttrs::ErspanVer(val)) = attr {
11460 return Ok(val);
11461 }
11462 }
11463 Err(ErrorContext::new_missing(
11464 "LinkinfoGreAttrs",
11465 "ErspanVer",
11466 self.orig_loc,
11467 self.buf.as_ptr() as usize,
11468 ))
11469 }
11470 pub fn get_erspan_dir(&self) -> Result<u8, ErrorContext> {
11471 let mut iter = self.clone();
11472 iter.pos = 0;
11473 for attr in iter {
11474 if let Ok(LinkinfoGreAttrs::ErspanDir(val)) = attr {
11475 return Ok(val);
11476 }
11477 }
11478 Err(ErrorContext::new_missing(
11479 "LinkinfoGreAttrs",
11480 "ErspanDir",
11481 self.orig_loc,
11482 self.buf.as_ptr() as usize,
11483 ))
11484 }
11485 pub fn get_erspan_hwid(&self) -> Result<u16, ErrorContext> {
11486 let mut iter = self.clone();
11487 iter.pos = 0;
11488 for attr in iter {
11489 if let Ok(LinkinfoGreAttrs::ErspanHwid(val)) = attr {
11490 return Ok(val);
11491 }
11492 }
11493 Err(ErrorContext::new_missing(
11494 "LinkinfoGreAttrs",
11495 "ErspanHwid",
11496 self.orig_loc,
11497 self.buf.as_ptr() as usize,
11498 ))
11499 }
11500}
11501impl LinkinfoGreAttrs {
11502 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoGreAttrs<'a> {
11503 IterableLinkinfoGreAttrs::with_loc(buf, buf.as_ptr() as usize)
11504 }
11505 fn attr_from_type(r#type: u16) -> Option<&'static str> {
11506 let res = match r#type {
11507 1u16 => "Link",
11508 2u16 => "Iflags",
11509 3u16 => "Oflags",
11510 4u16 => "Ikey",
11511 5u16 => "Okey",
11512 6u16 => "Local",
11513 7u16 => "Remote",
11514 8u16 => "Ttl",
11515 9u16 => "Tos",
11516 10u16 => "Pmtudisc",
11517 11u16 => "EncapLimit",
11518 12u16 => "Flowinfo",
11519 13u16 => "Flags",
11520 14u16 => "EncapType",
11521 15u16 => "EncapFlags",
11522 16u16 => "EncapSport",
11523 17u16 => "EncapDport",
11524 18u16 => "CollectMetadata",
11525 19u16 => "IgnoreDf",
11526 20u16 => "Fwmark",
11527 21u16 => "ErspanIndex",
11528 22u16 => "ErspanVer",
11529 23u16 => "ErspanDir",
11530 24u16 => "ErspanHwid",
11531 _ => return None,
11532 };
11533 Some(res)
11534 }
11535}
11536#[derive(Clone, Copy, Default)]
11537pub struct IterableLinkinfoGreAttrs<'a> {
11538 buf: &'a [u8],
11539 pos: usize,
11540 orig_loc: usize,
11541}
11542impl<'a> IterableLinkinfoGreAttrs<'a> {
11543 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
11544 Self {
11545 buf,
11546 pos: 0,
11547 orig_loc,
11548 }
11549 }
11550 pub fn get_buf(&self) -> &'a [u8] {
11551 self.buf
11552 }
11553}
11554impl<'a> Iterator for IterableLinkinfoGreAttrs<'a> {
11555 type Item = Result<LinkinfoGreAttrs, ErrorContext>;
11556 fn next(&mut self) -> Option<Self::Item> {
11557 let mut pos;
11558 let mut r#type;
11559 loop {
11560 pos = self.pos;
11561 r#type = None;
11562 if self.buf.len() == self.pos {
11563 return None;
11564 }
11565 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
11566 self.pos = self.buf.len();
11567 break;
11568 };
11569 r#type = Some(header.r#type);
11570 let res = match header.r#type {
11571 1u16 => LinkinfoGreAttrs::Link({
11572 let res = parse_u32(next);
11573 let Some(val) = res else { break };
11574 val
11575 }),
11576 2u16 => LinkinfoGreAttrs::Iflags({
11577 let res = parse_be_u16(next);
11578 let Some(val) = res else { break };
11579 val
11580 }),
11581 3u16 => LinkinfoGreAttrs::Oflags({
11582 let res = parse_be_u16(next);
11583 let Some(val) = res else { break };
11584 val
11585 }),
11586 4u16 => LinkinfoGreAttrs::Ikey({
11587 let res = parse_be_u32(next);
11588 let Some(val) = res else { break };
11589 val
11590 }),
11591 5u16 => LinkinfoGreAttrs::Okey({
11592 let res = parse_be_u32(next);
11593 let Some(val) = res else { break };
11594 val
11595 }),
11596 6u16 => LinkinfoGreAttrs::Local({
11597 let res = parse_ip(next);
11598 let Some(val) = res else { break };
11599 val
11600 }),
11601 7u16 => LinkinfoGreAttrs::Remote({
11602 let res = parse_ip(next);
11603 let Some(val) = res else { break };
11604 val
11605 }),
11606 8u16 => LinkinfoGreAttrs::Ttl({
11607 let res = parse_u8(next);
11608 let Some(val) = res else { break };
11609 val
11610 }),
11611 9u16 => LinkinfoGreAttrs::Tos({
11612 let res = parse_u8(next);
11613 let Some(val) = res else { break };
11614 val
11615 }),
11616 10u16 => LinkinfoGreAttrs::Pmtudisc({
11617 let res = parse_u8(next);
11618 let Some(val) = res else { break };
11619 val
11620 }),
11621 11u16 => LinkinfoGreAttrs::EncapLimit({
11622 let res = parse_u8(next);
11623 let Some(val) = res else { break };
11624 val
11625 }),
11626 12u16 => LinkinfoGreAttrs::Flowinfo({
11627 let res = parse_be_u32(next);
11628 let Some(val) = res else { break };
11629 val
11630 }),
11631 13u16 => LinkinfoGreAttrs::Flags({
11632 let res = parse_u32(next);
11633 let Some(val) = res else { break };
11634 val
11635 }),
11636 14u16 => LinkinfoGreAttrs::EncapType({
11637 let res = parse_u16(next);
11638 let Some(val) = res else { break };
11639 val
11640 }),
11641 15u16 => LinkinfoGreAttrs::EncapFlags({
11642 let res = parse_u16(next);
11643 let Some(val) = res else { break };
11644 val
11645 }),
11646 16u16 => LinkinfoGreAttrs::EncapSport({
11647 let res = parse_be_u16(next);
11648 let Some(val) = res else { break };
11649 val
11650 }),
11651 17u16 => LinkinfoGreAttrs::EncapDport({
11652 let res = parse_be_u16(next);
11653 let Some(val) = res else { break };
11654 val
11655 }),
11656 18u16 => LinkinfoGreAttrs::CollectMetadata(()),
11657 19u16 => LinkinfoGreAttrs::IgnoreDf({
11658 let res = parse_u8(next);
11659 let Some(val) = res else { break };
11660 val
11661 }),
11662 20u16 => LinkinfoGreAttrs::Fwmark({
11663 let res = parse_u32(next);
11664 let Some(val) = res else { break };
11665 val
11666 }),
11667 21u16 => LinkinfoGreAttrs::ErspanIndex({
11668 let res = parse_u32(next);
11669 let Some(val) = res else { break };
11670 val
11671 }),
11672 22u16 => LinkinfoGreAttrs::ErspanVer({
11673 let res = parse_u8(next);
11674 let Some(val) = res else { break };
11675 val
11676 }),
11677 23u16 => LinkinfoGreAttrs::ErspanDir({
11678 let res = parse_u8(next);
11679 let Some(val) = res else { break };
11680 val
11681 }),
11682 24u16 => LinkinfoGreAttrs::ErspanHwid({
11683 let res = parse_u16(next);
11684 let Some(val) = res else { break };
11685 val
11686 }),
11687 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
11688 n => continue,
11689 };
11690 return Some(Ok(res));
11691 }
11692 Some(Err(ErrorContext::new(
11693 "LinkinfoGreAttrs",
11694 r#type.and_then(|t| LinkinfoGreAttrs::attr_from_type(t)),
11695 self.orig_loc,
11696 self.buf.as_ptr().wrapping_add(pos) as usize,
11697 )))
11698 }
11699}
11700impl std::fmt::Debug for IterableLinkinfoGreAttrs<'_> {
11701 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
11702 let mut fmt = f.debug_struct("LinkinfoGreAttrs");
11703 for attr in self.clone() {
11704 let attr = match attr {
11705 Ok(a) => a,
11706 Err(err) => {
11707 fmt.finish()?;
11708 f.write_str("Err(")?;
11709 err.fmt(f)?;
11710 return f.write_str(")");
11711 }
11712 };
11713 match attr {
11714 LinkinfoGreAttrs::Link(val) => fmt.field("Link", &val),
11715 LinkinfoGreAttrs::Iflags(val) => fmt.field("Iflags", &val),
11716 LinkinfoGreAttrs::Oflags(val) => fmt.field("Oflags", &val),
11717 LinkinfoGreAttrs::Ikey(val) => fmt.field("Ikey", &val),
11718 LinkinfoGreAttrs::Okey(val) => fmt.field("Okey", &val),
11719 LinkinfoGreAttrs::Local(val) => fmt.field("Local", &val),
11720 LinkinfoGreAttrs::Remote(val) => fmt.field("Remote", &val),
11721 LinkinfoGreAttrs::Ttl(val) => fmt.field("Ttl", &val),
11722 LinkinfoGreAttrs::Tos(val) => fmt.field("Tos", &val),
11723 LinkinfoGreAttrs::Pmtudisc(val) => fmt.field("Pmtudisc", &val),
11724 LinkinfoGreAttrs::EncapLimit(val) => fmt.field("EncapLimit", &val),
11725 LinkinfoGreAttrs::Flowinfo(val) => fmt.field("Flowinfo", &val),
11726 LinkinfoGreAttrs::Flags(val) => fmt.field("Flags", &val),
11727 LinkinfoGreAttrs::EncapType(val) => fmt.field("EncapType", &val),
11728 LinkinfoGreAttrs::EncapFlags(val) => fmt.field("EncapFlags", &val),
11729 LinkinfoGreAttrs::EncapSport(val) => fmt.field("EncapSport", &val),
11730 LinkinfoGreAttrs::EncapDport(val) => fmt.field("EncapDport", &val),
11731 LinkinfoGreAttrs::CollectMetadata(val) => fmt.field("CollectMetadata", &val),
11732 LinkinfoGreAttrs::IgnoreDf(val) => fmt.field("IgnoreDf", &val),
11733 LinkinfoGreAttrs::Fwmark(val) => fmt.field("Fwmark", &val),
11734 LinkinfoGreAttrs::ErspanIndex(val) => fmt.field("ErspanIndex", &val),
11735 LinkinfoGreAttrs::ErspanVer(val) => fmt.field("ErspanVer", &val),
11736 LinkinfoGreAttrs::ErspanDir(val) => fmt.field("ErspanDir", &val),
11737 LinkinfoGreAttrs::ErspanHwid(val) => fmt.field("ErspanHwid", &val),
11738 };
11739 }
11740 fmt.finish()
11741 }
11742}
11743impl IterableLinkinfoGreAttrs<'_> {
11744 pub fn lookup_attr(
11745 &self,
11746 offset: usize,
11747 missing_type: Option<u16>,
11748 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
11749 let mut stack = Vec::new();
11750 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
11751 if missing_type.is_some() && cur == offset {
11752 stack.push(("LinkinfoGreAttrs", offset));
11753 return (
11754 stack,
11755 missing_type.and_then(|t| LinkinfoGreAttrs::attr_from_type(t)),
11756 );
11757 }
11758 if cur > offset || cur + self.buf.len() < offset {
11759 return (stack, None);
11760 }
11761 let mut attrs = self.clone();
11762 let mut last_off = cur + attrs.pos;
11763 while let Some(attr) = attrs.next() {
11764 let Ok(attr) = attr else { break };
11765 match attr {
11766 LinkinfoGreAttrs::Link(val) => {
11767 if last_off == offset {
11768 stack.push(("Link", last_off));
11769 break;
11770 }
11771 }
11772 LinkinfoGreAttrs::Iflags(val) => {
11773 if last_off == offset {
11774 stack.push(("Iflags", last_off));
11775 break;
11776 }
11777 }
11778 LinkinfoGreAttrs::Oflags(val) => {
11779 if last_off == offset {
11780 stack.push(("Oflags", last_off));
11781 break;
11782 }
11783 }
11784 LinkinfoGreAttrs::Ikey(val) => {
11785 if last_off == offset {
11786 stack.push(("Ikey", last_off));
11787 break;
11788 }
11789 }
11790 LinkinfoGreAttrs::Okey(val) => {
11791 if last_off == offset {
11792 stack.push(("Okey", last_off));
11793 break;
11794 }
11795 }
11796 LinkinfoGreAttrs::Local(val) => {
11797 if last_off == offset {
11798 stack.push(("Local", last_off));
11799 break;
11800 }
11801 }
11802 LinkinfoGreAttrs::Remote(val) => {
11803 if last_off == offset {
11804 stack.push(("Remote", last_off));
11805 break;
11806 }
11807 }
11808 LinkinfoGreAttrs::Ttl(val) => {
11809 if last_off == offset {
11810 stack.push(("Ttl", last_off));
11811 break;
11812 }
11813 }
11814 LinkinfoGreAttrs::Tos(val) => {
11815 if last_off == offset {
11816 stack.push(("Tos", last_off));
11817 break;
11818 }
11819 }
11820 LinkinfoGreAttrs::Pmtudisc(val) => {
11821 if last_off == offset {
11822 stack.push(("Pmtudisc", last_off));
11823 break;
11824 }
11825 }
11826 LinkinfoGreAttrs::EncapLimit(val) => {
11827 if last_off == offset {
11828 stack.push(("EncapLimit", last_off));
11829 break;
11830 }
11831 }
11832 LinkinfoGreAttrs::Flowinfo(val) => {
11833 if last_off == offset {
11834 stack.push(("Flowinfo", last_off));
11835 break;
11836 }
11837 }
11838 LinkinfoGreAttrs::Flags(val) => {
11839 if last_off == offset {
11840 stack.push(("Flags", last_off));
11841 break;
11842 }
11843 }
11844 LinkinfoGreAttrs::EncapType(val) => {
11845 if last_off == offset {
11846 stack.push(("EncapType", last_off));
11847 break;
11848 }
11849 }
11850 LinkinfoGreAttrs::EncapFlags(val) => {
11851 if last_off == offset {
11852 stack.push(("EncapFlags", last_off));
11853 break;
11854 }
11855 }
11856 LinkinfoGreAttrs::EncapSport(val) => {
11857 if last_off == offset {
11858 stack.push(("EncapSport", last_off));
11859 break;
11860 }
11861 }
11862 LinkinfoGreAttrs::EncapDport(val) => {
11863 if last_off == offset {
11864 stack.push(("EncapDport", last_off));
11865 break;
11866 }
11867 }
11868 LinkinfoGreAttrs::CollectMetadata(val) => {
11869 if last_off == offset {
11870 stack.push(("CollectMetadata", last_off));
11871 break;
11872 }
11873 }
11874 LinkinfoGreAttrs::IgnoreDf(val) => {
11875 if last_off == offset {
11876 stack.push(("IgnoreDf", last_off));
11877 break;
11878 }
11879 }
11880 LinkinfoGreAttrs::Fwmark(val) => {
11881 if last_off == offset {
11882 stack.push(("Fwmark", last_off));
11883 break;
11884 }
11885 }
11886 LinkinfoGreAttrs::ErspanIndex(val) => {
11887 if last_off == offset {
11888 stack.push(("ErspanIndex", last_off));
11889 break;
11890 }
11891 }
11892 LinkinfoGreAttrs::ErspanVer(val) => {
11893 if last_off == offset {
11894 stack.push(("ErspanVer", last_off));
11895 break;
11896 }
11897 }
11898 LinkinfoGreAttrs::ErspanDir(val) => {
11899 if last_off == offset {
11900 stack.push(("ErspanDir", last_off));
11901 break;
11902 }
11903 }
11904 LinkinfoGreAttrs::ErspanHwid(val) => {
11905 if last_off == offset {
11906 stack.push(("ErspanHwid", last_off));
11907 break;
11908 }
11909 }
11910 _ => {}
11911 };
11912 last_off = cur + attrs.pos;
11913 }
11914 if !stack.is_empty() {
11915 stack.push(("LinkinfoGreAttrs", cur));
11916 }
11917 (stack, None)
11918 }
11919}
11920#[derive(Clone)]
11921pub enum LinkinfoGre6Attrs<'a> {
11922 Link(u32),
11923 Iflags(u16),
11924 Oflags(u16),
11925 Ikey(u32),
11926 Okey(u32),
11927 Local(&'a [u8]),
11928 Remote(&'a [u8]),
11929 Ttl(u8),
11930 EncapLimit(u8),
11931 Flowinfo(u32),
11932 Flags(u32),
11933 EncapType(u16),
11934 EncapFlags(u16),
11935 EncapSport(u16),
11936 EncapDport(u16),
11937 CollectMetadata(()),
11938 Fwmark(u32),
11939 ErspanIndex(u32),
11940 ErspanVer(u8),
11941 ErspanDir(u8),
11942 ErspanHwid(u16),
11943}
11944impl<'a> IterableLinkinfoGre6Attrs<'a> {
11945 pub fn get_link(&self) -> Result<u32, ErrorContext> {
11946 let mut iter = self.clone();
11947 iter.pos = 0;
11948 for attr in iter {
11949 if let Ok(LinkinfoGre6Attrs::Link(val)) = attr {
11950 return Ok(val);
11951 }
11952 }
11953 Err(ErrorContext::new_missing(
11954 "LinkinfoGre6Attrs",
11955 "Link",
11956 self.orig_loc,
11957 self.buf.as_ptr() as usize,
11958 ))
11959 }
11960 pub fn get_iflags(&self) -> Result<u16, ErrorContext> {
11961 let mut iter = self.clone();
11962 iter.pos = 0;
11963 for attr in iter {
11964 if let Ok(LinkinfoGre6Attrs::Iflags(val)) = attr {
11965 return Ok(val);
11966 }
11967 }
11968 Err(ErrorContext::new_missing(
11969 "LinkinfoGre6Attrs",
11970 "Iflags",
11971 self.orig_loc,
11972 self.buf.as_ptr() as usize,
11973 ))
11974 }
11975 pub fn get_oflags(&self) -> Result<u16, ErrorContext> {
11976 let mut iter = self.clone();
11977 iter.pos = 0;
11978 for attr in iter {
11979 if let Ok(LinkinfoGre6Attrs::Oflags(val)) = attr {
11980 return Ok(val);
11981 }
11982 }
11983 Err(ErrorContext::new_missing(
11984 "LinkinfoGre6Attrs",
11985 "Oflags",
11986 self.orig_loc,
11987 self.buf.as_ptr() as usize,
11988 ))
11989 }
11990 pub fn get_ikey(&self) -> Result<u32, ErrorContext> {
11991 let mut iter = self.clone();
11992 iter.pos = 0;
11993 for attr in iter {
11994 if let Ok(LinkinfoGre6Attrs::Ikey(val)) = attr {
11995 return Ok(val);
11996 }
11997 }
11998 Err(ErrorContext::new_missing(
11999 "LinkinfoGre6Attrs",
12000 "Ikey",
12001 self.orig_loc,
12002 self.buf.as_ptr() as usize,
12003 ))
12004 }
12005 pub fn get_okey(&self) -> Result<u32, ErrorContext> {
12006 let mut iter = self.clone();
12007 iter.pos = 0;
12008 for attr in iter {
12009 if let Ok(LinkinfoGre6Attrs::Okey(val)) = attr {
12010 return Ok(val);
12011 }
12012 }
12013 Err(ErrorContext::new_missing(
12014 "LinkinfoGre6Attrs",
12015 "Okey",
12016 self.orig_loc,
12017 self.buf.as_ptr() as usize,
12018 ))
12019 }
12020 pub fn get_local(&self) -> Result<&'a [u8], ErrorContext> {
12021 let mut iter = self.clone();
12022 iter.pos = 0;
12023 for attr in iter {
12024 if let Ok(LinkinfoGre6Attrs::Local(val)) = attr {
12025 return Ok(val);
12026 }
12027 }
12028 Err(ErrorContext::new_missing(
12029 "LinkinfoGre6Attrs",
12030 "Local",
12031 self.orig_loc,
12032 self.buf.as_ptr() as usize,
12033 ))
12034 }
12035 pub fn get_remote(&self) -> Result<&'a [u8], ErrorContext> {
12036 let mut iter = self.clone();
12037 iter.pos = 0;
12038 for attr in iter {
12039 if let Ok(LinkinfoGre6Attrs::Remote(val)) = attr {
12040 return Ok(val);
12041 }
12042 }
12043 Err(ErrorContext::new_missing(
12044 "LinkinfoGre6Attrs",
12045 "Remote",
12046 self.orig_loc,
12047 self.buf.as_ptr() as usize,
12048 ))
12049 }
12050 pub fn get_ttl(&self) -> Result<u8, ErrorContext> {
12051 let mut iter = self.clone();
12052 iter.pos = 0;
12053 for attr in iter {
12054 if let Ok(LinkinfoGre6Attrs::Ttl(val)) = attr {
12055 return Ok(val);
12056 }
12057 }
12058 Err(ErrorContext::new_missing(
12059 "LinkinfoGre6Attrs",
12060 "Ttl",
12061 self.orig_loc,
12062 self.buf.as_ptr() as usize,
12063 ))
12064 }
12065 pub fn get_encap_limit(&self) -> Result<u8, ErrorContext> {
12066 let mut iter = self.clone();
12067 iter.pos = 0;
12068 for attr in iter {
12069 if let Ok(LinkinfoGre6Attrs::EncapLimit(val)) = attr {
12070 return Ok(val);
12071 }
12072 }
12073 Err(ErrorContext::new_missing(
12074 "LinkinfoGre6Attrs",
12075 "EncapLimit",
12076 self.orig_loc,
12077 self.buf.as_ptr() as usize,
12078 ))
12079 }
12080 pub fn get_flowinfo(&self) -> Result<u32, ErrorContext> {
12081 let mut iter = self.clone();
12082 iter.pos = 0;
12083 for attr in iter {
12084 if let Ok(LinkinfoGre6Attrs::Flowinfo(val)) = attr {
12085 return Ok(val);
12086 }
12087 }
12088 Err(ErrorContext::new_missing(
12089 "LinkinfoGre6Attrs",
12090 "Flowinfo",
12091 self.orig_loc,
12092 self.buf.as_ptr() as usize,
12093 ))
12094 }
12095 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
12096 let mut iter = self.clone();
12097 iter.pos = 0;
12098 for attr in iter {
12099 if let Ok(LinkinfoGre6Attrs::Flags(val)) = attr {
12100 return Ok(val);
12101 }
12102 }
12103 Err(ErrorContext::new_missing(
12104 "LinkinfoGre6Attrs",
12105 "Flags",
12106 self.orig_loc,
12107 self.buf.as_ptr() as usize,
12108 ))
12109 }
12110 pub fn get_encap_type(&self) -> Result<u16, ErrorContext> {
12111 let mut iter = self.clone();
12112 iter.pos = 0;
12113 for attr in iter {
12114 if let Ok(LinkinfoGre6Attrs::EncapType(val)) = attr {
12115 return Ok(val);
12116 }
12117 }
12118 Err(ErrorContext::new_missing(
12119 "LinkinfoGre6Attrs",
12120 "EncapType",
12121 self.orig_loc,
12122 self.buf.as_ptr() as usize,
12123 ))
12124 }
12125 pub fn get_encap_flags(&self) -> Result<u16, ErrorContext> {
12126 let mut iter = self.clone();
12127 iter.pos = 0;
12128 for attr in iter {
12129 if let Ok(LinkinfoGre6Attrs::EncapFlags(val)) = attr {
12130 return Ok(val);
12131 }
12132 }
12133 Err(ErrorContext::new_missing(
12134 "LinkinfoGre6Attrs",
12135 "EncapFlags",
12136 self.orig_loc,
12137 self.buf.as_ptr() as usize,
12138 ))
12139 }
12140 pub fn get_encap_sport(&self) -> Result<u16, ErrorContext> {
12141 let mut iter = self.clone();
12142 iter.pos = 0;
12143 for attr in iter {
12144 if let Ok(LinkinfoGre6Attrs::EncapSport(val)) = attr {
12145 return Ok(val);
12146 }
12147 }
12148 Err(ErrorContext::new_missing(
12149 "LinkinfoGre6Attrs",
12150 "EncapSport",
12151 self.orig_loc,
12152 self.buf.as_ptr() as usize,
12153 ))
12154 }
12155 pub fn get_encap_dport(&self) -> Result<u16, ErrorContext> {
12156 let mut iter = self.clone();
12157 iter.pos = 0;
12158 for attr in iter {
12159 if let Ok(LinkinfoGre6Attrs::EncapDport(val)) = attr {
12160 return Ok(val);
12161 }
12162 }
12163 Err(ErrorContext::new_missing(
12164 "LinkinfoGre6Attrs",
12165 "EncapDport",
12166 self.orig_loc,
12167 self.buf.as_ptr() as usize,
12168 ))
12169 }
12170 pub fn get_collect_metadata(&self) -> Result<(), ErrorContext> {
12171 let mut iter = self.clone();
12172 iter.pos = 0;
12173 for attr in iter {
12174 if let Ok(LinkinfoGre6Attrs::CollectMetadata(val)) = attr {
12175 return Ok(val);
12176 }
12177 }
12178 Err(ErrorContext::new_missing(
12179 "LinkinfoGre6Attrs",
12180 "CollectMetadata",
12181 self.orig_loc,
12182 self.buf.as_ptr() as usize,
12183 ))
12184 }
12185 pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
12186 let mut iter = self.clone();
12187 iter.pos = 0;
12188 for attr in iter {
12189 if let Ok(LinkinfoGre6Attrs::Fwmark(val)) = attr {
12190 return Ok(val);
12191 }
12192 }
12193 Err(ErrorContext::new_missing(
12194 "LinkinfoGre6Attrs",
12195 "Fwmark",
12196 self.orig_loc,
12197 self.buf.as_ptr() as usize,
12198 ))
12199 }
12200 pub fn get_erspan_index(&self) -> Result<u32, ErrorContext> {
12201 let mut iter = self.clone();
12202 iter.pos = 0;
12203 for attr in iter {
12204 if let Ok(LinkinfoGre6Attrs::ErspanIndex(val)) = attr {
12205 return Ok(val);
12206 }
12207 }
12208 Err(ErrorContext::new_missing(
12209 "LinkinfoGre6Attrs",
12210 "ErspanIndex",
12211 self.orig_loc,
12212 self.buf.as_ptr() as usize,
12213 ))
12214 }
12215 pub fn get_erspan_ver(&self) -> Result<u8, ErrorContext> {
12216 let mut iter = self.clone();
12217 iter.pos = 0;
12218 for attr in iter {
12219 if let Ok(LinkinfoGre6Attrs::ErspanVer(val)) = attr {
12220 return Ok(val);
12221 }
12222 }
12223 Err(ErrorContext::new_missing(
12224 "LinkinfoGre6Attrs",
12225 "ErspanVer",
12226 self.orig_loc,
12227 self.buf.as_ptr() as usize,
12228 ))
12229 }
12230 pub fn get_erspan_dir(&self) -> Result<u8, ErrorContext> {
12231 let mut iter = self.clone();
12232 iter.pos = 0;
12233 for attr in iter {
12234 if let Ok(LinkinfoGre6Attrs::ErspanDir(val)) = attr {
12235 return Ok(val);
12236 }
12237 }
12238 Err(ErrorContext::new_missing(
12239 "LinkinfoGre6Attrs",
12240 "ErspanDir",
12241 self.orig_loc,
12242 self.buf.as_ptr() as usize,
12243 ))
12244 }
12245 pub fn get_erspan_hwid(&self) -> Result<u16, ErrorContext> {
12246 let mut iter = self.clone();
12247 iter.pos = 0;
12248 for attr in iter {
12249 if let Ok(LinkinfoGre6Attrs::ErspanHwid(val)) = attr {
12250 return Ok(val);
12251 }
12252 }
12253 Err(ErrorContext::new_missing(
12254 "LinkinfoGre6Attrs",
12255 "ErspanHwid",
12256 self.orig_loc,
12257 self.buf.as_ptr() as usize,
12258 ))
12259 }
12260}
12261impl LinkinfoGre6Attrs<'_> {
12262 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoGre6Attrs<'a> {
12263 IterableLinkinfoGre6Attrs::with_loc(buf, buf.as_ptr() as usize)
12264 }
12265 fn attr_from_type(r#type: u16) -> Option<&'static str> {
12266 LinkinfoGreAttrs::attr_from_type(r#type)
12267 }
12268}
12269#[derive(Clone, Copy, Default)]
12270pub struct IterableLinkinfoGre6Attrs<'a> {
12271 buf: &'a [u8],
12272 pos: usize,
12273 orig_loc: usize,
12274}
12275impl<'a> IterableLinkinfoGre6Attrs<'a> {
12276 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12277 Self {
12278 buf,
12279 pos: 0,
12280 orig_loc,
12281 }
12282 }
12283 pub fn get_buf(&self) -> &'a [u8] {
12284 self.buf
12285 }
12286}
12287impl<'a> Iterator for IterableLinkinfoGre6Attrs<'a> {
12288 type Item = Result<LinkinfoGre6Attrs<'a>, ErrorContext>;
12289 fn next(&mut self) -> Option<Self::Item> {
12290 let mut pos;
12291 let mut r#type;
12292 loop {
12293 pos = self.pos;
12294 r#type = None;
12295 if self.buf.len() == self.pos {
12296 return None;
12297 }
12298 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12299 self.pos = self.buf.len();
12300 break;
12301 };
12302 r#type = Some(header.r#type);
12303 let res = match header.r#type {
12304 1u16 => LinkinfoGre6Attrs::Link({
12305 let res = parse_u32(next);
12306 let Some(val) = res else { break };
12307 val
12308 }),
12309 2u16 => LinkinfoGre6Attrs::Iflags({
12310 let res = parse_be_u16(next);
12311 let Some(val) = res else { break };
12312 val
12313 }),
12314 3u16 => LinkinfoGre6Attrs::Oflags({
12315 let res = parse_be_u16(next);
12316 let Some(val) = res else { break };
12317 val
12318 }),
12319 4u16 => LinkinfoGre6Attrs::Ikey({
12320 let res = parse_be_u32(next);
12321 let Some(val) = res else { break };
12322 val
12323 }),
12324 5u16 => LinkinfoGre6Attrs::Okey({
12325 let res = parse_be_u32(next);
12326 let Some(val) = res else { break };
12327 val
12328 }),
12329 6u16 => LinkinfoGre6Attrs::Local({
12330 let res = Some(next);
12331 let Some(val) = res else { break };
12332 val
12333 }),
12334 7u16 => LinkinfoGre6Attrs::Remote({
12335 let res = Some(next);
12336 let Some(val) = res else { break };
12337 val
12338 }),
12339 8u16 => LinkinfoGre6Attrs::Ttl({
12340 let res = parse_u8(next);
12341 let Some(val) = res else { break };
12342 val
12343 }),
12344 11u16 => LinkinfoGre6Attrs::EncapLimit({
12345 let res = parse_u8(next);
12346 let Some(val) = res else { break };
12347 val
12348 }),
12349 12u16 => LinkinfoGre6Attrs::Flowinfo({
12350 let res = parse_be_u32(next);
12351 let Some(val) = res else { break };
12352 val
12353 }),
12354 13u16 => LinkinfoGre6Attrs::Flags({
12355 let res = parse_u32(next);
12356 let Some(val) = res else { break };
12357 val
12358 }),
12359 14u16 => LinkinfoGre6Attrs::EncapType({
12360 let res = parse_u16(next);
12361 let Some(val) = res else { break };
12362 val
12363 }),
12364 15u16 => LinkinfoGre6Attrs::EncapFlags({
12365 let res = parse_u16(next);
12366 let Some(val) = res else { break };
12367 val
12368 }),
12369 16u16 => LinkinfoGre6Attrs::EncapSport({
12370 let res = parse_be_u16(next);
12371 let Some(val) = res else { break };
12372 val
12373 }),
12374 17u16 => LinkinfoGre6Attrs::EncapDport({
12375 let res = parse_be_u16(next);
12376 let Some(val) = res else { break };
12377 val
12378 }),
12379 18u16 => LinkinfoGre6Attrs::CollectMetadata(()),
12380 20u16 => LinkinfoGre6Attrs::Fwmark({
12381 let res = parse_u32(next);
12382 let Some(val) = res else { break };
12383 val
12384 }),
12385 21u16 => LinkinfoGre6Attrs::ErspanIndex({
12386 let res = parse_u32(next);
12387 let Some(val) = res else { break };
12388 val
12389 }),
12390 22u16 => LinkinfoGre6Attrs::ErspanVer({
12391 let res = parse_u8(next);
12392 let Some(val) = res else { break };
12393 val
12394 }),
12395 23u16 => LinkinfoGre6Attrs::ErspanDir({
12396 let res = parse_u8(next);
12397 let Some(val) = res else { break };
12398 val
12399 }),
12400 24u16 => LinkinfoGre6Attrs::ErspanHwid({
12401 let res = parse_u16(next);
12402 let Some(val) = res else { break };
12403 val
12404 }),
12405 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12406 n => continue,
12407 };
12408 return Some(Ok(res));
12409 }
12410 Some(Err(ErrorContext::new(
12411 "LinkinfoGre6Attrs",
12412 r#type.and_then(|t| LinkinfoGre6Attrs::attr_from_type(t)),
12413 self.orig_loc,
12414 self.buf.as_ptr().wrapping_add(pos) as usize,
12415 )))
12416 }
12417}
12418impl<'a> std::fmt::Debug for IterableLinkinfoGre6Attrs<'_> {
12419 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12420 let mut fmt = f.debug_struct("LinkinfoGre6Attrs");
12421 for attr in self.clone() {
12422 let attr = match attr {
12423 Ok(a) => a,
12424 Err(err) => {
12425 fmt.finish()?;
12426 f.write_str("Err(")?;
12427 err.fmt(f)?;
12428 return f.write_str(")");
12429 }
12430 };
12431 match attr {
12432 LinkinfoGre6Attrs::Link(val) => fmt.field("Link", &val),
12433 LinkinfoGre6Attrs::Iflags(val) => fmt.field("Iflags", &val),
12434 LinkinfoGre6Attrs::Oflags(val) => fmt.field("Oflags", &val),
12435 LinkinfoGre6Attrs::Ikey(val) => fmt.field("Ikey", &val),
12436 LinkinfoGre6Attrs::Okey(val) => fmt.field("Okey", &val),
12437 LinkinfoGre6Attrs::Local(val) => fmt.field("Local", &val),
12438 LinkinfoGre6Attrs::Remote(val) => fmt.field("Remote", &val),
12439 LinkinfoGre6Attrs::Ttl(val) => fmt.field("Ttl", &val),
12440 LinkinfoGre6Attrs::EncapLimit(val) => fmt.field("EncapLimit", &val),
12441 LinkinfoGre6Attrs::Flowinfo(val) => fmt.field("Flowinfo", &val),
12442 LinkinfoGre6Attrs::Flags(val) => fmt.field("Flags", &val),
12443 LinkinfoGre6Attrs::EncapType(val) => fmt.field("EncapType", &val),
12444 LinkinfoGre6Attrs::EncapFlags(val) => fmt.field("EncapFlags", &val),
12445 LinkinfoGre6Attrs::EncapSport(val) => fmt.field("EncapSport", &val),
12446 LinkinfoGre6Attrs::EncapDport(val) => fmt.field("EncapDport", &val),
12447 LinkinfoGre6Attrs::CollectMetadata(val) => fmt.field("CollectMetadata", &val),
12448 LinkinfoGre6Attrs::Fwmark(val) => fmt.field("Fwmark", &val),
12449 LinkinfoGre6Attrs::ErspanIndex(val) => fmt.field("ErspanIndex", &val),
12450 LinkinfoGre6Attrs::ErspanVer(val) => fmt.field("ErspanVer", &val),
12451 LinkinfoGre6Attrs::ErspanDir(val) => fmt.field("ErspanDir", &val),
12452 LinkinfoGre6Attrs::ErspanHwid(val) => fmt.field("ErspanHwid", &val),
12453 };
12454 }
12455 fmt.finish()
12456 }
12457}
12458impl IterableLinkinfoGre6Attrs<'_> {
12459 pub fn lookup_attr(
12460 &self,
12461 offset: usize,
12462 missing_type: Option<u16>,
12463 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12464 let mut stack = Vec::new();
12465 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12466 if missing_type.is_some() && cur == offset {
12467 stack.push(("LinkinfoGre6Attrs", offset));
12468 return (
12469 stack,
12470 missing_type.and_then(|t| LinkinfoGre6Attrs::attr_from_type(t)),
12471 );
12472 }
12473 if cur > offset || cur + self.buf.len() < offset {
12474 return (stack, None);
12475 }
12476 let mut attrs = self.clone();
12477 let mut last_off = cur + attrs.pos;
12478 while let Some(attr) = attrs.next() {
12479 let Ok(attr) = attr else { break };
12480 match attr {
12481 LinkinfoGre6Attrs::Link(val) => {
12482 if last_off == offset {
12483 stack.push(("Link", last_off));
12484 break;
12485 }
12486 }
12487 LinkinfoGre6Attrs::Iflags(val) => {
12488 if last_off == offset {
12489 stack.push(("Iflags", last_off));
12490 break;
12491 }
12492 }
12493 LinkinfoGre6Attrs::Oflags(val) => {
12494 if last_off == offset {
12495 stack.push(("Oflags", last_off));
12496 break;
12497 }
12498 }
12499 LinkinfoGre6Attrs::Ikey(val) => {
12500 if last_off == offset {
12501 stack.push(("Ikey", last_off));
12502 break;
12503 }
12504 }
12505 LinkinfoGre6Attrs::Okey(val) => {
12506 if last_off == offset {
12507 stack.push(("Okey", last_off));
12508 break;
12509 }
12510 }
12511 LinkinfoGre6Attrs::Local(val) => {
12512 if last_off == offset {
12513 stack.push(("Local", last_off));
12514 break;
12515 }
12516 }
12517 LinkinfoGre6Attrs::Remote(val) => {
12518 if last_off == offset {
12519 stack.push(("Remote", last_off));
12520 break;
12521 }
12522 }
12523 LinkinfoGre6Attrs::Ttl(val) => {
12524 if last_off == offset {
12525 stack.push(("Ttl", last_off));
12526 break;
12527 }
12528 }
12529 LinkinfoGre6Attrs::EncapLimit(val) => {
12530 if last_off == offset {
12531 stack.push(("EncapLimit", last_off));
12532 break;
12533 }
12534 }
12535 LinkinfoGre6Attrs::Flowinfo(val) => {
12536 if last_off == offset {
12537 stack.push(("Flowinfo", last_off));
12538 break;
12539 }
12540 }
12541 LinkinfoGre6Attrs::Flags(val) => {
12542 if last_off == offset {
12543 stack.push(("Flags", last_off));
12544 break;
12545 }
12546 }
12547 LinkinfoGre6Attrs::EncapType(val) => {
12548 if last_off == offset {
12549 stack.push(("EncapType", last_off));
12550 break;
12551 }
12552 }
12553 LinkinfoGre6Attrs::EncapFlags(val) => {
12554 if last_off == offset {
12555 stack.push(("EncapFlags", last_off));
12556 break;
12557 }
12558 }
12559 LinkinfoGre6Attrs::EncapSport(val) => {
12560 if last_off == offset {
12561 stack.push(("EncapSport", last_off));
12562 break;
12563 }
12564 }
12565 LinkinfoGre6Attrs::EncapDport(val) => {
12566 if last_off == offset {
12567 stack.push(("EncapDport", last_off));
12568 break;
12569 }
12570 }
12571 LinkinfoGre6Attrs::CollectMetadata(val) => {
12572 if last_off == offset {
12573 stack.push(("CollectMetadata", last_off));
12574 break;
12575 }
12576 }
12577 LinkinfoGre6Attrs::Fwmark(val) => {
12578 if last_off == offset {
12579 stack.push(("Fwmark", last_off));
12580 break;
12581 }
12582 }
12583 LinkinfoGre6Attrs::ErspanIndex(val) => {
12584 if last_off == offset {
12585 stack.push(("ErspanIndex", last_off));
12586 break;
12587 }
12588 }
12589 LinkinfoGre6Attrs::ErspanVer(val) => {
12590 if last_off == offset {
12591 stack.push(("ErspanVer", last_off));
12592 break;
12593 }
12594 }
12595 LinkinfoGre6Attrs::ErspanDir(val) => {
12596 if last_off == offset {
12597 stack.push(("ErspanDir", last_off));
12598 break;
12599 }
12600 }
12601 LinkinfoGre6Attrs::ErspanHwid(val) => {
12602 if last_off == offset {
12603 stack.push(("ErspanHwid", last_off));
12604 break;
12605 }
12606 }
12607 _ => {}
12608 };
12609 last_off = cur + attrs.pos;
12610 }
12611 if !stack.is_empty() {
12612 stack.push(("LinkinfoGre6Attrs", cur));
12613 }
12614 (stack, None)
12615 }
12616}
12617#[derive(Clone)]
12618pub enum LinkinfoVtiAttrs {
12619 Link(u32),
12620 Ikey(u32),
12621 Okey(u32),
12622 Local(std::net::IpAddr),
12623 Remote(std::net::IpAddr),
12624 Fwmark(u32),
12625}
12626impl<'a> IterableLinkinfoVtiAttrs<'a> {
12627 pub fn get_link(&self) -> Result<u32, ErrorContext> {
12628 let mut iter = self.clone();
12629 iter.pos = 0;
12630 for attr in iter {
12631 if let Ok(LinkinfoVtiAttrs::Link(val)) = attr {
12632 return Ok(val);
12633 }
12634 }
12635 Err(ErrorContext::new_missing(
12636 "LinkinfoVtiAttrs",
12637 "Link",
12638 self.orig_loc,
12639 self.buf.as_ptr() as usize,
12640 ))
12641 }
12642 pub fn get_ikey(&self) -> Result<u32, ErrorContext> {
12643 let mut iter = self.clone();
12644 iter.pos = 0;
12645 for attr in iter {
12646 if let Ok(LinkinfoVtiAttrs::Ikey(val)) = attr {
12647 return Ok(val);
12648 }
12649 }
12650 Err(ErrorContext::new_missing(
12651 "LinkinfoVtiAttrs",
12652 "Ikey",
12653 self.orig_loc,
12654 self.buf.as_ptr() as usize,
12655 ))
12656 }
12657 pub fn get_okey(&self) -> Result<u32, ErrorContext> {
12658 let mut iter = self.clone();
12659 iter.pos = 0;
12660 for attr in iter {
12661 if let Ok(LinkinfoVtiAttrs::Okey(val)) = attr {
12662 return Ok(val);
12663 }
12664 }
12665 Err(ErrorContext::new_missing(
12666 "LinkinfoVtiAttrs",
12667 "Okey",
12668 self.orig_loc,
12669 self.buf.as_ptr() as usize,
12670 ))
12671 }
12672 pub fn get_local(&self) -> Result<std::net::IpAddr, ErrorContext> {
12673 let mut iter = self.clone();
12674 iter.pos = 0;
12675 for attr in iter {
12676 if let Ok(LinkinfoVtiAttrs::Local(val)) = attr {
12677 return Ok(val);
12678 }
12679 }
12680 Err(ErrorContext::new_missing(
12681 "LinkinfoVtiAttrs",
12682 "Local",
12683 self.orig_loc,
12684 self.buf.as_ptr() as usize,
12685 ))
12686 }
12687 pub fn get_remote(&self) -> Result<std::net::IpAddr, ErrorContext> {
12688 let mut iter = self.clone();
12689 iter.pos = 0;
12690 for attr in iter {
12691 if let Ok(LinkinfoVtiAttrs::Remote(val)) = attr {
12692 return Ok(val);
12693 }
12694 }
12695 Err(ErrorContext::new_missing(
12696 "LinkinfoVtiAttrs",
12697 "Remote",
12698 self.orig_loc,
12699 self.buf.as_ptr() as usize,
12700 ))
12701 }
12702 pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
12703 let mut iter = self.clone();
12704 iter.pos = 0;
12705 for attr in iter {
12706 if let Ok(LinkinfoVtiAttrs::Fwmark(val)) = attr {
12707 return Ok(val);
12708 }
12709 }
12710 Err(ErrorContext::new_missing(
12711 "LinkinfoVtiAttrs",
12712 "Fwmark",
12713 self.orig_loc,
12714 self.buf.as_ptr() as usize,
12715 ))
12716 }
12717}
12718impl LinkinfoVtiAttrs {
12719 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoVtiAttrs<'a> {
12720 IterableLinkinfoVtiAttrs::with_loc(buf, buf.as_ptr() as usize)
12721 }
12722 fn attr_from_type(r#type: u16) -> Option<&'static str> {
12723 let res = match r#type {
12724 1u16 => "Link",
12725 2u16 => "Ikey",
12726 3u16 => "Okey",
12727 4u16 => "Local",
12728 5u16 => "Remote",
12729 6u16 => "Fwmark",
12730 _ => return None,
12731 };
12732 Some(res)
12733 }
12734}
12735#[derive(Clone, Copy, Default)]
12736pub struct IterableLinkinfoVtiAttrs<'a> {
12737 buf: &'a [u8],
12738 pos: usize,
12739 orig_loc: usize,
12740}
12741impl<'a> IterableLinkinfoVtiAttrs<'a> {
12742 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
12743 Self {
12744 buf,
12745 pos: 0,
12746 orig_loc,
12747 }
12748 }
12749 pub fn get_buf(&self) -> &'a [u8] {
12750 self.buf
12751 }
12752}
12753impl<'a> Iterator for IterableLinkinfoVtiAttrs<'a> {
12754 type Item = Result<LinkinfoVtiAttrs, ErrorContext>;
12755 fn next(&mut self) -> Option<Self::Item> {
12756 let mut pos;
12757 let mut r#type;
12758 loop {
12759 pos = self.pos;
12760 r#type = None;
12761 if self.buf.len() == self.pos {
12762 return None;
12763 }
12764 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
12765 self.pos = self.buf.len();
12766 break;
12767 };
12768 r#type = Some(header.r#type);
12769 let res = match header.r#type {
12770 1u16 => LinkinfoVtiAttrs::Link({
12771 let res = parse_u32(next);
12772 let Some(val) = res else { break };
12773 val
12774 }),
12775 2u16 => LinkinfoVtiAttrs::Ikey({
12776 let res = parse_be_u32(next);
12777 let Some(val) = res else { break };
12778 val
12779 }),
12780 3u16 => LinkinfoVtiAttrs::Okey({
12781 let res = parse_be_u32(next);
12782 let Some(val) = res else { break };
12783 val
12784 }),
12785 4u16 => LinkinfoVtiAttrs::Local({
12786 let res = parse_ip(next);
12787 let Some(val) = res else { break };
12788 val
12789 }),
12790 5u16 => LinkinfoVtiAttrs::Remote({
12791 let res = parse_ip(next);
12792 let Some(val) = res else { break };
12793 val
12794 }),
12795 6u16 => LinkinfoVtiAttrs::Fwmark({
12796 let res = parse_u32(next);
12797 let Some(val) = res else { break };
12798 val
12799 }),
12800 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
12801 n => continue,
12802 };
12803 return Some(Ok(res));
12804 }
12805 Some(Err(ErrorContext::new(
12806 "LinkinfoVtiAttrs",
12807 r#type.and_then(|t| LinkinfoVtiAttrs::attr_from_type(t)),
12808 self.orig_loc,
12809 self.buf.as_ptr().wrapping_add(pos) as usize,
12810 )))
12811 }
12812}
12813impl std::fmt::Debug for IterableLinkinfoVtiAttrs<'_> {
12814 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
12815 let mut fmt = f.debug_struct("LinkinfoVtiAttrs");
12816 for attr in self.clone() {
12817 let attr = match attr {
12818 Ok(a) => a,
12819 Err(err) => {
12820 fmt.finish()?;
12821 f.write_str("Err(")?;
12822 err.fmt(f)?;
12823 return f.write_str(")");
12824 }
12825 };
12826 match attr {
12827 LinkinfoVtiAttrs::Link(val) => fmt.field("Link", &val),
12828 LinkinfoVtiAttrs::Ikey(val) => fmt.field("Ikey", &val),
12829 LinkinfoVtiAttrs::Okey(val) => fmt.field("Okey", &val),
12830 LinkinfoVtiAttrs::Local(val) => fmt.field("Local", &val),
12831 LinkinfoVtiAttrs::Remote(val) => fmt.field("Remote", &val),
12832 LinkinfoVtiAttrs::Fwmark(val) => fmt.field("Fwmark", &val),
12833 };
12834 }
12835 fmt.finish()
12836 }
12837}
12838impl IterableLinkinfoVtiAttrs<'_> {
12839 pub fn lookup_attr(
12840 &self,
12841 offset: usize,
12842 missing_type: Option<u16>,
12843 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
12844 let mut stack = Vec::new();
12845 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
12846 if missing_type.is_some() && cur == offset {
12847 stack.push(("LinkinfoVtiAttrs", offset));
12848 return (
12849 stack,
12850 missing_type.and_then(|t| LinkinfoVtiAttrs::attr_from_type(t)),
12851 );
12852 }
12853 if cur > offset || cur + self.buf.len() < offset {
12854 return (stack, None);
12855 }
12856 let mut attrs = self.clone();
12857 let mut last_off = cur + attrs.pos;
12858 while let Some(attr) = attrs.next() {
12859 let Ok(attr) = attr else { break };
12860 match attr {
12861 LinkinfoVtiAttrs::Link(val) => {
12862 if last_off == offset {
12863 stack.push(("Link", last_off));
12864 break;
12865 }
12866 }
12867 LinkinfoVtiAttrs::Ikey(val) => {
12868 if last_off == offset {
12869 stack.push(("Ikey", last_off));
12870 break;
12871 }
12872 }
12873 LinkinfoVtiAttrs::Okey(val) => {
12874 if last_off == offset {
12875 stack.push(("Okey", last_off));
12876 break;
12877 }
12878 }
12879 LinkinfoVtiAttrs::Local(val) => {
12880 if last_off == offset {
12881 stack.push(("Local", last_off));
12882 break;
12883 }
12884 }
12885 LinkinfoVtiAttrs::Remote(val) => {
12886 if last_off == offset {
12887 stack.push(("Remote", last_off));
12888 break;
12889 }
12890 }
12891 LinkinfoVtiAttrs::Fwmark(val) => {
12892 if last_off == offset {
12893 stack.push(("Fwmark", last_off));
12894 break;
12895 }
12896 }
12897 _ => {}
12898 };
12899 last_off = cur + attrs.pos;
12900 }
12901 if !stack.is_empty() {
12902 stack.push(("LinkinfoVtiAttrs", cur));
12903 }
12904 (stack, None)
12905 }
12906}
12907#[derive(Clone)]
12908pub enum LinkinfoVti6Attrs<'a> {
12909 Link(u32),
12910 Ikey(u32),
12911 Okey(u32),
12912 Local(&'a [u8]),
12913 Remote(&'a [u8]),
12914 Fwmark(u32),
12915}
12916impl<'a> IterableLinkinfoVti6Attrs<'a> {
12917 pub fn get_link(&self) -> Result<u32, ErrorContext> {
12918 let mut iter = self.clone();
12919 iter.pos = 0;
12920 for attr in iter {
12921 if let Ok(LinkinfoVti6Attrs::Link(val)) = attr {
12922 return Ok(val);
12923 }
12924 }
12925 Err(ErrorContext::new_missing(
12926 "LinkinfoVti6Attrs",
12927 "Link",
12928 self.orig_loc,
12929 self.buf.as_ptr() as usize,
12930 ))
12931 }
12932 pub fn get_ikey(&self) -> Result<u32, ErrorContext> {
12933 let mut iter = self.clone();
12934 iter.pos = 0;
12935 for attr in iter {
12936 if let Ok(LinkinfoVti6Attrs::Ikey(val)) = attr {
12937 return Ok(val);
12938 }
12939 }
12940 Err(ErrorContext::new_missing(
12941 "LinkinfoVti6Attrs",
12942 "Ikey",
12943 self.orig_loc,
12944 self.buf.as_ptr() as usize,
12945 ))
12946 }
12947 pub fn get_okey(&self) -> Result<u32, ErrorContext> {
12948 let mut iter = self.clone();
12949 iter.pos = 0;
12950 for attr in iter {
12951 if let Ok(LinkinfoVti6Attrs::Okey(val)) = attr {
12952 return Ok(val);
12953 }
12954 }
12955 Err(ErrorContext::new_missing(
12956 "LinkinfoVti6Attrs",
12957 "Okey",
12958 self.orig_loc,
12959 self.buf.as_ptr() as usize,
12960 ))
12961 }
12962 pub fn get_local(&self) -> Result<&'a [u8], ErrorContext> {
12963 let mut iter = self.clone();
12964 iter.pos = 0;
12965 for attr in iter {
12966 if let Ok(LinkinfoVti6Attrs::Local(val)) = attr {
12967 return Ok(val);
12968 }
12969 }
12970 Err(ErrorContext::new_missing(
12971 "LinkinfoVti6Attrs",
12972 "Local",
12973 self.orig_loc,
12974 self.buf.as_ptr() as usize,
12975 ))
12976 }
12977 pub fn get_remote(&self) -> Result<&'a [u8], ErrorContext> {
12978 let mut iter = self.clone();
12979 iter.pos = 0;
12980 for attr in iter {
12981 if let Ok(LinkinfoVti6Attrs::Remote(val)) = attr {
12982 return Ok(val);
12983 }
12984 }
12985 Err(ErrorContext::new_missing(
12986 "LinkinfoVti6Attrs",
12987 "Remote",
12988 self.orig_loc,
12989 self.buf.as_ptr() as usize,
12990 ))
12991 }
12992 pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
12993 let mut iter = self.clone();
12994 iter.pos = 0;
12995 for attr in iter {
12996 if let Ok(LinkinfoVti6Attrs::Fwmark(val)) = attr {
12997 return Ok(val);
12998 }
12999 }
13000 Err(ErrorContext::new_missing(
13001 "LinkinfoVti6Attrs",
13002 "Fwmark",
13003 self.orig_loc,
13004 self.buf.as_ptr() as usize,
13005 ))
13006 }
13007}
13008impl LinkinfoVti6Attrs<'_> {
13009 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoVti6Attrs<'a> {
13010 IterableLinkinfoVti6Attrs::with_loc(buf, buf.as_ptr() as usize)
13011 }
13012 fn attr_from_type(r#type: u16) -> Option<&'static str> {
13013 LinkinfoVtiAttrs::attr_from_type(r#type)
13014 }
13015}
13016#[derive(Clone, Copy, Default)]
13017pub struct IterableLinkinfoVti6Attrs<'a> {
13018 buf: &'a [u8],
13019 pos: usize,
13020 orig_loc: usize,
13021}
13022impl<'a> IterableLinkinfoVti6Attrs<'a> {
13023 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
13024 Self {
13025 buf,
13026 pos: 0,
13027 orig_loc,
13028 }
13029 }
13030 pub fn get_buf(&self) -> &'a [u8] {
13031 self.buf
13032 }
13033}
13034impl<'a> Iterator for IterableLinkinfoVti6Attrs<'a> {
13035 type Item = Result<LinkinfoVti6Attrs<'a>, ErrorContext>;
13036 fn next(&mut self) -> Option<Self::Item> {
13037 let mut pos;
13038 let mut r#type;
13039 loop {
13040 pos = self.pos;
13041 r#type = None;
13042 if self.buf.len() == self.pos {
13043 return None;
13044 }
13045 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
13046 self.pos = self.buf.len();
13047 break;
13048 };
13049 r#type = Some(header.r#type);
13050 let res = match header.r#type {
13051 1u16 => LinkinfoVti6Attrs::Link({
13052 let res = parse_u32(next);
13053 let Some(val) = res else { break };
13054 val
13055 }),
13056 2u16 => LinkinfoVti6Attrs::Ikey({
13057 let res = parse_be_u32(next);
13058 let Some(val) = res else { break };
13059 val
13060 }),
13061 3u16 => LinkinfoVti6Attrs::Okey({
13062 let res = parse_be_u32(next);
13063 let Some(val) = res else { break };
13064 val
13065 }),
13066 4u16 => LinkinfoVti6Attrs::Local({
13067 let res = Some(next);
13068 let Some(val) = res else { break };
13069 val
13070 }),
13071 5u16 => LinkinfoVti6Attrs::Remote({
13072 let res = Some(next);
13073 let Some(val) = res else { break };
13074 val
13075 }),
13076 6u16 => LinkinfoVti6Attrs::Fwmark({
13077 let res = parse_u32(next);
13078 let Some(val) = res else { break };
13079 val
13080 }),
13081 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
13082 n => continue,
13083 };
13084 return Some(Ok(res));
13085 }
13086 Some(Err(ErrorContext::new(
13087 "LinkinfoVti6Attrs",
13088 r#type.and_then(|t| LinkinfoVti6Attrs::attr_from_type(t)),
13089 self.orig_loc,
13090 self.buf.as_ptr().wrapping_add(pos) as usize,
13091 )))
13092 }
13093}
13094impl<'a> std::fmt::Debug for IterableLinkinfoVti6Attrs<'_> {
13095 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13096 let mut fmt = f.debug_struct("LinkinfoVti6Attrs");
13097 for attr in self.clone() {
13098 let attr = match attr {
13099 Ok(a) => a,
13100 Err(err) => {
13101 fmt.finish()?;
13102 f.write_str("Err(")?;
13103 err.fmt(f)?;
13104 return f.write_str(")");
13105 }
13106 };
13107 match attr {
13108 LinkinfoVti6Attrs::Link(val) => fmt.field("Link", &val),
13109 LinkinfoVti6Attrs::Ikey(val) => fmt.field("Ikey", &val),
13110 LinkinfoVti6Attrs::Okey(val) => fmt.field("Okey", &val),
13111 LinkinfoVti6Attrs::Local(val) => fmt.field("Local", &val),
13112 LinkinfoVti6Attrs::Remote(val) => fmt.field("Remote", &val),
13113 LinkinfoVti6Attrs::Fwmark(val) => fmt.field("Fwmark", &val),
13114 };
13115 }
13116 fmt.finish()
13117 }
13118}
13119impl IterableLinkinfoVti6Attrs<'_> {
13120 pub fn lookup_attr(
13121 &self,
13122 offset: usize,
13123 missing_type: Option<u16>,
13124 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
13125 let mut stack = Vec::new();
13126 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
13127 if missing_type.is_some() && cur == offset {
13128 stack.push(("LinkinfoVti6Attrs", offset));
13129 return (
13130 stack,
13131 missing_type.and_then(|t| LinkinfoVti6Attrs::attr_from_type(t)),
13132 );
13133 }
13134 if cur > offset || cur + self.buf.len() < offset {
13135 return (stack, None);
13136 }
13137 let mut attrs = self.clone();
13138 let mut last_off = cur + attrs.pos;
13139 while let Some(attr) = attrs.next() {
13140 let Ok(attr) = attr else { break };
13141 match attr {
13142 LinkinfoVti6Attrs::Link(val) => {
13143 if last_off == offset {
13144 stack.push(("Link", last_off));
13145 break;
13146 }
13147 }
13148 LinkinfoVti6Attrs::Ikey(val) => {
13149 if last_off == offset {
13150 stack.push(("Ikey", last_off));
13151 break;
13152 }
13153 }
13154 LinkinfoVti6Attrs::Okey(val) => {
13155 if last_off == offset {
13156 stack.push(("Okey", last_off));
13157 break;
13158 }
13159 }
13160 LinkinfoVti6Attrs::Local(val) => {
13161 if last_off == offset {
13162 stack.push(("Local", last_off));
13163 break;
13164 }
13165 }
13166 LinkinfoVti6Attrs::Remote(val) => {
13167 if last_off == offset {
13168 stack.push(("Remote", last_off));
13169 break;
13170 }
13171 }
13172 LinkinfoVti6Attrs::Fwmark(val) => {
13173 if last_off == offset {
13174 stack.push(("Fwmark", last_off));
13175 break;
13176 }
13177 }
13178 _ => {}
13179 };
13180 last_off = cur + attrs.pos;
13181 }
13182 if !stack.is_empty() {
13183 stack.push(("LinkinfoVti6Attrs", cur));
13184 }
13185 (stack, None)
13186 }
13187}
13188#[derive(Clone)]
13189pub enum LinkinfoGeneveAttrs<'a> {
13190 Id(u32),
13191 Remote(std::net::Ipv4Addr),
13192 Ttl(u8),
13193 Tos(u8),
13194 Port(u16),
13195 CollectMetadata(()),
13196 Remote6(&'a [u8]),
13197 UdpCsum(u8),
13198 UdpZeroCsum6Tx(u8),
13199 UdpZeroCsum6Rx(u8),
13200 Label(u32),
13201 TtlInherit(u8),
13202 Df(u8),
13203 InnerProtoInherit(()),
13204 PortRange(IflaGenevePortRange),
13205 GroHint(()),
13206 Local(std::net::Ipv4Addr),
13207 Local6(&'a [u8]),
13208}
13209impl<'a> IterableLinkinfoGeneveAttrs<'a> {
13210 pub fn get_id(&self) -> Result<u32, ErrorContext> {
13211 let mut iter = self.clone();
13212 iter.pos = 0;
13213 for attr in iter {
13214 if let Ok(LinkinfoGeneveAttrs::Id(val)) = attr {
13215 return Ok(val);
13216 }
13217 }
13218 Err(ErrorContext::new_missing(
13219 "LinkinfoGeneveAttrs",
13220 "Id",
13221 self.orig_loc,
13222 self.buf.as_ptr() as usize,
13223 ))
13224 }
13225 pub fn get_remote(&self) -> Result<std::net::Ipv4Addr, ErrorContext> {
13226 let mut iter = self.clone();
13227 iter.pos = 0;
13228 for attr in iter {
13229 if let Ok(LinkinfoGeneveAttrs::Remote(val)) = attr {
13230 return Ok(val);
13231 }
13232 }
13233 Err(ErrorContext::new_missing(
13234 "LinkinfoGeneveAttrs",
13235 "Remote",
13236 self.orig_loc,
13237 self.buf.as_ptr() as usize,
13238 ))
13239 }
13240 pub fn get_ttl(&self) -> Result<u8, ErrorContext> {
13241 let mut iter = self.clone();
13242 iter.pos = 0;
13243 for attr in iter {
13244 if let Ok(LinkinfoGeneveAttrs::Ttl(val)) = attr {
13245 return Ok(val);
13246 }
13247 }
13248 Err(ErrorContext::new_missing(
13249 "LinkinfoGeneveAttrs",
13250 "Ttl",
13251 self.orig_loc,
13252 self.buf.as_ptr() as usize,
13253 ))
13254 }
13255 pub fn get_tos(&self) -> Result<u8, ErrorContext> {
13256 let mut iter = self.clone();
13257 iter.pos = 0;
13258 for attr in iter {
13259 if let Ok(LinkinfoGeneveAttrs::Tos(val)) = attr {
13260 return Ok(val);
13261 }
13262 }
13263 Err(ErrorContext::new_missing(
13264 "LinkinfoGeneveAttrs",
13265 "Tos",
13266 self.orig_loc,
13267 self.buf.as_ptr() as usize,
13268 ))
13269 }
13270 pub fn get_port(&self) -> Result<u16, ErrorContext> {
13271 let mut iter = self.clone();
13272 iter.pos = 0;
13273 for attr in iter {
13274 if let Ok(LinkinfoGeneveAttrs::Port(val)) = attr {
13275 return Ok(val);
13276 }
13277 }
13278 Err(ErrorContext::new_missing(
13279 "LinkinfoGeneveAttrs",
13280 "Port",
13281 self.orig_loc,
13282 self.buf.as_ptr() as usize,
13283 ))
13284 }
13285 pub fn get_collect_metadata(&self) -> Result<(), ErrorContext> {
13286 let mut iter = self.clone();
13287 iter.pos = 0;
13288 for attr in iter {
13289 if let Ok(LinkinfoGeneveAttrs::CollectMetadata(val)) = attr {
13290 return Ok(val);
13291 }
13292 }
13293 Err(ErrorContext::new_missing(
13294 "LinkinfoGeneveAttrs",
13295 "CollectMetadata",
13296 self.orig_loc,
13297 self.buf.as_ptr() as usize,
13298 ))
13299 }
13300 pub fn get_remote6(&self) -> Result<&'a [u8], ErrorContext> {
13301 let mut iter = self.clone();
13302 iter.pos = 0;
13303 for attr in iter {
13304 if let Ok(LinkinfoGeneveAttrs::Remote6(val)) = attr {
13305 return Ok(val);
13306 }
13307 }
13308 Err(ErrorContext::new_missing(
13309 "LinkinfoGeneveAttrs",
13310 "Remote6",
13311 self.orig_loc,
13312 self.buf.as_ptr() as usize,
13313 ))
13314 }
13315 pub fn get_udp_csum(&self) -> Result<u8, ErrorContext> {
13316 let mut iter = self.clone();
13317 iter.pos = 0;
13318 for attr in iter {
13319 if let Ok(LinkinfoGeneveAttrs::UdpCsum(val)) = attr {
13320 return Ok(val);
13321 }
13322 }
13323 Err(ErrorContext::new_missing(
13324 "LinkinfoGeneveAttrs",
13325 "UdpCsum",
13326 self.orig_loc,
13327 self.buf.as_ptr() as usize,
13328 ))
13329 }
13330 pub fn get_udp_zero_csum6_tx(&self) -> Result<u8, ErrorContext> {
13331 let mut iter = self.clone();
13332 iter.pos = 0;
13333 for attr in iter {
13334 if let Ok(LinkinfoGeneveAttrs::UdpZeroCsum6Tx(val)) = attr {
13335 return Ok(val);
13336 }
13337 }
13338 Err(ErrorContext::new_missing(
13339 "LinkinfoGeneveAttrs",
13340 "UdpZeroCsum6Tx",
13341 self.orig_loc,
13342 self.buf.as_ptr() as usize,
13343 ))
13344 }
13345 pub fn get_udp_zero_csum6_rx(&self) -> Result<u8, ErrorContext> {
13346 let mut iter = self.clone();
13347 iter.pos = 0;
13348 for attr in iter {
13349 if let Ok(LinkinfoGeneveAttrs::UdpZeroCsum6Rx(val)) = attr {
13350 return Ok(val);
13351 }
13352 }
13353 Err(ErrorContext::new_missing(
13354 "LinkinfoGeneveAttrs",
13355 "UdpZeroCsum6Rx",
13356 self.orig_loc,
13357 self.buf.as_ptr() as usize,
13358 ))
13359 }
13360 pub fn get_label(&self) -> Result<u32, ErrorContext> {
13361 let mut iter = self.clone();
13362 iter.pos = 0;
13363 for attr in iter {
13364 if let Ok(LinkinfoGeneveAttrs::Label(val)) = attr {
13365 return Ok(val);
13366 }
13367 }
13368 Err(ErrorContext::new_missing(
13369 "LinkinfoGeneveAttrs",
13370 "Label",
13371 self.orig_loc,
13372 self.buf.as_ptr() as usize,
13373 ))
13374 }
13375 pub fn get_ttl_inherit(&self) -> Result<u8, ErrorContext> {
13376 let mut iter = self.clone();
13377 iter.pos = 0;
13378 for attr in iter {
13379 if let Ok(LinkinfoGeneveAttrs::TtlInherit(val)) = attr {
13380 return Ok(val);
13381 }
13382 }
13383 Err(ErrorContext::new_missing(
13384 "LinkinfoGeneveAttrs",
13385 "TtlInherit",
13386 self.orig_loc,
13387 self.buf.as_ptr() as usize,
13388 ))
13389 }
13390 pub fn get_df(&self) -> Result<u8, ErrorContext> {
13391 let mut iter = self.clone();
13392 iter.pos = 0;
13393 for attr in iter {
13394 if let Ok(LinkinfoGeneveAttrs::Df(val)) = attr {
13395 return Ok(val);
13396 }
13397 }
13398 Err(ErrorContext::new_missing(
13399 "LinkinfoGeneveAttrs",
13400 "Df",
13401 self.orig_loc,
13402 self.buf.as_ptr() as usize,
13403 ))
13404 }
13405 pub fn get_inner_proto_inherit(&self) -> Result<(), ErrorContext> {
13406 let mut iter = self.clone();
13407 iter.pos = 0;
13408 for attr in iter {
13409 if let Ok(LinkinfoGeneveAttrs::InnerProtoInherit(val)) = attr {
13410 return Ok(val);
13411 }
13412 }
13413 Err(ErrorContext::new_missing(
13414 "LinkinfoGeneveAttrs",
13415 "InnerProtoInherit",
13416 self.orig_loc,
13417 self.buf.as_ptr() as usize,
13418 ))
13419 }
13420 pub fn get_port_range(&self) -> Result<IflaGenevePortRange, ErrorContext> {
13421 let mut iter = self.clone();
13422 iter.pos = 0;
13423 for attr in iter {
13424 if let Ok(LinkinfoGeneveAttrs::PortRange(val)) = attr {
13425 return Ok(val);
13426 }
13427 }
13428 Err(ErrorContext::new_missing(
13429 "LinkinfoGeneveAttrs",
13430 "PortRange",
13431 self.orig_loc,
13432 self.buf.as_ptr() as usize,
13433 ))
13434 }
13435 pub fn get_gro_hint(&self) -> Result<(), ErrorContext> {
13436 let mut iter = self.clone();
13437 iter.pos = 0;
13438 for attr in iter {
13439 if let Ok(LinkinfoGeneveAttrs::GroHint(val)) = attr {
13440 return Ok(val);
13441 }
13442 }
13443 Err(ErrorContext::new_missing(
13444 "LinkinfoGeneveAttrs",
13445 "GroHint",
13446 self.orig_loc,
13447 self.buf.as_ptr() as usize,
13448 ))
13449 }
13450 pub fn get_local(&self) -> Result<std::net::Ipv4Addr, ErrorContext> {
13451 let mut iter = self.clone();
13452 iter.pos = 0;
13453 for attr in iter {
13454 if let Ok(LinkinfoGeneveAttrs::Local(val)) = attr {
13455 return Ok(val);
13456 }
13457 }
13458 Err(ErrorContext::new_missing(
13459 "LinkinfoGeneveAttrs",
13460 "Local",
13461 self.orig_loc,
13462 self.buf.as_ptr() as usize,
13463 ))
13464 }
13465 pub fn get_local6(&self) -> Result<&'a [u8], ErrorContext> {
13466 let mut iter = self.clone();
13467 iter.pos = 0;
13468 for attr in iter {
13469 if let Ok(LinkinfoGeneveAttrs::Local6(val)) = attr {
13470 return Ok(val);
13471 }
13472 }
13473 Err(ErrorContext::new_missing(
13474 "LinkinfoGeneveAttrs",
13475 "Local6",
13476 self.orig_loc,
13477 self.buf.as_ptr() as usize,
13478 ))
13479 }
13480}
13481impl LinkinfoGeneveAttrs<'_> {
13482 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoGeneveAttrs<'a> {
13483 IterableLinkinfoGeneveAttrs::with_loc(buf, buf.as_ptr() as usize)
13484 }
13485 fn attr_from_type(r#type: u16) -> Option<&'static str> {
13486 let res = match r#type {
13487 1u16 => "Id",
13488 2u16 => "Remote",
13489 3u16 => "Ttl",
13490 4u16 => "Tos",
13491 5u16 => "Port",
13492 6u16 => "CollectMetadata",
13493 7u16 => "Remote6",
13494 8u16 => "UdpCsum",
13495 9u16 => "UdpZeroCsum6Tx",
13496 10u16 => "UdpZeroCsum6Rx",
13497 11u16 => "Label",
13498 12u16 => "TtlInherit",
13499 13u16 => "Df",
13500 14u16 => "InnerProtoInherit",
13501 15u16 => "PortRange",
13502 16u16 => "GroHint",
13503 17u16 => "Local",
13504 18u16 => "Local6",
13505 _ => return None,
13506 };
13507 Some(res)
13508 }
13509}
13510#[derive(Clone, Copy, Default)]
13511pub struct IterableLinkinfoGeneveAttrs<'a> {
13512 buf: &'a [u8],
13513 pos: usize,
13514 orig_loc: usize,
13515}
13516impl<'a> IterableLinkinfoGeneveAttrs<'a> {
13517 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
13518 Self {
13519 buf,
13520 pos: 0,
13521 orig_loc,
13522 }
13523 }
13524 pub fn get_buf(&self) -> &'a [u8] {
13525 self.buf
13526 }
13527}
13528impl<'a> Iterator for IterableLinkinfoGeneveAttrs<'a> {
13529 type Item = Result<LinkinfoGeneveAttrs<'a>, ErrorContext>;
13530 fn next(&mut self) -> Option<Self::Item> {
13531 let mut pos;
13532 let mut r#type;
13533 loop {
13534 pos = self.pos;
13535 r#type = None;
13536 if self.buf.len() == self.pos {
13537 return None;
13538 }
13539 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
13540 self.pos = self.buf.len();
13541 break;
13542 };
13543 r#type = Some(header.r#type);
13544 let res = match header.r#type {
13545 1u16 => LinkinfoGeneveAttrs::Id({
13546 let res = parse_u32(next);
13547 let Some(val) = res else { break };
13548 val
13549 }),
13550 2u16 => LinkinfoGeneveAttrs::Remote({
13551 let res = parse_be_u32(next).map(Ipv4Addr::from_bits);
13552 let Some(val) = res else { break };
13553 val
13554 }),
13555 3u16 => LinkinfoGeneveAttrs::Ttl({
13556 let res = parse_u8(next);
13557 let Some(val) = res else { break };
13558 val
13559 }),
13560 4u16 => LinkinfoGeneveAttrs::Tos({
13561 let res = parse_u8(next);
13562 let Some(val) = res else { break };
13563 val
13564 }),
13565 5u16 => LinkinfoGeneveAttrs::Port({
13566 let res = parse_be_u16(next);
13567 let Some(val) = res else { break };
13568 val
13569 }),
13570 6u16 => LinkinfoGeneveAttrs::CollectMetadata(()),
13571 7u16 => LinkinfoGeneveAttrs::Remote6({
13572 let res = Some(next);
13573 let Some(val) = res else { break };
13574 val
13575 }),
13576 8u16 => LinkinfoGeneveAttrs::UdpCsum({
13577 let res = parse_u8(next);
13578 let Some(val) = res else { break };
13579 val
13580 }),
13581 9u16 => LinkinfoGeneveAttrs::UdpZeroCsum6Tx({
13582 let res = parse_u8(next);
13583 let Some(val) = res else { break };
13584 val
13585 }),
13586 10u16 => LinkinfoGeneveAttrs::UdpZeroCsum6Rx({
13587 let res = parse_u8(next);
13588 let Some(val) = res else { break };
13589 val
13590 }),
13591 11u16 => LinkinfoGeneveAttrs::Label({
13592 let res = parse_be_u32(next);
13593 let Some(val) = res else { break };
13594 val
13595 }),
13596 12u16 => LinkinfoGeneveAttrs::TtlInherit({
13597 let res = parse_u8(next);
13598 let Some(val) = res else { break };
13599 val
13600 }),
13601 13u16 => LinkinfoGeneveAttrs::Df({
13602 let res = parse_u8(next);
13603 let Some(val) = res else { break };
13604 val
13605 }),
13606 14u16 => LinkinfoGeneveAttrs::InnerProtoInherit(()),
13607 15u16 => LinkinfoGeneveAttrs::PortRange({
13608 let res = Some(IflaGenevePortRange::new_from_zeroed(next));
13609 let Some(val) = res else { break };
13610 val
13611 }),
13612 16u16 => LinkinfoGeneveAttrs::GroHint(()),
13613 17u16 => LinkinfoGeneveAttrs::Local({
13614 let res = parse_be_u32(next).map(Ipv4Addr::from_bits);
13615 let Some(val) = res else { break };
13616 val
13617 }),
13618 18u16 => LinkinfoGeneveAttrs::Local6({
13619 let res = Some(next);
13620 let Some(val) = res else { break };
13621 val
13622 }),
13623 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
13624 n => continue,
13625 };
13626 return Some(Ok(res));
13627 }
13628 Some(Err(ErrorContext::new(
13629 "LinkinfoGeneveAttrs",
13630 r#type.and_then(|t| LinkinfoGeneveAttrs::attr_from_type(t)),
13631 self.orig_loc,
13632 self.buf.as_ptr().wrapping_add(pos) as usize,
13633 )))
13634 }
13635}
13636impl<'a> std::fmt::Debug for IterableLinkinfoGeneveAttrs<'_> {
13637 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
13638 let mut fmt = f.debug_struct("LinkinfoGeneveAttrs");
13639 for attr in self.clone() {
13640 let attr = match attr {
13641 Ok(a) => a,
13642 Err(err) => {
13643 fmt.finish()?;
13644 f.write_str("Err(")?;
13645 err.fmt(f)?;
13646 return f.write_str(")");
13647 }
13648 };
13649 match attr {
13650 LinkinfoGeneveAttrs::Id(val) => fmt.field("Id", &val),
13651 LinkinfoGeneveAttrs::Remote(val) => fmt.field("Remote", &val),
13652 LinkinfoGeneveAttrs::Ttl(val) => fmt.field("Ttl", &val),
13653 LinkinfoGeneveAttrs::Tos(val) => fmt.field("Tos", &val),
13654 LinkinfoGeneveAttrs::Port(val) => fmt.field("Port", &val),
13655 LinkinfoGeneveAttrs::CollectMetadata(val) => fmt.field("CollectMetadata", &val),
13656 LinkinfoGeneveAttrs::Remote6(val) => fmt.field("Remote6", &val),
13657 LinkinfoGeneveAttrs::UdpCsum(val) => fmt.field("UdpCsum", &val),
13658 LinkinfoGeneveAttrs::UdpZeroCsum6Tx(val) => fmt.field("UdpZeroCsum6Tx", &val),
13659 LinkinfoGeneveAttrs::UdpZeroCsum6Rx(val) => fmt.field("UdpZeroCsum6Rx", &val),
13660 LinkinfoGeneveAttrs::Label(val) => fmt.field("Label", &val),
13661 LinkinfoGeneveAttrs::TtlInherit(val) => fmt.field("TtlInherit", &val),
13662 LinkinfoGeneveAttrs::Df(val) => fmt.field("Df", &val),
13663 LinkinfoGeneveAttrs::InnerProtoInherit(val) => fmt.field("InnerProtoInherit", &val),
13664 LinkinfoGeneveAttrs::PortRange(val) => fmt.field("PortRange", &val),
13665 LinkinfoGeneveAttrs::GroHint(val) => fmt.field("GroHint", &val),
13666 LinkinfoGeneveAttrs::Local(val) => fmt.field("Local", &val),
13667 LinkinfoGeneveAttrs::Local6(val) => fmt.field("Local6", &val),
13668 };
13669 }
13670 fmt.finish()
13671 }
13672}
13673impl IterableLinkinfoGeneveAttrs<'_> {
13674 pub fn lookup_attr(
13675 &self,
13676 offset: usize,
13677 missing_type: Option<u16>,
13678 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
13679 let mut stack = Vec::new();
13680 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
13681 if missing_type.is_some() && cur == offset {
13682 stack.push(("LinkinfoGeneveAttrs", offset));
13683 return (
13684 stack,
13685 missing_type.and_then(|t| LinkinfoGeneveAttrs::attr_from_type(t)),
13686 );
13687 }
13688 if cur > offset || cur + self.buf.len() < offset {
13689 return (stack, None);
13690 }
13691 let mut attrs = self.clone();
13692 let mut last_off = cur + attrs.pos;
13693 while let Some(attr) = attrs.next() {
13694 let Ok(attr) = attr else { break };
13695 match attr {
13696 LinkinfoGeneveAttrs::Id(val) => {
13697 if last_off == offset {
13698 stack.push(("Id", last_off));
13699 break;
13700 }
13701 }
13702 LinkinfoGeneveAttrs::Remote(val) => {
13703 if last_off == offset {
13704 stack.push(("Remote", last_off));
13705 break;
13706 }
13707 }
13708 LinkinfoGeneveAttrs::Ttl(val) => {
13709 if last_off == offset {
13710 stack.push(("Ttl", last_off));
13711 break;
13712 }
13713 }
13714 LinkinfoGeneveAttrs::Tos(val) => {
13715 if last_off == offset {
13716 stack.push(("Tos", last_off));
13717 break;
13718 }
13719 }
13720 LinkinfoGeneveAttrs::Port(val) => {
13721 if last_off == offset {
13722 stack.push(("Port", last_off));
13723 break;
13724 }
13725 }
13726 LinkinfoGeneveAttrs::CollectMetadata(val) => {
13727 if last_off == offset {
13728 stack.push(("CollectMetadata", last_off));
13729 break;
13730 }
13731 }
13732 LinkinfoGeneveAttrs::Remote6(val) => {
13733 if last_off == offset {
13734 stack.push(("Remote6", last_off));
13735 break;
13736 }
13737 }
13738 LinkinfoGeneveAttrs::UdpCsum(val) => {
13739 if last_off == offset {
13740 stack.push(("UdpCsum", last_off));
13741 break;
13742 }
13743 }
13744 LinkinfoGeneveAttrs::UdpZeroCsum6Tx(val) => {
13745 if last_off == offset {
13746 stack.push(("UdpZeroCsum6Tx", last_off));
13747 break;
13748 }
13749 }
13750 LinkinfoGeneveAttrs::UdpZeroCsum6Rx(val) => {
13751 if last_off == offset {
13752 stack.push(("UdpZeroCsum6Rx", last_off));
13753 break;
13754 }
13755 }
13756 LinkinfoGeneveAttrs::Label(val) => {
13757 if last_off == offset {
13758 stack.push(("Label", last_off));
13759 break;
13760 }
13761 }
13762 LinkinfoGeneveAttrs::TtlInherit(val) => {
13763 if last_off == offset {
13764 stack.push(("TtlInherit", last_off));
13765 break;
13766 }
13767 }
13768 LinkinfoGeneveAttrs::Df(val) => {
13769 if last_off == offset {
13770 stack.push(("Df", last_off));
13771 break;
13772 }
13773 }
13774 LinkinfoGeneveAttrs::InnerProtoInherit(val) => {
13775 if last_off == offset {
13776 stack.push(("InnerProtoInherit", last_off));
13777 break;
13778 }
13779 }
13780 LinkinfoGeneveAttrs::PortRange(val) => {
13781 if last_off == offset {
13782 stack.push(("PortRange", last_off));
13783 break;
13784 }
13785 }
13786 LinkinfoGeneveAttrs::GroHint(val) => {
13787 if last_off == offset {
13788 stack.push(("GroHint", last_off));
13789 break;
13790 }
13791 }
13792 LinkinfoGeneveAttrs::Local(val) => {
13793 if last_off == offset {
13794 stack.push(("Local", last_off));
13795 break;
13796 }
13797 }
13798 LinkinfoGeneveAttrs::Local6(val) => {
13799 if last_off == offset {
13800 stack.push(("Local6", last_off));
13801 break;
13802 }
13803 }
13804 _ => {}
13805 };
13806 last_off = cur + attrs.pos;
13807 }
13808 if !stack.is_empty() {
13809 stack.push(("LinkinfoGeneveAttrs", cur));
13810 }
13811 (stack, None)
13812 }
13813}
13814#[derive(Clone)]
13815pub enum LinkinfoHsrAttrs<'a> {
13816 Slave1(u32),
13817 Slave2(u32),
13818 MulticastSpec(u8),
13819 SupervisionAddr(&'a [u8]),
13820 SeqNr(u16),
13821 Version(u8),
13822 Protocol(u8),
13823 Interlink(u32),
13824}
13825impl<'a> IterableLinkinfoHsrAttrs<'a> {
13826 pub fn get_slave1(&self) -> Result<u32, ErrorContext> {
13827 let mut iter = self.clone();
13828 iter.pos = 0;
13829 for attr in iter {
13830 if let Ok(LinkinfoHsrAttrs::Slave1(val)) = attr {
13831 return Ok(val);
13832 }
13833 }
13834 Err(ErrorContext::new_missing(
13835 "LinkinfoHsrAttrs",
13836 "Slave1",
13837 self.orig_loc,
13838 self.buf.as_ptr() as usize,
13839 ))
13840 }
13841 pub fn get_slave2(&self) -> Result<u32, ErrorContext> {
13842 let mut iter = self.clone();
13843 iter.pos = 0;
13844 for attr in iter {
13845 if let Ok(LinkinfoHsrAttrs::Slave2(val)) = attr {
13846 return Ok(val);
13847 }
13848 }
13849 Err(ErrorContext::new_missing(
13850 "LinkinfoHsrAttrs",
13851 "Slave2",
13852 self.orig_loc,
13853 self.buf.as_ptr() as usize,
13854 ))
13855 }
13856 pub fn get_multicast_spec(&self) -> Result<u8, ErrorContext> {
13857 let mut iter = self.clone();
13858 iter.pos = 0;
13859 for attr in iter {
13860 if let Ok(LinkinfoHsrAttrs::MulticastSpec(val)) = attr {
13861 return Ok(val);
13862 }
13863 }
13864 Err(ErrorContext::new_missing(
13865 "LinkinfoHsrAttrs",
13866 "MulticastSpec",
13867 self.orig_loc,
13868 self.buf.as_ptr() as usize,
13869 ))
13870 }
13871 pub fn get_supervision_addr(&self) -> Result<&'a [u8], ErrorContext> {
13872 let mut iter = self.clone();
13873 iter.pos = 0;
13874 for attr in iter {
13875 if let Ok(LinkinfoHsrAttrs::SupervisionAddr(val)) = attr {
13876 return Ok(val);
13877 }
13878 }
13879 Err(ErrorContext::new_missing(
13880 "LinkinfoHsrAttrs",
13881 "SupervisionAddr",
13882 self.orig_loc,
13883 self.buf.as_ptr() as usize,
13884 ))
13885 }
13886 pub fn get_seq_nr(&self) -> Result<u16, ErrorContext> {
13887 let mut iter = self.clone();
13888 iter.pos = 0;
13889 for attr in iter {
13890 if let Ok(LinkinfoHsrAttrs::SeqNr(val)) = attr {
13891 return Ok(val);
13892 }
13893 }
13894 Err(ErrorContext::new_missing(
13895 "LinkinfoHsrAttrs",
13896 "SeqNr",
13897 self.orig_loc,
13898 self.buf.as_ptr() as usize,
13899 ))
13900 }
13901 pub fn get_version(&self) -> Result<u8, ErrorContext> {
13902 let mut iter = self.clone();
13903 iter.pos = 0;
13904 for attr in iter {
13905 if let Ok(LinkinfoHsrAttrs::Version(val)) = attr {
13906 return Ok(val);
13907 }
13908 }
13909 Err(ErrorContext::new_missing(
13910 "LinkinfoHsrAttrs",
13911 "Version",
13912 self.orig_loc,
13913 self.buf.as_ptr() as usize,
13914 ))
13915 }
13916 pub fn get_protocol(&self) -> Result<u8, ErrorContext> {
13917 let mut iter = self.clone();
13918 iter.pos = 0;
13919 for attr in iter {
13920 if let Ok(LinkinfoHsrAttrs::Protocol(val)) = attr {
13921 return Ok(val);
13922 }
13923 }
13924 Err(ErrorContext::new_missing(
13925 "LinkinfoHsrAttrs",
13926 "Protocol",
13927 self.orig_loc,
13928 self.buf.as_ptr() as usize,
13929 ))
13930 }
13931 pub fn get_interlink(&self) -> Result<u32, ErrorContext> {
13932 let mut iter = self.clone();
13933 iter.pos = 0;
13934 for attr in iter {
13935 if let Ok(LinkinfoHsrAttrs::Interlink(val)) = attr {
13936 return Ok(val);
13937 }
13938 }
13939 Err(ErrorContext::new_missing(
13940 "LinkinfoHsrAttrs",
13941 "Interlink",
13942 self.orig_loc,
13943 self.buf.as_ptr() as usize,
13944 ))
13945 }
13946}
13947impl LinkinfoHsrAttrs<'_> {
13948 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoHsrAttrs<'a> {
13949 IterableLinkinfoHsrAttrs::with_loc(buf, buf.as_ptr() as usize)
13950 }
13951 fn attr_from_type(r#type: u16) -> Option<&'static str> {
13952 let res = match r#type {
13953 1u16 => "Slave1",
13954 2u16 => "Slave2",
13955 3u16 => "MulticastSpec",
13956 4u16 => "SupervisionAddr",
13957 5u16 => "SeqNr",
13958 6u16 => "Version",
13959 7u16 => "Protocol",
13960 8u16 => "Interlink",
13961 _ => return None,
13962 };
13963 Some(res)
13964 }
13965}
13966#[derive(Clone, Copy, Default)]
13967pub struct IterableLinkinfoHsrAttrs<'a> {
13968 buf: &'a [u8],
13969 pos: usize,
13970 orig_loc: usize,
13971}
13972impl<'a> IterableLinkinfoHsrAttrs<'a> {
13973 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
13974 Self {
13975 buf,
13976 pos: 0,
13977 orig_loc,
13978 }
13979 }
13980 pub fn get_buf(&self) -> &'a [u8] {
13981 self.buf
13982 }
13983}
13984impl<'a> Iterator for IterableLinkinfoHsrAttrs<'a> {
13985 type Item = Result<LinkinfoHsrAttrs<'a>, ErrorContext>;
13986 fn next(&mut self) -> Option<Self::Item> {
13987 let mut pos;
13988 let mut r#type;
13989 loop {
13990 pos = self.pos;
13991 r#type = None;
13992 if self.buf.len() == self.pos {
13993 return None;
13994 }
13995 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
13996 self.pos = self.buf.len();
13997 break;
13998 };
13999 r#type = Some(header.r#type);
14000 let res = match header.r#type {
14001 1u16 => LinkinfoHsrAttrs::Slave1({
14002 let res = parse_u32(next);
14003 let Some(val) = res else { break };
14004 val
14005 }),
14006 2u16 => LinkinfoHsrAttrs::Slave2({
14007 let res = parse_u32(next);
14008 let Some(val) = res else { break };
14009 val
14010 }),
14011 3u16 => LinkinfoHsrAttrs::MulticastSpec({
14012 let res = parse_u8(next);
14013 let Some(val) = res else { break };
14014 val
14015 }),
14016 4u16 => LinkinfoHsrAttrs::SupervisionAddr({
14017 let res = Some(next);
14018 let Some(val) = res else { break };
14019 val
14020 }),
14021 5u16 => LinkinfoHsrAttrs::SeqNr({
14022 let res = parse_u16(next);
14023 let Some(val) = res else { break };
14024 val
14025 }),
14026 6u16 => LinkinfoHsrAttrs::Version({
14027 let res = parse_u8(next);
14028 let Some(val) = res else { break };
14029 val
14030 }),
14031 7u16 => LinkinfoHsrAttrs::Protocol({
14032 let res = parse_u8(next);
14033 let Some(val) = res else { break };
14034 val
14035 }),
14036 8u16 => LinkinfoHsrAttrs::Interlink({
14037 let res = parse_u32(next);
14038 let Some(val) = res else { break };
14039 val
14040 }),
14041 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
14042 n => continue,
14043 };
14044 return Some(Ok(res));
14045 }
14046 Some(Err(ErrorContext::new(
14047 "LinkinfoHsrAttrs",
14048 r#type.and_then(|t| LinkinfoHsrAttrs::attr_from_type(t)),
14049 self.orig_loc,
14050 self.buf.as_ptr().wrapping_add(pos) as usize,
14051 )))
14052 }
14053}
14054impl<'a> std::fmt::Debug for IterableLinkinfoHsrAttrs<'_> {
14055 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14056 let mut fmt = f.debug_struct("LinkinfoHsrAttrs");
14057 for attr in self.clone() {
14058 let attr = match attr {
14059 Ok(a) => a,
14060 Err(err) => {
14061 fmt.finish()?;
14062 f.write_str("Err(")?;
14063 err.fmt(f)?;
14064 return f.write_str(")");
14065 }
14066 };
14067 match attr {
14068 LinkinfoHsrAttrs::Slave1(val) => fmt.field("Slave1", &val),
14069 LinkinfoHsrAttrs::Slave2(val) => fmt.field("Slave2", &val),
14070 LinkinfoHsrAttrs::MulticastSpec(val) => fmt.field("MulticastSpec", &val),
14071 LinkinfoHsrAttrs::SupervisionAddr(val) => {
14072 fmt.field("SupervisionAddr", &FormatMac(val))
14073 }
14074 LinkinfoHsrAttrs::SeqNr(val) => fmt.field("SeqNr", &val),
14075 LinkinfoHsrAttrs::Version(val) => fmt.field("Version", &val),
14076 LinkinfoHsrAttrs::Protocol(val) => fmt.field("Protocol", &val),
14077 LinkinfoHsrAttrs::Interlink(val) => fmt.field("Interlink", &val),
14078 };
14079 }
14080 fmt.finish()
14081 }
14082}
14083impl IterableLinkinfoHsrAttrs<'_> {
14084 pub fn lookup_attr(
14085 &self,
14086 offset: usize,
14087 missing_type: Option<u16>,
14088 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
14089 let mut stack = Vec::new();
14090 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
14091 if missing_type.is_some() && cur == offset {
14092 stack.push(("LinkinfoHsrAttrs", offset));
14093 return (
14094 stack,
14095 missing_type.and_then(|t| LinkinfoHsrAttrs::attr_from_type(t)),
14096 );
14097 }
14098 if cur > offset || cur + self.buf.len() < offset {
14099 return (stack, None);
14100 }
14101 let mut attrs = self.clone();
14102 let mut last_off = cur + attrs.pos;
14103 while let Some(attr) = attrs.next() {
14104 let Ok(attr) = attr else { break };
14105 match attr {
14106 LinkinfoHsrAttrs::Slave1(val) => {
14107 if last_off == offset {
14108 stack.push(("Slave1", last_off));
14109 break;
14110 }
14111 }
14112 LinkinfoHsrAttrs::Slave2(val) => {
14113 if last_off == offset {
14114 stack.push(("Slave2", last_off));
14115 break;
14116 }
14117 }
14118 LinkinfoHsrAttrs::MulticastSpec(val) => {
14119 if last_off == offset {
14120 stack.push(("MulticastSpec", last_off));
14121 break;
14122 }
14123 }
14124 LinkinfoHsrAttrs::SupervisionAddr(val) => {
14125 if last_off == offset {
14126 stack.push(("SupervisionAddr", last_off));
14127 break;
14128 }
14129 }
14130 LinkinfoHsrAttrs::SeqNr(val) => {
14131 if last_off == offset {
14132 stack.push(("SeqNr", last_off));
14133 break;
14134 }
14135 }
14136 LinkinfoHsrAttrs::Version(val) => {
14137 if last_off == offset {
14138 stack.push(("Version", last_off));
14139 break;
14140 }
14141 }
14142 LinkinfoHsrAttrs::Protocol(val) => {
14143 if last_off == offset {
14144 stack.push(("Protocol", last_off));
14145 break;
14146 }
14147 }
14148 LinkinfoHsrAttrs::Interlink(val) => {
14149 if last_off == offset {
14150 stack.push(("Interlink", last_off));
14151 break;
14152 }
14153 }
14154 _ => {}
14155 };
14156 last_off = cur + attrs.pos;
14157 }
14158 if !stack.is_empty() {
14159 stack.push(("LinkinfoHsrAttrs", cur));
14160 }
14161 (stack, None)
14162 }
14163}
14164#[derive(Clone)]
14165pub enum LinkinfoIptunAttrs<'a> {
14166 Link(u32),
14167 Local(std::net::IpAddr),
14168 Remote(std::net::IpAddr),
14169 Ttl(u8),
14170 Tos(u8),
14171 EncapLimit(u8),
14172 Flowinfo(u32),
14173 Flags(u16),
14174 Proto(u8),
14175 Pmtudisc(u8),
14176 _6rdPrefix(&'a [u8]),
14177 _6rdRelayPrefix(std::net::Ipv4Addr),
14178 _6rdPrefixlen(u16),
14179 _6rdRelayPrefixlen(u16),
14180 EncapType(u16),
14181 EncapFlags(u16),
14182 EncapSport(u16),
14183 EncapDport(u16),
14184 CollectMetadata(()),
14185 Fwmark(u32),
14186}
14187impl<'a> IterableLinkinfoIptunAttrs<'a> {
14188 pub fn get_link(&self) -> Result<u32, ErrorContext> {
14189 let mut iter = self.clone();
14190 iter.pos = 0;
14191 for attr in iter {
14192 if let Ok(LinkinfoIptunAttrs::Link(val)) = attr {
14193 return Ok(val);
14194 }
14195 }
14196 Err(ErrorContext::new_missing(
14197 "LinkinfoIptunAttrs",
14198 "Link",
14199 self.orig_loc,
14200 self.buf.as_ptr() as usize,
14201 ))
14202 }
14203 pub fn get_local(&self) -> Result<std::net::IpAddr, ErrorContext> {
14204 let mut iter = self.clone();
14205 iter.pos = 0;
14206 for attr in iter {
14207 if let Ok(LinkinfoIptunAttrs::Local(val)) = attr {
14208 return Ok(val);
14209 }
14210 }
14211 Err(ErrorContext::new_missing(
14212 "LinkinfoIptunAttrs",
14213 "Local",
14214 self.orig_loc,
14215 self.buf.as_ptr() as usize,
14216 ))
14217 }
14218 pub fn get_remote(&self) -> Result<std::net::IpAddr, ErrorContext> {
14219 let mut iter = self.clone();
14220 iter.pos = 0;
14221 for attr in iter {
14222 if let Ok(LinkinfoIptunAttrs::Remote(val)) = attr {
14223 return Ok(val);
14224 }
14225 }
14226 Err(ErrorContext::new_missing(
14227 "LinkinfoIptunAttrs",
14228 "Remote",
14229 self.orig_loc,
14230 self.buf.as_ptr() as usize,
14231 ))
14232 }
14233 pub fn get_ttl(&self) -> Result<u8, ErrorContext> {
14234 let mut iter = self.clone();
14235 iter.pos = 0;
14236 for attr in iter {
14237 if let Ok(LinkinfoIptunAttrs::Ttl(val)) = attr {
14238 return Ok(val);
14239 }
14240 }
14241 Err(ErrorContext::new_missing(
14242 "LinkinfoIptunAttrs",
14243 "Ttl",
14244 self.orig_loc,
14245 self.buf.as_ptr() as usize,
14246 ))
14247 }
14248 pub fn get_tos(&self) -> Result<u8, ErrorContext> {
14249 let mut iter = self.clone();
14250 iter.pos = 0;
14251 for attr in iter {
14252 if let Ok(LinkinfoIptunAttrs::Tos(val)) = attr {
14253 return Ok(val);
14254 }
14255 }
14256 Err(ErrorContext::new_missing(
14257 "LinkinfoIptunAttrs",
14258 "Tos",
14259 self.orig_loc,
14260 self.buf.as_ptr() as usize,
14261 ))
14262 }
14263 pub fn get_encap_limit(&self) -> Result<u8, ErrorContext> {
14264 let mut iter = self.clone();
14265 iter.pos = 0;
14266 for attr in iter {
14267 if let Ok(LinkinfoIptunAttrs::EncapLimit(val)) = attr {
14268 return Ok(val);
14269 }
14270 }
14271 Err(ErrorContext::new_missing(
14272 "LinkinfoIptunAttrs",
14273 "EncapLimit",
14274 self.orig_loc,
14275 self.buf.as_ptr() as usize,
14276 ))
14277 }
14278 pub fn get_flowinfo(&self) -> Result<u32, ErrorContext> {
14279 let mut iter = self.clone();
14280 iter.pos = 0;
14281 for attr in iter {
14282 if let Ok(LinkinfoIptunAttrs::Flowinfo(val)) = attr {
14283 return Ok(val);
14284 }
14285 }
14286 Err(ErrorContext::new_missing(
14287 "LinkinfoIptunAttrs",
14288 "Flowinfo",
14289 self.orig_loc,
14290 self.buf.as_ptr() as usize,
14291 ))
14292 }
14293 pub fn get_flags(&self) -> Result<u16, ErrorContext> {
14294 let mut iter = self.clone();
14295 iter.pos = 0;
14296 for attr in iter {
14297 if let Ok(LinkinfoIptunAttrs::Flags(val)) = attr {
14298 return Ok(val);
14299 }
14300 }
14301 Err(ErrorContext::new_missing(
14302 "LinkinfoIptunAttrs",
14303 "Flags",
14304 self.orig_loc,
14305 self.buf.as_ptr() as usize,
14306 ))
14307 }
14308 pub fn get_proto(&self) -> Result<u8, ErrorContext> {
14309 let mut iter = self.clone();
14310 iter.pos = 0;
14311 for attr in iter {
14312 if let Ok(LinkinfoIptunAttrs::Proto(val)) = attr {
14313 return Ok(val);
14314 }
14315 }
14316 Err(ErrorContext::new_missing(
14317 "LinkinfoIptunAttrs",
14318 "Proto",
14319 self.orig_loc,
14320 self.buf.as_ptr() as usize,
14321 ))
14322 }
14323 pub fn get_pmtudisc(&self) -> Result<u8, ErrorContext> {
14324 let mut iter = self.clone();
14325 iter.pos = 0;
14326 for attr in iter {
14327 if let Ok(LinkinfoIptunAttrs::Pmtudisc(val)) = attr {
14328 return Ok(val);
14329 }
14330 }
14331 Err(ErrorContext::new_missing(
14332 "LinkinfoIptunAttrs",
14333 "Pmtudisc",
14334 self.orig_loc,
14335 self.buf.as_ptr() as usize,
14336 ))
14337 }
14338 pub fn get_6rd_prefix(&self) -> Result<&'a [u8], ErrorContext> {
14339 let mut iter = self.clone();
14340 iter.pos = 0;
14341 for attr in iter {
14342 if let Ok(LinkinfoIptunAttrs::_6rdPrefix(val)) = attr {
14343 return Ok(val);
14344 }
14345 }
14346 Err(ErrorContext::new_missing(
14347 "LinkinfoIptunAttrs",
14348 "6rdPrefix",
14349 self.orig_loc,
14350 self.buf.as_ptr() as usize,
14351 ))
14352 }
14353 pub fn get_6rd_relay_prefix(&self) -> Result<std::net::Ipv4Addr, ErrorContext> {
14354 let mut iter = self.clone();
14355 iter.pos = 0;
14356 for attr in iter {
14357 if let Ok(LinkinfoIptunAttrs::_6rdRelayPrefix(val)) = attr {
14358 return Ok(val);
14359 }
14360 }
14361 Err(ErrorContext::new_missing(
14362 "LinkinfoIptunAttrs",
14363 "6rdRelayPrefix",
14364 self.orig_loc,
14365 self.buf.as_ptr() as usize,
14366 ))
14367 }
14368 pub fn get_6rd_prefixlen(&self) -> Result<u16, ErrorContext> {
14369 let mut iter = self.clone();
14370 iter.pos = 0;
14371 for attr in iter {
14372 if let Ok(LinkinfoIptunAttrs::_6rdPrefixlen(val)) = attr {
14373 return Ok(val);
14374 }
14375 }
14376 Err(ErrorContext::new_missing(
14377 "LinkinfoIptunAttrs",
14378 "6rdPrefixlen",
14379 self.orig_loc,
14380 self.buf.as_ptr() as usize,
14381 ))
14382 }
14383 pub fn get_6rd_relay_prefixlen(&self) -> Result<u16, ErrorContext> {
14384 let mut iter = self.clone();
14385 iter.pos = 0;
14386 for attr in iter {
14387 if let Ok(LinkinfoIptunAttrs::_6rdRelayPrefixlen(val)) = attr {
14388 return Ok(val);
14389 }
14390 }
14391 Err(ErrorContext::new_missing(
14392 "LinkinfoIptunAttrs",
14393 "6rdRelayPrefixlen",
14394 self.orig_loc,
14395 self.buf.as_ptr() as usize,
14396 ))
14397 }
14398 pub fn get_encap_type(&self) -> Result<u16, ErrorContext> {
14399 let mut iter = self.clone();
14400 iter.pos = 0;
14401 for attr in iter {
14402 if let Ok(LinkinfoIptunAttrs::EncapType(val)) = attr {
14403 return Ok(val);
14404 }
14405 }
14406 Err(ErrorContext::new_missing(
14407 "LinkinfoIptunAttrs",
14408 "EncapType",
14409 self.orig_loc,
14410 self.buf.as_ptr() as usize,
14411 ))
14412 }
14413 pub fn get_encap_flags(&self) -> Result<u16, ErrorContext> {
14414 let mut iter = self.clone();
14415 iter.pos = 0;
14416 for attr in iter {
14417 if let Ok(LinkinfoIptunAttrs::EncapFlags(val)) = attr {
14418 return Ok(val);
14419 }
14420 }
14421 Err(ErrorContext::new_missing(
14422 "LinkinfoIptunAttrs",
14423 "EncapFlags",
14424 self.orig_loc,
14425 self.buf.as_ptr() as usize,
14426 ))
14427 }
14428 pub fn get_encap_sport(&self) -> Result<u16, ErrorContext> {
14429 let mut iter = self.clone();
14430 iter.pos = 0;
14431 for attr in iter {
14432 if let Ok(LinkinfoIptunAttrs::EncapSport(val)) = attr {
14433 return Ok(val);
14434 }
14435 }
14436 Err(ErrorContext::new_missing(
14437 "LinkinfoIptunAttrs",
14438 "EncapSport",
14439 self.orig_loc,
14440 self.buf.as_ptr() as usize,
14441 ))
14442 }
14443 pub fn get_encap_dport(&self) -> Result<u16, ErrorContext> {
14444 let mut iter = self.clone();
14445 iter.pos = 0;
14446 for attr in iter {
14447 if let Ok(LinkinfoIptunAttrs::EncapDport(val)) = attr {
14448 return Ok(val);
14449 }
14450 }
14451 Err(ErrorContext::new_missing(
14452 "LinkinfoIptunAttrs",
14453 "EncapDport",
14454 self.orig_loc,
14455 self.buf.as_ptr() as usize,
14456 ))
14457 }
14458 pub fn get_collect_metadata(&self) -> Result<(), ErrorContext> {
14459 let mut iter = self.clone();
14460 iter.pos = 0;
14461 for attr in iter {
14462 if let Ok(LinkinfoIptunAttrs::CollectMetadata(val)) = attr {
14463 return Ok(val);
14464 }
14465 }
14466 Err(ErrorContext::new_missing(
14467 "LinkinfoIptunAttrs",
14468 "CollectMetadata",
14469 self.orig_loc,
14470 self.buf.as_ptr() as usize,
14471 ))
14472 }
14473 pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
14474 let mut iter = self.clone();
14475 iter.pos = 0;
14476 for attr in iter {
14477 if let Ok(LinkinfoIptunAttrs::Fwmark(val)) = attr {
14478 return Ok(val);
14479 }
14480 }
14481 Err(ErrorContext::new_missing(
14482 "LinkinfoIptunAttrs",
14483 "Fwmark",
14484 self.orig_loc,
14485 self.buf.as_ptr() as usize,
14486 ))
14487 }
14488}
14489impl LinkinfoIptunAttrs<'_> {
14490 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoIptunAttrs<'a> {
14491 IterableLinkinfoIptunAttrs::with_loc(buf, buf.as_ptr() as usize)
14492 }
14493 fn attr_from_type(r#type: u16) -> Option<&'static str> {
14494 let res = match r#type {
14495 1u16 => "Link",
14496 2u16 => "Local",
14497 3u16 => "Remote",
14498 4u16 => "Ttl",
14499 5u16 => "Tos",
14500 6u16 => "EncapLimit",
14501 7u16 => "Flowinfo",
14502 8u16 => "Flags",
14503 9u16 => "Proto",
14504 10u16 => "Pmtudisc",
14505 11u16 => "6rdPrefix",
14506 12u16 => "6rdRelayPrefix",
14507 13u16 => "6rdPrefixlen",
14508 14u16 => "6rdRelayPrefixlen",
14509 15u16 => "EncapType",
14510 16u16 => "EncapFlags",
14511 17u16 => "EncapSport",
14512 18u16 => "EncapDport",
14513 19u16 => "CollectMetadata",
14514 20u16 => "Fwmark",
14515 _ => return None,
14516 };
14517 Some(res)
14518 }
14519}
14520#[derive(Clone, Copy, Default)]
14521pub struct IterableLinkinfoIptunAttrs<'a> {
14522 buf: &'a [u8],
14523 pos: usize,
14524 orig_loc: usize,
14525}
14526impl<'a> IterableLinkinfoIptunAttrs<'a> {
14527 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
14528 Self {
14529 buf,
14530 pos: 0,
14531 orig_loc,
14532 }
14533 }
14534 pub fn get_buf(&self) -> &'a [u8] {
14535 self.buf
14536 }
14537}
14538impl<'a> Iterator for IterableLinkinfoIptunAttrs<'a> {
14539 type Item = Result<LinkinfoIptunAttrs<'a>, ErrorContext>;
14540 fn next(&mut self) -> Option<Self::Item> {
14541 let mut pos;
14542 let mut r#type;
14543 loop {
14544 pos = self.pos;
14545 r#type = None;
14546 if self.buf.len() == self.pos {
14547 return None;
14548 }
14549 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
14550 self.pos = self.buf.len();
14551 break;
14552 };
14553 r#type = Some(header.r#type);
14554 let res = match header.r#type {
14555 1u16 => LinkinfoIptunAttrs::Link({
14556 let res = parse_u32(next);
14557 let Some(val) = res else { break };
14558 val
14559 }),
14560 2u16 => LinkinfoIptunAttrs::Local({
14561 let res = parse_ip(next);
14562 let Some(val) = res else { break };
14563 val
14564 }),
14565 3u16 => LinkinfoIptunAttrs::Remote({
14566 let res = parse_ip(next);
14567 let Some(val) = res else { break };
14568 val
14569 }),
14570 4u16 => LinkinfoIptunAttrs::Ttl({
14571 let res = parse_u8(next);
14572 let Some(val) = res else { break };
14573 val
14574 }),
14575 5u16 => LinkinfoIptunAttrs::Tos({
14576 let res = parse_u8(next);
14577 let Some(val) = res else { break };
14578 val
14579 }),
14580 6u16 => LinkinfoIptunAttrs::EncapLimit({
14581 let res = parse_u8(next);
14582 let Some(val) = res else { break };
14583 val
14584 }),
14585 7u16 => LinkinfoIptunAttrs::Flowinfo({
14586 let res = parse_be_u32(next);
14587 let Some(val) = res else { break };
14588 val
14589 }),
14590 8u16 => LinkinfoIptunAttrs::Flags({
14591 let res = parse_be_u16(next);
14592 let Some(val) = res else { break };
14593 val
14594 }),
14595 9u16 => LinkinfoIptunAttrs::Proto({
14596 let res = parse_u8(next);
14597 let Some(val) = res else { break };
14598 val
14599 }),
14600 10u16 => LinkinfoIptunAttrs::Pmtudisc({
14601 let res = parse_u8(next);
14602 let Some(val) = res else { break };
14603 val
14604 }),
14605 11u16 => LinkinfoIptunAttrs::_6rdPrefix({
14606 let res = Some(next);
14607 let Some(val) = res else { break };
14608 val
14609 }),
14610 12u16 => LinkinfoIptunAttrs::_6rdRelayPrefix({
14611 let res = parse_be_u32(next).map(Ipv4Addr::from_bits);
14612 let Some(val) = res else { break };
14613 val
14614 }),
14615 13u16 => LinkinfoIptunAttrs::_6rdPrefixlen({
14616 let res = parse_u16(next);
14617 let Some(val) = res else { break };
14618 val
14619 }),
14620 14u16 => LinkinfoIptunAttrs::_6rdRelayPrefixlen({
14621 let res = parse_u16(next);
14622 let Some(val) = res else { break };
14623 val
14624 }),
14625 15u16 => LinkinfoIptunAttrs::EncapType({
14626 let res = parse_u16(next);
14627 let Some(val) = res else { break };
14628 val
14629 }),
14630 16u16 => LinkinfoIptunAttrs::EncapFlags({
14631 let res = parse_u16(next);
14632 let Some(val) = res else { break };
14633 val
14634 }),
14635 17u16 => LinkinfoIptunAttrs::EncapSport({
14636 let res = parse_be_u16(next);
14637 let Some(val) = res else { break };
14638 val
14639 }),
14640 18u16 => LinkinfoIptunAttrs::EncapDport({
14641 let res = parse_be_u16(next);
14642 let Some(val) = res else { break };
14643 val
14644 }),
14645 19u16 => LinkinfoIptunAttrs::CollectMetadata(()),
14646 20u16 => LinkinfoIptunAttrs::Fwmark({
14647 let res = parse_u32(next);
14648 let Some(val) = res else { break };
14649 val
14650 }),
14651 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
14652 n => continue,
14653 };
14654 return Some(Ok(res));
14655 }
14656 Some(Err(ErrorContext::new(
14657 "LinkinfoIptunAttrs",
14658 r#type.and_then(|t| LinkinfoIptunAttrs::attr_from_type(t)),
14659 self.orig_loc,
14660 self.buf.as_ptr().wrapping_add(pos) as usize,
14661 )))
14662 }
14663}
14664impl<'a> std::fmt::Debug for IterableLinkinfoIptunAttrs<'_> {
14665 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
14666 let mut fmt = f.debug_struct("LinkinfoIptunAttrs");
14667 for attr in self.clone() {
14668 let attr = match attr {
14669 Ok(a) => a,
14670 Err(err) => {
14671 fmt.finish()?;
14672 f.write_str("Err(")?;
14673 err.fmt(f)?;
14674 return f.write_str(")");
14675 }
14676 };
14677 match attr {
14678 LinkinfoIptunAttrs::Link(val) => fmt.field("Link", &val),
14679 LinkinfoIptunAttrs::Local(val) => fmt.field("Local", &val),
14680 LinkinfoIptunAttrs::Remote(val) => fmt.field("Remote", &val),
14681 LinkinfoIptunAttrs::Ttl(val) => fmt.field("Ttl", &val),
14682 LinkinfoIptunAttrs::Tos(val) => fmt.field("Tos", &val),
14683 LinkinfoIptunAttrs::EncapLimit(val) => fmt.field("EncapLimit", &val),
14684 LinkinfoIptunAttrs::Flowinfo(val) => fmt.field("Flowinfo", &val),
14685 LinkinfoIptunAttrs::Flags(val) => fmt.field("Flags", &val),
14686 LinkinfoIptunAttrs::Proto(val) => fmt.field("Proto", &val),
14687 LinkinfoIptunAttrs::Pmtudisc(val) => fmt.field("Pmtudisc", &val),
14688 LinkinfoIptunAttrs::_6rdPrefix(val) => fmt.field("_6rdPrefix", &val),
14689 LinkinfoIptunAttrs::_6rdRelayPrefix(val) => fmt.field("_6rdRelayPrefix", &val),
14690 LinkinfoIptunAttrs::_6rdPrefixlen(val) => fmt.field("_6rdPrefixlen", &val),
14691 LinkinfoIptunAttrs::_6rdRelayPrefixlen(val) => {
14692 fmt.field("_6rdRelayPrefixlen", &val)
14693 }
14694 LinkinfoIptunAttrs::EncapType(val) => fmt.field("EncapType", &val),
14695 LinkinfoIptunAttrs::EncapFlags(val) => fmt.field("EncapFlags", &val),
14696 LinkinfoIptunAttrs::EncapSport(val) => fmt.field("EncapSport", &val),
14697 LinkinfoIptunAttrs::EncapDport(val) => fmt.field("EncapDport", &val),
14698 LinkinfoIptunAttrs::CollectMetadata(val) => fmt.field("CollectMetadata", &val),
14699 LinkinfoIptunAttrs::Fwmark(val) => fmt.field("Fwmark", &val),
14700 };
14701 }
14702 fmt.finish()
14703 }
14704}
14705impl IterableLinkinfoIptunAttrs<'_> {
14706 pub fn lookup_attr(
14707 &self,
14708 offset: usize,
14709 missing_type: Option<u16>,
14710 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
14711 let mut stack = Vec::new();
14712 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
14713 if missing_type.is_some() && cur == offset {
14714 stack.push(("LinkinfoIptunAttrs", offset));
14715 return (
14716 stack,
14717 missing_type.and_then(|t| LinkinfoIptunAttrs::attr_from_type(t)),
14718 );
14719 }
14720 if cur > offset || cur + self.buf.len() < offset {
14721 return (stack, None);
14722 }
14723 let mut attrs = self.clone();
14724 let mut last_off = cur + attrs.pos;
14725 while let Some(attr) = attrs.next() {
14726 let Ok(attr) = attr else { break };
14727 match attr {
14728 LinkinfoIptunAttrs::Link(val) => {
14729 if last_off == offset {
14730 stack.push(("Link", last_off));
14731 break;
14732 }
14733 }
14734 LinkinfoIptunAttrs::Local(val) => {
14735 if last_off == offset {
14736 stack.push(("Local", last_off));
14737 break;
14738 }
14739 }
14740 LinkinfoIptunAttrs::Remote(val) => {
14741 if last_off == offset {
14742 stack.push(("Remote", last_off));
14743 break;
14744 }
14745 }
14746 LinkinfoIptunAttrs::Ttl(val) => {
14747 if last_off == offset {
14748 stack.push(("Ttl", last_off));
14749 break;
14750 }
14751 }
14752 LinkinfoIptunAttrs::Tos(val) => {
14753 if last_off == offset {
14754 stack.push(("Tos", last_off));
14755 break;
14756 }
14757 }
14758 LinkinfoIptunAttrs::EncapLimit(val) => {
14759 if last_off == offset {
14760 stack.push(("EncapLimit", last_off));
14761 break;
14762 }
14763 }
14764 LinkinfoIptunAttrs::Flowinfo(val) => {
14765 if last_off == offset {
14766 stack.push(("Flowinfo", last_off));
14767 break;
14768 }
14769 }
14770 LinkinfoIptunAttrs::Flags(val) => {
14771 if last_off == offset {
14772 stack.push(("Flags", last_off));
14773 break;
14774 }
14775 }
14776 LinkinfoIptunAttrs::Proto(val) => {
14777 if last_off == offset {
14778 stack.push(("Proto", last_off));
14779 break;
14780 }
14781 }
14782 LinkinfoIptunAttrs::Pmtudisc(val) => {
14783 if last_off == offset {
14784 stack.push(("Pmtudisc", last_off));
14785 break;
14786 }
14787 }
14788 LinkinfoIptunAttrs::_6rdPrefix(val) => {
14789 if last_off == offset {
14790 stack.push(("6rdPrefix", last_off));
14791 break;
14792 }
14793 }
14794 LinkinfoIptunAttrs::_6rdRelayPrefix(val) => {
14795 if last_off == offset {
14796 stack.push(("6rdRelayPrefix", last_off));
14797 break;
14798 }
14799 }
14800 LinkinfoIptunAttrs::_6rdPrefixlen(val) => {
14801 if last_off == offset {
14802 stack.push(("6rdPrefixlen", last_off));
14803 break;
14804 }
14805 }
14806 LinkinfoIptunAttrs::_6rdRelayPrefixlen(val) => {
14807 if last_off == offset {
14808 stack.push(("6rdRelayPrefixlen", last_off));
14809 break;
14810 }
14811 }
14812 LinkinfoIptunAttrs::EncapType(val) => {
14813 if last_off == offset {
14814 stack.push(("EncapType", last_off));
14815 break;
14816 }
14817 }
14818 LinkinfoIptunAttrs::EncapFlags(val) => {
14819 if last_off == offset {
14820 stack.push(("EncapFlags", last_off));
14821 break;
14822 }
14823 }
14824 LinkinfoIptunAttrs::EncapSport(val) => {
14825 if last_off == offset {
14826 stack.push(("EncapSport", last_off));
14827 break;
14828 }
14829 }
14830 LinkinfoIptunAttrs::EncapDport(val) => {
14831 if last_off == offset {
14832 stack.push(("EncapDport", last_off));
14833 break;
14834 }
14835 }
14836 LinkinfoIptunAttrs::CollectMetadata(val) => {
14837 if last_off == offset {
14838 stack.push(("CollectMetadata", last_off));
14839 break;
14840 }
14841 }
14842 LinkinfoIptunAttrs::Fwmark(val) => {
14843 if last_off == offset {
14844 stack.push(("Fwmark", last_off));
14845 break;
14846 }
14847 }
14848 _ => {}
14849 };
14850 last_off = cur + attrs.pos;
14851 }
14852 if !stack.is_empty() {
14853 stack.push(("LinkinfoIptunAttrs", cur));
14854 }
14855 (stack, None)
14856 }
14857}
14858#[derive(Clone)]
14859pub enum LinkinfoIp6tnlAttrs<'a> {
14860 Link(u32),
14861 Local(&'a [u8]),
14862 Remote(&'a [u8]),
14863 Ttl(u8),
14864 EncapLimit(u8),
14865 Flowinfo(u32),
14866 Flags(u32),
14867 Proto(u8),
14868 EncapType(u16),
14869 EncapFlags(u16),
14870 EncapSport(u16),
14871 EncapDport(u16),
14872 CollectMetadata(()),
14873 Fwmark(u32),
14874}
14875impl<'a> IterableLinkinfoIp6tnlAttrs<'a> {
14876 pub fn get_link(&self) -> Result<u32, ErrorContext> {
14877 let mut iter = self.clone();
14878 iter.pos = 0;
14879 for attr in iter {
14880 if let Ok(LinkinfoIp6tnlAttrs::Link(val)) = attr {
14881 return Ok(val);
14882 }
14883 }
14884 Err(ErrorContext::new_missing(
14885 "LinkinfoIp6tnlAttrs",
14886 "Link",
14887 self.orig_loc,
14888 self.buf.as_ptr() as usize,
14889 ))
14890 }
14891 pub fn get_local(&self) -> Result<&'a [u8], ErrorContext> {
14892 let mut iter = self.clone();
14893 iter.pos = 0;
14894 for attr in iter {
14895 if let Ok(LinkinfoIp6tnlAttrs::Local(val)) = attr {
14896 return Ok(val);
14897 }
14898 }
14899 Err(ErrorContext::new_missing(
14900 "LinkinfoIp6tnlAttrs",
14901 "Local",
14902 self.orig_loc,
14903 self.buf.as_ptr() as usize,
14904 ))
14905 }
14906 pub fn get_remote(&self) -> Result<&'a [u8], ErrorContext> {
14907 let mut iter = self.clone();
14908 iter.pos = 0;
14909 for attr in iter {
14910 if let Ok(LinkinfoIp6tnlAttrs::Remote(val)) = attr {
14911 return Ok(val);
14912 }
14913 }
14914 Err(ErrorContext::new_missing(
14915 "LinkinfoIp6tnlAttrs",
14916 "Remote",
14917 self.orig_loc,
14918 self.buf.as_ptr() as usize,
14919 ))
14920 }
14921 pub fn get_ttl(&self) -> Result<u8, ErrorContext> {
14922 let mut iter = self.clone();
14923 iter.pos = 0;
14924 for attr in iter {
14925 if let Ok(LinkinfoIp6tnlAttrs::Ttl(val)) = attr {
14926 return Ok(val);
14927 }
14928 }
14929 Err(ErrorContext::new_missing(
14930 "LinkinfoIp6tnlAttrs",
14931 "Ttl",
14932 self.orig_loc,
14933 self.buf.as_ptr() as usize,
14934 ))
14935 }
14936 pub fn get_encap_limit(&self) -> Result<u8, ErrorContext> {
14937 let mut iter = self.clone();
14938 iter.pos = 0;
14939 for attr in iter {
14940 if let Ok(LinkinfoIp6tnlAttrs::EncapLimit(val)) = attr {
14941 return Ok(val);
14942 }
14943 }
14944 Err(ErrorContext::new_missing(
14945 "LinkinfoIp6tnlAttrs",
14946 "EncapLimit",
14947 self.orig_loc,
14948 self.buf.as_ptr() as usize,
14949 ))
14950 }
14951 pub fn get_flowinfo(&self) -> Result<u32, ErrorContext> {
14952 let mut iter = self.clone();
14953 iter.pos = 0;
14954 for attr in iter {
14955 if let Ok(LinkinfoIp6tnlAttrs::Flowinfo(val)) = attr {
14956 return Ok(val);
14957 }
14958 }
14959 Err(ErrorContext::new_missing(
14960 "LinkinfoIp6tnlAttrs",
14961 "Flowinfo",
14962 self.orig_loc,
14963 self.buf.as_ptr() as usize,
14964 ))
14965 }
14966 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
14967 let mut iter = self.clone();
14968 iter.pos = 0;
14969 for attr in iter {
14970 if let Ok(LinkinfoIp6tnlAttrs::Flags(val)) = attr {
14971 return Ok(val);
14972 }
14973 }
14974 Err(ErrorContext::new_missing(
14975 "LinkinfoIp6tnlAttrs",
14976 "Flags",
14977 self.orig_loc,
14978 self.buf.as_ptr() as usize,
14979 ))
14980 }
14981 pub fn get_proto(&self) -> Result<u8, ErrorContext> {
14982 let mut iter = self.clone();
14983 iter.pos = 0;
14984 for attr in iter {
14985 if let Ok(LinkinfoIp6tnlAttrs::Proto(val)) = attr {
14986 return Ok(val);
14987 }
14988 }
14989 Err(ErrorContext::new_missing(
14990 "LinkinfoIp6tnlAttrs",
14991 "Proto",
14992 self.orig_loc,
14993 self.buf.as_ptr() as usize,
14994 ))
14995 }
14996 pub fn get_encap_type(&self) -> Result<u16, ErrorContext> {
14997 let mut iter = self.clone();
14998 iter.pos = 0;
14999 for attr in iter {
15000 if let Ok(LinkinfoIp6tnlAttrs::EncapType(val)) = attr {
15001 return Ok(val);
15002 }
15003 }
15004 Err(ErrorContext::new_missing(
15005 "LinkinfoIp6tnlAttrs",
15006 "EncapType",
15007 self.orig_loc,
15008 self.buf.as_ptr() as usize,
15009 ))
15010 }
15011 pub fn get_encap_flags(&self) -> Result<u16, ErrorContext> {
15012 let mut iter = self.clone();
15013 iter.pos = 0;
15014 for attr in iter {
15015 if let Ok(LinkinfoIp6tnlAttrs::EncapFlags(val)) = attr {
15016 return Ok(val);
15017 }
15018 }
15019 Err(ErrorContext::new_missing(
15020 "LinkinfoIp6tnlAttrs",
15021 "EncapFlags",
15022 self.orig_loc,
15023 self.buf.as_ptr() as usize,
15024 ))
15025 }
15026 pub fn get_encap_sport(&self) -> Result<u16, ErrorContext> {
15027 let mut iter = self.clone();
15028 iter.pos = 0;
15029 for attr in iter {
15030 if let Ok(LinkinfoIp6tnlAttrs::EncapSport(val)) = attr {
15031 return Ok(val);
15032 }
15033 }
15034 Err(ErrorContext::new_missing(
15035 "LinkinfoIp6tnlAttrs",
15036 "EncapSport",
15037 self.orig_loc,
15038 self.buf.as_ptr() as usize,
15039 ))
15040 }
15041 pub fn get_encap_dport(&self) -> Result<u16, ErrorContext> {
15042 let mut iter = self.clone();
15043 iter.pos = 0;
15044 for attr in iter {
15045 if let Ok(LinkinfoIp6tnlAttrs::EncapDport(val)) = attr {
15046 return Ok(val);
15047 }
15048 }
15049 Err(ErrorContext::new_missing(
15050 "LinkinfoIp6tnlAttrs",
15051 "EncapDport",
15052 self.orig_loc,
15053 self.buf.as_ptr() as usize,
15054 ))
15055 }
15056 pub fn get_collect_metadata(&self) -> Result<(), ErrorContext> {
15057 let mut iter = self.clone();
15058 iter.pos = 0;
15059 for attr in iter {
15060 if let Ok(LinkinfoIp6tnlAttrs::CollectMetadata(val)) = attr {
15061 return Ok(val);
15062 }
15063 }
15064 Err(ErrorContext::new_missing(
15065 "LinkinfoIp6tnlAttrs",
15066 "CollectMetadata",
15067 self.orig_loc,
15068 self.buf.as_ptr() as usize,
15069 ))
15070 }
15071 pub fn get_fwmark(&self) -> Result<u32, ErrorContext> {
15072 let mut iter = self.clone();
15073 iter.pos = 0;
15074 for attr in iter {
15075 if let Ok(LinkinfoIp6tnlAttrs::Fwmark(val)) = attr {
15076 return Ok(val);
15077 }
15078 }
15079 Err(ErrorContext::new_missing(
15080 "LinkinfoIp6tnlAttrs",
15081 "Fwmark",
15082 self.orig_loc,
15083 self.buf.as_ptr() as usize,
15084 ))
15085 }
15086}
15087impl LinkinfoIp6tnlAttrs<'_> {
15088 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoIp6tnlAttrs<'a> {
15089 IterableLinkinfoIp6tnlAttrs::with_loc(buf, buf.as_ptr() as usize)
15090 }
15091 fn attr_from_type(r#type: u16) -> Option<&'static str> {
15092 LinkinfoIptunAttrs::attr_from_type(r#type)
15093 }
15094}
15095#[derive(Clone, Copy, Default)]
15096pub struct IterableLinkinfoIp6tnlAttrs<'a> {
15097 buf: &'a [u8],
15098 pos: usize,
15099 orig_loc: usize,
15100}
15101impl<'a> IterableLinkinfoIp6tnlAttrs<'a> {
15102 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
15103 Self {
15104 buf,
15105 pos: 0,
15106 orig_loc,
15107 }
15108 }
15109 pub fn get_buf(&self) -> &'a [u8] {
15110 self.buf
15111 }
15112}
15113impl<'a> Iterator for IterableLinkinfoIp6tnlAttrs<'a> {
15114 type Item = Result<LinkinfoIp6tnlAttrs<'a>, ErrorContext>;
15115 fn next(&mut self) -> Option<Self::Item> {
15116 let mut pos;
15117 let mut r#type;
15118 loop {
15119 pos = self.pos;
15120 r#type = None;
15121 if self.buf.len() == self.pos {
15122 return None;
15123 }
15124 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
15125 self.pos = self.buf.len();
15126 break;
15127 };
15128 r#type = Some(header.r#type);
15129 let res = match header.r#type {
15130 1u16 => LinkinfoIp6tnlAttrs::Link({
15131 let res = parse_u32(next);
15132 let Some(val) = res else { break };
15133 val
15134 }),
15135 2u16 => LinkinfoIp6tnlAttrs::Local({
15136 let res = Some(next);
15137 let Some(val) = res else { break };
15138 val
15139 }),
15140 3u16 => LinkinfoIp6tnlAttrs::Remote({
15141 let res = Some(next);
15142 let Some(val) = res else { break };
15143 val
15144 }),
15145 4u16 => LinkinfoIp6tnlAttrs::Ttl({
15146 let res = parse_u8(next);
15147 let Some(val) = res else { break };
15148 val
15149 }),
15150 6u16 => LinkinfoIp6tnlAttrs::EncapLimit({
15151 let res = parse_u8(next);
15152 let Some(val) = res else { break };
15153 val
15154 }),
15155 7u16 => LinkinfoIp6tnlAttrs::Flowinfo({
15156 let res = parse_be_u32(next);
15157 let Some(val) = res else { break };
15158 val
15159 }),
15160 8u16 => LinkinfoIp6tnlAttrs::Flags({
15161 let res = parse_be_u32(next);
15162 let Some(val) = res else { break };
15163 val
15164 }),
15165 9u16 => LinkinfoIp6tnlAttrs::Proto({
15166 let res = parse_u8(next);
15167 let Some(val) = res else { break };
15168 val
15169 }),
15170 15u16 => LinkinfoIp6tnlAttrs::EncapType({
15171 let res = parse_u16(next);
15172 let Some(val) = res else { break };
15173 val
15174 }),
15175 16u16 => LinkinfoIp6tnlAttrs::EncapFlags({
15176 let res = parse_u16(next);
15177 let Some(val) = res else { break };
15178 val
15179 }),
15180 17u16 => LinkinfoIp6tnlAttrs::EncapSport({
15181 let res = parse_be_u16(next);
15182 let Some(val) = res else { break };
15183 val
15184 }),
15185 18u16 => LinkinfoIp6tnlAttrs::EncapDport({
15186 let res = parse_be_u16(next);
15187 let Some(val) = res else { break };
15188 val
15189 }),
15190 19u16 => LinkinfoIp6tnlAttrs::CollectMetadata(()),
15191 20u16 => LinkinfoIp6tnlAttrs::Fwmark({
15192 let res = parse_u32(next);
15193 let Some(val) = res else { break };
15194 val
15195 }),
15196 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
15197 n => continue,
15198 };
15199 return Some(Ok(res));
15200 }
15201 Some(Err(ErrorContext::new(
15202 "LinkinfoIp6tnlAttrs",
15203 r#type.and_then(|t| LinkinfoIp6tnlAttrs::attr_from_type(t)),
15204 self.orig_loc,
15205 self.buf.as_ptr().wrapping_add(pos) as usize,
15206 )))
15207 }
15208}
15209impl<'a> std::fmt::Debug for IterableLinkinfoIp6tnlAttrs<'_> {
15210 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15211 let mut fmt = f.debug_struct("LinkinfoIp6tnlAttrs");
15212 for attr in self.clone() {
15213 let attr = match attr {
15214 Ok(a) => a,
15215 Err(err) => {
15216 fmt.finish()?;
15217 f.write_str("Err(")?;
15218 err.fmt(f)?;
15219 return f.write_str(")");
15220 }
15221 };
15222 match attr {
15223 LinkinfoIp6tnlAttrs::Link(val) => fmt.field("Link", &val),
15224 LinkinfoIp6tnlAttrs::Local(val) => fmt.field("Local", &val),
15225 LinkinfoIp6tnlAttrs::Remote(val) => fmt.field("Remote", &val),
15226 LinkinfoIp6tnlAttrs::Ttl(val) => fmt.field("Ttl", &val),
15227 LinkinfoIp6tnlAttrs::EncapLimit(val) => fmt.field("EncapLimit", &val),
15228 LinkinfoIp6tnlAttrs::Flowinfo(val) => fmt.field("Flowinfo", &val),
15229 LinkinfoIp6tnlAttrs::Flags(val) => fmt.field("Flags", &val),
15230 LinkinfoIp6tnlAttrs::Proto(val) => fmt.field("Proto", &val),
15231 LinkinfoIp6tnlAttrs::EncapType(val) => fmt.field("EncapType", &val),
15232 LinkinfoIp6tnlAttrs::EncapFlags(val) => fmt.field("EncapFlags", &val),
15233 LinkinfoIp6tnlAttrs::EncapSport(val) => fmt.field("EncapSport", &val),
15234 LinkinfoIp6tnlAttrs::EncapDport(val) => fmt.field("EncapDport", &val),
15235 LinkinfoIp6tnlAttrs::CollectMetadata(val) => fmt.field("CollectMetadata", &val),
15236 LinkinfoIp6tnlAttrs::Fwmark(val) => fmt.field("Fwmark", &val),
15237 };
15238 }
15239 fmt.finish()
15240 }
15241}
15242impl IterableLinkinfoIp6tnlAttrs<'_> {
15243 pub fn lookup_attr(
15244 &self,
15245 offset: usize,
15246 missing_type: Option<u16>,
15247 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
15248 let mut stack = Vec::new();
15249 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
15250 if missing_type.is_some() && cur == offset {
15251 stack.push(("LinkinfoIp6tnlAttrs", offset));
15252 return (
15253 stack,
15254 missing_type.and_then(|t| LinkinfoIp6tnlAttrs::attr_from_type(t)),
15255 );
15256 }
15257 if cur > offset || cur + self.buf.len() < offset {
15258 return (stack, None);
15259 }
15260 let mut attrs = self.clone();
15261 let mut last_off = cur + attrs.pos;
15262 while let Some(attr) = attrs.next() {
15263 let Ok(attr) = attr else { break };
15264 match attr {
15265 LinkinfoIp6tnlAttrs::Link(val) => {
15266 if last_off == offset {
15267 stack.push(("Link", last_off));
15268 break;
15269 }
15270 }
15271 LinkinfoIp6tnlAttrs::Local(val) => {
15272 if last_off == offset {
15273 stack.push(("Local", last_off));
15274 break;
15275 }
15276 }
15277 LinkinfoIp6tnlAttrs::Remote(val) => {
15278 if last_off == offset {
15279 stack.push(("Remote", last_off));
15280 break;
15281 }
15282 }
15283 LinkinfoIp6tnlAttrs::Ttl(val) => {
15284 if last_off == offset {
15285 stack.push(("Ttl", last_off));
15286 break;
15287 }
15288 }
15289 LinkinfoIp6tnlAttrs::EncapLimit(val) => {
15290 if last_off == offset {
15291 stack.push(("EncapLimit", last_off));
15292 break;
15293 }
15294 }
15295 LinkinfoIp6tnlAttrs::Flowinfo(val) => {
15296 if last_off == offset {
15297 stack.push(("Flowinfo", last_off));
15298 break;
15299 }
15300 }
15301 LinkinfoIp6tnlAttrs::Flags(val) => {
15302 if last_off == offset {
15303 stack.push(("Flags", last_off));
15304 break;
15305 }
15306 }
15307 LinkinfoIp6tnlAttrs::Proto(val) => {
15308 if last_off == offset {
15309 stack.push(("Proto", last_off));
15310 break;
15311 }
15312 }
15313 LinkinfoIp6tnlAttrs::EncapType(val) => {
15314 if last_off == offset {
15315 stack.push(("EncapType", last_off));
15316 break;
15317 }
15318 }
15319 LinkinfoIp6tnlAttrs::EncapFlags(val) => {
15320 if last_off == offset {
15321 stack.push(("EncapFlags", last_off));
15322 break;
15323 }
15324 }
15325 LinkinfoIp6tnlAttrs::EncapSport(val) => {
15326 if last_off == offset {
15327 stack.push(("EncapSport", last_off));
15328 break;
15329 }
15330 }
15331 LinkinfoIp6tnlAttrs::EncapDport(val) => {
15332 if last_off == offset {
15333 stack.push(("EncapDport", last_off));
15334 break;
15335 }
15336 }
15337 LinkinfoIp6tnlAttrs::CollectMetadata(val) => {
15338 if last_off == offset {
15339 stack.push(("CollectMetadata", last_off));
15340 break;
15341 }
15342 }
15343 LinkinfoIp6tnlAttrs::Fwmark(val) => {
15344 if last_off == offset {
15345 stack.push(("Fwmark", last_off));
15346 break;
15347 }
15348 }
15349 _ => {}
15350 };
15351 last_off = cur + attrs.pos;
15352 }
15353 if !stack.is_empty() {
15354 stack.push(("LinkinfoIp6tnlAttrs", cur));
15355 }
15356 (stack, None)
15357 }
15358}
15359#[derive(Clone)]
15360pub enum LinkinfoTunAttrs {
15361 Owner(u32),
15362 Group(u32),
15363 Type(u8),
15364 Pi(u8),
15365 VnetHdr(u8),
15366 Persist(u8),
15367 MultiQueue(u8),
15368 NumQueues(u32),
15369 NumDisabledQueues(u32),
15370}
15371impl<'a> IterableLinkinfoTunAttrs<'a> {
15372 pub fn get_owner(&self) -> Result<u32, ErrorContext> {
15373 let mut iter = self.clone();
15374 iter.pos = 0;
15375 for attr in iter {
15376 if let Ok(LinkinfoTunAttrs::Owner(val)) = attr {
15377 return Ok(val);
15378 }
15379 }
15380 Err(ErrorContext::new_missing(
15381 "LinkinfoTunAttrs",
15382 "Owner",
15383 self.orig_loc,
15384 self.buf.as_ptr() as usize,
15385 ))
15386 }
15387 pub fn get_group(&self) -> Result<u32, ErrorContext> {
15388 let mut iter = self.clone();
15389 iter.pos = 0;
15390 for attr in iter {
15391 if let Ok(LinkinfoTunAttrs::Group(val)) = attr {
15392 return Ok(val);
15393 }
15394 }
15395 Err(ErrorContext::new_missing(
15396 "LinkinfoTunAttrs",
15397 "Group",
15398 self.orig_loc,
15399 self.buf.as_ptr() as usize,
15400 ))
15401 }
15402 pub fn get_type(&self) -> Result<u8, ErrorContext> {
15403 let mut iter = self.clone();
15404 iter.pos = 0;
15405 for attr in iter {
15406 if let Ok(LinkinfoTunAttrs::Type(val)) = attr {
15407 return Ok(val);
15408 }
15409 }
15410 Err(ErrorContext::new_missing(
15411 "LinkinfoTunAttrs",
15412 "Type",
15413 self.orig_loc,
15414 self.buf.as_ptr() as usize,
15415 ))
15416 }
15417 pub fn get_pi(&self) -> Result<u8, ErrorContext> {
15418 let mut iter = self.clone();
15419 iter.pos = 0;
15420 for attr in iter {
15421 if let Ok(LinkinfoTunAttrs::Pi(val)) = attr {
15422 return Ok(val);
15423 }
15424 }
15425 Err(ErrorContext::new_missing(
15426 "LinkinfoTunAttrs",
15427 "Pi",
15428 self.orig_loc,
15429 self.buf.as_ptr() as usize,
15430 ))
15431 }
15432 pub fn get_vnet_hdr(&self) -> Result<u8, ErrorContext> {
15433 let mut iter = self.clone();
15434 iter.pos = 0;
15435 for attr in iter {
15436 if let Ok(LinkinfoTunAttrs::VnetHdr(val)) = attr {
15437 return Ok(val);
15438 }
15439 }
15440 Err(ErrorContext::new_missing(
15441 "LinkinfoTunAttrs",
15442 "VnetHdr",
15443 self.orig_loc,
15444 self.buf.as_ptr() as usize,
15445 ))
15446 }
15447 pub fn get_persist(&self) -> Result<u8, ErrorContext> {
15448 let mut iter = self.clone();
15449 iter.pos = 0;
15450 for attr in iter {
15451 if let Ok(LinkinfoTunAttrs::Persist(val)) = attr {
15452 return Ok(val);
15453 }
15454 }
15455 Err(ErrorContext::new_missing(
15456 "LinkinfoTunAttrs",
15457 "Persist",
15458 self.orig_loc,
15459 self.buf.as_ptr() as usize,
15460 ))
15461 }
15462 pub fn get_multi_queue(&self) -> Result<u8, ErrorContext> {
15463 let mut iter = self.clone();
15464 iter.pos = 0;
15465 for attr in iter {
15466 if let Ok(LinkinfoTunAttrs::MultiQueue(val)) = attr {
15467 return Ok(val);
15468 }
15469 }
15470 Err(ErrorContext::new_missing(
15471 "LinkinfoTunAttrs",
15472 "MultiQueue",
15473 self.orig_loc,
15474 self.buf.as_ptr() as usize,
15475 ))
15476 }
15477 pub fn get_num_queues(&self) -> Result<u32, ErrorContext> {
15478 let mut iter = self.clone();
15479 iter.pos = 0;
15480 for attr in iter {
15481 if let Ok(LinkinfoTunAttrs::NumQueues(val)) = attr {
15482 return Ok(val);
15483 }
15484 }
15485 Err(ErrorContext::new_missing(
15486 "LinkinfoTunAttrs",
15487 "NumQueues",
15488 self.orig_loc,
15489 self.buf.as_ptr() as usize,
15490 ))
15491 }
15492 pub fn get_num_disabled_queues(&self) -> Result<u32, ErrorContext> {
15493 let mut iter = self.clone();
15494 iter.pos = 0;
15495 for attr in iter {
15496 if let Ok(LinkinfoTunAttrs::NumDisabledQueues(val)) = attr {
15497 return Ok(val);
15498 }
15499 }
15500 Err(ErrorContext::new_missing(
15501 "LinkinfoTunAttrs",
15502 "NumDisabledQueues",
15503 self.orig_loc,
15504 self.buf.as_ptr() as usize,
15505 ))
15506 }
15507}
15508impl LinkinfoTunAttrs {
15509 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoTunAttrs<'a> {
15510 IterableLinkinfoTunAttrs::with_loc(buf, buf.as_ptr() as usize)
15511 }
15512 fn attr_from_type(r#type: u16) -> Option<&'static str> {
15513 let res = match r#type {
15514 1u16 => "Owner",
15515 2u16 => "Group",
15516 3u16 => "Type",
15517 4u16 => "Pi",
15518 5u16 => "VnetHdr",
15519 6u16 => "Persist",
15520 7u16 => "MultiQueue",
15521 8u16 => "NumQueues",
15522 9u16 => "NumDisabledQueues",
15523 _ => return None,
15524 };
15525 Some(res)
15526 }
15527}
15528#[derive(Clone, Copy, Default)]
15529pub struct IterableLinkinfoTunAttrs<'a> {
15530 buf: &'a [u8],
15531 pos: usize,
15532 orig_loc: usize,
15533}
15534impl<'a> IterableLinkinfoTunAttrs<'a> {
15535 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
15536 Self {
15537 buf,
15538 pos: 0,
15539 orig_loc,
15540 }
15541 }
15542 pub fn get_buf(&self) -> &'a [u8] {
15543 self.buf
15544 }
15545}
15546impl<'a> Iterator for IterableLinkinfoTunAttrs<'a> {
15547 type Item = Result<LinkinfoTunAttrs, ErrorContext>;
15548 fn next(&mut self) -> Option<Self::Item> {
15549 let mut pos;
15550 let mut r#type;
15551 loop {
15552 pos = self.pos;
15553 r#type = None;
15554 if self.buf.len() == self.pos {
15555 return None;
15556 }
15557 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
15558 self.pos = self.buf.len();
15559 break;
15560 };
15561 r#type = Some(header.r#type);
15562 let res = match header.r#type {
15563 1u16 => LinkinfoTunAttrs::Owner({
15564 let res = parse_u32(next);
15565 let Some(val) = res else { break };
15566 val
15567 }),
15568 2u16 => LinkinfoTunAttrs::Group({
15569 let res = parse_u32(next);
15570 let Some(val) = res else { break };
15571 val
15572 }),
15573 3u16 => LinkinfoTunAttrs::Type({
15574 let res = parse_u8(next);
15575 let Some(val) = res else { break };
15576 val
15577 }),
15578 4u16 => LinkinfoTunAttrs::Pi({
15579 let res = parse_u8(next);
15580 let Some(val) = res else { break };
15581 val
15582 }),
15583 5u16 => LinkinfoTunAttrs::VnetHdr({
15584 let res = parse_u8(next);
15585 let Some(val) = res else { break };
15586 val
15587 }),
15588 6u16 => LinkinfoTunAttrs::Persist({
15589 let res = parse_u8(next);
15590 let Some(val) = res else { break };
15591 val
15592 }),
15593 7u16 => LinkinfoTunAttrs::MultiQueue({
15594 let res = parse_u8(next);
15595 let Some(val) = res else { break };
15596 val
15597 }),
15598 8u16 => LinkinfoTunAttrs::NumQueues({
15599 let res = parse_u32(next);
15600 let Some(val) = res else { break };
15601 val
15602 }),
15603 9u16 => LinkinfoTunAttrs::NumDisabledQueues({
15604 let res = parse_u32(next);
15605 let Some(val) = res else { break };
15606 val
15607 }),
15608 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
15609 n => continue,
15610 };
15611 return Some(Ok(res));
15612 }
15613 Some(Err(ErrorContext::new(
15614 "LinkinfoTunAttrs",
15615 r#type.and_then(|t| LinkinfoTunAttrs::attr_from_type(t)),
15616 self.orig_loc,
15617 self.buf.as_ptr().wrapping_add(pos) as usize,
15618 )))
15619 }
15620}
15621impl std::fmt::Debug for IterableLinkinfoTunAttrs<'_> {
15622 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15623 let mut fmt = f.debug_struct("LinkinfoTunAttrs");
15624 for attr in self.clone() {
15625 let attr = match attr {
15626 Ok(a) => a,
15627 Err(err) => {
15628 fmt.finish()?;
15629 f.write_str("Err(")?;
15630 err.fmt(f)?;
15631 return f.write_str(")");
15632 }
15633 };
15634 match attr {
15635 LinkinfoTunAttrs::Owner(val) => fmt.field("Owner", &val),
15636 LinkinfoTunAttrs::Group(val) => fmt.field("Group", &val),
15637 LinkinfoTunAttrs::Type(val) => fmt.field("Type", &val),
15638 LinkinfoTunAttrs::Pi(val) => fmt.field("Pi", &val),
15639 LinkinfoTunAttrs::VnetHdr(val) => fmt.field("VnetHdr", &val),
15640 LinkinfoTunAttrs::Persist(val) => fmt.field("Persist", &val),
15641 LinkinfoTunAttrs::MultiQueue(val) => fmt.field("MultiQueue", &val),
15642 LinkinfoTunAttrs::NumQueues(val) => fmt.field("NumQueues", &val),
15643 LinkinfoTunAttrs::NumDisabledQueues(val) => fmt.field("NumDisabledQueues", &val),
15644 };
15645 }
15646 fmt.finish()
15647 }
15648}
15649impl IterableLinkinfoTunAttrs<'_> {
15650 pub fn lookup_attr(
15651 &self,
15652 offset: usize,
15653 missing_type: Option<u16>,
15654 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
15655 let mut stack = Vec::new();
15656 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
15657 if missing_type.is_some() && cur == offset {
15658 stack.push(("LinkinfoTunAttrs", offset));
15659 return (
15660 stack,
15661 missing_type.and_then(|t| LinkinfoTunAttrs::attr_from_type(t)),
15662 );
15663 }
15664 if cur > offset || cur + self.buf.len() < offset {
15665 return (stack, None);
15666 }
15667 let mut attrs = self.clone();
15668 let mut last_off = cur + attrs.pos;
15669 while let Some(attr) = attrs.next() {
15670 let Ok(attr) = attr else { break };
15671 match attr {
15672 LinkinfoTunAttrs::Owner(val) => {
15673 if last_off == offset {
15674 stack.push(("Owner", last_off));
15675 break;
15676 }
15677 }
15678 LinkinfoTunAttrs::Group(val) => {
15679 if last_off == offset {
15680 stack.push(("Group", last_off));
15681 break;
15682 }
15683 }
15684 LinkinfoTunAttrs::Type(val) => {
15685 if last_off == offset {
15686 stack.push(("Type", last_off));
15687 break;
15688 }
15689 }
15690 LinkinfoTunAttrs::Pi(val) => {
15691 if last_off == offset {
15692 stack.push(("Pi", last_off));
15693 break;
15694 }
15695 }
15696 LinkinfoTunAttrs::VnetHdr(val) => {
15697 if last_off == offset {
15698 stack.push(("VnetHdr", last_off));
15699 break;
15700 }
15701 }
15702 LinkinfoTunAttrs::Persist(val) => {
15703 if last_off == offset {
15704 stack.push(("Persist", last_off));
15705 break;
15706 }
15707 }
15708 LinkinfoTunAttrs::MultiQueue(val) => {
15709 if last_off == offset {
15710 stack.push(("MultiQueue", last_off));
15711 break;
15712 }
15713 }
15714 LinkinfoTunAttrs::NumQueues(val) => {
15715 if last_off == offset {
15716 stack.push(("NumQueues", last_off));
15717 break;
15718 }
15719 }
15720 LinkinfoTunAttrs::NumDisabledQueues(val) => {
15721 if last_off == offset {
15722 stack.push(("NumDisabledQueues", last_off));
15723 break;
15724 }
15725 }
15726 _ => {}
15727 };
15728 last_off = cur + attrs.pos;
15729 }
15730 if !stack.is_empty() {
15731 stack.push(("LinkinfoTunAttrs", cur));
15732 }
15733 (stack, None)
15734 }
15735}
15736#[derive(Clone)]
15737pub enum LinkinfoVlanAttrs<'a> {
15738 Id(u16),
15739 Flags(IflaVlanFlags),
15740 EgressQos(IterableIflaVlanQos<'a>),
15741 IngressQos(IterableIflaVlanQos<'a>),
15742 #[doc = "Associated type: [`VlanProtocols`] (enum)"]
15743 Protocol(u16),
15744}
15745impl<'a> IterableLinkinfoVlanAttrs<'a> {
15746 pub fn get_id(&self) -> Result<u16, ErrorContext> {
15747 let mut iter = self.clone();
15748 iter.pos = 0;
15749 for attr in iter {
15750 if let Ok(LinkinfoVlanAttrs::Id(val)) = attr {
15751 return Ok(val);
15752 }
15753 }
15754 Err(ErrorContext::new_missing(
15755 "LinkinfoVlanAttrs",
15756 "Id",
15757 self.orig_loc,
15758 self.buf.as_ptr() as usize,
15759 ))
15760 }
15761 pub fn get_flags(&self) -> Result<IflaVlanFlags, ErrorContext> {
15762 let mut iter = self.clone();
15763 iter.pos = 0;
15764 for attr in iter {
15765 if let Ok(LinkinfoVlanAttrs::Flags(val)) = attr {
15766 return Ok(val);
15767 }
15768 }
15769 Err(ErrorContext::new_missing(
15770 "LinkinfoVlanAttrs",
15771 "Flags",
15772 self.orig_loc,
15773 self.buf.as_ptr() as usize,
15774 ))
15775 }
15776 pub fn get_egress_qos(&self) -> Result<IterableIflaVlanQos<'a>, ErrorContext> {
15777 let mut iter = self.clone();
15778 iter.pos = 0;
15779 for attr in iter {
15780 if let Ok(LinkinfoVlanAttrs::EgressQos(val)) = attr {
15781 return Ok(val);
15782 }
15783 }
15784 Err(ErrorContext::new_missing(
15785 "LinkinfoVlanAttrs",
15786 "EgressQos",
15787 self.orig_loc,
15788 self.buf.as_ptr() as usize,
15789 ))
15790 }
15791 pub fn get_ingress_qos(&self) -> Result<IterableIflaVlanQos<'a>, ErrorContext> {
15792 let mut iter = self.clone();
15793 iter.pos = 0;
15794 for attr in iter {
15795 if let Ok(LinkinfoVlanAttrs::IngressQos(val)) = attr {
15796 return Ok(val);
15797 }
15798 }
15799 Err(ErrorContext::new_missing(
15800 "LinkinfoVlanAttrs",
15801 "IngressQos",
15802 self.orig_loc,
15803 self.buf.as_ptr() as usize,
15804 ))
15805 }
15806 #[doc = "Associated type: [`VlanProtocols`] (enum)"]
15807 pub fn get_protocol(&self) -> Result<u16, ErrorContext> {
15808 let mut iter = self.clone();
15809 iter.pos = 0;
15810 for attr in iter {
15811 if let Ok(LinkinfoVlanAttrs::Protocol(val)) = attr {
15812 return Ok(val);
15813 }
15814 }
15815 Err(ErrorContext::new_missing(
15816 "LinkinfoVlanAttrs",
15817 "Protocol",
15818 self.orig_loc,
15819 self.buf.as_ptr() as usize,
15820 ))
15821 }
15822}
15823impl LinkinfoVlanAttrs<'_> {
15824 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoVlanAttrs<'a> {
15825 IterableLinkinfoVlanAttrs::with_loc(buf, buf.as_ptr() as usize)
15826 }
15827 fn attr_from_type(r#type: u16) -> Option<&'static str> {
15828 let res = match r#type {
15829 1u16 => "Id",
15830 2u16 => "Flags",
15831 3u16 => "EgressQos",
15832 4u16 => "IngressQos",
15833 5u16 => "Protocol",
15834 _ => return None,
15835 };
15836 Some(res)
15837 }
15838}
15839#[derive(Clone, Copy, Default)]
15840pub struct IterableLinkinfoVlanAttrs<'a> {
15841 buf: &'a [u8],
15842 pos: usize,
15843 orig_loc: usize,
15844}
15845impl<'a> IterableLinkinfoVlanAttrs<'a> {
15846 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
15847 Self {
15848 buf,
15849 pos: 0,
15850 orig_loc,
15851 }
15852 }
15853 pub fn get_buf(&self) -> &'a [u8] {
15854 self.buf
15855 }
15856}
15857impl<'a> Iterator for IterableLinkinfoVlanAttrs<'a> {
15858 type Item = Result<LinkinfoVlanAttrs<'a>, ErrorContext>;
15859 fn next(&mut self) -> Option<Self::Item> {
15860 let mut pos;
15861 let mut r#type;
15862 loop {
15863 pos = self.pos;
15864 r#type = None;
15865 if self.buf.len() == self.pos {
15866 return None;
15867 }
15868 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
15869 self.pos = self.buf.len();
15870 break;
15871 };
15872 r#type = Some(header.r#type);
15873 let res = match header.r#type {
15874 1u16 => LinkinfoVlanAttrs::Id({
15875 let res = parse_u16(next);
15876 let Some(val) = res else { break };
15877 val
15878 }),
15879 2u16 => LinkinfoVlanAttrs::Flags({
15880 let res = Some(IflaVlanFlags::new_from_zeroed(next));
15881 let Some(val) = res else { break };
15882 val
15883 }),
15884 3u16 => LinkinfoVlanAttrs::EgressQos({
15885 let res = Some(IterableIflaVlanQos::with_loc(next, self.orig_loc));
15886 let Some(val) = res else { break };
15887 val
15888 }),
15889 4u16 => LinkinfoVlanAttrs::IngressQos({
15890 let res = Some(IterableIflaVlanQos::with_loc(next, self.orig_loc));
15891 let Some(val) = res else { break };
15892 val
15893 }),
15894 5u16 => LinkinfoVlanAttrs::Protocol({
15895 let res = parse_be_u16(next);
15896 let Some(val) = res else { break };
15897 val
15898 }),
15899 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
15900 n => continue,
15901 };
15902 return Some(Ok(res));
15903 }
15904 Some(Err(ErrorContext::new(
15905 "LinkinfoVlanAttrs",
15906 r#type.and_then(|t| LinkinfoVlanAttrs::attr_from_type(t)),
15907 self.orig_loc,
15908 self.buf.as_ptr().wrapping_add(pos) as usize,
15909 )))
15910 }
15911}
15912impl<'a> std::fmt::Debug for IterableLinkinfoVlanAttrs<'_> {
15913 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
15914 let mut fmt = f.debug_struct("LinkinfoVlanAttrs");
15915 for attr in self.clone() {
15916 let attr = match attr {
15917 Ok(a) => a,
15918 Err(err) => {
15919 fmt.finish()?;
15920 f.write_str("Err(")?;
15921 err.fmt(f)?;
15922 return f.write_str(")");
15923 }
15924 };
15925 match attr {
15926 LinkinfoVlanAttrs::Id(val) => fmt.field("Id", &val),
15927 LinkinfoVlanAttrs::Flags(val) => fmt.field("Flags", &val),
15928 LinkinfoVlanAttrs::EgressQos(val) => fmt.field("EgressQos", &val),
15929 LinkinfoVlanAttrs::IngressQos(val) => fmt.field("IngressQos", &val),
15930 LinkinfoVlanAttrs::Protocol(val) => fmt.field(
15931 "Protocol",
15932 &FormatEnum(val.into(), VlanProtocols::from_value),
15933 ),
15934 };
15935 }
15936 fmt.finish()
15937 }
15938}
15939impl IterableLinkinfoVlanAttrs<'_> {
15940 pub fn lookup_attr(
15941 &self,
15942 offset: usize,
15943 missing_type: Option<u16>,
15944 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
15945 let mut stack = Vec::new();
15946 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
15947 if missing_type.is_some() && cur == offset {
15948 stack.push(("LinkinfoVlanAttrs", offset));
15949 return (
15950 stack,
15951 missing_type.and_then(|t| LinkinfoVlanAttrs::attr_from_type(t)),
15952 );
15953 }
15954 if cur > offset || cur + self.buf.len() < offset {
15955 return (stack, None);
15956 }
15957 let mut attrs = self.clone();
15958 let mut last_off = cur + attrs.pos;
15959 let mut missing = None;
15960 while let Some(attr) = attrs.next() {
15961 let Ok(attr) = attr else { break };
15962 match attr {
15963 LinkinfoVlanAttrs::Id(val) => {
15964 if last_off == offset {
15965 stack.push(("Id", last_off));
15966 break;
15967 }
15968 }
15969 LinkinfoVlanAttrs::Flags(val) => {
15970 if last_off == offset {
15971 stack.push(("Flags", last_off));
15972 break;
15973 }
15974 }
15975 LinkinfoVlanAttrs::EgressQos(val) => {
15976 (stack, missing) = val.lookup_attr(offset, missing_type);
15977 if !stack.is_empty() {
15978 break;
15979 }
15980 }
15981 LinkinfoVlanAttrs::IngressQos(val) => {
15982 (stack, missing) = val.lookup_attr(offset, missing_type);
15983 if !stack.is_empty() {
15984 break;
15985 }
15986 }
15987 LinkinfoVlanAttrs::Protocol(val) => {
15988 if last_off == offset {
15989 stack.push(("Protocol", last_off));
15990 break;
15991 }
15992 }
15993 _ => {}
15994 };
15995 last_off = cur + attrs.pos;
15996 }
15997 if !stack.is_empty() {
15998 stack.push(("LinkinfoVlanAttrs", cur));
15999 }
16000 (stack, missing)
16001 }
16002}
16003#[derive(Clone)]
16004pub enum IflaVlanQos {
16005 #[doc = "Attribute may repeat multiple times (treat it as array)"]
16006 Mapping(IflaVlanQosMapping),
16007}
16008impl<'a> IterableIflaVlanQos<'a> {
16009 #[doc = "Attribute may repeat multiple times (treat it as array)"]
16010 pub fn get_mapping(&self) -> MultiAttrIterable<Self, IflaVlanQos, IflaVlanQosMapping> {
16011 MultiAttrIterable::new(self.clone(), |variant| {
16012 if let IflaVlanQos::Mapping(val) = variant {
16013 Some(val)
16014 } else {
16015 None
16016 }
16017 })
16018 }
16019}
16020impl IflaVlanQos {
16021 pub fn new<'a>(buf: &'a [u8]) -> IterableIflaVlanQos<'a> {
16022 IterableIflaVlanQos::with_loc(buf, buf.as_ptr() as usize)
16023 }
16024 fn attr_from_type(r#type: u16) -> Option<&'static str> {
16025 let res = match r#type {
16026 1u16 => "Mapping",
16027 _ => return None,
16028 };
16029 Some(res)
16030 }
16031}
16032#[derive(Clone, Copy, Default)]
16033pub struct IterableIflaVlanQos<'a> {
16034 buf: &'a [u8],
16035 pos: usize,
16036 orig_loc: usize,
16037}
16038impl<'a> IterableIflaVlanQos<'a> {
16039 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16040 Self {
16041 buf,
16042 pos: 0,
16043 orig_loc,
16044 }
16045 }
16046 pub fn get_buf(&self) -> &'a [u8] {
16047 self.buf
16048 }
16049}
16050impl<'a> Iterator for IterableIflaVlanQos<'a> {
16051 type Item = Result<IflaVlanQos, ErrorContext>;
16052 fn next(&mut self) -> Option<Self::Item> {
16053 let mut pos;
16054 let mut r#type;
16055 loop {
16056 pos = self.pos;
16057 r#type = None;
16058 if self.buf.len() == self.pos {
16059 return None;
16060 }
16061 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16062 self.pos = self.buf.len();
16063 break;
16064 };
16065 r#type = Some(header.r#type);
16066 let res = match header.r#type {
16067 1u16 => IflaVlanQos::Mapping({
16068 let res = Some(IflaVlanQosMapping::new_from_zeroed(next));
16069 let Some(val) = res else { break };
16070 val
16071 }),
16072 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16073 n => continue,
16074 };
16075 return Some(Ok(res));
16076 }
16077 Some(Err(ErrorContext::new(
16078 "IflaVlanQos",
16079 r#type.and_then(|t| IflaVlanQos::attr_from_type(t)),
16080 self.orig_loc,
16081 self.buf.as_ptr().wrapping_add(pos) as usize,
16082 )))
16083 }
16084}
16085impl std::fmt::Debug for IterableIflaVlanQos<'_> {
16086 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16087 let mut fmt = f.debug_struct("IflaVlanQos");
16088 for attr in self.clone() {
16089 let attr = match attr {
16090 Ok(a) => a,
16091 Err(err) => {
16092 fmt.finish()?;
16093 f.write_str("Err(")?;
16094 err.fmt(f)?;
16095 return f.write_str(")");
16096 }
16097 };
16098 match attr {
16099 IflaVlanQos::Mapping(val) => fmt.field("Mapping", &val),
16100 };
16101 }
16102 fmt.finish()
16103 }
16104}
16105impl IterableIflaVlanQos<'_> {
16106 pub fn lookup_attr(
16107 &self,
16108 offset: usize,
16109 missing_type: Option<u16>,
16110 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16111 let mut stack = Vec::new();
16112 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16113 if missing_type.is_some() && cur == offset {
16114 stack.push(("IflaVlanQos", offset));
16115 return (
16116 stack,
16117 missing_type.and_then(|t| IflaVlanQos::attr_from_type(t)),
16118 );
16119 }
16120 if cur > offset || cur + self.buf.len() < offset {
16121 return (stack, None);
16122 }
16123 let mut attrs = self.clone();
16124 let mut last_off = cur + attrs.pos;
16125 while let Some(attr) = attrs.next() {
16126 let Ok(attr) = attr else { break };
16127 match attr {
16128 IflaVlanQos::Mapping(val) => {
16129 if last_off == offset {
16130 stack.push(("Mapping", last_off));
16131 break;
16132 }
16133 }
16134 _ => {}
16135 };
16136 last_off = cur + attrs.pos;
16137 }
16138 if !stack.is_empty() {
16139 stack.push(("IflaVlanQos", cur));
16140 }
16141 (stack, None)
16142 }
16143}
16144#[derive(Clone)]
16145pub enum LinkinfoVrfAttrs {
16146 Table(u32),
16147}
16148impl<'a> IterableLinkinfoVrfAttrs<'a> {
16149 pub fn get_table(&self) -> Result<u32, ErrorContext> {
16150 let mut iter = self.clone();
16151 iter.pos = 0;
16152 for attr in iter {
16153 if let Ok(LinkinfoVrfAttrs::Table(val)) = attr {
16154 return Ok(val);
16155 }
16156 }
16157 Err(ErrorContext::new_missing(
16158 "LinkinfoVrfAttrs",
16159 "Table",
16160 self.orig_loc,
16161 self.buf.as_ptr() as usize,
16162 ))
16163 }
16164}
16165impl LinkinfoVrfAttrs {
16166 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoVrfAttrs<'a> {
16167 IterableLinkinfoVrfAttrs::with_loc(buf, buf.as_ptr() as usize)
16168 }
16169 fn attr_from_type(r#type: u16) -> Option<&'static str> {
16170 let res = match r#type {
16171 1u16 => "Table",
16172 _ => return None,
16173 };
16174 Some(res)
16175 }
16176}
16177#[derive(Clone, Copy, Default)]
16178pub struct IterableLinkinfoVrfAttrs<'a> {
16179 buf: &'a [u8],
16180 pos: usize,
16181 orig_loc: usize,
16182}
16183impl<'a> IterableLinkinfoVrfAttrs<'a> {
16184 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16185 Self {
16186 buf,
16187 pos: 0,
16188 orig_loc,
16189 }
16190 }
16191 pub fn get_buf(&self) -> &'a [u8] {
16192 self.buf
16193 }
16194}
16195impl<'a> Iterator for IterableLinkinfoVrfAttrs<'a> {
16196 type Item = Result<LinkinfoVrfAttrs, ErrorContext>;
16197 fn next(&mut self) -> Option<Self::Item> {
16198 let mut pos;
16199 let mut r#type;
16200 loop {
16201 pos = self.pos;
16202 r#type = None;
16203 if self.buf.len() == self.pos {
16204 return None;
16205 }
16206 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16207 self.pos = self.buf.len();
16208 break;
16209 };
16210 r#type = Some(header.r#type);
16211 let res = match header.r#type {
16212 1u16 => LinkinfoVrfAttrs::Table({
16213 let res = parse_u32(next);
16214 let Some(val) = res else { break };
16215 val
16216 }),
16217 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16218 n => continue,
16219 };
16220 return Some(Ok(res));
16221 }
16222 Some(Err(ErrorContext::new(
16223 "LinkinfoVrfAttrs",
16224 r#type.and_then(|t| LinkinfoVrfAttrs::attr_from_type(t)),
16225 self.orig_loc,
16226 self.buf.as_ptr().wrapping_add(pos) as usize,
16227 )))
16228 }
16229}
16230impl std::fmt::Debug for IterableLinkinfoVrfAttrs<'_> {
16231 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16232 let mut fmt = f.debug_struct("LinkinfoVrfAttrs");
16233 for attr in self.clone() {
16234 let attr = match attr {
16235 Ok(a) => a,
16236 Err(err) => {
16237 fmt.finish()?;
16238 f.write_str("Err(")?;
16239 err.fmt(f)?;
16240 return f.write_str(")");
16241 }
16242 };
16243 match attr {
16244 LinkinfoVrfAttrs::Table(val) => fmt.field("Table", &val),
16245 };
16246 }
16247 fmt.finish()
16248 }
16249}
16250impl IterableLinkinfoVrfAttrs<'_> {
16251 pub fn lookup_attr(
16252 &self,
16253 offset: usize,
16254 missing_type: Option<u16>,
16255 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16256 let mut stack = Vec::new();
16257 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16258 if missing_type.is_some() && cur == offset {
16259 stack.push(("LinkinfoVrfAttrs", offset));
16260 return (
16261 stack,
16262 missing_type.and_then(|t| LinkinfoVrfAttrs::attr_from_type(t)),
16263 );
16264 }
16265 if cur > offset || cur + self.buf.len() < offset {
16266 return (stack, None);
16267 }
16268 let mut attrs = self.clone();
16269 let mut last_off = cur + attrs.pos;
16270 while let Some(attr) = attrs.next() {
16271 let Ok(attr) = attr else { break };
16272 match attr {
16273 LinkinfoVrfAttrs::Table(val) => {
16274 if last_off == offset {
16275 stack.push(("Table", last_off));
16276 break;
16277 }
16278 }
16279 _ => {}
16280 };
16281 last_off = cur + attrs.pos;
16282 }
16283 if !stack.is_empty() {
16284 stack.push(("LinkinfoVrfAttrs", cur));
16285 }
16286 (stack, None)
16287 }
16288}
16289#[derive(Clone)]
16290pub enum XdpAttrs {
16291 Fd(i32),
16292 Attached(u8),
16293 Flags(u32),
16294 ProgId(u32),
16295 DrvProgId(u32),
16296 SkbProgId(u32),
16297 HwProgId(u32),
16298 ExpectedFd(i32),
16299}
16300impl<'a> IterableXdpAttrs<'a> {
16301 pub fn get_fd(&self) -> Result<i32, ErrorContext> {
16302 let mut iter = self.clone();
16303 iter.pos = 0;
16304 for attr in iter {
16305 if let Ok(XdpAttrs::Fd(val)) = attr {
16306 return Ok(val);
16307 }
16308 }
16309 Err(ErrorContext::new_missing(
16310 "XdpAttrs",
16311 "Fd",
16312 self.orig_loc,
16313 self.buf.as_ptr() as usize,
16314 ))
16315 }
16316 pub fn get_attached(&self) -> Result<u8, ErrorContext> {
16317 let mut iter = self.clone();
16318 iter.pos = 0;
16319 for attr in iter {
16320 if let Ok(XdpAttrs::Attached(val)) = attr {
16321 return Ok(val);
16322 }
16323 }
16324 Err(ErrorContext::new_missing(
16325 "XdpAttrs",
16326 "Attached",
16327 self.orig_loc,
16328 self.buf.as_ptr() as usize,
16329 ))
16330 }
16331 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
16332 let mut iter = self.clone();
16333 iter.pos = 0;
16334 for attr in iter {
16335 if let Ok(XdpAttrs::Flags(val)) = attr {
16336 return Ok(val);
16337 }
16338 }
16339 Err(ErrorContext::new_missing(
16340 "XdpAttrs",
16341 "Flags",
16342 self.orig_loc,
16343 self.buf.as_ptr() as usize,
16344 ))
16345 }
16346 pub fn get_prog_id(&self) -> Result<u32, ErrorContext> {
16347 let mut iter = self.clone();
16348 iter.pos = 0;
16349 for attr in iter {
16350 if let Ok(XdpAttrs::ProgId(val)) = attr {
16351 return Ok(val);
16352 }
16353 }
16354 Err(ErrorContext::new_missing(
16355 "XdpAttrs",
16356 "ProgId",
16357 self.orig_loc,
16358 self.buf.as_ptr() as usize,
16359 ))
16360 }
16361 pub fn get_drv_prog_id(&self) -> Result<u32, ErrorContext> {
16362 let mut iter = self.clone();
16363 iter.pos = 0;
16364 for attr in iter {
16365 if let Ok(XdpAttrs::DrvProgId(val)) = attr {
16366 return Ok(val);
16367 }
16368 }
16369 Err(ErrorContext::new_missing(
16370 "XdpAttrs",
16371 "DrvProgId",
16372 self.orig_loc,
16373 self.buf.as_ptr() as usize,
16374 ))
16375 }
16376 pub fn get_skb_prog_id(&self) -> Result<u32, ErrorContext> {
16377 let mut iter = self.clone();
16378 iter.pos = 0;
16379 for attr in iter {
16380 if let Ok(XdpAttrs::SkbProgId(val)) = attr {
16381 return Ok(val);
16382 }
16383 }
16384 Err(ErrorContext::new_missing(
16385 "XdpAttrs",
16386 "SkbProgId",
16387 self.orig_loc,
16388 self.buf.as_ptr() as usize,
16389 ))
16390 }
16391 pub fn get_hw_prog_id(&self) -> Result<u32, ErrorContext> {
16392 let mut iter = self.clone();
16393 iter.pos = 0;
16394 for attr in iter {
16395 if let Ok(XdpAttrs::HwProgId(val)) = attr {
16396 return Ok(val);
16397 }
16398 }
16399 Err(ErrorContext::new_missing(
16400 "XdpAttrs",
16401 "HwProgId",
16402 self.orig_loc,
16403 self.buf.as_ptr() as usize,
16404 ))
16405 }
16406 pub fn get_expected_fd(&self) -> Result<i32, ErrorContext> {
16407 let mut iter = self.clone();
16408 iter.pos = 0;
16409 for attr in iter {
16410 if let Ok(XdpAttrs::ExpectedFd(val)) = attr {
16411 return Ok(val);
16412 }
16413 }
16414 Err(ErrorContext::new_missing(
16415 "XdpAttrs",
16416 "ExpectedFd",
16417 self.orig_loc,
16418 self.buf.as_ptr() as usize,
16419 ))
16420 }
16421}
16422impl XdpAttrs {
16423 pub fn new<'a>(buf: &'a [u8]) -> IterableXdpAttrs<'a> {
16424 IterableXdpAttrs::with_loc(buf, buf.as_ptr() as usize)
16425 }
16426 fn attr_from_type(r#type: u16) -> Option<&'static str> {
16427 let res = match r#type {
16428 1u16 => "Fd",
16429 2u16 => "Attached",
16430 3u16 => "Flags",
16431 4u16 => "ProgId",
16432 5u16 => "DrvProgId",
16433 6u16 => "SkbProgId",
16434 7u16 => "HwProgId",
16435 8u16 => "ExpectedFd",
16436 _ => return None,
16437 };
16438 Some(res)
16439 }
16440}
16441#[derive(Clone, Copy, Default)]
16442pub struct IterableXdpAttrs<'a> {
16443 buf: &'a [u8],
16444 pos: usize,
16445 orig_loc: usize,
16446}
16447impl<'a> IterableXdpAttrs<'a> {
16448 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16449 Self {
16450 buf,
16451 pos: 0,
16452 orig_loc,
16453 }
16454 }
16455 pub fn get_buf(&self) -> &'a [u8] {
16456 self.buf
16457 }
16458}
16459impl<'a> Iterator for IterableXdpAttrs<'a> {
16460 type Item = Result<XdpAttrs, ErrorContext>;
16461 fn next(&mut self) -> Option<Self::Item> {
16462 let mut pos;
16463 let mut r#type;
16464 loop {
16465 pos = self.pos;
16466 r#type = None;
16467 if self.buf.len() == self.pos {
16468 return None;
16469 }
16470 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16471 self.pos = self.buf.len();
16472 break;
16473 };
16474 r#type = Some(header.r#type);
16475 let res = match header.r#type {
16476 1u16 => XdpAttrs::Fd({
16477 let res = parse_i32(next);
16478 let Some(val) = res else { break };
16479 val
16480 }),
16481 2u16 => XdpAttrs::Attached({
16482 let res = parse_u8(next);
16483 let Some(val) = res else { break };
16484 val
16485 }),
16486 3u16 => XdpAttrs::Flags({
16487 let res = parse_u32(next);
16488 let Some(val) = res else { break };
16489 val
16490 }),
16491 4u16 => XdpAttrs::ProgId({
16492 let res = parse_u32(next);
16493 let Some(val) = res else { break };
16494 val
16495 }),
16496 5u16 => XdpAttrs::DrvProgId({
16497 let res = parse_u32(next);
16498 let Some(val) = res else { break };
16499 val
16500 }),
16501 6u16 => XdpAttrs::SkbProgId({
16502 let res = parse_u32(next);
16503 let Some(val) = res else { break };
16504 val
16505 }),
16506 7u16 => XdpAttrs::HwProgId({
16507 let res = parse_u32(next);
16508 let Some(val) = res else { break };
16509 val
16510 }),
16511 8u16 => XdpAttrs::ExpectedFd({
16512 let res = parse_i32(next);
16513 let Some(val) = res else { break };
16514 val
16515 }),
16516 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16517 n => continue,
16518 };
16519 return Some(Ok(res));
16520 }
16521 Some(Err(ErrorContext::new(
16522 "XdpAttrs",
16523 r#type.and_then(|t| XdpAttrs::attr_from_type(t)),
16524 self.orig_loc,
16525 self.buf.as_ptr().wrapping_add(pos) as usize,
16526 )))
16527 }
16528}
16529impl std::fmt::Debug for IterableXdpAttrs<'_> {
16530 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16531 let mut fmt = f.debug_struct("XdpAttrs");
16532 for attr in self.clone() {
16533 let attr = match attr {
16534 Ok(a) => a,
16535 Err(err) => {
16536 fmt.finish()?;
16537 f.write_str("Err(")?;
16538 err.fmt(f)?;
16539 return f.write_str(")");
16540 }
16541 };
16542 match attr {
16543 XdpAttrs::Fd(val) => fmt.field("Fd", &val),
16544 XdpAttrs::Attached(val) => fmt.field("Attached", &val),
16545 XdpAttrs::Flags(val) => fmt.field("Flags", &val),
16546 XdpAttrs::ProgId(val) => fmt.field("ProgId", &val),
16547 XdpAttrs::DrvProgId(val) => fmt.field("DrvProgId", &val),
16548 XdpAttrs::SkbProgId(val) => fmt.field("SkbProgId", &val),
16549 XdpAttrs::HwProgId(val) => fmt.field("HwProgId", &val),
16550 XdpAttrs::ExpectedFd(val) => fmt.field("ExpectedFd", &val),
16551 };
16552 }
16553 fmt.finish()
16554 }
16555}
16556impl IterableXdpAttrs<'_> {
16557 pub fn lookup_attr(
16558 &self,
16559 offset: usize,
16560 missing_type: Option<u16>,
16561 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16562 let mut stack = Vec::new();
16563 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16564 if missing_type.is_some() && cur == offset {
16565 stack.push(("XdpAttrs", offset));
16566 return (
16567 stack,
16568 missing_type.and_then(|t| XdpAttrs::attr_from_type(t)),
16569 );
16570 }
16571 if cur > offset || cur + self.buf.len() < offset {
16572 return (stack, None);
16573 }
16574 let mut attrs = self.clone();
16575 let mut last_off = cur + attrs.pos;
16576 while let Some(attr) = attrs.next() {
16577 let Ok(attr) = attr else { break };
16578 match attr {
16579 XdpAttrs::Fd(val) => {
16580 if last_off == offset {
16581 stack.push(("Fd", last_off));
16582 break;
16583 }
16584 }
16585 XdpAttrs::Attached(val) => {
16586 if last_off == offset {
16587 stack.push(("Attached", last_off));
16588 break;
16589 }
16590 }
16591 XdpAttrs::Flags(val) => {
16592 if last_off == offset {
16593 stack.push(("Flags", last_off));
16594 break;
16595 }
16596 }
16597 XdpAttrs::ProgId(val) => {
16598 if last_off == offset {
16599 stack.push(("ProgId", last_off));
16600 break;
16601 }
16602 }
16603 XdpAttrs::DrvProgId(val) => {
16604 if last_off == offset {
16605 stack.push(("DrvProgId", last_off));
16606 break;
16607 }
16608 }
16609 XdpAttrs::SkbProgId(val) => {
16610 if last_off == offset {
16611 stack.push(("SkbProgId", last_off));
16612 break;
16613 }
16614 }
16615 XdpAttrs::HwProgId(val) => {
16616 if last_off == offset {
16617 stack.push(("HwProgId", last_off));
16618 break;
16619 }
16620 }
16621 XdpAttrs::ExpectedFd(val) => {
16622 if last_off == offset {
16623 stack.push(("ExpectedFd", last_off));
16624 break;
16625 }
16626 }
16627 _ => {}
16628 };
16629 last_off = cur + attrs.pos;
16630 }
16631 if !stack.is_empty() {
16632 stack.push(("XdpAttrs", cur));
16633 }
16634 (stack, None)
16635 }
16636}
16637#[derive(Clone)]
16638pub enum IflaAttrs<'a> {
16639 #[doc = "u32 indexed by ipv4-devconf - 1 on output, on input it\\'s a nest\n"]
16640 Conf(&'a [u8]),
16641}
16642impl<'a> IterableIflaAttrs<'a> {
16643 #[doc = "u32 indexed by ipv4-devconf - 1 on output, on input it\\'s a nest\n"]
16644 pub fn get_conf(&self) -> Result<&'a [u8], ErrorContext> {
16645 let mut iter = self.clone();
16646 iter.pos = 0;
16647 for attr in iter {
16648 if let Ok(IflaAttrs::Conf(val)) = attr {
16649 return Ok(val);
16650 }
16651 }
16652 Err(ErrorContext::new_missing(
16653 "IflaAttrs",
16654 "Conf",
16655 self.orig_loc,
16656 self.buf.as_ptr() as usize,
16657 ))
16658 }
16659}
16660impl IflaAttrs<'_> {
16661 pub fn new<'a>(buf: &'a [u8]) -> IterableIflaAttrs<'a> {
16662 IterableIflaAttrs::with_loc(buf, buf.as_ptr() as usize)
16663 }
16664 fn attr_from_type(r#type: u16) -> Option<&'static str> {
16665 let res = match r#type {
16666 1u16 => "Conf",
16667 _ => return None,
16668 };
16669 Some(res)
16670 }
16671}
16672#[derive(Clone, Copy, Default)]
16673pub struct IterableIflaAttrs<'a> {
16674 buf: &'a [u8],
16675 pos: usize,
16676 orig_loc: usize,
16677}
16678impl<'a> IterableIflaAttrs<'a> {
16679 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16680 Self {
16681 buf,
16682 pos: 0,
16683 orig_loc,
16684 }
16685 }
16686 pub fn get_buf(&self) -> &'a [u8] {
16687 self.buf
16688 }
16689}
16690impl<'a> Iterator for IterableIflaAttrs<'a> {
16691 type Item = Result<IflaAttrs<'a>, ErrorContext>;
16692 fn next(&mut self) -> Option<Self::Item> {
16693 let mut pos;
16694 let mut r#type;
16695 loop {
16696 pos = self.pos;
16697 r#type = None;
16698 if self.buf.len() == self.pos {
16699 return None;
16700 }
16701 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16702 self.pos = self.buf.len();
16703 break;
16704 };
16705 r#type = Some(header.r#type);
16706 let res = match header.r#type {
16707 1u16 => IflaAttrs::Conf({
16708 let res = Some(next);
16709 let Some(val) = res else { break };
16710 val
16711 }),
16712 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
16713 n => continue,
16714 };
16715 return Some(Ok(res));
16716 }
16717 Some(Err(ErrorContext::new(
16718 "IflaAttrs",
16719 r#type.and_then(|t| IflaAttrs::attr_from_type(t)),
16720 self.orig_loc,
16721 self.buf.as_ptr().wrapping_add(pos) as usize,
16722 )))
16723 }
16724}
16725impl<'a> std::fmt::Debug for IterableIflaAttrs<'_> {
16726 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16727 let mut fmt = f.debug_struct("IflaAttrs");
16728 for attr in self.clone() {
16729 let attr = match attr {
16730 Ok(a) => a,
16731 Err(err) => {
16732 fmt.finish()?;
16733 f.write_str("Err(")?;
16734 err.fmt(f)?;
16735 return f.write_str(")");
16736 }
16737 };
16738 match attr {
16739 IflaAttrs::Conf(val) => fmt.field("Conf", &val),
16740 };
16741 }
16742 fmt.finish()
16743 }
16744}
16745impl IterableIflaAttrs<'_> {
16746 pub fn lookup_attr(
16747 &self,
16748 offset: usize,
16749 missing_type: Option<u16>,
16750 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
16751 let mut stack = Vec::new();
16752 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
16753 if missing_type.is_some() && cur == offset {
16754 stack.push(("IflaAttrs", offset));
16755 return (
16756 stack,
16757 missing_type.and_then(|t| IflaAttrs::attr_from_type(t)),
16758 );
16759 }
16760 if cur > offset || cur + self.buf.len() < offset {
16761 return (stack, None);
16762 }
16763 let mut attrs = self.clone();
16764 let mut last_off = cur + attrs.pos;
16765 while let Some(attr) = attrs.next() {
16766 let Ok(attr) = attr else { break };
16767 match attr {
16768 IflaAttrs::Conf(val) => {
16769 if last_off == offset {
16770 stack.push(("Conf", last_off));
16771 break;
16772 }
16773 }
16774 _ => {}
16775 };
16776 last_off = cur + attrs.pos;
16777 }
16778 if !stack.is_empty() {
16779 stack.push(("IflaAttrs", cur));
16780 }
16781 (stack, None)
16782 }
16783}
16784#[derive(Clone)]
16785pub enum Ifla6Attrs<'a> {
16786 Flags(u32),
16787 #[doc = "u32 indexed by ipv6-devconf - 1 on output, on input it\\'s a nest\n"]
16788 Conf(&'a [u8]),
16789 Stats(&'a [u8]),
16790 Mcast(&'a [u8]),
16791 Cacheinfo(IflaCacheinfo),
16792 Icmp6stats(&'a [u8]),
16793 Token(&'a [u8]),
16794 AddrGenMode(u8),
16795 RaMtu(u32),
16796}
16797impl<'a> IterableIfla6Attrs<'a> {
16798 pub fn get_flags(&self) -> Result<u32, ErrorContext> {
16799 let mut iter = self.clone();
16800 iter.pos = 0;
16801 for attr in iter {
16802 if let Ok(Ifla6Attrs::Flags(val)) = attr {
16803 return Ok(val);
16804 }
16805 }
16806 Err(ErrorContext::new_missing(
16807 "Ifla6Attrs",
16808 "Flags",
16809 self.orig_loc,
16810 self.buf.as_ptr() as usize,
16811 ))
16812 }
16813 #[doc = "u32 indexed by ipv6-devconf - 1 on output, on input it\\'s a nest\n"]
16814 pub fn get_conf(&self) -> Result<&'a [u8], ErrorContext> {
16815 let mut iter = self.clone();
16816 iter.pos = 0;
16817 for attr in iter {
16818 if let Ok(Ifla6Attrs::Conf(val)) = attr {
16819 return Ok(val);
16820 }
16821 }
16822 Err(ErrorContext::new_missing(
16823 "Ifla6Attrs",
16824 "Conf",
16825 self.orig_loc,
16826 self.buf.as_ptr() as usize,
16827 ))
16828 }
16829 pub fn get_stats(&self) -> Result<&'a [u8], ErrorContext> {
16830 let mut iter = self.clone();
16831 iter.pos = 0;
16832 for attr in iter {
16833 if let Ok(Ifla6Attrs::Stats(val)) = attr {
16834 return Ok(val);
16835 }
16836 }
16837 Err(ErrorContext::new_missing(
16838 "Ifla6Attrs",
16839 "Stats",
16840 self.orig_loc,
16841 self.buf.as_ptr() as usize,
16842 ))
16843 }
16844 pub fn get_mcast(&self) -> Result<&'a [u8], ErrorContext> {
16845 let mut iter = self.clone();
16846 iter.pos = 0;
16847 for attr in iter {
16848 if let Ok(Ifla6Attrs::Mcast(val)) = attr {
16849 return Ok(val);
16850 }
16851 }
16852 Err(ErrorContext::new_missing(
16853 "Ifla6Attrs",
16854 "Mcast",
16855 self.orig_loc,
16856 self.buf.as_ptr() as usize,
16857 ))
16858 }
16859 pub fn get_cacheinfo(&self) -> Result<IflaCacheinfo, ErrorContext> {
16860 let mut iter = self.clone();
16861 iter.pos = 0;
16862 for attr in iter {
16863 if let Ok(Ifla6Attrs::Cacheinfo(val)) = attr {
16864 return Ok(val);
16865 }
16866 }
16867 Err(ErrorContext::new_missing(
16868 "Ifla6Attrs",
16869 "Cacheinfo",
16870 self.orig_loc,
16871 self.buf.as_ptr() as usize,
16872 ))
16873 }
16874 pub fn get_icmp6stats(&self) -> Result<&'a [u8], ErrorContext> {
16875 let mut iter = self.clone();
16876 iter.pos = 0;
16877 for attr in iter {
16878 if let Ok(Ifla6Attrs::Icmp6stats(val)) = attr {
16879 return Ok(val);
16880 }
16881 }
16882 Err(ErrorContext::new_missing(
16883 "Ifla6Attrs",
16884 "Icmp6stats",
16885 self.orig_loc,
16886 self.buf.as_ptr() as usize,
16887 ))
16888 }
16889 pub fn get_token(&self) -> Result<&'a [u8], ErrorContext> {
16890 let mut iter = self.clone();
16891 iter.pos = 0;
16892 for attr in iter {
16893 if let Ok(Ifla6Attrs::Token(val)) = attr {
16894 return Ok(val);
16895 }
16896 }
16897 Err(ErrorContext::new_missing(
16898 "Ifla6Attrs",
16899 "Token",
16900 self.orig_loc,
16901 self.buf.as_ptr() as usize,
16902 ))
16903 }
16904 pub fn get_addr_gen_mode(&self) -> Result<u8, ErrorContext> {
16905 let mut iter = self.clone();
16906 iter.pos = 0;
16907 for attr in iter {
16908 if let Ok(Ifla6Attrs::AddrGenMode(val)) = attr {
16909 return Ok(val);
16910 }
16911 }
16912 Err(ErrorContext::new_missing(
16913 "Ifla6Attrs",
16914 "AddrGenMode",
16915 self.orig_loc,
16916 self.buf.as_ptr() as usize,
16917 ))
16918 }
16919 pub fn get_ra_mtu(&self) -> Result<u32, ErrorContext> {
16920 let mut iter = self.clone();
16921 iter.pos = 0;
16922 for attr in iter {
16923 if let Ok(Ifla6Attrs::RaMtu(val)) = attr {
16924 return Ok(val);
16925 }
16926 }
16927 Err(ErrorContext::new_missing(
16928 "Ifla6Attrs",
16929 "RaMtu",
16930 self.orig_loc,
16931 self.buf.as_ptr() as usize,
16932 ))
16933 }
16934}
16935impl Ifla6Attrs<'_> {
16936 pub fn new<'a>(buf: &'a [u8]) -> IterableIfla6Attrs<'a> {
16937 IterableIfla6Attrs::with_loc(buf, buf.as_ptr() as usize)
16938 }
16939 fn attr_from_type(r#type: u16) -> Option<&'static str> {
16940 let res = match r#type {
16941 1u16 => "Flags",
16942 2u16 => "Conf",
16943 3u16 => "Stats",
16944 4u16 => "Mcast",
16945 5u16 => "Cacheinfo",
16946 6u16 => "Icmp6stats",
16947 7u16 => "Token",
16948 8u16 => "AddrGenMode",
16949 9u16 => "RaMtu",
16950 _ => return None,
16951 };
16952 Some(res)
16953 }
16954}
16955#[derive(Clone, Copy, Default)]
16956pub struct IterableIfla6Attrs<'a> {
16957 buf: &'a [u8],
16958 pos: usize,
16959 orig_loc: usize,
16960}
16961impl<'a> IterableIfla6Attrs<'a> {
16962 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
16963 Self {
16964 buf,
16965 pos: 0,
16966 orig_loc,
16967 }
16968 }
16969 pub fn get_buf(&self) -> &'a [u8] {
16970 self.buf
16971 }
16972}
16973impl<'a> Iterator for IterableIfla6Attrs<'a> {
16974 type Item = Result<Ifla6Attrs<'a>, ErrorContext>;
16975 fn next(&mut self) -> Option<Self::Item> {
16976 let mut pos;
16977 let mut r#type;
16978 loop {
16979 pos = self.pos;
16980 r#type = None;
16981 if self.buf.len() == self.pos {
16982 return None;
16983 }
16984 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
16985 self.pos = self.buf.len();
16986 break;
16987 };
16988 r#type = Some(header.r#type);
16989 let res = match header.r#type {
16990 1u16 => Ifla6Attrs::Flags({
16991 let res = parse_u32(next);
16992 let Some(val) = res else { break };
16993 val
16994 }),
16995 2u16 => Ifla6Attrs::Conf({
16996 let res = Some(next);
16997 let Some(val) = res else { break };
16998 val
16999 }),
17000 3u16 => Ifla6Attrs::Stats({
17001 let res = Some(next);
17002 let Some(val) = res else { break };
17003 val
17004 }),
17005 4u16 => Ifla6Attrs::Mcast({
17006 let res = Some(next);
17007 let Some(val) = res else { break };
17008 val
17009 }),
17010 5u16 => Ifla6Attrs::Cacheinfo({
17011 let res = Some(IflaCacheinfo::new_from_zeroed(next));
17012 let Some(val) = res else { break };
17013 val
17014 }),
17015 6u16 => Ifla6Attrs::Icmp6stats({
17016 let res = Some(next);
17017 let Some(val) = res else { break };
17018 val
17019 }),
17020 7u16 => Ifla6Attrs::Token({
17021 let res = Some(next);
17022 let Some(val) = res else { break };
17023 val
17024 }),
17025 8u16 => Ifla6Attrs::AddrGenMode({
17026 let res = parse_u8(next);
17027 let Some(val) = res else { break };
17028 val
17029 }),
17030 9u16 => Ifla6Attrs::RaMtu({
17031 let res = parse_u32(next);
17032 let Some(val) = res else { break };
17033 val
17034 }),
17035 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17036 n => continue,
17037 };
17038 return Some(Ok(res));
17039 }
17040 Some(Err(ErrorContext::new(
17041 "Ifla6Attrs",
17042 r#type.and_then(|t| Ifla6Attrs::attr_from_type(t)),
17043 self.orig_loc,
17044 self.buf.as_ptr().wrapping_add(pos) as usize,
17045 )))
17046 }
17047}
17048impl<'a> std::fmt::Debug for IterableIfla6Attrs<'_> {
17049 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17050 let mut fmt = f.debug_struct("Ifla6Attrs");
17051 for attr in self.clone() {
17052 let attr = match attr {
17053 Ok(a) => a,
17054 Err(err) => {
17055 fmt.finish()?;
17056 f.write_str("Err(")?;
17057 err.fmt(f)?;
17058 return f.write_str(")");
17059 }
17060 };
17061 match attr {
17062 Ifla6Attrs::Flags(val) => fmt.field("Flags", &val),
17063 Ifla6Attrs::Conf(val) => fmt.field("Conf", &val),
17064 Ifla6Attrs::Stats(val) => fmt.field("Stats", &val),
17065 Ifla6Attrs::Mcast(val) => fmt.field("Mcast", &val),
17066 Ifla6Attrs::Cacheinfo(val) => fmt.field("Cacheinfo", &val),
17067 Ifla6Attrs::Icmp6stats(val) => fmt.field("Icmp6stats", &val),
17068 Ifla6Attrs::Token(val) => fmt.field("Token", &val),
17069 Ifla6Attrs::AddrGenMode(val) => fmt.field("AddrGenMode", &val),
17070 Ifla6Attrs::RaMtu(val) => fmt.field("RaMtu", &val),
17071 };
17072 }
17073 fmt.finish()
17074 }
17075}
17076impl IterableIfla6Attrs<'_> {
17077 pub fn lookup_attr(
17078 &self,
17079 offset: usize,
17080 missing_type: Option<u16>,
17081 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17082 let mut stack = Vec::new();
17083 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17084 if missing_type.is_some() && cur == offset {
17085 stack.push(("Ifla6Attrs", offset));
17086 return (
17087 stack,
17088 missing_type.and_then(|t| Ifla6Attrs::attr_from_type(t)),
17089 );
17090 }
17091 if cur > offset || cur + self.buf.len() < offset {
17092 return (stack, None);
17093 }
17094 let mut attrs = self.clone();
17095 let mut last_off = cur + attrs.pos;
17096 while let Some(attr) = attrs.next() {
17097 let Ok(attr) = attr else { break };
17098 match attr {
17099 Ifla6Attrs::Flags(val) => {
17100 if last_off == offset {
17101 stack.push(("Flags", last_off));
17102 break;
17103 }
17104 }
17105 Ifla6Attrs::Conf(val) => {
17106 if last_off == offset {
17107 stack.push(("Conf", last_off));
17108 break;
17109 }
17110 }
17111 Ifla6Attrs::Stats(val) => {
17112 if last_off == offset {
17113 stack.push(("Stats", last_off));
17114 break;
17115 }
17116 }
17117 Ifla6Attrs::Mcast(val) => {
17118 if last_off == offset {
17119 stack.push(("Mcast", last_off));
17120 break;
17121 }
17122 }
17123 Ifla6Attrs::Cacheinfo(val) => {
17124 if last_off == offset {
17125 stack.push(("Cacheinfo", last_off));
17126 break;
17127 }
17128 }
17129 Ifla6Attrs::Icmp6stats(val) => {
17130 if last_off == offset {
17131 stack.push(("Icmp6stats", last_off));
17132 break;
17133 }
17134 }
17135 Ifla6Attrs::Token(val) => {
17136 if last_off == offset {
17137 stack.push(("Token", last_off));
17138 break;
17139 }
17140 }
17141 Ifla6Attrs::AddrGenMode(val) => {
17142 if last_off == offset {
17143 stack.push(("AddrGenMode", last_off));
17144 break;
17145 }
17146 }
17147 Ifla6Attrs::RaMtu(val) => {
17148 if last_off == offset {
17149 stack.push(("RaMtu", last_off));
17150 break;
17151 }
17152 }
17153 _ => {}
17154 };
17155 last_off = cur + attrs.pos;
17156 }
17157 if !stack.is_empty() {
17158 stack.push(("Ifla6Attrs", cur));
17159 }
17160 (stack, None)
17161 }
17162}
17163#[derive(Clone)]
17164pub enum MctpAttrs {
17165 Net(u32),
17166 PhysBinding(u8),
17167}
17168impl<'a> IterableMctpAttrs<'a> {
17169 pub fn get_net(&self) -> Result<u32, ErrorContext> {
17170 let mut iter = self.clone();
17171 iter.pos = 0;
17172 for attr in iter {
17173 if let Ok(MctpAttrs::Net(val)) = attr {
17174 return Ok(val);
17175 }
17176 }
17177 Err(ErrorContext::new_missing(
17178 "MctpAttrs",
17179 "Net",
17180 self.orig_loc,
17181 self.buf.as_ptr() as usize,
17182 ))
17183 }
17184 pub fn get_phys_binding(&self) -> Result<u8, ErrorContext> {
17185 let mut iter = self.clone();
17186 iter.pos = 0;
17187 for attr in iter {
17188 if let Ok(MctpAttrs::PhysBinding(val)) = attr {
17189 return Ok(val);
17190 }
17191 }
17192 Err(ErrorContext::new_missing(
17193 "MctpAttrs",
17194 "PhysBinding",
17195 self.orig_loc,
17196 self.buf.as_ptr() as usize,
17197 ))
17198 }
17199}
17200impl MctpAttrs {
17201 pub fn new<'a>(buf: &'a [u8]) -> IterableMctpAttrs<'a> {
17202 IterableMctpAttrs::with_loc(buf, buf.as_ptr() as usize)
17203 }
17204 fn attr_from_type(r#type: u16) -> Option<&'static str> {
17205 let res = match r#type {
17206 1u16 => "Net",
17207 2u16 => "PhysBinding",
17208 _ => return None,
17209 };
17210 Some(res)
17211 }
17212}
17213#[derive(Clone, Copy, Default)]
17214pub struct IterableMctpAttrs<'a> {
17215 buf: &'a [u8],
17216 pos: usize,
17217 orig_loc: usize,
17218}
17219impl<'a> IterableMctpAttrs<'a> {
17220 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17221 Self {
17222 buf,
17223 pos: 0,
17224 orig_loc,
17225 }
17226 }
17227 pub fn get_buf(&self) -> &'a [u8] {
17228 self.buf
17229 }
17230}
17231impl<'a> Iterator for IterableMctpAttrs<'a> {
17232 type Item = Result<MctpAttrs, ErrorContext>;
17233 fn next(&mut self) -> Option<Self::Item> {
17234 let mut pos;
17235 let mut r#type;
17236 loop {
17237 pos = self.pos;
17238 r#type = None;
17239 if self.buf.len() == self.pos {
17240 return None;
17241 }
17242 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
17243 self.pos = self.buf.len();
17244 break;
17245 };
17246 r#type = Some(header.r#type);
17247 let res = match header.r#type {
17248 1u16 => MctpAttrs::Net({
17249 let res = parse_u32(next);
17250 let Some(val) = res else { break };
17251 val
17252 }),
17253 2u16 => MctpAttrs::PhysBinding({
17254 let res = parse_u8(next);
17255 let Some(val) = res else { break };
17256 val
17257 }),
17258 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17259 n => continue,
17260 };
17261 return Some(Ok(res));
17262 }
17263 Some(Err(ErrorContext::new(
17264 "MctpAttrs",
17265 r#type.and_then(|t| MctpAttrs::attr_from_type(t)),
17266 self.orig_loc,
17267 self.buf.as_ptr().wrapping_add(pos) as usize,
17268 )))
17269 }
17270}
17271impl std::fmt::Debug for IterableMctpAttrs<'_> {
17272 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17273 let mut fmt = f.debug_struct("MctpAttrs");
17274 for attr in self.clone() {
17275 let attr = match attr {
17276 Ok(a) => a,
17277 Err(err) => {
17278 fmt.finish()?;
17279 f.write_str("Err(")?;
17280 err.fmt(f)?;
17281 return f.write_str(")");
17282 }
17283 };
17284 match attr {
17285 MctpAttrs::Net(val) => fmt.field("Net", &val),
17286 MctpAttrs::PhysBinding(val) => fmt.field("PhysBinding", &val),
17287 };
17288 }
17289 fmt.finish()
17290 }
17291}
17292impl IterableMctpAttrs<'_> {
17293 pub fn lookup_attr(
17294 &self,
17295 offset: usize,
17296 missing_type: Option<u16>,
17297 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17298 let mut stack = Vec::new();
17299 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17300 if missing_type.is_some() && cur == offset {
17301 stack.push(("MctpAttrs", offset));
17302 return (
17303 stack,
17304 missing_type.and_then(|t| MctpAttrs::attr_from_type(t)),
17305 );
17306 }
17307 if cur > offset || cur + self.buf.len() < offset {
17308 return (stack, None);
17309 }
17310 let mut attrs = self.clone();
17311 let mut last_off = cur + attrs.pos;
17312 while let Some(attr) = attrs.next() {
17313 let Ok(attr) = attr else { break };
17314 match attr {
17315 MctpAttrs::Net(val) => {
17316 if last_off == offset {
17317 stack.push(("Net", last_off));
17318 break;
17319 }
17320 }
17321 MctpAttrs::PhysBinding(val) => {
17322 if last_off == offset {
17323 stack.push(("PhysBinding", last_off));
17324 break;
17325 }
17326 }
17327 _ => {}
17328 };
17329 last_off = cur + attrs.pos;
17330 }
17331 if !stack.is_empty() {
17332 stack.push(("MctpAttrs", cur));
17333 }
17334 (stack, None)
17335 }
17336}
17337#[derive(Clone)]
17338pub enum StatsAttrs<'a> {
17339 Link64(RtnlLinkStats64),
17340 LinkXstats(&'a [u8]),
17341 LinkXstatsSlave(&'a [u8]),
17342 LinkOffloadXstats(IterableLinkOffloadXstats<'a>),
17343 AfSpec(&'a [u8]),
17344}
17345impl<'a> IterableStatsAttrs<'a> {
17346 pub fn get_link_64(&self) -> Result<RtnlLinkStats64, ErrorContext> {
17347 let mut iter = self.clone();
17348 iter.pos = 0;
17349 for attr in iter {
17350 if let Ok(StatsAttrs::Link64(val)) = attr {
17351 return Ok(val);
17352 }
17353 }
17354 Err(ErrorContext::new_missing(
17355 "StatsAttrs",
17356 "Link64",
17357 self.orig_loc,
17358 self.buf.as_ptr() as usize,
17359 ))
17360 }
17361 pub fn get_link_xstats(&self) -> Result<&'a [u8], ErrorContext> {
17362 let mut iter = self.clone();
17363 iter.pos = 0;
17364 for attr in iter {
17365 if let Ok(StatsAttrs::LinkXstats(val)) = attr {
17366 return Ok(val);
17367 }
17368 }
17369 Err(ErrorContext::new_missing(
17370 "StatsAttrs",
17371 "LinkXstats",
17372 self.orig_loc,
17373 self.buf.as_ptr() as usize,
17374 ))
17375 }
17376 pub fn get_link_xstats_slave(&self) -> Result<&'a [u8], ErrorContext> {
17377 let mut iter = self.clone();
17378 iter.pos = 0;
17379 for attr in iter {
17380 if let Ok(StatsAttrs::LinkXstatsSlave(val)) = attr {
17381 return Ok(val);
17382 }
17383 }
17384 Err(ErrorContext::new_missing(
17385 "StatsAttrs",
17386 "LinkXstatsSlave",
17387 self.orig_loc,
17388 self.buf.as_ptr() as usize,
17389 ))
17390 }
17391 pub fn get_link_offload_xstats(&self) -> Result<IterableLinkOffloadXstats<'a>, ErrorContext> {
17392 let mut iter = self.clone();
17393 iter.pos = 0;
17394 for attr in iter {
17395 if let Ok(StatsAttrs::LinkOffloadXstats(val)) = attr {
17396 return Ok(val);
17397 }
17398 }
17399 Err(ErrorContext::new_missing(
17400 "StatsAttrs",
17401 "LinkOffloadXstats",
17402 self.orig_loc,
17403 self.buf.as_ptr() as usize,
17404 ))
17405 }
17406 pub fn get_af_spec(&self) -> Result<&'a [u8], ErrorContext> {
17407 let mut iter = self.clone();
17408 iter.pos = 0;
17409 for attr in iter {
17410 if let Ok(StatsAttrs::AfSpec(val)) = attr {
17411 return Ok(val);
17412 }
17413 }
17414 Err(ErrorContext::new_missing(
17415 "StatsAttrs",
17416 "AfSpec",
17417 self.orig_loc,
17418 self.buf.as_ptr() as usize,
17419 ))
17420 }
17421}
17422impl StatsAttrs<'_> {
17423 pub fn new<'a>(buf: &'a [u8]) -> IterableStatsAttrs<'a> {
17424 IterableStatsAttrs::with_loc(buf, buf.as_ptr() as usize)
17425 }
17426 fn attr_from_type(r#type: u16) -> Option<&'static str> {
17427 let res = match r#type {
17428 1u16 => "Link64",
17429 2u16 => "LinkXstats",
17430 3u16 => "LinkXstatsSlave",
17431 4u16 => "LinkOffloadXstats",
17432 5u16 => "AfSpec",
17433 _ => return None,
17434 };
17435 Some(res)
17436 }
17437}
17438#[derive(Clone, Copy, Default)]
17439pub struct IterableStatsAttrs<'a> {
17440 buf: &'a [u8],
17441 pos: usize,
17442 orig_loc: usize,
17443}
17444impl<'a> IterableStatsAttrs<'a> {
17445 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17446 Self {
17447 buf,
17448 pos: 0,
17449 orig_loc,
17450 }
17451 }
17452 pub fn get_buf(&self) -> &'a [u8] {
17453 self.buf
17454 }
17455}
17456impl<'a> Iterator for IterableStatsAttrs<'a> {
17457 type Item = Result<StatsAttrs<'a>, ErrorContext>;
17458 fn next(&mut self) -> Option<Self::Item> {
17459 let mut pos;
17460 let mut r#type;
17461 loop {
17462 pos = self.pos;
17463 r#type = None;
17464 if self.buf.len() == self.pos {
17465 return None;
17466 }
17467 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
17468 self.pos = self.buf.len();
17469 break;
17470 };
17471 r#type = Some(header.r#type);
17472 let res = match header.r#type {
17473 1u16 => StatsAttrs::Link64({
17474 let res = Some(RtnlLinkStats64::new_from_zeroed(next));
17475 let Some(val) = res else { break };
17476 val
17477 }),
17478 2u16 => StatsAttrs::LinkXstats({
17479 let res = Some(next);
17480 let Some(val) = res else { break };
17481 val
17482 }),
17483 3u16 => StatsAttrs::LinkXstatsSlave({
17484 let res = Some(next);
17485 let Some(val) = res else { break };
17486 val
17487 }),
17488 4u16 => StatsAttrs::LinkOffloadXstats({
17489 let res = Some(IterableLinkOffloadXstats::with_loc(next, self.orig_loc));
17490 let Some(val) = res else { break };
17491 val
17492 }),
17493 5u16 => StatsAttrs::AfSpec({
17494 let res = Some(next);
17495 let Some(val) = res else { break };
17496 val
17497 }),
17498 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17499 n => continue,
17500 };
17501 return Some(Ok(res));
17502 }
17503 Some(Err(ErrorContext::new(
17504 "StatsAttrs",
17505 r#type.and_then(|t| StatsAttrs::attr_from_type(t)),
17506 self.orig_loc,
17507 self.buf.as_ptr().wrapping_add(pos) as usize,
17508 )))
17509 }
17510}
17511impl<'a> std::fmt::Debug for IterableStatsAttrs<'_> {
17512 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17513 let mut fmt = f.debug_struct("StatsAttrs");
17514 for attr in self.clone() {
17515 let attr = match attr {
17516 Ok(a) => a,
17517 Err(err) => {
17518 fmt.finish()?;
17519 f.write_str("Err(")?;
17520 err.fmt(f)?;
17521 return f.write_str(")");
17522 }
17523 };
17524 match attr {
17525 StatsAttrs::Link64(val) => fmt.field("Link64", &val),
17526 StatsAttrs::LinkXstats(val) => fmt.field("LinkXstats", &val),
17527 StatsAttrs::LinkXstatsSlave(val) => fmt.field("LinkXstatsSlave", &val),
17528 StatsAttrs::LinkOffloadXstats(val) => fmt.field("LinkOffloadXstats", &val),
17529 StatsAttrs::AfSpec(val) => fmt.field("AfSpec", &val),
17530 };
17531 }
17532 fmt.finish()
17533 }
17534}
17535impl IterableStatsAttrs<'_> {
17536 pub fn lookup_attr(
17537 &self,
17538 offset: usize,
17539 missing_type: Option<u16>,
17540 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17541 let mut stack = Vec::new();
17542 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17543 if missing_type.is_some() && cur == offset {
17544 stack.push(("StatsAttrs", offset));
17545 return (
17546 stack,
17547 missing_type.and_then(|t| StatsAttrs::attr_from_type(t)),
17548 );
17549 }
17550 if cur > offset || cur + self.buf.len() < offset {
17551 return (stack, None);
17552 }
17553 let mut attrs = self.clone();
17554 let mut last_off = cur + attrs.pos;
17555 let mut missing = None;
17556 while let Some(attr) = attrs.next() {
17557 let Ok(attr) = attr else { break };
17558 match attr {
17559 StatsAttrs::Link64(val) => {
17560 if last_off == offset {
17561 stack.push(("Link64", last_off));
17562 break;
17563 }
17564 }
17565 StatsAttrs::LinkXstats(val) => {
17566 if last_off == offset {
17567 stack.push(("LinkXstats", last_off));
17568 break;
17569 }
17570 }
17571 StatsAttrs::LinkXstatsSlave(val) => {
17572 if last_off == offset {
17573 stack.push(("LinkXstatsSlave", last_off));
17574 break;
17575 }
17576 }
17577 StatsAttrs::LinkOffloadXstats(val) => {
17578 (stack, missing) = val.lookup_attr(offset, missing_type);
17579 if !stack.is_empty() {
17580 break;
17581 }
17582 }
17583 StatsAttrs::AfSpec(val) => {
17584 if last_off == offset {
17585 stack.push(("AfSpec", last_off));
17586 break;
17587 }
17588 }
17589 _ => {}
17590 };
17591 last_off = cur + attrs.pos;
17592 }
17593 if !stack.is_empty() {
17594 stack.push(("StatsAttrs", cur));
17595 }
17596 (stack, missing)
17597 }
17598}
17599#[derive(Clone)]
17600pub enum LinkOffloadXstats<'a> {
17601 CpuHit(&'a [u8]),
17602 HwSInfo(IterableArrayHwSInfoOne<'a>),
17603 L3Stats(&'a [u8]),
17604}
17605impl<'a> IterableLinkOffloadXstats<'a> {
17606 pub fn get_cpu_hit(&self) -> Result<&'a [u8], ErrorContext> {
17607 let mut iter = self.clone();
17608 iter.pos = 0;
17609 for attr in iter {
17610 if let Ok(LinkOffloadXstats::CpuHit(val)) = attr {
17611 return Ok(val);
17612 }
17613 }
17614 Err(ErrorContext::new_missing(
17615 "LinkOffloadXstats",
17616 "CpuHit",
17617 self.orig_loc,
17618 self.buf.as_ptr() as usize,
17619 ))
17620 }
17621 pub fn get_hw_s_info(
17622 &self,
17623 ) -> Result<ArrayIterable<IterableArrayHwSInfoOne<'a>, IterableHwSInfoOne<'a>>, ErrorContext>
17624 {
17625 for attr in self.clone() {
17626 if let Ok(LinkOffloadXstats::HwSInfo(val)) = attr {
17627 return Ok(ArrayIterable::new(val));
17628 }
17629 }
17630 Err(ErrorContext::new_missing(
17631 "LinkOffloadXstats",
17632 "HwSInfo",
17633 self.orig_loc,
17634 self.buf.as_ptr() as usize,
17635 ))
17636 }
17637 pub fn get_l3_stats(&self) -> Result<&'a [u8], ErrorContext> {
17638 let mut iter = self.clone();
17639 iter.pos = 0;
17640 for attr in iter {
17641 if let Ok(LinkOffloadXstats::L3Stats(val)) = attr {
17642 return Ok(val);
17643 }
17644 }
17645 Err(ErrorContext::new_missing(
17646 "LinkOffloadXstats",
17647 "L3Stats",
17648 self.orig_loc,
17649 self.buf.as_ptr() as usize,
17650 ))
17651 }
17652}
17653impl HwSInfoOne {
17654 pub fn new_array(buf: &[u8]) -> IterableArrayHwSInfoOne<'_> {
17655 IterableArrayHwSInfoOne::with_loc(buf, buf.as_ptr() as usize)
17656 }
17657}
17658#[derive(Clone, Copy, Default)]
17659pub struct IterableArrayHwSInfoOne<'a> {
17660 buf: &'a [u8],
17661 pos: usize,
17662 orig_loc: usize,
17663}
17664impl<'a> IterableArrayHwSInfoOne<'a> {
17665 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17666 Self {
17667 buf,
17668 pos: 0,
17669 orig_loc,
17670 }
17671 }
17672 pub fn get_buf(&self) -> &'a [u8] {
17673 self.buf
17674 }
17675}
17676impl<'a> Iterator for IterableArrayHwSInfoOne<'a> {
17677 type Item = Result<IterableHwSInfoOne<'a>, ErrorContext>;
17678 fn next(&mut self) -> Option<Self::Item> {
17679 if self.buf.len() == self.pos {
17680 return None;
17681 }
17682 while let Some((header, next)) = chop_header(self.buf, &mut self.pos) {
17683 {
17684 return Some(Ok(IterableHwSInfoOne::with_loc(next, self.orig_loc)));
17685 }
17686 }
17687 let pos = self.pos;
17688 self.pos = self.buf.len();
17689 Some(Err(ErrorContext::new(
17690 "HwSInfoOne",
17691 None,
17692 self.orig_loc,
17693 self.buf.as_ptr().wrapping_add(pos) as usize,
17694 )))
17695 }
17696}
17697impl LinkOffloadXstats<'_> {
17698 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkOffloadXstats<'a> {
17699 IterableLinkOffloadXstats::with_loc(buf, buf.as_ptr() as usize)
17700 }
17701 fn attr_from_type(r#type: u16) -> Option<&'static str> {
17702 let res = match r#type {
17703 1u16 => "CpuHit",
17704 2u16 => "HwSInfo",
17705 3u16 => "L3Stats",
17706 _ => return None,
17707 };
17708 Some(res)
17709 }
17710}
17711#[derive(Clone, Copy, Default)]
17712pub struct IterableLinkOffloadXstats<'a> {
17713 buf: &'a [u8],
17714 pos: usize,
17715 orig_loc: usize,
17716}
17717impl<'a> IterableLinkOffloadXstats<'a> {
17718 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17719 Self {
17720 buf,
17721 pos: 0,
17722 orig_loc,
17723 }
17724 }
17725 pub fn get_buf(&self) -> &'a [u8] {
17726 self.buf
17727 }
17728}
17729impl<'a> Iterator for IterableLinkOffloadXstats<'a> {
17730 type Item = Result<LinkOffloadXstats<'a>, ErrorContext>;
17731 fn next(&mut self) -> Option<Self::Item> {
17732 let mut pos;
17733 let mut r#type;
17734 loop {
17735 pos = self.pos;
17736 r#type = None;
17737 if self.buf.len() == self.pos {
17738 return None;
17739 }
17740 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
17741 self.pos = self.buf.len();
17742 break;
17743 };
17744 r#type = Some(header.r#type);
17745 let res = match header.r#type {
17746 1u16 => LinkOffloadXstats::CpuHit({
17747 let res = Some(next);
17748 let Some(val) = res else { break };
17749 val
17750 }),
17751 2u16 => LinkOffloadXstats::HwSInfo({
17752 let res = Some(IterableArrayHwSInfoOne::with_loc(next, self.orig_loc));
17753 let Some(val) = res else { break };
17754 val
17755 }),
17756 3u16 => LinkOffloadXstats::L3Stats({
17757 let res = Some(next);
17758 let Some(val) = res else { break };
17759 val
17760 }),
17761 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17762 n => continue,
17763 };
17764 return Some(Ok(res));
17765 }
17766 Some(Err(ErrorContext::new(
17767 "LinkOffloadXstats",
17768 r#type.and_then(|t| LinkOffloadXstats::attr_from_type(t)),
17769 self.orig_loc,
17770 self.buf.as_ptr().wrapping_add(pos) as usize,
17771 )))
17772 }
17773}
17774impl std::fmt::Debug for IterableArrayHwSInfoOne<'_> {
17775 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17776 fmt.debug_list()
17777 .entries(self.clone().map(FlattenErrorContext))
17778 .finish()
17779 }
17780}
17781impl<'a> std::fmt::Debug for IterableLinkOffloadXstats<'_> {
17782 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17783 let mut fmt = f.debug_struct("LinkOffloadXstats");
17784 for attr in self.clone() {
17785 let attr = match attr {
17786 Ok(a) => a,
17787 Err(err) => {
17788 fmt.finish()?;
17789 f.write_str("Err(")?;
17790 err.fmt(f)?;
17791 return f.write_str(")");
17792 }
17793 };
17794 match attr {
17795 LinkOffloadXstats::CpuHit(val) => fmt.field("CpuHit", &val),
17796 LinkOffloadXstats::HwSInfo(val) => fmt.field("HwSInfo", &val),
17797 LinkOffloadXstats::L3Stats(val) => fmt.field("L3Stats", &val),
17798 };
17799 }
17800 fmt.finish()
17801 }
17802}
17803impl IterableLinkOffloadXstats<'_> {
17804 pub fn lookup_attr(
17805 &self,
17806 offset: usize,
17807 missing_type: Option<u16>,
17808 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17809 let mut stack = Vec::new();
17810 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17811 if missing_type.is_some() && cur == offset {
17812 stack.push(("LinkOffloadXstats", offset));
17813 return (
17814 stack,
17815 missing_type.and_then(|t| LinkOffloadXstats::attr_from_type(t)),
17816 );
17817 }
17818 if cur > offset || cur + self.buf.len() < offset {
17819 return (stack, None);
17820 }
17821 let mut attrs = self.clone();
17822 let mut last_off = cur + attrs.pos;
17823 let mut missing = None;
17824 while let Some(attr) = attrs.next() {
17825 let Ok(attr) = attr else { break };
17826 match attr {
17827 LinkOffloadXstats::CpuHit(val) => {
17828 if last_off == offset {
17829 stack.push(("CpuHit", last_off));
17830 break;
17831 }
17832 }
17833 LinkOffloadXstats::HwSInfo(val) => {
17834 for entry in val {
17835 let Ok(attr) = entry else { break };
17836 (stack, missing) = attr.lookup_attr(offset, missing_type);
17837 if !stack.is_empty() {
17838 break;
17839 }
17840 }
17841 if !stack.is_empty() {
17842 stack.push(("HwSInfo", last_off));
17843 break;
17844 }
17845 }
17846 LinkOffloadXstats::L3Stats(val) => {
17847 if last_off == offset {
17848 stack.push(("L3Stats", last_off));
17849 break;
17850 }
17851 }
17852 _ => {}
17853 };
17854 last_off = cur + attrs.pos;
17855 }
17856 if !stack.is_empty() {
17857 stack.push(("LinkOffloadXstats", cur));
17858 }
17859 (stack, missing)
17860 }
17861}
17862#[derive(Clone)]
17863pub enum HwSInfoOne {
17864 Request(u8),
17865 Used(u8),
17866}
17867impl<'a> IterableHwSInfoOne<'a> {
17868 pub fn get_request(&self) -> Result<u8, ErrorContext> {
17869 let mut iter = self.clone();
17870 iter.pos = 0;
17871 for attr in iter {
17872 if let Ok(HwSInfoOne::Request(val)) = attr {
17873 return Ok(val);
17874 }
17875 }
17876 Err(ErrorContext::new_missing(
17877 "HwSInfoOne",
17878 "Request",
17879 self.orig_loc,
17880 self.buf.as_ptr() as usize,
17881 ))
17882 }
17883 pub fn get_used(&self) -> Result<u8, ErrorContext> {
17884 let mut iter = self.clone();
17885 iter.pos = 0;
17886 for attr in iter {
17887 if let Ok(HwSInfoOne::Used(val)) = attr {
17888 return Ok(val);
17889 }
17890 }
17891 Err(ErrorContext::new_missing(
17892 "HwSInfoOne",
17893 "Used",
17894 self.orig_loc,
17895 self.buf.as_ptr() as usize,
17896 ))
17897 }
17898}
17899impl HwSInfoOne {
17900 pub fn new<'a>(buf: &'a [u8]) -> IterableHwSInfoOne<'a> {
17901 IterableHwSInfoOne::with_loc(buf, buf.as_ptr() as usize)
17902 }
17903 fn attr_from_type(r#type: u16) -> Option<&'static str> {
17904 let res = match r#type {
17905 1u16 => "Request",
17906 2u16 => "Used",
17907 _ => return None,
17908 };
17909 Some(res)
17910 }
17911}
17912#[derive(Clone, Copy, Default)]
17913pub struct IterableHwSInfoOne<'a> {
17914 buf: &'a [u8],
17915 pos: usize,
17916 orig_loc: usize,
17917}
17918impl<'a> IterableHwSInfoOne<'a> {
17919 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
17920 Self {
17921 buf,
17922 pos: 0,
17923 orig_loc,
17924 }
17925 }
17926 pub fn get_buf(&self) -> &'a [u8] {
17927 self.buf
17928 }
17929}
17930impl<'a> Iterator for IterableHwSInfoOne<'a> {
17931 type Item = Result<HwSInfoOne, ErrorContext>;
17932 fn next(&mut self) -> Option<Self::Item> {
17933 let mut pos;
17934 let mut r#type;
17935 loop {
17936 pos = self.pos;
17937 r#type = None;
17938 if self.buf.len() == self.pos {
17939 return None;
17940 }
17941 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
17942 self.pos = self.buf.len();
17943 break;
17944 };
17945 r#type = Some(header.r#type);
17946 let res = match header.r#type {
17947 1u16 => HwSInfoOne::Request({
17948 let res = parse_u8(next);
17949 let Some(val) = res else { break };
17950 val
17951 }),
17952 2u16 => HwSInfoOne::Used({
17953 let res = parse_u8(next);
17954 let Some(val) = res else { break };
17955 val
17956 }),
17957 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
17958 n => continue,
17959 };
17960 return Some(Ok(res));
17961 }
17962 Some(Err(ErrorContext::new(
17963 "HwSInfoOne",
17964 r#type.and_then(|t| HwSInfoOne::attr_from_type(t)),
17965 self.orig_loc,
17966 self.buf.as_ptr().wrapping_add(pos) as usize,
17967 )))
17968 }
17969}
17970impl std::fmt::Debug for IterableHwSInfoOne<'_> {
17971 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
17972 let mut fmt = f.debug_struct("HwSInfoOne");
17973 for attr in self.clone() {
17974 let attr = match attr {
17975 Ok(a) => a,
17976 Err(err) => {
17977 fmt.finish()?;
17978 f.write_str("Err(")?;
17979 err.fmt(f)?;
17980 return f.write_str(")");
17981 }
17982 };
17983 match attr {
17984 HwSInfoOne::Request(val) => fmt.field("Request", &val),
17985 HwSInfoOne::Used(val) => fmt.field("Used", &val),
17986 };
17987 }
17988 fmt.finish()
17989 }
17990}
17991impl IterableHwSInfoOne<'_> {
17992 pub fn lookup_attr(
17993 &self,
17994 offset: usize,
17995 missing_type: Option<u16>,
17996 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
17997 let mut stack = Vec::new();
17998 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
17999 if missing_type.is_some() && cur == offset {
18000 stack.push(("HwSInfoOne", offset));
18001 return (
18002 stack,
18003 missing_type.and_then(|t| HwSInfoOne::attr_from_type(t)),
18004 );
18005 }
18006 if cur > offset || cur + self.buf.len() < offset {
18007 return (stack, None);
18008 }
18009 let mut attrs = self.clone();
18010 let mut last_off = cur + attrs.pos;
18011 while let Some(attr) = attrs.next() {
18012 let Ok(attr) = attr else { break };
18013 match attr {
18014 HwSInfoOne::Request(val) => {
18015 if last_off == offset {
18016 stack.push(("Request", last_off));
18017 break;
18018 }
18019 }
18020 HwSInfoOne::Used(val) => {
18021 if last_off == offset {
18022 stack.push(("Used", last_off));
18023 break;
18024 }
18025 }
18026 _ => {}
18027 };
18028 last_off = cur + attrs.pos;
18029 }
18030 if !stack.is_empty() {
18031 stack.push(("HwSInfoOne", cur));
18032 }
18033 (stack, None)
18034 }
18035}
18036#[derive(Clone)]
18037pub enum LinkDpllPinAttrs {
18038 Id(u32),
18039}
18040impl<'a> IterableLinkDpllPinAttrs<'a> {
18041 pub fn get_id(&self) -> Result<u32, ErrorContext> {
18042 let mut iter = self.clone();
18043 iter.pos = 0;
18044 for attr in iter {
18045 if let Ok(LinkDpllPinAttrs::Id(val)) = attr {
18046 return Ok(val);
18047 }
18048 }
18049 Err(ErrorContext::new_missing(
18050 "LinkDpllPinAttrs",
18051 "Id",
18052 self.orig_loc,
18053 self.buf.as_ptr() as usize,
18054 ))
18055 }
18056}
18057impl LinkDpllPinAttrs {
18058 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkDpllPinAttrs<'a> {
18059 IterableLinkDpllPinAttrs::with_loc(buf, buf.as_ptr() as usize)
18060 }
18061 fn attr_from_type(r#type: u16) -> Option<&'static str> {
18062 let res = match r#type {
18063 1u16 => "Id",
18064 _ => return None,
18065 };
18066 Some(res)
18067 }
18068}
18069#[derive(Clone, Copy, Default)]
18070pub struct IterableLinkDpllPinAttrs<'a> {
18071 buf: &'a [u8],
18072 pos: usize,
18073 orig_loc: usize,
18074}
18075impl<'a> IterableLinkDpllPinAttrs<'a> {
18076 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
18077 Self {
18078 buf,
18079 pos: 0,
18080 orig_loc,
18081 }
18082 }
18083 pub fn get_buf(&self) -> &'a [u8] {
18084 self.buf
18085 }
18086}
18087impl<'a> Iterator for IterableLinkDpllPinAttrs<'a> {
18088 type Item = Result<LinkDpllPinAttrs, ErrorContext>;
18089 fn next(&mut self) -> Option<Self::Item> {
18090 let mut pos;
18091 let mut r#type;
18092 loop {
18093 pos = self.pos;
18094 r#type = None;
18095 if self.buf.len() == self.pos {
18096 return None;
18097 }
18098 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
18099 self.pos = self.buf.len();
18100 break;
18101 };
18102 r#type = Some(header.r#type);
18103 let res = match header.r#type {
18104 1u16 => LinkDpllPinAttrs::Id({
18105 let res = parse_u32(next);
18106 let Some(val) = res else { break };
18107 val
18108 }),
18109 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
18110 n => continue,
18111 };
18112 return Some(Ok(res));
18113 }
18114 Some(Err(ErrorContext::new(
18115 "LinkDpllPinAttrs",
18116 r#type.and_then(|t| LinkDpllPinAttrs::attr_from_type(t)),
18117 self.orig_loc,
18118 self.buf.as_ptr().wrapping_add(pos) as usize,
18119 )))
18120 }
18121}
18122impl std::fmt::Debug for IterableLinkDpllPinAttrs<'_> {
18123 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18124 let mut fmt = f.debug_struct("LinkDpllPinAttrs");
18125 for attr in self.clone() {
18126 let attr = match attr {
18127 Ok(a) => a,
18128 Err(err) => {
18129 fmt.finish()?;
18130 f.write_str("Err(")?;
18131 err.fmt(f)?;
18132 return f.write_str(")");
18133 }
18134 };
18135 match attr {
18136 LinkDpllPinAttrs::Id(val) => fmt.field("Id", &val),
18137 };
18138 }
18139 fmt.finish()
18140 }
18141}
18142impl IterableLinkDpllPinAttrs<'_> {
18143 pub fn lookup_attr(
18144 &self,
18145 offset: usize,
18146 missing_type: Option<u16>,
18147 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18148 let mut stack = Vec::new();
18149 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
18150 if missing_type.is_some() && cur == offset {
18151 stack.push(("LinkDpllPinAttrs", offset));
18152 return (
18153 stack,
18154 missing_type.and_then(|t| LinkDpllPinAttrs::attr_from_type(t)),
18155 );
18156 }
18157 if cur > offset || cur + self.buf.len() < offset {
18158 return (stack, None);
18159 }
18160 let mut attrs = self.clone();
18161 let mut last_off = cur + attrs.pos;
18162 while let Some(attr) = attrs.next() {
18163 let Ok(attr) = attr else { break };
18164 match attr {
18165 LinkDpllPinAttrs::Id(val) => {
18166 if last_off == offset {
18167 stack.push(("Id", last_off));
18168 break;
18169 }
18170 }
18171 _ => {}
18172 };
18173 last_off = cur + attrs.pos;
18174 }
18175 if !stack.is_empty() {
18176 stack.push(("LinkDpllPinAttrs", cur));
18177 }
18178 (stack, None)
18179 }
18180}
18181#[derive(Clone)]
18182pub enum LinkinfoNetkitAttrs<'a> {
18183 PeerInfo(&'a [u8]),
18184 Primary(u8),
18185 #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
18186 Policy(u32),
18187 #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
18188 PeerPolicy(u32),
18189 #[doc = "Associated type: [`NetkitMode`] (enum)"]
18190 Mode(u32),
18191 #[doc = "Associated type: [`NetkitScrub`] (enum)"]
18192 Scrub(u32),
18193 #[doc = "Associated type: [`NetkitScrub`] (enum)"]
18194 PeerScrub(u32),
18195 Headroom(u16),
18196 Tailroom(u16),
18197 #[doc = "Associated type: [`NetkitPairing`] (enum)"]
18198 Pairing(u32),
18199}
18200impl<'a> IterableLinkinfoNetkitAttrs<'a> {
18201 pub fn get_peer_info(&self) -> Result<&'a [u8], ErrorContext> {
18202 let mut iter = self.clone();
18203 iter.pos = 0;
18204 for attr in iter {
18205 if let Ok(LinkinfoNetkitAttrs::PeerInfo(val)) = attr {
18206 return Ok(val);
18207 }
18208 }
18209 Err(ErrorContext::new_missing(
18210 "LinkinfoNetkitAttrs",
18211 "PeerInfo",
18212 self.orig_loc,
18213 self.buf.as_ptr() as usize,
18214 ))
18215 }
18216 pub fn get_primary(&self) -> Result<u8, ErrorContext> {
18217 let mut iter = self.clone();
18218 iter.pos = 0;
18219 for attr in iter {
18220 if let Ok(LinkinfoNetkitAttrs::Primary(val)) = attr {
18221 return Ok(val);
18222 }
18223 }
18224 Err(ErrorContext::new_missing(
18225 "LinkinfoNetkitAttrs",
18226 "Primary",
18227 self.orig_loc,
18228 self.buf.as_ptr() as usize,
18229 ))
18230 }
18231 #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
18232 pub fn get_policy(&self) -> Result<u32, ErrorContext> {
18233 let mut iter = self.clone();
18234 iter.pos = 0;
18235 for attr in iter {
18236 if let Ok(LinkinfoNetkitAttrs::Policy(val)) = attr {
18237 return Ok(val);
18238 }
18239 }
18240 Err(ErrorContext::new_missing(
18241 "LinkinfoNetkitAttrs",
18242 "Policy",
18243 self.orig_loc,
18244 self.buf.as_ptr() as usize,
18245 ))
18246 }
18247 #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
18248 pub fn get_peer_policy(&self) -> Result<u32, ErrorContext> {
18249 let mut iter = self.clone();
18250 iter.pos = 0;
18251 for attr in iter {
18252 if let Ok(LinkinfoNetkitAttrs::PeerPolicy(val)) = attr {
18253 return Ok(val);
18254 }
18255 }
18256 Err(ErrorContext::new_missing(
18257 "LinkinfoNetkitAttrs",
18258 "PeerPolicy",
18259 self.orig_loc,
18260 self.buf.as_ptr() as usize,
18261 ))
18262 }
18263 #[doc = "Associated type: [`NetkitMode`] (enum)"]
18264 pub fn get_mode(&self) -> Result<u32, ErrorContext> {
18265 let mut iter = self.clone();
18266 iter.pos = 0;
18267 for attr in iter {
18268 if let Ok(LinkinfoNetkitAttrs::Mode(val)) = attr {
18269 return Ok(val);
18270 }
18271 }
18272 Err(ErrorContext::new_missing(
18273 "LinkinfoNetkitAttrs",
18274 "Mode",
18275 self.orig_loc,
18276 self.buf.as_ptr() as usize,
18277 ))
18278 }
18279 #[doc = "Associated type: [`NetkitScrub`] (enum)"]
18280 pub fn get_scrub(&self) -> Result<u32, ErrorContext> {
18281 let mut iter = self.clone();
18282 iter.pos = 0;
18283 for attr in iter {
18284 if let Ok(LinkinfoNetkitAttrs::Scrub(val)) = attr {
18285 return Ok(val);
18286 }
18287 }
18288 Err(ErrorContext::new_missing(
18289 "LinkinfoNetkitAttrs",
18290 "Scrub",
18291 self.orig_loc,
18292 self.buf.as_ptr() as usize,
18293 ))
18294 }
18295 #[doc = "Associated type: [`NetkitScrub`] (enum)"]
18296 pub fn get_peer_scrub(&self) -> Result<u32, ErrorContext> {
18297 let mut iter = self.clone();
18298 iter.pos = 0;
18299 for attr in iter {
18300 if let Ok(LinkinfoNetkitAttrs::PeerScrub(val)) = attr {
18301 return Ok(val);
18302 }
18303 }
18304 Err(ErrorContext::new_missing(
18305 "LinkinfoNetkitAttrs",
18306 "PeerScrub",
18307 self.orig_loc,
18308 self.buf.as_ptr() as usize,
18309 ))
18310 }
18311 pub fn get_headroom(&self) -> Result<u16, ErrorContext> {
18312 let mut iter = self.clone();
18313 iter.pos = 0;
18314 for attr in iter {
18315 if let Ok(LinkinfoNetkitAttrs::Headroom(val)) = attr {
18316 return Ok(val);
18317 }
18318 }
18319 Err(ErrorContext::new_missing(
18320 "LinkinfoNetkitAttrs",
18321 "Headroom",
18322 self.orig_loc,
18323 self.buf.as_ptr() as usize,
18324 ))
18325 }
18326 pub fn get_tailroom(&self) -> Result<u16, ErrorContext> {
18327 let mut iter = self.clone();
18328 iter.pos = 0;
18329 for attr in iter {
18330 if let Ok(LinkinfoNetkitAttrs::Tailroom(val)) = attr {
18331 return Ok(val);
18332 }
18333 }
18334 Err(ErrorContext::new_missing(
18335 "LinkinfoNetkitAttrs",
18336 "Tailroom",
18337 self.orig_loc,
18338 self.buf.as_ptr() as usize,
18339 ))
18340 }
18341 #[doc = "Associated type: [`NetkitPairing`] (enum)"]
18342 pub fn get_pairing(&self) -> Result<u32, ErrorContext> {
18343 let mut iter = self.clone();
18344 iter.pos = 0;
18345 for attr in iter {
18346 if let Ok(LinkinfoNetkitAttrs::Pairing(val)) = attr {
18347 return Ok(val);
18348 }
18349 }
18350 Err(ErrorContext::new_missing(
18351 "LinkinfoNetkitAttrs",
18352 "Pairing",
18353 self.orig_loc,
18354 self.buf.as_ptr() as usize,
18355 ))
18356 }
18357}
18358impl LinkinfoNetkitAttrs<'_> {
18359 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoNetkitAttrs<'a> {
18360 IterableLinkinfoNetkitAttrs::with_loc(buf, buf.as_ptr() as usize)
18361 }
18362 fn attr_from_type(r#type: u16) -> Option<&'static str> {
18363 let res = match r#type {
18364 1u16 => "PeerInfo",
18365 2u16 => "Primary",
18366 3u16 => "Policy",
18367 4u16 => "PeerPolicy",
18368 5u16 => "Mode",
18369 6u16 => "Scrub",
18370 7u16 => "PeerScrub",
18371 8u16 => "Headroom",
18372 9u16 => "Tailroom",
18373 10u16 => "Pairing",
18374 _ => return None,
18375 };
18376 Some(res)
18377 }
18378}
18379#[derive(Clone, Copy, Default)]
18380pub struct IterableLinkinfoNetkitAttrs<'a> {
18381 buf: &'a [u8],
18382 pos: usize,
18383 orig_loc: usize,
18384}
18385impl<'a> IterableLinkinfoNetkitAttrs<'a> {
18386 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
18387 Self {
18388 buf,
18389 pos: 0,
18390 orig_loc,
18391 }
18392 }
18393 pub fn get_buf(&self) -> &'a [u8] {
18394 self.buf
18395 }
18396}
18397impl<'a> Iterator for IterableLinkinfoNetkitAttrs<'a> {
18398 type Item = Result<LinkinfoNetkitAttrs<'a>, ErrorContext>;
18399 fn next(&mut self) -> Option<Self::Item> {
18400 let mut pos;
18401 let mut r#type;
18402 loop {
18403 pos = self.pos;
18404 r#type = None;
18405 if self.buf.len() == self.pos {
18406 return None;
18407 }
18408 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
18409 self.pos = self.buf.len();
18410 break;
18411 };
18412 r#type = Some(header.r#type);
18413 let res = match header.r#type {
18414 1u16 => LinkinfoNetkitAttrs::PeerInfo({
18415 let res = Some(next);
18416 let Some(val) = res else { break };
18417 val
18418 }),
18419 2u16 => LinkinfoNetkitAttrs::Primary({
18420 let res = parse_u8(next);
18421 let Some(val) = res else { break };
18422 val
18423 }),
18424 3u16 => LinkinfoNetkitAttrs::Policy({
18425 let res = parse_u32(next);
18426 let Some(val) = res else { break };
18427 val
18428 }),
18429 4u16 => LinkinfoNetkitAttrs::PeerPolicy({
18430 let res = parse_u32(next);
18431 let Some(val) = res else { break };
18432 val
18433 }),
18434 5u16 => LinkinfoNetkitAttrs::Mode({
18435 let res = parse_u32(next);
18436 let Some(val) = res else { break };
18437 val
18438 }),
18439 6u16 => LinkinfoNetkitAttrs::Scrub({
18440 let res = parse_u32(next);
18441 let Some(val) = res else { break };
18442 val
18443 }),
18444 7u16 => LinkinfoNetkitAttrs::PeerScrub({
18445 let res = parse_u32(next);
18446 let Some(val) = res else { break };
18447 val
18448 }),
18449 8u16 => LinkinfoNetkitAttrs::Headroom({
18450 let res = parse_u16(next);
18451 let Some(val) = res else { break };
18452 val
18453 }),
18454 9u16 => LinkinfoNetkitAttrs::Tailroom({
18455 let res = parse_u16(next);
18456 let Some(val) = res else { break };
18457 val
18458 }),
18459 10u16 => LinkinfoNetkitAttrs::Pairing({
18460 let res = parse_u32(next);
18461 let Some(val) = res else { break };
18462 val
18463 }),
18464 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
18465 n => continue,
18466 };
18467 return Some(Ok(res));
18468 }
18469 Some(Err(ErrorContext::new(
18470 "LinkinfoNetkitAttrs",
18471 r#type.and_then(|t| LinkinfoNetkitAttrs::attr_from_type(t)),
18472 self.orig_loc,
18473 self.buf.as_ptr().wrapping_add(pos) as usize,
18474 )))
18475 }
18476}
18477impl<'a> std::fmt::Debug for IterableLinkinfoNetkitAttrs<'_> {
18478 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18479 let mut fmt = f.debug_struct("LinkinfoNetkitAttrs");
18480 for attr in self.clone() {
18481 let attr = match attr {
18482 Ok(a) => a,
18483 Err(err) => {
18484 fmt.finish()?;
18485 f.write_str("Err(")?;
18486 err.fmt(f)?;
18487 return f.write_str(")");
18488 }
18489 };
18490 match attr {
18491 LinkinfoNetkitAttrs::PeerInfo(val) => fmt.field("PeerInfo", &val),
18492 LinkinfoNetkitAttrs::Primary(val) => fmt.field("Primary", &val),
18493 LinkinfoNetkitAttrs::Policy(val) => {
18494 fmt.field("Policy", &FormatEnum(val.into(), NetkitPolicy::from_value))
18495 }
18496 LinkinfoNetkitAttrs::PeerPolicy(val) => fmt.field(
18497 "PeerPolicy",
18498 &FormatEnum(val.into(), NetkitPolicy::from_value),
18499 ),
18500 LinkinfoNetkitAttrs::Mode(val) => {
18501 fmt.field("Mode", &FormatEnum(val.into(), NetkitMode::from_value))
18502 }
18503 LinkinfoNetkitAttrs::Scrub(val) => {
18504 fmt.field("Scrub", &FormatEnum(val.into(), NetkitScrub::from_value))
18505 }
18506 LinkinfoNetkitAttrs::PeerScrub(val) => fmt.field(
18507 "PeerScrub",
18508 &FormatEnum(val.into(), NetkitScrub::from_value),
18509 ),
18510 LinkinfoNetkitAttrs::Headroom(val) => fmt.field("Headroom", &val),
18511 LinkinfoNetkitAttrs::Tailroom(val) => fmt.field("Tailroom", &val),
18512 LinkinfoNetkitAttrs::Pairing(val) => fmt.field(
18513 "Pairing",
18514 &FormatEnum(val.into(), NetkitPairing::from_value),
18515 ),
18516 };
18517 }
18518 fmt.finish()
18519 }
18520}
18521impl IterableLinkinfoNetkitAttrs<'_> {
18522 pub fn lookup_attr(
18523 &self,
18524 offset: usize,
18525 missing_type: Option<u16>,
18526 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18527 let mut stack = Vec::new();
18528 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
18529 if missing_type.is_some() && cur == offset {
18530 stack.push(("LinkinfoNetkitAttrs", offset));
18531 return (
18532 stack,
18533 missing_type.and_then(|t| LinkinfoNetkitAttrs::attr_from_type(t)),
18534 );
18535 }
18536 if cur > offset || cur + self.buf.len() < offset {
18537 return (stack, None);
18538 }
18539 let mut attrs = self.clone();
18540 let mut last_off = cur + attrs.pos;
18541 while let Some(attr) = attrs.next() {
18542 let Ok(attr) = attr else { break };
18543 match attr {
18544 LinkinfoNetkitAttrs::PeerInfo(val) => {
18545 if last_off == offset {
18546 stack.push(("PeerInfo", last_off));
18547 break;
18548 }
18549 }
18550 LinkinfoNetkitAttrs::Primary(val) => {
18551 if last_off == offset {
18552 stack.push(("Primary", last_off));
18553 break;
18554 }
18555 }
18556 LinkinfoNetkitAttrs::Policy(val) => {
18557 if last_off == offset {
18558 stack.push(("Policy", last_off));
18559 break;
18560 }
18561 }
18562 LinkinfoNetkitAttrs::PeerPolicy(val) => {
18563 if last_off == offset {
18564 stack.push(("PeerPolicy", last_off));
18565 break;
18566 }
18567 }
18568 LinkinfoNetkitAttrs::Mode(val) => {
18569 if last_off == offset {
18570 stack.push(("Mode", last_off));
18571 break;
18572 }
18573 }
18574 LinkinfoNetkitAttrs::Scrub(val) => {
18575 if last_off == offset {
18576 stack.push(("Scrub", last_off));
18577 break;
18578 }
18579 }
18580 LinkinfoNetkitAttrs::PeerScrub(val) => {
18581 if last_off == offset {
18582 stack.push(("PeerScrub", last_off));
18583 break;
18584 }
18585 }
18586 LinkinfoNetkitAttrs::Headroom(val) => {
18587 if last_off == offset {
18588 stack.push(("Headroom", last_off));
18589 break;
18590 }
18591 }
18592 LinkinfoNetkitAttrs::Tailroom(val) => {
18593 if last_off == offset {
18594 stack.push(("Tailroom", last_off));
18595 break;
18596 }
18597 }
18598 LinkinfoNetkitAttrs::Pairing(val) => {
18599 if last_off == offset {
18600 stack.push(("Pairing", last_off));
18601 break;
18602 }
18603 }
18604 _ => {}
18605 };
18606 last_off = cur + attrs.pos;
18607 }
18608 if !stack.is_empty() {
18609 stack.push(("LinkinfoNetkitAttrs", cur));
18610 }
18611 (stack, None)
18612 }
18613}
18614#[derive(Clone)]
18615pub enum LinkinfoOvpnAttrs {
18616 #[doc = "Associated type: [`OvpnMode`] (enum)"]
18617 Mode(u8),
18618}
18619impl<'a> IterableLinkinfoOvpnAttrs<'a> {
18620 #[doc = "Associated type: [`OvpnMode`] (enum)"]
18621 pub fn get_mode(&self) -> Result<u8, ErrorContext> {
18622 let mut iter = self.clone();
18623 iter.pos = 0;
18624 for attr in iter {
18625 if let Ok(LinkinfoOvpnAttrs::Mode(val)) = attr {
18626 return Ok(val);
18627 }
18628 }
18629 Err(ErrorContext::new_missing(
18630 "LinkinfoOvpnAttrs",
18631 "Mode",
18632 self.orig_loc,
18633 self.buf.as_ptr() as usize,
18634 ))
18635 }
18636}
18637impl LinkinfoOvpnAttrs {
18638 pub fn new<'a>(buf: &'a [u8]) -> IterableLinkinfoOvpnAttrs<'a> {
18639 IterableLinkinfoOvpnAttrs::with_loc(buf, buf.as_ptr() as usize)
18640 }
18641 fn attr_from_type(r#type: u16) -> Option<&'static str> {
18642 let res = match r#type {
18643 1u16 => "Mode",
18644 _ => return None,
18645 };
18646 Some(res)
18647 }
18648}
18649#[derive(Clone, Copy, Default)]
18650pub struct IterableLinkinfoOvpnAttrs<'a> {
18651 buf: &'a [u8],
18652 pos: usize,
18653 orig_loc: usize,
18654}
18655impl<'a> IterableLinkinfoOvpnAttrs<'a> {
18656 fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
18657 Self {
18658 buf,
18659 pos: 0,
18660 orig_loc,
18661 }
18662 }
18663 pub fn get_buf(&self) -> &'a [u8] {
18664 self.buf
18665 }
18666}
18667impl<'a> Iterator for IterableLinkinfoOvpnAttrs<'a> {
18668 type Item = Result<LinkinfoOvpnAttrs, ErrorContext>;
18669 fn next(&mut self) -> Option<Self::Item> {
18670 let mut pos;
18671 let mut r#type;
18672 loop {
18673 pos = self.pos;
18674 r#type = None;
18675 if self.buf.len() == self.pos {
18676 return None;
18677 }
18678 let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
18679 self.pos = self.buf.len();
18680 break;
18681 };
18682 r#type = Some(header.r#type);
18683 let res = match header.r#type {
18684 1u16 => LinkinfoOvpnAttrs::Mode({
18685 let res = parse_u8(next);
18686 let Some(val) = res else { break };
18687 val
18688 }),
18689 n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
18690 n => continue,
18691 };
18692 return Some(Ok(res));
18693 }
18694 Some(Err(ErrorContext::new(
18695 "LinkinfoOvpnAttrs",
18696 r#type.and_then(|t| LinkinfoOvpnAttrs::attr_from_type(t)),
18697 self.orig_loc,
18698 self.buf.as_ptr().wrapping_add(pos) as usize,
18699 )))
18700 }
18701}
18702impl std::fmt::Debug for IterableLinkinfoOvpnAttrs<'_> {
18703 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
18704 let mut fmt = f.debug_struct("LinkinfoOvpnAttrs");
18705 for attr in self.clone() {
18706 let attr = match attr {
18707 Ok(a) => a,
18708 Err(err) => {
18709 fmt.finish()?;
18710 f.write_str("Err(")?;
18711 err.fmt(f)?;
18712 return f.write_str(")");
18713 }
18714 };
18715 match attr {
18716 LinkinfoOvpnAttrs::Mode(val) => {
18717 fmt.field("Mode", &FormatEnum(val.into(), OvpnMode::from_value))
18718 }
18719 };
18720 }
18721 fmt.finish()
18722 }
18723}
18724impl IterableLinkinfoOvpnAttrs<'_> {
18725 pub fn lookup_attr(
18726 &self,
18727 offset: usize,
18728 missing_type: Option<u16>,
18729 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
18730 let mut stack = Vec::new();
18731 let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
18732 if missing_type.is_some() && cur == offset {
18733 stack.push(("LinkinfoOvpnAttrs", offset));
18734 return (
18735 stack,
18736 missing_type.and_then(|t| LinkinfoOvpnAttrs::attr_from_type(t)),
18737 );
18738 }
18739 if cur > offset || cur + self.buf.len() < offset {
18740 return (stack, None);
18741 }
18742 let mut attrs = self.clone();
18743 let mut last_off = cur + attrs.pos;
18744 while let Some(attr) = attrs.next() {
18745 let Ok(attr) = attr else { break };
18746 match attr {
18747 LinkinfoOvpnAttrs::Mode(val) => {
18748 if last_off == offset {
18749 stack.push(("Mode", last_off));
18750 break;
18751 }
18752 }
18753 _ => {}
18754 };
18755 last_off = cur + attrs.pos;
18756 }
18757 if !stack.is_empty() {
18758 stack.push(("LinkinfoOvpnAttrs", cur));
18759 }
18760 (stack, None)
18761 }
18762}
18763pub struct PushLinkAttrs<Prev: Pusher> {
18764 pub(crate) prev: Option<Prev>,
18765 pub(crate) header_offset: Option<usize>,
18766}
18767impl<Prev: Pusher> Pusher for PushLinkAttrs<Prev> {
18768 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
18769 self.prev.as_mut().unwrap().as_vec_mut()
18770 }
18771 fn as_vec(&self) -> &Vec<u8> {
18772 self.prev.as_ref().unwrap().as_vec()
18773 }
18774}
18775impl<Prev: Pusher> PushLinkAttrs<Prev> {
18776 pub fn new(prev: Prev) -> Self {
18777 Self {
18778 prev: Some(prev),
18779 header_offset: None,
18780 }
18781 }
18782 pub fn end_nested(mut self) -> Prev {
18783 let mut prev = self.prev.take().unwrap();
18784 if let Some(header_offset) = &self.header_offset {
18785 finalize_nested_header(prev.as_vec_mut(), *header_offset);
18786 }
18787 prev
18788 }
18789 pub fn push_address(mut self, value: &[u8]) -> Self {
18790 push_header(self.as_vec_mut(), 1u16, value.len() as u16);
18791 self.as_vec_mut().extend(value);
18792 self
18793 }
18794 pub fn push_broadcast(mut self, value: &[u8]) -> Self {
18795 push_header(self.as_vec_mut(), 2u16, value.len() as u16);
18796 self.as_vec_mut().extend(value);
18797 self
18798 }
18799 pub fn push_ifname(mut self, value: &CStr) -> Self {
18800 push_header(
18801 self.as_vec_mut(),
18802 3u16,
18803 value.to_bytes_with_nul().len() as u16,
18804 );
18805 self.as_vec_mut().extend(value.to_bytes_with_nul());
18806 self
18807 }
18808 pub fn push_ifname_bytes(mut self, value: &[u8]) -> Self {
18809 push_header(self.as_vec_mut(), 3u16, (value.len() + 1) as u16);
18810 self.as_vec_mut().extend(value);
18811 self.as_vec_mut().push(0);
18812 self
18813 }
18814 pub fn push_mtu(mut self, value: u32) -> Self {
18815 push_header(self.as_vec_mut(), 4u16, 4 as u16);
18816 self.as_vec_mut().extend(value.to_ne_bytes());
18817 self
18818 }
18819 pub fn push_link(mut self, value: u32) -> Self {
18820 push_header(self.as_vec_mut(), 5u16, 4 as u16);
18821 self.as_vec_mut().extend(value.to_ne_bytes());
18822 self
18823 }
18824 pub fn push_qdisc(mut self, value: &CStr) -> Self {
18825 push_header(
18826 self.as_vec_mut(),
18827 6u16,
18828 value.to_bytes_with_nul().len() as u16,
18829 );
18830 self.as_vec_mut().extend(value.to_bytes_with_nul());
18831 self
18832 }
18833 pub fn push_qdisc_bytes(mut self, value: &[u8]) -> Self {
18834 push_header(self.as_vec_mut(), 6u16, (value.len() + 1) as u16);
18835 self.as_vec_mut().extend(value);
18836 self.as_vec_mut().push(0);
18837 self
18838 }
18839 pub fn push_stats(mut self, value: RtnlLinkStats) -> Self {
18840 push_header(self.as_vec_mut(), 7u16, value.as_slice().len() as u16);
18841 self.as_vec_mut().extend(value.as_slice());
18842 self
18843 }
18844 pub fn push_master(mut self, value: u32) -> Self {
18845 push_header(self.as_vec_mut(), 10u16, 4 as u16);
18846 self.as_vec_mut().extend(value.to_ne_bytes());
18847 self
18848 }
18849 #[doc = "struct iw_event\n"]
18850 pub fn push_wireless(mut self, value: &[u8]) -> Self {
18851 push_header(self.as_vec_mut(), 11u16, value.len() as u16);
18852 self.as_vec_mut().extend(value);
18853 self
18854 }
18855 #[doc = "A nest of ifla6-attrs or linkinfo-brport-attrs\n"]
18856 pub fn push_protinfo(mut self, value: &[u8]) -> Self {
18857 push_header(self.as_vec_mut(), 12u16, value.len() as u16);
18858 self.as_vec_mut().extend(value);
18859 self
18860 }
18861 pub fn push_txqlen(mut self, value: u32) -> Self {
18862 push_header(self.as_vec_mut(), 13u16, 4 as u16);
18863 self.as_vec_mut().extend(value.to_ne_bytes());
18864 self
18865 }
18866 pub fn push_map(mut self, value: RtnlLinkIfmap) -> Self {
18867 push_header(self.as_vec_mut(), 14u16, value.as_slice().len() as u16);
18868 self.as_vec_mut().extend(value.as_slice());
18869 self
18870 }
18871 pub fn push_weight(mut self, value: u32) -> Self {
18872 push_header(self.as_vec_mut(), 15u16, 4 as u16);
18873 self.as_vec_mut().extend(value.to_ne_bytes());
18874 self
18875 }
18876 pub fn push_operstate(mut self, value: u8) -> Self {
18877 push_header(self.as_vec_mut(), 16u16, 1 as u16);
18878 self.as_vec_mut().extend(value.to_ne_bytes());
18879 self
18880 }
18881 pub fn push_linkmode(mut self, value: u8) -> Self {
18882 push_header(self.as_vec_mut(), 17u16, 1 as u16);
18883 self.as_vec_mut().extend(value.to_ne_bytes());
18884 self
18885 }
18886 pub fn nested_linkinfo(mut self) -> PushLinkinfoAttrs<Self> {
18887 let header_offset = push_nested_header(self.as_vec_mut(), 18u16);
18888 PushLinkinfoAttrs {
18889 prev: Some(self),
18890 header_offset: Some(header_offset),
18891 }
18892 }
18893 pub fn push_net_ns_pid(mut self, value: u32) -> Self {
18894 push_header(self.as_vec_mut(), 19u16, 4 as u16);
18895 self.as_vec_mut().extend(value.to_ne_bytes());
18896 self
18897 }
18898 pub fn push_ifalias(mut self, value: &CStr) -> Self {
18899 push_header(
18900 self.as_vec_mut(),
18901 20u16,
18902 value.to_bytes_with_nul().len() as u16,
18903 );
18904 self.as_vec_mut().extend(value.to_bytes_with_nul());
18905 self
18906 }
18907 pub fn push_ifalias_bytes(mut self, value: &[u8]) -> Self {
18908 push_header(self.as_vec_mut(), 20u16, (value.len() + 1) as u16);
18909 self.as_vec_mut().extend(value);
18910 self.as_vec_mut().push(0);
18911 self
18912 }
18913 pub fn push_num_vf(mut self, value: u32) -> Self {
18914 push_header(self.as_vec_mut(), 21u16, 4 as u16);
18915 self.as_vec_mut().extend(value.to_ne_bytes());
18916 self
18917 }
18918 pub fn nested_vfinfo_list(mut self) -> PushVfinfoListAttrs<Self> {
18919 let header_offset = push_nested_header(self.as_vec_mut(), 22u16);
18920 PushVfinfoListAttrs {
18921 prev: Some(self),
18922 header_offset: Some(header_offset),
18923 }
18924 }
18925 pub fn push_stats64(mut self, value: RtnlLinkStats64) -> Self {
18926 push_header(self.as_vec_mut(), 23u16, value.as_slice().len() as u16);
18927 self.as_vec_mut().extend(value.as_slice());
18928 self
18929 }
18930 pub fn nested_vf_ports(mut self) -> PushVfPortsAttrs<Self> {
18931 let header_offset = push_nested_header(self.as_vec_mut(), 24u16);
18932 PushVfPortsAttrs {
18933 prev: Some(self),
18934 header_offset: Some(header_offset),
18935 }
18936 }
18937 pub fn nested_port_self(mut self) -> PushPortSelfAttrs<Self> {
18938 let header_offset = push_nested_header(self.as_vec_mut(), 25u16);
18939 PushPortSelfAttrs {
18940 prev: Some(self),
18941 header_offset: Some(header_offset),
18942 }
18943 }
18944 pub fn nested_af_spec(mut self) -> PushAfSpecAttrs<Self> {
18945 let header_offset = push_nested_header(self.as_vec_mut(), 26u16);
18946 PushAfSpecAttrs {
18947 prev: Some(self),
18948 header_offset: Some(header_offset),
18949 }
18950 }
18951 pub fn push_group(mut self, value: u32) -> Self {
18952 push_header(self.as_vec_mut(), 27u16, 4 as u16);
18953 self.as_vec_mut().extend(value.to_ne_bytes());
18954 self
18955 }
18956 pub fn push_net_ns_fd(mut self, value: u32) -> Self {
18957 push_header(self.as_vec_mut(), 28u16, 4 as u16);
18958 self.as_vec_mut().extend(value.to_ne_bytes());
18959 self
18960 }
18961 #[doc = "Associated type: [`RtextFilter`] (1 bit per enumeration)"]
18962 pub fn push_ext_mask(mut self, value: u32) -> Self {
18963 push_header(self.as_vec_mut(), 29u16, 4 as u16);
18964 self.as_vec_mut().extend(value.to_ne_bytes());
18965 self
18966 }
18967 pub fn push_promiscuity(mut self, value: u32) -> Self {
18968 push_header(self.as_vec_mut(), 30u16, 4 as u16);
18969 self.as_vec_mut().extend(value.to_ne_bytes());
18970 self
18971 }
18972 pub fn push_num_tx_queues(mut self, value: u32) -> Self {
18973 push_header(self.as_vec_mut(), 31u16, 4 as u16);
18974 self.as_vec_mut().extend(value.to_ne_bytes());
18975 self
18976 }
18977 pub fn push_num_rx_queues(mut self, value: u32) -> Self {
18978 push_header(self.as_vec_mut(), 32u16, 4 as u16);
18979 self.as_vec_mut().extend(value.to_ne_bytes());
18980 self
18981 }
18982 pub fn push_carrier(mut self, value: u8) -> Self {
18983 push_header(self.as_vec_mut(), 33u16, 1 as u16);
18984 self.as_vec_mut().extend(value.to_ne_bytes());
18985 self
18986 }
18987 pub fn push_phys_port_id(mut self, value: &[u8]) -> Self {
18988 push_header(self.as_vec_mut(), 34u16, value.len() as u16);
18989 self.as_vec_mut().extend(value);
18990 self
18991 }
18992 pub fn push_carrier_changes(mut self, value: u32) -> Self {
18993 push_header(self.as_vec_mut(), 35u16, 4 as u16);
18994 self.as_vec_mut().extend(value.to_ne_bytes());
18995 self
18996 }
18997 pub fn push_phys_switch_id(mut self, value: &[u8]) -> Self {
18998 push_header(self.as_vec_mut(), 36u16, value.len() as u16);
18999 self.as_vec_mut().extend(value);
19000 self
19001 }
19002 pub fn push_link_netnsid(mut self, value: i32) -> Self {
19003 push_header(self.as_vec_mut(), 37u16, 4 as u16);
19004 self.as_vec_mut().extend(value.to_ne_bytes());
19005 self
19006 }
19007 pub fn push_phys_port_name(mut self, value: &CStr) -> Self {
19008 push_header(
19009 self.as_vec_mut(),
19010 38u16,
19011 value.to_bytes_with_nul().len() as u16,
19012 );
19013 self.as_vec_mut().extend(value.to_bytes_with_nul());
19014 self
19015 }
19016 pub fn push_phys_port_name_bytes(mut self, value: &[u8]) -> Self {
19017 push_header(self.as_vec_mut(), 38u16, (value.len() + 1) as u16);
19018 self.as_vec_mut().extend(value);
19019 self.as_vec_mut().push(0);
19020 self
19021 }
19022 pub fn push_proto_down(mut self, value: u8) -> Self {
19023 push_header(self.as_vec_mut(), 39u16, 1 as u16);
19024 self.as_vec_mut().extend(value.to_ne_bytes());
19025 self
19026 }
19027 pub fn push_gso_max_segs(mut self, value: u32) -> Self {
19028 push_header(self.as_vec_mut(), 40u16, 4 as u16);
19029 self.as_vec_mut().extend(value.to_ne_bytes());
19030 self
19031 }
19032 pub fn push_gso_max_size(mut self, value: u32) -> Self {
19033 push_header(self.as_vec_mut(), 41u16, 4 as u16);
19034 self.as_vec_mut().extend(value.to_ne_bytes());
19035 self
19036 }
19037 pub fn push_pad(mut self, value: &[u8]) -> Self {
19038 push_header(self.as_vec_mut(), 42u16, value.len() as u16);
19039 self.as_vec_mut().extend(value);
19040 self
19041 }
19042 pub fn nested_xdp(mut self) -> PushXdpAttrs<Self> {
19043 let header_offset = push_nested_header(self.as_vec_mut(), 43u16);
19044 PushXdpAttrs {
19045 prev: Some(self),
19046 header_offset: Some(header_offset),
19047 }
19048 }
19049 pub fn push_event(mut self, value: u32) -> Self {
19050 push_header(self.as_vec_mut(), 44u16, 4 as u16);
19051 self.as_vec_mut().extend(value.to_ne_bytes());
19052 self
19053 }
19054 pub fn push_new_netnsid(mut self, value: i32) -> Self {
19055 push_header(self.as_vec_mut(), 45u16, 4 as u16);
19056 self.as_vec_mut().extend(value.to_ne_bytes());
19057 self
19058 }
19059 pub fn push_target_netnsid(mut self, value: i32) -> Self {
19060 push_header(self.as_vec_mut(), 46u16, 4 as u16);
19061 self.as_vec_mut().extend(value.to_ne_bytes());
19062 self
19063 }
19064 pub fn push_carrier_up_count(mut self, value: u32) -> Self {
19065 push_header(self.as_vec_mut(), 47u16, 4 as u16);
19066 self.as_vec_mut().extend(value.to_ne_bytes());
19067 self
19068 }
19069 pub fn push_carrier_down_count(mut self, value: u32) -> Self {
19070 push_header(self.as_vec_mut(), 48u16, 4 as u16);
19071 self.as_vec_mut().extend(value.to_ne_bytes());
19072 self
19073 }
19074 pub fn push_new_ifindex(mut self, value: i32) -> Self {
19075 push_header(self.as_vec_mut(), 49u16, 4 as u16);
19076 self.as_vec_mut().extend(value.to_ne_bytes());
19077 self
19078 }
19079 pub fn push_min_mtu(mut self, value: u32) -> Self {
19080 push_header(self.as_vec_mut(), 50u16, 4 as u16);
19081 self.as_vec_mut().extend(value.to_ne_bytes());
19082 self
19083 }
19084 pub fn push_max_mtu(mut self, value: u32) -> Self {
19085 push_header(self.as_vec_mut(), 51u16, 4 as u16);
19086 self.as_vec_mut().extend(value.to_ne_bytes());
19087 self
19088 }
19089 pub fn nested_prop_list(mut self) -> PushPropListLinkAttrs<Self> {
19090 let header_offset = push_nested_header(self.as_vec_mut(), 52u16);
19091 PushPropListLinkAttrs {
19092 prev: Some(self),
19093 header_offset: Some(header_offset),
19094 }
19095 }
19096 pub fn push_alt_ifname(mut self, value: &CStr) -> Self {
19097 push_header(
19098 self.as_vec_mut(),
19099 53u16,
19100 value.to_bytes_with_nul().len() as u16,
19101 );
19102 self.as_vec_mut().extend(value.to_bytes_with_nul());
19103 self
19104 }
19105 pub fn push_alt_ifname_bytes(mut self, value: &[u8]) -> Self {
19106 push_header(self.as_vec_mut(), 53u16, (value.len() + 1) as u16);
19107 self.as_vec_mut().extend(value);
19108 self.as_vec_mut().push(0);
19109 self
19110 }
19111 pub fn push_perm_address(mut self, value: &[u8]) -> Self {
19112 push_header(self.as_vec_mut(), 54u16, value.len() as u16);
19113 self.as_vec_mut().extend(value);
19114 self
19115 }
19116 pub fn push_proto_down_reason(mut self, value: &CStr) -> Self {
19117 push_header(
19118 self.as_vec_mut(),
19119 55u16,
19120 value.to_bytes_with_nul().len() as u16,
19121 );
19122 self.as_vec_mut().extend(value.to_bytes_with_nul());
19123 self
19124 }
19125 pub fn push_proto_down_reason_bytes(mut self, value: &[u8]) -> Self {
19126 push_header(self.as_vec_mut(), 55u16, (value.len() + 1) as u16);
19127 self.as_vec_mut().extend(value);
19128 self.as_vec_mut().push(0);
19129 self
19130 }
19131 pub fn push_parent_dev_name(mut self, value: &CStr) -> Self {
19132 push_header(
19133 self.as_vec_mut(),
19134 56u16,
19135 value.to_bytes_with_nul().len() as u16,
19136 );
19137 self.as_vec_mut().extend(value.to_bytes_with_nul());
19138 self
19139 }
19140 pub fn push_parent_dev_name_bytes(mut self, value: &[u8]) -> Self {
19141 push_header(self.as_vec_mut(), 56u16, (value.len() + 1) as u16);
19142 self.as_vec_mut().extend(value);
19143 self.as_vec_mut().push(0);
19144 self
19145 }
19146 pub fn push_parent_dev_bus_name(mut self, value: &CStr) -> Self {
19147 push_header(
19148 self.as_vec_mut(),
19149 57u16,
19150 value.to_bytes_with_nul().len() as u16,
19151 );
19152 self.as_vec_mut().extend(value.to_bytes_with_nul());
19153 self
19154 }
19155 pub fn push_parent_dev_bus_name_bytes(mut self, value: &[u8]) -> Self {
19156 push_header(self.as_vec_mut(), 57u16, (value.len() + 1) as u16);
19157 self.as_vec_mut().extend(value);
19158 self.as_vec_mut().push(0);
19159 self
19160 }
19161 pub fn push_gro_max_size(mut self, value: u32) -> Self {
19162 push_header(self.as_vec_mut(), 58u16, 4 as u16);
19163 self.as_vec_mut().extend(value.to_ne_bytes());
19164 self
19165 }
19166 pub fn push_tso_max_size(mut self, value: u32) -> Self {
19167 push_header(self.as_vec_mut(), 59u16, 4 as u16);
19168 self.as_vec_mut().extend(value.to_ne_bytes());
19169 self
19170 }
19171 pub fn push_tso_max_segs(mut self, value: u32) -> Self {
19172 push_header(self.as_vec_mut(), 60u16, 4 as u16);
19173 self.as_vec_mut().extend(value.to_ne_bytes());
19174 self
19175 }
19176 pub fn push_allmulti(mut self, value: u32) -> Self {
19177 push_header(self.as_vec_mut(), 61u16, 4 as u16);
19178 self.as_vec_mut().extend(value.to_ne_bytes());
19179 self
19180 }
19181 pub fn push_devlink_port(mut self, value: &[u8]) -> Self {
19182 push_header(self.as_vec_mut(), 62u16, value.len() as u16);
19183 self.as_vec_mut().extend(value);
19184 self
19185 }
19186 pub fn push_gso_ipv4_max_size(mut self, value: u32) -> Self {
19187 push_header(self.as_vec_mut(), 63u16, 4 as u16);
19188 self.as_vec_mut().extend(value.to_ne_bytes());
19189 self
19190 }
19191 pub fn push_gro_ipv4_max_size(mut self, value: u32) -> Self {
19192 push_header(self.as_vec_mut(), 64u16, 4 as u16);
19193 self.as_vec_mut().extend(value.to_ne_bytes());
19194 self
19195 }
19196 pub fn nested_dpll_pin(mut self) -> PushLinkDpllPinAttrs<Self> {
19197 let header_offset = push_nested_header(self.as_vec_mut(), 65u16);
19198 PushLinkDpllPinAttrs {
19199 prev: Some(self),
19200 header_offset: Some(header_offset),
19201 }
19202 }
19203 #[doc = "EDT offload horizon supported by the device (in nsec).\n"]
19204 pub fn push_max_pacing_offload_horizon(mut self, value: u32) -> Self {
19205 push_header(self.as_vec_mut(), 66u16, 4 as u16);
19206 self.as_vec_mut().extend(value.to_ne_bytes());
19207 self
19208 }
19209 pub fn push_netns_immutable(mut self, value: u8) -> Self {
19210 push_header(self.as_vec_mut(), 67u16, 1 as u16);
19211 self.as_vec_mut().extend(value.to_ne_bytes());
19212 self
19213 }
19214 pub fn push_headroom(mut self, value: u16) -> Self {
19215 push_header(self.as_vec_mut(), 68u16, 2 as u16);
19216 self.as_vec_mut().extend(value.to_ne_bytes());
19217 self
19218 }
19219 pub fn push_tailroom(mut self, value: u16) -> Self {
19220 push_header(self.as_vec_mut(), 69u16, 2 as u16);
19221 self.as_vec_mut().extend(value.to_ne_bytes());
19222 self
19223 }
19224}
19225impl<Prev: Pusher> Drop for PushLinkAttrs<Prev> {
19226 fn drop(&mut self) {
19227 if let Some(prev) = &mut self.prev {
19228 if let Some(header_offset) = &self.header_offset {
19229 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19230 }
19231 }
19232 }
19233}
19234pub struct PushPropListLinkAttrs<Prev: Pusher> {
19235 pub(crate) prev: Option<Prev>,
19236 pub(crate) header_offset: Option<usize>,
19237}
19238impl<Prev: Pusher> Pusher for PushPropListLinkAttrs<Prev> {
19239 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19240 self.prev.as_mut().unwrap().as_vec_mut()
19241 }
19242 fn as_vec(&self) -> &Vec<u8> {
19243 self.prev.as_ref().unwrap().as_vec()
19244 }
19245}
19246impl<Prev: Pusher> PushPropListLinkAttrs<Prev> {
19247 pub fn new(prev: Prev) -> Self {
19248 Self {
19249 prev: Some(prev),
19250 header_offset: None,
19251 }
19252 }
19253 pub fn end_nested(mut self) -> Prev {
19254 let mut prev = self.prev.take().unwrap();
19255 if let Some(header_offset) = &self.header_offset {
19256 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19257 }
19258 prev
19259 }
19260 #[doc = "Attribute may repeat multiple times (treat it as array)"]
19261 pub fn push_alt_ifname(mut self, value: &CStr) -> Self {
19262 push_header(
19263 self.as_vec_mut(),
19264 53u16,
19265 value.to_bytes_with_nul().len() as u16,
19266 );
19267 self.as_vec_mut().extend(value.to_bytes_with_nul());
19268 self
19269 }
19270 #[doc = "Attribute may repeat multiple times (treat it as array)"]
19271 pub fn push_alt_ifname_bytes(mut self, value: &[u8]) -> Self {
19272 push_header(self.as_vec_mut(), 53u16, (value.len() + 1) as u16);
19273 self.as_vec_mut().extend(value);
19274 self.as_vec_mut().push(0);
19275 self
19276 }
19277}
19278impl<Prev: Pusher> Drop for PushPropListLinkAttrs<Prev> {
19279 fn drop(&mut self) {
19280 if let Some(prev) = &mut self.prev {
19281 if let Some(header_offset) = &self.header_offset {
19282 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19283 }
19284 }
19285 }
19286}
19287pub struct PushAfSpecAttrs<Prev: Pusher> {
19288 pub(crate) prev: Option<Prev>,
19289 pub(crate) header_offset: Option<usize>,
19290}
19291impl<Prev: Pusher> Pusher for PushAfSpecAttrs<Prev> {
19292 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19293 self.prev.as_mut().unwrap().as_vec_mut()
19294 }
19295 fn as_vec(&self) -> &Vec<u8> {
19296 self.prev.as_ref().unwrap().as_vec()
19297 }
19298}
19299impl<Prev: Pusher> PushAfSpecAttrs<Prev> {
19300 pub fn new(prev: Prev) -> Self {
19301 Self {
19302 prev: Some(prev),
19303 header_offset: None,
19304 }
19305 }
19306 pub fn end_nested(mut self) -> Prev {
19307 let mut prev = self.prev.take().unwrap();
19308 if let Some(header_offset) = &self.header_offset {
19309 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19310 }
19311 prev
19312 }
19313 pub fn nested_inet(mut self) -> PushIflaAttrs<Self> {
19314 let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19315 PushIflaAttrs {
19316 prev: Some(self),
19317 header_offset: Some(header_offset),
19318 }
19319 }
19320 pub fn nested_inet6(mut self) -> PushIfla6Attrs<Self> {
19321 let header_offset = push_nested_header(self.as_vec_mut(), 10u16);
19322 PushIfla6Attrs {
19323 prev: Some(self),
19324 header_offset: Some(header_offset),
19325 }
19326 }
19327 pub fn nested_mctp(mut self) -> PushMctpAttrs<Self> {
19328 let header_offset = push_nested_header(self.as_vec_mut(), 45u16);
19329 PushMctpAttrs {
19330 prev: Some(self),
19331 header_offset: Some(header_offset),
19332 }
19333 }
19334}
19335impl<Prev: Pusher> Drop for PushAfSpecAttrs<Prev> {
19336 fn drop(&mut self) {
19337 if let Some(prev) = &mut self.prev {
19338 if let Some(header_offset) = &self.header_offset {
19339 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19340 }
19341 }
19342 }
19343}
19344pub struct PushVfinfoListAttrs<Prev: Pusher> {
19345 pub(crate) prev: Option<Prev>,
19346 pub(crate) header_offset: Option<usize>,
19347}
19348impl<Prev: Pusher> Pusher for PushVfinfoListAttrs<Prev> {
19349 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19350 self.prev.as_mut().unwrap().as_vec_mut()
19351 }
19352 fn as_vec(&self) -> &Vec<u8> {
19353 self.prev.as_ref().unwrap().as_vec()
19354 }
19355}
19356impl<Prev: Pusher> PushVfinfoListAttrs<Prev> {
19357 pub fn new(prev: Prev) -> Self {
19358 Self {
19359 prev: Some(prev),
19360 header_offset: None,
19361 }
19362 }
19363 pub fn end_nested(mut self) -> Prev {
19364 let mut prev = self.prev.take().unwrap();
19365 if let Some(header_offset) = &self.header_offset {
19366 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19367 }
19368 prev
19369 }
19370 #[doc = "Attribute may repeat multiple times (treat it as array)"]
19371 pub fn nested_info(mut self) -> PushVfinfoAttrs<Self> {
19372 let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
19373 PushVfinfoAttrs {
19374 prev: Some(self),
19375 header_offset: Some(header_offset),
19376 }
19377 }
19378}
19379impl<Prev: Pusher> Drop for PushVfinfoListAttrs<Prev> {
19380 fn drop(&mut self) {
19381 if let Some(prev) = &mut self.prev {
19382 if let Some(header_offset) = &self.header_offset {
19383 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19384 }
19385 }
19386 }
19387}
19388pub struct PushVfinfoAttrs<Prev: Pusher> {
19389 pub(crate) prev: Option<Prev>,
19390 pub(crate) header_offset: Option<usize>,
19391}
19392impl<Prev: Pusher> Pusher for PushVfinfoAttrs<Prev> {
19393 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19394 self.prev.as_mut().unwrap().as_vec_mut()
19395 }
19396 fn as_vec(&self) -> &Vec<u8> {
19397 self.prev.as_ref().unwrap().as_vec()
19398 }
19399}
19400impl<Prev: Pusher> PushVfinfoAttrs<Prev> {
19401 pub fn new(prev: Prev) -> Self {
19402 Self {
19403 prev: Some(prev),
19404 header_offset: None,
19405 }
19406 }
19407 pub fn end_nested(mut self) -> Prev {
19408 let mut prev = self.prev.take().unwrap();
19409 if let Some(header_offset) = &self.header_offset {
19410 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19411 }
19412 prev
19413 }
19414 pub fn push_mac(mut self, value: IflaVfMac) -> Self {
19415 push_header(self.as_vec_mut(), 1u16, value.as_slice().len() as u16);
19416 self.as_vec_mut().extend(value.as_slice());
19417 self
19418 }
19419 pub fn push_vlan(mut self, value: IflaVfVlan) -> Self {
19420 push_header(self.as_vec_mut(), 2u16, value.as_slice().len() as u16);
19421 self.as_vec_mut().extend(value.as_slice());
19422 self
19423 }
19424 pub fn push_tx_rate(mut self, value: IflaVfTxRate) -> Self {
19425 push_header(self.as_vec_mut(), 3u16, value.as_slice().len() as u16);
19426 self.as_vec_mut().extend(value.as_slice());
19427 self
19428 }
19429 pub fn push_spoofchk(mut self, value: IflaVfSpoofchk) -> Self {
19430 push_header(self.as_vec_mut(), 4u16, value.as_slice().len() as u16);
19431 self.as_vec_mut().extend(value.as_slice());
19432 self
19433 }
19434 pub fn push_link_state(mut self, value: IflaVfLinkState) -> Self {
19435 push_header(self.as_vec_mut(), 5u16, value.as_slice().len() as u16);
19436 self.as_vec_mut().extend(value.as_slice());
19437 self
19438 }
19439 pub fn push_rate(mut self, value: IflaVfRate) -> Self {
19440 push_header(self.as_vec_mut(), 6u16, value.as_slice().len() as u16);
19441 self.as_vec_mut().extend(value.as_slice());
19442 self
19443 }
19444 pub fn push_rss_query_en(mut self, value: IflaVfRssQueryEn) -> Self {
19445 push_header(self.as_vec_mut(), 7u16, value.as_slice().len() as u16);
19446 self.as_vec_mut().extend(value.as_slice());
19447 self
19448 }
19449 pub fn nested_stats(mut self) -> PushVfStatsAttrs<Self> {
19450 let header_offset = push_nested_header(self.as_vec_mut(), 8u16);
19451 PushVfStatsAttrs {
19452 prev: Some(self),
19453 header_offset: Some(header_offset),
19454 }
19455 }
19456 pub fn push_trust(mut self, value: IflaVfTrust) -> Self {
19457 push_header(self.as_vec_mut(), 9u16, value.as_slice().len() as u16);
19458 self.as_vec_mut().extend(value.as_slice());
19459 self
19460 }
19461 pub fn push_ib_node_guid(mut self, value: IflaVfGuid) -> Self {
19462 push_header(self.as_vec_mut(), 10u16, value.as_slice().len() as u16);
19463 self.as_vec_mut().extend(value.as_slice());
19464 self
19465 }
19466 pub fn push_ib_port_guid(mut self, value: IflaVfGuid) -> Self {
19467 push_header(self.as_vec_mut(), 11u16, value.as_slice().len() as u16);
19468 self.as_vec_mut().extend(value.as_slice());
19469 self
19470 }
19471 pub fn nested_vlan_list(mut self) -> PushVfVlanAttrs<Self> {
19472 let header_offset = push_nested_header(self.as_vec_mut(), 12u16);
19473 PushVfVlanAttrs {
19474 prev: Some(self),
19475 header_offset: Some(header_offset),
19476 }
19477 }
19478 pub fn push_broadcast(mut self, value: &[u8]) -> Self {
19479 push_header(self.as_vec_mut(), 13u16, value.len() as u16);
19480 self.as_vec_mut().extend(value);
19481 self
19482 }
19483}
19484impl<Prev: Pusher> Drop for PushVfinfoAttrs<Prev> {
19485 fn drop(&mut self) {
19486 if let Some(prev) = &mut self.prev {
19487 if let Some(header_offset) = &self.header_offset {
19488 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19489 }
19490 }
19491 }
19492}
19493pub struct PushVfStatsAttrs<Prev: Pusher> {
19494 pub(crate) prev: Option<Prev>,
19495 pub(crate) header_offset: Option<usize>,
19496}
19497impl<Prev: Pusher> Pusher for PushVfStatsAttrs<Prev> {
19498 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19499 self.prev.as_mut().unwrap().as_vec_mut()
19500 }
19501 fn as_vec(&self) -> &Vec<u8> {
19502 self.prev.as_ref().unwrap().as_vec()
19503 }
19504}
19505impl<Prev: Pusher> PushVfStatsAttrs<Prev> {
19506 pub fn new(prev: Prev) -> Self {
19507 Self {
19508 prev: Some(prev),
19509 header_offset: None,
19510 }
19511 }
19512 pub fn end_nested(mut self) -> Prev {
19513 let mut prev = self.prev.take().unwrap();
19514 if let Some(header_offset) = &self.header_offset {
19515 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19516 }
19517 prev
19518 }
19519 pub fn push_rx_packets(mut self, value: u64) -> Self {
19520 push_header(self.as_vec_mut(), 0u16, 8 as u16);
19521 self.as_vec_mut().extend(value.to_ne_bytes());
19522 self
19523 }
19524 pub fn push_tx_packets(mut self, value: u64) -> Self {
19525 push_header(self.as_vec_mut(), 1u16, 8 as u16);
19526 self.as_vec_mut().extend(value.to_ne_bytes());
19527 self
19528 }
19529 pub fn push_rx_bytes(mut self, value: u64) -> Self {
19530 push_header(self.as_vec_mut(), 2u16, 8 as u16);
19531 self.as_vec_mut().extend(value.to_ne_bytes());
19532 self
19533 }
19534 pub fn push_tx_bytes(mut self, value: u64) -> Self {
19535 push_header(self.as_vec_mut(), 3u16, 8 as u16);
19536 self.as_vec_mut().extend(value.to_ne_bytes());
19537 self
19538 }
19539 pub fn push_broadcast(mut self, value: u64) -> Self {
19540 push_header(self.as_vec_mut(), 4u16, 8 as u16);
19541 self.as_vec_mut().extend(value.to_ne_bytes());
19542 self
19543 }
19544 pub fn push_multicast(mut self, value: u64) -> Self {
19545 push_header(self.as_vec_mut(), 5u16, 8 as u16);
19546 self.as_vec_mut().extend(value.to_ne_bytes());
19547 self
19548 }
19549 pub fn push_pad(mut self, value: &[u8]) -> Self {
19550 push_header(self.as_vec_mut(), 6u16, value.len() as u16);
19551 self.as_vec_mut().extend(value);
19552 self
19553 }
19554 pub fn push_rx_dropped(mut self, value: u64) -> Self {
19555 push_header(self.as_vec_mut(), 7u16, 8 as u16);
19556 self.as_vec_mut().extend(value.to_ne_bytes());
19557 self
19558 }
19559 pub fn push_tx_dropped(mut self, value: u64) -> Self {
19560 push_header(self.as_vec_mut(), 8u16, 8 as u16);
19561 self.as_vec_mut().extend(value.to_ne_bytes());
19562 self
19563 }
19564}
19565impl<Prev: Pusher> Drop for PushVfStatsAttrs<Prev> {
19566 fn drop(&mut self) {
19567 if let Some(prev) = &mut self.prev {
19568 if let Some(header_offset) = &self.header_offset {
19569 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19570 }
19571 }
19572 }
19573}
19574pub struct PushVfVlanAttrs<Prev: Pusher> {
19575 pub(crate) prev: Option<Prev>,
19576 pub(crate) header_offset: Option<usize>,
19577}
19578impl<Prev: Pusher> Pusher for PushVfVlanAttrs<Prev> {
19579 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19580 self.prev.as_mut().unwrap().as_vec_mut()
19581 }
19582 fn as_vec(&self) -> &Vec<u8> {
19583 self.prev.as_ref().unwrap().as_vec()
19584 }
19585}
19586impl<Prev: Pusher> PushVfVlanAttrs<Prev> {
19587 pub fn new(prev: Prev) -> Self {
19588 Self {
19589 prev: Some(prev),
19590 header_offset: None,
19591 }
19592 }
19593 pub fn end_nested(mut self) -> Prev {
19594 let mut prev = self.prev.take().unwrap();
19595 if let Some(header_offset) = &self.header_offset {
19596 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19597 }
19598 prev
19599 }
19600 #[doc = "Attribute may repeat multiple times (treat it as array)"]
19601 pub fn push_info(mut self, value: IflaVfVlanInfo) -> Self {
19602 push_header(self.as_vec_mut(), 1u16, value.as_slice().len() as u16);
19603 self.as_vec_mut().extend(value.as_slice());
19604 self
19605 }
19606}
19607impl<Prev: Pusher> Drop for PushVfVlanAttrs<Prev> {
19608 fn drop(&mut self) {
19609 if let Some(prev) = &mut self.prev {
19610 if let Some(header_offset) = &self.header_offset {
19611 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19612 }
19613 }
19614 }
19615}
19616pub struct PushVfPortsAttrs<Prev: Pusher> {
19617 pub(crate) prev: Option<Prev>,
19618 pub(crate) header_offset: Option<usize>,
19619}
19620impl<Prev: Pusher> Pusher for PushVfPortsAttrs<Prev> {
19621 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19622 self.prev.as_mut().unwrap().as_vec_mut()
19623 }
19624 fn as_vec(&self) -> &Vec<u8> {
19625 self.prev.as_ref().unwrap().as_vec()
19626 }
19627}
19628impl<Prev: Pusher> PushVfPortsAttrs<Prev> {
19629 pub fn new(prev: Prev) -> Self {
19630 Self {
19631 prev: Some(prev),
19632 header_offset: None,
19633 }
19634 }
19635 pub fn end_nested(mut self) -> Prev {
19636 let mut prev = self.prev.take().unwrap();
19637 if let Some(header_offset) = &self.header_offset {
19638 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19639 }
19640 prev
19641 }
19642}
19643impl<Prev: Pusher> Drop for PushVfPortsAttrs<Prev> {
19644 fn drop(&mut self) {
19645 if let Some(prev) = &mut self.prev {
19646 if let Some(header_offset) = &self.header_offset {
19647 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19648 }
19649 }
19650 }
19651}
19652pub struct PushPortSelfAttrs<Prev: Pusher> {
19653 pub(crate) prev: Option<Prev>,
19654 pub(crate) header_offset: Option<usize>,
19655}
19656impl<Prev: Pusher> Pusher for PushPortSelfAttrs<Prev> {
19657 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19658 self.prev.as_mut().unwrap().as_vec_mut()
19659 }
19660 fn as_vec(&self) -> &Vec<u8> {
19661 self.prev.as_ref().unwrap().as_vec()
19662 }
19663}
19664impl<Prev: Pusher> PushPortSelfAttrs<Prev> {
19665 pub fn new(prev: Prev) -> Self {
19666 Self {
19667 prev: Some(prev),
19668 header_offset: None,
19669 }
19670 }
19671 pub fn end_nested(mut self) -> Prev {
19672 let mut prev = self.prev.take().unwrap();
19673 if let Some(header_offset) = &self.header_offset {
19674 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19675 }
19676 prev
19677 }
19678}
19679impl<Prev: Pusher> Drop for PushPortSelfAttrs<Prev> {
19680 fn drop(&mut self) {
19681 if let Some(prev) = &mut self.prev {
19682 if let Some(header_offset) = &self.header_offset {
19683 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19684 }
19685 }
19686 }
19687}
19688pub struct PushLinkinfoAttrs<Prev: Pusher> {
19689 pub(crate) prev: Option<Prev>,
19690 pub(crate) header_offset: Option<usize>,
19691}
19692impl<Prev: Pusher> Pusher for PushLinkinfoAttrs<Prev> {
19693 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
19694 self.prev.as_mut().unwrap().as_vec_mut()
19695 }
19696 fn as_vec(&self) -> &Vec<u8> {
19697 self.prev.as_ref().unwrap().as_vec()
19698 }
19699}
19700impl<Prev: Pusher> PushLinkinfoAttrs<Prev> {
19701 pub fn new(prev: Prev) -> Self {
19702 Self {
19703 prev: Some(prev),
19704 header_offset: None,
19705 }
19706 }
19707 pub fn end_nested(mut self) -> Prev {
19708 let mut prev = self.prev.take().unwrap();
19709 if let Some(header_offset) = &self.header_offset {
19710 finalize_nested_header(prev.as_vec_mut(), *header_offset);
19711 }
19712 prev
19713 }
19714 pub fn push_kind(mut self, value: &CStr) -> Self {
19715 push_header(
19716 self.as_vec_mut(),
19717 1u16,
19718 value.to_bytes_with_nul().len() as u16,
19719 );
19720 self.as_vec_mut().extend(value.to_bytes_with_nul());
19721 self
19722 }
19723 pub fn push_kind_bytes(mut self, value: &[u8]) -> Self {
19724 push_header(self.as_vec_mut(), 1u16, (value.len() + 1) as u16);
19725 self.as_vec_mut().extend(value);
19726 self.as_vec_mut().push(0);
19727 self
19728 }
19729 #[doc = "Selector attribute `kind` is inserted automatically."]
19730 #[doc = "At most one sub-message attribute is expected per attribute set."]
19731 pub fn nested_data_bond(mut self) -> PushLinkinfoBondAttrs<PushDummy<Prev>> {
19732 self = self.push_kind(c"bond");
19733 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19734 let dummy = PushDummy {
19735 prev: self.prev.take(),
19736 header_offset: self.header_offset.take(),
19737 };
19738 PushLinkinfoBondAttrs {
19739 prev: Some(dummy),
19740 header_offset: Some(new_header_offset),
19741 }
19742 }
19743 #[doc = "Selector attribute `kind` is inserted automatically."]
19744 #[doc = "At most one sub-message attribute is expected per attribute set."]
19745 pub fn nested_data_bridge(mut self) -> PushLinkinfoBridgeAttrs<PushDummy<Prev>> {
19746 self = self.push_kind(c"bridge");
19747 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19748 let dummy = PushDummy {
19749 prev: self.prev.take(),
19750 header_offset: self.header_offset.take(),
19751 };
19752 PushLinkinfoBridgeAttrs {
19753 prev: Some(dummy),
19754 header_offset: Some(new_header_offset),
19755 }
19756 }
19757 #[doc = "Selector attribute `kind` is inserted automatically."]
19758 #[doc = "At most one sub-message attribute is expected per attribute set."]
19759 pub fn nested_data_erspan(mut self) -> PushLinkinfoGreAttrs<PushDummy<Prev>> {
19760 self = self.push_kind(c"erspan");
19761 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19762 let dummy = PushDummy {
19763 prev: self.prev.take(),
19764 header_offset: self.header_offset.take(),
19765 };
19766 PushLinkinfoGreAttrs {
19767 prev: Some(dummy),
19768 header_offset: Some(new_header_offset),
19769 }
19770 }
19771 #[doc = "Selector attribute `kind` is inserted automatically."]
19772 #[doc = "At most one sub-message attribute is expected per attribute set."]
19773 pub fn nested_data_gre(mut self) -> PushLinkinfoGreAttrs<PushDummy<Prev>> {
19774 self = self.push_kind(c"gre");
19775 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19776 let dummy = PushDummy {
19777 prev: self.prev.take(),
19778 header_offset: self.header_offset.take(),
19779 };
19780 PushLinkinfoGreAttrs {
19781 prev: Some(dummy),
19782 header_offset: Some(new_header_offset),
19783 }
19784 }
19785 #[doc = "Selector attribute `kind` is inserted automatically."]
19786 #[doc = "At most one sub-message attribute is expected per attribute set."]
19787 pub fn nested_data_gretap(mut self) -> PushLinkinfoGreAttrs<PushDummy<Prev>> {
19788 self = self.push_kind(c"gretap");
19789 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19790 let dummy = PushDummy {
19791 prev: self.prev.take(),
19792 header_offset: self.header_offset.take(),
19793 };
19794 PushLinkinfoGreAttrs {
19795 prev: Some(dummy),
19796 header_offset: Some(new_header_offset),
19797 }
19798 }
19799 #[doc = "Selector attribute `kind` is inserted automatically."]
19800 #[doc = "At most one sub-message attribute is expected per attribute set."]
19801 pub fn nested_data_ip6gre(mut self) -> PushLinkinfoGre6Attrs<PushDummy<Prev>> {
19802 self = self.push_kind(c"ip6gre");
19803 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19804 let dummy = PushDummy {
19805 prev: self.prev.take(),
19806 header_offset: self.header_offset.take(),
19807 };
19808 PushLinkinfoGre6Attrs {
19809 prev: Some(dummy),
19810 header_offset: Some(new_header_offset),
19811 }
19812 }
19813 #[doc = "Selector attribute `kind` is inserted automatically."]
19814 #[doc = "At most one sub-message attribute is expected per attribute set."]
19815 pub fn nested_data_geneve(mut self) -> PushLinkinfoGeneveAttrs<PushDummy<Prev>> {
19816 self = self.push_kind(c"geneve");
19817 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19818 let dummy = PushDummy {
19819 prev: self.prev.take(),
19820 header_offset: self.header_offset.take(),
19821 };
19822 PushLinkinfoGeneveAttrs {
19823 prev: Some(dummy),
19824 header_offset: Some(new_header_offset),
19825 }
19826 }
19827 #[doc = "Selector attribute `kind` is inserted automatically."]
19828 #[doc = "At most one sub-message attribute is expected per attribute set."]
19829 pub fn nested_data_hsr(mut self) -> PushLinkinfoHsrAttrs<PushDummy<Prev>> {
19830 self = self.push_kind(c"hsr");
19831 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19832 let dummy = PushDummy {
19833 prev: self.prev.take(),
19834 header_offset: self.header_offset.take(),
19835 };
19836 PushLinkinfoHsrAttrs {
19837 prev: Some(dummy),
19838 header_offset: Some(new_header_offset),
19839 }
19840 }
19841 #[doc = "Selector attribute `kind` is inserted automatically."]
19842 #[doc = "At most one sub-message attribute is expected per attribute set."]
19843 pub fn nested_data_ipip(mut self) -> PushLinkinfoIptunAttrs<PushDummy<Prev>> {
19844 self = self.push_kind(c"ipip");
19845 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19846 let dummy = PushDummy {
19847 prev: self.prev.take(),
19848 header_offset: self.header_offset.take(),
19849 };
19850 PushLinkinfoIptunAttrs {
19851 prev: Some(dummy),
19852 header_offset: Some(new_header_offset),
19853 }
19854 }
19855 #[doc = "Selector attribute `kind` is inserted automatically."]
19856 #[doc = "At most one sub-message attribute is expected per attribute set."]
19857 pub fn nested_data_ip6tnl(mut self) -> PushLinkinfoIp6tnlAttrs<PushDummy<Prev>> {
19858 self = self.push_kind(c"ip6tnl");
19859 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19860 let dummy = PushDummy {
19861 prev: self.prev.take(),
19862 header_offset: self.header_offset.take(),
19863 };
19864 PushLinkinfoIp6tnlAttrs {
19865 prev: Some(dummy),
19866 header_offset: Some(new_header_offset),
19867 }
19868 }
19869 #[doc = "Selector attribute `kind` is inserted automatically."]
19870 #[doc = "At most one sub-message attribute is expected per attribute set."]
19871 pub fn nested_data_sit(mut self) -> PushLinkinfoIptunAttrs<PushDummy<Prev>> {
19872 self = self.push_kind(c"sit");
19873 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19874 let dummy = PushDummy {
19875 prev: self.prev.take(),
19876 header_offset: self.header_offset.take(),
19877 };
19878 PushLinkinfoIptunAttrs {
19879 prev: Some(dummy),
19880 header_offset: Some(new_header_offset),
19881 }
19882 }
19883 #[doc = "Selector attribute `kind` is inserted automatically."]
19884 #[doc = "At most one sub-message attribute is expected per attribute set."]
19885 pub fn nested_data_tun(mut self) -> PushLinkinfoTunAttrs<PushDummy<Prev>> {
19886 self = self.push_kind(c"tun");
19887 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19888 let dummy = PushDummy {
19889 prev: self.prev.take(),
19890 header_offset: self.header_offset.take(),
19891 };
19892 PushLinkinfoTunAttrs {
19893 prev: Some(dummy),
19894 header_offset: Some(new_header_offset),
19895 }
19896 }
19897 #[doc = "Selector attribute `kind` is inserted automatically."]
19898 #[doc = "At most one sub-message attribute is expected per attribute set."]
19899 pub fn nested_data_vlan(mut self) -> PushLinkinfoVlanAttrs<PushDummy<Prev>> {
19900 self = self.push_kind(c"vlan");
19901 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19902 let dummy = PushDummy {
19903 prev: self.prev.take(),
19904 header_offset: self.header_offset.take(),
19905 };
19906 PushLinkinfoVlanAttrs {
19907 prev: Some(dummy),
19908 header_offset: Some(new_header_offset),
19909 }
19910 }
19911 #[doc = "Selector attribute `kind` is inserted automatically."]
19912 #[doc = "At most one sub-message attribute is expected per attribute set."]
19913 pub fn nested_data_vrf(mut self) -> PushLinkinfoVrfAttrs<PushDummy<Prev>> {
19914 self = self.push_kind(c"vrf");
19915 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19916 let dummy = PushDummy {
19917 prev: self.prev.take(),
19918 header_offset: self.header_offset.take(),
19919 };
19920 PushLinkinfoVrfAttrs {
19921 prev: Some(dummy),
19922 header_offset: Some(new_header_offset),
19923 }
19924 }
19925 #[doc = "Selector attribute `kind` is inserted automatically."]
19926 #[doc = "At most one sub-message attribute is expected per attribute set."]
19927 pub fn nested_data_vti(mut self) -> PushLinkinfoVtiAttrs<PushDummy<Prev>> {
19928 self = self.push_kind(c"vti");
19929 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19930 let dummy = PushDummy {
19931 prev: self.prev.take(),
19932 header_offset: self.header_offset.take(),
19933 };
19934 PushLinkinfoVtiAttrs {
19935 prev: Some(dummy),
19936 header_offset: Some(new_header_offset),
19937 }
19938 }
19939 #[doc = "Selector attribute `kind` is inserted automatically."]
19940 #[doc = "At most one sub-message attribute is expected per attribute set."]
19941 pub fn nested_data_vti6(mut self) -> PushLinkinfoVti6Attrs<PushDummy<Prev>> {
19942 self = self.push_kind(c"vti6");
19943 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19944 let dummy = PushDummy {
19945 prev: self.prev.take(),
19946 header_offset: self.header_offset.take(),
19947 };
19948 PushLinkinfoVti6Attrs {
19949 prev: Some(dummy),
19950 header_offset: Some(new_header_offset),
19951 }
19952 }
19953 #[doc = "Selector attribute `kind` is inserted automatically."]
19954 #[doc = "At most one sub-message attribute is expected per attribute set."]
19955 pub fn nested_data_netkit(mut self) -> PushLinkinfoNetkitAttrs<PushDummy<Prev>> {
19956 self = self.push_kind(c"netkit");
19957 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19958 let dummy = PushDummy {
19959 prev: self.prev.take(),
19960 header_offset: self.header_offset.take(),
19961 };
19962 PushLinkinfoNetkitAttrs {
19963 prev: Some(dummy),
19964 header_offset: Some(new_header_offset),
19965 }
19966 }
19967 #[doc = "Selector attribute `kind` is inserted automatically."]
19968 #[doc = "At most one sub-message attribute is expected per attribute set."]
19969 pub fn nested_data_ovpn(mut self) -> PushLinkinfoOvpnAttrs<PushDummy<Prev>> {
19970 self = self.push_kind(c"ovpn");
19971 let new_header_offset = push_nested_header(self.as_vec_mut(), 2u16);
19972 let dummy = PushDummy {
19973 prev: self.prev.take(),
19974 header_offset: self.header_offset.take(),
19975 };
19976 PushLinkinfoOvpnAttrs {
19977 prev: Some(dummy),
19978 header_offset: Some(new_header_offset),
19979 }
19980 }
19981 pub fn push_xstats(mut self, value: &[u8]) -> Self {
19982 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
19983 self.as_vec_mut().extend(value);
19984 self
19985 }
19986 pub fn push_slave_kind(mut self, value: &CStr) -> Self {
19987 push_header(
19988 self.as_vec_mut(),
19989 4u16,
19990 value.to_bytes_with_nul().len() as u16,
19991 );
19992 self.as_vec_mut().extend(value.to_bytes_with_nul());
19993 self
19994 }
19995 pub fn push_slave_kind_bytes(mut self, value: &[u8]) -> Self {
19996 push_header(self.as_vec_mut(), 4u16, (value.len() + 1) as u16);
19997 self.as_vec_mut().extend(value);
19998 self.as_vec_mut().push(0);
19999 self
20000 }
20001 #[doc = "Selector attribute `slave-kind` is inserted automatically."]
20002 #[doc = "At most one sub-message attribute is expected per attribute set."]
20003 pub fn nested_slave_data_bridge(mut self) -> PushLinkinfoBrportAttrs<PushDummy<Prev>> {
20004 self = self.push_slave_kind(c"bridge");
20005 let new_header_offset = push_nested_header(self.as_vec_mut(), 5u16);
20006 let dummy = PushDummy {
20007 prev: self.prev.take(),
20008 header_offset: self.header_offset.take(),
20009 };
20010 PushLinkinfoBrportAttrs {
20011 prev: Some(dummy),
20012 header_offset: Some(new_header_offset),
20013 }
20014 }
20015 #[doc = "Selector attribute `slave-kind` is inserted automatically."]
20016 #[doc = "At most one sub-message attribute is expected per attribute set."]
20017 pub fn nested_slave_data_bond(mut self) -> PushBondSlaveAttrs<PushDummy<Prev>> {
20018 self = self.push_slave_kind(c"bond");
20019 let new_header_offset = push_nested_header(self.as_vec_mut(), 5u16);
20020 let dummy = PushDummy {
20021 prev: self.prev.take(),
20022 header_offset: self.header_offset.take(),
20023 };
20024 PushBondSlaveAttrs {
20025 prev: Some(dummy),
20026 header_offset: Some(new_header_offset),
20027 }
20028 }
20029}
20030impl<Prev: Pusher> Drop for PushLinkinfoAttrs<Prev> {
20031 fn drop(&mut self) {
20032 if let Some(prev) = &mut self.prev {
20033 if let Some(header_offset) = &self.header_offset {
20034 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20035 }
20036 }
20037 }
20038}
20039pub struct PushLinkinfoBondAttrs<Prev: Pusher> {
20040 pub(crate) prev: Option<Prev>,
20041 pub(crate) header_offset: Option<usize>,
20042}
20043impl<Prev: Pusher> Pusher for PushLinkinfoBondAttrs<Prev> {
20044 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20045 self.prev.as_mut().unwrap().as_vec_mut()
20046 }
20047 fn as_vec(&self) -> &Vec<u8> {
20048 self.prev.as_ref().unwrap().as_vec()
20049 }
20050}
20051pub struct PushArrayU32<Prev: Pusher> {
20052 pub(crate) prev: Option<Prev>,
20053 pub(crate) header_offset: Option<usize>,
20054 pub(crate) counter: u16,
20055}
20056impl<Prev: Pusher> Pusher for PushArrayU32<Prev> {
20057 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20058 self.prev.as_mut().unwrap().as_vec_mut()
20059 }
20060 fn as_vec(&self) -> &Vec<u8> {
20061 self.prev.as_ref().unwrap().as_vec()
20062 }
20063}
20064impl<Prev: Pusher> PushArrayU32<Prev> {
20065 pub fn new(prev: Prev) -> Self {
20066 Self {
20067 prev: Some(prev),
20068 header_offset: None,
20069 counter: 0,
20070 }
20071 }
20072 pub fn end_array(mut self) -> Prev {
20073 let mut prev = self.prev.take().unwrap();
20074 if let Some(header_offset) = &self.header_offset {
20075 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20076 }
20077 prev
20078 }
20079 pub fn entry(mut self, value: std::net::Ipv4Addr) -> Self {
20080 let index = self.counter;
20081 self.counter += 1;
20082 push_header(self.as_vec_mut(), index, 4 as u16);
20083 self.as_vec_mut().extend(&value.to_bits().to_be_bytes());
20084 self
20085 }
20086}
20087impl<Prev: Pusher> Drop for PushArrayU32<Prev> {
20088 fn drop(&mut self) {
20089 if let Some(prev) = &mut self.prev {
20090 if let Some(header_offset) = &self.header_offset {
20091 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20092 }
20093 }
20094 }
20095}
20096pub struct PushArrayBinary<Prev: Pusher> {
20097 pub(crate) prev: Option<Prev>,
20098 pub(crate) header_offset: Option<usize>,
20099 pub(crate) counter: u16,
20100}
20101impl<Prev: Pusher> Pusher for PushArrayBinary<Prev> {
20102 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20103 self.prev.as_mut().unwrap().as_vec_mut()
20104 }
20105 fn as_vec(&self) -> &Vec<u8> {
20106 self.prev.as_ref().unwrap().as_vec()
20107 }
20108}
20109impl<Prev: Pusher> PushArrayBinary<Prev> {
20110 pub fn new(prev: Prev) -> Self {
20111 Self {
20112 prev: Some(prev),
20113 header_offset: None,
20114 counter: 0,
20115 }
20116 }
20117 pub fn end_array(mut self) -> Prev {
20118 let mut prev = self.prev.take().unwrap();
20119 if let Some(header_offset) = &self.header_offset {
20120 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20121 }
20122 prev
20123 }
20124 pub fn entry(mut self, value: &[u8]) -> Self {
20125 let index = self.counter;
20126 self.counter += 1;
20127 push_header(self.as_vec_mut(), index, value.len() as u16);
20128 self.as_vec_mut().extend(value);
20129 self
20130 }
20131}
20132impl<Prev: Pusher> Drop for PushArrayBinary<Prev> {
20133 fn drop(&mut self) {
20134 if let Some(prev) = &mut self.prev {
20135 if let Some(header_offset) = &self.header_offset {
20136 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20137 }
20138 }
20139 }
20140}
20141impl<Prev: Pusher> PushLinkinfoBondAttrs<Prev> {
20142 pub fn new(prev: Prev) -> Self {
20143 Self {
20144 prev: Some(prev),
20145 header_offset: None,
20146 }
20147 }
20148 pub fn end_nested(mut self) -> Prev {
20149 let mut prev = self.prev.take().unwrap();
20150 if let Some(header_offset) = &self.header_offset {
20151 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20152 }
20153 prev
20154 }
20155 pub fn push_mode(mut self, value: u8) -> Self {
20156 push_header(self.as_vec_mut(), 1u16, 1 as u16);
20157 self.as_vec_mut().extend(value.to_ne_bytes());
20158 self
20159 }
20160 pub fn push_active_slave(mut self, value: u32) -> Self {
20161 push_header(self.as_vec_mut(), 2u16, 4 as u16);
20162 self.as_vec_mut().extend(value.to_ne_bytes());
20163 self
20164 }
20165 pub fn push_miimon(mut self, value: u32) -> Self {
20166 push_header(self.as_vec_mut(), 3u16, 4 as u16);
20167 self.as_vec_mut().extend(value.to_ne_bytes());
20168 self
20169 }
20170 pub fn push_updelay(mut self, value: u32) -> Self {
20171 push_header(self.as_vec_mut(), 4u16, 4 as u16);
20172 self.as_vec_mut().extend(value.to_ne_bytes());
20173 self
20174 }
20175 pub fn push_downdelay(mut self, value: u32) -> Self {
20176 push_header(self.as_vec_mut(), 5u16, 4 as u16);
20177 self.as_vec_mut().extend(value.to_ne_bytes());
20178 self
20179 }
20180 pub fn push_use_carrier(mut self, value: u8) -> Self {
20181 push_header(self.as_vec_mut(), 6u16, 1 as u16);
20182 self.as_vec_mut().extend(value.to_ne_bytes());
20183 self
20184 }
20185 pub fn push_arp_interval(mut self, value: u32) -> Self {
20186 push_header(self.as_vec_mut(), 7u16, 4 as u16);
20187 self.as_vec_mut().extend(value.to_ne_bytes());
20188 self
20189 }
20190 pub fn array_arp_ip_target(mut self) -> PushArrayU32<Self> {
20191 let header_offset = push_nested_header(self.as_vec_mut(), 8u16);
20192 PushArrayU32 {
20193 prev: Some(self),
20194 header_offset: Some(header_offset),
20195 counter: 0,
20196 }
20197 }
20198 pub fn push_arp_validate(mut self, value: u32) -> Self {
20199 push_header(self.as_vec_mut(), 9u16, 4 as u16);
20200 self.as_vec_mut().extend(value.to_ne_bytes());
20201 self
20202 }
20203 pub fn push_arp_all_targets(mut self, value: u32) -> Self {
20204 push_header(self.as_vec_mut(), 10u16, 4 as u16);
20205 self.as_vec_mut().extend(value.to_ne_bytes());
20206 self
20207 }
20208 pub fn push_primary(mut self, value: u32) -> Self {
20209 push_header(self.as_vec_mut(), 11u16, 4 as u16);
20210 self.as_vec_mut().extend(value.to_ne_bytes());
20211 self
20212 }
20213 pub fn push_primary_reselect(mut self, value: u8) -> Self {
20214 push_header(self.as_vec_mut(), 12u16, 1 as u16);
20215 self.as_vec_mut().extend(value.to_ne_bytes());
20216 self
20217 }
20218 pub fn push_fail_over_mac(mut self, value: u8) -> Self {
20219 push_header(self.as_vec_mut(), 13u16, 1 as u16);
20220 self.as_vec_mut().extend(value.to_ne_bytes());
20221 self
20222 }
20223 pub fn push_xmit_hash_policy(mut self, value: u8) -> Self {
20224 push_header(self.as_vec_mut(), 14u16, 1 as u16);
20225 self.as_vec_mut().extend(value.to_ne_bytes());
20226 self
20227 }
20228 pub fn push_resend_igmp(mut self, value: u32) -> Self {
20229 push_header(self.as_vec_mut(), 15u16, 4 as u16);
20230 self.as_vec_mut().extend(value.to_ne_bytes());
20231 self
20232 }
20233 pub fn push_num_peer_notif(mut self, value: u8) -> Self {
20234 push_header(self.as_vec_mut(), 16u16, 1 as u16);
20235 self.as_vec_mut().extend(value.to_ne_bytes());
20236 self
20237 }
20238 pub fn push_all_slaves_active(mut self, value: u8) -> Self {
20239 push_header(self.as_vec_mut(), 17u16, 1 as u16);
20240 self.as_vec_mut().extend(value.to_ne_bytes());
20241 self
20242 }
20243 pub fn push_min_links(mut self, value: u32) -> Self {
20244 push_header(self.as_vec_mut(), 18u16, 4 as u16);
20245 self.as_vec_mut().extend(value.to_ne_bytes());
20246 self
20247 }
20248 pub fn push_lp_interval(mut self, value: u32) -> Self {
20249 push_header(self.as_vec_mut(), 19u16, 4 as u16);
20250 self.as_vec_mut().extend(value.to_ne_bytes());
20251 self
20252 }
20253 pub fn push_packets_per_slave(mut self, value: u32) -> Self {
20254 push_header(self.as_vec_mut(), 20u16, 4 as u16);
20255 self.as_vec_mut().extend(value.to_ne_bytes());
20256 self
20257 }
20258 pub fn push_ad_lacp_rate(mut self, value: u8) -> Self {
20259 push_header(self.as_vec_mut(), 21u16, 1 as u16);
20260 self.as_vec_mut().extend(value.to_ne_bytes());
20261 self
20262 }
20263 pub fn push_ad_select(mut self, value: u8) -> Self {
20264 push_header(self.as_vec_mut(), 22u16, 1 as u16);
20265 self.as_vec_mut().extend(value.to_ne_bytes());
20266 self
20267 }
20268 pub fn nested_ad_info(mut self) -> PushBondAdInfoAttrs<Self> {
20269 let header_offset = push_nested_header(self.as_vec_mut(), 23u16);
20270 PushBondAdInfoAttrs {
20271 prev: Some(self),
20272 header_offset: Some(header_offset),
20273 }
20274 }
20275 pub fn push_ad_actor_sys_prio(mut self, value: u16) -> Self {
20276 push_header(self.as_vec_mut(), 24u16, 2 as u16);
20277 self.as_vec_mut().extend(value.to_ne_bytes());
20278 self
20279 }
20280 pub fn push_ad_user_port_key(mut self, value: u16) -> Self {
20281 push_header(self.as_vec_mut(), 25u16, 2 as u16);
20282 self.as_vec_mut().extend(value.to_ne_bytes());
20283 self
20284 }
20285 pub fn push_ad_actor_system(mut self, value: &[u8]) -> Self {
20286 push_header(self.as_vec_mut(), 26u16, value.len() as u16);
20287 self.as_vec_mut().extend(value);
20288 self
20289 }
20290 pub fn push_tlb_dynamic_lb(mut self, value: u8) -> Self {
20291 push_header(self.as_vec_mut(), 27u16, 1 as u16);
20292 self.as_vec_mut().extend(value.to_ne_bytes());
20293 self
20294 }
20295 pub fn push_peer_notif_delay(mut self, value: u32) -> Self {
20296 push_header(self.as_vec_mut(), 28u16, 4 as u16);
20297 self.as_vec_mut().extend(value.to_ne_bytes());
20298 self
20299 }
20300 pub fn push_ad_lacp_active(mut self, value: u8) -> Self {
20301 push_header(self.as_vec_mut(), 29u16, 1 as u16);
20302 self.as_vec_mut().extend(value.to_ne_bytes());
20303 self
20304 }
20305 pub fn push_missed_max(mut self, value: u8) -> Self {
20306 push_header(self.as_vec_mut(), 30u16, 1 as u16);
20307 self.as_vec_mut().extend(value.to_ne_bytes());
20308 self
20309 }
20310 pub fn array_ns_ip6_target(mut self) -> PushArrayBinary<Self> {
20311 let header_offset = push_nested_header(self.as_vec_mut(), 31u16);
20312 PushArrayBinary {
20313 prev: Some(self),
20314 header_offset: Some(header_offset),
20315 counter: 0,
20316 }
20317 }
20318 pub fn push_coupled_control(mut self, value: u8) -> Self {
20319 push_header(self.as_vec_mut(), 32u16, 1 as u16);
20320 self.as_vec_mut().extend(value.to_ne_bytes());
20321 self
20322 }
20323 pub fn push_broadcast_neigh(mut self, value: u8) -> Self {
20324 push_header(self.as_vec_mut(), 33u16, 1 as u16);
20325 self.as_vec_mut().extend(value.to_ne_bytes());
20326 self
20327 }
20328 pub fn push_lacp_strict(mut self, value: u8) -> Self {
20329 push_header(self.as_vec_mut(), 34u16, 1 as u16);
20330 self.as_vec_mut().extend(value.to_ne_bytes());
20331 self
20332 }
20333}
20334impl<Prev: Pusher> Drop for PushLinkinfoBondAttrs<Prev> {
20335 fn drop(&mut self) {
20336 if let Some(prev) = &mut self.prev {
20337 if let Some(header_offset) = &self.header_offset {
20338 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20339 }
20340 }
20341 }
20342}
20343pub struct PushBondAdInfoAttrs<Prev: Pusher> {
20344 pub(crate) prev: Option<Prev>,
20345 pub(crate) header_offset: Option<usize>,
20346}
20347impl<Prev: Pusher> Pusher for PushBondAdInfoAttrs<Prev> {
20348 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20349 self.prev.as_mut().unwrap().as_vec_mut()
20350 }
20351 fn as_vec(&self) -> &Vec<u8> {
20352 self.prev.as_ref().unwrap().as_vec()
20353 }
20354}
20355impl<Prev: Pusher> PushBondAdInfoAttrs<Prev> {
20356 pub fn new(prev: Prev) -> Self {
20357 Self {
20358 prev: Some(prev),
20359 header_offset: None,
20360 }
20361 }
20362 pub fn end_nested(mut self) -> Prev {
20363 let mut prev = self.prev.take().unwrap();
20364 if let Some(header_offset) = &self.header_offset {
20365 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20366 }
20367 prev
20368 }
20369 pub fn push_aggregator(mut self, value: u16) -> Self {
20370 push_header(self.as_vec_mut(), 1u16, 2 as u16);
20371 self.as_vec_mut().extend(value.to_ne_bytes());
20372 self
20373 }
20374 pub fn push_num_ports(mut self, value: u16) -> Self {
20375 push_header(self.as_vec_mut(), 2u16, 2 as u16);
20376 self.as_vec_mut().extend(value.to_ne_bytes());
20377 self
20378 }
20379 pub fn push_actor_key(mut self, value: u16) -> Self {
20380 push_header(self.as_vec_mut(), 3u16, 2 as u16);
20381 self.as_vec_mut().extend(value.to_ne_bytes());
20382 self
20383 }
20384 pub fn push_partner_key(mut self, value: u16) -> Self {
20385 push_header(self.as_vec_mut(), 4u16, 2 as u16);
20386 self.as_vec_mut().extend(value.to_ne_bytes());
20387 self
20388 }
20389 pub fn push_partner_mac(mut self, value: &[u8]) -> Self {
20390 push_header(self.as_vec_mut(), 5u16, value.len() as u16);
20391 self.as_vec_mut().extend(value);
20392 self
20393 }
20394}
20395impl<Prev: Pusher> Drop for PushBondAdInfoAttrs<Prev> {
20396 fn drop(&mut self) {
20397 if let Some(prev) = &mut self.prev {
20398 if let Some(header_offset) = &self.header_offset {
20399 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20400 }
20401 }
20402 }
20403}
20404pub struct PushBondSlaveAttrs<Prev: Pusher> {
20405 pub(crate) prev: Option<Prev>,
20406 pub(crate) header_offset: Option<usize>,
20407}
20408impl<Prev: Pusher> Pusher for PushBondSlaveAttrs<Prev> {
20409 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20410 self.prev.as_mut().unwrap().as_vec_mut()
20411 }
20412 fn as_vec(&self) -> &Vec<u8> {
20413 self.prev.as_ref().unwrap().as_vec()
20414 }
20415}
20416impl<Prev: Pusher> PushBondSlaveAttrs<Prev> {
20417 pub fn new(prev: Prev) -> Self {
20418 Self {
20419 prev: Some(prev),
20420 header_offset: None,
20421 }
20422 }
20423 pub fn end_nested(mut self) -> Prev {
20424 let mut prev = self.prev.take().unwrap();
20425 if let Some(header_offset) = &self.header_offset {
20426 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20427 }
20428 prev
20429 }
20430 pub fn push_state(mut self, value: u8) -> Self {
20431 push_header(self.as_vec_mut(), 1u16, 1 as u16);
20432 self.as_vec_mut().extend(value.to_ne_bytes());
20433 self
20434 }
20435 pub fn push_mii_status(mut self, value: u8) -> Self {
20436 push_header(self.as_vec_mut(), 2u16, 1 as u16);
20437 self.as_vec_mut().extend(value.to_ne_bytes());
20438 self
20439 }
20440 pub fn push_link_failure_count(mut self, value: u32) -> Self {
20441 push_header(self.as_vec_mut(), 3u16, 4 as u16);
20442 self.as_vec_mut().extend(value.to_ne_bytes());
20443 self
20444 }
20445 pub fn push_perm_hwaddr(mut self, value: &[u8]) -> Self {
20446 push_header(self.as_vec_mut(), 4u16, value.len() as u16);
20447 self.as_vec_mut().extend(value);
20448 self
20449 }
20450 pub fn push_queue_id(mut self, value: u16) -> Self {
20451 push_header(self.as_vec_mut(), 5u16, 2 as u16);
20452 self.as_vec_mut().extend(value.to_ne_bytes());
20453 self
20454 }
20455 pub fn push_ad_aggregator_id(mut self, value: u16) -> Self {
20456 push_header(self.as_vec_mut(), 6u16, 2 as u16);
20457 self.as_vec_mut().extend(value.to_ne_bytes());
20458 self
20459 }
20460 pub fn push_ad_actor_oper_port_state(mut self, value: u8) -> Self {
20461 push_header(self.as_vec_mut(), 7u16, 1 as u16);
20462 self.as_vec_mut().extend(value.to_ne_bytes());
20463 self
20464 }
20465 pub fn push_ad_partner_oper_port_state(mut self, value: u16) -> Self {
20466 push_header(self.as_vec_mut(), 8u16, 2 as u16);
20467 self.as_vec_mut().extend(value.to_ne_bytes());
20468 self
20469 }
20470 pub fn push_prio(mut self, value: u32) -> Self {
20471 push_header(self.as_vec_mut(), 9u16, 4 as u16);
20472 self.as_vec_mut().extend(value.to_ne_bytes());
20473 self
20474 }
20475}
20476impl<Prev: Pusher> Drop for PushBondSlaveAttrs<Prev> {
20477 fn drop(&mut self) {
20478 if let Some(prev) = &mut self.prev {
20479 if let Some(header_offset) = &self.header_offset {
20480 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20481 }
20482 }
20483 }
20484}
20485pub struct PushLinkinfoBridgeAttrs<Prev: Pusher> {
20486 pub(crate) prev: Option<Prev>,
20487 pub(crate) header_offset: Option<usize>,
20488}
20489impl<Prev: Pusher> Pusher for PushLinkinfoBridgeAttrs<Prev> {
20490 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20491 self.prev.as_mut().unwrap().as_vec_mut()
20492 }
20493 fn as_vec(&self) -> &Vec<u8> {
20494 self.prev.as_ref().unwrap().as_vec()
20495 }
20496}
20497impl<Prev: Pusher> PushLinkinfoBridgeAttrs<Prev> {
20498 pub fn new(prev: Prev) -> Self {
20499 Self {
20500 prev: Some(prev),
20501 header_offset: None,
20502 }
20503 }
20504 pub fn end_nested(mut self) -> Prev {
20505 let mut prev = self.prev.take().unwrap();
20506 if let Some(header_offset) = &self.header_offset {
20507 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20508 }
20509 prev
20510 }
20511 pub fn push_forward_delay(mut self, value: u32) -> Self {
20512 push_header(self.as_vec_mut(), 1u16, 4 as u16);
20513 self.as_vec_mut().extend(value.to_ne_bytes());
20514 self
20515 }
20516 pub fn push_hello_time(mut self, value: u32) -> Self {
20517 push_header(self.as_vec_mut(), 2u16, 4 as u16);
20518 self.as_vec_mut().extend(value.to_ne_bytes());
20519 self
20520 }
20521 pub fn push_max_age(mut self, value: u32) -> Self {
20522 push_header(self.as_vec_mut(), 3u16, 4 as u16);
20523 self.as_vec_mut().extend(value.to_ne_bytes());
20524 self
20525 }
20526 pub fn push_ageing_time(mut self, value: u32) -> Self {
20527 push_header(self.as_vec_mut(), 4u16, 4 as u16);
20528 self.as_vec_mut().extend(value.to_ne_bytes());
20529 self
20530 }
20531 pub fn push_stp_state(mut self, value: u32) -> Self {
20532 push_header(self.as_vec_mut(), 5u16, 4 as u16);
20533 self.as_vec_mut().extend(value.to_ne_bytes());
20534 self
20535 }
20536 pub fn push_priority(mut self, value: u16) -> Self {
20537 push_header(self.as_vec_mut(), 6u16, 2 as u16);
20538 self.as_vec_mut().extend(value.to_ne_bytes());
20539 self
20540 }
20541 pub fn push_vlan_filtering(mut self, value: u8) -> Self {
20542 push_header(self.as_vec_mut(), 7u16, 1 as u16);
20543 self.as_vec_mut().extend(value.to_ne_bytes());
20544 self
20545 }
20546 pub fn push_vlan_protocol(mut self, value: u16) -> Self {
20547 push_header(self.as_vec_mut(), 8u16, 2 as u16);
20548 self.as_vec_mut().extend(value.to_ne_bytes());
20549 self
20550 }
20551 pub fn push_group_fwd_mask(mut self, value: u16) -> Self {
20552 push_header(self.as_vec_mut(), 9u16, 2 as u16);
20553 self.as_vec_mut().extend(value.to_ne_bytes());
20554 self
20555 }
20556 pub fn push_root_id(mut self, value: IflaBridgeId) -> Self {
20557 push_header(self.as_vec_mut(), 10u16, value.as_slice().len() as u16);
20558 self.as_vec_mut().extend(value.as_slice());
20559 self
20560 }
20561 pub fn push_bridge_id(mut self, value: IflaBridgeId) -> Self {
20562 push_header(self.as_vec_mut(), 11u16, value.as_slice().len() as u16);
20563 self.as_vec_mut().extend(value.as_slice());
20564 self
20565 }
20566 pub fn push_root_port(mut self, value: u16) -> Self {
20567 push_header(self.as_vec_mut(), 12u16, 2 as u16);
20568 self.as_vec_mut().extend(value.to_ne_bytes());
20569 self
20570 }
20571 pub fn push_root_path_cost(mut self, value: u32) -> Self {
20572 push_header(self.as_vec_mut(), 13u16, 4 as u16);
20573 self.as_vec_mut().extend(value.to_ne_bytes());
20574 self
20575 }
20576 pub fn push_topology_change(mut self, value: u8) -> Self {
20577 push_header(self.as_vec_mut(), 14u16, 1 as u16);
20578 self.as_vec_mut().extend(value.to_ne_bytes());
20579 self
20580 }
20581 pub fn push_topology_change_detected(mut self, value: u8) -> Self {
20582 push_header(self.as_vec_mut(), 15u16, 1 as u16);
20583 self.as_vec_mut().extend(value.to_ne_bytes());
20584 self
20585 }
20586 pub fn push_hello_timer(mut self, value: u64) -> Self {
20587 push_header(self.as_vec_mut(), 16u16, 8 as u16);
20588 self.as_vec_mut().extend(value.to_ne_bytes());
20589 self
20590 }
20591 pub fn push_tcn_timer(mut self, value: u64) -> Self {
20592 push_header(self.as_vec_mut(), 17u16, 8 as u16);
20593 self.as_vec_mut().extend(value.to_ne_bytes());
20594 self
20595 }
20596 pub fn push_topology_change_timer(mut self, value: u64) -> Self {
20597 push_header(self.as_vec_mut(), 18u16, 8 as u16);
20598 self.as_vec_mut().extend(value.to_ne_bytes());
20599 self
20600 }
20601 pub fn push_gc_timer(mut self, value: u64) -> Self {
20602 push_header(self.as_vec_mut(), 19u16, 8 as u16);
20603 self.as_vec_mut().extend(value.to_ne_bytes());
20604 self
20605 }
20606 pub fn push_group_addr(mut self, value: &[u8]) -> Self {
20607 push_header(self.as_vec_mut(), 20u16, value.len() as u16);
20608 self.as_vec_mut().extend(value);
20609 self
20610 }
20611 pub fn push_fdb_flush(mut self, value: &[u8]) -> Self {
20612 push_header(self.as_vec_mut(), 21u16, value.len() as u16);
20613 self.as_vec_mut().extend(value);
20614 self
20615 }
20616 pub fn push_mcast_router(mut self, value: u8) -> Self {
20617 push_header(self.as_vec_mut(), 22u16, 1 as u16);
20618 self.as_vec_mut().extend(value.to_ne_bytes());
20619 self
20620 }
20621 pub fn push_mcast_snooping(mut self, value: u8) -> Self {
20622 push_header(self.as_vec_mut(), 23u16, 1 as u16);
20623 self.as_vec_mut().extend(value.to_ne_bytes());
20624 self
20625 }
20626 pub fn push_mcast_query_use_ifaddr(mut self, value: u8) -> Self {
20627 push_header(self.as_vec_mut(), 24u16, 1 as u16);
20628 self.as_vec_mut().extend(value.to_ne_bytes());
20629 self
20630 }
20631 pub fn push_mcast_querier(mut self, value: u8) -> Self {
20632 push_header(self.as_vec_mut(), 25u16, 1 as u16);
20633 self.as_vec_mut().extend(value.to_ne_bytes());
20634 self
20635 }
20636 pub fn push_mcast_hash_elasticity(mut self, value: u32) -> Self {
20637 push_header(self.as_vec_mut(), 26u16, 4 as u16);
20638 self.as_vec_mut().extend(value.to_ne_bytes());
20639 self
20640 }
20641 pub fn push_mcast_hash_max(mut self, value: u32) -> Self {
20642 push_header(self.as_vec_mut(), 27u16, 4 as u16);
20643 self.as_vec_mut().extend(value.to_ne_bytes());
20644 self
20645 }
20646 pub fn push_mcast_last_member_cnt(mut self, value: u32) -> Self {
20647 push_header(self.as_vec_mut(), 28u16, 4 as u16);
20648 self.as_vec_mut().extend(value.to_ne_bytes());
20649 self
20650 }
20651 pub fn push_mcast_startup_query_cnt(mut self, value: u32) -> Self {
20652 push_header(self.as_vec_mut(), 29u16, 4 as u16);
20653 self.as_vec_mut().extend(value.to_ne_bytes());
20654 self
20655 }
20656 pub fn push_mcast_last_member_intvl(mut self, value: u64) -> Self {
20657 push_header(self.as_vec_mut(), 30u16, 8 as u16);
20658 self.as_vec_mut().extend(value.to_ne_bytes());
20659 self
20660 }
20661 pub fn push_mcast_membership_intvl(mut self, value: u64) -> Self {
20662 push_header(self.as_vec_mut(), 31u16, 8 as u16);
20663 self.as_vec_mut().extend(value.to_ne_bytes());
20664 self
20665 }
20666 pub fn push_mcast_querier_intvl(mut self, value: u64) -> Self {
20667 push_header(self.as_vec_mut(), 32u16, 8 as u16);
20668 self.as_vec_mut().extend(value.to_ne_bytes());
20669 self
20670 }
20671 pub fn push_mcast_query_intvl(mut self, value: u64) -> Self {
20672 push_header(self.as_vec_mut(), 33u16, 8 as u16);
20673 self.as_vec_mut().extend(value.to_ne_bytes());
20674 self
20675 }
20676 pub fn push_mcast_query_response_intvl(mut self, value: u64) -> Self {
20677 push_header(self.as_vec_mut(), 34u16, 8 as u16);
20678 self.as_vec_mut().extend(value.to_ne_bytes());
20679 self
20680 }
20681 pub fn push_mcast_startup_query_intvl(mut self, value: u64) -> Self {
20682 push_header(self.as_vec_mut(), 35u16, 8 as u16);
20683 self.as_vec_mut().extend(value.to_ne_bytes());
20684 self
20685 }
20686 pub fn push_nf_call_iptables(mut self, value: u8) -> Self {
20687 push_header(self.as_vec_mut(), 36u16, 1 as u16);
20688 self.as_vec_mut().extend(value.to_ne_bytes());
20689 self
20690 }
20691 pub fn push_nf_call_ip6tables(mut self, value: u8) -> Self {
20692 push_header(self.as_vec_mut(), 37u16, 1 as u16);
20693 self.as_vec_mut().extend(value.to_ne_bytes());
20694 self
20695 }
20696 pub fn push_nf_call_arptables(mut self, value: u8) -> Self {
20697 push_header(self.as_vec_mut(), 38u16, 1 as u16);
20698 self.as_vec_mut().extend(value.to_ne_bytes());
20699 self
20700 }
20701 pub fn push_vlan_default_pvid(mut self, value: u16) -> Self {
20702 push_header(self.as_vec_mut(), 39u16, 2 as u16);
20703 self.as_vec_mut().extend(value.to_ne_bytes());
20704 self
20705 }
20706 pub fn push_pad(mut self, value: &[u8]) -> Self {
20707 push_header(self.as_vec_mut(), 40u16, value.len() as u16);
20708 self.as_vec_mut().extend(value);
20709 self
20710 }
20711 pub fn push_vlan_stats_enabled(mut self, value: u8) -> Self {
20712 push_header(self.as_vec_mut(), 41u16, 1 as u16);
20713 self.as_vec_mut().extend(value.to_ne_bytes());
20714 self
20715 }
20716 pub fn push_mcast_stats_enabled(mut self, value: u8) -> Self {
20717 push_header(self.as_vec_mut(), 42u16, 1 as u16);
20718 self.as_vec_mut().extend(value.to_ne_bytes());
20719 self
20720 }
20721 pub fn push_mcast_igmp_version(mut self, value: u8) -> Self {
20722 push_header(self.as_vec_mut(), 43u16, 1 as u16);
20723 self.as_vec_mut().extend(value.to_ne_bytes());
20724 self
20725 }
20726 pub fn push_mcast_mld_version(mut self, value: u8) -> Self {
20727 push_header(self.as_vec_mut(), 44u16, 1 as u16);
20728 self.as_vec_mut().extend(value.to_ne_bytes());
20729 self
20730 }
20731 pub fn push_vlan_stats_per_port(mut self, value: u8) -> Self {
20732 push_header(self.as_vec_mut(), 45u16, 1 as u16);
20733 self.as_vec_mut().extend(value.to_ne_bytes());
20734 self
20735 }
20736 pub fn push_multi_boolopt(mut self, value: BrBooloptMulti) -> Self {
20737 push_header(self.as_vec_mut(), 46u16, value.as_slice().len() as u16);
20738 self.as_vec_mut().extend(value.as_slice());
20739 self
20740 }
20741 pub fn push_mcast_querier_state(mut self, value: &[u8]) -> Self {
20742 push_header(self.as_vec_mut(), 47u16, value.len() as u16);
20743 self.as_vec_mut().extend(value);
20744 self
20745 }
20746 pub fn push_fdb_n_learned(mut self, value: u32) -> Self {
20747 push_header(self.as_vec_mut(), 48u16, 4 as u16);
20748 self.as_vec_mut().extend(value.to_ne_bytes());
20749 self
20750 }
20751 pub fn push_fdb_max_learned(mut self, value: u32) -> Self {
20752 push_header(self.as_vec_mut(), 49u16, 4 as u16);
20753 self.as_vec_mut().extend(value.to_ne_bytes());
20754 self
20755 }
20756 #[doc = "Associated type: [`BrStpMode`] (enum)"]
20757 pub fn push_stp_mode(mut self, value: u32) -> Self {
20758 push_header(self.as_vec_mut(), 50u16, 4 as u16);
20759 self.as_vec_mut().extend(value.to_ne_bytes());
20760 self
20761 }
20762}
20763impl<Prev: Pusher> Drop for PushLinkinfoBridgeAttrs<Prev> {
20764 fn drop(&mut self) {
20765 if let Some(prev) = &mut self.prev {
20766 if let Some(header_offset) = &self.header_offset {
20767 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20768 }
20769 }
20770 }
20771}
20772pub struct PushLinkinfoBrportAttrs<Prev: Pusher> {
20773 pub(crate) prev: Option<Prev>,
20774 pub(crate) header_offset: Option<usize>,
20775}
20776impl<Prev: Pusher> Pusher for PushLinkinfoBrportAttrs<Prev> {
20777 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
20778 self.prev.as_mut().unwrap().as_vec_mut()
20779 }
20780 fn as_vec(&self) -> &Vec<u8> {
20781 self.prev.as_ref().unwrap().as_vec()
20782 }
20783}
20784impl<Prev: Pusher> PushLinkinfoBrportAttrs<Prev> {
20785 pub fn new(prev: Prev) -> Self {
20786 Self {
20787 prev: Some(prev),
20788 header_offset: None,
20789 }
20790 }
20791 pub fn end_nested(mut self) -> Prev {
20792 let mut prev = self.prev.take().unwrap();
20793 if let Some(header_offset) = &self.header_offset {
20794 finalize_nested_header(prev.as_vec_mut(), *header_offset);
20795 }
20796 prev
20797 }
20798 pub fn push_state(mut self, value: u8) -> Self {
20799 push_header(self.as_vec_mut(), 1u16, 1 as u16);
20800 self.as_vec_mut().extend(value.to_ne_bytes());
20801 self
20802 }
20803 pub fn push_priority(mut self, value: u16) -> Self {
20804 push_header(self.as_vec_mut(), 2u16, 2 as u16);
20805 self.as_vec_mut().extend(value.to_ne_bytes());
20806 self
20807 }
20808 pub fn push_cost(mut self, value: u32) -> Self {
20809 push_header(self.as_vec_mut(), 3u16, 4 as u16);
20810 self.as_vec_mut().extend(value.to_ne_bytes());
20811 self
20812 }
20813 pub fn push_mode(mut self, value: ()) -> Self {
20814 push_header(self.as_vec_mut(), 4u16, 0 as u16);
20815 self
20816 }
20817 pub fn push_guard(mut self, value: ()) -> Self {
20818 push_header(self.as_vec_mut(), 5u16, 0 as u16);
20819 self
20820 }
20821 pub fn push_protect(mut self, value: ()) -> Self {
20822 push_header(self.as_vec_mut(), 6u16, 0 as u16);
20823 self
20824 }
20825 pub fn push_fast_leave(mut self, value: ()) -> Self {
20826 push_header(self.as_vec_mut(), 7u16, 0 as u16);
20827 self
20828 }
20829 pub fn push_learning(mut self, value: ()) -> Self {
20830 push_header(self.as_vec_mut(), 8u16, 0 as u16);
20831 self
20832 }
20833 pub fn push_unicast_flood(mut self, value: ()) -> Self {
20834 push_header(self.as_vec_mut(), 9u16, 0 as u16);
20835 self
20836 }
20837 pub fn push_proxyarp(mut self, value: ()) -> Self {
20838 push_header(self.as_vec_mut(), 10u16, 0 as u16);
20839 self
20840 }
20841 pub fn push_learning_sync(mut self, value: ()) -> Self {
20842 push_header(self.as_vec_mut(), 11u16, 0 as u16);
20843 self
20844 }
20845 pub fn push_proxyarp_wifi(mut self, value: ()) -> Self {
20846 push_header(self.as_vec_mut(), 12u16, 0 as u16);
20847 self
20848 }
20849 pub fn push_root_id(mut self, value: IflaBridgeId) -> Self {
20850 push_header(self.as_vec_mut(), 13u16, value.as_slice().len() as u16);
20851 self.as_vec_mut().extend(value.as_slice());
20852 self
20853 }
20854 pub fn push_bridge_id(mut self, value: IflaBridgeId) -> Self {
20855 push_header(self.as_vec_mut(), 14u16, value.as_slice().len() as u16);
20856 self.as_vec_mut().extend(value.as_slice());
20857 self
20858 }
20859 pub fn push_designated_port(mut self, value: u16) -> Self {
20860 push_header(self.as_vec_mut(), 15u16, 2 as u16);
20861 self.as_vec_mut().extend(value.to_ne_bytes());
20862 self
20863 }
20864 pub fn push_designated_cost(mut self, value: u16) -> Self {
20865 push_header(self.as_vec_mut(), 16u16, 2 as u16);
20866 self.as_vec_mut().extend(value.to_ne_bytes());
20867 self
20868 }
20869 pub fn push_id(mut self, value: u16) -> Self {
20870 push_header(self.as_vec_mut(), 17u16, 2 as u16);
20871 self.as_vec_mut().extend(value.to_ne_bytes());
20872 self
20873 }
20874 pub fn push_no(mut self, value: u16) -> Self {
20875 push_header(self.as_vec_mut(), 18u16, 2 as u16);
20876 self.as_vec_mut().extend(value.to_ne_bytes());
20877 self
20878 }
20879 pub fn push_topology_change_ack(mut self, value: u8) -> Self {
20880 push_header(self.as_vec_mut(), 19u16, 1 as u16);
20881 self.as_vec_mut().extend(value.to_ne_bytes());
20882 self
20883 }
20884 pub fn push_config_pending(mut self, value: u8) -> Self {
20885 push_header(self.as_vec_mut(), 20u16, 1 as u16);
20886 self.as_vec_mut().extend(value.to_ne_bytes());
20887 self
20888 }
20889 pub fn push_message_age_timer(mut self, value: u64) -> Self {
20890 push_header(self.as_vec_mut(), 21u16, 8 as u16);
20891 self.as_vec_mut().extend(value.to_ne_bytes());
20892 self
20893 }
20894 pub fn push_forward_delay_timer(mut self, value: u64) -> Self {
20895 push_header(self.as_vec_mut(), 22u16, 8 as u16);
20896 self.as_vec_mut().extend(value.to_ne_bytes());
20897 self
20898 }
20899 pub fn push_hold_timer(mut self, value: u64) -> Self {
20900 push_header(self.as_vec_mut(), 23u16, 8 as u16);
20901 self.as_vec_mut().extend(value.to_ne_bytes());
20902 self
20903 }
20904 pub fn push_flush(mut self, value: ()) -> Self {
20905 push_header(self.as_vec_mut(), 24u16, 0 as u16);
20906 self
20907 }
20908 pub fn push_multicast_router(mut self, value: u8) -> Self {
20909 push_header(self.as_vec_mut(), 25u16, 1 as u16);
20910 self.as_vec_mut().extend(value.to_ne_bytes());
20911 self
20912 }
20913 pub fn push_pad(mut self, value: &[u8]) -> Self {
20914 push_header(self.as_vec_mut(), 26u16, value.len() as u16);
20915 self.as_vec_mut().extend(value);
20916 self
20917 }
20918 pub fn push_mcast_flood(mut self, value: ()) -> Self {
20919 push_header(self.as_vec_mut(), 27u16, 0 as u16);
20920 self
20921 }
20922 pub fn push_mcast_to_ucast(mut self, value: ()) -> Self {
20923 push_header(self.as_vec_mut(), 28u16, 0 as u16);
20924 self
20925 }
20926 pub fn push_vlan_tunnel(mut self, value: ()) -> Self {
20927 push_header(self.as_vec_mut(), 29u16, 0 as u16);
20928 self
20929 }
20930 pub fn push_bcast_flood(mut self, value: ()) -> Self {
20931 push_header(self.as_vec_mut(), 30u16, 0 as u16);
20932 self
20933 }
20934 pub fn push_group_fwd_mask(mut self, value: u16) -> Self {
20935 push_header(self.as_vec_mut(), 31u16, 2 as u16);
20936 self.as_vec_mut().extend(value.to_ne_bytes());
20937 self
20938 }
20939 pub fn push_neigh_suppress(mut self, value: ()) -> Self {
20940 push_header(self.as_vec_mut(), 32u16, 0 as u16);
20941 self
20942 }
20943 pub fn push_isolated(mut self, value: ()) -> Self {
20944 push_header(self.as_vec_mut(), 33u16, 0 as u16);
20945 self
20946 }
20947 pub fn push_backup_port(mut self, value: u32) -> Self {
20948 push_header(self.as_vec_mut(), 34u16, 4 as u16);
20949 self.as_vec_mut().extend(value.to_ne_bytes());
20950 self
20951 }
20952 pub fn push_mrp_ring_open(mut self, value: ()) -> Self {
20953 push_header(self.as_vec_mut(), 35u16, 0 as u16);
20954 self
20955 }
20956 pub fn push_mrp_in_open(mut self, value: ()) -> Self {
20957 push_header(self.as_vec_mut(), 36u16, 0 as u16);
20958 self
20959 }
20960 pub fn push_mcast_eht_hosts_limit(mut self, value: u32) -> Self {
20961 push_header(self.as_vec_mut(), 37u16, 4 as u16);
20962 self.as_vec_mut().extend(value.to_ne_bytes());
20963 self
20964 }
20965 pub fn push_mcast_eht_hosts_cnt(mut self, value: u32) -> Self {
20966 push_header(self.as_vec_mut(), 38u16, 4 as u16);
20967 self.as_vec_mut().extend(value.to_ne_bytes());
20968 self
20969 }
20970 pub fn push_locked(mut self, value: ()) -> Self {
20971 push_header(self.as_vec_mut(), 39u16, 0 as u16);
20972 self
20973 }
20974 pub fn push_mab(mut self, value: ()) -> Self {
20975 push_header(self.as_vec_mut(), 40u16, 0 as u16);
20976 self
20977 }
20978 pub fn push_mcast_n_groups(mut self, value: u32) -> Self {
20979 push_header(self.as_vec_mut(), 41u16, 4 as u16);
20980 self.as_vec_mut().extend(value.to_ne_bytes());
20981 self
20982 }
20983 pub fn push_mcast_max_groups(mut self, value: u32) -> Self {
20984 push_header(self.as_vec_mut(), 42u16, 4 as u16);
20985 self.as_vec_mut().extend(value.to_ne_bytes());
20986 self
20987 }
20988 pub fn push_neigh_vlan_suppress(mut self, value: ()) -> Self {
20989 push_header(self.as_vec_mut(), 43u16, 0 as u16);
20990 self
20991 }
20992 pub fn push_backup_nhid(mut self, value: u32) -> Self {
20993 push_header(self.as_vec_mut(), 44u16, 4 as u16);
20994 self.as_vec_mut().extend(value.to_ne_bytes());
20995 self
20996 }
20997 pub fn push_neigh_forward_grat(mut self, value: u8) -> Self {
20998 push_header(self.as_vec_mut(), 45u16, 1 as u16);
20999 self.as_vec_mut().extend(value.to_ne_bytes());
21000 self
21001 }
21002}
21003impl<Prev: Pusher> Drop for PushLinkinfoBrportAttrs<Prev> {
21004 fn drop(&mut self) {
21005 if let Some(prev) = &mut self.prev {
21006 if let Some(header_offset) = &self.header_offset {
21007 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21008 }
21009 }
21010 }
21011}
21012pub struct PushLinkinfoGreAttrs<Prev: Pusher> {
21013 pub(crate) prev: Option<Prev>,
21014 pub(crate) header_offset: Option<usize>,
21015}
21016impl<Prev: Pusher> Pusher for PushLinkinfoGreAttrs<Prev> {
21017 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21018 self.prev.as_mut().unwrap().as_vec_mut()
21019 }
21020 fn as_vec(&self) -> &Vec<u8> {
21021 self.prev.as_ref().unwrap().as_vec()
21022 }
21023}
21024impl<Prev: Pusher> PushLinkinfoGreAttrs<Prev> {
21025 pub fn new(prev: Prev) -> Self {
21026 Self {
21027 prev: Some(prev),
21028 header_offset: None,
21029 }
21030 }
21031 pub fn end_nested(mut self) -> Prev {
21032 let mut prev = self.prev.take().unwrap();
21033 if let Some(header_offset) = &self.header_offset {
21034 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21035 }
21036 prev
21037 }
21038 pub fn push_link(mut self, value: u32) -> Self {
21039 push_header(self.as_vec_mut(), 1u16, 4 as u16);
21040 self.as_vec_mut().extend(value.to_ne_bytes());
21041 self
21042 }
21043 pub fn push_iflags(mut self, value: u16) -> Self {
21044 push_header(self.as_vec_mut(), 2u16, 2 as u16);
21045 self.as_vec_mut().extend(value.to_be_bytes());
21046 self
21047 }
21048 pub fn push_oflags(mut self, value: u16) -> Self {
21049 push_header(self.as_vec_mut(), 3u16, 2 as u16);
21050 self.as_vec_mut().extend(value.to_be_bytes());
21051 self
21052 }
21053 pub fn push_ikey(mut self, value: u32) -> Self {
21054 push_header(self.as_vec_mut(), 4u16, 4 as u16);
21055 self.as_vec_mut().extend(value.to_be_bytes());
21056 self
21057 }
21058 pub fn push_okey(mut self, value: u32) -> Self {
21059 push_header(self.as_vec_mut(), 5u16, 4 as u16);
21060 self.as_vec_mut().extend(value.to_be_bytes());
21061 self
21062 }
21063 pub fn push_local(mut self, value: std::net::IpAddr) -> Self {
21064 push_header(self.as_vec_mut(), 6u16, {
21065 match &value {
21066 IpAddr::V4(_) => 4,
21067 IpAddr::V6(_) => 16,
21068 }
21069 } as u16);
21070 encode_ip(self.as_vec_mut(), value);
21071 self
21072 }
21073 pub fn push_remote(mut self, value: std::net::IpAddr) -> Self {
21074 push_header(self.as_vec_mut(), 7u16, {
21075 match &value {
21076 IpAddr::V4(_) => 4,
21077 IpAddr::V6(_) => 16,
21078 }
21079 } as u16);
21080 encode_ip(self.as_vec_mut(), value);
21081 self
21082 }
21083 pub fn push_ttl(mut self, value: u8) -> Self {
21084 push_header(self.as_vec_mut(), 8u16, 1 as u16);
21085 self.as_vec_mut().extend(value.to_ne_bytes());
21086 self
21087 }
21088 pub fn push_tos(mut self, value: u8) -> Self {
21089 push_header(self.as_vec_mut(), 9u16, 1 as u16);
21090 self.as_vec_mut().extend(value.to_ne_bytes());
21091 self
21092 }
21093 pub fn push_pmtudisc(mut self, value: u8) -> Self {
21094 push_header(self.as_vec_mut(), 10u16, 1 as u16);
21095 self.as_vec_mut().extend(value.to_ne_bytes());
21096 self
21097 }
21098 pub fn push_encap_limit(mut self, value: u8) -> Self {
21099 push_header(self.as_vec_mut(), 11u16, 1 as u16);
21100 self.as_vec_mut().extend(value.to_ne_bytes());
21101 self
21102 }
21103 pub fn push_flowinfo(mut self, value: u32) -> Self {
21104 push_header(self.as_vec_mut(), 12u16, 4 as u16);
21105 self.as_vec_mut().extend(value.to_be_bytes());
21106 self
21107 }
21108 pub fn push_flags(mut self, value: u32) -> Self {
21109 push_header(self.as_vec_mut(), 13u16, 4 as u16);
21110 self.as_vec_mut().extend(value.to_ne_bytes());
21111 self
21112 }
21113 pub fn push_encap_type(mut self, value: u16) -> Self {
21114 push_header(self.as_vec_mut(), 14u16, 2 as u16);
21115 self.as_vec_mut().extend(value.to_ne_bytes());
21116 self
21117 }
21118 pub fn push_encap_flags(mut self, value: u16) -> Self {
21119 push_header(self.as_vec_mut(), 15u16, 2 as u16);
21120 self.as_vec_mut().extend(value.to_ne_bytes());
21121 self
21122 }
21123 pub fn push_encap_sport(mut self, value: u16) -> Self {
21124 push_header(self.as_vec_mut(), 16u16, 2 as u16);
21125 self.as_vec_mut().extend(value.to_be_bytes());
21126 self
21127 }
21128 pub fn push_encap_dport(mut self, value: u16) -> Self {
21129 push_header(self.as_vec_mut(), 17u16, 2 as u16);
21130 self.as_vec_mut().extend(value.to_be_bytes());
21131 self
21132 }
21133 pub fn push_collect_metadata(mut self, value: ()) -> Self {
21134 push_header(self.as_vec_mut(), 18u16, 0 as u16);
21135 self
21136 }
21137 pub fn push_ignore_df(mut self, value: u8) -> Self {
21138 push_header(self.as_vec_mut(), 19u16, 1 as u16);
21139 self.as_vec_mut().extend(value.to_ne_bytes());
21140 self
21141 }
21142 pub fn push_fwmark(mut self, value: u32) -> Self {
21143 push_header(self.as_vec_mut(), 20u16, 4 as u16);
21144 self.as_vec_mut().extend(value.to_ne_bytes());
21145 self
21146 }
21147 pub fn push_erspan_index(mut self, value: u32) -> Self {
21148 push_header(self.as_vec_mut(), 21u16, 4 as u16);
21149 self.as_vec_mut().extend(value.to_ne_bytes());
21150 self
21151 }
21152 pub fn push_erspan_ver(mut self, value: u8) -> Self {
21153 push_header(self.as_vec_mut(), 22u16, 1 as u16);
21154 self.as_vec_mut().extend(value.to_ne_bytes());
21155 self
21156 }
21157 pub fn push_erspan_dir(mut self, value: u8) -> Self {
21158 push_header(self.as_vec_mut(), 23u16, 1 as u16);
21159 self.as_vec_mut().extend(value.to_ne_bytes());
21160 self
21161 }
21162 pub fn push_erspan_hwid(mut self, value: u16) -> Self {
21163 push_header(self.as_vec_mut(), 24u16, 2 as u16);
21164 self.as_vec_mut().extend(value.to_ne_bytes());
21165 self
21166 }
21167}
21168impl<Prev: Pusher> Drop for PushLinkinfoGreAttrs<Prev> {
21169 fn drop(&mut self) {
21170 if let Some(prev) = &mut self.prev {
21171 if let Some(header_offset) = &self.header_offset {
21172 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21173 }
21174 }
21175 }
21176}
21177pub struct PushLinkinfoGre6Attrs<Prev: Pusher> {
21178 pub(crate) prev: Option<Prev>,
21179 pub(crate) header_offset: Option<usize>,
21180}
21181impl<Prev: Pusher> Pusher for PushLinkinfoGre6Attrs<Prev> {
21182 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21183 self.prev.as_mut().unwrap().as_vec_mut()
21184 }
21185 fn as_vec(&self) -> &Vec<u8> {
21186 self.prev.as_ref().unwrap().as_vec()
21187 }
21188}
21189impl<Prev: Pusher> PushLinkinfoGre6Attrs<Prev> {
21190 pub fn new(prev: Prev) -> Self {
21191 Self {
21192 prev: Some(prev),
21193 header_offset: None,
21194 }
21195 }
21196 pub fn end_nested(mut self) -> Prev {
21197 let mut prev = self.prev.take().unwrap();
21198 if let Some(header_offset) = &self.header_offset {
21199 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21200 }
21201 prev
21202 }
21203 pub fn push_link(mut self, value: u32) -> Self {
21204 push_header(self.as_vec_mut(), 1u16, 4 as u16);
21205 self.as_vec_mut().extend(value.to_ne_bytes());
21206 self
21207 }
21208 pub fn push_iflags(mut self, value: u16) -> Self {
21209 push_header(self.as_vec_mut(), 2u16, 2 as u16);
21210 self.as_vec_mut().extend(value.to_be_bytes());
21211 self
21212 }
21213 pub fn push_oflags(mut self, value: u16) -> Self {
21214 push_header(self.as_vec_mut(), 3u16, 2 as u16);
21215 self.as_vec_mut().extend(value.to_be_bytes());
21216 self
21217 }
21218 pub fn push_ikey(mut self, value: u32) -> Self {
21219 push_header(self.as_vec_mut(), 4u16, 4 as u16);
21220 self.as_vec_mut().extend(value.to_be_bytes());
21221 self
21222 }
21223 pub fn push_okey(mut self, value: u32) -> Self {
21224 push_header(self.as_vec_mut(), 5u16, 4 as u16);
21225 self.as_vec_mut().extend(value.to_be_bytes());
21226 self
21227 }
21228 pub fn push_local(mut self, value: &[u8]) -> Self {
21229 push_header(self.as_vec_mut(), 6u16, value.len() as u16);
21230 self.as_vec_mut().extend(value);
21231 self
21232 }
21233 pub fn push_remote(mut self, value: &[u8]) -> Self {
21234 push_header(self.as_vec_mut(), 7u16, value.len() as u16);
21235 self.as_vec_mut().extend(value);
21236 self
21237 }
21238 pub fn push_ttl(mut self, value: u8) -> Self {
21239 push_header(self.as_vec_mut(), 8u16, 1 as u16);
21240 self.as_vec_mut().extend(value.to_ne_bytes());
21241 self
21242 }
21243 pub fn push_encap_limit(mut self, value: u8) -> Self {
21244 push_header(self.as_vec_mut(), 11u16, 1 as u16);
21245 self.as_vec_mut().extend(value.to_ne_bytes());
21246 self
21247 }
21248 pub fn push_flowinfo(mut self, value: u32) -> Self {
21249 push_header(self.as_vec_mut(), 12u16, 4 as u16);
21250 self.as_vec_mut().extend(value.to_be_bytes());
21251 self
21252 }
21253 pub fn push_flags(mut self, value: u32) -> Self {
21254 push_header(self.as_vec_mut(), 13u16, 4 as u16);
21255 self.as_vec_mut().extend(value.to_ne_bytes());
21256 self
21257 }
21258 pub fn push_encap_type(mut self, value: u16) -> Self {
21259 push_header(self.as_vec_mut(), 14u16, 2 as u16);
21260 self.as_vec_mut().extend(value.to_ne_bytes());
21261 self
21262 }
21263 pub fn push_encap_flags(mut self, value: u16) -> Self {
21264 push_header(self.as_vec_mut(), 15u16, 2 as u16);
21265 self.as_vec_mut().extend(value.to_ne_bytes());
21266 self
21267 }
21268 pub fn push_encap_sport(mut self, value: u16) -> Self {
21269 push_header(self.as_vec_mut(), 16u16, 2 as u16);
21270 self.as_vec_mut().extend(value.to_be_bytes());
21271 self
21272 }
21273 pub fn push_encap_dport(mut self, value: u16) -> Self {
21274 push_header(self.as_vec_mut(), 17u16, 2 as u16);
21275 self.as_vec_mut().extend(value.to_be_bytes());
21276 self
21277 }
21278 pub fn push_collect_metadata(mut self, value: ()) -> Self {
21279 push_header(self.as_vec_mut(), 18u16, 0 as u16);
21280 self
21281 }
21282 pub fn push_fwmark(mut self, value: u32) -> Self {
21283 push_header(self.as_vec_mut(), 20u16, 4 as u16);
21284 self.as_vec_mut().extend(value.to_ne_bytes());
21285 self
21286 }
21287 pub fn push_erspan_index(mut self, value: u32) -> Self {
21288 push_header(self.as_vec_mut(), 21u16, 4 as u16);
21289 self.as_vec_mut().extend(value.to_ne_bytes());
21290 self
21291 }
21292 pub fn push_erspan_ver(mut self, value: u8) -> Self {
21293 push_header(self.as_vec_mut(), 22u16, 1 as u16);
21294 self.as_vec_mut().extend(value.to_ne_bytes());
21295 self
21296 }
21297 pub fn push_erspan_dir(mut self, value: u8) -> Self {
21298 push_header(self.as_vec_mut(), 23u16, 1 as u16);
21299 self.as_vec_mut().extend(value.to_ne_bytes());
21300 self
21301 }
21302 pub fn push_erspan_hwid(mut self, value: u16) -> Self {
21303 push_header(self.as_vec_mut(), 24u16, 2 as u16);
21304 self.as_vec_mut().extend(value.to_ne_bytes());
21305 self
21306 }
21307}
21308impl<Prev: Pusher> Drop for PushLinkinfoGre6Attrs<Prev> {
21309 fn drop(&mut self) {
21310 if let Some(prev) = &mut self.prev {
21311 if let Some(header_offset) = &self.header_offset {
21312 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21313 }
21314 }
21315 }
21316}
21317pub struct PushLinkinfoVtiAttrs<Prev: Pusher> {
21318 pub(crate) prev: Option<Prev>,
21319 pub(crate) header_offset: Option<usize>,
21320}
21321impl<Prev: Pusher> Pusher for PushLinkinfoVtiAttrs<Prev> {
21322 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21323 self.prev.as_mut().unwrap().as_vec_mut()
21324 }
21325 fn as_vec(&self) -> &Vec<u8> {
21326 self.prev.as_ref().unwrap().as_vec()
21327 }
21328}
21329impl<Prev: Pusher> PushLinkinfoVtiAttrs<Prev> {
21330 pub fn new(prev: Prev) -> Self {
21331 Self {
21332 prev: Some(prev),
21333 header_offset: None,
21334 }
21335 }
21336 pub fn end_nested(mut self) -> Prev {
21337 let mut prev = self.prev.take().unwrap();
21338 if let Some(header_offset) = &self.header_offset {
21339 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21340 }
21341 prev
21342 }
21343 pub fn push_link(mut self, value: u32) -> Self {
21344 push_header(self.as_vec_mut(), 1u16, 4 as u16);
21345 self.as_vec_mut().extend(value.to_ne_bytes());
21346 self
21347 }
21348 pub fn push_ikey(mut self, value: u32) -> Self {
21349 push_header(self.as_vec_mut(), 2u16, 4 as u16);
21350 self.as_vec_mut().extend(value.to_be_bytes());
21351 self
21352 }
21353 pub fn push_okey(mut self, value: u32) -> Self {
21354 push_header(self.as_vec_mut(), 3u16, 4 as u16);
21355 self.as_vec_mut().extend(value.to_be_bytes());
21356 self
21357 }
21358 pub fn push_local(mut self, value: std::net::IpAddr) -> Self {
21359 push_header(self.as_vec_mut(), 4u16, {
21360 match &value {
21361 IpAddr::V4(_) => 4,
21362 IpAddr::V6(_) => 16,
21363 }
21364 } as u16);
21365 encode_ip(self.as_vec_mut(), value);
21366 self
21367 }
21368 pub fn push_remote(mut self, value: std::net::IpAddr) -> Self {
21369 push_header(self.as_vec_mut(), 5u16, {
21370 match &value {
21371 IpAddr::V4(_) => 4,
21372 IpAddr::V6(_) => 16,
21373 }
21374 } as u16);
21375 encode_ip(self.as_vec_mut(), value);
21376 self
21377 }
21378 pub fn push_fwmark(mut self, value: u32) -> Self {
21379 push_header(self.as_vec_mut(), 6u16, 4 as u16);
21380 self.as_vec_mut().extend(value.to_ne_bytes());
21381 self
21382 }
21383}
21384impl<Prev: Pusher> Drop for PushLinkinfoVtiAttrs<Prev> {
21385 fn drop(&mut self) {
21386 if let Some(prev) = &mut self.prev {
21387 if let Some(header_offset) = &self.header_offset {
21388 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21389 }
21390 }
21391 }
21392}
21393pub struct PushLinkinfoVti6Attrs<Prev: Pusher> {
21394 pub(crate) prev: Option<Prev>,
21395 pub(crate) header_offset: Option<usize>,
21396}
21397impl<Prev: Pusher> Pusher for PushLinkinfoVti6Attrs<Prev> {
21398 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21399 self.prev.as_mut().unwrap().as_vec_mut()
21400 }
21401 fn as_vec(&self) -> &Vec<u8> {
21402 self.prev.as_ref().unwrap().as_vec()
21403 }
21404}
21405impl<Prev: Pusher> PushLinkinfoVti6Attrs<Prev> {
21406 pub fn new(prev: Prev) -> Self {
21407 Self {
21408 prev: Some(prev),
21409 header_offset: None,
21410 }
21411 }
21412 pub fn end_nested(mut self) -> Prev {
21413 let mut prev = self.prev.take().unwrap();
21414 if let Some(header_offset) = &self.header_offset {
21415 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21416 }
21417 prev
21418 }
21419 pub fn push_link(mut self, value: u32) -> Self {
21420 push_header(self.as_vec_mut(), 1u16, 4 as u16);
21421 self.as_vec_mut().extend(value.to_ne_bytes());
21422 self
21423 }
21424 pub fn push_ikey(mut self, value: u32) -> Self {
21425 push_header(self.as_vec_mut(), 2u16, 4 as u16);
21426 self.as_vec_mut().extend(value.to_be_bytes());
21427 self
21428 }
21429 pub fn push_okey(mut self, value: u32) -> Self {
21430 push_header(self.as_vec_mut(), 3u16, 4 as u16);
21431 self.as_vec_mut().extend(value.to_be_bytes());
21432 self
21433 }
21434 pub fn push_local(mut self, value: &[u8]) -> Self {
21435 push_header(self.as_vec_mut(), 4u16, value.len() as u16);
21436 self.as_vec_mut().extend(value);
21437 self
21438 }
21439 pub fn push_remote(mut self, value: &[u8]) -> Self {
21440 push_header(self.as_vec_mut(), 5u16, value.len() as u16);
21441 self.as_vec_mut().extend(value);
21442 self
21443 }
21444 pub fn push_fwmark(mut self, value: u32) -> Self {
21445 push_header(self.as_vec_mut(), 6u16, 4 as u16);
21446 self.as_vec_mut().extend(value.to_ne_bytes());
21447 self
21448 }
21449}
21450impl<Prev: Pusher> Drop for PushLinkinfoVti6Attrs<Prev> {
21451 fn drop(&mut self) {
21452 if let Some(prev) = &mut self.prev {
21453 if let Some(header_offset) = &self.header_offset {
21454 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21455 }
21456 }
21457 }
21458}
21459pub struct PushLinkinfoGeneveAttrs<Prev: Pusher> {
21460 pub(crate) prev: Option<Prev>,
21461 pub(crate) header_offset: Option<usize>,
21462}
21463impl<Prev: Pusher> Pusher for PushLinkinfoGeneveAttrs<Prev> {
21464 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21465 self.prev.as_mut().unwrap().as_vec_mut()
21466 }
21467 fn as_vec(&self) -> &Vec<u8> {
21468 self.prev.as_ref().unwrap().as_vec()
21469 }
21470}
21471impl<Prev: Pusher> PushLinkinfoGeneveAttrs<Prev> {
21472 pub fn new(prev: Prev) -> Self {
21473 Self {
21474 prev: Some(prev),
21475 header_offset: None,
21476 }
21477 }
21478 pub fn end_nested(mut self) -> Prev {
21479 let mut prev = self.prev.take().unwrap();
21480 if let Some(header_offset) = &self.header_offset {
21481 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21482 }
21483 prev
21484 }
21485 pub fn push_id(mut self, value: u32) -> Self {
21486 push_header(self.as_vec_mut(), 1u16, 4 as u16);
21487 self.as_vec_mut().extend(value.to_ne_bytes());
21488 self
21489 }
21490 pub fn push_remote(mut self, value: std::net::Ipv4Addr) -> Self {
21491 push_header(self.as_vec_mut(), 2u16, 4 as u16);
21492 self.as_vec_mut().extend(&value.to_bits().to_be_bytes());
21493 self
21494 }
21495 pub fn push_ttl(mut self, value: u8) -> Self {
21496 push_header(self.as_vec_mut(), 3u16, 1 as u16);
21497 self.as_vec_mut().extend(value.to_ne_bytes());
21498 self
21499 }
21500 pub fn push_tos(mut self, value: u8) -> Self {
21501 push_header(self.as_vec_mut(), 4u16, 1 as u16);
21502 self.as_vec_mut().extend(value.to_ne_bytes());
21503 self
21504 }
21505 pub fn push_port(mut self, value: u16) -> Self {
21506 push_header(self.as_vec_mut(), 5u16, 2 as u16);
21507 self.as_vec_mut().extend(value.to_be_bytes());
21508 self
21509 }
21510 pub fn push_collect_metadata(mut self, value: ()) -> Self {
21511 push_header(self.as_vec_mut(), 6u16, 0 as u16);
21512 self
21513 }
21514 pub fn push_remote6(mut self, value: &[u8]) -> Self {
21515 push_header(self.as_vec_mut(), 7u16, value.len() as u16);
21516 self.as_vec_mut().extend(value);
21517 self
21518 }
21519 pub fn push_udp_csum(mut self, value: u8) -> Self {
21520 push_header(self.as_vec_mut(), 8u16, 1 as u16);
21521 self.as_vec_mut().extend(value.to_ne_bytes());
21522 self
21523 }
21524 pub fn push_udp_zero_csum6_tx(mut self, value: u8) -> Self {
21525 push_header(self.as_vec_mut(), 9u16, 1 as u16);
21526 self.as_vec_mut().extend(value.to_ne_bytes());
21527 self
21528 }
21529 pub fn push_udp_zero_csum6_rx(mut self, value: u8) -> Self {
21530 push_header(self.as_vec_mut(), 10u16, 1 as u16);
21531 self.as_vec_mut().extend(value.to_ne_bytes());
21532 self
21533 }
21534 pub fn push_label(mut self, value: u32) -> Self {
21535 push_header(self.as_vec_mut(), 11u16, 4 as u16);
21536 self.as_vec_mut().extend(value.to_be_bytes());
21537 self
21538 }
21539 pub fn push_ttl_inherit(mut self, value: u8) -> Self {
21540 push_header(self.as_vec_mut(), 12u16, 1 as u16);
21541 self.as_vec_mut().extend(value.to_ne_bytes());
21542 self
21543 }
21544 pub fn push_df(mut self, value: u8) -> Self {
21545 push_header(self.as_vec_mut(), 13u16, 1 as u16);
21546 self.as_vec_mut().extend(value.to_ne_bytes());
21547 self
21548 }
21549 pub fn push_inner_proto_inherit(mut self, value: ()) -> Self {
21550 push_header(self.as_vec_mut(), 14u16, 0 as u16);
21551 self
21552 }
21553 pub fn push_port_range(mut self, value: IflaGenevePortRange) -> Self {
21554 push_header(self.as_vec_mut(), 15u16, value.as_slice().len() as u16);
21555 self.as_vec_mut().extend(value.as_slice());
21556 self
21557 }
21558 pub fn push_gro_hint(mut self, value: ()) -> Self {
21559 push_header(self.as_vec_mut(), 16u16, 0 as u16);
21560 self
21561 }
21562 pub fn push_local(mut self, value: std::net::Ipv4Addr) -> Self {
21563 push_header(self.as_vec_mut(), 17u16, 4 as u16);
21564 self.as_vec_mut().extend(&value.to_bits().to_be_bytes());
21565 self
21566 }
21567 pub fn push_local6(mut self, value: &[u8]) -> Self {
21568 push_header(self.as_vec_mut(), 18u16, value.len() as u16);
21569 self.as_vec_mut().extend(value);
21570 self
21571 }
21572}
21573impl<Prev: Pusher> Drop for PushLinkinfoGeneveAttrs<Prev> {
21574 fn drop(&mut self) {
21575 if let Some(prev) = &mut self.prev {
21576 if let Some(header_offset) = &self.header_offset {
21577 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21578 }
21579 }
21580 }
21581}
21582pub struct PushLinkinfoHsrAttrs<Prev: Pusher> {
21583 pub(crate) prev: Option<Prev>,
21584 pub(crate) header_offset: Option<usize>,
21585}
21586impl<Prev: Pusher> Pusher for PushLinkinfoHsrAttrs<Prev> {
21587 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21588 self.prev.as_mut().unwrap().as_vec_mut()
21589 }
21590 fn as_vec(&self) -> &Vec<u8> {
21591 self.prev.as_ref().unwrap().as_vec()
21592 }
21593}
21594impl<Prev: Pusher> PushLinkinfoHsrAttrs<Prev> {
21595 pub fn new(prev: Prev) -> Self {
21596 Self {
21597 prev: Some(prev),
21598 header_offset: None,
21599 }
21600 }
21601 pub fn end_nested(mut self) -> Prev {
21602 let mut prev = self.prev.take().unwrap();
21603 if let Some(header_offset) = &self.header_offset {
21604 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21605 }
21606 prev
21607 }
21608 pub fn push_slave1(mut self, value: u32) -> Self {
21609 push_header(self.as_vec_mut(), 1u16, 4 as u16);
21610 self.as_vec_mut().extend(value.to_ne_bytes());
21611 self
21612 }
21613 pub fn push_slave2(mut self, value: u32) -> Self {
21614 push_header(self.as_vec_mut(), 2u16, 4 as u16);
21615 self.as_vec_mut().extend(value.to_ne_bytes());
21616 self
21617 }
21618 pub fn push_multicast_spec(mut self, value: u8) -> Self {
21619 push_header(self.as_vec_mut(), 3u16, 1 as u16);
21620 self.as_vec_mut().extend(value.to_ne_bytes());
21621 self
21622 }
21623 pub fn push_supervision_addr(mut self, value: &[u8]) -> Self {
21624 push_header(self.as_vec_mut(), 4u16, value.len() as u16);
21625 self.as_vec_mut().extend(value);
21626 self
21627 }
21628 pub fn push_seq_nr(mut self, value: u16) -> Self {
21629 push_header(self.as_vec_mut(), 5u16, 2 as u16);
21630 self.as_vec_mut().extend(value.to_ne_bytes());
21631 self
21632 }
21633 pub fn push_version(mut self, value: u8) -> Self {
21634 push_header(self.as_vec_mut(), 6u16, 1 as u16);
21635 self.as_vec_mut().extend(value.to_ne_bytes());
21636 self
21637 }
21638 pub fn push_protocol(mut self, value: u8) -> Self {
21639 push_header(self.as_vec_mut(), 7u16, 1 as u16);
21640 self.as_vec_mut().extend(value.to_ne_bytes());
21641 self
21642 }
21643 pub fn push_interlink(mut self, value: u32) -> Self {
21644 push_header(self.as_vec_mut(), 8u16, 4 as u16);
21645 self.as_vec_mut().extend(value.to_ne_bytes());
21646 self
21647 }
21648}
21649impl<Prev: Pusher> Drop for PushLinkinfoHsrAttrs<Prev> {
21650 fn drop(&mut self) {
21651 if let Some(prev) = &mut self.prev {
21652 if let Some(header_offset) = &self.header_offset {
21653 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21654 }
21655 }
21656 }
21657}
21658pub struct PushLinkinfoIptunAttrs<Prev: Pusher> {
21659 pub(crate) prev: Option<Prev>,
21660 pub(crate) header_offset: Option<usize>,
21661}
21662impl<Prev: Pusher> Pusher for PushLinkinfoIptunAttrs<Prev> {
21663 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21664 self.prev.as_mut().unwrap().as_vec_mut()
21665 }
21666 fn as_vec(&self) -> &Vec<u8> {
21667 self.prev.as_ref().unwrap().as_vec()
21668 }
21669}
21670impl<Prev: Pusher> PushLinkinfoIptunAttrs<Prev> {
21671 pub fn new(prev: Prev) -> Self {
21672 Self {
21673 prev: Some(prev),
21674 header_offset: None,
21675 }
21676 }
21677 pub fn end_nested(mut self) -> Prev {
21678 let mut prev = self.prev.take().unwrap();
21679 if let Some(header_offset) = &self.header_offset {
21680 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21681 }
21682 prev
21683 }
21684 pub fn push_link(mut self, value: u32) -> Self {
21685 push_header(self.as_vec_mut(), 1u16, 4 as u16);
21686 self.as_vec_mut().extend(value.to_ne_bytes());
21687 self
21688 }
21689 pub fn push_local(mut self, value: std::net::IpAddr) -> Self {
21690 push_header(self.as_vec_mut(), 2u16, {
21691 match &value {
21692 IpAddr::V4(_) => 4,
21693 IpAddr::V6(_) => 16,
21694 }
21695 } as u16);
21696 encode_ip(self.as_vec_mut(), value);
21697 self
21698 }
21699 pub fn push_remote(mut self, value: std::net::IpAddr) -> Self {
21700 push_header(self.as_vec_mut(), 3u16, {
21701 match &value {
21702 IpAddr::V4(_) => 4,
21703 IpAddr::V6(_) => 16,
21704 }
21705 } as u16);
21706 encode_ip(self.as_vec_mut(), value);
21707 self
21708 }
21709 pub fn push_ttl(mut self, value: u8) -> Self {
21710 push_header(self.as_vec_mut(), 4u16, 1 as u16);
21711 self.as_vec_mut().extend(value.to_ne_bytes());
21712 self
21713 }
21714 pub fn push_tos(mut self, value: u8) -> Self {
21715 push_header(self.as_vec_mut(), 5u16, 1 as u16);
21716 self.as_vec_mut().extend(value.to_ne_bytes());
21717 self
21718 }
21719 pub fn push_encap_limit(mut self, value: u8) -> Self {
21720 push_header(self.as_vec_mut(), 6u16, 1 as u16);
21721 self.as_vec_mut().extend(value.to_ne_bytes());
21722 self
21723 }
21724 pub fn push_flowinfo(mut self, value: u32) -> Self {
21725 push_header(self.as_vec_mut(), 7u16, 4 as u16);
21726 self.as_vec_mut().extend(value.to_be_bytes());
21727 self
21728 }
21729 pub fn push_flags(mut self, value: u16) -> Self {
21730 push_header(self.as_vec_mut(), 8u16, 2 as u16);
21731 self.as_vec_mut().extend(value.to_be_bytes());
21732 self
21733 }
21734 pub fn push_proto(mut self, value: u8) -> Self {
21735 push_header(self.as_vec_mut(), 9u16, 1 as u16);
21736 self.as_vec_mut().extend(value.to_ne_bytes());
21737 self
21738 }
21739 pub fn push_pmtudisc(mut self, value: u8) -> Self {
21740 push_header(self.as_vec_mut(), 10u16, 1 as u16);
21741 self.as_vec_mut().extend(value.to_ne_bytes());
21742 self
21743 }
21744 pub fn push_6rd_prefix(mut self, value: &[u8]) -> Self {
21745 push_header(self.as_vec_mut(), 11u16, value.len() as u16);
21746 self.as_vec_mut().extend(value);
21747 self
21748 }
21749 pub fn push_6rd_relay_prefix(mut self, value: std::net::Ipv4Addr) -> Self {
21750 push_header(self.as_vec_mut(), 12u16, 4 as u16);
21751 self.as_vec_mut().extend(&value.to_bits().to_be_bytes());
21752 self
21753 }
21754 pub fn push_6rd_prefixlen(mut self, value: u16) -> Self {
21755 push_header(self.as_vec_mut(), 13u16, 2 as u16);
21756 self.as_vec_mut().extend(value.to_ne_bytes());
21757 self
21758 }
21759 pub fn push_6rd_relay_prefixlen(mut self, value: u16) -> Self {
21760 push_header(self.as_vec_mut(), 14u16, 2 as u16);
21761 self.as_vec_mut().extend(value.to_ne_bytes());
21762 self
21763 }
21764 pub fn push_encap_type(mut self, value: u16) -> Self {
21765 push_header(self.as_vec_mut(), 15u16, 2 as u16);
21766 self.as_vec_mut().extend(value.to_ne_bytes());
21767 self
21768 }
21769 pub fn push_encap_flags(mut self, value: u16) -> Self {
21770 push_header(self.as_vec_mut(), 16u16, 2 as u16);
21771 self.as_vec_mut().extend(value.to_ne_bytes());
21772 self
21773 }
21774 pub fn push_encap_sport(mut self, value: u16) -> Self {
21775 push_header(self.as_vec_mut(), 17u16, 2 as u16);
21776 self.as_vec_mut().extend(value.to_be_bytes());
21777 self
21778 }
21779 pub fn push_encap_dport(mut self, value: u16) -> Self {
21780 push_header(self.as_vec_mut(), 18u16, 2 as u16);
21781 self.as_vec_mut().extend(value.to_be_bytes());
21782 self
21783 }
21784 pub fn push_collect_metadata(mut self, value: ()) -> Self {
21785 push_header(self.as_vec_mut(), 19u16, 0 as u16);
21786 self
21787 }
21788 pub fn push_fwmark(mut self, value: u32) -> Self {
21789 push_header(self.as_vec_mut(), 20u16, 4 as u16);
21790 self.as_vec_mut().extend(value.to_ne_bytes());
21791 self
21792 }
21793}
21794impl<Prev: Pusher> Drop for PushLinkinfoIptunAttrs<Prev> {
21795 fn drop(&mut self) {
21796 if let Some(prev) = &mut self.prev {
21797 if let Some(header_offset) = &self.header_offset {
21798 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21799 }
21800 }
21801 }
21802}
21803pub struct PushLinkinfoIp6tnlAttrs<Prev: Pusher> {
21804 pub(crate) prev: Option<Prev>,
21805 pub(crate) header_offset: Option<usize>,
21806}
21807impl<Prev: Pusher> Pusher for PushLinkinfoIp6tnlAttrs<Prev> {
21808 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21809 self.prev.as_mut().unwrap().as_vec_mut()
21810 }
21811 fn as_vec(&self) -> &Vec<u8> {
21812 self.prev.as_ref().unwrap().as_vec()
21813 }
21814}
21815impl<Prev: Pusher> PushLinkinfoIp6tnlAttrs<Prev> {
21816 pub fn new(prev: Prev) -> Self {
21817 Self {
21818 prev: Some(prev),
21819 header_offset: None,
21820 }
21821 }
21822 pub fn end_nested(mut self) -> Prev {
21823 let mut prev = self.prev.take().unwrap();
21824 if let Some(header_offset) = &self.header_offset {
21825 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21826 }
21827 prev
21828 }
21829 pub fn push_link(mut self, value: u32) -> Self {
21830 push_header(self.as_vec_mut(), 1u16, 4 as u16);
21831 self.as_vec_mut().extend(value.to_ne_bytes());
21832 self
21833 }
21834 pub fn push_local(mut self, value: &[u8]) -> Self {
21835 push_header(self.as_vec_mut(), 2u16, value.len() as u16);
21836 self.as_vec_mut().extend(value);
21837 self
21838 }
21839 pub fn push_remote(mut self, value: &[u8]) -> Self {
21840 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
21841 self.as_vec_mut().extend(value);
21842 self
21843 }
21844 pub fn push_ttl(mut self, value: u8) -> Self {
21845 push_header(self.as_vec_mut(), 4u16, 1 as u16);
21846 self.as_vec_mut().extend(value.to_ne_bytes());
21847 self
21848 }
21849 pub fn push_encap_limit(mut self, value: u8) -> Self {
21850 push_header(self.as_vec_mut(), 6u16, 1 as u16);
21851 self.as_vec_mut().extend(value.to_ne_bytes());
21852 self
21853 }
21854 pub fn push_flowinfo(mut self, value: u32) -> Self {
21855 push_header(self.as_vec_mut(), 7u16, 4 as u16);
21856 self.as_vec_mut().extend(value.to_be_bytes());
21857 self
21858 }
21859 pub fn push_flags(mut self, value: u32) -> Self {
21860 push_header(self.as_vec_mut(), 8u16, 4 as u16);
21861 self.as_vec_mut().extend(value.to_be_bytes());
21862 self
21863 }
21864 pub fn push_proto(mut self, value: u8) -> Self {
21865 push_header(self.as_vec_mut(), 9u16, 1 as u16);
21866 self.as_vec_mut().extend(value.to_ne_bytes());
21867 self
21868 }
21869 pub fn push_encap_type(mut self, value: u16) -> Self {
21870 push_header(self.as_vec_mut(), 15u16, 2 as u16);
21871 self.as_vec_mut().extend(value.to_ne_bytes());
21872 self
21873 }
21874 pub fn push_encap_flags(mut self, value: u16) -> Self {
21875 push_header(self.as_vec_mut(), 16u16, 2 as u16);
21876 self.as_vec_mut().extend(value.to_ne_bytes());
21877 self
21878 }
21879 pub fn push_encap_sport(mut self, value: u16) -> Self {
21880 push_header(self.as_vec_mut(), 17u16, 2 as u16);
21881 self.as_vec_mut().extend(value.to_be_bytes());
21882 self
21883 }
21884 pub fn push_encap_dport(mut self, value: u16) -> Self {
21885 push_header(self.as_vec_mut(), 18u16, 2 as u16);
21886 self.as_vec_mut().extend(value.to_be_bytes());
21887 self
21888 }
21889 pub fn push_collect_metadata(mut self, value: ()) -> Self {
21890 push_header(self.as_vec_mut(), 19u16, 0 as u16);
21891 self
21892 }
21893 pub fn push_fwmark(mut self, value: u32) -> Self {
21894 push_header(self.as_vec_mut(), 20u16, 4 as u16);
21895 self.as_vec_mut().extend(value.to_ne_bytes());
21896 self
21897 }
21898}
21899impl<Prev: Pusher> Drop for PushLinkinfoIp6tnlAttrs<Prev> {
21900 fn drop(&mut self) {
21901 if let Some(prev) = &mut self.prev {
21902 if let Some(header_offset) = &self.header_offset {
21903 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21904 }
21905 }
21906 }
21907}
21908pub struct PushLinkinfoTunAttrs<Prev: Pusher> {
21909 pub(crate) prev: Option<Prev>,
21910 pub(crate) header_offset: Option<usize>,
21911}
21912impl<Prev: Pusher> Pusher for PushLinkinfoTunAttrs<Prev> {
21913 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21914 self.prev.as_mut().unwrap().as_vec_mut()
21915 }
21916 fn as_vec(&self) -> &Vec<u8> {
21917 self.prev.as_ref().unwrap().as_vec()
21918 }
21919}
21920impl<Prev: Pusher> PushLinkinfoTunAttrs<Prev> {
21921 pub fn new(prev: Prev) -> Self {
21922 Self {
21923 prev: Some(prev),
21924 header_offset: None,
21925 }
21926 }
21927 pub fn end_nested(mut self) -> Prev {
21928 let mut prev = self.prev.take().unwrap();
21929 if let Some(header_offset) = &self.header_offset {
21930 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21931 }
21932 prev
21933 }
21934 pub fn push_owner(mut self, value: u32) -> Self {
21935 push_header(self.as_vec_mut(), 1u16, 4 as u16);
21936 self.as_vec_mut().extend(value.to_ne_bytes());
21937 self
21938 }
21939 pub fn push_group(mut self, value: u32) -> Self {
21940 push_header(self.as_vec_mut(), 2u16, 4 as u16);
21941 self.as_vec_mut().extend(value.to_ne_bytes());
21942 self
21943 }
21944 pub fn push_type(mut self, value: u8) -> Self {
21945 push_header(self.as_vec_mut(), 3u16, 1 as u16);
21946 self.as_vec_mut().extend(value.to_ne_bytes());
21947 self
21948 }
21949 pub fn push_pi(mut self, value: u8) -> Self {
21950 push_header(self.as_vec_mut(), 4u16, 1 as u16);
21951 self.as_vec_mut().extend(value.to_ne_bytes());
21952 self
21953 }
21954 pub fn push_vnet_hdr(mut self, value: u8) -> Self {
21955 push_header(self.as_vec_mut(), 5u16, 1 as u16);
21956 self.as_vec_mut().extend(value.to_ne_bytes());
21957 self
21958 }
21959 pub fn push_persist(mut self, value: u8) -> Self {
21960 push_header(self.as_vec_mut(), 6u16, 1 as u16);
21961 self.as_vec_mut().extend(value.to_ne_bytes());
21962 self
21963 }
21964 pub fn push_multi_queue(mut self, value: u8) -> Self {
21965 push_header(self.as_vec_mut(), 7u16, 1 as u16);
21966 self.as_vec_mut().extend(value.to_ne_bytes());
21967 self
21968 }
21969 pub fn push_num_queues(mut self, value: u32) -> Self {
21970 push_header(self.as_vec_mut(), 8u16, 4 as u16);
21971 self.as_vec_mut().extend(value.to_ne_bytes());
21972 self
21973 }
21974 pub fn push_num_disabled_queues(mut self, value: u32) -> Self {
21975 push_header(self.as_vec_mut(), 9u16, 4 as u16);
21976 self.as_vec_mut().extend(value.to_ne_bytes());
21977 self
21978 }
21979}
21980impl<Prev: Pusher> Drop for PushLinkinfoTunAttrs<Prev> {
21981 fn drop(&mut self) {
21982 if let Some(prev) = &mut self.prev {
21983 if let Some(header_offset) = &self.header_offset {
21984 finalize_nested_header(prev.as_vec_mut(), *header_offset);
21985 }
21986 }
21987 }
21988}
21989pub struct PushLinkinfoVlanAttrs<Prev: Pusher> {
21990 pub(crate) prev: Option<Prev>,
21991 pub(crate) header_offset: Option<usize>,
21992}
21993impl<Prev: Pusher> Pusher for PushLinkinfoVlanAttrs<Prev> {
21994 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
21995 self.prev.as_mut().unwrap().as_vec_mut()
21996 }
21997 fn as_vec(&self) -> &Vec<u8> {
21998 self.prev.as_ref().unwrap().as_vec()
21999 }
22000}
22001impl<Prev: Pusher> PushLinkinfoVlanAttrs<Prev> {
22002 pub fn new(prev: Prev) -> Self {
22003 Self {
22004 prev: Some(prev),
22005 header_offset: None,
22006 }
22007 }
22008 pub fn end_nested(mut self) -> Prev {
22009 let mut prev = self.prev.take().unwrap();
22010 if let Some(header_offset) = &self.header_offset {
22011 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22012 }
22013 prev
22014 }
22015 pub fn push_id(mut self, value: u16) -> Self {
22016 push_header(self.as_vec_mut(), 1u16, 2 as u16);
22017 self.as_vec_mut().extend(value.to_ne_bytes());
22018 self
22019 }
22020 pub fn push_flags(mut self, value: IflaVlanFlags) -> Self {
22021 push_header(self.as_vec_mut(), 2u16, value.as_slice().len() as u16);
22022 self.as_vec_mut().extend(value.as_slice());
22023 self
22024 }
22025 pub fn nested_egress_qos(mut self) -> PushIflaVlanQos<Self> {
22026 let header_offset = push_nested_header(self.as_vec_mut(), 3u16);
22027 PushIflaVlanQos {
22028 prev: Some(self),
22029 header_offset: Some(header_offset),
22030 }
22031 }
22032 pub fn nested_ingress_qos(mut self) -> PushIflaVlanQos<Self> {
22033 let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
22034 PushIflaVlanQos {
22035 prev: Some(self),
22036 header_offset: Some(header_offset),
22037 }
22038 }
22039 #[doc = "Associated type: [`VlanProtocols`] (enum)"]
22040 pub fn push_protocol(mut self, value: u16) -> Self {
22041 push_header(self.as_vec_mut(), 5u16, 2 as u16);
22042 self.as_vec_mut().extend(value.to_be_bytes());
22043 self
22044 }
22045}
22046impl<Prev: Pusher> Drop for PushLinkinfoVlanAttrs<Prev> {
22047 fn drop(&mut self) {
22048 if let Some(prev) = &mut self.prev {
22049 if let Some(header_offset) = &self.header_offset {
22050 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22051 }
22052 }
22053 }
22054}
22055pub struct PushIflaVlanQos<Prev: Pusher> {
22056 pub(crate) prev: Option<Prev>,
22057 pub(crate) header_offset: Option<usize>,
22058}
22059impl<Prev: Pusher> Pusher for PushIflaVlanQos<Prev> {
22060 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22061 self.prev.as_mut().unwrap().as_vec_mut()
22062 }
22063 fn as_vec(&self) -> &Vec<u8> {
22064 self.prev.as_ref().unwrap().as_vec()
22065 }
22066}
22067impl<Prev: Pusher> PushIflaVlanQos<Prev> {
22068 pub fn new(prev: Prev) -> Self {
22069 Self {
22070 prev: Some(prev),
22071 header_offset: None,
22072 }
22073 }
22074 pub fn end_nested(mut self) -> Prev {
22075 let mut prev = self.prev.take().unwrap();
22076 if let Some(header_offset) = &self.header_offset {
22077 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22078 }
22079 prev
22080 }
22081 #[doc = "Attribute may repeat multiple times (treat it as array)"]
22082 pub fn push_mapping(mut self, value: IflaVlanQosMapping) -> Self {
22083 push_header(self.as_vec_mut(), 1u16, value.as_slice().len() as u16);
22084 self.as_vec_mut().extend(value.as_slice());
22085 self
22086 }
22087}
22088impl<Prev: Pusher> Drop for PushIflaVlanQos<Prev> {
22089 fn drop(&mut self) {
22090 if let Some(prev) = &mut self.prev {
22091 if let Some(header_offset) = &self.header_offset {
22092 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22093 }
22094 }
22095 }
22096}
22097pub struct PushLinkinfoVrfAttrs<Prev: Pusher> {
22098 pub(crate) prev: Option<Prev>,
22099 pub(crate) header_offset: Option<usize>,
22100}
22101impl<Prev: Pusher> Pusher for PushLinkinfoVrfAttrs<Prev> {
22102 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22103 self.prev.as_mut().unwrap().as_vec_mut()
22104 }
22105 fn as_vec(&self) -> &Vec<u8> {
22106 self.prev.as_ref().unwrap().as_vec()
22107 }
22108}
22109impl<Prev: Pusher> PushLinkinfoVrfAttrs<Prev> {
22110 pub fn new(prev: Prev) -> Self {
22111 Self {
22112 prev: Some(prev),
22113 header_offset: None,
22114 }
22115 }
22116 pub fn end_nested(mut self) -> Prev {
22117 let mut prev = self.prev.take().unwrap();
22118 if let Some(header_offset) = &self.header_offset {
22119 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22120 }
22121 prev
22122 }
22123 pub fn push_table(mut self, value: u32) -> Self {
22124 push_header(self.as_vec_mut(), 1u16, 4 as u16);
22125 self.as_vec_mut().extend(value.to_ne_bytes());
22126 self
22127 }
22128}
22129impl<Prev: Pusher> Drop for PushLinkinfoVrfAttrs<Prev> {
22130 fn drop(&mut self) {
22131 if let Some(prev) = &mut self.prev {
22132 if let Some(header_offset) = &self.header_offset {
22133 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22134 }
22135 }
22136 }
22137}
22138pub struct PushXdpAttrs<Prev: Pusher> {
22139 pub(crate) prev: Option<Prev>,
22140 pub(crate) header_offset: Option<usize>,
22141}
22142impl<Prev: Pusher> Pusher for PushXdpAttrs<Prev> {
22143 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22144 self.prev.as_mut().unwrap().as_vec_mut()
22145 }
22146 fn as_vec(&self) -> &Vec<u8> {
22147 self.prev.as_ref().unwrap().as_vec()
22148 }
22149}
22150impl<Prev: Pusher> PushXdpAttrs<Prev> {
22151 pub fn new(prev: Prev) -> Self {
22152 Self {
22153 prev: Some(prev),
22154 header_offset: None,
22155 }
22156 }
22157 pub fn end_nested(mut self) -> Prev {
22158 let mut prev = self.prev.take().unwrap();
22159 if let Some(header_offset) = &self.header_offset {
22160 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22161 }
22162 prev
22163 }
22164 pub fn push_fd(mut self, value: i32) -> Self {
22165 push_header(self.as_vec_mut(), 1u16, 4 as u16);
22166 self.as_vec_mut().extend(value.to_ne_bytes());
22167 self
22168 }
22169 pub fn push_attached(mut self, value: u8) -> Self {
22170 push_header(self.as_vec_mut(), 2u16, 1 as u16);
22171 self.as_vec_mut().extend(value.to_ne_bytes());
22172 self
22173 }
22174 pub fn push_flags(mut self, value: u32) -> Self {
22175 push_header(self.as_vec_mut(), 3u16, 4 as u16);
22176 self.as_vec_mut().extend(value.to_ne_bytes());
22177 self
22178 }
22179 pub fn push_prog_id(mut self, value: u32) -> Self {
22180 push_header(self.as_vec_mut(), 4u16, 4 as u16);
22181 self.as_vec_mut().extend(value.to_ne_bytes());
22182 self
22183 }
22184 pub fn push_drv_prog_id(mut self, value: u32) -> Self {
22185 push_header(self.as_vec_mut(), 5u16, 4 as u16);
22186 self.as_vec_mut().extend(value.to_ne_bytes());
22187 self
22188 }
22189 pub fn push_skb_prog_id(mut self, value: u32) -> Self {
22190 push_header(self.as_vec_mut(), 6u16, 4 as u16);
22191 self.as_vec_mut().extend(value.to_ne_bytes());
22192 self
22193 }
22194 pub fn push_hw_prog_id(mut self, value: u32) -> Self {
22195 push_header(self.as_vec_mut(), 7u16, 4 as u16);
22196 self.as_vec_mut().extend(value.to_ne_bytes());
22197 self
22198 }
22199 pub fn push_expected_fd(mut self, value: i32) -> Self {
22200 push_header(self.as_vec_mut(), 8u16, 4 as u16);
22201 self.as_vec_mut().extend(value.to_ne_bytes());
22202 self
22203 }
22204}
22205impl<Prev: Pusher> Drop for PushXdpAttrs<Prev> {
22206 fn drop(&mut self) {
22207 if let Some(prev) = &mut self.prev {
22208 if let Some(header_offset) = &self.header_offset {
22209 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22210 }
22211 }
22212 }
22213}
22214pub struct PushIflaAttrs<Prev: Pusher> {
22215 pub(crate) prev: Option<Prev>,
22216 pub(crate) header_offset: Option<usize>,
22217}
22218impl<Prev: Pusher> Pusher for PushIflaAttrs<Prev> {
22219 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22220 self.prev.as_mut().unwrap().as_vec_mut()
22221 }
22222 fn as_vec(&self) -> &Vec<u8> {
22223 self.prev.as_ref().unwrap().as_vec()
22224 }
22225}
22226impl<Prev: Pusher> PushIflaAttrs<Prev> {
22227 pub fn new(prev: Prev) -> Self {
22228 Self {
22229 prev: Some(prev),
22230 header_offset: None,
22231 }
22232 }
22233 pub fn end_nested(mut self) -> Prev {
22234 let mut prev = self.prev.take().unwrap();
22235 if let Some(header_offset) = &self.header_offset {
22236 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22237 }
22238 prev
22239 }
22240 #[doc = "u32 indexed by ipv4-devconf - 1 on output, on input it\\'s a nest\n"]
22241 pub fn push_conf(mut self, value: &[u8]) -> Self {
22242 push_header(self.as_vec_mut(), 1u16, value.len() as u16);
22243 self.as_vec_mut().extend(value);
22244 self
22245 }
22246}
22247impl<Prev: Pusher> Drop for PushIflaAttrs<Prev> {
22248 fn drop(&mut self) {
22249 if let Some(prev) = &mut self.prev {
22250 if let Some(header_offset) = &self.header_offset {
22251 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22252 }
22253 }
22254 }
22255}
22256pub struct PushIfla6Attrs<Prev: Pusher> {
22257 pub(crate) prev: Option<Prev>,
22258 pub(crate) header_offset: Option<usize>,
22259}
22260impl<Prev: Pusher> Pusher for PushIfla6Attrs<Prev> {
22261 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22262 self.prev.as_mut().unwrap().as_vec_mut()
22263 }
22264 fn as_vec(&self) -> &Vec<u8> {
22265 self.prev.as_ref().unwrap().as_vec()
22266 }
22267}
22268impl<Prev: Pusher> PushIfla6Attrs<Prev> {
22269 pub fn new(prev: Prev) -> Self {
22270 Self {
22271 prev: Some(prev),
22272 header_offset: None,
22273 }
22274 }
22275 pub fn end_nested(mut self) -> Prev {
22276 let mut prev = self.prev.take().unwrap();
22277 if let Some(header_offset) = &self.header_offset {
22278 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22279 }
22280 prev
22281 }
22282 pub fn push_flags(mut self, value: u32) -> Self {
22283 push_header(self.as_vec_mut(), 1u16, 4 as u16);
22284 self.as_vec_mut().extend(value.to_ne_bytes());
22285 self
22286 }
22287 #[doc = "u32 indexed by ipv6-devconf - 1 on output, on input it\\'s a nest\n"]
22288 pub fn push_conf(mut self, value: &[u8]) -> Self {
22289 push_header(self.as_vec_mut(), 2u16, value.len() as u16);
22290 self.as_vec_mut().extend(value);
22291 self
22292 }
22293 pub fn push_stats(mut self, value: &[u8]) -> Self {
22294 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
22295 self.as_vec_mut().extend(value);
22296 self
22297 }
22298 pub fn push_mcast(mut self, value: &[u8]) -> Self {
22299 push_header(self.as_vec_mut(), 4u16, value.len() as u16);
22300 self.as_vec_mut().extend(value);
22301 self
22302 }
22303 pub fn push_cacheinfo(mut self, value: IflaCacheinfo) -> Self {
22304 push_header(self.as_vec_mut(), 5u16, value.as_slice().len() as u16);
22305 self.as_vec_mut().extend(value.as_slice());
22306 self
22307 }
22308 pub fn push_icmp6stats(mut self, value: &[u8]) -> Self {
22309 push_header(self.as_vec_mut(), 6u16, value.len() as u16);
22310 self.as_vec_mut().extend(value);
22311 self
22312 }
22313 pub fn push_token(mut self, value: &[u8]) -> Self {
22314 push_header(self.as_vec_mut(), 7u16, value.len() as u16);
22315 self.as_vec_mut().extend(value);
22316 self
22317 }
22318 pub fn push_addr_gen_mode(mut self, value: u8) -> Self {
22319 push_header(self.as_vec_mut(), 8u16, 1 as u16);
22320 self.as_vec_mut().extend(value.to_ne_bytes());
22321 self
22322 }
22323 pub fn push_ra_mtu(mut self, value: u32) -> Self {
22324 push_header(self.as_vec_mut(), 9u16, 4 as u16);
22325 self.as_vec_mut().extend(value.to_ne_bytes());
22326 self
22327 }
22328}
22329impl<Prev: Pusher> Drop for PushIfla6Attrs<Prev> {
22330 fn drop(&mut self) {
22331 if let Some(prev) = &mut self.prev {
22332 if let Some(header_offset) = &self.header_offset {
22333 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22334 }
22335 }
22336 }
22337}
22338pub struct PushMctpAttrs<Prev: Pusher> {
22339 pub(crate) prev: Option<Prev>,
22340 pub(crate) header_offset: Option<usize>,
22341}
22342impl<Prev: Pusher> Pusher for PushMctpAttrs<Prev> {
22343 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22344 self.prev.as_mut().unwrap().as_vec_mut()
22345 }
22346 fn as_vec(&self) -> &Vec<u8> {
22347 self.prev.as_ref().unwrap().as_vec()
22348 }
22349}
22350impl<Prev: Pusher> PushMctpAttrs<Prev> {
22351 pub fn new(prev: Prev) -> Self {
22352 Self {
22353 prev: Some(prev),
22354 header_offset: None,
22355 }
22356 }
22357 pub fn end_nested(mut self) -> Prev {
22358 let mut prev = self.prev.take().unwrap();
22359 if let Some(header_offset) = &self.header_offset {
22360 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22361 }
22362 prev
22363 }
22364 pub fn push_net(mut self, value: u32) -> Self {
22365 push_header(self.as_vec_mut(), 1u16, 4 as u16);
22366 self.as_vec_mut().extend(value.to_ne_bytes());
22367 self
22368 }
22369 pub fn push_phys_binding(mut self, value: u8) -> Self {
22370 push_header(self.as_vec_mut(), 2u16, 1 as u16);
22371 self.as_vec_mut().extend(value.to_ne_bytes());
22372 self
22373 }
22374}
22375impl<Prev: Pusher> Drop for PushMctpAttrs<Prev> {
22376 fn drop(&mut self) {
22377 if let Some(prev) = &mut self.prev {
22378 if let Some(header_offset) = &self.header_offset {
22379 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22380 }
22381 }
22382 }
22383}
22384pub struct PushStatsAttrs<Prev: Pusher> {
22385 pub(crate) prev: Option<Prev>,
22386 pub(crate) header_offset: Option<usize>,
22387}
22388impl<Prev: Pusher> Pusher for PushStatsAttrs<Prev> {
22389 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22390 self.prev.as_mut().unwrap().as_vec_mut()
22391 }
22392 fn as_vec(&self) -> &Vec<u8> {
22393 self.prev.as_ref().unwrap().as_vec()
22394 }
22395}
22396impl<Prev: Pusher> PushStatsAttrs<Prev> {
22397 pub fn new(prev: Prev) -> Self {
22398 Self {
22399 prev: Some(prev),
22400 header_offset: None,
22401 }
22402 }
22403 pub fn end_nested(mut self) -> Prev {
22404 let mut prev = self.prev.take().unwrap();
22405 if let Some(header_offset) = &self.header_offset {
22406 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22407 }
22408 prev
22409 }
22410 pub fn push_link_64(mut self, value: RtnlLinkStats64) -> Self {
22411 push_header(self.as_vec_mut(), 1u16, value.as_slice().len() as u16);
22412 self.as_vec_mut().extend(value.as_slice());
22413 self
22414 }
22415 pub fn push_link_xstats(mut self, value: &[u8]) -> Self {
22416 push_header(self.as_vec_mut(), 2u16, value.len() as u16);
22417 self.as_vec_mut().extend(value);
22418 self
22419 }
22420 pub fn push_link_xstats_slave(mut self, value: &[u8]) -> Self {
22421 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
22422 self.as_vec_mut().extend(value);
22423 self
22424 }
22425 pub fn nested_link_offload_xstats(mut self) -> PushLinkOffloadXstats<Self> {
22426 let header_offset = push_nested_header(self.as_vec_mut(), 4u16);
22427 PushLinkOffloadXstats {
22428 prev: Some(self),
22429 header_offset: Some(header_offset),
22430 }
22431 }
22432 pub fn push_af_spec(mut self, value: &[u8]) -> Self {
22433 push_header(self.as_vec_mut(), 5u16, value.len() as u16);
22434 self.as_vec_mut().extend(value);
22435 self
22436 }
22437}
22438impl<Prev: Pusher> Drop for PushStatsAttrs<Prev> {
22439 fn drop(&mut self) {
22440 if let Some(prev) = &mut self.prev {
22441 if let Some(header_offset) = &self.header_offset {
22442 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22443 }
22444 }
22445 }
22446}
22447pub struct PushLinkOffloadXstats<Prev: Pusher> {
22448 pub(crate) prev: Option<Prev>,
22449 pub(crate) header_offset: Option<usize>,
22450}
22451impl<Prev: Pusher> Pusher for PushLinkOffloadXstats<Prev> {
22452 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22453 self.prev.as_mut().unwrap().as_vec_mut()
22454 }
22455 fn as_vec(&self) -> &Vec<u8> {
22456 self.prev.as_ref().unwrap().as_vec()
22457 }
22458}
22459pub struct PushArrayHwSInfoOne<Prev: Pusher> {
22460 pub(crate) prev: Option<Prev>,
22461 pub(crate) header_offset: Option<usize>,
22462 pub(crate) counter: u16,
22463}
22464impl<Prev: Pusher> Pusher for PushArrayHwSInfoOne<Prev> {
22465 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22466 self.prev.as_mut().unwrap().as_vec_mut()
22467 }
22468 fn as_vec(&self) -> &Vec<u8> {
22469 self.prev.as_ref().unwrap().as_vec()
22470 }
22471}
22472impl<Prev: Pusher> PushArrayHwSInfoOne<Prev> {
22473 pub fn new(prev: Prev) -> Self {
22474 Self {
22475 prev: Some(prev),
22476 header_offset: None,
22477 counter: 0,
22478 }
22479 }
22480 pub fn end_array(mut self) -> Prev {
22481 let mut prev = self.prev.take().unwrap();
22482 if let Some(header_offset) = &self.header_offset {
22483 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22484 }
22485 prev
22486 }
22487 pub fn entry_nested(mut self) -> PushHwSInfoOne<Self> {
22488 let index = self.counter;
22489 self.counter += 1;
22490 let header_offset = push_nested_header(self.as_vec_mut(), index);
22491 PushHwSInfoOne {
22492 prev: Some(self),
22493 header_offset: Some(header_offset),
22494 }
22495 }
22496}
22497impl<Prev: Pusher> Drop for PushArrayHwSInfoOne<Prev> {
22498 fn drop(&mut self) {
22499 if let Some(prev) = &mut self.prev {
22500 if let Some(header_offset) = &self.header_offset {
22501 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22502 }
22503 }
22504 }
22505}
22506impl<Prev: Pusher> PushLinkOffloadXstats<Prev> {
22507 pub fn new(prev: Prev) -> Self {
22508 Self {
22509 prev: Some(prev),
22510 header_offset: None,
22511 }
22512 }
22513 pub fn end_nested(mut self) -> Prev {
22514 let mut prev = self.prev.take().unwrap();
22515 if let Some(header_offset) = &self.header_offset {
22516 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22517 }
22518 prev
22519 }
22520 pub fn push_cpu_hit(mut self, value: &[u8]) -> Self {
22521 push_header(self.as_vec_mut(), 1u16, value.len() as u16);
22522 self.as_vec_mut().extend(value);
22523 self
22524 }
22525 pub fn array_hw_s_info(mut self) -> PushArrayHwSInfoOne<Self> {
22526 let header_offset = push_nested_header(self.as_vec_mut(), 2u16);
22527 PushArrayHwSInfoOne {
22528 prev: Some(self),
22529 header_offset: Some(header_offset),
22530 counter: 0,
22531 }
22532 }
22533 pub fn push_l3_stats(mut self, value: &[u8]) -> Self {
22534 push_header(self.as_vec_mut(), 3u16, value.len() as u16);
22535 self.as_vec_mut().extend(value);
22536 self
22537 }
22538}
22539impl<Prev: Pusher> Drop for PushLinkOffloadXstats<Prev> {
22540 fn drop(&mut self) {
22541 if let Some(prev) = &mut self.prev {
22542 if let Some(header_offset) = &self.header_offset {
22543 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22544 }
22545 }
22546 }
22547}
22548pub struct PushHwSInfoOne<Prev: Pusher> {
22549 pub(crate) prev: Option<Prev>,
22550 pub(crate) header_offset: Option<usize>,
22551}
22552impl<Prev: Pusher> Pusher for PushHwSInfoOne<Prev> {
22553 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22554 self.prev.as_mut().unwrap().as_vec_mut()
22555 }
22556 fn as_vec(&self) -> &Vec<u8> {
22557 self.prev.as_ref().unwrap().as_vec()
22558 }
22559}
22560impl<Prev: Pusher> PushHwSInfoOne<Prev> {
22561 pub fn new(prev: Prev) -> Self {
22562 Self {
22563 prev: Some(prev),
22564 header_offset: None,
22565 }
22566 }
22567 pub fn end_nested(mut self) -> Prev {
22568 let mut prev = self.prev.take().unwrap();
22569 if let Some(header_offset) = &self.header_offset {
22570 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22571 }
22572 prev
22573 }
22574 pub fn push_request(mut self, value: u8) -> Self {
22575 push_header(self.as_vec_mut(), 1u16, 1 as u16);
22576 self.as_vec_mut().extend(value.to_ne_bytes());
22577 self
22578 }
22579 pub fn push_used(mut self, value: u8) -> Self {
22580 push_header(self.as_vec_mut(), 2u16, 1 as u16);
22581 self.as_vec_mut().extend(value.to_ne_bytes());
22582 self
22583 }
22584}
22585impl<Prev: Pusher> Drop for PushHwSInfoOne<Prev> {
22586 fn drop(&mut self) {
22587 if let Some(prev) = &mut self.prev {
22588 if let Some(header_offset) = &self.header_offset {
22589 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22590 }
22591 }
22592 }
22593}
22594pub struct PushLinkDpllPinAttrs<Prev: Pusher> {
22595 pub(crate) prev: Option<Prev>,
22596 pub(crate) header_offset: Option<usize>,
22597}
22598impl<Prev: Pusher> Pusher for PushLinkDpllPinAttrs<Prev> {
22599 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22600 self.prev.as_mut().unwrap().as_vec_mut()
22601 }
22602 fn as_vec(&self) -> &Vec<u8> {
22603 self.prev.as_ref().unwrap().as_vec()
22604 }
22605}
22606impl<Prev: Pusher> PushLinkDpllPinAttrs<Prev> {
22607 pub fn new(prev: Prev) -> Self {
22608 Self {
22609 prev: Some(prev),
22610 header_offset: None,
22611 }
22612 }
22613 pub fn end_nested(mut self) -> Prev {
22614 let mut prev = self.prev.take().unwrap();
22615 if let Some(header_offset) = &self.header_offset {
22616 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22617 }
22618 prev
22619 }
22620 pub fn push_id(mut self, value: u32) -> Self {
22621 push_header(self.as_vec_mut(), 1u16, 4 as u16);
22622 self.as_vec_mut().extend(value.to_ne_bytes());
22623 self
22624 }
22625}
22626impl<Prev: Pusher> Drop for PushLinkDpllPinAttrs<Prev> {
22627 fn drop(&mut self) {
22628 if let Some(prev) = &mut self.prev {
22629 if let Some(header_offset) = &self.header_offset {
22630 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22631 }
22632 }
22633 }
22634}
22635pub struct PushLinkinfoNetkitAttrs<Prev: Pusher> {
22636 pub(crate) prev: Option<Prev>,
22637 pub(crate) header_offset: Option<usize>,
22638}
22639impl<Prev: Pusher> Pusher for PushLinkinfoNetkitAttrs<Prev> {
22640 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22641 self.prev.as_mut().unwrap().as_vec_mut()
22642 }
22643 fn as_vec(&self) -> &Vec<u8> {
22644 self.prev.as_ref().unwrap().as_vec()
22645 }
22646}
22647impl<Prev: Pusher> PushLinkinfoNetkitAttrs<Prev> {
22648 pub fn new(prev: Prev) -> Self {
22649 Self {
22650 prev: Some(prev),
22651 header_offset: None,
22652 }
22653 }
22654 pub fn end_nested(mut self) -> Prev {
22655 let mut prev = self.prev.take().unwrap();
22656 if let Some(header_offset) = &self.header_offset {
22657 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22658 }
22659 prev
22660 }
22661 pub fn push_peer_info(mut self, value: &[u8]) -> Self {
22662 push_header(self.as_vec_mut(), 1u16, value.len() as u16);
22663 self.as_vec_mut().extend(value);
22664 self
22665 }
22666 pub fn push_primary(mut self, value: u8) -> Self {
22667 push_header(self.as_vec_mut(), 2u16, 1 as u16);
22668 self.as_vec_mut().extend(value.to_ne_bytes());
22669 self
22670 }
22671 #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
22672 pub fn push_policy(mut self, value: u32) -> Self {
22673 push_header(self.as_vec_mut(), 3u16, 4 as u16);
22674 self.as_vec_mut().extend(value.to_ne_bytes());
22675 self
22676 }
22677 #[doc = "Associated type: [`NetkitPolicy`] (enum)"]
22678 pub fn push_peer_policy(mut self, value: u32) -> Self {
22679 push_header(self.as_vec_mut(), 4u16, 4 as u16);
22680 self.as_vec_mut().extend(value.to_ne_bytes());
22681 self
22682 }
22683 #[doc = "Associated type: [`NetkitMode`] (enum)"]
22684 pub fn push_mode(mut self, value: u32) -> Self {
22685 push_header(self.as_vec_mut(), 5u16, 4 as u16);
22686 self.as_vec_mut().extend(value.to_ne_bytes());
22687 self
22688 }
22689 #[doc = "Associated type: [`NetkitScrub`] (enum)"]
22690 pub fn push_scrub(mut self, value: u32) -> Self {
22691 push_header(self.as_vec_mut(), 6u16, 4 as u16);
22692 self.as_vec_mut().extend(value.to_ne_bytes());
22693 self
22694 }
22695 #[doc = "Associated type: [`NetkitScrub`] (enum)"]
22696 pub fn push_peer_scrub(mut self, value: u32) -> Self {
22697 push_header(self.as_vec_mut(), 7u16, 4 as u16);
22698 self.as_vec_mut().extend(value.to_ne_bytes());
22699 self
22700 }
22701 pub fn push_headroom(mut self, value: u16) -> Self {
22702 push_header(self.as_vec_mut(), 8u16, 2 as u16);
22703 self.as_vec_mut().extend(value.to_ne_bytes());
22704 self
22705 }
22706 pub fn push_tailroom(mut self, value: u16) -> Self {
22707 push_header(self.as_vec_mut(), 9u16, 2 as u16);
22708 self.as_vec_mut().extend(value.to_ne_bytes());
22709 self
22710 }
22711 #[doc = "Associated type: [`NetkitPairing`] (enum)"]
22712 pub fn push_pairing(mut self, value: u32) -> Self {
22713 push_header(self.as_vec_mut(), 10u16, 4 as u16);
22714 self.as_vec_mut().extend(value.to_ne_bytes());
22715 self
22716 }
22717}
22718impl<Prev: Pusher> Drop for PushLinkinfoNetkitAttrs<Prev> {
22719 fn drop(&mut self) {
22720 if let Some(prev) = &mut self.prev {
22721 if let Some(header_offset) = &self.header_offset {
22722 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22723 }
22724 }
22725 }
22726}
22727pub struct PushLinkinfoOvpnAttrs<Prev: Pusher> {
22728 pub(crate) prev: Option<Prev>,
22729 pub(crate) header_offset: Option<usize>,
22730}
22731impl<Prev: Pusher> Pusher for PushLinkinfoOvpnAttrs<Prev> {
22732 fn as_vec_mut(&mut self) -> &mut Vec<u8> {
22733 self.prev.as_mut().unwrap().as_vec_mut()
22734 }
22735 fn as_vec(&self) -> &Vec<u8> {
22736 self.prev.as_ref().unwrap().as_vec()
22737 }
22738}
22739impl<Prev: Pusher> PushLinkinfoOvpnAttrs<Prev> {
22740 pub fn new(prev: Prev) -> Self {
22741 Self {
22742 prev: Some(prev),
22743 header_offset: None,
22744 }
22745 }
22746 pub fn end_nested(mut self) -> Prev {
22747 let mut prev = self.prev.take().unwrap();
22748 if let Some(header_offset) = &self.header_offset {
22749 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22750 }
22751 prev
22752 }
22753 #[doc = "Associated type: [`OvpnMode`] (enum)"]
22754 pub fn push_mode(mut self, value: u8) -> Self {
22755 push_header(self.as_vec_mut(), 1u16, 1 as u16);
22756 self.as_vec_mut().extend(value.to_ne_bytes());
22757 self
22758 }
22759}
22760impl<Prev: Pusher> Drop for PushLinkinfoOvpnAttrs<Prev> {
22761 fn drop(&mut self) {
22762 if let Some(prev) = &mut self.prev {
22763 if let Some(header_offset) = &self.header_offset {
22764 finalize_nested_header(prev.as_vec_mut(), *header_offset);
22765 }
22766 }
22767 }
22768}
22769#[doc = "Create a new link.\n\nRequest attributes:\n- [.push_address()](PushLinkAttrs::push_address)\n- [.push_broadcast()](PushLinkAttrs::push_broadcast)\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_mtu()](PushLinkAttrs::push_mtu)\n- [.push_txqlen()](PushLinkAttrs::push_txqlen)\n- [.push_operstate()](PushLinkAttrs::push_operstate)\n- [.push_linkmode()](PushLinkAttrs::push_linkmode)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_net_ns_pid()](PushLinkAttrs::push_net_ns_pid)\n- [.nested_af_spec()](PushLinkAttrs::nested_af_spec)\n- [.push_group()](PushLinkAttrs::push_group)\n- [.push_net_ns_fd()](PushLinkAttrs::push_net_ns_fd)\n- [.push_num_tx_queues()](PushLinkAttrs::push_num_tx_queues)\n- [.push_num_rx_queues()](PushLinkAttrs::push_num_rx_queues)\n- [.push_link_netnsid()](PushLinkAttrs::push_link_netnsid)\n- [.push_gso_max_segs()](PushLinkAttrs::push_gso_max_segs)\n- [.push_gso_max_size()](PushLinkAttrs::push_gso_max_size)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_gro_max_size()](PushLinkAttrs::push_gro_max_size)\n- [.push_gso_ipv4_max_size()](PushLinkAttrs::push_gso_ipv4_max_size)\n- [.push_gro_ipv4_max_size()](PushLinkAttrs::push_gro_ipv4_max_size)\n\n"]
22770#[derive(Debug)]
22771pub struct OpNewlinkDo<'r> {
22772 request: Request<'r>,
22773}
22774impl<'r> OpNewlinkDo<'r> {
22775 pub fn new(mut request: Request<'r>, header: &Ifinfomsg) -> Self {
22776 Self::write_header(request.buf_mut(), header);
22777 Self { request: request }
22778 }
22779 pub fn encode_request<'buf>(
22780 buf: &'buf mut Vec<u8>,
22781 header: &Ifinfomsg,
22782 ) -> PushLinkAttrs<&'buf mut Vec<u8>> {
22783 Self::write_header(buf, header);
22784 PushLinkAttrs::new(buf)
22785 }
22786 pub fn encode(&mut self) -> PushLinkAttrs<&mut Vec<u8>> {
22787 PushLinkAttrs::new(self.request.buf_mut())
22788 }
22789 pub fn into_encoder(self) -> PushLinkAttrs<RequestBuf<'r>> {
22790 PushLinkAttrs::new(self.request.buf)
22791 }
22792 pub fn decode_request<'a>(buf: &'a [u8]) -> (Ifinfomsg, IterableLinkAttrs<'a>) {
22793 let (header, attrs) = buf.split_at(buf.len().min(Ifinfomsg::len()));
22794 (
22795 Ifinfomsg::new_from_slice(header).unwrap_or_default(),
22796 IterableLinkAttrs::with_loc(attrs, buf.as_ptr() as usize),
22797 )
22798 }
22799 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Ifinfomsg) {
22800 prev.as_vec_mut().extend(header.as_slice());
22801 }
22802}
22803impl NetlinkRequest for OpNewlinkDo<'_> {
22804 fn protocol(&self) -> Protocol {
22805 Protocol::Raw {
22806 protonum: 0u16,
22807 request_type: 16u16,
22808 }
22809 }
22810 fn flags(&self) -> u16 {
22811 self.request.flags
22812 }
22813 fn payload(&self) -> &[u8] {
22814 self.request.buf()
22815 }
22816 type ReplyType<'buf> = (Ifinfomsg, IterableLinkAttrs<'buf>);
22817 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22818 Self::decode_request(buf)
22819 }
22820 fn lookup(
22821 buf: &[u8],
22822 offset: usize,
22823 missing_type: Option<u16>,
22824 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22825 Self::decode_request(buf)
22826 .1
22827 .lookup_attr(offset, missing_type)
22828 }
22829}
22830#[doc = "Delete an existing link.\n\nRequest attributes:\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n\n"]
22831#[derive(Debug)]
22832pub struct OpDellinkDo<'r> {
22833 request: Request<'r>,
22834}
22835impl<'r> OpDellinkDo<'r> {
22836 pub fn new(mut request: Request<'r>, header: &Ifinfomsg) -> Self {
22837 Self::write_header(request.buf_mut(), header);
22838 Self { request: request }
22839 }
22840 pub fn encode_request<'buf>(
22841 buf: &'buf mut Vec<u8>,
22842 header: &Ifinfomsg,
22843 ) -> PushLinkAttrs<&'buf mut Vec<u8>> {
22844 Self::write_header(buf, header);
22845 PushLinkAttrs::new(buf)
22846 }
22847 pub fn encode(&mut self) -> PushLinkAttrs<&mut Vec<u8>> {
22848 PushLinkAttrs::new(self.request.buf_mut())
22849 }
22850 pub fn into_encoder(self) -> PushLinkAttrs<RequestBuf<'r>> {
22851 PushLinkAttrs::new(self.request.buf)
22852 }
22853 pub fn decode_request<'a>(buf: &'a [u8]) -> (Ifinfomsg, IterableLinkAttrs<'a>) {
22854 let (header, attrs) = buf.split_at(buf.len().min(Ifinfomsg::len()));
22855 (
22856 Ifinfomsg::new_from_slice(header).unwrap_or_default(),
22857 IterableLinkAttrs::with_loc(attrs, buf.as_ptr() as usize),
22858 )
22859 }
22860 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Ifinfomsg) {
22861 prev.as_vec_mut().extend(header.as_slice());
22862 }
22863}
22864impl NetlinkRequest for OpDellinkDo<'_> {
22865 fn protocol(&self) -> Protocol {
22866 Protocol::Raw {
22867 protonum: 0u16,
22868 request_type: 17u16,
22869 }
22870 }
22871 fn flags(&self) -> u16 {
22872 self.request.flags
22873 }
22874 fn payload(&self) -> &[u8] {
22875 self.request.buf()
22876 }
22877 type ReplyType<'buf> = (Ifinfomsg, IterableLinkAttrs<'buf>);
22878 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22879 Self::decode_request(buf)
22880 }
22881 fn lookup(
22882 buf: &[u8],
22883 offset: usize,
22884 missing_type: Option<u16>,
22885 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22886 Self::decode_request(buf)
22887 .1
22888 .lookup_attr(offset, missing_type)
22889 }
22890}
22891#[doc = "Get / dump information about a link.\n\nRequest attributes:\n- [.push_master()](PushLinkAttrs::push_master)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n\nReply attributes:\n- [.get_address()](IterableLinkAttrs::get_address)\n- [.get_broadcast()](IterableLinkAttrs::get_broadcast)\n- [.get_ifname()](IterableLinkAttrs::get_ifname)\n- [.get_mtu()](IterableLinkAttrs::get_mtu)\n- [.get_link()](IterableLinkAttrs::get_link)\n- [.get_qdisc()](IterableLinkAttrs::get_qdisc)\n- [.get_stats()](IterableLinkAttrs::get_stats)\n- [.get_master()](IterableLinkAttrs::get_master)\n- [.get_wireless()](IterableLinkAttrs::get_wireless)\n- [.get_protinfo()](IterableLinkAttrs::get_protinfo)\n- [.get_txqlen()](IterableLinkAttrs::get_txqlen)\n- [.get_map()](IterableLinkAttrs::get_map)\n- [.get_weight()](IterableLinkAttrs::get_weight)\n- [.get_operstate()](IterableLinkAttrs::get_operstate)\n- [.get_linkmode()](IterableLinkAttrs::get_linkmode)\n- [.get_linkinfo()](IterableLinkAttrs::get_linkinfo)\n- [.get_net_ns_pid()](IterableLinkAttrs::get_net_ns_pid)\n- [.get_ifalias()](IterableLinkAttrs::get_ifalias)\n- [.get_num_vf()](IterableLinkAttrs::get_num_vf)\n- [.get_vfinfo_list()](IterableLinkAttrs::get_vfinfo_list)\n- [.get_stats64()](IterableLinkAttrs::get_stats64)\n- [.get_vf_ports()](IterableLinkAttrs::get_vf_ports)\n- [.get_port_self()](IterableLinkAttrs::get_port_self)\n- [.get_af_spec()](IterableLinkAttrs::get_af_spec)\n- [.get_group()](IterableLinkAttrs::get_group)\n- [.get_net_ns_fd()](IterableLinkAttrs::get_net_ns_fd)\n- [.get_ext_mask()](IterableLinkAttrs::get_ext_mask)\n- [.get_promiscuity()](IterableLinkAttrs::get_promiscuity)\n- [.get_num_tx_queues()](IterableLinkAttrs::get_num_tx_queues)\n- [.get_num_rx_queues()](IterableLinkAttrs::get_num_rx_queues)\n- [.get_carrier()](IterableLinkAttrs::get_carrier)\n- [.get_phys_port_id()](IterableLinkAttrs::get_phys_port_id)\n- [.get_carrier_changes()](IterableLinkAttrs::get_carrier_changes)\n- [.get_phys_switch_id()](IterableLinkAttrs::get_phys_switch_id)\n- [.get_link_netnsid()](IterableLinkAttrs::get_link_netnsid)\n- [.get_phys_port_name()](IterableLinkAttrs::get_phys_port_name)\n- [.get_proto_down()](IterableLinkAttrs::get_proto_down)\n- [.get_gso_max_segs()](IterableLinkAttrs::get_gso_max_segs)\n- [.get_gso_max_size()](IterableLinkAttrs::get_gso_max_size)\n- [.get_xdp()](IterableLinkAttrs::get_xdp)\n- [.get_event()](IterableLinkAttrs::get_event)\n- [.get_new_netnsid()](IterableLinkAttrs::get_new_netnsid)\n- [.get_target_netnsid()](IterableLinkAttrs::get_target_netnsid)\n- [.get_carrier_up_count()](IterableLinkAttrs::get_carrier_up_count)\n- [.get_carrier_down_count()](IterableLinkAttrs::get_carrier_down_count)\n- [.get_new_ifindex()](IterableLinkAttrs::get_new_ifindex)\n- [.get_min_mtu()](IterableLinkAttrs::get_min_mtu)\n- [.get_max_mtu()](IterableLinkAttrs::get_max_mtu)\n- [.get_prop_list()](IterableLinkAttrs::get_prop_list)\n- [.get_perm_address()](IterableLinkAttrs::get_perm_address)\n- [.get_proto_down_reason()](IterableLinkAttrs::get_proto_down_reason)\n- [.get_parent_dev_name()](IterableLinkAttrs::get_parent_dev_name)\n- [.get_parent_dev_bus_name()](IterableLinkAttrs::get_parent_dev_bus_name)\n- [.get_gro_max_size()](IterableLinkAttrs::get_gro_max_size)\n- [.get_tso_max_size()](IterableLinkAttrs::get_tso_max_size)\n- [.get_tso_max_segs()](IterableLinkAttrs::get_tso_max_segs)\n- [.get_allmulti()](IterableLinkAttrs::get_allmulti)\n- [.get_devlink_port()](IterableLinkAttrs::get_devlink_port)\n- [.get_gso_ipv4_max_size()](IterableLinkAttrs::get_gso_ipv4_max_size)\n- [.get_gro_ipv4_max_size()](IterableLinkAttrs::get_gro_ipv4_max_size)\n\n"]
22892#[derive(Debug)]
22893pub struct OpGetlinkDump<'r> {
22894 request: Request<'r>,
22895}
22896impl<'r> OpGetlinkDump<'r> {
22897 pub fn new(mut request: Request<'r>, header: &Ifinfomsg) -> Self {
22898 Self::write_header(request.buf_mut(), header);
22899 Self {
22900 request: request.set_dump(),
22901 }
22902 }
22903 pub fn encode_request<'buf>(
22904 buf: &'buf mut Vec<u8>,
22905 header: &Ifinfomsg,
22906 ) -> PushLinkAttrs<&'buf mut Vec<u8>> {
22907 Self::write_header(buf, header);
22908 PushLinkAttrs::new(buf)
22909 }
22910 pub fn encode(&mut self) -> PushLinkAttrs<&mut Vec<u8>> {
22911 PushLinkAttrs::new(self.request.buf_mut())
22912 }
22913 pub fn into_encoder(self) -> PushLinkAttrs<RequestBuf<'r>> {
22914 PushLinkAttrs::new(self.request.buf)
22915 }
22916 pub fn decode_request<'a>(buf: &'a [u8]) -> (Ifinfomsg, IterableLinkAttrs<'a>) {
22917 let (header, attrs) = buf.split_at(buf.len().min(Ifinfomsg::len()));
22918 (
22919 Ifinfomsg::new_from_slice(header).unwrap_or_default(),
22920 IterableLinkAttrs::with_loc(attrs, buf.as_ptr() as usize),
22921 )
22922 }
22923 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Ifinfomsg) {
22924 prev.as_vec_mut().extend(header.as_slice());
22925 }
22926}
22927impl NetlinkRequest for OpGetlinkDump<'_> {
22928 fn protocol(&self) -> Protocol {
22929 Protocol::Raw {
22930 protonum: 0u16,
22931 request_type: 18u16,
22932 }
22933 }
22934 fn flags(&self) -> u16 {
22935 self.request.flags
22936 }
22937 fn payload(&self) -> &[u8] {
22938 self.request.buf()
22939 }
22940 type ReplyType<'buf> = (Ifinfomsg, IterableLinkAttrs<'buf>);
22941 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
22942 Self::decode_request(buf)
22943 }
22944 fn lookup(
22945 buf: &[u8],
22946 offset: usize,
22947 missing_type: Option<u16>,
22948 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
22949 Self::decode_request(buf)
22950 .1
22951 .lookup_attr(offset, missing_type)
22952 }
22953}
22954#[doc = "Get / dump information about a link.\n\nRequest attributes:\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_alt_ifname()](PushLinkAttrs::push_alt_ifname)\n\nReply attributes:\n- [.get_address()](IterableLinkAttrs::get_address)\n- [.get_broadcast()](IterableLinkAttrs::get_broadcast)\n- [.get_ifname()](IterableLinkAttrs::get_ifname)\n- [.get_mtu()](IterableLinkAttrs::get_mtu)\n- [.get_link()](IterableLinkAttrs::get_link)\n- [.get_qdisc()](IterableLinkAttrs::get_qdisc)\n- [.get_stats()](IterableLinkAttrs::get_stats)\n- [.get_master()](IterableLinkAttrs::get_master)\n- [.get_wireless()](IterableLinkAttrs::get_wireless)\n- [.get_protinfo()](IterableLinkAttrs::get_protinfo)\n- [.get_txqlen()](IterableLinkAttrs::get_txqlen)\n- [.get_map()](IterableLinkAttrs::get_map)\n- [.get_weight()](IterableLinkAttrs::get_weight)\n- [.get_operstate()](IterableLinkAttrs::get_operstate)\n- [.get_linkmode()](IterableLinkAttrs::get_linkmode)\n- [.get_linkinfo()](IterableLinkAttrs::get_linkinfo)\n- [.get_net_ns_pid()](IterableLinkAttrs::get_net_ns_pid)\n- [.get_ifalias()](IterableLinkAttrs::get_ifalias)\n- [.get_num_vf()](IterableLinkAttrs::get_num_vf)\n- [.get_vfinfo_list()](IterableLinkAttrs::get_vfinfo_list)\n- [.get_stats64()](IterableLinkAttrs::get_stats64)\n- [.get_vf_ports()](IterableLinkAttrs::get_vf_ports)\n- [.get_port_self()](IterableLinkAttrs::get_port_self)\n- [.get_af_spec()](IterableLinkAttrs::get_af_spec)\n- [.get_group()](IterableLinkAttrs::get_group)\n- [.get_net_ns_fd()](IterableLinkAttrs::get_net_ns_fd)\n- [.get_ext_mask()](IterableLinkAttrs::get_ext_mask)\n- [.get_promiscuity()](IterableLinkAttrs::get_promiscuity)\n- [.get_num_tx_queues()](IterableLinkAttrs::get_num_tx_queues)\n- [.get_num_rx_queues()](IterableLinkAttrs::get_num_rx_queues)\n- [.get_carrier()](IterableLinkAttrs::get_carrier)\n- [.get_phys_port_id()](IterableLinkAttrs::get_phys_port_id)\n- [.get_carrier_changes()](IterableLinkAttrs::get_carrier_changes)\n- [.get_phys_switch_id()](IterableLinkAttrs::get_phys_switch_id)\n- [.get_link_netnsid()](IterableLinkAttrs::get_link_netnsid)\n- [.get_phys_port_name()](IterableLinkAttrs::get_phys_port_name)\n- [.get_proto_down()](IterableLinkAttrs::get_proto_down)\n- [.get_gso_max_segs()](IterableLinkAttrs::get_gso_max_segs)\n- [.get_gso_max_size()](IterableLinkAttrs::get_gso_max_size)\n- [.get_xdp()](IterableLinkAttrs::get_xdp)\n- [.get_event()](IterableLinkAttrs::get_event)\n- [.get_new_netnsid()](IterableLinkAttrs::get_new_netnsid)\n- [.get_target_netnsid()](IterableLinkAttrs::get_target_netnsid)\n- [.get_carrier_up_count()](IterableLinkAttrs::get_carrier_up_count)\n- [.get_carrier_down_count()](IterableLinkAttrs::get_carrier_down_count)\n- [.get_new_ifindex()](IterableLinkAttrs::get_new_ifindex)\n- [.get_min_mtu()](IterableLinkAttrs::get_min_mtu)\n- [.get_max_mtu()](IterableLinkAttrs::get_max_mtu)\n- [.get_prop_list()](IterableLinkAttrs::get_prop_list)\n- [.get_perm_address()](IterableLinkAttrs::get_perm_address)\n- [.get_proto_down_reason()](IterableLinkAttrs::get_proto_down_reason)\n- [.get_parent_dev_name()](IterableLinkAttrs::get_parent_dev_name)\n- [.get_parent_dev_bus_name()](IterableLinkAttrs::get_parent_dev_bus_name)\n- [.get_gro_max_size()](IterableLinkAttrs::get_gro_max_size)\n- [.get_tso_max_size()](IterableLinkAttrs::get_tso_max_size)\n- [.get_tso_max_segs()](IterableLinkAttrs::get_tso_max_segs)\n- [.get_allmulti()](IterableLinkAttrs::get_allmulti)\n- [.get_devlink_port()](IterableLinkAttrs::get_devlink_port)\n- [.get_gso_ipv4_max_size()](IterableLinkAttrs::get_gso_ipv4_max_size)\n- [.get_gro_ipv4_max_size()](IterableLinkAttrs::get_gro_ipv4_max_size)\n\n"]
22955#[derive(Debug)]
22956pub struct OpGetlinkDo<'r> {
22957 request: Request<'r>,
22958}
22959impl<'r> OpGetlinkDo<'r> {
22960 pub fn new(mut request: Request<'r>, header: &Ifinfomsg) -> Self {
22961 Self::write_header(request.buf_mut(), header);
22962 Self { request: request }
22963 }
22964 pub fn encode_request<'buf>(
22965 buf: &'buf mut Vec<u8>,
22966 header: &Ifinfomsg,
22967 ) -> PushLinkAttrs<&'buf mut Vec<u8>> {
22968 Self::write_header(buf, header);
22969 PushLinkAttrs::new(buf)
22970 }
22971 pub fn encode(&mut self) -> PushLinkAttrs<&mut Vec<u8>> {
22972 PushLinkAttrs::new(self.request.buf_mut())
22973 }
22974 pub fn into_encoder(self) -> PushLinkAttrs<RequestBuf<'r>> {
22975 PushLinkAttrs::new(self.request.buf)
22976 }
22977 pub fn decode_request<'a>(buf: &'a [u8]) -> (Ifinfomsg, IterableLinkAttrs<'a>) {
22978 let (header, attrs) = buf.split_at(buf.len().min(Ifinfomsg::len()));
22979 (
22980 Ifinfomsg::new_from_slice(header).unwrap_or_default(),
22981 IterableLinkAttrs::with_loc(attrs, buf.as_ptr() as usize),
22982 )
22983 }
22984 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Ifinfomsg) {
22985 prev.as_vec_mut().extend(header.as_slice());
22986 }
22987}
22988impl NetlinkRequest for OpGetlinkDo<'_> {
22989 fn protocol(&self) -> Protocol {
22990 Protocol::Raw {
22991 protonum: 0u16,
22992 request_type: 18u16,
22993 }
22994 }
22995 fn flags(&self) -> u16 {
22996 self.request.flags
22997 }
22998 fn payload(&self) -> &[u8] {
22999 self.request.buf()
23000 }
23001 type ReplyType<'buf> = (Ifinfomsg, IterableLinkAttrs<'buf>);
23002 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23003 Self::decode_request(buf)
23004 }
23005 fn lookup(
23006 buf: &[u8],
23007 offset: usize,
23008 missing_type: Option<u16>,
23009 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23010 Self::decode_request(buf)
23011 .1
23012 .lookup_attr(offset, missing_type)
23013 }
23014}
23015#[doc = "Set information about a link.\n\nRequest attributes:\n- [.push_address()](PushLinkAttrs::push_address)\n- [.push_broadcast()](PushLinkAttrs::push_broadcast)\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_mtu()](PushLinkAttrs::push_mtu)\n- [.push_link()](PushLinkAttrs::push_link)\n- [.push_qdisc()](PushLinkAttrs::push_qdisc)\n- [.push_stats()](PushLinkAttrs::push_stats)\n- [.push_master()](PushLinkAttrs::push_master)\n- [.push_wireless()](PushLinkAttrs::push_wireless)\n- [.push_protinfo()](PushLinkAttrs::push_protinfo)\n- [.push_txqlen()](PushLinkAttrs::push_txqlen)\n- [.push_map()](PushLinkAttrs::push_map)\n- [.push_weight()](PushLinkAttrs::push_weight)\n- [.push_operstate()](PushLinkAttrs::push_operstate)\n- [.push_linkmode()](PushLinkAttrs::push_linkmode)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_net_ns_pid()](PushLinkAttrs::push_net_ns_pid)\n- [.push_ifalias()](PushLinkAttrs::push_ifalias)\n- [.push_num_vf()](PushLinkAttrs::push_num_vf)\n- [.nested_vfinfo_list()](PushLinkAttrs::nested_vfinfo_list)\n- [.push_stats64()](PushLinkAttrs::push_stats64)\n- [.nested_vf_ports()](PushLinkAttrs::nested_vf_ports)\n- [.nested_port_self()](PushLinkAttrs::nested_port_self)\n- [.nested_af_spec()](PushLinkAttrs::nested_af_spec)\n- [.push_group()](PushLinkAttrs::push_group)\n- [.push_net_ns_fd()](PushLinkAttrs::push_net_ns_fd)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_promiscuity()](PushLinkAttrs::push_promiscuity)\n- [.push_num_tx_queues()](PushLinkAttrs::push_num_tx_queues)\n- [.push_num_rx_queues()](PushLinkAttrs::push_num_rx_queues)\n- [.push_carrier()](PushLinkAttrs::push_carrier)\n- [.push_phys_port_id()](PushLinkAttrs::push_phys_port_id)\n- [.push_carrier_changes()](PushLinkAttrs::push_carrier_changes)\n- [.push_phys_switch_id()](PushLinkAttrs::push_phys_switch_id)\n- [.push_link_netnsid()](PushLinkAttrs::push_link_netnsid)\n- [.push_phys_port_name()](PushLinkAttrs::push_phys_port_name)\n- [.push_proto_down()](PushLinkAttrs::push_proto_down)\n- [.push_gso_max_segs()](PushLinkAttrs::push_gso_max_segs)\n- [.push_gso_max_size()](PushLinkAttrs::push_gso_max_size)\n- [.nested_xdp()](PushLinkAttrs::nested_xdp)\n- [.push_event()](PushLinkAttrs::push_event)\n- [.push_new_netnsid()](PushLinkAttrs::push_new_netnsid)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_carrier_up_count()](PushLinkAttrs::push_carrier_up_count)\n- [.push_carrier_down_count()](PushLinkAttrs::push_carrier_down_count)\n- [.push_new_ifindex()](PushLinkAttrs::push_new_ifindex)\n- [.push_min_mtu()](PushLinkAttrs::push_min_mtu)\n- [.push_max_mtu()](PushLinkAttrs::push_max_mtu)\n- [.nested_prop_list()](PushLinkAttrs::nested_prop_list)\n- [.push_perm_address()](PushLinkAttrs::push_perm_address)\n- [.push_proto_down_reason()](PushLinkAttrs::push_proto_down_reason)\n- [.push_parent_dev_name()](PushLinkAttrs::push_parent_dev_name)\n- [.push_parent_dev_bus_name()](PushLinkAttrs::push_parent_dev_bus_name)\n- [.push_gro_max_size()](PushLinkAttrs::push_gro_max_size)\n- [.push_tso_max_size()](PushLinkAttrs::push_tso_max_size)\n- [.push_tso_max_segs()](PushLinkAttrs::push_tso_max_segs)\n- [.push_allmulti()](PushLinkAttrs::push_allmulti)\n- [.push_devlink_port()](PushLinkAttrs::push_devlink_port)\n- [.push_gso_ipv4_max_size()](PushLinkAttrs::push_gso_ipv4_max_size)\n- [.push_gro_ipv4_max_size()](PushLinkAttrs::push_gro_ipv4_max_size)\n\n"]
23016#[derive(Debug)]
23017pub struct OpSetlinkDo<'r> {
23018 request: Request<'r>,
23019}
23020impl<'r> OpSetlinkDo<'r> {
23021 pub fn new(mut request: Request<'r>, header: &Ifinfomsg) -> Self {
23022 Self::write_header(request.buf_mut(), header);
23023 Self { request: request }
23024 }
23025 pub fn encode_request<'buf>(
23026 buf: &'buf mut Vec<u8>,
23027 header: &Ifinfomsg,
23028 ) -> PushLinkAttrs<&'buf mut Vec<u8>> {
23029 Self::write_header(buf, header);
23030 PushLinkAttrs::new(buf)
23031 }
23032 pub fn encode(&mut self) -> PushLinkAttrs<&mut Vec<u8>> {
23033 PushLinkAttrs::new(self.request.buf_mut())
23034 }
23035 pub fn into_encoder(self) -> PushLinkAttrs<RequestBuf<'r>> {
23036 PushLinkAttrs::new(self.request.buf)
23037 }
23038 pub fn decode_request<'a>(buf: &'a [u8]) -> (Ifinfomsg, IterableLinkAttrs<'a>) {
23039 let (header, attrs) = buf.split_at(buf.len().min(Ifinfomsg::len()));
23040 (
23041 Ifinfomsg::new_from_slice(header).unwrap_or_default(),
23042 IterableLinkAttrs::with_loc(attrs, buf.as_ptr() as usize),
23043 )
23044 }
23045 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &Ifinfomsg) {
23046 prev.as_vec_mut().extend(header.as_slice());
23047 }
23048}
23049impl NetlinkRequest for OpSetlinkDo<'_> {
23050 fn protocol(&self) -> Protocol {
23051 Protocol::Raw {
23052 protonum: 0u16,
23053 request_type: 19u16,
23054 }
23055 }
23056 fn flags(&self) -> u16 {
23057 self.request.flags
23058 }
23059 fn payload(&self) -> &[u8] {
23060 self.request.buf()
23061 }
23062 type ReplyType<'buf> = (Ifinfomsg, IterableLinkAttrs<'buf>);
23063 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23064 Self::decode_request(buf)
23065 }
23066 fn lookup(
23067 buf: &[u8],
23068 offset: usize,
23069 missing_type: Option<u16>,
23070 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23071 Self::decode_request(buf)
23072 .1
23073 .lookup_attr(offset, missing_type)
23074 }
23075}
23076#[doc = "Get / dump link stats.\n\nReply attributes:\n- [.get_link_64()](IterableStatsAttrs::get_link_64)\n- [.get_link_xstats()](IterableStatsAttrs::get_link_xstats)\n- [.get_link_xstats_slave()](IterableStatsAttrs::get_link_xstats_slave)\n- [.get_link_offload_xstats()](IterableStatsAttrs::get_link_offload_xstats)\n- [.get_af_spec()](IterableStatsAttrs::get_af_spec)\n\n"]
23077#[derive(Debug)]
23078pub struct OpGetstatsDump<'r> {
23079 request: Request<'r>,
23080}
23081impl<'r> OpGetstatsDump<'r> {
23082 pub fn new(mut request: Request<'r>, header: &IfStatsMsg) -> Self {
23083 Self::write_header(request.buf_mut(), header);
23084 Self {
23085 request: request.set_dump(),
23086 }
23087 }
23088 pub fn encode_request<'buf>(
23089 buf: &'buf mut Vec<u8>,
23090 header: &IfStatsMsg,
23091 ) -> PushStatsAttrs<&'buf mut Vec<u8>> {
23092 Self::write_header(buf, header);
23093 PushStatsAttrs::new(buf)
23094 }
23095 pub fn encode(&mut self) -> PushStatsAttrs<&mut Vec<u8>> {
23096 PushStatsAttrs::new(self.request.buf_mut())
23097 }
23098 pub fn into_encoder(self) -> PushStatsAttrs<RequestBuf<'r>> {
23099 PushStatsAttrs::new(self.request.buf)
23100 }
23101 pub fn decode_request<'a>(buf: &'a [u8]) -> (IfStatsMsg, IterableStatsAttrs<'a>) {
23102 let (header, attrs) = buf.split_at(buf.len().min(IfStatsMsg::len()));
23103 (
23104 IfStatsMsg::new_from_slice(header).unwrap_or_default(),
23105 IterableStatsAttrs::with_loc(attrs, buf.as_ptr() as usize),
23106 )
23107 }
23108 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &IfStatsMsg) {
23109 prev.as_vec_mut().extend(header.as_slice());
23110 }
23111}
23112impl NetlinkRequest for OpGetstatsDump<'_> {
23113 fn protocol(&self) -> Protocol {
23114 Protocol::Raw {
23115 protonum: 0u16,
23116 request_type: 94u16,
23117 }
23118 }
23119 fn flags(&self) -> u16 {
23120 self.request.flags
23121 }
23122 fn payload(&self) -> &[u8] {
23123 self.request.buf()
23124 }
23125 type ReplyType<'buf> = (IfStatsMsg, IterableStatsAttrs<'buf>);
23126 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23127 Self::decode_request(buf)
23128 }
23129 fn lookup(
23130 buf: &[u8],
23131 offset: usize,
23132 missing_type: Option<u16>,
23133 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23134 Self::decode_request(buf)
23135 .1
23136 .lookup_attr(offset, missing_type)
23137 }
23138}
23139#[doc = "Get / dump link stats.\n\nReply attributes:\n- [.get_link_64()](IterableStatsAttrs::get_link_64)\n- [.get_link_xstats()](IterableStatsAttrs::get_link_xstats)\n- [.get_link_xstats_slave()](IterableStatsAttrs::get_link_xstats_slave)\n- [.get_link_offload_xstats()](IterableStatsAttrs::get_link_offload_xstats)\n- [.get_af_spec()](IterableStatsAttrs::get_af_spec)\n\n"]
23140#[derive(Debug)]
23141pub struct OpGetstatsDo<'r> {
23142 request: Request<'r>,
23143}
23144impl<'r> OpGetstatsDo<'r> {
23145 pub fn new(mut request: Request<'r>, header: &IfStatsMsg) -> Self {
23146 Self::write_header(request.buf_mut(), header);
23147 Self { request: request }
23148 }
23149 pub fn encode_request<'buf>(
23150 buf: &'buf mut Vec<u8>,
23151 header: &IfStatsMsg,
23152 ) -> PushStatsAttrs<&'buf mut Vec<u8>> {
23153 Self::write_header(buf, header);
23154 PushStatsAttrs::new(buf)
23155 }
23156 pub fn encode(&mut self) -> PushStatsAttrs<&mut Vec<u8>> {
23157 PushStatsAttrs::new(self.request.buf_mut())
23158 }
23159 pub fn into_encoder(self) -> PushStatsAttrs<RequestBuf<'r>> {
23160 PushStatsAttrs::new(self.request.buf)
23161 }
23162 pub fn decode_request<'a>(buf: &'a [u8]) -> (IfStatsMsg, IterableStatsAttrs<'a>) {
23163 let (header, attrs) = buf.split_at(buf.len().min(IfStatsMsg::len()));
23164 (
23165 IfStatsMsg::new_from_slice(header).unwrap_or_default(),
23166 IterableStatsAttrs::with_loc(attrs, buf.as_ptr() as usize),
23167 )
23168 }
23169 fn write_header<Prev: Pusher>(prev: &mut Prev, header: &IfStatsMsg) {
23170 prev.as_vec_mut().extend(header.as_slice());
23171 }
23172}
23173impl NetlinkRequest for OpGetstatsDo<'_> {
23174 fn protocol(&self) -> Protocol {
23175 Protocol::Raw {
23176 protonum: 0u16,
23177 request_type: 94u16,
23178 }
23179 }
23180 fn flags(&self) -> u16 {
23181 self.request.flags
23182 }
23183 fn payload(&self) -> &[u8] {
23184 self.request.buf()
23185 }
23186 type ReplyType<'buf> = (IfStatsMsg, IterableStatsAttrs<'buf>);
23187 fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
23188 Self::decode_request(buf)
23189 }
23190 fn lookup(
23191 buf: &[u8],
23192 offset: usize,
23193 missing_type: Option<u16>,
23194 ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
23195 Self::decode_request(buf)
23196 .1
23197 .lookup_attr(offset, missing_type)
23198 }
23199}
23200#[derive(Debug)]
23201pub struct ChainedFinal<'a> {
23202 inner: Chained<'a>,
23203}
23204#[derive(Debug)]
23205pub struct Chained<'a> {
23206 buf: RequestBuf<'a>,
23207 first_seq: u32,
23208 lookups: Vec<(&'static str, LookupFn)>,
23209 last_header_offset: usize,
23210 last_kind: Option<RequestInfo>,
23211}
23212impl<'a> ChainedFinal<'a> {
23213 pub fn into_chained(self) -> Chained<'a> {
23214 self.inner
23215 }
23216 pub fn buf(&self) -> &Vec<u8> {
23217 self.inner.buf()
23218 }
23219 pub fn buf_mut(&mut self) -> &mut Vec<u8> {
23220 self.inner.buf_mut()
23221 }
23222 fn get_index(&self, seq: u32) -> Option<u32> {
23223 let min = self.inner.first_seq;
23224 let max = min.wrapping_add(self.inner.lookups.len() as u32);
23225 return if min <= max {
23226 (min..max).contains(&seq).then(|| seq - min)
23227 } else if min <= seq {
23228 Some(seq - min)
23229 } else if seq < max {
23230 Some(u32::MAX - min + seq)
23231 } else {
23232 None
23233 };
23234 }
23235}
23236impl crate::traits::NetlinkChained for ChainedFinal<'_> {
23237 fn protonum(&self) -> u16 {
23238 PROTONUM
23239 }
23240 fn payload(&self) -> &[u8] {
23241 self.buf()
23242 }
23243 fn chain_len(&self) -> usize {
23244 self.inner.lookups.len()
23245 }
23246 fn get_index(&self, seq: u32) -> Option<usize> {
23247 self.get_index(seq).map(|n| n as usize)
23248 }
23249 fn name(&self, index: usize) -> &'static str {
23250 self.inner.lookups[index].0
23251 }
23252 fn lookup(&self, index: usize) -> LookupFn {
23253 self.inner.lookups[index].1
23254 }
23255}
23256impl Chained<'static> {
23257 pub fn new(first_seq: u32) -> Self {
23258 Self::new_from_buf(Vec::new(), first_seq)
23259 }
23260 pub fn new_from_buf(buf: Vec<u8>, first_seq: u32) -> Self {
23261 Self {
23262 buf: RequestBuf::Own(buf),
23263 first_seq,
23264 lookups: Vec::new(),
23265 last_header_offset: 0,
23266 last_kind: None,
23267 }
23268 }
23269 pub fn into_buf(self) -> Vec<u8> {
23270 match self.buf {
23271 RequestBuf::Own(buf) => buf,
23272 _ => unreachable!(),
23273 }
23274 }
23275}
23276impl<'a> Chained<'a> {
23277 pub fn new_with_buf(buf: &'a mut Vec<u8>, first_seq: u32) -> Self {
23278 Self {
23279 buf: RequestBuf::Ref(buf),
23280 first_seq,
23281 lookups: Vec::new(),
23282 last_header_offset: 0,
23283 last_kind: None,
23284 }
23285 }
23286 pub fn finalize(mut self) -> ChainedFinal<'a> {
23287 self.update_header();
23288 ChainedFinal { inner: self }
23289 }
23290 pub fn request(&mut self) -> Request<'_> {
23291 self.update_header();
23292 self.last_header_offset = self.buf().len();
23293 self.buf_mut().extend_from_slice(Nlmsghdr::new().as_slice());
23294 let mut request = Request::new_extend(self.buf.buf_mut());
23295 self.last_kind = None;
23296 request.writeback = Some(&mut self.last_kind);
23297 request
23298 }
23299 pub fn buf(&self) -> &Vec<u8> {
23300 self.buf.buf()
23301 }
23302 pub fn buf_mut(&mut self) -> &mut Vec<u8> {
23303 self.buf.buf_mut()
23304 }
23305 fn update_header(&mut self) {
23306 let Some(RequestInfo {
23307 protocol,
23308 flags,
23309 name,
23310 lookup,
23311 }) = self.last_kind
23312 else {
23313 if !self.buf().is_empty() {
23314 assert_eq!(self.last_header_offset + Nlmsghdr::len(), self.buf().len());
23315 self.buf.buf_mut().truncate(self.last_header_offset);
23316 }
23317 return;
23318 };
23319 let header_offset = self.last_header_offset;
23320 let request_type = match protocol {
23321 Protocol::Raw { request_type, .. } => request_type,
23322 Protocol::Generic(_) => unreachable!(),
23323 };
23324 let index = self.lookups.len();
23325 let seq = self.first_seq.wrapping_add(index as u32);
23326 self.lookups.push((name, lookup));
23327 let buf = self.buf_mut();
23328 align(buf);
23329 let header = Nlmsghdr {
23330 len: (buf.len() - header_offset) as u32,
23331 r#type: request_type,
23332 flags: flags | consts::NLM_F_REQUEST as u16 | consts::NLM_F_ACK as u16,
23333 seq,
23334 pid: 0,
23335 };
23336 buf[header_offset..(header_offset + 16)].clone_from_slice(header.as_slice());
23337 }
23338}
23339use crate::traits::LookupFn;
23340use crate::utils::RequestBuf;
23341#[derive(Debug)]
23342pub struct Request<'buf> {
23343 buf: RequestBuf<'buf>,
23344 flags: u16,
23345 writeback: Option<&'buf mut Option<RequestInfo>>,
23346}
23347#[allow(unused)]
23348#[derive(Debug, Clone)]
23349pub struct RequestInfo {
23350 protocol: Protocol,
23351 flags: u16,
23352 name: &'static str,
23353 lookup: LookupFn,
23354}
23355impl Request<'static> {
23356 pub fn new() -> Self {
23357 Self::new_from_buf(Vec::new())
23358 }
23359 pub fn new_from_buf(buf: Vec<u8>) -> Self {
23360 Self {
23361 flags: 0,
23362 buf: RequestBuf::Own(buf),
23363 writeback: None,
23364 }
23365 }
23366 pub fn into_buf(self) -> Vec<u8> {
23367 match self.buf {
23368 RequestBuf::Own(buf) => buf,
23369 _ => unreachable!(),
23370 }
23371 }
23372}
23373impl<'buf> Request<'buf> {
23374 pub fn new_with_buf(buf: &'buf mut Vec<u8>) -> Self {
23375 buf.clear();
23376 Self::new_extend(buf)
23377 }
23378 pub fn new_extend(buf: &'buf mut Vec<u8>) -> Self {
23379 Self {
23380 flags: 0,
23381 buf: RequestBuf::Ref(buf),
23382 writeback: None,
23383 }
23384 }
23385 fn do_writeback(&mut self, protocol: Protocol, name: &'static str, lookup: LookupFn) {
23386 let Some(writeback) = &mut self.writeback else {
23387 return;
23388 };
23389 **writeback = Some(RequestInfo {
23390 protocol,
23391 flags: self.flags,
23392 name,
23393 lookup,
23394 })
23395 }
23396 pub fn buf(&self) -> &Vec<u8> {
23397 self.buf.buf()
23398 }
23399 pub fn buf_mut(&mut self) -> &mut Vec<u8> {
23400 self.buf.buf_mut()
23401 }
23402 #[doc = "Set `NLM_F_CREATE` flag"]
23403 pub fn set_create(mut self) -> Self {
23404 self.flags |= consts::NLM_F_CREATE as u16;
23405 self
23406 }
23407 #[doc = "Set `NLM_F_EXCL` flag"]
23408 pub fn set_excl(mut self) -> Self {
23409 self.flags |= consts::NLM_F_EXCL as u16;
23410 self
23411 }
23412 #[doc = "Set `NLM_F_REPLACE` flag"]
23413 pub fn set_replace(mut self) -> Self {
23414 self.flags |= consts::NLM_F_REPLACE as u16;
23415 self
23416 }
23417 #[doc = "Set `NLM_F_CREATE` and `NLM_F_REPLACE` flag"]
23418 pub fn set_change(self) -> Self {
23419 self.set_create().set_replace()
23420 }
23421 #[doc = "Set `NLM_F_APPEND` flag"]
23422 pub fn set_append(mut self) -> Self {
23423 self.flags |= consts::NLM_F_APPEND as u16;
23424 self
23425 }
23426 #[doc = "Set `self.flags |= flags`"]
23427 pub fn set_flags(mut self, flags: u16) -> Self {
23428 self.flags |= flags;
23429 self
23430 }
23431 #[doc = "Set `self.flags ^= self.flags & flags`"]
23432 pub fn unset_flags(mut self, flags: u16) -> Self {
23433 self.flags ^= self.flags & flags;
23434 self
23435 }
23436 #[doc = "Set `NLM_F_DUMP` flag"]
23437 fn set_dump(mut self) -> Self {
23438 self.flags |= consts::NLM_F_DUMP as u16;
23439 self
23440 }
23441 #[doc = "Create a new link.\n\nRequest attributes:\n- [.push_address()](PushLinkAttrs::push_address)\n- [.push_broadcast()](PushLinkAttrs::push_broadcast)\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_mtu()](PushLinkAttrs::push_mtu)\n- [.push_txqlen()](PushLinkAttrs::push_txqlen)\n- [.push_operstate()](PushLinkAttrs::push_operstate)\n- [.push_linkmode()](PushLinkAttrs::push_linkmode)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_net_ns_pid()](PushLinkAttrs::push_net_ns_pid)\n- [.nested_af_spec()](PushLinkAttrs::nested_af_spec)\n- [.push_group()](PushLinkAttrs::push_group)\n- [.push_net_ns_fd()](PushLinkAttrs::push_net_ns_fd)\n- [.push_num_tx_queues()](PushLinkAttrs::push_num_tx_queues)\n- [.push_num_rx_queues()](PushLinkAttrs::push_num_rx_queues)\n- [.push_link_netnsid()](PushLinkAttrs::push_link_netnsid)\n- [.push_gso_max_segs()](PushLinkAttrs::push_gso_max_segs)\n- [.push_gso_max_size()](PushLinkAttrs::push_gso_max_size)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_gro_max_size()](PushLinkAttrs::push_gro_max_size)\n- [.push_gso_ipv4_max_size()](PushLinkAttrs::push_gso_ipv4_max_size)\n- [.push_gro_ipv4_max_size()](PushLinkAttrs::push_gro_ipv4_max_size)\n\n"]
23442 pub fn op_newlink_do(self, header: &Ifinfomsg) -> OpNewlinkDo<'buf> {
23443 let mut res = OpNewlinkDo::new(self, header);
23444 res.request
23445 .do_writeback(res.protocol(), "op-newlink-do", OpNewlinkDo::lookup);
23446 res
23447 }
23448 #[doc = "Delete an existing link.\n\nRequest attributes:\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n\n"]
23449 pub fn op_dellink_do(self, header: &Ifinfomsg) -> OpDellinkDo<'buf> {
23450 let mut res = OpDellinkDo::new(self, header);
23451 res.request
23452 .do_writeback(res.protocol(), "op-dellink-do", OpDellinkDo::lookup);
23453 res
23454 }
23455 #[doc = "Get / dump information about a link.\n\nRequest attributes:\n- [.push_master()](PushLinkAttrs::push_master)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n\nReply attributes:\n- [.get_address()](IterableLinkAttrs::get_address)\n- [.get_broadcast()](IterableLinkAttrs::get_broadcast)\n- [.get_ifname()](IterableLinkAttrs::get_ifname)\n- [.get_mtu()](IterableLinkAttrs::get_mtu)\n- [.get_link()](IterableLinkAttrs::get_link)\n- [.get_qdisc()](IterableLinkAttrs::get_qdisc)\n- [.get_stats()](IterableLinkAttrs::get_stats)\n- [.get_master()](IterableLinkAttrs::get_master)\n- [.get_wireless()](IterableLinkAttrs::get_wireless)\n- [.get_protinfo()](IterableLinkAttrs::get_protinfo)\n- [.get_txqlen()](IterableLinkAttrs::get_txqlen)\n- [.get_map()](IterableLinkAttrs::get_map)\n- [.get_weight()](IterableLinkAttrs::get_weight)\n- [.get_operstate()](IterableLinkAttrs::get_operstate)\n- [.get_linkmode()](IterableLinkAttrs::get_linkmode)\n- [.get_linkinfo()](IterableLinkAttrs::get_linkinfo)\n- [.get_net_ns_pid()](IterableLinkAttrs::get_net_ns_pid)\n- [.get_ifalias()](IterableLinkAttrs::get_ifalias)\n- [.get_num_vf()](IterableLinkAttrs::get_num_vf)\n- [.get_vfinfo_list()](IterableLinkAttrs::get_vfinfo_list)\n- [.get_stats64()](IterableLinkAttrs::get_stats64)\n- [.get_vf_ports()](IterableLinkAttrs::get_vf_ports)\n- [.get_port_self()](IterableLinkAttrs::get_port_self)\n- [.get_af_spec()](IterableLinkAttrs::get_af_spec)\n- [.get_group()](IterableLinkAttrs::get_group)\n- [.get_net_ns_fd()](IterableLinkAttrs::get_net_ns_fd)\n- [.get_ext_mask()](IterableLinkAttrs::get_ext_mask)\n- [.get_promiscuity()](IterableLinkAttrs::get_promiscuity)\n- [.get_num_tx_queues()](IterableLinkAttrs::get_num_tx_queues)\n- [.get_num_rx_queues()](IterableLinkAttrs::get_num_rx_queues)\n- [.get_carrier()](IterableLinkAttrs::get_carrier)\n- [.get_phys_port_id()](IterableLinkAttrs::get_phys_port_id)\n- [.get_carrier_changes()](IterableLinkAttrs::get_carrier_changes)\n- [.get_phys_switch_id()](IterableLinkAttrs::get_phys_switch_id)\n- [.get_link_netnsid()](IterableLinkAttrs::get_link_netnsid)\n- [.get_phys_port_name()](IterableLinkAttrs::get_phys_port_name)\n- [.get_proto_down()](IterableLinkAttrs::get_proto_down)\n- [.get_gso_max_segs()](IterableLinkAttrs::get_gso_max_segs)\n- [.get_gso_max_size()](IterableLinkAttrs::get_gso_max_size)\n- [.get_xdp()](IterableLinkAttrs::get_xdp)\n- [.get_event()](IterableLinkAttrs::get_event)\n- [.get_new_netnsid()](IterableLinkAttrs::get_new_netnsid)\n- [.get_target_netnsid()](IterableLinkAttrs::get_target_netnsid)\n- [.get_carrier_up_count()](IterableLinkAttrs::get_carrier_up_count)\n- [.get_carrier_down_count()](IterableLinkAttrs::get_carrier_down_count)\n- [.get_new_ifindex()](IterableLinkAttrs::get_new_ifindex)\n- [.get_min_mtu()](IterableLinkAttrs::get_min_mtu)\n- [.get_max_mtu()](IterableLinkAttrs::get_max_mtu)\n- [.get_prop_list()](IterableLinkAttrs::get_prop_list)\n- [.get_perm_address()](IterableLinkAttrs::get_perm_address)\n- [.get_proto_down_reason()](IterableLinkAttrs::get_proto_down_reason)\n- [.get_parent_dev_name()](IterableLinkAttrs::get_parent_dev_name)\n- [.get_parent_dev_bus_name()](IterableLinkAttrs::get_parent_dev_bus_name)\n- [.get_gro_max_size()](IterableLinkAttrs::get_gro_max_size)\n- [.get_tso_max_size()](IterableLinkAttrs::get_tso_max_size)\n- [.get_tso_max_segs()](IterableLinkAttrs::get_tso_max_segs)\n- [.get_allmulti()](IterableLinkAttrs::get_allmulti)\n- [.get_devlink_port()](IterableLinkAttrs::get_devlink_port)\n- [.get_gso_ipv4_max_size()](IterableLinkAttrs::get_gso_ipv4_max_size)\n- [.get_gro_ipv4_max_size()](IterableLinkAttrs::get_gro_ipv4_max_size)\n\n"]
23456 pub fn op_getlink_dump(self, header: &Ifinfomsg) -> OpGetlinkDump<'buf> {
23457 let mut res = OpGetlinkDump::new(self, header);
23458 res.request
23459 .do_writeback(res.protocol(), "op-getlink-dump", OpGetlinkDump::lookup);
23460 res
23461 }
23462 #[doc = "Get / dump information about a link.\n\nRequest attributes:\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_alt_ifname()](PushLinkAttrs::push_alt_ifname)\n\nReply attributes:\n- [.get_address()](IterableLinkAttrs::get_address)\n- [.get_broadcast()](IterableLinkAttrs::get_broadcast)\n- [.get_ifname()](IterableLinkAttrs::get_ifname)\n- [.get_mtu()](IterableLinkAttrs::get_mtu)\n- [.get_link()](IterableLinkAttrs::get_link)\n- [.get_qdisc()](IterableLinkAttrs::get_qdisc)\n- [.get_stats()](IterableLinkAttrs::get_stats)\n- [.get_master()](IterableLinkAttrs::get_master)\n- [.get_wireless()](IterableLinkAttrs::get_wireless)\n- [.get_protinfo()](IterableLinkAttrs::get_protinfo)\n- [.get_txqlen()](IterableLinkAttrs::get_txqlen)\n- [.get_map()](IterableLinkAttrs::get_map)\n- [.get_weight()](IterableLinkAttrs::get_weight)\n- [.get_operstate()](IterableLinkAttrs::get_operstate)\n- [.get_linkmode()](IterableLinkAttrs::get_linkmode)\n- [.get_linkinfo()](IterableLinkAttrs::get_linkinfo)\n- [.get_net_ns_pid()](IterableLinkAttrs::get_net_ns_pid)\n- [.get_ifalias()](IterableLinkAttrs::get_ifalias)\n- [.get_num_vf()](IterableLinkAttrs::get_num_vf)\n- [.get_vfinfo_list()](IterableLinkAttrs::get_vfinfo_list)\n- [.get_stats64()](IterableLinkAttrs::get_stats64)\n- [.get_vf_ports()](IterableLinkAttrs::get_vf_ports)\n- [.get_port_self()](IterableLinkAttrs::get_port_self)\n- [.get_af_spec()](IterableLinkAttrs::get_af_spec)\n- [.get_group()](IterableLinkAttrs::get_group)\n- [.get_net_ns_fd()](IterableLinkAttrs::get_net_ns_fd)\n- [.get_ext_mask()](IterableLinkAttrs::get_ext_mask)\n- [.get_promiscuity()](IterableLinkAttrs::get_promiscuity)\n- [.get_num_tx_queues()](IterableLinkAttrs::get_num_tx_queues)\n- [.get_num_rx_queues()](IterableLinkAttrs::get_num_rx_queues)\n- [.get_carrier()](IterableLinkAttrs::get_carrier)\n- [.get_phys_port_id()](IterableLinkAttrs::get_phys_port_id)\n- [.get_carrier_changes()](IterableLinkAttrs::get_carrier_changes)\n- [.get_phys_switch_id()](IterableLinkAttrs::get_phys_switch_id)\n- [.get_link_netnsid()](IterableLinkAttrs::get_link_netnsid)\n- [.get_phys_port_name()](IterableLinkAttrs::get_phys_port_name)\n- [.get_proto_down()](IterableLinkAttrs::get_proto_down)\n- [.get_gso_max_segs()](IterableLinkAttrs::get_gso_max_segs)\n- [.get_gso_max_size()](IterableLinkAttrs::get_gso_max_size)\n- [.get_xdp()](IterableLinkAttrs::get_xdp)\n- [.get_event()](IterableLinkAttrs::get_event)\n- [.get_new_netnsid()](IterableLinkAttrs::get_new_netnsid)\n- [.get_target_netnsid()](IterableLinkAttrs::get_target_netnsid)\n- [.get_carrier_up_count()](IterableLinkAttrs::get_carrier_up_count)\n- [.get_carrier_down_count()](IterableLinkAttrs::get_carrier_down_count)\n- [.get_new_ifindex()](IterableLinkAttrs::get_new_ifindex)\n- [.get_min_mtu()](IterableLinkAttrs::get_min_mtu)\n- [.get_max_mtu()](IterableLinkAttrs::get_max_mtu)\n- [.get_prop_list()](IterableLinkAttrs::get_prop_list)\n- [.get_perm_address()](IterableLinkAttrs::get_perm_address)\n- [.get_proto_down_reason()](IterableLinkAttrs::get_proto_down_reason)\n- [.get_parent_dev_name()](IterableLinkAttrs::get_parent_dev_name)\n- [.get_parent_dev_bus_name()](IterableLinkAttrs::get_parent_dev_bus_name)\n- [.get_gro_max_size()](IterableLinkAttrs::get_gro_max_size)\n- [.get_tso_max_size()](IterableLinkAttrs::get_tso_max_size)\n- [.get_tso_max_segs()](IterableLinkAttrs::get_tso_max_segs)\n- [.get_allmulti()](IterableLinkAttrs::get_allmulti)\n- [.get_devlink_port()](IterableLinkAttrs::get_devlink_port)\n- [.get_gso_ipv4_max_size()](IterableLinkAttrs::get_gso_ipv4_max_size)\n- [.get_gro_ipv4_max_size()](IterableLinkAttrs::get_gro_ipv4_max_size)\n\n"]
23463 pub fn op_getlink_do(self, header: &Ifinfomsg) -> OpGetlinkDo<'buf> {
23464 let mut res = OpGetlinkDo::new(self, header);
23465 res.request
23466 .do_writeback(res.protocol(), "op-getlink-do", OpGetlinkDo::lookup);
23467 res
23468 }
23469 #[doc = "Set information about a link.\n\nRequest attributes:\n- [.push_address()](PushLinkAttrs::push_address)\n- [.push_broadcast()](PushLinkAttrs::push_broadcast)\n- [.push_ifname()](PushLinkAttrs::push_ifname)\n- [.push_mtu()](PushLinkAttrs::push_mtu)\n- [.push_link()](PushLinkAttrs::push_link)\n- [.push_qdisc()](PushLinkAttrs::push_qdisc)\n- [.push_stats()](PushLinkAttrs::push_stats)\n- [.push_master()](PushLinkAttrs::push_master)\n- [.push_wireless()](PushLinkAttrs::push_wireless)\n- [.push_protinfo()](PushLinkAttrs::push_protinfo)\n- [.push_txqlen()](PushLinkAttrs::push_txqlen)\n- [.push_map()](PushLinkAttrs::push_map)\n- [.push_weight()](PushLinkAttrs::push_weight)\n- [.push_operstate()](PushLinkAttrs::push_operstate)\n- [.push_linkmode()](PushLinkAttrs::push_linkmode)\n- [.nested_linkinfo()](PushLinkAttrs::nested_linkinfo)\n- [.push_net_ns_pid()](PushLinkAttrs::push_net_ns_pid)\n- [.push_ifalias()](PushLinkAttrs::push_ifalias)\n- [.push_num_vf()](PushLinkAttrs::push_num_vf)\n- [.nested_vfinfo_list()](PushLinkAttrs::nested_vfinfo_list)\n- [.push_stats64()](PushLinkAttrs::push_stats64)\n- [.nested_vf_ports()](PushLinkAttrs::nested_vf_ports)\n- [.nested_port_self()](PushLinkAttrs::nested_port_self)\n- [.nested_af_spec()](PushLinkAttrs::nested_af_spec)\n- [.push_group()](PushLinkAttrs::push_group)\n- [.push_net_ns_fd()](PushLinkAttrs::push_net_ns_fd)\n- [.push_ext_mask()](PushLinkAttrs::push_ext_mask)\n- [.push_promiscuity()](PushLinkAttrs::push_promiscuity)\n- [.push_num_tx_queues()](PushLinkAttrs::push_num_tx_queues)\n- [.push_num_rx_queues()](PushLinkAttrs::push_num_rx_queues)\n- [.push_carrier()](PushLinkAttrs::push_carrier)\n- [.push_phys_port_id()](PushLinkAttrs::push_phys_port_id)\n- [.push_carrier_changes()](PushLinkAttrs::push_carrier_changes)\n- [.push_phys_switch_id()](PushLinkAttrs::push_phys_switch_id)\n- [.push_link_netnsid()](PushLinkAttrs::push_link_netnsid)\n- [.push_phys_port_name()](PushLinkAttrs::push_phys_port_name)\n- [.push_proto_down()](PushLinkAttrs::push_proto_down)\n- [.push_gso_max_segs()](PushLinkAttrs::push_gso_max_segs)\n- [.push_gso_max_size()](PushLinkAttrs::push_gso_max_size)\n- [.nested_xdp()](PushLinkAttrs::nested_xdp)\n- [.push_event()](PushLinkAttrs::push_event)\n- [.push_new_netnsid()](PushLinkAttrs::push_new_netnsid)\n- [.push_target_netnsid()](PushLinkAttrs::push_target_netnsid)\n- [.push_carrier_up_count()](PushLinkAttrs::push_carrier_up_count)\n- [.push_carrier_down_count()](PushLinkAttrs::push_carrier_down_count)\n- [.push_new_ifindex()](PushLinkAttrs::push_new_ifindex)\n- [.push_min_mtu()](PushLinkAttrs::push_min_mtu)\n- [.push_max_mtu()](PushLinkAttrs::push_max_mtu)\n- [.nested_prop_list()](PushLinkAttrs::nested_prop_list)\n- [.push_perm_address()](PushLinkAttrs::push_perm_address)\n- [.push_proto_down_reason()](PushLinkAttrs::push_proto_down_reason)\n- [.push_parent_dev_name()](PushLinkAttrs::push_parent_dev_name)\n- [.push_parent_dev_bus_name()](PushLinkAttrs::push_parent_dev_bus_name)\n- [.push_gro_max_size()](PushLinkAttrs::push_gro_max_size)\n- [.push_tso_max_size()](PushLinkAttrs::push_tso_max_size)\n- [.push_tso_max_segs()](PushLinkAttrs::push_tso_max_segs)\n- [.push_allmulti()](PushLinkAttrs::push_allmulti)\n- [.push_devlink_port()](PushLinkAttrs::push_devlink_port)\n- [.push_gso_ipv4_max_size()](PushLinkAttrs::push_gso_ipv4_max_size)\n- [.push_gro_ipv4_max_size()](PushLinkAttrs::push_gro_ipv4_max_size)\n\n"]
23470 pub fn op_setlink_do(self, header: &Ifinfomsg) -> OpSetlinkDo<'buf> {
23471 let mut res = OpSetlinkDo::new(self, header);
23472 res.request
23473 .do_writeback(res.protocol(), "op-setlink-do", OpSetlinkDo::lookup);
23474 res
23475 }
23476 #[doc = "Get / dump link stats.\n\nReply attributes:\n- [.get_link_64()](IterableStatsAttrs::get_link_64)\n- [.get_link_xstats()](IterableStatsAttrs::get_link_xstats)\n- [.get_link_xstats_slave()](IterableStatsAttrs::get_link_xstats_slave)\n- [.get_link_offload_xstats()](IterableStatsAttrs::get_link_offload_xstats)\n- [.get_af_spec()](IterableStatsAttrs::get_af_spec)\n\n"]
23477 pub fn op_getstats_dump(self, header: &IfStatsMsg) -> OpGetstatsDump<'buf> {
23478 let mut res = OpGetstatsDump::new(self, header);
23479 res.request
23480 .do_writeback(res.protocol(), "op-getstats-dump", OpGetstatsDump::lookup);
23481 res
23482 }
23483 #[doc = "Get / dump link stats.\n\nReply attributes:\n- [.get_link_64()](IterableStatsAttrs::get_link_64)\n- [.get_link_xstats()](IterableStatsAttrs::get_link_xstats)\n- [.get_link_xstats_slave()](IterableStatsAttrs::get_link_xstats_slave)\n- [.get_link_offload_xstats()](IterableStatsAttrs::get_link_offload_xstats)\n- [.get_af_spec()](IterableStatsAttrs::get_af_spec)\n\n"]
23484 pub fn op_getstats_do(self, header: &IfStatsMsg) -> OpGetstatsDo<'buf> {
23485 let mut res = OpGetstatsDo::new(self, header);
23486 res.request
23487 .do_writeback(res.protocol(), "op-getstats-do", OpGetstatsDo::lookup);
23488 res
23489 }
23490}
23491#[cfg(test)]
23492mod generated_tests {
23493 use super::*;
23494 #[test]
23495 fn tests() {
23496 let _ = IterableLinkAttrs::get_address;
23497 let _ = IterableLinkAttrs::get_af_spec;
23498 let _ = IterableLinkAttrs::get_allmulti;
23499 let _ = IterableLinkAttrs::get_broadcast;
23500 let _ = IterableLinkAttrs::get_carrier;
23501 let _ = IterableLinkAttrs::get_carrier_changes;
23502 let _ = IterableLinkAttrs::get_carrier_down_count;
23503 let _ = IterableLinkAttrs::get_carrier_up_count;
23504 let _ = IterableLinkAttrs::get_devlink_port;
23505 let _ = IterableLinkAttrs::get_event;
23506 let _ = IterableLinkAttrs::get_ext_mask;
23507 let _ = IterableLinkAttrs::get_gro_ipv4_max_size;
23508 let _ = IterableLinkAttrs::get_gro_max_size;
23509 let _ = IterableLinkAttrs::get_group;
23510 let _ = IterableLinkAttrs::get_gso_ipv4_max_size;
23511 let _ = IterableLinkAttrs::get_gso_max_segs;
23512 let _ = IterableLinkAttrs::get_gso_max_size;
23513 let _ = IterableLinkAttrs::get_ifalias;
23514 let _ = IterableLinkAttrs::get_ifname;
23515 let _ = IterableLinkAttrs::get_link;
23516 let _ = IterableLinkAttrs::get_link_netnsid;
23517 let _ = IterableLinkAttrs::get_linkinfo;
23518 let _ = IterableLinkAttrs::get_linkmode;
23519 let _ = IterableLinkAttrs::get_map;
23520 let _ = IterableLinkAttrs::get_master;
23521 let _ = IterableLinkAttrs::get_max_mtu;
23522 let _ = IterableLinkAttrs::get_min_mtu;
23523 let _ = IterableLinkAttrs::get_mtu;
23524 let _ = IterableLinkAttrs::get_net_ns_fd;
23525 let _ = IterableLinkAttrs::get_net_ns_pid;
23526 let _ = IterableLinkAttrs::get_new_ifindex;
23527 let _ = IterableLinkAttrs::get_new_netnsid;
23528 let _ = IterableLinkAttrs::get_num_rx_queues;
23529 let _ = IterableLinkAttrs::get_num_tx_queues;
23530 let _ = IterableLinkAttrs::get_num_vf;
23531 let _ = IterableLinkAttrs::get_operstate;
23532 let _ = IterableLinkAttrs::get_parent_dev_bus_name;
23533 let _ = IterableLinkAttrs::get_parent_dev_name;
23534 let _ = IterableLinkAttrs::get_perm_address;
23535 let _ = IterableLinkAttrs::get_phys_port_id;
23536 let _ = IterableLinkAttrs::get_phys_port_name;
23537 let _ = IterableLinkAttrs::get_phys_switch_id;
23538 let _ = IterableLinkAttrs::get_port_self;
23539 let _ = IterableLinkAttrs::get_promiscuity;
23540 let _ = IterableLinkAttrs::get_prop_list;
23541 let _ = IterableLinkAttrs::get_protinfo;
23542 let _ = IterableLinkAttrs::get_proto_down;
23543 let _ = IterableLinkAttrs::get_proto_down_reason;
23544 let _ = IterableLinkAttrs::get_qdisc;
23545 let _ = IterableLinkAttrs::get_stats64;
23546 let _ = IterableLinkAttrs::get_stats;
23547 let _ = IterableLinkAttrs::get_target_netnsid;
23548 let _ = IterableLinkAttrs::get_tso_max_segs;
23549 let _ = IterableLinkAttrs::get_tso_max_size;
23550 let _ = IterableLinkAttrs::get_txqlen;
23551 let _ = IterableLinkAttrs::get_vf_ports;
23552 let _ = IterableLinkAttrs::get_vfinfo_list;
23553 let _ = IterableLinkAttrs::get_weight;
23554 let _ = IterableLinkAttrs::get_wireless;
23555 let _ = IterableLinkAttrs::get_xdp;
23556 let _ = IterableStatsAttrs::get_af_spec;
23557 let _ = IterableStatsAttrs::get_link_64;
23558 let _ = IterableStatsAttrs::get_link_offload_xstats;
23559 let _ = IterableStatsAttrs::get_link_xstats;
23560 let _ = IterableStatsAttrs::get_link_xstats_slave;
23561 let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_af_spec;
23562 let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_linkinfo;
23563 let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_port_self;
23564 let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_prop_list;
23565 let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_vf_ports;
23566 let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_vfinfo_list;
23567 let _ = PushLinkAttrs::<&mut Vec<u8>>::nested_xdp;
23568 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_address;
23569 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_allmulti;
23570 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_alt_ifname;
23571 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_broadcast;
23572 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_carrier;
23573 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_carrier_changes;
23574 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_carrier_down_count;
23575 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_carrier_up_count;
23576 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_devlink_port;
23577 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_event;
23578 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_ext_mask;
23579 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_gro_ipv4_max_size;
23580 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_gro_max_size;
23581 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_group;
23582 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_gso_ipv4_max_size;
23583 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_gso_max_segs;
23584 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_gso_max_size;
23585 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_ifalias;
23586 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_ifname;
23587 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_link;
23588 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_link_netnsid;
23589 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_linkmode;
23590 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_map;
23591 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_master;
23592 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_max_mtu;
23593 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_min_mtu;
23594 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_mtu;
23595 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_net_ns_fd;
23596 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_net_ns_pid;
23597 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_new_ifindex;
23598 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_new_netnsid;
23599 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_num_rx_queues;
23600 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_num_tx_queues;
23601 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_num_vf;
23602 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_operstate;
23603 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_parent_dev_bus_name;
23604 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_parent_dev_name;
23605 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_perm_address;
23606 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_phys_port_id;
23607 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_phys_port_name;
23608 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_phys_switch_id;
23609 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_promiscuity;
23610 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_protinfo;
23611 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_proto_down;
23612 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_proto_down_reason;
23613 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_qdisc;
23614 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_stats64;
23615 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_stats;
23616 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_target_netnsid;
23617 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_tso_max_segs;
23618 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_tso_max_size;
23619 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_txqlen;
23620 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_weight;
23621 let _ = PushLinkAttrs::<&mut Vec<u8>>::push_wireless;
23622 }
23623}