netlink_packet_route/prefix/
header.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_core::{DecodeError, Emitable, NlaBuffer, NlasIterator};
4
5const PREFIX_HEADER_LEN: usize = 12;
6
7buffer!(PrefixMessageBuffer(PREFIX_HEADER_LEN) {
8    prefix_family: (u8, 0),
9    pad1: (u8, 1),
10    pad2: (u16, 2..4),
11    ifindex: (i32, 4..8),
12    prefix_type: (u8, 8),
13    prefix_len: (u8, 9),
14    flags: (u8, 10),
15    pad3: (u8, 11),
16    payload: (slice, PREFIX_HEADER_LEN..),
17});
18
19impl<'a, T: AsRef<[u8]> + ?Sized> PrefixMessageBuffer<&'a T> {
20    pub fn nlas(
21        &self,
22    ) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, DecodeError>> {
23        NlasIterator::new(self.payload())
24    }
25}
26
27#[derive(Debug, PartialEq, Eq, Clone, Default)]
28pub struct PrefixHeader {
29    pub prefix_family: u8,
30    pub ifindex: i32,
31    pub prefix_type: u8,
32    pub prefix_len: u8,
33    pub flags: u8,
34}
35
36impl Emitable for PrefixHeader {
37    fn buffer_len(&self) -> usize {
38        PREFIX_HEADER_LEN
39    }
40
41    fn emit(&self, buffer: &mut [u8]) {
42        let mut packet = PrefixMessageBuffer::new(buffer);
43        packet.set_prefix_family(self.prefix_family);
44        packet.set_ifindex(self.ifindex);
45        packet.set_prefix_type(self.prefix_type);
46        packet.set_prefix_len(self.prefix_len);
47        packet.set_flags(self.flags);
48    }
49}