fidl_fuchsia_net_interfaces__common/
fidl_fuchsia_net_interfaces__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/// An interface name as a sequence of bytes.
12pub type Name = String;
13
14/// The maximum length of an interface name.
15pub const INTERFACE_NAME_LENGTH: u8 = 15;
16
17bitflags! {
18    #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)]
19    pub struct AddressPropertiesInterest: u64 {
20        const VALID_UNTIL = 1;
21        const PREFERRED_LIFETIME_INFO = 2;
22    }
23}
24
25impl AddressPropertiesInterest {
26    #[inline(always)]
27    pub fn from_bits_allow_unknown(bits: u64) -> Self {
28        Self::from_bits_retain(bits)
29    }
30
31    #[inline(always)]
32    pub fn has_unknown_bits(&self) -> bool {
33        self.get_unknown_bits() != 0
34    }
35
36    #[inline(always)]
37    pub fn get_unknown_bits(&self) -> u64 {
38        self.bits() & !Self::all().bits()
39    }
40}
41
42/// Assignment state of an IP address.
43#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
44#[repr(u32)]
45pub enum AddressAssignmentState {
46    /// Address assignment is in progress, e.g. Duplicate Address Detection
47    /// is being performed. The address cannot be used when in this state
48    /// (cannot bind to it yet or receive packets destined to it).
49    ///
50    /// The Duplicate Address Detection mechanism is described in
51    /// [RFC 4862, section 5.4](https://tools.ietf.org/html/rfc4862#section-5.4)
52    Tentative = 1,
53    /// The address is assigned to an interface.
54    Assigned = 2,
55    /// The address is unavailable, e.g. if the interface holding the address
56    /// is offline.
57    Unavailable = 3,
58}
59
60impl AddressAssignmentState {
61    #[inline]
62    pub fn from_primitive(prim: u32) -> Option<Self> {
63        match prim {
64            1 => Some(Self::Tentative),
65            2 => Some(Self::Assigned),
66            3 => Some(Self::Unavailable),
67            _ => None,
68        }
69    }
70
71    #[inline]
72    pub const fn into_primitive(self) -> u32 {
73        self as u32
74    }
75}
76
77#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
78pub struct Empty;
79
80impl fidl::Persistable for Empty {}
81
82#[derive(Clone, Debug, PartialEq)]
83pub struct WatcherWatchResponse {
84    pub event: Event,
85}
86
87impl fidl::Persistable for WatcherWatchResponse {}
88
89#[derive(Clone, Debug, Default, PartialEq)]
90pub struct Address {
91    /// The address and prefix length.
92    ///
93    /// Required.
94    pub addr: Option<fidl_fuchsia_net__common::Subnet>,
95    /// The time after which the address will no longer be valid.
96    ///
97    /// Its value must be greater than 0. A value of `ZX_TIME_INFINITE`
98    /// indicates that the address will always be valid. The value is
99    /// derived from the monotonic clock.
100    ///
101    /// As a `zx.Time`, the value has
102    /// [monotonic clock semantics](https://fuchsia.dev/fuchsia-src/concepts/time/monotonic),
103    /// which implies that it has no meaning outside of the host on which it
104    /// was generated and no meaning across host restarts.
105    ///
106    /// Optional; may be omitted due to disinterest.
107    pub valid_until: Option<i64>,
108    /// Preferred lifetime information.
109    ///
110    /// Optional; may be omitted due to disinterest.
111    pub preferred_lifetime_info: Option<PreferredLifetimeInfo>,
112    /// The address's assignment state.
113    ///
114    /// Required.
115    pub assignment_state: Option<AddressAssignmentState>,
116    #[doc(hidden)]
117    pub __source_breaking: fidl::marker::SourceBreaking,
118}
119
120impl fidl::Persistable for Address {}
121
122/// Properties of a network interface.
123#[derive(Clone, Debug, Default, PartialEq)]
124pub struct Properties {
125    /// An opaque identifier for the interface. Its value will not be reused
126    /// even if the device is removed and subsequently re-added. Immutable.
127    pub id: Option<u64>,
128    /// The addresses currently installed on the interface.
129    ///
130    /// Addresses are sorted on [`Address.addr`], and no two addresses can have
131    /// the same `Address.addr` value.
132    ///
133    /// Only assigned addresses are included unless the watcher was created with
134    /// [`WatcherOptions.include_non_assigned_addresses`] set to `true`.
135    pub addresses: Option<Vec<Address>>,
136    /// The device is enabled and its physical state is online.
137    pub online: Option<bool>,
138    /// Whether there is a default IPv4 route through this interface.
139    pub has_default_ipv4_route: Option<bool>,
140    /// Whether there is a default IPv6 route through this interface.
141    pub has_default_ipv6_route: Option<bool>,
142    /// The name of the interface. Immutable.
143    pub name: Option<String>,
144    /// The port class of the interface. Immutable.
145    pub port_class: Option<PortClass>,
146    /// The KOID of the identity event vended out by the interface's backing
147    /// [`fuchsia.hardware.network/Port`].
148    ///
149    /// Callers may use this identifier to correlate port instances to installed
150    /// interfaces.
151    ///
152    /// Immutable. Present for interfaces backed by a
153    /// [`fuchsia.hardware.network/Port`], absent otherwise.
154    pub port_identity_koid: Option<u64>,
155    #[doc(hidden)]
156    pub __source_breaking: fidl::marker::SourceBreaking,
157}
158
159impl fidl::Persistable for Properties {}
160
161#[derive(Clone, Debug, Default, PartialEq)]
162pub struct WatcherOptions {
163    /// Bitfield for registering interest in address properties.
164    ///
165    /// Optional; interpreted as all bits set to 0 if not present.
166    pub address_properties_interest: Option<AddressPropertiesInterest>,
167    /// Flag to determine if only assigned addresses are returned (where
168    /// the assignment state is [`AddressAssignmentState::Assigned`]) or
169    /// all addresses are returned.
170    ///
171    /// Optional; interpreted as false if not present.
172    pub include_non_assigned_addresses: Option<bool>,
173    #[doc(hidden)]
174    pub __source_breaking: fidl::marker::SourceBreaking,
175}
176
177impl fidl::Persistable for WatcherOptions {}
178
179#[derive(Clone, Debug, PartialEq)]
180pub enum Event {
181    /// Properties of an interface that existed when watching started.
182    ///
183    /// All interested fields and [`Properties.id`] are set.
184    Existing(Properties),
185    /// Properties of an interface that was added while watching.
186    ///
187    /// All interested fields and [`Properties.id`] are set.
188    Added(Properties),
189    /// ID of an interface that was removed while watching.
190    Removed(u64),
191    /// Properties of an interface that changed while watching.
192    ///
193    /// Only [`Properties.id`] and interested fields which have changed
194    /// are set with the new values.
195    Changed(Properties),
196    /// Sentinel value indicating no more [`existing`] events will be
197    /// sent.
198    Idle(Empty),
199}
200
201impl Event {
202    #[inline]
203    pub fn ordinal(&self) -> u64 {
204        match *self {
205            Self::Existing(_) => 1,
206            Self::Added(_) => 2,
207            Self::Removed(_) => 3,
208            Self::Changed(_) => 4,
209            Self::Idle(_) => 5,
210        }
211    }
212}
213
214impl fidl::Persistable for Event {}
215
216/// The port class of an interface.
217#[derive(Clone, Debug)]
218pub enum PortClass {
219    /// The interface is loopback.
220    Loopback(Empty),
221    /// The interface's network device port class.
222    Device(fidl_fuchsia_hardware_network__common::PortClass),
223    /// The interface is a blackhole interface.
224    Blackhole(Empty),
225    #[doc(hidden)]
226    __SourceBreaking { unknown_ordinal: u64 },
227}
228
229/// Pattern that matches an unknown `PortClass` member.
230#[macro_export]
231macro_rules! PortClassUnknown {
232    () => {
233        _
234    };
235}
236
237// Custom PartialEq so that unknown variants are not equal to themselves.
238impl PartialEq for PortClass {
239    fn eq(&self, other: &Self) -> bool {
240        match (self, other) {
241            (Self::Loopback(x), Self::Loopback(y)) => *x == *y,
242            (Self::Device(x), Self::Device(y)) => *x == *y,
243            (Self::Blackhole(x), Self::Blackhole(y)) => *x == *y,
244            _ => false,
245        }
246    }
247}
248
249impl PortClass {
250    #[inline]
251    pub fn ordinal(&self) -> u64 {
252        match *self {
253            Self::Loopback(_) => 1,
254            Self::Device(_) => 2,
255            Self::Blackhole(_) => 3,
256            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
257        }
258    }
259
260    #[inline]
261    pub fn unknown_variant_for_testing() -> Self {
262        Self::__SourceBreaking { unknown_ordinal: 0 }
263    }
264
265    #[inline]
266    pub fn is_unknown(&self) -> bool {
267        match self {
268            Self::__SourceBreaking { .. } => true,
269            _ => false,
270        }
271    }
272}
273
274impl fidl::Persistable for PortClass {}
275
276/// Information about the preferred lifetime of an IP address or delegated
277/// prefix.
278#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
279pub enum PreferredLifetimeInfo {
280    /// The end of the preferred lifetime.
281    ///
282    /// The address/prefix should *not* be considered deprecated if `zx.Time`
283    /// is in the past. `preferred_until` is exchanged as a means to inform
284    /// the deadline where deprecation is expected to happen.
285    ///
286    /// The preferred lifetime of addresses is defined in
287    /// [RFC 4862, section 2](https://tools.ietf.org/html/rfc4862#section-2).
288    ///
289    /// Addresses configured using a delegated prefix must have a preferred
290    /// lifetime no longer than that of the prefix according to
291    /// [RFC 8415, section 6.3](https://datatracker.ietf.org/doc/html/rfc8415#section-6.3).
292    ///
293    /// Must be greater than 0. If `zx.Time.INFINITE`, the preferred lifetime
294    /// does not expire.
295    PreferredUntil(i64),
296    /// The address/prefix is deprecated.
297    ///
298    /// Deprecated addresses should no longer be used for initiating
299    /// new connections unless explicitly requested, or if no other
300    /// non-deprecated addresses are assigned (as described in
301    /// [RFC 4862, section 1](https://tools.ietf.org/html/rfc4862#section-1)).
302    ///
303    /// Addresses configured using a deprecated delegated prefix must also be
304    /// deprecated according to
305    /// [RFC 8415, section 6.3](https://datatracker.ietf.org/doc/html/rfc8415#section-6.3).
306    ///
307    /// An address/prefix can become undeprecated if its preferred lifetime is
308    /// extended.
309    Deprecated(Empty),
310}
311
312impl PreferredLifetimeInfo {
313    #[inline]
314    pub fn ordinal(&self) -> u64 {
315        match *self {
316            Self::PreferredUntil(_) => 1,
317            Self::Deprecated(_) => 2,
318        }
319    }
320}
321
322impl fidl::Persistable for PreferredLifetimeInfo {}
323
324pub mod state_ordinals {
325    pub const GET_WATCHER: u64 = 0x4fe223c98b263ae3;
326}
327
328pub mod watcher_ordinals {
329    pub const WATCH: u64 = 0x550767aa9faeeef3;
330}
331
332mod internal {
333    use super::*;
334    unsafe impl fidl::encoding::TypeMarker for AddressPropertiesInterest {
335        type Owned = Self;
336
337        #[inline(always)]
338        fn inline_align(_context: fidl::encoding::Context) -> usize {
339            8
340        }
341
342        #[inline(always)]
343        fn inline_size(_context: fidl::encoding::Context) -> usize {
344            8
345        }
346    }
347
348    impl fidl::encoding::ValueTypeMarker for AddressPropertiesInterest {
349        type Borrowed<'a> = Self;
350        #[inline(always)]
351        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
352            *value
353        }
354    }
355
356    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D>
357        for AddressPropertiesInterest
358    {
359        #[inline]
360        unsafe fn encode(
361            self,
362            encoder: &mut fidl::encoding::Encoder<'_, D>,
363            offset: usize,
364            _depth: fidl::encoding::Depth,
365        ) -> fidl::Result<()> {
366            encoder.debug_check_bounds::<Self>(offset);
367            encoder.write_num(self.bits(), offset);
368            Ok(())
369        }
370    }
371
372    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
373        for AddressPropertiesInterest
374    {
375        #[inline(always)]
376        fn new_empty() -> Self {
377            Self::empty()
378        }
379
380        #[inline]
381        unsafe fn decode(
382            &mut self,
383            decoder: &mut fidl::encoding::Decoder<'_, D>,
384            offset: usize,
385            _depth: fidl::encoding::Depth,
386        ) -> fidl::Result<()> {
387            decoder.debug_check_bounds::<Self>(offset);
388            let prim = decoder.read_num::<u64>(offset);
389            *self = Self::from_bits_allow_unknown(prim);
390            Ok(())
391        }
392    }
393    unsafe impl fidl::encoding::TypeMarker for AddressAssignmentState {
394        type Owned = Self;
395
396        #[inline(always)]
397        fn inline_align(_context: fidl::encoding::Context) -> usize {
398            std::mem::align_of::<u32>()
399        }
400
401        #[inline(always)]
402        fn inline_size(_context: fidl::encoding::Context) -> usize {
403            std::mem::size_of::<u32>()
404        }
405
406        #[inline(always)]
407        fn encode_is_copy() -> bool {
408            true
409        }
410
411        #[inline(always)]
412        fn decode_is_copy() -> bool {
413            false
414        }
415    }
416
417    impl fidl::encoding::ValueTypeMarker for AddressAssignmentState {
418        type Borrowed<'a> = Self;
419        #[inline(always)]
420        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
421            *value
422        }
423    }
424
425    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D>
426        for AddressAssignmentState
427    {
428        #[inline]
429        unsafe fn encode(
430            self,
431            encoder: &mut fidl::encoding::Encoder<'_, D>,
432            offset: usize,
433            _depth: fidl::encoding::Depth,
434        ) -> fidl::Result<()> {
435            encoder.debug_check_bounds::<Self>(offset);
436            encoder.write_num(self.into_primitive(), offset);
437            Ok(())
438        }
439    }
440
441    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
442        for AddressAssignmentState
443    {
444        #[inline(always)]
445        fn new_empty() -> Self {
446            Self::Tentative
447        }
448
449        #[inline]
450        unsafe fn decode(
451            &mut self,
452            decoder: &mut fidl::encoding::Decoder<'_, D>,
453            offset: usize,
454            _depth: fidl::encoding::Depth,
455        ) -> fidl::Result<()> {
456            decoder.debug_check_bounds::<Self>(offset);
457            let prim = decoder.read_num::<u32>(offset);
458
459            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
460            Ok(())
461        }
462    }
463
464    impl fidl::encoding::ValueTypeMarker for Empty {
465        type Borrowed<'a> = &'a Self;
466        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
467            value
468        }
469    }
470
471    unsafe impl fidl::encoding::TypeMarker for Empty {
472        type Owned = Self;
473
474        #[inline(always)]
475        fn inline_align(_context: fidl::encoding::Context) -> usize {
476            1
477        }
478
479        #[inline(always)]
480        fn inline_size(_context: fidl::encoding::Context) -> usize {
481            1
482        }
483    }
484
485    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Empty, D> for &Empty {
486        #[inline]
487        unsafe fn encode(
488            self,
489            encoder: &mut fidl::encoding::Encoder<'_, D>,
490            offset: usize,
491            _depth: fidl::encoding::Depth,
492        ) -> fidl::Result<()> {
493            encoder.debug_check_bounds::<Empty>(offset);
494            encoder.write_num(0u8, offset);
495            Ok(())
496        }
497    }
498
499    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Empty {
500        #[inline(always)]
501        fn new_empty() -> Self {
502            Self
503        }
504
505        #[inline]
506        unsafe fn decode(
507            &mut self,
508            decoder: &mut fidl::encoding::Decoder<'_, D>,
509            offset: usize,
510            _depth: fidl::encoding::Depth,
511        ) -> fidl::Result<()> {
512            decoder.debug_check_bounds::<Self>(offset);
513            match decoder.read_num::<u8>(offset) {
514                0 => Ok(()),
515                _ => Err(fidl::Error::Invalid),
516            }
517        }
518    }
519
520    impl fidl::encoding::ValueTypeMarker for WatcherWatchResponse {
521        type Borrowed<'a> = &'a Self;
522        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
523            value
524        }
525    }
526
527    unsafe impl fidl::encoding::TypeMarker for WatcherWatchResponse {
528        type Owned = Self;
529
530        #[inline(always)]
531        fn inline_align(_context: fidl::encoding::Context) -> usize {
532            8
533        }
534
535        #[inline(always)]
536        fn inline_size(_context: fidl::encoding::Context) -> usize {
537            16
538        }
539    }
540
541    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<WatcherWatchResponse, D>
542        for &WatcherWatchResponse
543    {
544        #[inline]
545        unsafe fn encode(
546            self,
547            encoder: &mut fidl::encoding::Encoder<'_, D>,
548            offset: usize,
549            _depth: fidl::encoding::Depth,
550        ) -> fidl::Result<()> {
551            encoder.debug_check_bounds::<WatcherWatchResponse>(offset);
552            // Delegate to tuple encoding.
553            fidl::encoding::Encode::<WatcherWatchResponse, D>::encode(
554                (<Event as fidl::encoding::ValueTypeMarker>::borrow(&self.event),),
555                encoder,
556                offset,
557                _depth,
558            )
559        }
560    }
561    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<Event, D>>
562        fidl::encoding::Encode<WatcherWatchResponse, D> for (T0,)
563    {
564        #[inline]
565        unsafe fn encode(
566            self,
567            encoder: &mut fidl::encoding::Encoder<'_, D>,
568            offset: usize,
569            depth: fidl::encoding::Depth,
570        ) -> fidl::Result<()> {
571            encoder.debug_check_bounds::<WatcherWatchResponse>(offset);
572            // Zero out padding regions. There's no need to apply masks
573            // because the unmasked parts will be overwritten by fields.
574            // Write the fields.
575            self.0.encode(encoder, offset + 0, depth)?;
576            Ok(())
577        }
578    }
579
580    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for WatcherWatchResponse {
581        #[inline(always)]
582        fn new_empty() -> Self {
583            Self { event: fidl::new_empty!(Event, D) }
584        }
585
586        #[inline]
587        unsafe fn decode(
588            &mut self,
589            decoder: &mut fidl::encoding::Decoder<'_, D>,
590            offset: usize,
591            _depth: fidl::encoding::Depth,
592        ) -> fidl::Result<()> {
593            decoder.debug_check_bounds::<Self>(offset);
594            // Verify that padding bytes are zero.
595            fidl::decode!(Event, D, &mut self.event, decoder, offset + 0, _depth)?;
596            Ok(())
597        }
598    }
599
600    impl Address {
601        #[inline(always)]
602        fn max_ordinal_present(&self) -> u64 {
603            if let Some(_) = self.assignment_state {
604                return 4;
605            }
606            if let Some(_) = self.preferred_lifetime_info {
607                return 3;
608            }
609            if let Some(_) = self.valid_until {
610                return 2;
611            }
612            if let Some(_) = self.addr {
613                return 1;
614            }
615            0
616        }
617    }
618
619    impl fidl::encoding::ValueTypeMarker for Address {
620        type Borrowed<'a> = &'a Self;
621        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
622            value
623        }
624    }
625
626    unsafe impl fidl::encoding::TypeMarker for Address {
627        type Owned = Self;
628
629        #[inline(always)]
630        fn inline_align(_context: fidl::encoding::Context) -> usize {
631            8
632        }
633
634        #[inline(always)]
635        fn inline_size(_context: fidl::encoding::Context) -> usize {
636            16
637        }
638    }
639
640    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Address, D> for &Address {
641        unsafe fn encode(
642            self,
643            encoder: &mut fidl::encoding::Encoder<'_, D>,
644            offset: usize,
645            mut depth: fidl::encoding::Depth,
646        ) -> fidl::Result<()> {
647            encoder.debug_check_bounds::<Address>(offset);
648            // Vector header
649            let max_ordinal: u64 = self.max_ordinal_present();
650            encoder.write_num(max_ordinal, offset);
651            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
652            // Calling encoder.out_of_line_offset(0) is not allowed.
653            if max_ordinal == 0 {
654                return Ok(());
655            }
656            depth.increment()?;
657            let envelope_size = 8;
658            let bytes_len = max_ordinal as usize * envelope_size;
659            #[allow(unused_variables)]
660            let offset = encoder.out_of_line_offset(bytes_len);
661            let mut _prev_end_offset: usize = 0;
662            if 1 > max_ordinal {
663                return Ok(());
664            }
665
666            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
667            // are envelope_size bytes.
668            let cur_offset: usize = (1 - 1) * envelope_size;
669
670            // Zero reserved fields.
671            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
672
673            // Safety:
674            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
675            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
676            //   envelope_size bytes, there is always sufficient room.
677            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_net__common::Subnet, D>(
678                self.addr.as_ref().map(
679                    <fidl_fuchsia_net__common::Subnet as fidl::encoding::ValueTypeMarker>::borrow,
680                ),
681                encoder,
682                offset + cur_offset,
683                depth,
684            )?;
685
686            _prev_end_offset = cur_offset + envelope_size;
687            if 2 > max_ordinal {
688                return Ok(());
689            }
690
691            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
692            // are envelope_size bytes.
693            let cur_offset: usize = (2 - 1) * envelope_size;
694
695            // Zero reserved fields.
696            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
697
698            // Safety:
699            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
700            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
701            //   envelope_size bytes, there is always sufficient room.
702            fidl::encoding::encode_in_envelope_optional::<i64, D>(
703                self.valid_until.as_ref().map(<i64 as fidl::encoding::ValueTypeMarker>::borrow),
704                encoder,
705                offset + cur_offset,
706                depth,
707            )?;
708
709            _prev_end_offset = cur_offset + envelope_size;
710            if 3 > max_ordinal {
711                return Ok(());
712            }
713
714            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
715            // are envelope_size bytes.
716            let cur_offset: usize = (3 - 1) * envelope_size;
717
718            // Zero reserved fields.
719            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
720
721            // Safety:
722            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
723            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
724            //   envelope_size bytes, there is always sufficient room.
725            fidl::encoding::encode_in_envelope_optional::<PreferredLifetimeInfo, D>(
726                self.preferred_lifetime_info
727                    .as_ref()
728                    .map(<PreferredLifetimeInfo as fidl::encoding::ValueTypeMarker>::borrow),
729                encoder,
730                offset + cur_offset,
731                depth,
732            )?;
733
734            _prev_end_offset = cur_offset + envelope_size;
735            if 4 > max_ordinal {
736                return Ok(());
737            }
738
739            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
740            // are envelope_size bytes.
741            let cur_offset: usize = (4 - 1) * envelope_size;
742
743            // Zero reserved fields.
744            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
745
746            // Safety:
747            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
748            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
749            //   envelope_size bytes, there is always sufficient room.
750            fidl::encoding::encode_in_envelope_optional::<AddressAssignmentState, D>(
751                self.assignment_state
752                    .as_ref()
753                    .map(<AddressAssignmentState as fidl::encoding::ValueTypeMarker>::borrow),
754                encoder,
755                offset + cur_offset,
756                depth,
757            )?;
758
759            _prev_end_offset = cur_offset + envelope_size;
760
761            Ok(())
762        }
763    }
764
765    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Address {
766        #[inline(always)]
767        fn new_empty() -> Self {
768            Self::default()
769        }
770
771        unsafe fn decode(
772            &mut self,
773            decoder: &mut fidl::encoding::Decoder<'_, D>,
774            offset: usize,
775            mut depth: fidl::encoding::Depth,
776        ) -> fidl::Result<()> {
777            decoder.debug_check_bounds::<Self>(offset);
778            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
779                None => return Err(fidl::Error::NotNullable),
780                Some(len) => len,
781            };
782            // Calling decoder.out_of_line_offset(0) is not allowed.
783            if len == 0 {
784                return Ok(());
785            };
786            depth.increment()?;
787            let envelope_size = 8;
788            let bytes_len = len * envelope_size;
789            let offset = decoder.out_of_line_offset(bytes_len)?;
790            // Decode the envelope for each type.
791            let mut _next_ordinal_to_read = 0;
792            let mut next_offset = offset;
793            let end_offset = offset + bytes_len;
794            _next_ordinal_to_read += 1;
795            if next_offset >= end_offset {
796                return Ok(());
797            }
798
799            // Decode unknown envelopes for gaps in ordinals.
800            while _next_ordinal_to_read < 1 {
801                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
802                _next_ordinal_to_read += 1;
803                next_offset += envelope_size;
804            }
805
806            let next_out_of_line = decoder.next_out_of_line();
807            let handles_before = decoder.remaining_handles();
808            if let Some((inlined, num_bytes, num_handles)) =
809                fidl::encoding::decode_envelope_header(decoder, next_offset)?
810            {
811                let member_inline_size =
812                    <fidl_fuchsia_net__common::Subnet as fidl::encoding::TypeMarker>::inline_size(
813                        decoder.context,
814                    );
815                if inlined != (member_inline_size <= 4) {
816                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
817                }
818                let inner_offset;
819                let mut inner_depth = depth.clone();
820                if inlined {
821                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
822                    inner_offset = next_offset;
823                } else {
824                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
825                    inner_depth.increment()?;
826                }
827                let val_ref = self
828                    .addr
829                    .get_or_insert_with(|| fidl::new_empty!(fidl_fuchsia_net__common::Subnet, D));
830                fidl::decode!(
831                    fidl_fuchsia_net__common::Subnet,
832                    D,
833                    val_ref,
834                    decoder,
835                    inner_offset,
836                    inner_depth
837                )?;
838                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
839                {
840                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
841                }
842                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
843                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
844                }
845            }
846
847            next_offset += envelope_size;
848            _next_ordinal_to_read += 1;
849            if next_offset >= end_offset {
850                return Ok(());
851            }
852
853            // Decode unknown envelopes for gaps in ordinals.
854            while _next_ordinal_to_read < 2 {
855                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
856                _next_ordinal_to_read += 1;
857                next_offset += envelope_size;
858            }
859
860            let next_out_of_line = decoder.next_out_of_line();
861            let handles_before = decoder.remaining_handles();
862            if let Some((inlined, num_bytes, num_handles)) =
863                fidl::encoding::decode_envelope_header(decoder, next_offset)?
864            {
865                let member_inline_size =
866                    <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
867                if inlined != (member_inline_size <= 4) {
868                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
869                }
870                let inner_offset;
871                let mut inner_depth = depth.clone();
872                if inlined {
873                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
874                    inner_offset = next_offset;
875                } else {
876                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
877                    inner_depth.increment()?;
878                }
879                let val_ref = self.valid_until.get_or_insert_with(|| fidl::new_empty!(i64, D));
880                fidl::decode!(i64, D, val_ref, decoder, inner_offset, inner_depth)?;
881                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
882                {
883                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
884                }
885                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
886                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
887                }
888            }
889
890            next_offset += envelope_size;
891            _next_ordinal_to_read += 1;
892            if next_offset >= end_offset {
893                return Ok(());
894            }
895
896            // Decode unknown envelopes for gaps in ordinals.
897            while _next_ordinal_to_read < 3 {
898                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
899                _next_ordinal_to_read += 1;
900                next_offset += envelope_size;
901            }
902
903            let next_out_of_line = decoder.next_out_of_line();
904            let handles_before = decoder.remaining_handles();
905            if let Some((inlined, num_bytes, num_handles)) =
906                fidl::encoding::decode_envelope_header(decoder, next_offset)?
907            {
908                let member_inline_size =
909                    <PreferredLifetimeInfo as fidl::encoding::TypeMarker>::inline_size(
910                        decoder.context,
911                    );
912                if inlined != (member_inline_size <= 4) {
913                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
914                }
915                let inner_offset;
916                let mut inner_depth = depth.clone();
917                if inlined {
918                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
919                    inner_offset = next_offset;
920                } else {
921                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
922                    inner_depth.increment()?;
923                }
924                let val_ref = self
925                    .preferred_lifetime_info
926                    .get_or_insert_with(|| fidl::new_empty!(PreferredLifetimeInfo, D));
927                fidl::decode!(
928                    PreferredLifetimeInfo,
929                    D,
930                    val_ref,
931                    decoder,
932                    inner_offset,
933                    inner_depth
934                )?;
935                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
936                {
937                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
938                }
939                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
940                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
941                }
942            }
943
944            next_offset += envelope_size;
945            _next_ordinal_to_read += 1;
946            if next_offset >= end_offset {
947                return Ok(());
948            }
949
950            // Decode unknown envelopes for gaps in ordinals.
951            while _next_ordinal_to_read < 4 {
952                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
953                _next_ordinal_to_read += 1;
954                next_offset += envelope_size;
955            }
956
957            let next_out_of_line = decoder.next_out_of_line();
958            let handles_before = decoder.remaining_handles();
959            if let Some((inlined, num_bytes, num_handles)) =
960                fidl::encoding::decode_envelope_header(decoder, next_offset)?
961            {
962                let member_inline_size =
963                    <AddressAssignmentState as fidl::encoding::TypeMarker>::inline_size(
964                        decoder.context,
965                    );
966                if inlined != (member_inline_size <= 4) {
967                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
968                }
969                let inner_offset;
970                let mut inner_depth = depth.clone();
971                if inlined {
972                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
973                    inner_offset = next_offset;
974                } else {
975                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
976                    inner_depth.increment()?;
977                }
978                let val_ref = self
979                    .assignment_state
980                    .get_or_insert_with(|| fidl::new_empty!(AddressAssignmentState, D));
981                fidl::decode!(
982                    AddressAssignmentState,
983                    D,
984                    val_ref,
985                    decoder,
986                    inner_offset,
987                    inner_depth
988                )?;
989                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
990                {
991                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
992                }
993                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
994                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
995                }
996            }
997
998            next_offset += envelope_size;
999
1000            // Decode the remaining unknown envelopes.
1001            while next_offset < end_offset {
1002                _next_ordinal_to_read += 1;
1003                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1004                next_offset += envelope_size;
1005            }
1006
1007            Ok(())
1008        }
1009    }
1010
1011    impl Properties {
1012        #[inline(always)]
1013        fn max_ordinal_present(&self) -> u64 {
1014            if let Some(_) = self.port_identity_koid {
1015                return 9;
1016            }
1017            if let Some(_) = self.port_class {
1018                return 8;
1019            }
1020            if let Some(_) = self.name {
1021                return 7;
1022            }
1023            if let Some(_) = self.has_default_ipv6_route {
1024                return 6;
1025            }
1026            if let Some(_) = self.has_default_ipv4_route {
1027                return 5;
1028            }
1029            if let Some(_) = self.online {
1030                return 3;
1031            }
1032            if let Some(_) = self.addresses {
1033                return 2;
1034            }
1035            if let Some(_) = self.id {
1036                return 1;
1037            }
1038            0
1039        }
1040    }
1041
1042    impl fidl::encoding::ValueTypeMarker for Properties {
1043        type Borrowed<'a> = &'a Self;
1044        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1045            value
1046        }
1047    }
1048
1049    unsafe impl fidl::encoding::TypeMarker for Properties {
1050        type Owned = Self;
1051
1052        #[inline(always)]
1053        fn inline_align(_context: fidl::encoding::Context) -> usize {
1054            8
1055        }
1056
1057        #[inline(always)]
1058        fn inline_size(_context: fidl::encoding::Context) -> usize {
1059            16
1060        }
1061    }
1062
1063    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Properties, D>
1064        for &Properties
1065    {
1066        unsafe fn encode(
1067            self,
1068            encoder: &mut fidl::encoding::Encoder<'_, D>,
1069            offset: usize,
1070            mut depth: fidl::encoding::Depth,
1071        ) -> fidl::Result<()> {
1072            encoder.debug_check_bounds::<Properties>(offset);
1073            // Vector header
1074            let max_ordinal: u64 = self.max_ordinal_present();
1075            encoder.write_num(max_ordinal, offset);
1076            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1077            // Calling encoder.out_of_line_offset(0) is not allowed.
1078            if max_ordinal == 0 {
1079                return Ok(());
1080            }
1081            depth.increment()?;
1082            let envelope_size = 8;
1083            let bytes_len = max_ordinal as usize * envelope_size;
1084            #[allow(unused_variables)]
1085            let offset = encoder.out_of_line_offset(bytes_len);
1086            let mut _prev_end_offset: usize = 0;
1087            if 1 > max_ordinal {
1088                return Ok(());
1089            }
1090
1091            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1092            // are envelope_size bytes.
1093            let cur_offset: usize = (1 - 1) * envelope_size;
1094
1095            // Zero reserved fields.
1096            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1097
1098            // Safety:
1099            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1100            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1101            //   envelope_size bytes, there is always sufficient room.
1102            fidl::encoding::encode_in_envelope_optional::<u64, D>(
1103                self.id.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
1104                encoder,
1105                offset + cur_offset,
1106                depth,
1107            )?;
1108
1109            _prev_end_offset = cur_offset + envelope_size;
1110            if 2 > max_ordinal {
1111                return Ok(());
1112            }
1113
1114            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1115            // are envelope_size bytes.
1116            let cur_offset: usize = (2 - 1) * envelope_size;
1117
1118            // Zero reserved fields.
1119            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1120
1121            // Safety:
1122            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1123            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1124            //   envelope_size bytes, there is always sufficient room.
1125            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::UnboundedVector<Address>, D>(
1126            self.addresses.as_ref().map(<fidl::encoding::UnboundedVector<Address> as fidl::encoding::ValueTypeMarker>::borrow),
1127            encoder, offset + cur_offset, depth
1128        )?;
1129
1130            _prev_end_offset = cur_offset + envelope_size;
1131            if 3 > max_ordinal {
1132                return Ok(());
1133            }
1134
1135            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1136            // are envelope_size bytes.
1137            let cur_offset: usize = (3 - 1) * envelope_size;
1138
1139            // Zero reserved fields.
1140            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1141
1142            // Safety:
1143            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1144            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1145            //   envelope_size bytes, there is always sufficient room.
1146            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1147                self.online.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1148                encoder,
1149                offset + cur_offset,
1150                depth,
1151            )?;
1152
1153            _prev_end_offset = cur_offset + envelope_size;
1154            if 5 > max_ordinal {
1155                return Ok(());
1156            }
1157
1158            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1159            // are envelope_size bytes.
1160            let cur_offset: usize = (5 - 1) * envelope_size;
1161
1162            // Zero reserved fields.
1163            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1164
1165            // Safety:
1166            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1167            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1168            //   envelope_size bytes, there is always sufficient room.
1169            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1170                self.has_default_ipv4_route
1171                    .as_ref()
1172                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1173                encoder,
1174                offset + cur_offset,
1175                depth,
1176            )?;
1177
1178            _prev_end_offset = cur_offset + envelope_size;
1179            if 6 > max_ordinal {
1180                return Ok(());
1181            }
1182
1183            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1184            // are envelope_size bytes.
1185            let cur_offset: usize = (6 - 1) * envelope_size;
1186
1187            // Zero reserved fields.
1188            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1189
1190            // Safety:
1191            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1192            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1193            //   envelope_size bytes, there is always sufficient room.
1194            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1195                self.has_default_ipv6_route
1196                    .as_ref()
1197                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1198                encoder,
1199                offset + cur_offset,
1200                depth,
1201            )?;
1202
1203            _prev_end_offset = cur_offset + envelope_size;
1204            if 7 > max_ordinal {
1205                return Ok(());
1206            }
1207
1208            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1209            // are envelope_size bytes.
1210            let cur_offset: usize = (7 - 1) * envelope_size;
1211
1212            // Zero reserved fields.
1213            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1214
1215            // Safety:
1216            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1217            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1218            //   envelope_size bytes, there is always sufficient room.
1219            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<15>, D>(
1220                self.name.as_ref().map(
1221                    <fidl::encoding::BoundedString<15> as fidl::encoding::ValueTypeMarker>::borrow,
1222                ),
1223                encoder,
1224                offset + cur_offset,
1225                depth,
1226            )?;
1227
1228            _prev_end_offset = cur_offset + envelope_size;
1229            if 8 > max_ordinal {
1230                return Ok(());
1231            }
1232
1233            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1234            // are envelope_size bytes.
1235            let cur_offset: usize = (8 - 1) * envelope_size;
1236
1237            // Zero reserved fields.
1238            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1239
1240            // Safety:
1241            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1242            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1243            //   envelope_size bytes, there is always sufficient room.
1244            fidl::encoding::encode_in_envelope_optional::<PortClass, D>(
1245                self.port_class
1246                    .as_ref()
1247                    .map(<PortClass as fidl::encoding::ValueTypeMarker>::borrow),
1248                encoder,
1249                offset + cur_offset,
1250                depth,
1251            )?;
1252
1253            _prev_end_offset = cur_offset + envelope_size;
1254            if 9 > max_ordinal {
1255                return Ok(());
1256            }
1257
1258            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1259            // are envelope_size bytes.
1260            let cur_offset: usize = (9 - 1) * envelope_size;
1261
1262            // Zero reserved fields.
1263            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1264
1265            // Safety:
1266            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1267            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1268            //   envelope_size bytes, there is always sufficient room.
1269            fidl::encoding::encode_in_envelope_optional::<u64, D>(
1270                self.port_identity_koid
1271                    .as_ref()
1272                    .map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
1273                encoder,
1274                offset + cur_offset,
1275                depth,
1276            )?;
1277
1278            _prev_end_offset = cur_offset + envelope_size;
1279
1280            Ok(())
1281        }
1282    }
1283
1284    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Properties {
1285        #[inline(always)]
1286        fn new_empty() -> Self {
1287            Self::default()
1288        }
1289
1290        unsafe fn decode(
1291            &mut self,
1292            decoder: &mut fidl::encoding::Decoder<'_, D>,
1293            offset: usize,
1294            mut depth: fidl::encoding::Depth,
1295        ) -> fidl::Result<()> {
1296            decoder.debug_check_bounds::<Self>(offset);
1297            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1298                None => return Err(fidl::Error::NotNullable),
1299                Some(len) => len,
1300            };
1301            // Calling decoder.out_of_line_offset(0) is not allowed.
1302            if len == 0 {
1303                return Ok(());
1304            };
1305            depth.increment()?;
1306            let envelope_size = 8;
1307            let bytes_len = len * envelope_size;
1308            let offset = decoder.out_of_line_offset(bytes_len)?;
1309            // Decode the envelope for each type.
1310            let mut _next_ordinal_to_read = 0;
1311            let mut next_offset = offset;
1312            let end_offset = offset + bytes_len;
1313            _next_ordinal_to_read += 1;
1314            if next_offset >= end_offset {
1315                return Ok(());
1316            }
1317
1318            // Decode unknown envelopes for gaps in ordinals.
1319            while _next_ordinal_to_read < 1 {
1320                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1321                _next_ordinal_to_read += 1;
1322                next_offset += envelope_size;
1323            }
1324
1325            let next_out_of_line = decoder.next_out_of_line();
1326            let handles_before = decoder.remaining_handles();
1327            if let Some((inlined, num_bytes, num_handles)) =
1328                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1329            {
1330                let member_inline_size =
1331                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1332                if inlined != (member_inline_size <= 4) {
1333                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1334                }
1335                let inner_offset;
1336                let mut inner_depth = depth.clone();
1337                if inlined {
1338                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1339                    inner_offset = next_offset;
1340                } else {
1341                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1342                    inner_depth.increment()?;
1343                }
1344                let val_ref = self.id.get_or_insert_with(|| fidl::new_empty!(u64, D));
1345                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
1346                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1347                {
1348                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1349                }
1350                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1351                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1352                }
1353            }
1354
1355            next_offset += envelope_size;
1356            _next_ordinal_to_read += 1;
1357            if next_offset >= end_offset {
1358                return Ok(());
1359            }
1360
1361            // Decode unknown envelopes for gaps in ordinals.
1362            while _next_ordinal_to_read < 2 {
1363                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1364                _next_ordinal_to_read += 1;
1365                next_offset += envelope_size;
1366            }
1367
1368            let next_out_of_line = decoder.next_out_of_line();
1369            let handles_before = decoder.remaining_handles();
1370            if let Some((inlined, num_bytes, num_handles)) =
1371                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1372            {
1373                let member_inline_size = <fidl::encoding::UnboundedVector<Address> 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 = self.addresses.get_or_insert_with(|| {
1387                    fidl::new_empty!(fidl::encoding::UnboundedVector<Address>, D)
1388                });
1389                fidl::decode!(
1390                    fidl::encoding::UnboundedVector<Address>,
1391                    D,
1392                    val_ref,
1393                    decoder,
1394                    inner_offset,
1395                    inner_depth
1396                )?;
1397                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1398                {
1399                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1400                }
1401                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1402                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1403                }
1404            }
1405
1406            next_offset += envelope_size;
1407            _next_ordinal_to_read += 1;
1408            if next_offset >= end_offset {
1409                return Ok(());
1410            }
1411
1412            // Decode unknown envelopes for gaps in ordinals.
1413            while _next_ordinal_to_read < 3 {
1414                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1415                _next_ordinal_to_read += 1;
1416                next_offset += envelope_size;
1417            }
1418
1419            let next_out_of_line = decoder.next_out_of_line();
1420            let handles_before = decoder.remaining_handles();
1421            if let Some((inlined, num_bytes, num_handles)) =
1422                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1423            {
1424                let member_inline_size =
1425                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1426                if inlined != (member_inline_size <= 4) {
1427                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1428                }
1429                let inner_offset;
1430                let mut inner_depth = depth.clone();
1431                if inlined {
1432                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1433                    inner_offset = next_offset;
1434                } else {
1435                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1436                    inner_depth.increment()?;
1437                }
1438                let val_ref = self.online.get_or_insert_with(|| fidl::new_empty!(bool, D));
1439                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1440                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1441                {
1442                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1443                }
1444                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1445                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1446                }
1447            }
1448
1449            next_offset += envelope_size;
1450            _next_ordinal_to_read += 1;
1451            if next_offset >= end_offset {
1452                return Ok(());
1453            }
1454
1455            // Decode unknown envelopes for gaps in ordinals.
1456            while _next_ordinal_to_read < 5 {
1457                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1458                _next_ordinal_to_read += 1;
1459                next_offset += envelope_size;
1460            }
1461
1462            let next_out_of_line = decoder.next_out_of_line();
1463            let handles_before = decoder.remaining_handles();
1464            if let Some((inlined, num_bytes, num_handles)) =
1465                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1466            {
1467                let member_inline_size =
1468                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1469                if inlined != (member_inline_size <= 4) {
1470                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1471                }
1472                let inner_offset;
1473                let mut inner_depth = depth.clone();
1474                if inlined {
1475                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1476                    inner_offset = next_offset;
1477                } else {
1478                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1479                    inner_depth.increment()?;
1480                }
1481                let val_ref =
1482                    self.has_default_ipv4_route.get_or_insert_with(|| fidl::new_empty!(bool, D));
1483                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1484                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1485                {
1486                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1487                }
1488                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1489                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1490                }
1491            }
1492
1493            next_offset += envelope_size;
1494            _next_ordinal_to_read += 1;
1495            if next_offset >= end_offset {
1496                return Ok(());
1497            }
1498
1499            // Decode unknown envelopes for gaps in ordinals.
1500            while _next_ordinal_to_read < 6 {
1501                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1502                _next_ordinal_to_read += 1;
1503                next_offset += envelope_size;
1504            }
1505
1506            let next_out_of_line = decoder.next_out_of_line();
1507            let handles_before = decoder.remaining_handles();
1508            if let Some((inlined, num_bytes, num_handles)) =
1509                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1510            {
1511                let member_inline_size =
1512                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1513                if inlined != (member_inline_size <= 4) {
1514                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1515                }
1516                let inner_offset;
1517                let mut inner_depth = depth.clone();
1518                if inlined {
1519                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1520                    inner_offset = next_offset;
1521                } else {
1522                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1523                    inner_depth.increment()?;
1524                }
1525                let val_ref =
1526                    self.has_default_ipv6_route.get_or_insert_with(|| fidl::new_empty!(bool, D));
1527                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1528                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1529                {
1530                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1531                }
1532                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1533                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1534                }
1535            }
1536
1537            next_offset += envelope_size;
1538            _next_ordinal_to_read += 1;
1539            if next_offset >= end_offset {
1540                return Ok(());
1541            }
1542
1543            // Decode unknown envelopes for gaps in ordinals.
1544            while _next_ordinal_to_read < 7 {
1545                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1546                _next_ordinal_to_read += 1;
1547                next_offset += envelope_size;
1548            }
1549
1550            let next_out_of_line = decoder.next_out_of_line();
1551            let handles_before = decoder.remaining_handles();
1552            if let Some((inlined, num_bytes, num_handles)) =
1553                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1554            {
1555                let member_inline_size =
1556                    <fidl::encoding::BoundedString<15> as fidl::encoding::TypeMarker>::inline_size(
1557                        decoder.context,
1558                    );
1559                if inlined != (member_inline_size <= 4) {
1560                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1561                }
1562                let inner_offset;
1563                let mut inner_depth = depth.clone();
1564                if inlined {
1565                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1566                    inner_offset = next_offset;
1567                } else {
1568                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1569                    inner_depth.increment()?;
1570                }
1571                let val_ref = self
1572                    .name
1573                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<15>, D));
1574                fidl::decode!(
1575                    fidl::encoding::BoundedString<15>,
1576                    D,
1577                    val_ref,
1578                    decoder,
1579                    inner_offset,
1580                    inner_depth
1581                )?;
1582                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1583                {
1584                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1585                }
1586                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1587                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1588                }
1589            }
1590
1591            next_offset += envelope_size;
1592            _next_ordinal_to_read += 1;
1593            if next_offset >= end_offset {
1594                return Ok(());
1595            }
1596
1597            // Decode unknown envelopes for gaps in ordinals.
1598            while _next_ordinal_to_read < 8 {
1599                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1600                _next_ordinal_to_read += 1;
1601                next_offset += envelope_size;
1602            }
1603
1604            let next_out_of_line = decoder.next_out_of_line();
1605            let handles_before = decoder.remaining_handles();
1606            if let Some((inlined, num_bytes, num_handles)) =
1607                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1608            {
1609                let member_inline_size =
1610                    <PortClass as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1611                if inlined != (member_inline_size <= 4) {
1612                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1613                }
1614                let inner_offset;
1615                let mut inner_depth = depth.clone();
1616                if inlined {
1617                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1618                    inner_offset = next_offset;
1619                } else {
1620                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1621                    inner_depth.increment()?;
1622                }
1623                let val_ref = self.port_class.get_or_insert_with(|| fidl::new_empty!(PortClass, D));
1624                fidl::decode!(PortClass, D, val_ref, decoder, inner_offset, inner_depth)?;
1625                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1626                {
1627                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1628                }
1629                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1630                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1631                }
1632            }
1633
1634            next_offset += envelope_size;
1635            _next_ordinal_to_read += 1;
1636            if next_offset >= end_offset {
1637                return Ok(());
1638            }
1639
1640            // Decode unknown envelopes for gaps in ordinals.
1641            while _next_ordinal_to_read < 9 {
1642                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1643                _next_ordinal_to_read += 1;
1644                next_offset += envelope_size;
1645            }
1646
1647            let next_out_of_line = decoder.next_out_of_line();
1648            let handles_before = decoder.remaining_handles();
1649            if let Some((inlined, num_bytes, num_handles)) =
1650                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1651            {
1652                let member_inline_size =
1653                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1654                if inlined != (member_inline_size <= 4) {
1655                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1656                }
1657                let inner_offset;
1658                let mut inner_depth = depth.clone();
1659                if inlined {
1660                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1661                    inner_offset = next_offset;
1662                } else {
1663                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1664                    inner_depth.increment()?;
1665                }
1666                let val_ref =
1667                    self.port_identity_koid.get_or_insert_with(|| fidl::new_empty!(u64, D));
1668                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
1669                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1670                {
1671                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1672                }
1673                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1674                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1675                }
1676            }
1677
1678            next_offset += envelope_size;
1679
1680            // Decode the remaining unknown envelopes.
1681            while next_offset < end_offset {
1682                _next_ordinal_to_read += 1;
1683                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1684                next_offset += envelope_size;
1685            }
1686
1687            Ok(())
1688        }
1689    }
1690
1691    impl WatcherOptions {
1692        #[inline(always)]
1693        fn max_ordinal_present(&self) -> u64 {
1694            if let Some(_) = self.include_non_assigned_addresses {
1695                return 2;
1696            }
1697            if let Some(_) = self.address_properties_interest {
1698                return 1;
1699            }
1700            0
1701        }
1702    }
1703
1704    impl fidl::encoding::ValueTypeMarker for WatcherOptions {
1705        type Borrowed<'a> = &'a Self;
1706        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1707            value
1708        }
1709    }
1710
1711    unsafe impl fidl::encoding::TypeMarker for WatcherOptions {
1712        type Owned = Self;
1713
1714        #[inline(always)]
1715        fn inline_align(_context: fidl::encoding::Context) -> usize {
1716            8
1717        }
1718
1719        #[inline(always)]
1720        fn inline_size(_context: fidl::encoding::Context) -> usize {
1721            16
1722        }
1723    }
1724
1725    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<WatcherOptions, D>
1726        for &WatcherOptions
1727    {
1728        unsafe fn encode(
1729            self,
1730            encoder: &mut fidl::encoding::Encoder<'_, D>,
1731            offset: usize,
1732            mut depth: fidl::encoding::Depth,
1733        ) -> fidl::Result<()> {
1734            encoder.debug_check_bounds::<WatcherOptions>(offset);
1735            // Vector header
1736            let max_ordinal: u64 = self.max_ordinal_present();
1737            encoder.write_num(max_ordinal, offset);
1738            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1739            // Calling encoder.out_of_line_offset(0) is not allowed.
1740            if max_ordinal == 0 {
1741                return Ok(());
1742            }
1743            depth.increment()?;
1744            let envelope_size = 8;
1745            let bytes_len = max_ordinal as usize * envelope_size;
1746            #[allow(unused_variables)]
1747            let offset = encoder.out_of_line_offset(bytes_len);
1748            let mut _prev_end_offset: usize = 0;
1749            if 1 > max_ordinal {
1750                return Ok(());
1751            }
1752
1753            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1754            // are envelope_size bytes.
1755            let cur_offset: usize = (1 - 1) * envelope_size;
1756
1757            // Zero reserved fields.
1758            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1759
1760            // Safety:
1761            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1762            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1763            //   envelope_size bytes, there is always sufficient room.
1764            fidl::encoding::encode_in_envelope_optional::<AddressPropertiesInterest, D>(
1765                self.address_properties_interest
1766                    .as_ref()
1767                    .map(<AddressPropertiesInterest as fidl::encoding::ValueTypeMarker>::borrow),
1768                encoder,
1769                offset + cur_offset,
1770                depth,
1771            )?;
1772
1773            _prev_end_offset = cur_offset + envelope_size;
1774            if 2 > max_ordinal {
1775                return Ok(());
1776            }
1777
1778            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1779            // are envelope_size bytes.
1780            let cur_offset: usize = (2 - 1) * envelope_size;
1781
1782            // Zero reserved fields.
1783            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1784
1785            // Safety:
1786            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1787            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1788            //   envelope_size bytes, there is always sufficient room.
1789            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1790                self.include_non_assigned_addresses
1791                    .as_ref()
1792                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1793                encoder,
1794                offset + cur_offset,
1795                depth,
1796            )?;
1797
1798            _prev_end_offset = cur_offset + envelope_size;
1799
1800            Ok(())
1801        }
1802    }
1803
1804    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for WatcherOptions {
1805        #[inline(always)]
1806        fn new_empty() -> Self {
1807            Self::default()
1808        }
1809
1810        unsafe fn decode(
1811            &mut self,
1812            decoder: &mut fidl::encoding::Decoder<'_, D>,
1813            offset: usize,
1814            mut depth: fidl::encoding::Depth,
1815        ) -> fidl::Result<()> {
1816            decoder.debug_check_bounds::<Self>(offset);
1817            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1818                None => return Err(fidl::Error::NotNullable),
1819                Some(len) => len,
1820            };
1821            // Calling decoder.out_of_line_offset(0) is not allowed.
1822            if len == 0 {
1823                return Ok(());
1824            };
1825            depth.increment()?;
1826            let envelope_size = 8;
1827            let bytes_len = len * envelope_size;
1828            let offset = decoder.out_of_line_offset(bytes_len)?;
1829            // Decode the envelope for each type.
1830            let mut _next_ordinal_to_read = 0;
1831            let mut next_offset = offset;
1832            let end_offset = offset + bytes_len;
1833            _next_ordinal_to_read += 1;
1834            if next_offset >= end_offset {
1835                return Ok(());
1836            }
1837
1838            // Decode unknown envelopes for gaps in ordinals.
1839            while _next_ordinal_to_read < 1 {
1840                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1841                _next_ordinal_to_read += 1;
1842                next_offset += envelope_size;
1843            }
1844
1845            let next_out_of_line = decoder.next_out_of_line();
1846            let handles_before = decoder.remaining_handles();
1847            if let Some((inlined, num_bytes, num_handles)) =
1848                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1849            {
1850                let member_inline_size =
1851                    <AddressPropertiesInterest as fidl::encoding::TypeMarker>::inline_size(
1852                        decoder.context,
1853                    );
1854                if inlined != (member_inline_size <= 4) {
1855                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1856                }
1857                let inner_offset;
1858                let mut inner_depth = depth.clone();
1859                if inlined {
1860                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1861                    inner_offset = next_offset;
1862                } else {
1863                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1864                    inner_depth.increment()?;
1865                }
1866                let val_ref = self
1867                    .address_properties_interest
1868                    .get_or_insert_with(|| fidl::new_empty!(AddressPropertiesInterest, D));
1869                fidl::decode!(
1870                    AddressPropertiesInterest,
1871                    D,
1872                    val_ref,
1873                    decoder,
1874                    inner_offset,
1875                    inner_depth
1876                )?;
1877                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1878                {
1879                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1880                }
1881                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1882                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1883                }
1884            }
1885
1886            next_offset += envelope_size;
1887            _next_ordinal_to_read += 1;
1888            if next_offset >= end_offset {
1889                return Ok(());
1890            }
1891
1892            // Decode unknown envelopes for gaps in ordinals.
1893            while _next_ordinal_to_read < 2 {
1894                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1895                _next_ordinal_to_read += 1;
1896                next_offset += envelope_size;
1897            }
1898
1899            let next_out_of_line = decoder.next_out_of_line();
1900            let handles_before = decoder.remaining_handles();
1901            if let Some((inlined, num_bytes, num_handles)) =
1902                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1903            {
1904                let member_inline_size =
1905                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1906                if inlined != (member_inline_size <= 4) {
1907                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1908                }
1909                let inner_offset;
1910                let mut inner_depth = depth.clone();
1911                if inlined {
1912                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1913                    inner_offset = next_offset;
1914                } else {
1915                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1916                    inner_depth.increment()?;
1917                }
1918                let val_ref = self
1919                    .include_non_assigned_addresses
1920                    .get_or_insert_with(|| fidl::new_empty!(bool, D));
1921                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1922                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1923                {
1924                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1925                }
1926                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1927                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1928                }
1929            }
1930
1931            next_offset += envelope_size;
1932
1933            // Decode the remaining unknown envelopes.
1934            while next_offset < end_offset {
1935                _next_ordinal_to_read += 1;
1936                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1937                next_offset += envelope_size;
1938            }
1939
1940            Ok(())
1941        }
1942    }
1943
1944    impl fidl::encoding::ValueTypeMarker for Event {
1945        type Borrowed<'a> = &'a Self;
1946        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1947            value
1948        }
1949    }
1950
1951    unsafe impl fidl::encoding::TypeMarker for Event {
1952        type Owned = Self;
1953
1954        #[inline(always)]
1955        fn inline_align(_context: fidl::encoding::Context) -> usize {
1956            8
1957        }
1958
1959        #[inline(always)]
1960        fn inline_size(_context: fidl::encoding::Context) -> usize {
1961            16
1962        }
1963    }
1964
1965    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Event, D> for &Event {
1966        #[inline]
1967        unsafe fn encode(
1968            self,
1969            encoder: &mut fidl::encoding::Encoder<'_, D>,
1970            offset: usize,
1971            _depth: fidl::encoding::Depth,
1972        ) -> fidl::Result<()> {
1973            encoder.debug_check_bounds::<Event>(offset);
1974            encoder.write_num::<u64>(self.ordinal(), offset);
1975            match self {
1976                Event::Existing(ref val) => fidl::encoding::encode_in_envelope::<Properties, D>(
1977                    <Properties as fidl::encoding::ValueTypeMarker>::borrow(val),
1978                    encoder,
1979                    offset + 8,
1980                    _depth,
1981                ),
1982                Event::Added(ref val) => fidl::encoding::encode_in_envelope::<Properties, D>(
1983                    <Properties as fidl::encoding::ValueTypeMarker>::borrow(val),
1984                    encoder,
1985                    offset + 8,
1986                    _depth,
1987                ),
1988                Event::Removed(ref val) => fidl::encoding::encode_in_envelope::<u64, D>(
1989                    <u64 as fidl::encoding::ValueTypeMarker>::borrow(val),
1990                    encoder,
1991                    offset + 8,
1992                    _depth,
1993                ),
1994                Event::Changed(ref val) => fidl::encoding::encode_in_envelope::<Properties, D>(
1995                    <Properties as fidl::encoding::ValueTypeMarker>::borrow(val),
1996                    encoder,
1997                    offset + 8,
1998                    _depth,
1999                ),
2000                Event::Idle(ref val) => fidl::encoding::encode_in_envelope::<Empty, D>(
2001                    <Empty as fidl::encoding::ValueTypeMarker>::borrow(val),
2002                    encoder,
2003                    offset + 8,
2004                    _depth,
2005                ),
2006            }
2007        }
2008    }
2009
2010    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Event {
2011        #[inline(always)]
2012        fn new_empty() -> Self {
2013            Self::Existing(fidl::new_empty!(Properties, D))
2014        }
2015
2016        #[inline]
2017        unsafe fn decode(
2018            &mut self,
2019            decoder: &mut fidl::encoding::Decoder<'_, D>,
2020            offset: usize,
2021            mut depth: fidl::encoding::Depth,
2022        ) -> fidl::Result<()> {
2023            decoder.debug_check_bounds::<Self>(offset);
2024            #[allow(unused_variables)]
2025            let next_out_of_line = decoder.next_out_of_line();
2026            let handles_before = decoder.remaining_handles();
2027            let (ordinal, inlined, num_bytes, num_handles) =
2028                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
2029
2030            let member_inline_size = match ordinal {
2031                1 => <Properties as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2032                2 => <Properties as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2033                3 => <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2034                4 => <Properties as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2035                5 => <Empty as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2036                _ => return Err(fidl::Error::UnknownUnionTag),
2037            };
2038
2039            if inlined != (member_inline_size <= 4) {
2040                return Err(fidl::Error::InvalidInlineBitInEnvelope);
2041            }
2042            let _inner_offset;
2043            if inlined {
2044                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
2045                _inner_offset = offset + 8;
2046            } else {
2047                depth.increment()?;
2048                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2049            }
2050            match ordinal {
2051                1 => {
2052                    #[allow(irrefutable_let_patterns)]
2053                    if let Event::Existing(_) = self {
2054                        // Do nothing, read the value into the object
2055                    } else {
2056                        // Initialize `self` to the right variant
2057                        *self = Event::Existing(fidl::new_empty!(Properties, D));
2058                    }
2059                    #[allow(irrefutable_let_patterns)]
2060                    if let Event::Existing(ref mut val) = self {
2061                        fidl::decode!(Properties, D, val, decoder, _inner_offset, depth)?;
2062                    } else {
2063                        unreachable!()
2064                    }
2065                }
2066                2 => {
2067                    #[allow(irrefutable_let_patterns)]
2068                    if let Event::Added(_) = self {
2069                        // Do nothing, read the value into the object
2070                    } else {
2071                        // Initialize `self` to the right variant
2072                        *self = Event::Added(fidl::new_empty!(Properties, D));
2073                    }
2074                    #[allow(irrefutable_let_patterns)]
2075                    if let Event::Added(ref mut val) = self {
2076                        fidl::decode!(Properties, D, val, decoder, _inner_offset, depth)?;
2077                    } else {
2078                        unreachable!()
2079                    }
2080                }
2081                3 => {
2082                    #[allow(irrefutable_let_patterns)]
2083                    if let Event::Removed(_) = self {
2084                        // Do nothing, read the value into the object
2085                    } else {
2086                        // Initialize `self` to the right variant
2087                        *self = Event::Removed(fidl::new_empty!(u64, D));
2088                    }
2089                    #[allow(irrefutable_let_patterns)]
2090                    if let Event::Removed(ref mut val) = self {
2091                        fidl::decode!(u64, D, val, decoder, _inner_offset, depth)?;
2092                    } else {
2093                        unreachable!()
2094                    }
2095                }
2096                4 => {
2097                    #[allow(irrefutable_let_patterns)]
2098                    if let Event::Changed(_) = self {
2099                        // Do nothing, read the value into the object
2100                    } else {
2101                        // Initialize `self` to the right variant
2102                        *self = Event::Changed(fidl::new_empty!(Properties, D));
2103                    }
2104                    #[allow(irrefutable_let_patterns)]
2105                    if let Event::Changed(ref mut val) = self {
2106                        fidl::decode!(Properties, D, val, decoder, _inner_offset, depth)?;
2107                    } else {
2108                        unreachable!()
2109                    }
2110                }
2111                5 => {
2112                    #[allow(irrefutable_let_patterns)]
2113                    if let Event::Idle(_) = self {
2114                        // Do nothing, read the value into the object
2115                    } else {
2116                        // Initialize `self` to the right variant
2117                        *self = Event::Idle(fidl::new_empty!(Empty, D));
2118                    }
2119                    #[allow(irrefutable_let_patterns)]
2120                    if let Event::Idle(ref mut val) = self {
2121                        fidl::decode!(Empty, D, val, decoder, _inner_offset, depth)?;
2122                    } else {
2123                        unreachable!()
2124                    }
2125                }
2126                ordinal => panic!("unexpected ordinal {:?}", ordinal),
2127            }
2128            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
2129                return Err(fidl::Error::InvalidNumBytesInEnvelope);
2130            }
2131            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2132                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2133            }
2134            Ok(())
2135        }
2136    }
2137
2138    impl fidl::encoding::ValueTypeMarker for PortClass {
2139        type Borrowed<'a> = &'a Self;
2140        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2141            value
2142        }
2143    }
2144
2145    unsafe impl fidl::encoding::TypeMarker for PortClass {
2146        type Owned = Self;
2147
2148        #[inline(always)]
2149        fn inline_align(_context: fidl::encoding::Context) -> usize {
2150            8
2151        }
2152
2153        #[inline(always)]
2154        fn inline_size(_context: fidl::encoding::Context) -> usize {
2155            16
2156        }
2157    }
2158
2159    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PortClass, D>
2160        for &PortClass
2161    {
2162        #[inline]
2163        unsafe fn encode(
2164            self,
2165            encoder: &mut fidl::encoding::Encoder<'_, D>,
2166            offset: usize,
2167            _depth: fidl::encoding::Depth,
2168        ) -> fidl::Result<()> {
2169            encoder.debug_check_bounds::<PortClass>(offset);
2170            encoder.write_num::<u64>(self.ordinal(), offset);
2171            match self {
2172            PortClass::Loopback(ref val) => {
2173                fidl::encoding::encode_in_envelope::<Empty, D>(
2174                    <Empty as fidl::encoding::ValueTypeMarker>::borrow(val),
2175                    encoder, offset + 8, _depth
2176                )
2177            }
2178            PortClass::Device(ref val) => {
2179                fidl::encoding::encode_in_envelope::<fidl_fuchsia_hardware_network__common::PortClass, D>(
2180                    <fidl_fuchsia_hardware_network__common::PortClass as fidl::encoding::ValueTypeMarker>::borrow(val),
2181                    encoder, offset + 8, _depth
2182                )
2183            }
2184            PortClass::Blackhole(ref val) => {
2185                fidl::encoding::encode_in_envelope::<Empty, D>(
2186                    <Empty as fidl::encoding::ValueTypeMarker>::borrow(val),
2187                    encoder, offset + 8, _depth
2188                )
2189            }
2190            PortClass::__SourceBreaking { .. } => Err(fidl::Error::UnknownUnionTag),
2191        }
2192        }
2193    }
2194
2195    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PortClass {
2196        #[inline(always)]
2197        fn new_empty() -> Self {
2198            Self::__SourceBreaking { unknown_ordinal: 0 }
2199        }
2200
2201        #[inline]
2202        unsafe fn decode(
2203            &mut self,
2204            decoder: &mut fidl::encoding::Decoder<'_, D>,
2205            offset: usize,
2206            mut depth: fidl::encoding::Depth,
2207        ) -> fidl::Result<()> {
2208            decoder.debug_check_bounds::<Self>(offset);
2209            #[allow(unused_variables)]
2210            let next_out_of_line = decoder.next_out_of_line();
2211            let handles_before = decoder.remaining_handles();
2212            let (ordinal, inlined, num_bytes, num_handles) =
2213                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
2214
2215            let member_inline_size = match ordinal {
2216            1 => <Empty as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2217            2 => <fidl_fuchsia_hardware_network__common::PortClass as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2218            3 => <Empty as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2219            0 => return Err(fidl::Error::UnknownUnionTag),
2220            _ => num_bytes as usize,
2221        };
2222
2223            if inlined != (member_inline_size <= 4) {
2224                return Err(fidl::Error::InvalidInlineBitInEnvelope);
2225            }
2226            let _inner_offset;
2227            if inlined {
2228                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
2229                _inner_offset = offset + 8;
2230            } else {
2231                depth.increment()?;
2232                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2233            }
2234            match ordinal {
2235                1 => {
2236                    #[allow(irrefutable_let_patterns)]
2237                    if let PortClass::Loopback(_) = self {
2238                        // Do nothing, read the value into the object
2239                    } else {
2240                        // Initialize `self` to the right variant
2241                        *self = PortClass::Loopback(fidl::new_empty!(Empty, D));
2242                    }
2243                    #[allow(irrefutable_let_patterns)]
2244                    if let PortClass::Loopback(ref mut val) = self {
2245                        fidl::decode!(Empty, D, val, decoder, _inner_offset, depth)?;
2246                    } else {
2247                        unreachable!()
2248                    }
2249                }
2250                2 => {
2251                    #[allow(irrefutable_let_patterns)]
2252                    if let PortClass::Device(_) = self {
2253                        // Do nothing, read the value into the object
2254                    } else {
2255                        // Initialize `self` to the right variant
2256                        *self = PortClass::Device(fidl::new_empty!(
2257                            fidl_fuchsia_hardware_network__common::PortClass,
2258                            D
2259                        ));
2260                    }
2261                    #[allow(irrefutable_let_patterns)]
2262                    if let PortClass::Device(ref mut val) = self {
2263                        fidl::decode!(
2264                            fidl_fuchsia_hardware_network__common::PortClass,
2265                            D,
2266                            val,
2267                            decoder,
2268                            _inner_offset,
2269                            depth
2270                        )?;
2271                    } else {
2272                        unreachable!()
2273                    }
2274                }
2275                3 => {
2276                    #[allow(irrefutable_let_patterns)]
2277                    if let PortClass::Blackhole(_) = self {
2278                        // Do nothing, read the value into the object
2279                    } else {
2280                        // Initialize `self` to the right variant
2281                        *self = PortClass::Blackhole(fidl::new_empty!(Empty, D));
2282                    }
2283                    #[allow(irrefutable_let_patterns)]
2284                    if let PortClass::Blackhole(ref mut val) = self {
2285                        fidl::decode!(Empty, D, val, decoder, _inner_offset, depth)?;
2286                    } else {
2287                        unreachable!()
2288                    }
2289                }
2290                #[allow(deprecated)]
2291                ordinal => {
2292                    for _ in 0..num_handles {
2293                        decoder.drop_next_handle()?;
2294                    }
2295                    *self = PortClass::__SourceBreaking { unknown_ordinal: ordinal };
2296                }
2297            }
2298            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
2299                return Err(fidl::Error::InvalidNumBytesInEnvelope);
2300            }
2301            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2302                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2303            }
2304            Ok(())
2305        }
2306    }
2307
2308    impl fidl::encoding::ValueTypeMarker for PreferredLifetimeInfo {
2309        type Borrowed<'a> = &'a Self;
2310        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2311            value
2312        }
2313    }
2314
2315    unsafe impl fidl::encoding::TypeMarker for PreferredLifetimeInfo {
2316        type Owned = Self;
2317
2318        #[inline(always)]
2319        fn inline_align(_context: fidl::encoding::Context) -> usize {
2320            8
2321        }
2322
2323        #[inline(always)]
2324        fn inline_size(_context: fidl::encoding::Context) -> usize {
2325            16
2326        }
2327    }
2328
2329    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PreferredLifetimeInfo, D>
2330        for &PreferredLifetimeInfo
2331    {
2332        #[inline]
2333        unsafe fn encode(
2334            self,
2335            encoder: &mut fidl::encoding::Encoder<'_, D>,
2336            offset: usize,
2337            _depth: fidl::encoding::Depth,
2338        ) -> fidl::Result<()> {
2339            encoder.debug_check_bounds::<PreferredLifetimeInfo>(offset);
2340            encoder.write_num::<u64>(self.ordinal(), offset);
2341            match self {
2342                PreferredLifetimeInfo::PreferredUntil(ref val) => {
2343                    fidl::encoding::encode_in_envelope::<i64, D>(
2344                        <i64 as fidl::encoding::ValueTypeMarker>::borrow(val),
2345                        encoder,
2346                        offset + 8,
2347                        _depth,
2348                    )
2349                }
2350                PreferredLifetimeInfo::Deprecated(ref val) => {
2351                    fidl::encoding::encode_in_envelope::<Empty, D>(
2352                        <Empty as fidl::encoding::ValueTypeMarker>::borrow(val),
2353                        encoder,
2354                        offset + 8,
2355                        _depth,
2356                    )
2357                }
2358            }
2359        }
2360    }
2361
2362    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PreferredLifetimeInfo {
2363        #[inline(always)]
2364        fn new_empty() -> Self {
2365            Self::PreferredUntil(fidl::new_empty!(i64, D))
2366        }
2367
2368        #[inline]
2369        unsafe fn decode(
2370            &mut self,
2371            decoder: &mut fidl::encoding::Decoder<'_, D>,
2372            offset: usize,
2373            mut depth: fidl::encoding::Depth,
2374        ) -> fidl::Result<()> {
2375            decoder.debug_check_bounds::<Self>(offset);
2376            #[allow(unused_variables)]
2377            let next_out_of_line = decoder.next_out_of_line();
2378            let handles_before = decoder.remaining_handles();
2379            let (ordinal, inlined, num_bytes, num_handles) =
2380                fidl::encoding::decode_union_inline_portion(decoder, offset)?;
2381
2382            let member_inline_size = match ordinal {
2383                1 => <i64 as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2384                2 => <Empty as fidl::encoding::TypeMarker>::inline_size(decoder.context),
2385                _ => return Err(fidl::Error::UnknownUnionTag),
2386            };
2387
2388            if inlined != (member_inline_size <= 4) {
2389                return Err(fidl::Error::InvalidInlineBitInEnvelope);
2390            }
2391            let _inner_offset;
2392            if inlined {
2393                decoder.check_inline_envelope_padding(offset + 8, member_inline_size)?;
2394                _inner_offset = offset + 8;
2395            } else {
2396                depth.increment()?;
2397                _inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2398            }
2399            match ordinal {
2400                1 => {
2401                    #[allow(irrefutable_let_patterns)]
2402                    if let PreferredLifetimeInfo::PreferredUntil(_) = self {
2403                        // Do nothing, read the value into the object
2404                    } else {
2405                        // Initialize `self` to the right variant
2406                        *self = PreferredLifetimeInfo::PreferredUntil(fidl::new_empty!(i64, D));
2407                    }
2408                    #[allow(irrefutable_let_patterns)]
2409                    if let PreferredLifetimeInfo::PreferredUntil(ref mut val) = self {
2410                        fidl::decode!(i64, D, val, decoder, _inner_offset, depth)?;
2411                    } else {
2412                        unreachable!()
2413                    }
2414                }
2415                2 => {
2416                    #[allow(irrefutable_let_patterns)]
2417                    if let PreferredLifetimeInfo::Deprecated(_) = self {
2418                        // Do nothing, read the value into the object
2419                    } else {
2420                        // Initialize `self` to the right variant
2421                        *self = PreferredLifetimeInfo::Deprecated(fidl::new_empty!(Empty, D));
2422                    }
2423                    #[allow(irrefutable_let_patterns)]
2424                    if let PreferredLifetimeInfo::Deprecated(ref mut val) = self {
2425                        fidl::decode!(Empty, D, val, decoder, _inner_offset, depth)?;
2426                    } else {
2427                        unreachable!()
2428                    }
2429                }
2430                ordinal => panic!("unexpected ordinal {:?}", ordinal),
2431            }
2432            if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize) {
2433                return Err(fidl::Error::InvalidNumBytesInEnvelope);
2434            }
2435            if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2436                return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2437            }
2438            Ok(())
2439        }
2440    }
2441}