From 5fd239e0b85eca2bdbffb941fc66cc71a07b5645 Mon Sep 17 00:00:00 2001 From: GyulyVGC Date: Sun, 22 Feb 2026 21:32:55 +0100 Subject: [PATCH] update programs DataInfo as part of TickRun (only once per second --- src/cli/mod.rs | 1 + src/gui/sniffer.rs | 80 +++++++++++++------------- src/gui/types/message.rs | 3 - src/networking/types/program_lookup.rs | 19 +++++- 4 files changed, 58 insertions(+), 45 deletions(-) diff --git a/src/cli/mod.rs b/src/cli/mod.rs index c7b5e3da..d815a8e7 100644 --- a/src/cli/mod.rs +++ b/src/cli/mod.rs @@ -146,6 +146,7 @@ mod tests { report_sort_type: SortType::Ascending, host_sort_type: SortType::Descending, service_sort_type: SortType::Neutral, + program_sort_type: SortType::Neutral, filters: Filters { bpf: "tcp".to_string(), expanded: true, diff --git a/src/gui/sniffer.rs b/src/gui/sniffer.rs index 5e04a11b..5976fb1b 100644 --- a/src/gui/sniffer.rs +++ b/src/gui/sniffer.rs @@ -367,7 +367,6 @@ impl Sniffer { Message::RemoteNotificationsUrl(url) => self.remote_notifications_url(&url), Message::Freeze => self.freeze(), Message::TrafficPreview(msg) => self.traffic_preview(msg), - Message::ProgramLookupResult(lookup_res) => self.program_lookup_result(lookup_res), } Task::none() } @@ -493,6 +492,11 @@ impl Sniffer { for host_msg in host_msgs { self.handle_new_host(host_msg); } + if let Some(program_lookup) = &mut self.program_lookup { + for program_res in program_lookup.pending_results() { + self.handle_program_lookup_result(program_res); + } + } self.refresh_data(msg, no_more_packets); } } @@ -876,36 +880,6 @@ impl Sniffer { .sort_by(|(_, c1), (_, c2)| c2.tot_packets.total_cmp(&c1.tot_packets)); } - fn program_lookup_result(&mut self, lookup_res: (u16, listeners::Protocol, Option)) { - if let Some(program_lookup) = &mut self.program_lookup { - // update programs combobox state including the new program - self.combobox_data_states - .data - .update_program(lookup_res.2.as_ref()); - - // associate unassigned recent connections on port with the program - let mut reassigned_data = DataInfo::default(); - if lookup_res.2.is_some() { - self.info_traffic - .map - .iter_mut() - .filter(|(k, v)| { - v.program.is_unknown() - && v.final_instant.elapsed().as_millis() < VALID_PROGRAM_TIMEOUT - && get_local_port(k, v.traffic_direction) - == Some((lookup_res.0, lookup_res.1)) - }) - .for_each(|(_, v)| { - v.program = Program::from_proc(lookup_res.2.as_ref()); - reassigned_data.refresh(v.data_info()); - }); - } - - // update program lookup state with the new lookup result - program_lookup.update(lookup_res, reassigned_data); - } - } - /// Updates threshold if it hasn't been edited for a while fn update_threshold(&mut self) { // Ignore if just edited @@ -1027,7 +1001,6 @@ impl Sniffer { self.current_capture_rx.1 = Some(rx.clone()); self.freeze_tx = Some(freeze_tx); - let mut program_rx_task = Task::none(); if matches!(self.capture_source, CaptureSource::Device(_)) { let (port_tx, port_rx) = async_channel::unbounded(); let (program_tx, program_rx) = async_channel::unbounded(); @@ -1037,13 +1010,10 @@ impl Sniffer { lookup_program(&port_rx, &program_tx); }) .log_err(location!()); - self.program_lookup = Some(ProgramLookup::new(port_tx)); - program_rx_task = Task::run(program_rx, |lookup_res| { - Message::ProgramLookupResult(lookup_res) - }); + self.program_lookup = Some(ProgramLookup::new(port_tx, program_rx)); } - let backend_task = Task::run(rx, |backend_msg| match backend_msg { + return Task::run(rx, |backend_msg| match backend_msg { BackendTrafficMessage::TickRun(cap_id, msg, host_msg, no_more_packets) => { Message::TickRun(cap_id, msg, host_msg, no_more_packets) } @@ -1054,8 +1024,6 @@ impl Sniffer { Message::OfflineGap(cap_id, gap) } }); - - return Task::batch([backend_task, program_rx_task]); } } Task::none() @@ -1390,6 +1358,39 @@ impl Sniffer { self.combobox_data_states.data.update_host(&host); } + fn handle_program_lookup_result( + &mut self, + lookup_res: (u16, listeners::Protocol, Option), + ) { + if let Some(program_lookup) = &mut self.program_lookup { + // update programs combobox state including the new program + self.combobox_data_states + .data + .update_program(lookup_res.2.as_ref()); + + // associate unassigned recent connections on port with the program + let mut reassigned_data = DataInfo::default(); + if lookup_res.2.is_some() { + self.info_traffic + .map + .iter_mut() + .filter(|(k, v)| { + v.program.is_unknown() + && v.final_instant.elapsed().as_millis() < VALID_PROGRAM_TIMEOUT + && get_local_port(k, v.traffic_direction) + == Some((lookup_res.0, lookup_res.1)) + }) + .for_each(|(_, v)| { + v.program = Program::from_proc(lookup_res.2.as_ref()); + reassigned_data.refresh(v.data_info()); + }); + } + + // update program lookup state with the new lookup result + program_lookup.update(lookup_res, reassigned_data); + } + } + fn register_sigint_handler() -> Task { let (tx, rx) = async_channel::bounded(1); @@ -2294,6 +2295,7 @@ mod tests { report_sort_type: SortType::Ascending, host_sort_type: SortType::Descending, service_sort_type: SortType::Descending, + program_sort_type: SortType::Neutral, last_opened_setting: SettingsPage::Appearance, last_opened_page: RunningPage::Notifications, export_pcap: ExportPcap { diff --git a/src/gui/types/message.rs b/src/gui/types/message.rs index 2fa1937d..ce3efa59 100644 --- a/src/gui/types/message.rs +++ b/src/gui/types/message.rs @@ -15,7 +15,6 @@ use crate::utils::types::file_info::FileInfo; use crate::utils::types::web_page::WebPage; use crate::{Language, StyleType}; use iced::window; -use listeners::Process; use std::net::IpAddr; #[derive(Debug, Clone)] @@ -155,6 +154,4 @@ pub enum Message { Freeze, /// Traffic preview TrafficPreview(TrafficPreview), - /// Program lookup result received from the listeners routine - ProgramLookupResult((u16, listeners::Protocol, Option)), } diff --git a/src/networking/types/program_lookup.rs b/src/networking/types/program_lookup.rs index 00bf3848..7f8de6c3 100644 --- a/src/networking/types/program_lookup.rs +++ b/src/networking/types/program_lookup.rs @@ -10,16 +10,21 @@ const RETRY_TIMEOUT: u128 = 1500; // milliseconds pub const VALID_PROGRAM_TIMEOUT: u128 = 60_000; // milliseconds pub struct ProgramLookup { - state: HashMap<(u16, Protocol), LookedUpProgram>, port_tx: Sender<(u16, Protocol)>, + program_rx: Receiver<(u16, Protocol, Option)>, + state: HashMap<(u16, Protocol), LookedUpProgram>, programs: HashMap, } impl ProgramLookup { - pub fn new(port_tx: Sender<(u16, Protocol)>) -> Self { + pub fn new( + port_tx: Sender<(u16, Protocol)>, + program_rx: Receiver<(u16, Protocol, Option)>, + ) -> Self { Self { - state: HashMap::new(), port_tx, + program_rx, + state: HashMap::new(), programs: HashMap::new(), } } @@ -75,6 +80,14 @@ impl ProgramLookup { res } + pub fn pending_results(&mut self) -> Vec<(u16, Protocol, Option)> { + let mut res = Vec::new(); + while let Ok(lookup_res) = self.program_rx.try_recv() { + res.push(lookup_res); + } + res + } + fn lookup(&mut self, key: (u16, Protocol), is_new_connection: bool) -> Option { if let Some(looked_up_program) = self.state.get_mut(&key) { let program = &looked_up_program.program;