Skip to main content

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 crate::RouteNetlinkMessageParseMode;
7use netlink_packet_utils::nla::{HasNlas, NlaParseMode};
8use netlink_packet_utils::traits::{Emitable, Parseable, ParseableParametrized};
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.as_slice().emit(&mut buffer[self.header.buffer_len()..]);
24    }
25}
26
27impl<T: AsRef<[u8]>> Parseable<PrefixMessageBuffer<T>> for PrefixHeader {
28    type Error = ();
29    fn parse(buf: &PrefixMessageBuffer<T>) -> Result<Self, ()> {
30        Ok(Self {
31            prefix_family: buf.prefix_family(),
32            ifindex: buf.ifindex(),
33            prefix_type: buf.prefix_type(),
34            prefix_len: buf.prefix_len(),
35            flags: buf.flags(),
36        })
37    }
38}
39
40impl<'a, T: AsRef<[u8]> + 'a>
41    ParseableParametrized<PrefixMessageBuffer<&'a T>, RouteNetlinkMessageParseMode>
42    for PrefixMessage
43{
44    type Error = PrefixError;
45    fn parse_with_param(
46        buf: &PrefixMessageBuffer<&'a T>,
47        mode: RouteNetlinkMessageParseMode,
48    ) -> Result<Self, PrefixError> {
49        Ok(Self {
50            // Unwrap: ok, we never return an error above.
51            header: PrefixHeader::parse(buf).unwrap(),
52            attributes: Vec::<PrefixAttribute>::parse_with_param(buf, mode.into())?,
53        })
54    }
55}
56
57impl<'a, T: AsRef<[u8]> + 'a> ParseableParametrized<PrefixMessageBuffer<&'a T>, NlaParseMode>
58    for Vec<PrefixAttribute>
59{
60    type Error = PrefixError;
61    fn parse_with_param(
62        buf: &PrefixMessageBuffer<&'a T>,
63        mode: NlaParseMode,
64    ) -> Result<Self, PrefixError> {
65        buf.parse_attributes(mode, PrefixAttribute::parse)
66    }
67}