From f8581559e7d24a314692538bb2864fc3f5cc21ee Mon Sep 17 00:00:00 2001 From: Will Greenberg Date: Wed, 30 Jul 2025 15:43:02 -0700 Subject: [PATCH] lib: add diag parsing for LTE MAC DL packets --- lib/src/diag.rs | 17 +++++++++++++++++ lib/src/diag_device.rs | 27 +++++++++++++++------------ lib/src/gsmtap_parser.rs | 17 +++++++---------- lib/src/log_codes.rs | 3 +++ 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/lib/src/diag.rs b/lib/src/diag.rs index fcdb33b..2a0eeb0 100644 --- a/lib/src/diag.rs +++ b/lib/src/diag.rs @@ -210,6 +210,14 @@ pub enum LogBody { #[deku(count = "hdr_len.saturating_sub(8)")] msg: Vec, }, + #[deku(id = "0xb063")] + LteMacDl { + version: u8, + #[deku(pad_bytes_after = "2")] + num_subpacket: u8, + #[deku(count = "num_subpacket")] + subpackets: Vec, + }, #[deku(id = "0x713a")] UmtsNasOtaMessage { is_uplink: u8, @@ -224,6 +232,15 @@ pub enum LogBody { }, } +#[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)] +pub struct LteMacDlSubpacket { + pub id: u8, + pub version: u8, + pub size: u16, + #[deku(count = "size - 4")] + pub data: Vec, +} + #[derive(Debug, Clone, PartialEq, DekuRead, DekuWrite)] #[deku(ctx = "log_type: u16", id = "log_type")] pub enum Nas4GMessageDirection { diff --git a/lib/src/diag_device.rs b/lib/src/diag_device.rs index 47aa496..bbca03a 100644 --- a/lib/src/diag_device.rs +++ b/lib/src/diag_device.rs @@ -40,22 +40,25 @@ pub enum DiagDeviceError { ParseMessagesContainerError(deku::DekuError), } -pub const LOG_CODES_FOR_RAW_PACKET_LOGGING: [u32; 11] = [ +pub const LOG_CODES_FOR_RAW_PACKET_LOGGING: [u32; 13] = [ // 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, + // MAC + log_codes::LOG_LTE_MAC_DL, + log_codes::LOG_LTE_MAC_UL, // User IP traffic: - log_codes::LOG_DATA_PROTOCOL_LOGGING_C, // 0x11eb + log_codes::LOG_DATA_PROTOCOL_LOGGING_C, ]; const BUFFER_LEN: usize = 1024 * 1024 * 10; diff --git a/lib/src/gsmtap_parser.rs b/lib/src/gsmtap_parser.rs index b258626..4a7ea58 100644 --- a/lib/src/gsmtap_parser.rs +++ b/lib/src/gsmtap_parser.rs @@ -13,16 +13,13 @@ pub enum GsmtapParserError { } pub fn parse(msg: Message) -> Result, GsmtapParserError> { - if let Message::Log { - timestamp, body, .. - } = msg - { - match log_to_gsmtap(body)? { - Some(msg) => Ok(Some((timestamp, msg))), - None => Ok(None), - } - } else { - Ok(None) + let Message::Log { timestamp, body, .. } = msg else { + return Ok(None); + }; + + match log_to_gsmtap(body)? { + Some(msg) => Ok(Some((timestamp, msg))), + None => Ok(None), } } diff --git a/lib/src/log_codes.rs b/lib/src/log_codes.rs index b337e99..f9a47f3 100644 --- a/lib/src/log_codes.rs +++ b/lib/src/log_codes.rs @@ -36,6 +36,9 @@ pub const LOG_LTE_NAS_ESM_OTA_OUT_MSG_LOG_C: u32 = 0xb0e3; pub const LOG_LTE_NAS_EMM_OTA_IN_MSG_LOG_C: u32 = 0xb0ec; pub const LOG_LTE_NAS_EMM_OTA_OUT_MSG_LOG_C: u32 = 0xb0ed; +pub const LOG_LTE_MAC_DL: u32 = 0xb063; +pub const LOG_LTE_MAC_UL: u32 = 0xb064; + pub const LTE_BCCH_BCH_V0: u32 = 1; pub const LTE_BCCH_DL_SCH_V0: u32 = 2; pub const LTE_MCCH_V0: u32 = 3;