netlink_packet_route/rule/
header.rs
1use netlink_packet_utils::nla::{NlaBuffer, NlaError, NlasIterator};
4use netlink_packet_utils::traits::{Emitable, Parseable};
5use netlink_packet_utils::DecodeError;
6
7use super::super::AddressFamily;
8use super::flags::RuleFlags;
9use super::RuleAction;
10
11const RULE_HEADER_LEN: usize = 12;
12
13buffer!(RuleMessageBuffer(RULE_HEADER_LEN) {
14 family: (u8, 0),
15 dst_len: (u8, 1),
16 src_len: (u8, 2),
17 tos: (u8, 3),
18 table: (u8, 4),
19 reserve_1: (u8, 5),
20 reserve_2: (u8, 6),
21 action: (u8, 7),
22 flags: (u32, 8..RULE_HEADER_LEN),
23 payload: (slice, RULE_HEADER_LEN..),
24});
25
26impl<'a, T: AsRef<[u8]> + ?Sized> RuleMessageBuffer<&'a T> {
27 pub fn attributes(&self) -> impl Iterator<Item = Result<NlaBuffer<&'a [u8]>, NlaError>> {
28 NlasIterator::new(self.payload())
29 }
30}
31
32#[derive(Debug, PartialEq, Eq, Clone, Default)]
34pub struct RuleHeader {
35 pub family: AddressFamily,
36 pub dst_len: u8,
37 pub src_len: u8,
38 pub tos: u8,
39 pub table: u8,
40 pub action: RuleAction,
41 pub flags: RuleFlags,
42}
43
44impl Emitable for RuleHeader {
45 fn buffer_len(&self) -> usize {
46 RULE_HEADER_LEN
47 }
48
49 fn emit(&self, buffer: &mut [u8]) {
50 let mut packet = RuleMessageBuffer::new(buffer);
51 packet.set_family(self.family.into());
52 packet.set_dst_len(self.dst_len);
53 packet.set_src_len(self.src_len);
54 packet.set_table(self.table);
55 packet.set_tos(self.tos);
56 packet.set_action(self.action.into());
57 packet.set_flags(self.flags.bits());
58 }
59}
60
61impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<RuleMessageBuffer<&'a T>> for RuleHeader {
62 type Error = ();
63 fn parse(buf: &RuleMessageBuffer<&'a T>) -> Result<Self, ()> {
64 Ok(RuleHeader {
65 family: buf.family().into(),
66 dst_len: buf.dst_len(),
67 src_len: buf.src_len(),
68 tos: buf.tos(),
69 table: buf.table(),
70 action: buf.action().into(),
71 flags: RuleFlags::from_bits_retain(buf.flags()),
72 })
73 }
74}