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