Skip to content

Commit 386470f

Browse files
little-dudecathay4t
authored andcommitted
use bitflags for TcU32SelectorFlags
1 parent 99bd9d2 commit 386470f

File tree

6 files changed

+27
-74
lines changed

6 files changed

+27
-74
lines changed

src/tc/filters/cls_u32.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ use netlink_packet_utils::{
1616
DecodeError,
1717
};
1818

19-
use super::u32_flags::{TcU32OptionFlags, VecTcU32SelectorFlag};
20-
use crate::tc::{TcAction, TcHandle, TcU32SelectorFlag};
19+
use super::u32_flags::{TcU32OptionFlags, TcU32SelectorFlags};
20+
use crate::tc::{TcAction, TcHandle};
2121

2222
const TC_U32_SEL_BUF_LEN: usize = 16;
2323
const TC_U32_KEY_BUF_LEN: usize = 16;
@@ -166,7 +166,7 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>>
166166
#[derive(Debug, PartialEq, Eq, Clone, Default)]
167167
#[non_exhaustive]
168168
pub struct TcU32Selector {
169-
pub flags: Vec<TcU32SelectorFlag>,
169+
pub flags: TcU32SelectorFlags,
170170
pub offshift: u8,
171171
pub nkeys: u8,
172172
pub offmask: u16,
@@ -197,7 +197,7 @@ impl Emitable for TcU32Selector {
197197

198198
fn emit(&self, buffer: &mut [u8]) {
199199
let mut packet = TcU32SelectorBuffer::new(buffer);
200-
packet.set_flags(u8::from(&VecTcU32SelectorFlag(self.flags.to_vec())));
200+
packet.set_flags(self.flags.bits());
201201
packet.set_offshift(self.offshift);
202202
packet.set_offmask(self.offmask);
203203
packet.set_off(self.off);
@@ -236,7 +236,7 @@ impl<T: AsRef<[u8]> + ?Sized> Parseable<TcU32SelectorBuffer<&T>>
236236
}
237237

238238
Ok(Self {
239-
flags: VecTcU32SelectorFlag::from(buf.flags()).0,
239+
flags: TcU32SelectorFlags::from_bits_retain(buf.flags()),
240240
offshift: buf.offshift(),
241241
nkeys,
242242
offmask: buf.offmask(),

src/tc/filters/mod.rs

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

33
mod cls_u32;
44
mod matchall;
5-
pub(crate) mod u32_flags;
5+
mod u32_flags;
66

77
pub use self::cls_u32::{
88
TcFilterU32, TcFilterU32Option, TcU32Key, TcU32Selector,
99
};
1010
pub use self::matchall::{TcFilterMatchAll, TcFilterMatchAllOption};
11-
pub use self::u32_flags::TcU32SelectorFlag;
11+
pub use u32_flags::{TcU32OptionFlags, TcU32SelectorFlags};

src/tc/filters/u32_flags.rs

Lines changed: 9 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -5,62 +5,15 @@ const TC_U32_OFFSET: u8 = 2;
55
const TC_U32_VAROFFSET: u8 = 4;
66
const TC_U32_EAT: u8 = 8;
77

8-
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
9-
#[non_exhaustive]
10-
pub enum TcU32SelectorFlag {
11-
Terminal,
12-
Offset,
13-
VarOffset,
14-
Eat,
15-
Other(u8),
16-
}
17-
18-
impl From<TcU32SelectorFlag> for u8 {
19-
fn from(v: TcU32SelectorFlag) -> u8 {
20-
match v {
21-
TcU32SelectorFlag::Terminal => TC_U32_TERMINAL,
22-
TcU32SelectorFlag::Offset => TC_U32_OFFSET,
23-
TcU32SelectorFlag::VarOffset => TC_U32_VAROFFSET,
24-
TcU32SelectorFlag::Eat => TC_U32_EAT,
25-
TcU32SelectorFlag::Other(i) => i,
26-
}
27-
}
28-
}
29-
30-
const ALL_SELECTOR_FLAGS: [TcU32SelectorFlag; 4] = [
31-
TcU32SelectorFlag::Terminal,
32-
TcU32SelectorFlag::Offset,
33-
TcU32SelectorFlag::VarOffset,
34-
TcU32SelectorFlag::Eat,
35-
];
36-
37-
#[derive(Clone, Eq, PartialEq, Debug)]
38-
pub(crate) struct VecTcU32SelectorFlag(pub(crate) Vec<TcU32SelectorFlag>);
39-
40-
impl From<u8> for VecTcU32SelectorFlag {
41-
fn from(d: u8) -> Self {
42-
let mut got: u8 = 0;
43-
let mut ret = Vec::new();
44-
for flag in ALL_SELECTOR_FLAGS {
45-
if (d & (u8::from(flag))) > 0 {
46-
ret.push(flag);
47-
got += u8::from(flag);
48-
}
49-
}
50-
if got != d {
51-
ret.push(TcU32SelectorFlag::Other(d - got));
52-
}
53-
Self(ret)
54-
}
55-
}
56-
57-
impl From<&VecTcU32SelectorFlag> for u8 {
58-
fn from(v: &VecTcU32SelectorFlag) -> u8 {
59-
let mut d: u8 = 0;
60-
for flag in &v.0 {
61-
d += u8::from(*flag);
62-
}
63-
d
8+
bitflags! {
9+
#[derive(Debug, Default, PartialEq, Eq, Clone, Copy)]
10+
#[non_exhaustive]
11+
pub struct TcU32SelectorFlags: u8 {
12+
const Terminal = TC_U32_TERMINAL;
13+
const Offset = TC_U32_OFFSET;
14+
const VarOffset = TC_U32_VAROFFSET;
15+
const Eat = TC_U32_EAT;
16+
const _ = !0;
6417
}
6518
}
6619

src/tc/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ pub use self::actions::{
1818
pub use self::attribute::TcAttribute;
1919
pub use self::filters::{
2020
TcFilterMatchAll, TcFilterMatchAllOption, TcFilterU32, TcFilterU32Option,
21-
TcU32Key, TcU32Selector, TcU32SelectorFlag,
21+
TcU32Key, TcU32Selector,
2222
};
2323
pub use self::header::{TcHandle, TcHeader, TcMessageBuffer};
2424
pub use self::message::TcMessage;

src/tc/tests/action_nat.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ use netlink_packet_utils::{Emitable, Parseable};
66

77
use crate::{
88
tc::{
9-
filters::u32_flags::TcU32OptionFlags, TcAction, TcActionAttribute,
10-
TcActionGeneric, TcActionNatOption, TcActionOption, TcActionType,
11-
TcAttribute, TcFilterU32Option, TcHandle, TcHeader, TcMessage,
12-
TcMessageBuffer, TcNat, TcOption, TcStats2, TcStatsBasic, TcStatsQueue,
13-
TcU32Key, TcU32Selector, TcU32SelectorFlag,
9+
filters::{TcU32OptionFlags, TcU32SelectorFlags},
10+
TcAction, TcActionAttribute, TcActionGeneric, TcActionNatOption,
11+
TcActionOption, TcActionType, TcAttribute, TcFilterU32Option, TcHandle,
12+
TcHeader, TcMessage, TcMessageBuffer, TcNat, TcOption, TcStats2,
13+
TcStatsBasic, TcStatsQueue, TcU32Key, TcU32Selector,
1414
},
1515
AddressFamily,
1616
};
@@ -76,7 +76,7 @@ fn test_get_filter_nat() {
7676
TcAttribute::Chain(0),
7777
TcAttribute::Options(vec![
7878
TcOption::U32(TcFilterU32Option::Selector(TcU32Selector {
79-
flags: vec![TcU32SelectorFlag::Terminal],
79+
flags: TcU32SelectorFlags::Terminal,
8080
offshift: 0,
8181
nkeys: 1,
8282
offmask: 0,

src/tc/tests/filter_u32.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ use netlink_packet_utils::{Emitable, Parseable};
66

77
use crate::{
88
tc::{
9-
filters::u32_flags::TcU32OptionFlags, TcAttribute, TcFilterU32Option,
10-
TcHandle, TcHeader, TcMessage, TcMessageBuffer, TcOption, TcU32Key,
11-
TcU32Selector, TcU32SelectorFlag,
9+
filters::{TcU32OptionFlags, TcU32SelectorFlags},
10+
TcAttribute, TcFilterU32Option, TcHandle, TcHeader, TcMessage,
11+
TcMessageBuffer, TcOption, TcU32Key, TcU32Selector,
1212
},
1313
AddressFamily,
1414
};
@@ -63,7 +63,7 @@ fn test_get_filter_u32() {
6363
TcAttribute::Chain(0),
6464
TcAttribute::Options(vec![
6565
TcOption::U32(TcFilterU32Option::Selector(TcU32Selector {
66-
flags: vec![TcU32SelectorFlag::Terminal],
66+
flags: TcU32SelectorFlags::Terminal,
6767
offshift: 0,
6868
nkeys: 2,
6969
offmask: 0,

0 commit comments

Comments
 (0)