aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs86
-rw-r--r--bin/OpenSim.ini.example17
2 files changed, 68 insertions, 35 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
index 0b17d1b..24bb502 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs
@@ -76,6 +76,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
76 protected IPAddress listenIP = IPAddress.Parse("0.0.0.0"); 76 protected IPAddress listenIP = IPAddress.Parse("0.0.0.0");
77 protected IScene m_localScene; 77 protected IScene m_localScene;
78 protected IAssetCache m_assetCache; 78 protected IAssetCache m_assetCache;
79 protected int m_clientSocketReceiveBuffer = 0;
79 80
80 /// <value> 81 /// <value>
81 /// Manages authentication for agent circuits 82 /// Manages authentication for agent circuits
@@ -157,6 +158,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
157 { 158 {
158 if (config.Contains("client_throttle_multiplier")) 159 if (config.Contains("client_throttle_multiplier"))
159 userSettings.ClientThrottleMultipler = config.GetFloat("client_throttle_multiplier"); 160 userSettings.ClientThrottleMultipler = config.GetFloat("client_throttle_multiplier");
161 if (config.Contains("client_socket_rcvbuf_size"))
162 m_clientSocketReceiveBuffer = config.GetInt("client_socket_rcvbuf_size");
160 } 163 }
161 164
162 m_log.DebugFormat("[CLIENT]: client_throttle_multiplier = {0}", userSettings.ClientThrottleMultipler); 165 m_log.DebugFormat("[CLIENT]: client_throttle_multiplier = {0}", userSettings.ClientThrottleMultipler);
@@ -188,47 +191,54 @@ namespace OpenSim.Region.ClientStack.LindenUDP
188 Packet packet = null; 191 Packet packet = null;
189 int numBytes = 1; 192 int numBytes = 1;
190 EndPoint epSender = new IPEndPoint(IPAddress.Any, 0); 193 EndPoint epSender = new IPEndPoint(IPAddress.Any, 0);
194 EndPoint epProxy = null;
191 195
192 if (EndReceive(out numBytes, result, ref epSender)) 196 try
193 { 197 {
194 // Make sure we are getting zeroes when running off the 198 if (EndReceive(out numBytes, result, ref epSender))
195 // end of grab / degrab packets from old clients
196 Array.Clear(RecvBuffer, numBytes, RecvBuffer.Length - numBytes);
197
198 int packetEnd = numBytes - 1;
199 if (proxyPortOffset != 0) packetEnd -= 6;
200
201 try
202 {
203 packet = PacketPool.Instance.GetPacket(RecvBuffer, ref packetEnd, ZeroBuffer);
204 }
205 catch (MalformedDataException e)
206 {
207 m_log.DebugFormat("[CLIENT]: Dropped Malformed Packet due to MalformedDataException: {0}", e.StackTrace);
208 }
209 catch (IndexOutOfRangeException e)
210 { 199 {
211 m_log.DebugFormat("[CLIENT]: Dropped Malformed Packet due to IndexOutOfRangeException: {0}", e.StackTrace); 200 // Make sure we are getting zeroes when running off the
212 } 201 // end of grab / degrab packets from old clients
213 catch (Exception e) 202 Array.Clear(RecvBuffer, numBytes, RecvBuffer.Length - numBytes);
214 { 203
215 m_log.Debug("[CLIENT]: " + e); 204 int packetEnd = numBytes - 1;
216 } 205 if (proxyPortOffset != 0) packetEnd -= 6;
217 } 206
207 try
208 {
209 packet = PacketPool.Instance.GetPacket(RecvBuffer, ref packetEnd, ZeroBuffer);
210 }
211 catch (MalformedDataException e)
212 {
213 m_log.DebugFormat("[CLIENT]: Dropped Malformed Packet due to MalformedDataException: {0}", e.StackTrace);
214 }
215 catch (IndexOutOfRangeException e)
216 {
217 m_log.DebugFormat("[CLIENT]: Dropped Malformed Packet due to IndexOutOfRangeException: {0}", e.StackTrace);
218 }
219 catch (Exception e)
220 {
221 m_log.Debug("[CLIENT]: " + e);
222 }
223 }
218 224
219 EndPoint epProxy = null; 225
220 226 if (proxyPortOffset != 0)
221 if (proxyPortOffset != 0)
222 {
223 // If we've received a use circuit packet, then we need to decode an endpoint proxy, if one exists,
224 // before allowing the RecvBuffer to be overwritten by the next packet.
225 if (packet != null && packet.Type == PacketType.UseCircuitCode)
226 { 227 {
227 epProxy = epSender; 228 // If we've received a use circuit packet, then we need to decode an endpoint proxy, if one exists,
229 // before allowing the RecvBuffer to be overwritten by the next packet.
230 if (packet != null && packet.Type == PacketType.UseCircuitCode)
231 {
232 epProxy = epSender;
233 }
234
235 // Now decode the message from the proxy server
236 epSender = ProxyCodec.DecodeProxyMessage(RecvBuffer, ref numBytes);
228 } 237 }
229 238 }
230 // Now decode the message from the proxy server 239 catch (Exception ex)
231 epSender = ProxyCodec.DecodeProxyMessage(RecvBuffer, ref numBytes); 240 {
241 m_log.ErrorFormat("[CLIENT]: Exception thrown during EndReceive(): {0}", ex);
232 } 242 }
233 243
234 BeginRobustReceive(); 244 BeginRobustReceive();
@@ -324,6 +334,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
324 334
325 done = true; 335 done = true;
326 } 336 }
337 catch (Exception ex)
338 {
339 m_log.ErrorFormat("[CLIENT]: Exception thrown during BeginReceive(): {0}", ex);
340 }
327 } 341 }
328 } 342 }
329 343
@@ -472,6 +486,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
472 486
473 ServerIncoming = new IPEndPoint(listenIP, (int)newPort); 487 ServerIncoming = new IPEndPoint(listenIP, (int)newPort);
474 m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); 488 m_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
489 if (0 != m_clientSocketReceiveBuffer)
490 m_socket.ReceiveBufferSize = m_clientSocketReceiveBuffer;
475 m_socket.Bind(ServerIncoming); 491 m_socket.Bind(ServerIncoming);
476 // Add flags to the UDP socket to prevent "Socket forcibly closed by host" 492 // Add flags to the UDP socket to prevent "Socket forcibly closed by host"
477 // uint IOC_IN = 0x80000000; 493 // uint IOC_IN = 0x80000000;
diff --git a/bin/OpenSim.ini.example b/bin/OpenSim.ini.example
index 5f2b46a..2d03731 100644
--- a/bin/OpenSim.ini.example
+++ b/bin/OpenSim.ini.example
@@ -354,6 +354,23 @@
354 ; Pre r7113, this setting was not exposed but was effectively 8. You may want to try this if you encounter 354 ; Pre r7113, this setting was not exposed but was effectively 8. You may want to try this if you encounter
355 ; unexpected difficulties 355 ; unexpected difficulties
356 client_throttle_multiplier = 2; 356 client_throttle_multiplier = 2;
357
358 ; the client socket receive buffer size determines how many
359 ; incoming requests we can process; the default on .NET is 8192
360 ; which is about 2 4k-sized UDP datagrams. On mono this is
361 ; whatever the underlying operating system has as default; for
362 ; example, ubuntu 8.04 or SLES11 have about 111k, which is about
363 ; 27 4k-sized UDP datagrams (on linux platforms you can [as root]
364 ; do "sysctl net.core.rmem_default" to find out what your system
365 ; uses a default socket receive buffer size.
366 ;
367 ; client_socket_rcvbuf_size allows you to specify the receive
368 ; buffer size LLUDPServer should use. NOTE: this will be limited
369 ; by the system's settings for the maximum client receive buffer
370 ; size (on linux systems you can set that with "sysctl -w
371 ; net.core.rmem_max=X")
372 ;
373 ; client_socket_rcvbuf_size = 8388608
357 374
358 375
359[Chat] 376[Chat]