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) }); }
public ConversationKey(FlowKey flowKey) { FlowKey = flowKey; HashCode64 = flowKey.GetHashCode64(); }