* @author Janus Varmarken {@literal <jvarmark@uci.edu>}
* @author Rahmadi Trimananda {@literal <rtrimana@uci.edu>}
*/
-public class Layer2SequenceMatcher {
+public class Layer2SequenceMatcher extends Layer2AbstractMatcher {
/**
* The sequence this {@link Layer2SequenceMatcher} is searching for.
*/
private final List<PcapPacket> mSequence;
- /**
- * Buffer of actual packets seen so far that match the searched sequence (i.e., constitutes a subsequence of the
- * searched sequence).
- */
- private final List<PcapPacket> mMatchedPackets = new ArrayList<>();
+ private int mInclusionTimeMillis;
- /**
- * Models the directions of packets in {@link #mSequence}. As the sequence matcher assumes that it is only presented
- * with packet from a single flow (packets exchanged between two devices), we can model the packet directions with a
- * single bit. We don't have any notion "phone to device" or "device to phone" as we don't know the MAC addresses
- * of devices in advance during matching.
- */
- private final boolean[] mPacketDirections;
/**
* Create a {@code Layer2SequenceMatcher}.
* @param sequence The sequence to match against (search for).
*/
- public Layer2SequenceMatcher(List<PcapPacket> sequence) {
+ public Layer2SequenceMatcher(List<PcapPacket> sequence, int inclusionTimeMillis) {
+ super(sequence);
mSequence = sequence;
// Compute packet directions for sequence.
- mPacketDirections = new boolean[sequence.size()];
for (int i = 0; i < sequence.size(); i++) {
if (i == 0) {
// No previous packet; boolean parameter is ignored in this special case.
mPacketDirections[i] = getPacketDirection(prevPkt, prevPktDirection, sequence.get(i));
}
}
+ mInclusionTimeMillis =
+ inclusionTimeMillis == 0 ? TriggerTrafficExtractor.INCLUSION_WINDOW_MILLIS : inclusionTimeMillis;
}
/**
if (!packet.getTimestamp().isAfter(mMatchedPackets.get(getMatchedPacketsCount()-1).getTimestamp())) {
return false;
}
+// if (packet.getTimestamp().isAfter(mMatchedPackets.get(0).getTimestamp().
+// plusMillis(TriggerTrafficExtractor.INCLUSION_WINDOW_MILLIS))) {
if (packet.getTimestamp().isAfter(mMatchedPackets.get(0).getTimestamp().
- plusMillis(TriggerTrafficExtractor.INCLUSION_WINDOW_MILLIS))) {
+ plusMillis(mInclusionTimeMillis))) {
return false;
}
// If we made it here, it means that this packet has the expected length, direction, and obeys the timing
return false;
}
- public int getMatchedPacketsCount() {
- return mMatchedPackets.size();
- }
-
public int getTargetSequencePacketCount() {
return mSequence.size();
}
return mSequence;
}
- public List<PcapPacket> getMatchedPackets() {
- return mMatchedPackets;
- }
-
- /**
- * Utility for {@code getMatchedPackets().get(getMatchedPackets().size()-1)}.
- * @return The last matched packet, or {@code null} if no packets have been matched yet.
- */
- public PcapPacket getLastPacket() {
- return mSequence.size() > 0 ? mSequence.get(mSequence.size()-1) : null;
- }
-
- /**
- * Compute the direction of a packet based on the previous packet. If no previous packet is provided, the direction
- * of {@code currPkt} is {@code true} by definition.
- * @param prevPkt The previous packet, if any.
- * @param prevPktDirection The computed direction of the previous packet
- * @param currPkt The current packet for which the direction is to be determined.
- * @return The direction of {@code currPkt}.
- */
- private boolean getPacketDirection(PcapPacket prevPkt, boolean prevPktDirection, PcapPacket currPkt) {
- if (prevPkt == null) {
- // By definition, use true as direction marker for first packet
- return true;
- }
- if (PcapPacketUtils.getEthSrcAddr(prevPkt).equals(PcapPacketUtils.getEthSrcAddr(currPkt))) {
- // Current packet goes in same direction as previous packet.
- return prevPktDirection;
- } else {
- // Current packet goes in opposite direction of previous packet.
- return !prevPktDirection;
- }
- }
-
-
}