Fixing a bug in sort and compare; adding new devices/features.
[pingpong.git] / Code / Projects / PacketLevelSignatureExtractor / src / main / java / edu / uci / iotproject / util / PcapPacketUtils.java
index b4535668e3fec80615742fbe0f2b6e26d70d01eb..b413068f0bf1733e597bb779162d5a98afed01e3 100644 (file)
@@ -348,7 +348,8 @@ public final class PcapPacketUtils {
                 if (Math.abs(timestamp1 - timestamp2) < TriggerTrafficExtractor.INCLUSION_WINDOW_MILLIS) {
                     // If these two are within INCLUSION_WINDOW_MILLIS window then compare!
                     compare = p1.get(count1).get(0).getTimestamp().compareTo(p2.get(count2).get(0).getTimestamp());
-                    overlapChecking(compare, comparePrev, p1.get(count1), p2.get(count2));
+                    overlapChecking(compare, comparePrev, p1.get(count1), p2.get(count2),
+                            signatures.indexOf(p1), signatures.indexOf(p2));
                     comparePrev = compare;
                     count1++;
                     count2++;
@@ -372,8 +373,12 @@ public final class PcapPacketUtils {
      * @param comparePrev Previous comparison value between packet sequences p1 and p2
      * @param sequence1 The packet sequence ({@link List} of {@link PcapPacket} objects).
      * @param sequence2 The packet sequence ({@link List} of {@link PcapPacket} objects).
+     * @param indexSequence1 The index of packet sequence ({@link List} of {@link PcapPacket} objects).
+     * @param indexSequence2 The index of packet sequence ({@link List} of {@link PcapPacket} objects).
      */
-    private static void overlapChecking(int compare, int comparePrev, List<PcapPacket> sequence1, List<PcapPacket> sequence2) {
+    private static void overlapChecking(int compare, int comparePrev,
+                                        List<PcapPacket> sequence1, List<PcapPacket> sequence2,
+                                        int indexSequence1, int indexSequence2) {
 
         // Check if p1 occurs before p2 but both have same overlap
         if (comparePrev != 0) { // First time since it is 0
@@ -388,7 +393,13 @@ public final class PcapPacketUtils {
         }
         // Check if p1 is longer than p2 and p2 occurs during the occurrence of p1
         int lastIndexOfSequence1 = sequence1.size() - 1;
+        // Check if the last index is null
+        while (sequence1.get(lastIndexOfSequence1) == null)
+            lastIndexOfSequence1--;
         int lastIndexOfSequence2 = sequence2.size() - 1;
+        // Check if the last index is null
+        while (sequence2.get(lastIndexOfSequence2) == null)
+            lastIndexOfSequence2--;
         int compareLast =
                 sequence1.get(lastIndexOfSequence1).getTimestamp().compareTo(sequence2.get(lastIndexOfSequence2).getTimestamp());
         // Check the signs of compare and compareLast
@@ -451,7 +462,13 @@ public final class PcapPacketUtils {
                 int packetCounter = 0;
                 for(PcapPacket pcapPacket : listPcapPacket) {
                     if(pcapPacket != null) {
-                        PrintWriterUtils.print(pcapPacket.length(), resultsWriter, printToOutput);
+                        String srcIp = pcapPacket.get(IpV4Packet.class).getHeader().getSrcAddr().getHostAddress();
+                        String dstIp = pcapPacket.get(IpV4Packet.class).getHeader().getDstAddr().getHostAddress();
+                        String direction = srcIp.startsWith("10.") || srcIp.startsWith("192.168.") ?
+                                "(C-" : "(S-";
+                        direction = dstIp.startsWith("10.") || dstIp.startsWith("192.168.") ?
+                                direction + "C)" : direction + "S)";
+                        PrintWriterUtils.print(pcapPacket.length() + direction, resultsWriter, printToOutput);
                     }
                     if(packetCounter < listPcapPacket.size() - 1) {
                         // Provide space if not last packet
@@ -628,6 +645,9 @@ public final class PcapPacketUtils {
             List<PcapPacket> listCorePointLowerBound = listOfListPcapPacket.get(0);
             List<PcapPacket> listCorePointUpperBound = listOfListPcapPacket.get(1);
             for(PcapPacket corePointLowerBound : listCorePointLowerBound) {
+                if (corePointLowerBound == null) { // Skip if null!
+                    continue;
+                }
                 PcapPacket corePointUpperBound =
                         listCorePointUpperBound.get(listCorePointLowerBound.indexOf(corePointLowerBound));
                 // Return if the match for the core point bounds is found