Files
StreamLens/analyzer/models/flow_stats.py

44 lines
1.8 KiB
Python

"""
Data structures for flow and frame type statistics
"""
from dataclasses import dataclass, field
from typing import Dict, List, Set, Tuple
@dataclass
class FrameTypeStats:
"""Statistics for a specific frame type within a flow"""
frame_type: str
count: int = 0
total_bytes: int = 0
timestamps: List[float] = field(default_factory=list)
frame_numbers: List[int] = field(default_factory=list)
inter_arrival_times: List[float] = field(default_factory=list)
avg_inter_arrival: float = 0.0
std_inter_arrival: float = 0.0
outlier_frames: List[int] = field(default_factory=list)
outlier_details: List[Tuple[int, float]] = field(default_factory=list)
@dataclass
class FlowStats:
"""Statistics for a source-destination IP pair"""
src_ip: str
dst_ip: str
src_port: int = 0 # Source port (0 if not applicable/unknown)
dst_port: int = 0 # Destination port (0 if not applicable/unknown)
transport_protocol: str = "Unknown" # TCP, UDP, ICMP, IGMP, etc.
traffic_classification: str = "Unknown" # Unicast, Multicast, Broadcast
frame_count: int = 0
timestamps: List[float] = field(default_factory=list)
frame_numbers: List[int] = field(default_factory=list)
inter_arrival_times: List[float] = field(default_factory=list)
avg_inter_arrival: float = 0.0
std_inter_arrival: float = 0.0
outlier_frames: List[int] = field(default_factory=list)
outlier_details: List[Tuple[int, float]] = field(default_factory=list) # (frame_number, time_delta)
total_bytes: int = 0
protocols: Set[str] = field(default_factory=set)
detected_protocol_types: Set[str] = field(default_factory=set) # Enhanced protocol detection (CH10, PTP, IENA, etc)
frame_types: Dict[str, FrameTypeStats] = field(default_factory=dict) # Per-frame-type statistics