netlink_packet_route/neighbour_table/
message.rs1use anyhow::Context;
4use netlink_packet_utils::{
5 traits::{Emitable, Parseable},
6 DecodeError,
7};
8
9use super::{
10 NeighbourTableAttribute, NeighbourTableHeader, NeighbourTableMessageBuffer,
11};
12
13#[derive(Debug, PartialEq, Eq, Clone, Default)]
14#[non_exhaustive]
15pub struct NeighbourTableMessage {
16 pub header: NeighbourTableHeader,
17 pub attributes: Vec<NeighbourTableAttribute>,
18}
19
20impl Emitable for NeighbourTableMessage {
21 fn buffer_len(&self) -> usize {
22 self.header.buffer_len() + self.attributes.as_slice().buffer_len()
23 }
24
25 fn emit(&self, buffer: &mut [u8]) {
26 self.header.emit(buffer);
27 self.attributes
28 .as_slice()
29 .emit(&mut buffer[self.header.buffer_len()..]);
30 }
31}
32
33impl<'a, T: AsRef<[u8]> + 'a> Parseable<NeighbourTableMessageBuffer<&'a T>>
34 for NeighbourTableMessage
35{
36 fn parse(
37 buf: &NeighbourTableMessageBuffer<&'a T>,
38 ) -> Result<Self, DecodeError> {
39 Ok(NeighbourTableMessage {
40 header: NeighbourTableHeader::parse(buf)
41 .context("failed to parse neighbour table message header")?,
42 attributes: Vec::<NeighbourTableAttribute>::parse(buf)
43 .context("failed to parse neighbour table message NLAs")?,
44 })
45 }
46}
47
48impl<'a, T: AsRef<[u8]> + 'a> Parseable<NeighbourTableMessageBuffer<&'a T>>
49 for Vec<NeighbourTableAttribute>
50{
51 fn parse(
52 buf: &NeighbourTableMessageBuffer<&'a T>,
53 ) -> Result<Self, DecodeError> {
54 let mut attributes = vec![];
55 for nla_buf in buf.attributes() {
56 attributes.push(NeighbourTableAttribute::parse(&nla_buf?)?);
57 }
58 Ok(attributes)
59 }
60}