etherparse/link/
vlan_header.rs

1use crate::*;
2
3/// IEEE 802.1Q VLAN Tagging Header (can be single or double tagged).
4#[derive(Clone, Debug, Eq, PartialEq)]
5pub enum VlanHeader {
6    /// IEEE 802.1Q VLAN Tagging Header
7    Single(SingleVlanHeader),
8    /// IEEE 802.1Q double VLAN Tagging Header
9    Double(DoubleVlanHeader),
10}
11
12impl VlanHeader {
13    /// All ether types that identify a vlan header.
14    pub const VLAN_ETHER_TYPES: [EtherType; 3] = [
15        ether_type::VLAN_TAGGED_FRAME,
16        ether_type::PROVIDER_BRIDGING,
17        ether_type::VLAN_DOUBLE_TAGGED_FRAME,
18    ];
19
20    /// Returns the ether type of the next header after the vlan header(s).
21    #[inline]
22    pub fn next_header(&self) -> EtherType {
23        match self {
24            VlanHeader::Single(s) => s.ether_type,
25            VlanHeader::Double(d) => d.inner.ether_type,
26        }
27    }
28}
29
30#[cfg(test)]
31mod test {
32    use super::*;
33    use crate::test_gens::*;
34    use alloc::format;
35    use proptest::prelude::*;
36
37    #[test]
38    fn constants() {
39        use ether_type::*;
40        use VlanHeader as V;
41
42        assert_eq!(3, V::VLAN_ETHER_TYPES.len());
43        assert_eq!(VLAN_TAGGED_FRAME, V::VLAN_ETHER_TYPES[0]);
44        assert_eq!(PROVIDER_BRIDGING, V::VLAN_ETHER_TYPES[1]);
45        assert_eq!(VLAN_DOUBLE_TAGGED_FRAME, V::VLAN_ETHER_TYPES[2]);
46    }
47
48    proptest! {
49        #[test]
50        fn clone_eq(
51            single in vlan_single_any(),
52            double in vlan_double_any(),
53        ) {
54            // single eq
55            {
56                let value = VlanHeader::Single(single.clone());
57                assert_eq!(value, value.clone());
58            }
59            // double
60            {
61                let value = VlanHeader::Double(double);
62                assert_eq!(value, value.clone());
63            }
64        }
65    }
66
67    proptest! {
68        #[test]
69        fn dbg(
70            single in vlan_single_any(),
71            double in vlan_double_any(),
72        ) {
73            // single
74            {
75                let value = VlanHeader::Single(single.clone());
76                assert_eq!(
77                    &format!(
78                        "Single({:?})",
79                        single
80                    ),
81                    &format!("{:?}", value)
82                );
83            }
84            // double
85            {
86                let value = VlanHeader::Double(double.clone());
87                assert_eq!(
88                    &format!(
89                        "Double({:?})",
90                        double
91                    ),
92                    &format!("{:?}", value)
93                );
94            }
95        }
96    }
97
98    proptest! {
99        #[test]
100        fn next_header(
101            single in vlan_single_any(),
102            double in vlan_double_any(),
103        ) {
104            // single
105            {
106                let value = VlanHeader::Single(single.clone());
107                assert_eq!(value.next_header(), single.ether_type);
108            }
109            // double
110            {
111                let value = VlanHeader::Double(double.clone());
112                assert_eq!(value.next_header(), double.inner.ether_type);
113            }
114        }
115    }
116}