netlink_packet_route/prefix/
header.rs

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