Skip to main content

netlink_packet_route/neighbour/
message.rs

1// SPDX-License-Identifier: MIT
2
3use super::super::AddressFamily;
4use super::{NeighbourAttribute, NeighbourError, NeighbourHeader, NeighbourMessageBuffer};
5use crate::RouteNetlinkMessageParseMode;
6use netlink_packet_utils::nla::{HasNlas, NlaParseMode};
7use netlink_packet_utils::traits::{Emitable, Parseable, ParseableParametrized};
8
9#[derive(Debug, PartialEq, Eq, Clone, Default)]
10#[non_exhaustive]
11pub struct NeighbourMessage {
12    pub header: NeighbourHeader,
13    pub attributes: Vec<NeighbourAttribute>,
14}
15
16impl Emitable for NeighbourMessage {
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<'a, T: AsRef<[u8]> + 'a>
28    ParseableParametrized<NeighbourMessageBuffer<&'a T>, RouteNetlinkMessageParseMode>
29    for NeighbourMessage
30{
31    type Error = NeighbourError;
32    fn parse_with_param(
33        buf: &NeighbourMessageBuffer<&'a T>,
34        mode: RouteNetlinkMessageParseMode,
35    ) -> Result<Self, NeighbourError> {
36        // unwrap: parsing the header is always ok.
37        let header = NeighbourHeader::parse(buf).unwrap();
38        let address_family = header.family;
39        Ok(NeighbourMessage {
40            header,
41            attributes: Vec::<NeighbourAttribute>::parse_with_param(
42                buf,
43                (mode.into(), address_family),
44            )?,
45        })
46    }
47}
48
49impl<'a, T: AsRef<[u8]> + 'a>
50    ParseableParametrized<NeighbourMessageBuffer<&'a T>, (NlaParseMode, AddressFamily)>
51    for Vec<NeighbourAttribute>
52{
53    type Error = NeighbourError;
54    fn parse_with_param(
55        buf: &NeighbourMessageBuffer<&'a T>,
56        (mode, address_family): (NlaParseMode, AddressFamily),
57    ) -> Result<Self, NeighbourError> {
58        buf.parse_attributes(mode, |nla_buf| {
59            NeighbourAttribute::parse_with_param(nla_buf, address_family)
60        })
61    }
62}