public static ConversationRecord <TData> Combine(Func <TData, TData, TData> combineData, ConversationRecord <TData> left, ConversationRecord <TData> right) { return(new ConversationRecord <TData> { Key = left.Key, OriginalFlowsPresent = left.OriginalFlowsPresent + right.OriginalFlowsPresent, ForwardMetrics = FlowMetrics.Aggregate(ref left.ForwardMetrics, ref right.ForwardMetrics), ReverseMetrics = FlowMetrics.Aggregate(ref left.ReverseMetrics, ref right.ReverseMetrics), Data = combineData(left.Data, right.Data) }); }
private void AdjustMetrics(ref FlowMetrics metrics, DateTime timestamp) { if (metrics.Start == DateTime.MinValue) { metrics.Start = timestamp; } if (metrics.End == DateTime.MinValue) { metrics.End = timestamp; } }
public static FlowMetrics Aggregate(ref FlowMetrics x, ref FlowMetrics y) { var newMetrics = new FlowMetrics { Start = DateTimeMin(x.Start, y.Start), End = DateTimeMax(x.End, y.End), Packets = x.Packets + y.Packets, Octets = x.Octets + y.Octets }; return(newMetrics); }
public static void Update(ref FlowMetrics forwardMetrics, int octets, long ticks) { forwardMetrics.Packets++; forwardMetrics.Octets += octets; if (forwardMetrics.Start == null || ticks < forwardMetrics.Start?.Ticks) { forwardMetrics.Start = new DateTime(ticks); } if (forwardMetrics.End == null || ticks > forwardMetrics.End?.Ticks) { forwardMetrics.End = new DateTime(ticks); } }
private static void AddPacket(List <MetaPacket> packets, ref FlowMetrics metrics, ref FrameMetadata meta, Packet packet) { metrics.Octets += meta.OriginalLength; metrics.Packets++; var packetTimestamp = new DateTime(meta.Ticks); if (metrics.Start == nullDate || packetTimestamp < metrics.Start) { metrics.Start = packetTimestamp; } if (metrics.End == nullDate || packetTimestamp > metrics.End) { metrics.End = packetTimestamp; } packets.Add(new MetaPacket(ref meta, packet)); }
public ConversationRecord <TData> Invoke(FlowKey flowKey, IEnumerable <Memory <byte> > frames) { var fwdPackets = new List <MetaPacket>(); var revPackets = new List <MetaPacket>(); var forwardKeyHash = flowKey.GetHashCode64(); var meta = new FrameMetadata(); FlowMetrics fwdMetrics = new FlowMetrics(); FlowMetrics revMetrics = new FlowMetrics(); DateTime? firstTimestamp = null; foreach (var frame in frames) { var buffer = FrameMetadata.FromBytes(frame.Span, ref meta); if (firstTimestamp == null) { firstTimestamp = new DateTime(meta.Ticks); } var packet = Packet.ParsePacket((LinkLayers)meta.LinkLayer, buffer.ToArray()); if (meta.FlowKeyHash == forwardKeyHash) { AddPacket(fwdPackets, ref fwdMetrics, ref meta, packet); } else { AddPacket(revPackets, ref revMetrics, ref meta, packet); } } if (firstTimestamp != null) { // adjust metrics: AdjustMetrics(ref fwdMetrics, firstTimestamp.Value); AdjustMetrics(ref revMetrics, firstTimestamp.Value); } return(new ConversationRecord <TData>() { Key = flowKey, ForwardMetrics = fwdMetrics, ReverseMetrics = revMetrics, Data = Invoke(ref flowKey, ref fwdMetrics, ref revMetrics, fwdPackets, revPackets) }); }
protected override TData Invoke(ref FlowKey flowKey, ref FlowMetrics fwdMetrics, ref FlowMetrics revMetrics, IReadOnlyCollection <MetaPacket> fwdPackets, IReadOnlyCollection <MetaPacket> revPackets) { return(_function.Invoke(ref flowKey, ref fwdMetrics, ref revMetrics, fwdPackets, revPackets)); }
protected abstract TData Invoke(ref FlowKey flowKey, ref FlowMetrics fwdMetrics, ref FlowMetrics revMetrics, IReadOnlyCollection <MetaPacket> fwdPackets, IReadOnlyCollection <MetaPacket> revPackets);