mirror of
https://github.com/EFForg/rayhunter.git
synced 2026-07-29 10:18:12 -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;
|
return row;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let gsmtap_message = match gsmtap_parser::parse(qmdl_message) {
|
let (timestamp, gsmtap_msg) = match gsmtap_parser::parse(qmdl_message) {
|
||||||
Ok(msg) => msg,
|
Ok(Some(msg)) => msg,
|
||||||
|
Ok(None) => return row,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
row.skipped_message_reason = Some(format!("{err:?}"));
|
row.skipped_message_reason = Some(format!("{err:?}"));
|
||||||
return row;
|
return row;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let Some((timestamp, gsmtap_msg)) = gsmtap_message else {
|
|
||||||
return row;
|
|
||||||
};
|
|
||||||
row.packet_timestamp = Some(timestamp.to_datetime());
|
row.packet_timestamp = Some(timestamp.to_datetime());
|
||||||
|
|
||||||
let element = match InformationElement::try_from(&gsmtap_msg) {
|
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 id: u8,
|
||||||
pub version: u8,
|
pub version: u8,
|
||||||
pub size: u16,
|
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,
|
pub body: SubpacketBody,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,8 +3,9 @@
|
|||||||
use chrono::{DateTime, FixedOffset};
|
use chrono::{DateTime, FixedOffset};
|
||||||
use deku::prelude::*;
|
use deku::prelude::*;
|
||||||
|
|
||||||
|
pub mod ll1;
|
||||||
pub mod mac;
|
pub mod mac;
|
||||||
pub mod measurement;
|
pub mod ml1;
|
||||||
pub mod rrc;
|
pub mod rrc;
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)]
|
#[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)]
|
||||||
@@ -79,14 +80,23 @@ pub enum LogBody {
|
|||||||
},
|
},
|
||||||
#[deku(id = "0xb17f")]
|
#[deku(id = "0xb17f")]
|
||||||
LteMl1ServingCellMeasurementAndEvaluation {
|
LteMl1ServingCellMeasurementAndEvaluation {
|
||||||
data: measurement::serving_cell::MeasurementAndEvaluation,
|
data: ml1::serving_cell::MeasurementAndEvaluation,
|
||||||
},
|
},
|
||||||
#[deku(id = "0xb180")]
|
#[deku(id = "0xb180")]
|
||||||
LteMl1NeighborCellsMeasurements {
|
LteMl1NeighborCellsMeasurements {
|
||||||
data: measurement::neighbor_cells::Measurements,
|
data: ml1::neighbor_cells::Measurements,
|
||||||
},
|
},
|
||||||
#[deku(id = "0xb062")]
|
#[deku(id = "0xb062")]
|
||||||
LteMacRachResponse { packet: mac::Packet },
|
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)]
|
#[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)]
|
||||||
|
|||||||
+2
-1
@@ -166,8 +166,9 @@ impl Message {
|
|||||||
match body {
|
match body {
|
||||||
LogBody::LteRrcOtaMessage { .. } => true,
|
LogBody::LteRrcOtaMessage { .. } => true,
|
||||||
LogBody::LteMacRachResponse { .. } => true,
|
LogBody::LteMacRachResponse { .. } => true,
|
||||||
|
LogBody::LteMl1NeighborCellsMeasurements { .. } => true,
|
||||||
LogBody::Nas4GMessage { .. } => true,
|
LogBody::Nas4GMessage { .. } => true,
|
||||||
_ => false,
|
_ => false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-15
@@ -40,27 +40,30 @@ pub enum DiagDeviceError {
|
|||||||
ParseMessagesContainerError(deku::DekuError),
|
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:
|
// Layer 2:
|
||||||
log_codes::LOG_GPRS_MAC_SIGNALLING_MESSAGE_C, // 0x5226
|
log_codes::LOG_GPRS_MAC_SIGNALLING_MESSAGE_C,
|
||||||
// Layer 3:
|
// Layer 3:
|
||||||
log_codes::LOG_GSM_RR_SIGNALING_MESSAGE_C, // 0x512f
|
log_codes::LOG_GSM_RR_SIGNALING_MESSAGE_C,
|
||||||
log_codes::WCDMA_SIGNALLING_MESSAGE, // 0x412f
|
log_codes::WCDMA_SIGNALLING_MESSAGE,
|
||||||
log_codes::LOG_LTE_RRC_OTA_MSG_LOG_C, // 0xb0c0
|
log_codes::LOG_LTE_RRC_OTA_MSG_LOG_C,
|
||||||
log_codes::LOG_NR_RRC_OTA_MSG_LOG_C, // 0xb821
|
log_codes::LOG_NR_RRC_OTA_MSG_LOG_C,
|
||||||
// NAS:
|
// NAS:
|
||||||
log_codes::LOG_UMTS_NAS_OTA_MESSAGE_LOG_PACKET_C, // 0x713a
|
log_codes::LOG_UMTS_NAS_OTA_MESSAGE_LOG_PACKET_C,
|
||||||
log_codes::LOG_LTE_NAS_ESM_OTA_IN_MSG_LOG_C, // 0xb0e2
|
log_codes::LOG_LTE_NAS_ESM_OTA_IN_MSG_LOG_C,
|
||||||
log_codes::LOG_LTE_NAS_ESM_OTA_OUT_MSG_LOG_C, // 0xb0e3
|
log_codes::LOG_LTE_NAS_ESM_OTA_OUT_MSG_LOG_C,
|
||||||
log_codes::LOG_LTE_NAS_EMM_OTA_IN_MSG_LOG_C, // 0xb0ec
|
log_codes::LOG_LTE_NAS_EMM_OTA_IN_MSG_LOG_C,
|
||||||
log_codes::LOG_LTE_NAS_EMM_OTA_OUT_MSG_LOG_C, // 0xb0ed
|
log_codes::LOG_LTE_NAS_EMM_OTA_OUT_MSG_LOG_C,
|
||||||
// User IP traffic:
|
// 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
|
// 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_SERVING_CELL_MEAS_AND_EVAL_C,
|
||||||
log_codes::LOG_LTE_ML1_NEIGHBOR_MEAS, // 0xb180
|
log_codes::LOG_LTE_ML1_NEIGHBOR_MEAS,
|
||||||
// LTE MAC Random Access Channel response: contains Timing Advance
|
// 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;
|
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_AND_EVAL_C: u32 = 0xb17f;
|
||||||
pub const LOG_LTE_ML1_SERVING_CELL_MEAS_RESPONSE: u32 = 0xb193;
|
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_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
|
// 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_RACH_RESPONSE_C: u32 = 0xb062;
|
||||||
pub const LOG_LTE_MAC_DL: u32 = 0xb063;
|
pub const LOG_LTE_MAC_DL: u32 = 0xb063;
|
||||||
|
|||||||
Reference in New Issue
Block a user