netlink_packet_route/rtnl/link/nlas/inet/
mod.rs

1// SPDX-License-Identifier: MIT
2
3use 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}