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