diff --git a/src/diag.rs b/src/diag.rs index 15bf77b..b35b8a0 100644 --- a/src/diag.rs +++ b/src/diag.rs @@ -1,7 +1,7 @@ //! Diag protocol serialization/deserialization use chrono::{DateTime, FixedOffset}; -use deku::{prelude::*, bitvec::{BitSlice, Msb0}}; +use deku::prelude::*; #[derive(Debug, Clone, DekuWrite)] pub struct RequestContainer { @@ -148,28 +148,6 @@ pub enum LogBody { } } -/* - item_struct = namedtuple('QcDiagLteRrcOtaPacket', 'rrc_rel_maj rrc_rel_min rbid pci earfcn sfn_subfn pdu_num len') - item_struct_v5 = namedtuple('QcDiagLteRrcOtaPacketV5', 'rrc_rel_maj rrc_rel_min rbid pci earfcn sfn_subfn pdu_num sib_mask len') - item_struct_v25 = namedtuple('QcDiagLteRrcOtaPacketV25', 'rrc_rel_maj rrc_rel_min nr_rrc_rel_maj nr_rrc_rel_min rbid pci earfcn sfn_subfn pdu_num sib_mask len') - if pkt_version >= 25: - # Version 25, 26, 27 - item = item_struct_v25._make(struct.unpack('= 8: - # Version 8, 9, 12, 13, 15, 16, 19, 20, 22, 24 - item = item_struct_v5._make(struct.unpack('= 5: - # Version 6, 7 - item = item_struct_v5._make(struct.unpack(' match Message::from_bytes((&data, 0)) { - Ok(((_, leftover_bytes), res)) => { - if leftover_bytes > 0 { - println!("warning: {} leftover bytes when parsing Message", leftover_bytes); + Ok(((leftover_bytes, _), res)) => { + if leftover_bytes.len() > 0 { + println!("warning: {} leftover bytes when parsing Message", leftover_bytes.len()); } result.push(res); }, @@ -118,13 +118,20 @@ impl DiagDevice { } pub fn read_response(&mut self) -> DiagResult> { - let mut buf = vec![0; BUFFER_LEN]; + let mut packet_buf = vec![0; BUFFER_LEN]; loop { - let _ = self.file.read(&mut buf)?; - let ((_, leftover_bytes), res_container) = MessagesContainer::from_bytes((&buf, 0))?; - if leftover_bytes > 0 { - println!("warning: {} leftover bytes when parsing ResponseContainer", leftover_bytes); + let mut packet = vec![]; + while !packet.ends_with(&[0x7e]) { + let bytes_read = self.file.read(&mut packet_buf)?; + packet.extend(&packet_buf[0..bytes_read]); + // clear out the buffer so we don't accidentally read stale data + packet_buf.clear(); + packet_buf.resize(BUFFER_LEN, 0); + } + let ((leftover_bytes, _), res_container) = MessagesContainer::from_bytes((&packet, 0))?; + if leftover_bytes.len() > 0 { + println!("warning: {} leftover bytes when parsing ResponseContainer", leftover_bytes.len()); } if res_container.data_type == DataType::UserSpace { return self.parse_response_container(res_container); diff --git a/src/hdlc.rs b/src/hdlc.rs index 1d8b9d5..78dc663 100644 --- a/src/hdlc.rs +++ b/src/hdlc.rs @@ -4,7 +4,7 @@ //! https://github.com/P1sec/QCSuper/blob/master/docs/The%20Diag%20protocol.md#the-diag-protocol-over-usb use crc::Crc; -use bytes::{Buf, BufMut}; +use bytes::Buf; use thiserror::Error; #[derive(Debug, Error, PartialEq)] @@ -45,7 +45,6 @@ pub fn hdlc_encapsulate(data: &[u8], crc: &Crc) -> Vec { } pub fn hdlc_decapsulate(data: &[u8], crc: &Crc) -> Result, HdlcError> { - // TODO: return errors instead of panicking if data.len() < 3 { return Err(HdlcError::TooShort); }