diff --git a/assignment-client/src/AssignmentClientMonitor.cpp b/assignment-client/src/AssignmentClientMonitor.cpp index 9190b9be3e..0a39d80a61 100644 --- a/assignment-client/src/AssignmentClientMonitor.cpp +++ b/assignment-client/src/AssignmentClientMonitor.cpp @@ -203,7 +203,7 @@ void AssignmentClientMonitor::checkSpares() { } void AssignmentClientMonitor::handleChildStatusPacket(QSharedPointer packet) { - QUuid senderID = QUuid::fromRfc4122(QByteArray::fromRawData(packet->getData(), NUM_BYTES_RFC4122_UUID)); + QUuid senderID = QUuid::fromRfc4122(QByteArray::fromRawData(packet->getPayload(), NUM_BYTES_RFC4122_UUID)); auto nodeList = DependencyManager::get(); diff --git a/assignment-client/src/avatars/AvatarMixerClientData.cpp b/assignment-client/src/avatars/AvatarMixerClientData.cpp index 00ec6ad220..de2e1ac143 100644 --- a/assignment-client/src/avatars/AvatarMixerClientData.cpp +++ b/assignment-client/src/avatars/AvatarMixerClientData.cpp @@ -15,7 +15,9 @@ int AvatarMixerClientData::parseData(NLPacket& packet) { // compute the offset to the data payload - return _avatar.parseDataFromBuffer(QByteArray::fromRawData(packet.getPayload(), packet.getPayloadSize())); + QByteArray byteArray = QByteArray::fromRawData(packet.getPayload() + packet.pos(), + packet.bytesLeftToRead()); + return _avatar.parseDataFromBuffer(byteArray); } bool AvatarMixerClientData::checkAndSetHasReceivedFirstPackets() { diff --git a/libraries/avatars/src/AvatarHashMap.cpp b/libraries/avatars/src/AvatarHashMap.cpp index 83706ee9f4..3243ff3f9a 100644 --- a/libraries/avatars/src/AvatarHashMap.cpp +++ b/libraries/avatars/src/AvatarHashMap.cpp @@ -61,6 +61,8 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, Sha while (packet->bytesLeftToRead()) { QUuid sessionUUID = QUuid::fromRfc4122(packet->read(NUM_BYTES_RFC4122_UUID)); + QByteArray byteArray = QByteArray::fromRawData(packet->getPayload() + packet->pos(), + packet->bytesLeftToRead()); if (sessionUUID != _lastOwnerSessionUUID) { AvatarSharedPointer avatar = _avatarHash.value(sessionUUID); if (!avatar) { @@ -68,12 +70,12 @@ void AvatarHashMap::processAvatarDataPacket(QSharedPointer packet, Sha } // have the matching (or new) avatar parse the data from the packet - int bytesRead = avatar->parseDataFromBuffer(QByteArray::fromRawData(packet->getPayload(), packet->getPayloadSize())); + int bytesRead = avatar->parseDataFromBuffer(byteArray); packet->seek(packet->pos() + bytesRead); } else { // create a dummy AvatarData class to throw this data on the ground AvatarData dummyData; - int bytesRead = dummyData.parseDataFromBuffer(QByteArray::fromRawData(packet->getPayload(), packet->getPayloadSize())); + int bytesRead = dummyData.parseDataFromBuffer(byteArray); packet->seek(packet->pos() + bytesRead); } } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 3f160bbaa0..dc82d3f4be 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, @@ -395,6 +401,7 @@ void LimitedNodeList::processKillNode(NLPacket& packet) { void LimitedNodeList::handleNodeKill(const SharedNodePointer& node) { qCDebug(networking) << "Killed" << *node; + node->stopPingTimer(); emit nodeKilled(node); } @@ -490,8 +497,8 @@ unsigned int LimitedNodeList::broadcastToNodes(std::unique_ptr packet, unsigned int n = 0; eachNode([&](const SharedNodePointer& node){ - if (node->getActiveSocket() && destinationNodeTypes.contains(node->getType())) { - writePacket(*packet, *node->getActiveSocket(), node->getConnectionSecret()); + if (node && destinationNodeTypes.contains(node->getType())) { + writePacket(*packet, *node); ++n; } }); diff --git a/libraries/networking/src/LimitedNodeList.h b/libraries/networking/src/LimitedNodeList.h index 7f0dd1eae9..a86db3629f 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 30157e21d2..4b3c82fa7b 100644 --- a/libraries/networking/src/udt/Packet.h +++ b/libraries/networking/src/udt/Packet.h @@ -68,7 +68,8 @@ public: HifiSockAddr& getSenderSockAddr() { return _senderSockAddr; } const HifiSockAddr& getSenderSockAddr() const { return _senderSockAddr; } - + + void writeSequenceNumber(SequenceNumber seqNum); SequenceNumber readSequenceNumber() const; bool readIsControlPacket() const; @@ -100,7 +101,6 @@ protected: // Header writers void writePacketTypeAndVersion(PacketType::Value type); - void writeSequenceNumber(SequenceNumber seqNum); PacketType::Value _type; // Packet type PacketVersion _version; // Packet version