netlink_packet_route/prefix/
message.rs

1// SPDX-License-Identifier: MIT
2
3use super::attribute::PrefixAttribute;
4use super::error::PrefixError;
5use super::header::{PrefixHeader, PrefixMessageBuffer};
6use netlink_packet_utils::traits::{Emitable, Parseable};
7
8#[derive(Debug, PartialEq, Eq, Clone, Default)]
9pub struct PrefixMessage {
10    pub header: PrefixHeader,
11    pub attributes: Vec<PrefixAttribute>,
12}
13
14impl Emitable for PrefixMessage {
15    fn buffer_len(&self) -> usize {
16        self.header.buffer_len() + self.attributes.as_slice().buffer_len()
17    }
18
19    fn emit(&self, buffer: &mut [u8]) {
20        self.header.emit(buffer);
21        self.attributes.as_slice().emit(&mut buffer[self.header.buffer_len()..]);
22    }
23}
24
25impl<T: AsRef<[u8]>> Parseable<PrefixMessageBuffer<T>> for PrefixHeader {
26    type Error = ();
27    fn parse(buf: &PrefixMessageBuffer<T>) -> Result<Self, ()> {
28        Ok(Self {
29            prefix_family: buf.prefix_family(),
30            ifindex: buf.ifindex(),
31            prefix_type: buf.prefix_type(),
32            prefix_len: buf.prefix_len(),
33            flags: buf.flags(),
34        })
35    }
36}
37
38impl<'a, T: AsRef<[u8]> + 'a> Parseable<PrefixMessageBuffer<&'a T>> for PrefixMessage {
39    type Error = PrefixError;
40    fn parse(buf: &PrefixMessageBuffer<&'a T>) -> Result<Self, PrefixError> {
41        Ok(Self {
42            // Unwrap: ok, we never return an error above.
43            header: PrefixHeader::parse(buf).unwrap(),
44            attributes: Vec::<PrefixAttribute>::parse(buf)?,
45        })
46    }
47}
48
49impl<'a, T: AsRef<[u8]> + 'a> Parseable<PrefixMessageBuffer<&'a T>> for Vec<PrefixAttribute> {
50    type Error = PrefixError;
51    fn parse(buf: &PrefixMessageBuffer<&'a T>) -> Result<Self, PrefixError> {
52        let mut nlas = vec![];
53        for nla_buf in buf.nlas() {
54            nlas.push(PrefixAttribute::parse(&nla_buf?)?);
55        }
56        Ok(nlas)
57    }
58}