netlink_packet_route/prefix/
header.rs
1use 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}