sign: refactored tx stats into a new PcapTxStats class
This commit is contained in:
parent
2f87618fea
commit
31c2cd2dcb
@ -41,6 +41,7 @@ SOURCES += \
|
|||||||
abstractport.cpp \
|
abstractport.cpp \
|
||||||
pcapport.cpp \
|
pcapport.cpp \
|
||||||
pcaptransmitter.cpp \
|
pcaptransmitter.cpp \
|
||||||
|
pcaptxstats.cpp \
|
||||||
pcaptxthread.cpp \
|
pcaptxthread.cpp \
|
||||||
bsdport.cpp \
|
bsdport.cpp \
|
||||||
linuxport.cpp \
|
linuxport.cpp \
|
||||||
|
@ -22,6 +22,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
PcapTransmitter::PcapTransmitter(const char *device)
|
PcapTransmitter::PcapTransmitter(const char *device)
|
||||||
: txThread_(device)
|
: txThread_(device)
|
||||||
{
|
{
|
||||||
|
memset(&stats_, 0, sizeof(stats_));
|
||||||
|
txStats_.setTxThreadStats(&stats_);
|
||||||
|
txStats_.start(); // TODO: alongwith user transmit start
|
||||||
|
|
||||||
|
txThread_.setStats(&stats_);
|
||||||
|
}
|
||||||
|
|
||||||
|
PcapTransmitter::~PcapTransmitter()
|
||||||
|
{
|
||||||
|
txStats_.stop(); // TODO: alongwith user transmit stop
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PcapTransmitter::setRateAccuracy(
|
bool PcapTransmitter::setRateAccuracy(
|
||||||
@ -65,7 +75,7 @@ void PcapTransmitter::setPacketListLoopMode(
|
|||||||
|
|
||||||
void PcapTransmitter::useExternalStats(AbstractPort::PortStats *stats)
|
void PcapTransmitter::useExternalStats(AbstractPort::PortStats *stats)
|
||||||
{
|
{
|
||||||
txThread_.useExternalStats(stats);
|
txStats_.useExternalStats(stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PcapTransmitter::start()
|
void PcapTransmitter::start()
|
||||||
|
@ -21,12 +21,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
#define _PCAP_TRANSMITTER_H
|
#define _PCAP_TRANSMITTER_H
|
||||||
|
|
||||||
#include "abstractport.h"
|
#include "abstractport.h"
|
||||||
|
#include "pcaptxstats.h"
|
||||||
#include "pcaptxthread.h"
|
#include "pcaptxthread.h"
|
||||||
|
#include "statstuple.h"
|
||||||
|
|
||||||
class PcapTransmitter
|
class PcapTransmitter
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
PcapTransmitter(const char *device);
|
PcapTransmitter(const char *device);
|
||||||
|
~PcapTransmitter();
|
||||||
|
|
||||||
bool setRateAccuracy(AbstractPort::Accuracy accuracy);
|
bool setRateAccuracy(AbstractPort::Accuracy accuracy);
|
||||||
|
|
||||||
@ -46,6 +49,8 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
PcapTxThread txThread_;
|
PcapTxThread txThread_;
|
||||||
|
PcapTxStats txStats_;
|
||||||
|
StatsTuple stats_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
85
server/pcaptxstats.cpp
Normal file
85
server/pcaptxstats.cpp
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2016 Srivats P.
|
||||||
|
|
||||||
|
This file is part of "Ostinato"
|
||||||
|
|
||||||
|
This is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "pcaptxstats.h"
|
||||||
|
|
||||||
|
#include "statstuple.h"
|
||||||
|
|
||||||
|
PcapTxStats::PcapTxStats()
|
||||||
|
{
|
||||||
|
txThreadStats_ = NULL;
|
||||||
|
|
||||||
|
stats_ = new AbstractPort::PortStats;
|
||||||
|
usingInternalStats_ = true;
|
||||||
|
|
||||||
|
stop_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
PcapTxStats::~PcapTxStats()
|
||||||
|
{
|
||||||
|
if (usingInternalStats_)
|
||||||
|
delete stats_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PcapTxStats::setTxThreadStats(StatsTuple *stats)
|
||||||
|
{
|
||||||
|
txThreadStats_ = stats;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PcapTxStats::useExternalStats(AbstractPort::PortStats *stats)
|
||||||
|
{
|
||||||
|
if (usingInternalStats_)
|
||||||
|
delete stats_;
|
||||||
|
stats_ = stats;
|
||||||
|
usingInternalStats_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PcapTxStats::start()
|
||||||
|
{
|
||||||
|
QThread::start();
|
||||||
|
|
||||||
|
while (!isRunning())
|
||||||
|
QThread::msleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PcapTxStats::stop()
|
||||||
|
{
|
||||||
|
stop_ = true;
|
||||||
|
|
||||||
|
while (isRunning())
|
||||||
|
QThread::msleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PcapTxStats::run()
|
||||||
|
{
|
||||||
|
Q_ASSERT(txThreadStats_);
|
||||||
|
|
||||||
|
qDebug("txStats: collection start");
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
stats_->txPkts = txThreadStats_->pkts;
|
||||||
|
stats_->txBytes = txThreadStats_->bytes;
|
||||||
|
|
||||||
|
if (stop_)
|
||||||
|
break;
|
||||||
|
QThread::msleep(1000);
|
||||||
|
}
|
||||||
|
stop_ = false;
|
||||||
|
qDebug("txStats: collection end");
|
||||||
|
}
|
53
server/pcaptxstats.h
Normal file
53
server/pcaptxstats.h
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2016 Srivats P.
|
||||||
|
|
||||||
|
This file is part of "Ostinato"
|
||||||
|
|
||||||
|
This is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _PCAP_TX_STATS_H
|
||||||
|
#define _PCAP_TX_STATS_H
|
||||||
|
|
||||||
|
#include "abstractport.h"
|
||||||
|
|
||||||
|
#include <QThread>
|
||||||
|
|
||||||
|
class StatsTuple;
|
||||||
|
|
||||||
|
class PcapTxStats : public QThread
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PcapTxStats();
|
||||||
|
~PcapTxStats();
|
||||||
|
|
||||||
|
void setTxThreadStats(StatsTuple *stats);
|
||||||
|
|
||||||
|
void useExternalStats(AbstractPort::PortStats *stats);
|
||||||
|
|
||||||
|
void start();
|
||||||
|
void stop();
|
||||||
|
private:
|
||||||
|
void run();
|
||||||
|
|
||||||
|
StatsTuple *txThreadStats_;
|
||||||
|
|
||||||
|
bool usingInternalStats_;
|
||||||
|
AbstractPort::PortStats *stats_;
|
||||||
|
|
||||||
|
volatile bool stop_;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "pcaptransmitter.h"
|
#include "pcaptransmitter.h"
|
||||||
|
|
||||||
|
#include "statstuple.h"
|
||||||
#include "timestamp.h"
|
#include "timestamp.h"
|
||||||
|
|
||||||
PcapTxThread::PcapTxThread(const char *device)
|
PcapTxThread::PcapTxThread(const char *device)
|
||||||
@ -37,8 +38,6 @@ PcapTxThread::PcapTxThread(const char *device)
|
|||||||
returnToQIdx_ = -1;
|
returnToQIdx_ = -1;
|
||||||
loopDelay_ = 0;
|
loopDelay_ = 0;
|
||||||
stop_ = false;
|
stop_ = false;
|
||||||
stats_ = new AbstractPort::PortStats;
|
|
||||||
usingInternalStats_ = true;
|
|
||||||
handle_ = pcap_open_live(device, 64 /* FIXME */, 0, 1000 /* ms */, errbuf);
|
handle_ = pcap_open_live(device, 64 /* FIXME */, 0, 1000 /* ms */, errbuf);
|
||||||
|
|
||||||
if (handle_ == NULL)
|
if (handle_ == NULL)
|
||||||
@ -46,6 +45,8 @@ PcapTxThread::PcapTxThread(const char *device)
|
|||||||
|
|
||||||
usingInternalHandle_ = true;
|
usingInternalHandle_ = true;
|
||||||
|
|
||||||
|
stats_ = NULL;
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
_open_error:
|
_open_error:
|
||||||
@ -55,8 +56,6 @@ _open_error:
|
|||||||
|
|
||||||
PcapTxThread::~PcapTxThread()
|
PcapTxThread::~PcapTxThread()
|
||||||
{
|
{
|
||||||
if (usingInternalStats_)
|
|
||||||
delete stats_;
|
|
||||||
if (usingInternalHandle_)
|
if (usingInternalHandle_)
|
||||||
pcap_close(handle_);
|
pcap_close(handle_);
|
||||||
}
|
}
|
||||||
@ -199,12 +198,9 @@ void PcapTxThread::setHandle(pcap_t *handle)
|
|||||||
usingInternalHandle_ = false;
|
usingInternalHandle_ = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PcapTxThread::useExternalStats(AbstractPort::PortStats *stats)
|
void PcapTxThread::setStats(StatsTuple *stats)
|
||||||
{
|
{
|
||||||
if (usingInternalStats_)
|
|
||||||
delete stats_;
|
|
||||||
stats_ = stats;
|
stats_ = stats;
|
||||||
usingInternalStats_ = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PcapTxThread::run()
|
void PcapTxThread::run()
|
||||||
@ -266,8 +262,8 @@ _restart:
|
|||||||
seq->sendQueue_, kSyncTransmit);
|
seq->sendQueue_, kSyncTransmit);
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
{
|
{
|
||||||
stats_->txPkts += seq->packets_;
|
stats_->pkts += seq->packets_;
|
||||||
stats_->txBytes += seq->bytes_;
|
stats_->bytes += seq->bytes_;
|
||||||
|
|
||||||
getTimeStamp(&ovrEnd);
|
getTimeStamp(&ovrEnd);
|
||||||
overHead += seq->usecDuration_
|
overHead += seq->usecDuration_
|
||||||
@ -407,8 +403,8 @@ int PcapTxThread::sendQueueTransmit(pcap_t *p,
|
|||||||
Q_ASSERT(pktLen > 0);
|
Q_ASSERT(pktLen > 0);
|
||||||
|
|
||||||
pcap_sendpacket(p, pkt, pktLen);
|
pcap_sendpacket(p, pkt, pktLen);
|
||||||
stats_->txPkts++;
|
stats_->pkts++;
|
||||||
stats_->txBytes += pktLen;
|
stats_->bytes += pktLen;
|
||||||
|
|
||||||
// Step to the next packet in the buffer
|
// Step to the next packet in the buffer
|
||||||
hdr = (struct pcap_pkthdr*) (pkt + pktLen);
|
hdr = (struct pcap_pkthdr*) (pkt + pktLen);
|
||||||
|
@ -26,6 +26,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <pcap.h>
|
#include <pcap.h>
|
||||||
|
|
||||||
|
class StatsTuple;
|
||||||
|
|
||||||
class PcapTxThread: public QThread
|
class PcapTxThread: public QThread
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -42,13 +44,15 @@ public:
|
|||||||
void setPacketListLoopMode(bool loop, quint64 secDelay, quint64 nsecDelay);
|
void setPacketListLoopMode(bool loop, quint64 secDelay, quint64 nsecDelay);
|
||||||
|
|
||||||
void setHandle(pcap_t *handle);
|
void setHandle(pcap_t *handle);
|
||||||
void useExternalStats(AbstractPort::PortStats *stats);
|
|
||||||
|
void setStats(StatsTuple *stats);
|
||||||
|
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
void start();
|
void start();
|
||||||
void stop();
|
void stop();
|
||||||
bool isRunning();
|
bool isRunning();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum State
|
enum State
|
||||||
{
|
{
|
||||||
@ -72,12 +76,12 @@ private:
|
|||||||
|
|
||||||
void (*udelayFn_)(unsigned long);
|
void (*udelayFn_)(unsigned long);
|
||||||
|
|
||||||
bool usingInternalStats_;
|
|
||||||
AbstractPort::PortStats *stats_;
|
|
||||||
bool usingInternalHandle_;
|
bool usingInternalHandle_;
|
||||||
pcap_t *handle_;
|
pcap_t *handle_;
|
||||||
volatile bool stop_;
|
volatile bool stop_;
|
||||||
volatile State state_;
|
volatile State state_;
|
||||||
|
|
||||||
|
StatsTuple *stats_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
31
server/statstuple.h
Normal file
31
server/statstuple.h
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2016 Srivats P.
|
||||||
|
|
||||||
|
This file is part of "Ostinato"
|
||||||
|
|
||||||
|
This is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _STATS_TUPLE_H
|
||||||
|
#define _STATS_TUPLE_H
|
||||||
|
|
||||||
|
#include <QtGlobal>
|
||||||
|
|
||||||
|
struct StatsTuple
|
||||||
|
{
|
||||||
|
quint64 pkts;
|
||||||
|
quint64 bytes;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user