11// SPDX-License-Identifier: MIT
22
3+ use std:: fmt;
4+
35const IFF_UP : u32 = 1 << 0 ;
46const IFF_BROADCAST : u32 = 1 << 1 ;
57const IFF_DEBUG : u32 = 1 << 2 ;
@@ -22,161 +24,35 @@ const IFF_LOWER_UP: u32 = 1 << 16;
2224const IFF_DORMANT : u32 = 1 << 17 ;
2325const IFF_ECHO : u32 = 1 << 18 ;
2426
25- #[ derive( Debug , PartialEq , Eq , Clone , Default ) ]
26- pub ( crate ) struct VecLinkFlag ( pub Vec < LinkFlag > ) ;
27-
28- #[ derive( Debug , PartialEq , Eq , Clone , Copy ) ]
29- #[ non_exhaustive]
30- pub enum LinkFlag {
31- Up ,
32- Broadcast ,
33- Debug ,
34- Loopback ,
35- Pointopoint ,
36- Notrailers ,
37- Running ,
38- Noarp ,
39- Promisc ,
40- Allmulti ,
41- Controller ,
42- Port ,
43- Multicast ,
44- Portsel ,
45- Automedia ,
46- Dynamic ,
47- LowerUp ,
48- Dormant ,
49- Echo ,
50- Other ( u32 ) ,
51- }
52-
53- impl From < u32 > for LinkFlag {
54- fn from ( d : u32 ) -> Self {
55- match d {
56- IFF_UP => Self :: Up ,
57- IFF_BROADCAST => Self :: Broadcast ,
58- IFF_DEBUG => Self :: Debug ,
59- IFF_LOOPBACK => Self :: Loopback ,
60- IFF_POINTOPOINT => Self :: Pointopoint ,
61- IFF_NOTRAILERS => Self :: Notrailers ,
62- IFF_RUNNING => Self :: Running ,
63- IFF_NOARP => Self :: Noarp ,
64- IFF_PROMISC => Self :: Promisc ,
65- IFF_ALLMULTI => Self :: Allmulti ,
66- IFF_CONTROLLER => Self :: Controller ,
67- IFF_PORT => Self :: Port ,
68- IFF_MULTICAST => Self :: Multicast ,
69- IFF_PORTSEL => Self :: Portsel ,
70- IFF_AUTOMEDIA => Self :: Automedia ,
71- IFF_DYNAMIC => Self :: Dynamic ,
72- IFF_LOWER_UP => Self :: LowerUp ,
73- IFF_DORMANT => Self :: Dormant ,
74- IFF_ECHO => Self :: Echo ,
75- _ => Self :: Other ( d) ,
76- }
77- }
78- }
79-
80- impl From < LinkFlag > for u32 {
81- fn from ( v : LinkFlag ) -> u32 {
82- match v {
83- LinkFlag :: Up => IFF_UP ,
84- LinkFlag :: Broadcast => IFF_BROADCAST ,
85- LinkFlag :: Debug => IFF_DEBUG ,
86- LinkFlag :: Loopback => IFF_LOOPBACK ,
87- LinkFlag :: Pointopoint => IFF_POINTOPOINT ,
88- LinkFlag :: Notrailers => IFF_NOTRAILERS ,
89- LinkFlag :: Running => IFF_RUNNING ,
90- LinkFlag :: Noarp => IFF_NOARP ,
91- LinkFlag :: Promisc => IFF_PROMISC ,
92- LinkFlag :: Allmulti => IFF_ALLMULTI ,
93- LinkFlag :: Controller => IFF_CONTROLLER ,
94- LinkFlag :: Port => IFF_PORT ,
95- LinkFlag :: Multicast => IFF_MULTICAST ,
96- LinkFlag :: Portsel => IFF_PORTSEL ,
97- LinkFlag :: Automedia => IFF_AUTOMEDIA ,
98- LinkFlag :: Dynamic => IFF_DYNAMIC ,
99- LinkFlag :: LowerUp => IFF_LOWER_UP ,
100- LinkFlag :: Dormant => IFF_DORMANT ,
101- LinkFlag :: Echo => IFF_ECHO ,
102- LinkFlag :: Other ( i) => i,
103- }
104- }
105- }
106-
107- impl std:: fmt:: Display for LinkFlag {
108- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
109- match self {
110- Self :: Up => write ! ( f, "UP" ) ,
111- Self :: Broadcast => write ! ( f, "BROADCAST" ) ,
112- Self :: Debug => write ! ( f, "DEBUG" ) ,
113- Self :: Loopback => write ! ( f, "LOOPBACK" ) ,
114- Self :: Pointopoint => write ! ( f, "POINTOPOINT" ) ,
115- Self :: Notrailers => write ! ( f, "NOTRAILERS" ) ,
116- Self :: Running => write ! ( f, "RUNNING" ) ,
117- Self :: Noarp => write ! ( f, "NOARP" ) ,
118- Self :: Promisc => write ! ( f, "PROMISC" ) ,
119- Self :: Allmulti => write ! ( f, "ALLMULTI" ) ,
120- Self :: Controller => write ! ( f, "CONTROLLER" ) ,
121- Self :: Port => write ! ( f, "PORT" ) ,
122- Self :: Multicast => write ! ( f, "MULTICAST" ) ,
123- Self :: Portsel => write ! ( f, "PORTSEL" ) ,
124- Self :: Automedia => write ! ( f, "AUTOMEDIA" ) ,
125- Self :: Dynamic => write ! ( f, "DYNAMIC" ) ,
126- Self :: LowerUp => write ! ( f, "LOWER_UP" ) ,
127- Self :: Dormant => write ! ( f, "DORMANT" ) ,
128- Self :: Echo => write ! ( f, "ECHO" ) ,
129- Self :: Other ( i) => write ! ( f, "Other({})" , i) ,
130- }
131- }
132- }
133-
134- // Please sort this list.
135- const ALL_LINK_FLAGS : [ LinkFlag ; 19 ] = [
136- LinkFlag :: Allmulti ,
137- LinkFlag :: Automedia ,
138- LinkFlag :: Broadcast ,
139- LinkFlag :: Controller ,
140- LinkFlag :: Debug ,
141- LinkFlag :: Dormant ,
142- LinkFlag :: Dynamic ,
143- LinkFlag :: Echo ,
144- LinkFlag :: Loopback ,
145- LinkFlag :: LowerUp ,
146- LinkFlag :: Multicast ,
147- LinkFlag :: Noarp ,
148- LinkFlag :: Notrailers ,
149- LinkFlag :: Pointopoint ,
150- LinkFlag :: Port ,
151- LinkFlag :: Portsel ,
152- LinkFlag :: Promisc ,
153- LinkFlag :: Running ,
154- LinkFlag :: Up ,
155- ] ;
156-
157- impl From < u32 > for VecLinkFlag {
158- fn from ( d : u32 ) -> Self {
159- let mut got: u32 = 0 ;
160- let mut ret = Vec :: new ( ) ;
161- for flag in ALL_LINK_FLAGS {
162- if ( d & u32:: from ( flag) ) > 0 {
163- ret. push ( flag) ;
164- got += u32:: from ( flag) ;
165- }
166- }
167- if got != d {
168- ret. push ( LinkFlag :: Other ( d - got) ) ;
169- }
170- Self ( ret)
27+ bitflags ! {
28+ #[ derive( Debug , PartialEq , Eq , Clone , Copy , Default ) ]
29+ #[ non_exhaustive]
30+ pub struct LinkFlags : u32 {
31+ const Up = IFF_UP ;
32+ const Broadcast = IFF_BROADCAST ;
33+ const Debug = IFF_DEBUG ;
34+ const Loopback = IFF_LOOPBACK ;
35+ const Pointopoint = IFF_POINTOPOINT ;
36+ const Notrailers = IFF_NOTRAILERS ;
37+ const Running = IFF_RUNNING ;
38+ const Noarp = IFF_NOARP ;
39+ const Promisc = IFF_PROMISC ;
40+ const Allmulti = IFF_ALLMULTI ;
41+ const Controller = IFF_CONTROLLER ;
42+ const Port = IFF_PORT ;
43+ const Multicast = IFF_MULTICAST ;
44+ const Portsel = IFF_PORTSEL ;
45+ const Automedia = IFF_AUTOMEDIA ;
46+ const Dynamic = IFF_DYNAMIC ;
47+ const LowerUp = IFF_LOWER_UP ;
48+ const Dormant = IFF_DORMANT ;
49+ const Echo = IFF_ECHO ;
50+ const _ = !0 ;
17151 }
17252}
17353
174- impl From < & VecLinkFlag > for u32 {
175- fn from ( v : & VecLinkFlag ) -> u32 {
176- let mut d: u32 = 0 ;
177- for flag in & v. 0 {
178- d += u32:: from ( * flag) ;
179- }
180- d
54+ impl fmt:: Display for LinkFlags {
55+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
56+ bitflags:: parser:: to_writer ( self , f)
18157 }
18258}
0 commit comments