netlink_packet_route/rtnl/neighbour_table/
message.rs

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