fidl_fuchsia_ebpf/
fidl_fuchsia_ebpf.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::client::QueryResponseFut;
8use fidl::encoding::{MessageBufFor, ProxyChannelBox, ResourceDialect};
9use fidl::endpoints::{ControlHandle as _, Responder as _};
10pub use fidl_fuchsia_ebpf__common::*;
11use futures::future::{self, MaybeDone, TryFutureExt};
12use zx_status;
13
14/// A handle of an eBPF program.
15#[derive(Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
16pub struct ProgramHandle {
17    pub handle: fidl::EventPair,
18}
19
20impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for ProgramHandle {}
21
22/// A representation of eBPF map that can be shared between processes.
23#[derive(Debug, Default, PartialEq)]
24pub struct Map {
25    /// Map schema.
26    pub schema: Option<MapSchema>,
27    /// VMO used to store the map data. The layout of the data stored in the
28    /// VMO depends on the `schema` as defined in the `ebpf_api` create.
29    pub vmo: Option<fidl::Vmo>,
30    #[doc(hidden)]
31    pub __source_breaking: fidl::marker::SourceBreaking,
32}
33
34impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for Map {}
35
36/// A verified eBPF program.
37#[derive(Debug, Default, PartialEq)]
38pub struct VerifiedProgram {
39    /// Program instructions.
40    pub code: Option<Vec<u64>>,
41    /// List of instructions accessing struct fields.
42    pub struct_access_instructions: Option<Vec<StructAccess>>,
43    /// List of the maps used by the program. `code` may reference these maps
44    /// by their index in this array.
45    pub maps: Option<Vec<Map>>,
46    #[doc(hidden)]
47    pub __source_breaking: fidl::marker::SourceBreaking,
48}
49
50impl fidl::Standalone<fidl::encoding::DefaultFuchsiaResourceDialect> for VerifiedProgram {}
51
52mod internal {
53    use super::*;
54
55    impl fidl::encoding::ResourceTypeMarker for ProgramHandle {
56        type Borrowed<'a> = &'a mut Self;
57        fn take_or_borrow<'a>(
58            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
59        ) -> Self::Borrowed<'a> {
60            value
61        }
62    }
63
64    unsafe impl fidl::encoding::TypeMarker for ProgramHandle {
65        type Owned = Self;
66
67        #[inline(always)]
68        fn inline_align(_context: fidl::encoding::Context) -> usize {
69            4
70        }
71
72        #[inline(always)]
73        fn inline_size(_context: fidl::encoding::Context) -> usize {
74            4
75        }
76    }
77
78    unsafe impl fidl::encoding::Encode<ProgramHandle, fidl::encoding::DefaultFuchsiaResourceDialect>
79        for &mut ProgramHandle
80    {
81        #[inline]
82        unsafe fn encode(
83            self,
84            encoder: &mut fidl::encoding::Encoder<
85                '_,
86                fidl::encoding::DefaultFuchsiaResourceDialect,
87            >,
88            offset: usize,
89            _depth: fidl::encoding::Depth,
90        ) -> fidl::Result<()> {
91            encoder.debug_check_bounds::<ProgramHandle>(offset);
92            // Delegate to tuple encoding.
93            fidl::encoding::Encode::<ProgramHandle, fidl::encoding::DefaultFuchsiaResourceDialect>::encode(
94                (
95                    <fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 20482> as fidl::encoding::ResourceTypeMarker>::take_or_borrow(&mut self.handle),
96                ),
97                encoder, offset, _depth
98            )
99        }
100    }
101    unsafe impl<
102        T0: fidl::encoding::Encode<
103                fidl::encoding::HandleType<
104                    fidl::EventPair,
105                    { fidl::ObjectType::EVENTPAIR.into_raw() },
106                    20482,
107                >,
108                fidl::encoding::DefaultFuchsiaResourceDialect,
109            >,
110    > fidl::encoding::Encode<ProgramHandle, fidl::encoding::DefaultFuchsiaResourceDialect>
111        for (T0,)
112    {
113        #[inline]
114        unsafe fn encode(
115            self,
116            encoder: &mut fidl::encoding::Encoder<
117                '_,
118                fidl::encoding::DefaultFuchsiaResourceDialect,
119            >,
120            offset: usize,
121            depth: fidl::encoding::Depth,
122        ) -> fidl::Result<()> {
123            encoder.debug_check_bounds::<ProgramHandle>(offset);
124            // Zero out padding regions. There's no need to apply masks
125            // because the unmasked parts will be overwritten by fields.
126            // Write the fields.
127            self.0.encode(encoder, offset + 0, depth)?;
128            Ok(())
129        }
130    }
131
132    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for ProgramHandle {
133        #[inline(always)]
134        fn new_empty() -> Self {
135            Self {
136                handle: fidl::new_empty!(fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 20482>, fidl::encoding::DefaultFuchsiaResourceDialect),
137            }
138        }
139
140        #[inline]
141        unsafe fn decode(
142            &mut self,
143            decoder: &mut fidl::encoding::Decoder<
144                '_,
145                fidl::encoding::DefaultFuchsiaResourceDialect,
146            >,
147            offset: usize,
148            _depth: fidl::encoding::Depth,
149        ) -> fidl::Result<()> {
150            decoder.debug_check_bounds::<Self>(offset);
151            // Verify that padding bytes are zero.
152            fidl::decode!(fidl::encoding::HandleType<fidl::EventPair, { fidl::ObjectType::EVENTPAIR.into_raw() }, 20482>, fidl::encoding::DefaultFuchsiaResourceDialect, &mut self.handle, decoder, offset + 0, _depth)?;
153            Ok(())
154        }
155    }
156
157    impl Map {
158        #[inline(always)]
159        fn max_ordinal_present(&self) -> u64 {
160            if let Some(_) = self.vmo {
161                return 2;
162            }
163            if let Some(_) = self.schema {
164                return 1;
165            }
166            0
167        }
168    }
169
170    impl fidl::encoding::ResourceTypeMarker for Map {
171        type Borrowed<'a> = &'a mut Self;
172        fn take_or_borrow<'a>(
173            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
174        ) -> Self::Borrowed<'a> {
175            value
176        }
177    }
178
179    unsafe impl fidl::encoding::TypeMarker for Map {
180        type Owned = Self;
181
182        #[inline(always)]
183        fn inline_align(_context: fidl::encoding::Context) -> usize {
184            8
185        }
186
187        #[inline(always)]
188        fn inline_size(_context: fidl::encoding::Context) -> usize {
189            16
190        }
191    }
192
193    unsafe impl fidl::encoding::Encode<Map, fidl::encoding::DefaultFuchsiaResourceDialect>
194        for &mut Map
195    {
196        unsafe fn encode(
197            self,
198            encoder: &mut fidl::encoding::Encoder<
199                '_,
200                fidl::encoding::DefaultFuchsiaResourceDialect,
201            >,
202            offset: usize,
203            mut depth: fidl::encoding::Depth,
204        ) -> fidl::Result<()> {
205            encoder.debug_check_bounds::<Map>(offset);
206            // Vector header
207            let max_ordinal: u64 = self.max_ordinal_present();
208            encoder.write_num(max_ordinal, offset);
209            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
210            // Calling encoder.out_of_line_offset(0) is not allowed.
211            if max_ordinal == 0 {
212                return Ok(());
213            }
214            depth.increment()?;
215            let envelope_size = 8;
216            let bytes_len = max_ordinal as usize * envelope_size;
217            #[allow(unused_variables)]
218            let offset = encoder.out_of_line_offset(bytes_len);
219            let mut _prev_end_offset: usize = 0;
220            if 1 > max_ordinal {
221                return Ok(());
222            }
223
224            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
225            // are envelope_size bytes.
226            let cur_offset: usize = (1 - 1) * envelope_size;
227
228            // Zero reserved fields.
229            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
230
231            // Safety:
232            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
233            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
234            //   envelope_size bytes, there is always sufficient room.
235            fidl::encoding::encode_in_envelope_optional::<
236                MapSchema,
237                fidl::encoding::DefaultFuchsiaResourceDialect,
238            >(
239                self.schema.as_ref().map(<MapSchema as fidl::encoding::ValueTypeMarker>::borrow),
240                encoder,
241                offset + cur_offset,
242                depth,
243            )?;
244
245            _prev_end_offset = cur_offset + envelope_size;
246            if 2 > max_ordinal {
247                return Ok(());
248            }
249
250            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
251            // are envelope_size bytes.
252            let cur_offset: usize = (2 - 1) * envelope_size;
253
254            // Zero reserved fields.
255            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
256
257            // Safety:
258            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
259            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
260            //   envelope_size bytes, there is always sufficient room.
261            fidl::encoding::encode_in_envelope_optional::<
262                fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 20524>,
263                fidl::encoding::DefaultFuchsiaResourceDialect,
264            >(
265                self.vmo.as_mut().map(
266                    <fidl::encoding::HandleType<
267                        fidl::Vmo,
268                        { fidl::ObjectType::VMO.into_raw() },
269                        20524,
270                    > as fidl::encoding::ResourceTypeMarker>::take_or_borrow,
271                ),
272                encoder,
273                offset + cur_offset,
274                depth,
275            )?;
276
277            _prev_end_offset = cur_offset + envelope_size;
278
279            Ok(())
280        }
281    }
282
283    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect> for Map {
284        #[inline(always)]
285        fn new_empty() -> Self {
286            Self::default()
287        }
288
289        unsafe fn decode(
290            &mut self,
291            decoder: &mut fidl::encoding::Decoder<
292                '_,
293                fidl::encoding::DefaultFuchsiaResourceDialect,
294            >,
295            offset: usize,
296            mut depth: fidl::encoding::Depth,
297        ) -> fidl::Result<()> {
298            decoder.debug_check_bounds::<Self>(offset);
299            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
300                None => return Err(fidl::Error::NotNullable),
301                Some(len) => len,
302            };
303            // Calling decoder.out_of_line_offset(0) is not allowed.
304            if len == 0 {
305                return Ok(());
306            };
307            depth.increment()?;
308            let envelope_size = 8;
309            let bytes_len = len * envelope_size;
310            let offset = decoder.out_of_line_offset(bytes_len)?;
311            // Decode the envelope for each type.
312            let mut _next_ordinal_to_read = 0;
313            let mut next_offset = offset;
314            let end_offset = offset + bytes_len;
315            _next_ordinal_to_read += 1;
316            if next_offset >= end_offset {
317                return Ok(());
318            }
319
320            // Decode unknown envelopes for gaps in ordinals.
321            while _next_ordinal_to_read < 1 {
322                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
323                _next_ordinal_to_read += 1;
324                next_offset += envelope_size;
325            }
326
327            let next_out_of_line = decoder.next_out_of_line();
328            let handles_before = decoder.remaining_handles();
329            if let Some((inlined, num_bytes, num_handles)) =
330                fidl::encoding::decode_envelope_header(decoder, next_offset)?
331            {
332                let member_inline_size =
333                    <MapSchema as fidl::encoding::TypeMarker>::inline_size(decoder.context);
334                if inlined != (member_inline_size <= 4) {
335                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
336                }
337                let inner_offset;
338                let mut inner_depth = depth.clone();
339                if inlined {
340                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
341                    inner_offset = next_offset;
342                } else {
343                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
344                    inner_depth.increment()?;
345                }
346                let val_ref = self.schema.get_or_insert_with(|| {
347                    fidl::new_empty!(MapSchema, fidl::encoding::DefaultFuchsiaResourceDialect)
348                });
349                fidl::decode!(
350                    MapSchema,
351                    fidl::encoding::DefaultFuchsiaResourceDialect,
352                    val_ref,
353                    decoder,
354                    inner_offset,
355                    inner_depth
356                )?;
357                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
358                {
359                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
360                }
361                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
362                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
363                }
364            }
365
366            next_offset += envelope_size;
367            _next_ordinal_to_read += 1;
368            if next_offset >= end_offset {
369                return Ok(());
370            }
371
372            // Decode unknown envelopes for gaps in ordinals.
373            while _next_ordinal_to_read < 2 {
374                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
375                _next_ordinal_to_read += 1;
376                next_offset += envelope_size;
377            }
378
379            let next_out_of_line = decoder.next_out_of_line();
380            let handles_before = decoder.remaining_handles();
381            if let Some((inlined, num_bytes, num_handles)) =
382                fidl::encoding::decode_envelope_header(decoder, next_offset)?
383            {
384                let member_inline_size = <fidl::encoding::HandleType<
385                    fidl::Vmo,
386                    { fidl::ObjectType::VMO.into_raw() },
387                    20524,
388                > as fidl::encoding::TypeMarker>::inline_size(
389                    decoder.context
390                );
391                if inlined != (member_inline_size <= 4) {
392                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
393                }
394                let inner_offset;
395                let mut inner_depth = depth.clone();
396                if inlined {
397                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
398                    inner_offset = next_offset;
399                } else {
400                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
401                    inner_depth.increment()?;
402                }
403                let val_ref =
404                self.vmo.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 20524>, fidl::encoding::DefaultFuchsiaResourceDialect));
405                fidl::decode!(fidl::encoding::HandleType<fidl::Vmo, { fidl::ObjectType::VMO.into_raw() }, 20524>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
406                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
407                {
408                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
409                }
410                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
411                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
412                }
413            }
414
415            next_offset += envelope_size;
416
417            // Decode the remaining unknown envelopes.
418            while next_offset < end_offset {
419                _next_ordinal_to_read += 1;
420                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
421                next_offset += envelope_size;
422            }
423
424            Ok(())
425        }
426    }
427
428    impl VerifiedProgram {
429        #[inline(always)]
430        fn max_ordinal_present(&self) -> u64 {
431            if let Some(_) = self.maps {
432                return 3;
433            }
434            if let Some(_) = self.struct_access_instructions {
435                return 2;
436            }
437            if let Some(_) = self.code {
438                return 1;
439            }
440            0
441        }
442    }
443
444    impl fidl::encoding::ResourceTypeMarker for VerifiedProgram {
445        type Borrowed<'a> = &'a mut Self;
446        fn take_or_borrow<'a>(
447            value: &'a mut <Self as fidl::encoding::TypeMarker>::Owned,
448        ) -> Self::Borrowed<'a> {
449            value
450        }
451    }
452
453    unsafe impl fidl::encoding::TypeMarker for VerifiedProgram {
454        type Owned = Self;
455
456        #[inline(always)]
457        fn inline_align(_context: fidl::encoding::Context) -> usize {
458            8
459        }
460
461        #[inline(always)]
462        fn inline_size(_context: fidl::encoding::Context) -> usize {
463            16
464        }
465    }
466
467    unsafe impl
468        fidl::encoding::Encode<VerifiedProgram, fidl::encoding::DefaultFuchsiaResourceDialect>
469        for &mut VerifiedProgram
470    {
471        unsafe fn encode(
472            self,
473            encoder: &mut fidl::encoding::Encoder<
474                '_,
475                fidl::encoding::DefaultFuchsiaResourceDialect,
476            >,
477            offset: usize,
478            mut depth: fidl::encoding::Depth,
479        ) -> fidl::Result<()> {
480            encoder.debug_check_bounds::<VerifiedProgram>(offset);
481            // Vector header
482            let max_ordinal: u64 = self.max_ordinal_present();
483            encoder.write_num(max_ordinal, offset);
484            encoder.write_num(fidl::encoding::ALLOC_PRESENT_U64, offset + 8);
485            // Calling encoder.out_of_line_offset(0) is not allowed.
486            if max_ordinal == 0 {
487                return Ok(());
488            }
489            depth.increment()?;
490            let envelope_size = 8;
491            let bytes_len = max_ordinal as usize * envelope_size;
492            #[allow(unused_variables)]
493            let offset = encoder.out_of_line_offset(bytes_len);
494            let mut _prev_end_offset: usize = 0;
495            if 1 > max_ordinal {
496                return Ok(());
497            }
498
499            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
500            // are envelope_size bytes.
501            let cur_offset: usize = (1 - 1) * envelope_size;
502
503            // Zero reserved fields.
504            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
505
506            // Safety:
507            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
508            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
509            //   envelope_size bytes, there is always sufficient room.
510            fidl::encoding::encode_in_envelope_optional::<
511                fidl::encoding::Vector<u64, 4096>,
512                fidl::encoding::DefaultFuchsiaResourceDialect,
513            >(
514                self.code.as_ref().map(
515                    <fidl::encoding::Vector<u64, 4096> as fidl::encoding::ValueTypeMarker>::borrow,
516                ),
517                encoder,
518                offset + cur_offset,
519                depth,
520            )?;
521
522            _prev_end_offset = cur_offset + envelope_size;
523            if 2 > max_ordinal {
524                return Ok(());
525            }
526
527            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
528            // are envelope_size bytes.
529            let cur_offset: usize = (2 - 1) * envelope_size;
530
531            // Zero reserved fields.
532            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
533
534            // Safety:
535            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
536            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
537            //   envelope_size bytes, there is always sufficient room.
538            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<StructAccess, 4096>, fidl::encoding::DefaultFuchsiaResourceDialect>(
539            self.struct_access_instructions.as_ref().map(<fidl::encoding::Vector<StructAccess, 4096> as fidl::encoding::ValueTypeMarker>::borrow),
540            encoder, offset + cur_offset, depth
541        )?;
542
543            _prev_end_offset = cur_offset + envelope_size;
544            if 3 > max_ordinal {
545                return Ok(());
546            }
547
548            // Write at offset+(ordinal-1)*envelope_size, since ordinals are one-based and envelopes
549            // are envelope_size bytes.
550            let cur_offset: usize = (3 - 1) * envelope_size;
551
552            // Zero reserved fields.
553            encoder.padding(offset + _prev_end_offset, cur_offset - _prev_end_offset);
554
555            // Safety:
556            // - bytes_len is calculated to fit envelope_size*max(member.ordinal).
557            // - Since cur_offset is envelope_size*(member.ordinal - 1) and the envelope takes
558            //   envelope_size bytes, there is always sufficient room.
559            fidl::encoding::encode_in_envelope_optional::<fidl::encoding::Vector<Map, 4096>, fidl::encoding::DefaultFuchsiaResourceDialect>(
560            self.maps.as_mut().map(<fidl::encoding::Vector<Map, 4096> as fidl::encoding::ResourceTypeMarker>::take_or_borrow),
561            encoder, offset + cur_offset, depth
562        )?;
563
564            _prev_end_offset = cur_offset + envelope_size;
565
566            Ok(())
567        }
568    }
569
570    impl fidl::encoding::Decode<Self, fidl::encoding::DefaultFuchsiaResourceDialect>
571        for VerifiedProgram
572    {
573        #[inline(always)]
574        fn new_empty() -> Self {
575            Self::default()
576        }
577
578        unsafe fn decode(
579            &mut self,
580            decoder: &mut fidl::encoding::Decoder<
581                '_,
582                fidl::encoding::DefaultFuchsiaResourceDialect,
583            >,
584            offset: usize,
585            mut depth: fidl::encoding::Depth,
586        ) -> fidl::Result<()> {
587            decoder.debug_check_bounds::<Self>(offset);
588            let len = match fidl::encoding::decode_vector_header(decoder, offset)? {
589                None => return Err(fidl::Error::NotNullable),
590                Some(len) => len,
591            };
592            // Calling decoder.out_of_line_offset(0) is not allowed.
593            if len == 0 {
594                return Ok(());
595            };
596            depth.increment()?;
597            let envelope_size = 8;
598            let bytes_len = len * envelope_size;
599            let offset = decoder.out_of_line_offset(bytes_len)?;
600            // Decode the envelope for each type.
601            let mut _next_ordinal_to_read = 0;
602            let mut next_offset = offset;
603            let end_offset = offset + bytes_len;
604            _next_ordinal_to_read += 1;
605            if next_offset >= end_offset {
606                return Ok(());
607            }
608
609            // Decode unknown envelopes for gaps in ordinals.
610            while _next_ordinal_to_read < 1 {
611                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
612                _next_ordinal_to_read += 1;
613                next_offset += envelope_size;
614            }
615
616            let next_out_of_line = decoder.next_out_of_line();
617            let handles_before = decoder.remaining_handles();
618            if let Some((inlined, num_bytes, num_handles)) =
619                fidl::encoding::decode_envelope_header(decoder, next_offset)?
620            {
621                let member_inline_size =
622                    <fidl::encoding::Vector<u64, 4096> as fidl::encoding::TypeMarker>::inline_size(
623                        decoder.context,
624                    );
625                if inlined != (member_inline_size <= 4) {
626                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
627                }
628                let inner_offset;
629                let mut inner_depth = depth.clone();
630                if inlined {
631                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
632                    inner_offset = next_offset;
633                } else {
634                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
635                    inner_depth.increment()?;
636                }
637                let val_ref =
638                self.code.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<u64, 4096>, fidl::encoding::DefaultFuchsiaResourceDialect));
639                fidl::decode!(fidl::encoding::Vector<u64, 4096>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
640                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
641                {
642                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
643                }
644                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
645                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
646                }
647            }
648
649            next_offset += envelope_size;
650            _next_ordinal_to_read += 1;
651            if next_offset >= end_offset {
652                return Ok(());
653            }
654
655            // Decode unknown envelopes for gaps in ordinals.
656            while _next_ordinal_to_read < 2 {
657                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
658                _next_ordinal_to_read += 1;
659                next_offset += envelope_size;
660            }
661
662            let next_out_of_line = decoder.next_out_of_line();
663            let handles_before = decoder.remaining_handles();
664            if let Some((inlined, num_bytes, num_handles)) =
665                fidl::encoding::decode_envelope_header(decoder, next_offset)?
666            {
667                let member_inline_size = <fidl::encoding::Vector<StructAccess, 4096> as fidl::encoding::TypeMarker>::inline_size(decoder.context);
668                if inlined != (member_inline_size <= 4) {
669                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
670                }
671                let inner_offset;
672                let mut inner_depth = depth.clone();
673                if inlined {
674                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
675                    inner_offset = next_offset;
676                } else {
677                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
678                    inner_depth.increment()?;
679                }
680                let val_ref =
681                self.struct_access_instructions.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<StructAccess, 4096>, fidl::encoding::DefaultFuchsiaResourceDialect));
682                fidl::decode!(fidl::encoding::Vector<StructAccess, 4096>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
683                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
684                {
685                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
686                }
687                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
688                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
689                }
690            }
691
692            next_offset += envelope_size;
693            _next_ordinal_to_read += 1;
694            if next_offset >= end_offset {
695                return Ok(());
696            }
697
698            // Decode unknown envelopes for gaps in ordinals.
699            while _next_ordinal_to_read < 3 {
700                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
701                _next_ordinal_to_read += 1;
702                next_offset += envelope_size;
703            }
704
705            let next_out_of_line = decoder.next_out_of_line();
706            let handles_before = decoder.remaining_handles();
707            if let Some((inlined, num_bytes, num_handles)) =
708                fidl::encoding::decode_envelope_header(decoder, next_offset)?
709            {
710                let member_inline_size =
711                    <fidl::encoding::Vector<Map, 4096> as fidl::encoding::TypeMarker>::inline_size(
712                        decoder.context,
713                    );
714                if inlined != (member_inline_size <= 4) {
715                    return Err(fidl::Error::InvalidInlineBitInEnvelope);
716                }
717                let inner_offset;
718                let mut inner_depth = depth.clone();
719                if inlined {
720                    decoder.check_inline_envelope_padding(next_offset, member_inline_size)?;
721                    inner_offset = next_offset;
722                } else {
723                    inner_offset = decoder.out_of_line_offset(member_inline_size)?;
724                    inner_depth.increment()?;
725                }
726                let val_ref =
727                self.maps.get_or_insert_with(|| fidl::new_empty!(fidl::encoding::Vector<Map, 4096>, fidl::encoding::DefaultFuchsiaResourceDialect));
728                fidl::decode!(fidl::encoding::Vector<Map, 4096>, fidl::encoding::DefaultFuchsiaResourceDialect, val_ref, decoder, inner_offset, inner_depth)?;
729                if !inlined && decoder.next_out_of_line() != next_out_of_line + (num_bytes as usize)
730                {
731                    return Err(fidl::Error::InvalidNumBytesInEnvelope);
732                }
733                if handles_before != decoder.remaining_handles() + (num_handles as usize) {
734                    return Err(fidl::Error::InvalidNumHandlesInEnvelope);
735                }
736            }
737
738            next_offset += envelope_size;
739
740            // Decode the remaining unknown envelopes.
741            while next_offset < end_offset {
742                _next_ordinal_to_read += 1;
743                fidl::encoding::decode_unknown_envelope(decoder, next_offset, depth)?;
744                next_offset += envelope_size;
745            }
746
747            Ok(())
748        }
749    }
750}