mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 14:37:46 +02:00
fix nack packet sending in OctreeInboundPacketProcessor
This commit is contained in:
parent
1797c21890
commit
474b82e3bf
1 changed files with 18 additions and 26 deletions
|
@ -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++;
|
||||||
|
|
Loading…
Reference in a new issue