netlink_packet_route/neighbour_table/
message.rs

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