From 13cc2612a2b62a475cb7802ab38aa67dfb687f6f Mon Sep 17 00:00:00 2001 From: malmert Date: Sat, 7 Mar 2026 17:04:17 +0100 Subject: [PATCH] stop sniffer --- backend/src/network_sniffer.py | 7 +++++++ backend/src/utilities/packet_tracker.py | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/backend/src/network_sniffer.py b/backend/src/network_sniffer.py index 545bfdd..c110347 100644 --- a/backend/src/network_sniffer.py +++ b/backend/src/network_sniffer.py @@ -690,11 +690,18 @@ def stop_afpacket_sniffer(session_id: Optional[str] = None, target: Optional[str if not s: logger.warning("Requested stop for unknown session %s", session_id) return + discarded_ifaces = list({*s.get("ports", []), *s.get("sockets", {}).keys()}) s["stop_event"].set() t = s.get("thread") if t and isinstance(t, threading.Thread): t.join(timeout=settings.sniffer_thread_join_timeout_seconds) _sync_bridge_telemetry() + try: + discarded = packet_tracker.discard_entries_for_ifaces(discarded_ifaces) + if discarded: + logger.info("Discarded %s pending packet-tracker entries for stopped session %s", discarded, session_id) + except Exception: + logger.exception("Failed to discard packet-tracker entries for session %s", session_id) logger.info("Stopped session %s", session_id) return diff --git a/backend/src/utilities/packet_tracker.py b/backend/src/utilities/packet_tracker.py index f205d38..791516f 100644 --- a/backend/src/utilities/packet_tracker.py +++ b/backend/src/utilities/packet_tracker.py @@ -55,6 +55,30 @@ class PacketTracker: self._stop_event.set() self._thread.join(timeout=settings.packet_tracker_stop_join_timeout_seconds) + def discard_entries_for_ifaces(self, ifaces: List[str]) -> int: + """Drop in-memory entries that belong to interfaces no longer being sniffed.""" + targets = {iface for iface in ifaces if iface} + if not targets: + return 0 + + removed = 0 + with self._lock: + for correlation_key in list(self._entries.keys()): + payload = self._entries[correlation_key]["payload"] + related_ifaces = { + payload.get("ingress_if"), + payload.get("egress_if"), + payload.get("capture_iface"), + } + telemetry_metadata = payload.get("telemetry_metadata") or {} + if isinstance(telemetry_metadata, dict): + related_ifaces.add(telemetry_metadata.get("iface")) + + if related_ifaces & targets: + self._entries.pop(correlation_key, None) + removed += 1 + return removed + def observe_packet(self, pkt_info: Dict[str, Any]) -> str: """Merge parsed packet information into a pending packet entry.""" now_ts = time.time()