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