use super::LayerKind;
#[derive(Debug, Clone, Copy)]
pub struct EthernetSlice<'a> {
raw: &'a [u8],
}
impl<'a> EthernetSlice<'a> {
pub(crate) fn new(raw: &'a [u8]) -> Self {
Self { raw }
}
pub fn destination(&self) -> [u8; 6] {
let mut o = [0u8; 6];
o.copy_from_slice(&self.raw[0..6]);
o
}
pub fn source(&self) -> [u8; 6] {
let mut o = [0u8; 6];
o.copy_from_slice(&self.raw[6..12]);
o
}
pub fn ether_type(&self) -> u16 {
u16::from_be_bytes([self.raw[12], self.raw[13]])
}
pub fn header(&self) -> &'a [u8] {
&self.raw[..14]
}
pub fn bytes(&self) -> &'a [u8] {
self.raw
}
pub fn kind(&self) -> LayerKind {
LayerKind::Ethernet
}
}
#[derive(Debug, Clone, Copy)]
pub struct VlanSlice<'a> {
raw: &'a [u8],
}
impl<'a> VlanSlice<'a> {
pub(crate) fn new(raw: &'a [u8]) -> Self {
Self { raw }
}
pub fn vid(&self) -> u16 {
u16::from_be_bytes([self.raw[0], self.raw[1]]) & 0x0FFF
}
pub fn priority(&self) -> u8 {
(self.raw[0] >> 5) & 0x07
}
pub fn dei(&self) -> bool {
(self.raw[0] >> 4) & 0x01 == 1
}
pub fn inner_ether_type(&self) -> u16 {
u16::from_be_bytes([self.raw[2], self.raw[3]])
}
pub fn header(&self) -> &'a [u8] {
&self.raw[..4]
}
pub fn bytes(&self) -> &'a [u8] {
self.raw
}
pub fn kind(&self) -> LayerKind {
LayerKind::Vlan
}
}
#[derive(Debug, Clone, Copy)]
pub struct MplsSlice<'a> {
raw: &'a [u8],
}
impl<'a> MplsSlice<'a> {
pub(crate) fn new(raw: &'a [u8]) -> Self {
Self { raw }
}
pub fn label(&self) -> u32 {
((self.raw[0] as u32) << 12) | ((self.raw[1] as u32) << 4) | ((self.raw[2] as u32) >> 4)
}
pub fn tc(&self) -> u8 {
(self.raw[2] >> 1) & 0x07
}
pub fn bos(&self) -> bool {
self.raw[2] & 0x01 == 1
}
pub fn ttl(&self) -> u8 {
self.raw[3]
}
pub fn header(&self) -> &'a [u8] {
&self.raw[..4]
}
pub fn bytes(&self) -> &'a [u8] {
self.raw
}
pub fn kind(&self) -> LayerKind {
LayerKind::Mpls
}
}