Skip to content

Commit be2796c

Browse files
committed
link: Change LinkAttribute::Mode(u8) to LinkMode
Change u8 of `LinkAttribute::Mode` to enum `LinkMode`. Unit test cases updated. Signed-off-by: Gris Ge <[email protected]>
1 parent 8fb2886 commit be2796c

File tree

11 files changed

+84
-32
lines changed

11 files changed

+84
-32
lines changed

src/link/attribute.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ use super::{
3333
stats::LINK_STATS_LEN,
3434
stats64::LINK_STATS64_LEN,
3535
xdp::VecLinkXdp,
36-
AfSpecBridge, AfSpecUnspec, LinkEvent, LinkExtentMask, LinkInfo,
36+
AfSpecBridge, AfSpecUnspec, LinkEvent, LinkExtentMask, LinkInfo, LinkMode,
3737
LinkPhysId, LinkProtoInfoBridge, LinkProtoInfoInet6,
3838
LinkProtocolDownReason, LinkVfInfo, LinkVfPort, LinkWirelessEvent, LinkXdp,
3939
Map, MapBuffer, Prop, State, Stats, Stats64, Stats64Buffer, StatsBuffer,
@@ -139,7 +139,7 @@ pub enum LinkAttribute {
139139
Qdisc(String),
140140
IfAlias(String),
141141
PhysPortName(String),
142-
Mode(u8),
142+
Mode(LinkMode),
143143
Carrier(u8),
144144
ProtoDown(u8),
145145
Mtu(u32),
@@ -198,7 +198,8 @@ impl Nla for LinkAttribute {
198198
| Self::IfAlias(string)
199199
| Self::PhysPortName(string) => string.len() + 1,
200200

201-
Self::Mode(_) | Self::Carrier(_) | Self::ProtoDown(_) => 1,
201+
Self::Mode(_) => 1,
202+
Self::Carrier(_) | Self::ProtoDown(_) => 1,
202203

203204
Self::Mtu(_)
204205
| Self::NewNetnsId(_)
@@ -264,10 +265,9 @@ impl Nla for LinkAttribute {
264265
buffer[..string.len()].copy_from_slice(string.as_bytes());
265266
buffer[string.len()] = 0;
266267
}
268+
Self::Mode(v) => buffer[0] = (*v).into(),
267269

268-
Self::Mode(val) | Self::Carrier(val) | Self::ProtoDown(val) => {
269-
buffer[0] = *val
270-
}
270+
Self::Carrier(val) | Self::ProtoDown(val) => buffer[0] = *val,
271271

272272
Self::Mtu(value)
273273
| Self::Link(value)
@@ -533,9 +533,9 @@ impl<'a, T: AsRef<[u8]> + ?Sized>
533533
parse_string(payload)
534534
.context("invalid IFLA_PHYS_PORT_NAME value")?,
535535
),
536-
IFLA_LINKMODE => Self::Mode(
536+
IFLA_LINKMODE => Self::Mode(LinkMode::from(
537537
parse_u8(payload).context("invalid IFLA_LINKMODE value")?,
538-
),
538+
)),
539539
IFLA_CARRIER => Self::Carrier(
540540
parse_u8(payload).context("invalid IFLA_CARRIER value")?,
541541
),

src/link/link_mode.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
// SPDX-License-Identifier: MIT
2+
3+
const IF_LINK_MODE_DEFAULT: u8 = 0;
4+
const IF_LINK_MODE_DORMANT: u8 = 1;
5+
const IF_LINK_MODE_TESTING: u8 = 2;
6+
7+
#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
8+
#[non_exhaustive]
9+
pub enum LinkMode {
10+
#[default]
11+
Default,
12+
///limit upward transition to dormant
13+
Dormant,
14+
///limit upward transition to testing
15+
Testing,
16+
Other(u8),
17+
}
18+
19+
impl From<u8> for LinkMode {
20+
fn from(d: u8) -> Self {
21+
match d {
22+
IF_LINK_MODE_DEFAULT => Self::Default,
23+
IF_LINK_MODE_DORMANT => Self::Dormant,
24+
IF_LINK_MODE_TESTING => Self::Testing,
25+
_ => Self::Other(d),
26+
}
27+
}
28+
}
29+
30+
impl From<LinkMode> for u8 {
31+
fn from(v: LinkMode) -> u8 {
32+
match v {
33+
LinkMode::Default => IF_LINK_MODE_DEFAULT,
34+
LinkMode::Dormant => IF_LINK_MODE_DORMANT,
35+
LinkMode::Testing => IF_LINK_MODE_TESTING,
36+
LinkMode::Other(d) => d,
37+
}
38+
}
39+
}
40+
41+
impl std::fmt::Display for LinkMode {
42+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
43+
match self {
44+
Self::Default => write!(f, "DEFAULT"),
45+
Self::Dormant => write!(f, "DORMANT"),
46+
Self::Testing => write!(f, "TESTING"),
47+
Self::Other(d) => write!(f, "UNKNOWN:{d}"),
48+
}
49+
}
50+
}

src/link/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ mod header;
1010
mod link_flag;
1111
mod link_info;
1212
mod link_layer_type;
13+
mod link_mode;
1314
mod link_state;
1415
mod map;
1516
mod message;
@@ -53,6 +54,7 @@ pub use self::link_info::{
5354
VlanQosMapping,
5455
};
5556
pub use self::link_layer_type::LinkLayerType;
57+
pub use self::link_mode::LinkMode;
5658
pub use self::link_state::State;
5759
pub use self::map::{Map, MapBuffer};
5860
pub use self::message::LinkMessage;

src/link/tests/afspec.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use netlink_packet_utils::{nla::DefaultNla, Emitable, Parseable};
55
use crate::{
66
link::{
77
link_flag::LinkFlags, LinkAttribute, LinkHeader, LinkLayerType,
8-
LinkMessage, LinkMessageBuffer, LinkXdp, Map, State, Stats, Stats64,
9-
XdpAttached,
8+
LinkMessage, LinkMessageBuffer, LinkMode, LinkXdp, Map, State, Stats,
9+
Stats64, XdpAttached,
1010
},
1111
AddressFamily,
1212
};
@@ -95,7 +95,7 @@ fn test_empty_af_spec() {
9595
attributes: vec![
9696
LinkAttribute::TxQueueLen(1000),
9797
LinkAttribute::OperState(State::Down),
98-
LinkAttribute::Mode(0),
98+
LinkAttribute::Mode(LinkMode::Default),
9999
LinkAttribute::Mtu(1500),
100100
LinkAttribute::MinMtu(68),
101101
LinkAttribute::MaxMtu(1500),

src/link/tests/bond.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::link::{
88
BondPortState, BondPrimaryReselect, BondXmitHashPolicy, InfoBond,
99
InfoBondPort, InfoData, InfoKind, InfoPortData, InfoPortKind,
1010
LinkAttribute, LinkHeader, LinkInfo, LinkLayerType, LinkMessage,
11-
LinkMessageBuffer, Map, MiiStatus, State,
11+
LinkMessageBuffer, LinkMode, Map, MiiStatus, State,
1212
};
1313
use crate::{AddressFamily, RouteNetlinkMessage};
1414

@@ -190,7 +190,7 @@ fn test_bond_arp_validate() {
190190
LinkAttribute::IfName("bond0".into()),
191191
LinkAttribute::TxQueueLen(1000),
192192
LinkAttribute::OperState(State::Down),
193-
LinkAttribute::Mode(0),
193+
LinkAttribute::Mode(LinkMode::Default),
194194
LinkAttribute::Mtu(1500),
195195
LinkAttribute::MinMtu(68),
196196
LinkAttribute::MaxMtu(65535),

src/link/tests/bridge.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use crate::link::{
1212
BridgeVlanInfoFlags, BridgeVlanTunnelInfo, Inet6CacheInfo, Inet6DevConf,
1313
Inet6IfaceFlags, InetDevConf, InfoBridge, InfoBridgePort, InfoData,
1414
InfoKind, InfoPortData, InfoPortKind, LinkAttribute, LinkHeader, LinkInfo,
15-
LinkLayerType, LinkMessage, LinkMessageBuffer, LinkXdp, Map, State, Stats,
16-
Stats64, XdpAttached,
15+
LinkLayerType, LinkMessage, LinkMessageBuffer, LinkMode, LinkXdp, Map,
16+
State, Stats, Stats64, XdpAttached,
1717
};
1818
use crate::AddressFamily;
1919

@@ -159,7 +159,7 @@ fn test_parse_link_bridge_no_extention_mask() {
159159
LinkAttribute::IfName("br0".into()),
160160
LinkAttribute::TxQueueLen(1000),
161161
LinkAttribute::OperState(State::Up),
162-
LinkAttribute::Mode(0),
162+
LinkAttribute::Mode(LinkMode::Default),
163163
LinkAttribute::Mtu(1500),
164164
LinkAttribute::MinMtu(68),
165165
LinkAttribute::MaxMtu(65535),

src/link/tests/macvtap.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ use crate::link::{
77
AfSpecInet, AfSpecInet6, AfSpecUnspec, Inet6CacheInfo, Inet6DevConf,
88
Inet6IfaceFlags, InetDevConf, InfoData, InfoKind, InfoMacVtap,
99
LinkAttribute, LinkHeader, LinkInfo, LinkLayerType, LinkMessage,
10-
LinkMessageBuffer, LinkXdp, MacVtapMode, Map, State, Stats, Stats64,
11-
XdpAttached,
10+
LinkMessageBuffer, LinkMode, LinkXdp, MacVtapMode, Map, State, Stats,
11+
Stats64, XdpAttached,
1212
};
1313
use crate::AddressFamily;
1414

@@ -120,7 +120,7 @@ fn test_macvtap_link_info() {
120120
LinkAttribute::IfName("mtap0".to_string()),
121121
LinkAttribute::TxQueueLen(500),
122122
LinkAttribute::OperState(State::Down),
123-
LinkAttribute::Mode(0),
123+
LinkAttribute::Mode(LinkMode::Default),
124124
LinkAttribute::Mtu(1500),
125125
LinkAttribute::MinMtu(68),
126126
LinkAttribute::MaxMtu(2304),

src/link/tests/message.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use netlink_packet_utils::traits::{Emitable, ParseableParametrized};
55
use crate::link::link_flag::LinkFlags;
66
use crate::link::{
77
LinkAttribute, LinkHeader, LinkLayerType, LinkMessage, LinkMessageBuffer,
8-
State,
8+
LinkMode, State,
99
};
1010
use crate::AddressFamily;
1111

@@ -120,7 +120,7 @@ fn link_mssage_packet_attributes_read() {
120120
assert_eq!(nla.value(), &[0x00]);
121121
let parsed =
122122
LinkAttribute::parse_with_param(&nla, AddressFamily::Inet).unwrap();
123-
assert_eq!(parsed, LinkAttribute::Mode(0));
123+
assert_eq!(parsed, LinkAttribute::Mode(LinkMode::Default));
124124

125125
// MTU L=8,T=4,V=65536
126126
let nla = attributes.next().unwrap().unwrap();
@@ -182,7 +182,7 @@ fn link_message_emit() {
182182
LinkAttribute::IfName("lo".into()),
183183
LinkAttribute::TxQueueLen(1000),
184184
LinkAttribute::OperState(State::Unknown),
185-
LinkAttribute::Mode(0),
185+
LinkAttribute::Mode(LinkMode::Default),
186186
LinkAttribute::Mtu(0x1_0000),
187187
LinkAttribute::Group(0),
188188
LinkAttribute::Promiscuity(0),

src/link/tests/statistics.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use crate::link::link_flag::LinkFlags;
66
use crate::link::{
77
AfSpecInet, AfSpecInet6, AfSpecUnspec, Icmp6Stats, Inet6CacheInfo,
88
Inet6DevConf, Inet6IfaceFlags, Inet6Stats, InetDevConf, LinkAttribute,
9-
LinkHeader, LinkLayerType, LinkMessage, LinkMessageBuffer, LinkXdp, Map,
10-
Prop, State, Stats, Stats64, XdpAttached,
9+
LinkHeader, LinkLayerType, LinkMessage, LinkMessageBuffer, LinkMode,
10+
LinkXdp, Map, Prop, State, Stats, Stats64, XdpAttached,
1111
};
1212
use crate::AddressFamily;
1313

@@ -147,7 +147,7 @@ fn test_parsing_link_statistics_on_kernel_4_18() {
147147
LinkAttribute::IfName("ens3".into()),
148148
LinkAttribute::TxQueueLen(1000),
149149
LinkAttribute::OperState(State::Up),
150-
LinkAttribute::Mode(0),
150+
LinkAttribute::Mode(LinkMode::Default),
151151
LinkAttribute::Mtu(1500),
152152
LinkAttribute::MinMtu(68),
153153
LinkAttribute::MaxMtu(65535),
@@ -518,7 +518,7 @@ fn test_parsing_link_statistics() {
518518
LinkAttribute::IfName("wlan0".into()),
519519
LinkAttribute::TxQueueLen(1000),
520520
LinkAttribute::OperState(State::Up),
521-
LinkAttribute::Mode(1),
521+
LinkAttribute::Mode(LinkMode::Dormant),
522522
LinkAttribute::Mtu(1500),
523523
LinkAttribute::MinMtu(256),
524524
LinkAttribute::MaxMtu(2304),

src/link/tests/vrf.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use crate::link::{
1111
AfSpecInet, AfSpecInet6, AfSpecUnspec, Icmp6Stats, Inet6CacheInfo,
1212
Inet6DevConf, Inet6IfaceFlags, Inet6Stats, InetDevConf, InfoData, InfoKind,
1313
InfoPortData, InfoPortKind, InfoVrf, LinkAttribute, LinkHeader, LinkInfo,
14-
LinkLayerType, LinkMessage, LinkMessageBuffer, LinkXdp, Map, State, Stats,
15-
Stats64, XdpAttached,
14+
LinkLayerType, LinkMessage, LinkMessageBuffer, LinkMode, LinkXdp, Map,
15+
State, Stats, Stats64, XdpAttached,
1616
};
1717
use crate::AddressFamily;
1818

@@ -248,7 +248,7 @@ fn test_link_info_with_ifla_vrf_port_table() {
248248
LinkAttribute::IfName("veth20".to_string()),
249249
LinkAttribute::TxQueueLen(1000),
250250
LinkAttribute::OperState(State::Down),
251-
LinkAttribute::Mode(0),
251+
LinkAttribute::Mode(LinkMode::Default),
252252
LinkAttribute::Mtu(1500),
253253
LinkAttribute::MinMtu(68),
254254
LinkAttribute::MaxMtu(65535),

0 commit comments

Comments
 (0)