Skip to main content

netlink_packet_route/neighbour_table/
message.rs

1// SPDX-License-Identifier: MIT
2
3use super::{
4    NeighbourTableAttribute, NeighbourTableError, NeighbourTableHeader, NeighbourTableMessageBuffer,
5};
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)]
11#[non_exhaustive]
12pub struct NeighbourTableMessage {
13    pub header: NeighbourTableHeader,
14    pub attributes: Vec<NeighbourTableAttribute>,
15}
16
17impl Emitable for NeighbourTableMessage {
18    fn buffer_len(&self) -> usize {
19        self.header.buffer_len() + self.attributes.as_slice().buffer_len()
20    }
21
22    fn emit(&self, buffer: &mut [u8]) {
23        self.header.emit(buffer);
24        self.attributes.as_slice().emit(&mut buffer[self.header.buffer_len()..]);
25    }
26}
27
28impl<'a, T: AsRef<[u8]> + 'a>
29    ParseableParametrized<NeighbourTableMessageBuffer<&'a T>, RouteNetlinkMessageParseMode>
30    for NeighbourTableMessage
31{
32    type Error = NeighbourTableError;
33    fn parse_with_param(
34        buf: &NeighbourTableMessageBuffer<&'a T>,
35        mode: RouteNetlinkMessageParseMode,
36    ) -> Result<Self, NeighbourTableError> {
37        Ok(NeighbourTableMessage {
38            // unwrap: we always succeed at parsing the header
39            header: NeighbourTableHeader::parse(buf).unwrap(),
40            attributes: Vec::<NeighbourTableAttribute>::parse_with_param(buf, mode.into())?,
41        })
42    }
43}
44
45impl<'a, T: AsRef<[u8]> + 'a>
46    ParseableParametrized<NeighbourTableMessageBuffer<&'a T>, NlaParseMode>
47    for Vec<NeighbourTableAttribute>
48{
49    type Error = NeighbourTableError;
50    fn parse_with_param(
51        buf: &NeighbourTableMessageBuffer<&'a T>,
52        mode: NlaParseMode,
53    ) -> Result<Self, NeighbourTableError> {
54        buf.parse_attributes(mode, NeighbourTableAttribute::parse)
55    }
56}