From b44a56e0b414c3b68624954f1e36ed49e290b0b8 Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Mon, 4 May 2009 02:24:30 +0000 Subject: [PATCH] Add a parameter that limits the max size of the outbound packet. Defaulted at 1400 since the headers get added to that (32 bytes plus UDP headers) --- .../ClientStack/LindenUDP/LLClientView.cs | 47 ++++++++++++++++--- bin/OpenSim.ini.example | 2 + 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 0369369215..7cd324c935 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs @@ -140,6 +140,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP protected int m_primTerseUpdateRate = 10; protected int m_primFullUpdateRate = 14; + protected int m_packetMTU = 1400; + // LLClientView Only public delegate void BinaryGenericMessage(Object sender, string method, byte[][] args); @@ -537,6 +539,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_primFullUpdateRate = clientConfig.GetInt("FullUpdateRate", m_primFullUpdateRate); + m_packetMTU = clientConfig.GetInt("PacketMTU", 1400); } } @@ -3013,9 +3016,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP outPacket.RegionData.TimeDilation = (ushort)(Scene.TimeDilation * ushort.MaxValue); - int count = m_primFullUpdates.Count; - if (count > m_primFullUpdatesPerPacket) - count = m_primFullUpdatesPerPacket; + int max = m_primFullUpdates.Count; + if (max > m_primFullUpdatesPerPacket) + max = m_primFullUpdatesPerPacket; + + int count = 0; + int size = 0; + + byte[] zerobuffer = new byte[1024]; + byte[] blockbuffer = new byte[1024]; + + for (count = 0 ; count < max ; count++) + { + int length = 0; + m_primFullUpdates[count].ToBytes(blockbuffer, ref length); + length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer); + if (size + length > m_packetMTU) + break; + size += length; + } outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[count]; @@ -3083,9 +3102,25 @@ namespace OpenSim.Region.ClientStack.LindenUDP outPacket.RegionData.TimeDilation = (ushort)(Scene.TimeDilation * ushort.MaxValue); - int count = m_primTerseUpdates.Count; - if (count > m_primTerseUpdatesPerPacket) - count = m_primTerseUpdatesPerPacket; + int max = m_primTerseUpdates.Count; + if (max > m_primTerseUpdatesPerPacket) + max = m_primTerseUpdatesPerPacket; + + int count = 0; + int size = 0; + + byte[] zerobuffer = new byte[1024]; + byte[] blockbuffer = new byte[1024]; + + for (count = 0 ; count < max ; count++) + { + int length = 0; + m_primTerseUpdates[count].ToBytes(blockbuffer, ref length); + length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer); + if (size + length > m_packetMTU) + break; + size += length; + } outPacket.ObjectData = new ImprovedTerseObjectUpdatePacket. diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example index 8ae6e005ff..ec904883ba 100644 --- a/bin/OpenSim.ini.example +++ b/bin/OpenSim.ini.example @@ -1285,3 +1285,5 @@ ;FullUpdatesPerPacket=14 ;TerseUpdateRate=10 ;FullUpdateRate=14 + + ;PacketMTU = 1400