netlink_packet_route/prefix/
message.rs1use 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 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}