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