netlink_packet_route/prefix/
header.rs

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