Files
StreamLens/debug_frame_references.py

124 lines
5.4 KiB
Python
Raw Permalink Normal View History

2025-07-30 23:48:32 -04:00
#!/usr/bin/env python3
"""Debug frame reference tracking for subflows"""
import sys
sys.path.append('.')
from analyzer.analysis import EthernetAnalyzer
from analyzer.utils import PCAPLoader
def debug_frame_references(pcap_file="1 PTPGM.pcapng", src_ip="192.168.4.89"):
"""Debug frame reference tracking in subflows"""
print("=== Debugging Frame References in Subflows ===")
# Initialize analyzer
analyzer = EthernetAnalyzer(enable_realtime=False, outlier_threshold_sigma=3.0)
# Load and process packets
loader = PCAPLoader(pcap_file)
packets = loader.load_all()
print(f"Loaded {len(packets)} packets")
# Process packets
for i, packet in enumerate(packets, 1):
analyzer._process_single_packet(packet, i)
# Calculate statistics
analyzer.calculate_statistics()
# Find the 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}")
return
print(f"\n✅ Found flow: {test_flow.src_ip}:{test_flow.src_port}{test_flow.dst_ip}:{test_flow.dst_port}")
# Focus on CH10-Data subflow
ch10_data_stats = test_flow.frame_types.get('CH10-Data')
if not ch10_data_stats:
print("❌ No CH10-Data frame type found")
return
print(f"\n=== CH10-Data Subflow Analysis ===")
print(f"Total CH10-Data frames: {ch10_data_stats.count}")
print(f"Frame numbers tracked: {len(ch10_data_stats.frame_numbers)}")
print(f"Inter-arrival times: {len(ch10_data_stats.inter_arrival_times)}")
# Show first 10 and last 10 frame numbers to verify sequence
print(f"\nFirst 10 CH10-Data frame numbers: {ch10_data_stats.frame_numbers[:10]}")
print(f"Last 10 CH10-Data frame numbers: {ch10_data_stats.frame_numbers[-10:]}")
# Check for frame 1001 specifically
target_frame = 1001
if target_frame in ch10_data_stats.frame_numbers:
frame_index = ch10_data_stats.frame_numbers.index(target_frame)
print(f"\n🎯 Frame {target_frame} analysis:")
print(f" Index in CH10-Data sequence: {frame_index}")
print(f" Total CH10-Data frames before this: {frame_index}")
if frame_index > 0:
prev_frame_in_subflow = ch10_data_stats.frame_numbers[frame_index - 1]
print(f" Previous CH10-Data frame: {prev_frame_in_subflow}")
else:
print(f" This is the first CH10-Data frame")
# Check if this frame is in outliers
if hasattr(ch10_data_stats, 'enhanced_outlier_details'):
for frame_num, prev_frame_num, delta_t in ch10_data_stats.enhanced_outlier_details:
if frame_num == target_frame:
print(f" ⚠️ OUTLIER: Frame {frame_num} (from {prev_frame_num}): {delta_t * 1000:.3f} ms")
# Verify this matches our expectation
if frame_index > 0:
expected_prev = ch10_data_stats.frame_numbers[frame_index - 1]
if prev_frame_num == expected_prev:
print(f" ✅ Frame reference is CORRECT: {prev_frame_num}")
else:
print(f" ❌ Frame reference is WRONG: got {prev_frame_num}, expected {expected_prev}")
break
else:
print(f" Frame {target_frame} is not an outlier")
else:
print(f"\n❌ Frame {target_frame} not found in CH10-Data subflow")
# Show some outlier details for verification
if hasattr(ch10_data_stats, 'enhanced_outlier_details') and ch10_data_stats.enhanced_outlier_details:
print(f"\n=== Enhanced Outlier Details Verification ===")
for frame_num, prev_frame_num, delta_t in ch10_data_stats.enhanced_outlier_details[:5]:
# Find the index of this frame in the subflow
if frame_num in ch10_data_stats.frame_numbers:
frame_index = ch10_data_stats.frame_numbers.index(frame_num)
if frame_index > 0:
expected_prev = ch10_data_stats.frame_numbers[frame_index - 1]
status = "✅ CORRECT" if prev_frame_num == expected_prev else f"❌ WRONG (expected {expected_prev})"
print(f"Frame {frame_num} (from {prev_frame_num}): {status}")
else:
print(f"Frame {frame_num} (from {prev_frame_num}): ⚠️ First frame in subflow")
# Show the calculation logic for inter-arrival times
print(f"\n=== Inter-arrival Time Calculation Verification ===")
print("First 5 inter-arrival calculations:")
for i in range(min(5, len(ch10_data_stats.inter_arrival_times))):
if i + 1 < len(ch10_data_stats.timestamps):
delta_t = ch10_data_stats.inter_arrival_times[i]
curr_frame = ch10_data_stats.frame_numbers[i + 1]
prev_frame = ch10_data_stats.frame_numbers[i]
curr_ts = ch10_data_stats.timestamps[i + 1]
prev_ts = ch10_data_stats.timestamps[i]
calculated_delta = curr_ts - prev_ts
print(f" [{i}] Frame {curr_frame} - Frame {prev_frame}: {delta_t:.6f}s (calc: {calculated_delta:.6f}s)")
if __name__ == "__main__":
if len(sys.argv) > 1:
debug_frame_references(sys.argv[1])
else:
debug_frame_references()