Skip to content

Commit b337e00

Browse files
little-dudecathay4t
authored andcommitted
use bitflags for RuleFlags
1 parent 386470f commit b337e00

File tree

9 files changed

+40
-86
lines changed

9 files changed

+40
-86
lines changed

src/rule/flags.rs

Lines changed: 11 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -7,66 +7,16 @@ const FIB_RULE_IIF_DETACHED: u32 = 0x00000008;
77
const FIB_RULE_DEV_DETACHED: u32 = FIB_RULE_IIF_DETACHED;
88
const FIB_RULE_OIF_DETACHED: u32 = 0x00000010;
99

10-
#[derive(Clone, Eq, PartialEq, Debug, Copy)]
11-
#[non_exhaustive]
12-
pub enum RuleFlag {
13-
Permanent,
14-
Invert,
15-
Unresolved,
16-
IifDetached,
17-
DevDetached,
18-
OifDetached,
19-
Other(u32),
20-
}
21-
22-
const ALL_RULE_FLAGS: [RuleFlag; 5] = [
23-
RuleFlag::Permanent,
24-
RuleFlag::Invert,
25-
RuleFlag::Unresolved,
26-
RuleFlag::IifDetached,
27-
RuleFlag::OifDetached,
28-
];
29-
30-
impl From<RuleFlag> for u32 {
31-
fn from(v: RuleFlag) -> u32 {
32-
match v {
33-
RuleFlag::Permanent => FIB_RULE_PERMANENT,
34-
RuleFlag::Invert => FIB_RULE_INVERT,
35-
RuleFlag::Unresolved => FIB_RULE_UNRESOLVED,
36-
RuleFlag::IifDetached => FIB_RULE_IIF_DETACHED,
37-
RuleFlag::DevDetached => FIB_RULE_DEV_DETACHED,
38-
RuleFlag::OifDetached => FIB_RULE_OIF_DETACHED,
39-
RuleFlag::Other(i) => i,
40-
}
41-
}
42-
}
43-
44-
#[derive(Clone, Eq, PartialEq, Debug, Default)]
45-
pub(crate) struct VecRuleFlag(pub(crate) Vec<RuleFlag>);
46-
47-
impl From<u32> for VecRuleFlag {
48-
fn from(d: u32) -> Self {
49-
let mut got: u32 = 0;
50-
let mut ret = Vec::new();
51-
for flag in ALL_RULE_FLAGS {
52-
if (d & (u32::from(flag))) > 0 {
53-
ret.push(flag);
54-
got += u32::from(flag);
55-
}
56-
}
57-
if got != d {
58-
ret.push(RuleFlag::Other(d - got));
59-
}
60-
Self(ret)
61-
}
62-
}
63-
64-
impl From<&VecRuleFlag> for u32 {
65-
fn from(v: &VecRuleFlag) -> u32 {
66-
let mut d: u32 = 0;
67-
for flag in &v.0 {
68-
d += u32::from(*flag);
69-
}
70-
d
10+
bitflags! {
11+
#[derive(Clone, Eq, PartialEq, Debug, Copy, Default)]
12+
#[non_exhaustive]
13+
pub struct RuleFlags: u32 {
14+
const Permanent = FIB_RULE_PERMANENT;
15+
const Invert = FIB_RULE_INVERT;
16+
const Unresolved = FIB_RULE_UNRESOLVED;
17+
const IifDetached = FIB_RULE_IIF_DETACHED;
18+
const DevDetached = FIB_RULE_DEV_DETACHED;
19+
const OifDetached = FIB_RULE_OIF_DETACHED;
20+
const _ = !0;
7121
}
7222
}

src/rule/header.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use netlink_packet_utils::{
66
DecodeError,
77
};
88

9-
use super::{super::AddressFamily, flags::VecRuleFlag, RuleAction, RuleFlag};
9+
use super::{super::AddressFamily, flags::RuleFlags, RuleAction};
1010

1111
const RULE_HEADER_LEN: usize = 12;
1212

@@ -40,7 +40,7 @@ pub struct RuleHeader {
4040
pub tos: u8,
4141
pub table: u8,
4242
pub action: RuleAction,
43-
pub flags: Vec<RuleFlag>,
43+
pub flags: RuleFlags,
4444
}
4545

4646
impl Emitable for RuleHeader {
@@ -56,7 +56,7 @@ impl Emitable for RuleHeader {
5656
packet.set_table(self.table);
5757
packet.set_tos(self.tos);
5858
packet.set_action(self.action.into());
59-
packet.set_flags(u32::from(&VecRuleFlag(self.flags.to_vec())));
59+
packet.set_flags(self.flags.bits());
6060
}
6161
}
6262

@@ -71,7 +71,7 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<RuleMessageBuffer<&'a T>>
7171
tos: buf.tos(),
7272
table: buf.table(),
7373
action: buf.action().into(),
74-
flags: VecRuleFlag::from(buf.flags()).0,
74+
flags: RuleFlags::from_bits_retain(buf.flags()),
7575
})
7676
}
7777
}

src/rule/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
mod action;
44
mod attribute;
5-
pub(crate) mod flags;
5+
mod flags;
66
mod header;
77
mod message;
88
mod port_range;
@@ -12,7 +12,7 @@ mod uid_range;
1212

1313
pub use self::action::RuleAction;
1414
pub use self::attribute::RuleAttribute;
15-
pub use self::flags::RuleFlag;
15+
pub use self::flags::RuleFlags;
1616
pub use self::header::{RuleHeader, RuleMessageBuffer};
1717
pub use self::message::RuleMessage;
1818
pub use self::port_range::RulePortRange;

src/rule/tests/fw_mark.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use netlink_packet_utils::{Emitable, Parseable};
55
use crate::{
66
route::RouteProtocol,
77
rule::{
8-
RuleAction, RuleAttribute, RuleHeader, RuleMessage, RuleMessageBuffer,
8+
flags::RuleFlags, RuleAction, RuleAttribute, RuleHeader, RuleMessage,
9+
RuleMessageBuffer,
910
},
1011
AddressFamily,
1112
};
@@ -32,7 +33,7 @@ fn test_ipv4_fwmark_suppress_prefixlength() {
3233
tos: 0,
3334
table: 254,
3435
action: RuleAction::ToTable,
35-
flags: vec![],
36+
flags: RuleFlags::empty(),
3637
},
3738
attributes: vec![
3839
RuleAttribute::Table(254),
@@ -78,7 +79,7 @@ fn test_ipv6_fwmark_suppress_ifgroup() {
7879
tos: 0,
7980
table: 254,
8081
action: RuleAction::ToTable,
81-
flags: vec![],
82+
flags: RuleFlags::empty(),
8283
},
8384
attributes: vec![
8485
RuleAttribute::Table(254),

src/rule/tests/iif_oif.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ use netlink_packet_utils::{Emitable, Parseable};
88
use crate::{
99
route::RouteProtocol,
1010
rule::{
11-
RuleAction, RuleAttribute, RuleHeader, RuleMessage, RuleMessageBuffer,
11+
flags::RuleFlags, RuleAction, RuleAttribute, RuleHeader, RuleMessage,
12+
RuleMessageBuffer,
1213
},
1314
AddressFamily, IpProtocol,
1415
};
@@ -38,7 +39,7 @@ fn test_ipv4_iif_oif_prohibit() {
3839
tos: 0,
3940
table: 0,
4041
action: RuleAction::Prohibit,
41-
flags: vec![],
42+
flags: RuleFlags::empty(),
4243
},
4344
attributes: vec![
4445
RuleAttribute::Table(0),
@@ -91,7 +92,7 @@ fn test_ipv6_iif_oif_ipproto() {
9192
tos: 0,
9293
table: 252,
9394
action: RuleAction::ToTable,
94-
flags: vec![],
95+
flags: RuleFlags::empty(),
9596
},
9697
attributes: vec![
9798
RuleAttribute::Table(500),

src/rule/tests/l3mdev.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use netlink_packet_utils::{Emitable, Parseable};
55
use crate::{
66
route::RouteProtocol,
77
rule::{
8-
RuleAction, RuleAttribute, RuleHeader, RuleMessage, RuleMessageBuffer,
9-
RuleUidRange,
8+
flags::RuleFlags, RuleAction, RuleAttribute, RuleHeader, RuleMessage,
9+
RuleMessageBuffer, RuleUidRange,
1010
},
1111
AddressFamily,
1212
};
@@ -33,7 +33,7 @@ fn test_ipv4_l3mdev() {
3333
tos: 0,
3434
table: 0,
3535
action: RuleAction::ToTable,
36-
flags: vec![],
36+
flags: RuleFlags::empty(),
3737
},
3838
attributes: vec![
3939
RuleAttribute::Table(0),
@@ -78,7 +78,7 @@ fn test_ipv6_l3mdev_uid() {
7878
tos: 0,
7979
table: 0,
8080
action: RuleAction::ToTable,
81-
flags: vec![],
81+
flags: RuleFlags::empty(),
8282
},
8383
attributes: vec![
8484
RuleAttribute::Table(0),

src/rule/tests/on_boot_rules.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ use netlink_packet_utils::{Emitable, Parseable};
55
use crate::{
66
route::RouteProtocol,
77
rule::{
8-
RuleAction, RuleAttribute, RuleHeader, RuleMessage, RuleMessageBuffer,
8+
flags::RuleFlags, RuleAction, RuleAttribute, RuleHeader, RuleMessage,
9+
RuleMessageBuffer,
910
},
1011
AddressFamily,
1112
};
@@ -29,7 +30,7 @@ fn test_ipv4_rule() {
2930
tos: 0,
3031
table: 254,
3132
action: RuleAction::ToTable,
32-
flags: vec![],
33+
flags: RuleFlags::empty(),
3334
},
3435
attributes: vec![
3536
RuleAttribute::Table(254),
@@ -69,7 +70,7 @@ fn test_ipv6_rule() {
6970
tos: 0,
7071
table: 254,
7172
action: RuleAction::ToTable,
72-
flags: vec![],
73+
flags: RuleFlags::empty(),
7374
},
7475
attributes: vec![
7576
RuleAttribute::Table(254),

src/rule/tests/sport_dport.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use netlink_packet_utils::{Emitable, Parseable};
55
use crate::{
66
route::{RouteProtocol, RouteRealm},
77
rule::{
8-
RuleAction, RuleAttribute, RuleHeader, RuleMessage, RuleMessageBuffer,
9-
RulePortRange,
8+
flags::RuleFlags, RuleAction, RuleAttribute, RuleHeader, RuleMessage,
9+
RuleMessageBuffer, RulePortRange,
1010
},
1111
AddressFamily, IpProtocol,
1212
};
@@ -35,7 +35,7 @@ fn test_ipv4_tcp_sport_dport_realm() {
3535
tos: 0,
3636
table: 254,
3737
action: RuleAction::ToTable,
38-
flags: vec![],
38+
flags: RuleFlags::empty(),
3939
},
4040
attributes: vec![
4141
RuleAttribute::Table(254),
@@ -94,7 +94,7 @@ fn test_ipv4_udp_sport_range_dport_range_reals_src_dst() {
9494
tos: 0,
9595
table: 254,
9696
action: RuleAction::ToTable,
97-
flags: vec![],
97+
flags: RuleFlags::empty(),
9898
},
9999
attributes: vec![
100100
RuleAttribute::Table(254),

src/rule/tests/src_dst.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::str::FromStr;
55

66
use netlink_packet_utils::{Emitable, Parseable};
77

8+
use crate::rule::flags::RuleFlags;
89
use crate::{
910
route::RouteProtocol,
1011
rule::{
@@ -35,7 +36,7 @@ fn test_ipv4_src_dst_blackhole() {
3536
tos: 0,
3637
table: 0,
3738
action: RuleAction::Blackhole,
38-
flags: vec![],
39+
flags: RuleFlags::empty(),
3940
},
4041
attributes: vec![
4142
RuleAttribute::Table(0),
@@ -88,7 +89,7 @@ fn test_ipv6_src_dst_goto() {
8889
tos: 0,
8990
table: 0,
9091
action: RuleAction::Goto,
91-
flags: vec![],
92+
flags: RuleFlags::empty(),
9293
},
9394
attributes: vec![
9495
RuleAttribute::Table(0),

0 commit comments

Comments
 (0)