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;
     }
 }
Example #3
0
        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);
        }
Example #4
0
 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);