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