@@ -52,6 +52,14 @@ const IFLA_BOND_AD_LACP_ACTIVE: u16 = 29;
5252const IFLA_BOND_MISSED_MAX : u16 = 30 ;
5353const IFLA_BOND_NS_IP6_TARGET : u16 = 31 ;
5454
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+
5563#[ derive( Debug , Clone , Eq , PartialEq ) ]
5664#[ non_exhaustive]
5765pub enum BondAdInfo {
@@ -130,6 +138,67 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for BondAdInfo {
130138 }
131139}
132140
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+
133202// Some attributes (ARP_IP_TARGET, NS_IP6_TARGET) contain a nested
134203// list of IP addresses, where each element uses the index as NLA kind
135204// and the address as value. InfoBond exposes vectors of IP addresses,
@@ -199,7 +268,7 @@ impl Nla for BondIpAddrNla {
199268#[ derive( Debug , PartialEq , Eq , Clone ) ]
200269#[ non_exhaustive]
201270pub enum InfoBond {
202- Mode ( u8 ) ,
271+ Mode ( BondMode ) ,
203272 ActivePort ( u32 ) ,
204273 MiiMon ( u32 ) ,
205274 UpDelay ( u32 ) ,
@@ -276,8 +345,8 @@ impl Nla for InfoBond {
276345
277346 fn emit_value ( & self , buffer : & mut [ u8 ] ) {
278347 match self {
279- Self :: Mode ( value)
280- | Self :: UseCarrier ( value)
348+ Self :: Mode ( value) => buffer [ 0 ] = ( * value ) . into ( ) ,
349+ Self :: UseCarrier ( value)
281350 | Self :: PrimaryReselect ( value)
282351 | Self :: FailOverMac ( value)
283352 | Self :: XmitHashPolicy ( value)
@@ -361,7 +430,9 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoBond {
361430 let payload = buf. value ( ) ;
362431 Ok ( match buf. kind ( ) {
363432 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 ( ) ,
365436 ) ,
366437 IFLA_BOND_ACTIVE_PORT => Self :: ActivePort (
367438 parse_u32 ( payload)
0 commit comments