nell 0.3.0

Linux netlink interface
Documentation
// Copyright (C) 2018 - Will Glozer. All rights reserved.

use std::convert::TryFrom;
use crate::err::Invalid;
use crate::ffi::peer::*;
use crate::ffi::route::rtattr;
use crate::sys::Cursor;

#[derive(Debug, Eq, PartialEq)]
pub enum NDA<'a> {
    Dst(&'a [u8]),
    LLAddr(&'a [u8]),
    Probes(u32),
    VLAN(u16),
    Port(u16),
    VNI(u32),
    IFIndex(u32),
    Master(u32),
    Protocol(u8),
    Unsupported(rtattr, Cursor<'a>),
}

impl<'a> TryFrom<(rtattr, Cursor<'a>)> for NDA<'a> {
    type Error = Invalid;

    fn try_from((attr, tail): (rtattr, Cursor<'a>)) -> Result<NDA<'a>, Self::Error> {
        Ok(match attr.rta_type {
            NDA_DST          => NDA::Dst(tail.bytes()),
            NDA_LLADDR       => NDA::LLAddr(tail.bytes()),
            NDA_CACHEINFO    => NDA::Unsupported(attr, tail),
            NDA_PROBES       => NDA::Probes(tail.copy()),
            NDA_VLAN         => NDA::VLAN(tail.copy()),
            NDA_PORT         => NDA::Port(tail.copy()),
            NDA_VNI          => NDA::VNI(tail.copy()),
            NDA_IFINDEX      => NDA::IFIndex(tail.copy()),
            NDA_MASTER       => NDA::Master(tail.copy()),
            NDA_LINK_NETNSID => NDA::Unsupported(attr, tail),
            NDA_SRC_VNI      => NDA::Unsupported(attr, tail),
            NDA_PROTOCOL     => NDA::Protocol(tail.copy()),
            _                => NDA::Unsupported(attr, tail),
        })
    }
}