diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index bd8273dbdf..34923be382 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -153,6 +153,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// Flag to signal when clients should send pings
private bool m_sendPing;
+ private ExpiringCache> m_pendingCache = new ExpiringCache>();
+
private int m_defaultRTO = 0;
private int m_maxRTO = 0;
@@ -701,6 +703,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
{
object[] array = new object[] { buffer, packet };
+ lock (m_pendingCache)
+ m_pendingCache.AddOrUpdate(address, new Queue(), 60);
Util.FireAndForget(HandleUseCircuitCode, array);
return;
@@ -710,6 +714,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
IClientAPI client;
if (!m_scene.TryGetClient(address, out client) || !(client is LLClientView))
{
+ lock (m_pendingCache)
+ {
+ Queue queue;
+ if (m_pendingCache.TryGetValue(address, out queue))
+ queue.Enqueue(buffer);
+ }
+
// m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName);
return;
}
@@ -943,6 +954,27 @@ namespace OpenSim.Region.ClientStack.LindenUDP
// We only want to send initial data to new clients, not ones which are being converted from child to root.
if (client != null)
client.SceneAgent.SendInitialDataToMe();
+
+ // Now we know we can handle more data
+ Thread.Sleep(200);
+
+ // Obtain the queue and remove it from the cache
+ Queue queue = null;
+
+ lock (m_pendingCache)
+ {
+ if (!m_pendingCache.TryGetValue(remoteEndPoint, out queue))
+ return;
+ m_pendingCache.Remove(remoteEndPoint);
+ }
+
+ // Reinject queued packets
+ while(queue.Count > 0)
+ {
+ UDPPacketBuffer buf = queue.Dequeue();
+ PacketReceived(buf);
+ }
+ queue = null;
}
else
{
@@ -950,6 +982,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
m_log.WarnFormat(
"[LLUDPSERVER]: Connection request for client {0} connecting with unnotified circuit code {1} from {2}",
uccp.CircuitCode.ID, uccp.CircuitCode.Code, remoteEndPoint);
+ lock (m_pendingCache)
+ m_pendingCache.Remove(remoteEndPoint);
}
// m_log.DebugFormat(