netlink_packet_route/rtnl/rule/
header.rs

1// SPDX-License-Identifier: MIT
2
3use 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// see https://github.com/torvalds/linux/blob/master/include/uapi/linux/fib_rules.h
31// see https://github.com/torvalds/linux/blob/master/include/net/fib_rules.h
32#[derive(Debug, PartialEq, Eq, Clone, Default)]
33pub struct RuleHeader {
34    /// Address family: one of the `AF_*` constants.
35    pub family: u8,
36    pub dst_len: u8,
37    pub src_len: u8,
38    pub tos: u8,
39    /// RT_TABLE_*
40    pub table: u8,
41    /// FR_ACT_*
42    pub action: u8,
43    /// fib rule flags
44    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}