Skip to content

Commit 9271b33

Browse files
little-dudecathay4t
authored andcommitted
use bitflags for RouteNextHopFlags
1 parent ed304a3 commit 9271b33

File tree

2 files changed

+19
-71
lines changed

2 files changed

+19
-71
lines changed

src/route/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ mod message;
1010
pub(crate) mod metrics;
1111
mod mfc_stats;
1212
mod mpls;
13-
pub(crate) mod next_hops;
13+
mod next_hops;
1414
mod preference;
1515
mod realm;
1616
mod via;
@@ -29,7 +29,9 @@ pub use self::message::RouteMessage;
2929
pub use self::metrics::RouteMetric;
3030
pub use self::mfc_stats::{RouteMfcStats, RouteMfcStatsBuffer};
3131
pub use self::mpls::{MplsLabel, RouteMplsIpTunnel, RouteMplsTtlPropagation};
32-
pub use self::next_hops::{RouteNextHop, RouteNextHopBuffer, RouteNextHopFlag};
32+
pub use self::next_hops::{
33+
RouteNextHop, RouteNextHopBuffer, RouteNextHopFlags,
34+
};
3335
pub use self::preference::RoutePreference;
3436
pub use self::realm::RouteRealm;
3537
pub use self::via::{RouteVia, RouteViaBuffer};

src/route/next_hops.rs

Lines changed: 15 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -19,71 +19,18 @@ pub(crate) const RTNH_F_LINKDOWN: u8 = 16;
1919
pub(crate) const RTNH_F_UNRESOLVED: u8 = 32;
2020
pub(crate) const RTNH_F_TRAP: u8 = 64;
2121

22-
#[derive(Clone, Eq, PartialEq, Debug, Copy)]
23-
#[non_exhaustive]
24-
pub enum RouteNextHopFlag {
25-
Dead,
26-
Pervasive,
27-
Onlink,
28-
Offload,
29-
Linkdown,
30-
Unresolved,
31-
Trap,
32-
Other(u8),
33-
}
34-
35-
impl From<RouteNextHopFlag> for u8 {
36-
fn from(v: RouteNextHopFlag) -> u8 {
37-
match v {
38-
RouteNextHopFlag::Dead => RTNH_F_DEAD,
39-
RouteNextHopFlag::Pervasive => RTNH_F_PERVASIVE,
40-
RouteNextHopFlag::Onlink => RTNH_F_ONLINK,
41-
RouteNextHopFlag::Offload => RTNH_F_OFFLOAD,
42-
RouteNextHopFlag::Linkdown => RTNH_F_LINKDOWN,
43-
RouteNextHopFlag::Unresolved => RTNH_F_UNRESOLVED,
44-
RouteNextHopFlag::Trap => RTNH_F_TRAP,
45-
RouteNextHopFlag::Other(i) => i,
46-
}
47-
}
48-
}
49-
50-
const ALL_NH_FLAGS: [RouteNextHopFlag; 7] = [
51-
RouteNextHopFlag::Dead,
52-
RouteNextHopFlag::Pervasive,
53-
RouteNextHopFlag::Onlink,
54-
RouteNextHopFlag::Offload,
55-
RouteNextHopFlag::Linkdown,
56-
RouteNextHopFlag::Unresolved,
57-
RouteNextHopFlag::Trap,
58-
];
59-
60-
#[derive(Clone, Eq, PartialEq, Debug)]
61-
struct VecRouteNextHopFlag(Vec<RouteNextHopFlag>);
62-
63-
impl From<u8> for VecRouteNextHopFlag {
64-
fn from(d: u8) -> Self {
65-
let mut got: u8 = 0;
66-
let mut ret = Vec::new();
67-
for flag in ALL_NH_FLAGS {
68-
if (d & (u8::from(flag))) > 0 {
69-
ret.push(flag);
70-
got += u8::from(flag);
71-
}
72-
}
73-
if got != d {
74-
ret.push(RouteNextHopFlag::Other(d - got));
75-
}
76-
Self(ret)
77-
}
78-
}
79-
80-
impl From<&VecRouteNextHopFlag> for u8 {
81-
fn from(v: &VecRouteNextHopFlag) -> u8 {
82-
let mut d: u8 = 0;
83-
for flag in &v.0 {
84-
d += u8::from(*flag);
85-
}
86-
d
22+
bitflags! {
23+
#[derive(Clone, Eq, PartialEq, Debug, Copy, Default)]
24+
#[non_exhaustive]
25+
pub struct RouteNextHopFlags: u8 {
26+
const Dead = RTNH_F_DEAD;
27+
const Pervasive = RTNH_F_PERVASIVE;
28+
const Onlink = RTNH_F_ONLINK;
29+
const Offload = RTNH_F_OFFLOAD;
30+
const Linkdown = RTNH_F_LINKDOWN;
31+
const Unresolved = RTNH_F_UNRESOLVED;
32+
const Trap = RTNH_F_TRAP;
33+
const _ = !0;
8734
}
8835
}
8936

@@ -138,7 +85,7 @@ impl<'a, T: AsRef<[u8]> + ?Sized> RouteNextHopBuffer<&'a T> {
13885
#[non_exhaustive]
13986
pub struct RouteNextHop {
14087
/// Next-hop flags
141-
pub flags: Vec<RouteNextHopFlag>,
88+
pub flags: RouteNextHopFlags,
14289
/// Next-hop priority
14390
pub hops: u8,
14491
/// Interface index for the next-hop
@@ -168,7 +115,7 @@ impl<'a, T: AsRef<[u8]>>
168115
)
169116
.context("cannot parse route attributes in next-hop")?;
170117
Ok(RouteNextHop {
171-
flags: VecRouteNextHopFlag::from(buf.flags()).0,
118+
flags: RouteNextHopFlags::from_bits_retain(buf.flags()),
172119
hops: buf.hops(),
173120
interface_index: buf.interface_index(),
174121
attributes,
@@ -210,8 +157,7 @@ impl Emitable for RouteNextHop {
210157
fn emit(&self, buffer: &mut [u8]) {
211158
let mut nh_buffer = RouteNextHopBuffer::new(buffer);
212159
nh_buffer.set_length(self.buffer_len() as u16);
213-
nh_buffer
214-
.set_flags(u8::from(&VecRouteNextHopFlag(self.flags.to_vec())));
160+
nh_buffer.set_flags(self.flags.bits());
215161
nh_buffer.set_hops(self.hops);
216162
nh_buffer.set_interface_index(self.interface_index);
217163
self.attributes.as_slice().emit(nh_buffer.payload_mut())

0 commit comments

Comments
 (0)