Skip to content

Commit b23b165

Browse files
committed
mac vlan/vtap: Introduce MacVlanMode and MacVtapMode
The `MacVtapMode` is just alias to `MacVlanMode`. Unit test case updated and also added new unit test case for MAC VTAP. Signed-off-by: Gris Ge <[email protected]>
1 parent de0f47a commit b23b165

File tree

6 files changed

+432
-31
lines changed

6 files changed

+432
-31
lines changed

src/link/link_info/mac_vlan.rs

Lines changed: 81 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const IFLA_MACVLAN_BC_CUTOFF: u16 = 9;
2222
#[derive(Debug, PartialEq, Eq, Clone)]
2323
#[non_exhaustive]
2424
pub enum InfoMacVlan {
25-
Mode(u32),
25+
Mode(MacVlanMode),
2626
Flags(u16),
2727
MacAddrMode(u32),
2828
MacAddr([u8; 6]),
@@ -37,34 +37,38 @@ pub enum InfoMacVlan {
3737

3838
impl Nla for InfoMacVlan {
3939
fn value_len(&self) -> usize {
40-
use self::InfoMacVlan::*;
4140
match self {
42-
Mode(_) => 4,
43-
Flags(_) => 2,
44-
MacAddrMode(_) => 4,
45-
MacAddr(_) => 6,
46-
MacAddrData(ref nlas) => nlas.as_slice().buffer_len(),
47-
MacAddrCount(_) => 4,
48-
BcQueueLen(_) => 4,
49-
BcQueueLenUsed(_) => 4,
50-
BcCutoff(_) => 4,
51-
Other(nla) => nla.value_len(),
41+
Self::Mode(_) => 4,
42+
Self::Flags(_) => 2,
43+
Self::MacAddrMode(_) => 4,
44+
Self::MacAddr(_) => 6,
45+
Self::MacAddrData(ref nlas) => nlas.as_slice().buffer_len(),
46+
Self::MacAddrCount(_) => 4,
47+
Self::BcQueueLen(_) => 4,
48+
Self::BcQueueLenUsed(_) => 4,
49+
Self::BcCutoff(_) => 4,
50+
Self::Other(nla) => nla.value_len(),
5251
}
5352
}
5453

5554
fn emit_value(&self, buffer: &mut [u8]) {
56-
use self::InfoMacVlan::*;
5755
match self {
58-
Mode(value) => NativeEndian::write_u32(buffer, *value),
59-
Flags(value) => NativeEndian::write_u16(buffer, *value),
60-
MacAddrMode(value) => NativeEndian::write_u32(buffer, *value),
61-
MacAddr(bytes) => buffer.copy_from_slice(bytes),
62-
MacAddrData(ref nlas) => nlas.as_slice().emit(buffer),
63-
MacAddrCount(value) => NativeEndian::write_u32(buffer, *value),
64-
BcQueueLen(value) => NativeEndian::write_u32(buffer, *value),
65-
BcQueueLenUsed(value) => NativeEndian::write_u32(buffer, *value),
66-
BcCutoff(value) => NativeEndian::write_i32(buffer, *value),
67-
Other(nla) => nla.emit_value(buffer),
56+
Self::Mode(value) => {
57+
NativeEndian::write_u32(buffer, (*value).into())
58+
}
59+
Self::Flags(value) => NativeEndian::write_u16(buffer, *value),
60+
Self::MacAddrMode(value) => NativeEndian::write_u32(buffer, *value),
61+
Self::MacAddr(bytes) => buffer.copy_from_slice(bytes),
62+
Self::MacAddrData(ref nlas) => nlas.as_slice().emit(buffer),
63+
Self::MacAddrCount(value) => {
64+
NativeEndian::write_u32(buffer, *value)
65+
}
66+
Self::BcQueueLen(value) => NativeEndian::write_u32(buffer, *value),
67+
Self::BcQueueLenUsed(value) => {
68+
NativeEndian::write_u32(buffer, *value)
69+
}
70+
Self::BcCutoff(value) => NativeEndian::write_i32(buffer, *value),
71+
Self::Other(nla) => nla.emit_value(buffer),
6872
}
6973
}
7074

@@ -92,7 +96,8 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoMacVlan {
9296
Ok(match buf.kind() {
9397
IFLA_MACVLAN_MODE => Mode(
9498
parse_u32(payload)
95-
.context("invalid IFLA_MACVLAN_MODE value")?,
99+
.context("invalid IFLA_MACVLAN_MODE value")?
100+
.into(),
96101
),
97102
IFLA_MACVLAN_FLAGS => Flags(
98103
parse_u16(payload)
@@ -142,7 +147,7 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoMacVlan {
142147
#[derive(Debug, PartialEq, Eq, Clone)]
143148
#[non_exhaustive]
144149
pub enum InfoMacVtap {
145-
Mode(u32),
150+
Mode(MacVtapMode),
146151
Flags(u16),
147152
MacAddrMode(u32),
148153
MacAddr([u8; 6]),
@@ -174,7 +179,7 @@ impl Nla for InfoMacVtap {
174179
fn emit_value(&self, buffer: &mut [u8]) {
175180
use self::InfoMacVtap::*;
176181
match self {
177-
Mode(value) => NativeEndian::write_u32(buffer, *value),
182+
Mode(value) => NativeEndian::write_u32(buffer, (*value).into()),
178183
Flags(value) => NativeEndian::write_u16(buffer, *value),
179184
MacAddrMode(value) => NativeEndian::write_u32(buffer, *value),
180185
MacAddr(bytes) => buffer.copy_from_slice(bytes),
@@ -211,7 +216,8 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoMacVtap {
211216
Ok(match buf.kind() {
212217
IFLA_MACVLAN_MODE => Mode(
213218
parse_u32(payload)
214-
.context("invalid IFLA_MACVLAN_MODE value")?,
219+
.context("invalid IFLA_MACVLAN_MODE value")?
220+
.into(),
215221
),
216222
IFLA_MACVLAN_FLAGS => Flags(
217223
parse_u16(payload)
@@ -257,3 +263,51 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoMacVtap {
257263
})
258264
}
259265
}
266+
267+
const MACVLAN_MODE_PRIVATE: u32 = 1;
268+
const MACVLAN_MODE_VEPA: u32 = 2;
269+
const MACVLAN_MODE_BRIDGE: u32 = 4;
270+
const MACVLAN_MODE_PASSTHRU: u32 = 8;
271+
const MACVLAN_MODE_SOURCE: u32 = 16;
272+
273+
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
274+
#[non_exhaustive]
275+
pub enum MacVlanMode {
276+
Private,
277+
Vepa,
278+
Bridge,
279+
Passthrough,
280+
Source,
281+
Other(u32),
282+
}
283+
284+
pub type MacVtapMode = MacVlanMode;
285+
286+
impl From<u32> for MacVlanMode {
287+
fn from(d: u32) -> Self {
288+
match d {
289+
MACVLAN_MODE_PRIVATE => Self::Private,
290+
MACVLAN_MODE_VEPA => Self::Vepa,
291+
MACVLAN_MODE_BRIDGE => Self::Bridge,
292+
MACVLAN_MODE_PASSTHRU => Self::Passthrough,
293+
MACVLAN_MODE_SOURCE => Self::Source,
294+
_ => {
295+
log::warn!("Unknown MAC VLAN mode {}", d);
296+
Self::Other(d)
297+
}
298+
}
299+
}
300+
}
301+
302+
impl From<MacVlanMode> for u32 {
303+
fn from(v: MacVlanMode) -> u32 {
304+
match v {
305+
MacVlanMode::Private => MACVLAN_MODE_PRIVATE,
306+
MacVlanMode::Vepa => MACVLAN_MODE_VEPA,
307+
MacVlanMode::Bridge => MACVLAN_MODE_BRIDGE,
308+
MacVlanMode::Passthrough => MACVLAN_MODE_PASSTHRU,
309+
MacVlanMode::Source => MACVLAN_MODE_SOURCE,
310+
MacVlanMode::Other(d) => d,
311+
}
312+
}
313+
}

src/link/link_info/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ pub use self::info_port::{InfoPortData, InfoPortKind};
4646
pub use self::infos::{InfoKind, LinkInfo};
4747
pub use self::ipoib::InfoIpoib;
4848
pub use self::ipvlan::InfoIpVlan;
49-
pub use self::mac_vlan::{InfoMacVlan, InfoMacVtap};
49+
pub use self::mac_vlan::{InfoMacVlan, InfoMacVtap, MacVlanMode, MacVtapMode};
5050
pub use self::macsec::{
5151
InfoMacSec, MacSecCipherId, MacSecOffload, MacSecValidate,
5252
};

src/link/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ pub use self::link_info::{
4545
InfoIpVlan, InfoIpoib, InfoKind, InfoMacSec, InfoMacVlan, InfoMacVtap,
4646
InfoPortData, InfoPortKind, InfoSitTun, InfoTun, InfoVeth, InfoVlan,
4747
InfoVrf, InfoVti, InfoVxlan, InfoXfrm, LinkInfo, LinkXstats,
48-
MacSecCipherId, MacSecOffload, MacSecValidate, MiiStatus, VlanQosMapping,
48+
MacSecCipherId, MacSecOffload, MacSecValidate, MacVlanMode, MacVtapMode,
49+
MiiStatus, VlanQosMapping,
4950
};
5051
pub use self::link_layer_type::LinkLayerType;
5152
pub use self::link_state::State;

src/link/tests/macvlan.rs

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

55
use crate::link::{
66
InfoData, InfoKind, InfoMacVlan, LinkAttribute, LinkFlag, LinkHeader,
7-
LinkInfo, LinkLayerType, LinkMessage, LinkMessageBuffer,
7+
LinkInfo, LinkLayerType, LinkMessage, LinkMessageBuffer, MacVlanMode,
88
};
99
use crate::AddressFamily;
1010

@@ -39,7 +39,7 @@ fn test_macvlan_link_info() {
3939
attributes: vec![LinkAttribute::LinkInfo(vec![
4040
LinkInfo::Kind(InfoKind::MacVlan),
4141
LinkInfo::Data(InfoData::MacVlan(vec![
42-
InfoMacVlan::Mode(16),
42+
InfoMacVlan::Mode(MacVlanMode::Source),
4343
InfoMacVlan::Flags(0),
4444
InfoMacVlan::MacAddrCount(2),
4545
InfoMacVlan::MacAddrData(vec![

0 commit comments

Comments
 (0)