blob: 58def16a1ae76287df221dbd0bef221db425917a [file] [log] [blame]
use crate::*;
/// IEEE 802.1Q VLAN Tagging Header (can be single or double tagged).
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum VlanHeader {
/// IEEE 802.1Q VLAN Tagging Header
Single(SingleVlanHeader),
/// IEEE 802.1Q double VLAN Tagging Header
Double(DoubleVlanHeader),
}
impl VlanHeader {
/// All ether types that identify a vlan header.
pub const VLAN_ETHER_TYPES: [EtherType; 3] = [
ether_type::VLAN_TAGGED_FRAME,
ether_type::PROVIDER_BRIDGING,
ether_type::VLAN_DOUBLE_TAGGED_FRAME,
];
/// Returns the ether type of the next header after the vlan header(s).
#[inline]
pub fn next_header(&self) -> EtherType {
match self {
VlanHeader::Single(s) => s.ether_type,
VlanHeader::Double(d) => d.inner.ether_type,
}
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::test_gens::*;
use alloc::format;
use proptest::prelude::*;
#[test]
fn constants() {
use ether_type::*;
use VlanHeader as V;
assert_eq!(3, V::VLAN_ETHER_TYPES.len());
assert_eq!(VLAN_TAGGED_FRAME, V::VLAN_ETHER_TYPES[0]);
assert_eq!(PROVIDER_BRIDGING, V::VLAN_ETHER_TYPES[1]);
assert_eq!(VLAN_DOUBLE_TAGGED_FRAME, V::VLAN_ETHER_TYPES[2]);
}
proptest! {
#[test]
fn clone_eq(
single in vlan_single_any(),
double in vlan_double_any(),
) {
// single eq
{
let value = VlanHeader::Single(single.clone());
assert_eq!(value, value.clone());
}
// double
{
let value = VlanHeader::Double(double);
assert_eq!(value, value.clone());
}
}
}
proptest! {
#[test]
fn dbg(
single in vlan_single_any(),
double in vlan_double_any(),
) {
// single
{
let value = VlanHeader::Single(single.clone());
assert_eq!(
&format!(
"Single({:?})",
single
),
&format!("{:?}", value)
);
}
// double
{
let value = VlanHeader::Double(double.clone());
assert_eq!(
&format!(
"Double({:?})",
double
),
&format!("{:?}", value)
);
}
}
}
proptest! {
#[test]
fn next_header(
single in vlan_single_any(),
double in vlan_double_any(),
) {
// single
{
let value = VlanHeader::Single(single.clone());
assert_eq!(value.next_header(), single.ether_type);
}
// double
{
let value = VlanHeader::Double(double.clone());
assert_eq!(value.next_header(), double.inner.ether_type);
}
}
}
}