Skip to main content

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