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}