netlink_packet_route/prefix/
message.rs
1use 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 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}