diff --git a/lib/src/gsmtap_parser.rs b/lib/src/gsmtap_parser.rs index b258626..d29d2ba 100644 --- a/lib/src/gsmtap_parser.rs +++ b/lib/src/gsmtap_parser.rs @@ -135,7 +135,7 @@ fn log_to_gsmtap(value: LogBody) -> Result, GsmtapParserEr } }; let mut header = GsmtapHeader::new(gsmtap_type); - header.arfcn = packet.get_earfcn().try_into().unwrap_or(0); + header.arfcn = (packet.get_earfcn() as u16) & 0x3FFF; header.frame_number = packet.get_sfn(); header.subslot = packet.get_subfn(); Ok(Some(GsmtapMessage { @@ -158,3 +158,23 @@ fn log_to_gsmtap(value: LogBody) -> Result, GsmtapParserEr } } } + +#[cfg(test)] +mod tests { + use super::*; + use deku::DekuContainerWrite; + + #[test] + fn test_arfcn_exceeding_14_bits_does_not_panic() { + let mut header = GsmtapHeader::new(GsmtapType::LteRrc(LteRrcSubtype::DlDcch)); + // EARFCN 54540 (band 46) exceeds 14-bit max of 16383 + let large_earfcn: u32 = 54540; + header.arfcn = (large_earfcn as u16) & 0x3FFF; + let msg = GsmtapMessage { + header, + payload: vec![0x00], + }; + // This would panic before the fix with "bit size of input is larger than bit requested size" + assert!(msg.to_bytes().is_ok()); + } +}