netlink_packet_route/link/link_info/
ipoib.rs1use netlink_packet_core::{
4 emit_u16, parse_u16, DecodeError, DefaultNla, ErrorContext, Nla, NlaBuffer,
5 Parseable,
6};
7
8const IFLA_IPOIB_PKEY: u16 = 1;
9const IFLA_IPOIB_MODE: u16 = 2;
10const IFLA_IPOIB_UMCAST: u16 = 3;
11
12#[derive(Debug, PartialEq, Eq, Clone)]
13#[non_exhaustive]
14pub enum InfoIpoib {
15 Pkey(u16),
16 Mode(IpoibMode),
17 UmCast(u16),
18 Other(DefaultNla),
19}
20
21impl Nla for InfoIpoib {
22 fn value_len(&self) -> usize {
23 use self::InfoIpoib::*;
24 match self {
25 Pkey(_) | Mode(_) | UmCast(_) => 2,
26 Other(nla) => nla.value_len(),
27 }
28 }
29
30 fn emit_value(&self, buffer: &mut [u8]) {
31 use self::InfoIpoib::*;
32 match self {
33 Pkey(value) => emit_u16(buffer, *value).unwrap(),
34 Mode(value) => emit_u16(buffer, (*value).into()).unwrap(),
35 UmCast(value) => emit_u16(buffer, *value).unwrap(),
36 Other(nla) => nla.emit_value(buffer),
37 }
38 }
39
40 fn kind(&self) -> u16 {
41 use self::InfoIpoib::*;
42 match self {
43 Pkey(_) => IFLA_IPOIB_PKEY,
44 Mode(_) => IFLA_IPOIB_MODE,
45 UmCast(_) => IFLA_IPOIB_UMCAST,
46 Other(nla) => nla.kind(),
47 }
48 }
49}
50
51impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for InfoIpoib {
52 fn parse(buf: &NlaBuffer<&'a T>) -> Result<Self, DecodeError> {
53 use self::InfoIpoib::*;
54 let payload = buf.value();
55 Ok(match buf.kind() {
56 IFLA_IPOIB_PKEY => Pkey(
57 parse_u16(payload).context("invalid IFLA_IPOIB_PKEY value")?,
58 ),
59 IFLA_IPOIB_MODE => Mode(
60 parse_u16(payload)
61 .context("invalid IFLA_IPOIB_MODE value")?
62 .into(),
63 ),
64 IFLA_IPOIB_UMCAST => UmCast(
65 parse_u16(payload)
66 .context("invalid IFLA_IPOIB_UMCAST value")?,
67 ),
68 kind => Other(DefaultNla::parse(buf).context(format!(
69 "unknown NLA type {kind} for IFLA_INFO_DATA(ipoib)"
70 ))?),
71 })
72 }
73}
74
75const IPOIB_MODE_DATAGRAM: u16 = 0;
76const IPOIB_MODE_CONNECTED: u16 = 1;
77
78#[derive(Debug, PartialEq, Eq, Clone, Copy)]
79#[non_exhaustive]
80pub enum IpoibMode {
81 Datagram,
82 Connected,
83 Other(u16),
84}
85
86impl From<u16> for IpoibMode {
87 fn from(d: u16) -> Self {
88 match d {
89 IPOIB_MODE_DATAGRAM => Self::Datagram,
90 IPOIB_MODE_CONNECTED => Self::Connected,
91 _ => Self::Other(d),
92 }
93 }
94}
95
96impl From<IpoibMode> for u16 {
97 fn from(v: IpoibMode) -> u16 {
98 match v {
99 IpoibMode::Datagram => IPOIB_MODE_DATAGRAM,
100 IpoibMode::Connected => IPOIB_MODE_CONNECTED,
101 IpoibMode::Other(d) => d,
102 }
103 }
104}