fix hash replacement in PacketHeaders

This commit is contained in:
Stephen Birarda 2015-05-06 14:24:11 -07:00
parent c5e189bbf2
commit ff676958e8
4 changed files with 17 additions and 15 deletions

View file

@ -259,12 +259,17 @@ void AvatarMixer::broadcastAvatarData() {
PacketSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID()); PacketSequenceNumber lastSeqToReceiver = nodeData->getLastBroadcastSequenceNumber(otherNode->getUUID());
PacketSequenceNumber lastSeqFromSender = otherNode->getLastSequenceNumberForPacketType(PacketTypeAvatarData); 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); assert(lastSeqToReceiver <= lastSeqFromSender);
// make sure we haven't already sent this data from this sender to this receiver // make sure we haven't already sent this data from this sender to this receiver
// or that somehow we haven't sent // or that somehow we haven't sent
if (lastSeqToReceiver == lastSeqFromSender) { if (lastSeqToReceiver == lastSeqFromSender) {
qDebug() << "Not sending a data for" << otherNode->getUUID() << "to" << node->getUUID()
<< "since it has already been sent.";
return; return;
} }

View file

@ -267,15 +267,14 @@ qint64 LimitedNodeList::writeDatagram(const QByteArray& datagram,
PacketType packetType = packetTypeForPacket(datagramCopy); PacketType packetType = packetTypeForPacket(datagramCopy);
// perform replacement of hash and optionally also sequence number in the header // 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); PacketSequenceNumber sequenceNumber = getNextSequenceNumberForPacket(destinationNode->getUUID(), packetType);
qDebug() << "Sequence number for this packet is" << sequenceNumber;
replaceHashAndSequenceNumberInPacket(datagramCopy, destinationNode->getConnectionSecret(), replaceHashAndSequenceNumberInPacket(datagramCopy, destinationNode->getConnectionSecret(),
sequenceNumber, packetType); sequenceNumber, packetType);
} else { } else {
replaceHashInPacket(datagramCopy, destinationNode->getConnectionSecret(), packetType); replaceHashInPacket(datagramCopy, destinationNode->getConnectionSecret(), packetType);
} }
emit dataSent(destinationNode->getType(), datagram.size()); emit dataSent(destinationNode->getType(), datagram.size());
auto bytesWritten = writeDatagram(datagramCopy, *destinationSockAddr, destinationNode->getConnectionSecret()); auto bytesWritten = writeDatagram(datagramCopy, *destinationSockAddr, destinationNode->getConnectionSecret());
// Keep track of per-destination-node bandwidth // Keep track of per-destination-node bandwidth

View file

@ -55,7 +55,7 @@ PacketVersion versionForPacketType(PacketType packetType) {
case PacketTypeInjectAudio: case PacketTypeInjectAudio:
return 1; return 1;
case PacketTypeAvatarData: case PacketTypeAvatarData:
return 5; return 6;
case PacketTypeAvatarIdentity: case PacketTypeAvatarIdentity:
return 1; return 1;
case PacketTypeEnvironmentData: case PacketTypeEnvironmentData:
@ -188,8 +188,12 @@ int numBytesForPacketHeader(const char* packet) {
return numBytesForPacketHeaderGivenPacketType(packetType); return numBytesForPacketHeaderGivenPacketType(packetType);
} }
int numBytesForArithmeticCodedPacketType(PacketType packetType) {
return (int) ceilf((float) packetType / 255);
}
int numBytesForPacketHeaderGivenPacketType(PacketType packetType) { int numBytesForPacketHeaderGivenPacketType(PacketType packetType) {
return (int) ceilf((float) packetType / 255) return numBytesForArithmeticCodedPacketType(packetType)
+ numHashBytesForType(packetType) + numHashBytesForType(packetType)
+ numSequenceNumberBytesForType(packetType) + numSequenceNumberBytesForType(packetType)
+ NUM_STATIC_HEADER_BYTES; + NUM_STATIC_HEADER_BYTES;
@ -209,9 +213,7 @@ QUuid uuidFromPacketHeader(const QByteArray& packet) {
} }
int hashOffsetForPacketType(PacketType packetType) { int hashOffsetForPacketType(PacketType packetType) {
return numBytesForPacketHeaderGivenPacketType(packetType) return numBytesForArithmeticCodedPacketType(packetType) + NUM_STATIC_HEADER_BYTES;
- (SEQUENCE_NUMBERED_PACKETS.contains(packetType) ? sizeof(PacketSequenceNumber) : 0)
- NUM_BYTES_RFC4122_UUID;
} }
int sequenceNumberOffsetForPacketType(PacketType packetType) { int sequenceNumberOffsetForPacketType(PacketType packetType) {
@ -249,7 +251,7 @@ void replaceHashInPacket(QByteArray& packet, const QUuid& connectionUUID, Packet
if (packetType == PacketTypeUnknown) { if (packetType == PacketTypeUnknown) {
packetType = packetTypeForPacket(packet); packetType = packetTypeForPacket(packet);
} }
packet.replace(hashOffsetForPacketType(packetType), NUM_BYTES_MD5_HASH, packet.replace(hashOffsetForPacketType(packetType), NUM_BYTES_MD5_HASH,
hashForPacketAndConnectionUUID(packet, connectionUUID)); hashForPacketAndConnectionUUID(packet, connectionUUID));
} }
@ -260,14 +262,9 @@ void replaceSequenceNumberInPacket(QByteArray& packet, PacketSequenceNumber sequ
} }
packet.replace(sequenceNumberOffsetForPacketType(packetType), packet.replace(sequenceNumberOffsetForPacketType(packetType),
sizeof(PacketSequenceNumber), reinterpret_cast<char*>(&sequenceNumber)); sizeof(PacketSequenceNumber), reinterpret_cast<char*>(&sequenceNumber), sizeof(PacketSequenceNumber));
} }
void replaceHashAndSequenceNumberInPacketGivenType(QByteArray& packet, PacketType packetType,
const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber) {
}
void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber, void replaceHashAndSequenceNumberInPacket(QByteArray& packet, const QUuid& connectionUUID, PacketSequenceNumber sequenceNumber,
PacketType packetType) { PacketType packetType) {
if (packetType == PacketTypeUnknown) { if (packetType == PacketTypeUnknown) {

View file

@ -122,6 +122,7 @@ int numSequenceNumberBytesForType(PacketType packetType);
int numBytesForPacketHeader(const QByteArray& packet); int numBytesForPacketHeader(const QByteArray& packet);
int numBytesForPacketHeader(const char* packet); int numBytesForPacketHeader(const char* packet);
int numBytesForArithmeticCodedPacketType(PacketType packetType);
int numBytesForPacketHeaderGivenPacketType(PacketType packetType); int numBytesForPacketHeaderGivenPacketType(PacketType packetType);
QUuid uuidFromPacketHeader(const QByteArray& packet); QUuid uuidFromPacketHeader(const QByteArray& packet);