Remove unpack! macro

This commit is contained in:
Markus Unterwaditzer
2025-08-08 03:05:09 +02:00
parent 5249714717
commit 85b50bc301
3 changed files with 28 additions and 62 deletions
@@ -2,7 +2,6 @@ use std::borrow::Cow;
use super::analyzer::{Analyzer, Event, EventType, Severity}; use super::analyzer::{Analyzer, Event, EventType, Severity};
use super::information_element::{InformationElement, LteInformationElement}; use super::information_element::{InformationElement, LteInformationElement};
use super::util::unpack;
use telcom_parser::lte_rrc::{ use telcom_parser::lte_rrc::{
DL_DCCH_MessageType, DL_DCCH_MessageType_c1, RRCConnectionReleaseCriticalExtensions, DL_DCCH_MessageType, DL_DCCH_MessageType_c1, RRCConnectionReleaseCriticalExtensions,
RRCConnectionReleaseCriticalExtensions_c1, RedirectedCarrierInfo, RRCConnectionReleaseCriticalExtensions_c1, RedirectedCarrierInfo,
@@ -27,27 +26,28 @@ impl Analyzer for ConnectionRedirect2GDowngradeAnalyzer {
} }
fn analyze_information_element(&mut self, ie: &InformationElement) -> Option<Event> { fn analyze_information_element(&mut self, ie: &InformationElement) -> Option<Event> {
unpack!(InformationElement::LTE(lte_ie) = ie); if let InformationElement::LTE(lte_ie) = ie
let message = match &**lte_ie { && let LteInformationElement::DlDcch(msg_cont) = &**lte_ie
LteInformationElement::DlDcch(msg_cont) => &msg_cont.message, && let DL_DCCH_MessageType::C1(c1) = &msg_cont.message
_ => return None, && let DL_DCCH_MessageType_c1::RrcConnectionRelease(release) = c1
}; && let RRCConnectionReleaseCriticalExtensions::C1(c1) = &release.critical_extensions
unpack!(DL_DCCH_MessageType::C1(c1) = message); && let RRCConnectionReleaseCriticalExtensions_c1::RrcConnectionRelease_r8(r8_ies) = c1
unpack!(DL_DCCH_MessageType_c1::RrcConnectionRelease(release) = c1); && let Some(carrier_info) = &r8_ies.redirected_carrier_info
unpack!(RRCConnectionReleaseCriticalExtensions::C1(c1) = &release.critical_extensions); {
unpack!(RRCConnectionReleaseCriticalExtensions_c1::RrcConnectionRelease_r8(r8_ies) = c1); match carrier_info {
unpack!(Some(carrier_info) = &r8_ies.redirected_carrier_info); RedirectedCarrierInfo::Geran(_carrier_freqs_geran) => Some(Event {
match carrier_info { event_type: EventType::QualitativeWarning {
RedirectedCarrierInfo::Geran(_carrier_freqs_geran) => Some(Event { severity: Severity::High,
event_type: EventType::QualitativeWarning { },
severity: Severity::High, message: "Detected 2G downgrade".to_owned(),
}, }),
message: "Detected 2G downgrade".to_owned(), _ => Some(Event {
}), event_type: EventType::Informational,
_ => Some(Event { message: format!("RRCConnectionRelease CarrierInfo: {carrier_info:?}"),
event_type: EventType::Informational, }),
message: format!("RRCConnectionRelease CarrierInfo: {carrier_info:?}"), }
}), } else {
None
} }
} }
} }
+6 -8
View File
@@ -2,8 +2,6 @@ use std::borrow::Cow;
use telcom_parser::lte_rrc::{BCCH_DL_SCH_MessageType, BCCH_DL_SCH_MessageType_c1}; use telcom_parser::lte_rrc::{BCCH_DL_SCH_MessageType, BCCH_DL_SCH_MessageType_c1};
use crate::analysis::util::unpack;
use super::analyzer::{Analyzer, Event, EventType, Severity}; use super::analyzer::{Analyzer, Event, EventType, Severity};
use super::information_element::{InformationElement, LteInformationElement}; use super::information_element::{InformationElement, LteInformationElement};
@@ -39,12 +37,12 @@ impl Analyzer for IncompleteSibAnalyzer {
fn analyze_information_element(&mut self, ie: &InformationElement) -> Option<Event> { fn analyze_information_element(&mut self, ie: &InformationElement) -> Option<Event> {
self.packet_num += 1; self.packet_num += 1;
unpack!(InformationElement::LTE(lte_ie) = ie); if let InformationElement::LTE(lte_ie) = ie
unpack!(LteInformationElement::BcchDlSch(sch_msg) = &**lte_ie); && let LteInformationElement::BcchDlSch(sch_msg) = &**lte_ie
unpack!(BCCH_DL_SCH_MessageType::C1(c1) = &sch_msg.message); && let BCCH_DL_SCH_MessageType::C1(c1) = &sch_msg.message
unpack!(BCCH_DL_SCH_MessageType_c1::SystemInformationBlockType1(sib1) = c1); && let BCCH_DL_SCH_MessageType_c1::SystemInformationBlockType1(sib1) = c1
&& sib1.scheduling_info_list.0.len() < 2
if sib1.scheduling_info_list.0.len() < 2 { {
return Some(Event { return Some(Event {
event_type: EventType::QualitativeWarning { event_type: EventType::QualitativeWarning {
severity: Severity::Medium, severity: Severity::Medium,
-32
View File
@@ -1,33 +1 @@
// Unpacks a pattern, or returns None.
//
// # Examples
// You can use `unpack!` to unroll highly nested enums like this:
// ```
// enum Foo {
// A(Bar),
// B,
// }
//
// enum Bar {
// C(Baz)
// }
//
// struct Baz;
//
// fn get_bang(foo: Foo) -> Option<Baz> {
// unpack!(Foo::A(bar) = foo);
// unpack!(Bar::C(baz) = bar);
// baz
// }
// ```
//
macro_rules! unpack {
($pat:pat = $val:expr) => {
let $pat = $val else {
return None;
};
};
}
// this is apparently how you make a macro publicly usable from this module
pub(crate) use unpack;