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    /// Rx rate in units of 500 kbit/s, which are the units used for
301    /// Supported Rates in IEEE Std 802.11-2024 9.4.2.3.
302    ///
303    /// Optional. If not set, the Rx rate is unknown (e.g. idle or unsupported).
304    pub rx_rate_500kbps: Option<u32>,
305    #[doc(hidden)]
306    pub __source_breaking: fidl::marker::SourceBreaking,
307}
308
309impl fidl::Persistable for ConnectionSignalReport {}
310
311#[derive(Clone, Debug, Default, PartialEq)]
312pub struct ConnectionStats {
313    /// ID of the current connection. Used by WLAN telemetry to determine whether
314    /// the current counters and the previous counters belong to the same connection.
315    /// If the counters belong to two different connections, telemetry will not diff
316    /// between them as it assumes that the driver/firmware has reset the counter
317    /// in between.
318    ///
319    /// The driver should set a new connection ID after a successful connection,
320    /// reconnection, or roaming attempt, as it's expected that the connection-
321    /// related counters would reset on a new connection.
322    pub connection_id: Option<u8>,
323    pub driver_specific_counters: Option<Vec<UnnamedCounter>>,
324    pub driver_specific_gauges: Option<Vec<UnnamedGauge>>,
325    pub rx_unicast_total: Option<u64>,
326    pub rx_unicast_drop: Option<u64>,
327    pub rx_multicast: Option<u64>,
328    pub tx_total: Option<u64>,
329    pub tx_drop: Option<u64>,
330    pub wme: Option<WmePacketStats>,
331    #[doc(hidden)]
332    pub __source_breaking: fidl::marker::SourceBreaking,
333}
334
335impl fidl::Persistable for ConnectionStats {}
336
337#[derive(Clone, Debug, Default, PartialEq)]
338pub struct IfaceHistogramStats {
339    /// Noise floor histogram(s).
340    pub noise_floor_histograms: Option<Vec<NoiseFloorHistogram>>,
341    /// Received signal strength indicator (RSSI) histogram(s).
342    pub rssi_histograms: Option<Vec<RssiHistogram>>,
343    /// Received rate index histogram(s).
344    pub rx_rate_index_histograms: Option<Vec<RxRateIndexHistogram>>,
345    /// Signal to noise ratio (SNR) histogram(s).
346    pub snr_histograms: Option<Vec<SnrHistogram>>,
347    #[doc(hidden)]
348    pub __source_breaking: fidl::marker::SourceBreaking,
349}
350
351impl fidl::Persistable for IfaceHistogramStats {}
352
353#[derive(Clone, Debug, Default, PartialEq)]
354pub struct IfaceStats {
355    /// Stats related to the current connection. May not be set if the client is not connected.
356    pub connection_stats: Option<ConnectionStats>,
357    pub driver_specific_counters: Option<Vec<UnnamedCounter>>,
358    pub driver_specific_gauges: Option<Vec<UnnamedGauge>>,
359    #[doc(hidden)]
360    pub __source_breaking: fidl::marker::SourceBreaking,
361}
362
363impl fidl::Persistable for IfaceStats {}
364
365/// Config to associate a driver-specific counter ID with a counter name that is
366/// to be used in Inspect.
367#[derive(Clone, Debug, Default, PartialEq)]
368pub struct InspectCounterConfig {
369    pub counter_id: Option<u16>,
370    pub counter_name: Option<String>,
371    #[doc(hidden)]
372    pub __source_breaking: fidl::marker::SourceBreaking,
373}
374
375impl fidl::Persistable for InspectCounterConfig {}
376
377/// Config to associate a driver-specific gauge ID with a gauge name that is
378/// to be used in Inspect.
379#[derive(Clone, Debug, Default, PartialEq)]
380pub struct InspectGaugeConfig {
381    pub gauge_id: Option<u16>,
382    pub gauge_name: Option<String>,
383    /// An Inspect time series would be created per statistic.
384    pub statistics: Option<Vec<GaugeStatistic>>,
385    #[doc(hidden)]
386    pub __source_breaking: fidl::marker::SourceBreaking,
387}
388
389impl fidl::Persistable for InspectGaugeConfig {}
390
391#[derive(Clone, Debug, Default, PartialEq)]
392pub struct PacketStats {
393    pub rx: Option<u64>,
394    pub tx: Option<u64>,
395    pub tx_drop: Option<u64>,
396    pub tx_retries: Option<u64>,
397    #[doc(hidden)]
398    pub __source_breaking: fidl::marker::SourceBreaking,
399}
400
401impl fidl::Persistable for PacketStats {}
402
403#[derive(Clone, Debug, Default, PartialEq)]
404pub struct SignalReport {
405    /// Signal report related to the current connection.
406    /// May not be set if the client is not connected.
407    pub connection_signal_report: Option<ConnectionSignalReport>,
408    #[doc(hidden)]
409    pub __source_breaking: fidl::marker::SourceBreaking,
410}
411
412impl fidl::Persistable for SignalReport {}
413
414#[derive(Clone, Debug, Default, PartialEq)]
415pub struct TelemetrySupport {
416    /// Specifies counters that should be logged into Inspect time series
417    pub inspect_counter_configs: Option<Vec<InspectCounterConfig>>,
418    /// Specifies gauges that should be logged into Inspect time series
419    pub inspect_gauge_configs: Option<Vec<InspectGaugeConfig>>,
420    #[doc(hidden)]
421    pub __source_breaking: fidl::marker::SourceBreaking,
422}
423
424impl fidl::Persistable for TelemetrySupport {}
425
426#[derive(Clone, Debug, Default, PartialEq)]
427pub struct WmePacketStats {
428    pub be: Option<PacketStats>,
429    pub bk: Option<PacketStats>,
430    pub vi: Option<PacketStats>,
431    pub vo: Option<PacketStats>,
432    #[doc(hidden)]
433    pub __source_breaking: fidl::marker::SourceBreaking,
434}
435
436impl fidl::Persistable for WmePacketStats {}
437
438mod internal {
439    use super::*;
440    unsafe impl fidl::encoding::TypeMarker for AntennaFreq {
441        type Owned = Self;
442
443        #[inline(always)]
444        fn inline_align(_context: fidl::encoding::Context) -> usize {
445            std::mem::align_of::<u8>()
446        }
447
448        #[inline(always)]
449        fn inline_size(_context: fidl::encoding::Context) -> usize {
450            std::mem::size_of::<u8>()
451        }
452
453        #[inline(always)]
454        fn encode_is_copy() -> bool {
455            true
456        }
457
458        #[inline(always)]
459        fn decode_is_copy() -> bool {
460            false
461        }
462    }
463
464    impl fidl::encoding::ValueTypeMarker for AntennaFreq {
465        type Borrowed<'a> = Self;
466        #[inline(always)]
467        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
468            *value
469        }
470    }
471
472    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for AntennaFreq {
473        #[inline]
474        unsafe fn encode(
475            self,
476            encoder: &mut fidl::encoding::Encoder<'_, D>,
477            offset: usize,
478            _depth: fidl::encoding::Depth,
479        ) -> fidl::Result<()> {
480            encoder.debug_check_bounds::<Self>(offset);
481            encoder.write_num(self.into_primitive(), offset);
482            Ok(())
483        }
484    }
485
486    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for AntennaFreq {
487        #[inline(always)]
488        fn new_empty() -> Self {
489            Self::Antenna2G
490        }
491
492        #[inline]
493        unsafe fn decode(
494            &mut self,
495            decoder: &mut fidl::encoding::Decoder<'_, D>,
496            offset: usize,
497            _depth: fidl::encoding::Depth,
498        ) -> fidl::Result<()> {
499            decoder.debug_check_bounds::<Self>(offset);
500            let prim = decoder.read_num::<u8>(offset);
501
502            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
503            Ok(())
504        }
505    }
506    unsafe impl fidl::encoding::TypeMarker for GaugeStatistic {
507        type Owned = Self;
508
509        #[inline(always)]
510        fn inline_align(_context: fidl::encoding::Context) -> usize {
511            std::mem::align_of::<u8>()
512        }
513
514        #[inline(always)]
515        fn inline_size(_context: fidl::encoding::Context) -> usize {
516            std::mem::size_of::<u8>()
517        }
518
519        #[inline(always)]
520        fn encode_is_copy() -> bool {
521            false
522        }
523
524        #[inline(always)]
525        fn decode_is_copy() -> bool {
526            false
527        }
528    }
529
530    impl fidl::encoding::ValueTypeMarker for GaugeStatistic {
531        type Borrowed<'a> = Self;
532        #[inline(always)]
533        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
534            *value
535        }
536    }
537
538    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for GaugeStatistic {
539        #[inline]
540        unsafe fn encode(
541            self,
542            encoder: &mut fidl::encoding::Encoder<'_, D>,
543            offset: usize,
544            _depth: fidl::encoding::Depth,
545        ) -> fidl::Result<()> {
546            encoder.debug_check_bounds::<Self>(offset);
547            encoder.write_num(self.into_primitive(), offset);
548            Ok(())
549        }
550    }
551
552    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for GaugeStatistic {
553        #[inline(always)]
554        fn new_empty() -> Self {
555            Self::unknown()
556        }
557
558        #[inline]
559        unsafe fn decode(
560            &mut self,
561            decoder: &mut fidl::encoding::Decoder<'_, D>,
562            offset: usize,
563            _depth: fidl::encoding::Depth,
564        ) -> fidl::Result<()> {
565            decoder.debug_check_bounds::<Self>(offset);
566            let prim = decoder.read_num::<u8>(offset);
567
568            *self = Self::from_primitive_allow_unknown(prim);
569            Ok(())
570        }
571    }
572    unsafe impl fidl::encoding::TypeMarker for HistScope {
573        type Owned = Self;
574
575        #[inline(always)]
576        fn inline_align(_context: fidl::encoding::Context) -> usize {
577            std::mem::align_of::<u8>()
578        }
579
580        #[inline(always)]
581        fn inline_size(_context: fidl::encoding::Context) -> usize {
582            std::mem::size_of::<u8>()
583        }
584
585        #[inline(always)]
586        fn encode_is_copy() -> bool {
587            true
588        }
589
590        #[inline(always)]
591        fn decode_is_copy() -> bool {
592            false
593        }
594    }
595
596    impl fidl::encoding::ValueTypeMarker for HistScope {
597        type Borrowed<'a> = Self;
598        #[inline(always)]
599        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
600            *value
601        }
602    }
603
604    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<Self, D> for HistScope {
605        #[inline]
606        unsafe fn encode(
607            self,
608            encoder: &mut fidl::encoding::Encoder<'_, D>,
609            offset: usize,
610            _depth: fidl::encoding::Depth,
611        ) -> fidl::Result<()> {
612            encoder.debug_check_bounds::<Self>(offset);
613            encoder.write_num(self.into_primitive(), offset);
614            Ok(())
615        }
616    }
617
618    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for HistScope {
619        #[inline(always)]
620        fn new_empty() -> Self {
621            Self::Station
622        }
623
624        #[inline]
625        unsafe fn decode(
626            &mut self,
627            decoder: &mut fidl::encoding::Decoder<'_, D>,
628            offset: usize,
629            _depth: fidl::encoding::Depth,
630        ) -> fidl::Result<()> {
631            decoder.debug_check_bounds::<Self>(offset);
632            let prim = decoder.read_num::<u8>(offset);
633
634            *self = Self::from_primitive(prim).ok_or(fidl::Error::InvalidEnumValue)?;
635            Ok(())
636        }
637    }
638
639    impl fidl::encoding::ValueTypeMarker for AntennaId {
640        type Borrowed<'a> = &'a Self;
641        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
642            value
643        }
644    }
645
646    unsafe impl fidl::encoding::TypeMarker for AntennaId {
647        type Owned = Self;
648
649        #[inline(always)]
650        fn inline_align(_context: fidl::encoding::Context) -> usize {
651            1
652        }
653
654        #[inline(always)]
655        fn inline_size(_context: fidl::encoding::Context) -> usize {
656            2
657        }
658    }
659
660    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<AntennaId, D>
661        for &AntennaId
662    {
663        #[inline]
664        unsafe fn encode(
665            self,
666            encoder: &mut fidl::encoding::Encoder<'_, D>,
667            offset: usize,
668            _depth: fidl::encoding::Depth,
669        ) -> fidl::Result<()> {
670            encoder.debug_check_bounds::<AntennaId>(offset);
671            // Delegate to tuple encoding.
672            fidl::encoding::Encode::<AntennaId, D>::encode(
673                (
674                    <AntennaFreq as fidl::encoding::ValueTypeMarker>::borrow(&self.freq),
675                    <u8 as fidl::encoding::ValueTypeMarker>::borrow(&self.index),
676                ),
677                encoder,
678                offset,
679                _depth,
680            )
681        }
682    }
683    unsafe impl<
684        D: fidl::encoding::ResourceDialect,
685        T0: fidl::encoding::Encode<AntennaFreq, D>,
686        T1: fidl::encoding::Encode<u8, D>,
687    > fidl::encoding::Encode<AntennaId, D> for (T0, T1)
688    {
689        #[inline]
690        unsafe fn encode(
691            self,
692            encoder: &mut fidl::encoding::Encoder<'_, D>,
693            offset: usize,
694            depth: fidl::encoding::Depth,
695        ) -> fidl::Result<()> {
696            encoder.debug_check_bounds::<AntennaId>(offset);
697            // Zero out padding regions. There's no need to apply masks
698            // because the unmasked parts will be overwritten by fields.
699            // Write the fields.
700            self.0.encode(encoder, offset + 0, depth)?;
701            self.1.encode(encoder, offset + 1, depth)?;
702            Ok(())
703        }
704    }
705
706    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for AntennaId {
707        #[inline(always)]
708        fn new_empty() -> Self {
709            Self { freq: fidl::new_empty!(AntennaFreq, D), index: fidl::new_empty!(u8, D) }
710        }
711
712        #[inline]
713        unsafe fn decode(
714            &mut self,
715            decoder: &mut fidl::encoding::Decoder<'_, D>,
716            offset: usize,
717            _depth: fidl::encoding::Depth,
718        ) -> fidl::Result<()> {
719            decoder.debug_check_bounds::<Self>(offset);
720            // Verify that padding bytes are zero.
721            fidl::decode!(AntennaFreq, D, &mut self.freq, decoder, offset + 0, _depth)?;
722            fidl::decode!(u8, D, &mut self.index, decoder, offset + 1, _depth)?;
723            Ok(())
724        }
725    }
726
727    impl fidl::encoding::ValueTypeMarker for HistBucket {
728        type Borrowed<'a> = &'a Self;
729        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
730            value
731        }
732    }
733
734    unsafe impl fidl::encoding::TypeMarker for HistBucket {
735        type Owned = Self;
736
737        #[inline(always)]
738        fn inline_align(_context: fidl::encoding::Context) -> usize {
739            8
740        }
741
742        #[inline(always)]
743        fn inline_size(_context: fidl::encoding::Context) -> usize {
744            16
745        }
746    }
747
748    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<HistBucket, D>
749        for &HistBucket
750    {
751        #[inline]
752        unsafe fn encode(
753            self,
754            encoder: &mut fidl::encoding::Encoder<'_, D>,
755            offset: usize,
756            _depth: fidl::encoding::Depth,
757        ) -> fidl::Result<()> {
758            encoder.debug_check_bounds::<HistBucket>(offset);
759            unsafe {
760                // Copy the object into the buffer.
761                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
762                (buf_ptr as *mut HistBucket).write_unaligned((self as *const HistBucket).read());
763                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
764                // done second because the memcpy will write garbage to these bytes.
765                let padding_ptr = buf_ptr.offset(0) as *mut u64;
766                let padding_mask = 0xffffffffffff0000u64;
767                padding_ptr.write_unaligned(padding_ptr.read_unaligned() & !padding_mask);
768            }
769            Ok(())
770        }
771    }
772    unsafe impl<
773        D: fidl::encoding::ResourceDialect,
774        T0: fidl::encoding::Encode<u16, D>,
775        T1: fidl::encoding::Encode<u64, D>,
776    > fidl::encoding::Encode<HistBucket, D> for (T0, T1)
777    {
778        #[inline]
779        unsafe fn encode(
780            self,
781            encoder: &mut fidl::encoding::Encoder<'_, D>,
782            offset: usize,
783            depth: fidl::encoding::Depth,
784        ) -> fidl::Result<()> {
785            encoder.debug_check_bounds::<HistBucket>(offset);
786            // Zero out padding regions. There's no need to apply masks
787            // because the unmasked parts will be overwritten by fields.
788            unsafe {
789                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
790                (ptr as *mut u64).write_unaligned(0);
791            }
792            // Write the fields.
793            self.0.encode(encoder, offset + 0, depth)?;
794            self.1.encode(encoder, offset + 8, depth)?;
795            Ok(())
796        }
797    }
798
799    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for HistBucket {
800        #[inline(always)]
801        fn new_empty() -> Self {
802            Self { bucket_index: fidl::new_empty!(u16, D), num_samples: fidl::new_empty!(u64, D) }
803        }
804
805        #[inline]
806        unsafe fn decode(
807            &mut self,
808            decoder: &mut fidl::encoding::Decoder<'_, D>,
809            offset: usize,
810            _depth: fidl::encoding::Depth,
811        ) -> fidl::Result<()> {
812            decoder.debug_check_bounds::<Self>(offset);
813            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
814            // Verify that padding bytes are zero.
815            let ptr = unsafe { buf_ptr.offset(0) };
816            let padval = unsafe { (ptr as *const u64).read_unaligned() };
817            let mask = 0xffffffffffff0000u64;
818            let maskedval = padval & mask;
819            if maskedval != 0 {
820                return Err(fidl::Error::NonZeroPadding {
821                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
822                });
823            }
824            // Copy from the buffer into the object.
825            unsafe {
826                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 16);
827            }
828            Ok(())
829        }
830    }
831
832    impl fidl::encoding::ValueTypeMarker for NoiseFloorHistogram {
833        type Borrowed<'a> = &'a Self;
834        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
835            value
836        }
837    }
838
839    unsafe impl fidl::encoding::TypeMarker for NoiseFloorHistogram {
840        type Owned = Self;
841
842        #[inline(always)]
843        fn inline_align(_context: fidl::encoding::Context) -> usize {
844            8
845        }
846
847        #[inline(always)]
848        fn inline_size(_context: fidl::encoding::Context) -> usize {
849            40
850        }
851    }
852
853    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<NoiseFloorHistogram, D>
854        for &NoiseFloorHistogram
855    {
856        #[inline]
857        unsafe fn encode(
858            self,
859            encoder: &mut fidl::encoding::Encoder<'_, D>,
860            offset: usize,
861            _depth: fidl::encoding::Depth,
862        ) -> fidl::Result<()> {
863            encoder.debug_check_bounds::<NoiseFloorHistogram>(offset);
864            // Delegate to tuple encoding.
865            fidl::encoding::Encode::<NoiseFloorHistogram, D>::encode(
866                (
867                    <HistScope as fidl::encoding::ValueTypeMarker>::borrow(&self.hist_scope),
868                    <fidl::encoding::Boxed<AntennaId> as fidl::encoding::ValueTypeMarker>::borrow(&self.antenna_id),
869                    <fidl::encoding::Vector<HistBucket, 255> as fidl::encoding::ValueTypeMarker>::borrow(&self.noise_floor_samples),
870                    <u64 as fidl::encoding::ValueTypeMarker>::borrow(&self.invalid_samples),
871                ),
872                encoder, offset, _depth
873            )
874        }
875    }
876    unsafe impl<
877        D: fidl::encoding::ResourceDialect,
878        T0: fidl::encoding::Encode<HistScope, D>,
879        T1: fidl::encoding::Encode<fidl::encoding::Boxed<AntennaId>, D>,
880        T2: fidl::encoding::Encode<fidl::encoding::Vector<HistBucket, 255>, D>,
881        T3: fidl::encoding::Encode<u64, D>,
882    > fidl::encoding::Encode<NoiseFloorHistogram, D> for (T0, T1, T2, T3)
883    {
884        #[inline]
885        unsafe fn encode(
886            self,
887            encoder: &mut fidl::encoding::Encoder<'_, D>,
888            offset: usize,
889            depth: fidl::encoding::Depth,
890        ) -> fidl::Result<()> {
891            encoder.debug_check_bounds::<NoiseFloorHistogram>(offset);
892            // Zero out padding regions. There's no need to apply masks
893            // because the unmasked parts will be overwritten by fields.
894            unsafe {
895                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
896                (ptr as *mut u64).write_unaligned(0);
897            }
898            // Write the fields.
899            self.0.encode(encoder, offset + 0, depth)?;
900            self.1.encode(encoder, offset + 8, depth)?;
901            self.2.encode(encoder, offset + 16, depth)?;
902            self.3.encode(encoder, offset + 32, depth)?;
903            Ok(())
904        }
905    }
906
907    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for NoiseFloorHistogram {
908        #[inline(always)]
909        fn new_empty() -> Self {
910            Self {
911                hist_scope: fidl::new_empty!(HistScope, D),
912                antenna_id: fidl::new_empty!(fidl::encoding::Boxed<AntennaId>, D),
913                noise_floor_samples: fidl::new_empty!(fidl::encoding::Vector<HistBucket, 255>, D),
914                invalid_samples: fidl::new_empty!(u64, D),
915            }
916        }
917
918        #[inline]
919        unsafe fn decode(
920            &mut self,
921            decoder: &mut fidl::encoding::Decoder<'_, D>,
922            offset: usize,
923            _depth: fidl::encoding::Depth,
924        ) -> fidl::Result<()> {
925            decoder.debug_check_bounds::<Self>(offset);
926            // Verify that padding bytes are zero.
927            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
928            let padval = unsafe { (ptr as *const u64).read_unaligned() };
929            let mask = 0xffffffffffffff00u64;
930            let maskedval = padval & mask;
931            if maskedval != 0 {
932                return Err(fidl::Error::NonZeroPadding {
933                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
934                });
935            }
936            fidl::decode!(HistScope, D, &mut self.hist_scope, decoder, offset + 0, _depth)?;
937            fidl::decode!(
938                fidl::encoding::Boxed<AntennaId>,
939                D,
940                &mut self.antenna_id,
941                decoder,
942                offset + 8,
943                _depth
944            )?;
945            fidl::decode!(fidl::encoding::Vector<HistBucket, 255>, D, &mut self.noise_floor_samples, decoder, offset + 16, _depth)?;
946            fidl::decode!(u64, D, &mut self.invalid_samples, decoder, offset + 32, _depth)?;
947            Ok(())
948        }
949    }
950
951    impl fidl::encoding::ValueTypeMarker for RssiHistogram {
952        type Borrowed<'a> = &'a Self;
953        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
954            value
955        }
956    }
957
958    unsafe impl fidl::encoding::TypeMarker for RssiHistogram {
959        type Owned = Self;
960
961        #[inline(always)]
962        fn inline_align(_context: fidl::encoding::Context) -> usize {
963            8
964        }
965
966        #[inline(always)]
967        fn inline_size(_context: fidl::encoding::Context) -> usize {
968            40
969        }
970    }
971
972    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<RssiHistogram, D>
973        for &RssiHistogram
974    {
975        #[inline]
976        unsafe fn encode(
977            self,
978            encoder: &mut fidl::encoding::Encoder<'_, D>,
979            offset: usize,
980            _depth: fidl::encoding::Depth,
981        ) -> fidl::Result<()> {
982            encoder.debug_check_bounds::<RssiHistogram>(offset);
983            // Delegate to tuple encoding.
984            fidl::encoding::Encode::<RssiHistogram, D>::encode(
985                (
986                    <HistScope as fidl::encoding::ValueTypeMarker>::borrow(&self.hist_scope),
987                    <fidl::encoding::Boxed<AntennaId> as fidl::encoding::ValueTypeMarker>::borrow(&self.antenna_id),
988                    <fidl::encoding::Vector<HistBucket, 255> as fidl::encoding::ValueTypeMarker>::borrow(&self.rssi_samples),
989                    <u64 as fidl::encoding::ValueTypeMarker>::borrow(&self.invalid_samples),
990                ),
991                encoder, offset, _depth
992            )
993        }
994    }
995    unsafe impl<
996        D: fidl::encoding::ResourceDialect,
997        T0: fidl::encoding::Encode<HistScope, D>,
998        T1: fidl::encoding::Encode<fidl::encoding::Boxed<AntennaId>, D>,
999        T2: fidl::encoding::Encode<fidl::encoding::Vector<HistBucket, 255>, D>,
1000        T3: fidl::encoding::Encode<u64, D>,
1001    > fidl::encoding::Encode<RssiHistogram, D> for (T0, T1, T2, T3)
1002    {
1003        #[inline]
1004        unsafe fn encode(
1005            self,
1006            encoder: &mut fidl::encoding::Encoder<'_, D>,
1007            offset: usize,
1008            depth: fidl::encoding::Depth,
1009        ) -> fidl::Result<()> {
1010            encoder.debug_check_bounds::<RssiHistogram>(offset);
1011            // Zero out padding regions. There's no need to apply masks
1012            // because the unmasked parts will be overwritten by fields.
1013            unsafe {
1014                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
1015                (ptr as *mut u64).write_unaligned(0);
1016            }
1017            // Write the fields.
1018            self.0.encode(encoder, offset + 0, depth)?;
1019            self.1.encode(encoder, offset + 8, depth)?;
1020            self.2.encode(encoder, offset + 16, depth)?;
1021            self.3.encode(encoder, offset + 32, depth)?;
1022            Ok(())
1023        }
1024    }
1025
1026    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RssiHistogram {
1027        #[inline(always)]
1028        fn new_empty() -> Self {
1029            Self {
1030                hist_scope: fidl::new_empty!(HistScope, D),
1031                antenna_id: fidl::new_empty!(fidl::encoding::Boxed<AntennaId>, D),
1032                rssi_samples: fidl::new_empty!(fidl::encoding::Vector<HistBucket, 255>, D),
1033                invalid_samples: fidl::new_empty!(u64, D),
1034            }
1035        }
1036
1037        #[inline]
1038        unsafe fn decode(
1039            &mut self,
1040            decoder: &mut fidl::encoding::Decoder<'_, D>,
1041            offset: usize,
1042            _depth: fidl::encoding::Depth,
1043        ) -> fidl::Result<()> {
1044            decoder.debug_check_bounds::<Self>(offset);
1045            // Verify that padding bytes are zero.
1046            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
1047            let padval = unsafe { (ptr as *const u64).read_unaligned() };
1048            let mask = 0xffffffffffffff00u64;
1049            let maskedval = padval & mask;
1050            if maskedval != 0 {
1051                return Err(fidl::Error::NonZeroPadding {
1052                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
1053                });
1054            }
1055            fidl::decode!(HistScope, D, &mut self.hist_scope, decoder, offset + 0, _depth)?;
1056            fidl::decode!(
1057                fidl::encoding::Boxed<AntennaId>,
1058                D,
1059                &mut self.antenna_id,
1060                decoder,
1061                offset + 8,
1062                _depth
1063            )?;
1064            fidl::decode!(fidl::encoding::Vector<HistBucket, 255>, D, &mut self.rssi_samples, decoder, offset + 16, _depth)?;
1065            fidl::decode!(u64, D, &mut self.invalid_samples, decoder, offset + 32, _depth)?;
1066            Ok(())
1067        }
1068    }
1069
1070    impl fidl::encoding::ValueTypeMarker for RxRateIndexHistogram {
1071        type Borrowed<'a> = &'a Self;
1072        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1073            value
1074        }
1075    }
1076
1077    unsafe impl fidl::encoding::TypeMarker for RxRateIndexHistogram {
1078        type Owned = Self;
1079
1080        #[inline(always)]
1081        fn inline_align(_context: fidl::encoding::Context) -> usize {
1082            8
1083        }
1084
1085        #[inline(always)]
1086        fn inline_size(_context: fidl::encoding::Context) -> usize {
1087            40
1088        }
1089    }
1090
1091    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<RxRateIndexHistogram, D>
1092        for &RxRateIndexHistogram
1093    {
1094        #[inline]
1095        unsafe fn encode(
1096            self,
1097            encoder: &mut fidl::encoding::Encoder<'_, D>,
1098            offset: usize,
1099            _depth: fidl::encoding::Depth,
1100        ) -> fidl::Result<()> {
1101            encoder.debug_check_bounds::<RxRateIndexHistogram>(offset);
1102            // Delegate to tuple encoding.
1103            fidl::encoding::Encode::<RxRateIndexHistogram, D>::encode(
1104                (
1105                    <HistScope as fidl::encoding::ValueTypeMarker>::borrow(&self.hist_scope),
1106                    <fidl::encoding::Boxed<AntennaId> as fidl::encoding::ValueTypeMarker>::borrow(&self.antenna_id),
1107                    <fidl::encoding::Vector<HistBucket, 196> as fidl::encoding::ValueTypeMarker>::borrow(&self.rx_rate_index_samples),
1108                    <u64 as fidl::encoding::ValueTypeMarker>::borrow(&self.invalid_samples),
1109                ),
1110                encoder, offset, _depth
1111            )
1112        }
1113    }
1114    unsafe impl<
1115        D: fidl::encoding::ResourceDialect,
1116        T0: fidl::encoding::Encode<HistScope, D>,
1117        T1: fidl::encoding::Encode<fidl::encoding::Boxed<AntennaId>, D>,
1118        T2: fidl::encoding::Encode<fidl::encoding::Vector<HistBucket, 196>, D>,
1119        T3: fidl::encoding::Encode<u64, D>,
1120    > fidl::encoding::Encode<RxRateIndexHistogram, D> for (T0, T1, T2, T3)
1121    {
1122        #[inline]
1123        unsafe fn encode(
1124            self,
1125            encoder: &mut fidl::encoding::Encoder<'_, D>,
1126            offset: usize,
1127            depth: fidl::encoding::Depth,
1128        ) -> fidl::Result<()> {
1129            encoder.debug_check_bounds::<RxRateIndexHistogram>(offset);
1130            // Zero out padding regions. There's no need to apply masks
1131            // because the unmasked parts will be overwritten by fields.
1132            unsafe {
1133                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
1134                (ptr as *mut u64).write_unaligned(0);
1135            }
1136            // Write the fields.
1137            self.0.encode(encoder, offset + 0, depth)?;
1138            self.1.encode(encoder, offset + 8, depth)?;
1139            self.2.encode(encoder, offset + 16, depth)?;
1140            self.3.encode(encoder, offset + 32, depth)?;
1141            Ok(())
1142        }
1143    }
1144
1145    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for RxRateIndexHistogram {
1146        #[inline(always)]
1147        fn new_empty() -> Self {
1148            Self {
1149                hist_scope: fidl::new_empty!(HistScope, D),
1150                antenna_id: fidl::new_empty!(fidl::encoding::Boxed<AntennaId>, D),
1151                rx_rate_index_samples: fidl::new_empty!(fidl::encoding::Vector<HistBucket, 196>, D),
1152                invalid_samples: fidl::new_empty!(u64, D),
1153            }
1154        }
1155
1156        #[inline]
1157        unsafe fn decode(
1158            &mut self,
1159            decoder: &mut fidl::encoding::Decoder<'_, D>,
1160            offset: usize,
1161            _depth: fidl::encoding::Depth,
1162        ) -> fidl::Result<()> {
1163            decoder.debug_check_bounds::<Self>(offset);
1164            // Verify that padding bytes are zero.
1165            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
1166            let padval = unsafe { (ptr as *const u64).read_unaligned() };
1167            let mask = 0xffffffffffffff00u64;
1168            let maskedval = padval & mask;
1169            if maskedval != 0 {
1170                return Err(fidl::Error::NonZeroPadding {
1171                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
1172                });
1173            }
1174            fidl::decode!(HistScope, D, &mut self.hist_scope, decoder, offset + 0, _depth)?;
1175            fidl::decode!(
1176                fidl::encoding::Boxed<AntennaId>,
1177                D,
1178                &mut self.antenna_id,
1179                decoder,
1180                offset + 8,
1181                _depth
1182            )?;
1183            fidl::decode!(fidl::encoding::Vector<HistBucket, 196>, D, &mut self.rx_rate_index_samples, decoder, offset + 16, _depth)?;
1184            fidl::decode!(u64, D, &mut self.invalid_samples, decoder, offset + 32, _depth)?;
1185            Ok(())
1186        }
1187    }
1188
1189    impl fidl::encoding::ValueTypeMarker for SnrHistogram {
1190        type Borrowed<'a> = &'a Self;
1191        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1192            value
1193        }
1194    }
1195
1196    unsafe impl fidl::encoding::TypeMarker for SnrHistogram {
1197        type Owned = Self;
1198
1199        #[inline(always)]
1200        fn inline_align(_context: fidl::encoding::Context) -> usize {
1201            8
1202        }
1203
1204        #[inline(always)]
1205        fn inline_size(_context: fidl::encoding::Context) -> usize {
1206            40
1207        }
1208    }
1209
1210    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SnrHistogram, D>
1211        for &SnrHistogram
1212    {
1213        #[inline]
1214        unsafe fn encode(
1215            self,
1216            encoder: &mut fidl::encoding::Encoder<'_, D>,
1217            offset: usize,
1218            _depth: fidl::encoding::Depth,
1219        ) -> fidl::Result<()> {
1220            encoder.debug_check_bounds::<SnrHistogram>(offset);
1221            // Delegate to tuple encoding.
1222            fidl::encoding::Encode::<SnrHistogram, D>::encode(
1223                (
1224                    <HistScope as fidl::encoding::ValueTypeMarker>::borrow(&self.hist_scope),
1225                    <fidl::encoding::Boxed<AntennaId> as fidl::encoding::ValueTypeMarker>::borrow(&self.antenna_id),
1226                    <fidl::encoding::Vector<HistBucket, 256> as fidl::encoding::ValueTypeMarker>::borrow(&self.snr_samples),
1227                    <u64 as fidl::encoding::ValueTypeMarker>::borrow(&self.invalid_samples),
1228                ),
1229                encoder, offset, _depth
1230            )
1231        }
1232    }
1233    unsafe impl<
1234        D: fidl::encoding::ResourceDialect,
1235        T0: fidl::encoding::Encode<HistScope, D>,
1236        T1: fidl::encoding::Encode<fidl::encoding::Boxed<AntennaId>, D>,
1237        T2: fidl::encoding::Encode<fidl::encoding::Vector<HistBucket, 256>, D>,
1238        T3: fidl::encoding::Encode<u64, D>,
1239    > fidl::encoding::Encode<SnrHistogram, D> for (T0, T1, T2, T3)
1240    {
1241        #[inline]
1242        unsafe fn encode(
1243            self,
1244            encoder: &mut fidl::encoding::Encoder<'_, D>,
1245            offset: usize,
1246            depth: fidl::encoding::Depth,
1247        ) -> fidl::Result<()> {
1248            encoder.debug_check_bounds::<SnrHistogram>(offset);
1249            // Zero out padding regions. There's no need to apply masks
1250            // because the unmasked parts will be overwritten by fields.
1251            unsafe {
1252                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
1253                (ptr as *mut u64).write_unaligned(0);
1254            }
1255            // Write the fields.
1256            self.0.encode(encoder, offset + 0, depth)?;
1257            self.1.encode(encoder, offset + 8, depth)?;
1258            self.2.encode(encoder, offset + 16, depth)?;
1259            self.3.encode(encoder, offset + 32, depth)?;
1260            Ok(())
1261        }
1262    }
1263
1264    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SnrHistogram {
1265        #[inline(always)]
1266        fn new_empty() -> Self {
1267            Self {
1268                hist_scope: fidl::new_empty!(HistScope, D),
1269                antenna_id: fidl::new_empty!(fidl::encoding::Boxed<AntennaId>, D),
1270                snr_samples: fidl::new_empty!(fidl::encoding::Vector<HistBucket, 256>, D),
1271                invalid_samples: fidl::new_empty!(u64, D),
1272            }
1273        }
1274
1275        #[inline]
1276        unsafe fn decode(
1277            &mut self,
1278            decoder: &mut fidl::encoding::Decoder<'_, D>,
1279            offset: usize,
1280            _depth: fidl::encoding::Depth,
1281        ) -> fidl::Result<()> {
1282            decoder.debug_check_bounds::<Self>(offset);
1283            // Verify that padding bytes are zero.
1284            let ptr = unsafe { decoder.buf.as_ptr().add(offset).offset(0) };
1285            let padval = unsafe { (ptr as *const u64).read_unaligned() };
1286            let mask = 0xffffffffffffff00u64;
1287            let maskedval = padval & mask;
1288            if maskedval != 0 {
1289                return Err(fidl::Error::NonZeroPadding {
1290                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
1291                });
1292            }
1293            fidl::decode!(HistScope, D, &mut self.hist_scope, decoder, offset + 0, _depth)?;
1294            fidl::decode!(
1295                fidl::encoding::Boxed<AntennaId>,
1296                D,
1297                &mut self.antenna_id,
1298                decoder,
1299                offset + 8,
1300                _depth
1301            )?;
1302            fidl::decode!(fidl::encoding::Vector<HistBucket, 256>, D, &mut self.snr_samples, decoder, offset + 16, _depth)?;
1303            fidl::decode!(u64, D, &mut self.invalid_samples, decoder, offset + 32, _depth)?;
1304            Ok(())
1305        }
1306    }
1307
1308    impl fidl::encoding::ValueTypeMarker for UnnamedCounter {
1309        type Borrowed<'a> = &'a Self;
1310        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1311            value
1312        }
1313    }
1314
1315    unsafe impl fidl::encoding::TypeMarker for UnnamedCounter {
1316        type Owned = Self;
1317
1318        #[inline(always)]
1319        fn inline_align(_context: fidl::encoding::Context) -> usize {
1320            8
1321        }
1322
1323        #[inline(always)]
1324        fn inline_size(_context: fidl::encoding::Context) -> usize {
1325            16
1326        }
1327    }
1328
1329    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<UnnamedCounter, D>
1330        for &UnnamedCounter
1331    {
1332        #[inline]
1333        unsafe fn encode(
1334            self,
1335            encoder: &mut fidl::encoding::Encoder<'_, D>,
1336            offset: usize,
1337            _depth: fidl::encoding::Depth,
1338        ) -> fidl::Result<()> {
1339            encoder.debug_check_bounds::<UnnamedCounter>(offset);
1340            unsafe {
1341                // Copy the object into the buffer.
1342                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
1343                (buf_ptr as *mut UnnamedCounter)
1344                    .write_unaligned((self as *const UnnamedCounter).read());
1345                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
1346                // done second because the memcpy will write garbage to these bytes.
1347                let padding_ptr = buf_ptr.offset(0) as *mut u64;
1348                let padding_mask = 0xffffffffffff0000u64;
1349                padding_ptr.write_unaligned(padding_ptr.read_unaligned() & !padding_mask);
1350            }
1351            Ok(())
1352        }
1353    }
1354    unsafe impl<
1355        D: fidl::encoding::ResourceDialect,
1356        T0: fidl::encoding::Encode<u16, D>,
1357        T1: fidl::encoding::Encode<u64, D>,
1358    > fidl::encoding::Encode<UnnamedCounter, D> for (T0, T1)
1359    {
1360        #[inline]
1361        unsafe fn encode(
1362            self,
1363            encoder: &mut fidl::encoding::Encoder<'_, D>,
1364            offset: usize,
1365            depth: fidl::encoding::Depth,
1366        ) -> fidl::Result<()> {
1367            encoder.debug_check_bounds::<UnnamedCounter>(offset);
1368            // Zero out padding regions. There's no need to apply masks
1369            // because the unmasked parts will be overwritten by fields.
1370            unsafe {
1371                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
1372                (ptr as *mut u64).write_unaligned(0);
1373            }
1374            // Write the fields.
1375            self.0.encode(encoder, offset + 0, depth)?;
1376            self.1.encode(encoder, offset + 8, depth)?;
1377            Ok(())
1378        }
1379    }
1380
1381    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for UnnamedCounter {
1382        #[inline(always)]
1383        fn new_empty() -> Self {
1384            Self { id: fidl::new_empty!(u16, D), count: fidl::new_empty!(u64, D) }
1385        }
1386
1387        #[inline]
1388        unsafe fn decode(
1389            &mut self,
1390            decoder: &mut fidl::encoding::Decoder<'_, D>,
1391            offset: usize,
1392            _depth: fidl::encoding::Depth,
1393        ) -> fidl::Result<()> {
1394            decoder.debug_check_bounds::<Self>(offset);
1395            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
1396            // Verify that padding bytes are zero.
1397            let ptr = unsafe { buf_ptr.offset(0) };
1398            let padval = unsafe { (ptr as *const u64).read_unaligned() };
1399            let mask = 0xffffffffffff0000u64;
1400            let maskedval = padval & mask;
1401            if maskedval != 0 {
1402                return Err(fidl::Error::NonZeroPadding {
1403                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
1404                });
1405            }
1406            // Copy from the buffer into the object.
1407            unsafe {
1408                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 16);
1409            }
1410            Ok(())
1411        }
1412    }
1413
1414    impl fidl::encoding::ValueTypeMarker for UnnamedGauge {
1415        type Borrowed<'a> = &'a Self;
1416        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1417            value
1418        }
1419    }
1420
1421    unsafe impl fidl::encoding::TypeMarker for UnnamedGauge {
1422        type Owned = Self;
1423
1424        #[inline(always)]
1425        fn inline_align(_context: fidl::encoding::Context) -> usize {
1426            8
1427        }
1428
1429        #[inline(always)]
1430        fn inline_size(_context: fidl::encoding::Context) -> usize {
1431            16
1432        }
1433    }
1434
1435    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<UnnamedGauge, D>
1436        for &UnnamedGauge
1437    {
1438        #[inline]
1439        unsafe fn encode(
1440            self,
1441            encoder: &mut fidl::encoding::Encoder<'_, D>,
1442            offset: usize,
1443            _depth: fidl::encoding::Depth,
1444        ) -> fidl::Result<()> {
1445            encoder.debug_check_bounds::<UnnamedGauge>(offset);
1446            unsafe {
1447                // Copy the object into the buffer.
1448                let buf_ptr = encoder.buf.as_mut_ptr().add(offset);
1449                (buf_ptr as *mut UnnamedGauge)
1450                    .write_unaligned((self as *const UnnamedGauge).read());
1451                // Zero out padding regions. Unlike `fidl_struct_impl_noncopy!`, this must be
1452                // done second because the memcpy will write garbage to these bytes.
1453                let padding_ptr = buf_ptr.offset(0) as *mut u64;
1454                let padding_mask = 0xffffffffffff0000u64;
1455                padding_ptr.write_unaligned(padding_ptr.read_unaligned() & !padding_mask);
1456            }
1457            Ok(())
1458        }
1459    }
1460    unsafe impl<
1461        D: fidl::encoding::ResourceDialect,
1462        T0: fidl::encoding::Encode<u16, D>,
1463        T1: fidl::encoding::Encode<i64, D>,
1464    > fidl::encoding::Encode<UnnamedGauge, D> for (T0, T1)
1465    {
1466        #[inline]
1467        unsafe fn encode(
1468            self,
1469            encoder: &mut fidl::encoding::Encoder<'_, D>,
1470            offset: usize,
1471            depth: fidl::encoding::Depth,
1472        ) -> fidl::Result<()> {
1473            encoder.debug_check_bounds::<UnnamedGauge>(offset);
1474            // Zero out padding regions. There's no need to apply masks
1475            // because the unmasked parts will be overwritten by fields.
1476            unsafe {
1477                let ptr = encoder.buf.as_mut_ptr().add(offset).offset(0);
1478                (ptr as *mut u64).write_unaligned(0);
1479            }
1480            // Write the fields.
1481            self.0.encode(encoder, offset + 0, depth)?;
1482            self.1.encode(encoder, offset + 8, depth)?;
1483            Ok(())
1484        }
1485    }
1486
1487    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for UnnamedGauge {
1488        #[inline(always)]
1489        fn new_empty() -> Self {
1490            Self { id: fidl::new_empty!(u16, D), value: fidl::new_empty!(i64, D) }
1491        }
1492
1493        #[inline]
1494        unsafe fn decode(
1495            &mut self,
1496            decoder: &mut fidl::encoding::Decoder<'_, D>,
1497            offset: usize,
1498            _depth: fidl::encoding::Depth,
1499        ) -> fidl::Result<()> {
1500            decoder.debug_check_bounds::<Self>(offset);
1501            let buf_ptr = unsafe { decoder.buf.as_ptr().add(offset) };
1502            // Verify that padding bytes are zero.
1503            let ptr = unsafe { buf_ptr.offset(0) };
1504            let padval = unsafe { (ptr as *const u64).read_unaligned() };
1505            let mask = 0xffffffffffff0000u64;
1506            let maskedval = padval & mask;
1507            if maskedval != 0 {
1508                return Err(fidl::Error::NonZeroPadding {
1509                    padding_start: offset + 0 + ((mask as u64).trailing_zeros() / 8) as usize,
1510                });
1511            }
1512            // Copy from the buffer into the object.
1513            unsafe {
1514                std::ptr::copy_nonoverlapping(buf_ptr, self as *mut Self as *mut u8, 16);
1515            }
1516            Ok(())
1517        }
1518    }
1519
1520    impl ConnectionSignalReport {
1521        #[inline(always)]
1522        fn max_ordinal_present(&self) -> u64 {
1523            if let Some(_) = self.rx_rate_500kbps {
1524                return 7;
1525            }
1526            if let Some(_) = self.vht_secondary_80_channel {
1527                return 6;
1528            }
1529            if let Some(_) = self.bandwidth {
1530                return 5;
1531            }
1532            if let Some(_) = self.snr_db {
1533                return 4;
1534            }
1535            if let Some(_) = self.rssi_dbm {
1536                return 3;
1537            }
1538            if let Some(_) = self.tx_rate_500kbps {
1539                return 2;
1540            }
1541            if let Some(_) = self.primary {
1542                return 1;
1543            }
1544            0
1545        }
1546    }
1547
1548    impl fidl::encoding::ValueTypeMarker for ConnectionSignalReport {
1549        type Borrowed<'a> = &'a Self;
1550        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
1551            value
1552        }
1553    }
1554
1555    unsafe impl fidl::encoding::TypeMarker for ConnectionSignalReport {
1556        type Owned = Self;
1557
1558        #[inline(always)]
1559        fn inline_align(_context: fidl::encoding::Context) -> usize {
1560            8
1561        }
1562
1563        #[inline(always)]
1564        fn inline_size(_context: fidl::encoding::Context) -> usize {
1565            16
1566        }
1567    }
1568
1569    unsafe impl<D: fidl::encoding::ResourceDialect>
1570        fidl::encoding::Encode<ConnectionSignalReport, D> for &ConnectionSignalReport
1571    {
1572        unsafe fn encode(
1573            self,
1574            encoder: &mut fidl::encoding::Encoder<'_, D>,
1575            offset: usize,
1576            mut depth: fidl::encoding::Depth,
1577        ) -> fidl::Result<()> {
1578            encoder.debug_check_bounds::<ConnectionSignalReport>(offset);
1579            // Vector header
1580            let max_ordinal: u64 = self.max_ordinal_present();
1581            encoder.write_num(max_ordinal, offset);
1582            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
1583            // Calling encoder.out_of_line_offset(0) is not allowed.
1584            if max_ordinal == 0 {
1585                return Ok(());
1586            }
1587            depth.increment()?;
1588            let envelope_size = 8;
1589            let bytes_len = max_ordinal as usize * envelope_size;
1590            #[allow(unused_variables)]
1591            let offset = encoder.out_of_line_offset(bytes_len);
1592            let mut _prev_end_offset: usize = 0;
1593            if 1 > max_ordinal {
1594                return Ok(());
1595            }
1596
1597            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1598            // are envelope_size bytes.
1599            let cur_offset: usize = (1 - 1) * envelope_size;
1600
1601            // Zero reserved fields.
1602            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1603
1604            // Safety:
1605            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1606            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1607            //   envelope_size bytes, there is always sufficient room.
1608            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_wlan_ieee80211_common::ChannelNumber, D>(
1609            self.primary.as_ref().map(<fidl_fuchsia_wlan_ieee80211_common::ChannelNumber as fidl::encoding::ValueTypeMarker>::borrow),
1610            encoder, offset + cur_offset, depth
1611        )?;
1612
1613            _prev_end_offset = cur_offset + envelope_size;
1614            if 2 > max_ordinal {
1615                return Ok(());
1616            }
1617
1618            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1619            // are envelope_size bytes.
1620            let cur_offset: usize = (2 - 1) * envelope_size;
1621
1622            // Zero reserved fields.
1623            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1624
1625            // Safety:
1626            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1627            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1628            //   envelope_size bytes, there is always sufficient room.
1629            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1630                self.tx_rate_500kbps.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1631                encoder,
1632                offset + cur_offset,
1633                depth,
1634            )?;
1635
1636            _prev_end_offset = cur_offset + envelope_size;
1637            if 3 > max_ordinal {
1638                return Ok(());
1639            }
1640
1641            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1642            // are envelope_size bytes.
1643            let cur_offset: usize = (3 - 1) * envelope_size;
1644
1645            // Zero reserved fields.
1646            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1647
1648            // Safety:
1649            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1650            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1651            //   envelope_size bytes, there is always sufficient room.
1652            fidl::encoding::encode_in_envelope_optional::<i8, D>(
1653                self.rssi_dbm.as_ref().map(<i8 as fidl::encoding::ValueTypeMarker>::borrow),
1654                encoder,
1655                offset + cur_offset,
1656                depth,
1657            )?;
1658
1659            _prev_end_offset = cur_offset + envelope_size;
1660            if 4 > max_ordinal {
1661                return Ok(());
1662            }
1663
1664            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1665            // are envelope_size bytes.
1666            let cur_offset: usize = (4 - 1) * envelope_size;
1667
1668            // Zero reserved fields.
1669            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1670
1671            // Safety:
1672            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1673            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1674            //   envelope_size bytes, there is always sufficient room.
1675            fidl::encoding::encode_in_envelope_optional::<i8, D>(
1676                self.snr_db.as_ref().map(<i8 as fidl::encoding::ValueTypeMarker>::borrow),
1677                encoder,
1678                offset + cur_offset,
1679                depth,
1680            )?;
1681
1682            _prev_end_offset = cur_offset + envelope_size;
1683            if 5 > max_ordinal {
1684                return Ok(());
1685            }
1686
1687            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1688            // are envelope_size bytes.
1689            let cur_offset: usize = (5 - 1) * envelope_size;
1690
1691            // Zero reserved fields.
1692            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1693
1694            // Safety:
1695            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1696            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1697            //   envelope_size bytes, there is always sufficient room.
1698            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_wlan_ieee80211_common::ChannelBandwidth, D>(
1699            self.bandwidth.as_ref().map(<fidl_fuchsia_wlan_ieee80211_common::ChannelBandwidth as fidl::encoding::ValueTypeMarker>::borrow),
1700            encoder, offset + cur_offset, depth
1701        )?;
1702
1703            _prev_end_offset = cur_offset + envelope_size;
1704            if 6 > max_ordinal {
1705                return Ok(());
1706            }
1707
1708            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1709            // are envelope_size bytes.
1710            let cur_offset: usize = (6 - 1) * envelope_size;
1711
1712            // Zero reserved fields.
1713            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1714
1715            // Safety:
1716            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1717            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1718            //   envelope_size bytes, there is always sufficient room.
1719            fidl::encoding::encode_in_envelope_optional::<fidl_fuchsia_wlan_ieee80211_common::ChannelNumber, D>(
1720            self.vht_secondary_80_channel.as_ref().map(<fidl_fuchsia_wlan_ieee80211_common::ChannelNumber as fidl::encoding::ValueTypeMarker>::borrow),
1721            encoder, offset + cur_offset, depth
1722        )?;
1723
1724            _prev_end_offset = cur_offset + envelope_size;
1725            if 7 > max_ordinal {
1726                return Ok(());
1727            }
1728
1729            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
1730            // are envelope_size bytes.
1731            let cur_offset: usize = (7 - 1) * envelope_size;
1732
1733            // Zero reserved fields.
1734            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
1735
1736            // Safety:
1737            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
1738            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
1739            //   envelope_size bytes, there is always sufficient room.
1740            fidl::encoding::encode_in_envelope_optional::<u32, D>(
1741                self.rx_rate_500kbps.as_ref().map(<u32 as fidl::encoding::ValueTypeMarker>::borrow),
1742                encoder,
1743                offset + cur_offset,
1744                depth,
1745            )?;
1746
1747            _prev_end_offset = cur_offset + envelope_size;
1748
1749            Ok(())
1750        }
1751    }
1752
1753    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D>
1754        for ConnectionSignalReport
1755    {
1756        #[inline(always)]
1757        fn new_empty() -> Self {
1758            Self::default()
1759        }
1760
1761        unsafe fn decode(
1762            &mut self,
1763            decoder: &mut fidl::encoding::Decoder<'_, D>,
1764            offset: usize,
1765            mut depth: fidl::encoding::Depth,
1766        ) -> fidl::Result<()> {
1767            decoder.debug_check_bounds::<Self>(offset);
1768            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
1769                None => return Err(fidl::Error::NotNullable),
1770                Some(len) => len,
1771            };
1772            // Calling decoder.out_of_line_offset(0) is not allowed.
1773            if len == 0 {
1774                return Ok(());
1775            };
1776            depth.increment()?;
1777            let envelope_size = 8;
1778            let bytes_len = len * envelope_size;
1779            let offset = decoder.out_of_line_offset(bytes_len)?;
1780            // Decode the envelope for each type.
1781            let mut _next_ordinal_to_read = 0;
1782            let mut next_offset = offset;
1783            let end_offset = offset + bytes_len;
1784            _next_ordinal_to_read += 1;
1785            if next_offset >= end_offset {
1786                return Ok(());
1787            }
1788
1789            // Decode unknown envelopes for gaps in ordinals.
1790            while _next_ordinal_to_read < 1 {
1791                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1792                _next_ordinal_to_read += 1;
1793                next_offset += envelope_size;
1794            }
1795
1796            let next_out_of_line = decoder.next_out_of_line();
1797            let handles_before = decoder.remaining_handles();
1798            if let Some((inlined, num_bytes, num_handles)) =
1799                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1800            {
1801                let member_inline_size = <fidl_fuchsia_wlan_ieee80211_common::ChannelNumber as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1802                if inlined != (member_inline_size <= 4) {
1803                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1804                }
1805                let inner_offset;
1806                let mut inner_depth = depth.clone();
1807                if inlined {
1808                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1809                    inner_offset = next_offset;
1810                } else {
1811                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1812                    inner_depth.increment()?;
1813                }
1814                let val_ref = self.primary.get_or_insert_with(|| {
1815                    fidl::new_empty!(fidl_fuchsia_wlan_ieee80211_common::ChannelNumber, D)
1816                });
1817                fidl::decode!(
1818                    fidl_fuchsia_wlan_ieee80211_common::ChannelNumber,
1819                    D,
1820                    val_ref,
1821                    decoder,
1822                    inner_offset,
1823                    inner_depth
1824                )?;
1825                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1826                {
1827                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1828                }
1829                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1830                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1831                }
1832            }
1833
1834            next_offset += envelope_size;
1835            _next_ordinal_to_read += 1;
1836            if next_offset >= end_offset {
1837                return Ok(());
1838            }
1839
1840            // Decode unknown envelopes for gaps in ordinals.
1841            while _next_ordinal_to_read < 2 {
1842                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1843                _next_ordinal_to_read += 1;
1844                next_offset += envelope_size;
1845            }
1846
1847            let next_out_of_line = decoder.next_out_of_line();
1848            let handles_before = decoder.remaining_handles();
1849            if let Some((inlined, num_bytes, num_handles)) =
1850                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1851            {
1852                let member_inline_size =
1853                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1854                if inlined != (member_inline_size <= 4) {
1855                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1856                }
1857                let inner_offset;
1858                let mut inner_depth = depth.clone();
1859                if inlined {
1860                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1861                    inner_offset = next_offset;
1862                } else {
1863                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1864                    inner_depth.increment()?;
1865                }
1866                let val_ref = self.tx_rate_500kbps.get_or_insert_with(|| fidl::new_empty!(u32, D));
1867                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
1868                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1869                {
1870                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1871                }
1872                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1873                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1874                }
1875            }
1876
1877            next_offset += envelope_size;
1878            _next_ordinal_to_read += 1;
1879            if next_offset >= end_offset {
1880                return Ok(());
1881            }
1882
1883            // Decode unknown envelopes for gaps in ordinals.
1884            while _next_ordinal_to_read < 3 {
1885                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1886                _next_ordinal_to_read += 1;
1887                next_offset += envelope_size;
1888            }
1889
1890            let next_out_of_line = decoder.next_out_of_line();
1891            let handles_before = decoder.remaining_handles();
1892            if let Some((inlined, num_bytes, num_handles)) =
1893                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1894            {
1895                let member_inline_size =
1896                    <i8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1897                if inlined != (member_inline_size <= 4) {
1898                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1899                }
1900                let inner_offset;
1901                let mut inner_depth = depth.clone();
1902                if inlined {
1903                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1904                    inner_offset = next_offset;
1905                } else {
1906                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1907                    inner_depth.increment()?;
1908                }
1909                let val_ref = self.rssi_dbm.get_or_insert_with(|| fidl::new_empty!(i8, D));
1910                fidl::decode!(i8, D, val_ref, decoder, inner_offset, inner_depth)?;
1911                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1912                {
1913                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1914                }
1915                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1916                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1917                }
1918            }
1919
1920            next_offset += envelope_size;
1921            _next_ordinal_to_read += 1;
1922            if next_offset >= end_offset {
1923                return Ok(());
1924            }
1925
1926            // Decode unknown envelopes for gaps in ordinals.
1927            while _next_ordinal_to_read < 4 {
1928                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1929                _next_ordinal_to_read += 1;
1930                next_offset += envelope_size;
1931            }
1932
1933            let next_out_of_line = decoder.next_out_of_line();
1934            let handles_before = decoder.remaining_handles();
1935            if let Some((inlined, num_bytes, num_handles)) =
1936                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1937            {
1938                let member_inline_size =
1939                    <i8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1940                if inlined != (member_inline_size <= 4) {
1941                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1942                }
1943                let inner_offset;
1944                let mut inner_depth = depth.clone();
1945                if inlined {
1946                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1947                    inner_offset = next_offset;
1948                } else {
1949                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1950                    inner_depth.increment()?;
1951                }
1952                let val_ref = self.snr_db.get_or_insert_with(|| fidl::new_empty!(i8, D));
1953                fidl::decode!(i8, D, val_ref, decoder, inner_offset, inner_depth)?;
1954                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
1955                {
1956                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
1957                }
1958                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
1959                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
1960                }
1961            }
1962
1963            next_offset += envelope_size;
1964            _next_ordinal_to_read += 1;
1965            if next_offset >= end_offset {
1966                return Ok(());
1967            }
1968
1969            // Decode unknown envelopes for gaps in ordinals.
1970            while _next_ordinal_to_read < 5 {
1971                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
1972                _next_ordinal_to_read += 1;
1973                next_offset += envelope_size;
1974            }
1975
1976            let next_out_of_line = decoder.next_out_of_line();
1977            let handles_before = decoder.remaining_handles();
1978            if let Some((inlined, num_bytes, num_handles)) =
1979                fidl::encoding::decode_envelope_header(decoder, next_offset)?
1980            {
1981                let member_inline_size = <fidl_fuchsia_wlan_ieee80211_common::ChannelBandwidth as fidl::encoding::TypeMarker>::inline_size(decoder.context);
1982                if inlined != (member_inline_size <= 4) {
1983                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
1984                }
1985                let inner_offset;
1986                let mut inner_depth = depth.clone();
1987                if inlined {
1988                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
1989                    inner_offset = next_offset;
1990                } else {
1991                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
1992                    inner_depth.increment()?;
1993                }
1994                let val_ref = self.bandwidth.get_or_insert_with(|| {
1995                    fidl::new_empty!(fidl_fuchsia_wlan_ieee80211_common::ChannelBandwidth, D)
1996                });
1997                fidl::decode!(
1998                    fidl_fuchsia_wlan_ieee80211_common::ChannelBandwidth,
1999                    D,
2000                    val_ref,
2001                    decoder,
2002                    inner_offset,
2003                    inner_depth
2004                )?;
2005                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2006                {
2007                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2008                }
2009                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2010                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2011                }
2012            }
2013
2014            next_offset += envelope_size;
2015            _next_ordinal_to_read += 1;
2016            if next_offset >= end_offset {
2017                return Ok(());
2018            }
2019
2020            // Decode unknown envelopes for gaps in ordinals.
2021            while _next_ordinal_to_read < 6 {
2022                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2023                _next_ordinal_to_read += 1;
2024                next_offset += envelope_size;
2025            }
2026
2027            let next_out_of_line = decoder.next_out_of_line();
2028            let handles_before = decoder.remaining_handles();
2029            if let Some((inlined, num_bytes, num_handles)) =
2030                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2031            {
2032                let member_inline_size = <fidl_fuchsia_wlan_ieee80211_common::ChannelNumber as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2033                if inlined != (member_inline_size <= 4) {
2034                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2035                }
2036                let inner_offset;
2037                let mut inner_depth = depth.clone();
2038                if inlined {
2039                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2040                    inner_offset = next_offset;
2041                } else {
2042                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2043                    inner_depth.increment()?;
2044                }
2045                let val_ref = self.vht_secondary_80_channel.get_or_insert_with(|| {
2046                    fidl::new_empty!(fidl_fuchsia_wlan_ieee80211_common::ChannelNumber, D)
2047                });
2048                fidl::decode!(
2049                    fidl_fuchsia_wlan_ieee80211_common::ChannelNumber,
2050                    D,
2051                    val_ref,
2052                    decoder,
2053                    inner_offset,
2054                    inner_depth
2055                )?;
2056                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2057                {
2058                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2059                }
2060                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2061                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2062                }
2063            }
2064
2065            next_offset += envelope_size;
2066            _next_ordinal_to_read += 1;
2067            if next_offset >= end_offset {
2068                return Ok(());
2069            }
2070
2071            // Decode unknown envelopes for gaps in ordinals.
2072            while _next_ordinal_to_read < 7 {
2073                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2074                _next_ordinal_to_read += 1;
2075                next_offset += envelope_size;
2076            }
2077
2078            let next_out_of_line = decoder.next_out_of_line();
2079            let handles_before = decoder.remaining_handles();
2080            if let Some((inlined, num_bytes, num_handles)) =
2081                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2082            {
2083                let member_inline_size =
2084                    <u32 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2085                if inlined != (member_inline_size <= 4) {
2086                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2087                }
2088                let inner_offset;
2089                let mut inner_depth = depth.clone();
2090                if inlined {
2091                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2092                    inner_offset = next_offset;
2093                } else {
2094                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2095                    inner_depth.increment()?;
2096                }
2097                let val_ref = self.rx_rate_500kbps.get_or_insert_with(|| fidl::new_empty!(u32, D));
2098                fidl::decode!(u32, D, val_ref, decoder, inner_offset, inner_depth)?;
2099                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2100                {
2101                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2102                }
2103                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2104                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2105                }
2106            }
2107
2108            next_offset += envelope_size;
2109
2110            // Decode the remaining unknown envelopes.
2111            while next_offset < end_offset {
2112                _next_ordinal_to_read += 1;
2113                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2114                next_offset += envelope_size;
2115            }
2116
2117            Ok(())
2118        }
2119    }
2120
2121    impl ConnectionStats {
2122        #[inline(always)]
2123        fn max_ordinal_present(&self) -> u64 {
2124            if let Some(_) = self.wme {
2125                return 9;
2126            }
2127            if let Some(_) = self.tx_drop {
2128                return 8;
2129            }
2130            if let Some(_) = self.tx_total {
2131                return 7;
2132            }
2133            if let Some(_) = self.rx_multicast {
2134                return 6;
2135            }
2136            if let Some(_) = self.rx_unicast_drop {
2137                return 5;
2138            }
2139            if let Some(_) = self.rx_unicast_total {
2140                return 4;
2141            }
2142            if let Some(_) = self.driver_specific_gauges {
2143                return 3;
2144            }
2145            if let Some(_) = self.driver_specific_counters {
2146                return 2;
2147            }
2148            if let Some(_) = self.connection_id {
2149                return 1;
2150            }
2151            0
2152        }
2153    }
2154
2155    impl fidl::encoding::ValueTypeMarker for ConnectionStats {
2156        type Borrowed<'a> = &'a Self;
2157        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2158            value
2159        }
2160    }
2161
2162    unsafe impl fidl::encoding::TypeMarker for ConnectionStats {
2163        type Owned = Self;
2164
2165        #[inline(always)]
2166        fn inline_align(_context: fidl::encoding::Context) -> usize {
2167            8
2168        }
2169
2170        #[inline(always)]
2171        fn inline_size(_context: fidl::encoding::Context) -> usize {
2172            16
2173        }
2174    }
2175
2176    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<ConnectionStats, D>
2177        for &ConnectionStats
2178    {
2179        unsafe fn encode(
2180            self,
2181            encoder: &mut fidl::encoding::Encoder<'_, D>,
2182            offset: usize,
2183            mut depth: fidl::encoding::Depth,
2184        ) -> fidl::Result<()> {
2185            encoder.debug_check_bounds::<ConnectionStats>(offset);
2186            // Vector header
2187            let max_ordinal: u64 = self.max_ordinal_present();
2188            encoder.write_num(max_ordinal, offset);
2189            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2190            // Calling encoder.out_of_line_offset(0) is not allowed.
2191            if max_ordinal == 0 {
2192                return Ok(());
2193            }
2194            depth.increment()?;
2195            let envelope_size = 8;
2196            let bytes_len = max_ordinal as usize * envelope_size;
2197            #[allow(unused_variables)]
2198            let offset = encoder.out_of_line_offset(bytes_len);
2199            let mut _prev_end_offset: usize = 0;
2200            if 1 > max_ordinal {
2201                return Ok(());
2202            }
2203
2204            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2205            // are envelope_size bytes.
2206            let cur_offset: usize = (1 - 1) * envelope_size;
2207
2208            // Zero reserved fields.
2209            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2210
2211            // Safety:
2212            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2213            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2214            //   envelope_size bytes, there is always sufficient room.
2215            fidl::encoding::encode_in_envelope_optional::<u8, D>(
2216                self.connection_id.as_ref().map(<u8 as fidl::encoding::ValueTypeMarker>::borrow),
2217                encoder,
2218                offset + cur_offset,
2219                depth,
2220            )?;
2221
2222            _prev_end_offset = cur_offset + envelope_size;
2223            if 2 > max_ordinal {
2224                return Ok(());
2225            }
2226
2227            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2228            // are envelope_size bytes.
2229            let cur_offset: usize = (2 - 1) * envelope_size;
2230
2231            // Zero reserved fields.
2232            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2233
2234            // Safety:
2235            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2236            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2237            //   envelope_size bytes, there is always sufficient room.
2238            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<UnnamedCounter, 127>, D>(
2239            self.driver_specific_counters.as_ref().map(<fidl::encoding::Vector<UnnamedCounter, 127> as fidl::encoding::ValueTypeMarker>::borrow),
2240            encoder, offset + cur_offset, depth
2241        )?;
2242
2243            _prev_end_offset = cur_offset + envelope_size;
2244            if 3 > max_ordinal {
2245                return Ok(());
2246            }
2247
2248            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2249            // are envelope_size bytes.
2250            let cur_offset: usize = (3 - 1) * envelope_size;
2251
2252            // Zero reserved fields.
2253            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2254
2255            // Safety:
2256            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2257            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2258            //   envelope_size bytes, there is always sufficient room.
2259            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<UnnamedGauge, 127>, D>(
2260            self.driver_specific_gauges.as_ref().map(<fidl::encoding::Vector<UnnamedGauge, 127> as fidl::encoding::ValueTypeMarker>::borrow),
2261            encoder, offset + cur_offset, depth
2262        )?;
2263
2264            _prev_end_offset = cur_offset + envelope_size;
2265            if 4 > max_ordinal {
2266                return Ok(());
2267            }
2268
2269            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2270            // are envelope_size bytes.
2271            let cur_offset: usize = (4 - 1) * envelope_size;
2272
2273            // Zero reserved fields.
2274            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2275
2276            // Safety:
2277            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2278            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2279            //   envelope_size bytes, there is always sufficient room.
2280            fidl::encoding::encode_in_envelope_optional::<u64, D>(
2281                self.rx_unicast_total
2282                    .as_ref()
2283                    .map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
2284                encoder,
2285                offset + cur_offset,
2286                depth,
2287            )?;
2288
2289            _prev_end_offset = cur_offset + envelope_size;
2290            if 5 > max_ordinal {
2291                return Ok(());
2292            }
2293
2294            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2295            // are envelope_size bytes.
2296            let cur_offset: usize = (5 - 1) * envelope_size;
2297
2298            // Zero reserved fields.
2299            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2300
2301            // Safety:
2302            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2303            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2304            //   envelope_size bytes, there is always sufficient room.
2305            fidl::encoding::encode_in_envelope_optional::<u64, D>(
2306                self.rx_unicast_drop.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
2307                encoder,
2308                offset + cur_offset,
2309                depth,
2310            )?;
2311
2312            _prev_end_offset = cur_offset + envelope_size;
2313            if 6 > max_ordinal {
2314                return Ok(());
2315            }
2316
2317            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2318            // are envelope_size bytes.
2319            let cur_offset: usize = (6 - 1) * envelope_size;
2320
2321            // Zero reserved fields.
2322            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2323
2324            // Safety:
2325            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2326            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2327            //   envelope_size bytes, there is always sufficient room.
2328            fidl::encoding::encode_in_envelope_optional::<u64, D>(
2329                self.rx_multicast.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
2330                encoder,
2331                offset + cur_offset,
2332                depth,
2333            )?;
2334
2335            _prev_end_offset = cur_offset + envelope_size;
2336            if 7 > max_ordinal {
2337                return Ok(());
2338            }
2339
2340            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2341            // are envelope_size bytes.
2342            let cur_offset: usize = (7 - 1) * envelope_size;
2343
2344            // Zero reserved fields.
2345            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2346
2347            // Safety:
2348            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2349            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2350            //   envelope_size bytes, there is always sufficient room.
2351            fidl::encoding::encode_in_envelope_optional::<u64, D>(
2352                self.tx_total.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
2353                encoder,
2354                offset + cur_offset,
2355                depth,
2356            )?;
2357
2358            _prev_end_offset = cur_offset + envelope_size;
2359            if 8 > max_ordinal {
2360                return Ok(());
2361            }
2362
2363            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2364            // are envelope_size bytes.
2365            let cur_offset: usize = (8 - 1) * envelope_size;
2366
2367            // Zero reserved fields.
2368            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2369
2370            // Safety:
2371            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2372            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2373            //   envelope_size bytes, there is always sufficient room.
2374            fidl::encoding::encode_in_envelope_optional::<u64, D>(
2375                self.tx_drop.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
2376                encoder,
2377                offset + cur_offset,
2378                depth,
2379            )?;
2380
2381            _prev_end_offset = cur_offset + envelope_size;
2382            if 9 > max_ordinal {
2383                return Ok(());
2384            }
2385
2386            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2387            // are envelope_size bytes.
2388            let cur_offset: usize = (9 - 1) * envelope_size;
2389
2390            // Zero reserved fields.
2391            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2392
2393            // Safety:
2394            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2395            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2396            //   envelope_size bytes, there is always sufficient room.
2397            fidl::encoding::encode_in_envelope_optional::<WmePacketStats, D>(
2398                self.wme.as_ref().map(<WmePacketStats as fidl::encoding::ValueTypeMarker>::borrow),
2399                encoder,
2400                offset + cur_offset,
2401                depth,
2402            )?;
2403
2404            _prev_end_offset = cur_offset + envelope_size;
2405
2406            Ok(())
2407        }
2408    }
2409
2410    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for ConnectionStats {
2411        #[inline(always)]
2412        fn new_empty() -> Self {
2413            Self::default()
2414        }
2415
2416        unsafe fn decode(
2417            &mut self,
2418            decoder: &mut fidl::encoding::Decoder<'_, D>,
2419            offset: usize,
2420            mut depth: fidl::encoding::Depth,
2421        ) -> fidl::Result<()> {
2422            decoder.debug_check_bounds::<Self>(offset);
2423            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
2424                None => return Err(fidl::Error::NotNullable),
2425                Some(len) => len,
2426            };
2427            // Calling decoder.out_of_line_offset(0) is not allowed.
2428            if len == 0 {
2429                return Ok(());
2430            };
2431            depth.increment()?;
2432            let envelope_size = 8;
2433            let bytes_len = len * envelope_size;
2434            let offset = decoder.out_of_line_offset(bytes_len)?;
2435            // Decode the envelope for each type.
2436            let mut _next_ordinal_to_read = 0;
2437            let mut next_offset = offset;
2438            let end_offset = offset + bytes_len;
2439            _next_ordinal_to_read += 1;
2440            if next_offset >= end_offset {
2441                return Ok(());
2442            }
2443
2444            // Decode unknown envelopes for gaps in ordinals.
2445            while _next_ordinal_to_read < 1 {
2446                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2447                _next_ordinal_to_read += 1;
2448                next_offset += envelope_size;
2449            }
2450
2451            let next_out_of_line = decoder.next_out_of_line();
2452            let handles_before = decoder.remaining_handles();
2453            if let Some((inlined, num_bytes, num_handles)) =
2454                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2455            {
2456                let member_inline_size =
2457                    <u8 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2458                if inlined != (member_inline_size <= 4) {
2459                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2460                }
2461                let inner_offset;
2462                let mut inner_depth = depth.clone();
2463                if inlined {
2464                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2465                    inner_offset = next_offset;
2466                } else {
2467                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2468                    inner_depth.increment()?;
2469                }
2470                let val_ref = self.connection_id.get_or_insert_with(|| fidl::new_empty!(u8, D));
2471                fidl::decode!(u8, D, val_ref, decoder, inner_offset, inner_depth)?;
2472                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2473                {
2474                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2475                }
2476                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2477                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2478                }
2479            }
2480
2481            next_offset += envelope_size;
2482            _next_ordinal_to_read += 1;
2483            if next_offset >= end_offset {
2484                return Ok(());
2485            }
2486
2487            // Decode unknown envelopes for gaps in ordinals.
2488            while _next_ordinal_to_read < 2 {
2489                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2490                _next_ordinal_to_read += 1;
2491                next_offset += envelope_size;
2492            }
2493
2494            let next_out_of_line = decoder.next_out_of_line();
2495            let handles_before = decoder.remaining_handles();
2496            if let Some((inlined, num_bytes, num_handles)) =
2497                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2498            {
2499                let member_inline_size = <fidl::encoding::Vector<UnnamedCounter, 127> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2500                if inlined != (member_inline_size <= 4) {
2501                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2502                }
2503                let inner_offset;
2504                let mut inner_depth = depth.clone();
2505                if inlined {
2506                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2507                    inner_offset = next_offset;
2508                } else {
2509                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2510                    inner_depth.increment()?;
2511                }
2512                let val_ref = self.driver_specific_counters.get_or_insert_with(
2513                    || fidl::new_empty!(fidl::encoding::Vector<UnnamedCounter, 127>, D),
2514                );
2515                fidl::decode!(fidl::encoding::Vector<UnnamedCounter, 127>, D, val_ref, decoder, inner_offset, inner_depth)?;
2516                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2517                {
2518                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2519                }
2520                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2521                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2522                }
2523            }
2524
2525            next_offset += envelope_size;
2526            _next_ordinal_to_read += 1;
2527            if next_offset >= end_offset {
2528                return Ok(());
2529            }
2530
2531            // Decode unknown envelopes for gaps in ordinals.
2532            while _next_ordinal_to_read < 3 {
2533                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2534                _next_ordinal_to_read += 1;
2535                next_offset += envelope_size;
2536            }
2537
2538            let next_out_of_line = decoder.next_out_of_line();
2539            let handles_before = decoder.remaining_handles();
2540            if let Some((inlined, num_bytes, num_handles)) =
2541                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2542            {
2543                let member_inline_size = <fidl::encoding::Vector<UnnamedGauge, 127> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2544                if inlined != (member_inline_size <= 4) {
2545                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2546                }
2547                let inner_offset;
2548                let mut inner_depth = depth.clone();
2549                if inlined {
2550                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2551                    inner_offset = next_offset;
2552                } else {
2553                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2554                    inner_depth.increment()?;
2555                }
2556                let val_ref = self.driver_specific_gauges.get_or_insert_with(
2557                    || fidl::new_empty!(fidl::encoding::Vector<UnnamedGauge, 127>, D),
2558                );
2559                fidl::decode!(fidl::encoding::Vector<UnnamedGauge, 127>, D, val_ref, decoder, inner_offset, inner_depth)?;
2560                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2561                {
2562                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2563                }
2564                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2565                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2566                }
2567            }
2568
2569            next_offset += envelope_size;
2570            _next_ordinal_to_read += 1;
2571            if next_offset >= end_offset {
2572                return Ok(());
2573            }
2574
2575            // Decode unknown envelopes for gaps in ordinals.
2576            while _next_ordinal_to_read < 4 {
2577                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2578                _next_ordinal_to_read += 1;
2579                next_offset += envelope_size;
2580            }
2581
2582            let next_out_of_line = decoder.next_out_of_line();
2583            let handles_before = decoder.remaining_handles();
2584            if let Some((inlined, num_bytes, num_handles)) =
2585                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2586            {
2587                let member_inline_size =
2588                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2589                if inlined != (member_inline_size <= 4) {
2590                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2591                }
2592                let inner_offset;
2593                let mut inner_depth = depth.clone();
2594                if inlined {
2595                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2596                    inner_offset = next_offset;
2597                } else {
2598                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2599                    inner_depth.increment()?;
2600                }
2601                let val_ref = self.rx_unicast_total.get_or_insert_with(|| fidl::new_empty!(u64, D));
2602                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
2603                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2604                {
2605                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2606                }
2607                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2608                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2609                }
2610            }
2611
2612            next_offset += envelope_size;
2613            _next_ordinal_to_read += 1;
2614            if next_offset >= end_offset {
2615                return Ok(());
2616            }
2617
2618            // Decode unknown envelopes for gaps in ordinals.
2619            while _next_ordinal_to_read < 5 {
2620                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2621                _next_ordinal_to_read += 1;
2622                next_offset += envelope_size;
2623            }
2624
2625            let next_out_of_line = decoder.next_out_of_line();
2626            let handles_before = decoder.remaining_handles();
2627            if let Some((inlined, num_bytes, num_handles)) =
2628                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2629            {
2630                let member_inline_size =
2631                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2632                if inlined != (member_inline_size <= 4) {
2633                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2634                }
2635                let inner_offset;
2636                let mut inner_depth = depth.clone();
2637                if inlined {
2638                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2639                    inner_offset = next_offset;
2640                } else {
2641                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2642                    inner_depth.increment()?;
2643                }
2644                let val_ref = self.rx_unicast_drop.get_or_insert_with(|| fidl::new_empty!(u64, D));
2645                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
2646                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2647                {
2648                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2649                }
2650                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2651                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2652                }
2653            }
2654
2655            next_offset += envelope_size;
2656            _next_ordinal_to_read += 1;
2657            if next_offset >= end_offset {
2658                return Ok(());
2659            }
2660
2661            // Decode unknown envelopes for gaps in ordinals.
2662            while _next_ordinal_to_read < 6 {
2663                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2664                _next_ordinal_to_read += 1;
2665                next_offset += envelope_size;
2666            }
2667
2668            let next_out_of_line = decoder.next_out_of_line();
2669            let handles_before = decoder.remaining_handles();
2670            if let Some((inlined, num_bytes, num_handles)) =
2671                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2672            {
2673                let member_inline_size =
2674                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2675                if inlined != (member_inline_size <= 4) {
2676                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2677                }
2678                let inner_offset;
2679                let mut inner_depth = depth.clone();
2680                if inlined {
2681                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2682                    inner_offset = next_offset;
2683                } else {
2684                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2685                    inner_depth.increment()?;
2686                }
2687                let val_ref = self.rx_multicast.get_or_insert_with(|| fidl::new_empty!(u64, D));
2688                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
2689                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2690                {
2691                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2692                }
2693                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2694                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2695                }
2696            }
2697
2698            next_offset += envelope_size;
2699            _next_ordinal_to_read += 1;
2700            if next_offset >= end_offset {
2701                return Ok(());
2702            }
2703
2704            // Decode unknown envelopes for gaps in ordinals.
2705            while _next_ordinal_to_read < 7 {
2706                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2707                _next_ordinal_to_read += 1;
2708                next_offset += envelope_size;
2709            }
2710
2711            let next_out_of_line = decoder.next_out_of_line();
2712            let handles_before = decoder.remaining_handles();
2713            if let Some((inlined, num_bytes, num_handles)) =
2714                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2715            {
2716                let member_inline_size =
2717                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2718                if inlined != (member_inline_size <= 4) {
2719                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2720                }
2721                let inner_offset;
2722                let mut inner_depth = depth.clone();
2723                if inlined {
2724                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2725                    inner_offset = next_offset;
2726                } else {
2727                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2728                    inner_depth.increment()?;
2729                }
2730                let val_ref = self.tx_total.get_or_insert_with(|| fidl::new_empty!(u64, D));
2731                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
2732                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2733                {
2734                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2735                }
2736                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2737                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2738                }
2739            }
2740
2741            next_offset += envelope_size;
2742            _next_ordinal_to_read += 1;
2743            if next_offset >= end_offset {
2744                return Ok(());
2745            }
2746
2747            // Decode unknown envelopes for gaps in ordinals.
2748            while _next_ordinal_to_read < 8 {
2749                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2750                _next_ordinal_to_read += 1;
2751                next_offset += envelope_size;
2752            }
2753
2754            let next_out_of_line = decoder.next_out_of_line();
2755            let handles_before = decoder.remaining_handles();
2756            if let Some((inlined, num_bytes, num_handles)) =
2757                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2758            {
2759                let member_inline_size =
2760                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2761                if inlined != (member_inline_size <= 4) {
2762                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2763                }
2764                let inner_offset;
2765                let mut inner_depth = depth.clone();
2766                if inlined {
2767                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2768                    inner_offset = next_offset;
2769                } else {
2770                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2771                    inner_depth.increment()?;
2772                }
2773                let val_ref = self.tx_drop.get_or_insert_with(|| fidl::new_empty!(u64, D));
2774                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
2775                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2776                {
2777                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2778                }
2779                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2780                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2781                }
2782            }
2783
2784            next_offset += envelope_size;
2785            _next_ordinal_to_read += 1;
2786            if next_offset >= end_offset {
2787                return Ok(());
2788            }
2789
2790            // Decode unknown envelopes for gaps in ordinals.
2791            while _next_ordinal_to_read < 9 {
2792                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2793                _next_ordinal_to_read += 1;
2794                next_offset += envelope_size;
2795            }
2796
2797            let next_out_of_line = decoder.next_out_of_line();
2798            let handles_before = decoder.remaining_handles();
2799            if let Some((inlined, num_bytes, num_handles)) =
2800                fidl::encoding::decode_envelope_header(decoder, next_offset)?
2801            {
2802                let member_inline_size =
2803                    <WmePacketStats as fidl::encoding::TypeMarker>::inline_size(decoder.context);
2804                if inlined != (member_inline_size <= 4) {
2805                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
2806                }
2807                let inner_offset;
2808                let mut inner_depth = depth.clone();
2809                if inlined {
2810                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
2811                    inner_offset = next_offset;
2812                } else {
2813                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
2814                    inner_depth.increment()?;
2815                }
2816                let val_ref = self.wme.get_or_insert_with(|| fidl::new_empty!(WmePacketStats, D));
2817                fidl::decode!(WmePacketStats, D, val_ref, decoder, inner_offset, inner_depth)?;
2818                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
2819                {
2820                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
2821                }
2822                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
2823                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
2824                }
2825            }
2826
2827            next_offset += envelope_size;
2828
2829            // Decode the remaining unknown envelopes.
2830            while next_offset < end_offset {
2831                _next_ordinal_to_read += 1;
2832                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
2833                next_offset += envelope_size;
2834            }
2835
2836            Ok(())
2837        }
2838    }
2839
2840    impl IfaceHistogramStats {
2841        #[inline(always)]
2842        fn max_ordinal_present(&self) -> u64 {
2843            if let Some(_) = self.snr_histograms {
2844                return 4;
2845            }
2846            if let Some(_) = self.rx_rate_index_histograms {
2847                return 3;
2848            }
2849            if let Some(_) = self.rssi_histograms {
2850                return 2;
2851            }
2852            if let Some(_) = self.noise_floor_histograms {
2853                return 1;
2854            }
2855            0
2856        }
2857    }
2858
2859    impl fidl::encoding::ValueTypeMarker for IfaceHistogramStats {
2860        type Borrowed<'a> = &'a Self;
2861        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
2862            value
2863        }
2864    }
2865
2866    unsafe impl fidl::encoding::TypeMarker for IfaceHistogramStats {
2867        type Owned = Self;
2868
2869        #[inline(always)]
2870        fn inline_align(_context: fidl::encoding::Context) -> usize {
2871            8
2872        }
2873
2874        #[inline(always)]
2875        fn inline_size(_context: fidl::encoding::Context) -> usize {
2876            16
2877        }
2878    }
2879
2880    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<IfaceHistogramStats, D>
2881        for &IfaceHistogramStats
2882    {
2883        unsafe fn encode(
2884            self,
2885            encoder: &mut fidl::encoding::Encoder<'_, D>,
2886            offset: usize,
2887            mut depth: fidl::encoding::Depth,
2888        ) -> fidl::Result<()> {
2889            encoder.debug_check_bounds::<IfaceHistogramStats>(offset);
2890            // Vector header
2891            let max_ordinal: u64 = self.max_ordinal_present();
2892            encoder.write_num(max_ordinal, offset);
2893            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
2894            // Calling encoder.out_of_line_offset(0) is not allowed.
2895            if max_ordinal == 0 {
2896                return Ok(());
2897            }
2898            depth.increment()?;
2899            let envelope_size = 8;
2900            let bytes_len = max_ordinal as usize * envelope_size;
2901            #[allow(unused_variables)]
2902            let offset = encoder.out_of_line_offset(bytes_len);
2903            let mut _prev_end_offset: usize = 0;
2904            if 1 > max_ordinal {
2905                return Ok(());
2906            }
2907
2908            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2909            // are envelope_size bytes.
2910            let cur_offset: usize = (1 - 1) * envelope_size;
2911
2912            // Zero reserved fields.
2913            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2914
2915            // Safety:
2916            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2917            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2918            //   envelope_size bytes, there is always sufficient room.
2919            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<NoiseFloorHistogram, 8>, D>(
2920            self.noise_floor_histograms.as_ref().map(<fidl::encoding::Vector<NoiseFloorHistogram, 8> as fidl::encoding::ValueTypeMarker>::borrow),
2921            encoder, offset + cur_offset, depth
2922        )?;
2923
2924            _prev_end_offset = cur_offset + envelope_size;
2925            if 2 > max_ordinal {
2926                return Ok(());
2927            }
2928
2929            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2930            // are envelope_size bytes.
2931            let cur_offset: usize = (2 - 1) * envelope_size;
2932
2933            // Zero reserved fields.
2934            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2935
2936            // Safety:
2937            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2938            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2939            //   envelope_size bytes, there is always sufficient room.
2940            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<RssiHistogram, 8>, D>(
2941            self.rssi_histograms.as_ref().map(<fidl::encoding::Vector<RssiHistogram, 8> as fidl::encoding::ValueTypeMarker>::borrow),
2942            encoder, offset + cur_offset, depth
2943        )?;
2944
2945            _prev_end_offset = cur_offset + envelope_size;
2946            if 3 > max_ordinal {
2947                return Ok(());
2948            }
2949
2950            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2951            // are envelope_size bytes.
2952            let cur_offset: usize = (3 - 1) * envelope_size;
2953
2954            // Zero reserved fields.
2955            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2956
2957            // Safety:
2958            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2959            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2960            //   envelope_size bytes, there is always sufficient room.
2961            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<RxRateIndexHistogram, 8>, D>(
2962            self.rx_rate_index_histograms.as_ref().map(<fidl::encoding::Vector<RxRateIndexHistogram, 8> as fidl::encoding::ValueTypeMarker>::borrow),
2963            encoder, offset + cur_offset, depth
2964        )?;
2965
2966            _prev_end_offset = cur_offset + envelope_size;
2967            if 4 > max_ordinal {
2968                return Ok(());
2969            }
2970
2971            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
2972            // are envelope_size bytes.
2973            let cur_offset: usize = (4 - 1) * envelope_size;
2974
2975            // Zero reserved fields.
2976            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
2977
2978            // Safety:
2979            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
2980            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
2981            //   envelope_size bytes, there is always sufficient room.
2982            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<SnrHistogram, 8>, D>(
2983            self.snr_histograms.as_ref().map(<fidl::encoding::Vector<SnrHistogram, 8> as fidl::encoding::ValueTypeMarker>::borrow),
2984            encoder, offset + cur_offset, depth
2985        )?;
2986
2987            _prev_end_offset = cur_offset + envelope_size;
2988
2989            Ok(())
2990        }
2991    }
2992
2993    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for IfaceHistogramStats {
2994        #[inline(always)]
2995        fn new_empty() -> Self {
2996            Self::default()
2997        }
2998
2999        unsafe fn decode(
3000            &mut self,
3001            decoder: &mut fidl::encoding::Decoder<'_, D>,
3002            offset: usize,
3003            mut depth: fidl::encoding::Depth,
3004        ) -> fidl::Result<()> {
3005            decoder.debug_check_bounds::<Self>(offset);
3006            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3007                None => return Err(fidl::Error::NotNullable),
3008                Some(len) => len,
3009            };
3010            // Calling decoder.out_of_line_offset(0) is not allowed.
3011            if len == 0 {
3012                return Ok(());
3013            };
3014            depth.increment()?;
3015            let envelope_size = 8;
3016            let bytes_len = len * envelope_size;
3017            let offset = decoder.out_of_line_offset(bytes_len)?;
3018            // Decode the envelope for each type.
3019            let mut _next_ordinal_to_read = 0;
3020            let mut next_offset = offset;
3021            let end_offset = offset + bytes_len;
3022            _next_ordinal_to_read += 1;
3023            if next_offset >= end_offset {
3024                return Ok(());
3025            }
3026
3027            // Decode unknown envelopes for gaps in ordinals.
3028            while _next_ordinal_to_read < 1 {
3029                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3030                _next_ordinal_to_read += 1;
3031                next_offset += envelope_size;
3032            }
3033
3034            let next_out_of_line = decoder.next_out_of_line();
3035            let handles_before = decoder.remaining_handles();
3036            if let Some((inlined, num_bytes, num_handles)) =
3037                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3038            {
3039                let member_inline_size = <fidl::encoding::Vector<NoiseFloorHistogram, 8> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3040                if inlined != (member_inline_size <= 4) {
3041                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3042                }
3043                let inner_offset;
3044                let mut inner_depth = depth.clone();
3045                if inlined {
3046                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3047                    inner_offset = next_offset;
3048                } else {
3049                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3050                    inner_depth.increment()?;
3051                }
3052                let val_ref = self.noise_floor_histograms.get_or_insert_with(
3053                    || fidl::new_empty!(fidl::encoding::Vector<NoiseFloorHistogram, 8>, D),
3054                );
3055                fidl::decode!(fidl::encoding::Vector<NoiseFloorHistogram, 8>, D, val_ref, decoder, inner_offset, inner_depth)?;
3056                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3057                {
3058                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3059                }
3060                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3061                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3062                }
3063            }
3064
3065            next_offset += envelope_size;
3066            _next_ordinal_to_read += 1;
3067            if next_offset >= end_offset {
3068                return Ok(());
3069            }
3070
3071            // Decode unknown envelopes for gaps in ordinals.
3072            while _next_ordinal_to_read < 2 {
3073                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3074                _next_ordinal_to_read += 1;
3075                next_offset += envelope_size;
3076            }
3077
3078            let next_out_of_line = decoder.next_out_of_line();
3079            let handles_before = decoder.remaining_handles();
3080            if let Some((inlined, num_bytes, num_handles)) =
3081                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3082            {
3083                let member_inline_size = <fidl::encoding::Vector<RssiHistogram, 8> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3084                if inlined != (member_inline_size <= 4) {
3085                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3086                }
3087                let inner_offset;
3088                let mut inner_depth = depth.clone();
3089                if inlined {
3090                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3091                    inner_offset = next_offset;
3092                } else {
3093                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3094                    inner_depth.increment()?;
3095                }
3096                let val_ref = self.rssi_histograms.get_or_insert_with(
3097                    || fidl::new_empty!(fidl::encoding::Vector<RssiHistogram, 8>, D),
3098                );
3099                fidl::decode!(fidl::encoding::Vector<RssiHistogram, 8>, D, val_ref, decoder, inner_offset, inner_depth)?;
3100                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3101                {
3102                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3103                }
3104                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3105                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3106                }
3107            }
3108
3109            next_offset += envelope_size;
3110            _next_ordinal_to_read += 1;
3111            if next_offset >= end_offset {
3112                return Ok(());
3113            }
3114
3115            // Decode unknown envelopes for gaps in ordinals.
3116            while _next_ordinal_to_read < 3 {
3117                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3118                _next_ordinal_to_read += 1;
3119                next_offset += envelope_size;
3120            }
3121
3122            let next_out_of_line = decoder.next_out_of_line();
3123            let handles_before = decoder.remaining_handles();
3124            if let Some((inlined, num_bytes, num_handles)) =
3125                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3126            {
3127                let member_inline_size = <fidl::encoding::Vector<RxRateIndexHistogram, 8> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3128                if inlined != (member_inline_size <= 4) {
3129                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3130                }
3131                let inner_offset;
3132                let mut inner_depth = depth.clone();
3133                if inlined {
3134                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3135                    inner_offset = next_offset;
3136                } else {
3137                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3138                    inner_depth.increment()?;
3139                }
3140                let val_ref = self.rx_rate_index_histograms.get_or_insert_with(
3141                    || fidl::new_empty!(fidl::encoding::Vector<RxRateIndexHistogram, 8>, D),
3142                );
3143                fidl::decode!(fidl::encoding::Vector<RxRateIndexHistogram, 8>, D, val_ref, decoder, inner_offset, inner_depth)?;
3144                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3145                {
3146                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3147                }
3148                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3149                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3150                }
3151            }
3152
3153            next_offset += envelope_size;
3154            _next_ordinal_to_read += 1;
3155            if next_offset >= end_offset {
3156                return Ok(());
3157            }
3158
3159            // Decode unknown envelopes for gaps in ordinals.
3160            while _next_ordinal_to_read < 4 {
3161                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3162                _next_ordinal_to_read += 1;
3163                next_offset += envelope_size;
3164            }
3165
3166            let next_out_of_line = decoder.next_out_of_line();
3167            let handles_before = decoder.remaining_handles();
3168            if let Some((inlined, num_bytes, num_handles)) =
3169                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3170            {
3171                let member_inline_size = <fidl::encoding::Vector<SnrHistogram, 8> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3172                if inlined != (member_inline_size <= 4) {
3173                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3174                }
3175                let inner_offset;
3176                let mut inner_depth = depth.clone();
3177                if inlined {
3178                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3179                    inner_offset = next_offset;
3180                } else {
3181                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3182                    inner_depth.increment()?;
3183                }
3184                let val_ref = self.snr_histograms.get_or_insert_with(
3185                    || fidl::new_empty!(fidl::encoding::Vector<SnrHistogram, 8>, D),
3186                );
3187                fidl::decode!(fidl::encoding::Vector<SnrHistogram, 8>, D, val_ref, decoder, inner_offset, inner_depth)?;
3188                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3189                {
3190                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3191                }
3192                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3193                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3194                }
3195            }
3196
3197            next_offset += envelope_size;
3198
3199            // Decode the remaining unknown envelopes.
3200            while next_offset < end_offset {
3201                _next_ordinal_to_read += 1;
3202                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3203                next_offset += envelope_size;
3204            }
3205
3206            Ok(())
3207        }
3208    }
3209
3210    impl IfaceStats {
3211        #[inline(always)]
3212        fn max_ordinal_present(&self) -> u64 {
3213            if let Some(_) = self.driver_specific_gauges {
3214                return 3;
3215            }
3216            if let Some(_) = self.driver_specific_counters {
3217                return 2;
3218            }
3219            if let Some(_) = self.connection_stats {
3220                return 1;
3221            }
3222            0
3223        }
3224    }
3225
3226    impl fidl::encoding::ValueTypeMarker for IfaceStats {
3227        type Borrowed<'a> = &'a Self;
3228        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3229            value
3230        }
3231    }
3232
3233    unsafe impl fidl::encoding::TypeMarker for IfaceStats {
3234        type Owned = Self;
3235
3236        #[inline(always)]
3237        fn inline_align(_context: fidl::encoding::Context) -> usize {
3238            8
3239        }
3240
3241        #[inline(always)]
3242        fn inline_size(_context: fidl::encoding::Context) -> usize {
3243            16
3244        }
3245    }
3246
3247    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<IfaceStats, D>
3248        for &IfaceStats
3249    {
3250        unsafe fn encode(
3251            self,
3252            encoder: &mut fidl::encoding::Encoder<'_, D>,
3253            offset: usize,
3254            mut depth: fidl::encoding::Depth,
3255        ) -> fidl::Result<()> {
3256            encoder.debug_check_bounds::<IfaceStats>(offset);
3257            // Vector header
3258            let max_ordinal: u64 = self.max_ordinal_present();
3259            encoder.write_num(max_ordinal, offset);
3260            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3261            // Calling encoder.out_of_line_offset(0) is not allowed.
3262            if max_ordinal == 0 {
3263                return Ok(());
3264            }
3265            depth.increment()?;
3266            let envelope_size = 8;
3267            let bytes_len = max_ordinal as usize * envelope_size;
3268            #[allow(unused_variables)]
3269            let offset = encoder.out_of_line_offset(bytes_len);
3270            let mut _prev_end_offset: usize = 0;
3271            if 1 > max_ordinal {
3272                return Ok(());
3273            }
3274
3275            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3276            // are envelope_size bytes.
3277            let cur_offset: usize = (1 - 1) * envelope_size;
3278
3279            // Zero reserved fields.
3280            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3281
3282            // Safety:
3283            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3284            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3285            //   envelope_size bytes, there is always sufficient room.
3286            fidl::encoding::encode_in_envelope_optional::<ConnectionStats, D>(
3287                self.connection_stats
3288                    .as_ref()
3289                    .map(<ConnectionStats as fidl::encoding::ValueTypeMarker>::borrow),
3290                encoder,
3291                offset + cur_offset,
3292                depth,
3293            )?;
3294
3295            _prev_end_offset = cur_offset + envelope_size;
3296            if 2 > max_ordinal {
3297                return Ok(());
3298            }
3299
3300            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3301            // are envelope_size bytes.
3302            let cur_offset: usize = (2 - 1) * envelope_size;
3303
3304            // Zero reserved fields.
3305            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3306
3307            // Safety:
3308            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3309            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3310            //   envelope_size bytes, there is always sufficient room.
3311            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<UnnamedCounter, 127>, D>(
3312            self.driver_specific_counters.as_ref().map(<fidl::encoding::Vector<UnnamedCounter, 127> as fidl::encoding::ValueTypeMarker>::borrow),
3313            encoder, offset + cur_offset, depth
3314        )?;
3315
3316            _prev_end_offset = cur_offset + envelope_size;
3317            if 3 > max_ordinal {
3318                return Ok(());
3319            }
3320
3321            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3322            // are envelope_size bytes.
3323            let cur_offset: usize = (3 - 1) * envelope_size;
3324
3325            // Zero reserved fields.
3326            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3327
3328            // Safety:
3329            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3330            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3331            //   envelope_size bytes, there is always sufficient room.
3332            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<UnnamedGauge, 127>, D>(
3333            self.driver_specific_gauges.as_ref().map(<fidl::encoding::Vector<UnnamedGauge, 127> as fidl::encoding::ValueTypeMarker>::borrow),
3334            encoder, offset + cur_offset, depth
3335        )?;
3336
3337            _prev_end_offset = cur_offset + envelope_size;
3338
3339            Ok(())
3340        }
3341    }
3342
3343    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for IfaceStats {
3344        #[inline(always)]
3345        fn new_empty() -> Self {
3346            Self::default()
3347        }
3348
3349        unsafe fn decode(
3350            &mut self,
3351            decoder: &mut fidl::encoding::Decoder<'_, D>,
3352            offset: usize,
3353            mut depth: fidl::encoding::Depth,
3354        ) -> fidl::Result<()> {
3355            decoder.debug_check_bounds::<Self>(offset);
3356            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3357                None => return Err(fidl::Error::NotNullable),
3358                Some(len) => len,
3359            };
3360            // Calling decoder.out_of_line_offset(0) is not allowed.
3361            if len == 0 {
3362                return Ok(());
3363            };
3364            depth.increment()?;
3365            let envelope_size = 8;
3366            let bytes_len = len * envelope_size;
3367            let offset = decoder.out_of_line_offset(bytes_len)?;
3368            // Decode the envelope for each type.
3369            let mut _next_ordinal_to_read = 0;
3370            let mut next_offset = offset;
3371            let end_offset = offset + bytes_len;
3372            _next_ordinal_to_read += 1;
3373            if next_offset >= end_offset {
3374                return Ok(());
3375            }
3376
3377            // Decode unknown envelopes for gaps in ordinals.
3378            while _next_ordinal_to_read < 1 {
3379                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3380                _next_ordinal_to_read += 1;
3381                next_offset += envelope_size;
3382            }
3383
3384            let next_out_of_line = decoder.next_out_of_line();
3385            let handles_before = decoder.remaining_handles();
3386            if let Some((inlined, num_bytes, num_handles)) =
3387                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3388            {
3389                let member_inline_size =
3390                    <ConnectionStats as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3391                if inlined != (member_inline_size <= 4) {
3392                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3393                }
3394                let inner_offset;
3395                let mut inner_depth = depth.clone();
3396                if inlined {
3397                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3398                    inner_offset = next_offset;
3399                } else {
3400                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3401                    inner_depth.increment()?;
3402                }
3403                let val_ref = self
3404                    .connection_stats
3405                    .get_or_insert_with(|| fidl::new_empty!(ConnectionStats, D));
3406                fidl::decode!(ConnectionStats, D, val_ref, decoder, inner_offset, inner_depth)?;
3407                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3408                {
3409                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3410                }
3411                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3412                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3413                }
3414            }
3415
3416            next_offset += envelope_size;
3417            _next_ordinal_to_read += 1;
3418            if next_offset >= end_offset {
3419                return Ok(());
3420            }
3421
3422            // Decode unknown envelopes for gaps in ordinals.
3423            while _next_ordinal_to_read < 2 {
3424                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3425                _next_ordinal_to_read += 1;
3426                next_offset += envelope_size;
3427            }
3428
3429            let next_out_of_line = decoder.next_out_of_line();
3430            let handles_before = decoder.remaining_handles();
3431            if let Some((inlined, num_bytes, num_handles)) =
3432                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3433            {
3434                let member_inline_size = <fidl::encoding::Vector<UnnamedCounter, 127> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3435                if inlined != (member_inline_size <= 4) {
3436                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3437                }
3438                let inner_offset;
3439                let mut inner_depth = depth.clone();
3440                if inlined {
3441                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3442                    inner_offset = next_offset;
3443                } else {
3444                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3445                    inner_depth.increment()?;
3446                }
3447                let val_ref = self.driver_specific_counters.get_or_insert_with(
3448                    || fidl::new_empty!(fidl::encoding::Vector<UnnamedCounter, 127>, D),
3449                );
3450                fidl::decode!(fidl::encoding::Vector<UnnamedCounter, 127>, D, val_ref, decoder, inner_offset, inner_depth)?;
3451                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3452                {
3453                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3454                }
3455                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3456                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3457                }
3458            }
3459
3460            next_offset += envelope_size;
3461            _next_ordinal_to_read += 1;
3462            if next_offset >= end_offset {
3463                return Ok(());
3464            }
3465
3466            // Decode unknown envelopes for gaps in ordinals.
3467            while _next_ordinal_to_read < 3 {
3468                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3469                _next_ordinal_to_read += 1;
3470                next_offset += envelope_size;
3471            }
3472
3473            let next_out_of_line = decoder.next_out_of_line();
3474            let handles_before = decoder.remaining_handles();
3475            if let Some((inlined, num_bytes, num_handles)) =
3476                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3477            {
3478                let member_inline_size = <fidl::encoding::Vector<UnnamedGauge, 127> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3479                if inlined != (member_inline_size <= 4) {
3480                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3481                }
3482                let inner_offset;
3483                let mut inner_depth = depth.clone();
3484                if inlined {
3485                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3486                    inner_offset = next_offset;
3487                } else {
3488                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3489                    inner_depth.increment()?;
3490                }
3491                let val_ref = self.driver_specific_gauges.get_or_insert_with(
3492                    || fidl::new_empty!(fidl::encoding::Vector<UnnamedGauge, 127>, D),
3493                );
3494                fidl::decode!(fidl::encoding::Vector<UnnamedGauge, 127>, D, val_ref, decoder, inner_offset, inner_depth)?;
3495                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3496                {
3497                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3498                }
3499                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3500                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3501                }
3502            }
3503
3504            next_offset += envelope_size;
3505
3506            // Decode the remaining unknown envelopes.
3507            while next_offset < end_offset {
3508                _next_ordinal_to_read += 1;
3509                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3510                next_offset += envelope_size;
3511            }
3512
3513            Ok(())
3514        }
3515    }
3516
3517    impl InspectCounterConfig {
3518        #[inline(always)]
3519        fn max_ordinal_present(&self) -> u64 {
3520            if let Some(_) = self.counter_name {
3521                return 2;
3522            }
3523            if let Some(_) = self.counter_id {
3524                return 1;
3525            }
3526            0
3527        }
3528    }
3529
3530    impl fidl::encoding::ValueTypeMarker for InspectCounterConfig {
3531        type Borrowed<'a> = &'a Self;
3532        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3533            value
3534        }
3535    }
3536
3537    unsafe impl fidl::encoding::TypeMarker for InspectCounterConfig {
3538        type Owned = Self;
3539
3540        #[inline(always)]
3541        fn inline_align(_context: fidl::encoding::Context) -> usize {
3542            8
3543        }
3544
3545        #[inline(always)]
3546        fn inline_size(_context: fidl::encoding::Context) -> usize {
3547            16
3548        }
3549    }
3550
3551    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<InspectCounterConfig, D>
3552        for &InspectCounterConfig
3553    {
3554        unsafe fn encode(
3555            self,
3556            encoder: &mut fidl::encoding::Encoder<'_, D>,
3557            offset: usize,
3558            mut depth: fidl::encoding::Depth,
3559        ) -> fidl::Result<()> {
3560            encoder.debug_check_bounds::<InspectCounterConfig>(offset);
3561            // Vector header
3562            let max_ordinal: u64 = self.max_ordinal_present();
3563            encoder.write_num(max_ordinal, offset);
3564            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3565            // Calling encoder.out_of_line_offset(0) is not allowed.
3566            if max_ordinal == 0 {
3567                return Ok(());
3568            }
3569            depth.increment()?;
3570            let envelope_size = 8;
3571            let bytes_len = max_ordinal as usize * envelope_size;
3572            #[allow(unused_variables)]
3573            let offset = encoder.out_of_line_offset(bytes_len);
3574            let mut _prev_end_offset: usize = 0;
3575            if 1 > max_ordinal {
3576                return Ok(());
3577            }
3578
3579            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3580            // are envelope_size bytes.
3581            let cur_offset: usize = (1 - 1) * envelope_size;
3582
3583            // Zero reserved fields.
3584            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3585
3586            // Safety:
3587            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3588            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3589            //   envelope_size bytes, there is always sufficient room.
3590            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3591                self.counter_id.as_ref().map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3592                encoder,
3593                offset + cur_offset,
3594                depth,
3595            )?;
3596
3597            _prev_end_offset = cur_offset + envelope_size;
3598            if 2 > max_ordinal {
3599                return Ok(());
3600            }
3601
3602            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3603            // are envelope_size bytes.
3604            let cur_offset: usize = (2 - 1) * envelope_size;
3605
3606            // Zero reserved fields.
3607            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3608
3609            // Safety:
3610            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3611            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3612            //   envelope_size bytes, there is always sufficient room.
3613            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<127>, D>(
3614                self.counter_name.as_ref().map(
3615                    <fidl::encoding::BoundedString<127> as fidl::encoding::ValueTypeMarker>::borrow,
3616                ),
3617                encoder,
3618                offset + cur_offset,
3619                depth,
3620            )?;
3621
3622            _prev_end_offset = cur_offset + envelope_size;
3623
3624            Ok(())
3625        }
3626    }
3627
3628    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for InspectCounterConfig {
3629        #[inline(always)]
3630        fn new_empty() -> Self {
3631            Self::default()
3632        }
3633
3634        unsafe fn decode(
3635            &mut self,
3636            decoder: &mut fidl::encoding::Decoder<'_, D>,
3637            offset: usize,
3638            mut depth: fidl::encoding::Depth,
3639        ) -> fidl::Result<()> {
3640            decoder.debug_check_bounds::<Self>(offset);
3641            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3642                None => return Err(fidl::Error::NotNullable),
3643                Some(len) => len,
3644            };
3645            // Calling decoder.out_of_line_offset(0) is not allowed.
3646            if len == 0 {
3647                return Ok(());
3648            };
3649            depth.increment()?;
3650            let envelope_size = 8;
3651            let bytes_len = len * envelope_size;
3652            let offset = decoder.out_of_line_offset(bytes_len)?;
3653            // Decode the envelope for each type.
3654            let mut _next_ordinal_to_read = 0;
3655            let mut next_offset = offset;
3656            let end_offset = offset + bytes_len;
3657            _next_ordinal_to_read += 1;
3658            if next_offset >= end_offset {
3659                return Ok(());
3660            }
3661
3662            // Decode unknown envelopes for gaps in ordinals.
3663            while _next_ordinal_to_read < 1 {
3664                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3665                _next_ordinal_to_read += 1;
3666                next_offset += envelope_size;
3667            }
3668
3669            let next_out_of_line = decoder.next_out_of_line();
3670            let handles_before = decoder.remaining_handles();
3671            if let Some((inlined, num_bytes, num_handles)) =
3672                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3673            {
3674                let member_inline_size =
3675                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3676                if inlined != (member_inline_size <= 4) {
3677                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3678                }
3679                let inner_offset;
3680                let mut inner_depth = depth.clone();
3681                if inlined {
3682                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3683                    inner_offset = next_offset;
3684                } else {
3685                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3686                    inner_depth.increment()?;
3687                }
3688                let val_ref = self.counter_id.get_or_insert_with(|| fidl::new_empty!(u16, D));
3689                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3690                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3691                {
3692                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3693                }
3694                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3695                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3696                }
3697            }
3698
3699            next_offset += envelope_size;
3700            _next_ordinal_to_read += 1;
3701            if next_offset >= end_offset {
3702                return Ok(());
3703            }
3704
3705            // Decode unknown envelopes for gaps in ordinals.
3706            while _next_ordinal_to_read < 2 {
3707                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3708                _next_ordinal_to_read += 1;
3709                next_offset += envelope_size;
3710            }
3711
3712            let next_out_of_line = decoder.next_out_of_line();
3713            let handles_before = decoder.remaining_handles();
3714            if let Some((inlined, num_bytes, num_handles)) =
3715                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3716            {
3717                let member_inline_size =
3718                    <fidl::encoding::BoundedString<127> as fidl::encoding::TypeMarker>::inline_size(
3719                        decoder.context,
3720                    );
3721                if inlined != (member_inline_size <= 4) {
3722                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3723                }
3724                let inner_offset;
3725                let mut inner_depth = depth.clone();
3726                if inlined {
3727                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3728                    inner_offset = next_offset;
3729                } else {
3730                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3731                    inner_depth.increment()?;
3732                }
3733                let val_ref = self
3734                    .counter_name
3735                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<127>, D));
3736                fidl::decode!(
3737                    fidl::encoding::BoundedString<127>,
3738                    D,
3739                    val_ref,
3740                    decoder,
3741                    inner_offset,
3742                    inner_depth
3743                )?;
3744                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3745                {
3746                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3747                }
3748                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3749                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3750                }
3751            }
3752
3753            next_offset += envelope_size;
3754
3755            // Decode the remaining unknown envelopes.
3756            while next_offset < end_offset {
3757                _next_ordinal_to_read += 1;
3758                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3759                next_offset += envelope_size;
3760            }
3761
3762            Ok(())
3763        }
3764    }
3765
3766    impl InspectGaugeConfig {
3767        #[inline(always)]
3768        fn max_ordinal_present(&self) -> u64 {
3769            if let Some(_) = self.statistics {
3770                return 3;
3771            }
3772            if let Some(_) = self.gauge_name {
3773                return 2;
3774            }
3775            if let Some(_) = self.gauge_id {
3776                return 1;
3777            }
3778            0
3779        }
3780    }
3781
3782    impl fidl::encoding::ValueTypeMarker for InspectGaugeConfig {
3783        type Borrowed<'a> = &'a Self;
3784        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
3785            value
3786        }
3787    }
3788
3789    unsafe impl fidl::encoding::TypeMarker for InspectGaugeConfig {
3790        type Owned = Self;
3791
3792        #[inline(always)]
3793        fn inline_align(_context: fidl::encoding::Context) -> usize {
3794            8
3795        }
3796
3797        #[inline(always)]
3798        fn inline_size(_context: fidl::encoding::Context) -> usize {
3799            16
3800        }
3801    }
3802
3803    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<InspectGaugeConfig, D>
3804        for &InspectGaugeConfig
3805    {
3806        unsafe fn encode(
3807            self,
3808            encoder: &mut fidl::encoding::Encoder<'_, D>,
3809            offset: usize,
3810            mut depth: fidl::encoding::Depth,
3811        ) -> fidl::Result<()> {
3812            encoder.debug_check_bounds::<InspectGaugeConfig>(offset);
3813            // Vector header
3814            let max_ordinal: u64 = self.max_ordinal_present();
3815            encoder.write_num(max_ordinal, offset);
3816            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
3817            // Calling encoder.out_of_line_offset(0) is not allowed.
3818            if max_ordinal == 0 {
3819                return Ok(());
3820            }
3821            depth.increment()?;
3822            let envelope_size = 8;
3823            let bytes_len = max_ordinal as usize * envelope_size;
3824            #[allow(unused_variables)]
3825            let offset = encoder.out_of_line_offset(bytes_len);
3826            let mut _prev_end_offset: usize = 0;
3827            if 1 > max_ordinal {
3828                return Ok(());
3829            }
3830
3831            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3832            // are envelope_size bytes.
3833            let cur_offset: usize = (1 - 1) * envelope_size;
3834
3835            // Zero reserved fields.
3836            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3837
3838            // Safety:
3839            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3840            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3841            //   envelope_size bytes, there is always sufficient room.
3842            fidl::encoding::encode_in_envelope_optional::<u16, D>(
3843                self.gauge_id.as_ref().map(<u16 as fidl::encoding::ValueTypeMarker>::borrow),
3844                encoder,
3845                offset + cur_offset,
3846                depth,
3847            )?;
3848
3849            _prev_end_offset = cur_offset + envelope_size;
3850            if 2 > max_ordinal {
3851                return Ok(());
3852            }
3853
3854            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3855            // are envelope_size bytes.
3856            let cur_offset: usize = (2 - 1) * envelope_size;
3857
3858            // Zero reserved fields.
3859            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3860
3861            // Safety:
3862            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3863            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3864            //   envelope_size bytes, there is always sufficient room.
3865            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::BoundedString<127>, D>(
3866                self.gauge_name.as_ref().map(
3867                    <fidl::encoding::BoundedString<127> as fidl::encoding::ValueTypeMarker>::borrow,
3868                ),
3869                encoder,
3870                offset + cur_offset,
3871                depth,
3872            )?;
3873
3874            _prev_end_offset = cur_offset + envelope_size;
3875            if 3 > max_ordinal {
3876                return Ok(());
3877            }
3878
3879            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
3880            // are envelope_size bytes.
3881            let cur_offset: usize = (3 - 1) * envelope_size;
3882
3883            // Zero reserved fields.
3884            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
3885
3886            // Safety:
3887            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
3888            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
3889            //   envelope_size bytes, there is always sufficient room.
3890            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<GaugeStatistic, 5>, D>(
3891            self.statistics.as_ref().map(<fidl::encoding::Vector<GaugeStatistic, 5> as fidl::encoding::ValueTypeMarker>::borrow),
3892            encoder, offset + cur_offset, depth
3893        )?;
3894
3895            _prev_end_offset = cur_offset + envelope_size;
3896
3897            Ok(())
3898        }
3899    }
3900
3901    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for InspectGaugeConfig {
3902        #[inline(always)]
3903        fn new_empty() -> Self {
3904            Self::default()
3905        }
3906
3907        unsafe fn decode(
3908            &mut self,
3909            decoder: &mut fidl::encoding::Decoder<'_, D>,
3910            offset: usize,
3911            mut depth: fidl::encoding::Depth,
3912        ) -> fidl::Result<()> {
3913            decoder.debug_check_bounds::<Self>(offset);
3914            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
3915                None => return Err(fidl::Error::NotNullable),
3916                Some(len) => len,
3917            };
3918            // Calling decoder.out_of_line_offset(0) is not allowed.
3919            if len == 0 {
3920                return Ok(());
3921            };
3922            depth.increment()?;
3923            let envelope_size = 8;
3924            let bytes_len = len * envelope_size;
3925            let offset = decoder.out_of_line_offset(bytes_len)?;
3926            // Decode the envelope for each type.
3927            let mut _next_ordinal_to_read = 0;
3928            let mut next_offset = offset;
3929            let end_offset = offset + bytes_len;
3930            _next_ordinal_to_read += 1;
3931            if next_offset >= end_offset {
3932                return Ok(());
3933            }
3934
3935            // Decode unknown envelopes for gaps in ordinals.
3936            while _next_ordinal_to_read < 1 {
3937                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3938                _next_ordinal_to_read += 1;
3939                next_offset += envelope_size;
3940            }
3941
3942            let next_out_of_line = decoder.next_out_of_line();
3943            let handles_before = decoder.remaining_handles();
3944            if let Some((inlined, num_bytes, num_handles)) =
3945                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3946            {
3947                let member_inline_size =
3948                    <u16 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
3949                if inlined != (member_inline_size <= 4) {
3950                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3951                }
3952                let inner_offset;
3953                let mut inner_depth = depth.clone();
3954                if inlined {
3955                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
3956                    inner_offset = next_offset;
3957                } else {
3958                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
3959                    inner_depth.increment()?;
3960                }
3961                let val_ref = self.gauge_id.get_or_insert_with(|| fidl::new_empty!(u16, D));
3962                fidl::decode!(u16, D, val_ref, decoder, inner_offset, inner_depth)?;
3963                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
3964                {
3965                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
3966                }
3967                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
3968                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
3969                }
3970            }
3971
3972            next_offset += envelope_size;
3973            _next_ordinal_to_read += 1;
3974            if next_offset >= end_offset {
3975                return Ok(());
3976            }
3977
3978            // Decode unknown envelopes for gaps in ordinals.
3979            while _next_ordinal_to_read < 2 {
3980                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
3981                _next_ordinal_to_read += 1;
3982                next_offset += envelope_size;
3983            }
3984
3985            let next_out_of_line = decoder.next_out_of_line();
3986            let handles_before = decoder.remaining_handles();
3987            if let Some((inlined, num_bytes, num_handles)) =
3988                fidl::encoding::decode_envelope_header(decoder, next_offset)?
3989            {
3990                let member_inline_size =
3991                    <fidl::encoding::BoundedString<127> as fidl::encoding::TypeMarker>::inline_size(
3992                        decoder.context,
3993                    );
3994                if inlined != (member_inline_size <= 4) {
3995                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
3996                }
3997                let inner_offset;
3998                let mut inner_depth = depth.clone();
3999                if inlined {
4000                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4001                    inner_offset = next_offset;
4002                } else {
4003                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4004                    inner_depth.increment()?;
4005                }
4006                let val_ref = self
4007                    .gauge_name
4008                    .get_or_insert_with(|| fidl::new_empty!(fidl::encoding::BoundedString<127>, D));
4009                fidl::decode!(
4010                    fidl::encoding::BoundedString<127>,
4011                    D,
4012                    val_ref,
4013                    decoder,
4014                    inner_offset,
4015                    inner_depth
4016                )?;
4017                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4018                {
4019                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4020                }
4021                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4022                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4023                }
4024            }
4025
4026            next_offset += envelope_size;
4027            _next_ordinal_to_read += 1;
4028            if next_offset >= end_offset {
4029                return Ok(());
4030            }
4031
4032            // Decode unknown envelopes for gaps in ordinals.
4033            while _next_ordinal_to_read < 3 {
4034                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4035                _next_ordinal_to_read += 1;
4036                next_offset += envelope_size;
4037            }
4038
4039            let next_out_of_line = decoder.next_out_of_line();
4040            let handles_before = decoder.remaining_handles();
4041            if let Some((inlined, num_bytes, num_handles)) =
4042                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4043            {
4044                let member_inline_size = <fidl::encoding::Vector<GaugeStatistic, 5> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4045                if inlined != (member_inline_size <= 4) {
4046                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4047                }
4048                let inner_offset;
4049                let mut inner_depth = depth.clone();
4050                if inlined {
4051                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4052                    inner_offset = next_offset;
4053                } else {
4054                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4055                    inner_depth.increment()?;
4056                }
4057                let val_ref = self.statistics.get_or_insert_with(
4058                    || fidl::new_empty!(fidl::encoding::Vector<GaugeStatistic, 5>, D),
4059                );
4060                fidl::decode!(fidl::encoding::Vector<GaugeStatistic, 5>, D, val_ref, decoder, inner_offset, inner_depth)?;
4061                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4062                {
4063                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4064                }
4065                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4066                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4067                }
4068            }
4069
4070            next_offset += envelope_size;
4071
4072            // Decode the remaining unknown envelopes.
4073            while next_offset < end_offset {
4074                _next_ordinal_to_read += 1;
4075                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4076                next_offset += envelope_size;
4077            }
4078
4079            Ok(())
4080        }
4081    }
4082
4083    impl PacketStats {
4084        #[inline(always)]
4085        fn max_ordinal_present(&self) -> u64 {
4086            if let Some(_) = self.tx_retries {
4087                return 4;
4088            }
4089            if let Some(_) = self.tx_drop {
4090                return 3;
4091            }
4092            if let Some(_) = self.tx {
4093                return 2;
4094            }
4095            if let Some(_) = self.rx {
4096                return 1;
4097            }
4098            0
4099        }
4100    }
4101
4102    impl fidl::encoding::ValueTypeMarker for PacketStats {
4103        type Borrowed<'a> = &'a Self;
4104        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4105            value
4106        }
4107    }
4108
4109    unsafe impl fidl::encoding::TypeMarker for PacketStats {
4110        type Owned = Self;
4111
4112        #[inline(always)]
4113        fn inline_align(_context: fidl::encoding::Context) -> usize {
4114            8
4115        }
4116
4117        #[inline(always)]
4118        fn inline_size(_context: fidl::encoding::Context) -> usize {
4119            16
4120        }
4121    }
4122
4123    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<PacketStats, D>
4124        for &PacketStats
4125    {
4126        unsafe fn encode(
4127            self,
4128            encoder: &mut fidl::encoding::Encoder<'_, D>,
4129            offset: usize,
4130            mut depth: fidl::encoding::Depth,
4131        ) -> fidl::Result<()> {
4132            encoder.debug_check_bounds::<PacketStats>(offset);
4133            // Vector header
4134            let max_ordinal: u64 = self.max_ordinal_present();
4135            encoder.write_num(max_ordinal, offset);
4136            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4137            // Calling encoder.out_of_line_offset(0) is not allowed.
4138            if max_ordinal == 0 {
4139                return Ok(());
4140            }
4141            depth.increment()?;
4142            let envelope_size = 8;
4143            let bytes_len = max_ordinal as usize * envelope_size;
4144            #[allow(unused_variables)]
4145            let offset = encoder.out_of_line_offset(bytes_len);
4146            let mut _prev_end_offset: usize = 0;
4147            if 1 > max_ordinal {
4148                return Ok(());
4149            }
4150
4151            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4152            // are envelope_size bytes.
4153            let cur_offset: usize = (1 - 1) * envelope_size;
4154
4155            // Zero reserved fields.
4156            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4157
4158            // Safety:
4159            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4160            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4161            //   envelope_size bytes, there is always sufficient room.
4162            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4163                self.rx.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4164                encoder,
4165                offset + cur_offset,
4166                depth,
4167            )?;
4168
4169            _prev_end_offset = cur_offset + envelope_size;
4170            if 2 > max_ordinal {
4171                return Ok(());
4172            }
4173
4174            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4175            // are envelope_size bytes.
4176            let cur_offset: usize = (2 - 1) * envelope_size;
4177
4178            // Zero reserved fields.
4179            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4180
4181            // Safety:
4182            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4183            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4184            //   envelope_size bytes, there is always sufficient room.
4185            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4186                self.tx.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4187                encoder,
4188                offset + cur_offset,
4189                depth,
4190            )?;
4191
4192            _prev_end_offset = cur_offset + envelope_size;
4193            if 3 > max_ordinal {
4194                return Ok(());
4195            }
4196
4197            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4198            // are envelope_size bytes.
4199            let cur_offset: usize = (3 - 1) * envelope_size;
4200
4201            // Zero reserved fields.
4202            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4203
4204            // Safety:
4205            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4206            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4207            //   envelope_size bytes, there is always sufficient room.
4208            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4209                self.tx_drop.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4210                encoder,
4211                offset + cur_offset,
4212                depth,
4213            )?;
4214
4215            _prev_end_offset = cur_offset + envelope_size;
4216            if 4 > max_ordinal {
4217                return Ok(());
4218            }
4219
4220            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4221            // are envelope_size bytes.
4222            let cur_offset: usize = (4 - 1) * envelope_size;
4223
4224            // Zero reserved fields.
4225            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4226
4227            // Safety:
4228            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4229            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4230            //   envelope_size bytes, there is always sufficient room.
4231            fidl::encoding::encode_in_envelope_optional::<u64, D>(
4232                self.tx_retries.as_ref().map(<u64 as fidl::encoding::ValueTypeMarker>::borrow),
4233                encoder,
4234                offset + cur_offset,
4235                depth,
4236            )?;
4237
4238            _prev_end_offset = cur_offset + envelope_size;
4239
4240            Ok(())
4241        }
4242    }
4243
4244    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for PacketStats {
4245        #[inline(always)]
4246        fn new_empty() -> Self {
4247            Self::default()
4248        }
4249
4250        unsafe fn decode(
4251            &mut self,
4252            decoder: &mut fidl::encoding::Decoder<'_, D>,
4253            offset: usize,
4254            mut depth: fidl::encoding::Depth,
4255        ) -> fidl::Result<()> {
4256            decoder.debug_check_bounds::<Self>(offset);
4257            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4258                None => return Err(fidl::Error::NotNullable),
4259                Some(len) => len,
4260            };
4261            // Calling decoder.out_of_line_offset(0) is not allowed.
4262            if len == 0 {
4263                return Ok(());
4264            };
4265            depth.increment()?;
4266            let envelope_size = 8;
4267            let bytes_len = len * envelope_size;
4268            let offset = decoder.out_of_line_offset(bytes_len)?;
4269            // Decode the envelope for each type.
4270            let mut _next_ordinal_to_read = 0;
4271            let mut next_offset = offset;
4272            let end_offset = offset + bytes_len;
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 < 1 {
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 =
4291                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4292                if inlined != (member_inline_size <= 4) {
4293                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4294                }
4295                let inner_offset;
4296                let mut inner_depth = depth.clone();
4297                if inlined {
4298                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4299                    inner_offset = next_offset;
4300                } else {
4301                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4302                    inner_depth.increment()?;
4303                }
4304                let val_ref = self.rx.get_or_insert_with(|| fidl::new_empty!(u64, D));
4305                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4306                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4307                {
4308                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4309                }
4310                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4311                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4312                }
4313            }
4314
4315            next_offset += envelope_size;
4316            _next_ordinal_to_read += 1;
4317            if next_offset >= end_offset {
4318                return Ok(());
4319            }
4320
4321            // Decode unknown envelopes for gaps in ordinals.
4322            while _next_ordinal_to_read < 2 {
4323                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4324                _next_ordinal_to_read += 1;
4325                next_offset += envelope_size;
4326            }
4327
4328            let next_out_of_line = decoder.next_out_of_line();
4329            let handles_before = decoder.remaining_handles();
4330            if let Some((inlined, num_bytes, num_handles)) =
4331                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4332            {
4333                let member_inline_size =
4334                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4335                if inlined != (member_inline_size <= 4) {
4336                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4337                }
4338                let inner_offset;
4339                let mut inner_depth = depth.clone();
4340                if inlined {
4341                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4342                    inner_offset = next_offset;
4343                } else {
4344                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4345                    inner_depth.increment()?;
4346                }
4347                let val_ref = self.tx.get_or_insert_with(|| fidl::new_empty!(u64, D));
4348                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4349                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4350                {
4351                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4352                }
4353                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4354                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4355                }
4356            }
4357
4358            next_offset += envelope_size;
4359            _next_ordinal_to_read += 1;
4360            if next_offset >= end_offset {
4361                return Ok(());
4362            }
4363
4364            // Decode unknown envelopes for gaps in ordinals.
4365            while _next_ordinal_to_read < 3 {
4366                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4367                _next_ordinal_to_read += 1;
4368                next_offset += envelope_size;
4369            }
4370
4371            let next_out_of_line = decoder.next_out_of_line();
4372            let handles_before = decoder.remaining_handles();
4373            if let Some((inlined, num_bytes, num_handles)) =
4374                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4375            {
4376                let member_inline_size =
4377                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4378                if inlined != (member_inline_size <= 4) {
4379                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4380                }
4381                let inner_offset;
4382                let mut inner_depth = depth.clone();
4383                if inlined {
4384                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4385                    inner_offset = next_offset;
4386                } else {
4387                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4388                    inner_depth.increment()?;
4389                }
4390                let val_ref = self.tx_drop.get_or_insert_with(|| fidl::new_empty!(u64, D));
4391                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4392                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4393                {
4394                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4395                }
4396                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4397                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4398                }
4399            }
4400
4401            next_offset += envelope_size;
4402            _next_ordinal_to_read += 1;
4403            if next_offset >= end_offset {
4404                return Ok(());
4405            }
4406
4407            // Decode unknown envelopes for gaps in ordinals.
4408            while _next_ordinal_to_read < 4 {
4409                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4410                _next_ordinal_to_read += 1;
4411                next_offset += envelope_size;
4412            }
4413
4414            let next_out_of_line = decoder.next_out_of_line();
4415            let handles_before = decoder.remaining_handles();
4416            if let Some((inlined, num_bytes, num_handles)) =
4417                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4418            {
4419                let member_inline_size =
4420                    <u64 as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4421                if inlined != (member_inline_size <= 4) {
4422                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4423                }
4424                let inner_offset;
4425                let mut inner_depth = depth.clone();
4426                if inlined {
4427                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4428                    inner_offset = next_offset;
4429                } else {
4430                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4431                    inner_depth.increment()?;
4432                }
4433                let val_ref = self.tx_retries.get_or_insert_with(|| fidl::new_empty!(u64, D));
4434                fidl::decode!(u64, D, val_ref, decoder, inner_offset, inner_depth)?;
4435                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4436                {
4437                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4438                }
4439                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4440                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4441                }
4442            }
4443
4444            next_offset += envelope_size;
4445
4446            // Decode the remaining unknown envelopes.
4447            while next_offset < end_offset {
4448                _next_ordinal_to_read += 1;
4449                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4450                next_offset += envelope_size;
4451            }
4452
4453            Ok(())
4454        }
4455    }
4456
4457    impl SignalReport {
4458        #[inline(always)]
4459        fn max_ordinal_present(&self) -> u64 {
4460            if let Some(_) = self.connection_signal_report {
4461                return 1;
4462            }
4463            0
4464        }
4465    }
4466
4467    impl fidl::encoding::ValueTypeMarker for SignalReport {
4468        type Borrowed<'a> = &'a Self;
4469        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4470            value
4471        }
4472    }
4473
4474    unsafe impl fidl::encoding::TypeMarker for SignalReport {
4475        type Owned = Self;
4476
4477        #[inline(always)]
4478        fn inline_align(_context: fidl::encoding::Context) -> usize {
4479            8
4480        }
4481
4482        #[inline(always)]
4483        fn inline_size(_context: fidl::encoding::Context) -> usize {
4484            16
4485        }
4486    }
4487
4488    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<SignalReport, D>
4489        for &SignalReport
4490    {
4491        unsafe fn encode(
4492            self,
4493            encoder: &mut fidl::encoding::Encoder<'_, D>,
4494            offset: usize,
4495            mut depth: fidl::encoding::Depth,
4496        ) -> fidl::Result<()> {
4497            encoder.debug_check_bounds::<SignalReport>(offset);
4498            // Vector header
4499            let max_ordinal: u64 = self.max_ordinal_present();
4500            encoder.write_num(max_ordinal, offset);
4501            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4502            // Calling encoder.out_of_line_offset(0) is not allowed.
4503            if max_ordinal == 0 {
4504                return Ok(());
4505            }
4506            depth.increment()?;
4507            let envelope_size = 8;
4508            let bytes_len = max_ordinal as usize * envelope_size;
4509            #[allow(unused_variables)]
4510            let offset = encoder.out_of_line_offset(bytes_len);
4511            let mut _prev_end_offset: usize = 0;
4512            if 1 > max_ordinal {
4513                return Ok(());
4514            }
4515
4516            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4517            // are envelope_size bytes.
4518            let cur_offset: usize = (1 - 1) * envelope_size;
4519
4520            // Zero reserved fields.
4521            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4522
4523            // Safety:
4524            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4525            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4526            //   envelope_size bytes, there is always sufficient room.
4527            fidl::encoding::encode_in_envelope_optional::<ConnectionSignalReport, D>(
4528                self.connection_signal_report
4529                    .as_ref()
4530                    .map(<ConnectionSignalReport as fidl::encoding::ValueTypeMarker>::borrow),
4531                encoder,
4532                offset + cur_offset,
4533                depth,
4534            )?;
4535
4536            _prev_end_offset = cur_offset + envelope_size;
4537
4538            Ok(())
4539        }
4540    }
4541
4542    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for SignalReport {
4543        #[inline(always)]
4544        fn new_empty() -> Self {
4545            Self::default()
4546        }
4547
4548        unsafe fn decode(
4549            &mut self,
4550            decoder: &mut fidl::encoding::Decoder<'_, D>,
4551            offset: usize,
4552            mut depth: fidl::encoding::Depth,
4553        ) -> fidl::Result<()> {
4554            decoder.debug_check_bounds::<Self>(offset);
4555            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4556                None => return Err(fidl::Error::NotNullable),
4557                Some(len) => len,
4558            };
4559            // Calling decoder.out_of_line_offset(0) is not allowed.
4560            if len == 0 {
4561                return Ok(());
4562            };
4563            depth.increment()?;
4564            let envelope_size = 8;
4565            let bytes_len = len * envelope_size;
4566            let offset = decoder.out_of_line_offset(bytes_len)?;
4567            // Decode the envelope for each type.
4568            let mut _next_ordinal_to_read = 0;
4569            let mut next_offset = offset;
4570            let end_offset = offset + bytes_len;
4571            _next_ordinal_to_read += 1;
4572            if next_offset >= end_offset {
4573                return Ok(());
4574            }
4575
4576            // Decode unknown envelopes for gaps in ordinals.
4577            while _next_ordinal_to_read < 1 {
4578                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4579                _next_ordinal_to_read += 1;
4580                next_offset += envelope_size;
4581            }
4582
4583            let next_out_of_line = decoder.next_out_of_line();
4584            let handles_before = decoder.remaining_handles();
4585            if let Some((inlined, num_bytes, num_handles)) =
4586                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4587            {
4588                let member_inline_size =
4589                    <ConnectionSignalReport as fidl::encoding::TypeMarker>::inline_size(
4590                        decoder.context,
4591                    );
4592                if inlined != (member_inline_size <= 4) {
4593                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4594                }
4595                let inner_offset;
4596                let mut inner_depth = depth.clone();
4597                if inlined {
4598                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4599                    inner_offset = next_offset;
4600                } else {
4601                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4602                    inner_depth.increment()?;
4603                }
4604                let val_ref = self
4605                    .connection_signal_report
4606                    .get_or_insert_with(|| fidl::new_empty!(ConnectionSignalReport, D));
4607                fidl::decode!(
4608                    ConnectionSignalReport,
4609                    D,
4610                    val_ref,
4611                    decoder,
4612                    inner_offset,
4613                    inner_depth
4614                )?;
4615                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4616                {
4617                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4618                }
4619                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4620                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4621                }
4622            }
4623
4624            next_offset += envelope_size;
4625
4626            // Decode the remaining unknown envelopes.
4627            while next_offset < end_offset {
4628                _next_ordinal_to_read += 1;
4629                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4630                next_offset += envelope_size;
4631            }
4632
4633            Ok(())
4634        }
4635    }
4636
4637    impl TelemetrySupport {
4638        #[inline(always)]
4639        fn max_ordinal_present(&self) -> u64 {
4640            if let Some(_) = self.inspect_gauge_configs {
4641                return 2;
4642            }
4643            if let Some(_) = self.inspect_counter_configs {
4644                return 1;
4645            }
4646            0
4647        }
4648    }
4649
4650    impl fidl::encoding::ValueTypeMarker for TelemetrySupport {
4651        type Borrowed<'a> = &'a Self;
4652        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4653            value
4654        }
4655    }
4656
4657    unsafe impl fidl::encoding::TypeMarker for TelemetrySupport {
4658        type Owned = Self;
4659
4660        #[inline(always)]
4661        fn inline_align(_context: fidl::encoding::Context) -> usize {
4662            8
4663        }
4664
4665        #[inline(always)]
4666        fn inline_size(_context: fidl::encoding::Context) -> usize {
4667            16
4668        }
4669    }
4670
4671    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<TelemetrySupport, D>
4672        for &TelemetrySupport
4673    {
4674        unsafe fn encode(
4675            self,
4676            encoder: &mut fidl::encoding::Encoder<'_, D>,
4677            offset: usize,
4678            mut depth: fidl::encoding::Depth,
4679        ) -> fidl::Result<()> {
4680            encoder.debug_check_bounds::<TelemetrySupport>(offset);
4681            // Vector header
4682            let max_ordinal: u64 = self.max_ordinal_present();
4683            encoder.write_num(max_ordinal, offset);
4684            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4685            // Calling encoder.out_of_line_offset(0) is not allowed.
4686            if max_ordinal == 0 {
4687                return Ok(());
4688            }
4689            depth.increment()?;
4690            let envelope_size = 8;
4691            let bytes_len = max_ordinal as usize * envelope_size;
4692            #[allow(unused_variables)]
4693            let offset = encoder.out_of_line_offset(bytes_len);
4694            let mut _prev_end_offset: usize = 0;
4695            if 1 > max_ordinal {
4696                return Ok(());
4697            }
4698
4699            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4700            // are envelope_size bytes.
4701            let cur_offset: usize = (1 - 1) * envelope_size;
4702
4703            // Zero reserved fields.
4704            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4705
4706            // Safety:
4707            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4708            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4709            //   envelope_size bytes, there is always sufficient room.
4710            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<InspectCounterConfig, 127>, D>(
4711            self.inspect_counter_configs.as_ref().map(<fidl::encoding::Vector<InspectCounterConfig, 127> as fidl::encoding::ValueTypeMarker>::borrow),
4712            encoder, offset + cur_offset, depth
4713        )?;
4714
4715            _prev_end_offset = cur_offset + envelope_size;
4716            if 2 > max_ordinal {
4717                return Ok(());
4718            }
4719
4720            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4721            // are envelope_size bytes.
4722            let cur_offset: usize = (2 - 1) * envelope_size;
4723
4724            // Zero reserved fields.
4725            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4726
4727            // Safety:
4728            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4729            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4730            //   envelope_size bytes, there is always sufficient room.
4731            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<InspectGaugeConfig, 127>, D>(
4732            self.inspect_gauge_configs.as_ref().map(<fidl::encoding::Vector<InspectGaugeConfig, 127> as fidl::encoding::ValueTypeMarker>::borrow),
4733            encoder, offset + cur_offset, depth
4734        )?;
4735
4736            _prev_end_offset = cur_offset + envelope_size;
4737
4738            Ok(())
4739        }
4740    }
4741
4742    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for TelemetrySupport {
4743        #[inline(always)]
4744        fn new_empty() -> Self {
4745            Self::default()
4746        }
4747
4748        unsafe fn decode(
4749            &mut self,
4750            decoder: &mut fidl::encoding::Decoder<'_, D>,
4751            offset: usize,
4752            mut depth: fidl::encoding::Depth,
4753        ) -> fidl::Result<()> {
4754            decoder.debug_check_bounds::<Self>(offset);
4755            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
4756                None => return Err(fidl::Error::NotNullable),
4757                Some(len) => len,
4758            };
4759            // Calling decoder.out_of_line_offset(0) is not allowed.
4760            if len == 0 {
4761                return Ok(());
4762            };
4763            depth.increment()?;
4764            let envelope_size = 8;
4765            let bytes_len = len * envelope_size;
4766            let offset = decoder.out_of_line_offset(bytes_len)?;
4767            // Decode the envelope for each type.
4768            let mut _next_ordinal_to_read = 0;
4769            let mut next_offset = offset;
4770            let end_offset = offset + bytes_len;
4771            _next_ordinal_to_read += 1;
4772            if next_offset >= end_offset {
4773                return Ok(());
4774            }
4775
4776            // Decode unknown envelopes for gaps in ordinals.
4777            while _next_ordinal_to_read < 1 {
4778                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4779                _next_ordinal_to_read += 1;
4780                next_offset += envelope_size;
4781            }
4782
4783            let next_out_of_line = decoder.next_out_of_line();
4784            let handles_before = decoder.remaining_handles();
4785            if let Some((inlined, num_bytes, num_handles)) =
4786                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4787            {
4788                let member_inline_size = <fidl::encoding::Vector<InspectCounterConfig, 127> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4789                if inlined != (member_inline_size <= 4) {
4790                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4791                }
4792                let inner_offset;
4793                let mut inner_depth = depth.clone();
4794                if inlined {
4795                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4796                    inner_offset = next_offset;
4797                } else {
4798                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4799                    inner_depth.increment()?;
4800                }
4801                let val_ref = self.inspect_counter_configs.get_or_insert_with(
4802                    || fidl::new_empty!(fidl::encoding::Vector<InspectCounterConfig, 127>, D),
4803                );
4804                fidl::decode!(fidl::encoding::Vector<InspectCounterConfig, 127>, D, val_ref, decoder, inner_offset, inner_depth)?;
4805                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4806                {
4807                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4808                }
4809                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4810                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4811                }
4812            }
4813
4814            next_offset += envelope_size;
4815            _next_ordinal_to_read += 1;
4816            if next_offset >= end_offset {
4817                return Ok(());
4818            }
4819
4820            // Decode unknown envelopes for gaps in ordinals.
4821            while _next_ordinal_to_read < 2 {
4822                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4823                _next_ordinal_to_read += 1;
4824                next_offset += envelope_size;
4825            }
4826
4827            let next_out_of_line = decoder.next_out_of_line();
4828            let handles_before = decoder.remaining_handles();
4829            if let Some((inlined, num_bytes, num_handles)) =
4830                fidl::encoding::decode_envelope_header(decoder, next_offset)?
4831            {
4832                let member_inline_size = <fidl::encoding::Vector<InspectGaugeConfig, 127> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
4833                if inlined != (member_inline_size <= 4) {
4834                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
4835                }
4836                let inner_offset;
4837                let mut inner_depth = depth.clone();
4838                if inlined {
4839                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
4840                    inner_offset = next_offset;
4841                } else {
4842                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
4843                    inner_depth.increment()?;
4844                }
4845                let val_ref = self.inspect_gauge_configs.get_or_insert_with(
4846                    || fidl::new_empty!(fidl::encoding::Vector<InspectGaugeConfig, 127>, D),
4847                );
4848                fidl::decode!(fidl::encoding::Vector<InspectGaugeConfig, 127>, D, val_ref, decoder, inner_offset, inner_depth)?;
4849                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
4850                {
4851                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
4852                }
4853                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
4854                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
4855                }
4856            }
4857
4858            next_offset += envelope_size;
4859
4860            // Decode the remaining unknown envelopes.
4861            while next_offset < end_offset {
4862                _next_ordinal_to_read += 1;
4863                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
4864                next_offset += envelope_size;
4865            }
4866
4867            Ok(())
4868        }
4869    }
4870
4871    impl WmePacketStats {
4872        #[inline(always)]
4873        fn max_ordinal_present(&self) -> u64 {
4874            if let Some(_) = self.vo {
4875                return 4;
4876            }
4877            if let Some(_) = self.vi {
4878                return 3;
4879            }
4880            if let Some(_) = self.bk {
4881                return 2;
4882            }
4883            if let Some(_) = self.be {
4884                return 1;
4885            }
4886            0
4887        }
4888    }
4889
4890    impl fidl::encoding::ValueTypeMarker for WmePacketStats {
4891        type Borrowed<'a> = &'a Self;
4892        fn borrow(value: &<Self as fidl::encoding::TypeMarker>::Owned) -> Self::Borrowed<'_> {
4893            value
4894        }
4895    }
4896
4897    unsafe impl fidl::encoding::TypeMarker for WmePacketStats {
4898        type Owned = Self;
4899
4900        #[inline(always)]
4901        fn inline_align(_context: fidl::encoding::Context) -> usize {
4902            8
4903        }
4904
4905        #[inline(always)]
4906        fn inline_size(_context: fidl::encoding::Context) -> usize {
4907            16
4908        }
4909    }
4910
4911    unsafe impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Encode<WmePacketStats, D>
4912        for &WmePacketStats
4913    {
4914        unsafe fn encode(
4915            self,
4916            encoder: &mut fidl::encoding::Encoder<'_, D>,
4917            offset: usize,
4918            mut depth: fidl::encoding::Depth,
4919        ) -> fidl::Result<()> {
4920            encoder.debug_check_bounds::<WmePacketStats>(offset);
4921            // Vector header
4922            let max_ordinal: u64 = self.max_ordinal_present();
4923            encoder.write_num(max_ordinal, offset);
4924            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
4925            // Calling encoder.out_of_line_offset(0) is not allowed.
4926            if max_ordinal == 0 {
4927                return Ok(());
4928            }
4929            depth.increment()?;
4930            let envelope_size = 8;
4931            let bytes_len = max_ordinal as usize * envelope_size;
4932            #[allow(unused_variables)]
4933            let offset = encoder.out_of_line_offset(bytes_len);
4934            let mut _prev_end_offset: usize = 0;
4935            if 1 > max_ordinal {
4936                return Ok(());
4937            }
4938
4939            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4940            // are envelope_size bytes.
4941            let cur_offset: usize = (1 - 1) * envelope_size;
4942
4943            // Zero reserved fields.
4944            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4945
4946            // Safety:
4947            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4948            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4949            //   envelope_size bytes, there is always sufficient room.
4950            fidl::encoding::encode_in_envelope_optional::<PacketStats, D>(
4951                self.be.as_ref().map(<PacketStats as fidl::encoding::ValueTypeMarker>::borrow),
4952                encoder,
4953                offset + cur_offset,
4954                depth,
4955            )?;
4956
4957            _prev_end_offset = cur_offset + envelope_size;
4958            if 2 > max_ordinal {
4959                return Ok(());
4960            }
4961
4962            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4963            // are envelope_size bytes.
4964            let cur_offset: usize = (2 - 1) * envelope_size;
4965
4966            // Zero reserved fields.
4967            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4968
4969            // Safety:
4970            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4971            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4972            //   envelope_size bytes, there is always sufficient room.
4973            fidl::encoding::encode_in_envelope_optional::<PacketStats, D>(
4974                self.bk.as_ref().map(<PacketStats as fidl::encoding::ValueTypeMarker>::borrow),
4975                encoder,
4976                offset + cur_offset,
4977                depth,
4978            )?;
4979
4980            _prev_end_offset = cur_offset + envelope_size;
4981            if 3 > max_ordinal {
4982                return Ok(());
4983            }
4984
4985            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
4986            // are envelope_size bytes.
4987            let cur_offset: usize = (3 - 1) * envelope_size;
4988
4989            // Zero reserved fields.
4990            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
4991
4992            // Safety:
4993            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
4994            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
4995            //   envelope_size bytes, there is always sufficient room.
4996            fidl::encoding::encode_in_envelope_optional::<PacketStats, D>(
4997                self.vi.as_ref().map(<PacketStats as fidl::encoding::ValueTypeMarker>::borrow),
4998                encoder,
4999                offset + cur_offset,
5000                depth,
5001            )?;
5002
5003            _prev_end_offset = cur_offset + envelope_size;
5004            if 4 > max_ordinal {
5005                return Ok(());
5006            }
5007
5008            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
5009            // are envelope_size bytes.
5010            let cur_offset: usize = (4 - 1) * envelope_size;
5011
5012            // Zero reserved fields.
5013            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
5014
5015            // Safety:
5016            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
5017            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
5018            //   envelope_size bytes, there is always sufficient room.
5019            fidl::encoding::encode_in_envelope_optional::<PacketStats, D>(
5020                self.vo.as_ref().map(<PacketStats as fidl::encoding::ValueTypeMarker>::borrow),
5021                encoder,
5022                offset + cur_offset,
5023                depth,
5024            )?;
5025
5026            _prev_end_offset = cur_offset + envelope_size;
5027
5028            Ok(())
5029        }
5030    }
5031
5032    impl<D: fidl::encoding::ResourceDialect> fidl::encoding::Decode<Self, D> for WmePacketStats {
5033        #[inline(always)]
5034        fn new_empty() -> Self {
5035            Self::default()
5036        }
5037
5038        unsafe fn decode(
5039            &mut self,
5040            decoder: &mut fidl::encoding::Decoder<'_, D>,
5041            offset: usize,
5042            mut depth: fidl::encoding::Depth,
5043        ) -> fidl::Result<()> {
5044            decoder.debug_check_bounds::<Self>(offset);
5045            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
5046                None => return Err(fidl::Error::NotNullable),
5047                Some(len) => len,
5048            };
5049            // Calling decoder.out_of_line_offset(0) is not allowed.
5050            if len == 0 {
5051                return Ok(());
5052            };
5053            depth.increment()?;
5054            let envelope_size = 8;
5055            let bytes_len = len * envelope_size;
5056            let offset = decoder.out_of_line_offset(bytes_len)?;
5057            // Decode the envelope for each type.
5058            let mut _next_ordinal_to_read = 0;
5059            let mut next_offset = offset;
5060            let end_offset = offset + bytes_len;
5061            _next_ordinal_to_read += 1;
5062            if next_offset >= end_offset {
5063                return Ok(());
5064            }
5065
5066            // Decode unknown envelopes for gaps in ordinals.
5067            while _next_ordinal_to_read < 1 {
5068                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5069                _next_ordinal_to_read += 1;
5070                next_offset += envelope_size;
5071            }
5072
5073            let next_out_of_line = decoder.next_out_of_line();
5074            let handles_before = decoder.remaining_handles();
5075            if let Some((inlined, num_bytes, num_handles)) =
5076                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5077            {
5078                let member_inline_size =
5079                    <PacketStats as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5080                if inlined != (member_inline_size <= 4) {
5081                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5082                }
5083                let inner_offset;
5084                let mut inner_depth = depth.clone();
5085                if inlined {
5086                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5087                    inner_offset = next_offset;
5088                } else {
5089                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5090                    inner_depth.increment()?;
5091                }
5092                let val_ref = self.be.get_or_insert_with(|| fidl::new_empty!(PacketStats, D));
5093                fidl::decode!(PacketStats, D, val_ref, decoder, inner_offset, inner_depth)?;
5094                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5095                {
5096                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5097                }
5098                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5099                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5100                }
5101            }
5102
5103            next_offset += envelope_size;
5104            _next_ordinal_to_read += 1;
5105            if next_offset >= end_offset {
5106                return Ok(());
5107            }
5108
5109            // Decode unknown envelopes for gaps in ordinals.
5110            while _next_ordinal_to_read < 2 {
5111                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5112                _next_ordinal_to_read += 1;
5113                next_offset += envelope_size;
5114            }
5115
5116            let next_out_of_line = decoder.next_out_of_line();
5117            let handles_before = decoder.remaining_handles();
5118            if let Some((inlined, num_bytes, num_handles)) =
5119                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5120            {
5121                let member_inline_size =
5122                    <PacketStats as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5123                if inlined != (member_inline_size <= 4) {
5124                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5125                }
5126                let inner_offset;
5127                let mut inner_depth = depth.clone();
5128                if inlined {
5129                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5130                    inner_offset = next_offset;
5131                } else {
5132                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5133                    inner_depth.increment()?;
5134                }
5135                let val_ref = self.bk.get_or_insert_with(|| fidl::new_empty!(PacketStats, D));
5136                fidl::decode!(PacketStats, D, val_ref, decoder, inner_offset, inner_depth)?;
5137                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5138                {
5139                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5140                }
5141                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5142                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5143                }
5144            }
5145
5146            next_offset += envelope_size;
5147            _next_ordinal_to_read += 1;
5148            if next_offset >= end_offset {
5149                return Ok(());
5150            }
5151
5152            // Decode unknown envelopes for gaps in ordinals.
5153            while _next_ordinal_to_read < 3 {
5154                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5155                _next_ordinal_to_read += 1;
5156                next_offset += envelope_size;
5157            }
5158
5159            let next_out_of_line = decoder.next_out_of_line();
5160            let handles_before = decoder.remaining_handles();
5161            if let Some((inlined, num_bytes, num_handles)) =
5162                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5163            {
5164                let member_inline_size =
5165                    <PacketStats as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5166                if inlined != (member_inline_size <= 4) {
5167                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5168                }
5169                let inner_offset;
5170                let mut inner_depth = depth.clone();
5171                if inlined {
5172                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5173                    inner_offset = next_offset;
5174                } else {
5175                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5176                    inner_depth.increment()?;
5177                }
5178                let val_ref = self.vi.get_or_insert_with(|| fidl::new_empty!(PacketStats, D));
5179                fidl::decode!(PacketStats, D, val_ref, decoder, inner_offset, inner_depth)?;
5180                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5181                {
5182                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5183                }
5184                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5185                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5186                }
5187            }
5188
5189            next_offset += envelope_size;
5190            _next_ordinal_to_read += 1;
5191            if next_offset >= end_offset {
5192                return Ok(());
5193            }
5194
5195            // Decode unknown envelopes for gaps in ordinals.
5196            while _next_ordinal_to_read < 4 {
5197                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5198                _next_ordinal_to_read += 1;
5199                next_offset += envelope_size;
5200            }
5201
5202            let next_out_of_line = decoder.next_out_of_line();
5203            let handles_before = decoder.remaining_handles();
5204            if let Some((inlined, num_bytes, num_handles)) =
5205                fidl::encoding::decode_envelope_header(decoder, next_offset)?
5206            {
5207                let member_inline_size =
5208                    <PacketStats as fidl::encoding::TypeMarker>::inline_size(decoder.context);
5209                if inlined != (member_inline_size <= 4) {
5210                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
5211                }
5212                let inner_offset;
5213                let mut inner_depth = depth.clone();
5214                if inlined {
5215                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
5216                    inner_offset = next_offset;
5217                } else {
5218                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
5219                    inner_depth.increment()?;
5220                }
5221                let val_ref = self.vo.get_or_insert_with(|| fidl::new_empty!(PacketStats, D));
5222                fidl::decode!(PacketStats, D, val_ref, decoder, inner_offset, inner_depth)?;
5223                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
5224                {
5225                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
5226                }
5227                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
5228                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
5229                }
5230            }
5231
5232            next_offset += envelope_size;
5233
5234            // Decode the remaining unknown envelopes.
5235            while next_offset < end_offset {
5236                _next_ordinal_to_read += 1;
5237                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
5238                next_offset += envelope_size;
5239            }
5240
5241            Ok(())
5242        }
5243    }
5244}