@@ -19,71 +19,18 @@ pub(crate) const RTNH_F_LINKDOWN: u8 = 16;
1919pub ( crate ) const RTNH_F_UNRESOLVED : u8 = 32 ;
2020pub ( 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]
13986pub 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