Add Apache Commons Math as dependency and implement first version of PcapPacketPairWr...
[pingpong.git] / Code / Projects / SmartPlugDetector / src / main / java / edu / uci / iotproject / analysis / PcapPacketPair.java
index 764fd0f62b4a38618601fafb9844cd6d2a6a2eaa..a0918e4db830d704a8ab2c79c41b7a7ea7babcbe 100644 (file)
@@ -1,25 +1,70 @@
 package edu.uci.iotproject.analysis;
 
+import edu.uci.iotproject.util.PcapPacketUtils;
 import org.pcap4j.core.PcapPacket;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Optional;
+
 /**
- * TODO add class documentation.
+ * <p>
+ *     A simple wrapper for holding a pair of packets (e.g., a request and associated reply packet).
+ * </p>
+ *
+ * <b>Note:</b> we use the deprecated version
  *
- * @author Janus Varmarken
+ * @author Janus Varmarken {@literal <jvarmark@uci.edu>}
+ * @author Rahmadi Trimananda {@literal <rtrimana@uci.edu>}
  */
 public class PcapPacketPair {
 
     private final PcapPacket mFirst;
 
-    private final PcapPacket mSecond;
+    private final Optional<PcapPacket> mSecond;
 
     public PcapPacketPair(PcapPacket first, PcapPacket second) {
         mFirst = first;
-        mSecond = second;
+        mSecond = Optional.ofNullable(second);
     }
 
     public PcapPacket getFirst() { return mFirst; }
 
-    public PcapPacket getSecond() { return mSecond; }
+    public boolean isFirstClient() {
+        String firstIp = PcapPacketUtils.getSourceIp(mFirst);
+        InetAddress ia = null;
+        try {
+            ia = InetAddress.getByName(firstIp);
+        } catch (UnknownHostException ex) {
+            ex.printStackTrace();
+        }
+        return ia.isSiteLocalAddress();
+    }
+
+    public Optional<PcapPacket> getSecond() { return mSecond; }
+
+    public boolean isSecondClient() {
+        // Return the value of the second source if it is not null
+        if (mSecond.isPresent()) {
+            String secondIp = PcapPacketUtils.getSourceIp(mSecond.get());
+            InetAddress ia = null;
+            try {
+                ia = InetAddress.getByName(secondIp);
+            } catch (UnknownHostException ex) {
+                ex.printStackTrace();
+            }
+            return ia.isSiteLocalAddress();
+        } else {
+            // When it is null, we always return the opposite of the first source's status
+            return !isFirstClient();
+        }
+    }
+
+    @Override
+    public String toString() {
+        return String.format("%d, %s",
+                getFirst().getOriginalLength(),
+                getSecond().map(pkt -> Integer.toString(pkt.getOriginalLength())).orElse("null"));
+    }
 
 }