netlink_packet_route/neighbour_table/
header.rs

1// SPDX-License-Identifier: MIT
2
3use 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// kernel code is `struct rtgenmsg`
27#[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}