netlink_packet_route/prefix/
message.rs

1// SPDX-License-Identifier: MIT
2
3use 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}