Don't append ACKs to zerocoded packets. Although this should fine in theory, I'm seeing the viewer ignore or fail to parse ACKs appended to our zerocoded packets. This should cut down on viewer->sim resend traffic

slimupdates
John Hurliman 2010-04-02 16:25:14 -07:00
parent a895de4414
commit 35c82a31db
1 changed files with 20 additions and 15 deletions

View File

@ -513,6 +513,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
byte flags = buffer.Data[0]; byte flags = buffer.Data[0];
bool isResend = (flags & Helpers.MSG_RESENT) != 0; bool isResend = (flags & Helpers.MSG_RESENT) != 0;
bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0; bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0;
bool isZerocoded = (flags & Helpers.MSG_ZEROCODED) != 0;
LLUDPClient udpClient = outgoingPacket.Client; LLUDPClient udpClient = outgoingPacket.Client;
if (!udpClient.IsConnected) if (!udpClient.IsConnected)
@ -522,23 +523,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
int dataLength = buffer.DataLength; int dataLength = buffer.DataLength;
// Keep appending ACKs until there is no room left in the buffer or there are // NOTE: I'm seeing problems with some viewers when ACKs are appended to zerocoded packets so I've disabled that here
// no more ACKs to append if (!isZerocoded)
uint ackCount = 0;
uint ack;
while (dataLength + 5 < buffer.Data.Length && udpClient.PendingAcks.Dequeue(out ack))
{ {
Utils.UIntToBytesBig(ack, buffer.Data, dataLength); // Keep appending ACKs until there is no room left in the buffer or there are
dataLength += 4; // no more ACKs to append
++ackCount; uint ackCount = 0;
} uint ack;
while (dataLength + 5 < buffer.Data.Length && udpClient.PendingAcks.Dequeue(out ack))
{
Utils.UIntToBytesBig(ack, buffer.Data, dataLength);
dataLength += 4;
++ackCount;
}
if (ackCount > 0) if (ackCount > 0)
{ {
// Set the last byte of the packet equal to the number of appended ACKs // Set the last byte of the packet equal to the number of appended ACKs
buffer.Data[dataLength++] = (byte)ackCount; buffer.Data[dataLength++] = (byte)ackCount;
// Set the appended ACKs flag on this packet // Set the appended ACKs flag on this packet
buffer.Data[0] = (byte)(buffer.Data[0] | Helpers.MSG_APPENDED_ACKS); buffer.Data[0] = (byte)(buffer.Data[0] | Helpers.MSG_APPENDED_ACKS);
}
} }
buffer.DataLength = dataLength; buffer.DataLength = dataLength;