mirror of
https://github.com/EFForg/rayhunter.git
synced 2026-06-30 06:02:06 -07:00
Add LL1 Serving Cell Timing messages
This log should provide constant feedback about the serving cell's LTE timing advance value.
This commit is contained in:
@@ -430,17 +430,14 @@ impl Harness {
|
||||
return row;
|
||||
}
|
||||
};
|
||||
let gsmtap_message = match gsmtap_parser::parse(qmdl_message) {
|
||||
Ok(msg) => msg,
|
||||
let (timestamp, gsmtap_msg) = match gsmtap_parser::parse(qmdl_message) {
|
||||
Ok(Some(msg)) => msg,
|
||||
Ok(None) => return row,
|
||||
Err(err) => {
|
||||
row.skipped_message_reason = Some(format!("{err:?}"));
|
||||
return row;
|
||||
}
|
||||
};
|
||||
|
||||
let Some((timestamp, gsmtap_msg)) = gsmtap_message else {
|
||||
return row;
|
||||
};
|
||||
row.packet_timestamp = Some(timestamp.to_datetime());
|
||||
|
||||
let element = match InformationElement::try_from(&gsmtap_msg) {
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
use deku::prelude::*;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)]
|
||||
#[deku(bit_order = "lsb", ctx = "_: deku::ctx::Order")]
|
||||
pub struct ServingCellTiming {
|
||||
#[deku(assert_eq = "1")]
|
||||
pub version: u8,
|
||||
#[deku(bits = 5, assert = "*num_records <= 20")]
|
||||
pub num_records: u8,
|
||||
#[deku(bits = 4, assert = "*starting_sub_fn <= 9")]
|
||||
pub starting_sub_fn: u8,
|
||||
#[deku(bits = 10, pad_bits_after = "5", assert = "*starting_system_fn <= 1023")]
|
||||
pub starting_system_fn: u16,
|
||||
#[deku(bits = 19, pad_bits_after = "13", assert = "*starting_dl_frame_timing_offs <= 307200")]
|
||||
pub starting_dl_frame_timing_offs: u32, // in Ts units
|
||||
#[deku(bits = 19, assert = "*starting_ul_frame_timing_offs <= 307200")]
|
||||
pub starting_ul_frame_timing_offs: u32, // in Ts units
|
||||
#[deku(bits = 11, pad_bits_after = "2")]
|
||||
pub starting_ul_timing_advance: u16, // in 16 Ts units
|
||||
#[deku(count = "*num_records")]
|
||||
pub timing_adjustment: Vec<TimingAdjustment>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)]
|
||||
#[deku(bit_order = "lsb", ctx = "_: deku::ctx::Order")]
|
||||
pub struct TimingAdjustment {
|
||||
#[deku(bits = 11, assert = "(-512..=511).contains(dl_frame_timing_adjustment)")]
|
||||
pub dl_frame_timing_adjustment: i16, // in Ts units
|
||||
#[deku(bits = 5, assert = "(-16..=15).contains(ul_frame_timing_adjustment)")]
|
||||
pub ul_frame_timing_adjustment: i8, // in Ts units
|
||||
#[deku(bits = 8, assert = "(-128..=127).contains(timing_advance)")]
|
||||
pub timing_advance: i8, // in 16 Ts units
|
||||
}
|
||||
@@ -18,7 +18,8 @@ pub struct Subpacket {
|
||||
pub id: u8,
|
||||
pub version: u8,
|
||||
pub size: u16,
|
||||
#[deku(ctx = "*id, *version, *size")]
|
||||
// size includes the header length, so subtract that
|
||||
#[deku(ctx = "*id, *version, *size - 4")]
|
||||
pub body: SubpacketBody,
|
||||
}
|
||||
|
||||
|
||||
@@ -3,8 +3,9 @@
|
||||
use chrono::{DateTime, FixedOffset};
|
||||
use deku::prelude::*;
|
||||
|
||||
pub mod ll1;
|
||||
pub mod mac;
|
||||
pub mod measurement;
|
||||
pub mod ml1;
|
||||
pub mod rrc;
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)]
|
||||
@@ -79,14 +80,23 @@ pub enum LogBody {
|
||||
},
|
||||
#[deku(id = "0xb17f")]
|
||||
LteMl1ServingCellMeasurementAndEvaluation {
|
||||
data: measurement::serving_cell::MeasurementAndEvaluation,
|
||||
data: ml1::serving_cell::MeasurementAndEvaluation,
|
||||
},
|
||||
#[deku(id = "0xb180")]
|
||||
LteMl1NeighborCellsMeasurements {
|
||||
data: measurement::neighbor_cells::Measurements,
|
||||
data: ml1::neighbor_cells::Measurements,
|
||||
},
|
||||
#[deku(id = "0xb062")]
|
||||
LteMacRachResponse { packet: mac::Packet },
|
||||
#[deku(id = "0xb063")]
|
||||
LteMacDl { packet: mac::Packet },
|
||||
#[deku(id = "0xb064")]
|
||||
LteMacUl { packet: mac::Packet },
|
||||
#[deku(id = "0xb114")]
|
||||
LteLl1ServingCellTiming {
|
||||
#[deku(ctx = "deku::ctx::Order::Lsb0")]
|
||||
data: ll1::ServingCellTiming,
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)]
|
||||
|
||||
+2
-1
@@ -166,8 +166,9 @@ impl Message {
|
||||
match body {
|
||||
LogBody::LteRrcOtaMessage { .. } => true,
|
||||
LogBody::LteMacRachResponse { .. } => true,
|
||||
LogBody::LteMl1NeighborCellsMeasurements { .. } => true,
|
||||
LogBody::Nas4GMessage { .. } => true,
|
||||
_ => false,
|
||||
_ => false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+18
-15
@@ -40,27 +40,30 @@ pub enum DiagDeviceError {
|
||||
ParseMessagesContainerError(deku::DekuError),
|
||||
}
|
||||
|
||||
pub const LOG_CODES_FOR_RAW_PACKET_LOGGING: [u32; 14] = [
|
||||
pub const LOG_CODES_FOR_RAW_PACKET_LOGGING: [u32; 17] = [
|
||||
// Layer 2:
|
||||
log_codes::LOG_GPRS_MAC_SIGNALLING_MESSAGE_C, // 0x5226
|
||||
log_codes::LOG_GPRS_MAC_SIGNALLING_MESSAGE_C,
|
||||
// Layer 3:
|
||||
log_codes::LOG_GSM_RR_SIGNALING_MESSAGE_C, // 0x512f
|
||||
log_codes::WCDMA_SIGNALLING_MESSAGE, // 0x412f
|
||||
log_codes::LOG_LTE_RRC_OTA_MSG_LOG_C, // 0xb0c0
|
||||
log_codes::LOG_NR_RRC_OTA_MSG_LOG_C, // 0xb821
|
||||
log_codes::LOG_GSM_RR_SIGNALING_MESSAGE_C,
|
||||
log_codes::WCDMA_SIGNALLING_MESSAGE,
|
||||
log_codes::LOG_LTE_RRC_OTA_MSG_LOG_C,
|
||||
log_codes::LOG_NR_RRC_OTA_MSG_LOG_C,
|
||||
// NAS:
|
||||
log_codes::LOG_UMTS_NAS_OTA_MESSAGE_LOG_PACKET_C, // 0x713a
|
||||
log_codes::LOG_LTE_NAS_ESM_OTA_IN_MSG_LOG_C, // 0xb0e2
|
||||
log_codes::LOG_LTE_NAS_ESM_OTA_OUT_MSG_LOG_C, // 0xb0e3
|
||||
log_codes::LOG_LTE_NAS_EMM_OTA_IN_MSG_LOG_C, // 0xb0ec
|
||||
log_codes::LOG_LTE_NAS_EMM_OTA_OUT_MSG_LOG_C, // 0xb0ed
|
||||
log_codes::LOG_UMTS_NAS_OTA_MESSAGE_LOG_PACKET_C,
|
||||
log_codes::LOG_LTE_NAS_ESM_OTA_IN_MSG_LOG_C,
|
||||
log_codes::LOG_LTE_NAS_ESM_OTA_OUT_MSG_LOG_C,
|
||||
log_codes::LOG_LTE_NAS_EMM_OTA_IN_MSG_LOG_C,
|
||||
log_codes::LOG_LTE_NAS_EMM_OTA_OUT_MSG_LOG_C,
|
||||
// User IP traffic:
|
||||
log_codes::LOG_DATA_PROTOCOL_LOGGING_C, // 0x11eb
|
||||
log_codes::LOG_DATA_PROTOCOL_LOGGING_C,
|
||||
// LTE physical layer serving cell measurements: RSRP, RSRQ, RSSI
|
||||
log_codes::LOG_LTE_ML1_SERVING_CELL_MEAS_AND_EVAL_C, // 0xb17f
|
||||
log_codes::LOG_LTE_ML1_NEIGHBOR_MEAS, // 0xb180
|
||||
log_codes::LOG_LTE_ML1_SERVING_CELL_MEAS_AND_EVAL_C,
|
||||
log_codes::LOG_LTE_ML1_NEIGHBOR_MEAS,
|
||||
// LTE MAC Random Access Channel response: contains Timing Advance
|
||||
log_codes::LOG_LTE_MAC_RACH_RESPONSE_C, // 0xb062
|
||||
log_codes::LOG_LTE_MAC_RACH_RESPONSE_C,
|
||||
log_codes::LOG_LTE_MAC_DL,
|
||||
log_codes::LOG_LTE_MAC_UL,
|
||||
0xb114, // maybe timing advance related?
|
||||
];
|
||||
|
||||
const BUFFER_LEN: usize = 1024 * 1024 * 10;
|
||||
|
||||
@@ -35,6 +35,8 @@ pub const LOG_LTE_RRC_OTA_MSG_LOG_C: u32 = 0xb0c0;
|
||||
pub const LOG_LTE_ML1_SERVING_CELL_MEAS_AND_EVAL_C: u32 = 0xb17f;
|
||||
pub const LOG_LTE_ML1_SERVING_CELL_MEAS_RESPONSE: u32 = 0xb193;
|
||||
pub const LOG_LTE_ML1_NEIGHBOR_MEAS: u32 = 0xb180;
|
||||
pub const LOG_LTE_ML1_MAC_RAR_MSG1_REPORT: u32 = 0xb167;
|
||||
pub const LOG_LTE_ML1_MAC_RAR_MSG2_REPORT: u32 = 0xb168;
|
||||
// Qualcomm MAC layer RACH response log: contains Timing Advance from Random Access Response
|
||||
pub const LOG_LTE_MAC_RACH_RESPONSE_C: u32 = 0xb062;
|
||||
pub const LOG_LTE_MAC_DL: u32 = 0xb063;
|
||||
|
||||
Reference in New Issue
Block a user