2016-09-06 08:20:08 -05:00
|
|
|
/*
|
|
|
|
Copyright (C) 2010-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 "pcaptransmitter.h"
|
|
|
|
|
2016-11-11 09:52:07 -06:00
|
|
|
PcapTransmitter::PcapTransmitter(
|
|
|
|
const char *device,
|
|
|
|
StreamStats &portStreamStats)
|
|
|
|
: streamStats_(portStreamStats), txThread_(device)
|
2016-09-06 08:20:08 -05:00
|
|
|
{
|
2017-01-09 07:27:38 -06:00
|
|
|
adjustRxStreamStats_ = false;
|
2020-05-15 08:25:03 -05:00
|
|
|
txStats_.setObjectName(QString("TxStats:%1").arg(device));
|
2016-10-19 08:22:35 -05:00
|
|
|
memset(&stats_, 0, sizeof(stats_));
|
|
|
|
txStats_.setTxThreadStats(&stats_);
|
|
|
|
txStats_.start(); // TODO: alongwith user transmit start
|
|
|
|
|
|
|
|
txThread_.setStats(&stats_);
|
2016-11-11 09:52:07 -06:00
|
|
|
connect(&txThread_, SIGNAL(finished()), SLOT(updateTxThreadStreamStats()));
|
2016-10-19 08:22:35 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
PcapTransmitter::~PcapTransmitter()
|
|
|
|
{
|
|
|
|
txStats_.stop(); // TODO: alongwith user transmit stop
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
|
|
|
|
2016-09-13 08:35:24 -05:00
|
|
|
bool PcapTransmitter::setRateAccuracy(
|
2016-09-06 08:20:08 -05:00
|
|
|
AbstractPort::Accuracy accuracy)
|
|
|
|
{
|
2016-09-13 08:35:24 -05:00
|
|
|
return txThread_.setRateAccuracy(accuracy);
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
|
|
|
|
2017-01-09 07:27:38 -06:00
|
|
|
void PcapTransmitter::adjustRxStreamStats(bool enable)
|
|
|
|
{
|
|
|
|
adjustRxStreamStats_ = enable;
|
|
|
|
}
|
|
|
|
|
2016-12-06 10:11:47 -06:00
|
|
|
bool PcapTransmitter::setStreamStatsTracking(bool enable)
|
|
|
|
{
|
|
|
|
return txThread_.setStreamStatsTracking(enable);
|
|
|
|
}
|
|
|
|
|
2016-09-13 08:35:24 -05:00
|
|
|
void PcapTransmitter::clearPacketList()
|
2016-09-06 08:20:08 -05:00
|
|
|
{
|
2016-09-13 08:35:24 -05:00
|
|
|
txThread_.clearPacketList();
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
|
|
|
|
2016-09-13 08:35:24 -05:00
|
|
|
void PcapTransmitter::loopNextPacketSet(
|
|
|
|
qint64 size,
|
|
|
|
qint64 repeats,
|
|
|
|
long repeatDelaySec,
|
|
|
|
long repeatDelayNsec)
|
2016-09-06 08:20:08 -05:00
|
|
|
{
|
2016-09-13 08:35:24 -05:00
|
|
|
txThread_.loopNextPacketSet(size, repeats, repeatDelaySec, repeatDelayNsec);
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
|
|
|
|
2016-09-13 08:35:24 -05:00
|
|
|
bool PcapTransmitter::appendToPacketList(long sec, long nsec,
|
2016-09-06 08:20:08 -05:00
|
|
|
const uchar *packet, int length)
|
|
|
|
{
|
2016-09-13 08:35:24 -05:00
|
|
|
return txThread_.appendToPacketList(sec, nsec, packet, length);
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
|
|
|
|
2016-09-13 08:35:24 -05:00
|
|
|
void PcapTransmitter::setHandle(pcap_t *handle)
|
2016-09-06 08:20:08 -05:00
|
|
|
{
|
2016-09-13 08:35:24 -05:00
|
|
|
txThread_.setHandle(handle);
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
|
|
|
|
2016-09-13 08:35:24 -05:00
|
|
|
void PcapTransmitter::setPacketListLoopMode(
|
|
|
|
bool loop,
|
|
|
|
quint64 secDelay,
|
|
|
|
quint64 nsecDelay)
|
2016-09-06 08:20:08 -05:00
|
|
|
{
|
2016-09-13 08:35:24 -05:00
|
|
|
txThread_.setPacketListLoopMode(loop, secDelay, nsecDelay);
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
|
|
|
|
2023-04-21 08:02:17 -05:00
|
|
|
void PcapTransmitter::setPacketListTtagMarkers(
|
|
|
|
QList<uint> markers,
|
|
|
|
uint repeatInterval)
|
|
|
|
{
|
|
|
|
txThread_.setPacketListTtagMarkers(markers, repeatInterval);
|
|
|
|
}
|
|
|
|
|
2016-09-13 08:35:24 -05:00
|
|
|
void PcapTransmitter::useExternalStats(AbstractPort::PortStats *stats)
|
2016-09-06 08:20:08 -05:00
|
|
|
{
|
2016-10-19 08:22:35 -05:00
|
|
|
txStats_.useExternalStats(stats);
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
|
|
|
|
2016-09-13 08:35:24 -05:00
|
|
|
void PcapTransmitter::start()
|
2016-09-06 08:20:08 -05:00
|
|
|
{
|
2016-09-13 08:35:24 -05:00
|
|
|
txThread_.start();
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
|
|
|
|
2016-09-13 08:35:24 -05:00
|
|
|
void PcapTransmitter::stop()
|
2016-09-06 08:20:08 -05:00
|
|
|
{
|
2016-09-13 08:35:24 -05:00
|
|
|
txThread_.stop();
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
|
|
|
|
2016-09-13 08:35:24 -05:00
|
|
|
bool PcapTransmitter::isRunning()
|
2016-09-06 08:20:08 -05:00
|
|
|
{
|
2016-09-13 08:35:24 -05:00
|
|
|
return txThread_.isRunning();
|
2016-09-06 08:20:08 -05:00
|
|
|
}
|
2022-02-21 10:50:59 -06:00
|
|
|
double PcapTransmitter::lastTxDuration()
|
|
|
|
{
|
|
|
|
return txThread_.lastTxDuration();
|
|
|
|
}
|
2016-11-11 09:52:07 -06:00
|
|
|
|
|
|
|
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;
|
2017-01-09 07:27:38 -06:00
|
|
|
if (adjustRxStreamStats_) {
|
2023-02-08 04:48:02 -06:00
|
|
|
// XXX: rx_pkts counting may lag behind tx_pkts, so stream stats
|
|
|
|
// may become negative after adjustment transiently. But this
|
|
|
|
// should fix itself once all the rx pkts come in
|
2017-01-09 07:27:38 -06:00
|
|
|
streamStats_[guid].rx_pkts -= sst.tx_pkts;
|
|
|
|
streamStats_[guid].rx_bytes -= sst.tx_bytes;
|
|
|
|
}
|
2016-11-11 09:52:07 -06:00
|
|
|
}
|
|
|
|
txThread->clearStreamStats();
|
|
|
|
}
|