aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs')
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs64
1 files changed, 36 insertions, 28 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs
index 4964efc..5f26469 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLPacketHandler.cs
@@ -99,8 +99,26 @@ namespace OpenSim.Region.ClientStack.LindenUDP
99 // 99 //
100 private Dictionary<uint, uint> m_PendingAcks = new Dictionary<uint, uint>(); 100 private Dictionary<uint, uint> m_PendingAcks = new Dictionary<uint, uint>();
101 101
102 private Dictionary<uint, LLQueItem> m_NeedAck = 102 // Dictionary of the packets that need acks from the client.
103 new Dictionary<uint, LLQueItem>(); 103 //
104 private class AckData
105 {
106 public AckData(Packet packet, Object identifier, int tickCount, int resends)
107 {
108 Packet = packet;
109 Identifier = identifier;
110 TickCount = tickCount;
111 Resends = resends;
112 }
113
114 public Packet Packet;
115 public Object Identifier;
116 public int TickCount;
117 public int Resends;
118 }
119
120 private Dictionary<uint, AckData> m_NeedAck =
121 new Dictionary<uint, AckData>();
104 122
105 /// <summary> 123 /// <summary>
106 /// The number of milliseconds that can pass before a packet that needs an ack is resent. 124 /// The number of milliseconds that can pass before a packet that needs an ack is resent.
@@ -296,9 +314,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
296 item.throttleType = throttlePacketType; 314 item.throttleType = throttlePacketType;
297 item.TickCount = System.Environment.TickCount; 315 item.TickCount = System.Environment.TickCount;
298 item.Identifier = id; 316 item.Identifier = id;
299 item.Resends = 0;
300 item.Bytes = packet.ToBytes();
301 item.Length = item.Bytes.Length;
302 317
303 m_PacketQueue.Enqueue(item); 318 m_PacketQueue.Enqueue(item);
304 m_PacketsSent++; 319 m_PacketsSent++;
@@ -318,7 +333,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
318 if (m_DropSafeTimeout > now || 333 if (m_DropSafeTimeout > now ||
319 intervalMs > 500) // We were frozen! 334 intervalMs > 500) // We were frozen!
320 { 335 {
321 foreach (LLQueItem data in new List<LLQueItem> 336 foreach (AckData data in new List<AckData>
322 (m_NeedAck.Values)) 337 (m_NeedAck.Values))
323 { 338 {
324 if (m_DropSafeTimeout > now) 339 if (m_DropSafeTimeout > now)
@@ -349,7 +364,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
349 364
350 int resent = 0; 365 int resent = 0;
351 366
352 foreach (LLQueItem data in new List<LLQueItem>(m_NeedAck.Values)) 367 foreach (AckData data in new List<AckData>(m_NeedAck.Values))
353 { 368 {
354 Packet packet = data.Packet; 369 Packet packet = data.Packet;
355 370
@@ -615,7 +630,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
615 630
616 private void ProcessAck(uint id) 631 private void ProcessAck(uint id)
617 { 632 {
618 LLQueItem data; 633 AckData data;
619 Packet packet; 634 Packet packet;
620 635
621 lock (m_NeedAck) 636 lock (m_NeedAck)
@@ -625,9 +640,11 @@ namespace OpenSim.Region.ClientStack.LindenUDP
625 if (!m_NeedAck.TryGetValue(id, out data)) 640 if (!m_NeedAck.TryGetValue(id, out data))
626 return; 641 return;
627 642
643 packet = data.Packet;
644
628 m_NeedAck.Remove(id); 645 m_NeedAck.Remove(id);
646 m_UnackedBytes -= packet.ToBytes().Length;
629 PacketPool.Instance.ReturnPacket(data.Packet); 647 PacketPool.Instance.ReturnPacket(data.Packet);
630 m_UnackedBytes -= data.Length;
631 } 648 }
632 } 649 }
633 650
@@ -661,7 +678,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
661 lock (m_NeedAck) 678 lock (m_NeedAck)
662 { 679 {
663 foreach (uint key in m_NeedAck.Keys) 680 foreach (uint key in m_NeedAck.Keys)
664 info.needAck.Add(key, m_NeedAck[key].Bytes); 681 info.needAck.Add(key, m_NeedAck[key].Packet.ToBytes());
665 } 682 }
666 683
667 LLQueItem[] queitems = m_PacketQueue.GetQueueArray(); 684 LLQueItem[] queitems = m_PacketQueue.GetQueueArray();
@@ -669,7 +686,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
669 for (int i = 0; i < queitems.Length; i++) 686 for (int i = 0; i < queitems.Length; i++)
670 { 687 {
671 if (queitems[i].Incoming == false) 688 if (queitems[i].Incoming == false)
672 info.out_packets.Add(queitems[i].Bytes); 689 info.out_packets.Add(queitems[i].Packet.ToBytes());
673 } 690 }
674 691
675 info.sequence = m_Sequence; 692 info.sequence = m_Sequence;
@@ -680,7 +697,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
680 public void SetClientInfo(ClientInfo info) 697 public void SetClientInfo(ClientInfo info)
681 { 698 {
682 m_PendingAcks = info.pendingAcks; 699 m_PendingAcks = info.pendingAcks;
683 m_NeedAck = new Dictionary<uint, LLQueItem>(); 700 m_NeedAck = new Dictionary<uint, AckData>();
684 701
685 Packet packet = null; 702 Packet packet = null;
686 int packetEnd = 0; 703 int packetEnd = 0;
@@ -699,16 +716,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
699 { 716 {
700 } 717 }
701 718
702 LLQueItem item = new LLQueItem(); 719 m_NeedAck.Add(key, new AckData(packet, null, System.Environment.TickCount, 0));
703 item.Packet = packet;
704 item.Incoming = false;
705 item.throttleType = 0;
706 item.TickCount = System.Environment.TickCount;
707 item.Identifier = 0;
708 item.Resends = 0;
709 item.Bytes = packet.ToBytes();
710 item.Length = item.Bytes.Length;
711 m_NeedAck.Add(key, item);
712 } 720 }
713 721
714 m_Sequence = info.sequence; 722 m_Sequence = info.sequence;
@@ -732,7 +740,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
732 740
733 private void DropResend(Object id) 741 private void DropResend(Object id)
734 { 742 {
735 foreach (LLQueItem data in new List<LLQueItem>(m_NeedAck.Values)) 743 foreach (AckData data in new List<AckData>(m_NeedAck.Values))
736 { 744 {
737 if (data.Identifier != null && data.Identifier == id) 745 if (data.Identifier != null && data.Identifier == id)
738 { 746 {
@@ -769,12 +777,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
769 // We want to see that packet arrive if it's reliable 777 // We want to see that packet arrive if it's reliable
770 if (packet.Header.Reliable) 778 if (packet.Header.Reliable)
771 { 779 {
772 m_UnackedBytes += item.Length; 780 m_UnackedBytes += packet.ToBytes().Length;
773 781
774 // Keep track of when this packet was sent out 782 // Keep track of when this packet was sent out
775 item.TickCount = System.Environment.TickCount; 783 m_NeedAck[packet.Header.Sequence] = new AckData(packet,
776 784 item.Identifier, System.Environment.TickCount,
777 m_NeedAck[packet.Header.Sequence] = item; 785 0);
778 } 786 }
779 } 787 }
780 } 788 }
@@ -784,7 +792,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
784 Abort(); 792 Abort();
785 793
786 // Actually make the byte array and send it 794 // Actually make the byte array and send it
787 byte[] sendbuffer = item.Bytes; 795 byte[] sendbuffer = packet.ToBytes();
788 796
789 //m_log.DebugFormat( 797 //m_log.DebugFormat(
790 // "[CLIENT]: In {0} sending packet {1}", 798 // "[CLIENT]: In {0} sending packet {1}",