@@ -52,6 +52,14 @@ const IFLA_BOND_AD_LACP_ACTIVE: u16 = 29;
52
52
const IFLA_BOND_MISSED_MAX : u16 = 30 ;
53
53
const IFLA_BOND_NS_IP6_TARGET : u16 = 31 ;
54
54
55
+ const BOND_MODE_ROUNDROBIN : u8 = 0 ;
56
+ const BOND_MODE_ACTIVEBACKUP : u8 = 1 ;
57
+ const BOND_MODE_XOR : u8 = 2 ;
58
+ const BOND_MODE_BROADCAST : u8 = 3 ;
59
+ const BOND_MODE_8023AD : u8 = 4 ;
60
+ const BOND_MODE_TLB : u8 = 5 ;
61
+ const BOND_MODE_ALB : u8 = 6 ;
62
+
55
63
#[ derive( Debug , Clone , Eq , PartialEq ) ]
56
64
#[ non_exhaustive]
57
65
pub enum BondAdInfo {
@@ -130,6 +138,67 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for BondAdInfo {
130
138
}
131
139
}
132
140
141
+ #[ derive( Debug , Clone , Copy , Eq , PartialEq , Default ) ]
142
+ #[ non_exhaustive]
143
+ pub enum BondMode {
144
+ #[ default]
145
+ BalanceRr ,
146
+ ActiveBackup ,
147
+ BalanceXor ,
148
+ Broadcast ,
149
+ Ieee8023Ad ,
150
+ BalanceTlb ,
151
+ BalanceAlb ,
152
+ Other ( u8 ) ,
153
+ }
154
+
155
+ impl From < u8 > for BondMode {
156
+ fn from ( d : u8 ) -> Self {
157
+ match d {
158
+ BOND_MODE_ROUNDROBIN => Self :: BalanceRr ,
159
+ BOND_MODE_ACTIVEBACKUP => Self :: ActiveBackup ,
160
+ BOND_MODE_XOR => Self :: BalanceXor ,
161
+ BOND_MODE_BROADCAST => Self :: Broadcast ,
162
+ BOND_MODE_8023AD => Self :: Ieee8023Ad ,
163
+ BOND_MODE_TLB => Self :: BalanceTlb ,
164
+ BOND_MODE_ALB => Self :: BalanceAlb ,
165
+ _ => Self :: Other ( d) ,
166
+ }
167
+ }
168
+ }
169
+
170
+ impl From < BondMode > for u8 {
171
+ fn from ( d : BondMode ) -> Self {
172
+ match d {
173
+ BondMode :: BalanceRr => BOND_MODE_ROUNDROBIN ,
174
+ BondMode :: ActiveBackup => BOND_MODE_ACTIVEBACKUP ,
175
+ BondMode :: BalanceXor => BOND_MODE_XOR ,
176
+ BondMode :: Broadcast => BOND_MODE_BROADCAST ,
177
+ BondMode :: Ieee8023Ad => BOND_MODE_8023AD ,
178
+ BondMode :: BalanceTlb => BOND_MODE_TLB ,
179
+ BondMode :: BalanceAlb => BOND_MODE_ALB ,
180
+ BondMode :: Other ( d) => d,
181
+ }
182
+ }
183
+ }
184
+
185
+ impl std:: fmt:: Display for BondMode {
186
+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
187
+ let kernel_name = match self {
188
+ BondMode :: BalanceRr => "balance-rr" ,
189
+ BondMode :: ActiveBackup => "active-backup" ,
190
+ BondMode :: BalanceXor => "balance-xor" ,
191
+ BondMode :: Broadcast => "broadcast" ,
192
+ BondMode :: Ieee8023Ad => "802.3ad" ,
193
+ BondMode :: BalanceTlb => "balance-tlb" ,
194
+ BondMode :: BalanceAlb => "balance-alb" ,
195
+ BondMode :: Other ( d) => return write ! ( f, "unknown-variant ({d})" ) ,
196
+ } ;
197
+
198
+ f. write_str ( kernel_name)
199
+ }
200
+ }
201
+
133
202
// Some attributes (ARP_IP_TARGET, NS_IP6_TARGET) contain a nested
134
203
// list of IP addresses, where each element uses the index as NLA kind
135
204
// and the address as value. InfoBond exposes vectors of IP addresses,
@@ -199,7 +268,7 @@ impl Nla for BondIpAddrNla {
199
268
#[ derive( Debug , PartialEq , Eq , Clone ) ]
200
269
#[ non_exhaustive]
201
270
pub enum InfoBond {
202
- Mode ( u8 ) ,
271
+ Mode ( BondMode ) ,
203
272
ActivePort ( u32 ) ,
204
273
MiiMon ( u32 ) ,
205
274
UpDelay ( u32 ) ,
@@ -276,8 +345,8 @@ impl Nla for InfoBond {
276
345
277
346
fn emit_value ( & self , buffer : & mut [ u8 ] ) {
278
347
match self {
279
- Self :: Mode ( value)
280
- | Self :: UseCarrier ( value)
348
+ Self :: Mode ( value) => buffer [ 0 ] = ( * value ) . into ( ) ,
349
+ Self :: UseCarrier ( value)
281
350
| Self :: PrimaryReselect ( value)
282
351
| Self :: FailOverMac ( value)
283
352
| Self :: XmitHashPolicy ( value)
@@ -361,7 +430,9 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoBond {
361
430
let payload = buf. value ( ) ;
362
431
Ok ( match buf. kind ( ) {
363
432
IFLA_BOND_MODE => Self :: Mode (
364
- parse_u8 ( payload) . context ( "invalid IFLA_BOND_MODE value" ) ?,
433
+ parse_u8 ( payload)
434
+ . context ( "invalid IFLA_BOND_MODE value" ) ?
435
+ . into ( ) ,
365
436
) ,
366
437
IFLA_BOND_ACTIVE_PORT => Self :: ActivePort (
367
438
parse_u32 ( payload)
0 commit comments