use super::NDP_OPTION_HEADER_LEN;
use crate::icmpv6::{NdpOptionHeader, NdpOptionReadError, NdpOptionType};
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct UnknownNdpOptionSlice<'a> {
slice: &'a [u8],
}
impl<'a> UnknownNdpOptionSlice<'a> {
pub fn from_slice(slice: &'a [u8]) -> Result<Self, NdpOptionReadError> {
let (header, _) = NdpOptionHeader::from_slice(slice)?;
if 0 == header.length_units {
return Err(NdpOptionReadError::ZeroLength {
option_id: header.option_type,
});
}
let expected_size = header.byte_len();
if expected_size != slice.len() {
return Err(NdpOptionReadError::UnexpectedSize {
option_id: header.option_type,
expected_size,
actual_size: slice.len(),
});
}
Ok(Self { slice })
}
pub fn option_type(&self) -> NdpOptionType {
NdpOptionType(self.slice[0])
}
pub fn as_bytes(&self) -> &'a [u8] {
self.slice
}
pub fn data(&self) -> &'a [u8] {
&self.slice[NDP_OPTION_HEADER_LEN..]
}
}