From 3b1b3ac9bbd77796a55bcc75d08f78bff5ca78af Mon Sep 17 00:00:00 2001 From: Adam Frisby Date: Sat, 23 May 2009 05:44:18 +0000 Subject: * 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. --- OpenSim/Framework/NetworkUtil.cs | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'OpenSim/Framework/NetworkUtil.cs') diff --git a/OpenSim/Framework/NetworkUtil.cs b/OpenSim/Framework/NetworkUtil.cs index 759c52f..81e6cad 100644 --- a/OpenSim/Framework/NetworkUtil.cs +++ b/OpenSim/Framework/NetworkUtil.cs @@ -14,11 +14,49 @@ namespace OpenSim.Framework /// This enables standard port forwarding techniques /// to work correctly with OpenSim. /// - static class NetworkUtil + public static class NetworkUtil { // IPv4Address, Subnet static readonly Dictionary m_subnets = new Dictionary(); + 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 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) { // Adds IPv6 Support (Not that any of the major protocols supports it...) -- cgit v1.1