fix nack packet sending in OctreeInboundPacketProcessor

This commit is contained in:
Stephen Birarda 2015-07-07 11:28:57 -07:00
parent 1797c21890
commit 474b82e3bf

View file

@ -94,7 +94,7 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin
if (_myServer->getOctree()->handlesEditPacketType(packetType)) { if (_myServer->getOctree()->handlesEditPacketType(packetType)) {
PerformanceWarning warn(debugProcessPacket, "processPacket KNOWN TYPE",debugProcessPacket); PerformanceWarning warn(debugProcessPacket, "processPacket KNOWN TYPE",debugProcessPacket);
_receivedPacketCount++; _receivedPacketCount++;
const unsigned char* packetData = reinterpret_cast<const unsigned char*>(packet.data()); const unsigned char* packetData = reinterpret_cast<const unsigned char*>(packet.data());
unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader))); unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader)));
@ -120,16 +120,16 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin
qDebug() << " arrivedAt=" << arrivedAt << " usecs"; qDebug() << " arrivedAt=" << arrivedAt << " usecs";
qDebug() << " transitTime=" << transitTime << " usecs"; qDebug() << " transitTime=" << transitTime << " usecs";
qDebug() << " sendingNode->getClockSkewUsec()=" << sendingNode->getClockSkewUsec() << " usecs"; qDebug() << " sendingNode->getClockSkewUsec()=" << sendingNode->getClockSkewUsec() << " usecs";
} }
if (debugProcessPacket) { if (debugProcessPacket) {
qDebug() << " numBytesPacketHeader=" << numBytesPacketHeader; qDebug() << " numBytesPacketHeader=" << numBytesPacketHeader;
qDebug() << " sizeof(sequence)=" << sizeof(sequence); qDebug() << " sizeof(sequence)=" << sizeof(sequence);
qDebug() << " sizeof(sentAt)=" << sizeof(sentAt); qDebug() << " sizeof(sentAt)=" << sizeof(sentAt);
} }
int atByte = numBytesPacketHeader + sizeof(sequence) + sizeof(sentAt); int atByte = numBytesPacketHeader + sizeof(sequence) + sizeof(sentAt);
if (debugProcessPacket) { if (debugProcessPacket) {
@ -139,11 +139,11 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin
qDebug() << " ----- UNEXPECTED ---- got a packet without any edit details!!!! --------"; qDebug() << " ----- UNEXPECTED ---- got a packet without any edit details!!!! --------";
} }
} }
unsigned char* editData = (unsigned char*)&packetData[atByte]; unsigned char* editData = (unsigned char*)&packetData[atByte];
while (atByte < packet.size()) { while (atByte < packet.size()) {
int maxSize = packet.size() - atByte; int maxSize = packet.size() - atByte;
if (debugProcessPacket) { if (debugProcessPacket) {
@ -242,8 +242,8 @@ int OctreeInboundPacketProcessor::sendNackPackets() {
return packetsSent; return packetsSent;
} }
char packet[MAX_PACKET_SIZE]; auto nackPacket { NLPacket::create(_myServer->getMyEditNackType(); }
NodeToSenderStatsMapIterator i = _singleSenderStats.begin(); NodeToSenderStatsMapIterator i = _singleSenderStats.begin();
while (i != _singleSenderStats.end()) { while (i != _singleSenderStats.end()) {
@ -268,44 +268,36 @@ int OctreeInboundPacketProcessor::sendNackPackets() {
// retrieve sequence number stats of node, prune its missing set // retrieve sequence number stats of node, prune its missing set
SequenceNumberStats& sequenceNumberStats = nodeStats.getIncomingEditSequenceNumberStats(); SequenceNumberStats& sequenceNumberStats = nodeStats.getIncomingEditSequenceNumberStats();
sequenceNumberStats.pruneMissingSet(); sequenceNumberStats.pruneMissingSet();
// construct nack packet(s) for this node // construct nack packet(s) for this node
const QSet<unsigned short int>& missingSequenceNumbers = sequenceNumberStats.getMissingSet(); const QSet<unsigned short int>& missingSequenceNumbers = sequenceNumberStats.getMissingSet();
int numSequenceNumbersAvailable = missingSequenceNumbers.size(); int numSequenceNumbersAvailable = missingSequenceNumbers.size();
QSet<unsigned short int>::const_iterator missingSequenceNumberIterator = missingSequenceNumbers.constBegin(); QSet<unsigned short int>::const_iterator missingSequenceNumberIterator = missingSequenceNumbers.constBegin();
while (numSequenceNumbersAvailable > 0) { while (numSequenceNumbersAvailable > 0) {
char* dataAt = packet;
int bytesRemaining = MAX_PACKET_SIZE;
auto nodeList = DependencyManager::get<NodeList>(); auto nodeList = DependencyManager::get<NodeList>();
// pack header nackPacket->reset();
int numBytesPacketHeader = nodeList->populatePacketHeader(packet, _myServer->getMyEditNackType());
dataAt += numBytesPacketHeader;
bytesRemaining -= numBytesPacketHeader;
// calculate and pack the number of sequence numbers to nack // calculate and pack the number of sequence numbers to nack
int numSequenceNumbersRoomFor = (bytesRemaining - sizeof(uint16_t)) / sizeof(unsigned short int); int numSequenceNumbersRoomFor = (nackPacket->getCapacity() - sizeof(uint16_t)) / sizeof(unsigned short int);
uint16_t numSequenceNumbers = std::min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor); uint16_t numSequenceNumbers = std::min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor);
uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt;
*numSequenceNumbersAt = numSequenceNumbers; nackPacket->write(&numSequenceNumbers, sizeof(numSequenceNumbers));
dataAt += sizeof(uint16_t);
// pack sequence numbers to nack // pack sequence numbers to nack
for (uint16_t i = 0; i < numSequenceNumbers; i++) { for (uint16_t i = 0; i < numSequenceNumbers; i++) {
unsigned short int* sequenceNumberAt = (unsigned short int*)dataAt; unsigned short int sequenceNumber = *missingSequenceNumberIterator;
*sequenceNumberAt = *missingSequenceNumberIterator; nackPacket->write(&sequenceNumber, sizeof(sequenceNumber));
dataAt += sizeof(unsigned short int);
missingSequenceNumberIterator++; missingSequenceNumberIterator++;
} }
numSequenceNumbersAvailable -= numSequenceNumbers; numSequenceNumbersAvailable -= numSequenceNumbers;
// send it // send it
nodeList->writeUnverifiedDatagram(packet, dataAt - packet, destinationNode); nodeList->sendUnreliablePacket(nackPacket, destinationNode);
packetsSent++; packetsSent++;
qDebug() << "NACK Sent back to editor/client... destinationNode=" << nodeUUID; qDebug() << "NACK Sent back to editor/client... destinationNode=" << nodeUUID;
} }
i++; i++;