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