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    pub const GET_POWER_DEPENDENCY_TOKEN: u64 = 0x7bec1da6ec2476ed;
804}
805
806pub mod port_watcher_ordinals {
807    pub const WATCH: u64 = 0x3e87244b74fff55e;
808}
809
810pub mod session_ordinals {
811    pub const ATTACH: u64 = 0x1e89c9013e201379;
812    pub const DETACH: u64 = 0x68c40cf8fb549867;
813    pub const CLOSE: u64 = 0x393d5070394a92f6;
814    pub const WATCH_DELEGATED_RX_LEASE: u64 = 0x764d823ee64803b5;
815    pub const REGISTER_FOR_TX: u64 = 0x36321799ce2a081a;
816    pub const UNREGISTER_FOR_TX: u64 = 0x3e76b16030d62796;
817}
818
819pub mod status_watcher_ordinals {
820    pub const WATCH_STATUS: u64 = 0x1369a8125c0862b9;
821}
822
823mod internal {
824    use super::*;
825    unsafe impl fidl::encoding::TypeMarker for EthernetFeatures {
826        type Owned = Self;
827
828        #[inline(always)]
829        fn inline_align(_context: fidl::encoding::Context) -> usize {
830            4
831        }
832
833        #[inline(always)]
834        fn inline_size(_context: fidl::encoding::Context) -> usize {
835            4
836        }
837    }
838
839    impl fidl::encoding::ValueTypeMarker for EthernetFeatures {
840        type Borrowed<'a> = Self;
841        #[inline(always)]
842        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
843            *value
844        }
845    }
846
847    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D>
848        for EthernetFeatures
849    {
850        #[inline]
851        unsafe fn encode(
852            self,
853            encoder: &mut fidl::encoding::Encoder<'_, D>,
854            offset: usize,
855            _depth: fidl::encoding::Depth,
856        ) -> fidl::Result<()> {
857            encoder.debug_check_bounds::<Self>(offset);
858            if self.bits() & Self::all().bits() != self.bits() {
859                return Err(fidl::Error::InvalidBitsValue);
860            }
861            encoder.write_num(self.bits(), offset);
862            Ok(())
863        }
864    }
865
866    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for EthernetFeatures {
867        #[inline(always)]
868        fn new_empty() -> Self {
869            Self::empty()
870        }
871
872        #[inline]
873        unsafe fn decode(
874            &mut self,
875            decoder: &mut fidl::encoding::Decoder<'_, D>,
876            offset: usize,
877            _depth: fidl::encoding::Depth,
878        ) -> fidl::Result<()> {
879            decoder.debug_check_bounds::<Self>(offset);
880            let prim = decoder.read_num::<u32>(offset);
881            *self = Self::from_bits(prim).ok_or(fidl::Error::InvalidBitsValue)?;
882            Ok(())
883        }
884    }
885    unsafe impl fidl::encoding::TypeMarker for RxFlags {
886        type Owned = Self;
887
888        #[inline(always)]
889        fn inline_align(_context: fidl::encoding::Context) -> usize {
890            4
891        }
892
893        #[inline(always)]
894        fn inline_size(_context: fidl::encoding::Context) -> usize {
895            4
896        }
897    }
898
899    impl fidl::encoding::ValueTypeMarker for RxFlags {
900        type Borrowed<'a> = Self;
901        #[inline(always)]
902        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
903            *value
904        }
905    }
906
907    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for RxFlags {
908        #[inline]
909        unsafe fn encode(
910            self,
911            encoder: &mut fidl::encoding::Encoder<'_, D>,
912            offset: usize,
913            _depth: fidl::encoding::Depth,
914        ) -> fidl::Result<()> {
915            encoder.debug_check_bounds::<Self>(offset);
916            if self.bits() & Self::all().bits() != self.bits() {
917                return Err(fidl::Error::InvalidBitsValue);
918            }
919            encoder.write_num(self.bits(), offset);
920            Ok(())
921        }
922    }
923
924    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RxFlags {
925        #[inline(always)]
926        fn new_empty() -> Self {
927            Self::empty()
928        }
929
930        #[inline]
931        unsafe fn decode(
932            &mut self,
933            decoder: &mut fidl::encoding::Decoder<'_, D>,
934            offset: usize,
935            _depth: fidl::encoding::Depth,
936        ) -> fidl::Result<()> {
937            decoder.debug_check_bounds::<Self>(offset);
938            let prim = decoder.read_num::<u32>(offset);
939            *self = Self::from_bits(prim).ok_or(fidl::Error::InvalidBitsValue)?;
940            Ok(())
941        }
942    }
943    unsafe impl fidl::encoding::TypeMarker for SessionFlags {
944        type Owned = Self;
945
946        #[inline(always)]
947        fn inline_align(_context: fidl::encoding::Context) -> usize {
948            2
949        }
950
951        #[inline(always)]
952        fn inline_size(_context: fidl::encoding::Context) -> usize {
953            2
954        }
955    }
956
957    impl fidl::encoding::ValueTypeMarker for SessionFlags {
958        type Borrowed<'a> = Self;
959        #[inline(always)]
960        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
961            *value
962        }
963    }
964
965    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for SessionFlags {
966        #[inline]
967        unsafe fn encode(
968            self,
969            encoder: &mut fidl::encoding::Encoder<'_, D>,
970            offset: usize,
971            _depth: fidl::encoding::Depth,
972        ) -> fidl::Result<()> {
973            encoder.debug_check_bounds::<Self>(offset);
974            if self.bits() & Self::all().bits() != self.bits() {
975                return Err(fidl::Error::InvalidBitsValue);
976            }
977            encoder.write_num(self.bits(), offset);
978            Ok(())
979        }
980    }
981
982    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SessionFlags {
983        #[inline(always)]
984        fn new_empty() -> Self {
985            Self::empty()
986        }
987
988        #[inline]
989        unsafe fn decode(
990            &mut self,
991            decoder: &mut fidl::encoding::Decoder<'_, D>,
992            offset: usize,
993            _depth: fidl::encoding::Depth,
994        ) -> fidl::Result<()> {
995            decoder.debug_check_bounds::<Self>(offset);
996            let prim = decoder.read_num::<u16>(offset);
997            *self = Self::from_bits(prim).ok_or(fidl::Error::InvalidBitsValue)?;
998            Ok(())
999        }
1000    }
1001    unsafe impl fidl::encoding::TypeMarker for StatusFlags {
1002        type Owned = Self;
1003
1004        #[inline(always)]
1005        fn inline_align(_context: fidl::encoding::Context) -> usize {
1006            4
1007        }
1008
1009        #[inline(always)]
1010        fn inline_size(_context: fidl::encoding::Context) -> usize {
1011            4
1012        }
1013    }
1014
1015    impl fidl::encoding::ValueTypeMarker for StatusFlags {
1016        type Borrowed<'a> = Self;
1017        #[inline(always)]
1018        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1019            *value
1020        }
1021    }
1022
1023    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for StatusFlags {
1024        #[inline]
1025        unsafe fn encode(
1026            self,
1027            encoder: &mut fidl::encoding::Encoder<'_, D>,
1028            offset: usize,
1029            _depth: fidl::encoding::Depth,
1030        ) -> fidl::Result<()> {
1031            encoder.debug_check_bounds::<Self>(offset);
1032            if self.bits() & Self::all().bits() != self.bits() {
1033                return Err(fidl::Error::InvalidBitsValue);
1034            }
1035            encoder.write_num(self.bits(), offset);
1036            Ok(())
1037        }
1038    }
1039
1040    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for StatusFlags {
1041        #[inline(always)]
1042        fn new_empty() -> Self {
1043            Self::empty()
1044        }
1045
1046        #[inline]
1047        unsafe fn decode(
1048            &mut self,
1049            decoder: &mut fidl::encoding::Decoder<'_, D>,
1050            offset: usize,
1051            _depth: fidl::encoding::Depth,
1052        ) -> fidl::Result<()> {
1053            decoder.debug_check_bounds::<Self>(offset);
1054            let prim = decoder.read_num::<u32>(offset);
1055            *self = Self::from_bits(prim).ok_or(fidl::Error::InvalidBitsValue)?;
1056            Ok(())
1057        }
1058    }
1059    unsafe impl fidl::encoding::TypeMarker for TxFlags {
1060        type Owned = Self;
1061
1062        #[inline(always)]
1063        fn inline_align(_context: fidl::encoding::Context) -> usize {
1064            4
1065        }
1066
1067        #[inline(always)]
1068        fn inline_size(_context: fidl::encoding::Context) -> usize {
1069            4
1070        }
1071    }
1072
1073    impl fidl::encoding::ValueTypeMarker for TxFlags {
1074        type Borrowed<'a> = Self;
1075        #[inline(always)]
1076        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1077            *value
1078        }
1079    }
1080
1081    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for TxFlags {
1082        #[inline]
1083        unsafe fn encode(
1084            self,
1085            encoder: &mut fidl::encoding::Encoder<'_, D>,
1086            offset: usize,
1087            _depth: fidl::encoding::Depth,
1088        ) -> fidl::Result<()> {
1089            encoder.debug_check_bounds::<Self>(offset);
1090            encoder.write_num(self.bits(), offset);
1091            Ok(())
1092        }
1093    }
1094
1095    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for TxFlags {
1096        #[inline(always)]
1097        fn new_empty() -> Self {
1098            Self::empty()
1099        }
1100
1101        #[inline]
1102        unsafe fn decode(
1103            &mut self,
1104            decoder: &mut fidl::encoding::Decoder<'_, D>,
1105            offset: usize,
1106            _depth: fidl::encoding::Depth,
1107        ) -> fidl::Result<()> {
1108            decoder.debug_check_bounds::<Self>(offset);
1109            let prim = decoder.read_num::<u32>(offset);
1110            *self = Self::from_bits_allow_unknown(prim);
1111            Ok(())
1112        }
1113    }
1114    unsafe impl fidl::encoding::TypeMarker for TxReturnFlags {
1115        type Owned = Self;
1116
1117        #[inline(always)]
1118        fn inline_align(_context: fidl::encoding::Context) -> usize {
1119            4
1120        }
1121
1122        #[inline(always)]
1123        fn inline_size(_context: fidl::encoding::Context) -> usize {
1124            4
1125        }
1126    }
1127
1128    impl fidl::encoding::ValueTypeMarker for TxReturnFlags {
1129        type Borrowed<'a> = Self;
1130        #[inline(always)]
1131        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1132            *value
1133        }
1134    }
1135
1136    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for TxReturnFlags {
1137        #[inline]
1138        unsafe fn encode(
1139            self,
1140            encoder: &mut fidl::encoding::Encoder<'_, D>,
1141            offset: usize,
1142            _depth: fidl::encoding::Depth,
1143        ) -> fidl::Result<()> {
1144            encoder.debug_check_bounds::<Self>(offset);
1145            encoder.write_num(self.bits(), offset);
1146            Ok(())
1147        }
1148    }
1149
1150    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for TxReturnFlags {
1151        #[inline(always)]
1152        fn new_empty() -> Self {
1153            Self::empty()
1154        }
1155
1156        #[inline]
1157        unsafe fn decode(
1158            &mut self,
1159            decoder: &mut fidl::encoding::Decoder<'_, D>,
1160            offset: usize,
1161            _depth: fidl::encoding::Depth,
1162        ) -> fidl::Result<()> {
1163            decoder.debug_check_bounds::<Self>(offset);
1164            let prim = decoder.read_num::<u32>(offset);
1165            *self = Self::from_bits_allow_unknown(prim);
1166            Ok(())
1167        }
1168    }
1169    unsafe impl fidl::encoding::TypeMarker for FrameType {
1170        type Owned = Self;
1171
1172        #[inline(always)]
1173        fn inline_align(_context: fidl::encoding::Context) -> usize {
1174            std::mem::align_of::<u8>()
1175        }
1176
1177        #[inline(always)]
1178        fn inline_size(_context: fidl::encoding::Context) -> usize {
1179            std::mem::size_of::<u8>()
1180        }
1181
1182        #[inline(always)]
1183        fn encode_is_copy() -> bool {
1184            false
1185        }
1186
1187        #[inline(always)]
1188        fn decode_is_copy() -> bool {
1189            false
1190        }
1191    }
1192
1193    impl fidl::encoding::ValueTypeMarker for FrameType {
1194        type Borrowed<'a> = Self;
1195        #[inline(always)]
1196        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1197            *value
1198        }
1199    }
1200
1201    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for FrameType {
1202        #[inline]
1203        unsafe fn encode(
1204            self,
1205            encoder: &mut fidl::encoding::Encoder<'_, D>,
1206            offset: usize,
1207            _depth: fidl::encoding::Depth,
1208        ) -> fidl::Result<()> {
1209            encoder.debug_check_bounds::<Self>(offset);
1210            encoder.write_num(self.into_primitive(), offset);
1211            Ok(())
1212        }
1213    }
1214
1215    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for FrameType {
1216        #[inline(always)]
1217        fn new_empty() -> Self {
1218            Self::unknown()
1219        }
1220
1221        #[inline]
1222        unsafe fn decode(
1223            &mut self,
1224            decoder: &mut fidl::encoding::Decoder<'_, D>,
1225            offset: usize,
1226            _depth: fidl::encoding::Depth,
1227        ) -> fidl::Result<()> {
1228            decoder.debug_check_bounds::<Self>(offset);
1229            let prim = decoder.read_num::<u8>(offset);
1230
1231            *self = Self::from_primitive_allow_unknown(prim);
1232            Ok(())
1233        }
1234    }
1235    unsafe impl fidl::encoding::TypeMarker for MacFilterMode {
1236        type Owned = Self;
1237
1238        #[inline(always)]
1239        fn inline_align(_context: fidl::encoding::Context) -> usize {
1240            std::mem::align_of::<u32>()
1241        }
1242
1243        #[inline(always)]
1244        fn inline_size(_context: fidl::encoding::Context) -> usize {
1245            std::mem::size_of::<u32>()
1246        }
1247
1248        #[inline(always)]
1249        fn encode_is_copy() -> bool {
1250            false
1251        }
1252
1253        #[inline(always)]
1254        fn decode_is_copy() -> bool {
1255            false
1256        }
1257    }
1258
1259    impl fidl::encoding::ValueTypeMarker for MacFilterMode {
1260        type Borrowed<'a> = Self;
1261        #[inline(always)]
1262        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1263            *value
1264        }
1265    }
1266
1267    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for MacFilterMode {
1268        #[inline]
1269        unsafe fn encode(
1270            self,
1271            encoder: &mut fidl::encoding::Encoder<'_, D>,
1272            offset: usize,
1273            _depth: fidl::encoding::Depth,
1274        ) -> fidl::Result<()> {
1275            encoder.debug_check_bounds::<Self>(offset);
1276            encoder.write_num(self.into_primitive(), offset);
1277            Ok(())
1278        }
1279    }
1280
1281    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for MacFilterMode {
1282        #[inline(always)]
1283        fn new_empty() -> Self {
1284            Self::unknown()
1285        }
1286
1287        #[inline]
1288        unsafe fn decode(
1289            &mut self,
1290            decoder: &mut fidl::encoding::Decoder<'_, D>,
1291            offset: usize,
1292            _depth: fidl::encoding::Depth,
1293        ) -> fidl::Result<()> {
1294            decoder.debug_check_bounds::<Self>(offset);
1295            let prim = decoder.read_num::<u32>(offset);
1296
1297            *self = Self::from_primitive_allow_unknown(prim);
1298            Ok(())
1299        }
1300    }
1301    unsafe impl fidl::encoding::TypeMarker for PortClass {
1302        type Owned = Self;
1303
1304        #[inline(always)]
1305        fn inline_align(_context: fidl::encoding::Context) -> usize {
1306            std::mem::align_of::<u16>()
1307        }
1308
1309        #[inline(always)]
1310        fn inline_size(_context: fidl::encoding::Context) -> usize {
1311            std::mem::size_of::<u16>()
1312        }
1313
1314        #[inline(always)]
1315        fn encode_is_copy() -> bool {
1316            false
1317        }
1318
1319        #[inline(always)]
1320        fn decode_is_copy() -> bool {
1321            false
1322        }
1323    }
1324
1325    impl fidl::encoding::ValueTypeMarker for PortClass {
1326        type Borrowed<'a> = Self;
1327        #[inline(always)]
1328        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1329            *value
1330        }
1331    }
1332
1333    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for PortClass {
1334        #[inline]
1335        unsafe fn encode(
1336            self,
1337            encoder: &mut fidl::encoding::Encoder<'_, D>,
1338            offset: usize,
1339            _depth: fidl::encoding::Depth,
1340        ) -> fidl::Result<()> {
1341            encoder.debug_check_bounds::<Self>(offset);
1342            encoder.write_num(self.into_primitive(), offset);
1343            Ok(())
1344        }
1345    }
1346
1347    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortClass {
1348        #[inline(always)]
1349        fn new_empty() -> Self {
1350            Self::unknown()
1351        }
1352
1353        #[inline]
1354        unsafe fn decode(
1355            &mut self,
1356            decoder: &mut fidl::encoding::Decoder<'_, D>,
1357            offset: usize,
1358            _depth: fidl::encoding::Depth,
1359        ) -> fidl::Result<()> {
1360            decoder.debug_check_bounds::<Self>(offset);
1361            let prim = decoder.read_num::<u16>(offset);
1362
1363            *self = Self::from_primitive_allow_unknown(prim);
1364            Ok(())
1365        }
1366    }
1367
1368    impl fidl::encoding::ValueTypeMarker for DeviceGetInfoResponse {
1369        type Borrowed<'a> = &'a Self;
1370        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1371            value
1372        }
1373    }
1374
1375    unsafe impl fidl::encoding::TypeMarker for DeviceGetInfoResponse {
1376        type Owned = Self;
1377
1378        #[inline(always)]
1379        fn inline_align(_context: fidl::encoding::Context) -> usize {
1380            8
1381        }
1382
1383        #[inline(always)]
1384        fn inline_size(_context: fidl::encoding::Context) -> usize {
1385            16
1386        }
1387    }
1388
1389    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DeviceGetInfoResponse, D>
1390        for &DeviceGetInfoResponse
1391    {
1392        #[inline]
1393        unsafe fn encode(
1394            self,
1395            encoder: &mut fidl::encoding::Encoder<'_, D>,
1396            offset: usize,
1397            _depth: fidl::encoding::Depth,
1398        ) -> fidl::Result<()> {
1399            encoder.debug_check_bounds::<DeviceGetInfoResponse>(offset);
1400            // Delegate to tuple encoding.
1401            fidl::encoding::Encode::<DeviceGetInfoResponse, D>::encode(
1402                (<DeviceInfo as fidl::encoding::ValueTypeMarker>::borrow(&self.info),),
1403                encoder,
1404                offset,
1405                _depth,
1406            )
1407        }
1408    }
1409    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<DeviceInfo, D>>
1410        fidl::encoding::Encode<DeviceGetInfoResponse, D> for (T0,)
1411    {
1412        #[inline]
1413        unsafe fn encode(
1414            self,
1415            encoder: &mut fidl::encoding::Encoder<'_, D>,
1416            offset: usize,
1417            depth: fidl::encoding::Depth,
1418        ) -> fidl::Result<()> {
1419            encoder.debug_check_bounds::<DeviceGetInfoResponse>(offset);
1420            // Zero out padding regions. There's no need to apply masks
1421            // because the unmasked parts will be overwritten by fields.
1422            // Write the fields.
1423            self.0.encode(encoder, offset + 0, depth)?;
1424            Ok(())
1425        }
1426    }
1427
1428    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DeviceGetInfoResponse {
1429        #[inline(always)]
1430        fn new_empty() -> Self {
1431            Self { info: fidl::new_empty!(DeviceInfo, D) }
1432        }
1433
1434        #[inline]
1435        unsafe fn decode(
1436            &mut self,
1437            decoder: &mut fidl::encoding::Decoder<'_, D>,
1438            offset: usize,
1439            _depth: fidl::encoding::Depth,
1440        ) -> fidl::Result<()> {
1441            decoder.debug_check_bounds::<Self>(offset);
1442            // Verify that padding bytes are zero.
1443            fidl::decode!(DeviceInfo, D, &mut self.info, decoder, offset + 0, _depth)?;
1444            Ok(())
1445        }
1446    }
1447
1448    impl fidl::encoding::ValueTypeMarker for Empty {
1449        type Borrowed<'a> = &'a Self;
1450        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1451            value
1452        }
1453    }
1454
1455    unsafe impl fidl::encoding::TypeMarker for Empty {
1456        type Owned = Self;
1457
1458        #[inline(always)]
1459        fn inline_align(_context: fidl::encoding::Context) -> usize {
1460            1
1461        }
1462
1463        #[inline(always)]
1464        fn inline_size(_context: fidl::encoding::Context) -> usize {
1465            1
1466        }
1467    }
1468
1469    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Empty, D> for &Empty {
1470        #[inline]
1471        unsafe fn encode(
1472            self,
1473            encoder: &mut fidl::encoding::Encoder<'_, D>,
1474            offset: usize,
1475            _depth: fidl::encoding::Depth,
1476        ) -> fidl::Result<()> {
1477            encoder.debug_check_bounds::<Empty>(offset);
1478            encoder.write_num(0u8, offset);
1479            Ok(())
1480        }
1481    }
1482
1483    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Empty {
1484        #[inline(always)]
1485        fn new_empty() -> Self {
1486            Self
1487        }
1488
1489        #[inline]
1490        unsafe fn decode(
1491            &mut self,
1492            decoder: &mut fidl::encoding::Decoder<'_, D>,
1493            offset: usize,
1494            _depth: fidl::encoding::Depth,
1495        ) -> fidl::Result<()> {
1496            decoder.debug_check_bounds::<Self>(offset);
1497            match decoder.read_num::<u8>(offset) {
1498                0 => Ok(()),
1499                _ => Err(fidl::Error::Invalid),
1500            }
1501        }
1502    }
1503
1504    impl fidl::encoding::ValueTypeMarker for FrameTypeSupport {
1505        type Borrowed<'a> = &'a Self;
1506        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1507            value
1508        }
1509    }
1510
1511    unsafe impl fidl::encoding::TypeMarker for FrameTypeSupport {
1512        type Owned = Self;
1513
1514        #[inline(always)]
1515        fn inline_align(_context: fidl::encoding::Context) -> usize {
1516            4
1517        }
1518
1519        #[inline(always)]
1520        fn inline_size(_context: fidl::encoding::Context) -> usize {
1521            12
1522        }
1523    }
1524
1525    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<FrameTypeSupport, D>
1526        for &FrameTypeSupport
1527    {
1528        #[inline]
1529        unsafe fn encode(
1530            self,
1531            encoder: &mut fidl::encoding::Encoder<'_, D>,
1532            offset: usize,
1533            _depth: fidl::encoding::Depth,
1534        ) -> fidl::Result<()> {
1535            encoder.debug_check_bounds::<FrameTypeSupport>(offset);
1536            // Delegate to tuple encoding.
1537            fidl::encoding::Encode::<FrameTypeSupport, D>::encode(
1538                (
1539                    <FrameType as fidl::encoding::ValueTypeMarker>::borrow(&self.type_),
1540                    <u32 as fidl::encoding::ValueTypeMarker>::borrow(&self.features),
1541                    <TxFlags as fidl::encoding::ValueTypeMarker>::borrow(&self.supported_flags),
1542                ),
1543                encoder,
1544                offset,
1545                _depth,
1546            )
1547        }
1548    }
1549    unsafe impl<
1550        D: fidl::encoding::ResourceDialect,
1551        T0: fidl::encoding::Encode<FrameType, D>,
1552        T1: fidl::encoding::Encode<u32, D>,
1553        T2: fidl::encoding::Encode<TxFlags, D>,
1554    > fidl::encoding::Encode<FrameTypeSupport, D> for (T0, T1, T2)
1555    {
1556        #[inline]
1557        unsafe fn encode(
1558            self,
1559            encoder: &mut fidl::encoding::Encoder<'_, D>,
1560            offset: usize,
1561            depth: fidl::encoding::Depth,
1562        ) -> fidl::Result<()> {
1563            encoder.debug_check_bounds::<FrameTypeSupport>(offset);
1564            // Zero out padding regions. There's no need to apply masks
1565            // because the unmasked parts will be overwritten by fields.
1566            unsafe {
1567                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
1568                (ptr as *mut u32).write_unaligned(0);
1569            }
1570            // Write the fields.
1571            self.0.encode(encoder, offset + 0, depth)?;
1572            self.1.encode(encoder, offset + 4, depth)?;
1573            self.2.encode(encoder, offset + 8, depth)?;
1574            Ok(())
1575        }
1576    }
1577
1578    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for FrameTypeSupport {
1579        #[inline(always)]
1580        fn new_empty() -> Self {
1581            Self {
1582                type_: fidl::new_empty!(FrameType, D),
1583                features: fidl::new_empty!(u32, D),
1584                supported_flags: fidl::new_empty!(TxFlags, D),
1585            }
1586        }
1587
1588        #[inline]
1589        unsafe fn decode(
1590            &mut self,
1591            decoder: &mut fidl::encoding::Decoder<'_, D>,
1592            offset: usize,
1593            _depth: fidl::encoding::Depth,
1594        ) -> fidl::Result<()> {
1595            decoder.debug_check_bounds::<Self>(offset);
1596            // Verify that padding bytes are zero.
1597            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
1598            let padval = unsafe { (ptr as *const u32).read_unaligned() };
1599            let mask = 0xffffff00u32;
1600            let maskedval = padval & mask;
1601            if maskedval != 0 {
1602                return Err(fidl::Error::NonZeroPadding {
1603                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
1604                });
1605            }
1606            fidl::decode!(FrameType, D, &mut self.type_, decoder, offset + 0, _depth)?;
1607            fidl::decode!(u32, D, &mut self.features, decoder, offset + 4, _depth)?;
1608            fidl::decode!(TxFlags, D, &mut self.supported_flags, decoder, offset + 8, _depth)?;
1609            Ok(())
1610        }
1611    }
1612
1613    impl fidl::encoding::ValueTypeMarker for MacAddressingAddMulticastAddressRequest {
1614        type Borrowed<'a> = &'a Self;
1615        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1616            value
1617        }
1618    }
1619
1620    unsafe impl fidl::encoding::TypeMarker for MacAddressingAddMulticastAddressRequest {
1621        type Owned = Self;
1622
1623        #[inline(always)]
1624        fn inline_align(_context: fidl::encoding::Context) -> usize {
1625            1
1626        }
1627
1628        #[inline(always)]
1629        fn inline_size(_context: fidl::encoding::Context) -> usize {
1630            6
1631        }
1632    }
1633
1634    unsafe impl<D: fidl::encoding::ResourceDialect>
1635        fidl::encoding::Encode<MacAddressingAddMulticastAddressRequest, D>
1636        for &MacAddressingAddMulticastAddressRequest
1637    {
1638        #[inline]
1639        unsafe fn encode(
1640            self,
1641            encoder: &mut fidl::encoding::Encoder<'_, D>,
1642            offset: usize,
1643            _depth: fidl::encoding::Depth,
1644        ) -> fidl::Result<()> {
1645            encoder.debug_check_bounds::<MacAddressingAddMulticastAddressRequest>(offset);
1646            // Delegate to tuple encoding.
1647            fidl::encoding::Encode::<MacAddressingAddMulticastAddressRequest, D>::encode(
1648                (<fidl_fuchsia_net_common::MacAddress as fidl::encoding::ValueTypeMarker>::borrow(
1649                    &self.address,
1650                ),),
1651                encoder,
1652                offset,
1653                _depth,
1654            )
1655        }
1656    }
1657    unsafe impl<
1658        D: fidl::encoding::ResourceDialect,
1659        T0: fidl::encoding::Encode<fidl_fuchsia_net_common::MacAddress, D>,
1660    > fidl::encoding::Encode<MacAddressingAddMulticastAddressRequest, D> for (T0,)
1661    {
1662        #[inline]
1663        unsafe fn encode(
1664            self,
1665            encoder: &mut fidl::encoding::Encoder<'_, D>,
1666            offset: usize,
1667            depth: fidl::encoding::Depth,
1668        ) -> fidl::Result<()> {
1669            encoder.debug_check_bounds::<MacAddressingAddMulticastAddressRequest>(offset);
1670            // Zero out padding regions. There's no need to apply masks
1671            // because the unmasked parts will be overwritten by fields.
1672            // Write the fields.
1673            self.0.encode(encoder, offset + 0, depth)?;
1674            Ok(())
1675        }
1676    }
1677
1678    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1679        for MacAddressingAddMulticastAddressRequest
1680    {
1681        #[inline(always)]
1682        fn new_empty() -> Self {
1683            Self { address: fidl::new_empty!(fidl_fuchsia_net_common::MacAddress, D) }
1684        }
1685
1686        #[inline]
1687        unsafe fn decode(
1688            &mut self,
1689            decoder: &mut fidl::encoding::Decoder<'_, D>,
1690            offset: usize,
1691            _depth: fidl::encoding::Depth,
1692        ) -> fidl::Result<()> {
1693            decoder.debug_check_bounds::<Self>(offset);
1694            // Verify that padding bytes are zero.
1695            fidl::decode!(
1696                fidl_fuchsia_net_common::MacAddress,
1697                D,
1698                &mut self.address,
1699                decoder,
1700                offset + 0,
1701                _depth
1702            )?;
1703            Ok(())
1704        }
1705    }
1706
1707    impl fidl::encoding::ValueTypeMarker for MacAddressingAddMulticastAddressResponse {
1708        type Borrowed<'a> = &'a Self;
1709        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1710            value
1711        }
1712    }
1713
1714    unsafe impl fidl::encoding::TypeMarker for MacAddressingAddMulticastAddressResponse {
1715        type Owned = Self;
1716
1717        #[inline(always)]
1718        fn inline_align(_context: fidl::encoding::Context) -> usize {
1719            4
1720        }
1721
1722        #[inline(always)]
1723        fn inline_size(_context: fidl::encoding::Context) -> usize {
1724            4
1725        }
1726        #[inline(always)]
1727        fn encode_is_copy() -> bool {
1728            true
1729        }
1730
1731        #[inline(always)]
1732        fn decode_is_copy() -> bool {
1733            true
1734        }
1735    }
1736
1737    unsafe impl<D: fidl::encoding::ResourceDialect>
1738        fidl::encoding::Encode<MacAddressingAddMulticastAddressResponse, D>
1739        for &MacAddressingAddMulticastAddressResponse
1740    {
1741        #[inline]
1742        unsafe fn encode(
1743            self,
1744            encoder: &mut fidl::encoding::Encoder<'_, D>,
1745            offset: usize,
1746            _depth: fidl::encoding::Depth,
1747        ) -> fidl::Result<()> {
1748            encoder.debug_check_bounds::<MacAddressingAddMulticastAddressResponse>(offset);
1749            unsafe {
1750                // Copy the object into the buffer.
1751                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
1752                (buf_ptr as *mut MacAddressingAddMulticastAddressResponse).write_unaligned(
1753                    (self as *const MacAddressingAddMulticastAddressResponse).read(),
1754                );
1755                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
1756                // done second because the memcpy will write garbage to these bytes.
1757            }
1758            Ok(())
1759        }
1760    }
1761    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i32, D>>
1762        fidl::encoding::Encode<MacAddressingAddMulticastAddressResponse, D> for (T0,)
1763    {
1764        #[inline]
1765        unsafe fn encode(
1766            self,
1767            encoder: &mut fidl::encoding::Encoder<'_, D>,
1768            offset: usize,
1769            depth: fidl::encoding::Depth,
1770        ) -> fidl::Result<()> {
1771            encoder.debug_check_bounds::<MacAddressingAddMulticastAddressResponse>(offset);
1772            // Zero out padding regions. There's no need to apply masks
1773            // because the unmasked parts will be overwritten by fields.
1774            // Write the fields.
1775            self.0.encode(encoder, offset + 0, depth)?;
1776            Ok(())
1777        }
1778    }
1779
1780    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1781        for MacAddressingAddMulticastAddressResponse
1782    {
1783        #[inline(always)]
1784        fn new_empty() -> Self {
1785            Self { status: fidl::new_empty!(i32, D) }
1786        }
1787
1788        #[inline]
1789        unsafe fn decode(
1790            &mut self,
1791            decoder: &mut fidl::encoding::Decoder<'_, D>,
1792            offset: usize,
1793            _depth: fidl::encoding::Depth,
1794        ) -> fidl::Result<()> {
1795            decoder.debug_check_bounds::<Self>(offset);
1796            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
1797            // Verify that padding bytes are zero.
1798            // Copy from the buffer into the object.
1799            unsafe {
1800                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 4);
1801            }
1802            Ok(())
1803        }
1804    }
1805
1806    impl fidl::encoding::ValueTypeMarker for MacAddressingGetUnicastAddressResponse {
1807        type Borrowed<'a> = &'a Self;
1808        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1809            value
1810        }
1811    }
1812
1813    unsafe impl fidl::encoding::TypeMarker for MacAddressingGetUnicastAddressResponse {
1814        type Owned = Self;
1815
1816        #[inline(always)]
1817        fn inline_align(_context: fidl::encoding::Context) -> usize {
1818            1
1819        }
1820
1821        #[inline(always)]
1822        fn inline_size(_context: fidl::encoding::Context) -> usize {
1823            6
1824        }
1825    }
1826
1827    unsafe impl<D: fidl::encoding::ResourceDialect>
1828        fidl::encoding::Encode<MacAddressingGetUnicastAddressResponse, D>
1829        for &MacAddressingGetUnicastAddressResponse
1830    {
1831        #[inline]
1832        unsafe fn encode(
1833            self,
1834            encoder: &mut fidl::encoding::Encoder<'_, D>,
1835            offset: usize,
1836            _depth: fidl::encoding::Depth,
1837        ) -> fidl::Result<()> {
1838            encoder.debug_check_bounds::<MacAddressingGetUnicastAddressResponse>(offset);
1839            // Delegate to tuple encoding.
1840            fidl::encoding::Encode::<MacAddressingGetUnicastAddressResponse, D>::encode(
1841                (<fidl_fuchsia_net_common::MacAddress as fidl::encoding::ValueTypeMarker>::borrow(
1842                    &self.address,
1843                ),),
1844                encoder,
1845                offset,
1846                _depth,
1847            )
1848        }
1849    }
1850    unsafe impl<
1851        D: fidl::encoding::ResourceDialect,
1852        T0: fidl::encoding::Encode<fidl_fuchsia_net_common::MacAddress, D>,
1853    > fidl::encoding::Encode<MacAddressingGetUnicastAddressResponse, D> for (T0,)
1854    {
1855        #[inline]
1856        unsafe fn encode(
1857            self,
1858            encoder: &mut fidl::encoding::Encoder<'_, D>,
1859            offset: usize,
1860            depth: fidl::encoding::Depth,
1861        ) -> fidl::Result<()> {
1862            encoder.debug_check_bounds::<MacAddressingGetUnicastAddressResponse>(offset);
1863            // Zero out padding regions. There's no need to apply masks
1864            // because the unmasked parts will be overwritten by fields.
1865            // Write the fields.
1866            self.0.encode(encoder, offset + 0, depth)?;
1867            Ok(())
1868        }
1869    }
1870
1871    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1872        for MacAddressingGetUnicastAddressResponse
1873    {
1874        #[inline(always)]
1875        fn new_empty() -> Self {
1876            Self { address: fidl::new_empty!(fidl_fuchsia_net_common::MacAddress, D) }
1877        }
1878
1879        #[inline]
1880        unsafe fn decode(
1881            &mut self,
1882            decoder: &mut fidl::encoding::Decoder<'_, D>,
1883            offset: usize,
1884            _depth: fidl::encoding::Depth,
1885        ) -> fidl::Result<()> {
1886            decoder.debug_check_bounds::<Self>(offset);
1887            // Verify that padding bytes are zero.
1888            fidl::decode!(
1889                fidl_fuchsia_net_common::MacAddress,
1890                D,
1891                &mut self.address,
1892                decoder,
1893                offset + 0,
1894                _depth
1895            )?;
1896            Ok(())
1897        }
1898    }
1899
1900    impl fidl::encoding::ValueTypeMarker for MacAddressingRemoveMulticastAddressRequest {
1901        type Borrowed<'a> = &'a Self;
1902        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1903            value
1904        }
1905    }
1906
1907    unsafe impl fidl::encoding::TypeMarker for MacAddressingRemoveMulticastAddressRequest {
1908        type Owned = Self;
1909
1910        #[inline(always)]
1911        fn inline_align(_context: fidl::encoding::Context) -> usize {
1912            1
1913        }
1914
1915        #[inline(always)]
1916        fn inline_size(_context: fidl::encoding::Context) -> usize {
1917            6
1918        }
1919    }
1920
1921    unsafe impl<D: fidl::encoding::ResourceDialect>
1922        fidl::encoding::Encode<MacAddressingRemoveMulticastAddressRequest, D>
1923        for &MacAddressingRemoveMulticastAddressRequest
1924    {
1925        #[inline]
1926        unsafe fn encode(
1927            self,
1928            encoder: &mut fidl::encoding::Encoder<'_, D>,
1929            offset: usize,
1930            _depth: fidl::encoding::Depth,
1931        ) -> fidl::Result<()> {
1932            encoder.debug_check_bounds::<MacAddressingRemoveMulticastAddressRequest>(offset);
1933            // Delegate to tuple encoding.
1934            fidl::encoding::Encode::<MacAddressingRemoveMulticastAddressRequest, D>::encode(
1935                (<fidl_fuchsia_net_common::MacAddress as fidl::encoding::ValueTypeMarker>::borrow(
1936                    &self.address,
1937                ),),
1938                encoder,
1939                offset,
1940                _depth,
1941            )
1942        }
1943    }
1944    unsafe impl<
1945        D: fidl::encoding::ResourceDialect,
1946        T0: fidl::encoding::Encode<fidl_fuchsia_net_common::MacAddress, D>,
1947    > fidl::encoding::Encode<MacAddressingRemoveMulticastAddressRequest, D> for (T0,)
1948    {
1949        #[inline]
1950        unsafe fn encode(
1951            self,
1952            encoder: &mut fidl::encoding::Encoder<'_, D>,
1953            offset: usize,
1954            depth: fidl::encoding::Depth,
1955        ) -> fidl::Result<()> {
1956            encoder.debug_check_bounds::<MacAddressingRemoveMulticastAddressRequest>(offset);
1957            // Zero out padding regions. There's no need to apply masks
1958            // because the unmasked parts will be overwritten by fields.
1959            // Write the fields.
1960            self.0.encode(encoder, offset + 0, depth)?;
1961            Ok(())
1962        }
1963    }
1964
1965    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1966        for MacAddressingRemoveMulticastAddressRequest
1967    {
1968        #[inline(always)]
1969        fn new_empty() -> Self {
1970            Self { address: fidl::new_empty!(fidl_fuchsia_net_common::MacAddress, D) }
1971        }
1972
1973        #[inline]
1974        unsafe fn decode(
1975            &mut self,
1976            decoder: &mut fidl::encoding::Decoder<'_, D>,
1977            offset: usize,
1978            _depth: fidl::encoding::Depth,
1979        ) -> fidl::Result<()> {
1980            decoder.debug_check_bounds::<Self>(offset);
1981            // Verify that padding bytes are zero.
1982            fidl::decode!(
1983                fidl_fuchsia_net_common::MacAddress,
1984                D,
1985                &mut self.address,
1986                decoder,
1987                offset + 0,
1988                _depth
1989            )?;
1990            Ok(())
1991        }
1992    }
1993
1994    impl fidl::encoding::ValueTypeMarker for MacAddressingRemoveMulticastAddressResponse {
1995        type Borrowed<'a> = &'a Self;
1996        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1997            value
1998        }
1999    }
2000
2001    unsafe impl fidl::encoding::TypeMarker for MacAddressingRemoveMulticastAddressResponse {
2002        type Owned = Self;
2003
2004        #[inline(always)]
2005        fn inline_align(_context: fidl::encoding::Context) -> usize {
2006            4
2007        }
2008
2009        #[inline(always)]
2010        fn inline_size(_context: fidl::encoding::Context) -> usize {
2011            4
2012        }
2013        #[inline(always)]
2014        fn encode_is_copy() -> bool {
2015            true
2016        }
2017
2018        #[inline(always)]
2019        fn decode_is_copy() -> bool {
2020            true
2021        }
2022    }
2023
2024    unsafe impl<D: fidl::encoding::ResourceDialect>
2025        fidl::encoding::Encode<MacAddressingRemoveMulticastAddressResponse, D>
2026        for &MacAddressingRemoveMulticastAddressResponse
2027    {
2028        #[inline]
2029        unsafe fn encode(
2030            self,
2031            encoder: &mut fidl::encoding::Encoder<'_, D>,
2032            offset: usize,
2033            _depth: fidl::encoding::Depth,
2034        ) -> fidl::Result<()> {
2035            encoder.debug_check_bounds::<MacAddressingRemoveMulticastAddressResponse>(offset);
2036            unsafe {
2037                // Copy the object into the buffer.
2038                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2039                (buf_ptr as *mut MacAddressingRemoveMulticastAddressResponse).write_unaligned(
2040                    (self as *const MacAddressingRemoveMulticastAddressResponse).read(),
2041                );
2042                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2043                // done second because the memcpy will write garbage to these bytes.
2044            }
2045            Ok(())
2046        }
2047    }
2048    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i32, D>>
2049        fidl::encoding::Encode<MacAddressingRemoveMulticastAddressResponse, D> for (T0,)
2050    {
2051        #[inline]
2052        unsafe fn encode(
2053            self,
2054            encoder: &mut fidl::encoding::Encoder<'_, D>,
2055            offset: usize,
2056            depth: fidl::encoding::Depth,
2057        ) -> fidl::Result<()> {
2058            encoder.debug_check_bounds::<MacAddressingRemoveMulticastAddressResponse>(offset);
2059            // Zero out padding regions. There's no need to apply masks
2060            // because the unmasked parts will be overwritten by fields.
2061            // Write the fields.
2062            self.0.encode(encoder, offset + 0, depth)?;
2063            Ok(())
2064        }
2065    }
2066
2067    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2068        for MacAddressingRemoveMulticastAddressResponse
2069    {
2070        #[inline(always)]
2071        fn new_empty() -> Self {
2072            Self { status: fidl::new_empty!(i32, D) }
2073        }
2074
2075        #[inline]
2076        unsafe fn decode(
2077            &mut self,
2078            decoder: &mut fidl::encoding::Decoder<'_, D>,
2079            offset: usize,
2080            _depth: fidl::encoding::Depth,
2081        ) -> fidl::Result<()> {
2082            decoder.debug_check_bounds::<Self>(offset);
2083            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
2084            // Verify that padding bytes are zero.
2085            // Copy from the buffer into the object.
2086            unsafe {
2087                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 4);
2088            }
2089            Ok(())
2090        }
2091    }
2092
2093    impl fidl::encoding::ValueTypeMarker for MacAddressingSetModeRequest {
2094        type Borrowed<'a> = &'a Self;
2095        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2096            value
2097        }
2098    }
2099
2100    unsafe impl fidl::encoding::TypeMarker for MacAddressingSetModeRequest {
2101        type Owned = Self;
2102
2103        #[inline(always)]
2104        fn inline_align(_context: fidl::encoding::Context) -> usize {
2105            4
2106        }
2107
2108        #[inline(always)]
2109        fn inline_size(_context: fidl::encoding::Context) -> usize {
2110            4
2111        }
2112    }
2113
2114    unsafe impl<D: fidl::encoding::ResourceDialect>
2115        fidl::encoding::Encode<MacAddressingSetModeRequest, D> for &MacAddressingSetModeRequest
2116    {
2117        #[inline]
2118        unsafe fn encode(
2119            self,
2120            encoder: &mut fidl::encoding::Encoder<'_, D>,
2121            offset: usize,
2122            _depth: fidl::encoding::Depth,
2123        ) -> fidl::Result<()> {
2124            encoder.debug_check_bounds::<MacAddressingSetModeRequest>(offset);
2125            // Delegate to tuple encoding.
2126            fidl::encoding::Encode::<MacAddressingSetModeRequest, D>::encode(
2127                (<MacFilterMode as fidl::encoding::ValueTypeMarker>::borrow(&self.mode),),
2128                encoder,
2129                offset,
2130                _depth,
2131            )
2132        }
2133    }
2134    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<MacFilterMode, D>>
2135        fidl::encoding::Encode<MacAddressingSetModeRequest, D> for (T0,)
2136    {
2137        #[inline]
2138        unsafe fn encode(
2139            self,
2140            encoder: &mut fidl::encoding::Encoder<'_, D>,
2141            offset: usize,
2142            depth: fidl::encoding::Depth,
2143        ) -> fidl::Result<()> {
2144            encoder.debug_check_bounds::<MacAddressingSetModeRequest>(offset);
2145            // Zero out padding regions. There's no need to apply masks
2146            // because the unmasked parts will be overwritten by fields.
2147            // Write the fields.
2148            self.0.encode(encoder, offset + 0, depth)?;
2149            Ok(())
2150        }
2151    }
2152
2153    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2154        for MacAddressingSetModeRequest
2155    {
2156        #[inline(always)]
2157        fn new_empty() -> Self {
2158            Self { mode: fidl::new_empty!(MacFilterMode, D) }
2159        }
2160
2161        #[inline]
2162        unsafe fn decode(
2163            &mut self,
2164            decoder: &mut fidl::encoding::Decoder<'_, D>,
2165            offset: usize,
2166            _depth: fidl::encoding::Depth,
2167        ) -> fidl::Result<()> {
2168            decoder.debug_check_bounds::<Self>(offset);
2169            // Verify that padding bytes are zero.
2170            fidl::decode!(MacFilterMode, D, &mut self.mode, decoder, offset + 0, _depth)?;
2171            Ok(())
2172        }
2173    }
2174
2175    impl fidl::encoding::ValueTypeMarker for MacAddressingSetModeResponse {
2176        type Borrowed<'a> = &'a Self;
2177        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2178            value
2179        }
2180    }
2181
2182    unsafe impl fidl::encoding::TypeMarker for MacAddressingSetModeResponse {
2183        type Owned = Self;
2184
2185        #[inline(always)]
2186        fn inline_align(_context: fidl::encoding::Context) -> usize {
2187            4
2188        }
2189
2190        #[inline(always)]
2191        fn inline_size(_context: fidl::encoding::Context) -> usize {
2192            4
2193        }
2194        #[inline(always)]
2195        fn encode_is_copy() -> bool {
2196            true
2197        }
2198
2199        #[inline(always)]
2200        fn decode_is_copy() -> bool {
2201            true
2202        }
2203    }
2204
2205    unsafe impl<D: fidl::encoding::ResourceDialect>
2206        fidl::encoding::Encode<MacAddressingSetModeResponse, D> for &MacAddressingSetModeResponse
2207    {
2208        #[inline]
2209        unsafe fn encode(
2210            self,
2211            encoder: &mut fidl::encoding::Encoder<'_, D>,
2212            offset: usize,
2213            _depth: fidl::encoding::Depth,
2214        ) -> fidl::Result<()> {
2215            encoder.debug_check_bounds::<MacAddressingSetModeResponse>(offset);
2216            unsafe {
2217                // Copy the object into the buffer.
2218                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2219                (buf_ptr as *mut MacAddressingSetModeResponse)
2220                    .write_unaligned((self as *const MacAddressingSetModeResponse).read());
2221                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2222                // done second because the memcpy will write garbage to these bytes.
2223            }
2224            Ok(())
2225        }
2226    }
2227    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i32, D>>
2228        fidl::encoding::Encode<MacAddressingSetModeResponse, D> for (T0,)
2229    {
2230        #[inline]
2231        unsafe fn encode(
2232            self,
2233            encoder: &mut fidl::encoding::Encoder<'_, D>,
2234            offset: usize,
2235            depth: fidl::encoding::Depth,
2236        ) -> fidl::Result<()> {
2237            encoder.debug_check_bounds::<MacAddressingSetModeResponse>(offset);
2238            // Zero out padding regions. There's no need to apply masks
2239            // because the unmasked parts will be overwritten by fields.
2240            // Write the fields.
2241            self.0.encode(encoder, offset + 0, depth)?;
2242            Ok(())
2243        }
2244    }
2245
2246    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2247        for MacAddressingSetModeResponse
2248    {
2249        #[inline(always)]
2250        fn new_empty() -> Self {
2251            Self { status: fidl::new_empty!(i32, D) }
2252        }
2253
2254        #[inline]
2255        unsafe fn decode(
2256            &mut self,
2257            decoder: &mut fidl::encoding::Decoder<'_, D>,
2258            offset: usize,
2259            _depth: fidl::encoding::Depth,
2260        ) -> fidl::Result<()> {
2261            decoder.debug_check_bounds::<Self>(offset);
2262            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
2263            // Verify that padding bytes are zero.
2264            // Copy from the buffer into the object.
2265            unsafe {
2266                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 4);
2267            }
2268            Ok(())
2269        }
2270    }
2271
2272    impl fidl::encoding::ValueTypeMarker for PortGetInfoResponse {
2273        type Borrowed<'a> = &'a Self;
2274        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2275            value
2276        }
2277    }
2278
2279    unsafe impl fidl::encoding::TypeMarker for PortGetInfoResponse {
2280        type Owned = Self;
2281
2282        #[inline(always)]
2283        fn inline_align(_context: fidl::encoding::Context) -> usize {
2284            8
2285        }
2286
2287        #[inline(always)]
2288        fn inline_size(_context: fidl::encoding::Context) -> usize {
2289            16
2290        }
2291    }
2292
2293    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortGetInfoResponse, D>
2294        for &PortGetInfoResponse
2295    {
2296        #[inline]
2297        unsafe fn encode(
2298            self,
2299            encoder: &mut fidl::encoding::Encoder<'_, D>,
2300            offset: usize,
2301            _depth: fidl::encoding::Depth,
2302        ) -> fidl::Result<()> {
2303            encoder.debug_check_bounds::<PortGetInfoResponse>(offset);
2304            // Delegate to tuple encoding.
2305            fidl::encoding::Encode::<PortGetInfoResponse, D>::encode(
2306                (<PortInfo as fidl::encoding::ValueTypeMarker>::borrow(&self.info),),
2307                encoder,
2308                offset,
2309                _depth,
2310            )
2311        }
2312    }
2313    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<PortInfo, D>>
2314        fidl::encoding::Encode<PortGetInfoResponse, D> for (T0,)
2315    {
2316        #[inline]
2317        unsafe fn encode(
2318            self,
2319            encoder: &mut fidl::encoding::Encoder<'_, D>,
2320            offset: usize,
2321            depth: fidl::encoding::Depth,
2322        ) -> fidl::Result<()> {
2323            encoder.debug_check_bounds::<PortGetInfoResponse>(offset);
2324            // Zero out padding regions. There's no need to apply masks
2325            // because the unmasked parts will be overwritten by fields.
2326            // Write the fields.
2327            self.0.encode(encoder, offset + 0, depth)?;
2328            Ok(())
2329        }
2330    }
2331
2332    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortGetInfoResponse {
2333        #[inline(always)]
2334        fn new_empty() -> Self {
2335            Self { info: fidl::new_empty!(PortInfo, D) }
2336        }
2337
2338        #[inline]
2339        unsafe fn decode(
2340            &mut self,
2341            decoder: &mut fidl::encoding::Decoder<'_, D>,
2342            offset: usize,
2343            _depth: fidl::encoding::Depth,
2344        ) -> fidl::Result<()> {
2345            decoder.debug_check_bounds::<Self>(offset);
2346            // Verify that padding bytes are zero.
2347            fidl::decode!(PortInfo, D, &mut self.info, decoder, offset + 0, _depth)?;
2348            Ok(())
2349        }
2350    }
2351
2352    impl fidl::encoding::ValueTypeMarker for PortGetStatusResponse {
2353        type Borrowed<'a> = &'a Self;
2354        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2355            value
2356        }
2357    }
2358
2359    unsafe impl fidl::encoding::TypeMarker for PortGetStatusResponse {
2360        type Owned = Self;
2361
2362        #[inline(always)]
2363        fn inline_align(_context: fidl::encoding::Context) -> usize {
2364            8
2365        }
2366
2367        #[inline(always)]
2368        fn inline_size(_context: fidl::encoding::Context) -> usize {
2369            16
2370        }
2371    }
2372
2373    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortGetStatusResponse, D>
2374        for &PortGetStatusResponse
2375    {
2376        #[inline]
2377        unsafe fn encode(
2378            self,
2379            encoder: &mut fidl::encoding::Encoder<'_, D>,
2380            offset: usize,
2381            _depth: fidl::encoding::Depth,
2382        ) -> fidl::Result<()> {
2383            encoder.debug_check_bounds::<PortGetStatusResponse>(offset);
2384            // Delegate to tuple encoding.
2385            fidl::encoding::Encode::<PortGetStatusResponse, D>::encode(
2386                (<PortStatus as fidl::encoding::ValueTypeMarker>::borrow(&self.status),),
2387                encoder,
2388                offset,
2389                _depth,
2390            )
2391        }
2392    }
2393    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<PortStatus, D>>
2394        fidl::encoding::Encode<PortGetStatusResponse, D> for (T0,)
2395    {
2396        #[inline]
2397        unsafe fn encode(
2398            self,
2399            encoder: &mut fidl::encoding::Encoder<'_, D>,
2400            offset: usize,
2401            depth: fidl::encoding::Depth,
2402        ) -> fidl::Result<()> {
2403            encoder.debug_check_bounds::<PortGetStatusResponse>(offset);
2404            // Zero out padding regions. There's no need to apply masks
2405            // because the unmasked parts will be overwritten by fields.
2406            // Write the fields.
2407            self.0.encode(encoder, offset + 0, depth)?;
2408            Ok(())
2409        }
2410    }
2411
2412    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortGetStatusResponse {
2413        #[inline(always)]
2414        fn new_empty() -> Self {
2415            Self { status: fidl::new_empty!(PortStatus, D) }
2416        }
2417
2418        #[inline]
2419        unsafe fn decode(
2420            &mut self,
2421            decoder: &mut fidl::encoding::Decoder<'_, D>,
2422            offset: usize,
2423            _depth: fidl::encoding::Depth,
2424        ) -> fidl::Result<()> {
2425            decoder.debug_check_bounds::<Self>(offset);
2426            // Verify that padding bytes are zero.
2427            fidl::decode!(PortStatus, D, &mut self.status, decoder, offset + 0, _depth)?;
2428            Ok(())
2429        }
2430    }
2431
2432    impl fidl::encoding::ValueTypeMarker for PortId {
2433        type Borrowed<'a> = &'a Self;
2434        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2435            value
2436        }
2437    }
2438
2439    unsafe impl fidl::encoding::TypeMarker for PortId {
2440        type Owned = Self;
2441
2442        #[inline(always)]
2443        fn inline_align(_context: fidl::encoding::Context) -> usize {
2444            1
2445        }
2446
2447        #[inline(always)]
2448        fn inline_size(_context: fidl::encoding::Context) -> usize {
2449            2
2450        }
2451        #[inline(always)]
2452        fn encode_is_copy() -> bool {
2453            true
2454        }
2455
2456        #[inline(always)]
2457        fn decode_is_copy() -> bool {
2458            true
2459        }
2460    }
2461
2462    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortId, D> for &PortId {
2463        #[inline]
2464        unsafe fn encode(
2465            self,
2466            encoder: &mut fidl::encoding::Encoder<'_, D>,
2467            offset: usize,
2468            _depth: fidl::encoding::Depth,
2469        ) -> fidl::Result<()> {
2470            encoder.debug_check_bounds::<PortId>(offset);
2471            unsafe {
2472                // Copy the object into the buffer.
2473                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2474                (buf_ptr as *mut PortId).write_unaligned((self as *const PortId).read());
2475                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2476                // done second because the memcpy will write garbage to these bytes.
2477            }
2478            Ok(())
2479        }
2480    }
2481    unsafe impl<
2482        D: fidl::encoding::ResourceDialect,
2483        T0: fidl::encoding::Encode<u8, D>,
2484        T1: fidl::encoding::Encode<u8, D>,
2485    > fidl::encoding::Encode<PortId, D> for (T0, T1)
2486    {
2487        #[inline]
2488        unsafe fn encode(
2489            self,
2490            encoder: &mut fidl::encoding::Encoder<'_, D>,
2491            offset: usize,
2492            depth: fidl::encoding::Depth,
2493        ) -> fidl::Result<()> {
2494            encoder.debug_check_bounds::<PortId>(offset);
2495            // Zero out padding regions. There's no need to apply masks
2496            // because the unmasked parts will be overwritten by fields.
2497            // Write the fields.
2498            self.0.encode(encoder, offset + 0, depth)?;
2499            self.1.encode(encoder, offset + 1, depth)?;
2500            Ok(())
2501        }
2502    }
2503
2504    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortId {
2505        #[inline(always)]
2506        fn new_empty() -> Self {
2507            Self { base: fidl::new_empty!(u8, D), salt: fidl::new_empty!(u8, D) }
2508        }
2509
2510        #[inline]
2511        unsafe fn decode(
2512            &mut self,
2513            decoder: &mut fidl::encoding::Decoder<'_, D>,
2514            offset: usize,
2515            _depth: fidl::encoding::Depth,
2516        ) -> fidl::Result<()> {
2517            decoder.debug_check_bounds::<Self>(offset);
2518            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
2519            // Verify that padding bytes are zero.
2520            // Copy from the buffer into the object.
2521            unsafe {
2522                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 2);
2523            }
2524            Ok(())
2525        }
2526    }
2527
2528    impl fidl::encoding::ValueTypeMarker for PortWatcherWatchResponse {
2529        type Borrowed<'a> = &'a Self;
2530        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2531            value
2532        }
2533    }
2534
2535    unsafe impl fidl::encoding::TypeMarker for PortWatcherWatchResponse {
2536        type Owned = Self;
2537
2538        #[inline(always)]
2539        fn inline_align(_context: fidl::encoding::Context) -> usize {
2540            8
2541        }
2542
2543        #[inline(always)]
2544        fn inline_size(_context: fidl::encoding::Context) -> usize {
2545            16
2546        }
2547    }
2548
2549    unsafe impl<D: fidl::encoding::ResourceDialect>
2550        fidl::encoding::Encode<PortWatcherWatchResponse, D> for &PortWatcherWatchResponse
2551    {
2552        #[inline]
2553        unsafe fn encode(
2554            self,
2555            encoder: &mut fidl::encoding::Encoder<'_, D>,
2556            offset: usize,
2557            _depth: fidl::encoding::Depth,
2558        ) -> fidl::Result<()> {
2559            encoder.debug_check_bounds::<PortWatcherWatchResponse>(offset);
2560            // Delegate to tuple encoding.
2561            fidl::encoding::Encode::<PortWatcherWatchResponse, D>::encode(
2562                (<DevicePortEvent as fidl::encoding::ValueTypeMarker>::borrow(&self.event),),
2563                encoder,
2564                offset,
2565                _depth,
2566            )
2567        }
2568    }
2569    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<DevicePortEvent, D>>
2570        fidl::encoding::Encode<PortWatcherWatchResponse, D> for (T0,)
2571    {
2572        #[inline]
2573        unsafe fn encode(
2574            self,
2575            encoder: &mut fidl::encoding::Encoder<'_, D>,
2576            offset: usize,
2577            depth: fidl::encoding::Depth,
2578        ) -> fidl::Result<()> {
2579            encoder.debug_check_bounds::<PortWatcherWatchResponse>(offset);
2580            // Zero out padding regions. There's no need to apply masks
2581            // because the unmasked parts will be overwritten by fields.
2582            // Write the fields.
2583            self.0.encode(encoder, offset + 0, depth)?;
2584            Ok(())
2585        }
2586    }
2587
2588    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2589        for PortWatcherWatchResponse
2590    {
2591        #[inline(always)]
2592        fn new_empty() -> Self {
2593            Self { event: fidl::new_empty!(DevicePortEvent, D) }
2594        }
2595
2596        #[inline]
2597        unsafe fn decode(
2598            &mut self,
2599            decoder: &mut fidl::encoding::Decoder<'_, D>,
2600            offset: usize,
2601            _depth: fidl::encoding::Depth,
2602        ) -> fidl::Result<()> {
2603            decoder.debug_check_bounds::<Self>(offset);
2604            // Verify that padding bytes are zero.
2605            fidl::decode!(DevicePortEvent, D, &mut self.event, decoder, offset + 0, _depth)?;
2606            Ok(())
2607        }
2608    }
2609
2610    impl fidl::encoding::ValueTypeMarker for SessionAttachRequest {
2611        type Borrowed<'a> = &'a Self;
2612        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2613            value
2614        }
2615    }
2616
2617    unsafe impl fidl::encoding::TypeMarker for SessionAttachRequest {
2618        type Owned = Self;
2619
2620        #[inline(always)]
2621        fn inline_align(_context: fidl::encoding::Context) -> usize {
2622            8
2623        }
2624
2625        #[inline(always)]
2626        fn inline_size(_context: fidl::encoding::Context) -> usize {
2627            24
2628        }
2629    }
2630
2631    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SessionAttachRequest, D>
2632        for &SessionAttachRequest
2633    {
2634        #[inline]
2635        unsafe fn encode(
2636            self,
2637            encoder: &mut fidl::encoding::Encoder<'_, D>,
2638            offset: usize,
2639            _depth: fidl::encoding::Depth,
2640        ) -> fidl::Result<()> {
2641            encoder.debug_check_bounds::<SessionAttachRequest>(offset);
2642            // Delegate to tuple encoding.
2643            fidl::encoding::Encode::<SessionAttachRequest, D>::encode(
2644                (
2645                    <PortId as fidl::encoding::ValueTypeMarker>::borrow(&self.port),
2646                    <fidl::encoding::Vector<FrameType, 4> as fidl::encoding::ValueTypeMarker>::borrow(&self.rx_frames),
2647                ),
2648                encoder, offset, _depth
2649            )
2650        }
2651    }
2652    unsafe impl<
2653        D: fidl::encoding::ResourceDialect,
2654        T0: fidl::encoding::Encode<PortId, D>,
2655        T1: fidl::encoding::Encode<fidl::encoding::Vector<FrameType, 4>, D>,
2656    > fidl::encoding::Encode<SessionAttachRequest, D> for (T0, T1)
2657    {
2658        #[inline]
2659        unsafe fn encode(
2660            self,
2661            encoder: &mut fidl::encoding::Encoder<'_, D>,
2662            offset: usize,
2663            depth: fidl::encoding::Depth,
2664        ) -> fidl::Result<()> {
2665            encoder.debug_check_bounds::<SessionAttachRequest>(offset);
2666            // Zero out padding regions. There's no need to apply masks
2667            // because the unmasked parts will be overwritten by fields.
2668            unsafe {
2669                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
2670                (ptr as *mut u64).write_unaligned(0);
2671            }
2672            // Write the fields.
2673            self.0.encode(encoder, offset + 0, depth)?;
2674            self.1.encode(encoder, offset + 8, depth)?;
2675            Ok(())
2676        }
2677    }
2678
2679    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SessionAttachRequest {
2680        #[inline(always)]
2681        fn new_empty() -> Self {
2682            Self {
2683                port: fidl::new_empty!(PortId, D),
2684                rx_frames: fidl::new_empty!(fidl::encoding::Vector<FrameType, 4>, D),
2685            }
2686        }
2687
2688        #[inline]
2689        unsafe fn decode(
2690            &mut self,
2691            decoder: &mut fidl::encoding::Decoder<'_, D>,
2692            offset: usize,
2693            _depth: fidl::encoding::Depth,
2694        ) -> fidl::Result<()> {
2695            decoder.debug_check_bounds::<Self>(offset);
2696            // Verify that padding bytes are zero.
2697            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
2698            let padval = unsafe { (ptr as *const u64).read_unaligned() };
2699            let mask = 0xffffffffffff0000u64;
2700            let maskedval = padval & mask;
2701            if maskedval != 0 {
2702                return Err(fidl::Error::NonZeroPadding {
2703                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
2704                });
2705            }
2706            fidl::decode!(PortId, D, &mut self.port, decoder, offset + 0, _depth)?;
2707            fidl::decode!(fidl::encoding::Vector<FrameType, 4>, D, &mut self.rx_frames, decoder, offset + 8, _depth)?;
2708            Ok(())
2709        }
2710    }
2711
2712    impl fidl::encoding::ValueTypeMarker for SessionDetachRequest {
2713        type Borrowed<'a> = &'a Self;
2714        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2715            value
2716        }
2717    }
2718
2719    unsafe impl fidl::encoding::TypeMarker for SessionDetachRequest {
2720        type Owned = Self;
2721
2722        #[inline(always)]
2723        fn inline_align(_context: fidl::encoding::Context) -> usize {
2724            1
2725        }
2726
2727        #[inline(always)]
2728        fn inline_size(_context: fidl::encoding::Context) -> usize {
2729            2
2730        }
2731        #[inline(always)]
2732        fn encode_is_copy() -> bool {
2733            true
2734        }
2735
2736        #[inline(always)]
2737        fn decode_is_copy() -> bool {
2738            true
2739        }
2740    }
2741
2742    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SessionDetachRequest, D>
2743        for &SessionDetachRequest
2744    {
2745        #[inline]
2746        unsafe fn encode(
2747            self,
2748            encoder: &mut fidl::encoding::Encoder<'_, D>,
2749            offset: usize,
2750            _depth: fidl::encoding::Depth,
2751        ) -> fidl::Result<()> {
2752            encoder.debug_check_bounds::<SessionDetachRequest>(offset);
2753            unsafe {
2754                // Copy the object into the buffer.
2755                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2756                (buf_ptr as *mut SessionDetachRequest)
2757                    .write_unaligned((self as *const SessionDetachRequest).read());
2758                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2759                // done second because the memcpy will write garbage to these bytes.
2760            }
2761            Ok(())
2762        }
2763    }
2764    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<PortId, D>>
2765        fidl::encoding::Encode<SessionDetachRequest, D> for (T0,)
2766    {
2767        #[inline]
2768        unsafe fn encode(
2769            self,
2770            encoder: &mut fidl::encoding::Encoder<'_, D>,
2771            offset: usize,
2772            depth: fidl::encoding::Depth,
2773        ) -> fidl::Result<()> {
2774            encoder.debug_check_bounds::<SessionDetachRequest>(offset);
2775            // Zero out padding regions. There's no need to apply masks
2776            // because the unmasked parts will be overwritten by fields.
2777            // Write the fields.
2778            self.0.encode(encoder, offset + 0, depth)?;
2779            Ok(())
2780        }
2781    }
2782
2783    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SessionDetachRequest {
2784        #[inline(always)]
2785        fn new_empty() -> Self {
2786            Self { port: fidl::new_empty!(PortId, D) }
2787        }
2788
2789        #[inline]
2790        unsafe fn decode(
2791            &mut self,
2792            decoder: &mut fidl::encoding::Decoder<'_, D>,
2793            offset: usize,
2794            _depth: fidl::encoding::Depth,
2795        ) -> fidl::Result<()> {
2796            decoder.debug_check_bounds::<Self>(offset);
2797            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
2798            // Verify that padding bytes are zero.
2799            // Copy from the buffer into the object.
2800            unsafe {
2801                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 2);
2802            }
2803            Ok(())
2804        }
2805    }
2806
2807    impl fidl::encoding::ValueTypeMarker for SessionRegisterForTxResponse {
2808        type Borrowed<'a> = &'a Self;
2809        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2810            value
2811        }
2812    }
2813
2814    unsafe impl fidl::encoding::TypeMarker for SessionRegisterForTxResponse {
2815        type Owned = Self;
2816
2817        #[inline(always)]
2818        fn inline_align(_context: fidl::encoding::Context) -> usize {
2819            4
2820        }
2821
2822        #[inline(always)]
2823        fn inline_size(_context: fidl::encoding::Context) -> usize {
2824            8
2825        }
2826    }
2827
2828    unsafe impl<D: fidl::encoding::ResourceDialect>
2829        fidl::encoding::Encode<SessionRegisterForTxResponse, D> for &SessionRegisterForTxResponse
2830    {
2831        #[inline]
2832        unsafe fn encode(
2833            self,
2834            encoder: &mut fidl::encoding::Encoder<'_, D>,
2835            offset: usize,
2836            _depth: fidl::encoding::Depth,
2837        ) -> fidl::Result<()> {
2838            encoder.debug_check_bounds::<SessionRegisterForTxResponse>(offset);
2839            unsafe {
2840                // Copy the object into the buffer.
2841                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2842                (buf_ptr as *mut SessionRegisterForTxResponse)
2843                    .write_unaligned((self as *const SessionRegisterForTxResponse).read());
2844                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2845                // done second because the memcpy will write garbage to these bytes.
2846                let padding_ptr = buf_ptr.offset(0) as *mut u32;
2847                let padding_mask = 0xffffff00u32;
2848                padding_ptr.write_unaligned(padding_ptr.read_unaligned() & !padding_mask);
2849            }
2850            Ok(())
2851        }
2852    }
2853    unsafe impl<
2854        D: fidl::encoding::ResourceDialect,
2855        T0: fidl::encoding::Encode<u8, D>,
2856        T1: fidl::encoding::Encode<i32, D>,
2857    > fidl::encoding::Encode<SessionRegisterForTxResponse, D> for (T0, T1)
2858    {
2859        #[inline]
2860        unsafe fn encode(
2861            self,
2862            encoder: &mut fidl::encoding::Encoder<'_, D>,
2863            offset: usize,
2864            depth: fidl::encoding::Depth,
2865        ) -> fidl::Result<()> {
2866            encoder.debug_check_bounds::<SessionRegisterForTxResponse>(offset);
2867            // Zero out padding regions. There's no need to apply masks
2868            // because the unmasked parts will be overwritten by fields.
2869            unsafe {
2870                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
2871                (ptr as *mut u32).write_unaligned(0);
2872            }
2873            // Write the fields.
2874            self.0.encode(encoder, offset + 0, depth)?;
2875            self.1.encode(encoder, offset + 4, depth)?;
2876            Ok(())
2877        }
2878    }
2879
2880    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2881        for SessionRegisterForTxResponse
2882    {
2883        #[inline(always)]
2884        fn new_empty() -> Self {
2885            Self { successful: fidl::new_empty!(u8, D), status: fidl::new_empty!(i32, D) }
2886        }
2887
2888        #[inline]
2889        unsafe fn decode(
2890            &mut self,
2891            decoder: &mut fidl::encoding::Decoder<'_, D>,
2892            offset: usize,
2893            _depth: fidl::encoding::Depth,
2894        ) -> fidl::Result<()> {
2895            decoder.debug_check_bounds::<Self>(offset);
2896            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
2897            // Verify that padding bytes are zero.
2898            let ptr = unsafe { buf_ptr.offset(0) };
2899            let padval = unsafe { (ptr as *const u32).read_unaligned() };
2900            let mask = 0xffffff00u32;
2901            let maskedval = padval & mask;
2902            if maskedval != 0 {
2903                return Err(fidl::Error::NonZeroPadding {
2904                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
2905                });
2906            }
2907            // Copy from the buffer into the object.
2908            unsafe {
2909                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
2910            }
2911            Ok(())
2912        }
2913    }
2914
2915    impl fidl::encoding::ValueTypeMarker for SessionUnregisterForTxResponse {
2916        type Borrowed<'a> = &'a Self;
2917        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2918            value
2919        }
2920    }
2921
2922    unsafe impl fidl::encoding::TypeMarker for SessionUnregisterForTxResponse {
2923        type Owned = Self;
2924
2925        #[inline(always)]
2926        fn inline_align(_context: fidl::encoding::Context) -> usize {
2927            4
2928        }
2929
2930        #[inline(always)]
2931        fn inline_size(_context: fidl::encoding::Context) -> usize {
2932            8
2933        }
2934    }
2935
2936    unsafe impl<D: fidl::encoding::ResourceDialect>
2937        fidl::encoding::Encode<SessionUnregisterForTxResponse, D>
2938        for &SessionUnregisterForTxResponse
2939    {
2940        #[inline]
2941        unsafe fn encode(
2942            self,
2943            encoder: &mut fidl::encoding::Encoder<'_, D>,
2944            offset: usize,
2945            _depth: fidl::encoding::Depth,
2946        ) -> fidl::Result<()> {
2947            encoder.debug_check_bounds::<SessionUnregisterForTxResponse>(offset);
2948            unsafe {
2949                // Copy the object into the buffer.
2950                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
2951                (buf_ptr as *mut SessionUnregisterForTxResponse)
2952                    .write_unaligned((self as *const SessionUnregisterForTxResponse).read());
2953                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
2954                // done second because the memcpy will write garbage to these bytes.
2955                let padding_ptr = buf_ptr.offset(0) as *mut u32;
2956                let padding_mask = 0xffffff00u32;
2957                padding_ptr.write_unaligned(padding_ptr.read_unaligned() & !padding_mask);
2958            }
2959            Ok(())
2960        }
2961    }
2962    unsafe impl<
2963        D: fidl::encoding::ResourceDialect,
2964        T0: fidl::encoding::Encode<u8, D>,
2965        T1: fidl::encoding::Encode<i32, D>,
2966    > fidl::encoding::Encode<SessionUnregisterForTxResponse, D> for (T0, T1)
2967    {
2968        #[inline]
2969        unsafe fn encode(
2970            self,
2971            encoder: &mut fidl::encoding::Encoder<'_, D>,
2972            offset: usize,
2973            depth: fidl::encoding::Depth,
2974        ) -> fidl::Result<()> {
2975            encoder.debug_check_bounds::<SessionUnregisterForTxResponse>(offset);
2976            // Zero out padding regions. There's no need to apply masks
2977            // because the unmasked parts will be overwritten by fields.
2978            unsafe {
2979                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
2980                (ptr as *mut u32).write_unaligned(0);
2981            }
2982            // Write the fields.
2983            self.0.encode(encoder, offset + 0, depth)?;
2984            self.1.encode(encoder, offset + 4, depth)?;
2985            Ok(())
2986        }
2987    }
2988
2989    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
2990        for SessionUnregisterForTxResponse
2991    {
2992        #[inline(always)]
2993        fn new_empty() -> Self {
2994            Self { successful: fidl::new_empty!(u8, D), status: fidl::new_empty!(i32, D) }
2995        }
2996
2997        #[inline]
2998        unsafe fn decode(
2999            &mut self,
3000            decoder: &mut fidl::encoding::Decoder<'_, D>,
3001            offset: usize,
3002            _depth: fidl::encoding::Depth,
3003        ) -> fidl::Result<()> {
3004            decoder.debug_check_bounds::<Self>(offset);
3005            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
3006            // Verify that padding bytes are zero.
3007            let ptr = unsafe { buf_ptr.offset(0) };
3008            let padval = unsafe { (ptr as *const u32).read_unaligned() };
3009            let mask = 0xffffff00u32;
3010            let maskedval = padval & mask;
3011            if maskedval != 0 {
3012                return Err(fidl::Error::NonZeroPadding {
3013                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
3014                });
3015            }
3016            // Copy from the buffer into the object.
3017            unsafe {
3018                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
3019            }
3020            Ok(())
3021        }
3022    }
3023
3024    impl fidl::encoding::ValueTypeMarker for StatusWatcherWatchStatusResponse {
3025        type Borrowed<'a> = &'a Self;
3026        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3027            value
3028        }
3029    }
3030
3031    unsafe impl fidl::encoding::TypeMarker for StatusWatcherWatchStatusResponse {
3032        type Owned = Self;
3033
3034        #[inline(always)]
3035        fn inline_align(_context: fidl::encoding::Context) -> usize {
3036            8
3037        }
3038
3039        #[inline(always)]
3040        fn inline_size(_context: fidl::encoding::Context) -> usize {
3041            16
3042        }
3043    }
3044
3045    unsafe impl<D: fidl::encoding::ResourceDialect>
3046        fidl::encoding::Encode<StatusWatcherWatchStatusResponse, D>
3047        for &StatusWatcherWatchStatusResponse
3048    {
3049        #[inline]
3050        unsafe fn encode(
3051            self,
3052            encoder: &mut fidl::encoding::Encoder<'_, D>,
3053            offset: usize,
3054            _depth: fidl::encoding::Depth,
3055        ) -> fidl::Result<()> {
3056            encoder.debug_check_bounds::<StatusWatcherWatchStatusResponse>(offset);
3057            // Delegate to tuple encoding.
3058            fidl::encoding::Encode::<StatusWatcherWatchStatusResponse, D>::encode(
3059                (<PortStatus as fidl::encoding::ValueTypeMarker>::borrow(&self.port_status),),
3060                encoder,
3061                offset,
3062                _depth,
3063            )
3064        }
3065    }
3066    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<PortStatus, D>>
3067        fidl::encoding::Encode<StatusWatcherWatchStatusResponse, D> for (T0,)
3068    {
3069        #[inline]
3070        unsafe fn encode(
3071            self,
3072            encoder: &mut fidl::encoding::Encoder<'_, D>,
3073            offset: usize,
3074            depth: fidl::encoding::Depth,
3075        ) -> fidl::Result<()> {
3076            encoder.debug_check_bounds::<StatusWatcherWatchStatusResponse>(offset);
3077            // Zero out padding regions. There's no need to apply masks
3078            // because the unmasked parts will be overwritten by fields.
3079            // Write the fields.
3080            self.0.encode(encoder, offset + 0, depth)?;
3081            Ok(())
3082        }
3083    }
3084
3085    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
3086        for StatusWatcherWatchStatusResponse
3087    {
3088        #[inline(always)]
3089        fn new_empty() -> Self {
3090            Self { port_status: fidl::new_empty!(PortStatus, D) }
3091        }
3092
3093        #[inline]
3094        unsafe fn decode(
3095            &mut self,
3096            decoder: &mut fidl::encoding::Decoder<'_, D>,
3097            offset: usize,
3098            _depth: fidl::encoding::Depth,
3099        ) -> fidl::Result<()> {
3100            decoder.debug_check_bounds::<Self>(offset);
3101            // Verify that padding bytes are zero.
3102            fidl::decode!(PortStatus, D, &mut self.port_status, decoder, offset + 0, _depth)?;
3103            Ok(())
3104        }
3105    }
3106
3107    impl DeviceBaseInfo {
3108        #[inline(always)]
3109        fn max_ordinal_present(&self) -> u64 {
3110            if let Some(_) = self.min_rx_buffers {
3111                return 12;
3112            }
3113            if let Some(_) = self.max_buffer_parts {
3114                return 9;
3115            }
3116            if let Some(_) = self.min_tx_buffer_tail {
3117                return 8;
3118            }
3119            if let Some(_) = self.min_tx_buffer_head {
3120                return 7;
3121            }
3122            if let Some(_) = self.min_tx_buffer_length {
3123                return 6;
3124            }
3125            if let Some(_) = self.min_rx_buffer_length {
3126                return 5;
3127            }
3128            if let Some(_) = self.max_buffer_length {
3129                return 4;
3130            }
3131            if let Some(_) = self.buffer_alignment {
3132                return 3;
3133            }
3134            if let Some(_) = self.tx_depth {
3135                return 2;
3136            }
3137            if let Some(_) = self.rx_depth {
3138                return 1;
3139            }
3140            0
3141        }
3142    }
3143
3144    impl fidl::encoding::ValueTypeMarker for DeviceBaseInfo {
3145        type Borrowed<'a> = &'a Self;
3146        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3147            value
3148        }
3149    }
3150
3151    unsafe impl fidl::encoding::TypeMarker for DeviceBaseInfo {
3152        type Owned = Self;
3153
3154        #[inline(always)]
3155        fn inline_align(_context: fidl::encoding::Context) -> usize {
3156            8
3157        }
3158
3159        #[inline(always)]
3160        fn inline_size(_context: fidl::encoding::Context) -> usize {
3161            16
3162        }
3163    }
3164
3165    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DeviceBaseInfo, D>
3166        for &DeviceBaseInfo
3167    {
3168        unsafe fn encode(
3169            self,
3170            encoder: &mut fidl::encoding::Encoder<'_, D>,
3171            offset: usize,
3172            mut depth: fidl::encoding::Depth,
3173        ) -> fidl::Result<()> {
3174            encoder.debug_check_bounds::<DeviceBaseInfo>(offset);
3175            // Vector header
3176            let max_ordinal: u64 = self.max_ordinal_present();
3177            encoder.write_num(max_ordinal, offset);
3178            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3179            // Calling encoder.out_of_line_offset(0) is not allowed.
3180            if max_ordinal == 0 {
3181                return Ok(());
3182            }
3183            depth.increment()?;
3184            let envelope_size = 8;
3185            let bytes_len = max_ordinal as usize * envelope_size;
3186            #[allow(unused_variables)]
3187            let offset = encoder.out_of_line_offset(bytes_len);
3188            let mut _prev_end_offset: usize = 0;
3189            if 1 > max_ordinal {
3190                return Ok(());
3191            }
3192
3193            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3194            // are envelope_size bytes.
3195            let cur_offset: usize = (1 - 1) * envelope_size;
3196
3197            // Zero reserved fields.
3198            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3199
3200            // Safety:
3201            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3202            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3203            //   envelope_size bytes, there is always sufficient room.
3204            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3205                self.rx_depth.as_ref().map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3206                encoder,
3207                offset + cur_offset,
3208                depth,
3209            )?;
3210
3211            _prev_end_offset = cur_offset + envelope_size;
3212            if 2 > max_ordinal {
3213                return Ok(());
3214            }
3215
3216            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3217            // are envelope_size bytes.
3218            let cur_offset: usize = (2 - 1) * envelope_size;
3219
3220            // Zero reserved fields.
3221            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3222
3223            // Safety:
3224            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3225            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3226            //   envelope_size bytes, there is always sufficient room.
3227            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3228                self.tx_depth.as_ref().map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3229                encoder,
3230                offset + cur_offset,
3231                depth,
3232            )?;
3233
3234            _prev_end_offset = cur_offset + envelope_size;
3235            if 3 > max_ordinal {
3236                return Ok(());
3237            }
3238
3239            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3240            // are envelope_size bytes.
3241            let cur_offset: usize = (3 - 1) * envelope_size;
3242
3243            // Zero reserved fields.
3244            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3245
3246            // Safety:
3247            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3248            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3249            //   envelope_size bytes, there is always sufficient room.
3250            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3251                self.buffer_alignment
3252                    .as_ref()
3253                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3254                encoder,
3255                offset + cur_offset,
3256                depth,
3257            )?;
3258
3259            _prev_end_offset = cur_offset + envelope_size;
3260            if 4 > max_ordinal {
3261                return Ok(());
3262            }
3263
3264            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3265            // are envelope_size bytes.
3266            let cur_offset: usize = (4 - 1) * envelope_size;
3267
3268            // Zero reserved fields.
3269            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3270
3271            // Safety:
3272            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3273            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3274            //   envelope_size bytes, there is always sufficient room.
3275            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3276                self.max_buffer_length
3277                    .as_ref()
3278                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3279                encoder,
3280                offset + cur_offset,
3281                depth,
3282            )?;
3283
3284            _prev_end_offset = cur_offset + envelope_size;
3285            if 5 > max_ordinal {
3286                return Ok(());
3287            }
3288
3289            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3290            // are envelope_size bytes.
3291            let cur_offset: usize = (5 - 1) * envelope_size;
3292
3293            // Zero reserved fields.
3294            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3295
3296            // Safety:
3297            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3298            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3299            //   envelope_size bytes, there is always sufficient room.
3300            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3301                self.min_rx_buffer_length
3302                    .as_ref()
3303                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3304                encoder,
3305                offset + cur_offset,
3306                depth,
3307            )?;
3308
3309            _prev_end_offset = cur_offset + envelope_size;
3310            if 6 > max_ordinal {
3311                return Ok(());
3312            }
3313
3314            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3315            // are envelope_size bytes.
3316            let cur_offset: usize = (6 - 1) * envelope_size;
3317
3318            // Zero reserved fields.
3319            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3320
3321            // Safety:
3322            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3323            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3324            //   envelope_size bytes, there is always sufficient room.
3325            fidl::encoding::encode_in_envelope_optional::<u32, D>(
3326                self.min_tx_buffer_length
3327                    .as_ref()
3328                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
3329                encoder,
3330                offset + cur_offset,
3331                depth,
3332            )?;
3333
3334            _prev_end_offset = cur_offset + envelope_size;
3335            if 7 > max_ordinal {
3336                return Ok(());
3337            }
3338
3339            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3340            // are envelope_size bytes.
3341            let cur_offset: usize = (7 - 1) * envelope_size;
3342
3343            // Zero reserved fields.
3344            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3345
3346            // Safety:
3347            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3348            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3349            //   envelope_size bytes, there is always sufficient room.
3350            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3351                self.min_tx_buffer_head
3352                    .as_ref()
3353                    .map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3354                encoder,
3355                offset + cur_offset,
3356                depth,
3357            )?;
3358
3359            _prev_end_offset = cur_offset + envelope_size;
3360            if 8 > max_ordinal {
3361                return Ok(());
3362            }
3363
3364            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3365            // are envelope_size bytes.
3366            let cur_offset: usize = (8 - 1) * envelope_size;
3367
3368            // Zero reserved fields.
3369            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3370
3371            // Safety:
3372            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3373            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3374            //   envelope_size bytes, there is always sufficient room.
3375            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3376                self.min_tx_buffer_tail
3377                    .as_ref()
3378                    .map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3379                encoder,
3380                offset + cur_offset,
3381                depth,
3382            )?;
3383
3384            _prev_end_offset = cur_offset + envelope_size;
3385            if 9 > max_ordinal {
3386                return Ok(());
3387            }
3388
3389            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3390            // are envelope_size bytes.
3391            let cur_offset: usize = (9 - 1) * envelope_size;
3392
3393            // Zero reserved fields.
3394            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3395
3396            // Safety:
3397            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3398            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3399            //   envelope_size bytes, there is always sufficient room.
3400            fidl::encoding::encode_in_envelope_optional::<u8, D>(
3401                self.max_buffer_parts.as_ref().map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
3402                encoder,
3403                offset + cur_offset,
3404                depth,
3405            )?;
3406
3407            _prev_end_offset = cur_offset + envelope_size;
3408            if 12 > max_ordinal {
3409                return Ok(());
3410            }
3411
3412            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3413            // are envelope_size bytes.
3414            let cur_offset: usize = (12 - 1) * envelope_size;
3415
3416            // Zero reserved fields.
3417            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3418
3419            // Safety:
3420            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3421            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3422            //   envelope_size bytes, there is always sufficient room.
3423            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3424                self.min_rx_buffers.as_ref().map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3425                encoder,
3426                offset + cur_offset,
3427                depth,
3428            )?;
3429
3430            _prev_end_offset = cur_offset + envelope_size;
3431
3432            Ok(())
3433        }
3434    }
3435
3436    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DeviceBaseInfo {
3437        #[inline(always)]
3438        fn new_empty() -> Self {
3439            Self::default()
3440        }
3441
3442        unsafe fn decode(
3443            &mut self,
3444            decoder: &mut fidl::encoding::Decoder<'_, D>,
3445            offset: usize,
3446            mut depth: fidl::encoding::Depth,
3447        ) -> fidl::Result<()> {
3448            decoder.debug_check_bounds::<Self>(offset);
3449            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3450                None => return Err(fidl::Error::NotNullable),
3451                Some(len) => len,
3452            };
3453            // Calling decoder.out_of_line_offset(0) is not allowed.
3454            if len == 0 {
3455                return Ok(());
3456            };
3457            depth.increment()?;
3458            let envelope_size = 8;
3459            let bytes_len = len * envelope_size;
3460            let offset = decoder.out_of_line_offset(bytes_len)?;
3461            // Decode the envelope for each type.
3462            let mut _next_ordinal_to_read = 0;
3463            let mut next_offset = offset;
3464            let end_offset = offset + bytes_len;
3465            _next_ordinal_to_read += 1;
3466            if next_offset >= end_offset {
3467                return Ok(());
3468            }
3469
3470            // Decode unknown envelopes for gaps in ordinals.
3471            while _next_ordinal_to_read < 1 {
3472                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3473                _next_ordinal_to_read += 1;
3474                next_offset += envelope_size;
3475            }
3476
3477            let next_out_of_line = decoder.next_out_of_line();
3478            let handles_before = decoder.remaining_handles();
3479            if let Some((inlined, num_bytes, num_handles)) =
3480                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3481            {
3482                let member_inline_size =
3483                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3484                if inlined != (member_inline_size <= 4) {
3485                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3486                }
3487                let inner_offset;
3488                let mut inner_depth = depth.clone();
3489                if inlined {
3490                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3491                    inner_offset = next_offset;
3492                } else {
3493                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3494                    inner_depth.increment()?;
3495                }
3496                let val_ref = self.rx_depth.get_or_insert_with(|| fidl::new_empty!(u16, D));
3497                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3498                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3499                {
3500                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3501                }
3502                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3503                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3504                }
3505            }
3506
3507            next_offset += envelope_size;
3508            _next_ordinal_to_read += 1;
3509            if next_offset >= end_offset {
3510                return Ok(());
3511            }
3512
3513            // Decode unknown envelopes for gaps in ordinals.
3514            while _next_ordinal_to_read < 2 {
3515                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3516                _next_ordinal_to_read += 1;
3517                next_offset += envelope_size;
3518            }
3519
3520            let next_out_of_line = decoder.next_out_of_line();
3521            let handles_before = decoder.remaining_handles();
3522            if let Some((inlined, num_bytes, num_handles)) =
3523                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3524            {
3525                let member_inline_size =
3526                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3527                if inlined != (member_inline_size <= 4) {
3528                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3529                }
3530                let inner_offset;
3531                let mut inner_depth = depth.clone();
3532                if inlined {
3533                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3534                    inner_offset = next_offset;
3535                } else {
3536                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3537                    inner_depth.increment()?;
3538                }
3539                let val_ref = self.tx_depth.get_or_insert_with(|| fidl::new_empty!(u16, D));
3540                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3541                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3542                {
3543                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3544                }
3545                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3546                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3547                }
3548            }
3549
3550            next_offset += envelope_size;
3551            _next_ordinal_to_read += 1;
3552            if next_offset >= end_offset {
3553                return Ok(());
3554            }
3555
3556            // Decode unknown envelopes for gaps in ordinals.
3557            while _next_ordinal_to_read < 3 {
3558                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3559                _next_ordinal_to_read += 1;
3560                next_offset += envelope_size;
3561            }
3562
3563            let next_out_of_line = decoder.next_out_of_line();
3564            let handles_before = decoder.remaining_handles();
3565            if let Some((inlined, num_bytes, num_handles)) =
3566                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3567            {
3568                let member_inline_size =
3569                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3570                if inlined != (member_inline_size <= 4) {
3571                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3572                }
3573                let inner_offset;
3574                let mut inner_depth = depth.clone();
3575                if inlined {
3576                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3577                    inner_offset = next_offset;
3578                } else {
3579                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3580                    inner_depth.increment()?;
3581                }
3582                let val_ref = self.buffer_alignment.get_or_insert_with(|| fidl::new_empty!(u32, D));
3583                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3584                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3585                {
3586                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3587                }
3588                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3589                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3590                }
3591            }
3592
3593            next_offset += envelope_size;
3594            _next_ordinal_to_read += 1;
3595            if next_offset >= end_offset {
3596                return Ok(());
3597            }
3598
3599            // Decode unknown envelopes for gaps in ordinals.
3600            while _next_ordinal_to_read < 4 {
3601                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3602                _next_ordinal_to_read += 1;
3603                next_offset += envelope_size;
3604            }
3605
3606            let next_out_of_line = decoder.next_out_of_line();
3607            let handles_before = decoder.remaining_handles();
3608            if let Some((inlined, num_bytes, num_handles)) =
3609                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3610            {
3611                let member_inline_size =
3612                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3613                if inlined != (member_inline_size <= 4) {
3614                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3615                }
3616                let inner_offset;
3617                let mut inner_depth = depth.clone();
3618                if inlined {
3619                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3620                    inner_offset = next_offset;
3621                } else {
3622                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3623                    inner_depth.increment()?;
3624                }
3625                let val_ref =
3626                    self.max_buffer_length.get_or_insert_with(|| fidl::new_empty!(u32, D));
3627                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3628                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3629                {
3630                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3631                }
3632                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3633                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3634                }
3635            }
3636
3637            next_offset += envelope_size;
3638            _next_ordinal_to_read += 1;
3639            if next_offset >= end_offset {
3640                return Ok(());
3641            }
3642
3643            // Decode unknown envelopes for gaps in ordinals.
3644            while _next_ordinal_to_read < 5 {
3645                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3646                _next_ordinal_to_read += 1;
3647                next_offset += envelope_size;
3648            }
3649
3650            let next_out_of_line = decoder.next_out_of_line();
3651            let handles_before = decoder.remaining_handles();
3652            if let Some((inlined, num_bytes, num_handles)) =
3653                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3654            {
3655                let member_inline_size =
3656                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3657                if inlined != (member_inline_size <= 4) {
3658                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3659                }
3660                let inner_offset;
3661                let mut inner_depth = depth.clone();
3662                if inlined {
3663                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3664                    inner_offset = next_offset;
3665                } else {
3666                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3667                    inner_depth.increment()?;
3668                }
3669                let val_ref =
3670                    self.min_rx_buffer_length.get_or_insert_with(|| fidl::new_empty!(u32, D));
3671                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3672                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3673                {
3674                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3675                }
3676                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3677                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3678                }
3679            }
3680
3681            next_offset += envelope_size;
3682            _next_ordinal_to_read += 1;
3683            if next_offset >= end_offset {
3684                return Ok(());
3685            }
3686
3687            // Decode unknown envelopes for gaps in ordinals.
3688            while _next_ordinal_to_read < 6 {
3689                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3690                _next_ordinal_to_read += 1;
3691                next_offset += envelope_size;
3692            }
3693
3694            let next_out_of_line = decoder.next_out_of_line();
3695            let handles_before = decoder.remaining_handles();
3696            if let Some((inlined, num_bytes, num_handles)) =
3697                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3698            {
3699                let member_inline_size =
3700                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3701                if inlined != (member_inline_size <= 4) {
3702                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3703                }
3704                let inner_offset;
3705                let mut inner_depth = depth.clone();
3706                if inlined {
3707                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3708                    inner_offset = next_offset;
3709                } else {
3710                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3711                    inner_depth.increment()?;
3712                }
3713                let val_ref =
3714                    self.min_tx_buffer_length.get_or_insert_with(|| fidl::new_empty!(u32, D));
3715                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
3716                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3717                {
3718                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3719                }
3720                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3721                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3722                }
3723            }
3724
3725            next_offset += envelope_size;
3726            _next_ordinal_to_read += 1;
3727            if next_offset >= end_offset {
3728                return Ok(());
3729            }
3730
3731            // Decode unknown envelopes for gaps in ordinals.
3732            while _next_ordinal_to_read < 7 {
3733                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3734                _next_ordinal_to_read += 1;
3735                next_offset += envelope_size;
3736            }
3737
3738            let next_out_of_line = decoder.next_out_of_line();
3739            let handles_before = decoder.remaining_handles();
3740            if let Some((inlined, num_bytes, num_handles)) =
3741                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3742            {
3743                let member_inline_size =
3744                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3745                if inlined != (member_inline_size <= 4) {
3746                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3747                }
3748                let inner_offset;
3749                let mut inner_depth = depth.clone();
3750                if inlined {
3751                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3752                    inner_offset = next_offset;
3753                } else {
3754                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3755                    inner_depth.increment()?;
3756                }
3757                let val_ref =
3758                    self.min_tx_buffer_head.get_or_insert_with(|| fidl::new_empty!(u16, D));
3759                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3760                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3761                {
3762                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3763                }
3764                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3765                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3766                }
3767            }
3768
3769            next_offset += envelope_size;
3770            _next_ordinal_to_read += 1;
3771            if next_offset >= end_offset {
3772                return Ok(());
3773            }
3774
3775            // Decode unknown envelopes for gaps in ordinals.
3776            while _next_ordinal_to_read < 8 {
3777                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3778                _next_ordinal_to_read += 1;
3779                next_offset += envelope_size;
3780            }
3781
3782            let next_out_of_line = decoder.next_out_of_line();
3783            let handles_before = decoder.remaining_handles();
3784            if let Some((inlined, num_bytes, num_handles)) =
3785                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3786            {
3787                let member_inline_size =
3788                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3789                if inlined != (member_inline_size <= 4) {
3790                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3791                }
3792                let inner_offset;
3793                let mut inner_depth = depth.clone();
3794                if inlined {
3795                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3796                    inner_offset = next_offset;
3797                } else {
3798                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3799                    inner_depth.increment()?;
3800                }
3801                let val_ref =
3802                    self.min_tx_buffer_tail.get_or_insert_with(|| fidl::new_empty!(u16, D));
3803                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3804                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3805                {
3806                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3807                }
3808                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3809                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3810                }
3811            }
3812
3813            next_offset += envelope_size;
3814            _next_ordinal_to_read += 1;
3815            if next_offset >= end_offset {
3816                return Ok(());
3817            }
3818
3819            // Decode unknown envelopes for gaps in ordinals.
3820            while _next_ordinal_to_read < 9 {
3821                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3822                _next_ordinal_to_read += 1;
3823                next_offset += envelope_size;
3824            }
3825
3826            let next_out_of_line = decoder.next_out_of_line();
3827            let handles_before = decoder.remaining_handles();
3828            if let Some((inlined, num_bytes, num_handles)) =
3829                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3830            {
3831                let member_inline_size =
3832                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3833                if inlined != (member_inline_size <= 4) {
3834                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3835                }
3836                let inner_offset;
3837                let mut inner_depth = depth.clone();
3838                if inlined {
3839                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3840                    inner_offset = next_offset;
3841                } else {
3842                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3843                    inner_depth.increment()?;
3844                }
3845                let val_ref = self.max_buffer_parts.get_or_insert_with(|| fidl::new_empty!(u8, D));
3846                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
3847                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3848                {
3849                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3850                }
3851                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3852                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3853                }
3854            }
3855
3856            next_offset += envelope_size;
3857            _next_ordinal_to_read += 1;
3858            if next_offset >= end_offset {
3859                return Ok(());
3860            }
3861
3862            // Decode unknown envelopes for gaps in ordinals.
3863            while _next_ordinal_to_read < 12 {
3864                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3865                _next_ordinal_to_read += 1;
3866                next_offset += envelope_size;
3867            }
3868
3869            let next_out_of_line = decoder.next_out_of_line();
3870            let handles_before = decoder.remaining_handles();
3871            if let Some((inlined, num_bytes, num_handles)) =
3872                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3873            {
3874                let member_inline_size =
3875                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3876                if inlined != (member_inline_size <= 4) {
3877                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3878                }
3879                let inner_offset;
3880                let mut inner_depth = depth.clone();
3881                if inlined {
3882                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3883                    inner_offset = next_offset;
3884                } else {
3885                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3886                    inner_depth.increment()?;
3887                }
3888                let val_ref = self.min_rx_buffers.get_or_insert_with(|| fidl::new_empty!(u16, D));
3889                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3890                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3891                {
3892                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3893                }
3894                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3895                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3896                }
3897            }
3898
3899            next_offset += envelope_size;
3900
3901            // Decode the remaining unknown envelopes.
3902            while next_offset < end_offset {
3903                _next_ordinal_to_read += 1;
3904                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3905                next_offset += envelope_size;
3906            }
3907
3908            Ok(())
3909        }
3910    }
3911
3912    impl DeviceInfo {
3913        #[inline(always)]
3914        fn max_ordinal_present(&self) -> u64 {
3915            if let Some(_) = self.base_info {
3916                return 3;
3917            }
3918            if let Some(_) = self.descriptor_version {
3919                return 2;
3920            }
3921            if let Some(_) = self.min_descriptor_length {
3922                return 1;
3923            }
3924            0
3925        }
3926    }
3927
3928    impl fidl::encoding::ValueTypeMarker for DeviceInfo {
3929        type Borrowed<'a> = &'a Self;
3930        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3931            value
3932        }
3933    }
3934
3935    unsafe impl fidl::encoding::TypeMarker for DeviceInfo {
3936        type Owned = Self;
3937
3938        #[inline(always)]
3939        fn inline_align(_context: fidl::encoding::Context) -> usize {
3940            8
3941        }
3942
3943        #[inline(always)]
3944        fn inline_size(_context: fidl::encoding::Context) -> usize {
3945            16
3946        }
3947    }
3948
3949    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DeviceInfo, D>
3950        for &DeviceInfo
3951    {
3952        unsafe fn encode(
3953            self,
3954            encoder: &mut fidl::encoding::Encoder<'_, D>,
3955            offset: usize,
3956            mut depth: fidl::encoding::Depth,
3957        ) -> fidl::Result<()> {
3958            encoder.debug_check_bounds::<DeviceInfo>(offset);
3959            // Vector header
3960            let max_ordinal: u64 = self.max_ordinal_present();
3961            encoder.write_num(max_ordinal, offset);
3962            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3963            // Calling encoder.out_of_line_offset(0) is not allowed.
3964            if max_ordinal == 0 {
3965                return Ok(());
3966            }
3967            depth.increment()?;
3968            let envelope_size = 8;
3969            let bytes_len = max_ordinal as usize * envelope_size;
3970            #[allow(unused_variables)]
3971            let offset = encoder.out_of_line_offset(bytes_len);
3972            let mut _prev_end_offset: usize = 0;
3973            if 1 > max_ordinal {
3974                return Ok(());
3975            }
3976
3977            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3978            // are envelope_size bytes.
3979            let cur_offset: usize = (1 - 1) * envelope_size;
3980
3981            // Zero reserved fields.
3982            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3983
3984            // Safety:
3985            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3986            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3987            //   envelope_size bytes, there is always sufficient room.
3988            fidl::encoding::encode_in_envelope_optional::<u8, D>(
3989                self.min_descriptor_length
3990                    .as_ref()
3991                    .map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
3992                encoder,
3993                offset + cur_offset,
3994                depth,
3995            )?;
3996
3997            _prev_end_offset = cur_offset + envelope_size;
3998            if 2 > max_ordinal {
3999                return Ok(());
4000            }
4001
4002            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4003            // are envelope_size bytes.
4004            let cur_offset: usize = (2 - 1) * envelope_size;
4005
4006            // Zero reserved fields.
4007            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4008
4009            // Safety:
4010            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4011            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4012            //   envelope_size bytes, there is always sufficient room.
4013            fidl::encoding::encode_in_envelope_optional::<u8, D>(
4014                self.descriptor_version
4015                    .as_ref()
4016                    .map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
4017                encoder,
4018                offset + cur_offset,
4019                depth,
4020            )?;
4021
4022            _prev_end_offset = cur_offset + envelope_size;
4023            if 3 > max_ordinal {
4024                return Ok(());
4025            }
4026
4027            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4028            // are envelope_size bytes.
4029            let cur_offset: usize = (3 - 1) * envelope_size;
4030
4031            // Zero reserved fields.
4032            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4033
4034            // Safety:
4035            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4036            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4037            //   envelope_size bytes, there is always sufficient room.
4038            fidl::encoding::encode_in_envelope_optional::<DeviceBaseInfo, D>(
4039                self.base_info
4040                    .as_ref()
4041                    .map(<DeviceBaseInfo as fidl::encoding::ValueTypeMarker>::borrow),
4042                encoder,
4043                offset + cur_offset,
4044                depth,
4045            )?;
4046
4047            _prev_end_offset = cur_offset + envelope_size;
4048
4049            Ok(())
4050        }
4051    }
4052
4053    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DeviceInfo {
4054        #[inline(always)]
4055        fn new_empty() -> Self {
4056            Self::default()
4057        }
4058
4059        unsafe fn decode(
4060            &mut self,
4061            decoder: &mut fidl::encoding::Decoder<'_, D>,
4062            offset: usize,
4063            mut depth: fidl::encoding::Depth,
4064        ) -> fidl::Result<()> {
4065            decoder.debug_check_bounds::<Self>(offset);
4066            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4067                None => return Err(fidl::Error::NotNullable),
4068                Some(len) => len,
4069            };
4070            // Calling decoder.out_of_line_offset(0) is not allowed.
4071            if len == 0 {
4072                return Ok(());
4073            };
4074            depth.increment()?;
4075            let envelope_size = 8;
4076            let bytes_len = len * envelope_size;
4077            let offset = decoder.out_of_line_offset(bytes_len)?;
4078            // Decode the envelope for each type.
4079            let mut _next_ordinal_to_read = 0;
4080            let mut next_offset = offset;
4081            let end_offset = offset + bytes_len;
4082            _next_ordinal_to_read += 1;
4083            if next_offset >= end_offset {
4084                return Ok(());
4085            }
4086
4087            // Decode unknown envelopes for gaps in ordinals.
4088            while _next_ordinal_to_read < 1 {
4089                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4090                _next_ordinal_to_read += 1;
4091                next_offset += envelope_size;
4092            }
4093
4094            let next_out_of_line = decoder.next_out_of_line();
4095            let handles_before = decoder.remaining_handles();
4096            if let Some((inlined, num_bytes, num_handles)) =
4097                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4098            {
4099                let member_inline_size =
4100                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4101                if inlined != (member_inline_size <= 4) {
4102                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4103                }
4104                let inner_offset;
4105                let mut inner_depth = depth.clone();
4106                if inlined {
4107                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4108                    inner_offset = next_offset;
4109                } else {
4110                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4111                    inner_depth.increment()?;
4112                }
4113                let val_ref =
4114                    self.min_descriptor_length.get_or_insert_with(|| fidl::new_empty!(u8, D));
4115                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
4116                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4117                {
4118                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4119                }
4120                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4121                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4122                }
4123            }
4124
4125            next_offset += envelope_size;
4126            _next_ordinal_to_read += 1;
4127            if next_offset >= end_offset {
4128                return Ok(());
4129            }
4130
4131            // Decode unknown envelopes for gaps in ordinals.
4132            while _next_ordinal_to_read < 2 {
4133                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4134                _next_ordinal_to_read += 1;
4135                next_offset += envelope_size;
4136            }
4137
4138            let next_out_of_line = decoder.next_out_of_line();
4139            let handles_before = decoder.remaining_handles();
4140            if let Some((inlined, num_bytes, num_handles)) =
4141                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4142            {
4143                let member_inline_size =
4144                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4145                if inlined != (member_inline_size <= 4) {
4146                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4147                }
4148                let inner_offset;
4149                let mut inner_depth = depth.clone();
4150                if inlined {
4151                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4152                    inner_offset = next_offset;
4153                } else {
4154                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4155                    inner_depth.increment()?;
4156                }
4157                let val_ref =
4158                    self.descriptor_version.get_or_insert_with(|| fidl::new_empty!(u8, D));
4159                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
4160                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4161                {
4162                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4163                }
4164                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4165                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4166                }
4167            }
4168
4169            next_offset += envelope_size;
4170            _next_ordinal_to_read += 1;
4171            if next_offset >= end_offset {
4172                return Ok(());
4173            }
4174
4175            // Decode unknown envelopes for gaps in ordinals.
4176            while _next_ordinal_to_read < 3 {
4177                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4178                _next_ordinal_to_read += 1;
4179                next_offset += envelope_size;
4180            }
4181
4182            let next_out_of_line = decoder.next_out_of_line();
4183            let handles_before = decoder.remaining_handles();
4184            if let Some((inlined, num_bytes, num_handles)) =
4185                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4186            {
4187                let member_inline_size =
4188                    <DeviceBaseInfo as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4189                if inlined != (member_inline_size <= 4) {
4190                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4191                }
4192                let inner_offset;
4193                let mut inner_depth = depth.clone();
4194                if inlined {
4195                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4196                    inner_offset = next_offset;
4197                } else {
4198                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4199                    inner_depth.increment()?;
4200                }
4201                let val_ref =
4202                    self.base_info.get_or_insert_with(|| fidl::new_empty!(DeviceBaseInfo, D));
4203                fidl::decode!(DeviceBaseInfo, D, val_ref, decoder, inner_offset, inner_depth)?;
4204                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4205                {
4206                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4207                }
4208                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4209                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4210                }
4211            }
4212
4213            next_offset += envelope_size;
4214
4215            // Decode the remaining unknown envelopes.
4216            while next_offset < end_offset {
4217                _next_ordinal_to_read += 1;
4218                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4219                next_offset += envelope_size;
4220            }
4221
4222            Ok(())
4223        }
4224    }
4225
4226    impl PortBaseInfo {
4227        #[inline(always)]
4228        fn max_ordinal_present(&self) -> u64 {
4229            if let Some(_) = self.tx_types {
4230                return 3;
4231            }
4232            if let Some(_) = self.rx_types {
4233                return 2;
4234            }
4235            if let Some(_) = self.port_class {
4236                return 1;
4237            }
4238            0
4239        }
4240    }
4241
4242    impl fidl::encoding::ValueTypeMarker for PortBaseInfo {
4243        type Borrowed<'a> = &'a Self;
4244        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4245            value
4246        }
4247    }
4248
4249    unsafe impl fidl::encoding::TypeMarker for PortBaseInfo {
4250        type Owned = Self;
4251
4252        #[inline(always)]
4253        fn inline_align(_context: fidl::encoding::Context) -> usize {
4254            8
4255        }
4256
4257        #[inline(always)]
4258        fn inline_size(_context: fidl::encoding::Context) -> usize {
4259            16
4260        }
4261    }
4262
4263    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortBaseInfo, D>
4264        for &PortBaseInfo
4265    {
4266        unsafe fn encode(
4267            self,
4268            encoder: &mut fidl::encoding::Encoder<'_, D>,
4269            offset: usize,
4270            mut depth: fidl::encoding::Depth,
4271        ) -> fidl::Result<()> {
4272            encoder.debug_check_bounds::<PortBaseInfo>(offset);
4273            // Vector header
4274            let max_ordinal: u64 = self.max_ordinal_present();
4275            encoder.write_num(max_ordinal, offset);
4276            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4277            // Calling encoder.out_of_line_offset(0) is not allowed.
4278            if max_ordinal == 0 {
4279                return Ok(());
4280            }
4281            depth.increment()?;
4282            let envelope_size = 8;
4283            let bytes_len = max_ordinal as usize * envelope_size;
4284            #[allow(unused_variables)]
4285            let offset = encoder.out_of_line_offset(bytes_len);
4286            let mut _prev_end_offset: usize = 0;
4287            if 1 > max_ordinal {
4288                return Ok(());
4289            }
4290
4291            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4292            // are envelope_size bytes.
4293            let cur_offset: usize = (1 - 1) * envelope_size;
4294
4295            // Zero reserved fields.
4296            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4297
4298            // Safety:
4299            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4300            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4301            //   envelope_size bytes, there is always sufficient room.
4302            fidl::encoding::encode_in_envelope_optional::<PortClass, D>(
4303                self.port_class
4304                    .as_ref()
4305                    .map(<PortClass as fidl::encoding::ValueTypeMarker>::borrow),
4306                encoder,
4307                offset + cur_offset,
4308                depth,
4309            )?;
4310
4311            _prev_end_offset = cur_offset + envelope_size;
4312            if 2 > max_ordinal {
4313                return Ok(());
4314            }
4315
4316            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4317            // are envelope_size bytes.
4318            let cur_offset: usize = (2 - 1) * envelope_size;
4319
4320            // Zero reserved fields.
4321            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4322
4323            // Safety:
4324            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4325            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4326            //   envelope_size bytes, there is always sufficient room.
4327            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<FrameType, 4>, D>(
4328            self.rx_types.as_ref().map(<fidl::encoding::Vector<FrameType, 4> as fidl::encoding::ValueTypeMarker>::borrow),
4329            encoder, offset + cur_offset, depth
4330        )?;
4331
4332            _prev_end_offset = cur_offset + envelope_size;
4333            if 3 > max_ordinal {
4334                return Ok(());
4335            }
4336
4337            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4338            // are envelope_size bytes.
4339            let cur_offset: usize = (3 - 1) * envelope_size;
4340
4341            // Zero reserved fields.
4342            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4343
4344            // Safety:
4345            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4346            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4347            //   envelope_size bytes, there is always sufficient room.
4348            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<FrameTypeSupport, 4>, D>(
4349            self.tx_types.as_ref().map(<fidl::encoding::Vector<FrameTypeSupport, 4> as fidl::encoding::ValueTypeMarker>::borrow),
4350            encoder, offset + cur_offset, depth
4351        )?;
4352
4353            _prev_end_offset = cur_offset + envelope_size;
4354
4355            Ok(())
4356        }
4357    }
4358
4359    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortBaseInfo {
4360        #[inline(always)]
4361        fn new_empty() -> Self {
4362            Self::default()
4363        }
4364
4365        unsafe fn decode(
4366            &mut self,
4367            decoder: &mut fidl::encoding::Decoder<'_, D>,
4368            offset: usize,
4369            mut depth: fidl::encoding::Depth,
4370        ) -> fidl::Result<()> {
4371            decoder.debug_check_bounds::<Self>(offset);
4372            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4373                None => return Err(fidl::Error::NotNullable),
4374                Some(len) => len,
4375            };
4376            // Calling decoder.out_of_line_offset(0) is not allowed.
4377            if len == 0 {
4378                return Ok(());
4379            };
4380            depth.increment()?;
4381            let envelope_size = 8;
4382            let bytes_len = len * envelope_size;
4383            let offset = decoder.out_of_line_offset(bytes_len)?;
4384            // Decode the envelope for each type.
4385            let mut _next_ordinal_to_read = 0;
4386            let mut next_offset = offset;
4387            let end_offset = offset + bytes_len;
4388            _next_ordinal_to_read += 1;
4389            if next_offset >= end_offset {
4390                return Ok(());
4391            }
4392
4393            // Decode unknown envelopes for gaps in ordinals.
4394            while _next_ordinal_to_read < 1 {
4395                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4396                _next_ordinal_to_read += 1;
4397                next_offset += envelope_size;
4398            }
4399
4400            let next_out_of_line = decoder.next_out_of_line();
4401            let handles_before = decoder.remaining_handles();
4402            if let Some((inlined, num_bytes, num_handles)) =
4403                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4404            {
4405                let member_inline_size =
4406                    <PortClass as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4407                if inlined != (member_inline_size <= 4) {
4408                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4409                }
4410                let inner_offset;
4411                let mut inner_depth = depth.clone();
4412                if inlined {
4413                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4414                    inner_offset = next_offset;
4415                } else {
4416                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4417                    inner_depth.increment()?;
4418                }
4419                let val_ref = self.port_class.get_or_insert_with(|| fidl::new_empty!(PortClass, D));
4420                fidl::decode!(PortClass, D, val_ref, decoder, inner_offset, inner_depth)?;
4421                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4422                {
4423                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4424                }
4425                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4426                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4427                }
4428            }
4429
4430            next_offset += envelope_size;
4431            _next_ordinal_to_read += 1;
4432            if next_offset >= end_offset {
4433                return Ok(());
4434            }
4435
4436            // Decode unknown envelopes for gaps in ordinals.
4437            while _next_ordinal_to_read < 2 {
4438                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4439                _next_ordinal_to_read += 1;
4440                next_offset += envelope_size;
4441            }
4442
4443            let next_out_of_line = decoder.next_out_of_line();
4444            let handles_before = decoder.remaining_handles();
4445            if let Some((inlined, num_bytes, num_handles)) =
4446                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4447            {
4448                let member_inline_size = <fidl::encoding::Vector<FrameType, 4> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4449                if inlined != (member_inline_size <= 4) {
4450                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4451                }
4452                let inner_offset;
4453                let mut inner_depth = depth.clone();
4454                if inlined {
4455                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4456                    inner_offset = next_offset;
4457                } else {
4458                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4459                    inner_depth.increment()?;
4460                }
4461                let val_ref = self.rx_types.get_or_insert_with(
4462                    || fidl::new_empty!(fidl::encoding::Vector<FrameType, 4>, D),
4463                );
4464                fidl::decode!(fidl::encoding::Vector<FrameType, 4>, D, val_ref, decoder, inner_offset, inner_depth)?;
4465                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4466                {
4467                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4468                }
4469                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4470                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4471                }
4472            }
4473
4474            next_offset += envelope_size;
4475            _next_ordinal_to_read += 1;
4476            if next_offset >= end_offset {
4477                return Ok(());
4478            }
4479
4480            // Decode unknown envelopes for gaps in ordinals.
4481            while _next_ordinal_to_read < 3 {
4482                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4483                _next_ordinal_to_read += 1;
4484                next_offset += envelope_size;
4485            }
4486
4487            let next_out_of_line = decoder.next_out_of_line();
4488            let handles_before = decoder.remaining_handles();
4489            if let Some((inlined, num_bytes, num_handles)) =
4490                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4491            {
4492                let member_inline_size = <fidl::encoding::Vector<FrameTypeSupport, 4> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4493                if inlined != (member_inline_size <= 4) {
4494                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4495                }
4496                let inner_offset;
4497                let mut inner_depth = depth.clone();
4498                if inlined {
4499                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4500                    inner_offset = next_offset;
4501                } else {
4502                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4503                    inner_depth.increment()?;
4504                }
4505                let val_ref = self.tx_types.get_or_insert_with(
4506                    || fidl::new_empty!(fidl::encoding::Vector<FrameTypeSupport, 4>, D),
4507                );
4508                fidl::decode!(fidl::encoding::Vector<FrameTypeSupport, 4>, D, val_ref, decoder, inner_offset, inner_depth)?;
4509                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4510                {
4511                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4512                }
4513                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4514                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4515                }
4516            }
4517
4518            next_offset += envelope_size;
4519
4520            // Decode the remaining unknown envelopes.
4521            while next_offset < end_offset {
4522                _next_ordinal_to_read += 1;
4523                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4524                next_offset += envelope_size;
4525            }
4526
4527            Ok(())
4528        }
4529    }
4530
4531    impl PortGetCountersResponse {
4532        #[inline(always)]
4533        fn max_ordinal_present(&self) -> u64 {
4534            if let Some(_) = self.tx_bytes {
4535                return 4;
4536            }
4537            if let Some(_) = self.tx_frames {
4538                return 3;
4539            }
4540            if let Some(_) = self.rx_bytes {
4541                return 2;
4542            }
4543            if let Some(_) = self.rx_frames {
4544                return 1;
4545            }
4546            0
4547        }
4548    }
4549
4550    impl fidl::encoding::ValueTypeMarker for PortGetCountersResponse {
4551        type Borrowed<'a> = &'a Self;
4552        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4553            value
4554        }
4555    }
4556
4557    unsafe impl fidl::encoding::TypeMarker for PortGetCountersResponse {
4558        type Owned = Self;
4559
4560        #[inline(always)]
4561        fn inline_align(_context: fidl::encoding::Context) -> usize {
4562            8
4563        }
4564
4565        #[inline(always)]
4566        fn inline_size(_context: fidl::encoding::Context) -> usize {
4567            16
4568        }
4569    }
4570
4571    unsafe impl<D: fidl::encoding::ResourceDialect>
4572        fidl::encoding::Encode<PortGetCountersResponse, D> for &PortGetCountersResponse
4573    {
4574        unsafe fn encode(
4575            self,
4576            encoder: &mut fidl::encoding::Encoder<'_, D>,
4577            offset: usize,
4578            mut depth: fidl::encoding::Depth,
4579        ) -> fidl::Result<()> {
4580            encoder.debug_check_bounds::<PortGetCountersResponse>(offset);
4581            // Vector header
4582            let max_ordinal: u64 = self.max_ordinal_present();
4583            encoder.write_num(max_ordinal, offset);
4584            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4585            // Calling encoder.out_of_line_offset(0) is not allowed.
4586            if max_ordinal == 0 {
4587                return Ok(());
4588            }
4589            depth.increment()?;
4590            let envelope_size = 8;
4591            let bytes_len = max_ordinal as usize * envelope_size;
4592            #[allow(unused_variables)]
4593            let offset = encoder.out_of_line_offset(bytes_len);
4594            let mut _prev_end_offset: usize = 0;
4595            if 1 > max_ordinal {
4596                return Ok(());
4597            }
4598
4599            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4600            // are envelope_size bytes.
4601            let cur_offset: usize = (1 - 1) * envelope_size;
4602
4603            // Zero reserved fields.
4604            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4605
4606            // Safety:
4607            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4608            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4609            //   envelope_size bytes, there is always sufficient room.
4610            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4611                self.rx_frames.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4612                encoder,
4613                offset + cur_offset,
4614                depth,
4615            )?;
4616
4617            _prev_end_offset = cur_offset + envelope_size;
4618            if 2 > max_ordinal {
4619                return Ok(());
4620            }
4621
4622            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4623            // are envelope_size bytes.
4624            let cur_offset: usize = (2 - 1) * envelope_size;
4625
4626            // Zero reserved fields.
4627            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4628
4629            // Safety:
4630            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4631            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4632            //   envelope_size bytes, there is always sufficient room.
4633            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4634                self.rx_bytes.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4635                encoder,
4636                offset + cur_offset,
4637                depth,
4638            )?;
4639
4640            _prev_end_offset = cur_offset + envelope_size;
4641            if 3 > max_ordinal {
4642                return Ok(());
4643            }
4644
4645            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4646            // are envelope_size bytes.
4647            let cur_offset: usize = (3 - 1) * envelope_size;
4648
4649            // Zero reserved fields.
4650            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4651
4652            // Safety:
4653            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4654            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4655            //   envelope_size bytes, there is always sufficient room.
4656            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4657                self.tx_frames.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4658                encoder,
4659                offset + cur_offset,
4660                depth,
4661            )?;
4662
4663            _prev_end_offset = cur_offset + envelope_size;
4664            if 4 > max_ordinal {
4665                return Ok(());
4666            }
4667
4668            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4669            // are envelope_size bytes.
4670            let cur_offset: usize = (4 - 1) * envelope_size;
4671
4672            // Zero reserved fields.
4673            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4674
4675            // Safety:
4676            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4677            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4678            //   envelope_size bytes, there is always sufficient room.
4679            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4680                self.tx_bytes.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4681                encoder,
4682                offset + cur_offset,
4683                depth,
4684            )?;
4685
4686            _prev_end_offset = cur_offset + envelope_size;
4687
4688            Ok(())
4689        }
4690    }
4691
4692    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
4693        for PortGetCountersResponse
4694    {
4695        #[inline(always)]
4696        fn new_empty() -> Self {
4697            Self::default()
4698        }
4699
4700        unsafe fn decode(
4701            &mut self,
4702            decoder: &mut fidl::encoding::Decoder<'_, D>,
4703            offset: usize,
4704            mut depth: fidl::encoding::Depth,
4705        ) -> fidl::Result<()> {
4706            decoder.debug_check_bounds::<Self>(offset);
4707            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4708                None => return Err(fidl::Error::NotNullable),
4709                Some(len) => len,
4710            };
4711            // Calling decoder.out_of_line_offset(0) is not allowed.
4712            if len == 0 {
4713                return Ok(());
4714            };
4715            depth.increment()?;
4716            let envelope_size = 8;
4717            let bytes_len = len * envelope_size;
4718            let offset = decoder.out_of_line_offset(bytes_len)?;
4719            // Decode the envelope for each type.
4720            let mut _next_ordinal_to_read = 0;
4721            let mut next_offset = offset;
4722            let end_offset = offset + bytes_len;
4723            _next_ordinal_to_read += 1;
4724            if next_offset >= end_offset {
4725                return Ok(());
4726            }
4727
4728            // Decode unknown envelopes for gaps in ordinals.
4729            while _next_ordinal_to_read < 1 {
4730                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4731                _next_ordinal_to_read += 1;
4732                next_offset += envelope_size;
4733            }
4734
4735            let next_out_of_line = decoder.next_out_of_line();
4736            let handles_before = decoder.remaining_handles();
4737            if let Some((inlined, num_bytes, num_handles)) =
4738                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4739            {
4740                let member_inline_size =
4741                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4742                if inlined != (member_inline_size <= 4) {
4743                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4744                }
4745                let inner_offset;
4746                let mut inner_depth = depth.clone();
4747                if inlined {
4748                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4749                    inner_offset = next_offset;
4750                } else {
4751                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4752                    inner_depth.increment()?;
4753                }
4754                let val_ref = self.rx_frames.get_or_insert_with(|| fidl::new_empty!(u64, D));
4755                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4756                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4757                {
4758                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4759                }
4760                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4761                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4762                }
4763            }
4764
4765            next_offset += envelope_size;
4766            _next_ordinal_to_read += 1;
4767            if next_offset >= end_offset {
4768                return Ok(());
4769            }
4770
4771            // Decode unknown envelopes for gaps in ordinals.
4772            while _next_ordinal_to_read < 2 {
4773                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4774                _next_ordinal_to_read += 1;
4775                next_offset += envelope_size;
4776            }
4777
4778            let next_out_of_line = decoder.next_out_of_line();
4779            let handles_before = decoder.remaining_handles();
4780            if let Some((inlined, num_bytes, num_handles)) =
4781                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4782            {
4783                let member_inline_size =
4784                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4785                if inlined != (member_inline_size <= 4) {
4786                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4787                }
4788                let inner_offset;
4789                let mut inner_depth = depth.clone();
4790                if inlined {
4791                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4792                    inner_offset = next_offset;
4793                } else {
4794                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4795                    inner_depth.increment()?;
4796                }
4797                let val_ref = self.rx_bytes.get_or_insert_with(|| fidl::new_empty!(u64, D));
4798                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4799                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4800                {
4801                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4802                }
4803                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4804                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4805                }
4806            }
4807
4808            next_offset += envelope_size;
4809            _next_ordinal_to_read += 1;
4810            if next_offset >= end_offset {
4811                return Ok(());
4812            }
4813
4814            // Decode unknown envelopes for gaps in ordinals.
4815            while _next_ordinal_to_read < 3 {
4816                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4817                _next_ordinal_to_read += 1;
4818                next_offset += envelope_size;
4819            }
4820
4821            let next_out_of_line = decoder.next_out_of_line();
4822            let handles_before = decoder.remaining_handles();
4823            if let Some((inlined, num_bytes, num_handles)) =
4824                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4825            {
4826                let member_inline_size =
4827                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4828                if inlined != (member_inline_size <= 4) {
4829                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4830                }
4831                let inner_offset;
4832                let mut inner_depth = depth.clone();
4833                if inlined {
4834                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4835                    inner_offset = next_offset;
4836                } else {
4837                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4838                    inner_depth.increment()?;
4839                }
4840                let val_ref = self.tx_frames.get_or_insert_with(|| fidl::new_empty!(u64, D));
4841                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4842                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4843                {
4844                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4845                }
4846                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4847                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4848                }
4849            }
4850
4851            next_offset += envelope_size;
4852            _next_ordinal_to_read += 1;
4853            if next_offset >= end_offset {
4854                return Ok(());
4855            }
4856
4857            // Decode unknown envelopes for gaps in ordinals.
4858            while _next_ordinal_to_read < 4 {
4859                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4860                _next_ordinal_to_read += 1;
4861                next_offset += envelope_size;
4862            }
4863
4864            let next_out_of_line = decoder.next_out_of_line();
4865            let handles_before = decoder.remaining_handles();
4866            if let Some((inlined, num_bytes, num_handles)) =
4867                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4868            {
4869                let member_inline_size =
4870                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4871                if inlined != (member_inline_size <= 4) {
4872                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4873                }
4874                let inner_offset;
4875                let mut inner_depth = depth.clone();
4876                if inlined {
4877                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4878                    inner_offset = next_offset;
4879                } else {
4880                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4881                    inner_depth.increment()?;
4882                }
4883                let val_ref = self.tx_bytes.get_or_insert_with(|| fidl::new_empty!(u64, D));
4884                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4885                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4886                {
4887                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4888                }
4889                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4890                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4891                }
4892            }
4893
4894            next_offset += envelope_size;
4895
4896            // Decode the remaining unknown envelopes.
4897            while next_offset < end_offset {
4898                _next_ordinal_to_read += 1;
4899                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4900                next_offset += envelope_size;
4901            }
4902
4903            Ok(())
4904        }
4905    }
4906
4907    impl PortInfo {
4908        #[inline(always)]
4909        fn max_ordinal_present(&self) -> u64 {
4910            if let Some(_) = self.base_info {
4911                return 2;
4912            }
4913            if let Some(_) = self.id {
4914                return 1;
4915            }
4916            0
4917        }
4918    }
4919
4920    impl fidl::encoding::ValueTypeMarker for PortInfo {
4921        type Borrowed<'a> = &'a Self;
4922        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4923            value
4924        }
4925    }
4926
4927    unsafe impl fidl::encoding::TypeMarker for PortInfo {
4928        type Owned = Self;
4929
4930        #[inline(always)]
4931        fn inline_align(_context: fidl::encoding::Context) -> usize {
4932            8
4933        }
4934
4935        #[inline(always)]
4936        fn inline_size(_context: fidl::encoding::Context) -> usize {
4937            16
4938        }
4939    }
4940
4941    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortInfo, D> for &PortInfo {
4942        unsafe fn encode(
4943            self,
4944            encoder: &mut fidl::encoding::Encoder<'_, D>,
4945            offset: usize,
4946            mut depth: fidl::encoding::Depth,
4947        ) -> fidl::Result<()> {
4948            encoder.debug_check_bounds::<PortInfo>(offset);
4949            // Vector header
4950            let max_ordinal: u64 = self.max_ordinal_present();
4951            encoder.write_num(max_ordinal, offset);
4952            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4953            // Calling encoder.out_of_line_offset(0) is not allowed.
4954            if max_ordinal == 0 {
4955                return Ok(());
4956            }
4957            depth.increment()?;
4958            let envelope_size = 8;
4959            let bytes_len = max_ordinal as usize * envelope_size;
4960            #[allow(unused_variables)]
4961            let offset = encoder.out_of_line_offset(bytes_len);
4962            let mut _prev_end_offset: usize = 0;
4963            if 1 > max_ordinal {
4964                return Ok(());
4965            }
4966
4967            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4968            // are envelope_size bytes.
4969            let cur_offset: usize = (1 - 1) * envelope_size;
4970
4971            // Zero reserved fields.
4972            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4973
4974            // Safety:
4975            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4976            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4977            //   envelope_size bytes, there is always sufficient room.
4978            fidl::encoding::encode_in_envelope_optional::<PortId, D>(
4979                self.id.as_ref().map(<PortId as fidl::encoding::ValueTypeMarker>::borrow),
4980                encoder,
4981                offset + cur_offset,
4982                depth,
4983            )?;
4984
4985            _prev_end_offset = cur_offset + envelope_size;
4986            if 2 > max_ordinal {
4987                return Ok(());
4988            }
4989
4990            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4991            // are envelope_size bytes.
4992            let cur_offset: usize = (2 - 1) * envelope_size;
4993
4994            // Zero reserved fields.
4995            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4996
4997            // Safety:
4998            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4999            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5000            //   envelope_size bytes, there is always sufficient room.
5001            fidl::encoding::encode_in_envelope_optional::<PortBaseInfo, D>(
5002                self.base_info
5003                    .as_ref()
5004                    .map(<PortBaseInfo as fidl::encoding::ValueTypeMarker>::borrow),
5005                encoder,
5006                offset + cur_offset,
5007                depth,
5008            )?;
5009
5010            _prev_end_offset = cur_offset + envelope_size;
5011
5012            Ok(())
5013        }
5014    }
5015
5016    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortInfo {
5017        #[inline(always)]
5018        fn new_empty() -> Self {
5019            Self::default()
5020        }
5021
5022        unsafe fn decode(
5023            &mut self,
5024            decoder: &mut fidl::encoding::Decoder<'_, D>,
5025            offset: usize,
5026            mut depth: fidl::encoding::Depth,
5027        ) -> fidl::Result<()> {
5028            decoder.debug_check_bounds::<Self>(offset);
5029            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
5030                None => return Err(fidl::Error::NotNullable),
5031                Some(len) => len,
5032            };
5033            // Calling decoder.out_of_line_offset(0) is not allowed.
5034            if len == 0 {
5035                return Ok(());
5036            };
5037            depth.increment()?;
5038            let envelope_size = 8;
5039            let bytes_len = len * envelope_size;
5040            let offset = decoder.out_of_line_offset(bytes_len)?;
5041            // Decode the envelope for each type.
5042            let mut _next_ordinal_to_read = 0;
5043            let mut next_offset = offset;
5044            let end_offset = offset + bytes_len;
5045            _next_ordinal_to_read += 1;
5046            if next_offset >= end_offset {
5047                return Ok(());
5048            }
5049
5050            // Decode unknown envelopes for gaps in ordinals.
5051            while _next_ordinal_to_read < 1 {
5052                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5053                _next_ordinal_to_read += 1;
5054                next_offset += envelope_size;
5055            }
5056
5057            let next_out_of_line = decoder.next_out_of_line();
5058            let handles_before = decoder.remaining_handles();
5059            if let Some((inlined, num_bytes, num_handles)) =
5060                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5061            {
5062                let member_inline_size =
5063                    <PortId as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5064                if inlined != (member_inline_size <= 4) {
5065                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5066                }
5067                let inner_offset;
5068                let mut inner_depth = depth.clone();
5069                if inlined {
5070                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5071                    inner_offset = next_offset;
5072                } else {
5073                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5074                    inner_depth.increment()?;
5075                }
5076                let val_ref = self.id.get_or_insert_with(|| fidl::new_empty!(PortId, D));
5077                fidl::decode!(PortId, D, val_ref, decoder, inner_offset, inner_depth)?;
5078                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5079                {
5080                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5081                }
5082                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5083                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5084                }
5085            }
5086
5087            next_offset += envelope_size;
5088            _next_ordinal_to_read += 1;
5089            if next_offset >= end_offset {
5090                return Ok(());
5091            }
5092
5093            // Decode unknown envelopes for gaps in ordinals.
5094            while _next_ordinal_to_read < 2 {
5095                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5096                _next_ordinal_to_read += 1;
5097                next_offset += envelope_size;
5098            }
5099
5100            let next_out_of_line = decoder.next_out_of_line();
5101            let handles_before = decoder.remaining_handles();
5102            if let Some((inlined, num_bytes, num_handles)) =
5103                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5104            {
5105                let member_inline_size =
5106                    <PortBaseInfo as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5107                if inlined != (member_inline_size <= 4) {
5108                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5109                }
5110                let inner_offset;
5111                let mut inner_depth = depth.clone();
5112                if inlined {
5113                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5114                    inner_offset = next_offset;
5115                } else {
5116                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5117                    inner_depth.increment()?;
5118                }
5119                let val_ref =
5120                    self.base_info.get_or_insert_with(|| fidl::new_empty!(PortBaseInfo, D));
5121                fidl::decode!(PortBaseInfo, D, val_ref, decoder, inner_offset, inner_depth)?;
5122                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5123                {
5124                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5125                }
5126                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5127                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5128                }
5129            }
5130
5131            next_offset += envelope_size;
5132
5133            // Decode the remaining unknown envelopes.
5134            while next_offset < end_offset {
5135                _next_ordinal_to_read += 1;
5136                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5137                next_offset += envelope_size;
5138            }
5139
5140            Ok(())
5141        }
5142    }
5143
5144    impl PortStatus {
5145        #[inline(always)]
5146        fn max_ordinal_present(&self) -> u64 {
5147            if let Some(_) = self.mtu {
5148                return 2;
5149            }
5150            if let Some(_) = self.flags {
5151                return 1;
5152            }
5153            0
5154        }
5155    }
5156
5157    impl fidl::encoding::ValueTypeMarker for PortStatus {
5158        type Borrowed<'a> = &'a Self;
5159        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
5160            value
5161        }
5162    }
5163
5164    unsafe impl fidl::encoding::TypeMarker for PortStatus {
5165        type Owned = Self;
5166
5167        #[inline(always)]
5168        fn inline_align(_context: fidl::encoding::Context) -> usize {
5169            8
5170        }
5171
5172        #[inline(always)]
5173        fn inline_size(_context: fidl::encoding::Context) -> usize {
5174            16
5175        }
5176    }
5177
5178    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortStatus, D>
5179        for &PortStatus
5180    {
5181        unsafe fn encode(
5182            self,
5183            encoder: &mut fidl::encoding::Encoder<'_, D>,
5184            offset: usize,
5185            mut depth: fidl::encoding::Depth,
5186        ) -> fidl::Result<()> {
5187            encoder.debug_check_bounds::<PortStatus>(offset);
5188            // Vector header
5189            let max_ordinal: u64 = self.max_ordinal_present();
5190            encoder.write_num(max_ordinal, offset);
5191            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
5192            // Calling encoder.out_of_line_offset(0) is not allowed.
5193            if max_ordinal == 0 {
5194                return Ok(());
5195            }
5196            depth.increment()?;
5197            let envelope_size = 8;
5198            let bytes_len = max_ordinal as usize * envelope_size;
5199            #[allow(unused_variables)]
5200            let offset = encoder.out_of_line_offset(bytes_len);
5201            let mut _prev_end_offset: usize = 0;
5202            if 1 > max_ordinal {
5203                return Ok(());
5204            }
5205
5206            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5207            // are envelope_size bytes.
5208            let cur_offset: usize = (1 - 1) * envelope_size;
5209
5210            // Zero reserved fields.
5211            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5212
5213            // Safety:
5214            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5215            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5216            //   envelope_size bytes, there is always sufficient room.
5217            fidl::encoding::encode_in_envelope_optional::<StatusFlags, D>(
5218                self.flags.as_ref().map(<StatusFlags as fidl::encoding::ValueTypeMarker>::borrow),
5219                encoder,
5220                offset + cur_offset,
5221                depth,
5222            )?;
5223
5224            _prev_end_offset = cur_offset + envelope_size;
5225            if 2 > max_ordinal {
5226                return Ok(());
5227            }
5228
5229            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5230            // are envelope_size bytes.
5231            let cur_offset: usize = (2 - 1) * envelope_size;
5232
5233            // Zero reserved fields.
5234            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5235
5236            // Safety:
5237            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5238            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5239            //   envelope_size bytes, there is always sufficient room.
5240            fidl::encoding::encode_in_envelope_optional::<u32, D>(
5241                self.mtu.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
5242                encoder,
5243                offset + cur_offset,
5244                depth,
5245            )?;
5246
5247            _prev_end_offset = cur_offset + envelope_size;
5248
5249            Ok(())
5250        }
5251    }
5252
5253    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortStatus {
5254        #[inline(always)]
5255        fn new_empty() -> Self {
5256            Self::default()
5257        }
5258
5259        unsafe fn decode(
5260            &mut self,
5261            decoder: &mut fidl::encoding::Decoder<'_, D>,
5262            offset: usize,
5263            mut depth: fidl::encoding::Depth,
5264        ) -> fidl::Result<()> {
5265            decoder.debug_check_bounds::<Self>(offset);
5266            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
5267                None => return Err(fidl::Error::NotNullable),
5268                Some(len) => len,
5269            };
5270            // Calling decoder.out_of_line_offset(0) is not allowed.
5271            if len == 0 {
5272                return Ok(());
5273            };
5274            depth.increment()?;
5275            let envelope_size = 8;
5276            let bytes_len = len * envelope_size;
5277            let offset = decoder.out_of_line_offset(bytes_len)?;
5278            // Decode the envelope for each type.
5279            let mut _next_ordinal_to_read = 0;
5280            let mut next_offset = offset;
5281            let end_offset = offset + bytes_len;
5282            _next_ordinal_to_read += 1;
5283            if next_offset >= end_offset {
5284                return Ok(());
5285            }
5286
5287            // Decode unknown envelopes for gaps in ordinals.
5288            while _next_ordinal_to_read < 1 {
5289                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5290                _next_ordinal_to_read += 1;
5291                next_offset += envelope_size;
5292            }
5293
5294            let next_out_of_line = decoder.next_out_of_line();
5295            let handles_before = decoder.remaining_handles();
5296            if let Some((inlined, num_bytes, num_handles)) =
5297                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5298            {
5299                let member_inline_size =
5300                    <StatusFlags as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5301                if inlined != (member_inline_size <= 4) {
5302                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5303                }
5304                let inner_offset;
5305                let mut inner_depth = depth.clone();
5306                if inlined {
5307                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5308                    inner_offset = next_offset;
5309                } else {
5310                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5311                    inner_depth.increment()?;
5312                }
5313                let val_ref = self.flags.get_or_insert_with(|| fidl::new_empty!(StatusFlags, D));
5314                fidl::decode!(StatusFlags, D, val_ref, decoder, inner_offset, inner_depth)?;
5315                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5316                {
5317                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5318                }
5319                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5320                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5321                }
5322            }
5323
5324            next_offset += envelope_size;
5325            _next_ordinal_to_read += 1;
5326            if next_offset >= end_offset {
5327                return Ok(());
5328            }
5329
5330            // Decode unknown envelopes for gaps in ordinals.
5331            while _next_ordinal_to_read < 2 {
5332                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5333                _next_ordinal_to_read += 1;
5334                next_offset += envelope_size;
5335            }
5336
5337            let next_out_of_line = decoder.next_out_of_line();
5338            let handles_before = decoder.remaining_handles();
5339            if let Some((inlined, num_bytes, num_handles)) =
5340                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5341            {
5342                let member_inline_size =
5343                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5344                if inlined != (member_inline_size <= 4) {
5345                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5346                }
5347                let inner_offset;
5348                let mut inner_depth = depth.clone();
5349                if inlined {
5350                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5351                    inner_offset = next_offset;
5352                } else {
5353                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5354                    inner_depth.increment()?;
5355                }
5356                let val_ref = self.mtu.get_or_insert_with(|| fidl::new_empty!(u32, D));
5357                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
5358                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5359                {
5360                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5361                }
5362                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5363                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5364                }
5365            }
5366
5367            next_offset += envelope_size;
5368
5369            // Decode the remaining unknown envelopes.
5370            while next_offset < end_offset {
5371                _next_ordinal_to_read += 1;
5372                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5373                next_offset += envelope_size;
5374            }
5375
5376            Ok(())
5377        }
5378    }
5379
5380    impl fidl::encoding::ValueTypeMarker for DevicePortEvent {
5381        type Borrowed<'a> = &'a Self;
5382        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
5383            value
5384        }
5385    }
5386
5387    unsafe impl fidl::encoding::TypeMarker for DevicePortEvent {
5388        type Owned = Self;
5389
5390        #[inline(always)]
5391        fn inline_align(_context: fidl::encoding::Context) -> usize {
5392            8
5393        }
5394
5395        #[inline(always)]
5396        fn inline_size(_context: fidl::encoding::Context) -> usize {
5397            16
5398        }
5399    }
5400
5401    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DevicePortEvent, D>
5402        for &DevicePortEvent
5403    {
5404        #[inline]
5405        unsafe fn encode(
5406            self,
5407            encoder: &mut fidl::encoding::Encoder<'_, D>,
5408            offset: usize,
5409            _depth: fidl::encoding::Depth,
5410        ) -> fidl::Result<()> {
5411            encoder.debug_check_bounds::<DevicePortEvent>(offset);
5412            encoder.write_num::<u64>(self.ordinal(), offset);
5413            match self {
5414                DevicePortEvent::Existing(ref val) => {
5415                    fidl::encoding::encode_in_envelope::<PortId, D>(
5416                        <PortId as fidl::encoding::ValueTypeMarker>::borrow(val),
5417                        encoder,
5418                        offset + 8,
5419                        _depth,
5420                    )
5421                }
5422                DevicePortEvent::Added(ref val) => fidl::encoding::encode_in_envelope::<PortId, D>(
5423                    <PortId as fidl::encoding::ValueTypeMarker>::borrow(val),
5424                    encoder,
5425                    offset + 8,
5426                    _depth,
5427                ),
5428                DevicePortEvent::Removed(ref val) => {
5429                    fidl::encoding::encode_in_envelope::<PortId, D>(
5430                        <PortId as fidl::encoding::ValueTypeMarker>::borrow(val),
5431                        encoder,
5432                        offset + 8,
5433                        _depth,
5434                    )
5435                }
5436                DevicePortEvent::Idle(ref val) => fidl::encoding::encode_in_envelope::<Empty, D>(
5437                    <Empty as fidl::encoding::ValueTypeMarker>::borrow(val),
5438                    encoder,
5439                    offset + 8,
5440                    _depth,
5441                ),
5442            }
5443        }
5444    }
5445
5446    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DevicePortEvent {
5447        #[inline(always)]
5448        fn new_empty() -> Self {
5449            Self::Existing(fidl::new_empty!(PortId, D))
5450        }
5451
5452        #[inline]
5453        unsafe fn decode(
5454            &mut self,
5455            decoder: &mut fidl::encoding::Decoder<'_, D>,
5456            offset: usize,
5457            mut depth: fidl::encoding::Depth,
5458        ) -> fidl::Result<()> {
5459            decoder.debug_check_bounds::<Self>(offset);
5460            #[allow(unused_variables)]
5461            let next_out_of_line = decoder.next_out_of_line();
5462            let handles_before = decoder.remaining_handles();
5463            let (ordinal, inlined, num_bytes, num_handles) =
5464                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
5465
5466            let member_inline_size = match ordinal {
5467                1 => <PortId as fidl::encoding::TypeMarker>::inline_size(decoder.context),
5468                2 => <PortId as fidl::encoding::TypeMarker>::inline_size(decoder.context),
5469                3 => <PortId as fidl::encoding::TypeMarker>::inline_size(decoder.context),
5470                4 => <Empty as fidl::encoding::TypeMarker>::inline_size(decoder.context),
5471                _ => return Err(fidl::Error::UnknownUnionTag),
5472            };
5473
5474            if inlined != (member_inline_size <= 4) {
5475                return Err(fidl::Error::InvalidInlineBitInEnvelope);
5476            }
5477            let _inner_offset;
5478            if inlined {
5479                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
5480                _inner_offset = offset + 8;
5481            } else {
5482                depth.increment()?;
5483                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5484            }
5485            match ordinal {
5486                1 => {
5487                    #[allow(irrefutable_let_patterns)]
5488                    if let DevicePortEvent::Existing(_) = self {
5489                        // Do nothing, read the value into the object
5490                    } else {
5491                        // Initialize `self` to the right variant
5492                        *self = DevicePortEvent::Existing(fidl::new_empty!(PortId, D));
5493                    }
5494                    #[allow(irrefutable_let_patterns)]
5495                    if let DevicePortEvent::Existing(ref mut val) = self {
5496                        fidl::decode!(PortId, D, val, decoder, _inner_offset, depth)?;
5497                    } else {
5498                        unreachable!()
5499                    }
5500                }
5501                2 => {
5502                    #[allow(irrefutable_let_patterns)]
5503                    if let DevicePortEvent::Added(_) = self {
5504                        // Do nothing, read the value into the object
5505                    } else {
5506                        // Initialize `self` to the right variant
5507                        *self = DevicePortEvent::Added(fidl::new_empty!(PortId, D));
5508                    }
5509                    #[allow(irrefutable_let_patterns)]
5510                    if let DevicePortEvent::Added(ref mut val) = self {
5511                        fidl::decode!(PortId, D, val, decoder, _inner_offset, depth)?;
5512                    } else {
5513                        unreachable!()
5514                    }
5515                }
5516                3 => {
5517                    #[allow(irrefutable_let_patterns)]
5518                    if let DevicePortEvent::Removed(_) = self {
5519                        // Do nothing, read the value into the object
5520                    } else {
5521                        // Initialize `self` to the right variant
5522                        *self = DevicePortEvent::Removed(fidl::new_empty!(PortId, D));
5523                    }
5524                    #[allow(irrefutable_let_patterns)]
5525                    if let DevicePortEvent::Removed(ref mut val) = self {
5526                        fidl::decode!(PortId, D, val, decoder, _inner_offset, depth)?;
5527                    } else {
5528                        unreachable!()
5529                    }
5530                }
5531                4 => {
5532                    #[allow(irrefutable_let_patterns)]
5533                    if let DevicePortEvent::Idle(_) = self {
5534                        // Do nothing, read the value into the object
5535                    } else {
5536                        // Initialize `self` to the right variant
5537                        *self = DevicePortEvent::Idle(fidl::new_empty!(Empty, D));
5538                    }
5539                    #[allow(irrefutable_let_patterns)]
5540                    if let DevicePortEvent::Idle(ref mut val) = self {
5541                        fidl::decode!(Empty, D, val, decoder, _inner_offset, depth)?;
5542                    } else {
5543                        unreachable!()
5544                    }
5545                }
5546                ordinal => panic!("unexpected ordinal {:?}", ordinal),
5547            }
5548            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
5549                return Err(fidl::Error::InvalidNumBytesInEnvelope);
5550            }
5551            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5552                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5553            }
5554            Ok(())
5555        }
5556    }
5557}