Skip to main content

fidl_fuchsia_hardware_network_common/
fidl_fuchsia_hardware_network_common.rs

1// WARNING: This file is machine generated by fidlgen.
2
3#![warn(clippy::all)]
4#![allow(unused_parens, unused_mut, unused_imports, nonstandard_style)]
5
6use bitflags::bitflags;
7use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
8use futures::future::{self, MaybeDone, TryFutureExt};
9use zx_status;
10
11/// The base identifier of a port within a device. Always less than
12/// [`MAX_PORTS`].
13pub type BasePortId = u8;
14
15/// VMO identifier.
16///
17/// VMO identifiers are always in the range [0, [`MAX_DATA_VMOS`]).
18///
19/// VMO identifiers are reported to device implementations and used to locate
20/// buffers.
21pub type VmoId = u8;
22
23/// Blanket definition for raw frames.
24///
25/// Devices that do not perform any sort of parsing of outbound traffic should
26/// define `FRAME_FEATURES_RAW` in the [`FrameTypeSupport`] entry.
27pub const FRAME_FEATURES_RAW: u32 = 1;
28
29/// The maximum number of Data VMOs that may exist.
30pub const MAX_DATA_VMOS: u8 = 32;
31
32/// Maximum number of chained descriptors that describe a single frame.
33pub const MAX_DESCRIPTOR_CHAIN: u8 = 4;
34
35/// Maximum numbers of supported frame types for rx or tx.
36pub const MAX_FRAME_TYPES: u32 = 4;
37
38/// The maximum number of ports attached to a device at a given time.
39pub const MAX_PORTS: u8 = 32;
40
41/// Maximum length of session label.
42pub const MAX_SESSION_NAME: u32 = 64;
43
44/// The maximum number of status samples that can be buffered by a
45/// [`StatusWatcher`].
46pub const MAX_STATUS_BUFFER: u32 = 50;
47
48bitflags! {
49    /// Ethernet frame sub-types and features.
50    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
51    pub struct EthernetFeatures: u32 {
52        /// Device supports any type of ethernet frame.
53        ///
54        /// Same as specifying all other flags. Used by devices that do not inspect
55        /// or parse outbound traffic.
56        const RAW = 1;
57        /// Device supports EthernetII frames.
58        const ETHERNET_II = 2;
59        /// Device supports 802.1q VLAN additions.
60        const E_802_1_Q = 4;
61        /// Device supports 802.1 q-in-q Multiple VLAN tagging additions.
62        ///
63        /// Only meaningful if `E_802_1_Q` is also present.
64        const E_802_1_Q_IN_Q = 8;
65        /// Device supports 802.3 LLC + SNAP Ethernet frame format.
66        const E_802_3_LLC_SNAP = 16;
67    }
68}
69
70impl EthernetFeatures {}
71
72bitflags! {
73    /// Flags set by a Device when handing a buffer to a client on the rx path.
74    ///
75    /// Set by devices on the `inbound_flags` field of an rx descriptor.
76    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
77    pub struct RxFlags: u32 {
78        /// The device verified one or more "full" checksums (meaning an Internet
79        /// Checksum over the full contents of e.g. a UDP or TCP packet).
80        ///
81        /// The number of verified checksums, minus one, is indicated by the
82        /// `rx_full_csums_verified` field of the `accel_metadata` field of the rx
83        /// descriptor.
84        const FULL_CHECKSUMS_VERIFIED = 1;
85        /// Device experienced a hardware rx overrun.
86        ///
87        /// Rx overruns are typically set by hardware controllers when a frame event
88        /// was detected but the frame data couldn't be captured. Devices should
89        /// clear the controller flag once this is set on an inbound frame, so
90        /// future overruns can be detected and reported.
91        const RX_OVERRUN = 536870912;
92        /// This bit is set if frame validation is performed (such as by hardware
93        /// acceleration features) and fails.
94        ///
95        /// It's important to note that some devices may simply discard frames for
96        /// which validation fails and never notify the client. Rx frames that
97        /// failed validation are only transmitted to the client if the
98        /// `SessionFlags::REPORT_INVALID_RX` option is selected when creating a
99        /// session.
100        const RX_VALIDATION_ERROR = 1073741824;
101    }
102}
103
104impl RxFlags {}
105
106bitflags! {
107    /// Additional session options.
108    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
109    pub struct SessionFlags: u16 {
110        /// Receive invalid rx frames.
111        ///
112        /// Sessions marked with `REPORT_INVALID_RX` are interested in receiving
113        /// frames that were rejected by internal device checks or payload
114        /// validation performed by hardware. Due to the nature of some hardware
115        /// platforms, sessions marked with `REPORT_INVALID_RX` may still not
116        /// receive frames that fail validation if the hardware implementation
117        /// simply drops the frame and doesn't expose it to the software stack.
118        /// Sessions NOT marked with `REPORT_INVALID_RX`, in contrast, will NEVER
119        /// receive an rx frame with the `RX_VALIDATION_ERROR` flag set.
120        const REPORT_INVALID_RX = 1;
121        /// Receive rx power leases.
122        ///
123        /// Sessions marked with `RECEIVE_RX_POWER_LEASES` receive
124        /// [`DelegatedRxLease`]s through [`Session.WatchDelegatedRxLease`] calls.
125        const RECEIVE_RX_POWER_LEASES = 2;
126    }
127}
128
129impl SessionFlags {}
130
131bitflags! {
132    /// Port status bits, reported in [`PortStatus.flags`].
133    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
134    pub struct StatusFlags: u32 {
135        /// Port is online, i.e., data path is open and any ongoing sessions may
136        /// send and receive frames.
137        const ONLINE = 1;
138    }
139}
140
141impl StatusFlags {}
142
143bitflags! {
144    /// Flags set by a Client when handing a buffer to a device on the tx path.
145    ///
146    /// Set by Clients on the `inbound_flags` field of a tx descriptor.
147    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
148    pub struct TxFlags: u32 {
149        /// Requests that the device compute a generic Internet Checksum based on a
150        /// starting byte index relative to the start of the frame and a byte offset
151        /// indicating the the offset from the starting index to the checksum field
152        /// where the result must be placed.
153        ///
154        /// The starting offset and the offset to the checksum field are indicated
155        /// by the `tx_partial_csum` field of the `accel_metadata` field of the tx
156        /// descriptor.
157        const COMPUTE_GENERIC_CHECKSUM = 1;
158    }
159}
160
161impl TxFlags {
162    #[inline(always)]
163    pub fn from_bits_allow_unknown(bits: u32) -> Self {
164        Self::from_bits_retain(bits)
165    }
166
167    #[inline(always)]
168    pub fn has_unknown_bits(&self) -> bool {
169        self.get_unknown_bits() != 0
170    }
171
172    #[inline(always)]
173    pub fn get_unknown_bits(&self) -> u32 {
174        self.bits() & !Self::all().bits()
175    }
176}
177
178bitflags! {
179    /// Flags set by a Device when returning a tx buffer back to a client.
180    ///
181    /// Set by Devices on the `return_flags` field of a tx descriptor.
182    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
183    pub struct TxReturnFlags: u32 {
184        /// Requested operation in `inbound_flags` is not supported; the frame was
185        /// not sent.
186        ///
187        /// Always set in conjunction with `TX_RET_ERROR`.
188        const TX_RET_NOT_SUPPORTED = 1;
189        /// Could not allocate resources to send frame.
190        ///
191        /// Always set in conjunction with `TX_RET_ERROR`.
192        const TX_RET_OUT_OF_RESOURCES = 2;
193        /// Device is not available (offline or disconnected); the frame was not
194        /// sent.
195        ///
196        /// Always set in conjunction with `TX_RET_ERROR`.
197        const TX_RET_NOT_AVAILABLE = 4;
198        /// An error occurred sending this frame.
199        const TX_RET_ERROR = 2147483648;
200    }
201}
202
203impl TxReturnFlags {
204    #[inline(always)]
205    pub fn from_bits_allow_unknown(bits: u32) -> Self {
206        Self::from_bits_retain(bits)
207    }
208
209    #[inline(always)]
210    pub fn has_unknown_bits(&self) -> bool {
211        self.get_unknown_bits() != 0
212    }
213
214    #[inline(always)]
215    pub fn get_unknown_bits(&self) -> u32 {
216        self.bits() & !Self::all().bits()
217    }
218}
219
220/// Types of frames.
221#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
222pub enum FrameType {
223    Ethernet,
224    Ipv4,
225    Ipv6,
226    #[doc(hidden)]
227    __SourceBreaking {
228        unknown_ordinal: u8,
229    },
230}
231
232/// Pattern that matches an unknown `FrameType` member.
233#[macro_export]
234macro_rules! FrameTypeUnknown {
235    () => {
236        _
237    };
238}
239
240impl FrameType {
241    #[inline]
242    pub fn from_primitive(prim: u8) -> Option<Self> {
243        match prim {
244            1 => Some(Self::Ethernet),
245            2 => Some(Self::Ipv4),
246            3 => Some(Self::Ipv6),
247            _ => None,
248        }
249    }
250
251    #[inline]
252    pub fn from_primitive_allow_unknown(prim: u8) -> Self {
253        match prim {
254            1 => Self::Ethernet,
255            2 => Self::Ipv4,
256            3 => Self::Ipv6,
257            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
258        }
259    }
260
261    #[inline]
262    pub fn unknown() -> Self {
263        Self::__SourceBreaking { unknown_ordinal: 0xff }
264    }
265
266    #[inline]
267    pub const fn into_primitive(self) -> u8 {
268        match self {
269            Self::Ethernet => 1,
270            Self::Ipv4 => 2,
271            Self::Ipv6 => 3,
272            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
273        }
274    }
275
276    #[inline]
277    pub fn is_unknown(&self) -> bool {
278        match self {
279            Self::__SourceBreaking { unknown_ordinal: _ } => true,
280            _ => false,
281        }
282    }
283}
284
285/// The address filtering mode supported by MAC devices.
286#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
287pub enum MacFilterMode {
288    /// Device accepts only unicast frames addressed to its own unicast address,
289    /// or multicast frames that are part of the multicast address filter list.
290    MulticastFilter,
291    /// Device accepts unicast frames addressed to its own unicast address, or
292    /// any multicast frames.
293    MulticastPromiscuous,
294    /// Device accepts all frames.
295    Promiscuous,
296    #[doc(hidden)]
297    __SourceBreaking { unknown_ordinal: u32 },
298}
299
300/// Pattern that matches an unknown `MacFilterMode` member.
301#[macro_export]
302macro_rules! MacFilterModeUnknown {
303    () => {
304        _
305    };
306}
307
308impl MacFilterMode {
309    #[inline]
310    pub fn from_primitive(prim: u32) -> Option<Self> {
311        match prim {
312            0 => Some(Self::MulticastFilter),
313            1 => Some(Self::MulticastPromiscuous),
314            2 => Some(Self::Promiscuous),
315            _ => None,
316        }
317    }
318
319    #[inline]
320    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
321        match prim {
322            0 => Self::MulticastFilter,
323            1 => Self::MulticastPromiscuous,
324            2 => Self::Promiscuous,
325            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
326        }
327    }
328
329    #[inline]
330    pub fn unknown() -> Self {
331        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
332    }
333
334    #[inline]
335    pub const fn into_primitive(self) -> u32 {
336        match self {
337            Self::MulticastFilter => 0,
338            Self::MulticastPromiscuous => 1,
339            Self::Promiscuous => 2,
340            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
341        }
342    }
343
344    #[inline]
345    pub fn is_unknown(&self) -> bool {
346        match self {
347            Self::__SourceBreaking { unknown_ordinal: _ } => true,
348            _ => false,
349        }
350    }
351}
352
353/// Network port class.
354///
355/// *Note*: Device implementers are encouraged to propose additions to this
356/// enumeration to avoid using ill-fitting variants if there's not a good match
357/// available.
358#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
359pub enum PortClass {
360    Ethernet,
361    WlanClient,
362    Ppp,
363    Bridge,
364    WlanAp,
365    Virtual,
366    Lowpan,
367    #[doc(hidden)]
368    __SourceBreaking {
369        unknown_ordinal: u16,
370    },
371}
372
373/// Pattern that matches an unknown `PortClass` member.
374#[macro_export]
375macro_rules! PortClassUnknown {
376    () => {
377        _
378    };
379}
380
381impl PortClass {
382    #[inline]
383    pub fn from_primitive(prim: u16) -> Option<Self> {
384        match prim {
385            1 => Some(Self::Ethernet),
386            2 => Some(Self::WlanClient),
387            3 => Some(Self::Ppp),
388            4 => Some(Self::Bridge),
389            5 => Some(Self::WlanAp),
390            6 => Some(Self::Virtual),
391            7 => Some(Self::Lowpan),
392            _ => None,
393        }
394    }
395
396    #[inline]
397    pub fn from_primitive_allow_unknown(prim: u16) -> Self {
398        match prim {
399            1 => Self::Ethernet,
400            2 => Self::WlanClient,
401            3 => Self::Ppp,
402            4 => Self::Bridge,
403            5 => Self::WlanAp,
404            6 => Self::Virtual,
405            7 => Self::Lowpan,
406            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
407        }
408    }
409
410    #[inline]
411    pub fn unknown() -> Self {
412        Self::__SourceBreaking { unknown_ordinal: 0xffff }
413    }
414
415    #[inline]
416    pub const fn into_primitive(self) -> u16 {
417        match self {
418            Self::Ethernet => 1,
419            Self::WlanClient => 2,
420            Self::Ppp => 3,
421            Self::Bridge => 4,
422            Self::WlanAp => 5,
423            Self::Virtual => 6,
424            Self::Lowpan => 7,
425            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
426        }
427    }
428
429    #[inline]
430    pub fn is_unknown(&self) -> bool {
431        match self {
432            Self::__SourceBreaking { unknown_ordinal: _ } => true,
433            _ => false,
434        }
435    }
436}
437
438#[derive(Clone, Debug, PartialEq)]
439pub struct DeviceGetInfoResponse {
440    pub info: DeviceInfo,
441}
442
443impl fidl::Persistable for DeviceGetInfoResponse {}
444
445#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
446pub struct Empty;
447
448impl fidl::Persistable for Empty {}
449
450/// Specifies a frame type and features and supported flags associated with that
451/// type.
452///
453/// This is used by clients to read the supported frames on the tx path for a
454/// given Network Device.
455///
456/// Some Network Devices may parse outgoing frames to perform frame
457/// transformation or specific hardware support. Each frame type has an
458/// associated [`FrameTypeSupport.features`] bits enumeration that lists
459/// FrameType-specific features that may or may not be supported. Devices that
460/// do not perform parsing are encouraged to just use the [`FRAME_FEATURES_RAW`]
461/// bit in `features`, which informs the client that all frame features are
462/// allowed.
463#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
464pub struct FrameTypeSupport {
465    /// The frame type this support entry refers to.
466    pub type_: FrameType,
467    /// The frame type-specific features supported.
468    pub features: u32,
469    /// The flags supported for the given frame type.
470    pub supported_flags: TxFlags,
471}
472
473impl fidl::Persistable for FrameTypeSupport {}
474
475#[derive(Clone, Debug, PartialEq)]
476pub struct MacAddressingAddMulticastAddressRequest {
477    pub address: fidl_fuchsia_net_common::MacAddress,
478}
479
480impl fidl::Persistable for MacAddressingAddMulticastAddressRequest {}
481
482#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
483#[repr(C)]
484pub struct MacAddressingAddMulticastAddressResponse {
485    pub status: i32,
486}
487
488impl fidl::Persistable for MacAddressingAddMulticastAddressResponse {}
489
490#[derive(Clone, Debug, PartialEq)]
491pub struct MacAddressingGetUnicastAddressResponse {
492    pub address: fidl_fuchsia_net_common::MacAddress,
493}
494
495impl fidl::Persistable for MacAddressingGetUnicastAddressResponse {}
496
497#[derive(Clone, Debug, PartialEq)]
498pub struct MacAddressingRemoveMulticastAddressRequest {
499    pub address: fidl_fuchsia_net_common::MacAddress,
500}
501
502impl fidl::Persistable for MacAddressingRemoveMulticastAddressRequest {}
503
504#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
505#[repr(C)]
506pub struct MacAddressingRemoveMulticastAddressResponse {
507    pub status: i32,
508}
509
510impl fidl::Persistable for MacAddressingRemoveMulticastAddressResponse {}
511
512#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
513pub struct MacAddressingSetModeRequest {
514    pub mode: MacFilterMode,
515}
516
517impl fidl::Persistable for MacAddressingSetModeRequest {}
518
519#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
520#[repr(C)]
521pub struct MacAddressingSetModeResponse {
522    pub status: i32,
523}
524
525impl fidl::Persistable for MacAddressingSetModeResponse {}
526
527#[derive(Clone, Debug, PartialEq)]
528pub struct PortGetInfoResponse {
529    pub info: PortInfo,
530}
531
532impl fidl::Persistable for PortGetInfoResponse {}
533
534#[derive(Clone, Debug, PartialEq)]
535pub struct PortGetStatusResponse {
536    pub status: PortStatus,
537}
538
539impl fidl::Persistable for PortGetStatusResponse {}
540
541/// A device port identifier.
542#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
543#[repr(C)]
544pub struct PortId {
545    /// The base identifier for the port.
546    ///
547    /// Generally identifies a port instance in hardware.
548    pub base: u8,
549    /// An implementation-defined identifier that is guaranteed to change on
550    /// every instantiation of the identified port.
551    pub salt: u8,
552}
553
554impl fidl::Persistable for PortId {}
555
556#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
557pub struct PortWatcherWatchResponse {
558    pub event: DevicePortEvent,
559}
560
561impl fidl::Persistable for PortWatcherWatchResponse {}
562
563#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
564pub struct SessionAttachRequest {
565    pub port: PortId,
566    pub rx_frames: Vec<FrameType>,
567}
568
569impl fidl::Persistable for SessionAttachRequest {}
570
571#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
572#[repr(C)]
573pub struct SessionDetachRequest {
574    pub port: PortId,
575}
576
577impl fidl::Persistable for SessionDetachRequest {}
578
579#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
580#[repr(C)]
581pub struct SessionRegisterForTxResponse {
582    pub successful: u8,
583    pub status: i32,
584}
585
586impl fidl::Persistable for SessionRegisterForTxResponse {}
587
588#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
589#[repr(C)]
590pub struct SessionUnregisterForTxResponse {
591    pub successful: u8,
592    pub status: i32,
593}
594
595impl fidl::Persistable for SessionUnregisterForTxResponse {}
596
597#[derive(Clone, Debug, PartialEq)]
598pub struct StatusWatcherWatchStatusResponse {
599    pub port_status: PortStatus,
600}
601
602impl fidl::Persistable for StatusWatcherWatchStatusResponse {}
603
604/// Network device base info.
605#[derive(Clone, Debug, Default, PartialEq)]
606pub struct DeviceBaseInfo {
607    /// Maximum number of items in rx FIFO (per session). Required.
608    ///
609    /// `rx_depth` is calculated based on the size of the actual backing
610    /// hardware rx queue.
611    pub rx_depth: Option<u16>,
612    /// Maximum number of items in tx FIFO (per session). Required.
613    ///
614    /// `tx_depth` is calculated based on the size of the actual backing
615    /// hardware tx queue.
616    pub tx_depth: Option<u16>,
617    /// Alignment requirement for buffers in the data VMO.
618    ///
619    /// All buffers in the data VMO *must* be aligned to `buffer_alignment`
620    /// relative to the start of the VMO. `buffer_alignment == 0` is never
621    /// reported. Required.
622    pub buffer_alignment: Option<u32>,
623    /// Maximum supported length of buffers in the data VMO, in bytes.
624    ///
625    /// Absent if no maximum buffer length is defined. Must be nonzero.
626    pub max_buffer_length: Option<u32>,
627    /// The minimum rx buffer length required for device. Required.
628    pub min_rx_buffer_length: Option<u32>,
629    /// The minimum tx buffer length required for the device. Required.
630    ///
631    /// This value accounts only for tx payload length, `min_tx_buffer_head` and
632    /// `min_tx_buffer_tail` are not part of this value.
633    ///
634    /// Clients must zero pad outgoing frames to meet the required minimum
635    /// length.
636    pub min_tx_buffer_length: Option<u32>,
637    /// The number of bytes the device requests be free as `head` space in a tx
638    /// buffer. Required.
639    pub min_tx_buffer_head: Option<u16>,
640    /// The amount of bytes the device requests be free as `tail` space in a tx
641    /// buffer. Required.
642    pub min_tx_buffer_tail: Option<u16>,
643    /// Maximum descriptor chain length accepted by the device. Required.
644    pub max_buffer_parts: Option<u8>,
645    /// Minimum amount of Rx buffers the client needs to prepare for the
646    /// network device. Client should use this information to select its
647    /// VMO sizes if using multi-VMO support.
648    pub min_rx_buffers: Option<u16>,
649    #[doc(hidden)]
650    pub __source_breaking: fidl::marker::SourceBreaking,
651}
652
653impl fidl::Persistable for DeviceBaseInfo {}
654
655/// Network device information.
656#[derive(Clone, Debug, Default, PartialEq)]
657pub struct DeviceInfo {
658    /// Minimum descriptor length, in 64-bit words. Required.
659    ///
660    /// The minimum length that each buffer descriptor must have for correct
661    /// operation with this device. Devices that support extra frame metadata
662    /// inform larger minimum descriptor lengths that reflect the minimum space
663    /// needed to be able to store frame metadata.
664    pub min_descriptor_length: Option<u8>,
665    /// Accepted descriptor version. Required.
666    pub descriptor_version: Option<u8>,
667    /// Device base info. Required.
668    pub base_info: Option<DeviceBaseInfo>,
669    #[doc(hidden)]
670    pub __source_breaking: fidl::marker::SourceBreaking,
671}
672
673impl fidl::Persistable for DeviceInfo {}
674
675/// Port base info.
676#[derive(Clone, Debug, Default, PartialEq)]
677pub struct PortBaseInfo {
678    /// Port's class. Required.
679    pub port_class: Option<PortClass>,
680    /// Supported rx frame types on this port. Required.
681    ///
682    /// Clients may open sessions subscribing to a subset of `rx_types` frame
683    /// types on this port.
684    pub rx_types: Option<Vec<FrameType>>,
685    /// Supported tx frame types on this port. Required.
686    ///
687    /// Frames destined to this port whose frame type is not in `tx_types` are
688    /// returned with an error.
689    ///
690    /// Some network devices may need to perform partial frame parsing and
691    /// serialization and, for that reason, `tx_types` is a vector of
692    /// [`FrameTypeSupport`] which includes specific features per frame type.
693    /// For example, a device that supports Ethernet frames but needs to convert
694    /// the Ethernet header may only support standard Ethernet II frames, and
695    /// not any "raw" Ethernet frame.
696    pub tx_types: Option<Vec<FrameTypeSupport>>,
697    #[doc(hidden)]
698    pub __source_breaking: fidl::marker::SourceBreaking,
699}
700
701impl fidl::Persistable for PortBaseInfo {}
702
703#[derive(Clone, Debug, Default, PartialEq)]
704pub struct PortGetCountersResponse {
705    /// The total number of ingress frames on this port.
706    pub rx_frames: Option<u64>,
707    /// The total number of ingress bytes on this port.
708    pub rx_bytes: Option<u64>,
709    /// The total number of egress frames on this port.
710    pub tx_frames: Option<u64>,
711    /// The total number of egress bytes on this port.
712    pub tx_bytes: Option<u64>,
713    #[doc(hidden)]
714    pub __source_breaking: fidl::marker::SourceBreaking,
715}
716
717impl fidl::Persistable for PortGetCountersResponse {}
718
719/// Logical port information.
720#[derive(Clone, Debug, Default, PartialEq)]
721pub struct PortInfo {
722    /// Port's identifier. Required.
723    pub id: Option<PortId>,
724    pub base_info: Option<PortBaseInfo>,
725    #[doc(hidden)]
726    pub __source_breaking: fidl::marker::SourceBreaking,
727}
728
729impl fidl::Persistable for PortInfo {}
730
731/// Dynamic port information.
732#[derive(Clone, Debug, Default, PartialEq)]
733pub struct PortStatus {
734    /// Port status flags.
735    pub flags: Option<StatusFlags>,
736    /// Maximum transmit unit for this port, in bytes.
737    ///
738    /// The reported MTU is the size of an entire frame, including any header
739    /// and trailer bytes for whatever protocols this port supports.
740    pub mtu: Option<u32>,
741    #[doc(hidden)]
742    pub __source_breaking: fidl::marker::SourceBreaking,
743}
744
745impl fidl::Persistable for PortStatus {}
746
747/// Port creation and destruction events.
748#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
749pub enum DevicePortEvent {
750    /// Port existed when watcher was created.
751    Existing(PortId),
752    /// New port was added to device.
753    Added(PortId),
754    /// Port was removed from the device.
755    Removed(PortId),
756    /// Exhausted list of existing ports.
757    Idle(Empty),
758}
759
760impl DevicePortEvent {
761    #[inline]
762    pub fn ordinal(&self) -> u64 {
763        match *self {
764            Self::Existing(_) => 1,
765            Self::Added(_) => 2,
766            Self::Removed(_) => 3,
767            Self::Idle(_) => 4,
768        }
769    }
770}
771
772impl fidl::Persistable for DevicePortEvent {}
773
774pub mod device_ordinals {
775    pub const GET_INFO: u64 = 0x3c500ca9341e8f56;
776    pub const OPEN_SESSION: u64 = 0x25940b82146dcf67;
777    pub const GET_PORT: u64 = 0x340a852c955ba2a6;
778    pub const GET_PORT_WATCHER: u64 = 0x104f43c937c39f0c;
779    pub const CLONE: u64 = 0x5882ea09b3809af4;
780}
781
782pub mod diagnostics_ordinals {
783    pub const LOG_DEBUG_INFO_TO_SYSLOG: u64 = 0x4222897dfe1f4b4a;
784}
785
786pub mod mac_addressing_ordinals {
787    pub const GET_UNICAST_ADDRESS: u64 = 0x2c60b82a4ecfaebe;
788    pub const SET_MODE: u64 = 0x6297b8dbf03c58c;
789    pub const ADD_MULTICAST_ADDRESS: u64 = 0xf5637ff11cf0c25;
790    pub const REMOVE_MULTICAST_ADDRESS: u64 = 0x5dddf4e3ba4e2560;
791}
792
793pub mod port_ordinals {
794    pub const GET_INFO: u64 = 0x276cf65feb554ebd;
795    pub const GET_STATUS: u64 = 0x4235650aacca60b2;
796    pub const GET_STATUS_WATCHER: u64 = 0x65511ab81c1bd8d4;
797    pub const GET_MAC: u64 = 0x2c6ec2988aefc0f6;
798    pub const GET_DEVICE: u64 = 0x7de34747235d2d80;
799    pub const CLONE: u64 = 0x4e4764150b4942d3;
800    pub const GET_COUNTERS: u64 = 0x6a213b03c4fcbbac;
801    pub const GET_DIAGNOSTICS: u64 = 0x381faa4ed75e399c;
802    pub const GET_IDENTITY: u64 = 0x75134ce0bc114e5a;
803}
804
805pub mod port_watcher_ordinals {
806    pub const WATCH: u64 = 0x3e87244b74fff55e;
807}
808
809pub mod session_ordinals {
810    pub const ATTACH: u64 = 0x1e89c9013e201379;
811    pub const DETACH: u64 = 0x68c40cf8fb549867;
812    pub const CLOSE: u64 = 0x393d5070394a92f6;
813    pub const WATCH_DELEGATED_RX_LEASE: u64 = 0x764d823ee64803b5;
814    pub const REGISTER_FOR_TX: u64 = 0x36321799ce2a081a;
815    pub const UNREGISTER_FOR_TX: u64 = 0x3e76b16030d62796;
816}
817
818pub mod status_watcher_ordinals {
819    pub const WATCH_STATUS: u64 = 0x1369a8125c0862b9;
820}
821
822mod internal {
823    use super::*;
824    unsafe impl fidl::encoding::TypeMarker for EthernetFeatures {
825        type Owned = Self;
826
827        #[inline(always)]
828        fn inline_align(_context: fidl::encoding::Context) -> usize {
829            4
830        }
831
832        #[inline(always)]
833        fn inline_size(_context: fidl::encoding::Context) -> usize {
834            4
835        }
836    }
837
838    impl fidl::encoding::ValueTypeMarker for EthernetFeatures {
839        type Borrowed<'a> = Self;
840        #[inline(always)]
841        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
842            *value
843        }
844    }
845
846    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D>
847        for EthernetFeatures
848    {
849        #[inline]
850        unsafe fn encode(
851            self,
852            encoder: &mut fidl::encoding::Encoder<'_, D>,
853            offset: usize,
854            _depth: fidl::encoding::Depth,
855        ) -> fidl::Result<()> {
856            encoder.debug_check_bounds::<Self>(offset);
857            if self.bits() & Self::all().bits() != self.bits() {
858                return Err(fidl::Error::InvalidBitsValue);
859            }
860            encoder.write_num(self.bits(), offset);
861            Ok(())
862        }
863    }
864
865    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for EthernetFeatures {
866        #[inline(always)]
867        fn new_empty() -> Self {
868            Self::empty()
869        }
870
871        #[inline]
872        unsafe fn decode(
873            &mut self,
874            decoder: &mut fidl::encoding::Decoder<'_, D>,
875            offset: usize,
876            _depth: fidl::encoding::Depth,
877        ) -> fidl::Result<()> {
878            decoder.debug_check_bounds::<Self>(offset);
879            let prim = decoder.read_num::<u32>(offset);
880            *self = Self::from_bits(prim).ok_or(fidl::Error::InvalidBitsValue)?;
881            Ok(())
882        }
883    }
884    unsafe impl fidl::encoding::TypeMarker for RxFlags {
885        type Owned = Self;
886
887        #[inline(always)]
888        fn inline_align(_context: fidl::encoding::Context) -> usize {
889            4
890        }
891
892        #[inline(always)]
893        fn inline_size(_context: fidl::encoding::Context) -> usize {
894            4
895        }
896    }
897
898    impl fidl::encoding::ValueTypeMarker for RxFlags {
899        type Borrowed<'a> = Self;
900        #[inline(always)]
901        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
902            *value
903        }
904    }
905
906    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for RxFlags {
907        #[inline]
908        unsafe fn encode(
909            self,
910            encoder: &mut fidl::encoding::Encoder<'_, D>,
911            offset: usize,
912            _depth: fidl::encoding::Depth,
913        ) -> fidl::Result<()> {
914            encoder.debug_check_bounds::<Self>(offset);
915            if self.bits() & Self::all().bits() != self.bits() {
916                return Err(fidl::Error::InvalidBitsValue);
917            }
918            encoder.write_num(self.bits(), offset);
919            Ok(())
920        }
921    }
922
923    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RxFlags {
924        #[inline(always)]
925        fn new_empty() -> Self {
926            Self::empty()
927        }
928
929        #[inline]
930        unsafe fn decode(
931            &mut self,
932            decoder: &mut fidl::encoding::Decoder<'_, D>,
933            offset: usize,
934            _depth: fidl::encoding::Depth,
935        ) -> fidl::Result<()> {
936            decoder.debug_check_bounds::<Self>(offset);
937            let prim = decoder.read_num::<u32>(offset);
938            *self = Self::from_bits(prim).ok_or(fidl::Error::InvalidBitsValue)?;
939            Ok(())
940        }
941    }
942    unsafe impl fidl::encoding::TypeMarker for SessionFlags {
943        type Owned = Self;
944
945        #[inline(always)]
946        fn inline_align(_context: fidl::encoding::Context) -> usize {
947            2
948        }
949
950        #[inline(always)]
951        fn inline_size(_context: fidl::encoding::Context) -> usize {
952            2
953        }
954    }
955
956    impl fidl::encoding::ValueTypeMarker for SessionFlags {
957        type Borrowed<'a> = Self;
958        #[inline(always)]
959        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
960            *value
961        }
962    }
963
964    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for SessionFlags {
965        #[inline]
966        unsafe fn encode(
967            self,
968            encoder: &mut fidl::encoding::Encoder<'_, D>,
969            offset: usize,
970            _depth: fidl::encoding::Depth,
971        ) -> fidl::Result<()> {
972            encoder.debug_check_bounds::<Self>(offset);
973            if self.bits() & Self::all().bits() != self.bits() {
974                return Err(fidl::Error::InvalidBitsValue);
975            }
976            encoder.write_num(self.bits(), offset);
977            Ok(())
978        }
979    }
980
981    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SessionFlags {
982        #[inline(always)]
983        fn new_empty() -> Self {
984            Self::empty()
985        }
986
987        #[inline]
988        unsafe fn decode(
989            &mut self,
990            decoder: &mut fidl::encoding::Decoder<'_, D>,
991            offset: usize,
992            _depth: fidl::encoding::Depth,
993        ) -> fidl::Result<()> {
994            decoder.debug_check_bounds::<Self>(offset);
995            let prim = decoder.read_num::<u16>(offset);
996            *self = Self::from_bits(prim).ok_or(fidl::Error::InvalidBitsValue)?;
997            Ok(())
998        }
999    }
1000    unsafe impl fidl::encoding::TypeMarker for StatusFlags {
1001        type Owned = Self;
1002
1003        #[inline(always)]
1004        fn inline_align(_context: fidl::encoding::Context) -> usize {
1005            4
1006        }
1007
1008        #[inline(always)]
1009        fn inline_size(_context: fidl::encoding::Context) -> usize {
1010            4
1011        }
1012    }
1013
1014    impl fidl::encoding::ValueTypeMarker for StatusFlags {
1015        type Borrowed<'a> = Self;
1016        #[inline(always)]
1017        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1018            *value
1019        }
1020    }
1021
1022    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for StatusFlags {
1023        #[inline]
1024        unsafe fn encode(
1025            self,
1026            encoder: &mut fidl::encoding::Encoder<'_, D>,
1027            offset: usize,
1028            _depth: fidl::encoding::Depth,
1029        ) -> fidl::Result<()> {
1030            encoder.debug_check_bounds::<Self>(offset);
1031            if self.bits() & Self::all().bits() != self.bits() {
1032                return Err(fidl::Error::InvalidBitsValue);
1033            }
1034            encoder.write_num(self.bits(), offset);
1035            Ok(())
1036        }
1037    }
1038
1039    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for StatusFlags {
1040        #[inline(always)]
1041        fn new_empty() -> Self {
1042            Self::empty()
1043        }
1044
1045        #[inline]
1046        unsafe fn decode(
1047            &mut self,
1048            decoder: &mut fidl::encoding::Decoder<'_, D>,
1049            offset: usize,
1050            _depth: fidl::encoding::Depth,
1051        ) -> fidl::Result<()> {
1052            decoder.debug_check_bounds::<Self>(offset);
1053            let prim = decoder.read_num::<u32>(offset);
1054            *self = Self::from_bits(prim).ok_or(fidl::Error::InvalidBitsValue)?;
1055            Ok(())
1056        }
1057    }
1058    unsafe impl fidl::encoding::TypeMarker for TxFlags {
1059        type Owned = Self;
1060
1061        #[inline(always)]
1062        fn inline_align(_context: fidl::encoding::Context) -> usize {
1063            4
1064        }
1065
1066        #[inline(always)]
1067        fn inline_size(_context: fidl::encoding::Context) -> usize {
1068            4
1069        }
1070    }
1071
1072    impl fidl::encoding::ValueTypeMarker for TxFlags {
1073        type Borrowed<'a> = Self;
1074        #[inline(always)]
1075        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1076            *value
1077        }
1078    }
1079
1080    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for TxFlags {
1081        #[inline]
1082        unsafe fn encode(
1083            self,
1084            encoder: &mut fidl::encoding::Encoder<'_, D>,
1085            offset: usize,
1086            _depth: fidl::encoding::Depth,
1087        ) -> fidl::Result<()> {
1088            encoder.debug_check_bounds::<Self>(offset);
1089            encoder.write_num(self.bits(), offset);
1090            Ok(())
1091        }
1092    }
1093
1094    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for TxFlags {
1095        #[inline(always)]
1096        fn new_empty() -> Self {
1097            Self::empty()
1098        }
1099
1100        #[inline]
1101        unsafe fn decode(
1102            &mut self,
1103            decoder: &mut fidl::encoding::Decoder<'_, D>,
1104            offset: usize,
1105            _depth: fidl::encoding::Depth,
1106        ) -> fidl::Result<()> {
1107            decoder.debug_check_bounds::<Self>(offset);
1108            let prim = decoder.read_num::<u32>(offset);
1109            *self = Self::from_bits_allow_unknown(prim);
1110            Ok(())
1111        }
1112    }
1113    unsafe impl fidl::encoding::TypeMarker for TxReturnFlags {
1114        type Owned = Self;
1115
1116        #[inline(always)]
1117        fn inline_align(_context: fidl::encoding::Context) -> usize {
1118            4
1119        }
1120
1121        #[inline(always)]
1122        fn inline_size(_context: fidl::encoding::Context) -> usize {
1123            4
1124        }
1125    }
1126
1127    impl fidl::encoding::ValueTypeMarker for TxReturnFlags {
1128        type Borrowed<'a> = Self;
1129        #[inline(always)]
1130        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1131            *value
1132        }
1133    }
1134
1135    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for TxReturnFlags {
1136        #[inline]
1137        unsafe fn encode(
1138            self,
1139            encoder: &mut fidl::encoding::Encoder<'_, D>,
1140            offset: usize,
1141            _depth: fidl::encoding::Depth,
1142        ) -> fidl::Result<()> {
1143            encoder.debug_check_bounds::<Self>(offset);
1144            encoder.write_num(self.bits(), offset);
1145            Ok(())
1146        }
1147    }
1148
1149    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for TxReturnFlags {
1150        #[inline(always)]
1151        fn new_empty() -> Self {
1152            Self::empty()
1153        }
1154
1155        #[inline]
1156        unsafe fn decode(
1157            &mut self,
1158            decoder: &mut fidl::encoding::Decoder<'_, D>,
1159            offset: usize,
1160            _depth: fidl::encoding::Depth,
1161        ) -> fidl::Result<()> {
1162            decoder.debug_check_bounds::<Self>(offset);
1163            let prim = decoder.read_num::<u32>(offset);
1164            *self = Self::from_bits_allow_unknown(prim);
1165            Ok(())
1166        }
1167    }
1168    unsafe impl fidl::encoding::TypeMarker for FrameType {
1169        type Owned = Self;
1170
1171        #[inline(always)]
1172        fn inline_align(_context: fidl::encoding::Context) -> usize {
1173            std::mem::align_of::<u8>()
1174        }
1175
1176        #[inline(always)]
1177        fn inline_size(_context: fidl::encoding::Context) -> usize {
1178            std::mem::size_of::<u8>()
1179        }
1180
1181        #[inline(always)]
1182        fn encode_is_copy() -> bool {
1183            false
1184        }
1185
1186        #[inline(always)]
1187        fn decode_is_copy() -> bool {
1188            false
1189        }
1190    }
1191
1192    impl fidl::encoding::ValueTypeMarker for FrameType {
1193        type Borrowed<'a> = Self;
1194        #[inline(always)]
1195        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1196            *value
1197        }
1198    }
1199
1200    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for FrameType {
1201        #[inline]
1202        unsafe fn encode(
1203            self,
1204            encoder: &mut fidl::encoding::Encoder<'_, D>,
1205            offset: usize,
1206            _depth: fidl::encoding::Depth,
1207        ) -> fidl::Result<()> {
1208            encoder.debug_check_bounds::<Self>(offset);
1209            encoder.write_num(self.into_primitive(), offset);
1210            Ok(())
1211        }
1212    }
1213
1214    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for FrameType {
1215        #[inline(always)]
1216        fn new_empty() -> Self {
1217            Self::unknown()
1218        }
1219
1220        #[inline]
1221        unsafe fn decode(
1222            &mut self,
1223            decoder: &mut fidl::encoding::Decoder<'_, D>,
1224            offset: usize,
1225            _depth: fidl::encoding::Depth,
1226        ) -> fidl::Result<()> {
1227            decoder.debug_check_bounds::<Self>(offset);
1228            let prim = decoder.read_num::<u8>(offset);
1229
1230            *self = Self::from_primitive_allow_unknown(prim);
1231            Ok(())
1232        }
1233    }
1234    unsafe impl fidl::encoding::TypeMarker for MacFilterMode {
1235        type Owned = Self;
1236
1237        #[inline(always)]
1238        fn inline_align(_context: fidl::encoding::Context) -> usize {
1239            std::mem::align_of::<u32>()
1240        }
1241
1242        #[inline(always)]
1243        fn inline_size(_context: fidl::encoding::Context) -> usize {
1244            std::mem::size_of::<u32>()
1245        }
1246
1247        #[inline(always)]
1248        fn encode_is_copy() -> bool {
1249            false
1250        }
1251
1252        #[inline(always)]
1253        fn decode_is_copy() -> bool {
1254            false
1255        }
1256    }
1257
1258    impl fidl::encoding::ValueTypeMarker for MacFilterMode {
1259        type Borrowed<'a> = Self;
1260        #[inline(always)]
1261        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1262            *value
1263        }
1264    }
1265
1266    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for MacFilterMode {
1267        #[inline]
1268        unsafe fn encode(
1269            self,
1270            encoder: &mut fidl::encoding::Encoder<'_, D>,
1271            offset: usize,
1272            _depth: fidl::encoding::Depth,
1273        ) -> fidl::Result<()> {
1274            encoder.debug_check_bounds::<Self>(offset);
1275            encoder.write_num(self.into_primitive(), offset);
1276            Ok(())
1277        }
1278    }
1279
1280    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for MacFilterMode {
1281        #[inline(always)]
1282        fn new_empty() -> Self {
1283            Self::unknown()
1284        }
1285
1286        #[inline]
1287        unsafe fn decode(
1288            &mut self,
1289            decoder: &mut fidl::encoding::Decoder<'_, D>,
1290            offset: usize,
1291            _depth: fidl::encoding::Depth,
1292        ) -> fidl::Result<()> {
1293            decoder.debug_check_bounds::<Self>(offset);
1294            let prim = decoder.read_num::<u32>(offset);
1295
1296            *self = Self::from_primitive_allow_unknown(prim);
1297            Ok(())
1298        }
1299    }
1300    unsafe impl fidl::encoding::TypeMarker for PortClass {
1301        type Owned = Self;
1302
1303        #[inline(always)]
1304        fn inline_align(_context: fidl::encoding::Context) -> usize {
1305            std::mem::align_of::<u16>()
1306        }
1307
1308        #[inline(always)]
1309        fn inline_size(_context: fidl::encoding::Context) -> usize {
1310            std::mem::size_of::<u16>()
1311        }
1312
1313        #[inline(always)]
1314        fn encode_is_copy() -> bool {
1315            false
1316        }
1317
1318        #[inline(always)]
1319        fn decode_is_copy() -> bool {
1320            false
1321        }
1322    }
1323
1324    impl fidl::encoding::ValueTypeMarker for PortClass {
1325        type Borrowed<'a> = Self;
1326        #[inline(always)]
1327        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1328            *value
1329        }
1330    }
1331
1332    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for PortClass {
1333        #[inline]
1334        unsafe fn encode(
1335            self,
1336            encoder: &mut fidl::encoding::Encoder<'_, D>,
1337            offset: usize,
1338            _depth: fidl::encoding::Depth,
1339        ) -> fidl::Result<()> {
1340            encoder.debug_check_bounds::<Self>(offset);
1341            encoder.write_num(self.into_primitive(), offset);
1342            Ok(())
1343        }
1344    }
1345
1346    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortClass {
1347        #[inline(always)]
1348        fn new_empty() -> Self {
1349            Self::unknown()
1350        }
1351
1352        #[inline]
1353        unsafe fn decode(
1354            &mut self,
1355            decoder: &mut fidl::encoding::Decoder<'_, D>,
1356            offset: usize,
1357            _depth: fidl::encoding::Depth,
1358        ) -> fidl::Result<()> {
1359            decoder.debug_check_bounds::<Self>(offset);
1360            let prim = decoder.read_num::<u16>(offset);
1361
1362            *self = Self::from_primitive_allow_unknown(prim);
1363            Ok(())
1364        }
1365    }
1366
1367    impl fidl::encoding::ValueTypeMarker for DeviceGetInfoResponse {
1368        type Borrowed<'a> = &'a Self;
1369        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1370            value
1371        }
1372    }
1373
1374    unsafe impl fidl::encoding::TypeMarker for DeviceGetInfoResponse {
1375        type Owned = Self;
1376
1377        #[inline(always)]
1378        fn inline_align(_context: fidl::encoding::Context) -> usize {
1379            8
1380        }
1381
1382        #[inline(always)]
1383        fn inline_size(_context: fidl::encoding::Context) -> usize {
1384            16
1385        }
1386    }
1387
1388    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DeviceGetInfoResponse, D>
1389        for &DeviceGetInfoResponse
1390    {
1391        #[inline]
1392        unsafe fn encode(
1393            self,
1394            encoder: &mut fidl::encoding::Encoder<'_, D>,
1395            offset: usize,
1396            _depth: fidl::encoding::Depth,
1397        ) -> fidl::Result<()> {
1398            encoder.debug_check_bounds::<DeviceGetInfoResponse>(offset);
1399            // Delegate to tuple encoding.
1400            fidl::encoding::Encode::<DeviceGetInfoResponse, D>::encode(
1401                (<DeviceInfo as fidl::encoding::ValueTypeMarker>::borrow(&self.info),),
1402                encoder,
1403                offset,
1404                _depth,
1405            )
1406        }
1407    }
1408    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<DeviceInfo, D>>
1409        fidl::encoding::Encode<DeviceGetInfoResponse, D> for (T0,)
1410    {
1411        #[inline]
1412        unsafe fn encode(
1413            self,
1414            encoder: &mut fidl::encoding::Encoder<'_, D>,
1415            offset: usize,
1416            depth: fidl::encoding::Depth,
1417        ) -> fidl::Result<()> {
1418            encoder.debug_check_bounds::<DeviceGetInfoResponse>(offset);
1419            // Zero out padding regions. There's no need to apply masks
1420            // because the unmasked parts will be overwritten by fields.
1421            // Write the fields.
1422            self.0.encode(encoder, offset + 0, depth)?;
1423            Ok(())
1424        }
1425    }
1426
1427    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DeviceGetInfoResponse {
1428        #[inline(always)]
1429        fn new_empty() -> Self {
1430            Self { info: fidl::new_empty!(DeviceInfo, D) }
1431        }
1432
1433        #[inline]
1434        unsafe fn decode(
1435            &mut self,
1436            decoder: &mut fidl::encoding::Decoder<'_, D>,
1437            offset: usize,
1438            _depth: fidl::encoding::Depth,
1439        ) -> fidl::Result<()> {
1440            decoder.debug_check_bounds::<Self>(offset);
1441            // Verify that padding bytes are zero.
1442            fidl::decode!(DeviceInfo, D, &mut self.info, decoder, offset + 0, _depth)?;
1443            Ok(())
1444        }
1445    }
1446
1447    impl fidl::encoding::ValueTypeMarker for Empty {
1448        type Borrowed<'a> = &'a Self;
1449        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1450            value
1451        }
1452    }
1453
1454    unsafe impl fidl::encoding::TypeMarker for Empty {
1455        type Owned = Self;
1456
1457        #[inline(always)]
1458        fn inline_align(_context: fidl::encoding::Context) -> usize {
1459            1
1460        }
1461
1462        #[inline(always)]
1463        fn inline_size(_context: fidl::encoding::Context) -> usize {
1464            1
1465        }
1466    }
1467
1468    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Empty, D> for &Empty {
1469        #[inline]
1470        unsafe fn encode(
1471            self,
1472            encoder: &mut fidl::encoding::Encoder<'_, D>,
1473            offset: usize,
1474            _depth: fidl::encoding::Depth,
1475        ) -> fidl::Result<()> {
1476            encoder.debug_check_bounds::<Empty>(offset);
1477            encoder.write_num(0u8, offset);
1478            Ok(())
1479        }
1480    }
1481
1482    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Empty {
1483        #[inline(always)]
1484        fn new_empty() -> Self {
1485            Self
1486        }
1487
1488        #[inline]
1489        unsafe fn decode(
1490            &mut self,
1491            decoder: &mut fidl::encoding::Decoder<'_, D>,
1492            offset: usize,
1493            _depth: fidl::encoding::Depth,
1494        ) -> fidl::Result<()> {
1495            decoder.debug_check_bounds::<Self>(offset);
1496            match decoder.read_num::<u8>(offset) {
1497                0 => Ok(()),
1498                _ => Err(fidl::Error::Invalid),
1499            }
1500        }
1501    }
1502
1503    impl fidl::encoding::ValueTypeMarker for FrameTypeSupport {
1504        type Borrowed<'a> = &'a Self;
1505        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1506            value
1507        }
1508    }
1509
1510    unsafe impl fidl::encoding::TypeMarker for FrameTypeSupport {
1511        type Owned = Self;
1512
1513        #[inline(always)]
1514        fn inline_align(_context: fidl::encoding::Context) -> usize {
1515            4
1516        }
1517
1518        #[inline(always)]
1519        fn inline_size(_context: fidl::encoding::Context) -> usize {
1520            12
1521        }
1522    }
1523
1524    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<FrameTypeSupport, D>
1525        for &FrameTypeSupport
1526    {
1527        #[inline]
1528        unsafe fn encode(
1529            self,
1530            encoder: &mut fidl::encoding::Encoder<'_, D>,
1531            offset: usize,
1532            _depth: fidl::encoding::Depth,
1533        ) -> fidl::Result<()> {
1534            encoder.debug_check_bounds::<FrameTypeSupport>(offset);
1535            // Delegate to tuple encoding.
1536            fidl::encoding::Encode::<FrameTypeSupport, D>::encode(
1537                (
1538                    <FrameType as fidl::encoding::ValueTypeMarker>::borrow(&self.type_),
1539                    <u32 as fidl::encoding::ValueTypeMarker>::borrow(&self.features),
1540                    <TxFlags as fidl::encoding::ValueTypeMarker>::borrow(&self.supported_flags),
1541                ),
1542                encoder,
1543                offset,
1544                _depth,
1545            )
1546        }
1547    }
1548    unsafe impl<
1549        D: fidl::encoding::ResourceDialect,
1550        T0: fidl::encoding::Encode<FrameType, D>,
1551        T1: fidl::encoding::Encode<u32, D>,
1552        T2: fidl::encoding::Encode<TxFlags, D>,
1553    > fidl::encoding::Encode<FrameTypeSupport, D> for (T0, T1, T2)
1554    {
1555        #[inline]
1556        unsafe fn encode(
1557            self,
1558            encoder: &mut fidl::encoding::Encoder<'_, D>,
1559            offset: usize,
1560            depth: fidl::encoding::Depth,
1561        ) -> fidl::Result<()> {
1562            encoder.debug_check_bounds::<FrameTypeSupport>(offset);
1563            // Zero out padding regions. There's no need to apply masks
1564            // because the unmasked parts will be overwritten by fields.
1565            unsafe {
1566                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
1567                (ptr as *mut u32).write_unaligned(0);
1568            }
1569            // Write the fields.
1570            self.0.encode(encoder, offset + 0, depth)?;
1571            self.1.encode(encoder, offset + 4, depth)?;
1572            self.2.encode(encoder, offset + 8, depth)?;
1573            Ok(())
1574        }
1575    }
1576
1577    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for FrameTypeSupport {
1578        #[inline(always)]
1579        fn new_empty() -> Self {
1580            Self {
1581                type_: fidl::new_empty!(FrameType, D),
1582                features: fidl::new_empty!(u32, D),
1583                supported_flags: fidl::new_empty!(TxFlags, D),
1584            }
1585        }
1586
1587        #[inline]
1588        unsafe fn decode(
1589            &mut self,
1590            decoder: &mut fidl::encoding::Decoder<'_, D>,
1591            offset: usize,
1592            _depth: fidl::encoding::Depth,
1593        ) -> fidl::Result<()> {
1594            decoder.debug_check_bounds::<Self>(offset);
1595            // Verify that padding bytes are zero.
1596            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
1597            let padval = unsafe { (ptr as *const u32).read_unaligned() };
1598            let mask = 0xffffff00u32;
1599            let maskedval = padval & mask;
1600            if maskedval != 0 {
1601                return Err(fidl::Error::NonZeroPadding {
1602                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
1603                });
1604            }
1605            fidl::decode!(FrameType, D, &mut self.type_, decoder, offset + 0, _depth)?;
1606            fidl::decode!(u32, D, &mut self.features, decoder, offset + 4, _depth)?;
1607            fidl::decode!(TxFlags, D, &mut self.supported_flags, decoder, offset + 8, _depth)?;
1608            Ok(())
1609        }
1610    }
1611
1612    impl fidl::encoding::ValueTypeMarker for MacAddressingAddMulticastAddressRequest {
1613        type Borrowed<'a> = &'a Self;
1614        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1615            value
1616        }
1617    }
1618
1619    unsafe impl fidl::encoding::TypeMarker for MacAddressingAddMulticastAddressRequest {
1620        type Owned = Self;
1621
1622        #[inline(always)]
1623        fn inline_align(_context: fidl::encoding::Context) -> usize {
1624            1
1625        }
1626
1627        #[inline(always)]
1628        fn inline_size(_context: fidl::encoding::Context) -> usize {
1629            6
1630        }
1631    }
1632
1633    unsafe impl<D: fidl::encoding::ResourceDialect>
1634        fidl::encoding::Encode<MacAddressingAddMulticastAddressRequest, D>
1635        for &MacAddressingAddMulticastAddressRequest
1636    {
1637        #[inline]
1638        unsafe fn encode(
1639            self,
1640            encoder: &mut fidl::encoding::Encoder<'_, D>,
1641            offset: usize,
1642            _depth: fidl::encoding::Depth,
1643        ) -> fidl::Result<()> {
1644            encoder.debug_check_bounds::<MacAddressingAddMulticastAddressRequest>(offset);
1645            // Delegate to tuple encoding.
1646            fidl::encoding::Encode::<MacAddressingAddMulticastAddressRequest, D>::encode(
1647                (<fidl_fuchsia_net_common::MacAddress as fidl::encoding::ValueTypeMarker>::borrow(
1648                    &self.address,
1649                ),),
1650                encoder,
1651                offset,
1652                _depth,
1653            )
1654        }
1655    }
1656    unsafe impl<
1657        D: fidl::encoding::ResourceDialect,
1658        T0: fidl::encoding::Encode<fidl_fuchsia_net_common::MacAddress, D>,
1659    > fidl::encoding::Encode<MacAddressingAddMulticastAddressRequest, D> for (T0,)
1660    {
1661        #[inline]
1662        unsafe fn encode(
1663            self,
1664            encoder: &mut fidl::encoding::Encoder<'_, D>,
1665            offset: usize,
1666            depth: fidl::encoding::Depth,
1667        ) -> fidl::Result<()> {
1668            encoder.debug_check_bounds::<MacAddressingAddMulticastAddressRequest>(offset);
1669            // Zero out padding regions. There's no need to apply masks
1670            // because the unmasked parts will be overwritten by fields.
1671            // Write the fields.
1672            self.0.encode(encoder, offset + 0, depth)?;
1673            Ok(())
1674        }
1675    }
1676
1677    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1678        for MacAddressingAddMulticastAddressRequest
1679    {
1680        #[inline(always)]
1681        fn new_empty() -> Self {
1682            Self { address: fidl::new_empty!(fidl_fuchsia_net_common::MacAddress, D) }
1683        }
1684
1685        #[inline]
1686        unsafe fn decode(
1687            &mut self,
1688            decoder: &mut fidl::encoding::Decoder<'_, D>,
1689            offset: usize,
1690            _depth: fidl::encoding::Depth,
1691        ) -> fidl::Result<()> {
1692            decoder.debug_check_bounds::<Self>(offset);
1693            // Verify that padding bytes are zero.
1694            fidl::decode!(
1695                fidl_fuchsia_net_common::MacAddress,
1696                D,
1697                &mut self.address,
1698                decoder,
1699                offset + 0,
1700                _depth
1701            )?;
1702            Ok(())
1703        }
1704    }
1705
1706    impl fidl::encoding::ValueTypeMarker for MacAddressingAddMulticastAddressResponse {
1707        type Borrowed<'a> = &'a Self;
1708        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1709            value
1710        }
1711    }
1712
1713    unsafe impl fidl::encoding::TypeMarker for MacAddressingAddMulticastAddressResponse {
1714        type Owned = Self;
1715
1716        #[inline(always)]
1717        fn inline_align(_context: fidl::encoding::Context) -> usize {
1718            4
1719        }
1720
1721        #[inline(always)]
1722        fn inline_size(_context: fidl::encoding::Context) -> usize {
1723            4
1724        }
1725        #[inline(always)]
1726        fn encode_is_copy() -> bool {
1727            true
1728        }
1729
1730        #[inline(always)]
1731        fn decode_is_copy() -> bool {
1732            true
1733        }
1734    }
1735
1736    unsafe impl<D: fidl::encoding::ResourceDialect>
1737        fidl::encoding::Encode<MacAddressingAddMulticastAddressResponse, D>
1738        for &MacAddressingAddMulticastAddressResponse
1739    {
1740        #[inline]
1741        unsafe fn encode(
1742            self,
1743            encoder: &mut fidl::encoding::Encoder<'_, D>,
1744            offset: usize,
1745            _depth: fidl::encoding::Depth,
1746        ) -> fidl::Result<()> {
1747            encoder.debug_check_bounds::<MacAddressingAddMulticastAddressResponse>(offset);
1748            unsafe {
1749                // Copy the object into the buffer.
1750                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
1751                (buf_ptr as *mut MacAddressingAddMulticastAddressResponse).write_unaligned(
1752                    (self as *const MacAddressingAddMulticastAddressResponse).read(),
1753                );
1754                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
1755                // done second because the memcpy will write garbage to these bytes.
1756            }
1757            Ok(())
1758        }
1759    }
1760    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i32, D>>
1761        fidl::encoding::Encode<MacAddressingAddMulticastAddressResponse, D> for (T0,)
1762    {
1763        #[inline]
1764        unsafe fn encode(
1765            self,
1766            encoder: &mut fidl::encoding::Encoder<'_, D>,
1767            offset: usize,
1768            depth: fidl::encoding::Depth,
1769        ) -> fidl::Result<()> {
1770            encoder.debug_check_bounds::<MacAddressingAddMulticastAddressResponse>(offset);
1771            // Zero out padding regions. There's no need to apply masks
1772            // because the unmasked parts will be overwritten by fields.
1773            // Write the fields.
1774            self.0.encode(encoder, offset + 0, depth)?;
1775            Ok(())
1776        }
1777    }
1778
1779    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1780        for MacAddressingAddMulticastAddressResponse
1781    {
1782        #[inline(always)]
1783        fn new_empty() -> Self {
1784            Self { status: fidl::new_empty!(i32, D) }
1785        }
1786
1787        #[inline]
1788        unsafe fn decode(
1789            &mut self,
1790            decoder: &mut fidl::encoding::Decoder<'_, D>,
1791            offset: usize,
1792            _depth: fidl::encoding::Depth,
1793        ) -> fidl::Result<()> {
1794            decoder.debug_check_bounds::<Self>(offset);
1795            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
1796            // Verify that padding bytes are zero.
1797            // Copy from the buffer into the object.
1798            unsafe {
1799                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 4);
1800            }
1801            Ok(())
1802        }
1803    }
1804
1805    impl fidl::encoding::ValueTypeMarker for MacAddressingGetUnicastAddressResponse {
1806        type Borrowed<'a> = &'a Self;
1807        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1808            value
1809        }
1810    }
1811
1812    unsafe impl fidl::encoding::TypeMarker for MacAddressingGetUnicastAddressResponse {
1813        type Owned = Self;
1814
1815        #[inline(always)]
1816        fn inline_align(_context: fidl::encoding::Context) -> usize {
1817            1
1818        }
1819
1820        #[inline(always)]
1821        fn inline_size(_context: fidl::encoding::Context) -> usize {
1822            6
1823        }
1824    }
1825
1826    unsafe impl<D: fidl::encoding::ResourceDialect>
1827        fidl::encoding::Encode<MacAddressingGetUnicastAddressResponse, D>
1828        for &MacAddressingGetUnicastAddressResponse
1829    {
1830        #[inline]
1831        unsafe fn encode(
1832            self,
1833            encoder: &mut fidl::encoding::Encoder<'_, D>,
1834            offset: usize,
1835            _depth: fidl::encoding::Depth,
1836        ) -> fidl::Result<()> {
1837            encoder.debug_check_bounds::<MacAddressingGetUnicastAddressResponse>(offset);
1838            // Delegate to tuple encoding.
1839            fidl::encoding::Encode::<MacAddressingGetUnicastAddressResponse, D>::encode(
1840                (<fidl_fuchsia_net_common::MacAddress as fidl::encoding::ValueTypeMarker>::borrow(
1841                    &self.address,
1842                ),),
1843                encoder,
1844                offset,
1845                _depth,
1846            )
1847        }
1848    }
1849    unsafe impl<
1850        D: fidl::encoding::ResourceDialect,
1851        T0: fidl::encoding::Encode<fidl_fuchsia_net_common::MacAddress, D>,
1852    > fidl::encoding::Encode<MacAddressingGetUnicastAddressResponse, D> for (T0,)
1853    {
1854        #[inline]
1855        unsafe fn encode(
1856            self,
1857            encoder: &mut fidl::encoding::Encoder<'_, D>,
1858            offset: usize,
1859            depth: fidl::encoding::Depth,
1860        ) -> fidl::Result<()> {
1861            encoder.debug_check_bounds::<MacAddressingGetUnicastAddressResponse>(offset);
1862            // Zero out padding regions. There's no need to apply masks
1863            // because the unmasked parts will be overwritten by fields.
1864            // Write the fields.
1865            self.0.encode(encoder, offset + 0, depth)?;
1866            Ok(())
1867        }
1868    }
1869
1870    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1871        for MacAddressingGetUnicastAddressResponse
1872    {
1873        #[inline(always)]
1874        fn new_empty() -> Self {
1875            Self { address: fidl::new_empty!(fidl_fuchsia_net_common::MacAddress, D) }
1876        }
1877
1878        #[inline]
1879        unsafe fn decode(
1880            &mut self,
1881            decoder: &mut fidl::encoding::Decoder<'_, D>,
1882            offset: usize,
1883            _depth: fidl::encoding::Depth,
1884        ) -> fidl::Result<()> {
1885            decoder.debug_check_bounds::<Self>(offset);
1886            // Verify that padding bytes are zero.
1887            fidl::decode!(
1888                fidl_fuchsia_net_common::MacAddress,
1889                D,
1890                &mut self.address,
1891                decoder,
1892                offset + 0,
1893                _depth
1894            )?;
1895            Ok(())
1896        }
1897    }
1898
1899    impl fidl::encoding::ValueTypeMarker for MacAddressingRemoveMulticastAddressRequest {
1900        type Borrowed<'a> = &'a Self;
1901        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1902            value
1903        }
1904    }
1905
1906    unsafe impl fidl::encoding::TypeMarker for MacAddressingRemoveMulticastAddressRequest {
1907        type Owned = Self;
1908
1909        #[inline(always)]
1910        fn inline_align(_context: fidl::encoding::Context) -> usize {
1911            1
1912        }
1913
1914        #[inline(always)]
1915        fn inline_size(_context: fidl::encoding::Context) -> usize {
1916            6
1917        }
1918    }
1919
1920    unsafe impl<D: fidl::encoding::ResourceDialect>
1921        fidl::encoding::Encode<MacAddressingRemoveMulticastAddressRequest, D>
1922        for &MacAddressingRemoveMulticastAddressRequest
1923    {
1924        #[inline]
1925        unsafe fn encode(
1926            self,
1927            encoder: &mut fidl::encoding::Encoder<'_, D>,
1928            offset: usize,
1929            _depth: fidl::encoding::Depth,
1930        ) -> fidl::Result<()> {
1931            encoder.debug_check_bounds::<MacAddressingRemoveMulticastAddressRequest>(offset);
1932            // Delegate to tuple encoding.
1933            fidl::encoding::Encode::<MacAddressingRemoveMulticastAddressRequest, D>::encode(
1934                (<fidl_fuchsia_net_common::MacAddress as fidl::encoding::ValueTypeMarker>::borrow(
1935                    &self.address,
1936                ),),
1937                encoder,
1938                offset,
1939                _depth,
1940            )
1941        }
1942    }
1943    unsafe impl<
1944        D: fidl::encoding::ResourceDialect,
1945        T0: fidl::encoding::Encode<fidl_fuchsia_net_common::MacAddress, D>,
1946    > fidl::encoding::Encode<MacAddressingRemoveMulticastAddressRequest, D> for (T0,)
1947    {
1948        #[inline]
1949        unsafe fn encode(
1950            self,
1951            encoder: &mut fidl::encoding::Encoder<'_, D>,
1952            offset: usize,
1953            depth: fidl::encoding::Depth,
1954        ) -> fidl::Result<()> {
1955            encoder.debug_check_bounds::<MacAddressingRemoveMulticastAddressRequest>(offset);
1956            // Zero out padding regions. There's no need to apply masks
1957            // because the unmasked parts will be overwritten by fields.
1958            // Write the fields.
1959            self.0.encode(encoder, offset + 0, depth)?;
1960            Ok(())
1961        }
1962    }
1963
1964    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1965        for MacAddressingRemoveMulticastAddressRequest
1966    {
1967        #[inline(always)]
1968        fn new_empty() -> Self {
1969            Self { address: fidl::new_empty!(fidl_fuchsia_net_common::MacAddress, D) }
1970        }
1971
1972        #[inline]
1973        unsafe fn decode(
1974            &mut self,
1975            decoder: &mut fidl::encoding::Decoder<'_, D>,
1976            offset: usize,
1977            _depth: fidl::encoding::Depth,
1978        ) -> fidl::Result<()> {
1979            decoder.debug_check_bounds::<Self>(offset);
1980            // Verify that padding bytes are zero.
1981            fidl::decode!(
1982                fidl_fuchsia_net_common::MacAddress,
1983                D,
1984                &mut self.address,
1985                decoder,
1986                offset + 0,
1987                _depth
1988            )?;
1989            Ok(())
1990        }
1991    }
1992
1993    impl fidl::encoding::ValueTypeMarker for MacAddressingRemoveMulticastAddressResponse {
1994        type Borrowed<'a> = &'a Self;
1995        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1996            value
1997        }
1998    }
1999
2000    unsafe impl fidl::encoding::TypeMarker for MacAddressingRemoveMulticastAddressResponse {
2001        type Owned = Self;
2002
2003        #[inline(always)]
2004        fn inline_align(_context: fidl::encoding::Context) -> usize {
2005            4
2006        }
2007
2008        #[inline(always)]
2009        fn inline_size(_context: fidl::encoding::Context) -> usize {
2010            4
2011        }
2012        #[inline(always)]
2013        fn encode_is_copy() -> bool {
2014            true
2015        }
2016
2017        #[inline(always)]
2018        fn decode_is_copy() -> bool {
2019            true
2020        }
2021    }
2022
2023    unsafe impl<D: fidl::encoding::ResourceDialect>
2024        fidl::encoding::Encode<MacAddressingRemoveMulticastAddressResponse, D>
2025        for &MacAddressingRemoveMulticastAddressResponse
2026    {
2027        #[inline]
2028        unsafe fn encode(
2029            self,
2030            encoder: &mut fidl::encoding::Encoder<'_, D>,
2031            offset: usize,
2032            _depth: fidl::encoding::Depth,
2033        ) -> fidl::Result<()> {
2034            encoder.debug_check_bounds::<MacAddressingRemoveMulticastAddressResponse>(offset);
2035            unsafe {
2036                // Copy the object into the buffer.
2037                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2038                (buf_ptr as *mut MacAddressingRemoveMulticastAddressResponse).write_unaligned(
2039                    (self as *const MacAddressingRemoveMulticastAddressResponse).read(),
2040                );
2041                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2042                // done second because the memcpy will write garbage to these bytes.
2043            }
2044            Ok(())
2045        }
2046    }
2047    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i32, D>>
2048        fidl::encoding::Encode<MacAddressingRemoveMulticastAddressResponse, D> for (T0,)
2049    {
2050        #[inline]
2051        unsafe fn encode(
2052            self,
2053            encoder: &mut fidl::encoding::Encoder<'_, D>,
2054            offset: usize,
2055            depth: fidl::encoding::Depth,
2056        ) -> fidl::Result<()> {
2057            encoder.debug_check_bounds::<MacAddressingRemoveMulticastAddressResponse>(offset);
2058            // Zero out padding regions. There's no need to apply masks
2059            // because the unmasked parts will be overwritten by fields.
2060            // Write the fields.
2061            self.0.encode(encoder, offset + 0, depth)?;
2062            Ok(())
2063        }
2064    }
2065
2066    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2067        for MacAddressingRemoveMulticastAddressResponse
2068    {
2069        #[inline(always)]
2070        fn new_empty() -> Self {
2071            Self { status: fidl::new_empty!(i32, D) }
2072        }
2073
2074        #[inline]
2075        unsafe fn decode(
2076            &mut self,
2077            decoder: &mut fidl::encoding::Decoder<'_, D>,
2078            offset: usize,
2079            _depth: fidl::encoding::Depth,
2080        ) -> fidl::Result<()> {
2081            decoder.debug_check_bounds::<Self>(offset);
2082            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
2083            // Verify that padding bytes are zero.
2084            // Copy from the buffer into the object.
2085            unsafe {
2086                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 4);
2087            }
2088            Ok(())
2089        }
2090    }
2091
2092    impl fidl::encoding::ValueTypeMarker for MacAddressingSetModeRequest {
2093        type Borrowed<'a> = &'a Self;
2094        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2095            value
2096        }
2097    }
2098
2099    unsafe impl fidl::encoding::TypeMarker for MacAddressingSetModeRequest {
2100        type Owned = Self;
2101
2102        #[inline(always)]
2103        fn inline_align(_context: fidl::encoding::Context) -> usize {
2104            4
2105        }
2106
2107        #[inline(always)]
2108        fn inline_size(_context: fidl::encoding::Context) -> usize {
2109            4
2110        }
2111    }
2112
2113    unsafe impl<D: fidl::encoding::ResourceDialect>
2114        fidl::encoding::Encode<MacAddressingSetModeRequest, D> for &MacAddressingSetModeRequest
2115    {
2116        #[inline]
2117        unsafe fn encode(
2118            self,
2119            encoder: &mut fidl::encoding::Encoder<'_, D>,
2120            offset: usize,
2121            _depth: fidl::encoding::Depth,
2122        ) -> fidl::Result<()> {
2123            encoder.debug_check_bounds::<MacAddressingSetModeRequest>(offset);
2124            // Delegate to tuple encoding.
2125            fidl::encoding::Encode::<MacAddressingSetModeRequest, D>::encode(
2126                (<MacFilterMode as fidl::encoding::ValueTypeMarker>::borrow(&self.mode),),
2127                encoder,
2128                offset,
2129                _depth,
2130            )
2131        }
2132    }
2133    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<MacFilterMode, D>>
2134        fidl::encoding::Encode<MacAddressingSetModeRequest, D> for (T0,)
2135    {
2136        #[inline]
2137        unsafe fn encode(
2138            self,
2139            encoder: &mut fidl::encoding::Encoder<'_, D>,
2140            offset: usize,
2141            depth: fidl::encoding::Depth,
2142        ) -> fidl::Result<()> {
2143            encoder.debug_check_bounds::<MacAddressingSetModeRequest>(offset);
2144            // Zero out padding regions. There's no need to apply masks
2145            // because the unmasked parts will be overwritten by fields.
2146            // Write the fields.
2147            self.0.encode(encoder, offset + 0, depth)?;
2148            Ok(())
2149        }
2150    }
2151
2152    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2153        for MacAddressingSetModeRequest
2154    {
2155        #[inline(always)]
2156        fn new_empty() -> Self {
2157            Self { mode: fidl::new_empty!(MacFilterMode, D) }
2158        }
2159
2160        #[inline]
2161        unsafe fn decode(
2162            &mut self,
2163            decoder: &mut fidl::encoding::Decoder<'_, D>,
2164            offset: usize,
2165            _depth: fidl::encoding::Depth,
2166        ) -> fidl::Result<()> {
2167            decoder.debug_check_bounds::<Self>(offset);
2168            // Verify that padding bytes are zero.
2169            fidl::decode!(MacFilterMode, D, &mut self.mode, decoder, offset + 0, _depth)?;
2170            Ok(())
2171        }
2172    }
2173
2174    impl fidl::encoding::ValueTypeMarker for MacAddressingSetModeResponse {
2175        type Borrowed<'a> = &'a Self;
2176        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2177            value
2178        }
2179    }
2180
2181    unsafe impl fidl::encoding::TypeMarker for MacAddressingSetModeResponse {
2182        type Owned = Self;
2183
2184        #[inline(always)]
2185        fn inline_align(_context: fidl::encoding::Context) -> usize {
2186            4
2187        }
2188
2189        #[inline(always)]
2190        fn inline_size(_context: fidl::encoding::Context) -> usize {
2191            4
2192        }
2193        #[inline(always)]
2194        fn encode_is_copy() -> bool {
2195            true
2196        }
2197
2198        #[inline(always)]
2199        fn decode_is_copy() -> bool {
2200            true
2201        }
2202    }
2203
2204    unsafe impl<D: fidl::encoding::ResourceDialect>
2205        fidl::encoding::Encode<MacAddressingSetModeResponse, D> for &MacAddressingSetModeResponse
2206    {
2207        #[inline]
2208        unsafe fn encode(
2209            self,
2210            encoder: &mut fidl::encoding::Encoder<'_, D>,
2211            offset: usize,
2212            _depth: fidl::encoding::Depth,
2213        ) -> fidl::Result<()> {
2214            encoder.debug_check_bounds::<MacAddressingSetModeResponse>(offset);
2215            unsafe {
2216                // Copy the object into the buffer.
2217                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2218                (buf_ptr as *mut MacAddressingSetModeResponse)
2219                    .write_unaligned((self as *const MacAddressingSetModeResponse).read());
2220                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2221                // done second because the memcpy will write garbage to these bytes.
2222            }
2223            Ok(())
2224        }
2225    }
2226    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i32, D>>
2227        fidl::encoding::Encode<MacAddressingSetModeResponse, D> for (T0,)
2228    {
2229        #[inline]
2230        unsafe fn encode(
2231            self,
2232            encoder: &mut fidl::encoding::Encoder<'_, D>,
2233            offset: usize,
2234            depth: fidl::encoding::Depth,
2235        ) -> fidl::Result<()> {
2236            encoder.debug_check_bounds::<MacAddressingSetModeResponse>(offset);
2237            // Zero out padding regions. There's no need to apply masks
2238            // because the unmasked parts will be overwritten by fields.
2239            // Write the fields.
2240            self.0.encode(encoder, offset + 0, depth)?;
2241            Ok(())
2242        }
2243    }
2244
2245    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2246        for MacAddressingSetModeResponse
2247    {
2248        #[inline(always)]
2249        fn new_empty() -> Self {
2250            Self { status: fidl::new_empty!(i32, D) }
2251        }
2252
2253        #[inline]
2254        unsafe fn decode(
2255            &mut self,
2256            decoder: &mut fidl::encoding::Decoder<'_, D>,
2257            offset: usize,
2258            _depth: fidl::encoding::Depth,
2259        ) -> fidl::Result<()> {
2260            decoder.debug_check_bounds::<Self>(offset);
2261            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
2262            // Verify that padding bytes are zero.
2263            // Copy from the buffer into the object.
2264            unsafe {
2265                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 4);
2266            }
2267            Ok(())
2268        }
2269    }
2270
2271    impl fidl::encoding::ValueTypeMarker for PortGetInfoResponse {
2272        type Borrowed<'a> = &'a Self;
2273        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2274            value
2275        }
2276    }
2277
2278    unsafe impl fidl::encoding::TypeMarker for PortGetInfoResponse {
2279        type Owned = Self;
2280
2281        #[inline(always)]
2282        fn inline_align(_context: fidl::encoding::Context) -> usize {
2283            8
2284        }
2285
2286        #[inline(always)]
2287        fn inline_size(_context: fidl::encoding::Context) -> usize {
2288            16
2289        }
2290    }
2291
2292    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortGetInfoResponse, D>
2293        for &PortGetInfoResponse
2294    {
2295        #[inline]
2296        unsafe fn encode(
2297            self,
2298            encoder: &mut fidl::encoding::Encoder<'_, D>,
2299            offset: usize,
2300            _depth: fidl::encoding::Depth,
2301        ) -> fidl::Result<()> {
2302            encoder.debug_check_bounds::<PortGetInfoResponse>(offset);
2303            // Delegate to tuple encoding.
2304            fidl::encoding::Encode::<PortGetInfoResponse, D>::encode(
2305                (<PortInfo as fidl::encoding::ValueTypeMarker>::borrow(&self.info),),
2306                encoder,
2307                offset,
2308                _depth,
2309            )
2310        }
2311    }
2312    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<PortInfo, D>>
2313        fidl::encoding::Encode<PortGetInfoResponse, D> for (T0,)
2314    {
2315        #[inline]
2316        unsafe fn encode(
2317            self,
2318            encoder: &mut fidl::encoding::Encoder<'_, D>,
2319            offset: usize,
2320            depth: fidl::encoding::Depth,
2321        ) -> fidl::Result<()> {
2322            encoder.debug_check_bounds::<PortGetInfoResponse>(offset);
2323            // Zero out padding regions. There's no need to apply masks
2324            // because the unmasked parts will be overwritten by fields.
2325            // Write the fields.
2326            self.0.encode(encoder, offset + 0, depth)?;
2327            Ok(())
2328        }
2329    }
2330
2331    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortGetInfoResponse {
2332        #[inline(always)]
2333        fn new_empty() -> Self {
2334            Self { info: fidl::new_empty!(PortInfo, D) }
2335        }
2336
2337        #[inline]
2338        unsafe fn decode(
2339            &mut self,
2340            decoder: &mut fidl::encoding::Decoder<'_, D>,
2341            offset: usize,
2342            _depth: fidl::encoding::Depth,
2343        ) -> fidl::Result<()> {
2344            decoder.debug_check_bounds::<Self>(offset);
2345            // Verify that padding bytes are zero.
2346            fidl::decode!(PortInfo, D, &mut self.info, decoder, offset + 0, _depth)?;
2347            Ok(())
2348        }
2349    }
2350
2351    impl fidl::encoding::ValueTypeMarker for PortGetStatusResponse {
2352        type Borrowed<'a> = &'a Self;
2353        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2354            value
2355        }
2356    }
2357
2358    unsafe impl fidl::encoding::TypeMarker for PortGetStatusResponse {
2359        type Owned = Self;
2360
2361        #[inline(always)]
2362        fn inline_align(_context: fidl::encoding::Context) -> usize {
2363            8
2364        }
2365
2366        #[inline(always)]
2367        fn inline_size(_context: fidl::encoding::Context) -> usize {
2368            16
2369        }
2370    }
2371
2372    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortGetStatusResponse, D>
2373        for &PortGetStatusResponse
2374    {
2375        #[inline]
2376        unsafe fn encode(
2377            self,
2378            encoder: &mut fidl::encoding::Encoder<'_, D>,
2379            offset: usize,
2380            _depth: fidl::encoding::Depth,
2381        ) -> fidl::Result<()> {
2382            encoder.debug_check_bounds::<PortGetStatusResponse>(offset);
2383            // Delegate to tuple encoding.
2384            fidl::encoding::Encode::<PortGetStatusResponse, D>::encode(
2385                (<PortStatus as fidl::encoding::ValueTypeMarker>::borrow(&self.status),),
2386                encoder,
2387                offset,
2388                _depth,
2389            )
2390        }
2391    }
2392    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<PortStatus, D>>
2393        fidl::encoding::Encode<PortGetStatusResponse, D> for (T0,)
2394    {
2395        #[inline]
2396        unsafe fn encode(
2397            self,
2398            encoder: &mut fidl::encoding::Encoder<'_, D>,
2399            offset: usize,
2400            depth: fidl::encoding::Depth,
2401        ) -> fidl::Result<()> {
2402            encoder.debug_check_bounds::<PortGetStatusResponse>(offset);
2403            // Zero out padding regions. There's no need to apply masks
2404            // because the unmasked parts will be overwritten by fields.
2405            // Write the fields.
2406            self.0.encode(encoder, offset + 0, depth)?;
2407            Ok(())
2408        }
2409    }
2410
2411    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortGetStatusResponse {
2412        #[inline(always)]
2413        fn new_empty() -> Self {
2414            Self { status: fidl::new_empty!(PortStatus, D) }
2415        }
2416
2417        #[inline]
2418        unsafe fn decode(
2419            &mut self,
2420            decoder: &mut fidl::encoding::Decoder<'_, D>,
2421            offset: usize,
2422            _depth: fidl::encoding::Depth,
2423        ) -> fidl::Result<()> {
2424            decoder.debug_check_bounds::<Self>(offset);
2425            // Verify that padding bytes are zero.
2426            fidl::decode!(PortStatus, D, &mut self.status, decoder, offset + 0, _depth)?;
2427            Ok(())
2428        }
2429    }
2430
2431    impl fidl::encoding::ValueTypeMarker for PortId {
2432        type Borrowed<'a> = &'a Self;
2433        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2434            value
2435        }
2436    }
2437
2438    unsafe impl fidl::encoding::TypeMarker for PortId {
2439        type Owned = Self;
2440
2441        #[inline(always)]
2442        fn inline_align(_context: fidl::encoding::Context) -> usize {
2443            1
2444        }
2445
2446        #[inline(always)]
2447        fn inline_size(_context: fidl::encoding::Context) -> usize {
2448            2
2449        }
2450        #[inline(always)]
2451        fn encode_is_copy() -> bool {
2452            true
2453        }
2454
2455        #[inline(always)]
2456        fn decode_is_copy() -> bool {
2457            true
2458        }
2459    }
2460
2461    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortId, D> for &PortId {
2462        #[inline]
2463        unsafe fn encode(
2464            self,
2465            encoder: &mut fidl::encoding::Encoder<'_, D>,
2466            offset: usize,
2467            _depth: fidl::encoding::Depth,
2468        ) -> fidl::Result<()> {
2469            encoder.debug_check_bounds::<PortId>(offset);
2470            unsafe {
2471                // Copy the object into the buffer.
2472                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2473                (buf_ptr as *mut PortId).write_unaligned((self as *const PortId).read());
2474                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2475                // done second because the memcpy will write garbage to these bytes.
2476            }
2477            Ok(())
2478        }
2479    }
2480    unsafe impl<
2481        D: fidl::encoding::ResourceDialect,
2482        T0: fidl::encoding::Encode<u8, D>,
2483        T1: fidl::encoding::Encode<u8, D>,
2484    > fidl::encoding::Encode<PortId, D> for (T0, T1)
2485    {
2486        #[inline]
2487        unsafe fn encode(
2488            self,
2489            encoder: &mut fidl::encoding::Encoder<'_, D>,
2490            offset: usize,
2491            depth: fidl::encoding::Depth,
2492        ) -> fidl::Result<()> {
2493            encoder.debug_check_bounds::<PortId>(offset);
2494            // Zero out padding regions. There's no need to apply masks
2495            // because the unmasked parts will be overwritten by fields.
2496            // Write the fields.
2497            self.0.encode(encoder, offset + 0, depth)?;
2498            self.1.encode(encoder, offset + 1, depth)?;
2499            Ok(())
2500        }
2501    }
2502
2503    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortId {
2504        #[inline(always)]
2505        fn new_empty() -> Self {
2506            Self { base: fidl::new_empty!(u8, D), salt: fidl::new_empty!(u8, D) }
2507        }
2508
2509        #[inline]
2510        unsafe fn decode(
2511            &mut self,
2512            decoder: &mut fidl::encoding::Decoder<'_, D>,
2513            offset: usize,
2514            _depth: fidl::encoding::Depth,
2515        ) -> fidl::Result<()> {
2516            decoder.debug_check_bounds::<Self>(offset);
2517            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
2518            // Verify that padding bytes are zero.
2519            // Copy from the buffer into the object.
2520            unsafe {
2521                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 2);
2522            }
2523            Ok(())
2524        }
2525    }
2526
2527    impl fidl::encoding::ValueTypeMarker for PortWatcherWatchResponse {
2528        type Borrowed<'a> = &'a Self;
2529        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2530            value
2531        }
2532    }
2533
2534    unsafe impl fidl::encoding::TypeMarker for PortWatcherWatchResponse {
2535        type Owned = Self;
2536
2537        #[inline(always)]
2538        fn inline_align(_context: fidl::encoding::Context) -> usize {
2539            8
2540        }
2541
2542        #[inline(always)]
2543        fn inline_size(_context: fidl::encoding::Context) -> usize {
2544            16
2545        }
2546    }
2547
2548    unsafe impl<D: fidl::encoding::ResourceDialect>
2549        fidl::encoding::Encode<PortWatcherWatchResponse, D> for &PortWatcherWatchResponse
2550    {
2551        #[inline]
2552        unsafe fn encode(
2553            self,
2554            encoder: &mut fidl::encoding::Encoder<'_, D>,
2555            offset: usize,
2556            _depth: fidl::encoding::Depth,
2557        ) -> fidl::Result<()> {
2558            encoder.debug_check_bounds::<PortWatcherWatchResponse>(offset);
2559            // Delegate to tuple encoding.
2560            fidl::encoding::Encode::<PortWatcherWatchResponse, D>::encode(
2561                (<DevicePortEvent as fidl::encoding::ValueTypeMarker>::borrow(&self.event),),
2562                encoder,
2563                offset,
2564                _depth,
2565            )
2566        }
2567    }
2568    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<DevicePortEvent, D>>
2569        fidl::encoding::Encode<PortWatcherWatchResponse, D> for (T0,)
2570    {
2571        #[inline]
2572        unsafe fn encode(
2573            self,
2574            encoder: &mut fidl::encoding::Encoder<'_, D>,
2575            offset: usize,
2576            depth: fidl::encoding::Depth,
2577        ) -> fidl::Result<()> {
2578            encoder.debug_check_bounds::<PortWatcherWatchResponse>(offset);
2579            // Zero out padding regions. There's no need to apply masks
2580            // because the unmasked parts will be overwritten by fields.
2581            // Write the fields.
2582            self.0.encode(encoder, offset + 0, depth)?;
2583            Ok(())
2584        }
2585    }
2586
2587    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2588        for PortWatcherWatchResponse
2589    {
2590        #[inline(always)]
2591        fn new_empty() -> Self {
2592            Self { event: fidl::new_empty!(DevicePortEvent, D) }
2593        }
2594
2595        #[inline]
2596        unsafe fn decode(
2597            &mut self,
2598            decoder: &mut fidl::encoding::Decoder<'_, D>,
2599            offset: usize,
2600            _depth: fidl::encoding::Depth,
2601        ) -> fidl::Result<()> {
2602            decoder.debug_check_bounds::<Self>(offset);
2603            // Verify that padding bytes are zero.
2604            fidl::decode!(DevicePortEvent, D, &mut self.event, decoder, offset + 0, _depth)?;
2605            Ok(())
2606        }
2607    }
2608
2609    impl fidl::encoding::ValueTypeMarker for SessionAttachRequest {
2610        type Borrowed<'a> = &'a Self;
2611        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2612            value
2613        }
2614    }
2615
2616    unsafe impl fidl::encoding::TypeMarker for SessionAttachRequest {
2617        type Owned = Self;
2618
2619        #[inline(always)]
2620        fn inline_align(_context: fidl::encoding::Context) -> usize {
2621            8
2622        }
2623
2624        #[inline(always)]
2625        fn inline_size(_context: fidl::encoding::Context) -> usize {
2626            24
2627        }
2628    }
2629
2630    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SessionAttachRequest, D>
2631        for &SessionAttachRequest
2632    {
2633        #[inline]
2634        unsafe fn encode(
2635            self,
2636            encoder: &mut fidl::encoding::Encoder<'_, D>,
2637            offset: usize,
2638            _depth: fidl::encoding::Depth,
2639        ) -> fidl::Result<()> {
2640            encoder.debug_check_bounds::<SessionAttachRequest>(offset);
2641            // Delegate to tuple encoding.
2642            fidl::encoding::Encode::<SessionAttachRequest, D>::encode(
2643                (
2644                    <PortId as fidl::encoding::ValueTypeMarker>::borrow(&self.port),
2645                    <fidl::encoding::Vector<FrameType, 4> as fidl::encoding::ValueTypeMarker>::borrow(&self.rx_frames),
2646                ),
2647                encoder, offset, _depth
2648            )
2649        }
2650    }
2651    unsafe impl<
2652        D: fidl::encoding::ResourceDialect,
2653        T0: fidl::encoding::Encode<PortId, D>,
2654        T1: fidl::encoding::Encode<fidl::encoding::Vector<FrameType, 4>, D>,
2655    > fidl::encoding::Encode<SessionAttachRequest, D> for (T0, T1)
2656    {
2657        #[inline]
2658        unsafe fn encode(
2659            self,
2660            encoder: &mut fidl::encoding::Encoder<'_, D>,
2661            offset: usize,
2662            depth: fidl::encoding::Depth,
2663        ) -> fidl::Result<()> {
2664            encoder.debug_check_bounds::<SessionAttachRequest>(offset);
2665            // Zero out padding regions. There's no need to apply masks
2666            // because the unmasked parts will be overwritten by fields.
2667            unsafe {
2668                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
2669                (ptr as *mut u64).write_unaligned(0);
2670            }
2671            // Write the fields.
2672            self.0.encode(encoder, offset + 0, depth)?;
2673            self.1.encode(encoder, offset + 8, depth)?;
2674            Ok(())
2675        }
2676    }
2677
2678    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SessionAttachRequest {
2679        #[inline(always)]
2680        fn new_empty() -> Self {
2681            Self {
2682                port: fidl::new_empty!(PortId, D),
2683                rx_frames: fidl::new_empty!(fidl::encoding::Vector<FrameType, 4>, D),
2684            }
2685        }
2686
2687        #[inline]
2688        unsafe fn decode(
2689            &mut self,
2690            decoder: &mut fidl::encoding::Decoder<'_, D>,
2691            offset: usize,
2692            _depth: fidl::encoding::Depth,
2693        ) -> fidl::Result<()> {
2694            decoder.debug_check_bounds::<Self>(offset);
2695            // Verify that padding bytes are zero.
2696            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
2697            let padval = unsafe { (ptr as *const u64).read_unaligned() };
2698            let mask = 0xffffffffffff0000u64;
2699            let maskedval = padval & mask;
2700            if maskedval != 0 {
2701                return Err(fidl::Error::NonZeroPadding {
2702                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
2703                });
2704            }
2705            fidl::decode!(PortId, D, &mut self.port, decoder, offset + 0, _depth)?;
2706            fidl::decode!(fidl::encoding::Vector<FrameType, 4>, D, &mut self.rx_frames, decoder, offset + 8, _depth)?;
2707            Ok(())
2708        }
2709    }
2710
2711    impl fidl::encoding::ValueTypeMarker for SessionDetachRequest {
2712        type Borrowed<'a> = &'a Self;
2713        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2714            value
2715        }
2716    }
2717
2718    unsafe impl fidl::encoding::TypeMarker for SessionDetachRequest {
2719        type Owned = Self;
2720
2721        #[inline(always)]
2722        fn inline_align(_context: fidl::encoding::Context) -> usize {
2723            1
2724        }
2725
2726        #[inline(always)]
2727        fn inline_size(_context: fidl::encoding::Context) -> usize {
2728            2
2729        }
2730        #[inline(always)]
2731        fn encode_is_copy() -> bool {
2732            true
2733        }
2734
2735        #[inline(always)]
2736        fn decode_is_copy() -> bool {
2737            true
2738        }
2739    }
2740
2741    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SessionDetachRequest, D>
2742        for &SessionDetachRequest
2743    {
2744        #[inline]
2745        unsafe fn encode(
2746            self,
2747            encoder: &mut fidl::encoding::Encoder<'_, D>,
2748            offset: usize,
2749            _depth: fidl::encoding::Depth,
2750        ) -> fidl::Result<()> {
2751            encoder.debug_check_bounds::<SessionDetachRequest>(offset);
2752            unsafe {
2753                // Copy the object into the buffer.
2754                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2755                (buf_ptr as *mut SessionDetachRequest)
2756                    .write_unaligned((self as *const SessionDetachRequest).read());
2757                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2758                // done second because the memcpy will write garbage to these bytes.
2759            }
2760            Ok(())
2761        }
2762    }
2763    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<PortId, D>>
2764        fidl::encoding::Encode<SessionDetachRequest, D> for (T0,)
2765    {
2766        #[inline]
2767        unsafe fn encode(
2768            self,
2769            encoder: &mut fidl::encoding::Encoder<'_, D>,
2770            offset: usize,
2771            depth: fidl::encoding::Depth,
2772        ) -> fidl::Result<()> {
2773            encoder.debug_check_bounds::<SessionDetachRequest>(offset);
2774            // Zero out padding regions. There's no need to apply masks
2775            // because the unmasked parts will be overwritten by fields.
2776            // Write the fields.
2777            self.0.encode(encoder, offset + 0, depth)?;
2778            Ok(())
2779        }
2780    }
2781
2782    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SessionDetachRequest {
2783        #[inline(always)]
2784        fn new_empty() -> Self {
2785            Self { port: fidl::new_empty!(PortId, D) }
2786        }
2787
2788        #[inline]
2789        unsafe fn decode(
2790            &mut self,
2791            decoder: &mut fidl::encoding::Decoder<'_, D>,
2792            offset: usize,
2793            _depth: fidl::encoding::Depth,
2794        ) -> fidl::Result<()> {
2795            decoder.debug_check_bounds::<Self>(offset);
2796            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
2797            // Verify that padding bytes are zero.
2798            // Copy from the buffer into the object.
2799            unsafe {
2800                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 2);
2801            }
2802            Ok(())
2803        }
2804    }
2805
2806    impl fidl::encoding::ValueTypeMarker for SessionRegisterForTxResponse {
2807        type Borrowed<'a> = &'a Self;
2808        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2809            value
2810        }
2811    }
2812
2813    unsafe impl fidl::encoding::TypeMarker for SessionRegisterForTxResponse {
2814        type Owned = Self;
2815
2816        #[inline(always)]
2817        fn inline_align(_context: fidl::encoding::Context) -> usize {
2818            4
2819        }
2820
2821        #[inline(always)]
2822        fn inline_size(_context: fidl::encoding::Context) -> usize {
2823            8
2824        }
2825    }
2826
2827    unsafe impl<D: fidl::encoding::ResourceDialect>
2828        fidl::encoding::Encode<SessionRegisterForTxResponse, D> for &SessionRegisterForTxResponse
2829    {
2830        #[inline]
2831        unsafe fn encode(
2832            self,
2833            encoder: &mut fidl::encoding::Encoder<'_, D>,
2834            offset: usize,
2835            _depth: fidl::encoding::Depth,
2836        ) -> fidl::Result<()> {
2837            encoder.debug_check_bounds::<SessionRegisterForTxResponse>(offset);
2838            unsafe {
2839                // Copy the object into the buffer.
2840                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2841                (buf_ptr as *mut SessionRegisterForTxResponse)
2842                    .write_unaligned((self as *const SessionRegisterForTxResponse).read());
2843                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2844                // done second because the memcpy will write garbage to these bytes.
2845                let padding_ptr = buf_ptr.offset(0) as *mut u32;
2846                let padding_mask = 0xffffff00u32;
2847                padding_ptr.write_unaligned(padding_ptr.read_unaligned() & !padding_mask);
2848            }
2849            Ok(())
2850        }
2851    }
2852    unsafe impl<
2853        D: fidl::encoding::ResourceDialect,
2854        T0: fidl::encoding::Encode<u8, D>,
2855        T1: fidl::encoding::Encode<i32, D>,
2856    > fidl::encoding::Encode<SessionRegisterForTxResponse, D> for (T0, T1)
2857    {
2858        #[inline]
2859        unsafe fn encode(
2860            self,
2861            encoder: &mut fidl::encoding::Encoder<'_, D>,
2862            offset: usize,
2863            depth: fidl::encoding::Depth,
2864        ) -> fidl::Result<()> {
2865            encoder.debug_check_bounds::<SessionRegisterForTxResponse>(offset);
2866            // Zero out padding regions. There's no need to apply masks
2867            // because the unmasked parts will be overwritten by fields.
2868            unsafe {
2869                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
2870                (ptr as *mut u32).write_unaligned(0);
2871            }
2872            // Write the fields.
2873            self.0.encode(encoder, offset + 0, depth)?;
2874            self.1.encode(encoder, offset + 4, depth)?;
2875            Ok(())
2876        }
2877    }
2878
2879    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2880        for SessionRegisterForTxResponse
2881    {
2882        #[inline(always)]
2883        fn new_empty() -> Self {
2884            Self { successful: fidl::new_empty!(u8, D), status: fidl::new_empty!(i32, D) }
2885        }
2886
2887        #[inline]
2888        unsafe fn decode(
2889            &mut self,
2890            decoder: &mut fidl::encoding::Decoder<'_, D>,
2891            offset: usize,
2892            _depth: fidl::encoding::Depth,
2893        ) -> fidl::Result<()> {
2894            decoder.debug_check_bounds::<Self>(offset);
2895            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
2896            // Verify that padding bytes are zero.
2897            let ptr = unsafe { buf_ptr.offset(0) };
2898            let padval = unsafe { (ptr as *const u32).read_unaligned() };
2899            let mask = 0xffffff00u32;
2900            let maskedval = padval & mask;
2901            if maskedval != 0 {
2902                return Err(fidl::Error::NonZeroPadding {
2903                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
2904                });
2905            }
2906            // Copy from the buffer into the object.
2907            unsafe {
2908                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
2909            }
2910            Ok(())
2911        }
2912    }
2913
2914    impl fidl::encoding::ValueTypeMarker for SessionUnregisterForTxResponse {
2915        type Borrowed<'a> = &'a Self;
2916        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2917            value
2918        }
2919    }
2920
2921    unsafe impl fidl::encoding::TypeMarker for SessionUnregisterForTxResponse {
2922        type Owned = Self;
2923
2924        #[inline(always)]
2925        fn inline_align(_context: fidl::encoding::Context) -> usize {
2926            4
2927        }
2928
2929        #[inline(always)]
2930        fn inline_size(_context: fidl::encoding::Context) -> usize {
2931            8
2932        }
2933    }
2934
2935    unsafe impl<D: fidl::encoding::ResourceDialect>
2936        fidl::encoding::Encode<SessionUnregisterForTxResponse, D>
2937        for &SessionUnregisterForTxResponse
2938    {
2939        #[inline]
2940        unsafe fn encode(
2941            self,
2942            encoder: &mut fidl::encoding::Encoder<'_, D>,
2943            offset: usize,
2944            _depth: fidl::encoding::Depth,
2945        ) -> fidl::Result<()> {
2946            encoder.debug_check_bounds::<SessionUnregisterForTxResponse>(offset);
2947            unsafe {
2948                // Copy the object into the buffer.
2949                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2950                (buf_ptr as *mut SessionUnregisterForTxResponse)
2951                    .write_unaligned((self as *const SessionUnregisterForTxResponse).read());
2952                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2953                // done second because the memcpy will write garbage to these bytes.
2954                let padding_ptr = buf_ptr.offset(0) as *mut u32;
2955                let padding_mask = 0xffffff00u32;
2956                padding_ptr.write_unaligned(padding_ptr.read_unaligned() & !padding_mask);
2957            }
2958            Ok(())
2959        }
2960    }
2961    unsafe impl<
2962        D: fidl::encoding::ResourceDialect,
2963        T0: fidl::encoding::Encode<u8, D>,
2964        T1: fidl::encoding::Encode<i32, D>,
2965    > fidl::encoding::Encode<SessionUnregisterForTxResponse, D> for (T0, T1)
2966    {
2967        #[inline]
2968        unsafe fn encode(
2969            self,
2970            encoder: &mut fidl::encoding::Encoder<'_, D>,
2971            offset: usize,
2972            depth: fidl::encoding::Depth,
2973        ) -> fidl::Result<()> {
2974            encoder.debug_check_bounds::<SessionUnregisterForTxResponse>(offset);
2975            // Zero out padding regions. There's no need to apply masks
2976            // because the unmasked parts will be overwritten by fields.
2977            unsafe {
2978                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
2979                (ptr as *mut u32).write_unaligned(0);
2980            }
2981            // Write the fields.
2982            self.0.encode(encoder, offset + 0, depth)?;
2983            self.1.encode(encoder, offset + 4, depth)?;
2984            Ok(())
2985        }
2986    }
2987
2988    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2989        for SessionUnregisterForTxResponse
2990    {
2991        #[inline(always)]
2992        fn new_empty() -> Self {
2993            Self { successful: fidl::new_empty!(u8, D), status: fidl::new_empty!(i32, D) }
2994        }
2995
2996        #[inline]
2997        unsafe fn decode(
2998            &mut self,
2999            decoder: &mut fidl::encoding::Decoder<'_, D>,
3000            offset: usize,
3001            _depth: fidl::encoding::Depth,
3002        ) -> fidl::Result<()> {
3003            decoder.debug_check_bounds::<Self>(offset);
3004            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
3005            // Verify that padding bytes are zero.
3006            let ptr = unsafe { buf_ptr.offset(0) };
3007            let padval = unsafe { (ptr as *const u32).read_unaligned() };
3008            let mask = 0xffffff00u32;
3009            let maskedval = padval & mask;
3010            if maskedval != 0 {
3011                return Err(fidl::Error::NonZeroPadding {
3012                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
3013                });
3014            }
3015            // Copy from the buffer into the object.
3016            unsafe {
3017                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
3018            }
3019            Ok(())
3020        }
3021    }
3022
3023    impl fidl::encoding::ValueTypeMarker for StatusWatcherWatchStatusResponse {
3024        type Borrowed<'a> = &'a Self;
3025        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3026            value
3027        }
3028    }
3029
3030    unsafe impl fidl::encoding::TypeMarker for StatusWatcherWatchStatusResponse {
3031        type Owned = Self;
3032
3033        #[inline(always)]
3034        fn inline_align(_context: fidl::encoding::Context) -> usize {
3035            8
3036        }
3037
3038        #[inline(always)]
3039        fn inline_size(_context: fidl::encoding::Context) -> usize {
3040            16
3041        }
3042    }
3043
3044    unsafe impl<D: fidl::encoding::ResourceDialect>
3045        fidl::encoding::Encode<StatusWatcherWatchStatusResponse, D>
3046        for &StatusWatcherWatchStatusResponse
3047    {
3048        #[inline]
3049        unsafe fn encode(
3050            self,
3051            encoder: &mut fidl::encoding::Encoder<'_, D>,
3052            offset: usize,
3053            _depth: fidl::encoding::Depth,
3054        ) -> fidl::Result<()> {
3055            encoder.debug_check_bounds::<StatusWatcherWatchStatusResponse>(offset);
3056            // Delegate to tuple encoding.
3057            fidl::encoding::Encode::<StatusWatcherWatchStatusResponse, D>::encode(
3058                (<PortStatus as fidl::encoding::ValueTypeMarker>::borrow(&self.port_status),),
3059                encoder,
3060                offset,
3061                _depth,
3062            )
3063        }
3064    }
3065    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<PortStatus, D>>
3066        fidl::encoding::Encode<StatusWatcherWatchStatusResponse, D> for (T0,)
3067    {
3068        #[inline]
3069        unsafe fn encode(
3070            self,
3071            encoder: &mut fidl::encoding::Encoder<'_, D>,
3072            offset: usize,
3073            depth: fidl::encoding::Depth,
3074        ) -> fidl::Result<()> {
3075            encoder.debug_check_bounds::<StatusWatcherWatchStatusResponse>(offset);
3076            // Zero out padding regions. There's no need to apply masks
3077            // because the unmasked parts will be overwritten by fields.
3078            // Write the fields.
3079            self.0.encode(encoder, offset + 0, depth)?;
3080            Ok(())
3081        }
3082    }
3083
3084    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
3085        for StatusWatcherWatchStatusResponse
3086    {
3087        #[inline(always)]
3088        fn new_empty() -> Self {
3089            Self { port_status: fidl::new_empty!(PortStatus, D) }
3090        }
3091
3092        #[inline]
3093        unsafe fn decode(
3094            &mut self,
3095            decoder: &mut fidl::encoding::Decoder<'_, D>,
3096            offset: usize,
3097            _depth: fidl::encoding::Depth,
3098        ) -> fidl::Result<()> {
3099            decoder.debug_check_bounds::<Self>(offset);
3100            // Verify that padding bytes are zero.
3101            fidl::decode!(PortStatus, D, &mut self.port_status, decoder, offset + 0, _depth)?;
3102            Ok(())
3103        }
3104    }
3105
3106    impl DeviceBaseInfo {
3107        #[inline(always)]
3108        fn max_ordinal_present(&self) -> u64 {
3109            if let Some(_) = self.min_rx_buffers {
3110                return 12;
3111            }
3112            if let Some(_) = self.max_buffer_parts {
3113                return 9;
3114            }
3115            if let Some(_) = self.min_tx_buffer_tail {
3116                return 8;
3117            }
3118            if let Some(_) = self.min_tx_buffer_head {
3119                return 7;
3120            }
3121            if let Some(_) = self.min_tx_buffer_length {
3122                return 6;
3123            }
3124            if let Some(_) = self.min_rx_buffer_length {
3125                return 5;
3126            }
3127            if let Some(_) = self.max_buffer_length {
3128                return 4;
3129            }
3130            if let Some(_) = self.buffer_alignment {
3131                return 3;
3132            }
3133            if let Some(_) = self.tx_depth {
3134                return 2;
3135            }
3136            if let Some(_) = self.rx_depth {
3137                return 1;
3138            }
3139            0
3140        }
3141    }
3142
3143    impl fidl::encoding::ValueTypeMarker for DeviceBaseInfo {
3144        type Borrowed<'a> = &'a Self;
3145        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3146            value
3147        }
3148    }
3149
3150    unsafe impl fidl::encoding::TypeMarker for DeviceBaseInfo {
3151        type Owned = Self;
3152
3153        #[inline(always)]
3154        fn inline_align(_context: fidl::encoding::Context) -> usize {
3155            8
3156        }
3157
3158        #[inline(always)]
3159        fn inline_size(_context: fidl::encoding::Context) -> usize {
3160            16
3161        }
3162    }
3163
3164    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DeviceBaseInfo, D>
3165        for &DeviceBaseInfo
3166    {
3167        unsafe fn encode(
3168            self,
3169            encoder: &mut fidl::encoding::Encoder<'_, D>,
3170            offset: usize,
3171            mut depth: fidl::encoding::Depth,
3172        ) -> fidl::Result<()> {
3173            encoder.debug_check_bounds::<DeviceBaseInfo>(offset);
3174            // Vector header
3175            let max_ordinal: u64 = self.max_ordinal_present();
3176            encoder.write_num(max_ordinal, offset);
3177            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3178            // Calling encoder.out_of_line_offset(0) is not allowed.
3179            if max_ordinal == 0 {
3180                return Ok(());
3181            }
3182            depth.increment()?;
3183            let envelope_size = 8;
3184            let bytes_len = max_ordinal as usize * envelope_size;
3185            #[allow(unused_variables)]
3186            let offset = encoder.out_of_line_offset(bytes_len);
3187            let mut _prev_end_offset: usize = 0;
3188            if 1 > max_ordinal {
3189                return Ok(());
3190            }
3191
3192            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3193            // are envelope_size bytes.
3194            let cur_offset: usize = (1 - 1) * envelope_size;
3195
3196            // Zero reserved fields.
3197            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3198
3199            // Safety:
3200            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3201            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3202            //   envelope_size bytes, there is always sufficient room.
3203            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3204                self.rx_depth.as_ref().map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3205                encoder,
3206                offset + cur_offset,
3207                depth,
3208            )?;
3209
3210            _prev_end_offset = cur_offset + envelope_size;
3211            if 2 > max_ordinal {
3212                return Ok(());
3213            }
3214
3215            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3216            // are envelope_size bytes.
3217            let cur_offset: usize = (2 - 1) * envelope_size;
3218
3219            // Zero reserved fields.
3220            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3221
3222            // Safety:
3223            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3224            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3225            //   envelope_size bytes, there is always sufficient room.
3226            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3227                self.tx_depth.as_ref().map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3228                encoder,
3229                offset + cur_offset,
3230                depth,
3231            )?;
3232
3233            _prev_end_offset = cur_offset + envelope_size;
3234            if 3 > max_ordinal {
3235                return Ok(());
3236            }
3237
3238            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3239            // are envelope_size bytes.
3240            let cur_offset: usize = (3 - 1) * envelope_size;
3241
3242            // Zero reserved fields.
3243            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3244
3245            // Safety:
3246            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3247            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3248            //   envelope_size bytes, there is always sufficient room.
3249            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3250                self.buffer_alignment
3251                    .as_ref()
3252                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3253                encoder,
3254                offset + cur_offset,
3255                depth,
3256            )?;
3257
3258            _prev_end_offset = cur_offset + envelope_size;
3259            if 4 > max_ordinal {
3260                return Ok(());
3261            }
3262
3263            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3264            // are envelope_size bytes.
3265            let cur_offset: usize = (4 - 1) * envelope_size;
3266
3267            // Zero reserved fields.
3268            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3269
3270            // Safety:
3271            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3272            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3273            //   envelope_size bytes, there is always sufficient room.
3274            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3275                self.max_buffer_length
3276                    .as_ref()
3277                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3278                encoder,
3279                offset + cur_offset,
3280                depth,
3281            )?;
3282
3283            _prev_end_offset = cur_offset + envelope_size;
3284            if 5 > max_ordinal {
3285                return Ok(());
3286            }
3287
3288            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3289            // are envelope_size bytes.
3290            let cur_offset: usize = (5 - 1) * envelope_size;
3291
3292            // Zero reserved fields.
3293            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3294
3295            // Safety:
3296            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3297            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3298            //   envelope_size bytes, there is always sufficient room.
3299            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3300                self.min_rx_buffer_length
3301                    .as_ref()
3302                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3303                encoder,
3304                offset + cur_offset,
3305                depth,
3306            )?;
3307
3308            _prev_end_offset = cur_offset + envelope_size;
3309            if 6 > max_ordinal {
3310                return Ok(());
3311            }
3312
3313            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3314            // are envelope_size bytes.
3315            let cur_offset: usize = (6 - 1) * envelope_size;
3316
3317            // Zero reserved fields.
3318            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3319
3320            // Safety:
3321            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3322            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3323            //   envelope_size bytes, there is always sufficient room.
3324            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3325                self.min_tx_buffer_length
3326                    .as_ref()
3327                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3328                encoder,
3329                offset + cur_offset,
3330                depth,
3331            )?;
3332
3333            _prev_end_offset = cur_offset + envelope_size;
3334            if 7 > max_ordinal {
3335                return Ok(());
3336            }
3337
3338            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3339            // are envelope_size bytes.
3340            let cur_offset: usize = (7 - 1) * envelope_size;
3341
3342            // Zero reserved fields.
3343            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3344
3345            // Safety:
3346            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3347            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3348            //   envelope_size bytes, there is always sufficient room.
3349            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3350                self.min_tx_buffer_head
3351                    .as_ref()
3352                    .map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3353                encoder,
3354                offset + cur_offset,
3355                depth,
3356            )?;
3357
3358            _prev_end_offset = cur_offset + envelope_size;
3359            if 8 > max_ordinal {
3360                return Ok(());
3361            }
3362
3363            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3364            // are envelope_size bytes.
3365            let cur_offset: usize = (8 - 1) * envelope_size;
3366
3367            // Zero reserved fields.
3368            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3369
3370            // Safety:
3371            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3372            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3373            //   envelope_size bytes, there is always sufficient room.
3374            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3375                self.min_tx_buffer_tail
3376                    .as_ref()
3377                    .map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3378                encoder,
3379                offset + cur_offset,
3380                depth,
3381            )?;
3382
3383            _prev_end_offset = cur_offset + envelope_size;
3384            if 9 > max_ordinal {
3385                return Ok(());
3386            }
3387
3388            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3389            // are envelope_size bytes.
3390            let cur_offset: usize = (9 - 1) * envelope_size;
3391
3392            // Zero reserved fields.
3393            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3394
3395            // Safety:
3396            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3397            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3398            //   envelope_size bytes, there is always sufficient room.
3399            fidl::encoding::encode_in_envelope_optional::<u8, D>(
3400                self.max_buffer_parts.as_ref().map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
3401                encoder,
3402                offset + cur_offset,
3403                depth,
3404            )?;
3405
3406            _prev_end_offset = cur_offset + envelope_size;
3407            if 12 > max_ordinal {
3408                return Ok(());
3409            }
3410
3411            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3412            // are envelope_size bytes.
3413            let cur_offset: usize = (12 - 1) * envelope_size;
3414
3415            // Zero reserved fields.
3416            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3417
3418            // Safety:
3419            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3420            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3421            //   envelope_size bytes, there is always sufficient room.
3422            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3423                self.min_rx_buffers.as_ref().map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3424                encoder,
3425                offset + cur_offset,
3426                depth,
3427            )?;
3428
3429            _prev_end_offset = cur_offset + envelope_size;
3430
3431            Ok(())
3432        }
3433    }
3434
3435    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DeviceBaseInfo {
3436        #[inline(always)]
3437        fn new_empty() -> Self {
3438            Self::default()
3439        }
3440
3441        unsafe fn decode(
3442            &mut self,
3443            decoder: &mut fidl::encoding::Decoder<'_, D>,
3444            offset: usize,
3445            mut depth: fidl::encoding::Depth,
3446        ) -> fidl::Result<()> {
3447            decoder.debug_check_bounds::<Self>(offset);
3448            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3449                None => return Err(fidl::Error::NotNullable),
3450                Some(len) => len,
3451            };
3452            // Calling decoder.out_of_line_offset(0) is not allowed.
3453            if len == 0 {
3454                return Ok(());
3455            };
3456            depth.increment()?;
3457            let envelope_size = 8;
3458            let bytes_len = len * envelope_size;
3459            let offset = decoder.out_of_line_offset(bytes_len)?;
3460            // Decode the envelope for each type.
3461            let mut _next_ordinal_to_read = 0;
3462            let mut next_offset = offset;
3463            let end_offset = offset + bytes_len;
3464            _next_ordinal_to_read += 1;
3465            if next_offset >= end_offset {
3466                return Ok(());
3467            }
3468
3469            // Decode unknown envelopes for gaps in ordinals.
3470            while _next_ordinal_to_read < 1 {
3471                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3472                _next_ordinal_to_read += 1;
3473                next_offset += envelope_size;
3474            }
3475
3476            let next_out_of_line = decoder.next_out_of_line();
3477            let handles_before = decoder.remaining_handles();
3478            if let Some((inlined, num_bytes, num_handles)) =
3479                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3480            {
3481                let member_inline_size =
3482                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3483                if inlined != (member_inline_size <= 4) {
3484                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3485                }
3486                let inner_offset;
3487                let mut inner_depth = depth.clone();
3488                if inlined {
3489                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3490                    inner_offset = next_offset;
3491                } else {
3492                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3493                    inner_depth.increment()?;
3494                }
3495                let val_ref = self.rx_depth.get_or_insert_with(|| fidl::new_empty!(u16, D));
3496                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3497                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3498                {
3499                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3500                }
3501                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3502                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3503                }
3504            }
3505
3506            next_offset += envelope_size;
3507            _next_ordinal_to_read += 1;
3508            if next_offset >= end_offset {
3509                return Ok(());
3510            }
3511
3512            // Decode unknown envelopes for gaps in ordinals.
3513            while _next_ordinal_to_read < 2 {
3514                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3515                _next_ordinal_to_read += 1;
3516                next_offset += envelope_size;
3517            }
3518
3519            let next_out_of_line = decoder.next_out_of_line();
3520            let handles_before = decoder.remaining_handles();
3521            if let Some((inlined, num_bytes, num_handles)) =
3522                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3523            {
3524                let member_inline_size =
3525                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3526                if inlined != (member_inline_size <= 4) {
3527                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3528                }
3529                let inner_offset;
3530                let mut inner_depth = depth.clone();
3531                if inlined {
3532                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3533                    inner_offset = next_offset;
3534                } else {
3535                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3536                    inner_depth.increment()?;
3537                }
3538                let val_ref = self.tx_depth.get_or_insert_with(|| fidl::new_empty!(u16, D));
3539                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3540                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3541                {
3542                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3543                }
3544                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3545                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3546                }
3547            }
3548
3549            next_offset += envelope_size;
3550            _next_ordinal_to_read += 1;
3551            if next_offset >= end_offset {
3552                return Ok(());
3553            }
3554
3555            // Decode unknown envelopes for gaps in ordinals.
3556            while _next_ordinal_to_read < 3 {
3557                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3558                _next_ordinal_to_read += 1;
3559                next_offset += envelope_size;
3560            }
3561
3562            let next_out_of_line = decoder.next_out_of_line();
3563            let handles_before = decoder.remaining_handles();
3564            if let Some((inlined, num_bytes, num_handles)) =
3565                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3566            {
3567                let member_inline_size =
3568                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3569                if inlined != (member_inline_size <= 4) {
3570                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3571                }
3572                let inner_offset;
3573                let mut inner_depth = depth.clone();
3574                if inlined {
3575                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3576                    inner_offset = next_offset;
3577                } else {
3578                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3579                    inner_depth.increment()?;
3580                }
3581                let val_ref = self.buffer_alignment.get_or_insert_with(|| fidl::new_empty!(u32, D));
3582                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3583                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3584                {
3585                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3586                }
3587                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3588                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3589                }
3590            }
3591
3592            next_offset += envelope_size;
3593            _next_ordinal_to_read += 1;
3594            if next_offset >= end_offset {
3595                return Ok(());
3596            }
3597
3598            // Decode unknown envelopes for gaps in ordinals.
3599            while _next_ordinal_to_read < 4 {
3600                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3601                _next_ordinal_to_read += 1;
3602                next_offset += envelope_size;
3603            }
3604
3605            let next_out_of_line = decoder.next_out_of_line();
3606            let handles_before = decoder.remaining_handles();
3607            if let Some((inlined, num_bytes, num_handles)) =
3608                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3609            {
3610                let member_inline_size =
3611                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3612                if inlined != (member_inline_size <= 4) {
3613                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3614                }
3615                let inner_offset;
3616                let mut inner_depth = depth.clone();
3617                if inlined {
3618                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3619                    inner_offset = next_offset;
3620                } else {
3621                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3622                    inner_depth.increment()?;
3623                }
3624                let val_ref =
3625                    self.max_buffer_length.get_or_insert_with(|| fidl::new_empty!(u32, D));
3626                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3627                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3628                {
3629                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3630                }
3631                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3632                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3633                }
3634            }
3635
3636            next_offset += envelope_size;
3637            _next_ordinal_to_read += 1;
3638            if next_offset >= end_offset {
3639                return Ok(());
3640            }
3641
3642            // Decode unknown envelopes for gaps in ordinals.
3643            while _next_ordinal_to_read < 5 {
3644                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3645                _next_ordinal_to_read += 1;
3646                next_offset += envelope_size;
3647            }
3648
3649            let next_out_of_line = decoder.next_out_of_line();
3650            let handles_before = decoder.remaining_handles();
3651            if let Some((inlined, num_bytes, num_handles)) =
3652                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3653            {
3654                let member_inline_size =
3655                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3656                if inlined != (member_inline_size <= 4) {
3657                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3658                }
3659                let inner_offset;
3660                let mut inner_depth = depth.clone();
3661                if inlined {
3662                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3663                    inner_offset = next_offset;
3664                } else {
3665                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3666                    inner_depth.increment()?;
3667                }
3668                let val_ref =
3669                    self.min_rx_buffer_length.get_or_insert_with(|| fidl::new_empty!(u32, D));
3670                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3671                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3672                {
3673                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3674                }
3675                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3676                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3677                }
3678            }
3679
3680            next_offset += envelope_size;
3681            _next_ordinal_to_read += 1;
3682            if next_offset >= end_offset {
3683                return Ok(());
3684            }
3685
3686            // Decode unknown envelopes for gaps in ordinals.
3687            while _next_ordinal_to_read < 6 {
3688                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3689                _next_ordinal_to_read += 1;
3690                next_offset += envelope_size;
3691            }
3692
3693            let next_out_of_line = decoder.next_out_of_line();
3694            let handles_before = decoder.remaining_handles();
3695            if let Some((inlined, num_bytes, num_handles)) =
3696                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3697            {
3698                let member_inline_size =
3699                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3700                if inlined != (member_inline_size <= 4) {
3701                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3702                }
3703                let inner_offset;
3704                let mut inner_depth = depth.clone();
3705                if inlined {
3706                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3707                    inner_offset = next_offset;
3708                } else {
3709                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3710                    inner_depth.increment()?;
3711                }
3712                let val_ref =
3713                    self.min_tx_buffer_length.get_or_insert_with(|| fidl::new_empty!(u32, D));
3714                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3715                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3716                {
3717                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3718                }
3719                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3720                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3721                }
3722            }
3723
3724            next_offset += envelope_size;
3725            _next_ordinal_to_read += 1;
3726            if next_offset >= end_offset {
3727                return Ok(());
3728            }
3729
3730            // Decode unknown envelopes for gaps in ordinals.
3731            while _next_ordinal_to_read < 7 {
3732                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3733                _next_ordinal_to_read += 1;
3734                next_offset += envelope_size;
3735            }
3736
3737            let next_out_of_line = decoder.next_out_of_line();
3738            let handles_before = decoder.remaining_handles();
3739            if let Some((inlined, num_bytes, num_handles)) =
3740                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3741            {
3742                let member_inline_size =
3743                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3744                if inlined != (member_inline_size <= 4) {
3745                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3746                }
3747                let inner_offset;
3748                let mut inner_depth = depth.clone();
3749                if inlined {
3750                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3751                    inner_offset = next_offset;
3752                } else {
3753                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3754                    inner_depth.increment()?;
3755                }
3756                let val_ref =
3757                    self.min_tx_buffer_head.get_or_insert_with(|| fidl::new_empty!(u16, D));
3758                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3759                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3760                {
3761                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3762                }
3763                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3764                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3765                }
3766            }
3767
3768            next_offset += envelope_size;
3769            _next_ordinal_to_read += 1;
3770            if next_offset >= end_offset {
3771                return Ok(());
3772            }
3773
3774            // Decode unknown envelopes for gaps in ordinals.
3775            while _next_ordinal_to_read < 8 {
3776                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3777                _next_ordinal_to_read += 1;
3778                next_offset += envelope_size;
3779            }
3780
3781            let next_out_of_line = decoder.next_out_of_line();
3782            let handles_before = decoder.remaining_handles();
3783            if let Some((inlined, num_bytes, num_handles)) =
3784                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3785            {
3786                let member_inline_size =
3787                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3788                if inlined != (member_inline_size <= 4) {
3789                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3790                }
3791                let inner_offset;
3792                let mut inner_depth = depth.clone();
3793                if inlined {
3794                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3795                    inner_offset = next_offset;
3796                } else {
3797                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3798                    inner_depth.increment()?;
3799                }
3800                let val_ref =
3801                    self.min_tx_buffer_tail.get_or_insert_with(|| fidl::new_empty!(u16, D));
3802                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3803                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3804                {
3805                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3806                }
3807                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3808                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3809                }
3810            }
3811
3812            next_offset += envelope_size;
3813            _next_ordinal_to_read += 1;
3814            if next_offset >= end_offset {
3815                return Ok(());
3816            }
3817
3818            // Decode unknown envelopes for gaps in ordinals.
3819            while _next_ordinal_to_read < 9 {
3820                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3821                _next_ordinal_to_read += 1;
3822                next_offset += envelope_size;
3823            }
3824
3825            let next_out_of_line = decoder.next_out_of_line();
3826            let handles_before = decoder.remaining_handles();
3827            if let Some((inlined, num_bytes, num_handles)) =
3828                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3829            {
3830                let member_inline_size =
3831                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3832                if inlined != (member_inline_size <= 4) {
3833                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3834                }
3835                let inner_offset;
3836                let mut inner_depth = depth.clone();
3837                if inlined {
3838                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3839                    inner_offset = next_offset;
3840                } else {
3841                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3842                    inner_depth.increment()?;
3843                }
3844                let val_ref = self.max_buffer_parts.get_or_insert_with(|| fidl::new_empty!(u8, D));
3845                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
3846                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3847                {
3848                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3849                }
3850                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3851                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3852                }
3853            }
3854
3855            next_offset += envelope_size;
3856            _next_ordinal_to_read += 1;
3857            if next_offset >= end_offset {
3858                return Ok(());
3859            }
3860
3861            // Decode unknown envelopes for gaps in ordinals.
3862            while _next_ordinal_to_read < 12 {
3863                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3864                _next_ordinal_to_read += 1;
3865                next_offset += envelope_size;
3866            }
3867
3868            let next_out_of_line = decoder.next_out_of_line();
3869            let handles_before = decoder.remaining_handles();
3870            if let Some((inlined, num_bytes, num_handles)) =
3871                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3872            {
3873                let member_inline_size =
3874                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3875                if inlined != (member_inline_size <= 4) {
3876                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3877                }
3878                let inner_offset;
3879                let mut inner_depth = depth.clone();
3880                if inlined {
3881                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3882                    inner_offset = next_offset;
3883                } else {
3884                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3885                    inner_depth.increment()?;
3886                }
3887                let val_ref = self.min_rx_buffers.get_or_insert_with(|| fidl::new_empty!(u16, D));
3888                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3889                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3890                {
3891                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3892                }
3893                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3894                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3895                }
3896            }
3897
3898            next_offset += envelope_size;
3899
3900            // Decode the remaining unknown envelopes.
3901            while next_offset < end_offset {
3902                _next_ordinal_to_read += 1;
3903                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3904                next_offset += envelope_size;
3905            }
3906
3907            Ok(())
3908        }
3909    }
3910
3911    impl DeviceInfo {
3912        #[inline(always)]
3913        fn max_ordinal_present(&self) -> u64 {
3914            if let Some(_) = self.base_info {
3915                return 3;
3916            }
3917            if let Some(_) = self.descriptor_version {
3918                return 2;
3919            }
3920            if let Some(_) = self.min_descriptor_length {
3921                return 1;
3922            }
3923            0
3924        }
3925    }
3926
3927    impl fidl::encoding::ValueTypeMarker for DeviceInfo {
3928        type Borrowed<'a> = &'a Self;
3929        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3930            value
3931        }
3932    }
3933
3934    unsafe impl fidl::encoding::TypeMarker for DeviceInfo {
3935        type Owned = Self;
3936
3937        #[inline(always)]
3938        fn inline_align(_context: fidl::encoding::Context) -> usize {
3939            8
3940        }
3941
3942        #[inline(always)]
3943        fn inline_size(_context: fidl::encoding::Context) -> usize {
3944            16
3945        }
3946    }
3947
3948    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DeviceInfo, D>
3949        for &DeviceInfo
3950    {
3951        unsafe fn encode(
3952            self,
3953            encoder: &mut fidl::encoding::Encoder<'_, D>,
3954            offset: usize,
3955            mut depth: fidl::encoding::Depth,
3956        ) -> fidl::Result<()> {
3957            encoder.debug_check_bounds::<DeviceInfo>(offset);
3958            // Vector header
3959            let max_ordinal: u64 = self.max_ordinal_present();
3960            encoder.write_num(max_ordinal, offset);
3961            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3962            // Calling encoder.out_of_line_offset(0) is not allowed.
3963            if max_ordinal == 0 {
3964                return Ok(());
3965            }
3966            depth.increment()?;
3967            let envelope_size = 8;
3968            let bytes_len = max_ordinal as usize * envelope_size;
3969            #[allow(unused_variables)]
3970            let offset = encoder.out_of_line_offset(bytes_len);
3971            let mut _prev_end_offset: usize = 0;
3972            if 1 > max_ordinal {
3973                return Ok(());
3974            }
3975
3976            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3977            // are envelope_size bytes.
3978            let cur_offset: usize = (1 - 1) * envelope_size;
3979
3980            // Zero reserved fields.
3981            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3982
3983            // Safety:
3984            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3985            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3986            //   envelope_size bytes, there is always sufficient room.
3987            fidl::encoding::encode_in_envelope_optional::<u8, D>(
3988                self.min_descriptor_length
3989                    .as_ref()
3990                    .map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
3991                encoder,
3992                offset + cur_offset,
3993                depth,
3994            )?;
3995
3996            _prev_end_offset = cur_offset + envelope_size;
3997            if 2 > max_ordinal {
3998                return Ok(());
3999            }
4000
4001            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4002            // are envelope_size bytes.
4003            let cur_offset: usize = (2 - 1) * envelope_size;
4004
4005            // Zero reserved fields.
4006            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4007
4008            // Safety:
4009            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4010            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4011            //   envelope_size bytes, there is always sufficient room.
4012            fidl::encoding::encode_in_envelope_optional::<u8, D>(
4013                self.descriptor_version
4014                    .as_ref()
4015                    .map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
4016                encoder,
4017                offset + cur_offset,
4018                depth,
4019            )?;
4020
4021            _prev_end_offset = cur_offset + envelope_size;
4022            if 3 > max_ordinal {
4023                return Ok(());
4024            }
4025
4026            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4027            // are envelope_size bytes.
4028            let cur_offset: usize = (3 - 1) * envelope_size;
4029
4030            // Zero reserved fields.
4031            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4032
4033            // Safety:
4034            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4035            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4036            //   envelope_size bytes, there is always sufficient room.
4037            fidl::encoding::encode_in_envelope_optional::<DeviceBaseInfo, D>(
4038                self.base_info
4039                    .as_ref()
4040                    .map(<DeviceBaseInfo as fidl::encoding::ValueTypeMarker>::borrow),
4041                encoder,
4042                offset + cur_offset,
4043                depth,
4044            )?;
4045
4046            _prev_end_offset = cur_offset + envelope_size;
4047
4048            Ok(())
4049        }
4050    }
4051
4052    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DeviceInfo {
4053        #[inline(always)]
4054        fn new_empty() -> Self {
4055            Self::default()
4056        }
4057
4058        unsafe fn decode(
4059            &mut self,
4060            decoder: &mut fidl::encoding::Decoder<'_, D>,
4061            offset: usize,
4062            mut depth: fidl::encoding::Depth,
4063        ) -> fidl::Result<()> {
4064            decoder.debug_check_bounds::<Self>(offset);
4065            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4066                None => return Err(fidl::Error::NotNullable),
4067                Some(len) => len,
4068            };
4069            // Calling decoder.out_of_line_offset(0) is not allowed.
4070            if len == 0 {
4071                return Ok(());
4072            };
4073            depth.increment()?;
4074            let envelope_size = 8;
4075            let bytes_len = len * envelope_size;
4076            let offset = decoder.out_of_line_offset(bytes_len)?;
4077            // Decode the envelope for each type.
4078            let mut _next_ordinal_to_read = 0;
4079            let mut next_offset = offset;
4080            let end_offset = offset + bytes_len;
4081            _next_ordinal_to_read += 1;
4082            if next_offset >= end_offset {
4083                return Ok(());
4084            }
4085
4086            // Decode unknown envelopes for gaps in ordinals.
4087            while _next_ordinal_to_read < 1 {
4088                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4089                _next_ordinal_to_read += 1;
4090                next_offset += envelope_size;
4091            }
4092
4093            let next_out_of_line = decoder.next_out_of_line();
4094            let handles_before = decoder.remaining_handles();
4095            if let Some((inlined, num_bytes, num_handles)) =
4096                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4097            {
4098                let member_inline_size =
4099                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4100                if inlined != (member_inline_size <= 4) {
4101                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4102                }
4103                let inner_offset;
4104                let mut inner_depth = depth.clone();
4105                if inlined {
4106                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4107                    inner_offset = next_offset;
4108                } else {
4109                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4110                    inner_depth.increment()?;
4111                }
4112                let val_ref =
4113                    self.min_descriptor_length.get_or_insert_with(|| fidl::new_empty!(u8, D));
4114                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
4115                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4116                {
4117                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4118                }
4119                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4120                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4121                }
4122            }
4123
4124            next_offset += envelope_size;
4125            _next_ordinal_to_read += 1;
4126            if next_offset >= end_offset {
4127                return Ok(());
4128            }
4129
4130            // Decode unknown envelopes for gaps in ordinals.
4131            while _next_ordinal_to_read < 2 {
4132                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4133                _next_ordinal_to_read += 1;
4134                next_offset += envelope_size;
4135            }
4136
4137            let next_out_of_line = decoder.next_out_of_line();
4138            let handles_before = decoder.remaining_handles();
4139            if let Some((inlined, num_bytes, num_handles)) =
4140                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4141            {
4142                let member_inline_size =
4143                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4144                if inlined != (member_inline_size <= 4) {
4145                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4146                }
4147                let inner_offset;
4148                let mut inner_depth = depth.clone();
4149                if inlined {
4150                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4151                    inner_offset = next_offset;
4152                } else {
4153                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4154                    inner_depth.increment()?;
4155                }
4156                let val_ref =
4157                    self.descriptor_version.get_or_insert_with(|| fidl::new_empty!(u8, D));
4158                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
4159                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4160                {
4161                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4162                }
4163                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4164                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4165                }
4166            }
4167
4168            next_offset += envelope_size;
4169            _next_ordinal_to_read += 1;
4170            if next_offset >= end_offset {
4171                return Ok(());
4172            }
4173
4174            // Decode unknown envelopes for gaps in ordinals.
4175            while _next_ordinal_to_read < 3 {
4176                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4177                _next_ordinal_to_read += 1;
4178                next_offset += envelope_size;
4179            }
4180
4181            let next_out_of_line = decoder.next_out_of_line();
4182            let handles_before = decoder.remaining_handles();
4183            if let Some((inlined, num_bytes, num_handles)) =
4184                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4185            {
4186                let member_inline_size =
4187                    <DeviceBaseInfo as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4188                if inlined != (member_inline_size <= 4) {
4189                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4190                }
4191                let inner_offset;
4192                let mut inner_depth = depth.clone();
4193                if inlined {
4194                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4195                    inner_offset = next_offset;
4196                } else {
4197                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4198                    inner_depth.increment()?;
4199                }
4200                let val_ref =
4201                    self.base_info.get_or_insert_with(|| fidl::new_empty!(DeviceBaseInfo, D));
4202                fidl::decode!(DeviceBaseInfo, D, val_ref, decoder, inner_offset, inner_depth)?;
4203                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4204                {
4205                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4206                }
4207                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4208                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4209                }
4210            }
4211
4212            next_offset += envelope_size;
4213
4214            // Decode the remaining unknown envelopes.
4215            while next_offset < end_offset {
4216                _next_ordinal_to_read += 1;
4217                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4218                next_offset += envelope_size;
4219            }
4220
4221            Ok(())
4222        }
4223    }
4224
4225    impl PortBaseInfo {
4226        #[inline(always)]
4227        fn max_ordinal_present(&self) -> u64 {
4228            if let Some(_) = self.tx_types {
4229                return 3;
4230            }
4231            if let Some(_) = self.rx_types {
4232                return 2;
4233            }
4234            if let Some(_) = self.port_class {
4235                return 1;
4236            }
4237            0
4238        }
4239    }
4240
4241    impl fidl::encoding::ValueTypeMarker for PortBaseInfo {
4242        type Borrowed<'a> = &'a Self;
4243        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4244            value
4245        }
4246    }
4247
4248    unsafe impl fidl::encoding::TypeMarker for PortBaseInfo {
4249        type Owned = Self;
4250
4251        #[inline(always)]
4252        fn inline_align(_context: fidl::encoding::Context) -> usize {
4253            8
4254        }
4255
4256        #[inline(always)]
4257        fn inline_size(_context: fidl::encoding::Context) -> usize {
4258            16
4259        }
4260    }
4261
4262    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortBaseInfo, D>
4263        for &PortBaseInfo
4264    {
4265        unsafe fn encode(
4266            self,
4267            encoder: &mut fidl::encoding::Encoder<'_, D>,
4268            offset: usize,
4269            mut depth: fidl::encoding::Depth,
4270        ) -> fidl::Result<()> {
4271            encoder.debug_check_bounds::<PortBaseInfo>(offset);
4272            // Vector header
4273            let max_ordinal: u64 = self.max_ordinal_present();
4274            encoder.write_num(max_ordinal, offset);
4275            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4276            // Calling encoder.out_of_line_offset(0) is not allowed.
4277            if max_ordinal == 0 {
4278                return Ok(());
4279            }
4280            depth.increment()?;
4281            let envelope_size = 8;
4282            let bytes_len = max_ordinal as usize * envelope_size;
4283            #[allow(unused_variables)]
4284            let offset = encoder.out_of_line_offset(bytes_len);
4285            let mut _prev_end_offset: usize = 0;
4286            if 1 > max_ordinal {
4287                return Ok(());
4288            }
4289
4290            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4291            // are envelope_size bytes.
4292            let cur_offset: usize = (1 - 1) * envelope_size;
4293
4294            // Zero reserved fields.
4295            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4296
4297            // Safety:
4298            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4299            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4300            //   envelope_size bytes, there is always sufficient room.
4301            fidl::encoding::encode_in_envelope_optional::<PortClass, D>(
4302                self.port_class
4303                    .as_ref()
4304                    .map(<PortClass as fidl::encoding::ValueTypeMarker>::borrow),
4305                encoder,
4306                offset + cur_offset,
4307                depth,
4308            )?;
4309
4310            _prev_end_offset = cur_offset + envelope_size;
4311            if 2 > max_ordinal {
4312                return Ok(());
4313            }
4314
4315            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4316            // are envelope_size bytes.
4317            let cur_offset: usize = (2 - 1) * envelope_size;
4318
4319            // Zero reserved fields.
4320            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4321
4322            // Safety:
4323            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4324            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4325            //   envelope_size bytes, there is always sufficient room.
4326            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<FrameType, 4>, D>(
4327            self.rx_types.as_ref().map(<fidl::encoding::Vector<FrameType, 4> as fidl::encoding::ValueTypeMarker>::borrow),
4328            encoder, offset + cur_offset, depth
4329        )?;
4330
4331            _prev_end_offset = cur_offset + envelope_size;
4332            if 3 > max_ordinal {
4333                return Ok(());
4334            }
4335
4336            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4337            // are envelope_size bytes.
4338            let cur_offset: usize = (3 - 1) * envelope_size;
4339
4340            // Zero reserved fields.
4341            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4342
4343            // Safety:
4344            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4345            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4346            //   envelope_size bytes, there is always sufficient room.
4347            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<FrameTypeSupport, 4>, D>(
4348            self.tx_types.as_ref().map(<fidl::encoding::Vector<FrameTypeSupport, 4> as fidl::encoding::ValueTypeMarker>::borrow),
4349            encoder, offset + cur_offset, depth
4350        )?;
4351
4352            _prev_end_offset = cur_offset + envelope_size;
4353
4354            Ok(())
4355        }
4356    }
4357
4358    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortBaseInfo {
4359        #[inline(always)]
4360        fn new_empty() -> Self {
4361            Self::default()
4362        }
4363
4364        unsafe fn decode(
4365            &mut self,
4366            decoder: &mut fidl::encoding::Decoder<'_, D>,
4367            offset: usize,
4368            mut depth: fidl::encoding::Depth,
4369        ) -> fidl::Result<()> {
4370            decoder.debug_check_bounds::<Self>(offset);
4371            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4372                None => return Err(fidl::Error::NotNullable),
4373                Some(len) => len,
4374            };
4375            // Calling decoder.out_of_line_offset(0) is not allowed.
4376            if len == 0 {
4377                return Ok(());
4378            };
4379            depth.increment()?;
4380            let envelope_size = 8;
4381            let bytes_len = len * envelope_size;
4382            let offset = decoder.out_of_line_offset(bytes_len)?;
4383            // Decode the envelope for each type.
4384            let mut _next_ordinal_to_read = 0;
4385            let mut next_offset = offset;
4386            let end_offset = offset + bytes_len;
4387            _next_ordinal_to_read += 1;
4388            if next_offset >= end_offset {
4389                return Ok(());
4390            }
4391
4392            // Decode unknown envelopes for gaps in ordinals.
4393            while _next_ordinal_to_read < 1 {
4394                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4395                _next_ordinal_to_read += 1;
4396                next_offset += envelope_size;
4397            }
4398
4399            let next_out_of_line = decoder.next_out_of_line();
4400            let handles_before = decoder.remaining_handles();
4401            if let Some((inlined, num_bytes, num_handles)) =
4402                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4403            {
4404                let member_inline_size =
4405                    <PortClass as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4406                if inlined != (member_inline_size <= 4) {
4407                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4408                }
4409                let inner_offset;
4410                let mut inner_depth = depth.clone();
4411                if inlined {
4412                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4413                    inner_offset = next_offset;
4414                } else {
4415                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4416                    inner_depth.increment()?;
4417                }
4418                let val_ref = self.port_class.get_or_insert_with(|| fidl::new_empty!(PortClass, D));
4419                fidl::decode!(PortClass, D, val_ref, decoder, inner_offset, inner_depth)?;
4420                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4421                {
4422                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4423                }
4424                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4425                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4426                }
4427            }
4428
4429            next_offset += envelope_size;
4430            _next_ordinal_to_read += 1;
4431            if next_offset >= end_offset {
4432                return Ok(());
4433            }
4434
4435            // Decode unknown envelopes for gaps in ordinals.
4436            while _next_ordinal_to_read < 2 {
4437                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4438                _next_ordinal_to_read += 1;
4439                next_offset += envelope_size;
4440            }
4441
4442            let next_out_of_line = decoder.next_out_of_line();
4443            let handles_before = decoder.remaining_handles();
4444            if let Some((inlined, num_bytes, num_handles)) =
4445                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4446            {
4447                let member_inline_size = <fidl::encoding::Vector<FrameType, 4> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4448                if inlined != (member_inline_size <= 4) {
4449                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4450                }
4451                let inner_offset;
4452                let mut inner_depth = depth.clone();
4453                if inlined {
4454                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4455                    inner_offset = next_offset;
4456                } else {
4457                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4458                    inner_depth.increment()?;
4459                }
4460                let val_ref = self.rx_types.get_or_insert_with(
4461                    || fidl::new_empty!(fidl::encoding::Vector<FrameType, 4>, D),
4462                );
4463                fidl::decode!(fidl::encoding::Vector<FrameType, 4>, D, val_ref, decoder, inner_offset, inner_depth)?;
4464                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4465                {
4466                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4467                }
4468                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4469                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4470                }
4471            }
4472
4473            next_offset += envelope_size;
4474            _next_ordinal_to_read += 1;
4475            if next_offset >= end_offset {
4476                return Ok(());
4477            }
4478
4479            // Decode unknown envelopes for gaps in ordinals.
4480            while _next_ordinal_to_read < 3 {
4481                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4482                _next_ordinal_to_read += 1;
4483                next_offset += envelope_size;
4484            }
4485
4486            let next_out_of_line = decoder.next_out_of_line();
4487            let handles_before = decoder.remaining_handles();
4488            if let Some((inlined, num_bytes, num_handles)) =
4489                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4490            {
4491                let member_inline_size = <fidl::encoding::Vector<FrameTypeSupport, 4> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4492                if inlined != (member_inline_size <= 4) {
4493                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4494                }
4495                let inner_offset;
4496                let mut inner_depth = depth.clone();
4497                if inlined {
4498                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4499                    inner_offset = next_offset;
4500                } else {
4501                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4502                    inner_depth.increment()?;
4503                }
4504                let val_ref = self.tx_types.get_or_insert_with(
4505                    || fidl::new_empty!(fidl::encoding::Vector<FrameTypeSupport, 4>, D),
4506                );
4507                fidl::decode!(fidl::encoding::Vector<FrameTypeSupport, 4>, D, val_ref, decoder, inner_offset, inner_depth)?;
4508                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4509                {
4510                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4511                }
4512                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4513                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4514                }
4515            }
4516
4517            next_offset += envelope_size;
4518
4519            // Decode the remaining unknown envelopes.
4520            while next_offset < end_offset {
4521                _next_ordinal_to_read += 1;
4522                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4523                next_offset += envelope_size;
4524            }
4525
4526            Ok(())
4527        }
4528    }
4529
4530    impl PortGetCountersResponse {
4531        #[inline(always)]
4532        fn max_ordinal_present(&self) -> u64 {
4533            if let Some(_) = self.tx_bytes {
4534                return 4;
4535            }
4536            if let Some(_) = self.tx_frames {
4537                return 3;
4538            }
4539            if let Some(_) = self.rx_bytes {
4540                return 2;
4541            }
4542            if let Some(_) = self.rx_frames {
4543                return 1;
4544            }
4545            0
4546        }
4547    }
4548
4549    impl fidl::encoding::ValueTypeMarker for PortGetCountersResponse {
4550        type Borrowed<'a> = &'a Self;
4551        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4552            value
4553        }
4554    }
4555
4556    unsafe impl fidl::encoding::TypeMarker for PortGetCountersResponse {
4557        type Owned = Self;
4558
4559        #[inline(always)]
4560        fn inline_align(_context: fidl::encoding::Context) -> usize {
4561            8
4562        }
4563
4564        #[inline(always)]
4565        fn inline_size(_context: fidl::encoding::Context) -> usize {
4566            16
4567        }
4568    }
4569
4570    unsafe impl<D: fidl::encoding::ResourceDialect>
4571        fidl::encoding::Encode<PortGetCountersResponse, D> for &PortGetCountersResponse
4572    {
4573        unsafe fn encode(
4574            self,
4575            encoder: &mut fidl::encoding::Encoder<'_, D>,
4576            offset: usize,
4577            mut depth: fidl::encoding::Depth,
4578        ) -> fidl::Result<()> {
4579            encoder.debug_check_bounds::<PortGetCountersResponse>(offset);
4580            // Vector header
4581            let max_ordinal: u64 = self.max_ordinal_present();
4582            encoder.write_num(max_ordinal, offset);
4583            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4584            // Calling encoder.out_of_line_offset(0) is not allowed.
4585            if max_ordinal == 0 {
4586                return Ok(());
4587            }
4588            depth.increment()?;
4589            let envelope_size = 8;
4590            let bytes_len = max_ordinal as usize * envelope_size;
4591            #[allow(unused_variables)]
4592            let offset = encoder.out_of_line_offset(bytes_len);
4593            let mut _prev_end_offset: usize = 0;
4594            if 1 > max_ordinal {
4595                return Ok(());
4596            }
4597
4598            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4599            // are envelope_size bytes.
4600            let cur_offset: usize = (1 - 1) * envelope_size;
4601
4602            // Zero reserved fields.
4603            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4604
4605            // Safety:
4606            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4607            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4608            //   envelope_size bytes, there is always sufficient room.
4609            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4610                self.rx_frames.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4611                encoder,
4612                offset + cur_offset,
4613                depth,
4614            )?;
4615
4616            _prev_end_offset = cur_offset + envelope_size;
4617            if 2 > max_ordinal {
4618                return Ok(());
4619            }
4620
4621            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4622            // are envelope_size bytes.
4623            let cur_offset: usize = (2 - 1) * envelope_size;
4624
4625            // Zero reserved fields.
4626            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4627
4628            // Safety:
4629            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4630            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4631            //   envelope_size bytes, there is always sufficient room.
4632            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4633                self.rx_bytes.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4634                encoder,
4635                offset + cur_offset,
4636                depth,
4637            )?;
4638
4639            _prev_end_offset = cur_offset + envelope_size;
4640            if 3 > max_ordinal {
4641                return Ok(());
4642            }
4643
4644            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4645            // are envelope_size bytes.
4646            let cur_offset: usize = (3 - 1) * envelope_size;
4647
4648            // Zero reserved fields.
4649            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4650
4651            // Safety:
4652            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4653            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4654            //   envelope_size bytes, there is always sufficient room.
4655            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4656                self.tx_frames.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4657                encoder,
4658                offset + cur_offset,
4659                depth,
4660            )?;
4661
4662            _prev_end_offset = cur_offset + envelope_size;
4663            if 4 > max_ordinal {
4664                return Ok(());
4665            }
4666
4667            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4668            // are envelope_size bytes.
4669            let cur_offset: usize = (4 - 1) * envelope_size;
4670
4671            // Zero reserved fields.
4672            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4673
4674            // Safety:
4675            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4676            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4677            //   envelope_size bytes, there is always sufficient room.
4678            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4679                self.tx_bytes.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4680                encoder,
4681                offset + cur_offset,
4682                depth,
4683            )?;
4684
4685            _prev_end_offset = cur_offset + envelope_size;
4686
4687            Ok(())
4688        }
4689    }
4690
4691    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
4692        for PortGetCountersResponse
4693    {
4694        #[inline(always)]
4695        fn new_empty() -> Self {
4696            Self::default()
4697        }
4698
4699        unsafe fn decode(
4700            &mut self,
4701            decoder: &mut fidl::encoding::Decoder<'_, D>,
4702            offset: usize,
4703            mut depth: fidl::encoding::Depth,
4704        ) -> fidl::Result<()> {
4705            decoder.debug_check_bounds::<Self>(offset);
4706            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4707                None => return Err(fidl::Error::NotNullable),
4708                Some(len) => len,
4709            };
4710            // Calling decoder.out_of_line_offset(0) is not allowed.
4711            if len == 0 {
4712                return Ok(());
4713            };
4714            depth.increment()?;
4715            let envelope_size = 8;
4716            let bytes_len = len * envelope_size;
4717            let offset = decoder.out_of_line_offset(bytes_len)?;
4718            // Decode the envelope for each type.
4719            let mut _next_ordinal_to_read = 0;
4720            let mut next_offset = offset;
4721            let end_offset = offset + bytes_len;
4722            _next_ordinal_to_read += 1;
4723            if next_offset >= end_offset {
4724                return Ok(());
4725            }
4726
4727            // Decode unknown envelopes for gaps in ordinals.
4728            while _next_ordinal_to_read < 1 {
4729                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4730                _next_ordinal_to_read += 1;
4731                next_offset += envelope_size;
4732            }
4733
4734            let next_out_of_line = decoder.next_out_of_line();
4735            let handles_before = decoder.remaining_handles();
4736            if let Some((inlined, num_bytes, num_handles)) =
4737                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4738            {
4739                let member_inline_size =
4740                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4741                if inlined != (member_inline_size <= 4) {
4742                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4743                }
4744                let inner_offset;
4745                let mut inner_depth = depth.clone();
4746                if inlined {
4747                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4748                    inner_offset = next_offset;
4749                } else {
4750                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4751                    inner_depth.increment()?;
4752                }
4753                let val_ref = self.rx_frames.get_or_insert_with(|| fidl::new_empty!(u64, D));
4754                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4755                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4756                {
4757                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4758                }
4759                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4760                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4761                }
4762            }
4763
4764            next_offset += envelope_size;
4765            _next_ordinal_to_read += 1;
4766            if next_offset >= end_offset {
4767                return Ok(());
4768            }
4769
4770            // Decode unknown envelopes for gaps in ordinals.
4771            while _next_ordinal_to_read < 2 {
4772                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4773                _next_ordinal_to_read += 1;
4774                next_offset += envelope_size;
4775            }
4776
4777            let next_out_of_line = decoder.next_out_of_line();
4778            let handles_before = decoder.remaining_handles();
4779            if let Some((inlined, num_bytes, num_handles)) =
4780                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4781            {
4782                let member_inline_size =
4783                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4784                if inlined != (member_inline_size <= 4) {
4785                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4786                }
4787                let inner_offset;
4788                let mut inner_depth = depth.clone();
4789                if inlined {
4790                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4791                    inner_offset = next_offset;
4792                } else {
4793                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4794                    inner_depth.increment()?;
4795                }
4796                let val_ref = self.rx_bytes.get_or_insert_with(|| fidl::new_empty!(u64, D));
4797                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4798                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4799                {
4800                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4801                }
4802                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4803                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4804                }
4805            }
4806
4807            next_offset += envelope_size;
4808            _next_ordinal_to_read += 1;
4809            if next_offset >= end_offset {
4810                return Ok(());
4811            }
4812
4813            // Decode unknown envelopes for gaps in ordinals.
4814            while _next_ordinal_to_read < 3 {
4815                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4816                _next_ordinal_to_read += 1;
4817                next_offset += envelope_size;
4818            }
4819
4820            let next_out_of_line = decoder.next_out_of_line();
4821            let handles_before = decoder.remaining_handles();
4822            if let Some((inlined, num_bytes, num_handles)) =
4823                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4824            {
4825                let member_inline_size =
4826                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4827                if inlined != (member_inline_size <= 4) {
4828                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4829                }
4830                let inner_offset;
4831                let mut inner_depth = depth.clone();
4832                if inlined {
4833                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4834                    inner_offset = next_offset;
4835                } else {
4836                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4837                    inner_depth.increment()?;
4838                }
4839                let val_ref = self.tx_frames.get_or_insert_with(|| fidl::new_empty!(u64, D));
4840                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4841                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4842                {
4843                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4844                }
4845                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4846                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4847                }
4848            }
4849
4850            next_offset += envelope_size;
4851            _next_ordinal_to_read += 1;
4852            if next_offset >= end_offset {
4853                return Ok(());
4854            }
4855
4856            // Decode unknown envelopes for gaps in ordinals.
4857            while _next_ordinal_to_read < 4 {
4858                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4859                _next_ordinal_to_read += 1;
4860                next_offset += envelope_size;
4861            }
4862
4863            let next_out_of_line = decoder.next_out_of_line();
4864            let handles_before = decoder.remaining_handles();
4865            if let Some((inlined, num_bytes, num_handles)) =
4866                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4867            {
4868                let member_inline_size =
4869                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4870                if inlined != (member_inline_size <= 4) {
4871                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4872                }
4873                let inner_offset;
4874                let mut inner_depth = depth.clone();
4875                if inlined {
4876                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4877                    inner_offset = next_offset;
4878                } else {
4879                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4880                    inner_depth.increment()?;
4881                }
4882                let val_ref = self.tx_bytes.get_or_insert_with(|| fidl::new_empty!(u64, D));
4883                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4884                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4885                {
4886                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4887                }
4888                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4889                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4890                }
4891            }
4892
4893            next_offset += envelope_size;
4894
4895            // Decode the remaining unknown envelopes.
4896            while next_offset < end_offset {
4897                _next_ordinal_to_read += 1;
4898                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4899                next_offset += envelope_size;
4900            }
4901
4902            Ok(())
4903        }
4904    }
4905
4906    impl PortInfo {
4907        #[inline(always)]
4908        fn max_ordinal_present(&self) -> u64 {
4909            if let Some(_) = self.base_info {
4910                return 2;
4911            }
4912            if let Some(_) = self.id {
4913                return 1;
4914            }
4915            0
4916        }
4917    }
4918
4919    impl fidl::encoding::ValueTypeMarker for PortInfo {
4920        type Borrowed<'a> = &'a Self;
4921        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4922            value
4923        }
4924    }
4925
4926    unsafe impl fidl::encoding::TypeMarker for PortInfo {
4927        type Owned = Self;
4928
4929        #[inline(always)]
4930        fn inline_align(_context: fidl::encoding::Context) -> usize {
4931            8
4932        }
4933
4934        #[inline(always)]
4935        fn inline_size(_context: fidl::encoding::Context) -> usize {
4936            16
4937        }
4938    }
4939
4940    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortInfo, D> for &PortInfo {
4941        unsafe fn encode(
4942            self,
4943            encoder: &mut fidl::encoding::Encoder<'_, D>,
4944            offset: usize,
4945            mut depth: fidl::encoding::Depth,
4946        ) -> fidl::Result<()> {
4947            encoder.debug_check_bounds::<PortInfo>(offset);
4948            // Vector header
4949            let max_ordinal: u64 = self.max_ordinal_present();
4950            encoder.write_num(max_ordinal, offset);
4951            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4952            // Calling encoder.out_of_line_offset(0) is not allowed.
4953            if max_ordinal == 0 {
4954                return Ok(());
4955            }
4956            depth.increment()?;
4957            let envelope_size = 8;
4958            let bytes_len = max_ordinal as usize * envelope_size;
4959            #[allow(unused_variables)]
4960            let offset = encoder.out_of_line_offset(bytes_len);
4961            let mut _prev_end_offset: usize = 0;
4962            if 1 > max_ordinal {
4963                return Ok(());
4964            }
4965
4966            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4967            // are envelope_size bytes.
4968            let cur_offset: usize = (1 - 1) * envelope_size;
4969
4970            // Zero reserved fields.
4971            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4972
4973            // Safety:
4974            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4975            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4976            //   envelope_size bytes, there is always sufficient room.
4977            fidl::encoding::encode_in_envelope_optional::<PortId, D>(
4978                self.id.as_ref().map(<PortId as fidl::encoding::ValueTypeMarker>::borrow),
4979                encoder,
4980                offset + cur_offset,
4981                depth,
4982            )?;
4983
4984            _prev_end_offset = cur_offset + envelope_size;
4985            if 2 > max_ordinal {
4986                return Ok(());
4987            }
4988
4989            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4990            // are envelope_size bytes.
4991            let cur_offset: usize = (2 - 1) * envelope_size;
4992
4993            // Zero reserved fields.
4994            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4995
4996            // Safety:
4997            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4998            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4999            //   envelope_size bytes, there is always sufficient room.
5000            fidl::encoding::encode_in_envelope_optional::<PortBaseInfo, D>(
5001                self.base_info
5002                    .as_ref()
5003                    .map(<PortBaseInfo as fidl::encoding::ValueTypeMarker>::borrow),
5004                encoder,
5005                offset + cur_offset,
5006                depth,
5007            )?;
5008
5009            _prev_end_offset = cur_offset + envelope_size;
5010
5011            Ok(())
5012        }
5013    }
5014
5015    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortInfo {
5016        #[inline(always)]
5017        fn new_empty() -> Self {
5018            Self::default()
5019        }
5020
5021        unsafe fn decode(
5022            &mut self,
5023            decoder: &mut fidl::encoding::Decoder<'_, D>,
5024            offset: usize,
5025            mut depth: fidl::encoding::Depth,
5026        ) -> fidl::Result<()> {
5027            decoder.debug_check_bounds::<Self>(offset);
5028            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
5029                None => return Err(fidl::Error::NotNullable),
5030                Some(len) => len,
5031            };
5032            // Calling decoder.out_of_line_offset(0) is not allowed.
5033            if len == 0 {
5034                return Ok(());
5035            };
5036            depth.increment()?;
5037            let envelope_size = 8;
5038            let bytes_len = len * envelope_size;
5039            let offset = decoder.out_of_line_offset(bytes_len)?;
5040            // Decode the envelope for each type.
5041            let mut _next_ordinal_to_read = 0;
5042            let mut next_offset = offset;
5043            let end_offset = offset + bytes_len;
5044            _next_ordinal_to_read += 1;
5045            if next_offset >= end_offset {
5046                return Ok(());
5047            }
5048
5049            // Decode unknown envelopes for gaps in ordinals.
5050            while _next_ordinal_to_read < 1 {
5051                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5052                _next_ordinal_to_read += 1;
5053                next_offset += envelope_size;
5054            }
5055
5056            let next_out_of_line = decoder.next_out_of_line();
5057            let handles_before = decoder.remaining_handles();
5058            if let Some((inlined, num_bytes, num_handles)) =
5059                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5060            {
5061                let member_inline_size =
5062                    <PortId as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5063                if inlined != (member_inline_size <= 4) {
5064                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5065                }
5066                let inner_offset;
5067                let mut inner_depth = depth.clone();
5068                if inlined {
5069                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5070                    inner_offset = next_offset;
5071                } else {
5072                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5073                    inner_depth.increment()?;
5074                }
5075                let val_ref = self.id.get_or_insert_with(|| fidl::new_empty!(PortId, D));
5076                fidl::decode!(PortId, D, val_ref, decoder, inner_offset, inner_depth)?;
5077                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5078                {
5079                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5080                }
5081                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5082                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5083                }
5084            }
5085
5086            next_offset += envelope_size;
5087            _next_ordinal_to_read += 1;
5088            if next_offset >= end_offset {
5089                return Ok(());
5090            }
5091
5092            // Decode unknown envelopes for gaps in ordinals.
5093            while _next_ordinal_to_read < 2 {
5094                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5095                _next_ordinal_to_read += 1;
5096                next_offset += envelope_size;
5097            }
5098
5099            let next_out_of_line = decoder.next_out_of_line();
5100            let handles_before = decoder.remaining_handles();
5101            if let Some((inlined, num_bytes, num_handles)) =
5102                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5103            {
5104                let member_inline_size =
5105                    <PortBaseInfo as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5106                if inlined != (member_inline_size <= 4) {
5107                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5108                }
5109                let inner_offset;
5110                let mut inner_depth = depth.clone();
5111                if inlined {
5112                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5113                    inner_offset = next_offset;
5114                } else {
5115                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5116                    inner_depth.increment()?;
5117                }
5118                let val_ref =
5119                    self.base_info.get_or_insert_with(|| fidl::new_empty!(PortBaseInfo, D));
5120                fidl::decode!(PortBaseInfo, D, val_ref, decoder, inner_offset, inner_depth)?;
5121                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5122                {
5123                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5124                }
5125                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5126                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5127                }
5128            }
5129
5130            next_offset += envelope_size;
5131
5132            // Decode the remaining unknown envelopes.
5133            while next_offset < end_offset {
5134                _next_ordinal_to_read += 1;
5135                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5136                next_offset += envelope_size;
5137            }
5138
5139            Ok(())
5140        }
5141    }
5142
5143    impl PortStatus {
5144        #[inline(always)]
5145        fn max_ordinal_present(&self) -> u64 {
5146            if let Some(_) = self.mtu {
5147                return 2;
5148            }
5149            if let Some(_) = self.flags {
5150                return 1;
5151            }
5152            0
5153        }
5154    }
5155
5156    impl fidl::encoding::ValueTypeMarker for PortStatus {
5157        type Borrowed<'a> = &'a Self;
5158        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
5159            value
5160        }
5161    }
5162
5163    unsafe impl fidl::encoding::TypeMarker for PortStatus {
5164        type Owned = Self;
5165
5166        #[inline(always)]
5167        fn inline_align(_context: fidl::encoding::Context) -> usize {
5168            8
5169        }
5170
5171        #[inline(always)]
5172        fn inline_size(_context: fidl::encoding::Context) -> usize {
5173            16
5174        }
5175    }
5176
5177    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortStatus, D>
5178        for &PortStatus
5179    {
5180        unsafe fn encode(
5181            self,
5182            encoder: &mut fidl::encoding::Encoder<'_, D>,
5183            offset: usize,
5184            mut depth: fidl::encoding::Depth,
5185        ) -> fidl::Result<()> {
5186            encoder.debug_check_bounds::<PortStatus>(offset);
5187            // Vector header
5188            let max_ordinal: u64 = self.max_ordinal_present();
5189            encoder.write_num(max_ordinal, offset);
5190            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
5191            // Calling encoder.out_of_line_offset(0) is not allowed.
5192            if max_ordinal == 0 {
5193                return Ok(());
5194            }
5195            depth.increment()?;
5196            let envelope_size = 8;
5197            let bytes_len = max_ordinal as usize * envelope_size;
5198            #[allow(unused_variables)]
5199            let offset = encoder.out_of_line_offset(bytes_len);
5200            let mut _prev_end_offset: usize = 0;
5201            if 1 > max_ordinal {
5202                return Ok(());
5203            }
5204
5205            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5206            // are envelope_size bytes.
5207            let cur_offset: usize = (1 - 1) * envelope_size;
5208
5209            // Zero reserved fields.
5210            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5211
5212            // Safety:
5213            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5214            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5215            //   envelope_size bytes, there is always sufficient room.
5216            fidl::encoding::encode_in_envelope_optional::<StatusFlags, D>(
5217                self.flags.as_ref().map(<StatusFlags as fidl::encoding::ValueTypeMarker>::borrow),
5218                encoder,
5219                offset + cur_offset,
5220                depth,
5221            )?;
5222
5223            _prev_end_offset = cur_offset + envelope_size;
5224            if 2 > max_ordinal {
5225                return Ok(());
5226            }
5227
5228            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5229            // are envelope_size bytes.
5230            let cur_offset: usize = (2 - 1) * envelope_size;
5231
5232            // Zero reserved fields.
5233            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5234
5235            // Safety:
5236            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5237            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5238            //   envelope_size bytes, there is always sufficient room.
5239            fidl::encoding::encode_in_envelope_optional::<u32, D>(
5240                self.mtu.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
5241                encoder,
5242                offset + cur_offset,
5243                depth,
5244            )?;
5245
5246            _prev_end_offset = cur_offset + envelope_size;
5247
5248            Ok(())
5249        }
5250    }
5251
5252    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortStatus {
5253        #[inline(always)]
5254        fn new_empty() -> Self {
5255            Self::default()
5256        }
5257
5258        unsafe fn decode(
5259            &mut self,
5260            decoder: &mut fidl::encoding::Decoder<'_, D>,
5261            offset: usize,
5262            mut depth: fidl::encoding::Depth,
5263        ) -> fidl::Result<()> {
5264            decoder.debug_check_bounds::<Self>(offset);
5265            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
5266                None => return Err(fidl::Error::NotNullable),
5267                Some(len) => len,
5268            };
5269            // Calling decoder.out_of_line_offset(0) is not allowed.
5270            if len == 0 {
5271                return Ok(());
5272            };
5273            depth.increment()?;
5274            let envelope_size = 8;
5275            let bytes_len = len * envelope_size;
5276            let offset = decoder.out_of_line_offset(bytes_len)?;
5277            // Decode the envelope for each type.
5278            let mut _next_ordinal_to_read = 0;
5279            let mut next_offset = offset;
5280            let end_offset = offset + bytes_len;
5281            _next_ordinal_to_read += 1;
5282            if next_offset >= end_offset {
5283                return Ok(());
5284            }
5285
5286            // Decode unknown envelopes for gaps in ordinals.
5287            while _next_ordinal_to_read < 1 {
5288                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5289                _next_ordinal_to_read += 1;
5290                next_offset += envelope_size;
5291            }
5292
5293            let next_out_of_line = decoder.next_out_of_line();
5294            let handles_before = decoder.remaining_handles();
5295            if let Some((inlined, num_bytes, num_handles)) =
5296                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5297            {
5298                let member_inline_size =
5299                    <StatusFlags as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5300                if inlined != (member_inline_size <= 4) {
5301                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5302                }
5303                let inner_offset;
5304                let mut inner_depth = depth.clone();
5305                if inlined {
5306                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5307                    inner_offset = next_offset;
5308                } else {
5309                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5310                    inner_depth.increment()?;
5311                }
5312                let val_ref = self.flags.get_or_insert_with(|| fidl::new_empty!(StatusFlags, D));
5313                fidl::decode!(StatusFlags, D, val_ref, decoder, inner_offset, inner_depth)?;
5314                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5315                {
5316                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5317                }
5318                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5319                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5320                }
5321            }
5322
5323            next_offset += envelope_size;
5324            _next_ordinal_to_read += 1;
5325            if next_offset >= end_offset {
5326                return Ok(());
5327            }
5328
5329            // Decode unknown envelopes for gaps in ordinals.
5330            while _next_ordinal_to_read < 2 {
5331                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5332                _next_ordinal_to_read += 1;
5333                next_offset += envelope_size;
5334            }
5335
5336            let next_out_of_line = decoder.next_out_of_line();
5337            let handles_before = decoder.remaining_handles();
5338            if let Some((inlined, num_bytes, num_handles)) =
5339                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5340            {
5341                let member_inline_size =
5342                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5343                if inlined != (member_inline_size <= 4) {
5344                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5345                }
5346                let inner_offset;
5347                let mut inner_depth = depth.clone();
5348                if inlined {
5349                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5350                    inner_offset = next_offset;
5351                } else {
5352                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5353                    inner_depth.increment()?;
5354                }
5355                let val_ref = self.mtu.get_or_insert_with(|| fidl::new_empty!(u32, D));
5356                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
5357                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5358                {
5359                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5360                }
5361                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5362                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5363                }
5364            }
5365
5366            next_offset += envelope_size;
5367
5368            // Decode the remaining unknown envelopes.
5369            while next_offset < end_offset {
5370                _next_ordinal_to_read += 1;
5371                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5372                next_offset += envelope_size;
5373            }
5374
5375            Ok(())
5376        }
5377    }
5378
5379    impl fidl::encoding::ValueTypeMarker for DevicePortEvent {
5380        type Borrowed<'a> = &'a Self;
5381        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
5382            value
5383        }
5384    }
5385
5386    unsafe impl fidl::encoding::TypeMarker for DevicePortEvent {
5387        type Owned = Self;
5388
5389        #[inline(always)]
5390        fn inline_align(_context: fidl::encoding::Context) -> usize {
5391            8
5392        }
5393
5394        #[inline(always)]
5395        fn inline_size(_context: fidl::encoding::Context) -> usize {
5396            16
5397        }
5398    }
5399
5400    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DevicePortEvent, D>
5401        for &DevicePortEvent
5402    {
5403        #[inline]
5404        unsafe fn encode(
5405            self,
5406            encoder: &mut fidl::encoding::Encoder<'_, D>,
5407            offset: usize,
5408            _depth: fidl::encoding::Depth,
5409        ) -> fidl::Result<()> {
5410            encoder.debug_check_bounds::<DevicePortEvent>(offset);
5411            encoder.write_num::<u64>(self.ordinal(), offset);
5412            match self {
5413                DevicePortEvent::Existing(ref val) => {
5414                    fidl::encoding::encode_in_envelope::<PortId, D>(
5415                        <PortId as fidl::encoding::ValueTypeMarker>::borrow(val),
5416                        encoder,
5417                        offset + 8,
5418                        _depth,
5419                    )
5420                }
5421                DevicePortEvent::Added(ref val) => fidl::encoding::encode_in_envelope::<PortId, D>(
5422                    <PortId as fidl::encoding::ValueTypeMarker>::borrow(val),
5423                    encoder,
5424                    offset + 8,
5425                    _depth,
5426                ),
5427                DevicePortEvent::Removed(ref val) => {
5428                    fidl::encoding::encode_in_envelope::<PortId, D>(
5429                        <PortId as fidl::encoding::ValueTypeMarker>::borrow(val),
5430                        encoder,
5431                        offset + 8,
5432                        _depth,
5433                    )
5434                }
5435                DevicePortEvent::Idle(ref val) => fidl::encoding::encode_in_envelope::<Empty, D>(
5436                    <Empty as fidl::encoding::ValueTypeMarker>::borrow(val),
5437                    encoder,
5438                    offset + 8,
5439                    _depth,
5440                ),
5441            }
5442        }
5443    }
5444
5445    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DevicePortEvent {
5446        #[inline(always)]
5447        fn new_empty() -> Self {
5448            Self::Existing(fidl::new_empty!(PortId, D))
5449        }
5450
5451        #[inline]
5452        unsafe fn decode(
5453            &mut self,
5454            decoder: &mut fidl::encoding::Decoder<'_, D>,
5455            offset: usize,
5456            mut depth: fidl::encoding::Depth,
5457        ) -> fidl::Result<()> {
5458            decoder.debug_check_bounds::<Self>(offset);
5459            #[allow(unused_variables)]
5460            let next_out_of_line = decoder.next_out_of_line();
5461            let handles_before = decoder.remaining_handles();
5462            let (ordinal, inlined, num_bytes, num_handles) =
5463                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
5464
5465            let member_inline_size = match ordinal {
5466                1 => <PortId as fidl::encoding::TypeMarker>::inline_size(decoder.context),
5467                2 => <PortId as fidl::encoding::TypeMarker>::inline_size(decoder.context),
5468                3 => <PortId as fidl::encoding::TypeMarker>::inline_size(decoder.context),
5469                4 => <Empty as fidl::encoding::TypeMarker>::inline_size(decoder.context),
5470                _ => return Err(fidl::Error::UnknownUnionTag),
5471            };
5472
5473            if inlined != (member_inline_size <= 4) {
5474                return Err(fidl::Error::InvalidInlineBitInEnvelope);
5475            }
5476            let _inner_offset;
5477            if inlined {
5478                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
5479                _inner_offset = offset + 8;
5480            } else {
5481                depth.increment()?;
5482                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5483            }
5484            match ordinal {
5485                1 => {
5486                    #[allow(irrefutable_let_patterns)]
5487                    if let DevicePortEvent::Existing(_) = self {
5488                        // Do nothing, read the value into the object
5489                    } else {
5490                        // Initialize `self` to the right variant
5491                        *self = DevicePortEvent::Existing(fidl::new_empty!(PortId, D));
5492                    }
5493                    #[allow(irrefutable_let_patterns)]
5494                    if let DevicePortEvent::Existing(ref mut val) = self {
5495                        fidl::decode!(PortId, D, val, decoder, _inner_offset, depth)?;
5496                    } else {
5497                        unreachable!()
5498                    }
5499                }
5500                2 => {
5501                    #[allow(irrefutable_let_patterns)]
5502                    if let DevicePortEvent::Added(_) = self {
5503                        // Do nothing, read the value into the object
5504                    } else {
5505                        // Initialize `self` to the right variant
5506                        *self = DevicePortEvent::Added(fidl::new_empty!(PortId, D));
5507                    }
5508                    #[allow(irrefutable_let_patterns)]
5509                    if let DevicePortEvent::Added(ref mut val) = self {
5510                        fidl::decode!(PortId, D, val, decoder, _inner_offset, depth)?;
5511                    } else {
5512                        unreachable!()
5513                    }
5514                }
5515                3 => {
5516                    #[allow(irrefutable_let_patterns)]
5517                    if let DevicePortEvent::Removed(_) = self {
5518                        // Do nothing, read the value into the object
5519                    } else {
5520                        // Initialize `self` to the right variant
5521                        *self = DevicePortEvent::Removed(fidl::new_empty!(PortId, D));
5522                    }
5523                    #[allow(irrefutable_let_patterns)]
5524                    if let DevicePortEvent::Removed(ref mut val) = self {
5525                        fidl::decode!(PortId, D, val, decoder, _inner_offset, depth)?;
5526                    } else {
5527                        unreachable!()
5528                    }
5529                }
5530                4 => {
5531                    #[allow(irrefutable_let_patterns)]
5532                    if let DevicePortEvent::Idle(_) = self {
5533                        // Do nothing, read the value into the object
5534                    } else {
5535                        // Initialize `self` to the right variant
5536                        *self = DevicePortEvent::Idle(fidl::new_empty!(Empty, D));
5537                    }
5538                    #[allow(irrefutable_let_patterns)]
5539                    if let DevicePortEvent::Idle(ref mut val) = self {
5540                        fidl::decode!(Empty, D, val, decoder, _inner_offset, depth)?;
5541                    } else {
5542                        unreachable!()
5543                    }
5544                }
5545                ordinal => panic!("unexpected ordinal {:?}", ordinal),
5546            }
5547            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
5548                return Err(fidl::Error::InvalidNumBytesInEnvelope);
5549            }
5550            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5551                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5552            }
5553            Ok(())
5554        }
5555    }
5556}