netlink_packet_route/neighbour_table/
header.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_utils::nla::{NlaBuffer, NlaError, NlasIterator};
4use netlink_packet_utils::traits::{Emitable, Parseable};
5use netlink_packet_utils::DecodeError;
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(&self) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, NlaError>> {
18        NlasIterator::new(self.payload())
19    }
20}
21
22// kernel code is `struct rtgenmsg`
23#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
24pub struct NeighbourTableHeader {
25    pub family: AddressFamily,
26}
27
28impl<T: AsRef<[u8]>> Parseable<NeighbourTableMessageBuffer<T>> for NeighbourTableHeader {
29    type Error = ();
30    fn parse(buf: &NeighbourTableMessageBuffer<T>) -> Result<Self, ()> {
31        Ok(Self { family: buf.family().into() })
32    }
33}
34
35impl Emitable for NeighbourTableHeader {
36    fn buffer_len(&self) -> usize {
37        NEIGHBOUR_TABLE_HEADER_LEN
38    }
39
40    fn emit(&self, buffer: &mut [u8]) {
41        let mut packet = NeighbourTableMessageBuffer::new(buffer);
42        packet.set_family(self.family.into());
43    }
44}