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