Skip to main content

fidl_fuchsia_net_tun_common/
fidl_fuchsia_net_tun_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 TX and RX FIFO Depths used by tun devices.
12pub const FIFO_DEPTH: u16 = 128;
13
14/// Maximum supported MTU.
15pub const MAX_MTU: u32 = 16384;
16
17/// Maximum number of multicast filters that a device holds in `MacState`.
18pub const MAX_MULTICAST_FILTERS: u32 = 64;
19
20/// Maximum number of pending [`fuchsia.net.tun/Device.WriteFrame`] or
21/// [`fuchsia.net.tun/Device.ReadFrame`] that are allowed.
22pub const MAX_PENDING_OPERATIONS: u32 = 32;
23
24bitflags! {
25    /// Signals set in the `eventpair` returned by
26    /// [`fuchsia.net.tun/Device.GetSignals`].
27    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
28    pub struct Signals: u32 {
29        /// Indicates that write buffers are available to be used through
30        /// [`fuchsia.net.tun/Device.WriteFrame`].
31        const WRITABLE = 16777216;
32        /// Indicates that read buffers are available to be used through
33        /// [`fuchsia.net.tun/Device.ReadFrame`].
34        const READABLE = 33554432;
35    }
36}
37
38impl Signals {}
39
40#[derive(Clone, Debug, PartialEq)]
41pub struct DevicePairAddPortRequest {
42    pub config: DevicePairPortConfig,
43}
44
45impl fidl::Persistable for DevicePairAddPortRequest {}
46
47#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
48#[repr(C)]
49pub struct DevicePairRemovePortRequest {
50    pub id: u8,
51}
52
53impl fidl::Persistable for DevicePairRemovePortRequest {}
54
55#[derive(Clone, Debug, PartialEq)]
56pub struct DeviceWriteFrameRequest {
57    pub frame: Frame,
58}
59
60impl fidl::Persistable for DeviceWriteFrameRequest {}
61
62#[derive(Clone, Debug, PartialEq)]
63pub struct DeviceReadFrameResponse {
64    pub frame: Frame,
65}
66
67impl fidl::Persistable for DeviceReadFrameResponse {}
68
69#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
70#[repr(C)]
71pub struct FrameMetadata {
72    /// Frame flags. `RxFlags` for `WriteFrame` and `TxFlags` for
73    /// `ReadFrame`.
74    ///
75    /// If not set, interpreted as zero.
76    pub flags: u32,
77}
78
79impl fidl::Persistable for FrameMetadata {}
80
81#[derive(Clone, Debug, PartialEq)]
82pub struct PortGetStateResponse {
83    pub state: InternalState,
84}
85
86impl fidl::Persistable for PortGetStateResponse {}
87
88#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
89pub struct PortSetOnlineRequest {
90    pub online: bool,
91}
92
93impl fidl::Persistable for PortSetOnlineRequest {}
94
95#[derive(Clone, Debug, PartialEq)]
96pub struct PortWatchStateResponse {
97    pub state: InternalState,
98}
99
100impl fidl::Persistable for PortWatchStateResponse {}
101
102/// Base device configuration.
103#[derive(Clone, Debug, Default, PartialEq)]
104pub struct BaseDeviceConfig {
105    /// Report frame metadata on receiving frames.
106    ///
107    /// If not set, interpreted as `false`.
108    pub report_metadata: Option<bool>,
109    /// Minimum requested TX buffer length, in bytes.
110    ///
111    /// If set, must be greater than 0. If not set, interpreted as 1.
112    pub min_tx_buffer_length: Option<u32>,
113    /// Minimum requested RX buffer length, in bytes.
114    ///
115    /// If set, must be greater than 0. If not set, interpreted as 1.
116    pub min_rx_buffer_length: Option<u32>,
117    #[doc(hidden)]
118    pub __source_breaking: fidl::marker::SourceBreaking,
119}
120
121impl fidl::Persistable for BaseDeviceConfig {}
122
123/// Logical device port configuration.
124#[derive(Clone, Debug, Default, PartialEq)]
125pub struct BasePortConfig {
126    /// Port identifier.
127    ///
128    /// Required.
129    pub id: Option<u8>,
130    /// Device MTU (maximum transmit unit).
131    ///
132    /// Valid iff less than or equal to [`MAX_MTU`].
133    ///
134    /// If not set, interpreted as [`MAX_MTU`].
135    pub mtu: Option<u32>,
136    /// Supported Rx frame types for port.
137    ///
138    /// Valid iff non-empty.
139    ///
140    /// Required.
141    pub rx_types: Option<Vec<fidl_fuchsia_hardware_network_common::FrameType>>,
142    /// Supported Tx frame types on port.
143    ///
144    /// Valid iff non-empty.
145    ///
146    /// Required.
147    pub tx_types: Option<Vec<fidl_fuchsia_hardware_network_common::FrameTypeSupport>>,
148    /// Port class.
149    ///
150    /// If not set, interpreted as `VIRTUAL`.
151    pub port_class: Option<fidl_fuchsia_hardware_network_common::PortClass>,
152    /// Simulate receive-side checksum offloading.
153    ///
154    /// If true, the port will report `FULL_CHECKSUMS_VERIFIED` on all received
155    /// frames.
156    pub rx_checksum_offload: Option<bool>,
157    #[doc(hidden)]
158    pub __source_breaking: fidl::marker::SourceBreaking,
159}
160
161impl fidl::Persistable for BasePortConfig {}
162
163#[derive(Clone, Debug, Default, PartialEq)]
164pub struct DeviceConfig {
165    /// Base device configuration.
166    ///
167    /// It not set, interpreted as an empty table.
168    pub base: Option<BaseDeviceConfig>,
169    /// If `true`, [`fuchsia.net.tun/Device.WriteFrame`] and
170    /// [`fuchsia.net.tun/Device.ReadFrame`] blocks returning until the
171    /// corresponding buffers are available to complete the call.
172    ///
173    /// It not set, interpreted as `false`.
174    pub blocking: Option<bool>,
175    #[doc(hidden)]
176    pub __source_breaking: fidl::marker::SourceBreaking,
177}
178
179impl fidl::Persistable for DeviceConfig {}
180
181#[derive(Clone, Debug, Default, PartialEq)]
182pub struct DevicePairConfig {
183    /// Base device configuration.
184    ///
185    /// It not set, interpreted as an empty table.
186    pub base: Option<BaseDeviceConfig>,
187    /// If `true`, transmit buffers on the left end are dropped if no
188    /// receive buffers are available on the right end to receive it.
189    /// Otherwise, transmit buffers wait until a receive buffer is
190    /// available to copy them to.
191    ///
192    /// It not set, interpreted as `false`.
193    pub fallible_transmit_left: Option<bool>,
194    /// Like `fallible_transmit_left` but allows writes to the right end
195    /// to be fallible.
196    ///
197    /// It not set, interpreted as `false`.
198    pub fallible_transmit_right: Option<bool>,
199    #[doc(hidden)]
200    pub __source_breaking: fidl::marker::SourceBreaking,
201}
202
203impl fidl::Persistable for DevicePairConfig {}
204
205#[derive(Clone, Debug, Default, PartialEq)]
206pub struct DevicePairPortConfig {
207    /// Base port configuration.
208    ///
209    /// Required.
210    pub base: Option<BasePortConfig>,
211    /// MAC address to report.
212    ///
213    /// If set, left port provides a
214    /// [`fuchsia.hardware.network/MacAddressing`] implementation
215    /// through [`fuchsia.hardware.network/Port.GetMac`].
216    pub mac_left: Option<fidl_fuchsia_net_common::MacAddress>,
217    /// MAC address to report.
218    ///
219    /// If set, right port provides a
220    /// [`fuchsia.hardware.network/MacAddressing`] implementation
221    /// through [`fuchsia.hardware.network/Port.GetMac`].
222    pub mac_right: Option<fidl_fuchsia_net_common::MacAddress>,
223    #[doc(hidden)]
224    pub __source_breaking: fidl::marker::SourceBreaking,
225}
226
227impl fidl::Persistable for DevicePairPortConfig {}
228
229#[derive(Clone, Debug, Default, PartialEq)]
230pub struct DevicePortConfig {
231    /// Base port configuration.
232    ///
233    /// Required.
234    pub base: Option<BasePortConfig>,
235    /// Start port with link online.
236    ///
237    /// If not set, interpreted as `false`.
238    pub online: Option<bool>,
239    /// MAC address to report.
240    ///
241    /// If set, the port provides a
242    /// [`fuchsia.hardware.network/MacAddressing`] implementation /
243    /// through [`fuchsia.hardware.network/Port.GetMac`].
244    pub mac: Option<fidl_fuchsia_net_common::MacAddress>,
245    #[doc(hidden)]
246    pub __source_breaking: fidl::marker::SourceBreaking,
247}
248
249impl fidl::Persistable for DevicePortConfig {}
250
251/// A frame written to or read from a [`fuchsia.net.tun/Device`].
252///
253/// Required fields must always be provided to
254/// [`fuchsia.net.tun/Port.WriteFrame`] and are always present when returned by
255/// [`fuchsia.net.tun/Port.ReadFrame`].
256#[derive(Clone, Debug, Default, PartialEq)]
257pub struct Frame {
258    /// The type identifying this frame's payload.
259    ///
260    /// Required.
261    pub frame_type: Option<fidl_fuchsia_hardware_network_common::FrameType>,
262    /// The frame's payload.
263    ///
264    /// Valid iff non-empty.
265    ///
266    /// Required.
267    pub data: Option<Vec<u8>>,
268    /// Extra frame metadata.
269    ///
270    /// This is an opaque holder for extra information that is associated with
271    /// Network Device data frames.
272    ///
273    /// If not set, interpreted as empty.
274    pub meta: Option<FrameMetadata>,
275    /// Frame's destination or source port identifier.
276    ///
277    /// Required.
278    pub port: Option<u8>,
279    #[doc(hidden)]
280    pub __source_breaking: fidl::marker::SourceBreaking,
281}
282
283impl fidl::Persistable for Frame {}
284
285/// Internal device state.
286#[derive(Clone, Debug, Default, PartialEq)]
287pub struct InternalState {
288    /// State associated with Mac Address filtering.
289    ///
290    /// Devices never perform any MAC address filtering, but they implement the
291    /// [`fuchsia.hardware.network/MacAddressing`] interface and store the
292    /// values to be retrieved through the [`fuchsia.net.tun/InternalState`]
293    /// structure.
294    ///
295    /// Set iff `mac` is provided in the [`DevicePortConfig`] or
296    /// [`DevicePairPortConfig`] structures upon creation of the port.
297    pub mac: Option<MacState>,
298    /// Whether there is a session currently opened and running with the `Port`.
299    ///
300    /// Required.
301    pub has_session: Option<bool>,
302    #[doc(hidden)]
303    pub __source_breaking: fidl::marker::SourceBreaking,
304}
305
306impl fidl::Persistable for InternalState {}
307
308#[derive(Clone, Debug, Default, PartialEq)]
309pub struct MacState {
310    /// The currently configured MAC Address filtering mode.
311    ///
312    /// Required.
313    pub mode: Option<fidl_fuchsia_hardware_network_common::MacFilterMode>,
314    /// The full list of configured multicast address filtering.
315    ///
316    /// Required.
317    pub multicast_filters: Option<Vec<fidl_fuchsia_net_common::MacAddress>>,
318    #[doc(hidden)]
319    pub __source_breaking: fidl::marker::SourceBreaking,
320}
321
322impl fidl::Persistable for MacState {}
323
324pub mod control_ordinals {
325    pub const CREATE_DEVICE: u64 = 0x2aace38c0c1cd187;
326    pub const CREATE_PAIR: u64 = 0x2c8884060cc29d18;
327}
328
329pub mod device_ordinals {
330    pub const WRITE_FRAME: u64 = 0x2d19e24e149bf6db;
331    pub const READ_FRAME: u64 = 0x6ebc56b8427e1571;
332    pub const GET_SIGNALS: u64 = 0x4d1ca50fc53606b9;
333    pub const ADD_PORT: u64 = 0x6b56b238f04ee3d4;
334    pub const GET_DEVICE: u64 = 0x2e8c81fdcdd99d26;
335    pub const DELEGATE_RX_LEASE: u64 = 0x660137a0e680b4c0;
336}
337
338pub mod device_pair_ordinals {
339    pub const ADD_PORT: u64 = 0x362f4856a075e1f8;
340    pub const REMOVE_PORT: u64 = 0x33bb45cc1d3fbe1e;
341    pub const GET_LEFT: u64 = 0x1357a771a6ccb303;
342    pub const GET_RIGHT: u64 = 0x45ebce063223b60f;
343    pub const GET_LEFT_PORT: u64 = 0x6e3038d75096ab77;
344    pub const GET_RIGHT_PORT: u64 = 0x7fc4716601eb987c;
345}
346
347pub mod port_ordinals {
348    pub const GET_STATE: u64 = 0x5022630816212ed;
349    pub const WATCH_STATE: u64 = 0x74d3c94c96e2b605;
350    pub const SET_ONLINE: u64 = 0x734f83793ce86e6c;
351    pub const GET_PORT: u64 = 0x1998638c1d97eed2;
352    pub const REMOVE: u64 = 0x4f45201ed5719261;
353}
354
355mod internal {
356    use super::*;
357    unsafe impl fidl::encoding::TypeMarker for Signals {
358        type Owned = Self;
359
360        #[inline(always)]
361        fn inline_align(_context: fidl::encoding::Context) -> usize {
362            4
363        }
364
365        #[inline(always)]
366        fn inline_size(_context: fidl::encoding::Context) -> usize {
367            4
368        }
369    }
370
371    impl fidl::encoding::ValueTypeMarker for Signals {
372        type Borrowed<'a> = Self;
373        #[inline(always)]
374        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
375            *value
376        }
377    }
378
379    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for Signals {
380        #[inline]
381        unsafe fn encode(
382            self,
383            encoder: &mut fidl::encoding::Encoder<'_, D>,
384            offset: usize,
385            _depth: fidl::encoding::Depth,
386        ) -> fidl::Result<()> {
387            encoder.debug_check_bounds::<Self>(offset);
388            if self.bits() & Self::all().bits() != self.bits() {
389                return Err(fidl::Error::InvalidBitsValue);
390            }
391            encoder.write_num(self.bits(), offset);
392            Ok(())
393        }
394    }
395
396    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Signals {
397        #[inline(always)]
398        fn new_empty() -> Self {
399            Self::empty()
400        }
401
402        #[inline]
403        unsafe fn decode(
404            &mut self,
405            decoder: &mut fidl::encoding::Decoder<'_, D>,
406            offset: usize,
407            _depth: fidl::encoding::Depth,
408        ) -> fidl::Result<()> {
409            decoder.debug_check_bounds::<Self>(offset);
410            let prim = decoder.read_num::<u32>(offset);
411            *self = Self::from_bits(prim).ok_or(fidl::Error::InvalidBitsValue)?;
412            Ok(())
413        }
414    }
415
416    impl fidl::encoding::ValueTypeMarker for DevicePairAddPortRequest {
417        type Borrowed<'a> = &'a Self;
418        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
419            value
420        }
421    }
422
423    unsafe impl fidl::encoding::TypeMarker for DevicePairAddPortRequest {
424        type Owned = Self;
425
426        #[inline(always)]
427        fn inline_align(_context: fidl::encoding::Context) -> usize {
428            8
429        }
430
431        #[inline(always)]
432        fn inline_size(_context: fidl::encoding::Context) -> usize {
433            16
434        }
435    }
436
437    unsafe impl<D: fidl::encoding::ResourceDialect>
438        fidl::encoding::Encode<DevicePairAddPortRequest, D> for &DevicePairAddPortRequest
439    {
440        #[inline]
441        unsafe fn encode(
442            self,
443            encoder: &mut fidl::encoding::Encoder<'_, D>,
444            offset: usize,
445            _depth: fidl::encoding::Depth,
446        ) -> fidl::Result<()> {
447            encoder.debug_check_bounds::<DevicePairAddPortRequest>(offset);
448            // Delegate to tuple encoding.
449            fidl::encoding::Encode::<DevicePairAddPortRequest, D>::encode(
450                (<DevicePairPortConfig as fidl::encoding::ValueTypeMarker>::borrow(&self.config),),
451                encoder,
452                offset,
453                _depth,
454            )
455        }
456    }
457    unsafe impl<
458        D: fidl::encoding::ResourceDialect,
459        T0: fidl::encoding::Encode<DevicePairPortConfig, D>,
460    > fidl::encoding::Encode<DevicePairAddPortRequest, D> for (T0,)
461    {
462        #[inline]
463        unsafe fn encode(
464            self,
465            encoder: &mut fidl::encoding::Encoder<'_, D>,
466            offset: usize,
467            depth: fidl::encoding::Depth,
468        ) -> fidl::Result<()> {
469            encoder.debug_check_bounds::<DevicePairAddPortRequest>(offset);
470            // Zero out padding regions. There's no need to apply masks
471            // because the unmasked parts will be overwritten by fields.
472            // Write the fields.
473            self.0.encode(encoder, offset + 0, depth)?;
474            Ok(())
475        }
476    }
477
478    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
479        for DevicePairAddPortRequest
480    {
481        #[inline(always)]
482        fn new_empty() -> Self {
483            Self { config: fidl::new_empty!(DevicePairPortConfig, D) }
484        }
485
486        #[inline]
487        unsafe fn decode(
488            &mut self,
489            decoder: &mut fidl::encoding::Decoder<'_, D>,
490            offset: usize,
491            _depth: fidl::encoding::Depth,
492        ) -> fidl::Result<()> {
493            decoder.debug_check_bounds::<Self>(offset);
494            // Verify that padding bytes are zero.
495            fidl::decode!(DevicePairPortConfig, D, &mut self.config, decoder, offset + 0, _depth)?;
496            Ok(())
497        }
498    }
499
500    impl fidl::encoding::ValueTypeMarker for DevicePairRemovePortRequest {
501        type Borrowed<'a> = &'a Self;
502        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
503            value
504        }
505    }
506
507    unsafe impl fidl::encoding::TypeMarker for DevicePairRemovePortRequest {
508        type Owned = Self;
509
510        #[inline(always)]
511        fn inline_align(_context: fidl::encoding::Context) -> usize {
512            1
513        }
514
515        #[inline(always)]
516        fn inline_size(_context: fidl::encoding::Context) -> usize {
517            1
518        }
519        #[inline(always)]
520        fn encode_is_copy() -> bool {
521            true
522        }
523
524        #[inline(always)]
525        fn decode_is_copy() -> bool {
526            true
527        }
528    }
529
530    unsafe impl<D: fidl::encoding::ResourceDialect>
531        fidl::encoding::Encode<DevicePairRemovePortRequest, D> for &DevicePairRemovePortRequest
532    {
533        #[inline]
534        unsafe fn encode(
535            self,
536            encoder: &mut fidl::encoding::Encoder<'_, D>,
537            offset: usize,
538            _depth: fidl::encoding::Depth,
539        ) -> fidl::Result<()> {
540            encoder.debug_check_bounds::<DevicePairRemovePortRequest>(offset);
541            unsafe {
542                // Copy the object into the buffer.
543                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
544                (buf_ptr as *mut DevicePairRemovePortRequest)
545                    .write_unaligned((self as *const DevicePairRemovePortRequest).read());
546                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
547                // done second because the memcpy will write garbage to these bytes.
548            }
549            Ok(())
550        }
551    }
552    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<u8, D>>
553        fidl::encoding::Encode<DevicePairRemovePortRequest, D> for (T0,)
554    {
555        #[inline]
556        unsafe fn encode(
557            self,
558            encoder: &mut fidl::encoding::Encoder<'_, D>,
559            offset: usize,
560            depth: fidl::encoding::Depth,
561        ) -> fidl::Result<()> {
562            encoder.debug_check_bounds::<DevicePairRemovePortRequest>(offset);
563            // Zero out padding regions. There's no need to apply masks
564            // because the unmasked parts will be overwritten by fields.
565            // Write the fields.
566            self.0.encode(encoder, offset + 0, depth)?;
567            Ok(())
568        }
569    }
570
571    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
572        for DevicePairRemovePortRequest
573    {
574        #[inline(always)]
575        fn new_empty() -> Self {
576            Self { id: fidl::new_empty!(u8, D) }
577        }
578
579        #[inline]
580        unsafe fn decode(
581            &mut self,
582            decoder: &mut fidl::encoding::Decoder<'_, D>,
583            offset: usize,
584            _depth: fidl::encoding::Depth,
585        ) -> fidl::Result<()> {
586            decoder.debug_check_bounds::<Self>(offset);
587            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
588            // Verify that padding bytes are zero.
589            // Copy from the buffer into the object.
590            unsafe {
591                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 1);
592            }
593            Ok(())
594        }
595    }
596
597    impl fidl::encoding::ValueTypeMarker for DeviceWriteFrameRequest {
598        type Borrowed<'a> = &'a Self;
599        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
600            value
601        }
602    }
603
604    unsafe impl fidl::encoding::TypeMarker for DeviceWriteFrameRequest {
605        type Owned = Self;
606
607        #[inline(always)]
608        fn inline_align(_context: fidl::encoding::Context) -> usize {
609            8
610        }
611
612        #[inline(always)]
613        fn inline_size(_context: fidl::encoding::Context) -> usize {
614            16
615        }
616    }
617
618    unsafe impl<D: fidl::encoding::ResourceDialect>
619        fidl::encoding::Encode<DeviceWriteFrameRequest, D> for &DeviceWriteFrameRequest
620    {
621        #[inline]
622        unsafe fn encode(
623            self,
624            encoder: &mut fidl::encoding::Encoder<'_, D>,
625            offset: usize,
626            _depth: fidl::encoding::Depth,
627        ) -> fidl::Result<()> {
628            encoder.debug_check_bounds::<DeviceWriteFrameRequest>(offset);
629            // Delegate to tuple encoding.
630            fidl::encoding::Encode::<DeviceWriteFrameRequest, D>::encode(
631                (<Frame as fidl::encoding::ValueTypeMarker>::borrow(&self.frame),),
632                encoder,
633                offset,
634                _depth,
635            )
636        }
637    }
638    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<Frame, D>>
639        fidl::encoding::Encode<DeviceWriteFrameRequest, D> for (T0,)
640    {
641        #[inline]
642        unsafe fn encode(
643            self,
644            encoder: &mut fidl::encoding::Encoder<'_, D>,
645            offset: usize,
646            depth: fidl::encoding::Depth,
647        ) -> fidl::Result<()> {
648            encoder.debug_check_bounds::<DeviceWriteFrameRequest>(offset);
649            // Zero out padding regions. There's no need to apply masks
650            // because the unmasked parts will be overwritten by fields.
651            // Write the fields.
652            self.0.encode(encoder, offset + 0, depth)?;
653            Ok(())
654        }
655    }
656
657    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
658        for DeviceWriteFrameRequest
659    {
660        #[inline(always)]
661        fn new_empty() -> Self {
662            Self { frame: fidl::new_empty!(Frame, D) }
663        }
664
665        #[inline]
666        unsafe fn decode(
667            &mut self,
668            decoder: &mut fidl::encoding::Decoder<'_, D>,
669            offset: usize,
670            _depth: fidl::encoding::Depth,
671        ) -> fidl::Result<()> {
672            decoder.debug_check_bounds::<Self>(offset);
673            // Verify that padding bytes are zero.
674            fidl::decode!(Frame, D, &mut self.frame, decoder, offset + 0, _depth)?;
675            Ok(())
676        }
677    }
678
679    impl fidl::encoding::ValueTypeMarker for DeviceReadFrameResponse {
680        type Borrowed<'a> = &'a Self;
681        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
682            value
683        }
684    }
685
686    unsafe impl fidl::encoding::TypeMarker for DeviceReadFrameResponse {
687        type Owned = Self;
688
689        #[inline(always)]
690        fn inline_align(_context: fidl::encoding::Context) -> usize {
691            8
692        }
693
694        #[inline(always)]
695        fn inline_size(_context: fidl::encoding::Context) -> usize {
696            16
697        }
698    }
699
700    unsafe impl<D: fidl::encoding::ResourceDialect>
701        fidl::encoding::Encode<DeviceReadFrameResponse, D> for &DeviceReadFrameResponse
702    {
703        #[inline]
704        unsafe fn encode(
705            self,
706            encoder: &mut fidl::encoding::Encoder<'_, D>,
707            offset: usize,
708            _depth: fidl::encoding::Depth,
709        ) -> fidl::Result<()> {
710            encoder.debug_check_bounds::<DeviceReadFrameResponse>(offset);
711            // Delegate to tuple encoding.
712            fidl::encoding::Encode::<DeviceReadFrameResponse, D>::encode(
713                (<Frame as fidl::encoding::ValueTypeMarker>::borrow(&self.frame),),
714                encoder,
715                offset,
716                _depth,
717            )
718        }
719    }
720    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<Frame, D>>
721        fidl::encoding::Encode<DeviceReadFrameResponse, D> for (T0,)
722    {
723        #[inline]
724        unsafe fn encode(
725            self,
726            encoder: &mut fidl::encoding::Encoder<'_, D>,
727            offset: usize,
728            depth: fidl::encoding::Depth,
729        ) -> fidl::Result<()> {
730            encoder.debug_check_bounds::<DeviceReadFrameResponse>(offset);
731            // Zero out padding regions. There's no need to apply masks
732            // because the unmasked parts will be overwritten by fields.
733            // Write the fields.
734            self.0.encode(encoder, offset + 0, depth)?;
735            Ok(())
736        }
737    }
738
739    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
740        for DeviceReadFrameResponse
741    {
742        #[inline(always)]
743        fn new_empty() -> Self {
744            Self { frame: fidl::new_empty!(Frame, D) }
745        }
746
747        #[inline]
748        unsafe fn decode(
749            &mut self,
750            decoder: &mut fidl::encoding::Decoder<'_, D>,
751            offset: usize,
752            _depth: fidl::encoding::Depth,
753        ) -> fidl::Result<()> {
754            decoder.debug_check_bounds::<Self>(offset);
755            // Verify that padding bytes are zero.
756            fidl::decode!(Frame, D, &mut self.frame, decoder, offset + 0, _depth)?;
757            Ok(())
758        }
759    }
760
761    impl fidl::encoding::ValueTypeMarker for FrameMetadata {
762        type Borrowed<'a> = &'a Self;
763        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
764            value
765        }
766    }
767
768    unsafe impl fidl::encoding::TypeMarker for FrameMetadata {
769        type Owned = Self;
770
771        #[inline(always)]
772        fn inline_align(_context: fidl::encoding::Context) -> usize {
773            4
774        }
775
776        #[inline(always)]
777        fn inline_size(_context: fidl::encoding::Context) -> usize {
778            4
779        }
780        #[inline(always)]
781        fn encode_is_copy() -> bool {
782            true
783        }
784
785        #[inline(always)]
786        fn decode_is_copy() -> bool {
787            true
788        }
789    }
790
791    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<FrameMetadata, D>
792        for &FrameMetadata
793    {
794        #[inline]
795        unsafe fn encode(
796            self,
797            encoder: &mut fidl::encoding::Encoder<'_, D>,
798            offset: usize,
799            _depth: fidl::encoding::Depth,
800        ) -> fidl::Result<()> {
801            encoder.debug_check_bounds::<FrameMetadata>(offset);
802            unsafe {
803                // Copy the object into the buffer.
804                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
805                (buf_ptr as *mut FrameMetadata)
806                    .write_unaligned((self as *const FrameMetadata).read());
807                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
808                // done second because the memcpy will write garbage to these bytes.
809            }
810            Ok(())
811        }
812    }
813    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<u32, D>>
814        fidl::encoding::Encode<FrameMetadata, D> for (T0,)
815    {
816        #[inline]
817        unsafe fn encode(
818            self,
819            encoder: &mut fidl::encoding::Encoder<'_, D>,
820            offset: usize,
821            depth: fidl::encoding::Depth,
822        ) -> fidl::Result<()> {
823            encoder.debug_check_bounds::<FrameMetadata>(offset);
824            // Zero out padding regions. There's no need to apply masks
825            // because the unmasked parts will be overwritten by fields.
826            // Write the fields.
827            self.0.encode(encoder, offset + 0, depth)?;
828            Ok(())
829        }
830    }
831
832    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for FrameMetadata {
833        #[inline(always)]
834        fn new_empty() -> Self {
835            Self { flags: fidl::new_empty!(u32, D) }
836        }
837
838        #[inline]
839        unsafe fn decode(
840            &mut self,
841            decoder: &mut fidl::encoding::Decoder<'_, D>,
842            offset: usize,
843            _depth: fidl::encoding::Depth,
844        ) -> fidl::Result<()> {
845            decoder.debug_check_bounds::<Self>(offset);
846            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
847            // Verify that padding bytes are zero.
848            // Copy from the buffer into the object.
849            unsafe {
850                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 4);
851            }
852            Ok(())
853        }
854    }
855
856    impl fidl::encoding::ValueTypeMarker for PortGetStateResponse {
857        type Borrowed<'a> = &'a Self;
858        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
859            value
860        }
861    }
862
863    unsafe impl fidl::encoding::TypeMarker for PortGetStateResponse {
864        type Owned = Self;
865
866        #[inline(always)]
867        fn inline_align(_context: fidl::encoding::Context) -> usize {
868            8
869        }
870
871        #[inline(always)]
872        fn inline_size(_context: fidl::encoding::Context) -> usize {
873            16
874        }
875    }
876
877    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortGetStateResponse, D>
878        for &PortGetStateResponse
879    {
880        #[inline]
881        unsafe fn encode(
882            self,
883            encoder: &mut fidl::encoding::Encoder<'_, D>,
884            offset: usize,
885            _depth: fidl::encoding::Depth,
886        ) -> fidl::Result<()> {
887            encoder.debug_check_bounds::<PortGetStateResponse>(offset);
888            // Delegate to tuple encoding.
889            fidl::encoding::Encode::<PortGetStateResponse, D>::encode(
890                (<InternalState as fidl::encoding::ValueTypeMarker>::borrow(&self.state),),
891                encoder,
892                offset,
893                _depth,
894            )
895        }
896    }
897    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<InternalState, D>>
898        fidl::encoding::Encode<PortGetStateResponse, D> for (T0,)
899    {
900        #[inline]
901        unsafe fn encode(
902            self,
903            encoder: &mut fidl::encoding::Encoder<'_, D>,
904            offset: usize,
905            depth: fidl::encoding::Depth,
906        ) -> fidl::Result<()> {
907            encoder.debug_check_bounds::<PortGetStateResponse>(offset);
908            // Zero out padding regions. There's no need to apply masks
909            // because the unmasked parts will be overwritten by fields.
910            // Write the fields.
911            self.0.encode(encoder, offset + 0, depth)?;
912            Ok(())
913        }
914    }
915
916    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortGetStateResponse {
917        #[inline(always)]
918        fn new_empty() -> Self {
919            Self { state: fidl::new_empty!(InternalState, D) }
920        }
921
922        #[inline]
923        unsafe fn decode(
924            &mut self,
925            decoder: &mut fidl::encoding::Decoder<'_, D>,
926            offset: usize,
927            _depth: fidl::encoding::Depth,
928        ) -> fidl::Result<()> {
929            decoder.debug_check_bounds::<Self>(offset);
930            // Verify that padding bytes are zero.
931            fidl::decode!(InternalState, D, &mut self.state, decoder, offset + 0, _depth)?;
932            Ok(())
933        }
934    }
935
936    impl fidl::encoding::ValueTypeMarker for PortSetOnlineRequest {
937        type Borrowed<'a> = &'a Self;
938        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
939            value
940        }
941    }
942
943    unsafe impl fidl::encoding::TypeMarker for PortSetOnlineRequest {
944        type Owned = Self;
945
946        #[inline(always)]
947        fn inline_align(_context: fidl::encoding::Context) -> usize {
948            1
949        }
950
951        #[inline(always)]
952        fn inline_size(_context: fidl::encoding::Context) -> usize {
953            1
954        }
955    }
956
957    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortSetOnlineRequest, D>
958        for &PortSetOnlineRequest
959    {
960        #[inline]
961        unsafe fn encode(
962            self,
963            encoder: &mut fidl::encoding::Encoder<'_, D>,
964            offset: usize,
965            _depth: fidl::encoding::Depth,
966        ) -> fidl::Result<()> {
967            encoder.debug_check_bounds::<PortSetOnlineRequest>(offset);
968            // Delegate to tuple encoding.
969            fidl::encoding::Encode::<PortSetOnlineRequest, D>::encode(
970                (<bool as fidl::encoding::ValueTypeMarker>::borrow(&self.online),),
971                encoder,
972                offset,
973                _depth,
974            )
975        }
976    }
977    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<bool, D>>
978        fidl::encoding::Encode<PortSetOnlineRequest, D> for (T0,)
979    {
980        #[inline]
981        unsafe fn encode(
982            self,
983            encoder: &mut fidl::encoding::Encoder<'_, D>,
984            offset: usize,
985            depth: fidl::encoding::Depth,
986        ) -> fidl::Result<()> {
987            encoder.debug_check_bounds::<PortSetOnlineRequest>(offset);
988            // Zero out padding regions. There's no need to apply masks
989            // because the unmasked parts will be overwritten by fields.
990            // Write the fields.
991            self.0.encode(encoder, offset + 0, depth)?;
992            Ok(())
993        }
994    }
995
996    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortSetOnlineRequest {
997        #[inline(always)]
998        fn new_empty() -> Self {
999            Self { online: fidl::new_empty!(bool, D) }
1000        }
1001
1002        #[inline]
1003        unsafe fn decode(
1004            &mut self,
1005            decoder: &mut fidl::encoding::Decoder<'_, D>,
1006            offset: usize,
1007            _depth: fidl::encoding::Depth,
1008        ) -> fidl::Result<()> {
1009            decoder.debug_check_bounds::<Self>(offset);
1010            // Verify that padding bytes are zero.
1011            fidl::decode!(bool, D, &mut self.online, decoder, offset + 0, _depth)?;
1012            Ok(())
1013        }
1014    }
1015
1016    impl fidl::encoding::ValueTypeMarker for PortWatchStateResponse {
1017        type Borrowed<'a> = &'a Self;
1018        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1019            value
1020        }
1021    }
1022
1023    unsafe impl fidl::encoding::TypeMarker for PortWatchStateResponse {
1024        type Owned = Self;
1025
1026        #[inline(always)]
1027        fn inline_align(_context: fidl::encoding::Context) -> usize {
1028            8
1029        }
1030
1031        #[inline(always)]
1032        fn inline_size(_context: fidl::encoding::Context) -> usize {
1033            16
1034        }
1035    }
1036
1037    unsafe impl<D: fidl::encoding::ResourceDialect>
1038        fidl::encoding::Encode<PortWatchStateResponse, D> for &PortWatchStateResponse
1039    {
1040        #[inline]
1041        unsafe fn encode(
1042            self,
1043            encoder: &mut fidl::encoding::Encoder<'_, D>,
1044            offset: usize,
1045            _depth: fidl::encoding::Depth,
1046        ) -> fidl::Result<()> {
1047            encoder.debug_check_bounds::<PortWatchStateResponse>(offset);
1048            // Delegate to tuple encoding.
1049            fidl::encoding::Encode::<PortWatchStateResponse, D>::encode(
1050                (<InternalState as fidl::encoding::ValueTypeMarker>::borrow(&self.state),),
1051                encoder,
1052                offset,
1053                _depth,
1054            )
1055        }
1056    }
1057    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<InternalState, D>>
1058        fidl::encoding::Encode<PortWatchStateResponse, D> for (T0,)
1059    {
1060        #[inline]
1061        unsafe fn encode(
1062            self,
1063            encoder: &mut fidl::encoding::Encoder<'_, D>,
1064            offset: usize,
1065            depth: fidl::encoding::Depth,
1066        ) -> fidl::Result<()> {
1067            encoder.debug_check_bounds::<PortWatchStateResponse>(offset);
1068            // Zero out padding regions. There's no need to apply masks
1069            // because the unmasked parts will be overwritten by fields.
1070            // Write the fields.
1071            self.0.encode(encoder, offset + 0, depth)?;
1072            Ok(())
1073        }
1074    }
1075
1076    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1077        for PortWatchStateResponse
1078    {
1079        #[inline(always)]
1080        fn new_empty() -> Self {
1081            Self { state: fidl::new_empty!(InternalState, D) }
1082        }
1083
1084        #[inline]
1085        unsafe fn decode(
1086            &mut self,
1087            decoder: &mut fidl::encoding::Decoder<'_, D>,
1088            offset: usize,
1089            _depth: fidl::encoding::Depth,
1090        ) -> fidl::Result<()> {
1091            decoder.debug_check_bounds::<Self>(offset);
1092            // Verify that padding bytes are zero.
1093            fidl::decode!(InternalState, D, &mut self.state, decoder, offset + 0, _depth)?;
1094            Ok(())
1095        }
1096    }
1097
1098    impl BaseDeviceConfig {
1099        #[inline(always)]
1100        fn max_ordinal_present(&self) -> u64 {
1101            if let Some(_) = self.min_rx_buffer_length {
1102                return 3;
1103            }
1104            if let Some(_) = self.min_tx_buffer_length {
1105                return 2;
1106            }
1107            if let Some(_) = self.report_metadata {
1108                return 1;
1109            }
1110            0
1111        }
1112    }
1113
1114    impl fidl::encoding::ValueTypeMarker for BaseDeviceConfig {
1115        type Borrowed<'a> = &'a Self;
1116        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1117            value
1118        }
1119    }
1120
1121    unsafe impl fidl::encoding::TypeMarker for BaseDeviceConfig {
1122        type Owned = Self;
1123
1124        #[inline(always)]
1125        fn inline_align(_context: fidl::encoding::Context) -> usize {
1126            8
1127        }
1128
1129        #[inline(always)]
1130        fn inline_size(_context: fidl::encoding::Context) -> usize {
1131            16
1132        }
1133    }
1134
1135    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<BaseDeviceConfig, D>
1136        for &BaseDeviceConfig
1137    {
1138        unsafe fn encode(
1139            self,
1140            encoder: &mut fidl::encoding::Encoder<'_, D>,
1141            offset: usize,
1142            mut depth: fidl::encoding::Depth,
1143        ) -> fidl::Result<()> {
1144            encoder.debug_check_bounds::<BaseDeviceConfig>(offset);
1145            // Vector header
1146            let max_ordinal: u64 = self.max_ordinal_present();
1147            encoder.write_num(max_ordinal, offset);
1148            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1149            // Calling encoder.out_of_line_offset(0) is not allowed.
1150            if max_ordinal == 0 {
1151                return Ok(());
1152            }
1153            depth.increment()?;
1154            let envelope_size = 8;
1155            let bytes_len = max_ordinal as usize * envelope_size;
1156            #[allow(unused_variables)]
1157            let offset = encoder.out_of_line_offset(bytes_len);
1158            let mut _prev_end_offset: usize = 0;
1159            if 1 > max_ordinal {
1160                return Ok(());
1161            }
1162
1163            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1164            // are envelope_size bytes.
1165            let cur_offset: usize = (1 - 1) * envelope_size;
1166
1167            // Zero reserved fields.
1168            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1169
1170            // Safety:
1171            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1172            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1173            //   envelope_size bytes, there is always sufficient room.
1174            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1175                self.report_metadata
1176                    .as_ref()
1177                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1178                encoder,
1179                offset + cur_offset,
1180                depth,
1181            )?;
1182
1183            _prev_end_offset = cur_offset + envelope_size;
1184            if 2 > max_ordinal {
1185                return Ok(());
1186            }
1187
1188            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1189            // are envelope_size bytes.
1190            let cur_offset: usize = (2 - 1) * envelope_size;
1191
1192            // Zero reserved fields.
1193            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1194
1195            // Safety:
1196            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1197            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1198            //   envelope_size bytes, there is always sufficient room.
1199            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1200                self.min_tx_buffer_length
1201                    .as_ref()
1202                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1203                encoder,
1204                offset + cur_offset,
1205                depth,
1206            )?;
1207
1208            _prev_end_offset = cur_offset + envelope_size;
1209            if 3 > max_ordinal {
1210                return Ok(());
1211            }
1212
1213            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1214            // are envelope_size bytes.
1215            let cur_offset: usize = (3 - 1) * envelope_size;
1216
1217            // Zero reserved fields.
1218            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1219
1220            // Safety:
1221            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1222            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1223            //   envelope_size bytes, there is always sufficient room.
1224            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1225                self.min_rx_buffer_length
1226                    .as_ref()
1227                    .map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1228                encoder,
1229                offset + cur_offset,
1230                depth,
1231            )?;
1232
1233            _prev_end_offset = cur_offset + envelope_size;
1234
1235            Ok(())
1236        }
1237    }
1238
1239    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for BaseDeviceConfig {
1240        #[inline(always)]
1241        fn new_empty() -> Self {
1242            Self::default()
1243        }
1244
1245        unsafe fn decode(
1246            &mut self,
1247            decoder: &mut fidl::encoding::Decoder<'_, D>,
1248            offset: usize,
1249            mut depth: fidl::encoding::Depth,
1250        ) -> fidl::Result<()> {
1251            decoder.debug_check_bounds::<Self>(offset);
1252            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1253                None => return Err(fidl::Error::NotNullable),
1254                Some(len) => len,
1255            };
1256            // Calling decoder.out_of_line_offset(0) is not allowed.
1257            if len == 0 {
1258                return Ok(());
1259            };
1260            depth.increment()?;
1261            let envelope_size = 8;
1262            let bytes_len = len * envelope_size;
1263            let offset = decoder.out_of_line_offset(bytes_len)?;
1264            // Decode the envelope for each type.
1265            let mut _next_ordinal_to_read = 0;
1266            let mut next_offset = offset;
1267            let end_offset = offset + bytes_len;
1268            _next_ordinal_to_read += 1;
1269            if next_offset >= end_offset {
1270                return Ok(());
1271            }
1272
1273            // Decode unknown envelopes for gaps in ordinals.
1274            while _next_ordinal_to_read < 1 {
1275                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1276                _next_ordinal_to_read += 1;
1277                next_offset += envelope_size;
1278            }
1279
1280            let next_out_of_line = decoder.next_out_of_line();
1281            let handles_before = decoder.remaining_handles();
1282            if let Some((inlined, num_bytes, num_handles)) =
1283                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1284            {
1285                let member_inline_size =
1286                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1287                if inlined != (member_inline_size <= 4) {
1288                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1289                }
1290                let inner_offset;
1291                let mut inner_depth = depth.clone();
1292                if inlined {
1293                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1294                    inner_offset = next_offset;
1295                } else {
1296                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1297                    inner_depth.increment()?;
1298                }
1299                let val_ref = self.report_metadata.get_or_insert_with(|| fidl::new_empty!(bool, D));
1300                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1301                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1302                {
1303                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1304                }
1305                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1306                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1307                }
1308            }
1309
1310            next_offset += envelope_size;
1311            _next_ordinal_to_read += 1;
1312            if next_offset >= end_offset {
1313                return Ok(());
1314            }
1315
1316            // Decode unknown envelopes for gaps in ordinals.
1317            while _next_ordinal_to_read < 2 {
1318                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1319                _next_ordinal_to_read += 1;
1320                next_offset += envelope_size;
1321            }
1322
1323            let next_out_of_line = decoder.next_out_of_line();
1324            let handles_before = decoder.remaining_handles();
1325            if let Some((inlined, num_bytes, num_handles)) =
1326                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1327            {
1328                let member_inline_size =
1329                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1330                if inlined != (member_inline_size <= 4) {
1331                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1332                }
1333                let inner_offset;
1334                let mut inner_depth = depth.clone();
1335                if inlined {
1336                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1337                    inner_offset = next_offset;
1338                } else {
1339                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1340                    inner_depth.increment()?;
1341                }
1342                let val_ref =
1343                    self.min_tx_buffer_length.get_or_insert_with(|| fidl::new_empty!(u32, D));
1344                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1345                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1346                {
1347                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1348                }
1349                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1350                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1351                }
1352            }
1353
1354            next_offset += envelope_size;
1355            _next_ordinal_to_read += 1;
1356            if next_offset >= end_offset {
1357                return Ok(());
1358            }
1359
1360            // Decode unknown envelopes for gaps in ordinals.
1361            while _next_ordinal_to_read < 3 {
1362                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1363                _next_ordinal_to_read += 1;
1364                next_offset += envelope_size;
1365            }
1366
1367            let next_out_of_line = decoder.next_out_of_line();
1368            let handles_before = decoder.remaining_handles();
1369            if let Some((inlined, num_bytes, num_handles)) =
1370                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1371            {
1372                let member_inline_size =
1373                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1374                if inlined != (member_inline_size <= 4) {
1375                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1376                }
1377                let inner_offset;
1378                let mut inner_depth = depth.clone();
1379                if inlined {
1380                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1381                    inner_offset = next_offset;
1382                } else {
1383                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1384                    inner_depth.increment()?;
1385                }
1386                let val_ref =
1387                    self.min_rx_buffer_length.get_or_insert_with(|| fidl::new_empty!(u32, D));
1388                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1389                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1390                {
1391                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1392                }
1393                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1394                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1395                }
1396            }
1397
1398            next_offset += envelope_size;
1399
1400            // Decode the remaining unknown envelopes.
1401            while next_offset < end_offset {
1402                _next_ordinal_to_read += 1;
1403                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1404                next_offset += envelope_size;
1405            }
1406
1407            Ok(())
1408        }
1409    }
1410
1411    impl BasePortConfig {
1412        #[inline(always)]
1413        fn max_ordinal_present(&self) -> u64 {
1414            if let Some(_) = self.rx_checksum_offload {
1415                return 6;
1416            }
1417            if let Some(_) = self.port_class {
1418                return 5;
1419            }
1420            if let Some(_) = self.tx_types {
1421                return 4;
1422            }
1423            if let Some(_) = self.rx_types {
1424                return 3;
1425            }
1426            if let Some(_) = self.mtu {
1427                return 2;
1428            }
1429            if let Some(_) = self.id {
1430                return 1;
1431            }
1432            0
1433        }
1434    }
1435
1436    impl fidl::encoding::ValueTypeMarker for BasePortConfig {
1437        type Borrowed<'a> = &'a Self;
1438        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1439            value
1440        }
1441    }
1442
1443    unsafe impl fidl::encoding::TypeMarker for BasePortConfig {
1444        type Owned = Self;
1445
1446        #[inline(always)]
1447        fn inline_align(_context: fidl::encoding::Context) -> usize {
1448            8
1449        }
1450
1451        #[inline(always)]
1452        fn inline_size(_context: fidl::encoding::Context) -> usize {
1453            16
1454        }
1455    }
1456
1457    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<BasePortConfig, D>
1458        for &BasePortConfig
1459    {
1460        unsafe fn encode(
1461            self,
1462            encoder: &mut fidl::encoding::Encoder<'_, D>,
1463            offset: usize,
1464            mut depth: fidl::encoding::Depth,
1465        ) -> fidl::Result<()> {
1466            encoder.debug_check_bounds::<BasePortConfig>(offset);
1467            // Vector header
1468            let max_ordinal: u64 = self.max_ordinal_present();
1469            encoder.write_num(max_ordinal, offset);
1470            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1471            // Calling encoder.out_of_line_offset(0) is not allowed.
1472            if max_ordinal == 0 {
1473                return Ok(());
1474            }
1475            depth.increment()?;
1476            let envelope_size = 8;
1477            let bytes_len = max_ordinal as usize * envelope_size;
1478            #[allow(unused_variables)]
1479            let offset = encoder.out_of_line_offset(bytes_len);
1480            let mut _prev_end_offset: usize = 0;
1481            if 1 > max_ordinal {
1482                return Ok(());
1483            }
1484
1485            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1486            // are envelope_size bytes.
1487            let cur_offset: usize = (1 - 1) * envelope_size;
1488
1489            // Zero reserved fields.
1490            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1491
1492            // Safety:
1493            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1494            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1495            //   envelope_size bytes, there is always sufficient room.
1496            fidl::encoding::encode_in_envelope_optional::<u8, D>(
1497                self.id.as_ref().map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
1498                encoder,
1499                offset + cur_offset,
1500                depth,
1501            )?;
1502
1503            _prev_end_offset = cur_offset + envelope_size;
1504            if 2 > max_ordinal {
1505                return Ok(());
1506            }
1507
1508            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1509            // are envelope_size bytes.
1510            let cur_offset: usize = (2 - 1) * envelope_size;
1511
1512            // Zero reserved fields.
1513            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1514
1515            // Safety:
1516            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1517            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1518            //   envelope_size bytes, there is always sufficient room.
1519            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1520                self.mtu.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1521                encoder,
1522                offset + cur_offset,
1523                depth,
1524            )?;
1525
1526            _prev_end_offset = cur_offset + envelope_size;
1527            if 3 > max_ordinal {
1528                return Ok(());
1529            }
1530
1531            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1532            // are envelope_size bytes.
1533            let cur_offset: usize = (3 - 1) * envelope_size;
1534
1535            // Zero reserved fields.
1536            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1537
1538            // Safety:
1539            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1540            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1541            //   envelope_size bytes, there is always sufficient room.
1542            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<fidl_fuchsia_hardware_network_common::FrameType, 4>, D>(
1543            self.rx_types.as_ref().map(<fidl::encoding::Vector<fidl_fuchsia_hardware_network_common::FrameType, 4> as fidl::encoding::ValueTypeMarker>::borrow),
1544            encoder, offset + cur_offset, depth
1545        )?;
1546
1547            _prev_end_offset = cur_offset + envelope_size;
1548            if 4 > max_ordinal {
1549                return Ok(());
1550            }
1551
1552            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1553            // are envelope_size bytes.
1554            let cur_offset: usize = (4 - 1) * envelope_size;
1555
1556            // Zero reserved fields.
1557            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1558
1559            // Safety:
1560            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1561            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1562            //   envelope_size bytes, there is always sufficient room.
1563            fidl::encoding::encode_in_envelope_optional::<
1564                fidl::encoding::Vector<fidl_fuchsia_hardware_network_common::FrameTypeSupport, 4>,
1565                D,
1566            >(
1567                self.tx_types.as_ref().map(
1568                    <fidl::encoding::Vector<
1569                        fidl_fuchsia_hardware_network_common::FrameTypeSupport,
1570                        4,
1571                    > as fidl::encoding::ValueTypeMarker>::borrow,
1572                ),
1573                encoder,
1574                offset + cur_offset,
1575                depth,
1576            )?;
1577
1578            _prev_end_offset = cur_offset + envelope_size;
1579            if 5 > max_ordinal {
1580                return Ok(());
1581            }
1582
1583            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1584            // are envelope_size bytes.
1585            let cur_offset: usize = (5 - 1) * envelope_size;
1586
1587            // Zero reserved fields.
1588            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1589
1590            // Safety:
1591            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1592            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1593            //   envelope_size bytes, there is always sufficient room.
1594            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_hardware_network_common::PortClass, D>(
1595            self.port_class.as_ref().map(<fidl_fuchsia_hardware_network_common::PortClass as fidl::encoding::ValueTypeMarker>::borrow),
1596            encoder, offset + cur_offset, depth
1597        )?;
1598
1599            _prev_end_offset = cur_offset + envelope_size;
1600            if 6 > max_ordinal {
1601                return Ok(());
1602            }
1603
1604            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1605            // are envelope_size bytes.
1606            let cur_offset: usize = (6 - 1) * envelope_size;
1607
1608            // Zero reserved fields.
1609            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1610
1611            // Safety:
1612            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1613            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1614            //   envelope_size bytes, there is always sufficient room.
1615            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1616                self.rx_checksum_offload
1617                    .as_ref()
1618                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1619                encoder,
1620                offset + cur_offset,
1621                depth,
1622            )?;
1623
1624            _prev_end_offset = cur_offset + envelope_size;
1625
1626            Ok(())
1627        }
1628    }
1629
1630    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for BasePortConfig {
1631        #[inline(always)]
1632        fn new_empty() -> Self {
1633            Self::default()
1634        }
1635
1636        unsafe fn decode(
1637            &mut self,
1638            decoder: &mut fidl::encoding::Decoder<'_, D>,
1639            offset: usize,
1640            mut depth: fidl::encoding::Depth,
1641        ) -> fidl::Result<()> {
1642            decoder.debug_check_bounds::<Self>(offset);
1643            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1644                None => return Err(fidl::Error::NotNullable),
1645                Some(len) => len,
1646            };
1647            // Calling decoder.out_of_line_offset(0) is not allowed.
1648            if len == 0 {
1649                return Ok(());
1650            };
1651            depth.increment()?;
1652            let envelope_size = 8;
1653            let bytes_len = len * envelope_size;
1654            let offset = decoder.out_of_line_offset(bytes_len)?;
1655            // Decode the envelope for each type.
1656            let mut _next_ordinal_to_read = 0;
1657            let mut next_offset = offset;
1658            let end_offset = offset + bytes_len;
1659            _next_ordinal_to_read += 1;
1660            if next_offset >= end_offset {
1661                return Ok(());
1662            }
1663
1664            // Decode unknown envelopes for gaps in ordinals.
1665            while _next_ordinal_to_read < 1 {
1666                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1667                _next_ordinal_to_read += 1;
1668                next_offset += envelope_size;
1669            }
1670
1671            let next_out_of_line = decoder.next_out_of_line();
1672            let handles_before = decoder.remaining_handles();
1673            if let Some((inlined, num_bytes, num_handles)) =
1674                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1675            {
1676                let member_inline_size =
1677                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1678                if inlined != (member_inline_size <= 4) {
1679                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1680                }
1681                let inner_offset;
1682                let mut inner_depth = depth.clone();
1683                if inlined {
1684                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1685                    inner_offset = next_offset;
1686                } else {
1687                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1688                    inner_depth.increment()?;
1689                }
1690                let val_ref = self.id.get_or_insert_with(|| fidl::new_empty!(u8, D));
1691                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
1692                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1693                {
1694                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1695                }
1696                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1697                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1698                }
1699            }
1700
1701            next_offset += envelope_size;
1702            _next_ordinal_to_read += 1;
1703            if next_offset >= end_offset {
1704                return Ok(());
1705            }
1706
1707            // Decode unknown envelopes for gaps in ordinals.
1708            while _next_ordinal_to_read < 2 {
1709                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1710                _next_ordinal_to_read += 1;
1711                next_offset += envelope_size;
1712            }
1713
1714            let next_out_of_line = decoder.next_out_of_line();
1715            let handles_before = decoder.remaining_handles();
1716            if let Some((inlined, num_bytes, num_handles)) =
1717                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1718            {
1719                let member_inline_size =
1720                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1721                if inlined != (member_inline_size <= 4) {
1722                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1723                }
1724                let inner_offset;
1725                let mut inner_depth = depth.clone();
1726                if inlined {
1727                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1728                    inner_offset = next_offset;
1729                } else {
1730                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1731                    inner_depth.increment()?;
1732                }
1733                let val_ref = self.mtu.get_or_insert_with(|| fidl::new_empty!(u32, D));
1734                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1735                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1736                {
1737                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1738                }
1739                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1740                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1741                }
1742            }
1743
1744            next_offset += envelope_size;
1745            _next_ordinal_to_read += 1;
1746            if next_offset >= end_offset {
1747                return Ok(());
1748            }
1749
1750            // Decode unknown envelopes for gaps in ordinals.
1751            while _next_ordinal_to_read < 3 {
1752                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1753                _next_ordinal_to_read += 1;
1754                next_offset += envelope_size;
1755            }
1756
1757            let next_out_of_line = decoder.next_out_of_line();
1758            let handles_before = decoder.remaining_handles();
1759            if let Some((inlined, num_bytes, num_handles)) =
1760                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1761            {
1762                let member_inline_size = <fidl::encoding::Vector<
1763                    fidl_fuchsia_hardware_network_common::FrameType,
1764                    4,
1765                > as fidl::encoding::TypeMarker>::inline_size(
1766                    decoder.context
1767                );
1768                if inlined != (member_inline_size <= 4) {
1769                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1770                }
1771                let inner_offset;
1772                let mut inner_depth = depth.clone();
1773                if inlined {
1774                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1775                    inner_offset = next_offset;
1776                } else {
1777                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1778                    inner_depth.increment()?;
1779                }
1780                let val_ref =
1781                self.rx_types.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<fidl_fuchsia_hardware_network_common::FrameType, 4>, D));
1782                fidl::decode!(fidl::encoding::Vector<fidl_fuchsia_hardware_network_common::FrameType, 4>, D, val_ref, decoder, inner_offset, inner_depth)?;
1783                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1784                {
1785                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1786                }
1787                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1788                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1789                }
1790            }
1791
1792            next_offset += envelope_size;
1793            _next_ordinal_to_read += 1;
1794            if next_offset >= end_offset {
1795                return Ok(());
1796            }
1797
1798            // Decode unknown envelopes for gaps in ordinals.
1799            while _next_ordinal_to_read < 4 {
1800                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1801                _next_ordinal_to_read += 1;
1802                next_offset += envelope_size;
1803            }
1804
1805            let next_out_of_line = decoder.next_out_of_line();
1806            let handles_before = decoder.remaining_handles();
1807            if let Some((inlined, num_bytes, num_handles)) =
1808                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1809            {
1810                let member_inline_size = <fidl::encoding::Vector<
1811                    fidl_fuchsia_hardware_network_common::FrameTypeSupport,
1812                    4,
1813                > as fidl::encoding::TypeMarker>::inline_size(
1814                    decoder.context
1815                );
1816                if inlined != (member_inline_size <= 4) {
1817                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1818                }
1819                let inner_offset;
1820                let mut inner_depth = depth.clone();
1821                if inlined {
1822                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1823                    inner_offset = next_offset;
1824                } else {
1825                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1826                    inner_depth.increment()?;
1827                }
1828                let val_ref =
1829                self.tx_types.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<fidl_fuchsia_hardware_network_common::FrameTypeSupport, 4>, D));
1830                fidl::decode!(fidl::encoding::Vector<fidl_fuchsia_hardware_network_common::FrameTypeSupport, 4>, D, val_ref, decoder, inner_offset, inner_depth)?;
1831                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1832                {
1833                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1834                }
1835                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1836                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1837                }
1838            }
1839
1840            next_offset += envelope_size;
1841            _next_ordinal_to_read += 1;
1842            if next_offset >= end_offset {
1843                return Ok(());
1844            }
1845
1846            // Decode unknown envelopes for gaps in ordinals.
1847            while _next_ordinal_to_read < 5 {
1848                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1849                _next_ordinal_to_read += 1;
1850                next_offset += envelope_size;
1851            }
1852
1853            let next_out_of_line = decoder.next_out_of_line();
1854            let handles_before = decoder.remaining_handles();
1855            if let Some((inlined, num_bytes, num_handles)) =
1856                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1857            {
1858                let member_inline_size = <fidl_fuchsia_hardware_network_common::PortClass as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1859                if inlined != (member_inline_size <= 4) {
1860                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1861                }
1862                let inner_offset;
1863                let mut inner_depth = depth.clone();
1864                if inlined {
1865                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1866                    inner_offset = next_offset;
1867                } else {
1868                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1869                    inner_depth.increment()?;
1870                }
1871                let val_ref = self.port_class.get_or_insert_with(|| {
1872                    fidl::new_empty!(fidl_fuchsia_hardware_network_common::PortClass, D)
1873                });
1874                fidl::decode!(
1875                    fidl_fuchsia_hardware_network_common::PortClass,
1876                    D,
1877                    val_ref,
1878                    decoder,
1879                    inner_offset,
1880                    inner_depth
1881                )?;
1882                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1883                {
1884                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1885                }
1886                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1887                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1888                }
1889            }
1890
1891            next_offset += envelope_size;
1892            _next_ordinal_to_read += 1;
1893            if next_offset >= end_offset {
1894                return Ok(());
1895            }
1896
1897            // Decode unknown envelopes for gaps in ordinals.
1898            while _next_ordinal_to_read < 6 {
1899                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1900                _next_ordinal_to_read += 1;
1901                next_offset += envelope_size;
1902            }
1903
1904            let next_out_of_line = decoder.next_out_of_line();
1905            let handles_before = decoder.remaining_handles();
1906            if let Some((inlined, num_bytes, num_handles)) =
1907                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1908            {
1909                let member_inline_size =
1910                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1911                if inlined != (member_inline_size <= 4) {
1912                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1913                }
1914                let inner_offset;
1915                let mut inner_depth = depth.clone();
1916                if inlined {
1917                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1918                    inner_offset = next_offset;
1919                } else {
1920                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1921                    inner_depth.increment()?;
1922                }
1923                let val_ref =
1924                    self.rx_checksum_offload.get_or_insert_with(|| fidl::new_empty!(bool, D));
1925                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1926                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1927                {
1928                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1929                }
1930                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1931                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1932                }
1933            }
1934
1935            next_offset += envelope_size;
1936
1937            // Decode the remaining unknown envelopes.
1938            while next_offset < end_offset {
1939                _next_ordinal_to_read += 1;
1940                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1941                next_offset += envelope_size;
1942            }
1943
1944            Ok(())
1945        }
1946    }
1947
1948    impl DeviceConfig {
1949        #[inline(always)]
1950        fn max_ordinal_present(&self) -> u64 {
1951            if let Some(_) = self.blocking {
1952                return 2;
1953            }
1954            if let Some(_) = self.base {
1955                return 1;
1956            }
1957            0
1958        }
1959    }
1960
1961    impl fidl::encoding::ValueTypeMarker for DeviceConfig {
1962        type Borrowed<'a> = &'a Self;
1963        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1964            value
1965        }
1966    }
1967
1968    unsafe impl fidl::encoding::TypeMarker for DeviceConfig {
1969        type Owned = Self;
1970
1971        #[inline(always)]
1972        fn inline_align(_context: fidl::encoding::Context) -> usize {
1973            8
1974        }
1975
1976        #[inline(always)]
1977        fn inline_size(_context: fidl::encoding::Context) -> usize {
1978            16
1979        }
1980    }
1981
1982    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DeviceConfig, D>
1983        for &DeviceConfig
1984    {
1985        unsafe fn encode(
1986            self,
1987            encoder: &mut fidl::encoding::Encoder<'_, D>,
1988            offset: usize,
1989            mut depth: fidl::encoding::Depth,
1990        ) -> fidl::Result<()> {
1991            encoder.debug_check_bounds::<DeviceConfig>(offset);
1992            // Vector header
1993            let max_ordinal: u64 = self.max_ordinal_present();
1994            encoder.write_num(max_ordinal, offset);
1995            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1996            // Calling encoder.out_of_line_offset(0) is not allowed.
1997            if max_ordinal == 0 {
1998                return Ok(());
1999            }
2000            depth.increment()?;
2001            let envelope_size = 8;
2002            let bytes_len = max_ordinal as usize * envelope_size;
2003            #[allow(unused_variables)]
2004            let offset = encoder.out_of_line_offset(bytes_len);
2005            let mut _prev_end_offset: usize = 0;
2006            if 1 > max_ordinal {
2007                return Ok(());
2008            }
2009
2010            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2011            // are envelope_size bytes.
2012            let cur_offset: usize = (1 - 1) * envelope_size;
2013
2014            // Zero reserved fields.
2015            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2016
2017            // Safety:
2018            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2019            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2020            //   envelope_size bytes, there is always sufficient room.
2021            fidl::encoding::encode_in_envelope_optional::<BaseDeviceConfig, D>(
2022                self.base
2023                    .as_ref()
2024                    .map(<BaseDeviceConfig as fidl::encoding::ValueTypeMarker>::borrow),
2025                encoder,
2026                offset + cur_offset,
2027                depth,
2028            )?;
2029
2030            _prev_end_offset = cur_offset + envelope_size;
2031            if 2 > max_ordinal {
2032                return Ok(());
2033            }
2034
2035            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2036            // are envelope_size bytes.
2037            let cur_offset: usize = (2 - 1) * envelope_size;
2038
2039            // Zero reserved fields.
2040            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2041
2042            // Safety:
2043            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2044            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2045            //   envelope_size bytes, there is always sufficient room.
2046            fidl::encoding::encode_in_envelope_optional::<bool, D>(
2047                self.blocking.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
2048                encoder,
2049                offset + cur_offset,
2050                depth,
2051            )?;
2052
2053            _prev_end_offset = cur_offset + envelope_size;
2054
2055            Ok(())
2056        }
2057    }
2058
2059    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DeviceConfig {
2060        #[inline(always)]
2061        fn new_empty() -> Self {
2062            Self::default()
2063        }
2064
2065        unsafe fn decode(
2066            &mut self,
2067            decoder: &mut fidl::encoding::Decoder<'_, D>,
2068            offset: usize,
2069            mut depth: fidl::encoding::Depth,
2070        ) -> fidl::Result<()> {
2071            decoder.debug_check_bounds::<Self>(offset);
2072            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2073                None => return Err(fidl::Error::NotNullable),
2074                Some(len) => len,
2075            };
2076            // Calling decoder.out_of_line_offset(0) is not allowed.
2077            if len == 0 {
2078                return Ok(());
2079            };
2080            depth.increment()?;
2081            let envelope_size = 8;
2082            let bytes_len = len * envelope_size;
2083            let offset = decoder.out_of_line_offset(bytes_len)?;
2084            // Decode the envelope for each type.
2085            let mut _next_ordinal_to_read = 0;
2086            let mut next_offset = offset;
2087            let end_offset = offset + bytes_len;
2088            _next_ordinal_to_read += 1;
2089            if next_offset >= end_offset {
2090                return Ok(());
2091            }
2092
2093            // Decode unknown envelopes for gaps in ordinals.
2094            while _next_ordinal_to_read < 1 {
2095                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2096                _next_ordinal_to_read += 1;
2097                next_offset += envelope_size;
2098            }
2099
2100            let next_out_of_line = decoder.next_out_of_line();
2101            let handles_before = decoder.remaining_handles();
2102            if let Some((inlined, num_bytes, num_handles)) =
2103                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2104            {
2105                let member_inline_size =
2106                    <BaseDeviceConfig as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2107                if inlined != (member_inline_size <= 4) {
2108                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2109                }
2110                let inner_offset;
2111                let mut inner_depth = depth.clone();
2112                if inlined {
2113                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2114                    inner_offset = next_offset;
2115                } else {
2116                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2117                    inner_depth.increment()?;
2118                }
2119                let val_ref =
2120                    self.base.get_or_insert_with(|| fidl::new_empty!(BaseDeviceConfig, D));
2121                fidl::decode!(BaseDeviceConfig, D, val_ref, decoder, inner_offset, inner_depth)?;
2122                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2123                {
2124                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2125                }
2126                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2127                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2128                }
2129            }
2130
2131            next_offset += envelope_size;
2132            _next_ordinal_to_read += 1;
2133            if next_offset >= end_offset {
2134                return Ok(());
2135            }
2136
2137            // Decode unknown envelopes for gaps in ordinals.
2138            while _next_ordinal_to_read < 2 {
2139                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2140                _next_ordinal_to_read += 1;
2141                next_offset += envelope_size;
2142            }
2143
2144            let next_out_of_line = decoder.next_out_of_line();
2145            let handles_before = decoder.remaining_handles();
2146            if let Some((inlined, num_bytes, num_handles)) =
2147                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2148            {
2149                let member_inline_size =
2150                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2151                if inlined != (member_inline_size <= 4) {
2152                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2153                }
2154                let inner_offset;
2155                let mut inner_depth = depth.clone();
2156                if inlined {
2157                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2158                    inner_offset = next_offset;
2159                } else {
2160                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2161                    inner_depth.increment()?;
2162                }
2163                let val_ref = self.blocking.get_or_insert_with(|| fidl::new_empty!(bool, D));
2164                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
2165                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2166                {
2167                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2168                }
2169                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2170                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2171                }
2172            }
2173
2174            next_offset += envelope_size;
2175
2176            // Decode the remaining unknown envelopes.
2177            while next_offset < end_offset {
2178                _next_ordinal_to_read += 1;
2179                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2180                next_offset += envelope_size;
2181            }
2182
2183            Ok(())
2184        }
2185    }
2186
2187    impl DevicePairConfig {
2188        #[inline(always)]
2189        fn max_ordinal_present(&self) -> u64 {
2190            if let Some(_) = self.fallible_transmit_right {
2191                return 3;
2192            }
2193            if let Some(_) = self.fallible_transmit_left {
2194                return 2;
2195            }
2196            if let Some(_) = self.base {
2197                return 1;
2198            }
2199            0
2200        }
2201    }
2202
2203    impl fidl::encoding::ValueTypeMarker for DevicePairConfig {
2204        type Borrowed<'a> = &'a Self;
2205        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2206            value
2207        }
2208    }
2209
2210    unsafe impl fidl::encoding::TypeMarker for DevicePairConfig {
2211        type Owned = Self;
2212
2213        #[inline(always)]
2214        fn inline_align(_context: fidl::encoding::Context) -> usize {
2215            8
2216        }
2217
2218        #[inline(always)]
2219        fn inline_size(_context: fidl::encoding::Context) -> usize {
2220            16
2221        }
2222    }
2223
2224    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DevicePairConfig, D>
2225        for &DevicePairConfig
2226    {
2227        unsafe fn encode(
2228            self,
2229            encoder: &mut fidl::encoding::Encoder<'_, D>,
2230            offset: usize,
2231            mut depth: fidl::encoding::Depth,
2232        ) -> fidl::Result<()> {
2233            encoder.debug_check_bounds::<DevicePairConfig>(offset);
2234            // Vector header
2235            let max_ordinal: u64 = self.max_ordinal_present();
2236            encoder.write_num(max_ordinal, offset);
2237            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2238            // Calling encoder.out_of_line_offset(0) is not allowed.
2239            if max_ordinal == 0 {
2240                return Ok(());
2241            }
2242            depth.increment()?;
2243            let envelope_size = 8;
2244            let bytes_len = max_ordinal as usize * envelope_size;
2245            #[allow(unused_variables)]
2246            let offset = encoder.out_of_line_offset(bytes_len);
2247            let mut _prev_end_offset: usize = 0;
2248            if 1 > max_ordinal {
2249                return Ok(());
2250            }
2251
2252            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2253            // are envelope_size bytes.
2254            let cur_offset: usize = (1 - 1) * envelope_size;
2255
2256            // Zero reserved fields.
2257            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2258
2259            // Safety:
2260            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2261            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2262            //   envelope_size bytes, there is always sufficient room.
2263            fidl::encoding::encode_in_envelope_optional::<BaseDeviceConfig, D>(
2264                self.base
2265                    .as_ref()
2266                    .map(<BaseDeviceConfig as fidl::encoding::ValueTypeMarker>::borrow),
2267                encoder,
2268                offset + cur_offset,
2269                depth,
2270            )?;
2271
2272            _prev_end_offset = cur_offset + envelope_size;
2273            if 2 > max_ordinal {
2274                return Ok(());
2275            }
2276
2277            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2278            // are envelope_size bytes.
2279            let cur_offset: usize = (2 - 1) * envelope_size;
2280
2281            // Zero reserved fields.
2282            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2283
2284            // Safety:
2285            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2286            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2287            //   envelope_size bytes, there is always sufficient room.
2288            fidl::encoding::encode_in_envelope_optional::<bool, D>(
2289                self.fallible_transmit_left
2290                    .as_ref()
2291                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
2292                encoder,
2293                offset + cur_offset,
2294                depth,
2295            )?;
2296
2297            _prev_end_offset = cur_offset + envelope_size;
2298            if 3 > max_ordinal {
2299                return Ok(());
2300            }
2301
2302            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2303            // are envelope_size bytes.
2304            let cur_offset: usize = (3 - 1) * envelope_size;
2305
2306            // Zero reserved fields.
2307            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2308
2309            // Safety:
2310            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2311            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2312            //   envelope_size bytes, there is always sufficient room.
2313            fidl::encoding::encode_in_envelope_optional::<bool, D>(
2314                self.fallible_transmit_right
2315                    .as_ref()
2316                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
2317                encoder,
2318                offset + cur_offset,
2319                depth,
2320            )?;
2321
2322            _prev_end_offset = cur_offset + envelope_size;
2323
2324            Ok(())
2325        }
2326    }
2327
2328    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DevicePairConfig {
2329        #[inline(always)]
2330        fn new_empty() -> Self {
2331            Self::default()
2332        }
2333
2334        unsafe fn decode(
2335            &mut self,
2336            decoder: &mut fidl::encoding::Decoder<'_, D>,
2337            offset: usize,
2338            mut depth: fidl::encoding::Depth,
2339        ) -> fidl::Result<()> {
2340            decoder.debug_check_bounds::<Self>(offset);
2341            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2342                None => return Err(fidl::Error::NotNullable),
2343                Some(len) => len,
2344            };
2345            // Calling decoder.out_of_line_offset(0) is not allowed.
2346            if len == 0 {
2347                return Ok(());
2348            };
2349            depth.increment()?;
2350            let envelope_size = 8;
2351            let bytes_len = len * envelope_size;
2352            let offset = decoder.out_of_line_offset(bytes_len)?;
2353            // Decode the envelope for each type.
2354            let mut _next_ordinal_to_read = 0;
2355            let mut next_offset = offset;
2356            let end_offset = offset + bytes_len;
2357            _next_ordinal_to_read += 1;
2358            if next_offset >= end_offset {
2359                return Ok(());
2360            }
2361
2362            // Decode unknown envelopes for gaps in ordinals.
2363            while _next_ordinal_to_read < 1 {
2364                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2365                _next_ordinal_to_read += 1;
2366                next_offset += envelope_size;
2367            }
2368
2369            let next_out_of_line = decoder.next_out_of_line();
2370            let handles_before = decoder.remaining_handles();
2371            if let Some((inlined, num_bytes, num_handles)) =
2372                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2373            {
2374                let member_inline_size =
2375                    <BaseDeviceConfig as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2376                if inlined != (member_inline_size <= 4) {
2377                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2378                }
2379                let inner_offset;
2380                let mut inner_depth = depth.clone();
2381                if inlined {
2382                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2383                    inner_offset = next_offset;
2384                } else {
2385                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2386                    inner_depth.increment()?;
2387                }
2388                let val_ref =
2389                    self.base.get_or_insert_with(|| fidl::new_empty!(BaseDeviceConfig, D));
2390                fidl::decode!(BaseDeviceConfig, D, val_ref, decoder, inner_offset, inner_depth)?;
2391                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2392                {
2393                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2394                }
2395                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2396                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2397                }
2398            }
2399
2400            next_offset += envelope_size;
2401            _next_ordinal_to_read += 1;
2402            if next_offset >= end_offset {
2403                return Ok(());
2404            }
2405
2406            // Decode unknown envelopes for gaps in ordinals.
2407            while _next_ordinal_to_read < 2 {
2408                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2409                _next_ordinal_to_read += 1;
2410                next_offset += envelope_size;
2411            }
2412
2413            let next_out_of_line = decoder.next_out_of_line();
2414            let handles_before = decoder.remaining_handles();
2415            if let Some((inlined, num_bytes, num_handles)) =
2416                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2417            {
2418                let member_inline_size =
2419                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2420                if inlined != (member_inline_size <= 4) {
2421                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2422                }
2423                let inner_offset;
2424                let mut inner_depth = depth.clone();
2425                if inlined {
2426                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2427                    inner_offset = next_offset;
2428                } else {
2429                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2430                    inner_depth.increment()?;
2431                }
2432                let val_ref =
2433                    self.fallible_transmit_left.get_or_insert_with(|| fidl::new_empty!(bool, D));
2434                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
2435                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2436                {
2437                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2438                }
2439                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2440                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2441                }
2442            }
2443
2444            next_offset += envelope_size;
2445            _next_ordinal_to_read += 1;
2446            if next_offset >= end_offset {
2447                return Ok(());
2448            }
2449
2450            // Decode unknown envelopes for gaps in ordinals.
2451            while _next_ordinal_to_read < 3 {
2452                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2453                _next_ordinal_to_read += 1;
2454                next_offset += envelope_size;
2455            }
2456
2457            let next_out_of_line = decoder.next_out_of_line();
2458            let handles_before = decoder.remaining_handles();
2459            if let Some((inlined, num_bytes, num_handles)) =
2460                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2461            {
2462                let member_inline_size =
2463                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2464                if inlined != (member_inline_size <= 4) {
2465                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2466                }
2467                let inner_offset;
2468                let mut inner_depth = depth.clone();
2469                if inlined {
2470                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2471                    inner_offset = next_offset;
2472                } else {
2473                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2474                    inner_depth.increment()?;
2475                }
2476                let val_ref =
2477                    self.fallible_transmit_right.get_or_insert_with(|| fidl::new_empty!(bool, D));
2478                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
2479                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2480                {
2481                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2482                }
2483                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2484                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2485                }
2486            }
2487
2488            next_offset += envelope_size;
2489
2490            // Decode the remaining unknown envelopes.
2491            while next_offset < end_offset {
2492                _next_ordinal_to_read += 1;
2493                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2494                next_offset += envelope_size;
2495            }
2496
2497            Ok(())
2498        }
2499    }
2500
2501    impl DevicePairPortConfig {
2502        #[inline(always)]
2503        fn max_ordinal_present(&self) -> u64 {
2504            if let Some(_) = self.mac_right {
2505                return 3;
2506            }
2507            if let Some(_) = self.mac_left {
2508                return 2;
2509            }
2510            if let Some(_) = self.base {
2511                return 1;
2512            }
2513            0
2514        }
2515    }
2516
2517    impl fidl::encoding::ValueTypeMarker for DevicePairPortConfig {
2518        type Borrowed<'a> = &'a Self;
2519        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2520            value
2521        }
2522    }
2523
2524    unsafe impl fidl::encoding::TypeMarker for DevicePairPortConfig {
2525        type Owned = Self;
2526
2527        #[inline(always)]
2528        fn inline_align(_context: fidl::encoding::Context) -> usize {
2529            8
2530        }
2531
2532        #[inline(always)]
2533        fn inline_size(_context: fidl::encoding::Context) -> usize {
2534            16
2535        }
2536    }
2537
2538    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DevicePairPortConfig, D>
2539        for &DevicePairPortConfig
2540    {
2541        unsafe fn encode(
2542            self,
2543            encoder: &mut fidl::encoding::Encoder<'_, D>,
2544            offset: usize,
2545            mut depth: fidl::encoding::Depth,
2546        ) -> fidl::Result<()> {
2547            encoder.debug_check_bounds::<DevicePairPortConfig>(offset);
2548            // Vector header
2549            let max_ordinal: u64 = self.max_ordinal_present();
2550            encoder.write_num(max_ordinal, offset);
2551            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2552            // Calling encoder.out_of_line_offset(0) is not allowed.
2553            if max_ordinal == 0 {
2554                return Ok(());
2555            }
2556            depth.increment()?;
2557            let envelope_size = 8;
2558            let bytes_len = max_ordinal as usize * envelope_size;
2559            #[allow(unused_variables)]
2560            let offset = encoder.out_of_line_offset(bytes_len);
2561            let mut _prev_end_offset: usize = 0;
2562            if 1 > max_ordinal {
2563                return Ok(());
2564            }
2565
2566            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2567            // are envelope_size bytes.
2568            let cur_offset: usize = (1 - 1) * envelope_size;
2569
2570            // Zero reserved fields.
2571            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2572
2573            // Safety:
2574            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2575            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2576            //   envelope_size bytes, there is always sufficient room.
2577            fidl::encoding::encode_in_envelope_optional::<BasePortConfig, D>(
2578                self.base.as_ref().map(<BasePortConfig as fidl::encoding::ValueTypeMarker>::borrow),
2579                encoder,
2580                offset + cur_offset,
2581                depth,
2582            )?;
2583
2584            _prev_end_offset = cur_offset + envelope_size;
2585            if 2 > max_ordinal {
2586                return Ok(());
2587            }
2588
2589            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2590            // are envelope_size bytes.
2591            let cur_offset: usize = (2 - 1) * envelope_size;
2592
2593            // Zero reserved fields.
2594            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2595
2596            // Safety:
2597            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2598            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2599            //   envelope_size bytes, there is always sufficient room.
2600            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_net_common::MacAddress, D>(
2601            self.mac_left.as_ref().map(<fidl_fuchsia_net_common::MacAddress as fidl::encoding::ValueTypeMarker>::borrow),
2602            encoder, offset + cur_offset, depth
2603        )?;
2604
2605            _prev_end_offset = cur_offset + envelope_size;
2606            if 3 > max_ordinal {
2607                return Ok(());
2608            }
2609
2610            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2611            // are envelope_size bytes.
2612            let cur_offset: usize = (3 - 1) * envelope_size;
2613
2614            // Zero reserved fields.
2615            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2616
2617            // Safety:
2618            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2619            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2620            //   envelope_size bytes, there is always sufficient room.
2621            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_net_common::MacAddress, D>(
2622            self.mac_right.as_ref().map(<fidl_fuchsia_net_common::MacAddress as fidl::encoding::ValueTypeMarker>::borrow),
2623            encoder, offset + cur_offset, depth
2624        )?;
2625
2626            _prev_end_offset = cur_offset + envelope_size;
2627
2628            Ok(())
2629        }
2630    }
2631
2632    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DevicePairPortConfig {
2633        #[inline(always)]
2634        fn new_empty() -> Self {
2635            Self::default()
2636        }
2637
2638        unsafe fn decode(
2639            &mut self,
2640            decoder: &mut fidl::encoding::Decoder<'_, D>,
2641            offset: usize,
2642            mut depth: fidl::encoding::Depth,
2643        ) -> fidl::Result<()> {
2644            decoder.debug_check_bounds::<Self>(offset);
2645            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2646                None => return Err(fidl::Error::NotNullable),
2647                Some(len) => len,
2648            };
2649            // Calling decoder.out_of_line_offset(0) is not allowed.
2650            if len == 0 {
2651                return Ok(());
2652            };
2653            depth.increment()?;
2654            let envelope_size = 8;
2655            let bytes_len = len * envelope_size;
2656            let offset = decoder.out_of_line_offset(bytes_len)?;
2657            // Decode the envelope for each type.
2658            let mut _next_ordinal_to_read = 0;
2659            let mut next_offset = offset;
2660            let end_offset = offset + bytes_len;
2661            _next_ordinal_to_read += 1;
2662            if next_offset >= end_offset {
2663                return Ok(());
2664            }
2665
2666            // Decode unknown envelopes for gaps in ordinals.
2667            while _next_ordinal_to_read < 1 {
2668                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2669                _next_ordinal_to_read += 1;
2670                next_offset += envelope_size;
2671            }
2672
2673            let next_out_of_line = decoder.next_out_of_line();
2674            let handles_before = decoder.remaining_handles();
2675            if let Some((inlined, num_bytes, num_handles)) =
2676                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2677            {
2678                let member_inline_size =
2679                    <BasePortConfig as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2680                if inlined != (member_inline_size <= 4) {
2681                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2682                }
2683                let inner_offset;
2684                let mut inner_depth = depth.clone();
2685                if inlined {
2686                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2687                    inner_offset = next_offset;
2688                } else {
2689                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2690                    inner_depth.increment()?;
2691                }
2692                let val_ref = self.base.get_or_insert_with(|| fidl::new_empty!(BasePortConfig, D));
2693                fidl::decode!(BasePortConfig, D, val_ref, decoder, inner_offset, inner_depth)?;
2694                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2695                {
2696                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2697                }
2698                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2699                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2700                }
2701            }
2702
2703            next_offset += envelope_size;
2704            _next_ordinal_to_read += 1;
2705            if next_offset >= end_offset {
2706                return Ok(());
2707            }
2708
2709            // Decode unknown envelopes for gaps in ordinals.
2710            while _next_ordinal_to_read < 2 {
2711                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2712                _next_ordinal_to_read += 1;
2713                next_offset += envelope_size;
2714            }
2715
2716            let next_out_of_line = decoder.next_out_of_line();
2717            let handles_before = decoder.remaining_handles();
2718            if let Some((inlined, num_bytes, num_handles)) =
2719                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2720            {
2721                let member_inline_size = <fidl_fuchsia_net_common::MacAddress as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2722                if inlined != (member_inline_size <= 4) {
2723                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2724                }
2725                let inner_offset;
2726                let mut inner_depth = depth.clone();
2727                if inlined {
2728                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2729                    inner_offset = next_offset;
2730                } else {
2731                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2732                    inner_depth.increment()?;
2733                }
2734                let val_ref = self.mac_left.get_or_insert_with(|| {
2735                    fidl::new_empty!(fidl_fuchsia_net_common::MacAddress, D)
2736                });
2737                fidl::decode!(
2738                    fidl_fuchsia_net_common::MacAddress,
2739                    D,
2740                    val_ref,
2741                    decoder,
2742                    inner_offset,
2743                    inner_depth
2744                )?;
2745                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2746                {
2747                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2748                }
2749                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2750                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2751                }
2752            }
2753
2754            next_offset += envelope_size;
2755            _next_ordinal_to_read += 1;
2756            if next_offset >= end_offset {
2757                return Ok(());
2758            }
2759
2760            // Decode unknown envelopes for gaps in ordinals.
2761            while _next_ordinal_to_read < 3 {
2762                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2763                _next_ordinal_to_read += 1;
2764                next_offset += envelope_size;
2765            }
2766
2767            let next_out_of_line = decoder.next_out_of_line();
2768            let handles_before = decoder.remaining_handles();
2769            if let Some((inlined, num_bytes, num_handles)) =
2770                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2771            {
2772                let member_inline_size = <fidl_fuchsia_net_common::MacAddress as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2773                if inlined != (member_inline_size <= 4) {
2774                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2775                }
2776                let inner_offset;
2777                let mut inner_depth = depth.clone();
2778                if inlined {
2779                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2780                    inner_offset = next_offset;
2781                } else {
2782                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2783                    inner_depth.increment()?;
2784                }
2785                let val_ref = self.mac_right.get_or_insert_with(|| {
2786                    fidl::new_empty!(fidl_fuchsia_net_common::MacAddress, D)
2787                });
2788                fidl::decode!(
2789                    fidl_fuchsia_net_common::MacAddress,
2790                    D,
2791                    val_ref,
2792                    decoder,
2793                    inner_offset,
2794                    inner_depth
2795                )?;
2796                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2797                {
2798                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2799                }
2800                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2801                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2802                }
2803            }
2804
2805            next_offset += envelope_size;
2806
2807            // Decode the remaining unknown envelopes.
2808            while next_offset < end_offset {
2809                _next_ordinal_to_read += 1;
2810                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2811                next_offset += envelope_size;
2812            }
2813
2814            Ok(())
2815        }
2816    }
2817
2818    impl DevicePortConfig {
2819        #[inline(always)]
2820        fn max_ordinal_present(&self) -> u64 {
2821            if let Some(_) = self.mac {
2822                return 3;
2823            }
2824            if let Some(_) = self.online {
2825                return 2;
2826            }
2827            if let Some(_) = self.base {
2828                return 1;
2829            }
2830            0
2831        }
2832    }
2833
2834    impl fidl::encoding::ValueTypeMarker for DevicePortConfig {
2835        type Borrowed<'a> = &'a Self;
2836        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2837            value
2838        }
2839    }
2840
2841    unsafe impl fidl::encoding::TypeMarker for DevicePortConfig {
2842        type Owned = Self;
2843
2844        #[inline(always)]
2845        fn inline_align(_context: fidl::encoding::Context) -> usize {
2846            8
2847        }
2848
2849        #[inline(always)]
2850        fn inline_size(_context: fidl::encoding::Context) -> usize {
2851            16
2852        }
2853    }
2854
2855    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<DevicePortConfig, D>
2856        for &DevicePortConfig
2857    {
2858        unsafe fn encode(
2859            self,
2860            encoder: &mut fidl::encoding::Encoder<'_, D>,
2861            offset: usize,
2862            mut depth: fidl::encoding::Depth,
2863        ) -> fidl::Result<()> {
2864            encoder.debug_check_bounds::<DevicePortConfig>(offset);
2865            // Vector header
2866            let max_ordinal: u64 = self.max_ordinal_present();
2867            encoder.write_num(max_ordinal, offset);
2868            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2869            // Calling encoder.out_of_line_offset(0) is not allowed.
2870            if max_ordinal == 0 {
2871                return Ok(());
2872            }
2873            depth.increment()?;
2874            let envelope_size = 8;
2875            let bytes_len = max_ordinal as usize * envelope_size;
2876            #[allow(unused_variables)]
2877            let offset = encoder.out_of_line_offset(bytes_len);
2878            let mut _prev_end_offset: usize = 0;
2879            if 1 > max_ordinal {
2880                return Ok(());
2881            }
2882
2883            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2884            // are envelope_size bytes.
2885            let cur_offset: usize = (1 - 1) * envelope_size;
2886
2887            // Zero reserved fields.
2888            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2889
2890            // Safety:
2891            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2892            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2893            //   envelope_size bytes, there is always sufficient room.
2894            fidl::encoding::encode_in_envelope_optional::<BasePortConfig, D>(
2895                self.base.as_ref().map(<BasePortConfig as fidl::encoding::ValueTypeMarker>::borrow),
2896                encoder,
2897                offset + cur_offset,
2898                depth,
2899            )?;
2900
2901            _prev_end_offset = cur_offset + envelope_size;
2902            if 2 > max_ordinal {
2903                return Ok(());
2904            }
2905
2906            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2907            // are envelope_size bytes.
2908            let cur_offset: usize = (2 - 1) * envelope_size;
2909
2910            // Zero reserved fields.
2911            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2912
2913            // Safety:
2914            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2915            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2916            //   envelope_size bytes, there is always sufficient room.
2917            fidl::encoding::encode_in_envelope_optional::<bool, D>(
2918                self.online.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
2919                encoder,
2920                offset + cur_offset,
2921                depth,
2922            )?;
2923
2924            _prev_end_offset = cur_offset + envelope_size;
2925            if 3 > max_ordinal {
2926                return Ok(());
2927            }
2928
2929            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2930            // are envelope_size bytes.
2931            let cur_offset: usize = (3 - 1) * envelope_size;
2932
2933            // Zero reserved fields.
2934            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2935
2936            // Safety:
2937            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2938            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2939            //   envelope_size bytes, there is always sufficient room.
2940            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_net_common::MacAddress, D>(
2941            self.mac.as_ref().map(<fidl_fuchsia_net_common::MacAddress as fidl::encoding::ValueTypeMarker>::borrow),
2942            encoder, offset + cur_offset, depth
2943        )?;
2944
2945            _prev_end_offset = cur_offset + envelope_size;
2946
2947            Ok(())
2948        }
2949    }
2950
2951    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DevicePortConfig {
2952        #[inline(always)]
2953        fn new_empty() -> Self {
2954            Self::default()
2955        }
2956
2957        unsafe fn decode(
2958            &mut self,
2959            decoder: &mut fidl::encoding::Decoder<'_, D>,
2960            offset: usize,
2961            mut depth: fidl::encoding::Depth,
2962        ) -> fidl::Result<()> {
2963            decoder.debug_check_bounds::<Self>(offset);
2964            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2965                None => return Err(fidl::Error::NotNullable),
2966                Some(len) => len,
2967            };
2968            // Calling decoder.out_of_line_offset(0) is not allowed.
2969            if len == 0 {
2970                return Ok(());
2971            };
2972            depth.increment()?;
2973            let envelope_size = 8;
2974            let bytes_len = len * envelope_size;
2975            let offset = decoder.out_of_line_offset(bytes_len)?;
2976            // Decode the envelope for each type.
2977            let mut _next_ordinal_to_read = 0;
2978            let mut next_offset = offset;
2979            let end_offset = offset + bytes_len;
2980            _next_ordinal_to_read += 1;
2981            if next_offset >= end_offset {
2982                return Ok(());
2983            }
2984
2985            // Decode unknown envelopes for gaps in ordinals.
2986            while _next_ordinal_to_read < 1 {
2987                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2988                _next_ordinal_to_read += 1;
2989                next_offset += envelope_size;
2990            }
2991
2992            let next_out_of_line = decoder.next_out_of_line();
2993            let handles_before = decoder.remaining_handles();
2994            if let Some((inlined, num_bytes, num_handles)) =
2995                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2996            {
2997                let member_inline_size =
2998                    <BasePortConfig as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2999                if inlined != (member_inline_size <= 4) {
3000                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3001                }
3002                let inner_offset;
3003                let mut inner_depth = depth.clone();
3004                if inlined {
3005                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3006                    inner_offset = next_offset;
3007                } else {
3008                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3009                    inner_depth.increment()?;
3010                }
3011                let val_ref = self.base.get_or_insert_with(|| fidl::new_empty!(BasePortConfig, D));
3012                fidl::decode!(BasePortConfig, D, val_ref, decoder, inner_offset, inner_depth)?;
3013                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3014                {
3015                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3016                }
3017                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3018                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3019                }
3020            }
3021
3022            next_offset += envelope_size;
3023            _next_ordinal_to_read += 1;
3024            if next_offset >= end_offset {
3025                return Ok(());
3026            }
3027
3028            // Decode unknown envelopes for gaps in ordinals.
3029            while _next_ordinal_to_read < 2 {
3030                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3031                _next_ordinal_to_read += 1;
3032                next_offset += envelope_size;
3033            }
3034
3035            let next_out_of_line = decoder.next_out_of_line();
3036            let handles_before = decoder.remaining_handles();
3037            if let Some((inlined, num_bytes, num_handles)) =
3038                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3039            {
3040                let member_inline_size =
3041                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3042                if inlined != (member_inline_size <= 4) {
3043                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3044                }
3045                let inner_offset;
3046                let mut inner_depth = depth.clone();
3047                if inlined {
3048                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3049                    inner_offset = next_offset;
3050                } else {
3051                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3052                    inner_depth.increment()?;
3053                }
3054                let val_ref = self.online.get_or_insert_with(|| fidl::new_empty!(bool, D));
3055                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
3056                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3057                {
3058                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3059                }
3060                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3061                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3062                }
3063            }
3064
3065            next_offset += envelope_size;
3066            _next_ordinal_to_read += 1;
3067            if next_offset >= end_offset {
3068                return Ok(());
3069            }
3070
3071            // Decode unknown envelopes for gaps in ordinals.
3072            while _next_ordinal_to_read < 3 {
3073                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3074                _next_ordinal_to_read += 1;
3075                next_offset += envelope_size;
3076            }
3077
3078            let next_out_of_line = decoder.next_out_of_line();
3079            let handles_before = decoder.remaining_handles();
3080            if let Some((inlined, num_bytes, num_handles)) =
3081                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3082            {
3083                let member_inline_size = <fidl_fuchsia_net_common::MacAddress as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3084                if inlined != (member_inline_size <= 4) {
3085                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3086                }
3087                let inner_offset;
3088                let mut inner_depth = depth.clone();
3089                if inlined {
3090                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3091                    inner_offset = next_offset;
3092                } else {
3093                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3094                    inner_depth.increment()?;
3095                }
3096                let val_ref = self.mac.get_or_insert_with(|| {
3097                    fidl::new_empty!(fidl_fuchsia_net_common::MacAddress, D)
3098                });
3099                fidl::decode!(
3100                    fidl_fuchsia_net_common::MacAddress,
3101                    D,
3102                    val_ref,
3103                    decoder,
3104                    inner_offset,
3105                    inner_depth
3106                )?;
3107                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3108                {
3109                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3110                }
3111                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3112                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3113                }
3114            }
3115
3116            next_offset += envelope_size;
3117
3118            // Decode the remaining unknown envelopes.
3119            while next_offset < end_offset {
3120                _next_ordinal_to_read += 1;
3121                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3122                next_offset += envelope_size;
3123            }
3124
3125            Ok(())
3126        }
3127    }
3128
3129    impl Frame {
3130        #[inline(always)]
3131        fn max_ordinal_present(&self) -> u64 {
3132            if let Some(_) = self.port {
3133                return 4;
3134            }
3135            if let Some(_) = self.meta {
3136                return 3;
3137            }
3138            if let Some(_) = self.data {
3139                return 2;
3140            }
3141            if let Some(_) = self.frame_type {
3142                return 1;
3143            }
3144            0
3145        }
3146    }
3147
3148    impl fidl::encoding::ValueTypeMarker for Frame {
3149        type Borrowed<'a> = &'a Self;
3150        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3151            value
3152        }
3153    }
3154
3155    unsafe impl fidl::encoding::TypeMarker for Frame {
3156        type Owned = Self;
3157
3158        #[inline(always)]
3159        fn inline_align(_context: fidl::encoding::Context) -> usize {
3160            8
3161        }
3162
3163        #[inline(always)]
3164        fn inline_size(_context: fidl::encoding::Context) -> usize {
3165            16
3166        }
3167    }
3168
3169    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Frame, D> for &Frame {
3170        unsafe fn encode(
3171            self,
3172            encoder: &mut fidl::encoding::Encoder<'_, D>,
3173            offset: usize,
3174            mut depth: fidl::encoding::Depth,
3175        ) -> fidl::Result<()> {
3176            encoder.debug_check_bounds::<Frame>(offset);
3177            // Vector header
3178            let max_ordinal: u64 = self.max_ordinal_present();
3179            encoder.write_num(max_ordinal, offset);
3180            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3181            // Calling encoder.out_of_line_offset(0) is not allowed.
3182            if max_ordinal == 0 {
3183                return Ok(());
3184            }
3185            depth.increment()?;
3186            let envelope_size = 8;
3187            let bytes_len = max_ordinal as usize * envelope_size;
3188            #[allow(unused_variables)]
3189            let offset = encoder.out_of_line_offset(bytes_len);
3190            let mut _prev_end_offset: usize = 0;
3191            if 1 > max_ordinal {
3192                return Ok(());
3193            }
3194
3195            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3196            // are envelope_size bytes.
3197            let cur_offset: usize = (1 - 1) * envelope_size;
3198
3199            // Zero reserved fields.
3200            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3201
3202            // Safety:
3203            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3204            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3205            //   envelope_size bytes, there is always sufficient room.
3206            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_hardware_network_common::FrameType, D>(
3207            self.frame_type.as_ref().map(<fidl_fuchsia_hardware_network_common::FrameType as fidl::encoding::ValueTypeMarker>::borrow),
3208            encoder, offset + cur_offset, 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::<fidl::encoding::Vector<u8, 16384>, D>(
3228                self.data.as_ref().map(
3229                    <fidl::encoding::Vector<u8, 16384> as fidl::encoding::ValueTypeMarker>::borrow,
3230                ),
3231                encoder,
3232                offset + cur_offset,
3233                depth,
3234            )?;
3235
3236            _prev_end_offset = cur_offset + envelope_size;
3237            if 3 > max_ordinal {
3238                return Ok(());
3239            }
3240
3241            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3242            // are envelope_size bytes.
3243            let cur_offset: usize = (3 - 1) * envelope_size;
3244
3245            // Zero reserved fields.
3246            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3247
3248            // Safety:
3249            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3250            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3251            //   envelope_size bytes, there is always sufficient room.
3252            fidl::encoding::encode_in_envelope_optional::<FrameMetadata, D>(
3253                self.meta.as_ref().map(<FrameMetadata 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::<u8, D>(
3276                self.port.as_ref().map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
3277                encoder,
3278                offset + cur_offset,
3279                depth,
3280            )?;
3281
3282            _prev_end_offset = cur_offset + envelope_size;
3283
3284            Ok(())
3285        }
3286    }
3287
3288    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Frame {
3289        #[inline(always)]
3290        fn new_empty() -> Self {
3291            Self::default()
3292        }
3293
3294        unsafe fn decode(
3295            &mut self,
3296            decoder: &mut fidl::encoding::Decoder<'_, D>,
3297            offset: usize,
3298            mut depth: fidl::encoding::Depth,
3299        ) -> fidl::Result<()> {
3300            decoder.debug_check_bounds::<Self>(offset);
3301            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3302                None => return Err(fidl::Error::NotNullable),
3303                Some(len) => len,
3304            };
3305            // Calling decoder.out_of_line_offset(0) is not allowed.
3306            if len == 0 {
3307                return Ok(());
3308            };
3309            depth.increment()?;
3310            let envelope_size = 8;
3311            let bytes_len = len * envelope_size;
3312            let offset = decoder.out_of_line_offset(bytes_len)?;
3313            // Decode the envelope for each type.
3314            let mut _next_ordinal_to_read = 0;
3315            let mut next_offset = offset;
3316            let end_offset = offset + bytes_len;
3317            _next_ordinal_to_read += 1;
3318            if next_offset >= end_offset {
3319                return Ok(());
3320            }
3321
3322            // Decode unknown envelopes for gaps in ordinals.
3323            while _next_ordinal_to_read < 1 {
3324                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3325                _next_ordinal_to_read += 1;
3326                next_offset += envelope_size;
3327            }
3328
3329            let next_out_of_line = decoder.next_out_of_line();
3330            let handles_before = decoder.remaining_handles();
3331            if let Some((inlined, num_bytes, num_handles)) =
3332                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3333            {
3334                let member_inline_size = <fidl_fuchsia_hardware_network_common::FrameType as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3335                if inlined != (member_inline_size <= 4) {
3336                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3337                }
3338                let inner_offset;
3339                let mut inner_depth = depth.clone();
3340                if inlined {
3341                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3342                    inner_offset = next_offset;
3343                } else {
3344                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3345                    inner_depth.increment()?;
3346                }
3347                let val_ref = self.frame_type.get_or_insert_with(|| {
3348                    fidl::new_empty!(fidl_fuchsia_hardware_network_common::FrameType, D)
3349                });
3350                fidl::decode!(
3351                    fidl_fuchsia_hardware_network_common::FrameType,
3352                    D,
3353                    val_ref,
3354                    decoder,
3355                    inner_offset,
3356                    inner_depth
3357                )?;
3358                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3359                {
3360                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3361                }
3362                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3363                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3364                }
3365            }
3366
3367            next_offset += envelope_size;
3368            _next_ordinal_to_read += 1;
3369            if next_offset >= end_offset {
3370                return Ok(());
3371            }
3372
3373            // Decode unknown envelopes for gaps in ordinals.
3374            while _next_ordinal_to_read < 2 {
3375                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3376                _next_ordinal_to_read += 1;
3377                next_offset += envelope_size;
3378            }
3379
3380            let next_out_of_line = decoder.next_out_of_line();
3381            let handles_before = decoder.remaining_handles();
3382            if let Some((inlined, num_bytes, num_handles)) =
3383                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3384            {
3385                let member_inline_size =
3386                    <fidl::encoding::Vector<u8, 16384> as fidl::encoding::TypeMarker>::inline_size(
3387                        decoder.context,
3388                    );
3389                if inlined != (member_inline_size <= 4) {
3390                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3391                }
3392                let inner_offset;
3393                let mut inner_depth = depth.clone();
3394                if inlined {
3395                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3396                    inner_offset = next_offset;
3397                } else {
3398                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3399                    inner_depth.increment()?;
3400                }
3401                let val_ref = self
3402                    .data
3403                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<u8, 16384>, D));
3404                fidl::decode!(fidl::encoding::Vector<u8, 16384>, D, val_ref, decoder, inner_offset, inner_depth)?;
3405                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3406                {
3407                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3408                }
3409                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3410                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3411                }
3412            }
3413
3414            next_offset += envelope_size;
3415            _next_ordinal_to_read += 1;
3416            if next_offset >= end_offset {
3417                return Ok(());
3418            }
3419
3420            // Decode unknown envelopes for gaps in ordinals.
3421            while _next_ordinal_to_read < 3 {
3422                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3423                _next_ordinal_to_read += 1;
3424                next_offset += envelope_size;
3425            }
3426
3427            let next_out_of_line = decoder.next_out_of_line();
3428            let handles_before = decoder.remaining_handles();
3429            if let Some((inlined, num_bytes, num_handles)) =
3430                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3431            {
3432                let member_inline_size =
3433                    <FrameMetadata as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3434                if inlined != (member_inline_size <= 4) {
3435                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3436                }
3437                let inner_offset;
3438                let mut inner_depth = depth.clone();
3439                if inlined {
3440                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3441                    inner_offset = next_offset;
3442                } else {
3443                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3444                    inner_depth.increment()?;
3445                }
3446                let val_ref = self.meta.get_or_insert_with(|| fidl::new_empty!(FrameMetadata, D));
3447                fidl::decode!(FrameMetadata, D, val_ref, decoder, inner_offset, inner_depth)?;
3448                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3449                {
3450                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3451                }
3452                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3453                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3454                }
3455            }
3456
3457            next_offset += envelope_size;
3458            _next_ordinal_to_read += 1;
3459            if next_offset >= end_offset {
3460                return Ok(());
3461            }
3462
3463            // Decode unknown envelopes for gaps in ordinals.
3464            while _next_ordinal_to_read < 4 {
3465                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3466                _next_ordinal_to_read += 1;
3467                next_offset += envelope_size;
3468            }
3469
3470            let next_out_of_line = decoder.next_out_of_line();
3471            let handles_before = decoder.remaining_handles();
3472            if let Some((inlined, num_bytes, num_handles)) =
3473                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3474            {
3475                let member_inline_size =
3476                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3477                if inlined != (member_inline_size <= 4) {
3478                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3479                }
3480                let inner_offset;
3481                let mut inner_depth = depth.clone();
3482                if inlined {
3483                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3484                    inner_offset = next_offset;
3485                } else {
3486                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3487                    inner_depth.increment()?;
3488                }
3489                let val_ref = self.port.get_or_insert_with(|| fidl::new_empty!(u8, D));
3490                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
3491                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3492                {
3493                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3494                }
3495                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3496                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3497                }
3498            }
3499
3500            next_offset += envelope_size;
3501
3502            // Decode the remaining unknown envelopes.
3503            while next_offset < end_offset {
3504                _next_ordinal_to_read += 1;
3505                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3506                next_offset += envelope_size;
3507            }
3508
3509            Ok(())
3510        }
3511    }
3512
3513    impl InternalState {
3514        #[inline(always)]
3515        fn max_ordinal_present(&self) -> u64 {
3516            if let Some(_) = self.has_session {
3517                return 2;
3518            }
3519            if let Some(_) = self.mac {
3520                return 1;
3521            }
3522            0
3523        }
3524    }
3525
3526    impl fidl::encoding::ValueTypeMarker for InternalState {
3527        type Borrowed<'a> = &'a Self;
3528        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3529            value
3530        }
3531    }
3532
3533    unsafe impl fidl::encoding::TypeMarker for InternalState {
3534        type Owned = Self;
3535
3536        #[inline(always)]
3537        fn inline_align(_context: fidl::encoding::Context) -> usize {
3538            8
3539        }
3540
3541        #[inline(always)]
3542        fn inline_size(_context: fidl::encoding::Context) -> usize {
3543            16
3544        }
3545    }
3546
3547    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<InternalState, D>
3548        for &InternalState
3549    {
3550        unsafe fn encode(
3551            self,
3552            encoder: &mut fidl::encoding::Encoder<'_, D>,
3553            offset: usize,
3554            mut depth: fidl::encoding::Depth,
3555        ) -> fidl::Result<()> {
3556            encoder.debug_check_bounds::<InternalState>(offset);
3557            // Vector header
3558            let max_ordinal: u64 = self.max_ordinal_present();
3559            encoder.write_num(max_ordinal, offset);
3560            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3561            // Calling encoder.out_of_line_offset(0) is not allowed.
3562            if max_ordinal == 0 {
3563                return Ok(());
3564            }
3565            depth.increment()?;
3566            let envelope_size = 8;
3567            let bytes_len = max_ordinal as usize * envelope_size;
3568            #[allow(unused_variables)]
3569            let offset = encoder.out_of_line_offset(bytes_len);
3570            let mut _prev_end_offset: usize = 0;
3571            if 1 > max_ordinal {
3572                return Ok(());
3573            }
3574
3575            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3576            // are envelope_size bytes.
3577            let cur_offset: usize = (1 - 1) * envelope_size;
3578
3579            // Zero reserved fields.
3580            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3581
3582            // Safety:
3583            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3584            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3585            //   envelope_size bytes, there is always sufficient room.
3586            fidl::encoding::encode_in_envelope_optional::<MacState, D>(
3587                self.mac.as_ref().map(<MacState as fidl::encoding::ValueTypeMarker>::borrow),
3588                encoder,
3589                offset + cur_offset,
3590                depth,
3591            )?;
3592
3593            _prev_end_offset = cur_offset + envelope_size;
3594            if 2 > max_ordinal {
3595                return Ok(());
3596            }
3597
3598            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3599            // are envelope_size bytes.
3600            let cur_offset: usize = (2 - 1) * envelope_size;
3601
3602            // Zero reserved fields.
3603            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3604
3605            // Safety:
3606            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3607            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3608            //   envelope_size bytes, there is always sufficient room.
3609            fidl::encoding::encode_in_envelope_optional::<bool, D>(
3610                self.has_session.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
3611                encoder,
3612                offset + cur_offset,
3613                depth,
3614            )?;
3615
3616            _prev_end_offset = cur_offset + envelope_size;
3617
3618            Ok(())
3619        }
3620    }
3621
3622    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for InternalState {
3623        #[inline(always)]
3624        fn new_empty() -> Self {
3625            Self::default()
3626        }
3627
3628        unsafe fn decode(
3629            &mut self,
3630            decoder: &mut fidl::encoding::Decoder<'_, D>,
3631            offset: usize,
3632            mut depth: fidl::encoding::Depth,
3633        ) -> fidl::Result<()> {
3634            decoder.debug_check_bounds::<Self>(offset);
3635            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3636                None => return Err(fidl::Error::NotNullable),
3637                Some(len) => len,
3638            };
3639            // Calling decoder.out_of_line_offset(0) is not allowed.
3640            if len == 0 {
3641                return Ok(());
3642            };
3643            depth.increment()?;
3644            let envelope_size = 8;
3645            let bytes_len = len * envelope_size;
3646            let offset = decoder.out_of_line_offset(bytes_len)?;
3647            // Decode the envelope for each type.
3648            let mut _next_ordinal_to_read = 0;
3649            let mut next_offset = offset;
3650            let end_offset = offset + bytes_len;
3651            _next_ordinal_to_read += 1;
3652            if next_offset >= end_offset {
3653                return Ok(());
3654            }
3655
3656            // Decode unknown envelopes for gaps in ordinals.
3657            while _next_ordinal_to_read < 1 {
3658                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3659                _next_ordinal_to_read += 1;
3660                next_offset += envelope_size;
3661            }
3662
3663            let next_out_of_line = decoder.next_out_of_line();
3664            let handles_before = decoder.remaining_handles();
3665            if let Some((inlined, num_bytes, num_handles)) =
3666                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3667            {
3668                let member_inline_size =
3669                    <MacState as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3670                if inlined != (member_inline_size <= 4) {
3671                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3672                }
3673                let inner_offset;
3674                let mut inner_depth = depth.clone();
3675                if inlined {
3676                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3677                    inner_offset = next_offset;
3678                } else {
3679                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3680                    inner_depth.increment()?;
3681                }
3682                let val_ref = self.mac.get_or_insert_with(|| fidl::new_empty!(MacState, D));
3683                fidl::decode!(MacState, D, val_ref, decoder, inner_offset, inner_depth)?;
3684                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3685                {
3686                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3687                }
3688                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3689                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3690                }
3691            }
3692
3693            next_offset += envelope_size;
3694            _next_ordinal_to_read += 1;
3695            if next_offset >= end_offset {
3696                return Ok(());
3697            }
3698
3699            // Decode unknown envelopes for gaps in ordinals.
3700            while _next_ordinal_to_read < 2 {
3701                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3702                _next_ordinal_to_read += 1;
3703                next_offset += envelope_size;
3704            }
3705
3706            let next_out_of_line = decoder.next_out_of_line();
3707            let handles_before = decoder.remaining_handles();
3708            if let Some((inlined, num_bytes, num_handles)) =
3709                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3710            {
3711                let member_inline_size =
3712                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3713                if inlined != (member_inline_size <= 4) {
3714                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3715                }
3716                let inner_offset;
3717                let mut inner_depth = depth.clone();
3718                if inlined {
3719                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3720                    inner_offset = next_offset;
3721                } else {
3722                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3723                    inner_depth.increment()?;
3724                }
3725                let val_ref = self.has_session.get_or_insert_with(|| fidl::new_empty!(bool, D));
3726                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
3727                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3728                {
3729                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3730                }
3731                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3732                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3733                }
3734            }
3735
3736            next_offset += envelope_size;
3737
3738            // Decode the remaining unknown envelopes.
3739            while next_offset < end_offset {
3740                _next_ordinal_to_read += 1;
3741                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3742                next_offset += envelope_size;
3743            }
3744
3745            Ok(())
3746        }
3747    }
3748
3749    impl MacState {
3750        #[inline(always)]
3751        fn max_ordinal_present(&self) -> u64 {
3752            if let Some(_) = self.multicast_filters {
3753                return 2;
3754            }
3755            if let Some(_) = self.mode {
3756                return 1;
3757            }
3758            0
3759        }
3760    }
3761
3762    impl fidl::encoding::ValueTypeMarker for MacState {
3763        type Borrowed<'a> = &'a Self;
3764        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3765            value
3766        }
3767    }
3768
3769    unsafe impl fidl::encoding::TypeMarker for MacState {
3770        type Owned = Self;
3771
3772        #[inline(always)]
3773        fn inline_align(_context: fidl::encoding::Context) -> usize {
3774            8
3775        }
3776
3777        #[inline(always)]
3778        fn inline_size(_context: fidl::encoding::Context) -> usize {
3779            16
3780        }
3781    }
3782
3783    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<MacState, D> for &MacState {
3784        unsafe fn encode(
3785            self,
3786            encoder: &mut fidl::encoding::Encoder<'_, D>,
3787            offset: usize,
3788            mut depth: fidl::encoding::Depth,
3789        ) -> fidl::Result<()> {
3790            encoder.debug_check_bounds::<MacState>(offset);
3791            // Vector header
3792            let max_ordinal: u64 = self.max_ordinal_present();
3793            encoder.write_num(max_ordinal, offset);
3794            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3795            // Calling encoder.out_of_line_offset(0) is not allowed.
3796            if max_ordinal == 0 {
3797                return Ok(());
3798            }
3799            depth.increment()?;
3800            let envelope_size = 8;
3801            let bytes_len = max_ordinal as usize * envelope_size;
3802            #[allow(unused_variables)]
3803            let offset = encoder.out_of_line_offset(bytes_len);
3804            let mut _prev_end_offset: usize = 0;
3805            if 1 > max_ordinal {
3806                return Ok(());
3807            }
3808
3809            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3810            // are envelope_size bytes.
3811            let cur_offset: usize = (1 - 1) * envelope_size;
3812
3813            // Zero reserved fields.
3814            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3815
3816            // Safety:
3817            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3818            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3819            //   envelope_size bytes, there is always sufficient room.
3820            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_hardware_network_common::MacFilterMode, D>(
3821            self.mode.as_ref().map(<fidl_fuchsia_hardware_network_common::MacFilterMode as fidl::encoding::ValueTypeMarker>::borrow),
3822            encoder, offset + cur_offset, depth
3823        )?;
3824
3825            _prev_end_offset = cur_offset + envelope_size;
3826            if 2 > max_ordinal {
3827                return Ok(());
3828            }
3829
3830            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3831            // are envelope_size bytes.
3832            let cur_offset: usize = (2 - 1) * envelope_size;
3833
3834            // Zero reserved fields.
3835            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3836
3837            // Safety:
3838            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3839            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3840            //   envelope_size bytes, there is always sufficient room.
3841            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<fidl_fuchsia_net_common::MacAddress, 64>, D>(
3842            self.multicast_filters.as_ref().map(<fidl::encoding::Vector<fidl_fuchsia_net_common::MacAddress, 64> as fidl::encoding::ValueTypeMarker>::borrow),
3843            encoder, offset + cur_offset, depth
3844        )?;
3845
3846            _prev_end_offset = cur_offset + envelope_size;
3847
3848            Ok(())
3849        }
3850    }
3851
3852    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for MacState {
3853        #[inline(always)]
3854        fn new_empty() -> Self {
3855            Self::default()
3856        }
3857
3858        unsafe fn decode(
3859            &mut self,
3860            decoder: &mut fidl::encoding::Decoder<'_, D>,
3861            offset: usize,
3862            mut depth: fidl::encoding::Depth,
3863        ) -> fidl::Result<()> {
3864            decoder.debug_check_bounds::<Self>(offset);
3865            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3866                None => return Err(fidl::Error::NotNullable),
3867                Some(len) => len,
3868            };
3869            // Calling decoder.out_of_line_offset(0) is not allowed.
3870            if len == 0 {
3871                return Ok(());
3872            };
3873            depth.increment()?;
3874            let envelope_size = 8;
3875            let bytes_len = len * envelope_size;
3876            let offset = decoder.out_of_line_offset(bytes_len)?;
3877            // Decode the envelope for each type.
3878            let mut _next_ordinal_to_read = 0;
3879            let mut next_offset = offset;
3880            let end_offset = offset + bytes_len;
3881            _next_ordinal_to_read += 1;
3882            if next_offset >= end_offset {
3883                return Ok(());
3884            }
3885
3886            // Decode unknown envelopes for gaps in ordinals.
3887            while _next_ordinal_to_read < 1 {
3888                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3889                _next_ordinal_to_read += 1;
3890                next_offset += envelope_size;
3891            }
3892
3893            let next_out_of_line = decoder.next_out_of_line();
3894            let handles_before = decoder.remaining_handles();
3895            if let Some((inlined, num_bytes, num_handles)) =
3896                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3897            {
3898                let member_inline_size = <fidl_fuchsia_hardware_network_common::MacFilterMode as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3899                if inlined != (member_inline_size <= 4) {
3900                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3901                }
3902                let inner_offset;
3903                let mut inner_depth = depth.clone();
3904                if inlined {
3905                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3906                    inner_offset = next_offset;
3907                } else {
3908                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3909                    inner_depth.increment()?;
3910                }
3911                let val_ref = self.mode.get_or_insert_with(|| {
3912                    fidl::new_empty!(fidl_fuchsia_hardware_network_common::MacFilterMode, D)
3913                });
3914                fidl::decode!(
3915                    fidl_fuchsia_hardware_network_common::MacFilterMode,
3916                    D,
3917                    val_ref,
3918                    decoder,
3919                    inner_offset,
3920                    inner_depth
3921                )?;
3922                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3923                {
3924                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3925                }
3926                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3927                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3928                }
3929            }
3930
3931            next_offset += envelope_size;
3932            _next_ordinal_to_read += 1;
3933            if next_offset >= end_offset {
3934                return Ok(());
3935            }
3936
3937            // Decode unknown envelopes for gaps in ordinals.
3938            while _next_ordinal_to_read < 2 {
3939                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3940                _next_ordinal_to_read += 1;
3941                next_offset += envelope_size;
3942            }
3943
3944            let next_out_of_line = decoder.next_out_of_line();
3945            let handles_before = decoder.remaining_handles();
3946            if let Some((inlined, num_bytes, num_handles)) =
3947                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3948            {
3949                let member_inline_size = <fidl::encoding::Vector<
3950                    fidl_fuchsia_net_common::MacAddress,
3951                    64,
3952                > as fidl::encoding::TypeMarker>::inline_size(
3953                    decoder.context
3954                );
3955                if inlined != (member_inline_size <= 4) {
3956                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3957                }
3958                let inner_offset;
3959                let mut inner_depth = depth.clone();
3960                if inlined {
3961                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3962                    inner_offset = next_offset;
3963                } else {
3964                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3965                    inner_depth.increment()?;
3966                }
3967                let val_ref =
3968                self.multicast_filters.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<fidl_fuchsia_net_common::MacAddress, 64>, D));
3969                fidl::decode!(fidl::encoding::Vector<fidl_fuchsia_net_common::MacAddress, 64>, D, val_ref, decoder, inner_offset, inner_depth)?;
3970                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3971                {
3972                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3973                }
3974                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3975                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3976                }
3977            }
3978
3979            next_offset += envelope_size;
3980
3981            // Decode the remaining unknown envelopes.
3982            while next_offset < end_offset {
3983                _next_ordinal_to_read += 1;
3984                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3985                next_offset += envelope_size;
3986            }
3987
3988            Ok(())
3989        }
3990    }
3991}