sign: port stream tx stats are updated when TxThread finishes; actual Tx stream stats collection by TxThread is still pending
This commit is contained in:
parent
cffada4c07
commit
afcb4126b5
@ -54,14 +54,6 @@ AbstractPort::AbstractPort(int id, const char *device)
|
|||||||
maxStatsValue_ = ULLONG_MAX; // assume 64-bit stats
|
maxStatsValue_ = ULLONG_MAX; // assume 64-bit stats
|
||||||
memset((void*) &stats_, 0, sizeof(stats_));
|
memset((void*) &stats_, 0, sizeof(stats_));
|
||||||
resetStats();
|
resetStats();
|
||||||
|
|
||||||
// FIXME: temporary data for testing
|
|
||||||
{
|
|
||||||
StreamStatsTuple sst;
|
|
||||||
streamStats_.insert(1001, sst);
|
|
||||||
memset(&sst, 0, sizeof(sst));
|
|
||||||
streamStats_.insert(1002, sst);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AbstractPort::~AbstractPort()
|
AbstractPort::~AbstractPort()
|
||||||
@ -662,7 +654,7 @@ void AbstractPort::streamStatsAll(OstProto::StreamStatsList *stats)
|
|||||||
{
|
{
|
||||||
// FIXME: change input param to a non-OstProto type and/or have
|
// FIXME: change input param to a non-OstProto type and/or have
|
||||||
// a getFirst/Next like API?
|
// a getFirst/Next like API?
|
||||||
QHashIterator<uint, StreamStatsTuple> i(streamStats_);
|
StreamStatsIterator i(streamStats_);
|
||||||
while (i.hasNext())
|
while (i.hasNext())
|
||||||
{
|
{
|
||||||
i.next();
|
i.next();
|
||||||
|
@ -20,7 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
#ifndef _SERVER_ABSTRACT_PORT_H
|
#ifndef _SERVER_ABSTRACT_PORT_H
|
||||||
#define _SERVER_ABSTRACT_PORT_H
|
#define _SERVER_ABSTRACT_PORT_H
|
||||||
|
|
||||||
#include <QHash>
|
#include "streamstats.h"
|
||||||
|
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <QtGlobal>
|
#include <QtGlobal>
|
||||||
|
|
||||||
@ -131,13 +132,6 @@ public:
|
|||||||
quint64 neighborMacAddress(int streamId, int frameIndex);
|
quint64 neighborMacAddress(int streamId, int frameIndex);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct StreamStatsTuple
|
|
||||||
{
|
|
||||||
quint64 rx_pkts;
|
|
||||||
quint64 rx_bytes;
|
|
||||||
quint64 tx_pkts;
|
|
||||||
quint64 tx_bytes;
|
|
||||||
};
|
|
||||||
|
|
||||||
void addNote(QString note);
|
void addNote(QString note);
|
||||||
|
|
||||||
@ -152,7 +146,7 @@ protected:
|
|||||||
|
|
||||||
quint64 maxStatsValue_;
|
quint64 maxStatsValue_;
|
||||||
struct PortStats stats_;
|
struct PortStats stats_;
|
||||||
QHash<uint, StreamStatsTuple> streamStats_;
|
StreamStats streamStats_;
|
||||||
//! \todo Need lock for stats access/update
|
//! \todo Need lock for stats access/update
|
||||||
|
|
||||||
DeviceManager *deviceManager_;
|
DeviceManager *deviceManager_;
|
||||||
|
@ -31,6 +31,7 @@ win32 {
|
|||||||
LIBS += -lm
|
LIBS += -lm
|
||||||
LIBS += -lprotobuf
|
LIBS += -lprotobuf
|
||||||
HEADERS += drone.h \
|
HEADERS += drone.h \
|
||||||
|
pcaptransmitter.h \
|
||||||
myservice.h
|
myservice.h
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
devicemanager.cpp \
|
devicemanager.cpp \
|
||||||
|
@ -31,7 +31,7 @@ PcapPort::PcapPort(int id, const char *device)
|
|||||||
{
|
{
|
||||||
monitorRx_ = new PortMonitor(device, kDirectionRx, &stats_);
|
monitorRx_ = new PortMonitor(device, kDirectionRx, &stats_);
|
||||||
monitorTx_ = new PortMonitor(device, kDirectionTx, &stats_);
|
monitorTx_ = new PortMonitor(device, kDirectionTx, &stats_);
|
||||||
transmitter_ = new PcapTransmitter(device);
|
transmitter_ = new PcapTransmitter(device, streamStats_);
|
||||||
capturer_ = new PortCapturer(device);
|
capturer_ = new PortCapturer(device);
|
||||||
emulXcvr_ = new EmulationTransceiver(device, deviceManager_);
|
emulXcvr_ = new EmulationTransceiver(device, deviceManager_);
|
||||||
|
|
||||||
|
@ -19,14 +19,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "pcaptransmitter.h"
|
#include "pcaptransmitter.h"
|
||||||
|
|
||||||
PcapTransmitter::PcapTransmitter(const char *device)
|
PcapTransmitter::PcapTransmitter(
|
||||||
: txThread_(device)
|
const char *device,
|
||||||
|
StreamStats &portStreamStats)
|
||||||
|
: streamStats_(portStreamStats), txThread_(device)
|
||||||
{
|
{
|
||||||
memset(&stats_, 0, sizeof(stats_));
|
memset(&stats_, 0, sizeof(stats_));
|
||||||
txStats_.setTxThreadStats(&stats_);
|
txStats_.setTxThreadStats(&stats_);
|
||||||
txStats_.start(); // TODO: alongwith user transmit start
|
txStats_.start(); // TODO: alongwith user transmit start
|
||||||
|
|
||||||
txThread_.setStats(&stats_);
|
txThread_.setStats(&stats_);
|
||||||
|
connect(&txThread_, SIGNAL(finished()), SLOT(updateTxThreadStreamStats()));
|
||||||
}
|
}
|
||||||
|
|
||||||
PcapTransmitter::~PcapTransmitter()
|
PcapTransmitter::~PcapTransmitter()
|
||||||
@ -92,3 +95,21 @@ bool PcapTransmitter::isRunning()
|
|||||||
{
|
{
|
||||||
return txThread_.isRunning();
|
return txThread_.isRunning();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void PcapTransmitter::updateTxThreadStreamStats()
|
||||||
|
{
|
||||||
|
PcapTxThread *txThread = dynamic_cast<PcapTxThread*>(sender());
|
||||||
|
const StreamStats& threadStreamStats = txThread->streamStats();
|
||||||
|
StreamStatsIterator i(threadStreamStats);
|
||||||
|
|
||||||
|
while (i.hasNext())
|
||||||
|
{
|
||||||
|
i.next();
|
||||||
|
uint guid = i.key();
|
||||||
|
StreamStatsTuple sst = i.value();
|
||||||
|
|
||||||
|
streamStats_[guid].tx_pkts += sst.tx_pkts;
|
||||||
|
streamStats_[guid].tx_bytes += sst.tx_bytes;
|
||||||
|
}
|
||||||
|
txThread->clearStreamStats();
|
||||||
|
}
|
||||||
|
@ -25,10 +25,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
#include "pcaptxthread.h"
|
#include "pcaptxthread.h"
|
||||||
#include "statstuple.h"
|
#include "statstuple.h"
|
||||||
|
|
||||||
class PcapTransmitter
|
class PcapTransmitter : QObject
|
||||||
{
|
{
|
||||||
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
PcapTransmitter(const char *device);
|
PcapTransmitter(const char *device, StreamStats &portStreamStats);
|
||||||
~PcapTransmitter();
|
~PcapTransmitter();
|
||||||
|
|
||||||
bool setRateAccuracy(AbstractPort::Accuracy accuracy);
|
bool setRateAccuracy(AbstractPort::Accuracy accuracy);
|
||||||
@ -46,8 +47,10 @@ public:
|
|||||||
void start();
|
void start();
|
||||||
void stop();
|
void stop();
|
||||||
bool isRunning();
|
bool isRunning();
|
||||||
|
private slots:
|
||||||
|
void updateTxThreadStreamStats();
|
||||||
private:
|
private:
|
||||||
|
StreamStats &streamStats_;
|
||||||
PcapTxThread txThread_;
|
PcapTxThread txThread_;
|
||||||
PcapTxStats txStats_;
|
PcapTxStats txStats_;
|
||||||
StatsTuple stats_;
|
StatsTuple stats_;
|
||||||
|
@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>
|
|||||||
|
|
||||||
#include "pcaptxstats.h"
|
#include "pcaptxstats.h"
|
||||||
|
|
||||||
|
#include "pcaptxstats.h"
|
||||||
#include "statstuple.h"
|
#include "statstuple.h"
|
||||||
|
|
||||||
PcapTxStats::PcapTxStats()
|
PcapTxStats::PcapTxStats()
|
||||||
|
@ -203,6 +203,16 @@ void PcapTxThread::setStats(StatsTuple *stats)
|
|||||||
stats_ = stats;
|
stats_ = stats;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const StreamStats& PcapTxThread::streamStats()
|
||||||
|
{
|
||||||
|
return streamStats_;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PcapTxThread::clearStreamStats()
|
||||||
|
{
|
||||||
|
streamStats_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
void PcapTxThread::run()
|
void PcapTxThread::run()
|
||||||
{
|
{
|
||||||
//! \todo (MED) Stream Mode - continuous: define before implement
|
//! \todo (MED) Stream Mode - continuous: define before implement
|
||||||
@ -325,6 +335,11 @@ _restart:
|
|||||||
}
|
}
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
|
// TODO: update stream stats
|
||||||
|
// FIXME: temporary data for testing
|
||||||
|
streamStats_[1001].tx_pkts = 12345;
|
||||||
|
streamStats_[1001].tx_bytes = 56789;
|
||||||
|
|
||||||
state_ = kFinished;
|
state_ = kFinished;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,6 +47,9 @@ public:
|
|||||||
|
|
||||||
void setStats(StatsTuple *stats);
|
void setStats(StatsTuple *stats);
|
||||||
|
|
||||||
|
const StreamStats& streamStats();
|
||||||
|
void clearStreamStats();
|
||||||
|
|
||||||
void run();
|
void run();
|
||||||
|
|
||||||
void start();
|
void start();
|
||||||
@ -82,6 +85,7 @@ private:
|
|||||||
volatile State state_;
|
volatile State state_;
|
||||||
|
|
||||||
StatsTuple *stats_;
|
StatsTuple *stats_;
|
||||||
|
StreamStats streamStats_;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
36
server/streamstats.h
Normal file
36
server/streamstats.h
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
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 _STREAM_STATS_H
|
||||||
|
#define _STREAM_STATS_H
|
||||||
|
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
|
struct StreamStatsTuple
|
||||||
|
{
|
||||||
|
quint64 rx_pkts;
|
||||||
|
quint64 rx_bytes;
|
||||||
|
quint64 tx_pkts;
|
||||||
|
quint64 tx_bytes;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef QHash<uint, StreamStatsTuple> StreamStats;
|
||||||
|
typedef QHashIterator<uint, StreamStatsTuple> StreamStatsIterator;
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user