From 2c7112e9a828f81a9d36936d4027da4c025b09fc Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 17 Feb 2016 10:53:23 -0800 Subject: [PATCH] add initial send sequence number to SendQueue --- libraries/networking/src/udt/Connection.cpp | 6 +----- libraries/networking/src/udt/Connection.h | 6 +++--- libraries/networking/src/udt/SendQueue.cpp | 24 +++++++++++++++------ libraries/networking/src/udt/SendQueue.h | 7 +++--- 4 files changed, 26 insertions(+), 17 deletions(-) diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index 3b5b26d05d..f733d58869 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -87,7 +87,7 @@ SendQueue& Connection::getSendQueue() { // receiver is getting the sequence numbers it expects (given that the connection must still be active) // Lasily create send queue - _sendQueue = SendQueue::create(_parentSocket, _destination, _inactiveSendQueueSequenceNumber); + _sendQueue = SendQueue::create(_parentSocket, _destination); #ifdef UDT_CONNECTION_DEBUG qCDebug(networking) << "Created SendQueue for connection to" << _destination; @@ -109,10 +109,6 @@ SendQueue& Connection::getSendQueue() { } void Connection::queueInactive() { - // get the current sequence number from the send queue, this is to be re-used if the send - // queue is re-activated for this connection - _inactiveSendQueueSequenceNumber = _sendQueue->getCurrentSequenceNumber(); - // tell our current send queue to go down and reset our ptr to it to null stopSendQueue(); diff --git a/libraries/networking/src/udt/Connection.h b/libraries/networking/src/udt/Connection.h index b58b7ec570..bf56a468aa 100644 --- a/libraries/networking/src/udt/Connection.h +++ b/libraries/networking/src/udt/Connection.h @@ -130,7 +130,9 @@ private: bool _isReceivingData { false }; // flag used for expiry of receipt portion of connection bool _isActive { true }; // flag used for inactivity of connection - + + SequenceNumber _initialReceiveSequenceNumber; // Randomized by peer SendQueue on creation, identifies connection during re-connect requests + LossList _lossList; // List of all missing packets SequenceNumber _lastReceivedSequenceNumber; // The largest sequence number received from the peer SequenceNumber _lastReceivedACK; // The last ACK received @@ -140,8 +142,6 @@ private: SequenceNumber _lastSentACK; // The last sent ACK SequenceNumber _lastSentACK2; // The last sent ACK sub-sequence number in an ACK2 - SequenceNumber _inactiveSendQueueSequenceNumber { 0 }; - int _acksDuringSYN { 1 }; // The number of non-SYN ACKs sent during SYN int _lightACKsDuringSYN { 1 }; // The number of lite ACKs sent during SYN interval diff --git a/libraries/networking/src/udt/SendQueue.cpp b/libraries/networking/src/udt/SendQueue.cpp index 18269d1d43..8a8105bb26 100644 --- a/libraries/networking/src/udt/SendQueue.cpp +++ b/libraries/networking/src/udt/SendQueue.cpp @@ -12,6 +12,7 @@ #include "SendQueue.h" #include +#include #include #include @@ -53,10 +54,10 @@ private: Mutex2& _mutex2; }; -std::unique_ptr SendQueue::create(Socket* socket, HifiSockAddr destination, SequenceNumber currentSequenceNumber) { +std::unique_ptr SendQueue::create(Socket* socket, HifiSockAddr destination) { Q_ASSERT_X(socket, "SendQueue::create", "Must be called with a valid Socket*"); - auto queue = std::unique_ptr(new SendQueue(socket, destination, currentSequenceNumber)); + auto queue = std::unique_ptr(new SendQueue(socket, destination)); // Setup queue private thread QThread* thread = new QThread; @@ -75,12 +76,23 @@ std::unique_ptr SendQueue::create(Socket* socket, HifiSockAddr destin return queue; } -SendQueue::SendQueue(Socket* socket, HifiSockAddr dest, SequenceNumber currentSequenceNumber) : +SendQueue::SendQueue(Socket* socket, HifiSockAddr dest) : _socket(socket), - _destination(dest), - _currentSequenceNumber(currentSequenceNumber) + _destination(dest) { - + + // setup psuedo-random number generation for all instances of SendQueue + static std::random_device rd; + static std::mt19937 generator(rd()); + static std::uniform_int_distribution<> distribution(0, SequenceNumber::MAX); + + // randomize the intial sequence number + _initialSequenceNumber = SequenceNumber(distribution(generator)); + + // set our member variables from randomized initial number + _currentSequenceNumber = _initialSequenceNumber - 1; + _atomicCurrentSequenceNumber = uint32_t(_currentSequenceNumber); + _lastACKSequenceNumber = uint32_t(_initialSequenceNumber); } void SendQueue::queuePacket(std::unique_ptr packet) { diff --git a/libraries/networking/src/udt/SendQueue.h b/libraries/networking/src/udt/SendQueue.h index da8f5e6c3f..29ad7c6d73 100644 --- a/libraries/networking/src/udt/SendQueue.h +++ b/libraries/networking/src/udt/SendQueue.h @@ -50,8 +50,7 @@ public: Stopped }; - static std::unique_ptr create(Socket* socket, HifiSockAddr destination, - SequenceNumber currentSequenceNumber = SequenceNumber()); + static std::unique_ptr create(Socket* socket, HifiSockAddr destination); void queuePacket(std::unique_ptr packet); void queuePacketList(std::unique_ptr packetList); @@ -84,7 +83,7 @@ private slots: void run(); private: - SendQueue(Socket* socket, HifiSockAddr dest, SequenceNumber currentSequenceNumber); + SendQueue(Socket* socket, HifiSockAddr dest); SendQueue(SendQueue& other) = delete; SendQueue(SendQueue&& other) = delete; @@ -106,6 +105,8 @@ private: Socket* _socket { nullptr }; // Socket to send packet on HifiSockAddr _destination; // Destination addr + + SequenceNumber _initialSequenceNumber; // Randomized on SendQueue creation, identifies connection during re-connect requests std::atomic _lastACKSequenceNumber { 0 }; // Last ACKed sequence number