diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2023-07-08 15:24:57 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2023-07-16 15:24:57 +0200 |
commit | 98c665b409595238d73f550f95c7bf83ec6142da (patch) | |
tree | 66169fbad749b517993c2c5ca24f89469af467db | |
parent | fa75d03ad3338b18176472787fce6bde9a36fe9d (diff) |
Added BPF line edit. Set PcapPlusPlus stats in status bar.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
-rw-r--r-- | mainwindow.cpp | 24 | ||||
-rw-r--r-- | mainwindow.ui | 5 | ||||
-rw-r--r-- | pcapplusplus.cpp | 35 | ||||
-rw-r--r-- | pcapplusplus.h | 4 |
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); |