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),
})
}
}