#!/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()