send time point with packet sent signal

This commit is contained in:
Stephen Birarda 2016-09-26 13:30:34 -07:00
parent 75d4b156f1
commit ecbba3d4cd
7 changed files with 29 additions and 14 deletions

View file

@ -43,9 +43,10 @@ public:
virtual void onACK(SequenceNumber ackNum) {}
virtual void onLoss(SequenceNumber rangeStart, SequenceNumber rangeEnd) {}
virtual void onTimeout() {}
virtual void onPacketSent(int packetSize, SequenceNumber seqNum) {}
virtual bool shouldNAK() { return true; }
virtual void onPacketSent(int packetSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint) {}
protected:
void setAckInterval(int ackInterval) { _ackInterval = ackInterval; }
void setRTO(int rto) { _userDefinedRTO = true; _rto = rto; }

View file

@ -262,16 +262,17 @@ void Connection::sync() {
}
}
void Connection::recordSentPackets(int dataSize, int payloadSize, SequenceNumber seqNum) {
void Connection::recordSentPackets(int dataSize, int payloadSize,
SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint) {
_stats.recordSentPackets(payloadSize, dataSize);
_congestionControl->onPacketSent(dataSize, seqNum);
_congestionControl->onPacketSent(dataSize, seqNum, timePoint);
}
void Connection::recordRetransmission(int packetSize, SequenceNumber seqNum) {
void Connection::recordRetransmission(int packetSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint) {
_stats.record(ConnectionStats::Stats::Retransmission);
_congestionControl->onPacketSent(packetSize, seqNum);
_congestionControl->onPacketSent(packetSize, seqNum, timePoint);
}
void Connection::sendACK(bool wasCausedBySyncTimeout) {

View file

@ -87,8 +87,8 @@ signals:
void receiverHandshakeRequestComplete(const HifiSockAddr& sockAddr);
private slots:
void recordSentPackets(int dataSize, int payloadSize, SequenceNumber seqNum);
void recordRetransmission(int packetSize, SequenceNumber sequenceNumber);
void recordSentPackets(int dataSize, int payloadSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint);
void recordRetransmission(int packetSize, SequenceNumber sequenceNumber, p_high_resolution_clock::time_point timePoint);
void queueInactive();
void queueTimeout();
void queueShortCircuitLoss(quint32 sequenceNumber);

View file

@ -256,7 +256,7 @@ bool SendQueue::sendNewPacketAndAddToSentList(std::unique_ptr<Packet> newPacket,
}
Q_ASSERT_X(!newPacket, "SendQueue::sendNewPacketAndAddToSentList()", "Overriden packet in sent list");
emit packetSent(packetSize, payloadSize, sequenceNumber);
emit packetSent(packetSize, payloadSize, sequenceNumber, p_high_resolution_clock::now());
if (bytesWritten < 0) {
// this is a short-circuit loss - we failed to put this packet on the wire
@ -492,7 +492,7 @@ bool SendQueue::maybeResendPacket() {
sentLocker.unlock();
}
emit packetRetransmitted(resendPacket.getWireSize(), it->first);
emit packetRetransmitted(resendPacket.getWireSize(), it->first, p_high_resolution_clock::now());
// Signal that we did resend a packet
return true;

View file

@ -74,8 +74,8 @@ public slots:
void handshakeACK(SequenceNumber initialSequenceNumber);
signals:
void packetSent(int dataSize, int payloadSize, SequenceNumber seqNum);
void packetRetransmitted(int dataSize, SequenceNumber seqNum);
void packetSent(int dataSize, int payloadSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint);
void packetRetransmitted(int dataSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint);
void queueInactive();

View file

@ -11,6 +11,7 @@
#include "TCPVegasCC.h"
#include <QtCore/QDebug>
#include <QtCore/QtGlobal>
using namespace udt;
@ -65,6 +66,10 @@ void TCPVegasCC::performCongestionAvoidance(udt::SequenceNumber ack, int numAcke
static const int VEGAS_BETA_SEGMENTS = 4;
static const int VEGAS_GAMMA_SEGMENTS = 1;
qDebug() << "============";
qDebug() << "PCA" << _numRTT;
qDebug() << "CWS:" << _congestionWindowSize << "SS:" << _sendSlowStartThreshold;
if (_numRTT < VEGAS_MIN_RTT_FOR_CALC) {
// Vegas calculations are only done if there are enough RTT samples to be
// pretty sure that at least one sample did not come from a delayed ACK.
@ -83,6 +88,10 @@ void TCPVegasCC::performCongestionAvoidance(udt::SequenceNumber ack, int numAcke
int expectedWindowSize = _congestionWindowSize * _baseRTT / rtt;
int diff = _congestionWindowSize * (rtt - _baseRTT) / _baseRTT;
qDebug() << "BRTT:" << _baseRTT << "CRTT:" << _currentMinRTT;
qDebug() << "EWS" << expectedWindowSize;
qDebug() << "D:" << diff;
bool inWindowReduction = false;
if (diff > VEGAS_GAMMA_SEGMENTS && isInSlowStart()) {
@ -130,10 +139,13 @@ void TCPVegasCC::performCongestionAvoidance(udt::SequenceNumber ack, int numAcke
_currentMinRTT = std::numeric_limits<int>::max();
_numRTT = 0;
}
qDebug() << "CW:" << _congestionWindowSize << "SS:" << _sendSlowStartThreshold;
qDebug() << "============";
}
void TCPVegasCC::onPacketSent(int packetSize, SequenceNumber seqNum) {
_sentPacketTimes[seqNum] = { p_high_resolution_clock::now(), packetSize };
void TCPVegasCC::onPacketSent(int packetSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint) {
_sentPacketTimes[seqNum] = { timePoint, packetSize };
}

View file

@ -31,9 +31,10 @@ public:
virtual void onACK(SequenceNumber ackNum) override;
virtual void onLoss(SequenceNumber rangeStart, SequenceNumber rangeEnd) override {};
virtual void onTimeout() override {};
virtual void onPacketSent(int packetSize, SequenceNumber seqNum) override;
virtual bool shouldNAK() { return false; }
virtual void onPacketSent(int packetSize, SequenceNumber seqNum, p_high_resolution_clock::time_point timePoint) override;
protected:
virtual void performCongestionAvoidance(SequenceNumber ack, int numAcked) override;