package edu.uci.iotproject.analysis;
+import edu.uci.iotproject.io.PcapHandleReader;
import org.pcap4j.core.*;
import java.time.Instant;
private int mTriggerIndex = 0;
+ /**
+ * The total number of packets marked for inclusion during one run of {@link #performExtraction(PacketListener...)}.
+ */
+ private long mIncludedPackets = 0;
- private static final int INCLUSION_WINDOW_MILLIS = 3_000;
+ public static final int INCLUSION_WINDOW_MILLIS = 15_000;
public TriggerTrafficExtractor(String pcapFilePath, List<Instant> triggerTimes, String deviceIp) throws PcapNativeException, NotOpenException {
mPcapFilePath = pcapFilePath;
public void performExtraction(PacketListener... extractedPacketsConsumers) throws PcapNativeException, NotOpenException, TimeoutException {
+ // Reset trigger index and packet counter in case client code chooses to rerun the extraction.
+ mTriggerIndex = 0;
+ mIncludedPackets = 0;
PcapHandle handle;
try {
handle = Pcaps.openOffline(mPcapFilePath, PcapHandle.TimestampPrecision.NANO);
handle.setFilter("ip host " + mDeviceIp, BpfProgram.BpfCompileMode.OPTIMIZE);
PcapHandleReader pcapReader = new PcapHandleReader(handle, this, extractedPacketsConsumers);
pcapReader.readFromHandle();
- // Reset trigger index (in case client code chooses to rerun the extraction)
- mTriggerIndex = 0;
+
+ }
+
+ /**
+ * Return the number of extracted packets (i.e., packets selected for inclusion) as a result of the most recent call
+ * to {@link #performExtraction(PacketListener...)}.
+ *
+ * @return the number of extracted packets (i.e., packets selected for inclusion) as a result of the most recent
+ * call to {@link #performExtraction(PacketListener...)}.
+ */
+ public long getPacketsIncludedCount() {
+ return mIncludedPackets;
}
@Override
public boolean shouldIncludePacket(PcapPacket packet) {
+ // New version. Simpler, but slower: the later a packet arrives, the more elements of mTriggerTimes will need to
+ // be traversed.
+ boolean include = mTriggerTimes.stream().anyMatch(
+ trigger -> trigger.isBefore(packet.getTimestamp()) &&
+ packet.getTimestamp().isBefore(trigger.plusMillis(INCLUSION_WINDOW_MILLIS))
+ );
+ if (include) {
+ mIncludedPackets++;
+ }
+ return include;
+
+ /*
+ // Old version. Faster, but more complex - is it correct?
+ if (mTriggerIndex >= mTriggerTimes.size()) {
+ // Don't include packet if we've exhausted the list of trigger times.
+ return false;
+ }
+
// TODO hmm, is this correct?
Instant trigger = mTriggerTimes.get(mTriggerIndex);
if (trigger.isBefore(packet.getTimestamp()) &&
return shouldIncludePacket(packet);
}
}
+ */
}
}