diff --git a/lib/src/analysis/connection_redirect_downgrade.rs b/lib/src/analysis/connection_redirect_downgrade.rs index d56228b..872b0bd 100644 --- a/lib/src/analysis/connection_redirect_downgrade.rs +++ b/lib/src/analysis/connection_redirect_downgrade.rs @@ -2,7 +2,6 @@ use std::borrow::Cow; use super::analyzer::{Analyzer, Event, EventType, Severity}; use super::information_element::{InformationElement, LteInformationElement}; -use super::util::unpack; use telcom_parser::lte_rrc::{ DL_DCCH_MessageType, DL_DCCH_MessageType_c1, RRCConnectionReleaseCriticalExtensions, RRCConnectionReleaseCriticalExtensions_c1, RedirectedCarrierInfo, @@ -27,27 +26,28 @@ impl Analyzer for ConnectionRedirect2GDowngradeAnalyzer { } fn analyze_information_element(&mut self, ie: &InformationElement) -> Option { - unpack!(InformationElement::LTE(lte_ie) = ie); - let message = match &**lte_ie { - LteInformationElement::DlDcch(msg_cont) => &msg_cont.message, - _ => return None, - }; - unpack!(DL_DCCH_MessageType::C1(c1) = message); - unpack!(DL_DCCH_MessageType_c1::RrcConnectionRelease(release) = c1); - unpack!(RRCConnectionReleaseCriticalExtensions::C1(c1) = &release.critical_extensions); - unpack!(RRCConnectionReleaseCriticalExtensions_c1::RrcConnectionRelease_r8(r8_ies) = c1); - unpack!(Some(carrier_info) = &r8_ies.redirected_carrier_info); - match carrier_info { - RedirectedCarrierInfo::Geran(_carrier_freqs_geran) => Some(Event { - event_type: EventType::QualitativeWarning { - severity: Severity::High, - }, - message: "Detected 2G downgrade".to_owned(), - }), - _ => Some(Event { - event_type: EventType::Informational, - message: format!("RRCConnectionRelease CarrierInfo: {carrier_info:?}"), - }), + if let InformationElement::LTE(lte_ie) = ie + && let LteInformationElement::DlDcch(msg_cont) = &**lte_ie + && let DL_DCCH_MessageType::C1(c1) = &msg_cont.message + && let DL_DCCH_MessageType_c1::RrcConnectionRelease(release) = c1 + && let RRCConnectionReleaseCriticalExtensions::C1(c1) = &release.critical_extensions + && let RRCConnectionReleaseCriticalExtensions_c1::RrcConnectionRelease_r8(r8_ies) = c1 + && let Some(carrier_info) = &r8_ies.redirected_carrier_info + { + match carrier_info { + RedirectedCarrierInfo::Geran(_carrier_freqs_geran) => Some(Event { + event_type: EventType::QualitativeWarning { + severity: Severity::High, + }, + message: "Detected 2G downgrade".to_owned(), + }), + _ => Some(Event { + event_type: EventType::Informational, + message: format!("RRCConnectionRelease CarrierInfo: {carrier_info:?}"), + }), + } + } else { + None } } } diff --git a/lib/src/analysis/incomplete_sib.rs b/lib/src/analysis/incomplete_sib.rs index 3ef8763..e1abb7a 100644 --- a/lib/src/analysis/incomplete_sib.rs +++ b/lib/src/analysis/incomplete_sib.rs @@ -2,8 +2,6 @@ use std::borrow::Cow; 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::information_element::{InformationElement, LteInformationElement}; @@ -39,12 +37,12 @@ impl Analyzer for IncompleteSibAnalyzer { fn analyze_information_element(&mut self, ie: &InformationElement) -> Option { self.packet_num += 1; - unpack!(InformationElement::LTE(lte_ie) = ie); - unpack!(LteInformationElement::BcchDlSch(sch_msg) = &**lte_ie); - unpack!(BCCH_DL_SCH_MessageType::C1(c1) = &sch_msg.message); - unpack!(BCCH_DL_SCH_MessageType_c1::SystemInformationBlockType1(sib1) = c1); - - if sib1.scheduling_info_list.0.len() < 2 { + if let InformationElement::LTE(lte_ie) = ie + && let LteInformationElement::BcchDlSch(sch_msg) = &**lte_ie + && let BCCH_DL_SCH_MessageType::C1(c1) = &sch_msg.message + && let BCCH_DL_SCH_MessageType_c1::SystemInformationBlockType1(sib1) = c1 + && sib1.scheduling_info_list.0.len() < 2 + { return Some(Event { event_type: EventType::QualitativeWarning { severity: Severity::Medium, diff --git a/lib/src/analysis/util.rs b/lib/src/analysis/util.rs index ac128e4..8b13789 100644 --- a/lib/src/analysis/util.rs +++ b/lib/src/analysis/util.rs @@ -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 { -// 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;