Filter out retransmissions when reconstructing TCP flows. Now able to detect all...
[pingpong.git] / Code / Projects / SmartPlugDetector / src / main / java / edu / uci / iotproject / FlowPatternFinder.java
index c8f8fe27f5e72e122a97298979ff95c15fca3ef1..8c7d41eab1cd5b7422e4a3eebfce9119619e215c 100644 (file)
@@ -69,7 +69,13 @@ public class FlowPatternFinder {
                 listWrappedPacket.add(packet);
                 // Create new conversation entry, or append packet to existing.
                 connections.merge(conversation, listWrappedPacket, (v1, v2) -> {
-                    v1.addAll(v2);
+                    // TODO: in theory, this is insufficient to detect retransmissions due to TCP seq.no. rollover.
+                    // TODO: bad for performance, O(n) for each packet added to flow (n being length of the flow).
+                    boolean retransmission = v1.stream().anyMatch(p -> p.get(TcpPacket.class).getHeader().getSequenceNumber() == v2.get(0).get(TcpPacket.class).getHeader().getSequenceNumber());
+                    if (!retransmission) {
+                        // Do not add if retransmission -> avoid duplicate packets in flow
+                        v1.addAll(v2);
+                    }
                     return v1;
                 });
             }