* Breaks OpenSim.. err I mean.. adds NAT translation support to EnableSimulator EventQueue methods.

* NB: This may actually break logins on certain regions. Shake well before consuming.
0.6.6-post-fixes
Adam Frisby 2009-05-23 05:44:18 +00:00
parent f8c569dc7c
commit 3b1b3ac9bb
3 changed files with 65 additions and 1 deletions

View File

@ -14,11 +14,49 @@ namespace OpenSim.Framework
/// This enables standard port forwarding techniques /// This enables standard port forwarding techniques
/// to work correctly with OpenSim. /// to work correctly with OpenSim.
/// </summary> /// </summary>
static class NetworkUtil public static class NetworkUtil
{ {
// IPv4Address, Subnet // IPv4Address, Subnet
static readonly Dictionary<IPAddress,IPAddress> m_subnets = new Dictionary<IPAddress, IPAddress>(); static readonly Dictionary<IPAddress,IPAddress> m_subnets = new Dictionary<IPAddress, IPAddress>();
public static IPAddress GetIPFor(IPAddress user, IPAddress simulator)
{
// Check if we're accessing localhost.
foreach (IPAddress host in Dns.GetHostAddresses(Dns.GetHostName()))
{
if (host.Equals(user) && host.AddressFamily == AddressFamily.InterNetwork)
return host;
}
// Check for same LAN segment
foreach (KeyValuePair<IPAddress, IPAddress> subnet in m_subnets)
{
byte[] subnetBytes = subnet.Value.GetAddressBytes();
byte[] localBytes = subnet.Key.GetAddressBytes();
byte[] destBytes = user.GetAddressBytes();
if (subnetBytes.Length != destBytes.Length || subnetBytes.Length != localBytes.Length)
return null;
bool valid = true;
for (int i = 0; i < subnetBytes.Length; i++)
{
if ((localBytes[i] & subnetBytes[i]) != (destBytes[i] & subnetBytes[i]))
{
valid = false;
break;
}
}
if (valid)
return subnet.Key;
}
// Otherwise, return outside address
return simulator;
}
private static IPAddress GetExternalIPFor(IPAddress destination, string defaultHostname) private static IPAddress GetExternalIPFor(IPAddress destination, string defaultHostname)
{ {
// Adds IPv6 Support (Not that any of the major protocols supports it...) // Adds IPv6 Support (Not that any of the major protocols supports it...)

View File

@ -33,6 +33,7 @@ using System.Threading;
using log4net; using log4net;
using OpenMetaverse; using OpenMetaverse;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Client;
using OpenSim.Framework.Communications; using OpenSim.Framework.Communications;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Communications.Capabilities; using OpenSim.Framework.Communications.Capabilities;
@ -211,6 +212,14 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
if (eq != null) if (eq != null)
{ {
#region IP Translation for NAT
IClientIPEndpoint ipepClient;
if (avatar.ClientView.TryGet(out ipepClient))
{
endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
}
#endregion
eq.EnableSimulator(realHandle, endPoint, avatar.UUID); eq.EnableSimulator(realHandle, endPoint, avatar.UUID);
// ES makes the client send a UseCircuitCode message to the destination, // ES makes the client send a UseCircuitCode message to the destination,

View File

@ -34,6 +34,7 @@ using OpenMetaverse;
using OpenMetaverse.StructuredData; using OpenMetaverse.StructuredData;
using log4net; using log4net;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Framework.Client;
using OpenSim.Framework.Communications; using OpenSim.Framework.Communications;
using OpenSim.Framework.Communications.Cache; using OpenSim.Framework.Communications.Cache;
using OpenSim.Framework.Communications.Capabilities; using OpenSim.Framework.Communications.Capabilities;
@ -306,6 +307,14 @@ namespace OpenSim.Region.Framework.Scenes
IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>(); IEventQueue eq = avatar.Scene.RequestModuleInterface<IEventQueue>();
if (eq != null) if (eq != null)
{ {
#region IP Translation for NAT
IClientIPEndpoint ipepClient;
if(avatar.ClientView.TryGet(out ipepClient))
{
endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
}
#endregion
eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID); eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID);
eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath); eq.EstablishAgentCommunication(avatar.UUID, endPoint, capsPath);
m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}", m_log.DebugFormat("[CAPS]: Sending new CAPS seed url {0} to client {1} in region {2}",
@ -812,6 +821,14 @@ namespace OpenSim.Region.Framework.Scenes
if (eq != null) if (eq != null)
{ {
#region IP Translation for NAT
IClientIPEndpoint ipepClient;
if (avatar.ClientView.TryGet(out ipepClient))
{
endPoint.Address = NetworkUtil.GetIPFor(ipepClient.EndPoint, endPoint.Address);
}
#endregion
eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID); eq.EnableSimulator(reg.RegionHandle, endPoint, avatar.UUID);
// ES makes the client send a UseCircuitCode message to the destination, // ES makes the client send a UseCircuitCode message to the destination,