@@ -22,7 +22,7 @@ const IFLA_MACVLAN_BC_CUTOFF: u16 = 9;
2222#[ derive( Debug , PartialEq , Eq , Clone ) ]
2323#[ non_exhaustive]
2424pub enum InfoMacVlan {
25- Mode ( u32 ) ,
25+ Mode ( MacVlanMode ) ,
2626 Flags ( u16 ) ,
2727 MacAddrMode ( u32 ) ,
2828 MacAddr ( [ u8 ; 6 ] ) ,
@@ -37,34 +37,38 @@ pub enum InfoMacVlan {
3737
3838impl Nla for InfoMacVlan {
3939 fn value_len ( & self ) -> usize {
40- use self :: InfoMacVlan :: * ;
4140 match self {
42- Mode ( _) => 4 ,
43- Flags ( _) => 2 ,
44- MacAddrMode ( _) => 4 ,
45- MacAddr ( _) => 6 ,
46- MacAddrData ( ref nlas) => nlas. as_slice ( ) . buffer_len ( ) ,
47- MacAddrCount ( _) => 4 ,
48- BcQueueLen ( _) => 4 ,
49- BcQueueLenUsed ( _) => 4 ,
50- BcCutoff ( _) => 4 ,
51- Other ( nla) => nla. value_len ( ) ,
41+ Self :: Mode ( _) => 4 ,
42+ Self :: Flags ( _) => 2 ,
43+ Self :: MacAddrMode ( _) => 4 ,
44+ Self :: MacAddr ( _) => 6 ,
45+ Self :: MacAddrData ( ref nlas) => nlas. as_slice ( ) . buffer_len ( ) ,
46+ Self :: MacAddrCount ( _) => 4 ,
47+ Self :: BcQueueLen ( _) => 4 ,
48+ Self :: BcQueueLenUsed ( _) => 4 ,
49+ Self :: BcCutoff ( _) => 4 ,
50+ Self :: Other ( nla) => nla. value_len ( ) ,
5251 }
5352 }
5453
5554 fn emit_value ( & self , buffer : & mut [ u8 ] ) {
56- use self :: InfoMacVlan :: * ;
5755 match self {
58- Mode ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
59- Flags ( value) => NativeEndian :: write_u16 ( buffer, * value) ,
60- MacAddrMode ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
61- MacAddr ( bytes) => buffer. copy_from_slice ( bytes) ,
62- MacAddrData ( ref nlas) => nlas. as_slice ( ) . emit ( buffer) ,
63- MacAddrCount ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
64- BcQueueLen ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
65- BcQueueLenUsed ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
66- BcCutoff ( value) => NativeEndian :: write_i32 ( buffer, * value) ,
67- Other ( nla) => nla. emit_value ( buffer) ,
56+ Self :: Mode ( value) => {
57+ NativeEndian :: write_u32 ( buffer, ( * value) . into ( ) )
58+ }
59+ Self :: Flags ( value) => NativeEndian :: write_u16 ( buffer, * value) ,
60+ Self :: MacAddrMode ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
61+ Self :: MacAddr ( bytes) => buffer. copy_from_slice ( bytes) ,
62+ Self :: MacAddrData ( ref nlas) => nlas. as_slice ( ) . emit ( buffer) ,
63+ Self :: MacAddrCount ( value) => {
64+ NativeEndian :: write_u32 ( buffer, * value)
65+ }
66+ Self :: BcQueueLen ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
67+ Self :: BcQueueLenUsed ( value) => {
68+ NativeEndian :: write_u32 ( buffer, * value)
69+ }
70+ Self :: BcCutoff ( value) => NativeEndian :: write_i32 ( buffer, * value) ,
71+ Self :: Other ( nla) => nla. emit_value ( buffer) ,
6872 }
6973 }
7074
@@ -92,7 +96,8 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoMacVlan {
9296 Ok ( match buf. kind ( ) {
9397 IFLA_MACVLAN_MODE => Mode (
9498 parse_u32 ( payload)
95- . context ( "invalid IFLA_MACVLAN_MODE value" ) ?,
99+ . context ( "invalid IFLA_MACVLAN_MODE value" ) ?
100+ . into ( ) ,
96101 ) ,
97102 IFLA_MACVLAN_FLAGS => Flags (
98103 parse_u16 ( payload)
@@ -142,7 +147,7 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoMacVlan {
142147#[ derive( Debug , PartialEq , Eq , Clone ) ]
143148#[ non_exhaustive]
144149pub enum InfoMacVtap {
145- Mode ( u32 ) ,
150+ Mode ( MacVtapMode ) ,
146151 Flags ( u16 ) ,
147152 MacAddrMode ( u32 ) ,
148153 MacAddr ( [ u8 ; 6 ] ) ,
@@ -174,7 +179,7 @@ impl Nla for InfoMacVtap {
174179 fn emit_value ( & self , buffer : & mut [ u8 ] ) {
175180 use self :: InfoMacVtap :: * ;
176181 match self {
177- Mode ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
182+ Mode ( value) => NativeEndian :: write_u32 ( buffer, ( * value) . into ( ) ) ,
178183 Flags ( value) => NativeEndian :: write_u16 ( buffer, * value) ,
179184 MacAddrMode ( value) => NativeEndian :: write_u32 ( buffer, * value) ,
180185 MacAddr ( bytes) => buffer. copy_from_slice ( bytes) ,
@@ -211,7 +216,8 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoMacVtap {
211216 Ok ( match buf. kind ( ) {
212217 IFLA_MACVLAN_MODE => Mode (
213218 parse_u32 ( payload)
214- . context ( "invalid IFLA_MACVLAN_MODE value" ) ?,
219+ . context ( "invalid IFLA_MACVLAN_MODE value" ) ?
220+ . into ( ) ,
215221 ) ,
216222 IFLA_MACVLAN_FLAGS => Flags (
217223 parse_u16 ( payload)
@@ -257,3 +263,51 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoMacVtap {
257263 } )
258264 }
259265}
266+
267+ const MACVLAN_MODE_PRIVATE : u32 = 1 ;
268+ const MACVLAN_MODE_VEPA : u32 = 2 ;
269+ const MACVLAN_MODE_BRIDGE : u32 = 4 ;
270+ const MACVLAN_MODE_PASSTHRU : u32 = 8 ;
271+ const MACVLAN_MODE_SOURCE : u32 = 16 ;
272+
273+ #[ derive( Debug , PartialEq , Eq , Clone , Copy ) ]
274+ #[ non_exhaustive]
275+ pub enum MacVlanMode {
276+ Private ,
277+ Vepa ,
278+ Bridge ,
279+ Passthrough ,
280+ Source ,
281+ Other ( u32 ) ,
282+ }
283+
284+ pub type MacVtapMode = MacVlanMode ;
285+
286+ impl From < u32 > for MacVlanMode {
287+ fn from ( d : u32 ) -> Self {
288+ match d {
289+ MACVLAN_MODE_PRIVATE => Self :: Private ,
290+ MACVLAN_MODE_VEPA => Self :: Vepa ,
291+ MACVLAN_MODE_BRIDGE => Self :: Bridge ,
292+ MACVLAN_MODE_PASSTHRU => Self :: Passthrough ,
293+ MACVLAN_MODE_SOURCE => Self :: Source ,
294+ _ => {
295+ log:: warn!( "Unknown MAC VLAN mode {}" , d) ;
296+ Self :: Other ( d)
297+ }
298+ }
299+ }
300+ }
301+
302+ impl From < MacVlanMode > for u32 {
303+ fn from ( v : MacVlanMode ) -> u32 {
304+ match v {
305+ MacVlanMode :: Private => MACVLAN_MODE_PRIVATE ,
306+ MacVlanMode :: Vepa => MACVLAN_MODE_VEPA ,
307+ MacVlanMode :: Bridge => MACVLAN_MODE_BRIDGE ,
308+ MacVlanMode :: Passthrough => MACVLAN_MODE_PASSTHRU ,
309+ MacVlanMode :: Source => MACVLAN_MODE_SOURCE ,
310+ MacVlanMode :: Other ( d) => d,
311+ }
312+ }
313+ }
0 commit comments