netlink_packet_route/rtnl/rule/
header.rs1use netlink_packet_utils::{
4 traits::{Emitable, Parseable},
5 DecodeError,
6};
7
8use super::{buffer::RuleMessageBuffer, RULE_HEADER_LEN};
9use crate::constants::*;
10
11bitflags! {
12 #[non_exhaustive]
13pub struct RuleFlags: u32 {
14 const FIB_RULE_PERMANENT = FIB_RULE_PERMANENT;
15 const FIB_RULE_INVERT = FIB_RULE_INVERT;
16 const FIB_RULE_UNRESOLVED = FIB_RULE_UNRESOLVED;
17 const FIB_RULE_IIF_DETACHED = FIB_RULE_IIF_DETACHED;
18 const FIB_RULE_DEV_DETACHED = FIB_RULE_DEV_DETACHED;
19 const FIB_RULE_OIF_DETACHED = FIB_RULE_OIF_DETACHED;
20 const FIB_RULE_FIND_SADDR = FIB_RULE_FIND_SADDR;
21 }
22}
23
24impl Default for RuleFlags {
25 fn default() -> Self {
26 Self::empty()
27 }
28}
29
30#[derive(Debug, PartialEq, Eq, Clone, Default)]
33pub struct RuleHeader {
34 pub family: u8,
36 pub dst_len: u8,
37 pub src_len: u8,
38 pub tos: u8,
39 pub table: u8,
41 pub action: u8,
43 pub flags: u32,
45}
46
47impl Emitable for RuleHeader {
48 fn buffer_len(&self) -> usize {
49 RULE_HEADER_LEN
50 }
51
52 fn emit(&self, buffer: &mut [u8]) {
53 let mut packet = RuleMessageBuffer::new(buffer);
54 packet.set_family(self.family);
55 packet.set_dst_len(self.dst_len);
56 packet.set_src_len(self.src_len);
57 packet.set_flags(self.flags);
58 packet.set_table(self.table);
59 packet.set_tos(self.tos);
60 packet.set_action(self.action);
61 }
62}
63
64impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<RuleMessageBuffer<&'a T>>
65 for RuleHeader
66{
67 fn parse(buf: &RuleMessageBuffer<&'a T>) -> Result<Self, DecodeError> {
68 Ok(RuleHeader {
69 family: buf.family(),
70 dst_len: buf.dst_len(),
71 src_len: buf.src_len(),
72 tos: buf.tos(),
73 table: buf.table(),
74 action: buf.action(),
75 flags: buf.flags(),
76 })
77 }
78}