From ff676958e8ab8af43aedea008949647c9d34c067 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Wed, 6 May 2015 14:24:11 -0700 Subject: [PATCH] fix hash replacement in PacketHeaders --- assignment-client/src/avatars/AvatarMixer.cpp | 5 +++++ libraries/networking/src/LimitedNodeList.cpp | 5 ++--- libraries/networking/src/PacketHeaders.cpp | 21 ++++++++----------- libraries/networking/src/PacketHeaders.h | 1 + 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/assignment-client/src/avatars/AvatarMixer.cpp b/assignment-client/src/avatars/AvatarMixer.cpp index f87c7e31a7..3d0a71993a 100644 --- a/assignment-client/src/avatars/AvatarMixer.cpp +++ b/assignment-client/src/avatars/AvatarMixer.cpp @@ -259,12 +259,17 @@ void AvatarMixer::broadcastAvatarData() { PacketSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID()); PacketSequenceNumber lastSeqFromSender = otherNode->getLastSequenceNumberForPacketType(PacketTypeAvatarData); + + qDebug() << "Last sent to receiver" << node->getUUID() << "was" << lastSeqToReceiver; + qDebug() << "Last sent from sender" << otherNode->getUUID() << "was" << lastSeqFromSender; assert(lastSeqToReceiver <= lastSeqFromSender); // make sure we haven't already sent this data from this sender to this receiver // or that somehow we haven't sent if (lastSeqToReceiver == lastSeqFromSender) { + qDebug() << "Not sending a data for" << otherNode->getUUID() << "to" << node->getUUID() + << "since it has already been sent."; return; } diff --git a/libraries/networking/src/LimitedNodeList.cpp b/libraries/networking/src/LimitedNodeList.cpp index 0c4943b6ae..5d04122d19 100644 --- a/libraries/networking/src/LimitedNodeList.cpp +++ b/libraries/networking/src/LimitedNodeList.cpp @@ -267,15 +267,14 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram, PacketType packetType = packetTypeForPacket(datagramCopy); // perform replacement of hash and optionally also sequence number in the header - if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { + if (SEQUENCE_NUMBERED_PACKETS.contains(packetType)) { PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode->getUUID(), packetType); - qDebug() << "Sequence number for this packet is" << sequenceNumber; replaceHashAndSequenceNumberInPacket(datagramCopy, destinationNode->getConnectionSecret(), sequenceNumber, packetType); } else { replaceHashInPacket(datagramCopy, destinationNode->getConnectionSecret(), packetType); } - + emit dataSent(destinationNode->getType(), datagram.size()); auto bytesWritten = writeDatagram(datagramCopy, *destinationSockAddr, destinationNode->getConnectionSecret()); // Keep track of per-destination-node bandwidth diff --git a/libraries/networking/src/PacketHeaders.cpp b/libraries/networking/src/PacketHeaders.cpp index a4894e522e..a214c9c9c4 100644 --- a/libraries/networking/src/PacketHeaders.cpp +++ b/libraries/networking/src/PacketHeaders.cpp @@ -55,7 +55,7 @@ PacketVersion versionForPacketType(PacketType packetType) { case PacketTypeInjectAudio: return 1; case PacketTypeAvatarData: - return 5; + return 6; case PacketTypeAvatarIdentity: return 1; case PacketTypeEnvironmentData: @@ -188,8 +188,12 @@ int numBytesForPacketHeader(const char* packet) { return numBytesForPacketHeaderGivenPacketType(packetType); } +int numBytesForArithmeticCodedPacketType(PacketType packetType) { + return (int) ceilf((float) packetType / 255); +} + int numBytesForPacketHeaderGivenPacketType(PacketType packetType) { - return (int) ceilf((float) packetType / 255) + return numBytesForArithmeticCodedPacketType(packetType) + numHashBytesForType(packetType) + numSequenceNumberBytesForType(packetType) + NUM_STATIC_HEADER_BYTES; @@ -209,9 +213,7 @@ QUuid uuidFromPacketHeader(const QByteArray& packet) { } int hashOffsetForPacketType(PacketType packetType) { - return numBytesForPacketHeaderGivenPacketType(packetType) - - (SEQUENCE_NUMBERED_PACKETS.contains(packetType) ? sizeof(PacketSequenceNumber) : 0) - - NUM_BYTES_RFC4122_UUID; + return numBytesForArithmeticCodedPacketType(packetType) + NUM_STATIC_HEADER_BYTES; } int sequenceNumberOffsetForPacketType(PacketType packetType) { @@ -249,7 +251,7 @@ void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, Packet if (packetType == PacketTypeUnknown) { packetType = packetTypeForPacket(packet); } - + packet.replace(hashOffsetForPacketType(packetType), NUM_BYTES_MD5_HASH, hashForPacketAndConnectionUUID(packet, connectionUUID)); } @@ -260,14 +262,9 @@ void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequ } packet.replace(sequenceNumberOffsetForPacketType(packetType), - sizeof(PacketSequenceNumber), reinterpret_cast(&sequenceNumber)); + sizeof(PacketSequenceNumber), reinterpret_cast(&sequenceNumber), sizeof(PacketSequenceNumber)); } -void replaceHashAndSequenceNumberInPacketGivenType(QByteArray& packet, PacketType packetType, - const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber) { - -} - void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber, PacketType packetType) { if (packetType == PacketTypeUnknown) { diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 1cbf2df196..e057628924 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -122,6 +122,7 @@ int numSequenceNumberBytesForType(PacketType packetType); int numBytesForPacketHeader(const QByteArray& packet); int numBytesForPacketHeader(const char* packet); +int numBytesForArithmeticCodedPacketType(PacketType packetType); int numBytesForPacketHeaderGivenPacketType(PacketType packetType); QUuid uuidFromPacketHeader(const QByteArray& packet);