X-Git-Url: http://plrg.eecs.uci.edu/git/?p=pingpong.git;a=blobdiff_plain;f=Code%2FProjects%2FPacketLevelSignatureExtractor%2Fsrc%2Fmain%2Fjava%2Fedu%2Fuci%2Fiotproject%2Fdetection%2Flayer3%2FLayer3ClusterMatcher.java;h=165cdb3e57f68de4319504a3fee4e15cd4efc34e;hp=b070bd24812112e861a069b6fe09cf4d2f00111b;hb=987ea910fed24a1f3f51ded41b6aa98c4e2618ae;hpb=92a31b0967b3acff9e473ce62c136e84298b3aab diff --git a/Code/Projects/PacketLevelSignatureExtractor/src/main/java/edu/uci/iotproject/detection/layer3/Layer3ClusterMatcher.java b/Code/Projects/PacketLevelSignatureExtractor/src/main/java/edu/uci/iotproject/detection/layer3/Layer3ClusterMatcher.java index b070bd2..165cdb3 100644 --- a/Code/Projects/PacketLevelSignatureExtractor/src/main/java/edu/uci/iotproject/detection/layer3/Layer3ClusterMatcher.java +++ b/Code/Projects/PacketLevelSignatureExtractor/src/main/java/edu/uci/iotproject/detection/layer3/Layer3ClusterMatcher.java @@ -1,5 +1,6 @@ package edu.uci.iotproject.detection.layer3; +import edu.uci.iotproject.analysis.TriggerTrafficExtractor; import edu.uci.iotproject.detection.AbstractClusterMatcher; import edu.uci.iotproject.detection.ClusterMatcherObserver; import edu.uci.iotproject.trafficreassembly.layer3.Conversation; @@ -24,33 +25,6 @@ import static edu.uci.iotproject.util.PcapPacketUtils.*; */ public class Layer3ClusterMatcher extends AbstractClusterMatcher implements PacketListener { - // Test client - public static void main(String[] args) throws PcapNativeException, NotOpenException { - -// String path = "/scratch/July-2018"; // Rahmadi -// String path = "/Users/varmarken/temp/UCI IoT Project/experiments"; // Janus -// final String inputPcapFile = path + "/2018-07/dlink/dlink.wlan1.local.pcap"; -// final String signatureFile = path + "/2018-07/dlink/offSignature1.sig"; -// -// List> signature = PrintUtils.deserializeClustersFromFile(signatureFile); -// Layer3ClusterMatcher clusterMatcher = new Layer3ClusterMatcher(signature, null, -// (sig, match) -> System.out.println( -// String.format("[ !!! SIGNATURE DETECTED AT %s !!! ]", -// match.get(0).getTimestamp().atZone(ZoneId.of("America/Los_Angeles"))) -// ) -// ); -// -// PcapHandle handle; -// try { -// handle = Pcaps.openOffline(inputPcapFile, PcapHandle.TimestampPrecision.NANO); -// } catch (PcapNativeException pne) { -// handle = Pcaps.openOffline(inputPcapFile); -// } -// PcapHandleReader reader = new PcapHandleReader(handle, p -> true, clusterMatcher); -// reader.readFromHandle(); -// clusterMatcher.performDetection(); - } - /** * The ordered directions of packets in the sequences that make up {@link #mCluster}. */ @@ -71,19 +45,26 @@ public class Layer3ClusterMatcher extends AbstractClusterMatcher implements Pack */ private final double mEps; + /** + * The packet inclusion time for signature. + */ + private int mInclusionTimeMillis; + /** * Create a {@link Layer3ClusterMatcher}. * @param cluster The cluster that traffic is matched against. * @param routerWanIp The router's WAN IP if examining traffic captured at the ISP's point of view (used for * determining the direction of packets). - * @param eps The epsilon value used in the DBSCAN algorithm. + * @param inclusionTimeMillis The packet inclusion time for signature. * @param isRangeBased The boolean that decides if it is range-based vs. strict matching. + * @param eps The epsilon value used in the DBSCAN algorithm. * @param detectionObservers Client code that wants to get notified whenever the {@link Layer3ClusterMatcher} detects that * (a subset of) the examined traffic is similar to the traffic that makes up * {@code cluster}, i.e., when the examined traffic is classified as pertaining to * {@code cluster}. */ - public Layer3ClusterMatcher(List> cluster, String routerWanIp, boolean isRangeBased, double eps, + public Layer3ClusterMatcher(List> cluster, String routerWanIp, int inclusionTimeMillis, + boolean isRangeBased, double eps, ClusterMatcherObserver... detectionObservers) { super(cluster, isRangeBased); Objects.requireNonNull(detectionObservers, "detectionObservers cannot be null"); @@ -110,6 +91,8 @@ public class Layer3ClusterMatcher extends AbstractClusterMatcher implements Pack } mEps = eps; mRouterWanIp = routerWanIp; + mInclusionTimeMillis = + inclusionTimeMillis == 0 ? TriggerTrafficExtractor.INCLUSION_WINDOW_MILLIS : inclusionTimeMillis; } @Override @@ -149,6 +132,7 @@ public class Layer3ClusterMatcher extends AbstractClusterMatcher implements Pack isPresent()) { List matchSeq = match.get(); // Notify observers about the match. + // Max number of skipped packets in layer 3 is 0 (no skipped packets) mObservers.forEach(o -> o.onMatch(Layer3ClusterMatcher.this, matchSeq)); /* * Get the index in cPkts of the last packet in the sequence of packets that matches the searched @@ -191,6 +175,7 @@ public class Layer3ClusterMatcher extends AbstractClusterMatcher implements Pack isPresent()) { List matchSeq = match.get(); // Notify observers about the match. + // Max number of skipped packets in layer 3 is 0 (no skipped packets) mObservers.forEach(o -> o.onMatch(Layer3ClusterMatcher.this, matchSeq)); /* * Get the index in cPkts of the last packet in the sequence of packets that matches the searched @@ -365,9 +350,16 @@ public class Layer3ClusterMatcher extends AbstractClusterMatcher implements Pack PcapPacket seqPkt = sequence.get(seqIdx); // We only have a match if packet lengths and directions match. // The packet lengths have to be in the range of [lowerBound - eps, upperBound+eps] - // TODO: Maybe we could do better here for the double to integer conversion? - int epsLowerBound = lowBndPkt.length() - (int) mEps; - int epsUpperBound = upBndPkt.length() + (int) mEps; + // We initialize the lower and upper bounds first + int epsLowerBound = lowBndPkt.length(); + int epsUpperBound = upBndPkt.length(); + // Do strict matching if the lower and upper bounds are the same length + // Do range matching with eps otherwise + if (epsLowerBound != epsUpperBound) { + // TODO: Maybe we could do better here for the double to integer conversion? + epsLowerBound = epsLowerBound - (int) mEps; + epsUpperBound = epsUpperBound + (int) mEps; + } if (epsLowerBound <= seqPkt.getOriginalLength() && seqPkt.getOriginalLength() <= epsUpperBound && subsequenceDirections[subseqIdx] == sequenceDirections[seqIdx]) {