Skip to content

Commit 9cb67ab

Browse files
committed
feat: InfoBond::XmitHashPolicy(_) as enum values closes #83
1 parent 507ea73 commit 9cb67ab

File tree

4 files changed

+71
-7
lines changed

4 files changed

+71
-7
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
const BOND_OPT_ARP_ALL_TARGETS_ANY: u32 = 0;
7581
const BOND_OPT_ARP_ALL_TARGETS_ALL: u32 = 1;
7682

@@ -274,6 +280,63 @@ impl std::fmt::Display for BondArpValidate {
274280
}
275281
}
276282

283+
#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
284+
pub enum BondXmitHashPolicy {
285+
#[default]
286+
Layer2,
287+
Layer34,
288+
Layer23,
289+
Encap23,
290+
Encap34,
291+
VlanSrcMac,
292+
Other(u8),
293+
}
294+
295+
impl From<BondXmitHashPolicy> for u8 {
296+
fn from(value: BondXmitHashPolicy) -> Self {
297+
match value {
298+
BondXmitHashPolicy::Layer2 => BOND_XMIT_POLICY_LAYER2,
299+
BondXmitHashPolicy::Layer34 => BOND_XMIT_POLICY_LAYER34,
300+
BondXmitHashPolicy::Layer23 => BOND_XMIT_POLICY_LAYER23,
301+
BondXmitHashPolicy::Encap23 => BOND_XMIT_POLICY_ENCAP23,
302+
BondXmitHashPolicy::Encap34 => BOND_XMIT_POLICY_ENCAP34,
303+
BondXmitHashPolicy::VlanSrcMac => BOND_XMIT_POLICY_VLAN_SRCMAC,
304+
BondXmitHashPolicy::Other(d) => d,
305+
}
306+
}
307+
}
308+
309+
impl From<u8> for BondXmitHashPolicy {
310+
fn from(value: u8) -> Self {
311+
match value {
312+
BOND_XMIT_POLICY_LAYER2 => BondXmitHashPolicy::Layer2,
313+
BOND_XMIT_POLICY_LAYER34 => BondXmitHashPolicy::Layer34,
314+
BOND_XMIT_POLICY_LAYER23 => BondXmitHashPolicy::Layer23,
315+
BOND_XMIT_POLICY_ENCAP23 => BondXmitHashPolicy::Encap23,
316+
BOND_XMIT_POLICY_ENCAP34 => BondXmitHashPolicy::Encap34,
317+
BOND_XMIT_POLICY_VLAN_SRCMAC => BondXmitHashPolicy::VlanSrcMac,
318+
d => BondXmitHashPolicy::Other(d),
319+
}
320+
}
321+
}
322+
323+
impl std::fmt::Display for BondXmitHashPolicy {
324+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
325+
let kernel_name = match self {
326+
BondXmitHashPolicy::Layer2 => "layer2",
327+
BondXmitHashPolicy::Layer34 => "layer34",
328+
BondXmitHashPolicy::Layer23 => "layer23",
329+
BondXmitHashPolicy::Encap23 => "encap23",
330+
BondXmitHashPolicy::Encap34 => "encap34",
331+
BondXmitHashPolicy::VlanSrcMac => "vlan-src-mac",
332+
BondXmitHashPolicy::Other(d) => {
333+
return write!(f, "unknown-variant ({d})")
334+
}
335+
};
336+
f.write_str(kernel_name)
337+
}
338+
}
339+
277340
#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
278341
pub enum BondArpAllTargets {
279342
#[default]
@@ -397,7 +460,7 @@ pub enum InfoBond {
397460
Primary(u32),
398461
PrimaryReselect(u8),
399462
FailOverMac(u8),
400-
XmitHashPolicy(u8),
463+
XmitHashPolicy(BondXmitHashPolicy),
401464
ResendIgmp(u32),
402465
NumPeerNotif(u8),
403466
AllPortsActive(u8),
@@ -462,10 +525,10 @@ impl Nla for InfoBond {
462525
fn emit_value(&self, buffer: &mut [u8]) {
463526
match self {
464527
Self::Mode(value) => buffer[0] = (*value).into(),
528+
Self::XmitHashPolicy(value) => buffer[0] = (*value).into(),
465529
Self::UseCarrier(value)
466530
| Self::PrimaryReselect(value)
467531
| Self::FailOverMac(value)
468-
| Self::XmitHashPolicy(value)
469532
| Self::NumPeerNotif(value)
470533
| Self::AllPortsActive(value)
471534
| Self::AdLacpActive(value)
@@ -612,7 +675,8 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoBond {
612675
),
613676
IFLA_BOND_XMIT_HASH_POLICY => Self::XmitHashPolicy(
614677
parse_u8(payload)
615-
.context("invalid IFLA_BOND_XMIT_HASH_POLICY value")?,
678+
.context("invalid IFLA_BOND_XMIT_HASH_POLICY value")?
679+
.into(),
616680
),
617681
IFLA_BOND_RESEND_IGMP => Self::ResendIgmp(
618682
parse_u32(payload)

src/link/link_info/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ mod xfrm;
2929
mod xstats;
3030

3131
pub use self::bond::{
32-
BondAdInfo, BondArpAllTargets, BondArpValidate, BondMode, InfoBond,
32+
BondAdInfo, BondArpAllTargets, BondArpValidate, BondMode, InfoBond, BondXmitHashPolicy
3333
};
3434
pub use self::bond_port::{BondPortState, InfoBondPort, MiiStatus};
3535
pub use self::bridge::{

src/link/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ pub use self::link_info::{
4949
InfoVrfPort, InfoVti, InfoVxlan, InfoXfrm, IpVlanFlags, IpVlanMode,
5050
IpVtapFlags, IpVtapMode, LinkInfo, LinkXstats, MacSecCipherId,
5151
MacSecOffload, MacSecValidate, MacVlanMode, MacVtapMode, MiiStatus,
52-
VlanQosMapping,
52+
VlanQosMapping, BondXmitHashPolicy
5353
};
5454
pub use self::link_layer_type::LinkLayerType;
5555
pub use self::link_state::State;

src/link/tests/bond.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::link::{
77
BondArpAllTargets, BondArpValidate, BondMode, BondPortState, InfoBond,
88
InfoBondPort, InfoData, InfoKind, InfoPortData, InfoPortKind,
99
LinkAttribute, LinkHeader, LinkInfo, LinkLayerType, LinkMessage,
10-
LinkMessageBuffer, Map, MiiStatus, State,
10+
LinkMessageBuffer, Map, MiiStatus, State, BondXmitHashPolicy
1111
};
1212
use crate::{AddressFamily, RouteNetlinkMessage};
1313

@@ -68,7 +68,7 @@ fn test_bond_link_info() {
6868
InfoBond::ArpAllTargets(BondArpAllTargets::Any),
6969
InfoBond::PrimaryReselect(0),
7070
InfoBond::FailOverMac(0),
71-
InfoBond::XmitHashPolicy(0),
71+
InfoBond::XmitHashPolicy(BondXmitHashPolicy::Layer2),
7272
InfoBond::ResendIgmp(1),
7373
InfoBond::NumPeerNotif(1),
7474
InfoBond::AllPortsActive(0),

0 commit comments

Comments
 (0)