xref: /aosp_15_r20/tools/netsim/rust/packets/src/llc.rs (revision cf78ab8cffb8fc9207af348f23af247fb04370a6)
1*cf78ab8cSAndroid Build Coastguard Worker // Copyright 2024 Google LLC
2*cf78ab8cSAndroid Build Coastguard Worker //
3*cf78ab8cSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*cf78ab8cSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*cf78ab8cSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*cf78ab8cSAndroid Build Coastguard Worker //
7*cf78ab8cSAndroid Build Coastguard Worker //     https://www.apache.org/licenses/LICENSE-2.0
8*cf78ab8cSAndroid Build Coastguard Worker //
9*cf78ab8cSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*cf78ab8cSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*cf78ab8cSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cf78ab8cSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*cf78ab8cSAndroid Build Coastguard Worker // limitations under the License.
14*cf78ab8cSAndroid Build Coastguard Worker 
15*cf78ab8cSAndroid Build Coastguard Worker //! LLC
16*cf78ab8cSAndroid Build Coastguard Worker 
17*cf78ab8cSAndroid Build Coastguard Worker #![allow(clippy::all)]
18*cf78ab8cSAndroid Build Coastguard Worker #![allow(missing_docs)]
19*cf78ab8cSAndroid Build Coastguard Worker #![allow(unused)]
20*cf78ab8cSAndroid Build Coastguard Worker 
21*cf78ab8cSAndroid Build Coastguard Worker include!(concat!(env!("OUT_DIR"), "/llc_packets.rs"));
22*cf78ab8cSAndroid Build Coastguard Worker 
23*cf78ab8cSAndroid Build Coastguard Worker impl LlcSnapHeader {
24*cf78ab8cSAndroid Build Coastguard Worker     // Length of LLC/SNAP headers on data frames
25*cf78ab8cSAndroid Build Coastguard Worker     pub const LEN: usize = 8;
26*cf78ab8cSAndroid Build Coastguard Worker }
27*cf78ab8cSAndroid Build Coastguard Worker 
28*cf78ab8cSAndroid Build Coastguard Worker #[cfg(test)]
29*cf78ab8cSAndroid Build Coastguard Worker mod tests {
30*cf78ab8cSAndroid Build Coastguard Worker     use super::*;
31*cf78ab8cSAndroid Build Coastguard Worker 
32*cf78ab8cSAndroid Build Coastguard Worker     #[test]
test_llc_snap_header_len()33*cf78ab8cSAndroid Build Coastguard Worker     fn test_llc_snap_header_len() {
34*cf78ab8cSAndroid Build Coastguard Worker         let payload = vec![
35*cf78ab8cSAndroid Build Coastguard Worker             LlcSap::Snap as u8,
36*cf78ab8cSAndroid Build Coastguard Worker             LlcSap::Snap as u8,
37*cf78ab8cSAndroid Build Coastguard Worker             LlcCtrl::UiCmd as u8,
38*cf78ab8cSAndroid Build Coastguard Worker             // OUI
39*cf78ab8cSAndroid Build Coastguard Worker             0x00,
40*cf78ab8cSAndroid Build Coastguard Worker             0x00,
41*cf78ab8cSAndroid Build Coastguard Worker             0x00,
42*cf78ab8cSAndroid Build Coastguard Worker             // EtherType
43*cf78ab8cSAndroid Build Coastguard Worker             0x08,
44*cf78ab8cSAndroid Build Coastguard Worker             0x00,
45*cf78ab8cSAndroid Build Coastguard Worker         ];
46*cf78ab8cSAndroid Build Coastguard Worker 
47*cf78ab8cSAndroid Build Coastguard Worker         let hdr = LlcSnapHeader::decode_full(&payload).unwrap();
48*cf78ab8cSAndroid Build Coastguard Worker         assert_eq!(hdr.encoded_len(), LlcSnapHeader::LEN);
49*cf78ab8cSAndroid Build Coastguard Worker     }
50*cf78ab8cSAndroid Build Coastguard Worker 
51*cf78ab8cSAndroid Build Coastguard Worker     #[test]
test_llc_snap_header_valid()52*cf78ab8cSAndroid Build Coastguard Worker     fn test_llc_snap_header_valid() {
53*cf78ab8cSAndroid Build Coastguard Worker         let payload = vec![
54*cf78ab8cSAndroid Build Coastguard Worker             LlcSap::Snap as u8,
55*cf78ab8cSAndroid Build Coastguard Worker             LlcSap::Snap as u8,
56*cf78ab8cSAndroid Build Coastguard Worker             LlcCtrl::UiCmd as u8,
57*cf78ab8cSAndroid Build Coastguard Worker             // OUI
58*cf78ab8cSAndroid Build Coastguard Worker             0x00,
59*cf78ab8cSAndroid Build Coastguard Worker             0x00,
60*cf78ab8cSAndroid Build Coastguard Worker             0x00,
61*cf78ab8cSAndroid Build Coastguard Worker             // EtherType
62*cf78ab8cSAndroid Build Coastguard Worker             0x08,
63*cf78ab8cSAndroid Build Coastguard Worker             0x00,
64*cf78ab8cSAndroid Build Coastguard Worker         ];
65*cf78ab8cSAndroid Build Coastguard Worker         let hdr = LlcSnapHeader::decode_full(&payload).unwrap();
66*cf78ab8cSAndroid Build Coastguard Worker 
67*cf78ab8cSAndroid Build Coastguard Worker         assert_eq!(hdr.dsap, LlcSap::Snap);
68*cf78ab8cSAndroid Build Coastguard Worker         assert_eq!(hdr.ssap, LlcSap::Snap);
69*cf78ab8cSAndroid Build Coastguard Worker         assert_eq!(hdr.ctrl, LlcCtrl::UiCmd);
70*cf78ab8cSAndroid Build Coastguard Worker         assert_eq!(hdr.ethertype, EtherType::IPv4);
71*cf78ab8cSAndroid Build Coastguard Worker     }
72*cf78ab8cSAndroid Build Coastguard Worker 
73*cf78ab8cSAndroid Build Coastguard Worker     #[test]
test_llc_snap_header_invalid_llc()74*cf78ab8cSAndroid Build Coastguard Worker     fn test_llc_snap_header_invalid_llc() {
75*cf78ab8cSAndroid Build Coastguard Worker         #[rustfmt::skip]
76*cf78ab8cSAndroid Build Coastguard Worker         let payload = vec![
77*cf78ab8cSAndroid Build Coastguard Worker             // LLC
78*cf78ab8cSAndroid Build Coastguard Worker             0 as u8, 0 as u8, 0 as u8,
79*cf78ab8cSAndroid Build Coastguard Worker             // OUI
80*cf78ab8cSAndroid Build Coastguard Worker             0x00, 0x00, 0x00,
81*cf78ab8cSAndroid Build Coastguard Worker             // EtherType
82*cf78ab8cSAndroid Build Coastguard Worker             0x00, 0x00,
83*cf78ab8cSAndroid Build Coastguard Worker         ];
84*cf78ab8cSAndroid Build Coastguard Worker         let hdr_result = LlcSnapHeader::decode_full(&payload);
85*cf78ab8cSAndroid Build Coastguard Worker         assert!(hdr_result.is_err());
86*cf78ab8cSAndroid Build Coastguard Worker     }
87*cf78ab8cSAndroid Build Coastguard Worker 
88*cf78ab8cSAndroid Build Coastguard Worker     #[test]
test_llc_snap_header_invalid_ethertype()89*cf78ab8cSAndroid Build Coastguard Worker     fn test_llc_snap_header_invalid_ethertype() {
90*cf78ab8cSAndroid Build Coastguard Worker         let payload = vec![
91*cf78ab8cSAndroid Build Coastguard Worker             LlcSap::Snap as u8,
92*cf78ab8cSAndroid Build Coastguard Worker             LlcSap::Snap as u8,
93*cf78ab8cSAndroid Build Coastguard Worker             LlcCtrl::UiCmd as u8,
94*cf78ab8cSAndroid Build Coastguard Worker             // OUI
95*cf78ab8cSAndroid Build Coastguard Worker             0x00,
96*cf78ab8cSAndroid Build Coastguard Worker             0x00,
97*cf78ab8cSAndroid Build Coastguard Worker             0x00,
98*cf78ab8cSAndroid Build Coastguard Worker             // EtherType
99*cf78ab8cSAndroid Build Coastguard Worker             0x00,
100*cf78ab8cSAndroid Build Coastguard Worker             0x00,
101*cf78ab8cSAndroid Build Coastguard Worker         ];
102*cf78ab8cSAndroid Build Coastguard Worker         let hdr_result = LlcSnapHeader::decode_full(&payload);
103*cf78ab8cSAndroid Build Coastguard Worker         assert!(hdr_result.is_err());
104*cf78ab8cSAndroid Build Coastguard Worker     }
105*cf78ab8cSAndroid Build Coastguard Worker }
106