From 61b537215328499155c58f46e6338d459aba87ec Mon Sep 17 00:00:00 2001
From: John Hurliman
Date: Tue, 6 Oct 2009 12:13:16 -0700
Subject: * Added missing references to prebuild.xml and commented out the
LindenUDP tests until a new test harness is written * Clients are no longer
disconnected when a packet handler crashes. We'll see how this works out in
practice * Added documentation and cleanup, getting ready for the first
public push * Deleted an old LLUDP file
---
.../Region/ClientStack/LindenUDP/LLUDPClient.cs | 56 +++++++++++++++++++++-
1 file changed, 54 insertions(+), 2 deletions(-)
(limited to 'OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs')
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
index f2e76d3..871e8e8 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs
@@ -33,16 +33,40 @@ using OpenMetaverse;
namespace OpenSim.Region.ClientStack.LindenUDP
{
+ #region Delegates
+
+ ///
+ /// Fired when updated networking stats are produced for this client
+ ///
+ /// Number of incoming packets received since this
+ /// event was last fired
+ /// Number of outgoing packets sent since this
+ /// event was last fired
+ /// Current total number of bytes in packets we
+ /// are waiting on ACKs for
public delegate void PacketStats(int inPackets, int outPackets, int unAckedBytes);
+ ///
+ /// Fired when the queue for a packet category is empty. This event can be
+ /// hooked to put more data on the empty queue
+ ///
+ /// Category of the packet queue that is empty
public delegate void QueueEmpty(ThrottleOutPacketType category);
- public class LLUDPClient
+ #endregion Delegates
+
+ ///
+ /// Tracks state for a client UDP connection and provides client-specific methods
+ ///
+ public sealed class LLUDPClient
{
/// The number of packet categories to throttle on. If a throttle category is added
/// or removed, this number must also change
const int THROTTLE_CATEGORY_COUNT = 7;
+ /// Fired when updated networking stats are produced for this client
public event PacketStats OnPacketStats;
+ /// Fired when the queue for a packet category is empty. This event can be
+ /// hooked to put more data on the empty queue
public event QueueEmpty OnQueueEmpty;
/// AgentID for this client
@@ -115,6 +139,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
/// A reference to the LLUDPServer that is managing this client
private readonly LLUDPServer udpServer;
+ ///
+ /// Default constructor
+ ///
+ /// Reference to the UDP server this client is connected to
+ /// Default throttling rates and maximum throttle limits
+ /// Parent HTB (hierarchical token bucket)
+ /// that the child throttles will be governed by
+ /// Circuit code for this connection
+ /// AgentID for the connected agent
+ /// Remote endpoint for this connection
public LLUDPClient(LLUDPServer server, ThrottleRates rates, TokenBucket parentThrottle, uint circuitCode, UUID agentID, IPEndPoint remoteEndPoint)
{
udpServer = server;
@@ -144,14 +178,24 @@ namespace OpenSim.Region.ClientStack.LindenUDP
RTO = 3000;
}
+ ///
+ /// Shuts down this client connection
+ ///
public void Shutdown()
{
+ // TODO: Do we need to invalidate the circuit?
IsConnected = false;
}
+ ///
+ /// Gets information about this client connection
+ ///
+ /// Information about the client connection
public ClientInfo GetClientInfo()
{
- // TODO: This data structure is wrong in so many ways
+ // TODO: This data structure is wrong in so many ways. Locking and copying the entire lists
+ // of pending and needed ACKs for every client every time some method wants information about
+ // this connection is a recipe for poor performance
ClientInfo info = new ClientInfo();
info.pendingAcks = new Dictionary();
info.needAck = new Dictionary();
@@ -169,8 +213,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
return info;
}
+ ///
+ /// Modifies the UDP throttles
+ ///
+ /// New throttling values
public void SetClientInfo(ClientInfo info)
{
+ // TODO: Allowing throttles to be manually set from this function seems like a reasonable
+ // idea. On the other hand, letting external code manipulate our ACK accounting is not
+ // going to happen
+ throw new NotImplementedException();
}
public string GetStats()
--
cgit v1.1