diff options
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r-- | OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs | 60 |
1 files changed, 29 insertions, 31 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs index a889110..093e51f 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs | |||
@@ -276,46 +276,44 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
276 | lock (m_NeedAck) | 276 | lock (m_NeedAck) |
277 | { | 277 | { |
278 | if (m_DropSafeTimeout > now || | 278 | if (m_DropSafeTimeout > now || |
279 | intervalMs > 500) // We were frozen! | 279 | intervalMs > 500) // We were frozen! |
280 | { | 280 | { |
281 | foreach (LLQueItem data in new List<LLQueItem> | 281 | foreach (LLQueItem data in m_NeedAck.Values) |
282 | (m_NeedAck.Values)) | ||
283 | { | 282 | { |
284 | if (m_DropSafeTimeout > now) | 283 | if (m_DropSafeTimeout > now) |
285 | { | 284 | { |
286 | m_NeedAck[data.Packet.Header.Sequence]. | 285 | m_NeedAck[data.Packet.Header.Sequence].TickCount = now; |
287 | TickCount = now; | ||
288 | } | 286 | } |
289 | else | 287 | else |
290 | { | 288 | { |
291 | m_NeedAck[data.Packet.Header.Sequence]. | 289 | m_NeedAck[data.Packet.Header.Sequence].TickCount += intervalMs; |
292 | TickCount += intervalMs; | ||
293 | } | 290 | } |
294 | } | 291 | } |
295 | } | 292 | } |
296 | } | ||
297 | m_LastResend = now; | ||
298 | 293 | ||
299 | // Unless we have received at least one ack, don't bother resending | 294 | m_LastResend = now; |
300 | // anything. There may not be a client there, don't clog up the | 295 | |
301 | // pipes. | 296 | // Unless we have received at least one ack, don't bother resending |
302 | // | 297 | // anything. There may not be a client there, don't clog up the |
303 | lock (m_NeedAck) | 298 | // pipes. |
304 | { | 299 | |
300 | |||
305 | // Nothing to do | 301 | // Nothing to do |
306 | // | 302 | // |
307 | if (m_NeedAck.Count == 0) | 303 | if (m_NeedAck.Count == 0) |
308 | return; | 304 | return; |
309 | 305 | ||
310 | int resent = 0; | 306 | int resent = 0; |
307 | long dueDate = now - m_ResendTimeout; | ||
311 | 308 | ||
312 | foreach (LLQueItem data in new List<LLQueItem>(m_NeedAck.Values)) | 309 | List<LLQueItem> dropped = new List<LLQueItem>(); |
310 | foreach (LLQueItem data in m_NeedAck.Values) | ||
313 | { | 311 | { |
314 | Packet packet = data.Packet; | 312 | Packet packet = data.Packet; |
315 | 313 | ||
316 | // Packets this old get resent | 314 | // Packets this old get resent |
317 | // | 315 | // |
318 | if ((now - data.TickCount) > m_ResendTimeout && data.Sequence != 0 && !m_PacketQueue.Contains(data.Sequence)) | 316 | if (data.TickCount < dueDate && data.Sequence != 0 && !m_PacketQueue.Contains(data.Sequence)) |
319 | { | 317 | { |
320 | if (resent < 20) // Was 20 (= Max 117kbit/sec resends) | 318 | if (resent < 20) // Was 20 (= Max 117kbit/sec resends) |
321 | { | 319 | { |
@@ -325,31 +323,31 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
325 | // that it should reset its sequence to that packet number. | 323 | // that it should reset its sequence to that packet number. |
326 | packet.Header.Resent = true; | 324 | packet.Header.Resent = true; |
327 | 325 | ||
328 | if ((m_NeedAck[packet.Header.Sequence].Resends >= | 326 | if ((m_NeedAck[packet.Header.Sequence].Resends >= m_MaxReliableResends) && |
329 | m_MaxReliableResends) && (!m_ReliableIsImportant)) | 327 | (!m_ReliableIsImportant)) |
330 | { | 328 | { |
331 | m_NeedAck.Remove(packet.Header.Sequence); | 329 | dropped.Add(data); |
332 | TriggerOnPacketDrop(packet, data.Identifier); | ||
333 | m_PacketQueue.Cancel(packet.Header.Sequence); | ||
334 | PacketPool.Instance.ReturnPacket(packet); | ||
335 | continue; | 330 | continue; |
336 | } | 331 | } |
337 | 332 | ||
338 | m_NeedAck[packet.Header.Sequence].TickCount = | 333 | m_NeedAck[packet.Header.Sequence].TickCount = Environment.TickCount; |
339 | Environment.TickCount; | 334 | QueuePacket(packet, ThrottleOutPacketType.Resend, data.Identifier); |
340 | |||
341 | QueuePacket(packet, ThrottleOutPacketType.Resend, | ||
342 | data.Identifier); | ||
343 | |||
344 | resent++; | 335 | resent++; |
345 | } | 336 | } |
346 | else | 337 | else |
347 | { | 338 | { |
348 | m_NeedAck[packet.Header.Sequence].TickCount += | 339 | m_NeedAck[packet.Header.Sequence].TickCount += intervalMs; |
349 | intervalMs; | ||
350 | } | 340 | } |
351 | } | 341 | } |
352 | } | 342 | } |
343 | |||
344 | foreach(LLQueItem data in dropped) | ||
345 | { | ||
346 | m_NeedAck.Remove(data.Packet.Header.Sequence); | ||
347 | TriggerOnPacketDrop(data.Packet, data.Identifier); | ||
348 | m_PacketQueue.Cancel(data.Packet.Header.Sequence); | ||
349 | PacketPool.Instance.ReturnPacket(data.Packet); | ||
350 | } | ||
353 | } | 351 | } |
354 | } | 352 | } |
355 | 353 | ||