Skip to main content

netlink_bindings/mptcp_pm/
mod.rs

1#![doc = "Multipath TCP.\n"]
2#![allow(clippy::all)]
3#![allow(unused_imports)]
4#![allow(unused_assignments)]
5#![allow(non_snake_case)]
6#![allow(unused_variables)]
7#![allow(irrefutable_let_patterns)]
8#![allow(unreachable_code)]
9#![allow(unreachable_patterns)]
10use crate::builtin::{BuiltinBitfield32, BuiltinNfgenmsg, Nlmsghdr, PushDummy};
11use crate::{
12    consts,
13    traits::{NetlinkRequest, Protocol},
14    utils::*,
15};
16pub const PROTONAME: &str = "mptcp_pm";
17pub const PROTONAME_CSTR: &CStr = c"mptcp_pm";
18#[doc = "Netlink MPTCP event types\n"]
19#[doc = "Enum - defines an integer enumeration, with values for each entry incrementing by 1, (e.g. 0, 1, 2, 3)"]
20#[derive(Debug, Clone, Copy)]
21pub enum EventType {
22    #[doc = "unused event\n"]
23    Unspec = 0,
24    #[doc = "A new MPTCP connection has been created. It is the good time to allocate\nmemory and send ADD_ADDR if needed. Depending on the traffic-patterns it\ncan take a long time until the MPTCP_EVENT_ESTABLISHED is sent.\nAttributes: token, family, saddr4 \\| saddr6, daddr4 \\| daddr6, sport,\ndport, \\[server-side\\], \\[flags\\].\n"]
25    Created = 1,
26    #[doc = "A MPTCP connection is established (can start new subflows). Attributes:\ntoken, family, saddr4 \\| saddr6, daddr4 \\| daddr6, sport, dport,\n\\[server-side\\], \\[flags\\].\n"]
27    Established = 2,
28    #[doc = "A MPTCP connection has stopped. Attribute: token.\n"]
29    Closed = 3,
30    #[doc = "A new address has been announced by the peer. Attributes: token, rem_id,\nfamily, daddr4 \\| daddr6 \\[, dport\\].\n"]
31    Announced = 6,
32    #[doc = "An address has been lost by the peer. Attributes: token, rem_id.\n"]
33    Removed = 7,
34    #[doc = "A new subflow has been established. \\'error\\' should not be set.\nAttributes: token, family, loc_id, rem_id, saddr4 \\| saddr6, daddr4 \\|\ndaddr6, sport, dport, backup, if-idx \\[, error\\].\n"]
35    SubEstablished = 10,
36    #[doc = "A subflow has been closed. An error (copy of sk_err) could be set if an\nerror has been detected for this subflow. Attributes: token, family,\nloc_id, rem_id, saddr4 \\| saddr6, daddr4 \\| daddr6, sport, dport,\nbackup, if-idx \\[, error\\].\n"]
37    SubClosed = 11,
38    #[doc = "The priority of a subflow has changed. \\'error\\' should not be set.\nAttributes: token, family, loc_id, rem_id, saddr4 \\| saddr6, daddr4 \\|\ndaddr6, sport, dport, backup, if-idx \\[, error\\].\n"]
39    SubPriority = 13,
40    #[doc = "A new PM listener is created. Attributes: family, sport, saddr4 \\|\nsaddr6.\n"]
41    ListenerCreated = 15,
42    #[doc = "A PM listener is closed. Attributes: family, sport, saddr4 \\| saddr6.\n"]
43    ListenerClosed = 16,
44}
45impl EventType {
46    pub fn from_value(value: u64) -> Option<Self> {
47        Some(match value {
48            0 => Self::Unspec,
49            1 => Self::Created,
50            2 => Self::Established,
51            3 => Self::Closed,
52            6 => Self::Announced,
53            7 => Self::Removed,
54            10 => Self::SubEstablished,
55            11 => Self::SubClosed,
56            13 => Self::SubPriority,
57            15 => Self::ListenerCreated,
58            16 => Self::ListenerClosed,
59            _ => return None,
60        })
61    }
62}
63#[derive(Clone)]
64pub enum Address<'a> {
65    Family(u16),
66    Id(u8),
67    Addr4(u32),
68    Addr6(&'a [u8]),
69    Port(u16),
70    Flags(u32),
71    IfIdx(i32),
72}
73impl<'a> IterableAddress<'a> {
74    pub fn get_family(&self) -> Result<u16, ErrorContext> {
75        let mut iter = self.clone();
76        iter.pos = 0;
77        for attr in iter {
78            if let Ok(Address::Family(val)) = attr {
79                return Ok(val);
80            }
81        }
82        Err(ErrorContext::new_missing(
83            "Address",
84            "Family",
85            self.orig_loc,
86            self.buf.as_ptr() as usize,
87        ))
88    }
89    pub fn get_id(&self) -> Result<u8, ErrorContext> {
90        let mut iter = self.clone();
91        iter.pos = 0;
92        for attr in iter {
93            if let Ok(Address::Id(val)) = attr {
94                return Ok(val);
95            }
96        }
97        Err(ErrorContext::new_missing(
98            "Address",
99            "Id",
100            self.orig_loc,
101            self.buf.as_ptr() as usize,
102        ))
103    }
104    pub fn get_addr4(&self) -> Result<u32, ErrorContext> {
105        let mut iter = self.clone();
106        iter.pos = 0;
107        for attr in iter {
108            if let Ok(Address::Addr4(val)) = attr {
109                return Ok(val);
110            }
111        }
112        Err(ErrorContext::new_missing(
113            "Address",
114            "Addr4",
115            self.orig_loc,
116            self.buf.as_ptr() as usize,
117        ))
118    }
119    pub fn get_addr6(&self) -> Result<&'a [u8], ErrorContext> {
120        let mut iter = self.clone();
121        iter.pos = 0;
122        for attr in iter {
123            if let Ok(Address::Addr6(val)) = attr {
124                return Ok(val);
125            }
126        }
127        Err(ErrorContext::new_missing(
128            "Address",
129            "Addr6",
130            self.orig_loc,
131            self.buf.as_ptr() as usize,
132        ))
133    }
134    pub fn get_port(&self) -> Result<u16, ErrorContext> {
135        let mut iter = self.clone();
136        iter.pos = 0;
137        for attr in iter {
138            if let Ok(Address::Port(val)) = attr {
139                return Ok(val);
140            }
141        }
142        Err(ErrorContext::new_missing(
143            "Address",
144            "Port",
145            self.orig_loc,
146            self.buf.as_ptr() as usize,
147        ))
148    }
149    pub fn get_flags(&self) -> Result<u32, ErrorContext> {
150        let mut iter = self.clone();
151        iter.pos = 0;
152        for attr in iter {
153            if let Ok(Address::Flags(val)) = attr {
154                return Ok(val);
155            }
156        }
157        Err(ErrorContext::new_missing(
158            "Address",
159            "Flags",
160            self.orig_loc,
161            self.buf.as_ptr() as usize,
162        ))
163    }
164    pub fn get_if_idx(&self) -> Result<i32, ErrorContext> {
165        let mut iter = self.clone();
166        iter.pos = 0;
167        for attr in iter {
168            if let Ok(Address::IfIdx(val)) = attr {
169                return Ok(val);
170            }
171        }
172        Err(ErrorContext::new_missing(
173            "Address",
174            "IfIdx",
175            self.orig_loc,
176            self.buf.as_ptr() as usize,
177        ))
178    }
179}
180impl Address<'_> {
181    pub fn new<'a>(buf: &'a [u8]) -> IterableAddress<'a> {
182        IterableAddress::with_loc(buf, buf.as_ptr() as usize)
183    }
184    fn attr_from_type(r#type: u16) -> Option<&'static str> {
185        let res = match r#type {
186            0u16 => "Unspec",
187            1u16 => "Family",
188            2u16 => "Id",
189            3u16 => "Addr4",
190            4u16 => "Addr6",
191            5u16 => "Port",
192            6u16 => "Flags",
193            7u16 => "IfIdx",
194            _ => return None,
195        };
196        Some(res)
197    }
198}
199#[derive(Clone, Copy, Default)]
200pub struct IterableAddress<'a> {
201    buf: &'a [u8],
202    pos: usize,
203    orig_loc: usize,
204}
205impl<'a> IterableAddress<'a> {
206    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
207        Self {
208            buf,
209            pos: 0,
210            orig_loc,
211        }
212    }
213    pub fn get_buf(&self) -> &'a [u8] {
214        self.buf
215    }
216}
217impl<'a> Iterator for IterableAddress<'a> {
218    type Item = Result<Address<'a>, ErrorContext>;
219    fn next(&mut self) -> Option<Self::Item> {
220        let mut pos;
221        let mut r#type;
222        loop {
223            pos = self.pos;
224            r#type = None;
225            if self.buf.len() == self.pos {
226                return None;
227            }
228            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
229                self.pos = self.buf.len();
230                break;
231            };
232            r#type = Some(header.r#type);
233            let res = match header.r#type {
234                1u16 => Address::Family({
235                    let res = parse_u16(next);
236                    let Some(val) = res else { break };
237                    val
238                }),
239                2u16 => Address::Id({
240                    let res = parse_u8(next);
241                    let Some(val) = res else { break };
242                    val
243                }),
244                3u16 => Address::Addr4({
245                    let res = parse_be_u32(next);
246                    let Some(val) = res else { break };
247                    val
248                }),
249                4u16 => Address::Addr6({
250                    let res = Some(next);
251                    let Some(val) = res else { break };
252                    val
253                }),
254                5u16 => Address::Port({
255                    let res = parse_u16(next);
256                    let Some(val) = res else { break };
257                    val
258                }),
259                6u16 => Address::Flags({
260                    let res = parse_u32(next);
261                    let Some(val) = res else { break };
262                    val
263                }),
264                7u16 => Address::IfIdx({
265                    let res = parse_i32(next);
266                    let Some(val) = res else { break };
267                    val
268                }),
269                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
270                n => continue,
271            };
272            return Some(Ok(res));
273        }
274        Some(Err(ErrorContext::new(
275            "Address",
276            r#type.and_then(|t| Address::attr_from_type(t)),
277            self.orig_loc,
278            self.buf.as_ptr().wrapping_add(pos) as usize,
279        )))
280    }
281}
282impl<'a> std::fmt::Debug for IterableAddress<'_> {
283    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
284        let mut fmt = f.debug_struct("Address");
285        for attr in self.clone() {
286            let attr = match attr {
287                Ok(a) => a,
288                Err(err) => {
289                    fmt.finish()?;
290                    f.write_str("Err(")?;
291                    err.fmt(f)?;
292                    return f.write_str(")");
293                }
294            };
295            match attr {
296                Address::Family(val) => fmt.field("Family", &val),
297                Address::Id(val) => fmt.field("Id", &val),
298                Address::Addr4(val) => fmt.field("Addr4", &val),
299                Address::Addr6(val) => fmt.field("Addr6", &val),
300                Address::Port(val) => fmt.field("Port", &val),
301                Address::Flags(val) => fmt.field("Flags", &val),
302                Address::IfIdx(val) => fmt.field("IfIdx", &val),
303            };
304        }
305        fmt.finish()
306    }
307}
308impl IterableAddress<'_> {
309    pub fn lookup_attr(
310        &self,
311        offset: usize,
312        missing_type: Option<u16>,
313    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
314        let mut stack = Vec::new();
315        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
316        if missing_type.is_some() && cur == offset {
317            stack.push(("Address", offset));
318            return (stack, missing_type.and_then(|t| Address::attr_from_type(t)));
319        }
320        if cur > offset || cur + self.buf.len() < offset {
321            return (stack, None);
322        }
323        let mut attrs = self.clone();
324        let mut last_off = cur + attrs.pos;
325        while let Some(attr) = attrs.next() {
326            let Ok(attr) = attr else { break };
327            match attr {
328                Address::Family(val) => {
329                    if last_off == offset {
330                        stack.push(("Family", last_off));
331                        break;
332                    }
333                }
334                Address::Id(val) => {
335                    if last_off == offset {
336                        stack.push(("Id", last_off));
337                        break;
338                    }
339                }
340                Address::Addr4(val) => {
341                    if last_off == offset {
342                        stack.push(("Addr4", last_off));
343                        break;
344                    }
345                }
346                Address::Addr6(val) => {
347                    if last_off == offset {
348                        stack.push(("Addr6", last_off));
349                        break;
350                    }
351                }
352                Address::Port(val) => {
353                    if last_off == offset {
354                        stack.push(("Port", last_off));
355                        break;
356                    }
357                }
358                Address::Flags(val) => {
359                    if last_off == offset {
360                        stack.push(("Flags", last_off));
361                        break;
362                    }
363                }
364                Address::IfIdx(val) => {
365                    if last_off == offset {
366                        stack.push(("IfIdx", last_off));
367                        break;
368                    }
369                }
370                _ => {}
371            };
372            last_off = cur + attrs.pos;
373        }
374        if !stack.is_empty() {
375            stack.push(("Address", cur));
376        }
377        (stack, None)
378    }
379}
380#[derive(Clone)]
381pub enum SubflowAttribute<'a> {
382    TokenRem(u32),
383    TokenLoc(u32),
384    RelwriteSeq(u32),
385    MapSeq(u64),
386    MapSfseq(u32),
387    SsnOffset(u32),
388    MapDatalen(u16),
389    Flags(u32),
390    IdRem(u8),
391    IdLoc(u8),
392    Pad(&'a [u8]),
393}
394impl<'a> IterableSubflowAttribute<'a> {
395    pub fn get_token_rem(&self) -> Result<u32, ErrorContext> {
396        let mut iter = self.clone();
397        iter.pos = 0;
398        for attr in iter {
399            if let Ok(SubflowAttribute::TokenRem(val)) = attr {
400                return Ok(val);
401            }
402        }
403        Err(ErrorContext::new_missing(
404            "SubflowAttribute",
405            "TokenRem",
406            self.orig_loc,
407            self.buf.as_ptr() as usize,
408        ))
409    }
410    pub fn get_token_loc(&self) -> Result<u32, ErrorContext> {
411        let mut iter = self.clone();
412        iter.pos = 0;
413        for attr in iter {
414            if let Ok(SubflowAttribute::TokenLoc(val)) = attr {
415                return Ok(val);
416            }
417        }
418        Err(ErrorContext::new_missing(
419            "SubflowAttribute",
420            "TokenLoc",
421            self.orig_loc,
422            self.buf.as_ptr() as usize,
423        ))
424    }
425    pub fn get_relwrite_seq(&self) -> Result<u32, ErrorContext> {
426        let mut iter = self.clone();
427        iter.pos = 0;
428        for attr in iter {
429            if let Ok(SubflowAttribute::RelwriteSeq(val)) = attr {
430                return Ok(val);
431            }
432        }
433        Err(ErrorContext::new_missing(
434            "SubflowAttribute",
435            "RelwriteSeq",
436            self.orig_loc,
437            self.buf.as_ptr() as usize,
438        ))
439    }
440    pub fn get_map_seq(&self) -> Result<u64, ErrorContext> {
441        let mut iter = self.clone();
442        iter.pos = 0;
443        for attr in iter {
444            if let Ok(SubflowAttribute::MapSeq(val)) = attr {
445                return Ok(val);
446            }
447        }
448        Err(ErrorContext::new_missing(
449            "SubflowAttribute",
450            "MapSeq",
451            self.orig_loc,
452            self.buf.as_ptr() as usize,
453        ))
454    }
455    pub fn get_map_sfseq(&self) -> Result<u32, ErrorContext> {
456        let mut iter = self.clone();
457        iter.pos = 0;
458        for attr in iter {
459            if let Ok(SubflowAttribute::MapSfseq(val)) = attr {
460                return Ok(val);
461            }
462        }
463        Err(ErrorContext::new_missing(
464            "SubflowAttribute",
465            "MapSfseq",
466            self.orig_loc,
467            self.buf.as_ptr() as usize,
468        ))
469    }
470    pub fn get_ssn_offset(&self) -> Result<u32, ErrorContext> {
471        let mut iter = self.clone();
472        iter.pos = 0;
473        for attr in iter {
474            if let Ok(SubflowAttribute::SsnOffset(val)) = attr {
475                return Ok(val);
476            }
477        }
478        Err(ErrorContext::new_missing(
479            "SubflowAttribute",
480            "SsnOffset",
481            self.orig_loc,
482            self.buf.as_ptr() as usize,
483        ))
484    }
485    pub fn get_map_datalen(&self) -> Result<u16, ErrorContext> {
486        let mut iter = self.clone();
487        iter.pos = 0;
488        for attr in iter {
489            if let Ok(SubflowAttribute::MapDatalen(val)) = attr {
490                return Ok(val);
491            }
492        }
493        Err(ErrorContext::new_missing(
494            "SubflowAttribute",
495            "MapDatalen",
496            self.orig_loc,
497            self.buf.as_ptr() as usize,
498        ))
499    }
500    pub fn get_flags(&self) -> Result<u32, ErrorContext> {
501        let mut iter = self.clone();
502        iter.pos = 0;
503        for attr in iter {
504            if let Ok(SubflowAttribute::Flags(val)) = attr {
505                return Ok(val);
506            }
507        }
508        Err(ErrorContext::new_missing(
509            "SubflowAttribute",
510            "Flags",
511            self.orig_loc,
512            self.buf.as_ptr() as usize,
513        ))
514    }
515    pub fn get_id_rem(&self) -> Result<u8, ErrorContext> {
516        let mut iter = self.clone();
517        iter.pos = 0;
518        for attr in iter {
519            if let Ok(SubflowAttribute::IdRem(val)) = attr {
520                return Ok(val);
521            }
522        }
523        Err(ErrorContext::new_missing(
524            "SubflowAttribute",
525            "IdRem",
526            self.orig_loc,
527            self.buf.as_ptr() as usize,
528        ))
529    }
530    pub fn get_id_loc(&self) -> Result<u8, ErrorContext> {
531        let mut iter = self.clone();
532        iter.pos = 0;
533        for attr in iter {
534            if let Ok(SubflowAttribute::IdLoc(val)) = attr {
535                return Ok(val);
536            }
537        }
538        Err(ErrorContext::new_missing(
539            "SubflowAttribute",
540            "IdLoc",
541            self.orig_loc,
542            self.buf.as_ptr() as usize,
543        ))
544    }
545    pub fn get_pad(&self) -> Result<&'a [u8], ErrorContext> {
546        let mut iter = self.clone();
547        iter.pos = 0;
548        for attr in iter {
549            if let Ok(SubflowAttribute::Pad(val)) = attr {
550                return Ok(val);
551            }
552        }
553        Err(ErrorContext::new_missing(
554            "SubflowAttribute",
555            "Pad",
556            self.orig_loc,
557            self.buf.as_ptr() as usize,
558        ))
559    }
560}
561impl SubflowAttribute<'_> {
562    pub fn new<'a>(buf: &'a [u8]) -> IterableSubflowAttribute<'a> {
563        IterableSubflowAttribute::with_loc(buf, buf.as_ptr() as usize)
564    }
565    fn attr_from_type(r#type: u16) -> Option<&'static str> {
566        let res = match r#type {
567            0u16 => "Unspec",
568            1u16 => "TokenRem",
569            2u16 => "TokenLoc",
570            3u16 => "RelwriteSeq",
571            4u16 => "MapSeq",
572            5u16 => "MapSfseq",
573            6u16 => "SsnOffset",
574            7u16 => "MapDatalen",
575            8u16 => "Flags",
576            9u16 => "IdRem",
577            10u16 => "IdLoc",
578            11u16 => "Pad",
579            _ => return None,
580        };
581        Some(res)
582    }
583}
584#[derive(Clone, Copy, Default)]
585pub struct IterableSubflowAttribute<'a> {
586    buf: &'a [u8],
587    pos: usize,
588    orig_loc: usize,
589}
590impl<'a> IterableSubflowAttribute<'a> {
591    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
592        Self {
593            buf,
594            pos: 0,
595            orig_loc,
596        }
597    }
598    pub fn get_buf(&self) -> &'a [u8] {
599        self.buf
600    }
601}
602impl<'a> Iterator for IterableSubflowAttribute<'a> {
603    type Item = Result<SubflowAttribute<'a>, ErrorContext>;
604    fn next(&mut self) -> Option<Self::Item> {
605        let mut pos;
606        let mut r#type;
607        loop {
608            pos = self.pos;
609            r#type = None;
610            if self.buf.len() == self.pos {
611                return None;
612            }
613            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
614                self.pos = self.buf.len();
615                break;
616            };
617            r#type = Some(header.r#type);
618            let res = match header.r#type {
619                1u16 => SubflowAttribute::TokenRem({
620                    let res = parse_u32(next);
621                    let Some(val) = res else { break };
622                    val
623                }),
624                2u16 => SubflowAttribute::TokenLoc({
625                    let res = parse_u32(next);
626                    let Some(val) = res else { break };
627                    val
628                }),
629                3u16 => SubflowAttribute::RelwriteSeq({
630                    let res = parse_u32(next);
631                    let Some(val) = res else { break };
632                    val
633                }),
634                4u16 => SubflowAttribute::MapSeq({
635                    let res = parse_u64(next);
636                    let Some(val) = res else { break };
637                    val
638                }),
639                5u16 => SubflowAttribute::MapSfseq({
640                    let res = parse_u32(next);
641                    let Some(val) = res else { break };
642                    val
643                }),
644                6u16 => SubflowAttribute::SsnOffset({
645                    let res = parse_u32(next);
646                    let Some(val) = res else { break };
647                    val
648                }),
649                7u16 => SubflowAttribute::MapDatalen({
650                    let res = parse_u16(next);
651                    let Some(val) = res else { break };
652                    val
653                }),
654                8u16 => SubflowAttribute::Flags({
655                    let res = parse_u32(next);
656                    let Some(val) = res else { break };
657                    val
658                }),
659                9u16 => SubflowAttribute::IdRem({
660                    let res = parse_u8(next);
661                    let Some(val) = res else { break };
662                    val
663                }),
664                10u16 => SubflowAttribute::IdLoc({
665                    let res = parse_u8(next);
666                    let Some(val) = res else { break };
667                    val
668                }),
669                11u16 => SubflowAttribute::Pad({
670                    let res = Some(next);
671                    let Some(val) = res else { break };
672                    val
673                }),
674                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
675                n => continue,
676            };
677            return Some(Ok(res));
678        }
679        Some(Err(ErrorContext::new(
680            "SubflowAttribute",
681            r#type.and_then(|t| SubflowAttribute::attr_from_type(t)),
682            self.orig_loc,
683            self.buf.as_ptr().wrapping_add(pos) as usize,
684        )))
685    }
686}
687impl<'a> std::fmt::Debug for IterableSubflowAttribute<'_> {
688    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
689        let mut fmt = f.debug_struct("SubflowAttribute");
690        for attr in self.clone() {
691            let attr = match attr {
692                Ok(a) => a,
693                Err(err) => {
694                    fmt.finish()?;
695                    f.write_str("Err(")?;
696                    err.fmt(f)?;
697                    return f.write_str(")");
698                }
699            };
700            match attr {
701                SubflowAttribute::TokenRem(val) => fmt.field("TokenRem", &val),
702                SubflowAttribute::TokenLoc(val) => fmt.field("TokenLoc", &val),
703                SubflowAttribute::RelwriteSeq(val) => fmt.field("RelwriteSeq", &val),
704                SubflowAttribute::MapSeq(val) => fmt.field("MapSeq", &val),
705                SubflowAttribute::MapSfseq(val) => fmt.field("MapSfseq", &val),
706                SubflowAttribute::SsnOffset(val) => fmt.field("SsnOffset", &val),
707                SubflowAttribute::MapDatalen(val) => fmt.field("MapDatalen", &val),
708                SubflowAttribute::Flags(val) => fmt.field("Flags", &val),
709                SubflowAttribute::IdRem(val) => fmt.field("IdRem", &val),
710                SubflowAttribute::IdLoc(val) => fmt.field("IdLoc", &val),
711                SubflowAttribute::Pad(val) => fmt.field("Pad", &val),
712            };
713        }
714        fmt.finish()
715    }
716}
717impl IterableSubflowAttribute<'_> {
718    pub fn lookup_attr(
719        &self,
720        offset: usize,
721        missing_type: Option<u16>,
722    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
723        let mut stack = Vec::new();
724        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
725        if missing_type.is_some() && cur == offset {
726            stack.push(("SubflowAttribute", offset));
727            return (
728                stack,
729                missing_type.and_then(|t| SubflowAttribute::attr_from_type(t)),
730            );
731        }
732        if cur > offset || cur + self.buf.len() < offset {
733            return (stack, None);
734        }
735        let mut attrs = self.clone();
736        let mut last_off = cur + attrs.pos;
737        while let Some(attr) = attrs.next() {
738            let Ok(attr) = attr else { break };
739            match attr {
740                SubflowAttribute::TokenRem(val) => {
741                    if last_off == offset {
742                        stack.push(("TokenRem", last_off));
743                        break;
744                    }
745                }
746                SubflowAttribute::TokenLoc(val) => {
747                    if last_off == offset {
748                        stack.push(("TokenLoc", last_off));
749                        break;
750                    }
751                }
752                SubflowAttribute::RelwriteSeq(val) => {
753                    if last_off == offset {
754                        stack.push(("RelwriteSeq", last_off));
755                        break;
756                    }
757                }
758                SubflowAttribute::MapSeq(val) => {
759                    if last_off == offset {
760                        stack.push(("MapSeq", last_off));
761                        break;
762                    }
763                }
764                SubflowAttribute::MapSfseq(val) => {
765                    if last_off == offset {
766                        stack.push(("MapSfseq", last_off));
767                        break;
768                    }
769                }
770                SubflowAttribute::SsnOffset(val) => {
771                    if last_off == offset {
772                        stack.push(("SsnOffset", last_off));
773                        break;
774                    }
775                }
776                SubflowAttribute::MapDatalen(val) => {
777                    if last_off == offset {
778                        stack.push(("MapDatalen", last_off));
779                        break;
780                    }
781                }
782                SubflowAttribute::Flags(val) => {
783                    if last_off == offset {
784                        stack.push(("Flags", last_off));
785                        break;
786                    }
787                }
788                SubflowAttribute::IdRem(val) => {
789                    if last_off == offset {
790                        stack.push(("IdRem", last_off));
791                        break;
792                    }
793                }
794                SubflowAttribute::IdLoc(val) => {
795                    if last_off == offset {
796                        stack.push(("IdLoc", last_off));
797                        break;
798                    }
799                }
800                SubflowAttribute::Pad(val) => {
801                    if last_off == offset {
802                        stack.push(("Pad", last_off));
803                        break;
804                    }
805                }
806                _ => {}
807            };
808            last_off = cur + attrs.pos;
809        }
810        if !stack.is_empty() {
811            stack.push(("SubflowAttribute", cur));
812        }
813        (stack, None)
814    }
815}
816#[derive(Clone)]
817pub enum Endpoint<'a> {
818    Addr(IterableAddress<'a>),
819}
820impl<'a> IterableEndpoint<'a> {
821    pub fn get_addr(&self) -> Result<IterableAddress<'a>, ErrorContext> {
822        let mut iter = self.clone();
823        iter.pos = 0;
824        for attr in iter {
825            if let Ok(Endpoint::Addr(val)) = attr {
826                return Ok(val);
827            }
828        }
829        Err(ErrorContext::new_missing(
830            "Endpoint",
831            "Addr",
832            self.orig_loc,
833            self.buf.as_ptr() as usize,
834        ))
835    }
836}
837impl Endpoint<'_> {
838    pub fn new<'a>(buf: &'a [u8]) -> IterableEndpoint<'a> {
839        IterableEndpoint::with_loc(buf, buf.as_ptr() as usize)
840    }
841    fn attr_from_type(r#type: u16) -> Option<&'static str> {
842        let res = match r#type {
843            1u16 => "Addr",
844            _ => return None,
845        };
846        Some(res)
847    }
848}
849#[derive(Clone, Copy, Default)]
850pub struct IterableEndpoint<'a> {
851    buf: &'a [u8],
852    pos: usize,
853    orig_loc: usize,
854}
855impl<'a> IterableEndpoint<'a> {
856    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
857        Self {
858            buf,
859            pos: 0,
860            orig_loc,
861        }
862    }
863    pub fn get_buf(&self) -> &'a [u8] {
864        self.buf
865    }
866}
867impl<'a> Iterator for IterableEndpoint<'a> {
868    type Item = Result<Endpoint<'a>, ErrorContext>;
869    fn next(&mut self) -> Option<Self::Item> {
870        let mut pos;
871        let mut r#type;
872        loop {
873            pos = self.pos;
874            r#type = None;
875            if self.buf.len() == self.pos {
876                return None;
877            }
878            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
879                self.pos = self.buf.len();
880                break;
881            };
882            r#type = Some(header.r#type);
883            let res = match header.r#type {
884                1u16 => Endpoint::Addr({
885                    let res = Some(IterableAddress::with_loc(next, self.orig_loc));
886                    let Some(val) = res else { break };
887                    val
888                }),
889                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
890                n => continue,
891            };
892            return Some(Ok(res));
893        }
894        Some(Err(ErrorContext::new(
895            "Endpoint",
896            r#type.and_then(|t| Endpoint::attr_from_type(t)),
897            self.orig_loc,
898            self.buf.as_ptr().wrapping_add(pos) as usize,
899        )))
900    }
901}
902impl<'a> std::fmt::Debug for IterableEndpoint<'_> {
903    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
904        let mut fmt = f.debug_struct("Endpoint");
905        for attr in self.clone() {
906            let attr = match attr {
907                Ok(a) => a,
908                Err(err) => {
909                    fmt.finish()?;
910                    f.write_str("Err(")?;
911                    err.fmt(f)?;
912                    return f.write_str(")");
913                }
914            };
915            match attr {
916                Endpoint::Addr(val) => fmt.field("Addr", &val),
917            };
918        }
919        fmt.finish()
920    }
921}
922impl IterableEndpoint<'_> {
923    pub fn lookup_attr(
924        &self,
925        offset: usize,
926        missing_type: Option<u16>,
927    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
928        let mut stack = Vec::new();
929        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
930        if missing_type.is_some() && cur == offset {
931            stack.push(("Endpoint", offset));
932            return (
933                stack,
934                missing_type.and_then(|t| Endpoint::attr_from_type(t)),
935            );
936        }
937        if cur > offset || cur + self.buf.len() < offset {
938            return (stack, None);
939        }
940        let mut attrs = self.clone();
941        let mut last_off = cur + attrs.pos;
942        let mut missing = None;
943        while let Some(attr) = attrs.next() {
944            let Ok(attr) = attr else { break };
945            match attr {
946                Endpoint::Addr(val) => {
947                    (stack, missing) = val.lookup_attr(offset, missing_type);
948                    if !stack.is_empty() {
949                        break;
950                    }
951                }
952                _ => {}
953            };
954            last_off = cur + attrs.pos;
955        }
956        if !stack.is_empty() {
957            stack.push(("Endpoint", cur));
958        }
959        (stack, missing)
960    }
961}
962#[derive(Clone)]
963pub enum Attr<'a> {
964    Addr(IterableAddress<'a>),
965    RcvAddAddrs(u32),
966    Subflows(u32),
967    Token(u32),
968    LocId(u8),
969    AddrRemote(IterableAddress<'a>),
970}
971impl<'a> IterableAttr<'a> {
972    pub fn get_addr(&self) -> Result<IterableAddress<'a>, ErrorContext> {
973        let mut iter = self.clone();
974        iter.pos = 0;
975        for attr in iter {
976            if let Ok(Attr::Addr(val)) = attr {
977                return Ok(val);
978            }
979        }
980        Err(ErrorContext::new_missing(
981            "Attr",
982            "Addr",
983            self.orig_loc,
984            self.buf.as_ptr() as usize,
985        ))
986    }
987    pub fn get_rcv_add_addrs(&self) -> Result<u32, ErrorContext> {
988        let mut iter = self.clone();
989        iter.pos = 0;
990        for attr in iter {
991            if let Ok(Attr::RcvAddAddrs(val)) = attr {
992                return Ok(val);
993            }
994        }
995        Err(ErrorContext::new_missing(
996            "Attr",
997            "RcvAddAddrs",
998            self.orig_loc,
999            self.buf.as_ptr() as usize,
1000        ))
1001    }
1002    pub fn get_subflows(&self) -> Result<u32, ErrorContext> {
1003        let mut iter = self.clone();
1004        iter.pos = 0;
1005        for attr in iter {
1006            if let Ok(Attr::Subflows(val)) = attr {
1007                return Ok(val);
1008            }
1009        }
1010        Err(ErrorContext::new_missing(
1011            "Attr",
1012            "Subflows",
1013            self.orig_loc,
1014            self.buf.as_ptr() as usize,
1015        ))
1016    }
1017    pub fn get_token(&self) -> Result<u32, ErrorContext> {
1018        let mut iter = self.clone();
1019        iter.pos = 0;
1020        for attr in iter {
1021            if let Ok(Attr::Token(val)) = attr {
1022                return Ok(val);
1023            }
1024        }
1025        Err(ErrorContext::new_missing(
1026            "Attr",
1027            "Token",
1028            self.orig_loc,
1029            self.buf.as_ptr() as usize,
1030        ))
1031    }
1032    pub fn get_loc_id(&self) -> Result<u8, ErrorContext> {
1033        let mut iter = self.clone();
1034        iter.pos = 0;
1035        for attr in iter {
1036            if let Ok(Attr::LocId(val)) = attr {
1037                return Ok(val);
1038            }
1039        }
1040        Err(ErrorContext::new_missing(
1041            "Attr",
1042            "LocId",
1043            self.orig_loc,
1044            self.buf.as_ptr() as usize,
1045        ))
1046    }
1047    pub fn get_addr_remote(&self) -> Result<IterableAddress<'a>, ErrorContext> {
1048        let mut iter = self.clone();
1049        iter.pos = 0;
1050        for attr in iter {
1051            if let Ok(Attr::AddrRemote(val)) = attr {
1052                return Ok(val);
1053            }
1054        }
1055        Err(ErrorContext::new_missing(
1056            "Attr",
1057            "AddrRemote",
1058            self.orig_loc,
1059            self.buf.as_ptr() as usize,
1060        ))
1061    }
1062}
1063impl Attr<'_> {
1064    pub fn new<'a>(buf: &'a [u8]) -> IterableAttr<'a> {
1065        IterableAttr::with_loc(buf, buf.as_ptr() as usize)
1066    }
1067    fn attr_from_type(r#type: u16) -> Option<&'static str> {
1068        let res = match r#type {
1069            0u16 => "Unspec",
1070            1u16 => "Addr",
1071            2u16 => "RcvAddAddrs",
1072            3u16 => "Subflows",
1073            4u16 => "Token",
1074            5u16 => "LocId",
1075            6u16 => "AddrRemote",
1076            _ => return None,
1077        };
1078        Some(res)
1079    }
1080}
1081#[derive(Clone, Copy, Default)]
1082pub struct IterableAttr<'a> {
1083    buf: &'a [u8],
1084    pos: usize,
1085    orig_loc: usize,
1086}
1087impl<'a> IterableAttr<'a> {
1088    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1089        Self {
1090            buf,
1091            pos: 0,
1092            orig_loc,
1093        }
1094    }
1095    pub fn get_buf(&self) -> &'a [u8] {
1096        self.buf
1097    }
1098}
1099impl<'a> Iterator for IterableAttr<'a> {
1100    type Item = Result<Attr<'a>, ErrorContext>;
1101    fn next(&mut self) -> Option<Self::Item> {
1102        let mut pos;
1103        let mut r#type;
1104        loop {
1105            pos = self.pos;
1106            r#type = None;
1107            if self.buf.len() == self.pos {
1108                return None;
1109            }
1110            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1111                self.pos = self.buf.len();
1112                break;
1113            };
1114            r#type = Some(header.r#type);
1115            let res = match header.r#type {
1116                1u16 => Attr::Addr({
1117                    let res = Some(IterableAddress::with_loc(next, self.orig_loc));
1118                    let Some(val) = res else { break };
1119                    val
1120                }),
1121                2u16 => Attr::RcvAddAddrs({
1122                    let res = parse_u32(next);
1123                    let Some(val) = res else { break };
1124                    val
1125                }),
1126                3u16 => Attr::Subflows({
1127                    let res = parse_u32(next);
1128                    let Some(val) = res else { break };
1129                    val
1130                }),
1131                4u16 => Attr::Token({
1132                    let res = parse_u32(next);
1133                    let Some(val) = res else { break };
1134                    val
1135                }),
1136                5u16 => Attr::LocId({
1137                    let res = parse_u8(next);
1138                    let Some(val) = res else { break };
1139                    val
1140                }),
1141                6u16 => Attr::AddrRemote({
1142                    let res = Some(IterableAddress::with_loc(next, self.orig_loc));
1143                    let Some(val) = res else { break };
1144                    val
1145                }),
1146                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1147                n => continue,
1148            };
1149            return Some(Ok(res));
1150        }
1151        Some(Err(ErrorContext::new(
1152            "Attr",
1153            r#type.and_then(|t| Attr::attr_from_type(t)),
1154            self.orig_loc,
1155            self.buf.as_ptr().wrapping_add(pos) as usize,
1156        )))
1157    }
1158}
1159impl<'a> std::fmt::Debug for IterableAttr<'_> {
1160    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1161        let mut fmt = f.debug_struct("Attr");
1162        for attr in self.clone() {
1163            let attr = match attr {
1164                Ok(a) => a,
1165                Err(err) => {
1166                    fmt.finish()?;
1167                    f.write_str("Err(")?;
1168                    err.fmt(f)?;
1169                    return f.write_str(")");
1170                }
1171            };
1172            match attr {
1173                Attr::Addr(val) => fmt.field("Addr", &val),
1174                Attr::RcvAddAddrs(val) => fmt.field("RcvAddAddrs", &val),
1175                Attr::Subflows(val) => fmt.field("Subflows", &val),
1176                Attr::Token(val) => fmt.field("Token", &val),
1177                Attr::LocId(val) => fmt.field("LocId", &val),
1178                Attr::AddrRemote(val) => fmt.field("AddrRemote", &val),
1179            };
1180        }
1181        fmt.finish()
1182    }
1183}
1184impl IterableAttr<'_> {
1185    pub fn lookup_attr(
1186        &self,
1187        offset: usize,
1188        missing_type: Option<u16>,
1189    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1190        let mut stack = Vec::new();
1191        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1192        if missing_type.is_some() && cur == offset {
1193            stack.push(("Attr", offset));
1194            return (stack, missing_type.and_then(|t| Attr::attr_from_type(t)));
1195        }
1196        if cur > offset || cur + self.buf.len() < offset {
1197            return (stack, None);
1198        }
1199        let mut attrs = self.clone();
1200        let mut last_off = cur + attrs.pos;
1201        let mut missing = None;
1202        while let Some(attr) = attrs.next() {
1203            let Ok(attr) = attr else { break };
1204            match attr {
1205                Attr::Addr(val) => {
1206                    (stack, missing) = val.lookup_attr(offset, missing_type);
1207                    if !stack.is_empty() {
1208                        break;
1209                    }
1210                }
1211                Attr::RcvAddAddrs(val) => {
1212                    if last_off == offset {
1213                        stack.push(("RcvAddAddrs", last_off));
1214                        break;
1215                    }
1216                }
1217                Attr::Subflows(val) => {
1218                    if last_off == offset {
1219                        stack.push(("Subflows", last_off));
1220                        break;
1221                    }
1222                }
1223                Attr::Token(val) => {
1224                    if last_off == offset {
1225                        stack.push(("Token", last_off));
1226                        break;
1227                    }
1228                }
1229                Attr::LocId(val) => {
1230                    if last_off == offset {
1231                        stack.push(("LocId", last_off));
1232                        break;
1233                    }
1234                }
1235                Attr::AddrRemote(val) => {
1236                    (stack, missing) = val.lookup_attr(offset, missing_type);
1237                    if !stack.is_empty() {
1238                        break;
1239                    }
1240                }
1241                _ => {}
1242            };
1243            last_off = cur + attrs.pos;
1244        }
1245        if !stack.is_empty() {
1246            stack.push(("Attr", cur));
1247        }
1248        (stack, missing)
1249    }
1250}
1251#[derive(Clone)]
1252pub enum EventAttr<'a> {
1253    Token(u32),
1254    Family(u16),
1255    LocId(u8),
1256    RemId(u8),
1257    Saddr4(u32),
1258    Saddr6(&'a [u8]),
1259    Daddr4(u32),
1260    Daddr6(&'a [u8]),
1261    Sport(u16),
1262    Dport(u16),
1263    Backup(u8),
1264    Error(u8),
1265    Flags(u16),
1266    Timeout(u32),
1267    IfIdx(i32),
1268    ResetReason(u32),
1269    ResetFlags(u32),
1270    #[doc = "Deprecated: use \\'flags\\'\n"]
1271    ServerSide(u8),
1272}
1273impl<'a> IterableEventAttr<'a> {
1274    pub fn get_token(&self) -> Result<u32, ErrorContext> {
1275        let mut iter = self.clone();
1276        iter.pos = 0;
1277        for attr in iter {
1278            if let Ok(EventAttr::Token(val)) = attr {
1279                return Ok(val);
1280            }
1281        }
1282        Err(ErrorContext::new_missing(
1283            "EventAttr",
1284            "Token",
1285            self.orig_loc,
1286            self.buf.as_ptr() as usize,
1287        ))
1288    }
1289    pub fn get_family(&self) -> Result<u16, ErrorContext> {
1290        let mut iter = self.clone();
1291        iter.pos = 0;
1292        for attr in iter {
1293            if let Ok(EventAttr::Family(val)) = attr {
1294                return Ok(val);
1295            }
1296        }
1297        Err(ErrorContext::new_missing(
1298            "EventAttr",
1299            "Family",
1300            self.orig_loc,
1301            self.buf.as_ptr() as usize,
1302        ))
1303    }
1304    pub fn get_loc_id(&self) -> Result<u8, ErrorContext> {
1305        let mut iter = self.clone();
1306        iter.pos = 0;
1307        for attr in iter {
1308            if let Ok(EventAttr::LocId(val)) = attr {
1309                return Ok(val);
1310            }
1311        }
1312        Err(ErrorContext::new_missing(
1313            "EventAttr",
1314            "LocId",
1315            self.orig_loc,
1316            self.buf.as_ptr() as usize,
1317        ))
1318    }
1319    pub fn get_rem_id(&self) -> Result<u8, ErrorContext> {
1320        let mut iter = self.clone();
1321        iter.pos = 0;
1322        for attr in iter {
1323            if let Ok(EventAttr::RemId(val)) = attr {
1324                return Ok(val);
1325            }
1326        }
1327        Err(ErrorContext::new_missing(
1328            "EventAttr",
1329            "RemId",
1330            self.orig_loc,
1331            self.buf.as_ptr() as usize,
1332        ))
1333    }
1334    pub fn get_saddr4(&self) -> Result<u32, ErrorContext> {
1335        let mut iter = self.clone();
1336        iter.pos = 0;
1337        for attr in iter {
1338            if let Ok(EventAttr::Saddr4(val)) = attr {
1339                return Ok(val);
1340            }
1341        }
1342        Err(ErrorContext::new_missing(
1343            "EventAttr",
1344            "Saddr4",
1345            self.orig_loc,
1346            self.buf.as_ptr() as usize,
1347        ))
1348    }
1349    pub fn get_saddr6(&self) -> Result<&'a [u8], ErrorContext> {
1350        let mut iter = self.clone();
1351        iter.pos = 0;
1352        for attr in iter {
1353            if let Ok(EventAttr::Saddr6(val)) = attr {
1354                return Ok(val);
1355            }
1356        }
1357        Err(ErrorContext::new_missing(
1358            "EventAttr",
1359            "Saddr6",
1360            self.orig_loc,
1361            self.buf.as_ptr() as usize,
1362        ))
1363    }
1364    pub fn get_daddr4(&self) -> Result<u32, ErrorContext> {
1365        let mut iter = self.clone();
1366        iter.pos = 0;
1367        for attr in iter {
1368            if let Ok(EventAttr::Daddr4(val)) = attr {
1369                return Ok(val);
1370            }
1371        }
1372        Err(ErrorContext::new_missing(
1373            "EventAttr",
1374            "Daddr4",
1375            self.orig_loc,
1376            self.buf.as_ptr() as usize,
1377        ))
1378    }
1379    pub fn get_daddr6(&self) -> Result<&'a [u8], ErrorContext> {
1380        let mut iter = self.clone();
1381        iter.pos = 0;
1382        for attr in iter {
1383            if let Ok(EventAttr::Daddr6(val)) = attr {
1384                return Ok(val);
1385            }
1386        }
1387        Err(ErrorContext::new_missing(
1388            "EventAttr",
1389            "Daddr6",
1390            self.orig_loc,
1391            self.buf.as_ptr() as usize,
1392        ))
1393    }
1394    pub fn get_sport(&self) -> Result<u16, ErrorContext> {
1395        let mut iter = self.clone();
1396        iter.pos = 0;
1397        for attr in iter {
1398            if let Ok(EventAttr::Sport(val)) = attr {
1399                return Ok(val);
1400            }
1401        }
1402        Err(ErrorContext::new_missing(
1403            "EventAttr",
1404            "Sport",
1405            self.orig_loc,
1406            self.buf.as_ptr() as usize,
1407        ))
1408    }
1409    pub fn get_dport(&self) -> Result<u16, ErrorContext> {
1410        let mut iter = self.clone();
1411        iter.pos = 0;
1412        for attr in iter {
1413            if let Ok(EventAttr::Dport(val)) = attr {
1414                return Ok(val);
1415            }
1416        }
1417        Err(ErrorContext::new_missing(
1418            "EventAttr",
1419            "Dport",
1420            self.orig_loc,
1421            self.buf.as_ptr() as usize,
1422        ))
1423    }
1424    pub fn get_backup(&self) -> Result<u8, ErrorContext> {
1425        let mut iter = self.clone();
1426        iter.pos = 0;
1427        for attr in iter {
1428            if let Ok(EventAttr::Backup(val)) = attr {
1429                return Ok(val);
1430            }
1431        }
1432        Err(ErrorContext::new_missing(
1433            "EventAttr",
1434            "Backup",
1435            self.orig_loc,
1436            self.buf.as_ptr() as usize,
1437        ))
1438    }
1439    pub fn get_error(&self) -> Result<u8, ErrorContext> {
1440        let mut iter = self.clone();
1441        iter.pos = 0;
1442        for attr in iter {
1443            if let Ok(EventAttr::Error(val)) = attr {
1444                return Ok(val);
1445            }
1446        }
1447        Err(ErrorContext::new_missing(
1448            "EventAttr",
1449            "Error",
1450            self.orig_loc,
1451            self.buf.as_ptr() as usize,
1452        ))
1453    }
1454    pub fn get_flags(&self) -> Result<u16, ErrorContext> {
1455        let mut iter = self.clone();
1456        iter.pos = 0;
1457        for attr in iter {
1458            if let Ok(EventAttr::Flags(val)) = attr {
1459                return Ok(val);
1460            }
1461        }
1462        Err(ErrorContext::new_missing(
1463            "EventAttr",
1464            "Flags",
1465            self.orig_loc,
1466            self.buf.as_ptr() as usize,
1467        ))
1468    }
1469    pub fn get_timeout(&self) -> Result<u32, ErrorContext> {
1470        let mut iter = self.clone();
1471        iter.pos = 0;
1472        for attr in iter {
1473            if let Ok(EventAttr::Timeout(val)) = attr {
1474                return Ok(val);
1475            }
1476        }
1477        Err(ErrorContext::new_missing(
1478            "EventAttr",
1479            "Timeout",
1480            self.orig_loc,
1481            self.buf.as_ptr() as usize,
1482        ))
1483    }
1484    pub fn get_if_idx(&self) -> Result<i32, ErrorContext> {
1485        let mut iter = self.clone();
1486        iter.pos = 0;
1487        for attr in iter {
1488            if let Ok(EventAttr::IfIdx(val)) = attr {
1489                return Ok(val);
1490            }
1491        }
1492        Err(ErrorContext::new_missing(
1493            "EventAttr",
1494            "IfIdx",
1495            self.orig_loc,
1496            self.buf.as_ptr() as usize,
1497        ))
1498    }
1499    pub fn get_reset_reason(&self) -> Result<u32, ErrorContext> {
1500        let mut iter = self.clone();
1501        iter.pos = 0;
1502        for attr in iter {
1503            if let Ok(EventAttr::ResetReason(val)) = attr {
1504                return Ok(val);
1505            }
1506        }
1507        Err(ErrorContext::new_missing(
1508            "EventAttr",
1509            "ResetReason",
1510            self.orig_loc,
1511            self.buf.as_ptr() as usize,
1512        ))
1513    }
1514    pub fn get_reset_flags(&self) -> Result<u32, ErrorContext> {
1515        let mut iter = self.clone();
1516        iter.pos = 0;
1517        for attr in iter {
1518            if let Ok(EventAttr::ResetFlags(val)) = attr {
1519                return Ok(val);
1520            }
1521        }
1522        Err(ErrorContext::new_missing(
1523            "EventAttr",
1524            "ResetFlags",
1525            self.orig_loc,
1526            self.buf.as_ptr() as usize,
1527        ))
1528    }
1529    #[doc = "Deprecated: use \\'flags\\'\n"]
1530    pub fn get_server_side(&self) -> Result<u8, ErrorContext> {
1531        let mut iter = self.clone();
1532        iter.pos = 0;
1533        for attr in iter {
1534            if let Ok(EventAttr::ServerSide(val)) = attr {
1535                return Ok(val);
1536            }
1537        }
1538        Err(ErrorContext::new_missing(
1539            "EventAttr",
1540            "ServerSide",
1541            self.orig_loc,
1542            self.buf.as_ptr() as usize,
1543        ))
1544    }
1545}
1546impl EventAttr<'_> {
1547    pub fn new<'a>(buf: &'a [u8]) -> IterableEventAttr<'a> {
1548        IterableEventAttr::with_loc(buf, buf.as_ptr() as usize)
1549    }
1550    fn attr_from_type(r#type: u16) -> Option<&'static str> {
1551        let res = match r#type {
1552            0u16 => "Unspec",
1553            1u16 => "Token",
1554            2u16 => "Family",
1555            3u16 => "LocId",
1556            4u16 => "RemId",
1557            5u16 => "Saddr4",
1558            6u16 => "Saddr6",
1559            7u16 => "Daddr4",
1560            8u16 => "Daddr6",
1561            9u16 => "Sport",
1562            10u16 => "Dport",
1563            11u16 => "Backup",
1564            12u16 => "Error",
1565            13u16 => "Flags",
1566            14u16 => "Timeout",
1567            15u16 => "IfIdx",
1568            16u16 => "ResetReason",
1569            17u16 => "ResetFlags",
1570            18u16 => "ServerSide",
1571            _ => return None,
1572        };
1573        Some(res)
1574    }
1575}
1576#[derive(Clone, Copy, Default)]
1577pub struct IterableEventAttr<'a> {
1578    buf: &'a [u8],
1579    pos: usize,
1580    orig_loc: usize,
1581}
1582impl<'a> IterableEventAttr<'a> {
1583    fn with_loc(buf: &'a [u8], orig_loc: usize) -> Self {
1584        Self {
1585            buf,
1586            pos: 0,
1587            orig_loc,
1588        }
1589    }
1590    pub fn get_buf(&self) -> &'a [u8] {
1591        self.buf
1592    }
1593}
1594impl<'a> Iterator for IterableEventAttr<'a> {
1595    type Item = Result<EventAttr<'a>, ErrorContext>;
1596    fn next(&mut self) -> Option<Self::Item> {
1597        let mut pos;
1598        let mut r#type;
1599        loop {
1600            pos = self.pos;
1601            r#type = None;
1602            if self.buf.len() == self.pos {
1603                return None;
1604            }
1605            let Some((header, next)) = chop_header(self.buf, &mut self.pos) else {
1606                self.pos = self.buf.len();
1607                break;
1608            };
1609            r#type = Some(header.r#type);
1610            let res = match header.r#type {
1611                1u16 => EventAttr::Token({
1612                    let res = parse_u32(next);
1613                    let Some(val) = res else { break };
1614                    val
1615                }),
1616                2u16 => EventAttr::Family({
1617                    let res = parse_u16(next);
1618                    let Some(val) = res else { break };
1619                    val
1620                }),
1621                3u16 => EventAttr::LocId({
1622                    let res = parse_u8(next);
1623                    let Some(val) = res else { break };
1624                    val
1625                }),
1626                4u16 => EventAttr::RemId({
1627                    let res = parse_u8(next);
1628                    let Some(val) = res else { break };
1629                    val
1630                }),
1631                5u16 => EventAttr::Saddr4({
1632                    let res = parse_be_u32(next);
1633                    let Some(val) = res else { break };
1634                    val
1635                }),
1636                6u16 => EventAttr::Saddr6({
1637                    let res = Some(next);
1638                    let Some(val) = res else { break };
1639                    val
1640                }),
1641                7u16 => EventAttr::Daddr4({
1642                    let res = parse_be_u32(next);
1643                    let Some(val) = res else { break };
1644                    val
1645                }),
1646                8u16 => EventAttr::Daddr6({
1647                    let res = Some(next);
1648                    let Some(val) = res else { break };
1649                    val
1650                }),
1651                9u16 => EventAttr::Sport({
1652                    let res = parse_be_u16(next);
1653                    let Some(val) = res else { break };
1654                    val
1655                }),
1656                10u16 => EventAttr::Dport({
1657                    let res = parse_be_u16(next);
1658                    let Some(val) = res else { break };
1659                    val
1660                }),
1661                11u16 => EventAttr::Backup({
1662                    let res = parse_u8(next);
1663                    let Some(val) = res else { break };
1664                    val
1665                }),
1666                12u16 => EventAttr::Error({
1667                    let res = parse_u8(next);
1668                    let Some(val) = res else { break };
1669                    val
1670                }),
1671                13u16 => EventAttr::Flags({
1672                    let res = parse_u16(next);
1673                    let Some(val) = res else { break };
1674                    val
1675                }),
1676                14u16 => EventAttr::Timeout({
1677                    let res = parse_u32(next);
1678                    let Some(val) = res else { break };
1679                    val
1680                }),
1681                15u16 => EventAttr::IfIdx({
1682                    let res = parse_i32(next);
1683                    let Some(val) = res else { break };
1684                    val
1685                }),
1686                16u16 => EventAttr::ResetReason({
1687                    let res = parse_u32(next);
1688                    let Some(val) = res else { break };
1689                    val
1690                }),
1691                17u16 => EventAttr::ResetFlags({
1692                    let res = parse_u32(next);
1693                    let Some(val) = res else { break };
1694                    val
1695                }),
1696                18u16 => EventAttr::ServerSide({
1697                    let res = parse_u8(next);
1698                    let Some(val) = res else { break };
1699                    val
1700                }),
1701                n if cfg!(any(test, feature = "deny-unknown-attrs")) => break,
1702                n => continue,
1703            };
1704            return Some(Ok(res));
1705        }
1706        Some(Err(ErrorContext::new(
1707            "EventAttr",
1708            r#type.and_then(|t| EventAttr::attr_from_type(t)),
1709            self.orig_loc,
1710            self.buf.as_ptr().wrapping_add(pos) as usize,
1711        )))
1712    }
1713}
1714impl<'a> std::fmt::Debug for IterableEventAttr<'_> {
1715    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
1716        let mut fmt = f.debug_struct("EventAttr");
1717        for attr in self.clone() {
1718            let attr = match attr {
1719                Ok(a) => a,
1720                Err(err) => {
1721                    fmt.finish()?;
1722                    f.write_str("Err(")?;
1723                    err.fmt(f)?;
1724                    return f.write_str(")");
1725                }
1726            };
1727            match attr {
1728                EventAttr::Token(val) => fmt.field("Token", &val),
1729                EventAttr::Family(val) => fmt.field("Family", &val),
1730                EventAttr::LocId(val) => fmt.field("LocId", &val),
1731                EventAttr::RemId(val) => fmt.field("RemId", &val),
1732                EventAttr::Saddr4(val) => fmt.field("Saddr4", &val),
1733                EventAttr::Saddr6(val) => fmt.field("Saddr6", &val),
1734                EventAttr::Daddr4(val) => fmt.field("Daddr4", &val),
1735                EventAttr::Daddr6(val) => fmt.field("Daddr6", &val),
1736                EventAttr::Sport(val) => fmt.field("Sport", &val),
1737                EventAttr::Dport(val) => fmt.field("Dport", &val),
1738                EventAttr::Backup(val) => fmt.field("Backup", &val),
1739                EventAttr::Error(val) => fmt.field("Error", &val),
1740                EventAttr::Flags(val) => fmt.field("Flags", &val),
1741                EventAttr::Timeout(val) => fmt.field("Timeout", &val),
1742                EventAttr::IfIdx(val) => fmt.field("IfIdx", &val),
1743                EventAttr::ResetReason(val) => fmt.field("ResetReason", &val),
1744                EventAttr::ResetFlags(val) => fmt.field("ResetFlags", &val),
1745                EventAttr::ServerSide(val) => fmt.field("ServerSide", &val),
1746            };
1747        }
1748        fmt.finish()
1749    }
1750}
1751impl IterableEventAttr<'_> {
1752    pub fn lookup_attr(
1753        &self,
1754        offset: usize,
1755        missing_type: Option<u16>,
1756    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
1757        let mut stack = Vec::new();
1758        let cur = ErrorContext::calc_offset(self.orig_loc, self.buf.as_ptr() as usize);
1759        if missing_type.is_some() && cur == offset {
1760            stack.push(("EventAttr", offset));
1761            return (
1762                stack,
1763                missing_type.and_then(|t| EventAttr::attr_from_type(t)),
1764            );
1765        }
1766        if cur > offset || cur + self.buf.len() < offset {
1767            return (stack, None);
1768        }
1769        let mut attrs = self.clone();
1770        let mut last_off = cur + attrs.pos;
1771        while let Some(attr) = attrs.next() {
1772            let Ok(attr) = attr else { break };
1773            match attr {
1774                EventAttr::Token(val) => {
1775                    if last_off == offset {
1776                        stack.push(("Token", last_off));
1777                        break;
1778                    }
1779                }
1780                EventAttr::Family(val) => {
1781                    if last_off == offset {
1782                        stack.push(("Family", last_off));
1783                        break;
1784                    }
1785                }
1786                EventAttr::LocId(val) => {
1787                    if last_off == offset {
1788                        stack.push(("LocId", last_off));
1789                        break;
1790                    }
1791                }
1792                EventAttr::RemId(val) => {
1793                    if last_off == offset {
1794                        stack.push(("RemId", last_off));
1795                        break;
1796                    }
1797                }
1798                EventAttr::Saddr4(val) => {
1799                    if last_off == offset {
1800                        stack.push(("Saddr4", last_off));
1801                        break;
1802                    }
1803                }
1804                EventAttr::Saddr6(val) => {
1805                    if last_off == offset {
1806                        stack.push(("Saddr6", last_off));
1807                        break;
1808                    }
1809                }
1810                EventAttr::Daddr4(val) => {
1811                    if last_off == offset {
1812                        stack.push(("Daddr4", last_off));
1813                        break;
1814                    }
1815                }
1816                EventAttr::Daddr6(val) => {
1817                    if last_off == offset {
1818                        stack.push(("Daddr6", last_off));
1819                        break;
1820                    }
1821                }
1822                EventAttr::Sport(val) => {
1823                    if last_off == offset {
1824                        stack.push(("Sport", last_off));
1825                        break;
1826                    }
1827                }
1828                EventAttr::Dport(val) => {
1829                    if last_off == offset {
1830                        stack.push(("Dport", last_off));
1831                        break;
1832                    }
1833                }
1834                EventAttr::Backup(val) => {
1835                    if last_off == offset {
1836                        stack.push(("Backup", last_off));
1837                        break;
1838                    }
1839                }
1840                EventAttr::Error(val) => {
1841                    if last_off == offset {
1842                        stack.push(("Error", last_off));
1843                        break;
1844                    }
1845                }
1846                EventAttr::Flags(val) => {
1847                    if last_off == offset {
1848                        stack.push(("Flags", last_off));
1849                        break;
1850                    }
1851                }
1852                EventAttr::Timeout(val) => {
1853                    if last_off == offset {
1854                        stack.push(("Timeout", last_off));
1855                        break;
1856                    }
1857                }
1858                EventAttr::IfIdx(val) => {
1859                    if last_off == offset {
1860                        stack.push(("IfIdx", last_off));
1861                        break;
1862                    }
1863                }
1864                EventAttr::ResetReason(val) => {
1865                    if last_off == offset {
1866                        stack.push(("ResetReason", last_off));
1867                        break;
1868                    }
1869                }
1870                EventAttr::ResetFlags(val) => {
1871                    if last_off == offset {
1872                        stack.push(("ResetFlags", last_off));
1873                        break;
1874                    }
1875                }
1876                EventAttr::ServerSide(val) => {
1877                    if last_off == offset {
1878                        stack.push(("ServerSide", last_off));
1879                        break;
1880                    }
1881                }
1882                _ => {}
1883            };
1884            last_off = cur + attrs.pos;
1885        }
1886        if !stack.is_empty() {
1887            stack.push(("EventAttr", cur));
1888        }
1889        (stack, None)
1890    }
1891}
1892pub struct PushAddress<Prev: Pusher> {
1893    pub(crate) prev: Option<Prev>,
1894    pub(crate) header_offset: Option<usize>,
1895}
1896impl<Prev: Pusher> Pusher for PushAddress<Prev> {
1897    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
1898        self.prev.as_mut().unwrap().as_vec_mut()
1899    }
1900    fn as_vec(&self) -> &Vec<u8> {
1901        self.prev.as_ref().unwrap().as_vec()
1902    }
1903}
1904impl<Prev: Pusher> PushAddress<Prev> {
1905    pub fn new(prev: Prev) -> Self {
1906        Self {
1907            prev: Some(prev),
1908            header_offset: None,
1909        }
1910    }
1911    pub fn end_nested(mut self) -> Prev {
1912        let mut prev = self.prev.take().unwrap();
1913        if let Some(header_offset) = &self.header_offset {
1914            finalize_nested_header(prev.as_vec_mut(), *header_offset);
1915        }
1916        prev
1917    }
1918    pub fn push_family(mut self, value: u16) -> Self {
1919        push_header(self.as_vec_mut(), 1u16, 2 as u16);
1920        self.as_vec_mut().extend(value.to_ne_bytes());
1921        self
1922    }
1923    pub fn push_id(mut self, value: u8) -> Self {
1924        push_header(self.as_vec_mut(), 2u16, 1 as u16);
1925        self.as_vec_mut().extend(value.to_ne_bytes());
1926        self
1927    }
1928    pub fn push_addr4(mut self, value: u32) -> Self {
1929        push_header(self.as_vec_mut(), 3u16, 4 as u16);
1930        self.as_vec_mut().extend(value.to_be_bytes());
1931        self
1932    }
1933    pub fn push_addr6(mut self, value: &[u8]) -> Self {
1934        push_header(self.as_vec_mut(), 4u16, value.len() as u16);
1935        self.as_vec_mut().extend(value);
1936        self
1937    }
1938    pub fn push_port(mut self, value: u16) -> Self {
1939        push_header(self.as_vec_mut(), 5u16, 2 as u16);
1940        self.as_vec_mut().extend(value.to_ne_bytes());
1941        self
1942    }
1943    pub fn push_flags(mut self, value: u32) -> Self {
1944        push_header(self.as_vec_mut(), 6u16, 4 as u16);
1945        self.as_vec_mut().extend(value.to_ne_bytes());
1946        self
1947    }
1948    pub fn push_if_idx(mut self, value: i32) -> Self {
1949        push_header(self.as_vec_mut(), 7u16, 4 as u16);
1950        self.as_vec_mut().extend(value.to_ne_bytes());
1951        self
1952    }
1953}
1954impl<Prev: Pusher> Drop for PushAddress<Prev> {
1955    fn drop(&mut self) {
1956        if let Some(prev) = &mut self.prev {
1957            if let Some(header_offset) = &self.header_offset {
1958                finalize_nested_header(prev.as_vec_mut(), *header_offset);
1959            }
1960        }
1961    }
1962}
1963pub struct PushSubflowAttribute<Prev: Pusher> {
1964    pub(crate) prev: Option<Prev>,
1965    pub(crate) header_offset: Option<usize>,
1966}
1967impl<Prev: Pusher> Pusher for PushSubflowAttribute<Prev> {
1968    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
1969        self.prev.as_mut().unwrap().as_vec_mut()
1970    }
1971    fn as_vec(&self) -> &Vec<u8> {
1972        self.prev.as_ref().unwrap().as_vec()
1973    }
1974}
1975impl<Prev: Pusher> PushSubflowAttribute<Prev> {
1976    pub fn new(prev: Prev) -> Self {
1977        Self {
1978            prev: Some(prev),
1979            header_offset: None,
1980        }
1981    }
1982    pub fn end_nested(mut self) -> Prev {
1983        let mut prev = self.prev.take().unwrap();
1984        if let Some(header_offset) = &self.header_offset {
1985            finalize_nested_header(prev.as_vec_mut(), *header_offset);
1986        }
1987        prev
1988    }
1989    pub fn push_token_rem(mut self, value: u32) -> Self {
1990        push_header(self.as_vec_mut(), 1u16, 4 as u16);
1991        self.as_vec_mut().extend(value.to_ne_bytes());
1992        self
1993    }
1994    pub fn push_token_loc(mut self, value: u32) -> Self {
1995        push_header(self.as_vec_mut(), 2u16, 4 as u16);
1996        self.as_vec_mut().extend(value.to_ne_bytes());
1997        self
1998    }
1999    pub fn push_relwrite_seq(mut self, value: u32) -> Self {
2000        push_header(self.as_vec_mut(), 3u16, 4 as u16);
2001        self.as_vec_mut().extend(value.to_ne_bytes());
2002        self
2003    }
2004    pub fn push_map_seq(mut self, value: u64) -> Self {
2005        push_header(self.as_vec_mut(), 4u16, 8 as u16);
2006        self.as_vec_mut().extend(value.to_ne_bytes());
2007        self
2008    }
2009    pub fn push_map_sfseq(mut self, value: u32) -> Self {
2010        push_header(self.as_vec_mut(), 5u16, 4 as u16);
2011        self.as_vec_mut().extend(value.to_ne_bytes());
2012        self
2013    }
2014    pub fn push_ssn_offset(mut self, value: u32) -> Self {
2015        push_header(self.as_vec_mut(), 6u16, 4 as u16);
2016        self.as_vec_mut().extend(value.to_ne_bytes());
2017        self
2018    }
2019    pub fn push_map_datalen(mut self, value: u16) -> Self {
2020        push_header(self.as_vec_mut(), 7u16, 2 as u16);
2021        self.as_vec_mut().extend(value.to_ne_bytes());
2022        self
2023    }
2024    pub fn push_flags(mut self, value: u32) -> Self {
2025        push_header(self.as_vec_mut(), 8u16, 4 as u16);
2026        self.as_vec_mut().extend(value.to_ne_bytes());
2027        self
2028    }
2029    pub fn push_id_rem(mut self, value: u8) -> Self {
2030        push_header(self.as_vec_mut(), 9u16, 1 as u16);
2031        self.as_vec_mut().extend(value.to_ne_bytes());
2032        self
2033    }
2034    pub fn push_id_loc(mut self, value: u8) -> Self {
2035        push_header(self.as_vec_mut(), 10u16, 1 as u16);
2036        self.as_vec_mut().extend(value.to_ne_bytes());
2037        self
2038    }
2039    pub fn push_pad(mut self, value: &[u8]) -> Self {
2040        push_header(self.as_vec_mut(), 11u16, value.len() as u16);
2041        self.as_vec_mut().extend(value);
2042        self
2043    }
2044}
2045impl<Prev: Pusher> Drop for PushSubflowAttribute<Prev> {
2046    fn drop(&mut self) {
2047        if let Some(prev) = &mut self.prev {
2048            if let Some(header_offset) = &self.header_offset {
2049                finalize_nested_header(prev.as_vec_mut(), *header_offset);
2050            }
2051        }
2052    }
2053}
2054pub struct PushEndpoint<Prev: Pusher> {
2055    pub(crate) prev: Option<Prev>,
2056    pub(crate) header_offset: Option<usize>,
2057}
2058impl<Prev: Pusher> Pusher for PushEndpoint<Prev> {
2059    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
2060        self.prev.as_mut().unwrap().as_vec_mut()
2061    }
2062    fn as_vec(&self) -> &Vec<u8> {
2063        self.prev.as_ref().unwrap().as_vec()
2064    }
2065}
2066impl<Prev: Pusher> PushEndpoint<Prev> {
2067    pub fn new(prev: Prev) -> Self {
2068        Self {
2069            prev: Some(prev),
2070            header_offset: None,
2071        }
2072    }
2073    pub fn end_nested(mut self) -> Prev {
2074        let mut prev = self.prev.take().unwrap();
2075        if let Some(header_offset) = &self.header_offset {
2076            finalize_nested_header(prev.as_vec_mut(), *header_offset);
2077        }
2078        prev
2079    }
2080    pub fn nested_addr(mut self) -> PushAddress<Self> {
2081        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
2082        PushAddress {
2083            prev: Some(self),
2084            header_offset: Some(header_offset),
2085        }
2086    }
2087}
2088impl<Prev: Pusher> Drop for PushEndpoint<Prev> {
2089    fn drop(&mut self) {
2090        if let Some(prev) = &mut self.prev {
2091            if let Some(header_offset) = &self.header_offset {
2092                finalize_nested_header(prev.as_vec_mut(), *header_offset);
2093            }
2094        }
2095    }
2096}
2097pub struct PushAttr<Prev: Pusher> {
2098    pub(crate) prev: Option<Prev>,
2099    pub(crate) header_offset: Option<usize>,
2100}
2101impl<Prev: Pusher> Pusher for PushAttr<Prev> {
2102    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
2103        self.prev.as_mut().unwrap().as_vec_mut()
2104    }
2105    fn as_vec(&self) -> &Vec<u8> {
2106        self.prev.as_ref().unwrap().as_vec()
2107    }
2108}
2109impl<Prev: Pusher> PushAttr<Prev> {
2110    pub fn new(prev: Prev) -> Self {
2111        Self {
2112            prev: Some(prev),
2113            header_offset: None,
2114        }
2115    }
2116    pub fn end_nested(mut self) -> Prev {
2117        let mut prev = self.prev.take().unwrap();
2118        if let Some(header_offset) = &self.header_offset {
2119            finalize_nested_header(prev.as_vec_mut(), *header_offset);
2120        }
2121        prev
2122    }
2123    pub fn nested_addr(mut self) -> PushAddress<Self> {
2124        let header_offset = push_nested_header(self.as_vec_mut(), 1u16);
2125        PushAddress {
2126            prev: Some(self),
2127            header_offset: Some(header_offset),
2128        }
2129    }
2130    pub fn push_rcv_add_addrs(mut self, value: u32) -> Self {
2131        push_header(self.as_vec_mut(), 2u16, 4 as u16);
2132        self.as_vec_mut().extend(value.to_ne_bytes());
2133        self
2134    }
2135    pub fn push_subflows(mut self, value: u32) -> Self {
2136        push_header(self.as_vec_mut(), 3u16, 4 as u16);
2137        self.as_vec_mut().extend(value.to_ne_bytes());
2138        self
2139    }
2140    pub fn push_token(mut self, value: u32) -> Self {
2141        push_header(self.as_vec_mut(), 4u16, 4 as u16);
2142        self.as_vec_mut().extend(value.to_ne_bytes());
2143        self
2144    }
2145    pub fn push_loc_id(mut self, value: u8) -> Self {
2146        push_header(self.as_vec_mut(), 5u16, 1 as u16);
2147        self.as_vec_mut().extend(value.to_ne_bytes());
2148        self
2149    }
2150    pub fn nested_addr_remote(mut self) -> PushAddress<Self> {
2151        let header_offset = push_nested_header(self.as_vec_mut(), 6u16);
2152        PushAddress {
2153            prev: Some(self),
2154            header_offset: Some(header_offset),
2155        }
2156    }
2157}
2158impl<Prev: Pusher> Drop for PushAttr<Prev> {
2159    fn drop(&mut self) {
2160        if let Some(prev) = &mut self.prev {
2161            if let Some(header_offset) = &self.header_offset {
2162                finalize_nested_header(prev.as_vec_mut(), *header_offset);
2163            }
2164        }
2165    }
2166}
2167pub struct PushEventAttr<Prev: Pusher> {
2168    pub(crate) prev: Option<Prev>,
2169    pub(crate) header_offset: Option<usize>,
2170}
2171impl<Prev: Pusher> Pusher for PushEventAttr<Prev> {
2172    fn as_vec_mut(&mut self) -> &mut Vec<u8> {
2173        self.prev.as_mut().unwrap().as_vec_mut()
2174    }
2175    fn as_vec(&self) -> &Vec<u8> {
2176        self.prev.as_ref().unwrap().as_vec()
2177    }
2178}
2179impl<Prev: Pusher> PushEventAttr<Prev> {
2180    pub fn new(prev: Prev) -> Self {
2181        Self {
2182            prev: Some(prev),
2183            header_offset: None,
2184        }
2185    }
2186    pub fn end_nested(mut self) -> Prev {
2187        let mut prev = self.prev.take().unwrap();
2188        if let Some(header_offset) = &self.header_offset {
2189            finalize_nested_header(prev.as_vec_mut(), *header_offset);
2190        }
2191        prev
2192    }
2193    pub fn push_token(mut self, value: u32) -> Self {
2194        push_header(self.as_vec_mut(), 1u16, 4 as u16);
2195        self.as_vec_mut().extend(value.to_ne_bytes());
2196        self
2197    }
2198    pub fn push_family(mut self, value: u16) -> Self {
2199        push_header(self.as_vec_mut(), 2u16, 2 as u16);
2200        self.as_vec_mut().extend(value.to_ne_bytes());
2201        self
2202    }
2203    pub fn push_loc_id(mut self, value: u8) -> Self {
2204        push_header(self.as_vec_mut(), 3u16, 1 as u16);
2205        self.as_vec_mut().extend(value.to_ne_bytes());
2206        self
2207    }
2208    pub fn push_rem_id(mut self, value: u8) -> Self {
2209        push_header(self.as_vec_mut(), 4u16, 1 as u16);
2210        self.as_vec_mut().extend(value.to_ne_bytes());
2211        self
2212    }
2213    pub fn push_saddr4(mut self, value: u32) -> Self {
2214        push_header(self.as_vec_mut(), 5u16, 4 as u16);
2215        self.as_vec_mut().extend(value.to_be_bytes());
2216        self
2217    }
2218    pub fn push_saddr6(mut self, value: &[u8]) -> Self {
2219        push_header(self.as_vec_mut(), 6u16, value.len() as u16);
2220        self.as_vec_mut().extend(value);
2221        self
2222    }
2223    pub fn push_daddr4(mut self, value: u32) -> Self {
2224        push_header(self.as_vec_mut(), 7u16, 4 as u16);
2225        self.as_vec_mut().extend(value.to_be_bytes());
2226        self
2227    }
2228    pub fn push_daddr6(mut self, value: &[u8]) -> Self {
2229        push_header(self.as_vec_mut(), 8u16, value.len() as u16);
2230        self.as_vec_mut().extend(value);
2231        self
2232    }
2233    pub fn push_sport(mut self, value: u16) -> Self {
2234        push_header(self.as_vec_mut(), 9u16, 2 as u16);
2235        self.as_vec_mut().extend(value.to_be_bytes());
2236        self
2237    }
2238    pub fn push_dport(mut self, value: u16) -> Self {
2239        push_header(self.as_vec_mut(), 10u16, 2 as u16);
2240        self.as_vec_mut().extend(value.to_be_bytes());
2241        self
2242    }
2243    pub fn push_backup(mut self, value: u8) -> Self {
2244        push_header(self.as_vec_mut(), 11u16, 1 as u16);
2245        self.as_vec_mut().extend(value.to_ne_bytes());
2246        self
2247    }
2248    pub fn push_error(mut self, value: u8) -> Self {
2249        push_header(self.as_vec_mut(), 12u16, 1 as u16);
2250        self.as_vec_mut().extend(value.to_ne_bytes());
2251        self
2252    }
2253    pub fn push_flags(mut self, value: u16) -> Self {
2254        push_header(self.as_vec_mut(), 13u16, 2 as u16);
2255        self.as_vec_mut().extend(value.to_ne_bytes());
2256        self
2257    }
2258    pub fn push_timeout(mut self, value: u32) -> Self {
2259        push_header(self.as_vec_mut(), 14u16, 4 as u16);
2260        self.as_vec_mut().extend(value.to_ne_bytes());
2261        self
2262    }
2263    pub fn push_if_idx(mut self, value: i32) -> Self {
2264        push_header(self.as_vec_mut(), 15u16, 4 as u16);
2265        self.as_vec_mut().extend(value.to_ne_bytes());
2266        self
2267    }
2268    pub fn push_reset_reason(mut self, value: u32) -> Self {
2269        push_header(self.as_vec_mut(), 16u16, 4 as u16);
2270        self.as_vec_mut().extend(value.to_ne_bytes());
2271        self
2272    }
2273    pub fn push_reset_flags(mut self, value: u32) -> Self {
2274        push_header(self.as_vec_mut(), 17u16, 4 as u16);
2275        self.as_vec_mut().extend(value.to_ne_bytes());
2276        self
2277    }
2278    #[doc = "Deprecated: use \\'flags\\'\n"]
2279    pub fn push_server_side(mut self, value: u8) -> Self {
2280        push_header(self.as_vec_mut(), 18u16, 1 as u16);
2281        self.as_vec_mut().extend(value.to_ne_bytes());
2282        self
2283    }
2284}
2285impl<Prev: Pusher> Drop for PushEventAttr<Prev> {
2286    fn drop(&mut self) {
2287        if let Some(prev) = &mut self.prev {
2288            if let Some(header_offset) = &self.header_offset {
2289                finalize_nested_header(prev.as_vec_mut(), *header_offset);
2290            }
2291        }
2292    }
2293}
2294#[doc = "Add endpoint\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushEndpoint::nested_addr)\n\n"]
2295#[derive(Debug)]
2296pub struct OpAddAddrDo<'r> {
2297    request: Request<'r>,
2298}
2299impl<'r> OpAddAddrDo<'r> {
2300    pub fn new(mut request: Request<'r>) -> Self {
2301        Self::write_header(request.buf_mut());
2302        Self { request: request }
2303    }
2304    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushEndpoint<&'buf mut Vec<u8>> {
2305        Self::write_header(buf);
2306        PushEndpoint::new(buf)
2307    }
2308    pub fn encode(&mut self) -> PushEndpoint<&mut Vec<u8>> {
2309        PushEndpoint::new(self.request.buf_mut())
2310    }
2311    pub fn into_encoder(self) -> PushEndpoint<RequestBuf<'r>> {
2312        PushEndpoint::new(self.request.buf)
2313    }
2314    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableEndpoint<'a> {
2315        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2316        IterableEndpoint::with_loc(attrs, buf.as_ptr() as usize)
2317    }
2318    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2319        let mut header = BuiltinNfgenmsg::new();
2320        header.cmd = 1u8;
2321        header.version = 1u8;
2322        prev.as_vec_mut().extend(header.as_slice());
2323    }
2324}
2325impl NetlinkRequest for OpAddAddrDo<'_> {
2326    fn protocol(&self) -> Protocol {
2327        Protocol::Generic("mptcp_pm".as_bytes())
2328    }
2329    fn flags(&self) -> u16 {
2330        self.request.flags
2331    }
2332    fn payload(&self) -> &[u8] {
2333        self.request.buf()
2334    }
2335    type ReplyType<'buf> = IterableEndpoint<'buf>;
2336    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2337        Self::decode_request(buf)
2338    }
2339    fn lookup(
2340        buf: &[u8],
2341        offset: usize,
2342        missing_type: Option<u16>,
2343    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2344        Self::decode_request(buf).lookup_attr(offset, missing_type)
2345    }
2346}
2347#[doc = "Delete endpoint\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushEndpoint::nested_addr)\n\n"]
2348#[derive(Debug)]
2349pub struct OpDelAddrDo<'r> {
2350    request: Request<'r>,
2351}
2352impl<'r> OpDelAddrDo<'r> {
2353    pub fn new(mut request: Request<'r>) -> Self {
2354        Self::write_header(request.buf_mut());
2355        Self { request: request }
2356    }
2357    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushEndpoint<&'buf mut Vec<u8>> {
2358        Self::write_header(buf);
2359        PushEndpoint::new(buf)
2360    }
2361    pub fn encode(&mut self) -> PushEndpoint<&mut Vec<u8>> {
2362        PushEndpoint::new(self.request.buf_mut())
2363    }
2364    pub fn into_encoder(self) -> PushEndpoint<RequestBuf<'r>> {
2365        PushEndpoint::new(self.request.buf)
2366    }
2367    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableEndpoint<'a> {
2368        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2369        IterableEndpoint::with_loc(attrs, buf.as_ptr() as usize)
2370    }
2371    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2372        let mut header = BuiltinNfgenmsg::new();
2373        header.cmd = 2u8;
2374        header.version = 1u8;
2375        prev.as_vec_mut().extend(header.as_slice());
2376    }
2377}
2378impl NetlinkRequest for OpDelAddrDo<'_> {
2379    fn protocol(&self) -> Protocol {
2380        Protocol::Generic("mptcp_pm".as_bytes())
2381    }
2382    fn flags(&self) -> u16 {
2383        self.request.flags
2384    }
2385    fn payload(&self) -> &[u8] {
2386        self.request.buf()
2387    }
2388    type ReplyType<'buf> = IterableEndpoint<'buf>;
2389    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2390        Self::decode_request(buf)
2391    }
2392    fn lookup(
2393        buf: &[u8],
2394        offset: usize,
2395        missing_type: Option<u16>,
2396    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2397        Self::decode_request(buf).lookup_attr(offset, missing_type)
2398    }
2399}
2400#[doc = "Get endpoint information\n\nReply attributes:\n- [.get_addr()](IterableAttr::get_addr)\n\n"]
2401#[derive(Debug)]
2402pub struct OpGetAddrDump<'r> {
2403    request: Request<'r>,
2404}
2405impl<'r> OpGetAddrDump<'r> {
2406    pub fn new(mut request: Request<'r>) -> Self {
2407        Self::write_header(request.buf_mut());
2408        Self {
2409            request: request.set_dump(),
2410        }
2411    }
2412    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushAttr<&'buf mut Vec<u8>> {
2413        Self::write_header(buf);
2414        PushAttr::new(buf)
2415    }
2416    pub fn encode(&mut self) -> PushAttr<&mut Vec<u8>> {
2417        PushAttr::new(self.request.buf_mut())
2418    }
2419    pub fn into_encoder(self) -> PushAttr<RequestBuf<'r>> {
2420        PushAttr::new(self.request.buf)
2421    }
2422    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableAttr<'a> {
2423        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2424        IterableAttr::with_loc(attrs, buf.as_ptr() as usize)
2425    }
2426    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2427        let mut header = BuiltinNfgenmsg::new();
2428        header.cmd = 3u8;
2429        header.version = 1u8;
2430        prev.as_vec_mut().extend(header.as_slice());
2431    }
2432}
2433impl NetlinkRequest for OpGetAddrDump<'_> {
2434    fn protocol(&self) -> Protocol {
2435        Protocol::Generic("mptcp_pm".as_bytes())
2436    }
2437    fn flags(&self) -> u16 {
2438        self.request.flags
2439    }
2440    fn payload(&self) -> &[u8] {
2441        self.request.buf()
2442    }
2443    type ReplyType<'buf> = IterableAttr<'buf>;
2444    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2445        Self::decode_request(buf)
2446    }
2447    fn lookup(
2448        buf: &[u8],
2449        offset: usize,
2450        missing_type: Option<u16>,
2451    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2452        Self::decode_request(buf).lookup_attr(offset, missing_type)
2453    }
2454}
2455#[doc = "Get endpoint information\n\nRequest attributes:\n- [.nested_addr()](PushAttr::nested_addr)\n- [.push_token()](PushAttr::push_token)\n\nReply attributes:\n- [.get_addr()](IterableAttr::get_addr)\n\n"]
2456#[derive(Debug)]
2457pub struct OpGetAddrDo<'r> {
2458    request: Request<'r>,
2459}
2460impl<'r> OpGetAddrDo<'r> {
2461    pub fn new(mut request: Request<'r>) -> Self {
2462        Self::write_header(request.buf_mut());
2463        Self { request: request }
2464    }
2465    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushAttr<&'buf mut Vec<u8>> {
2466        Self::write_header(buf);
2467        PushAttr::new(buf)
2468    }
2469    pub fn encode(&mut self) -> PushAttr<&mut Vec<u8>> {
2470        PushAttr::new(self.request.buf_mut())
2471    }
2472    pub fn into_encoder(self) -> PushAttr<RequestBuf<'r>> {
2473        PushAttr::new(self.request.buf)
2474    }
2475    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableAttr<'a> {
2476        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2477        IterableAttr::with_loc(attrs, buf.as_ptr() as usize)
2478    }
2479    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2480        let mut header = BuiltinNfgenmsg::new();
2481        header.cmd = 3u8;
2482        header.version = 1u8;
2483        prev.as_vec_mut().extend(header.as_slice());
2484    }
2485}
2486impl NetlinkRequest for OpGetAddrDo<'_> {
2487    fn protocol(&self) -> Protocol {
2488        Protocol::Generic("mptcp_pm".as_bytes())
2489    }
2490    fn flags(&self) -> u16 {
2491        self.request.flags
2492    }
2493    fn payload(&self) -> &[u8] {
2494        self.request.buf()
2495    }
2496    type ReplyType<'buf> = IterableAttr<'buf>;
2497    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2498        Self::decode_request(buf)
2499    }
2500    fn lookup(
2501        buf: &[u8],
2502        offset: usize,
2503        missing_type: Option<u16>,
2504    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2505        Self::decode_request(buf).lookup_attr(offset, missing_type)
2506    }
2507}
2508#[doc = "Flush addresses\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushEndpoint::nested_addr)\n\n"]
2509#[derive(Debug)]
2510pub struct OpFlushAddrsDo<'r> {
2511    request: Request<'r>,
2512}
2513impl<'r> OpFlushAddrsDo<'r> {
2514    pub fn new(mut request: Request<'r>) -> Self {
2515        Self::write_header(request.buf_mut());
2516        Self { request: request }
2517    }
2518    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushEndpoint<&'buf mut Vec<u8>> {
2519        Self::write_header(buf);
2520        PushEndpoint::new(buf)
2521    }
2522    pub fn encode(&mut self) -> PushEndpoint<&mut Vec<u8>> {
2523        PushEndpoint::new(self.request.buf_mut())
2524    }
2525    pub fn into_encoder(self) -> PushEndpoint<RequestBuf<'r>> {
2526        PushEndpoint::new(self.request.buf)
2527    }
2528    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableEndpoint<'a> {
2529        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2530        IterableEndpoint::with_loc(attrs, buf.as_ptr() as usize)
2531    }
2532    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2533        let mut header = BuiltinNfgenmsg::new();
2534        header.cmd = 4u8;
2535        header.version = 1u8;
2536        prev.as_vec_mut().extend(header.as_slice());
2537    }
2538}
2539impl NetlinkRequest for OpFlushAddrsDo<'_> {
2540    fn protocol(&self) -> Protocol {
2541        Protocol::Generic("mptcp_pm".as_bytes())
2542    }
2543    fn flags(&self) -> u16 {
2544        self.request.flags
2545    }
2546    fn payload(&self) -> &[u8] {
2547        self.request.buf()
2548    }
2549    type ReplyType<'buf> = IterableEndpoint<'buf>;
2550    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2551        Self::decode_request(buf)
2552    }
2553    fn lookup(
2554        buf: &[u8],
2555        offset: usize,
2556        missing_type: Option<u16>,
2557    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2558        Self::decode_request(buf).lookup_attr(offset, missing_type)
2559    }
2560}
2561#[doc = "Set protocol limits\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.push_rcv_add_addrs()](PushAttr::push_rcv_add_addrs)\n- [.push_subflows()](PushAttr::push_subflows)\n\n"]
2562#[derive(Debug)]
2563pub struct OpSetLimitsDo<'r> {
2564    request: Request<'r>,
2565}
2566impl<'r> OpSetLimitsDo<'r> {
2567    pub fn new(mut request: Request<'r>) -> Self {
2568        Self::write_header(request.buf_mut());
2569        Self { request: request }
2570    }
2571    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushAttr<&'buf mut Vec<u8>> {
2572        Self::write_header(buf);
2573        PushAttr::new(buf)
2574    }
2575    pub fn encode(&mut self) -> PushAttr<&mut Vec<u8>> {
2576        PushAttr::new(self.request.buf_mut())
2577    }
2578    pub fn into_encoder(self) -> PushAttr<RequestBuf<'r>> {
2579        PushAttr::new(self.request.buf)
2580    }
2581    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableAttr<'a> {
2582        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2583        IterableAttr::with_loc(attrs, buf.as_ptr() as usize)
2584    }
2585    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2586        let mut header = BuiltinNfgenmsg::new();
2587        header.cmd = 5u8;
2588        header.version = 1u8;
2589        prev.as_vec_mut().extend(header.as_slice());
2590    }
2591}
2592impl NetlinkRequest for OpSetLimitsDo<'_> {
2593    fn protocol(&self) -> Protocol {
2594        Protocol::Generic("mptcp_pm".as_bytes())
2595    }
2596    fn flags(&self) -> u16 {
2597        self.request.flags
2598    }
2599    fn payload(&self) -> &[u8] {
2600        self.request.buf()
2601    }
2602    type ReplyType<'buf> = IterableAttr<'buf>;
2603    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2604        Self::decode_request(buf)
2605    }
2606    fn lookup(
2607        buf: &[u8],
2608        offset: usize,
2609        missing_type: Option<u16>,
2610    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2611        Self::decode_request(buf).lookup_attr(offset, missing_type)
2612    }
2613}
2614#[doc = "Get protocol limits\n\nRequest attributes:\n- [.push_rcv_add_addrs()](PushAttr::push_rcv_add_addrs)\n- [.push_subflows()](PushAttr::push_subflows)\n\nReply attributes:\n- [.get_rcv_add_addrs()](IterableAttr::get_rcv_add_addrs)\n- [.get_subflows()](IterableAttr::get_subflows)\n\n"]
2615#[derive(Debug)]
2616pub struct OpGetLimitsDo<'r> {
2617    request: Request<'r>,
2618}
2619impl<'r> OpGetLimitsDo<'r> {
2620    pub fn new(mut request: Request<'r>) -> Self {
2621        Self::write_header(request.buf_mut());
2622        Self { request: request }
2623    }
2624    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushAttr<&'buf mut Vec<u8>> {
2625        Self::write_header(buf);
2626        PushAttr::new(buf)
2627    }
2628    pub fn encode(&mut self) -> PushAttr<&mut Vec<u8>> {
2629        PushAttr::new(self.request.buf_mut())
2630    }
2631    pub fn into_encoder(self) -> PushAttr<RequestBuf<'r>> {
2632        PushAttr::new(self.request.buf)
2633    }
2634    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableAttr<'a> {
2635        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2636        IterableAttr::with_loc(attrs, buf.as_ptr() as usize)
2637    }
2638    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2639        let mut header = BuiltinNfgenmsg::new();
2640        header.cmd = 6u8;
2641        header.version = 1u8;
2642        prev.as_vec_mut().extend(header.as_slice());
2643    }
2644}
2645impl NetlinkRequest for OpGetLimitsDo<'_> {
2646    fn protocol(&self) -> Protocol {
2647        Protocol::Generic("mptcp_pm".as_bytes())
2648    }
2649    fn flags(&self) -> u16 {
2650        self.request.flags
2651    }
2652    fn payload(&self) -> &[u8] {
2653        self.request.buf()
2654    }
2655    type ReplyType<'buf> = IterableAttr<'buf>;
2656    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2657        Self::decode_request(buf)
2658    }
2659    fn lookup(
2660        buf: &[u8],
2661        offset: usize,
2662        missing_type: Option<u16>,
2663    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2664        Self::decode_request(buf).lookup_attr(offset, missing_type)
2665    }
2666}
2667#[doc = "Change endpoint flags\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushAttr::nested_addr)\n- [.push_token()](PushAttr::push_token)\n- [.nested_addr_remote()](PushAttr::nested_addr_remote)\n\n"]
2668#[derive(Debug)]
2669pub struct OpSetFlagsDo<'r> {
2670    request: Request<'r>,
2671}
2672impl<'r> OpSetFlagsDo<'r> {
2673    pub fn new(mut request: Request<'r>) -> Self {
2674        Self::write_header(request.buf_mut());
2675        Self { request: request }
2676    }
2677    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushAttr<&'buf mut Vec<u8>> {
2678        Self::write_header(buf);
2679        PushAttr::new(buf)
2680    }
2681    pub fn encode(&mut self) -> PushAttr<&mut Vec<u8>> {
2682        PushAttr::new(self.request.buf_mut())
2683    }
2684    pub fn into_encoder(self) -> PushAttr<RequestBuf<'r>> {
2685        PushAttr::new(self.request.buf)
2686    }
2687    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableAttr<'a> {
2688        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2689        IterableAttr::with_loc(attrs, buf.as_ptr() as usize)
2690    }
2691    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2692        let mut header = BuiltinNfgenmsg::new();
2693        header.cmd = 7u8;
2694        header.version = 1u8;
2695        prev.as_vec_mut().extend(header.as_slice());
2696    }
2697}
2698impl NetlinkRequest for OpSetFlagsDo<'_> {
2699    fn protocol(&self) -> Protocol {
2700        Protocol::Generic("mptcp_pm".as_bytes())
2701    }
2702    fn flags(&self) -> u16 {
2703        self.request.flags
2704    }
2705    fn payload(&self) -> &[u8] {
2706        self.request.buf()
2707    }
2708    type ReplyType<'buf> = IterableAttr<'buf>;
2709    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2710        Self::decode_request(buf)
2711    }
2712    fn lookup(
2713        buf: &[u8],
2714        offset: usize,
2715        missing_type: Option<u16>,
2716    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2717        Self::decode_request(buf).lookup_attr(offset, missing_type)
2718    }
2719}
2720#[doc = "Announce new address\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushAttr::nested_addr)\n- [.push_token()](PushAttr::push_token)\n\n"]
2721#[derive(Debug)]
2722pub struct OpAnnounceDo<'r> {
2723    request: Request<'r>,
2724}
2725impl<'r> OpAnnounceDo<'r> {
2726    pub fn new(mut request: Request<'r>) -> Self {
2727        Self::write_header(request.buf_mut());
2728        Self { request: request }
2729    }
2730    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushAttr<&'buf mut Vec<u8>> {
2731        Self::write_header(buf);
2732        PushAttr::new(buf)
2733    }
2734    pub fn encode(&mut self) -> PushAttr<&mut Vec<u8>> {
2735        PushAttr::new(self.request.buf_mut())
2736    }
2737    pub fn into_encoder(self) -> PushAttr<RequestBuf<'r>> {
2738        PushAttr::new(self.request.buf)
2739    }
2740    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableAttr<'a> {
2741        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2742        IterableAttr::with_loc(attrs, buf.as_ptr() as usize)
2743    }
2744    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2745        let mut header = BuiltinNfgenmsg::new();
2746        header.cmd = 8u8;
2747        header.version = 1u8;
2748        prev.as_vec_mut().extend(header.as_slice());
2749    }
2750}
2751impl NetlinkRequest for OpAnnounceDo<'_> {
2752    fn protocol(&self) -> Protocol {
2753        Protocol::Generic("mptcp_pm".as_bytes())
2754    }
2755    fn flags(&self) -> u16 {
2756        self.request.flags
2757    }
2758    fn payload(&self) -> &[u8] {
2759        self.request.buf()
2760    }
2761    type ReplyType<'buf> = IterableAttr<'buf>;
2762    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2763        Self::decode_request(buf)
2764    }
2765    fn lookup(
2766        buf: &[u8],
2767        offset: usize,
2768        missing_type: Option<u16>,
2769    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2770        Self::decode_request(buf).lookup_attr(offset, missing_type)
2771    }
2772}
2773#[doc = "Announce removal\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.push_token()](PushAttr::push_token)\n- [.push_loc_id()](PushAttr::push_loc_id)\n\n"]
2774#[derive(Debug)]
2775pub struct OpRemoveDo<'r> {
2776    request: Request<'r>,
2777}
2778impl<'r> OpRemoveDo<'r> {
2779    pub fn new(mut request: Request<'r>) -> Self {
2780        Self::write_header(request.buf_mut());
2781        Self { request: request }
2782    }
2783    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushAttr<&'buf mut Vec<u8>> {
2784        Self::write_header(buf);
2785        PushAttr::new(buf)
2786    }
2787    pub fn encode(&mut self) -> PushAttr<&mut Vec<u8>> {
2788        PushAttr::new(self.request.buf_mut())
2789    }
2790    pub fn into_encoder(self) -> PushAttr<RequestBuf<'r>> {
2791        PushAttr::new(self.request.buf)
2792    }
2793    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableAttr<'a> {
2794        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2795        IterableAttr::with_loc(attrs, buf.as_ptr() as usize)
2796    }
2797    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2798        let mut header = BuiltinNfgenmsg::new();
2799        header.cmd = 9u8;
2800        header.version = 1u8;
2801        prev.as_vec_mut().extend(header.as_slice());
2802    }
2803}
2804impl NetlinkRequest for OpRemoveDo<'_> {
2805    fn protocol(&self) -> Protocol {
2806        Protocol::Generic("mptcp_pm".as_bytes())
2807    }
2808    fn flags(&self) -> u16 {
2809        self.request.flags
2810    }
2811    fn payload(&self) -> &[u8] {
2812        self.request.buf()
2813    }
2814    type ReplyType<'buf> = IterableAttr<'buf>;
2815    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2816        Self::decode_request(buf)
2817    }
2818    fn lookup(
2819        buf: &[u8],
2820        offset: usize,
2821        missing_type: Option<u16>,
2822    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2823        Self::decode_request(buf).lookup_attr(offset, missing_type)
2824    }
2825}
2826#[doc = "Create subflow\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushAttr::nested_addr)\n- [.push_token()](PushAttr::push_token)\n- [.nested_addr_remote()](PushAttr::nested_addr_remote)\n\n"]
2827#[derive(Debug)]
2828pub struct OpSubflowCreateDo<'r> {
2829    request: Request<'r>,
2830}
2831impl<'r> OpSubflowCreateDo<'r> {
2832    pub fn new(mut request: Request<'r>) -> Self {
2833        Self::write_header(request.buf_mut());
2834        Self { request: request }
2835    }
2836    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushAttr<&'buf mut Vec<u8>> {
2837        Self::write_header(buf);
2838        PushAttr::new(buf)
2839    }
2840    pub fn encode(&mut self) -> PushAttr<&mut Vec<u8>> {
2841        PushAttr::new(self.request.buf_mut())
2842    }
2843    pub fn into_encoder(self) -> PushAttr<RequestBuf<'r>> {
2844        PushAttr::new(self.request.buf)
2845    }
2846    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableAttr<'a> {
2847        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2848        IterableAttr::with_loc(attrs, buf.as_ptr() as usize)
2849    }
2850    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2851        let mut header = BuiltinNfgenmsg::new();
2852        header.cmd = 10u8;
2853        header.version = 1u8;
2854        prev.as_vec_mut().extend(header.as_slice());
2855    }
2856}
2857impl NetlinkRequest for OpSubflowCreateDo<'_> {
2858    fn protocol(&self) -> Protocol {
2859        Protocol::Generic("mptcp_pm".as_bytes())
2860    }
2861    fn flags(&self) -> u16 {
2862        self.request.flags
2863    }
2864    fn payload(&self) -> &[u8] {
2865        self.request.buf()
2866    }
2867    type ReplyType<'buf> = IterableAttr<'buf>;
2868    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2869        Self::decode_request(buf)
2870    }
2871    fn lookup(
2872        buf: &[u8],
2873        offset: usize,
2874        missing_type: Option<u16>,
2875    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2876        Self::decode_request(buf).lookup_attr(offset, missing_type)
2877    }
2878}
2879#[doc = "Destroy subflow\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushAttr::nested_addr)\n- [.push_token()](PushAttr::push_token)\n- [.nested_addr_remote()](PushAttr::nested_addr_remote)\n\n"]
2880#[derive(Debug)]
2881pub struct OpSubflowDestroyDo<'r> {
2882    request: Request<'r>,
2883}
2884impl<'r> OpSubflowDestroyDo<'r> {
2885    pub fn new(mut request: Request<'r>) -> Self {
2886        Self::write_header(request.buf_mut());
2887        Self { request: request }
2888    }
2889    pub fn encode_request<'buf>(buf: &'buf mut Vec<u8>) -> PushAttr<&'buf mut Vec<u8>> {
2890        Self::write_header(buf);
2891        PushAttr::new(buf)
2892    }
2893    pub fn encode(&mut self) -> PushAttr<&mut Vec<u8>> {
2894        PushAttr::new(self.request.buf_mut())
2895    }
2896    pub fn into_encoder(self) -> PushAttr<RequestBuf<'r>> {
2897        PushAttr::new(self.request.buf)
2898    }
2899    pub fn decode_request<'a>(buf: &'a [u8]) -> IterableAttr<'a> {
2900        let (_header, attrs) = buf.split_at(buf.len().min(BuiltinNfgenmsg::len()));
2901        IterableAttr::with_loc(attrs, buf.as_ptr() as usize)
2902    }
2903    fn write_header<Prev: Pusher>(prev: &mut Prev) {
2904        let mut header = BuiltinNfgenmsg::new();
2905        header.cmd = 11u8;
2906        header.version = 1u8;
2907        prev.as_vec_mut().extend(header.as_slice());
2908    }
2909}
2910impl NetlinkRequest for OpSubflowDestroyDo<'_> {
2911    fn protocol(&self) -> Protocol {
2912        Protocol::Generic("mptcp_pm".as_bytes())
2913    }
2914    fn flags(&self) -> u16 {
2915        self.request.flags
2916    }
2917    fn payload(&self) -> &[u8] {
2918        self.request.buf()
2919    }
2920    type ReplyType<'buf> = IterableAttr<'buf>;
2921    fn decode_reply<'buf>(buf: &'buf [u8]) -> Self::ReplyType<'buf> {
2922        Self::decode_request(buf)
2923    }
2924    fn lookup(
2925        buf: &[u8],
2926        offset: usize,
2927        missing_type: Option<u16>,
2928    ) -> (Vec<(&'static str, usize)>, Option<&'static str>) {
2929        Self::decode_request(buf).lookup_attr(offset, missing_type)
2930    }
2931}
2932use crate::traits::LookupFn;
2933use crate::utils::RequestBuf;
2934#[derive(Debug)]
2935pub struct Request<'buf> {
2936    buf: RequestBuf<'buf>,
2937    flags: u16,
2938    writeback: Option<&'buf mut Option<RequestInfo>>,
2939}
2940#[allow(unused)]
2941#[derive(Debug, Clone)]
2942pub struct RequestInfo {
2943    protocol: Protocol,
2944    flags: u16,
2945    name: &'static str,
2946    lookup: LookupFn,
2947}
2948impl Request<'static> {
2949    pub fn new() -> Self {
2950        Self::new_from_buf(Vec::new())
2951    }
2952    pub fn new_from_buf(buf: Vec<u8>) -> Self {
2953        Self {
2954            flags: 0,
2955            buf: RequestBuf::Own(buf),
2956            writeback: None,
2957        }
2958    }
2959    pub fn into_buf(self) -> Vec<u8> {
2960        match self.buf {
2961            RequestBuf::Own(buf) => buf,
2962            _ => unreachable!(),
2963        }
2964    }
2965}
2966impl<'buf> Request<'buf> {
2967    pub fn new_with_buf(buf: &'buf mut Vec<u8>) -> Self {
2968        buf.clear();
2969        Self::new_extend(buf)
2970    }
2971    pub fn new_extend(buf: &'buf mut Vec<u8>) -> Self {
2972        Self {
2973            flags: 0,
2974            buf: RequestBuf::Ref(buf),
2975            writeback: None,
2976        }
2977    }
2978    fn do_writeback(&mut self, protocol: Protocol, name: &'static str, lookup: LookupFn) {
2979        let Some(writeback) = &mut self.writeback else {
2980            return;
2981        };
2982        **writeback = Some(RequestInfo {
2983            protocol,
2984            flags: self.flags,
2985            name,
2986            lookup,
2987        })
2988    }
2989    pub fn buf(&self) -> &Vec<u8> {
2990        self.buf.buf()
2991    }
2992    pub fn buf_mut(&mut self) -> &mut Vec<u8> {
2993        self.buf.buf_mut()
2994    }
2995    #[doc = "Set `NLM_F_CREATE` flag"]
2996    pub fn set_create(mut self) -> Self {
2997        self.flags |= consts::NLM_F_CREATE as u16;
2998        self
2999    }
3000    #[doc = "Set `NLM_F_EXCL` flag"]
3001    pub fn set_excl(mut self) -> Self {
3002        self.flags |= consts::NLM_F_EXCL as u16;
3003        self
3004    }
3005    #[doc = "Set `NLM_F_REPLACE` flag"]
3006    pub fn set_replace(mut self) -> Self {
3007        self.flags |= consts::NLM_F_REPLACE as u16;
3008        self
3009    }
3010    #[doc = "Set `NLM_F_CREATE` and `NLM_F_REPLACE` flag"]
3011    pub fn set_change(self) -> Self {
3012        self.set_create().set_replace()
3013    }
3014    #[doc = "Set `NLM_F_APPEND` flag"]
3015    pub fn set_append(mut self) -> Self {
3016        self.flags |= consts::NLM_F_APPEND as u16;
3017        self
3018    }
3019    #[doc = "Set `self.flags |= flags`"]
3020    pub fn set_flags(mut self, flags: u16) -> Self {
3021        self.flags |= flags;
3022        self
3023    }
3024    #[doc = "Set `self.flags ^= self.flags & flags`"]
3025    pub fn unset_flags(mut self, flags: u16) -> Self {
3026        self.flags ^= self.flags & flags;
3027        self
3028    }
3029    #[doc = "Set `NLM_F_DUMP` flag"]
3030    fn set_dump(mut self) -> Self {
3031        self.flags |= consts::NLM_F_DUMP as u16;
3032        self
3033    }
3034    #[doc = "Add endpoint\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushEndpoint::nested_addr)\n\n"]
3035    pub fn op_add_addr_do(self) -> OpAddAddrDo<'buf> {
3036        let mut res = OpAddAddrDo::new(self);
3037        res.request
3038            .do_writeback(res.protocol(), "op-add-addr-do", OpAddAddrDo::lookup);
3039        res
3040    }
3041    #[doc = "Delete endpoint\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushEndpoint::nested_addr)\n\n"]
3042    pub fn op_del_addr_do(self) -> OpDelAddrDo<'buf> {
3043        let mut res = OpDelAddrDo::new(self);
3044        res.request
3045            .do_writeback(res.protocol(), "op-del-addr-do", OpDelAddrDo::lookup);
3046        res
3047    }
3048    #[doc = "Get endpoint information\n\nReply attributes:\n- [.get_addr()](IterableAttr::get_addr)\n\n"]
3049    pub fn op_get_addr_dump(self) -> OpGetAddrDump<'buf> {
3050        let mut res = OpGetAddrDump::new(self);
3051        res.request
3052            .do_writeback(res.protocol(), "op-get-addr-dump", OpGetAddrDump::lookup);
3053        res
3054    }
3055    #[doc = "Get endpoint information\n\nRequest attributes:\n- [.nested_addr()](PushAttr::nested_addr)\n- [.push_token()](PushAttr::push_token)\n\nReply attributes:\n- [.get_addr()](IterableAttr::get_addr)\n\n"]
3056    pub fn op_get_addr_do(self) -> OpGetAddrDo<'buf> {
3057        let mut res = OpGetAddrDo::new(self);
3058        res.request
3059            .do_writeback(res.protocol(), "op-get-addr-do", OpGetAddrDo::lookup);
3060        res
3061    }
3062    #[doc = "Flush addresses\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushEndpoint::nested_addr)\n\n"]
3063    pub fn op_flush_addrs_do(self) -> OpFlushAddrsDo<'buf> {
3064        let mut res = OpFlushAddrsDo::new(self);
3065        res.request
3066            .do_writeback(res.protocol(), "op-flush-addrs-do", OpFlushAddrsDo::lookup);
3067        res
3068    }
3069    #[doc = "Set protocol limits\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.push_rcv_add_addrs()](PushAttr::push_rcv_add_addrs)\n- [.push_subflows()](PushAttr::push_subflows)\n\n"]
3070    pub fn op_set_limits_do(self) -> OpSetLimitsDo<'buf> {
3071        let mut res = OpSetLimitsDo::new(self);
3072        res.request
3073            .do_writeback(res.protocol(), "op-set-limits-do", OpSetLimitsDo::lookup);
3074        res
3075    }
3076    #[doc = "Get protocol limits\n\nRequest attributes:\n- [.push_rcv_add_addrs()](PushAttr::push_rcv_add_addrs)\n- [.push_subflows()](PushAttr::push_subflows)\n\nReply attributes:\n- [.get_rcv_add_addrs()](IterableAttr::get_rcv_add_addrs)\n- [.get_subflows()](IterableAttr::get_subflows)\n\n"]
3077    pub fn op_get_limits_do(self) -> OpGetLimitsDo<'buf> {
3078        let mut res = OpGetLimitsDo::new(self);
3079        res.request
3080            .do_writeback(res.protocol(), "op-get-limits-do", OpGetLimitsDo::lookup);
3081        res
3082    }
3083    #[doc = "Change endpoint flags\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushAttr::nested_addr)\n- [.push_token()](PushAttr::push_token)\n- [.nested_addr_remote()](PushAttr::nested_addr_remote)\n\n"]
3084    pub fn op_set_flags_do(self) -> OpSetFlagsDo<'buf> {
3085        let mut res = OpSetFlagsDo::new(self);
3086        res.request
3087            .do_writeback(res.protocol(), "op-set-flags-do", OpSetFlagsDo::lookup);
3088        res
3089    }
3090    #[doc = "Announce new address\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushAttr::nested_addr)\n- [.push_token()](PushAttr::push_token)\n\n"]
3091    pub fn op_announce_do(self) -> OpAnnounceDo<'buf> {
3092        let mut res = OpAnnounceDo::new(self);
3093        res.request
3094            .do_writeback(res.protocol(), "op-announce-do", OpAnnounceDo::lookup);
3095        res
3096    }
3097    #[doc = "Announce removal\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.push_token()](PushAttr::push_token)\n- [.push_loc_id()](PushAttr::push_loc_id)\n\n"]
3098    pub fn op_remove_do(self) -> OpRemoveDo<'buf> {
3099        let mut res = OpRemoveDo::new(self);
3100        res.request
3101            .do_writeback(res.protocol(), "op-remove-do", OpRemoveDo::lookup);
3102        res
3103    }
3104    #[doc = "Create subflow\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushAttr::nested_addr)\n- [.push_token()](PushAttr::push_token)\n- [.nested_addr_remote()](PushAttr::nested_addr_remote)\n\n"]
3105    pub fn op_subflow_create_do(self) -> OpSubflowCreateDo<'buf> {
3106        let mut res = OpSubflowCreateDo::new(self);
3107        res.request.do_writeback(
3108            res.protocol(),
3109            "op-subflow-create-do",
3110            OpSubflowCreateDo::lookup,
3111        );
3112        res
3113    }
3114    #[doc = "Destroy subflow\n\nFlags: uns-admin-perm\n\nRequest attributes:\n- [.nested_addr()](PushAttr::nested_addr)\n- [.push_token()](PushAttr::push_token)\n- [.nested_addr_remote()](PushAttr::nested_addr_remote)\n\n"]
3115    pub fn op_subflow_destroy_do(self) -> OpSubflowDestroyDo<'buf> {
3116        let mut res = OpSubflowDestroyDo::new(self);
3117        res.request.do_writeback(
3118            res.protocol(),
3119            "op-subflow-destroy-do",
3120            OpSubflowDestroyDo::lookup,
3121        );
3122        res
3123    }
3124}
3125#[cfg(test)]
3126mod generated_tests {
3127    use super::*;
3128    #[test]
3129    fn tests() {
3130        let _ = IterableAttr::get_addr;
3131        let _ = IterableAttr::get_rcv_add_addrs;
3132        let _ = IterableAttr::get_subflows;
3133        let _ = PushAttr::<&mut Vec<u8>>::nested_addr;
3134        let _ = PushAttr::<&mut Vec<u8>>::nested_addr_remote;
3135        let _ = PushAttr::<&mut Vec<u8>>::push_loc_id;
3136        let _ = PushAttr::<&mut Vec<u8>>::push_rcv_add_addrs;
3137        let _ = PushAttr::<&mut Vec<u8>>::push_subflows;
3138        let _ = PushAttr::<&mut Vec<u8>>::push_token;
3139        let _ = PushEndpoint::<&mut Vec<u8>>::nested_addr;
3140    }
3141}