From 28aa8010b2b47b73c6b867ff8f6284f98f12f37a Mon Sep 17 00:00:00 2001
From: unknown
Date: Sun, 15 Nov 2009 21:38:38 +0100
Subject: - Lower TIME_MS_TOLERANCE to 200ms - Allow m_updateFlag to be reset
to 0 in the event of a terse update being rejected - Re-add a synchronous
SendTo for certain types of packets
---
.../Region/ClientStack/LindenUDP/LLUDPServer.cs | 24 ++++++++++++++++++++--
.../Region/ClientStack/LindenUDP/OpenSimUDPBase.cs | 18 ++++++++++++++++
.../Region/ClientStack/LindenUDP/OutgoingPacket.cs | 4 +++-
3 files changed, 43 insertions(+), 3 deletions(-)
(limited to 'OpenSim/Region/ClientStack/LindenUDP')
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index c773c05..0b05ed9 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -399,6 +399,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
#region Queue or Send
OutgoingPacket outgoingPacket = new OutgoingPacket(udpClient, buffer, category);
+ outgoingPacket.Type = type;
if (!outgoingPacket.Client.EnqueueOutgoing(outgoingPacket))
SendPacketFinal(outgoingPacket);
@@ -510,6 +511,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
byte flags = buffer.Data[0];
bool isResend = (flags & Helpers.MSG_RESENT) != 0;
bool isReliable = (flags & Helpers.MSG_RELIABLE) != 0;
+ bool sendSynchronous = false;
LLUDPClient udpClient = outgoingPacket.Client;
if (!udpClient.IsConnected)
@@ -565,9 +567,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
if (isReliable)
Interlocked.Add(ref udpClient.UnackedBytes, outgoingPacket.Buffer.DataLength);
- // Put the UDP payload on the wire
- AsyncBeginSend(buffer);
+ //Some packet types need to be sent synchonously.
+ //Sorry, i know it's not optimal, but until the LL client
+ //manages packets correctly and re-orders them as required, this is necessary.
+
+ if (outgoingPacket.Type == PacketType.ImprovedTerseObjectUpdate
+ || outgoingPacket.Type == PacketType.ChatFromSimulator
+ || outgoingPacket.Type == PacketType.ObjectUpdate
+ || outgoingPacket.Type == PacketType.LayerData)
+ {
+ sendSynchronous = true;
+ }
+ // Put the UDP payload on the wire
+ if (sendSynchronous == true)
+ {
+ SyncBeginSend(buffer);
+ }
+ else
+ {
+ AsyncBeginSend(buffer);
+ }
// Keep track of when this packet was sent out (right now)
outgoingPacket.TickCount = Environment.TickCount & Int32.MaxValue;
}
diff --git a/OpenSim/Region/ClientStack/LindenUDP/OpenSimUDPBase.cs b/OpenSim/Region/ClientStack/LindenUDP/OpenSimUDPBase.cs
index d2779ba..63579ac 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/OpenSimUDPBase.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/OpenSimUDPBase.cs
@@ -246,6 +246,24 @@ namespace OpenMetaverse
}
}
+ public void SyncBeginSend(UDPPacketBuffer buf)
+ {
+ if (!m_shutdownFlag)
+ {
+ try
+ {
+ m_udpSocket.SendTo(
+ buf.Data,
+ 0,
+ buf.DataLength,
+ SocketFlags.None,
+ buf.RemoteEndPoint);
+ }
+ catch (SocketException) { }
+ catch (ObjectDisposedException) { }
+ }
+ }
+
public void AsyncBeginSend(UDPPacketBuffer buf)
{
if (!m_shutdownFlag)
diff --git a/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs b/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs
index 1a1a1cb..7dc42d3 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/OutgoingPacket.cs
@@ -28,6 +28,7 @@
using System;
using OpenSim.Framework;
using OpenMetaverse;
+using OpenMetaverse.Packets;
namespace OpenSim.Region.ClientStack.LindenUDP
{
@@ -52,7 +53,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
public int TickCount;
/// Category this packet belongs to
public ThrottleOutPacketType Category;
-
+ /// The type of packet so its delivery method can be determined
+ public PacketType Type;
///
/// Default constructor
///
--
cgit v1.1