This commit is contained in:
Will Greenberg
2026-06-26 14:54:03 -07:00
parent 892c833344
commit 21e12d16e1
3 changed files with 44 additions and 7 deletions
+12 -7
View File
@@ -2,10 +2,7 @@ use clap::Parser;
use log::{debug, error, info, warn}; use log::{debug, error, info, warn};
use pcap_file_tokio::pcapng::{Block, PcapNgReader}; use pcap_file_tokio::pcapng::{Block, PcapNgReader};
use rayhunter::{ use rayhunter::{
analysis::analyzer::{AnalysisRow, AnalyzerConfig, EventType, Harness}, analysis::analyzer::{AnalysisRow, AnalyzerConfig, EventType, Harness}, diag::Message, gsmtap::parser as gsmtap_parser, pcap::GsmtapPcapWriter, qmdl::QmdlMessageReader,
gsmtap::parser as gsmtap_parser,
pcap::GsmtapPcapWriter,
qmdl::QmdlMessageReader,
}; };
use std::{collections::HashMap, path::PathBuf}; use std::{collections::HashMap, path::PathBuf};
use tokio::fs::File; use tokio::fs::File;
@@ -115,12 +112,20 @@ async fn analyze_qmdl(qmdl_path: &str, show_skipped: bool) {
.await .await
.expect("failed to open QmdlReader"); .expect("failed to open QmdlReader");
let mut report = Report::new(qmdl_path); let mut report = Report::new(qmdl_path);
while let Some(maybe_message) = qmdl_reader let mut stats = HashMap::new();
.get_next_message() while let Some(buf) = qmdl_reader
.get_next_buf()
.await .await
.expect("failed to get message") .expect("failed to get message")
{ {
report.process_row(harness.analyze_qmdl_message(maybe_message)); let log_type = u16::from_le_bytes([buf[6], buf[7]]);
stats.entry(log_type)
.and_modify(|total| *total += buf.len())
.or_insert(buf.len());
report.process_row(harness.analyze_qmdl_message(Message::from_hdlc(&buf)));
}
for (id, size) in stats {
println!("{id:04x}: {size}");
} }
report.print_summary(show_skipped); report.print_summary(show_skipped);
} }
+16
View File
@@ -5,6 +5,7 @@ use serde::{Deserialize, Serialize};
use std::borrow::Cow; use std::borrow::Cow;
use crate::analysis::diagnostic::DiagnosticAnalyzer; use crate::analysis::diagnostic::DiagnosticAnalyzer;
use crate::diag::diaglog::LogBody;
use crate::diag::{DiagParsingError, Message, MessagesContainer}; use crate::diag::{DiagParsingError, Message, MessagesContainer};
use crate::gsmtap::{GsmtapHeader, GsmtapMessage, GsmtapType, parser as gsmtap_parser}; use crate::gsmtap::{GsmtapHeader, GsmtapMessage, GsmtapType, parser as gsmtap_parser};
use crate::util::RuntimeMetadata; use crate::util::RuntimeMetadata;
@@ -430,6 +431,21 @@ impl Harness {
return row; return row;
} }
}; };
if let Message::Log { body, .. } = &qmdl_message {
match body {
LogBody::LteLl1ServingCellTiming { data } => {
for t in &data.timing_adjustment {
if t.timing_advance != 0 {
println!("ta {}", t.timing_advance);
}
}
}
LogBody::LteMl1ServingCellMeasurementAndEvaluation { data } => {
// println!("serving cell pci {}, earfcn {}", data.get_pci(), data.get_earfcn());
}
_ => {},
}
}
let (timestamp, gsmtap_msg) = match gsmtap_parser::parse(qmdl_message) { let (timestamp, gsmtap_msg) = match gsmtap_parser::parse(qmdl_message) {
Ok(Some(msg)) => msg, Ok(Some(msg)) => msg,
Ok(None) => return row, Ok(None) => return row,
+16
View File
@@ -199,6 +199,22 @@ where
Ok(Some(Message::from_hdlc(&buf))) Ok(Some(Message::from_hdlc(&buf)))
} }
pub async fn get_next_buf(
&mut self,
) -> Result<Option<Vec<u8>>, std::io::Error> {
let mut buf = vec![];
if self
.buf_reader
.read_until(MESSAGE_TERMINATOR, &mut buf)
.await?
== 0
{
return Ok(None);
}
Ok(Some(buf))
}
} }
impl<T> AsyncRead for QmdlMessageReader<T> impl<T> AsyncRead for QmdlMessageReader<T>