From 8424e91ae18d042dd881762f97e41b61c61df00b Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Thu, 16 Jul 2015 10:00:01 -0700 Subject: [PATCH] Added sequence number to packets --- libraries/networking/src/LimitedNodeList.cpp | 52 +++++++++++--------- libraries/networking/src/LimitedNodeList.h | 1 + libraries/networking/src/udt/Packet.h | 4 +- 3 files changed, 32 insertions(+), 25 deletions(-) diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 720bb2eee0..a43b8b089d 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -216,6 +216,20 @@ bool LimitedNodeList::packetSourceAndHashMatch(const NLPacket& packet, SharedNod return false; } +qint64 LimitedNodeList::writePacket(const NLPacket& packet, const Node& destinationNode) { + if (!destinationNode.getActiveSocket()) { + return 0; + } + + // TODO Move to transport layer when ready + if (SEQUENCE_NUMBERED_PACKETS.contains(packet.getType())) { + PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode.getUUID(), packet.getType()); + const_cast(packet).writeSequenceNumber(sequenceNumber); + } + + return writePacket(packet, *destinationNode.getActiveSocket(), destinationNode.getConnectionSecret()); +} + qint64 LimitedNodeList::writePacket(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, const QUuid& connectionSecret) { if (!NON_SOURCED_PACKETS.contains(packet.getType())) { @@ -248,14 +262,7 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, const HifiSock } qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const Node& destinationNode) { - const HifiSockAddr* activeSocket = destinationNode.getActiveSocket(); - if (!activeSocket) { - // we don't have a socket to send to, return 0 - return 0; - } - - // use the node's active socket as the destination socket - return sendUnreliablePacket(packet, *activeSocket, destinationNode.getConnectionSecret()); + return writePacket(packet, destinationNode); } qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const HifiSockAddr& sockAddr, @@ -264,30 +271,29 @@ qint64 LimitedNodeList::sendUnreliablePacket(const NLPacket& packet, const HifiS } qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const Node& destinationNode) { - const HifiSockAddr* activeSocket = destinationNode.getActiveSocket(); - if (!activeSocket) { - // we don't have a socket to send to, return 0 - return 0; - } - - // use the node's active socket as the destination socket - return sendPacket(std::move(packet), *activeSocket, destinationNode.getConnectionSecret()); + // Keep unique_ptr alive during write + auto result = writePacket(*packet, destinationNode); + return result; } qint64 LimitedNodeList::sendPacket(std::unique_ptr packet, const HifiSockAddr& sockAddr, const QUuid& connectionSecret) { - return writePacket(*packet, sockAddr, connectionSecret); + // Keep unique_ptr alive during write + auto result = writePacket(*packet, sockAddr, connectionSecret); + return result; } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const Node& destinationNode) { - const HifiSockAddr* activeSocket = destinationNode.getActiveSocket(); - if (!activeSocket) { - // we don't have a socket to send to, return 0 - return 0; + qint64 bytesSent = 0; + + // close the last packet in the list + packetList.closeCurrentPacket(); + + while (!packetList._packets.empty()) { + bytesSent += sendPacket(std::move(packetList.takeFront()), destinationNode); } - // use the node's active socket as the destination socket - return sendPacketList(packetList, *activeSocket, destinationNode.getConnectionSecret()); + return bytesSent; } qint64 LimitedNodeList::sendPacketList(NLPacketList& packetList, const HifiSockAddr& sockAddr, diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index a2cbac7348..f3acb81ef1 100644 --- a/libraries/networking/src/LimitedNodeList.h +++ b/libraries/networking/src/LimitedNodeList.h @@ -248,6 +248,7 @@ protected: LimitedNodeList(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton void operator=(LimitedNodeList const&); // Don't implement, needed to avoid copies of singleton + qint64 writePacket(const NLPacket& packet, const Node& destinationNode); qint64 writePacket(const NLPacket& packet, const HifiSockAddr& destinationSockAddr, const QUuid& connectionSecret = QUuid()); qint64 writeDatagram(const QByteArray& datagram, const HifiSockAddr& destinationSockAddr); diff --git a/libraries/networking/src/udt/Packet.h b/libraries/networking/src/udt/Packet.h index 1d499e2b00..740fa7f663 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -66,7 +66,8 @@ public: HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } const HifiSockAddr& getSenderSockAddr() const { return _senderSockAddr; } - + + void writeSequenceNumber(SequenceNumber seqNum); SequenceNumber readSequenceNumber() const; bool readIsControlPacket() const; @@ -98,7 +99,6 @@ protected: // Header writers void writePacketTypeAndVersion(PacketType::Value type); - void writeSequenceNumber(SequenceNumber seqNum); PacketType::Value _type; // Packet type PacketVersion _version; // Packet version