summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2023-07-08 15:24:57 +0200
committerToni Uhlig <matzeton@googlemail.com>2023-07-16 15:24:57 +0200
commit98c665b409595238d73f550f95c7bf83ec6142da (patch)
tree66169fbad749b517993c2c5ca24f89469af467db
parentfa75d03ad3338b18176472787fce6bde9a36fe9d (diff)
Added BPF line edit. Set PcapPlusPlus stats in status bar.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
-rw-r--r--mainwindow.cpp24
-rw-r--r--mainwindow.ui5
-rw-r--r--pcapplusplus.cpp35
-rw-r--r--pcapplusplus.h4
4 files changed, 67 insertions, 1 deletions
diff --git a/mainwindow.cpp b/mainwindow.cpp
index 2ff457a..a375d91 100644
--- a/mainwindow.cpp
+++ b/mainwindow.cpp
@@ -25,6 +25,24 @@ MainWindow::MainWindow(QWidget *parent)
}
});
+ connect(ui->lineEdit, &QLineEdit::returnPressed, this, [&](){
+ if (ppp) {
+ if (!ppp->setFilter(ui->lineEdit->text()))
+ ui->lineEdit->setStyleSheet("QLineEdit { background: rgb(255, 0, 0); }");
+ else {
+ ui->lineEdit->setStyleSheet("QLineEdit { background: rgb(255, 255, 255); }");
+ ppp->closePcap();
+ if (!ppp->openPcap())
+ throw std::runtime_error("Reopen PCAP File to apply a BPF failed.");
+ if (!ppp->setFilter(ui->lineEdit->text()))
+ throw std::runtime_error("Could not re-apply a previously set filter.");
+ ui->tableWidget->clear();
+ ui->tableWidget->setRowCount(0);
+ emit processPcap();
+ }
+ }
+ });
+
connect(ui->actionSave, &QAction::triggered, this, [&](bool){
QString fileName = QFileDialog::getSaveFileName(this, tr("Save PCAP File"), "", tr("PCAP Files (*.pcap)"));
if (fileName.length() > 0) {
@@ -48,6 +66,12 @@ MainWindow::MainWindow(QWidget *parent)
firstPacketTs = packet.getRawPacket()->getPacketTimeStamp().tv_sec;
emit onPacketAvailable(packet);
}
+ pcpp::PcapFileReaderDevice::PcapStats stats;
+ if (ppp->getPcapStatistics(stats))
+ ui->statusbar->showMessage("PCAP loaded. Packets: " + QString::fromStdString(std::to_string(stats.packetsRecv))
+ + ", Dropped: " + QString::fromStdString(std::to_string(stats.packetsDrop)));
+ else
+ ui->statusbar->showMessage("No PCAP statistics available.");
});
connect(this, &MainWindow::onPacketAvailable, this, [&](const pcpp::Packet& packet) {
diff --git a/mainwindow.ui b/mainwindow.ui
index ea1b3a3..a0829c8 100644
--- a/mainwindow.ui
+++ b/mainwindow.ui
@@ -41,7 +41,7 @@
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
- <item row="0" column="0">
+ <item row="1" column="0">
<widget class="QTableWidget" name="tableWidget">
<property name="styleSheet">
<string notr="true">color: black;
@@ -79,6 +79,9 @@ border-color: beige;</string>
<column/>
</widget>
</item>
+ <item row="0" column="0">
+ <widget class="QLineEdit" name="lineEdit"/>
+ </item>
</layout>
</item>
</layout>
diff --git a/pcapplusplus.cpp b/pcapplusplus.cpp
index 894d799..d78a2eb 100644
--- a/pcapplusplus.cpp
+++ b/pcapplusplus.cpp
@@ -31,6 +31,31 @@ PcapPlusPlus::~PcapPlusPlus()
}
}
+bool PcapPlusPlus::openPcap()
+{
+ if (!reader)
+ return false;
+
+ if (reader->isOpened())
+ throw std::runtime_error("PCAP File already open. Close it first.");
+
+ return reader->open();
+}
+
+void PcapPlusPlus::closePcap()
+{
+ if (reader)
+ reader->close();
+}
+
+bool PcapPlusPlus::setFilter(QString filter)
+{
+ if (reader)
+ return reader->setFilter(filter.toStdString());
+
+ return false;
+}
+
bool PcapPlusPlus::processPacket(pcpp::Packet & packet)
{
pcpp::RawPacket rawPacket;
@@ -82,6 +107,16 @@ std::vector<pcpp::Packet>::iterator PcapPlusPlus::parsedPacketsEnd()
return parsedPackets.end();
}
+bool PcapPlusPlus::getPcapStatistics(pcpp::IFileDevice::PcapStats & stats)
+{
+ if (reader) {
+ reader->getStatistics(stats);
+ return true;
+ }
+
+ return false;
+}
+
const pcpp::Layer *PcapPlusPlus::getFirstLayer(const pcpp::Packet & packet)
{
const auto *curLayer = packet.getFirstLayer();
diff --git a/pcapplusplus.h b/pcapplusplus.h
index 4afc7ff..71735d3 100644
--- a/pcapplusplus.h
+++ b/pcapplusplus.h
@@ -10,6 +10,9 @@ class PcapPlusPlus
public:
explicit PcapPlusPlus(std::string fileName);
~PcapPlusPlus();
+ bool openPcap();
+ void closePcap();
+ bool setFilter(QString filter);
bool processPacket(pcpp::Packet & packet);
pcpp::RawPacket &getRawPacket(size_t index);
pcpp::Packet &getParsedPacket(size_t index);
@@ -17,6 +20,7 @@ public:
std::vector<pcpp::RawPacket>::iterator rawPacketsEnd();
std::vector<pcpp::Packet>::iterator parsedPacketsBegin();
std::vector<pcpp::Packet>::iterator parsedPacketsEnd();
+ bool getPcapStatistics(pcpp::IFileDevice::PcapStats & stats);
static const pcpp::Layer *getFirstLayer(const pcpp::Packet & packet);
static QString getProtocolTypeAsString(pcpp::ProtocolType protocolType);