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