|
| 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 | + // 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 | +} |
0 commit comments