Skip to content

Commit 3e16f9c

Browse files
Gilnaacathay4t
authored andcommitted
Convert InfoBond::Mode into an enum.
Closes #78 Signed-off-by: Gilad Naaman <[email protected]>
1 parent a8d125c commit 3e16f9c

File tree

4 files changed

+81
-10
lines changed

4 files changed

+81
-10
lines changed

src/link/link_info/bond.rs

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ const IFLA_BOND_AD_LACP_ACTIVE: u16 = 29;
5252
const IFLA_BOND_MISSED_MAX: u16 = 30;
5353
const 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]
5765
pub 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]
201270
pub 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)

src/link/link_info/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ mod vxlan;
2727
mod xfrm;
2828
mod xstats;
2929

30-
pub use self::bond::{BondAdInfo, InfoBond};
30+
pub use self::bond::{BondAdInfo, BondMode, InfoBond};
3131
pub use self::bond_port::{BondPortState, InfoBondPort, MiiStatus};
3232
pub use self::bridge::{
3333
BridgeId, BridgeIdBuffer, BridgeQuerierState, InfoBridge,

src/link/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ pub use self::ext_mask::LinkExtentMask;
3838
pub use self::header::{LinkHeader, LinkMessageBuffer};
3939
pub use self::link_flag::LinkFlags;
4040
pub use self::link_info::{
41-
BondAdInfo, BondPortState, BridgeId, BridgeIdBuffer,
41+
BondAdInfo, BondMode, BondPortState, BridgeId, BridgeIdBuffer,
4242
BridgePortMulticastRouter, BridgePortState, BridgeQuerierState,
4343
HsrProtocol, InfoBond, InfoBondPort, InfoBridge, InfoBridgePort, InfoData,
4444
InfoGreTap, InfoGreTap6, InfoGreTun, InfoGreTun6, InfoGtp, InfoHsr,

src/link/tests/bond.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ use netlink_packet_utils::{Emitable, Parseable};
44

55
use crate::link::link_flag::LinkFlags;
66
use crate::link::{
7-
BondPortState, InfoBond, InfoBondPort, InfoData, InfoKind, InfoPortData,
8-
InfoPortKind, LinkAttribute, LinkHeader, LinkInfo, LinkLayerType,
9-
LinkMessage, LinkMessageBuffer, MiiStatus,
7+
BondMode, BondPortState, InfoBond, InfoBondPort, InfoData, InfoKind,
8+
InfoPortData, InfoPortKind, LinkAttribute, LinkHeader, LinkInfo,
9+
LinkLayerType, LinkMessage, LinkMessageBuffer, MiiStatus,
1010
};
1111
use crate::AddressFamily;
1212

@@ -56,7 +56,7 @@ fn test_bond_link_info() {
5656
attributes: vec![LinkAttribute::LinkInfo(vec![
5757
LinkInfo::Kind(InfoKind::Bond),
5858
LinkInfo::Data(InfoData::Bond(vec![
59-
InfoBond::Mode(0),
59+
InfoBond::Mode(BondMode::BalanceRr),
6060
InfoBond::MiiMon(0),
6161
InfoBond::UpDelay(0),
6262
InfoBond::DownDelay(0),

0 commit comments

Comments
 (0)