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