Files
StreamLens/debug_frame_298_reference.py

132 lines
5.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
"""Debug any outlier with previous frame 298"""
import sys
sys.path.append('.')
from analyzer.analysis import EthernetAnalyzer
from analyzer.analysis.background_analyzer import BackgroundAnalyzer
import time
def debug_frame_298_reference(pcap_file="1 PTPGM.pcapng", src_ip="192.168.4.89"):
"""Debug any outlier that has previous frame 298"""
print("=== Debugging Outliers with Previous Frame 298 ===")
# Test background analyzer (what TUI uses)
analyzer = EthernetAnalyzer(enable_realtime=False, outlier_threshold_sigma=3.0)
bg_analyzer = BackgroundAnalyzer(analyzer, num_threads=1)
bg_analyzer.start_parsing(pcap_file)
while bg_analyzer.is_parsing:
time.sleep(0.1)
# Find test flow
test_flow = None
for flow_key, flow in analyzer.flows.items():
if flow.src_ip == src_ip:
test_flow = flow
break
if not test_flow:
print(f"❌ No flow found from {src_ip}")
bg_analyzer.cleanup()
return
print(f"✅ Found flow: {test_flow.src_ip}:{test_flow.src_port}{test_flow.dst_ip}:{test_flow.dst_port}")
# Search for any outliers with previous frame around 298
target_prev_frame = 298
found_suspicious = False
print(f"\n=== Searching for outliers with prev_frame_num around {target_prev_frame} ===")
for frame_type, ft_stats in test_flow.frame_types.items():
if hasattr(ft_stats, 'enhanced_outlier_details') and ft_stats.enhanced_outlier_details:
for frame_num, prev_frame_num, delta_t in ft_stats.enhanced_outlier_details:
# Check for exact match or close matches
if abs(prev_frame_num - target_prev_frame) <= 5:
print(f"🔍 FOUND: {frame_type} - Frame {frame_num} (from {prev_frame_num}): {delta_t * 1000:.3f} ms")
# Verify this is wrong by checking the actual sequence
if frame_num in ft_stats.frame_numbers:
frame_index = ft_stats.frame_numbers.index(frame_num)
if frame_index > 0:
expected_prev = ft_stats.frame_numbers[frame_index - 1]
if prev_frame_num != expected_prev:
print(f" ❌ WRONG REFERENCE: Expected {expected_prev}, got {prev_frame_num}")
print(f" Frame sequence: {ft_stats.frame_numbers[max(0, frame_index-2):frame_index+3]}")
else:
print(f" ✅ Reference is actually correct")
found_suspicious = True
if not found_suspicious:
print(f"No outliers found with prev_frame_num around {target_prev_frame}")
# Also search for frame 2002 specifically in any outlier
print(f"\n=== Searching for frame 2002 in any outlier ===")
target_frame = 2002
found_2002 = False
for frame_type, ft_stats in test_flow.frame_types.items():
if hasattr(ft_stats, 'enhanced_outlier_details') and ft_stats.enhanced_outlier_details:
for frame_num, prev_frame_num, delta_t in ft_stats.enhanced_outlier_details:
if frame_num == target_frame:
print(f"🔍 FOUND 2002: {frame_type} - Frame {frame_num} (from {prev_frame_num}): {delta_t * 1000:.3f} ms")
# Check if this is the problematic reference
if prev_frame_num == target_prev_frame:
print(f" ⚠️ This is the problematic outlier you mentioned!")
found_2002 = True
if not found_2002:
print(f"Frame 2002 not found in any outlier")
# Show all outliers for this flow to get the complete picture
print(f"\n=== All Enhanced Outliers for this Flow ===")
total_outliers = 0
for frame_type, ft_stats in test_flow.frame_types.items():
if hasattr(ft_stats, 'enhanced_outlier_details') and ft_stats.enhanced_outlier_details:
print(f"\n{frame_type} ({len(ft_stats.enhanced_outlier_details)} outliers):")
for frame_num, prev_frame_num, delta_t in ft_stats.enhanced_outlier_details:
deviation = (delta_t - ft_stats.avg_inter_arrival) / ft_stats.std_inter_arrival if ft_stats.std_inter_arrival > 0 else 0
print(f" Frame {frame_num} (from {prev_frame_num}): {delta_t * 1000:.3f} ms ({deviation:.1f}σ)")
total_outliers += 1
print(f"\nTotal enhanced outliers: {total_outliers}")
# Check real-time mode as well
print(f"\n=== Testing Real-time Mode ===")
analyzer_rt = EthernetAnalyzer(enable_realtime=True, outlier_threshold_sigma=3.0)
from analyzer.utils import PCAPLoader
loader = PCAPLoader(pcap_file)
packets = loader.load_all()
for i, packet in enumerate(packets, 1):
analyzer_rt._process_single_packet(packet, i)
# Find flow in real-time mode
test_flow_rt = None
for flow_key, flow in analyzer_rt.flows.items():
if flow.src_ip == src_ip:
test_flow_rt = flow
break
if test_flow_rt:
print(f"Real-time mode outliers:")
for frame_type, ft_stats in test_flow_rt.frame_types.items():
if hasattr(ft_stats, 'enhanced_outlier_details') and ft_stats.enhanced_outlier_details:
for frame_num, prev_frame_num, delta_t in ft_stats.enhanced_outlier_details:
if frame_num == 2002 or prev_frame_num == 298:
print(f" {frame_type}: Frame {frame_num} (from {prev_frame_num}): {delta_t * 1000:.3f} ms")
bg_analyzer.cleanup()
if __name__ == "__main__":
if len(sys.argv) > 1:
debug_frame_298_reference(sys.argv[1])
else:
debug_frame_298_reference()