From 69d40a766a73cb2a441532cee39717b1912dc258 Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Wed, 13 Dec 2023 14:21:18 -0800 Subject: [PATCH] some renaming, reorganization --- src/debug_file.rs | 50 ++++++++++++++++++++ src/debug_reader.rs | 5 +- src/diag_device.rs | 110 ++------------------------------------------ src/diag_reader.rs | 61 ++++++++++++++++++++++++ src/hdlc.rs | 2 +- src/main.rs | 5 +- 6 files changed, 125 insertions(+), 108 deletions(-) create mode 100644 src/debug_file.rs create mode 100644 src/diag_reader.rs diff --git a/src/debug_file.rs b/src/debug_file.rs new file mode 100644 index 0000000..3dd2c2a --- /dev/null +++ b/src/debug_file.rs @@ -0,0 +1,50 @@ +use crate::diag_reader::DiagReader; +use crate::diag_device::DiagResult; +use crate::diag::*; + +use deku::prelude::*; +use std::fs::File; +use std::io::Read; + +#[derive(Debug, DekuRead, DekuWrite)] +#[deku(endian = "little")] +pub struct DebugFileBlock<'a> { + pub size: u32, + #[deku(count = "size")] + pub data: &'a [u8], +} + +pub struct DebugFileReader { + file: File, +} + +impl DebugFileReader { + pub fn new

(path: P) -> DiagResult where P: AsRef { + let file = std::fs::File::options() + .read(true) + .open(path)?; + Ok(DebugFileReader { file }) + } +} + + +impl DiagReader for DebugFileReader { + fn get_next_messages_container(&mut self) -> DiagResult { + let mut bytes_read_buf = [0; 4]; + if let Err(e) = self.file.read_exact(&mut bytes_read_buf) { + if e.kind() == std::io::ErrorKind::UnexpectedEof { + println!("reached end of debug file, exiting..."); + std::process::exit(0); + } + return Err(e.into()); + } + let bytes_read = u32::from_le_bytes(bytes_read_buf) as usize; + let mut data = vec![0; bytes_read as usize]; + self.file.read_exact(&mut data)?; + let ((leftover_bytes, _), container) = MessagesContainer::from_bytes((&data, 0))?; + if leftover_bytes.len() > 0 { + println!("warning: {} leftover bytes when parsing MessagesContainer", leftover_bytes.len()); + } + Ok(container) + } +} diff --git a/src/debug_reader.rs b/src/debug_reader.rs index 0d25e55..ad64432 100644 --- a/src/debug_reader.rs +++ b/src/debug_reader.rs @@ -1,9 +1,12 @@ mod hdlc; mod diag; mod diag_device; +mod diag_reader; +mod debug_file; mod log_codes; -use crate::diag_device::{DebugFileReader, DiagReader}; +use crate::debug_file::DebugFileReader; +use crate::diag_reader::DiagReader; fn main() -> diag_device::DiagResult<()> { // this should eventually be removed for prod diff --git a/src/diag_device.rs b/src/diag_device.rs index ad8b956..b697e96 100644 --- a/src/diag_device.rs +++ b/src/diag_device.rs @@ -1,12 +1,13 @@ -use crate::hdlc::{hdlc_encapsulate, hdlc_decapsulate, HdlcError}; +use crate::hdlc::{hdlc_encapsulate, HdlcError}; use crate::diag::{Message, ResponsePayload, Request, LogConfigRequest, LogConfigResponse, build_log_mask_request, RequestContainer, DataType, MessagesContainer}; +use crate::diag_reader::{DiagReader, CRC_CCITT}; +use crate::debug_file::DebugFileBlock; use crate::log_codes; use std::fs::File; -use std::io::{Read, Write, Seek}; +use std::io::{Read, Write}; use std::os::fd::AsRawFd; use thiserror::Error; -use crc::{Crc, Algorithm}; use deku::prelude::*; pub type DiagResult = Result; @@ -29,20 +30,6 @@ pub enum DiagDeviceError { DekuError(#[from] DekuError), } -// this is sorta based on the params qcsuper uses, plus what seems to be used in -// https://github.com/fgsect/scat/blob/f1538b397721df3ab8ba12acd26716abcf21f78b/util.py#L47 -pub const CRC_CCITT_ALG: Algorithm = Algorithm { - poly: 0x1021, - init: 0xffff, - refin: true, - refout: true, - width: 16, - xorout: 0xffff, - check: 0x2189, - residue: 0x0000, -}; -pub const CRC_CCITT: Crc = Crc::::new(&CRC_CCITT_ALG); - pub const LOG_CODES_FOR_RAW_PACKET_LOGGING: [u32; 11] = [ // Layer 2: log_codes::LOG_GPRS_MAC_SIGNALLING_MESSAGE_C, // 0x5226 @@ -76,100 +63,13 @@ pub struct DiagDevice<'a> { use_mdm: i32, } -#[derive(Debug, DekuRead, DekuWrite)] -#[deku(endian = "little")] -struct DebugReadBlock<'a> { - size: u32, - #[deku(count = "size")] - data: &'a [u8], -} -pub struct DebugFileReader { - file: File, -} - -impl DebugFileReader { - pub fn new

(path: P) -> DiagResult where P: AsRef { - let file = std::fs::File::options() - .read(true) - .open(path)?; - Ok(DebugFileReader { file }) - } -} - -pub trait DiagReader { - fn get_next_messages_container(&mut self) -> DiagResult; - - fn read_response(&mut self) -> DiagResult> { - loop { - let container = self.get_next_messages_container()?; - if container.data_type == DataType::UserSpace { - return self.parse_response_container(container); - } else { - println!("skipping non-userspace message...") - } - } - } - - fn parse_response_container(&self, container: MessagesContainer) -> DiagResult> { - let mut result = Vec::new(); - for msg in container.messages { - for sub_msg in msg.data.split_inclusive(|&b| b == 0x7e) { - match hdlc_decapsulate(&sub_msg, &CRC_CCITT) { - Ok(data) => match Message::from_bytes((&data, 0)) { - Ok(((leftover_bytes, _), res)) => { - if leftover_bytes.len() > 0 { - println!("warning: {} leftover bytes when parsing Message", leftover_bytes.len()); - } - result.push(res); - }, - Err(e) => { - println!("error parsing response: {:?}", e); - println!("{:?}", data); - }, - }, - Err(err) => { - println!("error decapsulating response: {:?}", err); - println!("{:?}", &sub_msg); - } - } - } - } - Ok(result) - } -} - - -impl DiagReader for DebugFileReader { - fn get_next_messages_container(&mut self) -> DiagResult { - let mut bytes_read_buf = [0; 4]; - match self.file.read_exact(&mut bytes_read_buf) { - Ok(_) => {}, - Err(e) => { - dbg!(e.kind()); - if e.kind() == std::io::ErrorKind::UnexpectedEof { - println!("reached end of debug file, exiting..."); - std::process::exit(0); - } - return Err(e.into()); - }, - } - let bytes_read = u32::from_le_bytes(bytes_read_buf) as usize; - let mut data = vec![0; bytes_read as usize]; - self.file.read_exact(&mut data)?; - let ((leftover_bytes, _), container) = MessagesContainer::from_bytes((&data, 0))?; - if leftover_bytes.len() > 0 { - println!("warning: {} leftover bytes when parsing MessagesContainer", leftover_bytes.len()); - } - Ok(container) - } -} impl<'a> DiagReader for DiagDevice<'a> { fn get_next_messages_container(&mut self) -> DiagResult { let bytes_read = self.file.read(&mut self.read_buf).unwrap(); if let Some(debug_file) = self.debug_file.as_mut() { - let debug_block = DebugReadBlock { + let debug_block = DebugFileBlock { size: bytes_read as u32, data: &self.read_buf[0..bytes_read], }; diff --git a/src/diag_reader.rs b/src/diag_reader.rs new file mode 100644 index 0000000..00ded53 --- /dev/null +++ b/src/diag_reader.rs @@ -0,0 +1,61 @@ +use crate::{diag::*, hdlc::hdlc_decapsulate}; +use crate::diag_device::DiagResult; + +use crc::{Crc, Algorithm}; +use deku::prelude::*; + +// this is sorta based on the params qcsuper uses, plus what seems to be used in +// https://github.com/fgsect/scat/blob/f1538b397721df3ab8ba12acd26716abcf21f78b/util.py#L47 +pub const CRC_CCITT_ALG: Algorithm = Algorithm { + poly: 0x1021, + init: 0xffff, + refin: true, + refout: true, + width: 16, + xorout: 0xffff, + check: 0x2189, + residue: 0x0000, +}; +pub const CRC_CCITT: Crc = Crc::::new(&CRC_CCITT_ALG); + +pub trait DiagReader { + fn get_next_messages_container(&mut self) -> DiagResult; + + fn read_response(&mut self) -> DiagResult> { + loop { + let container = self.get_next_messages_container()?; + if container.data_type == DataType::UserSpace { + return self.parse_response_container(container); + } else { + println!("skipping non-userspace message...") + } + } + } + + fn parse_response_container(&self, container: MessagesContainer) -> DiagResult> { + let mut result = Vec::new(); + for msg in container.messages { + for sub_msg in msg.data.split_inclusive(|&b| b == 0x7e) { + match hdlc_decapsulate(&sub_msg, &CRC_CCITT) { + Ok(data) => match Message::from_bytes((&data, 0)) { + Ok(((leftover_bytes, _), res)) => { + if leftover_bytes.len() > 0 { + println!("warning: {} leftover bytes when parsing Message", leftover_bytes.len()); + } + result.push(res); + }, + Err(e) => { + println!("error parsing response: {:?}", e); + println!("{:?}", data); + }, + }, + Err(err) => { + println!("error decapsulating response: {:?}", err); + println!("{:?}", &sub_msg); + } + } + } + } + Ok(result) + } +} diff --git a/src/hdlc.rs b/src/hdlc.rs index 78dc663..7813e5b 100644 --- a/src/hdlc.rs +++ b/src/hdlc.rs @@ -87,7 +87,7 @@ mod tests { #[test] fn test_hdlc_encapsulate() { - let crc = Crc::::new(&crate::diag_device::CRC_CCITT_ALG); + let crc = Crc::::new(&crate::diag_reader::CRC_CCITT_ALG); let data = vec![0x01, 0x02, 0x03, 0x04]; let expected = vec![1, 2, 3, 4, 145, 57, 126]; let encapsulated = hdlc_encapsulate(&data, &crc); diff --git a/src/main.rs b/src/main.rs index e83c760..9ed718f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,9 +1,12 @@ mod hdlc; mod diag; mod diag_device; +mod diag_reader; +mod debug_file; mod log_codes; -use crate::diag_device::{DiagDevice, DiagReader}; +use crate::diag_device::DiagDevice; +use crate::diag_reader::DiagReader; fn main() -> diag_device::DiagResult<()> { // this should eventually be removed for prod