use super::LayerKind;
#[derive(Debug, Clone, Copy)]
pub struct GreSlice<'a> {
raw: &'a [u8],
}
impl<'a> GreSlice<'a> {
pub(crate) fn new(raw: &'a [u8]) -> Self {
Self { raw }
}
pub fn has_checksum(&self) -> bool {
self.raw[0] & 0x80 != 0
}
pub fn has_key(&self) -> bool {
self.raw[0] & 0x20 != 0
}
pub fn has_sequence(&self) -> bool {
self.raw[0] & 0x10 != 0
}
pub fn protocol_type(&self) -> u16 {
u16::from_be_bytes([self.raw[2], self.raw[3]])
}
pub fn header_len(&self) -> usize {
let mut len = 4;
if self.has_checksum() {
len += 4;
}
if self.has_key() {
len += 4;
}
if self.has_sequence() {
len += 4;
}
len
}
pub fn header(&self) -> &'a [u8] {
&self.raw[..self.header_len().min(self.raw.len())]
}
pub fn bytes(&self) -> &'a [u8] {
self.raw
}
pub fn kind(&self) -> LayerKind {
LayerKind::Gre
}
}
#[derive(Debug, Clone, Copy)]
pub struct VxlanSlice<'a> {
raw: &'a [u8],
}
impl<'a> VxlanSlice<'a> {
pub(crate) fn new(raw: &'a [u8]) -> Self {
Self { raw }
}
pub fn valid(&self) -> bool {
self.raw[0] & 0x08 != 0
}
pub fn vni(&self) -> u32 {
((self.raw[4] as u32) << 16) | ((self.raw[5] as u32) << 8) | (self.raw[6] as u32)
}
pub fn header(&self) -> &'a [u8] {
&self.raw[..8.min(self.raw.len())]
}
pub fn bytes(&self) -> &'a [u8] {
self.raw
}
pub fn kind(&self) -> LayerKind {
LayerKind::Vxlan
}
}
#[derive(Debug, Clone, Copy)]
pub struct GtpUSlice<'a> {
raw: &'a [u8],
}
impl<'a> GtpUSlice<'a> {
pub(crate) fn new(raw: &'a [u8]) -> Self {
Self { raw }
}
pub fn version(&self) -> u8 {
(self.raw[0] >> 5) & 0x07
}
pub fn has_sequence(&self) -> bool {
self.raw[0] & 0x02 != 0
}
pub fn has_n_pdu(&self) -> bool {
self.raw[0] & 0x01 != 0
}
pub fn has_extension(&self) -> bool {
self.raw[0] & 0x04 != 0
}
pub fn msg_type(&self) -> u8 {
self.raw[1]
}
pub fn teid(&self) -> u32 {
u32::from_be_bytes([self.raw[4], self.raw[5], self.raw[6], self.raw[7]])
}
pub fn header_len(&self) -> usize {
let mut len = 8;
if self.has_sequence() || self.has_n_pdu() || self.has_extension() {
len += 4;
}
len
}
pub fn header(&self) -> &'a [u8] {
&self.raw[..self.header_len().min(self.raw.len())]
}
pub fn bytes(&self) -> &'a [u8] {
self.raw
}
pub fn kind(&self) -> LayerKind {
LayerKind::GtpU
}
}