Skip to content

Commit 2eb3a71

Browse files
author
Julius Rüberg
committed
Change AddrGenMode into enum
1 parent 8ac7c2a commit 2eb3a71

File tree

5 files changed

+68
-10
lines changed

5 files changed

+68
-10
lines changed

src/link/af_spec/in6_addr_gen_mode.rs

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
// SPDX-License-Identifier: MIT
2+
3+
use std::fmt::Display;
4+
5+
const IN6_ADDR_GEN_MODE_EUI64: u8 = 0;
6+
const IN6_ADDR_GEN_MODE_NONE: u8 = 1;
7+
const IN6_ADDR_GEN_MODE_STABLE_PRIVACY: u8 = 2;
8+
const IN6_ADDR_GEN_MODE_RANDOM: u8 = 3;
9+
10+
#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
11+
#[non_exhaustive]
12+
#[repr(u8)]
13+
pub enum In6AddrGenMode {
14+
#[default]
15+
Eui64,
16+
None,
17+
StablePrivacy,
18+
Random,
19+
Other(u8),
20+
}
21+
22+
impl From<u8> for In6AddrGenMode {
23+
fn from(d: u8) -> Self {
24+
match d {
25+
IN6_ADDR_GEN_MODE_EUI64 => Self::Eui64,
26+
IN6_ADDR_GEN_MODE_NONE => Self::None,
27+
IN6_ADDR_GEN_MODE_STABLE_PRIVACY => Self::StablePrivacy,
28+
IN6_ADDR_GEN_MODE_RANDOM => Self::Random,
29+
_ => Self::Other(d),
30+
}
31+
}
32+
}
33+
impl From<&In6AddrGenMode> for u8 {
34+
fn from(v: &In6AddrGenMode) -> Self {
35+
match v {
36+
In6AddrGenMode::Eui64 => IN6_ADDR_GEN_MODE_EUI64,
37+
In6AddrGenMode::None => IN6_ADDR_GEN_MODE_NONE,
38+
In6AddrGenMode::StablePrivacy => IN6_ADDR_GEN_MODE_STABLE_PRIVACY,
39+
In6AddrGenMode::Random => IN6_ADDR_GEN_MODE_RANDOM,
40+
In6AddrGenMode::Other(d) => *d,
41+
}
42+
}
43+
}
44+
45+
impl Display for In6AddrGenMode {
46+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
47+
match self {
48+
Self::Eui64 => write!(f, "eui64"),
49+
Self::None => write!(f, "none"),
50+
Self::StablePrivacy => write!(f, "stable_secret"),
51+
Self::Random => write!(f, "random"),
52+
Self::Other(d) => write!(f, "other({d})"),
53+
}
54+
}
55+
}

src/link/af_spec/inet6.rs

+7-8
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use anyhow::Context;
66
use byteorder::{ByteOrder, NativeEndian};
77
use netlink_packet_utils::{
88
nla::{DefaultNla, Nla, NlaBuffer, NlasIterator},
9-
parsers::{parse_u32, parse_u8},
9+
parsers::parse_u32,
1010
traits::{Emitable, Parseable},
1111
DecodeError,
1212
};
@@ -20,7 +20,7 @@ use super::{
2020
inet6_devconf::LINK_INET6_DEV_CONF_LEN, inet6_icmp::ICMP6_STATS_LEN,
2121
inet6_stats::INET6_STATS_LEN,
2222
};
23-
use crate::ip::parse_ipv6_addr;
23+
use crate::{ip::parse_ipv6_addr, link::af_spec::In6AddrGenMode};
2424

2525
const IFLA_INET6_FLAGS: u16 = 1;
2626
const IFLA_INET6_CONF: u16 = 2;
@@ -43,7 +43,7 @@ pub enum AfSpecInet6 {
4343
Stats(Inet6Stats),
4444
Icmp6Stats(Icmp6Stats),
4545
Token(Ipv6Addr),
46-
AddrGenMode(u8),
46+
AddrGenMode(In6AddrGenMode),
4747
RaMtu(u32),
4848
Other(DefaultNla),
4949
}
@@ -89,7 +89,7 @@ impl Nla for AfSpecInet6 {
8989
Stats(ref v) => v.emit(buffer),
9090
Icmp6Stats(ref v) => v.emit(buffer),
9191
Token(v) => buffer.copy_from_slice(&v.octets()),
92-
AddrGenMode(value) => buffer[0] = value,
92+
AddrGenMode(ref v) => buffer[0] = v.into(),
9393
Other(ref nla) => nla.emit_value(buffer),
9494
}
9595
}
@@ -172,10 +172,9 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for AfSpecInet6 {
172172
parse_ipv6_addr(payload)
173173
.context("invalid IFLA_INET6_TOKEN value")?,
174174
),
175-
IFLA_INET6_ADDR_GEN_MODE => AddrGenMode(
176-
parse_u8(payload)
177-
.context("invalid IFLA_INET6_ADDR_GEN_MODE value")?,
178-
),
175+
IFLA_INET6_ADDR_GEN_MODE => {
176+
AddrGenMode(In6AddrGenMode::from(payload[0]))
177+
}
179178
IFLA_INET6_RA_MTU => RaMtu(
180179
parse_u32(payload)
181180
.context("invalid IFLA_INET6_RA_MTU value")?,

src/link/af_spec/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// SPDX-License-Identifier: MIT
22

33
mod bridge;
4+
mod in6_addr_gen_mode;
45
mod inet;
56
mod inet6;
67
mod inet6_cache;
@@ -14,6 +15,7 @@ pub use self::bridge::{
1415
AfSpecBridge, BridgeFlag, BridgeMode, BridgeVlanInfo, BridgeVlanInfoFlags,
1516
BridgeVlanTunnelInfo,
1617
};
18+
pub use self::in6_addr_gen_mode::In6AddrGenMode;
1719
pub use self::inet::{AfSpecInet, InetDevConf};
1820
pub use self::inet6::AfSpecInet6;
1921
pub use self::inet6_cache::{Inet6CacheInfo, Inet6CacheInfoBuffer};

src/link/tests/statistics.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
use netlink_packet_utils::{nla::DefaultNla, Emitable, Parseable};
44

5+
use crate::link::af_spec::In6AddrGenMode;
56
use crate::link::link_flag::LinkFlags;
67
use crate::link::{
78
AfSpecInet, AfSpecInet6, AfSpecUnspec, Icmp6Stats, Inet6CacheInfo,
@@ -382,7 +383,7 @@ fn test_parsing_link_statistics_on_kernel_4_18() {
382383
csum_errors: 0,
383384
}),
384385
AfSpecInet6::Token(std::net::Ipv6Addr::UNSPECIFIED),
385-
AfSpecInet6::AddrGenMode(1),
386+
AfSpecInet6::AddrGenMode(In6AddrGenMode::None),
386387
]),
387388
]),
388389
LinkAttribute::PropList(vec![Prop::AltIfName("enp0s3".into())]),

src/link/tests/vrf.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::net::Ipv6Addr;
55
use netlink_packet_utils::nla::DefaultNla;
66
use netlink_packet_utils::{Emitable, Parseable};
77

8+
use crate::link::af_spec::In6AddrGenMode;
89
use crate::link::link_flag::LinkFlags;
910
use crate::link::link_info::InfoVrfPort;
1011
use crate::link::{
@@ -345,7 +346,7 @@ fn test_link_info_with_ifla_vrf_port_table() {
345346
..Default::default()
346347
}),
347348
AfSpecInet6::Token(Ipv6Addr::UNSPECIFIED),
348-
AfSpecInet6::AddrGenMode(0),
349+
AfSpecInet6::AddrGenMode(In6AddrGenMode::Eui64),
349350
]),
350351
]),
351352
],

0 commit comments

Comments
 (0)