@@ -71,6 +71,12 @@ const BOND_ARP_VALIDATE_ALL: u32 =
71
71
const BOND_ARP_FILTER : u32 = BOND_ARP_VALIDATE_ALL + 1 ;
72
72
const BOND_ARP_FILTER_ACTIVE : u32 = BOND_ARP_FILTER | BOND_ARP_VALIDATE_ACTIVE ;
73
73
const BOND_ARP_FILTER_BACKUP : u32 = BOND_ARP_FILTER | BOND_ARP_VALIDATE_BACKUP ;
74
+ const BOND_XMIT_POLICY_LAYER2 : u8 = 0 ;
75
+ const BOND_XMIT_POLICY_LAYER34 : u8 = 1 ;
76
+ const BOND_XMIT_POLICY_LAYER23 : u8 = 2 ;
77
+ const BOND_XMIT_POLICY_ENCAP23 : u8 = 3 ;
78
+ const BOND_XMIT_POLICY_ENCAP34 : u8 = 4 ;
79
+ const BOND_XMIT_POLICY_VLAN_SRCMAC : u8 = 5 ;
74
80
75
81
#[ derive( Debug , Clone , Eq , PartialEq ) ]
76
82
#[ non_exhaustive]
@@ -272,6 +278,63 @@ impl std::fmt::Display for BondArpValidate {
272
278
}
273
279
}
274
280
281
+ #[ derive( Debug , Clone , Copy , Eq , PartialEq , Default ) ]
282
+ pub enum BondXmitHashPolicy {
283
+ #[ default]
284
+ Layer2 ,
285
+ Layer34 ,
286
+ Layer23 ,
287
+ Encap23 ,
288
+ Encap34 ,
289
+ VlanSrcMac ,
290
+ Other ( u8 ) ,
291
+ }
292
+
293
+ impl From < BondXmitHashPolicy > for u8 {
294
+ fn from ( value : BondXmitHashPolicy ) -> Self {
295
+ match value {
296
+ BondXmitHashPolicy :: Layer2 => BOND_XMIT_POLICY_LAYER2 ,
297
+ BondXmitHashPolicy :: Layer34 => BOND_XMIT_POLICY_LAYER34 ,
298
+ BondXmitHashPolicy :: Layer23 => BOND_XMIT_POLICY_LAYER23 ,
299
+ BondXmitHashPolicy :: Encap23 => BOND_XMIT_POLICY_ENCAP23 ,
300
+ BondXmitHashPolicy :: Encap34 => BOND_XMIT_POLICY_ENCAP34 ,
301
+ BondXmitHashPolicy :: VlanSrcMac => BOND_XMIT_POLICY_VLAN_SRCMAC ,
302
+ BondXmitHashPolicy :: Other ( d) => d,
303
+ }
304
+ }
305
+ }
306
+
307
+ impl From < u8 > for BondXmitHashPolicy {
308
+ fn from ( value : u8 ) -> Self {
309
+ match value {
310
+ BOND_XMIT_POLICY_LAYER2 => BondXmitHashPolicy :: Layer2 ,
311
+ BOND_XMIT_POLICY_LAYER34 => BondXmitHashPolicy :: Layer34 ,
312
+ BOND_XMIT_POLICY_LAYER23 => BondXmitHashPolicy :: Layer23 ,
313
+ BOND_XMIT_POLICY_ENCAP23 => BondXmitHashPolicy :: Encap23 ,
314
+ BOND_XMIT_POLICY_ENCAP34 => BondXmitHashPolicy :: Encap34 ,
315
+ BOND_XMIT_POLICY_VLAN_SRCMAC => BondXmitHashPolicy :: VlanSrcMac ,
316
+ d => BondXmitHashPolicy :: Other ( d) ,
317
+ }
318
+ }
319
+ }
320
+
321
+ impl std:: fmt:: Display for BondXmitHashPolicy {
322
+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
323
+ let kernel_name = match self {
324
+ BondXmitHashPolicy :: Layer2 => "layer2" ,
325
+ BondXmitHashPolicy :: Layer34 => "layer34" ,
326
+ BondXmitHashPolicy :: Layer23 => "layer23" ,
327
+ BondXmitHashPolicy :: Encap23 => "encap23" ,
328
+ BondXmitHashPolicy :: Encap34 => "encap34" ,
329
+ BondXmitHashPolicy :: VlanSrcMac => "vlan-src-mac" ,
330
+ BondXmitHashPolicy :: Other ( d) => {
331
+ return write ! ( f, "unknown-variant ({d})" )
332
+ }
333
+ } ;
334
+ f. write_str ( kernel_name)
335
+ }
336
+ }
337
+
275
338
// Some attributes (ARP_IP_TARGET, NS_IP6_TARGET) contain a nested
276
339
// list of IP addresses, where each element uses the index as NLA kind
277
340
// and the address as value. InfoBond exposes vectors of IP addresses,
@@ -354,7 +417,7 @@ pub enum InfoBond {
354
417
Primary ( u32 ) ,
355
418
PrimaryReselect ( u8 ) ,
356
419
FailOverMac ( u8 ) ,
357
- XmitHashPolicy ( u8 ) ,
420
+ XmitHashPolicy ( BondXmitHashPolicy ) ,
358
421
ResendIgmp ( u32 ) ,
359
422
NumPeerNotif ( u8 ) ,
360
423
AllPortsActive ( u8 ) ,
@@ -419,10 +482,10 @@ impl Nla for InfoBond {
419
482
fn emit_value ( & self , buffer : & mut [ u8 ] ) {
420
483
match self {
421
484
Self :: Mode ( value) => buffer[ 0 ] = ( * value) . into ( ) ,
485
+ Self :: XmitHashPolicy ( value) => buffer[ 0 ] = ( * value) . into ( ) ,
422
486
Self :: UseCarrier ( value)
423
487
| Self :: PrimaryReselect ( value)
424
488
| Self :: FailOverMac ( value)
425
- | Self :: XmitHashPolicy ( value)
426
489
| Self :: NumPeerNotif ( value)
427
490
| Self :: AllPortsActive ( value)
428
491
| Self :: AdLacpActive ( value)
@@ -566,7 +629,8 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoBond {
566
629
) ,
567
630
IFLA_BOND_XMIT_HASH_POLICY => Self :: XmitHashPolicy (
568
631
parse_u8 ( payload)
569
- . context ( "invalid IFLA_BOND_XMIT_HASH_POLICY value" ) ?,
632
+ . context ( "invalid IFLA_BOND_XMIT_HASH_POLICY value" ) ?
633
+ . into ( ) ,
570
634
) ,
571
635
IFLA_BOND_RESEND_IGMP => Self :: ResendIgmp (
572
636
parse_u32 ( payload)
0 commit comments