netlink_packet_route/link/af_spec/
in6_addr_gen_mode.rs

1// SPDX-License-Identifier: MIT
2
3use std::fmt::Display;
4
5const IN6_ADDR_GEN_MODE_EUI64: u8 = 0;
6const IN6_ADDR_GEN_MODE_NONE: u8 = 1;
7const IN6_ADDR_GEN_MODE_STABLE_PRIVACY: u8 = 2;
8const IN6_ADDR_GEN_MODE_RANDOM: u8 = 3;
9
10#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
11#[non_exhaustive]
12#[repr(u8)]
13pub enum In6AddrGenMode {
14    #[default]
15    Eui64,
16    None,
17    StablePrivacy,
18    Random,
19    Other(u8),
20}
21
22impl 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}
33impl 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
45impl 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            // https://github.com/iproute2/iproute2/blob/afbfd2f2b0a633d068990775f8e1b73b8ee83733/ip/ipaddress.c#L325-L329
51            Self::StablePrivacy => write!(f, "stable_secret"),
52            Self::Random => write!(f, "random"),
53            Self::Other(d) => write!(f, "other({d})"),
54        }
55    }
56}