Skip to content

Commit deec30b

Browse files
committed
feat: InfoBond::XmitHashPolicy(_) as enum values closes #83
1 parent 7132a7c commit deec30b

File tree

4 files changed

+77
-10
lines changed

4 files changed

+77
-10
lines changed

src/link/link_info/bond.rs

+67-3
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@ const BOND_ARP_VALIDATE_ALL: u32 =
7171
const BOND_ARP_FILTER: u32 = BOND_ARP_VALIDATE_ALL + 1;
7272
const BOND_ARP_FILTER_ACTIVE: u32 = BOND_ARP_FILTER | BOND_ARP_VALIDATE_ACTIVE;
7373
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;
7480

7581
#[derive(Debug, Clone, Eq, PartialEq)]
7682
#[non_exhaustive]
@@ -272,6 +278,63 @@ impl std::fmt::Display for BondArpValidate {
272278
}
273279
}
274280

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+
275338
// Some attributes (ARP_IP_TARGET, NS_IP6_TARGET) contain a nested
276339
// list of IP addresses, where each element uses the index as NLA kind
277340
// and the address as value. InfoBond exposes vectors of IP addresses,
@@ -354,7 +417,7 @@ pub enum InfoBond {
354417
Primary(u32),
355418
PrimaryReselect(u8),
356419
FailOverMac(u8),
357-
XmitHashPolicy(u8),
420+
XmitHashPolicy(BondXmitHashPolicy),
358421
ResendIgmp(u32),
359422
NumPeerNotif(u8),
360423
AllPortsActive(u8),
@@ -419,10 +482,10 @@ impl Nla for InfoBond {
419482
fn emit_value(&self, buffer: &mut [u8]) {
420483
match self {
421484
Self::Mode(value) => buffer[0] = (*value).into(),
485+
Self::XmitHashPolicy(value) => buffer[0] = (*value).into(),
422486
Self::UseCarrier(value)
423487
| Self::PrimaryReselect(value)
424488
| Self::FailOverMac(value)
425-
| Self::XmitHashPolicy(value)
426489
| Self::NumPeerNotif(value)
427490
| Self::AllPortsActive(value)
428491
| Self::AdLacpActive(value)
@@ -566,7 +629,8 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoBond {
566629
),
567630
IFLA_BOND_XMIT_HASH_POLICY => Self::XmitHashPolicy(
568631
parse_u8(payload)
569-
.context("invalid IFLA_BOND_XMIT_HASH_POLICY value")?,
632+
.context("invalid IFLA_BOND_XMIT_HASH_POLICY value")?
633+
.into(),
570634
),
571635
IFLA_BOND_RESEND_IGMP => Self::ResendIgmp(
572636
parse_u32(payload)

src/link/link_info/mod.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,9 @@ mod vxlan;
2828
mod xfrm;
2929
mod xstats;
3030

31-
pub use self::bond::{BondAdInfo, BondArpValidate, BondMode, InfoBond};
31+
pub use self::bond::{
32+
BondAdInfo, BondArpValidate, BondMode, BondXmitHashPolicy, InfoBond,
33+
};
3234
pub use self::bond_port::{BondPortState, InfoBondPort, MiiStatus};
3335
pub use self::bridge::{
3436
BridgeId, BridgeIdBuffer, BridgeQuerierState, InfoBridge,

src/link/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ pub use self::ext_mask::LinkExtentMask;
3939
pub use self::header::{LinkHeader, LinkMessageBuffer};
4040
pub use self::link_flag::LinkFlags;
4141
pub use self::link_info::{
42-
BondAdInfo, BondArpValidate, BondMode, BondPortState, BridgeId,
43-
BridgeIdBuffer, BridgePortMulticastRouter, BridgePortState,
42+
BondAdInfo, BondArpValidate, BondMode, BondPortState, BondXmitHashPolicy,
43+
BridgeId, BridgeIdBuffer, BridgePortMulticastRouter, BridgePortState,
4444
BridgeQuerierState, GeneveDf, HsrProtocol, InfoBond, InfoBondPort,
4545
InfoBridge, InfoBridgePort, InfoData, InfoGeneve, InfoGreTap, InfoGreTap6,
4646
InfoGreTun, InfoGreTun6, InfoGtp, InfoHsr, InfoIpVlan, InfoIpVtap,

src/link/tests/bond.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ use netlink_packet_utils::{Emitable, Parseable};
44

55
use crate::link::link_flag::LinkFlags;
66
use crate::link::{
7-
BondArpValidate, BondMode, BondPortState, InfoBond, InfoBondPort, InfoData,
8-
InfoKind, InfoPortData, InfoPortKind, LinkAttribute, LinkHeader, LinkInfo,
9-
LinkLayerType, LinkMessage, LinkMessageBuffer, Map, MiiStatus, State,
7+
BondArpValidate, BondMode, BondPortState, BondXmitHashPolicy, InfoBond,
8+
InfoBondPort, InfoData, InfoKind, InfoPortData, InfoPortKind,
9+
LinkAttribute, LinkHeader, LinkInfo, LinkLayerType, LinkMessage,
10+
LinkMessageBuffer, Map, MiiStatus, State,
1011
};
1112
use crate::{AddressFamily, RouteNetlinkMessage};
1213

@@ -67,7 +68,7 @@ fn test_bond_link_info() {
6768
InfoBond::ArpAllTargets(0),
6869
InfoBond::PrimaryReselect(0),
6970
InfoBond::FailOverMac(0),
70-
InfoBond::XmitHashPolicy(0),
71+
InfoBond::XmitHashPolicy(BondXmitHashPolicy::Layer2),
7172
InfoBond::ResendIgmp(1),
7273
InfoBond::NumPeerNotif(1),
7374
InfoBond::AllPortsActive(0),

0 commit comments

Comments
 (0)