netlink_packet_route/prefix/
header.rs1use 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}