netlink_packet_route/neighbour/
message.rs1use 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 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}