netlink_packet_route/neighbour_table/
header.rs

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