|
@@ -1,4 +1,6 @@
|
|
#include "pcap_processor.h"
|
|
#include "pcap_processor.h"
|
|
|
|
+#include <mutex>
|
|
|
|
+#include <thread>
|
|
|
|
|
|
using namespace Tins;
|
|
using namespace Tins;
|
|
|
|
|
|
@@ -159,7 +161,7 @@ void pcap_processor::collect_statistics() {
|
|
std::cout << "Loading pcap..." << std::endl;
|
|
std::cout << "Loading pcap..." << std::endl;
|
|
FileSniffer sniffer(filePath);
|
|
FileSniffer sniffer(filePath);
|
|
|
|
|
|
- SnifferIterator i = sniffer.begin();
|
|
|
|
|
|
+ SnifferIterator it = sniffer.begin();
|
|
std::chrono::microseconds currentPktTimestamp;
|
|
std::chrono::microseconds currentPktTimestamp;
|
|
|
|
|
|
// Read PCAP file info
|
|
// Read PCAP file info
|
|
@@ -185,31 +187,51 @@ void pcap_processor::collect_statistics() {
|
|
std::chrono::system_clock::time_point lastPrinted = std::chrono::system_clock::now();
|
|
std::chrono::system_clock::time_point lastPrinted = std::chrono::system_clock::now();
|
|
|
|
|
|
// Iterate over all packets and collect statistics
|
|
// Iterate over all packets and collect statistics
|
|
- for (; i != sniffer.end(); i++) {
|
|
|
|
- currentPktTimestamp = i->timestamp();
|
|
|
|
- std::chrono::microseconds currentDuration = currentPktTimestamp - firstTimestamp;
|
|
|
|
-
|
|
|
|
- // For each interval
|
|
|
|
- if(currentDuration>barrier){
|
|
|
|
- stats.addIntervalStat(timeInterval, intervalStartTimestamp, currentPktTimestamp);
|
|
|
|
- timeIntervalCounter++;
|
|
|
|
-
|
|
|
|
- barrier = barrier + timeInterval;
|
|
|
|
- intervalStartTimestamp = currentPktTimestamp;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- stats.incrementPacketCount();
|
|
|
|
- this->process_packets(*i);
|
|
|
|
-
|
|
|
|
- // Indicate progress once every second
|
|
|
|
- if (std::chrono::system_clock::now() - lastPrinted >= std::chrono::seconds(1)) {
|
|
|
|
- int packetCount = stats.getPacketCount();
|
|
|
|
- std::cout << "\rInspected packets: ";
|
|
|
|
- std::cout << std::fixed << std::setprecision(1) << (static_cast<float>(packetCount)*100/totalPackets) << "%";
|
|
|
|
- std::cout << " (" << packetCount << "/" << totalPackets << ")" << std::flush;
|
|
|
|
- lastPrinted = std::chrono::system_clock::now();
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ //for (; i != sniffer.end(); i++) {
|
|
|
|
+ std::vector<std::thread> threads;
|
|
|
|
+
|
|
|
|
+ std::mutex it_mutex;
|
|
|
|
+
|
|
|
|
+ for (std::size_t i=0; i < std::thread::hardware_concurrency(); ++i) {
|
|
|
|
+ threads.push_back(std::thread([&]() {
|
|
|
|
+ while (true) {
|
|
|
|
+ // lock this!
|
|
|
|
+ SnifferIterator i;
|
|
|
|
+ it_mutex.lock();
|
|
|
|
+ i = it++;
|
|
|
|
+ it_mutex.unlock();
|
|
|
|
+ if (i == sniffer.end()) break;
|
|
|
|
+
|
|
|
|
+ currentPktTimestamp = i->timestamp();
|
|
|
|
+ std::chrono::microseconds currentDuration = currentPktTimestamp - firstTimestamp;
|
|
|
|
+
|
|
|
|
+ // For each interval
|
|
|
|
+ if(currentDuration>barrier){
|
|
|
|
+ stats.addIntervalStat(timeInterval, intervalStartTimestamp, currentPktTimestamp);
|
|
|
|
+ timeIntervalCounter++;
|
|
|
|
+
|
|
|
|
+ barrier = barrier + timeInterval;
|
|
|
|
+ intervalStartTimestamp = currentPktTimestamp;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ stats.incrementPacketCount();
|
|
|
|
+ this->process_packets(*i);
|
|
|
|
+
|
|
|
|
+ // Indicate progress once every second
|
|
|
|
+ if (std::chrono::system_clock::now() - lastPrinted >= std::chrono::seconds(1)) {
|
|
|
|
+ int packetCount = stats.getPacketCount();
|
|
|
|
+ std::cout << "\rInspected packets: ";
|
|
|
|
+ std::cout << std::fixed << std::setprecision(1) << (static_cast<float>(packetCount)*100/totalPackets) << "%";
|
|
|
|
+ std::cout << " (" << packetCount << "/" << totalPackets << ")" << std::flush;
|
|
|
|
+ lastPrinted = std::chrono::system_clock::now();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for(auto &t: threads)
|
|
|
|
+ t.join();
|
|
|
|
+
|
|
|
|
|
|
std::cout << "\rInspected packets: ";
|
|
std::cout << "\rInspected packets: ";
|
|
std::cout << "100.0% (" << totalPackets << "/" << totalPackets << ")" << std::endl;
|
|
std::cout << "100.0% (" << totalPackets << "/" << totalPackets << ")" << std::endl;
|