netlink_packet_route/prefix/
message.rs1use anyhow::Context;
4
5use netlink_packet_utils::{
6 traits::{Emitable, Parseable},
7 DecodeError,
8};
9
10use super::{
11 attribute::PrefixAttribute,
12 header::{PrefixHeader, PrefixMessageBuffer},
13};
14
15#[derive(Debug, PartialEq, Eq, Clone, Default)]
16pub struct PrefixMessage {
17 pub header: PrefixHeader,
18 pub attributes: Vec<PrefixAttribute>,
19}
20
21impl Emitable for PrefixMessage {
22 fn buffer_len(&self) -> usize {
23 self.header.buffer_len() + self.attributes.as_slice().buffer_len()
24 }
25
26 fn emit(&self, buffer: &mut [u8]) {
27 self.header.emit(buffer);
28 self.attributes
29 .as_slice()
30 .emit(&mut buffer[self.header.buffer_len()..]);
31 }
32}
33
34impl<T: AsRef<[u8]>> Parseable<PrefixMessageBuffer<T>> for PrefixHeader {
35 fn parse(buf: &PrefixMessageBuffer<T>) -> Result<Self, DecodeError> {
36 Ok(Self {
37 prefix_family: buf.prefix_family(),
38 ifindex: buf.ifindex(),
39 prefix_type: buf.prefix_type(),
40 prefix_len: buf.prefix_len(),
41 flags: buf.flags(),
42 })
43 }
44}
45
46impl<'a, T: AsRef<[u8]> + 'a> Parseable<PrefixMessageBuffer<&'a T>>
47 for PrefixMessage
48{
49 fn parse(buf: &PrefixMessageBuffer<&'a T>) -> Result<Self, DecodeError> {
50 Ok(Self {
51 header: PrefixHeader::parse(buf)
52 .context("failed to parse prefix message header")?,
53 attributes: Vec::<PrefixAttribute>::parse(buf)
54 .context("failed to parse prefix message attributes")?,
55 })
56 }
57}
58
59impl<'a, T: AsRef<[u8]> + 'a> Parseable<PrefixMessageBuffer<&'a T>>
60 for Vec<PrefixAttribute>
61{
62 fn parse(buf: &PrefixMessageBuffer<&'a T>) -> Result<Self, DecodeError> {
63 let mut nlas = vec![];
64 for nla_buf in buf.nlas() {
65 nlas.push(PrefixAttribute::parse(&nla_buf?)?);
66 }
67 Ok(nlas)
68 }
69}