fidl_fuchsia_lowpan_thread_common/
fidl_fuchsia_lowpan_thread_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/// Datatype for containing a Thread dataset in raw TLV form.
12/// Functionally equivalent to type [`otOperationalDatasetTlvs`][1].
13///
14/// The details of the Thread TLV format are documented in the
15/// [Thread Specification](https://www.threadgroup.org/ThreadSpec).
16///
17/// [1]: https://openthread.io/reference/struct/ot-operational-dataset-tlvs#structot_operational_dataset_tlvs
18pub type OperationalDatasetTlvs = Vec<u8>;
19
20pub const MAX_DATASET_TLV_LEN: u8 = 254;
21
22#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
23pub enum DetailedLoggingLevel {
24    LowpanLogUnspecified,
25    LowpanLogEmerg,
26    LowpanLogAlert,
27    LowpanLogCrit,
28    LowpanLogErr,
29    LowpanLogWarning,
30    LowpanLogNotice,
31    LowpanLogInfo,
32    LowpanLogDebug,
33    #[doc(hidden)]
34    __SourceBreaking {
35        unknown_ordinal: u32,
36    },
37}
38
39/// Pattern that matches an unknown `DetailedLoggingLevel` member.
40#[macro_export]
41macro_rules! DetailedLoggingLevelUnknown {
42    () => {
43        _
44    };
45}
46
47impl DetailedLoggingLevel {
48    #[inline]
49    pub fn from_primitive(prim: u32) -> Option<Self> {
50        match prim {
51            0 => Some(Self::LowpanLogUnspecified),
52            1 => Some(Self::LowpanLogEmerg),
53            2 => Some(Self::LowpanLogAlert),
54            3 => Some(Self::LowpanLogCrit),
55            4 => Some(Self::LowpanLogErr),
56            5 => Some(Self::LowpanLogWarning),
57            6 => Some(Self::LowpanLogNotice),
58            7 => Some(Self::LowpanLogInfo),
59            8 => Some(Self::LowpanLogDebug),
60            _ => None,
61        }
62    }
63
64    #[inline]
65    pub fn from_primitive_allow_unknown(prim: u32) -> Self {
66        match prim {
67            0 => Self::LowpanLogUnspecified,
68            1 => Self::LowpanLogEmerg,
69            2 => Self::LowpanLogAlert,
70            3 => Self::LowpanLogCrit,
71            4 => Self::LowpanLogErr,
72            5 => Self::LowpanLogWarning,
73            6 => Self::LowpanLogNotice,
74            7 => Self::LowpanLogInfo,
75            8 => Self::LowpanLogDebug,
76            unknown_ordinal => Self::__SourceBreaking { unknown_ordinal },
77        }
78    }
79
80    #[inline]
81    pub fn unknown() -> Self {
82        Self::__SourceBreaking { unknown_ordinal: 0xffffffff }
83    }
84
85    #[inline]
86    pub const fn into_primitive(self) -> u32 {
87        match self {
88            Self::LowpanLogUnspecified => 0,
89            Self::LowpanLogEmerg => 1,
90            Self::LowpanLogAlert => 2,
91            Self::LowpanLogCrit => 3,
92            Self::LowpanLogErr => 4,
93            Self::LowpanLogWarning => 5,
94            Self::LowpanLogNotice => 6,
95            Self::LowpanLogInfo => 7,
96            Self::LowpanLogDebug => 8,
97            Self::__SourceBreaking { unknown_ordinal } => unknown_ordinal,
98        }
99    }
100
101    #[inline]
102    pub fn is_unknown(&self) -> bool {
103        match self {
104            Self::__SourceBreaking { unknown_ordinal: _ } => true,
105            _ => false,
106        }
107    }
108}
109
110#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
111pub struct DatasetAttachAllNodesToRequest {
112    /// The Operational Dataset that contains parameter values of the
113    /// Thread network to attach to. It must be a full dataset.
114    pub dataset: Vec<u8>,
115}
116
117impl fidl::Persistable for DatasetAttachAllNodesToRequest {}
118
119#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
120#[repr(C)]
121pub struct DatasetAttachAllNodesToResponse {
122    /// The delay between when the method returns and when the dataset
123    /// takes effect, in milliseconds. If this value is 0, then the node is
124    /// attached to the given network when this method returns. If this
125    /// value is not 0, then the node is attached to its existing network
126    /// when this method returns, and will attach to the given network
127    /// after the delay. Negative values are prohibited and must be
128    /// considered a runtime error.
129    pub delay_ms: i64,
130}
131
132impl fidl::Persistable for DatasetAttachAllNodesToResponse {}
133
134#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
135pub struct DatasetGetActiveTlvsResponse {
136    pub dataset: Option<Vec<u8>>,
137}
138
139impl fidl::Persistable for DatasetGetActiveTlvsResponse {}
140
141#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
142pub struct DatasetSetActiveTlvsRequest {
143    pub dataset: Vec<u8>,
144}
145
146impl fidl::Persistable for DatasetSetActiveTlvsRequest {}
147
148#[derive(Clone, Debug, PartialEq)]
149pub struct FeatureGetFeatureConfigResponse {
150    pub config: FeatureConfig,
151}
152
153impl fidl::Persistable for FeatureGetFeatureConfigResponse {}
154
155#[derive(Clone, Debug, PartialEq)]
156pub struct FeatureUpdateFeatureConfigRequest {
157    pub config: FeatureConfig,
158}
159
160impl fidl::Persistable for FeatureUpdateFeatureConfigRequest {}
161
162#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
163pub struct MeshcopUpdateTxtEntriesRequest {
164    pub txt_entries: Vec<TxtEntries>,
165}
166
167impl fidl::Persistable for MeshcopUpdateTxtEntriesRequest {}
168
169#[derive(Clone, Debug, PartialEq)]
170pub struct ThreadCapabilitiesGetCapabilitiesResponse {
171    pub capabilities: Capabilities,
172}
173
174impl fidl::Persistable for ThreadCapabilitiesGetCapabilitiesResponse {}
175
176#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
177pub struct TxtEntries {
178    /// The key string for this TXT entry.
179    ///
180    /// Must not contain the character `=`.
181    /// Maximum theoretical length is 254 bytes.
182    pub key: String,
183    /// The binary value associated with this key.
184    ///
185    /// Maximum theoretical length is 253 bytes, which is two bytes less
186    /// than the TXT record maximum length to account for a single-byte
187    /// key and key/value separator byte.
188    pub value: Vec<u8>,
189}
190
191impl fidl::Persistable for TxtEntries {}
192
193/// Openthread capabilities.
194///
195/// Capabilities refers to features supported by openthread. For
196/// instance, nat64 refers to, if openthread has the required
197/// software support for nat64, which is determined by macros defined in openthread.
198/// It doesn't refer to if the feature is enabled or disabled.
199/// The table describes the capabilities of openthread that are supported/not-supported.
200/// For every new feature that's added, the table below should be updated.
201#[derive(Clone, Debug, Default, PartialEq)]
202pub struct Capabilities {
203    /// The fields cannot be absent. They are set to true or false.
204    /// Describes if nat64 is supported.
205    /// If nat64 is true, Openthread supports nat64, false otherwise.
206    pub nat64: Option<bool>,
207    /// Describes if dhcpv6 prefix delegation is supported.
208    /// If dhcpv6_pd is true, Openthread supports dhcpv6pd, false otherwise.
209    pub dhcpv6_pd: Option<bool>,
210    #[doc(hidden)]
211    pub __source_breaking: fidl::marker::SourceBreaking,
212}
213
214impl fidl::Persistable for Capabilities {}
215
216/// OpenThread feature configuration.
217///
218/// This table describes what OpenThread features are enabled or disabled
219/// for a given interface. See the [`Feature`] protocol for more information.
220#[derive(Clone, Debug, Default, PartialEq)]
221pub struct FeatureConfig {
222    /// Determines if TREL is enabled or disabled.
223    pub trel_enabled: Option<bool>,
224    /// Determines if NAT64 is enabled or disabled.
225    pub nat64_enabled: Option<bool>,
226    /// Determines if SRP replication is enabled or disabled.
227    pub srp_replication_enabled: Option<bool>,
228    /// Determines if detailed logging is enabled. If set to
229    /// false, default logging level set in config file should
230    /// be used in lowpan-ot-driver.
231    pub detailed_logging_enabled: Option<bool>,
232    /// Set target log level. The value will be used only if
233    /// `detailed_logging_enabled` is set to true.
234    pub detailed_logging_level: Option<DetailedLoggingLevel>,
235    /// Determines if DHCPv6-PD is enabled or disabled.
236    pub dhcpv6_pd_enabled: Option<bool>,
237    /// Determines if DNS upstream query is enabled or disabled.
238    pub dns_upstream_query_enabled: Option<bool>,
239    /// Determines if Link Metrics Manager is enabled or disabled.
240    pub link_metrics_manager_enabled: Option<bool>,
241    #[doc(hidden)]
242    pub __source_breaking: fidl::marker::SourceBreaking,
243}
244
245impl fidl::Persistable for FeatureConfig {}
246
247mod internal {
248    use super::*;
249    unsafe impl fidl::encoding::TypeMarker for DetailedLoggingLevel {
250        type Owned = Self;
251
252        #[inline(always)]
253        fn inline_align(_context: fidl::encoding::Context) -> usize {
254            std::mem::align_of::<u32>()
255        }
256
257        #[inline(always)]
258        fn inline_size(_context: fidl::encoding::Context) -> usize {
259            std::mem::size_of::<u32>()
260        }
261
262        #[inline(always)]
263        fn encode_is_copy() -> bool {
264            false
265        }
266
267        #[inline(always)]
268        fn decode_is_copy() -> bool {
269            false
270        }
271    }
272
273    impl fidl::encoding::ValueTypeMarker for DetailedLoggingLevel {
274        type Borrowed<'a> = Self;
275        #[inline(always)]
276        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
277            *value
278        }
279    }
280
281    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D>
282        for DetailedLoggingLevel
283    {
284        #[inline]
285        unsafe fn encode(
286            self,
287            encoder: &mut fidl::encoding::Encoder<'_, D>,
288            offset: usize,
289            _depth: fidl::encoding::Depth,
290        ) -> fidl::Result<()> {
291            encoder.debug_check_bounds::<Self>(offset);
292            encoder.write_num(self.into_primitive(), offset);
293            Ok(())
294        }
295    }
296
297    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for DetailedLoggingLevel {
298        #[inline(always)]
299        fn new_empty() -> Self {
300            Self::unknown()
301        }
302
303        #[inline]
304        unsafe fn decode(
305            &mut self,
306            decoder: &mut fidl::encoding::Decoder<'_, D>,
307            offset: usize,
308            _depth: fidl::encoding::Depth,
309        ) -> fidl::Result<()> {
310            decoder.debug_check_bounds::<Self>(offset);
311            let prim = decoder.read_num::<u32>(offset);
312
313            *self = Self::from_primitive_allow_unknown(prim);
314            Ok(())
315        }
316    }
317
318    impl fidl::encoding::ValueTypeMarker for DatasetAttachAllNodesToRequest {
319        type Borrowed<'a> = &'a Self;
320        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
321            value
322        }
323    }
324
325    unsafe impl fidl::encoding::TypeMarker for DatasetAttachAllNodesToRequest {
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            16
336        }
337    }
338
339    unsafe impl<D: fidl::encoding::ResourceDialect>
340        fidl::encoding::Encode<DatasetAttachAllNodesToRequest, D>
341        for &DatasetAttachAllNodesToRequest
342    {
343        #[inline]
344        unsafe fn encode(
345            self,
346            encoder: &mut fidl::encoding::Encoder<'_, D>,
347            offset: usize,
348            _depth: fidl::encoding::Depth,
349        ) -> fidl::Result<()> {
350            encoder.debug_check_bounds::<DatasetAttachAllNodesToRequest>(offset);
351            // Delegate to tuple encoding.
352            fidl::encoding::Encode::<DatasetAttachAllNodesToRequest, D>::encode(
353                (<fidl::encoding::Vector<u8, 254> as fidl::encoding::ValueTypeMarker>::borrow(
354                    &self.dataset,
355                ),),
356                encoder,
357                offset,
358                _depth,
359            )
360        }
361    }
362    unsafe impl<
363            D: fidl::encoding::ResourceDialect,
364            T0: fidl::encoding::Encode<fidl::encoding::Vector<u8, 254>, D>,
365        > fidl::encoding::Encode<DatasetAttachAllNodesToRequest, D> for (T0,)
366    {
367        #[inline]
368        unsafe fn encode(
369            self,
370            encoder: &mut fidl::encoding::Encoder<'_, D>,
371            offset: usize,
372            depth: fidl::encoding::Depth,
373        ) -> fidl::Result<()> {
374            encoder.debug_check_bounds::<DatasetAttachAllNodesToRequest>(offset);
375            // Zero out padding regions. There's no need to apply masks
376            // because the unmasked parts will be overwritten by fields.
377            // Write the fields.
378            self.0.encode(encoder, offset + 0, depth)?;
379            Ok(())
380        }
381    }
382
383    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
384        for DatasetAttachAllNodesToRequest
385    {
386        #[inline(always)]
387        fn new_empty() -> Self {
388            Self { dataset: fidl::new_empty!(fidl::encoding::Vector<u8, 254>, D) }
389        }
390
391        #[inline]
392        unsafe fn decode(
393            &mut self,
394            decoder: &mut fidl::encoding::Decoder<'_, D>,
395            offset: usize,
396            _depth: fidl::encoding::Depth,
397        ) -> fidl::Result<()> {
398            decoder.debug_check_bounds::<Self>(offset);
399            // Verify that padding bytes are zero.
400            fidl::decode!(fidl::encoding::Vector<u8, 254>, D, &mut self.dataset, decoder, offset + 0, _depth)?;
401            Ok(())
402        }
403    }
404
405    impl fidl::encoding::ValueTypeMarker for DatasetAttachAllNodesToResponse {
406        type Borrowed<'a> = &'a Self;
407        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
408            value
409        }
410    }
411
412    unsafe impl fidl::encoding::TypeMarker for DatasetAttachAllNodesToResponse {
413        type Owned = Self;
414
415        #[inline(always)]
416        fn inline_align(_context: fidl::encoding::Context) -> usize {
417            8
418        }
419
420        #[inline(always)]
421        fn inline_size(_context: fidl::encoding::Context) -> usize {
422            8
423        }
424        #[inline(always)]
425        fn encode_is_copy() -> bool {
426            true
427        }
428
429        #[inline(always)]
430        fn decode_is_copy() -> bool {
431            true
432        }
433    }
434
435    unsafe impl<D: fidl::encoding::ResourceDialect>
436        fidl::encoding::Encode<DatasetAttachAllNodesToResponse, D>
437        for &DatasetAttachAllNodesToResponse
438    {
439        #[inline]
440        unsafe fn encode(
441            self,
442            encoder: &mut fidl::encoding::Encoder<'_, D>,
443            offset: usize,
444            _depth: fidl::encoding::Depth,
445        ) -> fidl::Result<()> {
446            encoder.debug_check_bounds::<DatasetAttachAllNodesToResponse>(offset);
447            unsafe {
448                // Copy the object into the buffer.
449                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
450                (buf_ptr as *mut DatasetAttachAllNodesToResponse)
451                    .write_unaligned((self as *const DatasetAttachAllNodesToResponse).read());
452                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
453                // done second because the memcpy will write garbage to these bytes.
454            }
455            Ok(())
456        }
457    }
458    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<i64, D>>
459        fidl::encoding::Encode<DatasetAttachAllNodesToResponse, D> for (T0,)
460    {
461        #[inline]
462        unsafe fn encode(
463            self,
464            encoder: &mut fidl::encoding::Encoder<'_, D>,
465            offset: usize,
466            depth: fidl::encoding::Depth,
467        ) -> fidl::Result<()> {
468            encoder.debug_check_bounds::<DatasetAttachAllNodesToResponse>(offset);
469            // Zero out padding regions. There's no need to apply masks
470            // because the unmasked parts will be overwritten by fields.
471            // Write the fields.
472            self.0.encode(encoder, offset + 0, depth)?;
473            Ok(())
474        }
475    }
476
477    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
478        for DatasetAttachAllNodesToResponse
479    {
480        #[inline(always)]
481        fn new_empty() -> Self {
482            Self { delay_ms: fidl::new_empty!(i64, D) }
483        }
484
485        #[inline]
486        unsafe fn decode(
487            &mut self,
488            decoder: &mut fidl::encoding::Decoder<'_, D>,
489            offset: usize,
490            _depth: fidl::encoding::Depth,
491        ) -> fidl::Result<()> {
492            decoder.debug_check_bounds::<Self>(offset);
493            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
494            // Verify that padding bytes are zero.
495            // Copy from the buffer into the object.
496            unsafe {
497                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 8);
498            }
499            Ok(())
500        }
501    }
502
503    impl fidl::encoding::ValueTypeMarker for DatasetGetActiveTlvsResponse {
504        type Borrowed<'a> = &'a Self;
505        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
506            value
507        }
508    }
509
510    unsafe impl fidl::encoding::TypeMarker for DatasetGetActiveTlvsResponse {
511        type Owned = Self;
512
513        #[inline(always)]
514        fn inline_align(_context: fidl::encoding::Context) -> usize {
515            8
516        }
517
518        #[inline(always)]
519        fn inline_size(_context: fidl::encoding::Context) -> usize {
520            16
521        }
522    }
523
524    unsafe impl<D: fidl::encoding::ResourceDialect>
525        fidl::encoding::Encode<DatasetGetActiveTlvsResponse, D> for &DatasetGetActiveTlvsResponse
526    {
527        #[inline]
528        unsafe fn encode(
529            self,
530            encoder: &mut fidl::encoding::Encoder<'_, D>,
531            offset: usize,
532            _depth: fidl::encoding::Depth,
533        ) -> fidl::Result<()> {
534            encoder.debug_check_bounds::<DatasetGetActiveTlvsResponse>(offset);
535            // Delegate to tuple encoding.
536            fidl::encoding::Encode::<DatasetGetActiveTlvsResponse, D>::encode(
537                (
538                    <fidl::encoding::Optional<fidl::encoding::Vector<u8, 254>> as fidl::encoding::ValueTypeMarker>::borrow(&self.dataset),
539                ),
540                encoder, offset, _depth
541            )
542        }
543    }
544    unsafe impl<
545            D: fidl::encoding::ResourceDialect,
546            T0: fidl::encoding::Encode<fidl::encoding::Optional<fidl::encoding::Vector<u8, 254>>, D>,
547        > fidl::encoding::Encode<DatasetGetActiveTlvsResponse, D> for (T0,)
548    {
549        #[inline]
550        unsafe fn encode(
551            self,
552            encoder: &mut fidl::encoding::Encoder<'_, D>,
553            offset: usize,
554            depth: fidl::encoding::Depth,
555        ) -> fidl::Result<()> {
556            encoder.debug_check_bounds::<DatasetGetActiveTlvsResponse>(offset);
557            // Zero out padding regions. There's no need to apply masks
558            // because the unmasked parts will be overwritten by fields.
559            // Write the fields.
560            self.0.encode(encoder, offset + 0, depth)?;
561            Ok(())
562        }
563    }
564
565    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
566        for DatasetGetActiveTlvsResponse
567    {
568        #[inline(always)]
569        fn new_empty() -> Self {
570            Self {
571                dataset: fidl::new_empty!(
572                    fidl::encoding::Optional<fidl::encoding::Vector<u8, 254>>,
573                    D
574                ),
575            }
576        }
577
578        #[inline]
579        unsafe fn decode(
580            &mut self,
581            decoder: &mut fidl::encoding::Decoder<'_, D>,
582            offset: usize,
583            _depth: fidl::encoding::Depth,
584        ) -> fidl::Result<()> {
585            decoder.debug_check_bounds::<Self>(offset);
586            // Verify that padding bytes are zero.
587            fidl::decode!(
588                fidl::encoding::Optional<fidl::encoding::Vector<u8, 254>>,
589                D,
590                &mut self.dataset,
591                decoder,
592                offset + 0,
593                _depth
594            )?;
595            Ok(())
596        }
597    }
598
599    impl fidl::encoding::ValueTypeMarker for DatasetSetActiveTlvsRequest {
600        type Borrowed<'a> = &'a Self;
601        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
602            value
603        }
604    }
605
606    unsafe impl fidl::encoding::TypeMarker for DatasetSetActiveTlvsRequest {
607        type Owned = Self;
608
609        #[inline(always)]
610        fn inline_align(_context: fidl::encoding::Context) -> usize {
611            8
612        }
613
614        #[inline(always)]
615        fn inline_size(_context: fidl::encoding::Context) -> usize {
616            16
617        }
618    }
619
620    unsafe impl<D: fidl::encoding::ResourceDialect>
621        fidl::encoding::Encode<DatasetSetActiveTlvsRequest, D> for &DatasetSetActiveTlvsRequest
622    {
623        #[inline]
624        unsafe fn encode(
625            self,
626            encoder: &mut fidl::encoding::Encoder<'_, D>,
627            offset: usize,
628            _depth: fidl::encoding::Depth,
629        ) -> fidl::Result<()> {
630            encoder.debug_check_bounds::<DatasetSetActiveTlvsRequest>(offset);
631            // Delegate to tuple encoding.
632            fidl::encoding::Encode::<DatasetSetActiveTlvsRequest, D>::encode(
633                (<fidl::encoding::Vector<u8, 254> as fidl::encoding::ValueTypeMarker>::borrow(
634                    &self.dataset,
635                ),),
636                encoder,
637                offset,
638                _depth,
639            )
640        }
641    }
642    unsafe impl<
643            D: fidl::encoding::ResourceDialect,
644            T0: fidl::encoding::Encode<fidl::encoding::Vector<u8, 254>, D>,
645        > fidl::encoding::Encode<DatasetSetActiveTlvsRequest, D> for (T0,)
646    {
647        #[inline]
648        unsafe fn encode(
649            self,
650            encoder: &mut fidl::encoding::Encoder<'_, D>,
651            offset: usize,
652            depth: fidl::encoding::Depth,
653        ) -> fidl::Result<()> {
654            encoder.debug_check_bounds::<DatasetSetActiveTlvsRequest>(offset);
655            // Zero out padding regions. There's no need to apply masks
656            // because the unmasked parts will be overwritten by fields.
657            // Write the fields.
658            self.0.encode(encoder, offset + 0, depth)?;
659            Ok(())
660        }
661    }
662
663    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
664        for DatasetSetActiveTlvsRequest
665    {
666        #[inline(always)]
667        fn new_empty() -> Self {
668            Self { dataset: fidl::new_empty!(fidl::encoding::Vector<u8, 254>, D) }
669        }
670
671        #[inline]
672        unsafe fn decode(
673            &mut self,
674            decoder: &mut fidl::encoding::Decoder<'_, D>,
675            offset: usize,
676            _depth: fidl::encoding::Depth,
677        ) -> fidl::Result<()> {
678            decoder.debug_check_bounds::<Self>(offset);
679            // Verify that padding bytes are zero.
680            fidl::decode!(fidl::encoding::Vector<u8, 254>, D, &mut self.dataset, decoder, offset + 0, _depth)?;
681            Ok(())
682        }
683    }
684
685    impl fidl::encoding::ValueTypeMarker for FeatureGetFeatureConfigResponse {
686        type Borrowed<'a> = &'a Self;
687        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
688            value
689        }
690    }
691
692    unsafe impl fidl::encoding::TypeMarker for FeatureGetFeatureConfigResponse {
693        type Owned = Self;
694
695        #[inline(always)]
696        fn inline_align(_context: fidl::encoding::Context) -> usize {
697            8
698        }
699
700        #[inline(always)]
701        fn inline_size(_context: fidl::encoding::Context) -> usize {
702            16
703        }
704    }
705
706    unsafe impl<D: fidl::encoding::ResourceDialect>
707        fidl::encoding::Encode<FeatureGetFeatureConfigResponse, D>
708        for &FeatureGetFeatureConfigResponse
709    {
710        #[inline]
711        unsafe fn encode(
712            self,
713            encoder: &mut fidl::encoding::Encoder<'_, D>,
714            offset: usize,
715            _depth: fidl::encoding::Depth,
716        ) -> fidl::Result<()> {
717            encoder.debug_check_bounds::<FeatureGetFeatureConfigResponse>(offset);
718            // Delegate to tuple encoding.
719            fidl::encoding::Encode::<FeatureGetFeatureConfigResponse, D>::encode(
720                (<FeatureConfig as fidl::encoding::ValueTypeMarker>::borrow(&self.config),),
721                encoder,
722                offset,
723                _depth,
724            )
725        }
726    }
727    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<FeatureConfig, D>>
728        fidl::encoding::Encode<FeatureGetFeatureConfigResponse, D> for (T0,)
729    {
730        #[inline]
731        unsafe fn encode(
732            self,
733            encoder: &mut fidl::encoding::Encoder<'_, D>,
734            offset: usize,
735            depth: fidl::encoding::Depth,
736        ) -> fidl::Result<()> {
737            encoder.debug_check_bounds::<FeatureGetFeatureConfigResponse>(offset);
738            // Zero out padding regions. There's no need to apply masks
739            // because the unmasked parts will be overwritten by fields.
740            // Write the fields.
741            self.0.encode(encoder, offset + 0, depth)?;
742            Ok(())
743        }
744    }
745
746    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
747        for FeatureGetFeatureConfigResponse
748    {
749        #[inline(always)]
750        fn new_empty() -> Self {
751            Self { config: fidl::new_empty!(FeatureConfig, D) }
752        }
753
754        #[inline]
755        unsafe fn decode(
756            &mut self,
757            decoder: &mut fidl::encoding::Decoder<'_, D>,
758            offset: usize,
759            _depth: fidl::encoding::Depth,
760        ) -> fidl::Result<()> {
761            decoder.debug_check_bounds::<Self>(offset);
762            // Verify that padding bytes are zero.
763            fidl::decode!(FeatureConfig, D, &mut self.config, decoder, offset + 0, _depth)?;
764            Ok(())
765        }
766    }
767
768    impl fidl::encoding::ValueTypeMarker for FeatureUpdateFeatureConfigRequest {
769        type Borrowed<'a> = &'a Self;
770        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
771            value
772        }
773    }
774
775    unsafe impl fidl::encoding::TypeMarker for FeatureUpdateFeatureConfigRequest {
776        type Owned = Self;
777
778        #[inline(always)]
779        fn inline_align(_context: fidl::encoding::Context) -> usize {
780            8
781        }
782
783        #[inline(always)]
784        fn inline_size(_context: fidl::encoding::Context) -> usize {
785            16
786        }
787    }
788
789    unsafe impl<D: fidl::encoding::ResourceDialect>
790        fidl::encoding::Encode<FeatureUpdateFeatureConfigRequest, D>
791        for &FeatureUpdateFeatureConfigRequest
792    {
793        #[inline]
794        unsafe fn encode(
795            self,
796            encoder: &mut fidl::encoding::Encoder<'_, D>,
797            offset: usize,
798            _depth: fidl::encoding::Depth,
799        ) -> fidl::Result<()> {
800            encoder.debug_check_bounds::<FeatureUpdateFeatureConfigRequest>(offset);
801            // Delegate to tuple encoding.
802            fidl::encoding::Encode::<FeatureUpdateFeatureConfigRequest, D>::encode(
803                (<FeatureConfig as fidl::encoding::ValueTypeMarker>::borrow(&self.config),),
804                encoder,
805                offset,
806                _depth,
807            )
808        }
809    }
810    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<FeatureConfig, D>>
811        fidl::encoding::Encode<FeatureUpdateFeatureConfigRequest, D> for (T0,)
812    {
813        #[inline]
814        unsafe fn encode(
815            self,
816            encoder: &mut fidl::encoding::Encoder<'_, D>,
817            offset: usize,
818            depth: fidl::encoding::Depth,
819        ) -> fidl::Result<()> {
820            encoder.debug_check_bounds::<FeatureUpdateFeatureConfigRequest>(offset);
821            // Zero out padding regions. There's no need to apply masks
822            // because the unmasked parts will be overwritten by fields.
823            // Write the fields.
824            self.0.encode(encoder, offset + 0, depth)?;
825            Ok(())
826        }
827    }
828
829    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
830        for FeatureUpdateFeatureConfigRequest
831    {
832        #[inline(always)]
833        fn new_empty() -> Self {
834            Self { config: fidl::new_empty!(FeatureConfig, D) }
835        }
836
837        #[inline]
838        unsafe fn decode(
839            &mut self,
840            decoder: &mut fidl::encoding::Decoder<'_, D>,
841            offset: usize,
842            _depth: fidl::encoding::Depth,
843        ) -> fidl::Result<()> {
844            decoder.debug_check_bounds::<Self>(offset);
845            // Verify that padding bytes are zero.
846            fidl::decode!(FeatureConfig, D, &mut self.config, decoder, offset + 0, _depth)?;
847            Ok(())
848        }
849    }
850
851    impl fidl::encoding::ValueTypeMarker for MeshcopUpdateTxtEntriesRequest {
852        type Borrowed<'a> = &'a Self;
853        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
854            value
855        }
856    }
857
858    unsafe impl fidl::encoding::TypeMarker for MeshcopUpdateTxtEntriesRequest {
859        type Owned = Self;
860
861        #[inline(always)]
862        fn inline_align(_context: fidl::encoding::Context) -> usize {
863            8
864        }
865
866        #[inline(always)]
867        fn inline_size(_context: fidl::encoding::Context) -> usize {
868            16
869        }
870    }
871
872    unsafe impl<D: fidl::encoding::ResourceDialect>
873        fidl::encoding::Encode<MeshcopUpdateTxtEntriesRequest, D>
874        for &MeshcopUpdateTxtEntriesRequest
875    {
876        #[inline]
877        unsafe fn encode(
878            self,
879            encoder: &mut fidl::encoding::Encoder<'_, D>,
880            offset: usize,
881            _depth: fidl::encoding::Depth,
882        ) -> fidl::Result<()> {
883            encoder.debug_check_bounds::<MeshcopUpdateTxtEntriesRequest>(offset);
884            // Delegate to tuple encoding.
885            fidl::encoding::Encode::<MeshcopUpdateTxtEntriesRequest, D>::encode(
886                (
887                    <fidl::encoding::Vector<TxtEntries, 32> as fidl::encoding::ValueTypeMarker>::borrow(&self.txt_entries),
888                ),
889                encoder, offset, _depth
890            )
891        }
892    }
893    unsafe impl<
894            D: fidl::encoding::ResourceDialect,
895            T0: fidl::encoding::Encode<fidl::encoding::Vector<TxtEntries, 32>, D>,
896        > fidl::encoding::Encode<MeshcopUpdateTxtEntriesRequest, D> for (T0,)
897    {
898        #[inline]
899        unsafe fn encode(
900            self,
901            encoder: &mut fidl::encoding::Encoder<'_, D>,
902            offset: usize,
903            depth: fidl::encoding::Depth,
904        ) -> fidl::Result<()> {
905            encoder.debug_check_bounds::<MeshcopUpdateTxtEntriesRequest>(offset);
906            // Zero out padding regions. There's no need to apply masks
907            // because the unmasked parts will be overwritten by fields.
908            // Write the fields.
909            self.0.encode(encoder, offset + 0, depth)?;
910            Ok(())
911        }
912    }
913
914    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
915        for MeshcopUpdateTxtEntriesRequest
916    {
917        #[inline(always)]
918        fn new_empty() -> Self {
919            Self { txt_entries: fidl::new_empty!(fidl::encoding::Vector<TxtEntries, 32>, D) }
920        }
921
922        #[inline]
923        unsafe fn decode(
924            &mut self,
925            decoder: &mut fidl::encoding::Decoder<'_, D>,
926            offset: usize,
927            _depth: fidl::encoding::Depth,
928        ) -> fidl::Result<()> {
929            decoder.debug_check_bounds::<Self>(offset);
930            // Verify that padding bytes are zero.
931            fidl::decode!(fidl::encoding::Vector<TxtEntries, 32>, D, &mut self.txt_entries, decoder, offset + 0, _depth)?;
932            Ok(())
933        }
934    }
935
936    impl fidl::encoding::ValueTypeMarker for ThreadCapabilitiesGetCapabilitiesResponse {
937        type Borrowed<'a> = &'a Self;
938        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
939            value
940        }
941    }
942
943    unsafe impl fidl::encoding::TypeMarker for ThreadCapabilitiesGetCapabilitiesResponse {
944        type Owned = Self;
945
946        #[inline(always)]
947        fn inline_align(_context: fidl::encoding::Context) -> usize {
948            8
949        }
950
951        #[inline(always)]
952        fn inline_size(_context: fidl::encoding::Context) -> usize {
953            16
954        }
955    }
956
957    unsafe impl<D: fidl::encoding::ResourceDialect>
958        fidl::encoding::Encode<ThreadCapabilitiesGetCapabilitiesResponse, D>
959        for &ThreadCapabilitiesGetCapabilitiesResponse
960    {
961        #[inline]
962        unsafe fn encode(
963            self,
964            encoder: &mut fidl::encoding::Encoder<'_, D>,
965            offset: usize,
966            _depth: fidl::encoding::Depth,
967        ) -> fidl::Result<()> {
968            encoder.debug_check_bounds::<ThreadCapabilitiesGetCapabilitiesResponse>(offset);
969            // Delegate to tuple encoding.
970            fidl::encoding::Encode::<ThreadCapabilitiesGetCapabilitiesResponse, D>::encode(
971                (<Capabilities as fidl::encoding::ValueTypeMarker>::borrow(&self.capabilities),),
972                encoder,
973                offset,
974                _depth,
975            )
976        }
977    }
978    unsafe impl<D: fidl::encoding::ResourceDialect, T0: fidl::encoding::Encode<Capabilities, D>>
979        fidl::encoding::Encode<ThreadCapabilitiesGetCapabilitiesResponse, D> for (T0,)
980    {
981        #[inline]
982        unsafe fn encode(
983            self,
984            encoder: &mut fidl::encoding::Encoder<'_, D>,
985            offset: usize,
986            depth: fidl::encoding::Depth,
987        ) -> fidl::Result<()> {
988            encoder.debug_check_bounds::<ThreadCapabilitiesGetCapabilitiesResponse>(offset);
989            // Zero out padding regions. There's no need to apply masks
990            // because the unmasked parts will be overwritten by fields.
991            // Write the fields.
992            self.0.encode(encoder, offset + 0, depth)?;
993            Ok(())
994        }
995    }
996
997    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
998        for ThreadCapabilitiesGetCapabilitiesResponse
999    {
1000        #[inline(always)]
1001        fn new_empty() -> Self {
1002            Self { capabilities: fidl::new_empty!(Capabilities, D) }
1003        }
1004
1005        #[inline]
1006        unsafe fn decode(
1007            &mut self,
1008            decoder: &mut fidl::encoding::Decoder<'_, D>,
1009            offset: usize,
1010            _depth: fidl::encoding::Depth,
1011        ) -> fidl::Result<()> {
1012            decoder.debug_check_bounds::<Self>(offset);
1013            // Verify that padding bytes are zero.
1014            fidl::decode!(Capabilities, D, &mut self.capabilities, decoder, offset + 0, _depth)?;
1015            Ok(())
1016        }
1017    }
1018
1019    impl fidl::encoding::ValueTypeMarker for TxtEntries {
1020        type Borrowed<'a> = &'a Self;
1021        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1022            value
1023        }
1024    }
1025
1026    unsafe impl fidl::encoding::TypeMarker for TxtEntries {
1027        type Owned = Self;
1028
1029        #[inline(always)]
1030        fn inline_align(_context: fidl::encoding::Context) -> usize {
1031            8
1032        }
1033
1034        #[inline(always)]
1035        fn inline_size(_context: fidl::encoding::Context) -> usize {
1036            32
1037        }
1038    }
1039
1040    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<TxtEntries, D>
1041        for &TxtEntries
1042    {
1043        #[inline]
1044        unsafe fn encode(
1045            self,
1046            encoder: &mut fidl::encoding::Encoder<'_, D>,
1047            offset: usize,
1048            _depth: fidl::encoding::Depth,
1049        ) -> fidl::Result<()> {
1050            encoder.debug_check_bounds::<TxtEntries>(offset);
1051            // Delegate to tuple encoding.
1052            fidl::encoding::Encode::<TxtEntries, D>::encode(
1053                (
1054                    <fidl::encoding::BoundedString<254> as fidl::encoding::ValueTypeMarker>::borrow(
1055                        &self.key,
1056                    ),
1057                    <fidl::encoding::Vector<u8, 253> as fidl::encoding::ValueTypeMarker>::borrow(
1058                        &self.value,
1059                    ),
1060                ),
1061                encoder,
1062                offset,
1063                _depth,
1064            )
1065        }
1066    }
1067    unsafe impl<
1068            D: fidl::encoding::ResourceDialect,
1069            T0: fidl::encoding::Encode<fidl::encoding::BoundedString<254>, D>,
1070            T1: fidl::encoding::Encode<fidl::encoding::Vector<u8, 253>, D>,
1071        > fidl::encoding::Encode<TxtEntries, D> for (T0, T1)
1072    {
1073        #[inline]
1074        unsafe fn encode(
1075            self,
1076            encoder: &mut fidl::encoding::Encoder<'_, D>,
1077            offset: usize,
1078            depth: fidl::encoding::Depth,
1079        ) -> fidl::Result<()> {
1080            encoder.debug_check_bounds::<TxtEntries>(offset);
1081            // Zero out padding regions. There's no need to apply masks
1082            // because the unmasked parts will be overwritten by fields.
1083            // Write the fields.
1084            self.0.encode(encoder, offset + 0, depth)?;
1085            self.1.encode(encoder, offset + 16, depth)?;
1086            Ok(())
1087        }
1088    }
1089
1090    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for TxtEntries {
1091        #[inline(always)]
1092        fn new_empty() -> Self {
1093            Self {
1094                key: fidl::new_empty!(fidl::encoding::BoundedString<254>, D),
1095                value: fidl::new_empty!(fidl::encoding::Vector<u8, 253>, D),
1096            }
1097        }
1098
1099        #[inline]
1100        unsafe fn decode(
1101            &mut self,
1102            decoder: &mut fidl::encoding::Decoder<'_, D>,
1103            offset: usize,
1104            _depth: fidl::encoding::Depth,
1105        ) -> fidl::Result<()> {
1106            decoder.debug_check_bounds::<Self>(offset);
1107            // Verify that padding bytes are zero.
1108            fidl::decode!(
1109                fidl::encoding::BoundedString<254>,
1110                D,
1111                &mut self.key,
1112                decoder,
1113                offset + 0,
1114                _depth
1115            )?;
1116            fidl::decode!(fidl::encoding::Vector<u8, 253>, D, &mut self.value, decoder, offset + 16, _depth)?;
1117            Ok(())
1118        }
1119    }
1120
1121    impl Capabilities {
1122        #[inline(always)]
1123        fn max_ordinal_present(&self) -> u64 {
1124            if let Some(_) = self.dhcpv6_pd {
1125                return 2;
1126            }
1127            if let Some(_) = self.nat64 {
1128                return 1;
1129            }
1130            0
1131        }
1132    }
1133
1134    impl fidl::encoding::ValueTypeMarker for Capabilities {
1135        type Borrowed<'a> = &'a Self;
1136        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1137            value
1138        }
1139    }
1140
1141    unsafe impl fidl::encoding::TypeMarker for Capabilities {
1142        type Owned = Self;
1143
1144        #[inline(always)]
1145        fn inline_align(_context: fidl::encoding::Context) -> usize {
1146            8
1147        }
1148
1149        #[inline(always)]
1150        fn inline_size(_context: fidl::encoding::Context) -> usize {
1151            16
1152        }
1153    }
1154
1155    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Capabilities, D>
1156        for &Capabilities
1157    {
1158        unsafe fn encode(
1159            self,
1160            encoder: &mut fidl::encoding::Encoder<'_, D>,
1161            offset: usize,
1162            mut depth: fidl::encoding::Depth,
1163        ) -> fidl::Result<()> {
1164            encoder.debug_check_bounds::<Capabilities>(offset);
1165            // Vector header
1166            let max_ordinal: u64 = self.max_ordinal_present();
1167            encoder.write_num(max_ordinal, offset);
1168            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1169            // Calling encoder.out_of_line_offset(0) is not allowed.
1170            if max_ordinal == 0 {
1171                return Ok(());
1172            }
1173            depth.increment()?;
1174            let envelope_size = 8;
1175            let bytes_len = max_ordinal as usize * envelope_size;
1176            #[allow(unused_variables)]
1177            let offset = encoder.out_of_line_offset(bytes_len);
1178            let mut _prev_end_offset: usize = 0;
1179            if 1 > max_ordinal {
1180                return Ok(());
1181            }
1182
1183            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1184            // are envelope_size bytes.
1185            let cur_offset: usize = (1 - 1) * envelope_size;
1186
1187            // Zero reserved fields.
1188            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1189
1190            // Safety:
1191            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1192            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1193            //   envelope_size bytes, there is always sufficient room.
1194            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1195                self.nat64.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1196                encoder,
1197                offset + cur_offset,
1198                depth,
1199            )?;
1200
1201            _prev_end_offset = cur_offset + envelope_size;
1202            if 2 > max_ordinal {
1203                return Ok(());
1204            }
1205
1206            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1207            // are envelope_size bytes.
1208            let cur_offset: usize = (2 - 1) * envelope_size;
1209
1210            // Zero reserved fields.
1211            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1212
1213            // Safety:
1214            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1215            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1216            //   envelope_size bytes, there is always sufficient room.
1217            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1218                self.dhcpv6_pd.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1219                encoder,
1220                offset + cur_offset,
1221                depth,
1222            )?;
1223
1224            _prev_end_offset = cur_offset + envelope_size;
1225
1226            Ok(())
1227        }
1228    }
1229
1230    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for Capabilities {
1231        #[inline(always)]
1232        fn new_empty() -> Self {
1233            Self::default()
1234        }
1235
1236        unsafe fn decode(
1237            &mut self,
1238            decoder: &mut fidl::encoding::Decoder<'_, D>,
1239            offset: usize,
1240            mut depth: fidl::encoding::Depth,
1241        ) -> fidl::Result<()> {
1242            decoder.debug_check_bounds::<Self>(offset);
1243            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1244                None => return Err(fidl::Error::NotNullable),
1245                Some(len) => len,
1246            };
1247            // Calling decoder.out_of_line_offset(0) is not allowed.
1248            if len == 0 {
1249                return Ok(());
1250            };
1251            depth.increment()?;
1252            let envelope_size = 8;
1253            let bytes_len = len * envelope_size;
1254            let offset = decoder.out_of_line_offset(bytes_len)?;
1255            // Decode the envelope for each type.
1256            let mut _next_ordinal_to_read = 0;
1257            let mut next_offset = offset;
1258            let end_offset = offset + bytes_len;
1259            _next_ordinal_to_read += 1;
1260            if next_offset >= end_offset {
1261                return Ok(());
1262            }
1263
1264            // Decode unknown envelopes for gaps in ordinals.
1265            while _next_ordinal_to_read < 1 {
1266                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1267                _next_ordinal_to_read += 1;
1268                next_offset += envelope_size;
1269            }
1270
1271            let next_out_of_line = decoder.next_out_of_line();
1272            let handles_before = decoder.remaining_handles();
1273            if let Some((inlined, num_bytes, num_handles)) =
1274                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1275            {
1276                let member_inline_size =
1277                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1278                if inlined != (member_inline_size <= 4) {
1279                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1280                }
1281                let inner_offset;
1282                let mut inner_depth = depth.clone();
1283                if inlined {
1284                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1285                    inner_offset = next_offset;
1286                } else {
1287                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1288                    inner_depth.increment()?;
1289                }
1290                let val_ref = self.nat64.get_or_insert_with(|| fidl::new_empty!(bool, D));
1291                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1292                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1293                {
1294                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1295                }
1296                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1297                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1298                }
1299            }
1300
1301            next_offset += envelope_size;
1302            _next_ordinal_to_read += 1;
1303            if next_offset >= end_offset {
1304                return Ok(());
1305            }
1306
1307            // Decode unknown envelopes for gaps in ordinals.
1308            while _next_ordinal_to_read < 2 {
1309                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1310                _next_ordinal_to_read += 1;
1311                next_offset += envelope_size;
1312            }
1313
1314            let next_out_of_line = decoder.next_out_of_line();
1315            let handles_before = decoder.remaining_handles();
1316            if let Some((inlined, num_bytes, num_handles)) =
1317                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1318            {
1319                let member_inline_size =
1320                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1321                if inlined != (member_inline_size <= 4) {
1322                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1323                }
1324                let inner_offset;
1325                let mut inner_depth = depth.clone();
1326                if inlined {
1327                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1328                    inner_offset = next_offset;
1329                } else {
1330                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1331                    inner_depth.increment()?;
1332                }
1333                let val_ref = self.dhcpv6_pd.get_or_insert_with(|| fidl::new_empty!(bool, D));
1334                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1335                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1336                {
1337                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1338                }
1339                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1340                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1341                }
1342            }
1343
1344            next_offset += envelope_size;
1345
1346            // Decode the remaining unknown envelopes.
1347            while next_offset < end_offset {
1348                _next_ordinal_to_read += 1;
1349                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1350                next_offset += envelope_size;
1351            }
1352
1353            Ok(())
1354        }
1355    }
1356
1357    impl FeatureConfig {
1358        #[inline(always)]
1359        fn max_ordinal_present(&self) -> u64 {
1360            if let Some(_) = self.link_metrics_manager_enabled {
1361                return 8;
1362            }
1363            if let Some(_) = self.dns_upstream_query_enabled {
1364                return 7;
1365            }
1366            if let Some(_) = self.dhcpv6_pd_enabled {
1367                return 6;
1368            }
1369            if let Some(_) = self.detailed_logging_level {
1370                return 5;
1371            }
1372            if let Some(_) = self.detailed_logging_enabled {
1373                return 4;
1374            }
1375            if let Some(_) = self.srp_replication_enabled {
1376                return 3;
1377            }
1378            if let Some(_) = self.nat64_enabled {
1379                return 2;
1380            }
1381            if let Some(_) = self.trel_enabled {
1382                return 1;
1383            }
1384            0
1385        }
1386    }
1387
1388    impl fidl::encoding::ValueTypeMarker for FeatureConfig {
1389        type Borrowed<'a> = &'a Self;
1390        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1391            value
1392        }
1393    }
1394
1395    unsafe impl fidl::encoding::TypeMarker for FeatureConfig {
1396        type Owned = Self;
1397
1398        #[inline(always)]
1399        fn inline_align(_context: fidl::encoding::Context) -> usize {
1400            8
1401        }
1402
1403        #[inline(always)]
1404        fn inline_size(_context: fidl::encoding::Context) -> usize {
1405            16
1406        }
1407    }
1408
1409    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<FeatureConfig, D>
1410        for &FeatureConfig
1411    {
1412        unsafe fn encode(
1413            self,
1414            encoder: &mut fidl::encoding::Encoder<'_, D>,
1415            offset: usize,
1416            mut depth: fidl::encoding::Depth,
1417        ) -> fidl::Result<()> {
1418            encoder.debug_check_bounds::<FeatureConfig>(offset);
1419            // Vector header
1420            let max_ordinal: u64 = self.max_ordinal_present();
1421            encoder.write_num(max_ordinal, offset);
1422            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1423            // Calling encoder.out_of_line_offset(0) is not allowed.
1424            if max_ordinal == 0 {
1425                return Ok(());
1426            }
1427            depth.increment()?;
1428            let envelope_size = 8;
1429            let bytes_len = max_ordinal as usize * envelope_size;
1430            #[allow(unused_variables)]
1431            let offset = encoder.out_of_line_offset(bytes_len);
1432            let mut _prev_end_offset: usize = 0;
1433            if 1 > max_ordinal {
1434                return Ok(());
1435            }
1436
1437            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1438            // are envelope_size bytes.
1439            let cur_offset: usize = (1 - 1) * envelope_size;
1440
1441            // Zero reserved fields.
1442            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1443
1444            // Safety:
1445            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1446            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1447            //   envelope_size bytes, there is always sufficient room.
1448            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1449                self.trel_enabled.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1450                encoder,
1451                offset + cur_offset,
1452                depth,
1453            )?;
1454
1455            _prev_end_offset = cur_offset + envelope_size;
1456            if 2 > max_ordinal {
1457                return Ok(());
1458            }
1459
1460            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1461            // are envelope_size bytes.
1462            let cur_offset: usize = (2 - 1) * envelope_size;
1463
1464            // Zero reserved fields.
1465            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1466
1467            // Safety:
1468            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1469            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1470            //   envelope_size bytes, there is always sufficient room.
1471            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1472                self.nat64_enabled.as_ref().map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1473                encoder,
1474                offset + cur_offset,
1475                depth,
1476            )?;
1477
1478            _prev_end_offset = cur_offset + envelope_size;
1479            if 3 > max_ordinal {
1480                return Ok(());
1481            }
1482
1483            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1484            // are envelope_size bytes.
1485            let cur_offset: usize = (3 - 1) * envelope_size;
1486
1487            // Zero reserved fields.
1488            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1489
1490            // Safety:
1491            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1492            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1493            //   envelope_size bytes, there is always sufficient room.
1494            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1495                self.srp_replication_enabled
1496                    .as_ref()
1497                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1498                encoder,
1499                offset + cur_offset,
1500                depth,
1501            )?;
1502
1503            _prev_end_offset = cur_offset + envelope_size;
1504            if 4 > max_ordinal {
1505                return Ok(());
1506            }
1507
1508            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1509            // are envelope_size bytes.
1510            let cur_offset: usize = (4 - 1) * envelope_size;
1511
1512            // Zero reserved fields.
1513            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1514
1515            // Safety:
1516            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1517            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1518            //   envelope_size bytes, there is always sufficient room.
1519            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1520                self.detailed_logging_enabled
1521                    .as_ref()
1522                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1523                encoder,
1524                offset + cur_offset,
1525                depth,
1526            )?;
1527
1528            _prev_end_offset = cur_offset + envelope_size;
1529            if 5 > max_ordinal {
1530                return Ok(());
1531            }
1532
1533            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1534            // are envelope_size bytes.
1535            let cur_offset: usize = (5 - 1) * envelope_size;
1536
1537            // Zero reserved fields.
1538            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1539
1540            // Safety:
1541            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1542            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1543            //   envelope_size bytes, there is always sufficient room.
1544            fidl::encoding::encode_in_envelope_optional::<DetailedLoggingLevel, D>(
1545                self.detailed_logging_level
1546                    .as_ref()
1547                    .map(<DetailedLoggingLevel as fidl::encoding::ValueTypeMarker>::borrow),
1548                encoder,
1549                offset + cur_offset,
1550                depth,
1551            )?;
1552
1553            _prev_end_offset = cur_offset + envelope_size;
1554            if 6 > max_ordinal {
1555                return Ok(());
1556            }
1557
1558            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1559            // are envelope_size bytes.
1560            let cur_offset: usize = (6 - 1) * envelope_size;
1561
1562            // Zero reserved fields.
1563            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1564
1565            // Safety:
1566            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1567            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1568            //   envelope_size bytes, there is always sufficient room.
1569            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1570                self.dhcpv6_pd_enabled
1571                    .as_ref()
1572                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1573                encoder,
1574                offset + cur_offset,
1575                depth,
1576            )?;
1577
1578            _prev_end_offset = cur_offset + envelope_size;
1579            if 7 > max_ordinal {
1580                return Ok(());
1581            }
1582
1583            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1584            // are envelope_size bytes.
1585            let cur_offset: usize = (7 - 1) * envelope_size;
1586
1587            // Zero reserved fields.
1588            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1589
1590            // Safety:
1591            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1592            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1593            //   envelope_size bytes, there is always sufficient room.
1594            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1595                self.dns_upstream_query_enabled
1596                    .as_ref()
1597                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1598                encoder,
1599                offset + cur_offset,
1600                depth,
1601            )?;
1602
1603            _prev_end_offset = cur_offset + envelope_size;
1604            if 8 > max_ordinal {
1605                return Ok(());
1606            }
1607
1608            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1609            // are envelope_size bytes.
1610            let cur_offset: usize = (8 - 1) * envelope_size;
1611
1612            // Zero reserved fields.
1613            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1614
1615            // Safety:
1616            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1617            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1618            //   envelope_size bytes, there is always sufficient room.
1619            fidl::encoding::encode_in_envelope_optional::<bool, D>(
1620                self.link_metrics_manager_enabled
1621                    .as_ref()
1622                    .map(<bool as fidl::encoding::ValueTypeMarker>::borrow),
1623                encoder,
1624                offset + cur_offset,
1625                depth,
1626            )?;
1627
1628            _prev_end_offset = cur_offset + envelope_size;
1629
1630            Ok(())
1631        }
1632    }
1633
1634    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for FeatureConfig {
1635        #[inline(always)]
1636        fn new_empty() -> Self {
1637            Self::default()
1638        }
1639
1640        unsafe fn decode(
1641            &mut self,
1642            decoder: &mut fidl::encoding::Decoder<'_, D>,
1643            offset: usize,
1644            mut depth: fidl::encoding::Depth,
1645        ) -> fidl::Result<()> {
1646            decoder.debug_check_bounds::<Self>(offset);
1647            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1648                None => return Err(fidl::Error::NotNullable),
1649                Some(len) => len,
1650            };
1651            // Calling decoder.out_of_line_offset(0) is not allowed.
1652            if len == 0 {
1653                return Ok(());
1654            };
1655            depth.increment()?;
1656            let envelope_size = 8;
1657            let bytes_len = len * envelope_size;
1658            let offset = decoder.out_of_line_offset(bytes_len)?;
1659            // Decode the envelope for each type.
1660            let mut _next_ordinal_to_read = 0;
1661            let mut next_offset = offset;
1662            let end_offset = offset + bytes_len;
1663            _next_ordinal_to_read += 1;
1664            if next_offset >= end_offset {
1665                return Ok(());
1666            }
1667
1668            // Decode unknown envelopes for gaps in ordinals.
1669            while _next_ordinal_to_read < 1 {
1670                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1671                _next_ordinal_to_read += 1;
1672                next_offset += envelope_size;
1673            }
1674
1675            let next_out_of_line = decoder.next_out_of_line();
1676            let handles_before = decoder.remaining_handles();
1677            if let Some((inlined, num_bytes, num_handles)) =
1678                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1679            {
1680                let member_inline_size =
1681                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1682                if inlined != (member_inline_size <= 4) {
1683                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1684                }
1685                let inner_offset;
1686                let mut inner_depth = depth.clone();
1687                if inlined {
1688                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1689                    inner_offset = next_offset;
1690                } else {
1691                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1692                    inner_depth.increment()?;
1693                }
1694                let val_ref = self.trel_enabled.get_or_insert_with(|| fidl::new_empty!(bool, D));
1695                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1696                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1697                {
1698                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1699                }
1700                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1701                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1702                }
1703            }
1704
1705            next_offset += envelope_size;
1706            _next_ordinal_to_read += 1;
1707            if next_offset >= end_offset {
1708                return Ok(());
1709            }
1710
1711            // Decode unknown envelopes for gaps in ordinals.
1712            while _next_ordinal_to_read < 2 {
1713                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1714                _next_ordinal_to_read += 1;
1715                next_offset += envelope_size;
1716            }
1717
1718            let next_out_of_line = decoder.next_out_of_line();
1719            let handles_before = decoder.remaining_handles();
1720            if let Some((inlined, num_bytes, num_handles)) =
1721                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1722            {
1723                let member_inline_size =
1724                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1725                if inlined != (member_inline_size <= 4) {
1726                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1727                }
1728                let inner_offset;
1729                let mut inner_depth = depth.clone();
1730                if inlined {
1731                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1732                    inner_offset = next_offset;
1733                } else {
1734                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1735                    inner_depth.increment()?;
1736                }
1737                let val_ref = self.nat64_enabled.get_or_insert_with(|| fidl::new_empty!(bool, D));
1738                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1739                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1740                {
1741                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1742                }
1743                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1744                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1745                }
1746            }
1747
1748            next_offset += envelope_size;
1749            _next_ordinal_to_read += 1;
1750            if next_offset >= end_offset {
1751                return Ok(());
1752            }
1753
1754            // Decode unknown envelopes for gaps in ordinals.
1755            while _next_ordinal_to_read < 3 {
1756                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1757                _next_ordinal_to_read += 1;
1758                next_offset += envelope_size;
1759            }
1760
1761            let next_out_of_line = decoder.next_out_of_line();
1762            let handles_before = decoder.remaining_handles();
1763            if let Some((inlined, num_bytes, num_handles)) =
1764                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1765            {
1766                let member_inline_size =
1767                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1768                if inlined != (member_inline_size <= 4) {
1769                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1770                }
1771                let inner_offset;
1772                let mut inner_depth = depth.clone();
1773                if inlined {
1774                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1775                    inner_offset = next_offset;
1776                } else {
1777                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1778                    inner_depth.increment()?;
1779                }
1780                let val_ref =
1781                    self.srp_replication_enabled.get_or_insert_with(|| fidl::new_empty!(bool, D));
1782                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1783                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1784                {
1785                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1786                }
1787                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1788                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1789                }
1790            }
1791
1792            next_offset += envelope_size;
1793            _next_ordinal_to_read += 1;
1794            if next_offset >= end_offset {
1795                return Ok(());
1796            }
1797
1798            // Decode unknown envelopes for gaps in ordinals.
1799            while _next_ordinal_to_read < 4 {
1800                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1801                _next_ordinal_to_read += 1;
1802                next_offset += envelope_size;
1803            }
1804
1805            let next_out_of_line = decoder.next_out_of_line();
1806            let handles_before = decoder.remaining_handles();
1807            if let Some((inlined, num_bytes, num_handles)) =
1808                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1809            {
1810                let member_inline_size =
1811                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1812                if inlined != (member_inline_size <= 4) {
1813                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1814                }
1815                let inner_offset;
1816                let mut inner_depth = depth.clone();
1817                if inlined {
1818                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1819                    inner_offset = next_offset;
1820                } else {
1821                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1822                    inner_depth.increment()?;
1823                }
1824                let val_ref =
1825                    self.detailed_logging_enabled.get_or_insert_with(|| fidl::new_empty!(bool, D));
1826                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1827                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1828                {
1829                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1830                }
1831                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1832                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1833                }
1834            }
1835
1836            next_offset += envelope_size;
1837            _next_ordinal_to_read += 1;
1838            if next_offset >= end_offset {
1839                return Ok(());
1840            }
1841
1842            // Decode unknown envelopes for gaps in ordinals.
1843            while _next_ordinal_to_read < 5 {
1844                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1845                _next_ordinal_to_read += 1;
1846                next_offset += envelope_size;
1847            }
1848
1849            let next_out_of_line = decoder.next_out_of_line();
1850            let handles_before = decoder.remaining_handles();
1851            if let Some((inlined, num_bytes, num_handles)) =
1852                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1853            {
1854                let member_inline_size =
1855                    <DetailedLoggingLevel as fidl::encoding::TypeMarker>::inline_size(
1856                        decoder.context,
1857                    );
1858                if inlined != (member_inline_size <= 4) {
1859                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1860                }
1861                let inner_offset;
1862                let mut inner_depth = depth.clone();
1863                if inlined {
1864                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1865                    inner_offset = next_offset;
1866                } else {
1867                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1868                    inner_depth.increment()?;
1869                }
1870                let val_ref = self
1871                    .detailed_logging_level
1872                    .get_or_insert_with(|| fidl::new_empty!(DetailedLoggingLevel, D));
1873                fidl::decode!(
1874                    DetailedLoggingLevel,
1875                    D,
1876                    val_ref,
1877                    decoder,
1878                    inner_offset,
1879                    inner_depth
1880                )?;
1881                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1882                {
1883                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1884                }
1885                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1886                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1887                }
1888            }
1889
1890            next_offset += envelope_size;
1891            _next_ordinal_to_read += 1;
1892            if next_offset >= end_offset {
1893                return Ok(());
1894            }
1895
1896            // Decode unknown envelopes for gaps in ordinals.
1897            while _next_ordinal_to_read < 6 {
1898                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1899                _next_ordinal_to_read += 1;
1900                next_offset += envelope_size;
1901            }
1902
1903            let next_out_of_line = decoder.next_out_of_line();
1904            let handles_before = decoder.remaining_handles();
1905            if let Some((inlined, num_bytes, num_handles)) =
1906                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1907            {
1908                let member_inline_size =
1909                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1910                if inlined != (member_inline_size <= 4) {
1911                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1912                }
1913                let inner_offset;
1914                let mut inner_depth = depth.clone();
1915                if inlined {
1916                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1917                    inner_offset = next_offset;
1918                } else {
1919                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1920                    inner_depth.increment()?;
1921                }
1922                let val_ref =
1923                    self.dhcpv6_pd_enabled.get_or_insert_with(|| fidl::new_empty!(bool, D));
1924                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1925                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1926                {
1927                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1928                }
1929                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1930                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1931                }
1932            }
1933
1934            next_offset += envelope_size;
1935            _next_ordinal_to_read += 1;
1936            if next_offset >= end_offset {
1937                return Ok(());
1938            }
1939
1940            // Decode unknown envelopes for gaps in ordinals.
1941            while _next_ordinal_to_read < 7 {
1942                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1943                _next_ordinal_to_read += 1;
1944                next_offset += envelope_size;
1945            }
1946
1947            let next_out_of_line = decoder.next_out_of_line();
1948            let handles_before = decoder.remaining_handles();
1949            if let Some((inlined, num_bytes, num_handles)) =
1950                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1951            {
1952                let member_inline_size =
1953                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1954                if inlined != (member_inline_size <= 4) {
1955                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1956                }
1957                let inner_offset;
1958                let mut inner_depth = depth.clone();
1959                if inlined {
1960                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1961                    inner_offset = next_offset;
1962                } else {
1963                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1964                    inner_depth.increment()?;
1965                }
1966                let val_ref = self
1967                    .dns_upstream_query_enabled
1968                    .get_or_insert_with(|| fidl::new_empty!(bool, D));
1969                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
1970                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1971                {
1972                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1973                }
1974                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1975                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1976                }
1977            }
1978
1979            next_offset += envelope_size;
1980            _next_ordinal_to_read += 1;
1981            if next_offset >= end_offset {
1982                return Ok(());
1983            }
1984
1985            // Decode unknown envelopes for gaps in ordinals.
1986            while _next_ordinal_to_read < 8 {
1987                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1988                _next_ordinal_to_read += 1;
1989                next_offset += envelope_size;
1990            }
1991
1992            let next_out_of_line = decoder.next_out_of_line();
1993            let handles_before = decoder.remaining_handles();
1994            if let Some((inlined, num_bytes, num_handles)) =
1995                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1996            {
1997                let member_inline_size =
1998                    <bool as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1999                if inlined != (member_inline_size <= 4) {
2000                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2001                }
2002                let inner_offset;
2003                let mut inner_depth = depth.clone();
2004                if inlined {
2005                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2006                    inner_offset = next_offset;
2007                } else {
2008                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2009                    inner_depth.increment()?;
2010                }
2011                let val_ref = self
2012                    .link_metrics_manager_enabled
2013                    .get_or_insert_with(|| fidl::new_empty!(bool, D));
2014                fidl::decode!(bool, D, val_ref, decoder, inner_offset, inner_depth)?;
2015                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2016                {
2017                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2018                }
2019                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2020                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2021                }
2022            }
2023
2024            next_offset += envelope_size;
2025
2026            // Decode the remaining unknown envelopes.
2027            while next_offset < end_offset {
2028                _next_ordinal_to_read += 1;
2029                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2030                next_offset += envelope_size;
2031            }
2032
2033            Ok(())
2034        }
2035    }
2036}