1use crate::{eth::EtherType, getter_be};
2use core::mem;
3
4#[repr(C, packed)]
6#[derive(Debug, Copy, Clone)]
7#[cfg_attr(feature = "serde", derive(::serde::Serialize, ::serde::Deserialize))]
8pub struct VlanHdr {
9 pub tci: [u8; 2],
11 pub eth_type: EtherType,
13}
14
15impl VlanHdr {
16 pub const LEN: usize = mem::size_of::<VlanHdr>();
17
18 #[inline]
19 fn tci(&self) -> u16 {
20 unsafe { getter_be!(self, tci, u16) }
22 }
23
24 #[inline]
26 pub fn pcp(&self) -> u8 {
27 (self.tci() >> 13) as u8
28 }
29
30 #[inline]
32 pub fn dei(&self) -> u8 {
33 ((self.tci() >> 12) & 1) as u8
34 }
35
36 #[inline]
38 pub fn vid(&self) -> u16 {
39 self.tci() & 0xFFF
40 }
41
42 #[inline]
44 pub fn eth_type(&self) -> EtherType {
45 self.eth_type
46 }
47}