netlink_packet_route/neighbour_table/
message.rs

1// SPDX-License-Identifier: MIT
2
3use anyhow::Context;
4use netlink_packet_utils::{
5    traits::{Emitable, Parseable},
6    DecodeError,
7};
8
9use super::{
10    NeighbourTableAttribute, NeighbourTableHeader, NeighbourTableMessageBuffer,
11};
12
13#[derive(Debug, PartialEq, Eq, Clone, Default)]
14#[non_exhaustive]
15pub struct NeighbourTableMessage {
16    pub header: NeighbourTableHeader,
17    pub attributes: Vec<NeighbourTableAttribute>,
18}
19
20impl Emitable for NeighbourTableMessage {
21    fn buffer_len(&self) -> usize {
22        self.header.buffer_len() + self.attributes.as_slice().buffer_len()
23    }
24
25    fn emit(&self, buffer: &mut [u8]) {
26        self.header.emit(buffer);
27        self.attributes
28            .as_slice()
29            .emit(&mut buffer[self.header.buffer_len()..]);
30    }
31}
32
33impl<'a, T: AsRef<[u8]> + 'a> Parseable<NeighbourTableMessageBuffer<&'a T>>
34    for NeighbourTableMessage
35{
36    fn parse(
37        buf: &NeighbourTableMessageBuffer<&'a T>,
38    ) -> Result<Self, DecodeError> {
39        Ok(NeighbourTableMessage {
40            header: NeighbourTableHeader::parse(buf)
41                .context("failed to parse neighbour table message header")?,
42            attributes: Vec::<NeighbourTableAttribute>::parse(buf)
43                .context("failed to parse neighbour table message NLAs")?,
44        })
45    }
46}
47
48impl<'a, T: AsRef<[u8]> + 'a> Parseable<NeighbourTableMessageBuffer<&'a T>>
49    for Vec<NeighbourTableAttribute>
50{
51    fn parse(
52        buf: &NeighbourTableMessageBuffer<&'a T>,
53    ) -> Result<Self, DecodeError> {
54        let mut attributes = vec![];
55        for nla_buf in buf.attributes() {
56            attributes.push(NeighbourTableAttribute::parse(&nla_buf?)?);
57        }
58        Ok(attributes)
59    }
60}