netlink_packet_route/rtnl/neighbour_table/
message.rs

1// SPDX-License-Identifier: MIT
2
3use 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}