netlink_packet_route/neighbour_table/
message.rs
1use 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 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}