diff --git a/src/bin/wavehunter.rs b/src/bin/wavehunter.rs index c0e8b66..ed923a8 100644 --- a/src/bin/wavehunter.rs +++ b/src/bin/wavehunter.rs @@ -1,21 +1,28 @@ use wavehunter::diag_device::{DiagDevice, DiagResult}; use wavehunter::diag_reader::DiagReader; +use wavehunter::gsmtap_parser::GsmtapParser; +use wavehunter::pcap::PcapFile; + +use log::debug; fn main() -> DiagResult<()> { - // this should eventually be removed for prod env_logger::init(); - let file = std::fs::File::options() - .read(true) - .write(true) - .open("/dev/diag")?; - let mut dev = DiagDevice::new(&file)?; + let mut dev = DiagDevice::new()?; dev.enable_debug_mode("/data/wavehunter-debug")?; dev.config_logs()?; + let mut gsmtap_parser = GsmtapParser::new(); + let mut pcap_file = PcapFile::new("/data/wavehunter.pcap").unwrap(); + pcap_file.write_iface_header().unwrap(); + loop { for msg in dev.read_response()? { - println!("msg: {:?}", msg); + debug!("msg: {:?}", msg); + if let Some((timestamp, gsmtap_msg)) = gsmtap_parser.recv_message(msg).unwrap() { + debug!("gsmtap_msg: {:?}", gsmtap_msg); + pcap_file.write_gsmtap_message(gsmtap_msg, timestamp).unwrap(); + } } } } diff --git a/src/bin/wavehunter_reader.rs b/src/bin/wavehunter_reader.rs index cbb99c1..3be7350 100644 --- a/src/bin/wavehunter_reader.rs +++ b/src/bin/wavehunter_reader.rs @@ -1,20 +1,32 @@ use wavehunter::debug_file::DebugFileReader; use wavehunter::diag_reader::DiagReader; use wavehunter::diag_device::DiagResult; +use wavehunter::gsmtap_parser::GsmtapParser; +use wavehunter::pcap::PcapFile; + +use log::{debug, error}; fn main() -> DiagResult<()> { - // this should eventually be removed for prod env_logger::init(); + let args: Vec = std::env::args().collect(); if args.len() != 2 { - println!("Usage: {} /path/to/debug/file", args[0]); + error!("Usage: {} /path/to/debug/file", args[0]); std::process::exit(1); } let mut debug_reader = DebugFileReader::new(&args[1])?; + let mut gsmtap_parser = GsmtapParser::new(); + let mut pcap_file = PcapFile::new("./wavehunter.pcap").unwrap(); + pcap_file.write_iface_header().unwrap(); + loop { for msg in debug_reader.read_response()? { - println!("msg: {:?}", msg); + debug!("msg: {:?}", msg); + if let Some((timestamp, gsmtap_msg)) = gsmtap_parser.recv_message(msg).unwrap() { + debug!("gsmtap_msg: {:?}", gsmtap_msg); + pcap_file.write_gsmtap_message(gsmtap_msg, timestamp).unwrap(); + } } } } diff --git a/src/diag_device.rs b/src/diag_device.rs index 27a31cf..ad861ce 100644 --- a/src/diag_device.rs +++ b/src/diag_device.rs @@ -57,25 +57,23 @@ const MEMORY_DEVICE_MODE: i32 = 2; const DIAG_IOCTL_REMOTE_DEV: u32 = 32; const DIAG_IOCTL_SWITCH_LOGGING: u32 = 7; -pub struct DiagDevice<'a> { - file: &'a File, +pub struct DiagDevice { + file: File, debug_file: Option, read_buf: Vec, use_mdm: i32, } - - -impl<'a> DiagReader for DiagDevice<'a> { +impl DiagReader for DiagDevice { fn get_next_messages_container(&mut self) -> DiagResult { - let bytes_read = self.file.read(&mut self.read_buf).unwrap(); + let bytes_read = self.file.read(&mut self.read_buf)?; if let Some(debug_file) = self.debug_file.as_mut() { let debug_block = DebugFileBlock { size: bytes_read as u32, data: &self.read_buf[0..bytes_read], }; - let debug_block_bytes = debug_block.to_bytes().unwrap(); - debug_file.write_all(&debug_block_bytes).unwrap(); + let debug_block_bytes = debug_block.to_bytes()?; + debug_file.write_all(&debug_block_bytes)?; } let ((leftover_bytes, _), container) = MessagesContainer::from_bytes((&self.read_buf[0..bytes_read], 0))?; if leftover_bytes.len() > 0 { @@ -85,8 +83,12 @@ impl<'a> DiagReader for DiagDevice<'a> { } } -impl<'a> DiagDevice<'a> { - pub fn new(file: &'a File) -> DiagResult { +impl DiagDevice { + pub fn new() -> DiagResult { + let file = std::fs::File::options() + .read(true) + .write(true) + .open("/dev/diag")?; let fd = file.as_raw_fd(); enable_frame_readwrite(fd, MEMORY_DEVICE_MODE)?; @@ -117,8 +119,8 @@ impl<'a> DiagDevice<'a> { data_type: DataType::UserSpace, use_mdm: self.use_mdm > 0, mdm_field: -1, - hdlc_encapsulated_request: hdlc_encapsulate(&req.to_bytes().unwrap(), &CRC_CCITT), - }.to_bytes().unwrap(); + hdlc_encapsulated_request: hdlc_encapsulate(&req.to_bytes()?, &CRC_CCITT), + }.to_bytes()?; unsafe { let fd = self.file.as_raw_fd(); let buf_ptr = buf.as_ptr() as *const libc::c_void;