netlink_packet_route/rtnl/link/nlas/inet/
mod.rs1use anyhow::Context;
4
5use crate::{
6 constants::{IFLA_INET_CONF, IFLA_INET_UNSPEC},
7 nlas::{DefaultNla, Nla, NlaBuffer},
8 traits::Parseable,
9 DecodeError,
10};
11
12mod dev_conf;
13pub use self::dev_conf::*;
14
15#[derive(Clone, Eq, PartialEq, Debug)]
16pub enum Inet {
17 DevConf(Vec<u8>),
18 Unspec(Vec<u8>),
19 Other(DefaultNla),
20}
21
22impl Nla for Inet {
23 fn value_len(&self) -> usize {
24 use self::Inet::*;
25 match *self {
26 Unspec(ref bytes) => bytes.len(),
27 DevConf(_) => DEV_CONF_LEN,
28 Other(ref nla) => nla.value_len(),
29 }
30 }
31
32 fn emit_value(&self, buffer: &mut [u8]) {
33 use self::Inet::*;
34 match *self {
35 Unspec(ref bytes) => buffer[..bytes.len()].copy_from_slice(bytes.as_slice()),
36 DevConf(ref dev_conf) => buffer[..dev_conf.len()].copy_from_slice(dev_conf.as_slice()),
37 Other(ref nla) => nla.emit_value(buffer),
38 }
39 }
40
41 fn kind(&self) -> u16 {
42 use self::Inet::*;
43 match *self {
44 Unspec(_) => IFLA_INET_UNSPEC,
45 DevConf(_) => IFLA_INET_CONF,
46 Other(ref nla) => nla.kind(),
47 }
48 }
49}
50
51impl<'a, T: AsRef<[u8]> + ?Sized> Parseable<NlaBuffer<&'a T>> for Inet {
52 fn parse(buf: &NlaBuffer<&'a T>) -> Result<Self, DecodeError> {
53 use self::Inet::*;
54
55 let payload = buf.value();
56 Ok(match buf.kind() {
57 IFLA_INET_UNSPEC => Unspec(payload.to_vec()),
58 IFLA_INET_CONF => DevConf(payload.to_vec()),
59 kind => Other(DefaultNla::parse(buf).context(format!("unknown NLA type {}", kind))?),
60 })
61 }
62}