From c5c35b7e89d8631fa0441b6d859d2e040ed2065b Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 18 Mar 2016 16:30:19 -0700 Subject: [PATCH 1/3] Add HandshakeRequest packet --- libraries/networking/src/udt/Connection.cpp | 21 ++++++++++++++++++- .../networking/src/udt/ControlPacket.cpp | 2 +- libraries/networking/src/udt/ControlPacket.h | 3 ++- libraries/networking/src/udt/SendQueue.cpp | 2 +- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index e6a15aa6a0..a7a3dc3902 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -408,7 +408,15 @@ SequenceNumber Connection::nextACK() const { bool Connection::processReceivedSequenceNumber(SequenceNumber sequenceNumber, int packetSize, int payloadSize) { if (!_hasReceivedHandshake) { - // refuse to process any packets until we've received the handshake + // Refuse to process any packets until we've received the handshake + // Send handshake request to re-request a handshake + static auto handshakeRequestPacket = ControlPacket::create(ControlPacket::HandshakeRequest, 0); + _parentSocket->writeBasePacket(*handshakeRequestPacket, _destination); + +#ifdef UDT_CONNECTION_DEBUG + qCDebug(networking) << "Received packet before receiving handshake, sending HandshakeRequest"; +#endif + return false; } @@ -534,6 +542,17 @@ void Connection::processControl(std::unique_ptr controlPacket) { processProbeTail(move(controlPacket)); } break; + case ControlPacket::HandshakeRequest: + if (_hasReceivedHandshakeACK) { + // We're already in a state where we've received a handshake ack, so we are likely in a state + // where the other end expired our connection. Let's reset. + +#ifdef UDT_CONNECTION_DEBUG + qCDebug(networking) << "Got handshake request, stopping SendQueue"; +#endif + stopSendQueue(); + } + break; } } diff --git a/libraries/networking/src/udt/ControlPacket.cpp b/libraries/networking/src/udt/ControlPacket.cpp index e672ab426b..0d5d3e8c25 100644 --- a/libraries/networking/src/udt/ControlPacket.cpp +++ b/libraries/networking/src/udt/ControlPacket.cpp @@ -100,7 +100,7 @@ void ControlPacket::readType() { Q_ASSERT_X(bitAndType & CONTROL_BIT_MASK, "ControlPacket::readHeader()", "This should be a control packet"); uint16_t packetType = (bitAndType & ~CONTROL_BIT_MASK) >> (8 * sizeof(Type)); - Q_ASSERT_X(packetType <= ControlPacket::Type::ProbeTail, "ControlPacket::readType()", "Received a control packet with wrong type"); + Q_ASSERT_X(packetType <= ControlPacket::Type::HandshakeRequest, "ControlPacket::readType()", "Received a control packet with wrong type"); // read the type _type = (Type) packetType; diff --git a/libraries/networking/src/udt/ControlPacket.h b/libraries/networking/src/udt/ControlPacket.h index fea8210ba0..3c770de9bb 100644 --- a/libraries/networking/src/udt/ControlPacket.h +++ b/libraries/networking/src/udt/ControlPacket.h @@ -34,7 +34,8 @@ public: TimeoutNAK, Handshake, HandshakeACK, - ProbeTail + ProbeTail, + HandshakeRequest }; static std::unique_ptr create(Type type, qint64 size = -1); diff --git a/libraries/networking/src/udt/SendQueue.cpp b/libraries/networking/src/udt/SendQueue.cpp index 5c6db5adf3..5fbe233c7a 100644 --- a/libraries/networking/src/udt/SendQueue.cpp +++ b/libraries/networking/src/udt/SendQueue.cpp @@ -525,4 +525,4 @@ void SendQueue::deactivate() { emit queueInactive(); _state = State::Stopped; -} +} \ No newline at end of file From b7678f9818f5cf6647f2e8c145e1c6450d1bdd98 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 18 Mar 2016 16:33:00 -0700 Subject: [PATCH 2/3] Remove accidental addition of whitespace --- libraries/networking/src/udt/SendQueue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/SendQueue.cpp b/libraries/networking/src/udt/SendQueue.cpp index 5fbe233c7a..6845720dc8 100644 --- a/libraries/networking/src/udt/SendQueue.cpp +++ b/libraries/networking/src/udt/SendQueue.cpp @@ -525,4 +525,4 @@ void SendQueue::deactivate() { emit queueInactive(); _state = State::Stopped; -} \ No newline at end of file +} \ No newline at end of file From c515355cfff89f27c43b9e4bb9640c15f3c16049 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Mon, 21 Mar 2016 14:07:15 -0700 Subject: [PATCH 3/3] Fix handshakeRequestPacket not being thread safe --- libraries/networking/src/udt/Connection.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/networking/src/udt/Connection.cpp b/libraries/networking/src/udt/Connection.cpp index a7a3dc3902..a9923d8486 100644 --- a/libraries/networking/src/udt/Connection.cpp +++ b/libraries/networking/src/udt/Connection.cpp @@ -410,7 +410,7 @@ bool Connection::processReceivedSequenceNumber(SequenceNumber sequenceNumber, in if (!_hasReceivedHandshake) { // Refuse to process any packets until we've received the handshake // Send handshake request to re-request a handshake - static auto handshakeRequestPacket = ControlPacket::create(ControlPacket::HandshakeRequest, 0); + auto handshakeRequestPacket = ControlPacket::create(ControlPacket::HandshakeRequest, 0); _parentSocket->writeBasePacket(*handshakeRequestPacket, _destination); #ifdef UDT_CONNECTION_DEBUG