netlink_packet_route/neighbour_table/
message.rs

1// SPDX-License-Identifier: MIT
2
3use super::{
4    NeighbourTableAttribute, NeighbourTableError, NeighbourTableHeader, NeighbourTableMessageBuffer,
5};
6use netlink_packet_utils::traits::{Emitable, Parseable};
7
8#[derive(Debug, PartialEq, Eq, Clone, Default)]
9#[non_exhaustive]
10pub struct NeighbourTableMessage {
11    pub header: NeighbourTableHeader,
12    pub attributes: Vec<NeighbourTableAttribute>,
13}
14
15impl Emitable for NeighbourTableMessage {
16    fn buffer_len(&self) -> usize {
17        self.header.buffer_len() + self.attributes.as_slice().buffer_len()
18    }
19
20    fn emit(&self, buffer: &mut [u8]) {
21        self.header.emit(buffer);
22        self.attributes.as_slice().emit(&mut buffer[self.header.buffer_len()..]);
23    }
24}
25
26impl<'a, T: AsRef<[u8]> + 'a> Parseable<NeighbourTableMessageBuffer<&'a T>>
27    for NeighbourTableMessage
28{
29    type Error = NeighbourTableError;
30    fn parse(buf: &NeighbourTableMessageBuffer<&'a T>) -> Result<Self, NeighbourTableError> {
31        Ok(NeighbourTableMessage {
32            // unwrap: we always succeed at parsing the header
33            header: NeighbourTableHeader::parse(buf).unwrap(),
34            attributes: Vec::<NeighbourTableAttribute>::parse(buf)?,
35        })
36    }
37}
38
39impl<'a, T: AsRef<[u8]> + 'a> Parseable<NeighbourTableMessageBuffer<&'a T>>
40    for Vec<NeighbourTableAttribute>
41{
42    type Error = NeighbourTableError;
43    fn parse(buf: &NeighbourTableMessageBuffer<&'a T>) -> Result<Self, NeighbourTableError> {
44        let mut attributes = vec![];
45        for nla_buf in buf.attributes() {
46            attributes.push(NeighbourTableAttribute::parse(&nla_buf?)?);
47        }
48        Ok(attributes)
49    }
50}