netlink_packet_route/rtnl/rule/
header.rs

1// SPDX-License-Identifier: MIT
2
3use super::{buffer::RuleMessageBuffer, RULE_HEADER_LEN};
4use crate::{
5    constants::*,
6    utils::{Emitable, Parseable},
7    DecodeError,
8};
9
10bitflags! {
11    pub struct RuleFlags: u32 {
12        const FIB_RULE_PERMANENT = FIB_RULE_PERMANENT;
13        const FIB_RULE_INVERT = FIB_RULE_INVERT;
14        const FIB_RULE_UNRESOLVED = FIB_RULE_UNRESOLVED;
15        const FIB_RULE_IIF_DETACHED = FIB_RULE_IIF_DETACHED;
16        const FIB_RULE_DEV_DETACHED = FIB_RULE_DEV_DETACHED;
17        const FIB_RULE_OIF_DETACHED = FIB_RULE_OIF_DETACHED;
18        const FIB_RULE_FIND_SADDR = FIB_RULE_FIND_SADDR;
19    }
20}
21
22impl Default for RuleFlags {
23    fn default() -> Self {
24        Self::empty()
25    }
26}
27
28// see https://github.com/torvalds/linux/blob/master/include/uapi/linux/fib_rules.h
29// see https://github.com/torvalds/linux/blob/master/include/net/fib_rules.h
30#[derive(Debug, PartialEq, Eq, Clone, Default)]
31pub struct RuleHeader {
32    /// Address family: one of the `AF_*` constants.
33    pub family: u8,
34    pub dst_len: u8,
35    pub src_len: u8,
36    pub tos: u8,
37    /// RT_TABLE_*
38    pub table: u8,
39    /// FR_ACT_*
40    pub action: u8,
41    /// fib rule flags
42    pub flags: u32,
43}
44
45impl Emitable for RuleHeader {
46    fn buffer_len(&self) -> usize {
47        RULE_HEADER_LEN
48    }
49
50    fn emit(&self, buffer: &mut [u8]) {
51        let mut packet = RuleMessageBuffer::new(buffer);
52        packet.set_family(self.family);
53        packet.set_dst_len(self.dst_len);
54        packet.set_src_len(self.src_len);
55        packet.set_flags(self.flags);
56        packet.set_table(self.table);
57        packet.set_tos(self.tos);
58        packet.set_action(self.action);
59    }
60}
61
62impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<RuleMessageBuffer<&'a T>> for RuleHeader {
63    fn parse(buf: &RuleMessageBuffer<&'a T>) -> Result<Self, DecodeError> {
64        Ok(RuleHeader {
65            family: buf.family(),
66            dst_len: buf.dst_len(),
67            src_len: buf.src_len(),
68            tos: buf.tos(),
69            table: buf.table(),
70            action: buf.action(),
71            flags: buf.flags(),
72        })
73    }
74}