Skip to content

Commit 99bd9d2

Browse files
little-dudecathay4t
authored andcommitted
use bitflags for TcU32OptionsFlags
1 parent 590411d commit 99bd9d2

File tree

6 files changed

+33
-89
lines changed

6 files changed

+33
-89
lines changed

src/tc/filters/cls_u32.rs

Lines changed: 7 additions & 14 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::{VecTcU32OptionFlag, VecTcU32SelectorFlag};
20-
use crate::tc::{TcAction, TcHandle, TcU32OptionFlag, TcU32SelectorFlag};
19+
use super::u32_flags::{TcU32OptionFlags, VecTcU32SelectorFlag};
20+
use crate::tc::{TcAction, TcHandle, TcU32SelectorFlag};
2121

2222
const TC_U32_SEL_BUF_LEN: usize = 16;
2323
const TC_U32_KEY_BUF_LEN: usize = 16;
@@ -55,7 +55,7 @@ pub enum TcFilterU32Option {
5555
Indev(Vec<u8>),
5656
Pnct(Vec<u8>),
5757
Mark(Vec<u8>),
58-
Flags(Vec<TcU32OptionFlag>),
58+
Flags(TcU32OptionFlags),
5959
Other(DefaultNla),
6060
}
6161

@@ -86,10 +86,7 @@ impl Nla for TcFilterU32Option {
8686
Self::Hash(i) | Self::Link(i) | Self::Divisor(i) => {
8787
NativeEndian::write_u32(buffer, *i)
8888
}
89-
Self::Flags(v) => NativeEndian::write_u32(
90-
buffer,
91-
u32::from(&VecTcU32OptionFlag(v.to_vec())),
92-
),
89+
Self::Flags(f) => NativeEndian::write_u32(buffer, f.bits()),
9390
Self::ClassId(i) => NativeEndian::write_u32(buffer, (*i).into()),
9491
Self::Selector(s) => s.emit(buffer),
9592
Self::Action(acts) => acts.as_slice().emit(buffer),
@@ -156,13 +153,9 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>>
156153
TCA_U32_INDEV => Self::Indev(payload.to_vec()),
157154
TCA_U32_PCNT => Self::Pnct(payload.to_vec()),
158155
TCA_U32_MARK => Self::Mark(payload.to_vec()),
159-
TCA_U32_FLAGS => Self::Flags(
160-
VecTcU32OptionFlag::from(
161-
parse_u32(payload)
162-
.context("failed to parse TCA_U32_FLAGS")?,
163-
)
164-
.0,
165-
),
156+
TCA_U32_FLAGS => Self::Flags(TcU32OptionFlags::from_bits_retain(
157+
parse_u32(payload).context("failed to parse TCA_U32_FLAGS")?,
158+
)),
166159
_ => Self::Other(
167160
DefaultNla::parse(buf).context("failed to parse u32 nla")?,
168161
),

src/tc/filters/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@ pub use self::cls_u32::{
88
TcFilterU32, TcFilterU32Option, TcU32Key, TcU32Selector,
99
};
1010
pub use self::matchall::{TcFilterMatchAll, TcFilterMatchAllOption};
11-
pub use self::u32_flags::{TcU32OptionFlag, TcU32SelectorFlag};
11+
pub use self::u32_flags::TcU32SelectorFlag;

src/tc/filters/u32_flags.rs

Lines changed: 10 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -70,64 +70,15 @@ const TCA_CLS_FLAGS_IN_HW: u32 = 1 << 2;
7070
const TCA_CLS_FLAGS_NOT_IN_HW: u32 = 1 << 3;
7171
const TCA_CLS_FLAGS_VERBOSE: u32 = 1 << 4;
7272

73-
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
74-
#[non_exhaustive]
75-
pub enum TcU32OptionFlag {
76-
SkipHw,
77-
SkipSw,
78-
InHw,
79-
NotInHw,
80-
Verbose,
81-
Other(u32),
82-
}
83-
84-
impl From<TcU32OptionFlag> for u32 {
85-
fn from(v: TcU32OptionFlag) -> u32 {
86-
match v {
87-
TcU32OptionFlag::SkipHw => TCA_CLS_FLAGS_SKIP_HW,
88-
TcU32OptionFlag::SkipSw => TCA_CLS_FLAGS_SKIP_SW,
89-
TcU32OptionFlag::InHw => TCA_CLS_FLAGS_IN_HW,
90-
TcU32OptionFlag::NotInHw => TCA_CLS_FLAGS_NOT_IN_HW,
91-
TcU32OptionFlag::Verbose => TCA_CLS_FLAGS_VERBOSE,
92-
TcU32OptionFlag::Other(i) => i,
93-
}
94-
}
95-
}
96-
97-
const ALL_OPTION_FLAGS: [TcU32OptionFlag; 5] = [
98-
TcU32OptionFlag::SkipHw,
99-
TcU32OptionFlag::SkipSw,
100-
TcU32OptionFlag::InHw,
101-
TcU32OptionFlag::NotInHw,
102-
TcU32OptionFlag::Verbose,
103-
];
104-
105-
#[derive(Clone, Eq, PartialEq, Debug)]
106-
pub(crate) struct VecTcU32OptionFlag(pub(crate) Vec<TcU32OptionFlag>);
107-
108-
impl From<u32> for VecTcU32OptionFlag {
109-
fn from(d: u32) -> Self {
110-
let mut got: u32 = 0;
111-
let mut ret = Vec::new();
112-
for flag in ALL_OPTION_FLAGS {
113-
if (d & (u32::from(flag))) > 0 {
114-
ret.push(flag);
115-
got += u32::from(flag);
116-
}
117-
}
118-
if got != d {
119-
ret.push(TcU32OptionFlag::Other(d - got));
120-
}
121-
Self(ret)
122-
}
123-
}
124-
125-
impl From<&VecTcU32OptionFlag> for u32 {
126-
fn from(v: &VecTcU32OptionFlag) -> u32 {
127-
let mut d: u32 = 0;
128-
for flag in &v.0 {
129-
d += u32::from(*flag);
130-
}
131-
d
73+
bitflags! {
74+
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
75+
#[non_exhaustive]
76+
pub struct TcU32OptionFlags: u32 {
77+
const SkipHw = TCA_CLS_FLAGS_SKIP_HW;
78+
const SkipSw = TCA_CLS_FLAGS_SKIP_SW;
79+
const InHw = TCA_CLS_FLAGS_IN_HW;
80+
const NotInHw = TCA_CLS_FLAGS_NOT_IN_HW;
81+
const Verbose = TCA_CLS_FLAGS_VERBOSE;
82+
const _ = !0;
13283
}
13384
}

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, TcU32OptionFlag, TcU32Selector, TcU32SelectorFlag,
21+
TcU32Key, TcU32Selector, TcU32SelectorFlag,
2222
};
2323
pub use self::header::{TcHandle, TcHeader, TcMessageBuffer};
2424
pub use self::message::TcMessage;

src/tc/tests/action_nat.rs

Lines changed: 8 additions & 8 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-
TcAction, TcActionAttribute, TcActionGeneric, TcActionNatOption,
10-
TcActionOption, TcActionType, TcAttribute, TcFilterU32Option, TcHandle,
11-
TcHeader, TcMessage, TcMessageBuffer, TcNat, TcOption, TcStats2,
12-
TcStatsBasic, TcStatsQueue, TcU32Key, TcU32OptionFlag, TcU32Selector,
13-
TcU32SelectorFlag,
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,
1414
},
1515
AddressFamily,
1616
};
@@ -94,9 +94,9 @@ fn test_get_filter_nat() {
9494
}],
9595
})),
9696
TcOption::U32(TcFilterU32Option::Hash(u32::from_be(0x80))),
97-
TcOption::U32(TcFilterU32Option::Flags(vec![
98-
TcU32OptionFlag::NotInHw,
99-
])),
97+
TcOption::U32(TcFilterU32Option::Flags(
98+
TcU32OptionFlags::NotInHw,
99+
)),
100100
TcOption::U32(TcFilterU32Option::Action(vec![TcAction {
101101
tab: 1,
102102
attributes: vec![

src/tc/tests/filter_u32.rs

Lines changed: 6 additions & 6 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-
TcAttribute, TcFilterU32Option, TcHandle, TcHeader, TcMessage,
10-
TcMessageBuffer, TcOption, TcU32Key, TcU32OptionFlag, TcU32Selector,
11-
TcU32SelectorFlag,
9+
filters::u32_flags::TcU32OptionFlags, TcAttribute, TcFilterU32Option,
10+
TcHandle, TcHeader, TcMessage, TcMessageBuffer, TcOption, TcU32Key,
11+
TcU32Selector, TcU32SelectorFlag,
1212
},
1313
AddressFamily,
1414
};
@@ -93,9 +93,9 @@ fn test_get_filter_u32() {
9393
major: 1,
9494
minor: 4,
9595
})),
96-
TcOption::U32(TcFilterU32Option::Flags(vec![
97-
TcU32OptionFlag::NotInHw,
98-
])),
96+
TcOption::U32(TcFilterU32Option::Flags(
97+
TcU32OptionFlags::NotInHw,
98+
)),
9999
TcOption::U32(TcFilterU32Option::Pnct(vec![0; 32])), // TODO
100100
]),
101101
],

0 commit comments

Comments
 (0)