netlink_packet_route/neighbour_table/
header.rs1use netlink_packet_utils::{
4 nla::{NlaBuffer, NlasIterator},
5 traits::{Emitable, Parseable},
6 DecodeError,
7};
8
9use crate::AddressFamily;
10
11const NEIGHBOUR_TABLE_HEADER_LEN: usize = 4;
12
13buffer!(NeighbourTableMessageBuffer(NEIGHBOUR_TABLE_HEADER_LEN) {
14 family: (u8, 0),
15 payload: (slice, NEIGHBOUR_TABLE_HEADER_LEN..),
16});
17
18impl<'a, T: AsRef<[u8]> + ?Sized> NeighbourTableMessageBuffer<&'a T> {
19 pub fn attributes(
20 &self,
21 ) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, DecodeError>> {
22 NlasIterator::new(self.payload())
23 }
24}
25
26#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
28pub struct NeighbourTableHeader {
29 pub family: AddressFamily,
30}
31
32impl<T: AsRef<[u8]>> Parseable<NeighbourTableMessageBuffer<T>>
33 for NeighbourTableHeader
34{
35 fn parse(
36 buf: &NeighbourTableMessageBuffer<T>,
37 ) -> Result<Self, DecodeError> {
38 Ok(Self {
39 family: buf.family().into(),
40 })
41 }
42}
43
44impl Emitable for NeighbourTableHeader {
45 fn buffer_len(&self) -> usize {
46 NEIGHBOUR_TABLE_HEADER_LEN
47 }
48
49 fn emit(&self, buffer: &mut [u8]) {
50 let mut packet = NeighbourTableMessageBuffer::new(buffer);
51 packet.set_family(self.family.into());
52 }
53}